Raspberry Pi und NodeMCU kommunizieren über eine TLS verschlüsselte MQTT Verbindung

In unserem Haus habe ich in mehreren Zimmern zur Temperatur- und Raumfeuchtigkeitsmessung einen NodeMCU mit angeschlossenem DHT22 Sensor eingesetzt. Der Sensor kommuniziert über verschlüsseltes MQTT mit einem Mosquitto-Server.

Der Mosquitto Dienst läuft auf einem Raspberry Pi 3+, zusammen mit einer Influx-DB-, NodeRed- und Grafana-Installation. Als schlankes Betriebssystem habe ich mich für DietPi entschieden. DietPi ist sehr auf minimalen CPU- und Ramverbrauch ausgelegt und läßt sich einfach administrieren. Vielen Software-Pakete stehen installationsfertig zur Verfügung, so auch Mosquitto, Influx, NodeRed und Grafana.

Um den MQTT-Datenverkehr zwischen den Nodes und dem Host sicherer zu machen (und um mich auch mal wieder mit der gängigen OpenSSL Verschlüsselung auseinander zu setzen), habe ich die Datenübertragungen mit TLS verschlüsselt. Wie ich dabei genau vorgegangen bin, beschreibe ich in diesem Blogbeitrag.

Die MQTT-Clients bekommen alle ein „tactic“-Gehäuse, um zum Einen die benötigten Kabel zu fixieren und zum Anderen den NodeMCU-Microprozessor vor „Umwelteinflüssen“ zu schützen.. Der DHT22-Sensor ist ausserhalb des Gehäuses mit Heisskleber befestigt, um neutrale Bedingungen zum Messen zu erhalten.

Zu Beginn der Arbeit stellt sich die Frage, woher man die Zertifikate für die TLS-Verschlüsselung beziehen möchte. Grundsätzlich gibt es dafür verschiedene Möglichkeiten. Zum Beispiel kann man sich das CA-Zertifikat bei einer öffentlichen Zertifizierungsstelle (CA) kaufen (z. B. bei der Bundesdruckerei) oder z. B. bei Let’s Encrypt kostenlos beziehen. Der Unterschied zwischen beiden Möglichkeiten liegt im Wesentlichen im Vertrauen, welches man der jeweiligen Zertifizierungsstelle entgegenbringt.

Eine weitere Möglichkeit ist es, sich das Zertifikat selber auszustellen und zu unterschreiben. Oder aber man erstellt sich eine eigene Zertifizierungsstelle, mit der man sich Serverschlüssel und Zertifikate für alle dafür geeigneten Dienste (Webserver, MQTT-Server etc.) ausstellen kann. Welchen Weg man dabei wählt, hängt auch damit zusammen, ob man seinen Server ins Internet stellen möchte oder nicht. In meinem Fall ist der Plan, meine Server nur intern (ohne Verbindung ins INET) zu verwenden. Daher reicht in meinem Fall ein selbst signiertes Zertifikat, welches ich mit meiner eigenen Root-CA erstelle.

Ich benutze zum Erstellen der Zertifikate das Tool OpenSSL.

a) Generieren des privaten CA Schlüssels (CA Private Key). Als Besonderheit verwende ich hierbei mal keinen RSA-Schlüssel, sondern einen „elliptical curve key„.

openssl ecparam -name secp521r1 -genkey -noout -out ca.pem

b) als nächstes erzeuge ich mir ein selbstsigniertes Zertifikat (Self-Signed CA Cert)

Ich benutze dafür meinen gerade erzeugten privaten CA-Key. Zuerst wird dafür eine openssl.conf Datei angelegt, deren Inhalt in den CA-Key mit einfließt. Eine gute Beschreibung der „distinguished_name“ findet man hier.

