![]() |
![]() |
Auch wenn die Sensoren von MobileAlerts nicht die günstigsten sind, so
überzeugen sie durch Vielfalt, Qualität, sehr hohe Reichweiten und grandios
lange Batterielaufzeiten. Eigentlich die perfekte Wahl, wenn man für eine gute
Gesamtleistung bereit ist, den extra Euro zu bezahlen... wäre da nicht der alles
verderbende Cloud-Zwang :-/ Zwar bietet MobileAlerts offiziell das
REST-Api an, um Daten lokal verwenden zu können, aber die Cloud bleibt mit
all ihren Licht- und Schattenseiten. Mir missfällt einfach der Gedanke, meine
lokal erhobenen Daten raus in den Ether zu blasen, sie dann wieder
aus dem Netz zu angeln, um sie am Ende wieder lokal nutzen zu können. Zudem kommt es leider öfters zu
Serverproblemen, was einer Nutzung für kritische Überwachungen sehr
entgegensteht.
Als ich vor einiger Zeit über
diesen Blog gestolpert bin, fingen meine Augen an zu leuchten. Dort wird
beschrieben, wie man mittels Proxyserver seine Daten lokal vom Gateway (MA10000) abgreifen und an
einen MQTT-Broker publishen kann. Der
Server wird dabei auf einem Raspberry Pi eingerichtet, den wahrscheinlich viele
ohnehin am Laufen haben, wenn sie ihre 4 Wände etwas smarter machen wollen. Da
der Server ressourcentechnisch sehr genügsam ist, reicht ein Raspberry Pi Zero 2
W vollkommen aus, auch wenn dieser bereits mit anderen Dingen beschäftigt sein
sollte. Da mir die Installation und Einrichtung nicht ganz leicht von der Hand
ging, werde ich meine Erkenntnisse hier mal in diese Seite gießen.
Voraussetzung für die Installation des Proxyservers (MAServer) ist ein vorkonfigurierter Raspberry Pi.
Wer dies noch erledigen muss und nicht so recht weiß wie, kann
hier mal vorbeischauen.
Falls noch nicht am Laufen sollte man auch gleich den
MQTT-Broker
Mosquitto installieren.
Wie vor jeder Installation empfiehlt es sich ein Systemupdate zu fahren, man
muss es aber nicht zwingend tun.
Für den Betrieb wird Node.js und für die Installation der Packagemanager npm benötigt. Durch die Eingabe von "node -v" bzw. "npm -v" kann man die aktuell installierte Version auslesen. Erscheint hier keine Versionsnummer und stattdessen so etwas wie "command not found" dann muss es zuerst installiert werden. Ich habe bei mir node v22.15 am laufen, es wird aber auch mit v18.x und v20.x laufen.
Im Anschluss wird das Paket
MMMMobileAlerts von GitHub heruntergeladen, dazu sollte man im
Homeverzeichnis stehen, was man nach dem Anmelden ja auch tut. Dann wird die
Beispiel-Config kopiert und in Texteditor Nano geöffnet und angepasst.
Die config.json sollte wie folgt angepasst werden:
{
"localIPv4Address": "DeineRasberryPi-IP",
"mqtt": "mqtt://DeineRasberryPi-IP:1883",
"mqtt_home": "MobileAlerts/",
"mqtt_username": "",
"mqtt_password": "",
"publish_type": "default",
"sonoffPublish_prefix": null,
"logfile": "./MobileAlerts.log",
"logGatewayInfo": true,
"proxyServerPort": 8095,
"mobileAlertsCloudForward": true,
"serverPost": null,
"serverPostUser": null,
"serverPostPassword": null,
"locale": "de-DE"
}
Anstelle von
DeinRaspberryPi-IP muss die IP-Adresse des Pi eingetragen
werden, auf dem der Proxy-Server gerade installiert wird. In meinem Fall war
das die 192.168.178.139, diese wird bei dir aber aller Wahrscheinlichkeit nach
anders lauten. Ich gehe davon aus, dass der MQTT-Broker ebenfalls auf dem Pi
läuft und den Standardport 1883 nutzt. Bei "mobileAlertsCloudForward" sollte
true eingetragen werden, wenn die Daten auch weiterhin noch in die Mobile-Alerts-Cloud
gesendet werden sollen. Tut man das nicht, so kann man die dazugehörige
Handy-App nicht mehr nutzen, ist aber komplett cloudfrei. Genau an dieser
Stelle kam es bei mir zu einem Fehler, weshalb wir gleich noch das
Originalskript leicht anpassen werden. Erst mal muss aber die config.json
gespeichert werden. Dazu [Strg] + [o] drücken und anschließend [Strg] + [x]
um Nano zu verlassen.
Wie erwähnt wird jetzt noch schnell der Code
vom Proxy-Server angepasst. Bei mir kam es trotz installiertem "request-micro" zu einem Problem bei der Weitergabe der Daten
zum MobileAlerts-Server (Cloud). Aus diesem Grund bin ich auf "request"
ausgewichen, was einwandfrei funktioniert. Dazu wird die
gatewayProxyServer.js im Nano geöffnet - wir stehen noch in
"~/MMMMobileAlerts/maserver".
Die Zeile 14 "const request = require('request-micro');" wird
durch "const request = require('request');" ersetzt und
anschließend mit [Strg] + [o] und [Strg] + [x] speichern und schließen.
Zu guter Letzt muss noch das "request" Package installiert werden.
Jetzt kann das Build vom Servergefahren werden - wir stehen noch in "~/MMMMobileAlerts/maserver".
Dieser Vorgang kann je nach Systemauslastung etwas länger dauern.
Danach kann der Proxi-Server zum ersten mal gestartet werden.
Beim allerersten Start bekam ich die Meldung "Error
[ERR_SOCKET_DGRAM_NOT_CONNECTED]... bla bla bla". Beim Blick auf den
Gateway-Status (IP-Adresse vom Gateway im Browser eingeben) sah ich aber,
dass das Gateway bereits den Proxy-Server erkannt und sich damit verbunden
hat. Ich habe dann den laufenden Prozess mit [Strg] + [c] abgebrochen und
ihn mittels "node mobilealerts.js" neu gestartet, seitdem läuft er ohne zu
murren. Der Server kann hier mittels [Strg] + [c] beendet werden.
Nach <= 7 Minuten sollten dann auch schon die ersten Werte an
den MQTT-Broker gesendet werden. Dies kann man z. B. mit dem
MQTT Explorer beobachten. Dazu gleich mehr.
Zunächst folgt noch der
Feinschliff und zwar das Anlegen eines systemd-Service für einen
automatischen Autostart des Servers nach dem Neustart.
Es öffnet sich Nano mit einer leeren Datei, dort wird folgendes
eingefügt:
[Unit]
Description=Mobile Alerts MAServer
After=network-online.target
Wants=network-online.target
[Service]
WorkingDirectory=/home/DeinUserName/MMMMobileAlerts/maserver
ExecStart=/usr/bin/node /home/DeinUserName/MMMMobileAlerts/maserver/mobilealerts.js
Restart=always
User=DeinUserName
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
Anstelle von DeinUserName muss dein
Benutzername vom Raspberry angegeben werden. Danach mit [Strg] + [o] und
[Strg] + [x] speichern und schließen.
Zum Abschluss folgt noch:
Um zu prüfen, ob der Server läuft, kann Folgendes eingegeben werden:
Beendet wird die Ansicht mit [Strg] + [q].
Wie weiter oben erwähnt, lässt sich der MQTT-Broker mit dem
MQTT Explorer von
Thomas Nordquist ausspionieren, sprich, man kann mit ihm beobachten,
welche Daten gerade über den Broker laufen. Nach dem Start klickt man auf +
Connections (1) , vergibt einen sprechenden Namen (2), gibt die IP-Adresse vom Broker
(4) ein und startet die Verbindung über den Connect-Button (4). Im Fall von Mosquitto
und lokaler Standardinstallation wird weder ein Benutzername noch ein Passwort benötigt.
1883 ist der Standardport eines unverschlüsselten Brokers.
![]() |
Nach spätestens 7 Minuten sollten die ersten Werte im JSON-Format in den
Broker purzeln.
Der Topic, über den die Daten gepublished werden, setzt
sich aus "MobileAlerts" (Wurzel-Topic (5)), "Sensor-ID" (1. Unter-Topic) und "json"
(2. Unter-Topic) zusammen.
Selektiert man im linken Fenster ein JSON (6), so
kann man dessen kompletten Topic-Pfad über den [Topic]-Button (7) in die
Zwischenablage kopieren.
Das JSON enthält neben den eigentlichen
Sensorwerten, z. B. Temperatur und Luftfeuchte, auch einen Zeitstempel und den
Batteriestatus.
![]() |
Mehr zum Thema MQTT gibt es
hier und
hier.
Die Daten können nun mit
Node-RED oder Home Assistant weiter verarbeitet werden.
Je nachdem, wie man die Werte später weiterverarbeiten möchte, macht es
durchaus Sinn, die Daten mit einem "retain"-Attribut zu senden. Dadurch
werden die zuletzt empfangenen Werte vom Broker gemerkt und, sobald sich ein
Client mit entsprechendem Topic anmeldet, werden diese direkt
bereitgestellt. Ansonsten müsste der Client so lange warten, bis die nächste
Aktualisierung läuft, was hier in diesem Fall bis zu ca. 7 Minuten dauern
kann. Das Originalskript unterstützt diese Methode leider nicht, weshalb ich
hier eine modifizierte Version von mobilealerts.js bereitstelle.
mobilealerts.js (4 KB)
Anstatt die Datei auf den Pi zu kopieren,
kann man diese auch per Copy & Paste auf den Pi schieben. Dazu zuerst die
originale mobilealerts.js umbenennen, dann mittels nano neu anlegen und
speichern:
Jetzt die hier heruntergeladene mobilealerts.js öffnen, den kompletten
Inhalt kopieren und per Rechtsklick in nano einfügen, dann [Strg] +
[o] und [Strg] + [x] zum Speichern und Schließen.
Im nächsten Schritt muss die config.json angepasst werden. Bei
publish_type "default" durch "retain"
ersetzen. Dies kann ebenfalls im nano erledigt werden. Die config.json sieht
dann wie folgt aus:
{
"localIPv4Address": "DeineRasberryPi-IP",
"mqtt": "mqtt://DeineRasberryPi-IP:1883",
"mqtt_home": "MobileAlerts/",
"mqtt_username": "",
"mqtt_password": "",
"publish_type": "retain",
"sonoffPublish_prefix": null,
"logfile": "./MobileAlerts.log",
"logGatewayInfo": true,
"proxyServerPort": 8095,
"mobileAlertsCloudForward": true,
"serverPost": null,
"serverPostUser": null,
"serverPostPassword": null,
"locale": "de-DE"
}
Zum Abschluss muss der Server
neu gestartet werden. Wurde der Server per systemd-Service bereits
gestartet, so kann er wie folgt neu gestartet werden:
![]()