5 Zuhörthemen
5.1 Freie und offene Software
Warum Linux, bzw. allgemein Open-Source Software verwenden?
Ich habe die volle Kontrolle und es liegt in meiner Macht, Stichwort “Selbstermächtigung”.
Ich habe eine weltweite Gemeinde im Rücken, die viel stärker ist und viel schneller reagiert als eine Firma/ein Konzern.
Ich kann selber mitmachen, da ich alle Werkzeuge auf meinem Standard Linux habe.
Alle anderen können weltweit auch an meinen Projekten mitmachen, da sie auch alle Werkzeuge haben. Zur Erinnerung: Viele Menschen haben keinen Zugang zur kommerziellen Softwarewelt.
Vollkommene Freiheit, da keine erzwungenen Abhängigkeiten. Der von Kunden gefürchtete “vendor lock-in” wird von Herstellern nur zu gern verordnet.
Wenn es um Sicherheit geht, sind geschlossene kommerzielle Programme sofort aus dem Spiel. Mit anderen Worten, maximale Sicherheit kann nur durch offengelegte Software hergestellt werden.
Linux läuft gut auf alten Rechnern, erzeugt weniger Müll (im Gegensatz dazu siehe die aktuelle Entwicklung bei Windows 11). Siehe auch “5 Reasons” bei https://endof10.org.
Wichtige Ereignisse
Free Software, Richard Stallman 1984
Erfinder des Copyleft
Erfinder der Four Freedoms
Four freedoms Free Software Foundation https://www.fsf.org
Free Software Foundation Europe https://fsfe.org
“Free as in Freedom” (Buch) https://www.oreilly.com/openbook/freedom
Open Source Software 1997 https://opensource.org
Immer auf die Lizenz schauen!
liberal <-------------------------------------------> streng MIT GPLv2 BSD GPLv3 Apache 2.0 LGPL AGPL (Copyleft)
Viele weitere, siehe https://opensource.org/licenses
Was manche als Nachteile von freier Software empfinden:
Es gibt alles im Überfluß, z.B. hunderte Linux Distributionen die alle anders aussehen und teilweise auch anders funktionieren. Das verwirrt viele. Gegensatz: Windows sieht immer gleich aus, das beruhigt.
Alles kann in sehr unterschiedlichen Qualitätsstufen existieren, von extrem gut bis zu totalem Schrott. Ich muss mir selber ein Bild machen und mich informieren.
Alles was wir im Kurs verwenden ist offen
Lesen und Schauen
Finden sie heraus, unter welchen Lizenzen (kommerziell oder freie/open-source) die Programme stehen, die sie im Alltag (zu Hause und im Beruf) verwenden. Machen Sie eine Tabelle mit den Spalten Plattform, Programm, Zweck, Lizenz. Die Plattform ist dabei entweder PC Mac/Windows/Linux oder Smartphone App. Finden sie heraus, ob es freie Alternativen zu den kommerziellen Programmen gibt, die sie verwenden und schreiben sie diese in eine fünfte Spalte.
Versuchen Sie doch mal auf das freie Linux Betriebssystem umzusteigen, zumindest versuchsweise. Sie müssen dazu auch nicht ihr Windows kaputt machen. Lassen Sie das für Umsteiger einfachste Linux – Linux Mint – einfach in einer virtuellen Maschine (z.B. in VirtualBox https://www.virtualbox.org) laufen. Nehmen Sie Linux Mint in der Cinnamon Edition, das ist am nächsten am typischen Windows Desktop dran https://linuxmint.com.
5.2 UART
Das Bild habe ich dem Artikel von Linus Akesson entnommen (https://www.linusakesson.net/programming/tty/). Es zeigt Fernschreiber (teletypes) aus den 1940er Jahren. Der UART und das TTY Subsystem von UNIX geht auf diese Technologie zurück.
Asynchrone serielle Schnittstelle, entwickelt Anfang der 60er Jahre von Fa. DEC (Gordon Bell, [1]). Die Abkürzung bedeutet Universal Asynchronous Receiver Transmitter. Oft auch einfach “serielle Schnittstelle” genannt.
Asynchron bedeutet, daß kein Taktsignal übertragen wird.
Übertragen werden heute meist nur noch die zwei Signale TX (transmit) und RX (receive) zwischen zwei Geräten. Es gibt noch einige Kontroll- und “Handshake”-Signale, die aus der Zeit der Terminal- und Modem-Verbindungen stammen, z.B. RTS, CTS, RTR, DSR, DTR, die heute aber fast keine Bedeutung mehr haben.
+--------+ +--------+ | TX|---------------->|RX | | A | | B | | RX|<----------------|TX | +--------+ +--------+ | | GND GND
Das Signal auf TX und RX wechselt zwischen 0V und 5V oder 0V und 3.3V.
Häufig verwendete Geschwindigkeiten sind 9600, 19200 und 115200 Bit/s (früher “Baud” genannt). Die maximale Datenrate liegt bei ein paar MBit/s.
Neben den Datenbits wird auch ein Startbit und ein Stopbit übertragen. Das Paritybit ist optional (folgendes Bild ist von [2] entnommen).
UART Signale Wichtig ist, dass Teilnehmer A und B jeweils auf die gleichen Parameter eingestellt werden:
- Geschwindigkeit in Bit/s
- Anzahl Datenbits (5, 6, 7, 8)
- Paritybit (O=odd, E=even, N=non)
- Länge des Stopbit (1, 2)
Häufig verwendete Werte sind: 9600-8-N-1, 115200-8-N-1.
Früher hatten PCs meist eine RS-232 Schnittstelle, prinzipiell ein UART, der aber mit den Spannungswerten +12V und -12V arbeitet ([3]).
RS-232 Schnittstelle am PC Wer heute am PC eine serielle Schnittstelle benötigt, verwendet meist einen USB-zu-UART Adapter, z.B. mit den gängigen ICs CP2102, FT232 oder CH340.
USB-zu-UART Adapter mit CP2102 Chip Oft ist dieser oder ein ähnlicher Baustein auf dem Mikrocontrollerboard bereits aufgelötet, so dass man das Board nur noch an den USB Bus des PC anstecken muss. In Abbildung 3.1 sieht man z.B. einen CP2102 Baustein.
Unter Linux ist jeder angesteckte USB-UART einem Gerät zugeordnet, z.B.
/dev/ttyUSB0
oder/dev/ttyACM0
. Am besten man lässt sich alle Geräte mitls /dev/tty*
ausgeben. Unter Windows ist das die “COM” Schnittstelle.Um von Linux aus Daten über den UART zu senden und zu empfangen benötigt man einen “Terminal Emulator”. Das sind meistens Kommandozeilenprogramme (CLI : Command Line Interpreter) z.B.
picocom
undmicrocom
– elementar, enthalten in der Paketverwaltungtio
(https://github.com/tio/tio),bt
(https://github.com/wtarreau/bootterm) – etwas komplexer
Die Programme müssen über Kommandozeilenoptionen auf die Parameter der Gegenstelle eingestellt werden. Meist wird nur die Geschwindigkeit eingestellt, da der Rest fast immer mit 8-N-1 voreingestellt ist. Beispiel:
$ picocom -b 115200 /dev/ttyUSB3
Tipps:
Aus
picocom
kommt man wieder heraus mitStrg-A Strg-X
(bei gedrückter Strg-Taste nacheinander A und X drücken).Bei einem frisch installierten Linux hat man als gewöhnlicher User keinen Zugriff auf die Gerätedatei. Folgendes Kommando ermöglicht auch dem normalen User einen Zugang:
$ sudo usermod -aG dialout $USER
Danach den Rechner neu starten, damit das Kommando wirksam wird.
Auch das weiter unten vorgestellte
mpremote
Programm kommuniziert über die serielle Schnittstelle mit dem Mikrocontroller.Man kann auf die serielle Schnittstelle auch per Programm zugreifen. Am einfachsten geht das mit Python und dem pyserial Paket. Alles Nötige ist in der Beschreibung unter https://pythonhosted.org/pyserial zu finden. Sie können damit ein Programm schreiben, das auf allen Betriebssystemen (Linux, Mac, Windows) funktioniert!
Mehr zum UART
https://de.wikipedia.org/wiki/Universal_Asynchronous_Receiver_Transmitter
Stecken Sie einen USB-zu-UART Adapter an ihren PC und verbinden Sie TX mit RX. Versuchen Sie mit einem Terminal-Emulator Daten zu schreiben und wieder zu empfangen.
Nehmen Sie nun zwei USB-zu-UART Adapter, einen für ihren PC, den anderen für den des Nachbarn. Kommunizieren Sie zwischen beiden PCs über die UART Verbindung. Verwenden Sie einen Terminal-Emulator ihrer Wahl.
Versuchen Sie nun die ersten beiden Versuche statt mit dem Terminal-Emulator mit einem Python Programm und dem pyserial Modul zu erledigen.
5.3 Arduino
Arduino ist ein enorm erfolgreiches Projekt, das die Programmierung von Mikrocontrollern stark vereinfacht hat. Vor allem Hobbyisten und Maker, aber auch teilweise kommerzielle Firmen verwenden das im Jahr 2005 entstandene Framework. Viele Jahre konzentrierte sich Arduino auf den Atmel AVR 8-Bit Prozessor [5], später wurden dann auch andere Prozessoren wie ARM, ESP8266 und ESP32 unterstützt.
Die Programmierung erfolgt im Prinzip mit C++, es wird jedoch ein Präprozessor verwendet, der manche Sachen vereinfacht. Dateien mit Quelltext heissen nun Sketch, folgendes Programm zeigt die prinzipielle Struktur:
// https://docs.arduino.cc/language-reference/en/structure/sketch/loop
int buttonPin = 3;
// setup initializes serial and the button pin
void setup() {
.begin(9600);
Serial(buttonPin, INPUT);
pinMode}
// loop checks the button pin each time,
// and will send serial if it is pressed
void loop() {
if (digitalRead(buttonPin) == HIGH) {
.write('H');
Serial}
else {
.write('L');
Serial}
(1000);
delay}
Es gibt vor allem keine main()
Funktion mehr, dafür gibt es nun setup()
und loop()
.
Weitere interessante Merkmale sind
Häufig verwendete Programmkomponenten wie die serielle Schnittstelle oder diverse Bussysteme, z.B. I2C und SPI sind in Klassen verpackt, Stichwort objektorientierte Programmierung.
Es gibt Bibliotheken für eine riesige Menge an Hardware-Bauelementen, auch hier werden die Bauelemente oft objektorientiert modelliert.
Die Arduino IDE stellt alles Nötige unter einer einfachen Bedienoberfläche zur Verfügung. Auch hier steht nicht der Profi im Vordergrund, sondern die einfache Bedienbarkeit für den Anfänger, Hobbyisten und Maker.
Arduino IDE Hinweis: Als Alternative zur Arduino IDE kann man auch mit Platformio und dem Arduino Framework arbeiten. Hier erfolgt die Arbeit nicht-grafisch, sondern auf der Kommandozeile. Somit eignet sich dieser Weg besser für die Automatisierung.
Die Firmware für das Projekt 1 werden wir mit Hilfe von Platformio und dem Arduino Framework bauen.
Literatur
5.4 Platformio
Von Ivan Kravets (Ukraine), ab ca. 2016, https://www.ikravets.com/about-me
Freies Meta-Framework zur Embedded Programmierung
“PlatformIO is a cross-platform code builder and the missing library manager”
What is PlatformIO? https://docs.platformio.org/en/latest/what-is-platformio.html
Einheitliche Entwicklung bei riesigem Angebot an Plattformen, Frameworks, Boards, Bibliotheken.
Kleiner Auszug:
Plattform Framework Board Bibliothek 8051 arduino 1.300+ 13.000+ avr espidf esp32 cmsis esp8266 stmcube stm32 zephyr riscv mbed ... ...
Die Firmware auf dem Heltec V3 Board des LoRaWAN Projekts ist mit dem Arduino Framework gemacht. Kompiliert wird es nicht in der Arduino IDE, sondern mit Platformio auf der Kommandozeile.
5.5 CSV
Beispiel
Pos, Anzahl, Best-Nr, Beschreibung, Einzelpreis
1, 4, 4801391, Heltec LoRa V3, 23.95
2, 10, 512489, "Widerstand, 470 Ohm", 0.10
3, 1, 193726, Digitast Taster, 3,86 <-- Fehler!
Zu beachten:
- Welche Zeichenkodierung? (ASCII, UTF-8, ISO-8859-1, …)
- Welcher Feld-Trenner wird verwendet? Im Beispiel ist es das Komma.
- Welches Zeilenende? (Linux:
0x0a
, Windows:0x0d
,0x0a
) - Was ist, wenn im Feld das Trennzeichen vorkommt? (field quoting)
- Was ist, wenn nicht alle Zeilen die gleiche Anzahl Felder haben? Fehlertoleranz ist hier gefragt.
- Haben all Daten in einer Spalte den gleichen Typ? Erst mal hat man nur Zeichenketten (Strings). Die Lesesoftware macht daraus aber oft konkrete Typen. In der CSV Datei oben wäre das
int
,int
,int
,string
,float
. Was ist wenn ein Typ aus der Reihe fällt? - Sind in der ersten Zeile die Spaltennamen?
- Was passiert mit Leerzeilen?
Obwohl das Format einfach erscheint, sollte man den Code zum Schreiben/Lesen von CSV Dateien nicht selber schreiben sondern bewährte Bibliotheken verwenden.
In Python verwendet man am besten das CSV Modul. Wer mit komplexeren Tabellendaten arbeiten muss der ist mit der Pandas Bibliothek gut beraten. Pandas nennt tabellarische Daten Dataframes. Pandas hat bereits Lese- und Schreibroutinen für CSV, Excel und viele andere Formate eingebaut. Ich empfehle das freie Buch vom Pandas Autor Wes McKinney Python for Data Analysis (3E), https://wesmckinney.com/book. Tipp: Mit Pandas kann man auch meist auf die Daten von Zeitserien Datenbanken zugreifen (wie bei der QuestDB, siehe weiter unten).
Es gibt einige schöne CLI Tools für CSV:
- QSV data wrangling toolkit, https://qsv.dathere.com
- csvlens, https://github.com/YS-L/csvlens
- Visidata, https://www.visidata.org
- XSV, https://github.com/BurntSushi/xsv
5.6 JSON
Datentypen: int, float (4.7, 1.0E+2), string (
" ... "
), bool, object ({ ... }
), array ([ ... ]
), null.Keine Kommentare erlaubt!
Demo (prüfen/formatieren mit
jq < _demo.json
oderpython -mjson.tool _demo.json
){ "Veranstaltung": "IOT Kurs", "Ort": "Dillingen", "Max": 12, "Personen": [ "Hans", "Paula", "Michael", "Claudia" ], "Ausstattung": { "Werkzeug": [ "Schraubenzieher", "Lötkolben" ], "Bauteile": [ "Microcontroller", "Steckbrett" ] }, "A-Bool": true, "A-Float": 1.0 }
JQ ist ein CLI Programm zum Verarbeiten von JSON Objekten. Verarbeiten bedeutet filtern, zerteilen, transformieren, suchen, so wie das die Programme
sed
,awk
,grep
für normalen Text machen.- Homepage: https://jqlang.org
- Tutorial: https://www.baeldung.com/linux/jq-command-json
- Installieren mit
sudo apt install jq
Beispiel: Das folgende JSON Objekt sieht unübersichtlich aus.
{"StatusSNS":{"Time":"2022-01-03T14:52:33","ENERGY":{"TotalStartTime": "2022-01-03T13:17:28","Total":0.017,"Yesterday":0.000,"Today":0.017, "Power":17,"ApparentPower":31,"ReactivePower":26,"Factor":0.53, "Voltage":238,"Current":0.130}}}
Mit
jq
formatiert sieht es so aus (das Objekt ist in Dateiobj.json
):$ cat obj.json | jq . { "StatusSNS": { "Time": "2022-01-03T14:52:33", "ENERGY": { "TotalStartTime": "2022-01-03T13:17:28", "Total": 0.017, "Yesterday": 0.000, "Today": 0.017, "Power": 17, "ApparentPower": 31, "ReactivePower": 26, "Factor": 0.53, "Voltage": 238, "Current": 0.130 } } }
Den Spannungswert hole ich z.B. mit folgendem Kommando heraus:
$ cat obj.json | jq .StatusSNS.ENERGY.Voltage 238
Man kann die Datei wieder “komprimieren” mit
jq -c . obj.json
json-linter
CLI tool in Python
5.7 HTTP

URLs – siehe Details in http/skorkin-about-urls.txt
<scheme>://<username>:<password>@<host>:<port>/<path>?<query>#<fragment>
http://www.blah.com/some/crazy/path.html?param1=foo¶m2=bar
http://www.blah.com/some/crazy/path.html?param1=foo¶m2=bar#page2
Reservierte Zeichen in URLs:
";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Escape mit %<ASCII-HEX-CODE>
, siehe man ascii
:
␣ → %20
(Leerzeichen)
% → %25
& → %26
HTTP ist ein ASCII Protokoll
Browser an Webserver:
GET /wiki/Startseite HTTP/1.1
Host: wiki.selfhtml.org
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Webserver an Browser:
HTTP/1.1 200 OK
Date: Mon, 28 Aug 2017 09:02:55 GMT
Content-language: de-formal
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Last-Modified: Tue, 22 Aug 2017 08:15:31 GMT
Content-Encoding: gzip
Content-Length: 7986
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html lang="de" dir="ltr" class="client-nojs">
<head>
...
<head>
<body>
...
</body>
Entnommen aus: Einsteiger-Tutorial
Status Codes:
- 200 (OK)
- 404 (Not Found)
- 500 (Internal Server Error
- viele mehr …
Verben bzw. Methoden (insgesamt 9), die Wichtigsten sind:
- GET (siehe oben)
- PUT
- POST
- PATCH
- DELETE
GET holt eine Ressource von dem Server. Mit GET kann man auch Formulare abschicken, dann werden die Formularinhalte als Query-String kodiert.
Sowohl PUT als auch POST legen Ressourcen auf dem Server an. Der Unterschied zwischen beiden wird in dem Text http/put-vs-post.txt genauer erklärt. Bei beiden kann man Daten mitschicken (Text, JSON, …), PUT ist zum Anlegen und Modifizieren von Ressourcen mit bereits bekannten URLs (idempotent), POST hingegen kann für beliebige Aufgaben verwendet werden wenn der URL der Resource erst vom Server festgelegt wird, z.B. Formulare, Texte in einem Wiki anlegen, etc. (nicht idempotent).
Mit DELETE werden Ressourcen auf dem Server gelöscht.
APIs mit REST
Beispiel entnommen aus http/rest-api-python-guide.pdf
Verben (GET, PUT, POST, …), Substantive (URL)
GET /tasks
[ { "id": 3643, "summary": "Wash car" }, { "id": 3697, "summary": "Visit gym" } ]
POST /tasks {'summary': 'Get milk', 'description': '...'}
200 { "id": 3792 }
GET /tasks
[ { "id": 3643, "summary": "Wash car" }, { "id": 3697, "summary": "Visit gym" } { "id": 3792, "summary": "Get milk" } ]
OpenAPI (auch als “Swagger” bekannt)
Mit “OpenAPI” kann man eine REST Schnittstelle (REST API) in einer YAML oder JSON Datei spezifizieren. Daraus läßt sich dann mit einem Compiler (“Swagger Codegen”) Code für den Client und den Server (sog. “server stubs”) generieren.
- Beispiel: https://swagger.io/docs/specification/v3_0/basic-structure
- Homepage: https://www.openapis.org
Ein Beispiel für eine REST Schnittstelle ist https://httpbin.org das im Folgenden vorgestellt wird.
Literatur
Manuel Ottlik, Besuch im RESTaurant. Webdienste per REST-Schnittstelle anzapfen, c’t 15 20218, http/ct.2018.15.REST-API.pdf
Tools
httpbin.org
HTTP request/response Service von Kenneth Reitz, der auch das requests Python Modul gemacht hat. Es gibt eine Menge von HTTP REST Endpunkten, die alle eine vordefinierte Funktion habe. So gibt das folgende Kommando einen JSON Body zurück. Die Dokumentation aller Methoden findet man direkt auf https://httpbin.org.
$ curl -i -X GET "https://httpbin.org/json" -H "accept: application/json"
Holen Sie 16 zufällig gesetzte Bytes von httpbin. Tipp: Abschnitt Dynamic Data ansehen.
Curl
“WWW auf der Kommandozeile”
“command line tool and library for transferring data with URLs (since 1998)”
Curl versteht sich mit vielen Protokollen,
curl -V
zeigt folgende:dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Ein paar Aufrufbeispiele, ich nutze dazu httpbin:
Im einfachsten Fall macht curl einen GET Request. Die Option
-X GET
könnte man auch explizit hinschreiben.$ curl https://httpbin.org/json
GET Request und Header/Body anzeigen (
-i
)$ curl -i -X GET https://httpbin.org/get
PUT Request
$ curl -X PUT "https://httpbin.org/put" $ curl -i -X PUT "https://httpbin.org/put?var=wert&var2=wert2"
POST Request (beachte einfache und doppelte Anführungszeichen!)
$ curl -X POST -H "content-type: application/json" -d '{"temp": 25.3}' "https://httpbin.org/post"
Header Zeilen
-H "content-type: text/plain"
: Client sendet TEXT bei POST-H "content-type: application/json"
: Client sendet JSON bei POST-H "accept: application/json"
: Client akzeptiert JSON
Mit Curl kann man zum Beispiel für die Gemeinschaft frei zugängliche Daten abfragen (“Open Data”).
Beispiel 1: Ich hole mir von dem freien Wetter-API https://open-meteo.com die aktuellen Daten für Temperatur und Windgeschwindigkeit. Die Werte werden vom Server im JSON-Format ausgeliefert und mit
jq
formatiert. Dazu gibt man folgende Kommandozeile ein (nur eine lange Zeile):curl "https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41¤t=temperature_2m,wind_speed_10m&dayly=temperature_2m,relative_humidity_2m,wind_speed_10m" | jq .
Beispiel 2: Tankerkönig - https://creativecommons.tankerkoenig.de
Einen API-Key bekommen sie schnell wenn Sie auf die angegebene Seite klicken und dort mehrfach auf API-KEY klicken.
Siehe die Beispieldateien http/tanken.sh und http/tanken.py.
Andere offene APIs zum Experimentieren sind z.B.
Beispiel: Delock 11827, schaltbare Steckdose mit Leistungsmesser. Auf dem ESP8266 Mikrocontoroller im Inneren ist die freie Software Tasmota von Theo Arends installiert. Das Gerät ist bei mir zu Hause unter der IP Nummer 192.168.178.122 bzw.
delock-0921.fritz.box
erreichbar. Mit folgendem Kommando wird der Leistungsverbrauch abgefragt (der Stringcmnd=Status%208
bedeutetcmnd=Status 8
,%20
steht für ein Leerzeichen).$ curl "http://192.168.178.122/cm?cmnd=Status%208"
Der folgende JSON String wird zurückgeliefert (man könnte ihn mit
jq
hübsch formatieren):{"StatusSNS":{"Time":"2022-01-03T14:52:33","ENERGY":{"TotalStartTime":"2022-01-03T13:17:28","Total":0.017,"Yesterday":0.000,"Today":0.017,"Power":17,"ApparentPower":31,"ReactivePower":26,"Factor":0.53,"Voltage":238,"Current":0.130}}}
Zum Ein/Ausschalten verwendet man
$ curl "http://192.168.178.122/cm?cmnd=Power%20toggle"
Literatur zu HTTP und Curl
Zweiteiler von Pavan Podila, HTTP: The Protocol Every Web Developer Must Know
Versions, URLs, Requests, Verbs, Headers, Responses, Status Codes, Tools https://code.tutsplus.com/http-the-protocol-every-web-developer-must-know-part-1--net-31177t
connection handling, authentication, and HTTP caching https://code.tutsplus.com/http-the-protocol-every-web-developer-must-know-part-2--net-31155t
c’t Artikel von Tim Schürmann, “Angebissen. Mit Curl Webseiten anzapfen und Dateien herunterladen”. ct.2021.13.142_145.Curl.pdf
http://www.steves-internet-guide.com/using-curl-iot-applications
5.8 MQTT

“Message Queuing Telemetry Transport”, 1999 erfunden von Dr. Andy Stanford-Clark (IBM) und Arlen Nipper (Arcom/Eurotech).
Entnommen von https://www.mqtt.org | vergrössern
“Broker”
Server, der zwischen “Publishern” und “Subscribern” vermittelt. Mosquitto ist ein bekannter Broker (siehe unten).
Topics
QoS: 0 (höchstens einmal), 1 (mindestens einmal), 2 (genau einmal)
TCP Protokoll, Port 1883 (unsicher), 8883 (sicher über TLS)
Websockets Protokoll, Port 9001, ermöglicht Zugriff aus Browser
Zugriff auf den Broker über
- CLI Tools
- Grafische Programme
- Programmiersprachen (über geeignete Bibliotheken)
- Web-Seiten (nur über Websockets)
Tools
CLI Tools
- https://mqttx.app/cli (CLI tool
mqttx-cli
) mosquitto_pub
,mosquitto_sub
(enhalten inmosquitto-clients
)
- https://mqttx.app/cli (CLI tool
Grafische Programme
“MQTTX is a cross-platform MQTT 5.0 client tool open sourced by EMQ, which can run on macOS, Linux and Windows, and supports formatting MQTT payload.”
- https://github.com/emqx/MQTTX (Apache Lizenz)
- https://mqttx.app/downloads (Windows, Mac, Linux, Docker, für Linux
MQTTX-1.11.1.AppImage
) - https://mqttx.app/web-client Ein Web-Client, der sich mit einem Broker über Websockets verbinden kann.
MQTT Explorer von Thomas Nordquist (unter CC BY-ND Lizenz)
MQTTk https://github.com/matesh/mqttk Leichtes GUI Programm in Python/Tkinter das MQTT.fx (unfrei) ersetzen soll.
MQTTk Die Installation auf meinem Linux Mint lief wie folgt:
sudo apt install python3-tk pip install mqttk
Browser-basierte Tools (über Websocket)
- MQTT Board https://mqttboard.flespi.io/#
- MQTTX.App https://mqttx.app/web-client
- HiveMQ Websocket Client https://www.hivemq.com/demos/websocket-client
Bibliotheken
https://pypi.org/project/paho-mqtt (Python)
Installation mit
pip install paho-mqtt
Smartphone Apps
- MyMQTT (leider mit Werbung)
- MyMQTT (leider mit Werbung)
Tipps
Ein “altbewährter” Artikel zu MQTT aus der Zeitschrift c´t von Jan Mahn (06/2018)
Das MQTT Client Python Modul installiert man mit
pip install paho-mqtt
.Frei zugängliche MQTT Test Server
OpenMQTTGateway übersetzt viele Übertragungstechniken nach MQTT, z.B. Bluetooth, LoRa, Mobilfunk, Infrarot.
Zigbee2MQTT koppelt die Welt von Zigbee (Sensoren, Beleuchtung, Heimautomatisierung) an die MQTT Welt.
Das Open-Source Projekt OwnTracks (https://owntracks.org) von Jan-Piet Mens ist eine Android/iOS App mit der man die GPS Positionsdaten an den eigenen MQTT Broker schicken kann.
Siehe auch den folgenden Eintrag zum Mosquitto MQTT Broker.
Beispiele
mqttx-cli
$ mqttx-cli sub -h 192.168.178.89 -t hello/world $ mqttx-cli pub -h 192.168.178.89 -t hello/world -m "Hello from Terminal window 2!"
Die Debug Option ist
--debug
.mosquitto_sub
,mosquittopub
$ mosquitto_sub -d -t hello/world $ mosquitto_pub -d -t hello/world -m "Hello from Terminal window 2!"
mqttx-cli
über Websockets$ mqttx-cli --version INFO[0000] Broker URI: tcp://192.168.178.89:1883 https://mqttx.app/changelogs/v1.10.0 # Websocket connection $ mqttx-cli conn -l ws -h 192.168.178.89 -p 8080 # Websocket (-l ws), mosquitto is configured with port 8080 $ mqttx-cli sub -l ws -p 8080 -h 192.168.178.89 -t hello/world # Publisher can send eith with mqtt or ws protocol $ mqttx-cli pub -h 192.168.178.89 -t hello/world -m "Hello from Terminal window 2!" $ mqttx-cli pub -l ws -p 8080 -h 192.168.178.89 -t hello/world -m "Hello from Terminal window 2!"
Publisher und Subscriber, in Python mit
paho-mqtt
:MQTT wird beim Autor zur Heimautomatisierung verwendet
Vergrössern: img/ha-fs8.png
5.9 Mosquitto

Mosquitto ist ein Open-Source MQTT-Broker.
Er wird von der Eclipse Foundation verwaltet, mit vielen anderen Projekten wie z.B. Paho.
https://projects.eclipse.org/projects/iot.paho 🡒 MQTT pub/sub Client Code für viele Programmiersprachen, z.B. C, C++, Python, Go.
Starten Sie den Mosquitto Broker auf ihrem PC am besten als Container. Siehe den Abschnitt weiter unten dazu.
Die folgende Installation auf dem PC ist nicht mehr nötig.
Installation auf PC unter Linux
Achtung: Die MQTT und Websocket Verbindungen bei dieser Installation sind unsicher, da der anonyme Zugang erlaubt und auch keine Verschlüsselung (SSL/TLS) verwendet wurde! Somit ist diese Konfiguration nur zum Üben und Testen in einem lokalen Netz geeignet!
sudo apt install mosquitto
Nach der Installation läuft der Broker bereits.
Die mosquitto Konfigurationsdatei ist hier:
/etc/mosquitto/mosquitto.conf
In diese die folgenden Zeilen einfügen, sonst kann man sich nicht von einem anderen Rechner aus verbinden:
listener 1883
password_file /etc/mosquitto/passwd
allow_anonymous true
Falls man auch Websockets aktivieren möchte, dann muss man noch zusätzlich die folgenden Zeilen einfügen:
listener 8080
protocol websockets
Eine leere Passwort-Datei anlegen:
$ sudo touch /etc/mosquitto/passwd
Falls man Änderungen an den Konfigurationsdateien macht sollte man immer den MQTT Broker neu starten mit dem folgenden Kommando:
systemctl restart mosquitto.service
Den Mosquitto Server mit systemd verwalten
Service neu starten:
systemctl restart mosquitto.service
Status abfragen
systemctl status mosquitto.service
Stoppen mit
systemctl stop mosquitto.service
Starten mit
systemctl start mosquitto.service
Logdatei anschauen
sudo less /var/log/mosquitto/mosquitto.log
Clients mosquitto_pub
, mosquitto_sub
apt install mosquitto-clients
Hilfe zu mosquitto
(man pages)
man mosquitto
Weitere Man-Pages: mqtt, mosquitto-tls, mosquitto.conf, hosts_access, mosquitto_ctrl, mosquitto_passwd, mosquitto_pub, mosquitto_rr, mosquitto_sub, libmosquitto.
5.10 Webhooks
https://www.standardwebhooks.com

Webhooks sind ein nicht-standardisiertes Verfahren um Nachrichten (Events) über HTTP Requests zu schicken. Oft werden die Clients eine Web APIs über Webhooks (Callbacks) benachrichtigt wenn bestimmte Ereignisse eingetreten sind.
Testen von Webhooks: https://webhook.site
Freier Webhook Server
webhookd
https://github.com/ncarlier/webhookd. Im Abschnitt “Container” weiter unten finden Sie eine Anleitung wie siewebhookd
als Container starten.
Experimentieren Sie mit https://webhook.site. Wenn man auf die Seite geht wird einem ein Zufallslink angeboten, den muss man in die Aufruf-URL geben, so wie in folgendem Beispiel:
$ curl -d '{"test": 43}' -H 'Content-Type: application/json' \
https://webhook.site/2aecf7ce-2dd1-49cd-83f6-60b965c7ccf1/hook2?foo=bar
5.11 Websockets

Bidirektionale Kommunikation zwischen Client und Web-Browser
RFC6455
Definiert Subprotokolle, z.B. WAMP für RPC und Pub/Sub
Tools
- wscat https://www.npmjs.com/package/wscat (JavaScript)
- websocat <Rust, https://github.com/vi/websocat> (Rust)
- wscat https://www.npmjs.com/package/wscat (JavaScript)
5.12 LoRa, LoRaWAN
Abbildung 5.2: Bandwidth vs. Range (entnommen aus https://www.thethingsnetwork.org/docs/lorawan/what-is-lorawan)
Was ist LoRaWAN?
Käufliche Geräte (“Device Repository”)
Gerät selber bauen. Im wesentlichen braucht man einen Mikroprozessor und einen LoRa Funkchip.
The Things Network (TTN)
TTN Community Augsburg: https://www.thethingsnetwork.org/community/augsburg, ttn.html.
Konsole (Login erforderlich): https://www.thethingsnetwork.org/console
The Things Network hat den “The Things Stack” (Network Server) geschrieben und hostet diesen auch selber. Auf diesen Server kommt man, nachdem man auf der TTN Homepage “Join The Things Network” auswählt. Der Server ist in Go geschrieben unter der liberalen Apache 2.0 Lizenz. Man kann die Software auf dem eigenen Server betreiben (“self-hosting”) und damit ein unabhängiges LoRaWAN Netzwerk realisieren. Das machen z.B. größere Firmen und Stadtwerke von größeren Städten, z.B. in Augsburg.
Vergrößern: img/tts-architecture.jpeg
Wer sich für die Architektur des Netzwerkservers interessiert, findet viele weiterführende Informationen unter
- https://www.thethingsindustries.com/docs/
- https://www.thethingsindustries.com/docs/the-things-stack/
- https://www.thethingsindustries.com/docs/concepts/architecture/
Es gibt auch alternative LoRaWAN Stacks, sowohl geschlossene kommerzielle als auch andere freie wie z.B.
- ChirpStack https://www.chirpstack.io
- Loriot https://loriot.io
Mit dem CLI Programm
ttn-lw-cli
kann man alles was man in der TTN Konsole im Web-Browser per Klick macht auch lokal auf dem Rechner auf der Kommandozeile erledigen. Vor allem wird das Programm zur Automatisierung beim Erstellen von Anwendungen und Geräten verwendet.https://www.thethingsindustries.com/docs/the-things-stack/interact/cli/installing-cli/
Weltkarte der Gateways https://www.thethingsnetwork.org/map. Gibt es eines in Ihrer Nähe? Wenn nicht, stellen Sie doch eines auf!
Übersichtsartikel in der c’t 10 2019 von Jan Mahn Artikel/ct.2019.10-LoRaWAN.pdf
“Meshtastic” (https://meshtastic.org) ist ein freies Projekt das ein Mesh-Netzwerk zum Nachrichtenaustausch erstellt. Es basiert auf dem LoRa Funktstandard. Siehe Artikel in c’t 13 2022 Artikel/ct.2022.13.Meshtastic.pdf.
Genaueres zur Technik von LoRa finden sie an folgenden Stellen
Vortrag auf dem Linux Infotag 2018
Vortrag an der Akademie in Dillingen 2021 (Online)
https://www.tha.de/~hhoegl/doc/Akademie/IoT-mit-LoRaWAN.html
5.13 Python
Von Guido van Rossum, ab ca. 1989
Wenn man eine Programmiersprache lernen möchte, dann Python
- Einfache Syntax
- Ideal für Nicht-InformatikerInnen
- Bedient ein enorm breites Sprektrum, von Allerweltsaufgaben, Excel-Automatisierung bis zu KI Anwendungen, Numerik, Visualisierung, Mikroprozessorprogrammierung (mit Micropython) und vieles weitere.
Python Package Index https://pypi.org. Installation mit
pip
.Cheat Sheets aus dem Buch Python Crash Course von Eric Matthes enthält alle nötigen Grundlagen (28 Seiten): https://ehmatthes.github.io/pcc_3e/cheat_sheets
5.14 Micropython

Micropython Logos
Python 3 Interpreter für Mikrocontroller mit ein paar 100 KB Flash Speicher und einigen 10 KB RAM.
Von Damien P. George, 2013
Vortrag von Damien P. George: MicroPython & the Internet of Things • GOTO 2016.
Erstes “Pyboard” mit STM32F405
Pyboard Das Bild ist entnommen von https://micropython.org.
Viele Portierungen auf unterschiedliche Mikrocontroller und Boards, siehe https://micropython.org/download.
Integrierte Entwicklungsumgebungen
Thonny von Aivar Annamaa (Tallinn/Estland) https://thonny.org,
Mu Editor von Nicholas H. Tollervey https://codewith.mu
mpremote
CLI-Programm von D.P. George (siehe nächsten Eintrag)Thonny IDE
Thonny ist für Anfänger zum Lernen von Python konzipiert. Es kann auch Micropython auf einem über USB angeschlossenen Board laufen lassen. Viele Boards werden unterstützt: BBC micro:bit, Raspberry Pi Pico, RP2040, ESP32, ESP8266 und andere.
Simulatoren
Wichtige Module für IoT
- umqtt.simple
- umqtt.robust
- urequests
Wer sein Heltec ESP32 Board mit einem Web-Server ausstatten will, der in Micropython programmiert ist, der sollte sich folgende Links ansehen:
Rui und Sara Santos, ESP32/ESP8266 MicroPython Web Server – Control Outputs
https://randomnerdtutorials.com/esp32-esp8266-micropython-web-server/
Ich habe eine Liste mit vielen freien Tutorials von RNT gemacht, siehe rnt.txt.
ESP32 MicroPython Web Server – Sensor Data on Webpage, 2022
5.15 mpremote
https://pypi.org/project/mpremote/
_ __ ___ _ __ _ __ ___ _ __ ___ ___ | |_ ___
| '_ ` _ \| '_ \| '__/ _ \ '_ ` _ \ / _ \| __/ _ \
| | | | | | |_) | | | __/ | | | | | (_) | || __/
|_| |_| |_| .__/|_| \___|_| |_| |_|\___/ \__\___|
MicroPython remote control
D. P. George, der Entwickler von Micropython hat mit mpremote
auch gleich ein Kommandozeilenprogramm zum interaktiven Arbeiten mit einem Embedded-Board geschrieben. Das Board ist dabei meist über ein USB Kabel an den PC angeschlossen. Es handelt sich dabei um eine serielle Schnittstelle (UART). Unter Linux stehen für serielle Schnittstellen die Gerätedateien /dev/tty*
, konkret /dev/ttyUSB0
, wobei die Zahl auch 1
, 2
, und so weiter sein kann.
Doku: https://docs.micropython.org/en/latest/reference/mpremote.html
Installation
$ pip install mpremote
Optionales Konfigurationsfile mit selbstdefinierten Makros: ~/.config/mpremote/config.py
$ mpremote --version
mpremote 1.23.0
$ mpremote help
$ mpremote --help
$ mpremote mount --help # Hilfe zu Kommandos
$ mpremote devs # Geraete anzeigen
/dev/ttyUSB0 0001 10c4:ea60 Silicon Labs CP2102 USB to UART Bridge Controller
$ mpremote connect /dev/ttyUSB0 repl # oder ...
$ mpremote u0 repl # siehe mpremote --help
Aus repl
aussteigen mit C-]
.
$ mpremote connect --help
$ mpremote connect list
$ /dev/ttyUSB0 0001 10c4:ea60 Silicon Labs CP2102 USB to UART Bridge Controller
$ mpremote ls
$ mpremote edit main.py
$ mpremote cp :main.py . # Datei von Mikrocontroller holen
$ mpremote cp -r dir : # Verzeichnis rekursiv auf Mikrocontroller kopieren
$ mpremote u0 exec "import hhtest"
$ mpremote u0 exec "import dog; dog.main()"
$ mpremote u0 repl # Ende mit C-]
$ mpremote mount . # mount klappt nicht
$ mpremote umount
Entfernte Datei ausgeben. Es geht aber auch mpremote cat <rfile>
. Ausser cat kann man auch eingeben: ls
, cp
, rm
, mkdir
, rmdir
, touch
.
$ mpremote fs cat <rfile>
Lokale Python Datei
$ mpremote run <file>
$ mpremote reset # reset device after some delay
$ mpremote df
mount size used avail use%
501760 12288 489472 2
flash 501760 12288 489472 2
$ mpremote eval 1/2 eval 3/4
0.5
0.75
$ mpremote exec "import micropython; micropython.mem_info()"
stack: 720 out of 7168
GC: total: 67008, used: 17696, free: 49312
No. of 1-blocks: 210, 2-blocks: 34, max blk sz: 512, max free sz: 3073
User config: .config/mpremote/config.py
Pakete aus der micropython-lib
[1] installieren.
$ mpremote mip install aioble
$ mpremote mip install github:org/repo@branch
Sample config:
# Custom macro commands
commands = {
"c33": "connect id:334D335C3138",
"bl": "bootloader",
"double x=4": {
"command": "eval x*2",
"help": "multiply by two"
}
}
[1] Micropython Lib https://github.com/micropython/micropython-lib
5.16 Node-RED

Node-RED Programming Guide. Programming the IoT.
Dashboard
LoRaWAN und Node-RED ct.2021.14.LoRaWAN-TTN-NodeRed.pdf
Hier ist eine Anleitung für die zu-Fuß Installation.
Zunächst Node.JS installieren.
sudo apt install nodejs
Deshalb erst mal testen ob man
node
schon hat:node Welcome to Node.js v12.22.9. Type ".help" for more information. >
Beenden mit
Strg-D
.Auch mal
npm
eingeben, der sollte mit Node.JS installiert worden sein.Nun mit
npm
das Node-RED Programm installierensudo npm install -g --unsafe-perm node-red
Node-RED starten mit
node-red
Das Kommando startet einen Server, der Webseiten ausliefert. Im Web-Browser unter
http://127.0.0.1:1880
findet man die Benutzerschnittstelle.In der Benutzerschnittstelle (Web-Browser) von Node-Red installieren (Menue -> Palette verwalten -> Installation).
node-red-dashboard
node-red-contrib-moment
Das Dashboard hat einen eigenen Zugangs-Link unter
http://127.0.0.1:1880/ui
Unter https://nodered.org/docs/getting-started/local findet man auch noch andere Installationsmethoden.
5.17 Grafana

Literatur
5.18 Linux Kommandos

Ich empfehle das freie Buch Linux Essentials des Linux Professional Institute, die aktuelle Version 1.6 in Deutsch mit 451 Seiten ist hier: https://learning.lpi.org/de/learning-materials/010-160/.
5.18.1 Shell Kommandos
Im Kurs werden wir öfter in einem Terminal Fenster arbeiten. Hier sehen Sie z.B. das Kommando
neofetch
, das eine kurze Übersicht zum installierten Linux anzeigt. Das Kommando muss erst installiert werden mitsudo apt install neofetch
. Das Terminal-Fenster öffnet sich mit dem TastenkürzelStrg-Alt-T
.Im Terminal Fenster läuft eine Shell, meist ist es die bash.
Die Shell hat eine automatische Vervollständigung eingebaut, die man über die
TAB
Taste triggert. Versuchen Sie also öfter mal aufTAB
zu drücken statt z.B. Dateinamen Zeichen für Zeichen bis zum Ende einzugeben.Man kann auch zu früher eingegebenen Kommandos navigieren (History). Im einfachsten Fall geht das mit “Pfeil nach oben”. Smarter geht es mit dem Tastenkürzel
Strg-R
, danach geben sie die Zeichen ein nach denen sie suchen.Zum Navigieren nach links, rechts, oben und unten gibt es standardisierte Tastenkürzel, einfach mal ausprobieren:
Strg-P Strg-A Strg-B Strg-F Strg-E Strg-N
Löschen eines Zeichen geht mit
Strg-D
.Löschen von der aktuellen Stelle bis zum Zeilenende mit
Strg-K
.Die Shell beendet man mit
exit
.
NICHT ALS ROOT USER ARBEITEN!
Gründe:
Gerade als Anfänger können Sie sehr leicht als
root
das Betriebsystem kaputt machen, weil sie dann alle Bereiche des Dateisystems schreiben und löschen können.Wenn Sie als
root
Dateien anlegen, dann können diese nicht mehr als normaler User verändert oder gelöscht werden (ausser man ändert den Eigentümer).Manche Programme weigern sich, als
root
gestartet zu werden.
Wenn das Nummernzeichen
#
als Prompt erscheint, arbeiten sie alsroot
User bzw. Administrator. Sie sollten dann durchexit
zum normalen User werden, der Prompt sollte$
sein.Die Tilde
~
steht für das Homeverzeichnis. Mitls ~
werden die Dateien im Home ausgegeben. Achtung: Dateien die mit einem Punkt beginnen sehen sie nur mitls -a ~
.Sie sollten zumindest die folgenden Kommandos kennen:
- Verzeichnis wechseln mit
cd
. Eine Ebene höher kommt man mitcd ..
. - Kopieren mit
cp
(copy) - Dateien verschieben mit
mv
(move) - Dateien löschen mit
rm
- Verzeichnisse anlegen mit
mkdir
- Verzeichnisse löschen mit
rmdir
- Verzeichnis wechseln mit
Der
nano
Editor eignet sich nicht für Python, er verwendet harte Tab Zeichen. Die Konvention ist jedoch, dass eine Einrückung vier Leerzeichen sind.Dazu muss man in
~/.nanorc
setzen:set tabsize 4 set tabstospaces
Ich empfehle, statt
nano
denmicro
Editor zu verwenden. Man installiert ihn mitsudo apt install micro
oder holt ihn mitcurl
:$ curl https://getmic.ro | bash
Cheatsheet https://itsfoss.com/content/files/2023/11/micro-command-line-text-editor-cheat-sheet.pdf
Programme installieren. Am besten sie legen ein Verzeichnis
bin/
in ihrem Home-Verzeichnis an. Dort hinein stecken sie das ausführbare Programm, zum Beispiel den vorher heruntergeladenen Micro Editor. Abschliessend müssen sie noch die PATH Umgebungsvariable um~/bin
erweitern. Dazu fügt man in~/.bashrc
die Zeileexport PATH=$PATH:~/bin
ein.mkdir ~/bin mv micro bin
Nutzen Sie zum Suchen von Dateien
fdfind
und zum Suchen von Text in Dateienrg
. Diese beiden Tools sind wesentlich einfacher als die normalerweise auf Linux verwendetenfind
undgrep
.
5.18.2 Git

Git ist schon seit vielen Jahren die Nr. 1 unter den Versionsverwaltungsprogrammen, nichts führt daran vorbei. Es stammt von Linus Torvalds, der eigentlich schon berühmt genug wegen seines Linux Kernels ist.
Sie können es auf ihrem Linux Rechner installieren mit
$ sudo apt install git
Sie werden im Kurs git
nur brauchen um gelegentlich ein Repository zu holen, das geht mit dem Kommando
$ git clone <Clone-URL>
Danach haben sie ein neues Verzeichnis, in das sie wechseln können. Dieses Verzeichnis ist nun ein lokales Git Repository. Wenn Sie genau nachsehen, dann finden Sie mit dem Kommando ls -a
darin ein .git
Unterverzeichnis, in dem Git alle Dateien zur Versionskontrolle speichert. Prinzipiell hätten Sie nun die Möglichkeit, an den Dateien Änderungen zu machen, und diese unter einer neuen Version zu “committen”, so dass alle Änderungen exakt in dem lokalen .git
Verzeichnis mitprotokolliert werden. Wenn Sie die Dateien im Repo nur lesen wollen, dann kann ihnen das aber erst mal egal sein.
git
Kommandoübersicht: etc/OSDC_cheatsheet-git-2022.4.7.pdf
Zur systematischen Einarbeitung empfehle ich das freie “Pro Git” Buch, das Sie unter https://git-scm.com/book/de/v2 finden.
5.19 Wokwi

Wokwi ist ein Simulator für Mikroprozessoren inklusive Peripherie, der im Web Browser läuft. Die “User Experience” ist dabei ähnlich wie wenn man ein reales Mikroprozessor-Board am Rechner angesteckt hat.
Wokwi bietet die gängigen Mikroprozessoren wie AVR, ESP32, STM32 und Rapberry Pi RP2024, sowie auch viele bekannte Board wie Arduino Uno, ESP32-DevKitC V4, Raspberry Pi Pico und so weiter. Die Programmierung erfolgt über Arduino C++ oder Micropython. Auch Rust ist als Programmiersprache mittlerweile möglich, siehe https://wokwi.com/rust.
So hat es mir die KI gesagt, hoffentlich stimmt es: “Wokwi wurde von Uri Shaked geschrieben, einem Google-Entwickler, der sich auf Web- und Cloud-Technologien spezialisiert hat. Er ist der Schöpfer und Hauptentwickler von Wokwi, einem Open-Source-Simulator für eingebettete Systeme und IoT-Geräte.”
Den Blog von Uri habe ich selber gefunden: https://blog.wokwi.com/author/uri-2, auch hier: https://urish.org
Ein Blick in die Dokumentation lohnt sich:
5.20 QuestDB / Zeitserien
In den letzten Jahren sind viele neue Datenbanken entstanden, die spezialisiert sind auf die Speicherung von Daten die zeitlich nacheinander entstehen und mit Zeitstempel abgespeichert werden sollen. Das verwundert auch nicht, da es durch Cloud Computing, IoT, Digitalisierung etc. immer mehr Daten gibt. Ein paar Namen sind InfluxDB, TimescaleDB, OpenTSDB, QuestDB, Graphite. Die meisten dieser “Zeitseriendatenbanken” sind im Kern Open-Source Software, jedoch sind fast immer auch kommerzielle Interessen damit verknüpft.
Ich habe mich für den Workshop für die QuestDB entschieden, da sie relativ klein ist und der Open-Source Kern alle wichtigen Features umfasst.

Typische Eigenschaften von TSDBs
- Index über der Zeit
- Typische Anwendungen: Logs, Sensoren, Börsenticker, Geo-Tracking, …
- Kontinuierlich über der Zeit aufgenommene Werte
- Daten werden oft in der Abtastrate verringert (down sampled) oder agreggiert über der Zeit
- “Gib mir den wöchentlichen Durchschnitt der Sensordaten über das letzte Jahr”
- Erkennen von Trends über der Zeit
- Vorhersagen
- Echtzeit-Alarmierung
- Anomalieerkennung
- Visualisierung
Etwas Marketing: https://questdb.com/docs/why-questdb
QuestDB startet man am besten als Container, siehe Abschnitt Container.
QuestDB hat eine Web Anwenderschnittstelle unter http://localhost:9000
, Web Console genannt.
Die QuestDB hat drei HTTP Endpunkte
Export -
http://localhost:9000/exp
curl -G --data-urlencode \ "query=SELECT * FROM example_table2 LIMIT 3" \ http://localhost:9000/exp
Import aus CSV Dateien -
http://localhost:9000/imp
curl -F data=@weather.csv 'http://localhost:9000/imp'
SQL Kommandos ausführen -
http://localhost:9000/exec
curl -G --data-urlencode "query=CREATE TABLE IF NOT EXISTS \ trades(name STRING, value INT)" \ http://localhost:9000/exec
Daten in die QuestDB schreiben (ingestion)
Am schnellsten kann man Daten mit dem InfluxDB Line Protocol (ILP) in die QuestDB schreiben, deswegen sollte man diesen Weg wählen.
https://questdb.com/docs/reference/api/ilp/overview
Es werden viele Sprachen unterstützt (C, C++, Java, Go, Rust, Node.js) auch Python. Das sind die sog. first-party clients.
Wie es mit Python geht steht hier: https://questdb.com/docs/clients/ingest-python
Verwende
questdb
Package. Installieren mitpip install questdb
Siehe Demo in
$WORKSHOP_REPO/questdb
.
Ausserdem gibt es noch andere Techniken um Daten zu schreiben:
- Message broker und Queues (z.B. Kafka, Telegraf)
- CSV Upload aus der Web Console
- PostgreSQL Wire Protocol (PGWire) - eher langsam
Daten von der QuestDB abfragen (query)
Die meisten Zeitseriendatenbanken bieten eine Abfrage über das von klassischen Datenbanken bekannte SQL. Meist gibt es nicht-standardisierte Modifikationen von SQL für die speziellen Anforderungen von Zeitserien, hier kocht jeder Anbieter sein eigenes Süppchen.
Es gibt bei der QuestDB folgende Möglichkeiten für die query:
PostgreSQL wire protocol (PGWire)
Die QuestDB orientiert sich bei SQL an der PostgreSQL Datenbank. In der QuestDB Doku unter https://questdb.com/docs finden Sie eine Referenz aller SQL Kommandos.
Das PGWire Protokoll kann man aus vielen Programmiersprachen ansprechen, eine Übersicht ist hier: https://questdb.com/docs/pgwire/pgwire-intro. Ich empfehle Python zu verwenden, die folgenden Bibliotheken werden unterstützt:
asyncpg
,psycopg3
,psycopg2
.Siehe Demo in
$WORKSHOP_REPO/questdb
.REST HTTP API
Endpunkt “exp”:
http://localhost:9000/exp
https://questdb.com/docs/reference/sql/overview/#rest-http-api
In der Web Console kann man interaktiv SQL Kommandos abgeben. Eignet sich gut zum Experimentieren.
Zukünftig kommt noch die Abfrage über Apache Parquet hinzu, siehe https://parquet.apache.org. Das ist aber nur im Bereich von anspruchsvollen Projekten von Interesse, wenn sehr grosse Datenmengen schnell abgefragt werden müssen.
Doku: https://questdb.com/docs
Literatur
- Der c’t Artikel behandelt zwar den Konkurrenten InfluxDB, bietet aber auch einen guten Überblick zu Zeitserien-Datenbanken, Artikel/ct.2019.05-InfluxDB.pdf.
5.21 Ntfy.sh

Android/Mac App von Philipp C. Heckel (frei, ohne Werbung!)
Benachrichtigungen sind HTTP Requests, z.B. über
curl
:$ curl -d "Hallo" ntfy.sh/alp_iot_workshop_2025
Der URL steht sowohl für das Thema als auch für das Passwort. Jeder der den URL kennt kann eine Nachricht hinschicken.
CLI tool (Go) https://github.com/binwiederhier/ntfy
Doku
- Publishing messages: https://docs.ntfy.sh/publish
5.22 Container
https://www.docker.com, https://docs.docker.com/compose

Die folgenden Dienste habe ich vorbereitet damit man sie beim Workshop über docker-compose
starten kann. In $WORKSHOP_REPO/docker_test
sind kurze Skripte und Programme die zeigen wie man einige der Dienste verwendet.
Wie man Docker und Docker Compose installiert und eine kurze Anleitung finden Sie weiter unten.
Mosquitto
cd $WORKSHOP_REPO/docker/mosquitto docker-compose up -d
Der Container hat den Namen
alp_iot_mosquitto
. Die Konfiguration des Dienstes ist indocker/mosquitto-vol/config/mosquitto.conf
, der anonyme Zugang ist erlaubt.Webhookd
cd $WORKSHOP_REPO/docker docker-compose -f webhookd.yml up -d
Node-RED
cd $WORKSHOP_REPO/docker docker-compose-2 -f nodered.yml up -d docker exec -it alp_iot_nodered bash -c "npm install node-red-dashboard && \ npm install node-red-contrib-moment" docker restart alp_iot_nodered
Die
docker exec ...
Anweisung installiert zwei Node-RED Erweiterungen. Alle drei Kommandos sind innodered.sh
zusammengefasst.Grafana
cd $WORKSHOP_REPO/docker docker-compose -f grafana.yml up -d
QuestDB
cd $WORKSHOP_REPO/docker docker-compose -f questdb.yml up -d
Sie müssen zunächst auf ihrem Rechner Docker und Docker-Compose installieren.
Docker installieren Sie über
sudo apt install docker.io
Docker-Compose erleichtet die Arbeit mit mehreren Containern. Man schreibt die Konfiguration der Container in eine YAML Datei [4] und läßt diese Datei von
docker-compose
ausführen. Im Hintergrund erledigt die Arbeit immer nochdocker
, deshalb kann man auch die üblichen Docker Kommandos auf die erzeugten Container anwenden.Sie installieren
docker-compose
in der Version 1.x mitsudo apt install docker-compose
. Diese Version ist in Python geschrieben.Ich empfehle jedoch, das Programm
docker-compose
in der Version 2.x zu installieren, man findet es auf https://github.com/docker/compose. Es ist in Go geschrieben, deshalb besteht es aus nur einem grossen Binärfile.
Zustände eines Containers
Existiert create Existiert, start Container
nicht -------> läuft aber -----> läuft
rm noch nicht <-----
<------- (gestoppt) stop
rm -f
<------------------------------
run
------------------------------->
Damit ein Container erzeugt und gestartet werden kann muss ein Container-Image vorhanden sein. Mit docker pull ...
holen Sie ein Image, docker images
zeigt die vorhandenen Images an.
Für unseren Kurs reicht es völlig aus, wenn wir vorhandene Images holen und davon Container erzeugen. Man kann mit Docker aber auch eigene Images erzeugen, dazu ist dann die Konfigurationsdatei Dockerfile
nötig.
Docker und Docker-Compose Kommandos
Hilfe bekommt man mit
docker --help
Die Version wird mit
docker version
ausgegeben.Nach Container-Images auf Docker Hub suchen (https://hub.docker.com)
docker search <string>
Image holen
docker pull
Vorhandene Images auflisten
docker images
Container erzeugen und laufen lassen (-i: interactive, -t: terminal, -p: host port:container port, -v: volume)
docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red:latest
Mit der zusätzlichen Option
-d
kann man den Container im Hintergrund laufen lassen (detach).Laufende Container auflisten
docker ps
Alle Container auflisten (auch gestoppte)
docker ps -a
Logfile eines Containers anzeigen
docker logs <id>
Container entfernen
docker rm <id>
Alle Container (auch laufende) entfernen
docker rm -f $(docker ps -aq)
Info zu Container ausgeben
docker inspect <id>
Statistik zu Ressourcenverbrauch
docker stats <id>
Image löschen
docker rmi <image>
Docker-Compose
Hilfe bekommt man mit
docker-compose --help
. Die Version wird mitdocker-compose version
ausgegeben.Container der/die in der .yml Datei definiert sind starten. Wenn die Konfigurationsdatei
docker-compose.yml
heißt, benötigt man die-f
Option nicht. Es dürfen auch mehrere -f Optionen angegeben werden. Die-d
Option bedeutet detached.docker-compose -f docker-compose-node-red.yml -p myNoderedProject up -d
Container herunterfahren
docker-compose down
Laufende Dienste anzeigen
docker-compose ps
Literatur
Docker Cheatsheet etc/docker_cheatsheet_r4v2.pdf
Farhan Hasin Chowdhury, The Docker Handbook – Learn Docker for Beginners
Das Buch behandelt auch
docker-compose
.
Das meiner Meinung nach beste Docker-Buch für Anfänger ist das hier: James Turnbull, The Docker Book, https://dockerbook.com.
Wer auch gerne mal Alternativen anschaut sollte sich Podman (https://podman.io) vornehmen. Es ist Kommando-kompatibel zu Docker (bis auf winzige Ausnahmen) und es funktioniert anders als Docker ohne Daemon im Hintergrund. Podman läuft komplett unter der Kennung des angemeldeten Users (“rootless”). Es gibt auch podman-compose
als Ersatz für docker-compose
.
Im folgenden finden Sie das freie Buch Podman in Action von Daniel Walsh (2023) und ein Cheat Sheet:
Literatur
[1] https://historyofcomputercommunications.info/interviews/Gordon-Bell
[2] https://vanhunteradams.com/Protocols/UART/UART.html
[3] https://de.wikipedia.org/wiki/RS-232