root@DietPi:/etc/mosquitto# more openssl.conf
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName = DE
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName = Schleswig-Holstein
localityName = Locality Name (eg, city)
localityName = Arnis
organizationalUnitName  = Organizational Unit Name (eg, section)
organizationalUnitName  = Loobster IT
organizationalUnitName_default  = Domain Control Validated
commonName = 192.168.1.7
commonName_default = your.server.primary.url.or.ip.address
commonName_max  = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1
IP.2 = 192.168.1.7

Hier wird das Zertifikat erzeugt (ich stelle mir das Zertifikat für eine Dauer von 10 Jahren aus) :

openssl req -new -x509 -days 3650 -key ca.pem -config openssl.conf -out ca.crt -sha256

c) Jetzt wird der MQTT Broker Private Key erzeugt

Jetzt bin ich soweit, auch dem MQTT-Broker einen eigenen privaten Schlüssel zu erstellen. Auch hier sind wieder die „elliptical curve“ im Spiel.

openssl ecparam -name secp521r1 -genkey -noout -out mqtt-serv.pem

d) Generieren einer MQTT-Broker-Zertifikatsignierungsanforderung (CSR)

Da ich für die verschlüsselten MQTT-Verbindungen ein eigenes MQTT-Zertifikat benötige, generiere ich jetzt im nächsten Schritt auf Basis des MQTT-Brokers Privat Keys einen sogenannten Zertifikats-Request.

openssl req -new -out mqtt-serv.csr -key mqtt-serv.pem -config openssl.conf -sha256

e) Generieren eines CA-signierten MQTT-Broker-Zertifikats

Dieser gerade erzeugte MQTT-Broker Zertifikats-Request wird jetzt in Verbindung mit der oben erstellten Root-CA benutzt, um für den MQTT-Broker ein eigenes Broker-Zertifikat zu erstellen, welches von der Root-CA signiert ist.

openssl x509 -req -days 3650 -in mqtt-serv.csr -CA /path/to/ca.crt -CAkey /path/to/ca.pem -CAcreateserial -out mqtt-serv.crt -extensions v3_req -extfile openssl.conf -sha256

f) Extrahieren unseres MQTT Broker Cert Fingerabdrucks

coming soon

2) Anpassungen der mosquitto.conf Datei

root@DietPi:/etc/mosquitto# more mosquitto.conf
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

port 1883

pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

#####################################
listener 8883
cafile /etc/mosquitto/ca.crt
certfile /etc/mosquitto/mqtt-serv.crt
keyfile /etc/mosquitto/mqtt-serv.pem
#####################################

#allow_anonymous true
#password_file /etc/mosquitto/passwd

include_dir /etc/mosquitto/conf.d

3) Sketch für NodeMCU

coming soon

4) Ausgabe in der Console beim Start des Sketche

⸮!⸮SK⸮oB⸮⸮ai⸮qE1⸮⸮R⸮aEa⸮iq⸮⸮ 
Connecting to AccessPoint ... 
Connecting. 
Connected, IP address: 192.168.1.85 
Verifying TLS connection to 192.168.1.7 
Connection complete, valid cert, valid fingerprint. 
Attempting MQTT broker connection...connected 

5) Test der Funktionsfähigkeit der SSL-Konfiguration

root@DietPi:~# mosquitto_sub -h 127.0.0.1 -p 8883 --cafile /etc/mosquitto/ca.crt -t sensors/dht11/+/werkstatt -v

sensors/dht11/luftfeuchte/werkstatt    59.0
sensors/dht11/temperatur/werkstatt     7.0
sensors/dht11/luftfeuchte/werkstatt    59.1
sensors/dht11/temperatur/werkstatt     7.1
sensors/dht11/luftfeuchte/werkstatt    59.1
sensors/dht11/temperatur/werkstatt     7.1

6) Node-Red Config auf SSL (Port 8883) anpassen

Wenn die Auswertung der per MQTT abonnierten Daten mit Hilfe des Programms Node-Red erledigt werden soll, dann ist bei der MQTT Quelle der Port auf 8883 (nicht 1883) zu ändern.

Weiterhin sind noch die Pfade der entsprechenden Zertifikate einzutragen.

H. Rode – Nucleon e. V.

GIS-Daten darstellen, Teil 2

Heute lernen wir, wie wir in der Darstellung des GIS-Programms die in Betrieb befindlichen Windkraftanlagen von den in Genehmigung befindlichen und den vor der Inbetriebnahme stehenden Anlagen unterscheiden können. Wir werten dazu mit einem Regelwerk das Feld „Status“ in der Datendatei wka-opendata.csv aus.

Noch sind keine Regeln erstellt

Im geöffneten Programm QDIS klicken wir unten links in der Layeranzeige mit Doppelklick auf den Layer wka-opendata, worauf sich ein Fenster mit einer linksseitigen Menüführung öffnet. Wir wählen den Menüpunkt Symbolisierung und dann im oberen Menü den Menüpunkt „Regelbasierend“ aus.

In diesem Fenster wird im oberen Menü der Menüpunkt „Regelbasierend“ ausgewählt

Jetzt befinden wir uns im Regelwerk-Editor und können die ersten Regeln erstellen. Als erstes interessiert uns, welche Windkraftanlagen in SH bereits in Betrieb sind.

Dazu klicken wir auf das grüne Kreuz unten links im Fenster, um eine neue Regel zu erstellen. Die Syntax der Regel lautet:

if(  ("Status"  = 'in Betrieb'),1,0 )
Hier wird die jeweilige Regel erstellt

Genauso erstellen wir auch die weiteren Regeln. Die Regel „vor Inbetriebnahme“ sieht dann z. B. so aus:

if(  ("Status"  = 'vor Inbetriebnahme'),1,0) 

Die Wirksamkeit der gerade erstellten Regel können wir sofort mit dem Button „Test“ ausprobieren. Sollte eine Fehlermeldung erscheinen, fehlt eventuell eine Klammer.

Wenn uns dann vielleicht noch interessiert, wo in SH die kurz vor Inbetriebnahme stehenden Windkraftanlagen mit einer Nennleistung von 4500 kW gebaut werden sollen, dann lautet die Regel so:

if(  (  (  "Status"  = 'vor Inbetriebnahme') AND  "Leistung"  = '4500 kW Nennleist. Rotor.'),1,0)
Hier kann man das Regelwerk erstellen und überprüfen

Wenn alle gewünschten Regeln erstellt wurden, bleibt nur noch, den Regeln passende Farben zuzuordnen. Das passiert im Layerfenster unten links, indem man dort die jeweilige Regel doppelklickt. Im sich dann öffnenden Fenster kann man die passende Farbe zuordnen.

GIS-Daten in einem geographischen Informationssystem (GIS) darstellen

Die vor ein paar Tagen veröffentlichte Windkraftanlagen-Datei vom SH OpenData Portal (WKA-OpenData.csv) habe ich mal zum Anlaß genommen, mir auf meinem Rechner ein geographisches Informationssystem (GIS) zu installieren, welches für die Anzeige der GIS Daten erforderlich ist. Mein ausgewähltes Programm heißt QGIS und ist natürlich Open-Source.

Gesagt, getan. Die aktuelle OSX-Version 3.8.1 ist schnell von der Website https://qgis.org/de/site/ heruntergeladen und installiert.

Nach dem Start präsentiert sich das Programm eher schlicht.

Das Programm QGIS kurz nach dem Start

Als erstes benötigen wir den OSM-Layer (OpenStreetMap). Den laden wir hier.

Der OSM-Layer ist geladen

Jetzt wird das richtige Koordinatenbezugssystem eingestellt. Wir benötigen hier das KBS 4647.

Hier wird das Koordinatenbezugssyystem 4647 eingestellt

Nun ist das Programm so weit vorbereitet, dass wir die vom OpenData-Portal geladene CSV-Datei wka-opendata.csv ins Programm laden können.

Nun noch die vom OpenData Portal geladene wka-opendata.csv Datei ins Programm laden

Bitte die Parameter so wie in der Grafik dargestellt übernehmen.

Folgende Einstellungen sollten übernommen werden

Voilá, das war es schon. Die Daten werden auf der Karte zur Anzeige gebracht.

Damit ist Teil 1 der Anleitung abgeschlossen. Im Teil 2 zeige ich Euch, wie wir optisch die in Betrieb befindlichen Anlagen von den in Genehmigung befindlichen und den vor der Inbetriebnahme stehenden Windrädern unterscheiden können.

Der BBC micro:bit

Micro:bit

Nach dem wir mit dem Verein Nucleon e.V. im Sommer 2019 einen ersten Schnupperkurs für Kids von 9-11 Jahren durchgeführt haben möchten wir an dieser Stelle nun weitere Informationen, Beispiele und Links zum Thema micro:bit bereitstellen. Wir haben mit dem Kurs unsere ersten Erfahrungen sammeln können und sind davon überzeugt das wir dieses Thema weiter ausbauen müssen, der Bedarf ist vorhanden.

Was ist der BBC micro:bit überhaupt?

Der micro:bit ist ein kleiner kostengünstiger Computer der speziell für die Schulungen auch sehr junger Schüler gebaut worden ist.

Der micro:bit ist das Resultat einer Zusammenarbeit von Firmen und Communities rund um die Welt. Die Micro:bit Educational Foundation hält die Gemeinschaft zusammen so das dort viele Informationen zusammen laufen und auch die Links zu den online Plattformen direkt zu erreichen sind.

Übersicht BBC Micro:bit von https://microbit.org

Luft und Wetter Daten auf einer Node-RED Map

Feinstaubmessung Südschleswig

Im Umfeld eines kleinen Forschungsprojekts zu Fiware (fiware.org) ist eine Node-RED Map entstanden die eine lokale Visualisierung der Luftdaten.info Daten entstanden.

Es werden die Daten eines Bereichs über die API von Luftdaten.info gelesen und mittels dem Node-RED Node Worldmap auf einer Map angezeigt, ge nach Sensor Status werden die Pins eingefärbt und im Message Objekt werden dort die jeweiligen Daten in einer Info Box gezeigt.

„Luft und Wetter Daten auf einer Node-RED Map“ weiterlesen

Smarte LoRaWAN Umweltstation in Arnis

Schon längere Zeit bin ich mit der Idee schwanger gegangen, im Garten in Arnis an der Schlei eine Umwelt- und Wetterstation zu errichten. Es wurde geplant und teilweise wieder verworfen, bis das Konzept am Ende rund war. Anfang des Jahres war es endlich soweit. Ich begann, mein Projekt umzusetzen.

Die Basis der Umweltstation sind 4 gebrauchte Paletten, die hochkant gegeneinander gestellt wurden. Oben und unten mit stabilen Winkeln versehen, werden sie die nächsten Jahre als stabile Basis für die Station und das eingebaute Hochbeet ihren letzten Dienst verrichten.

Hier ist das Hochbeet an den Seiten bereits mit Blumen bepflanzt. Oben im Gemüsebereich wachsen die Radienschen, die Wurzeln, der Schnittlauch und der Kohlrabi.

An der Umweltstation habe ich das größte verfügbare Solarpanel (300 W) installiert. Im Winkel von 30° genau nach Süden geneigt, produziert es jetzt den nötigen Strom für meine schon aktiven und noch geplanten Abnehmer. Die Kapazität des Solarmoduls ist im Moment noch ein bisschen „too much“; ich habe aber natürlich berücksichtigt, dass im Winter nur ca. 1/8 der Stromausbeute des Sommers produziert wird. Somit reicht der mit dem Solarmodul gewonnene Strom auch im Winter.

Schaltkasten mit dem 120 Ah Akku und dem Laderegler. Oben über der Batterie sieht man das LoRaWAN Modul zum Übertragen des Ladestandes.

Bei der Auslegung des Solarpanels und der Speicherbatterie habe ich mich am Setup von Christian (https://network.cdresel.de) orientiert. Ich denke, dass die von mir eingesetzten Größen des Panels und der Batterie für meine Zwecke mehr als ausreichend sein werden.

Zum permanenten Überprüfen der ordnungsgemäßen Funktion des Panels und der Batterie habe ich ein Zusatzmodul für den Solarregler installiert. Der Ladezustand der Batterie wird mit Hilfe eines VE.Direct LoRaWAN Moduls ausgelesen und stündlich an ein Portal im Internet geschickt, wo die ermittelten Daten visualisiert werden.

Systemstatus der Stromausbeute des Solarmoduls

An der Batterie ist ein 12V/ 5V Spannungswandler angeschlossen, der den gewandelten 5V Strom an einen ARM Cortex-M0+ Prozessor aus der SAM D21 Familie von Microchip (MCU senseBox) weiterleitet. Die senseBox wurde ausgewählt, weil man die Sensoren und das LoRaWAN Modul steckbar montieren kann. Es entfällt jegliche Lötarbeit, was mir sehr entgegen kommt.

An dieser MCU sind am I2C Bus mehrere verschiedene Sensoren angeschlossen:

  • Druck- und Temperatursensor BMP280
  • Lichtsensor TSL45315
  • UV Lichtsensor VEML6070
  • Temperatur- und Luftfeuchtesensor HDC1080

Weiterhin ist am UART/Serialport ein Feinstaubsensor SDS011 angeschlossen. Somit werden im Moment 7 verschiedene Sensorwerte ermittelt und verarbeitet.

Eine Erweiterung der Wetterstation um Regen- und Windmessung ist bereits in Planung.

Die ermittelten Sensordaten werden mit einem LoRaBee Modul per LoRaWAN Protokoll an das TTN versendet und von dort per HTTP an das openSenseMap Portal weitergeleitet.

In den oberen Bereich der hochgestellten Paletten habe ich einen Bretterboden eingezogen und den entstandenen Raum mit Folie ausgeschlagen. Der hierdurch entstandene Raum ist mit 8 Sack Hochbeeterde aufgefüllt worden. Somit ist ein prima Hochbeet entstanden, welches vor ein paar Wochen passend zum Frühjahr mit Gemüsesamen (Radieschen, Kohlrabi, Wurzeln und Schnittlauch) eingesäät worden ist.

Für die Zukunft ist geplant, im Hochbeet die Temperatur und die Feuchtigkeit zu messen. Bei zu geringer Feuchtigkeit soll dann automatisch eine Pflanzenbewässerung eingeleitet werden. Die Steuerung der Bewässerung wird ein Arduino übernehmen, der seine Aktivitäten natürlich auch per LoRaWAN mitteilt.

Der Betrieb der Umweltstation ist kostenneutral. Die Software der Station ist Open-Source, der Strom zum Betrieb der Station wird wie hier beschrieben mit einem großen Solarmodul erzeugt und in einer Batterie zwischengespeichert, das Wasser zum Gießen der Pflanzen im Hochbeet wird aus Regenwasser gewonnen und die erzeugten Daten werden per LoRaWAN Funk ins Internet geschickt.


Node-RED und die Meta Daten der Nodes

Wir haben nun schon die Nucleon Wetter Nodes in einem Node-RED Flow, so das diese ihre Wetter Daten in die InfluxDB senden. Jeder Node liefert aber auch noch eine Handvoll Meta Daten über den Standort und interessante Daten zur Übertragung. Diese Daten wollen wir natürlich auch aufbereiten und zur Anzeige bringen.

Übersicht des vollständigen Flows mit Meta Daten

Der oben gezeigte Node-RED Flow ist das Ziel dieses Beitrags. Wir werden auch hier jeden Node besprechen so das am Ende ein Nachbau in der eigenen Node-RED Instanz möglich wird.

„Node-RED und die Meta Daten der Nodes“ weiterlesen

Node-RED und der Wetter-Flow für den BaseNode

Wir haben im Artikel Node-RED zur Verarbeitung der TTN Daten unsere Node-RED Umgebung eingerichtet, jetzt werden wir die ersten Schritte gehen um aus dem The Things Network (TTN) die ersten Daten abzuholen.

Grundlegende Funktionsweise

Node-RED arbeitet mit grafischen Ablaufplänen den sogenannten Flows. In diesen Flows werden diverse Nodes eingesetzt die unterschiedliche Funktionen beinhalten. Im folgenden werde ich die verwendeten Nodes vorstellen.

Die verwendeten Nodes in Node-RED

Der Wetter Flow in der Übersicht
„Node-RED und der Wetter-Flow für den BaseNode“ weiterlesen

Node-RED zur Verarbeitung der TTN Daten

Die Node-RED Plattform eignet sich hervorragend um schnell Daten von A nach B zu bekommen und sie zwischen durch anzupassen, transformieren oder mit anderen Daten anzureichern, als sie auch auf unterschiedliche Datensenken zu verteilen.

Ein klassischer ETL Prozess mit grafischer Oberfläche.

Die Einrichtung der Datenbanken können wir an anderer Stelle mal genauer besprechen, hier soll es erst einmal um Node-RED gehen.

Installation

Node.js und npm

Um Node.JS auf dein System zu installieren gibt es viele Möglichkeiten, ich möchte an dieser Stelle die Installation unter Debian kurz erklären. Wer schon die aktuelle Version von Node.JS und npm laufen hat kann zur Installation von Node-RED weiter gehen.

Du musst Node.js PPA zu deinem System hinzufügen, welches auf der offiziellen Website von Nodejs bereitgestellt wird. Wir müssen auch das Software-Properties-Common-Paket installieren, falls es nicht bereits installiert ist. Du kannst entweder die aktuelle Version Node.js oder die LTS-Version installieren.

Eine gute Idee ist es auch für Node-RED einen eigenen User anzulegen, da einige Nodes nicht sauber installiert werden können wenn Node-RED unter root installiert wurde. Grade beim RaspberryPI sind Probleme bekannt wenn Node-RED unter dem User pi installiert ist.

„Node-RED zur Verarbeitung der TTN Daten“ weiterlesen

Wettermonster eine Anleitung für die eigene Wetterstation

Einfach, Günstig, Gut…

…das ist die Idee hinter Wettermonster. Jeder Interessierte soll die Möglichkeit bekommen, selbst eine Wetterstation zu betreiben.

So wirbt Wettermonster auf ihrer Seite und hält das Versprechen auch ein.

Jan Dopheide hat im Rahmen einer Jugend-forscht-AG an seiner Schule und des Wettbewerbs Schüler experimentieren eine Wetterstation gebaut und im Nachgang dann die Webseite aufgebaut in der sehr gut erklärt wird wie man zu einer eigenen Wetterstation kommt.

Wir haben uns im Verein Nucleon e.V. nun zum Ziel gesetzt diese Wetterstation zu einer autonom arbeitenden LoRaWAN Wetterstation auszubauen. Das interessante an der Seite ist das neben dem Tutorial auch eine Karte mit den Stationen aufgebaut wurde an die man dann seine Daten senden kann. Da der verwendete MCU seine Daten aber mittels WLAN an die Seite sendet haben wir eine kleine Schnittstelle bauen müssen um die Daten unserer Stationen über LoRaWAN, dem The Things Network und Node-RED dann auch zu Wettermonster senden können.

Dieses werden wir hier nun näher beschreiben.

„Wettermonster eine Anleitung für die eigene Wetterstation“ weiterlesen