PRTG und Tasmota

Auf dieser Seite zeige ich, wie Sie sehr einfach die Vielzahl an "Tasmota"-kompatiblen IoT-Devices sehr einfach mit PRTG koppeln können. Das kann zuhause die 100 Sensor "Free-Version" von PRTG sein. Sie können aber damit auch einfach Serverräume, Türschlösser, Energiebedarf u.a. überwachen.

Schnittstellen

PRTG unterstütze mehrere Möglichkeiten, Statusmeldungen und numerische Werte in das System zu bringen. Auf der Seite PRTG Plattform habe ich die Zusammenhänge zwischen Server, Probe und Agent geschrienen und PRTG kann über seine Probe selbst Werte von einem erreichbaren System über unterschiedlichste Wege (RPC, WMI SNMP HTTP etc.) abfragen aber auch Werte zugesendet bekommen.

Tasmota ist eine der vielen ESP8266/ESP32 3rd Party Firmware-Optionen, um Geräte mit Chips der ESP8266 oder ESP32-Reihe mit einer "offenen" Firmware zu versehen, die unterschiedlichste Sensoren auslesen und an weitere Systeme melden kann. Primär kommt hier MQTT oder mittlerweile auch eine REST-API zum Einsatz. Wenn Sie eine Kopplung zwischen PRTG und einer Tasmota-Instanz herstellen wollen, dann gib es folgende Optionen:

  • MQTT
    Tasmota kann seine Daten problemlos per MQTT an einen MQTT-Server senden.PRTG ist zwar selbst kein MQTT-Broker, so dass Sie selbst einen Browser zusätzlich betreiben müssen. PRTG kann dann aber problemlos Werte vom MQTT-Broker einlesen. Siehe PRTG und MQTT.
  • PRTG-Polling
    Tasmota ist selbst ein Webeserver und hat auch eine HTTP/REST-API, die sie von PRTG auch regelmäßig abfragen können. Allerdings muss dann das IoT-Device permanent "eingebucht" und zumindest von der PRTG-Probe erreichbar sein. Für Batteriebetrieb eignet sich diese Option natürlich nicht. Es skaliert auch nicht so gut, weil PRTG dann immer wieder pollen muss und die IoT-Devices per IP auch erreichbar sein müssen. Ich schotte aber meine IoT-Devices z.B. durch ein eigenes WLAN mit eigenen Subnetz ab und einige Installationen nutzen noch NAT, so dass PRTG das Device gar nicht erreichen kann.
  • Tasmota Rules und WebSend
    PRTG kann aber auch von einem Gerät per HTTP angesprochen werden. Mit den PRTG - HTTP Push-Sensoren kann ich in PRTG einen Sensor einrichten, der Daten von eine Device per HTTP erhalten knan. In Tasmota gibt es die Möglichkeit, über hinterlegte Regeln bei gewissen Eingangszuständen eine Aktion auszulösen und per "WebSend" kann ich so einen Wert direkt zum PRTG-Server senden lassen.
  • Eigenbau
    Ich habe Anfangs überlegt, die Daten mit einer eigenen Firmware einzusammeln und dann eine PRTG-kompatible JSON-Struktur per HTTP an meinen PRTG-Server zu senden. Das wäre zumindest eine Option für bestehende Projekte, die die Daten heute schon anderweitig senden. Aber nicht jeder möchte so tief an der Hardware programmieren.

Tasmota unterstützt leider keine SNMP-Anfragen oder Traps und KNX (https://tasmota.GitHub.io/docs/KNX/) über UDP/TCP-Multicasts an Port 3671 versteht aktuell leider PRTG noch nicht. Aber gerade die "WebSend"-Funktion kann in Verbindung mit den Tasmota-Regeln sehr leistungsfähig sein.

Tasmota mit HTTPPush

Ich habe zuerst einmal den ESP8266/ESP32 mit Tasmota versorgt und ganz klassisch nach Anleitung konfiguriert.

Tätigkeiten erledigt

ESP8266 besorgen

Die gibt es sogar schon in Deutschland für 3-8 € pro Stück und ESP8266 aus China sogar schon unter 2€. Oder sie kaufen eines der fertigen Systeme, die sie mit Tasmota versorgen können.

Sensoren anschließen

Wenn ich Werte an PRTG melden will, dann muss ich natürlich auch Wert erheben. Der eingebaute Temperatursensor im ESP32 wäre nur ein Beispiel und die WLAN-Empfangsstärke zu messen ist auch nicht repräsentativ. Also sie Sie sich einen Sensor aus.

Ich habe zum Test einfach einen SR04-Ultraschallsensor angeschlossen, mit dem ich die Belegung im Carport messe.

Tasmota installieren

Sie finden im Baumarkt sogar Geräte mit einem ESP8266 aber fremden "China"-Firmware. Meist basieren Sie afu der Tuya-Plattform und können vielleicht mit Tuyaconvert ohne elektrische Kenntnisse umprogrammiert werden. Ansonsten haben einige innen entsprechende Programmieranschlüsse. Schließen Sie das Board an den PC an und am einfachsten nutzen Sie den WebInstaller mit Chrome oder Edge.

Für die meisten Sensoren können Sie direkt "Tasmota Sensors" nutzen. Ich finde es schon interessant, dass ein Browser mittlerweile mit COM-Ports umgehen und Firmware flashen kann.

Tasmota konfigurieren

Mittlerweile bietet der WebInstaller am Ende direkt die Einrichtung von WLAN an, so dass sie das System einfach integrieren können. Ansonsten startet Tasmota einen eigenen WLAN-AP mit kleinem Webserver, über den Sie die Einrichtung vornehmen können.

Ich nutze dazu lieber die im WebInstaller enthaltene Console um schnell folgende Befehle abzusetzen: Sie setzen die WLAN-Konfiguration und optional einen MQTT-Host und einen SyslogHost. Passen Sie die Werte ihrer Umgebung an.

Backlog SSID1 wlanssid; Password1 wlankennwort
MqttHost 192.168.178.10
Backlog Loghost 192.168.178.10; LogPort 514; Syslog 2

In der Konsole sehe ich nach dem Neustart direkt, ob die WLAN-Verbindung geklappt hat und welche IP-Adresse der ESP8266 nutzt.

Ich gehe dann auf die WebUI und konfiguriere die Sensoren an den angeschlossenen Ports

Sensoren testen

Nach dem Neustart sollte Tasmota die Werte der konfigurierten Sensoren auf der Weboberfläche anzeigen. Kontrollieren Sie die Werte und die Bezeichnung. Sie können auch auf der Konsole die MQTT-Meldungen sehen. Mit dem Befehl  "Status 8" sehen Sie dir konfigurierten Sensoren und ihren Wert aber vor allem auch den Namen. Hier mal ein SR04 Ultraschall-Abstandssensor

Die JSON-Struktur kann ich auch aufklappen und bekomme:

{
   "StatusSNS":{
      "Time":"2022-01-07T23:37:11",
      "SR04":{"Distance":84.491}
   }
}

Interessant ist hier "SR4" und "Distance"

PRTG HTTPPush testen

Als nächsten Schritt sollten Sie in PRTG einen HTTP-Push-Sensor anlegen. Das habe ich auf PRTG - HTTP Push-Sensoren beschrieben und sollte kein Problem sein. Dann nutze ich die Tasmota-Commandline, um einmal Daten zu senden:

WebSend [192.168.178.91:5050] /<SensorID>?value=1.3

Beachten sie folgende Besonderheiten:

  • Host in []-Klammern
    Ich nutze hier mal die IP-Adresse, aber wenn Tasmota auch einen DNS-Server per DHCP oder statischer Konfiguration bekommen hat, können Sie auch einen Hostnamen nutzen
  • Leerzeichen zwischen Host und URL
    Das "Space" zwischen Hostname und der URL ist korrekt!
  • <SensorID> ersetzen
    Ersetzen Sie diesen String durch die ID, welche Sie in der PRTG-Konfiguration beim Push-Sensor eingetragen haben.
  • Beliebiger Wert
    Der Wert ist eigentlich egal. Ich nutze hier eine "Gleitkommazahl", wenn PRTG legt einen Pushsensor normal mit "Integer" an und sehe ich gleich, ob ich es richtig eingestellt habe.

Je nach Eingabe sehen Sie in der Konsole auch die Antwort. Wenn Sie einen nicht erreichbaren Host oder Port angeben, kommt ein Fehler. Bei einer falschen SensorID aber nicht.

Da die Verbindung beim ESP8266 aufgrund der eingeschränkten Leistung nur per HTTP möglich ist, kann ich mit Wireshark auf dem PRTG-Server den Request und die Antwort recht einfach finden:

Dieser Request war erfolgreich.

 

Tasmota Regeln

Nun brauche ich eine Regel, die die Daten immer wieder sendet. Tasmota unterstützt bis zu drei Regelsätze und da ich "Rule1" schon mit einer MQTT-Regel belegt habe, nutze ich einfach Regelsatz2:

Rule2
 ON SR04#Distance DO WebSend [192.168.178.91:5050] /418C0D9B-01B1-4393-B492-B84A43FC0547?value=%value% ENDON
Rule2 1

Ich sage Tasmota, dass es bei jedem Lesevorgang des Sensors SR04 den Wert von "Distance" per WebSend an die URL senden soll. Diese Aktion ist in der Konsole sichtbar.

Hier sollten Sie aber genau hinschauen, denn es kann sein, dass Tasmota den Sensor sehr oft liest und dann auch jedes Mal die Regel angetriggert wird. Wenn das der Fall ist, können Sie mit der Time-Trigger arbeiten. Passend zu den normalen Sensorintervallen von PRTG von 1 Minute oder 5 Minuten gibt es:

Time#Minute    startet jede Minute
Time#Minute|5  startet alle 5 Minuten

Entsprechend kann ich dann eine Regel bauen, die einmal pro Minute die Daten sendet:

Wenn Sie dies nicht machen, sendet Tasmota alle 4-5 Sekunden ein Datenupdate an PRTG, der all diese Daten auch in der Datenbank speichert:

Rule2
 ON SR04#Distance DO var1 %value% ENDON
 ON Time#Minute DO  WebSend [192.168.178.91:5050] /418C0D9B-01B1-4393-B492-B84A43FC0547?value=%var1% ENDON
Rule2 1

Da ich keinen Weg gefunden haben, einen beliebigen Wert zu referenzieren, lasse ich jede Änderung in "var1" ablegen und alle Minute triggert die zweite Zeile, die den Inhalt von Var1 dann an PRTG sendet. Insgesamt hat Tasmota 16 Variablen.

Nach einiger Zeit sehe ich in PRTG dann die Werte:

Wer mehrere Werte senden will, kann diese als Einzelwerte mit eigenen Regeln zu mehreren Push-Sensoren senden oder formatiert eine PRTG-tauglich JSON-Antwort. Über die in PRTG eingebauten Möglichkeiten können Sie dann ja Alarme erzeugen, Ausfälle melden etc.

Achtung:
Wenn Sie automatisiert auch Regeln ändern, dann reduziert das die Lebensdauer des Flash-Speichert, wenn Tasmota per Default jede Sekunde die Konfiguration sichert. Dann wäre ein höherer Wert mit Savedata einzustellen, z.B. Ich sollte aber einstellen, dass Tasmota nicht jedes mal die Daten im Flash-Speicher hinterlegt. (Default 1 Sekunde). Einmal die Stunde kann reichen.

SaveData 3600

Das war schon der ganze Prozess

Tasmota mit MQTT

Der zweite einfache Weg ist natürlich  der Einsatz eines vorhandenen MQTT-Broker, z.B. Mosquitto o.ä., an den das Tasmota-Gerät einfach den Status meldet. PRTG kann mittlerweile auch MQTT-Daten auslesen und in sein Monitoring übernehmen.

Tasmota HTTP-API (polling)

Tasmota kann so konfiguriert werden, dass Sie per HTTP auch Aktionen auslösen und Daten abfragen können. Insofern können Sie mit einem PRTG JSON-Sensor auch die Daten abrufen. Das geht native ohne größere Einstellungen aber hat meiner Ansicht nach folgende Einschränkungen:

  • IP-Erreichbarkeit
    Da PRTG die Verbindung zum IoT-Device aufbauen muss, muss es auch eine IP-Verbindung geben. Meine IoT-Geräte sind aber in der Regel nicht ungeschützt im gleichen IP-Subnetz, so dass ich mir Gedanken über Routing und Firewalls machen muss. Ich werde auch sicher nicht von einer PRTG-Instanz der Firma oder in der Cloud auf einen im Internet veröffentlichten Sensor zugreifen.
  • Statische IP-Adresse
    In Tasmota können statische IP-Adressen konfiguriert werden aber bequemer geht es mit DHCP. Wenn ein Sensor aber einige Tage "Offline" und die Leasedauer des DHCP-Pools kürzer ist, dann bekommt das Gerät vermutlich eine neue IP-Adresse. Auch nicht elegant
  • Always On
    Ein ESP8266/ESP32 ist per WLAN im Netzwerk und damit PRTG ihn abfragen kann, muss er dauernd laufen. Damit scheidet dieser Weg natürlich aus, wenn es um "Batteriebetrieb" geht.

Die Nutzung eines PRTG - HTTP Push-Sensoren hat hier deutlich mehr Vorteile.

Dennoch ist der Abruf per HTTP durchaus geeignet, wen Tasmota dauernd erreichbar ist und Sie z.B. über PRTG die Intervalle bestimmen wollen. Wenn sich z.B. der Status sehr oft ändert, dann würde dies bei MQTT oder HTTPPush zusätzliche überflüssige Last erzeugen.

Technisch ist es ein HTTP-Request mit den Befehlen, die Sie ansonsten über die Console versenden würden. über "STATUS0" bekomme ich dann alle Werte.

PS C:> Invoke-RestMethod "http://192.168.178.25/cm?cmnd=Status%200"

Das Leerzeichen im Kommando müssen Sie mit "%20" schreiben

Das sind natürlich viele Meldungen aber für Sensoren ist hier der StatusSNS interessant. In dem Beispiel ist das ein Stromzähler mit dem Namen "Z1", den ich dann über "Status 8" auslesen kann.

PS C:> Invoke-RestMethod "http://192.168.178.25/cm?cmnd=Status%208"

Sie können also ein Device mit der IP-Adresse des Tasmota-Systems anlegen und darunter dann einen "PRTG Manual: REST Custom v2 Sensor" anlegen. Allerdings müssen sie vorher eine Konfigurationsdatei im Verzeichnis "\Custom Sensors\rest\sml.template" des PRTG-Servers anlegen.

Wichtig: Die Parameter wie "Z1" im JSON müssen natürlich zur Definition des Zählers in Tasmota passen.

{
    "prtg": {
        "description": {
            "query": "/cm?cmnd=Status%208",
            "comment": "Template to parse Tasmota SML-Data"
        },
        "result": [
            {
                "channel": "Z1 TotalIn",
                "CustomUnit": "kWh",
                "value": "$.StatusSNS.Z1.Total_In",
                "float": "1",
                "DecimalMode":"2"
            },
            {
                "channel": "Z1 TotalOut",
                "CustomUnit": "kWh",
                "value": "$.StatusSNS.Z1.Total_Out",
                "float": "1",
                "DecimalMode":"2"
            }
        ]
    }
}

Erst dann können Sie im Sensor die REST-URL "/cm?cmnd=Status%208" eintragen.

Die Konfiguration des Custom REST Sensors mit der Template-Datei ist vielleicht etwas aufwändig aber aufgrund der umfangreichen Möglichkeiten in PRTG wohl erforderlich. PRTG muss neben der reinen Zahl schon noch wissen, ob dies ein INT/FLOAT ist, die Werte absolut/differenziell bewertet werden müssen und welche Einheit dahinter steht.

Das bedeutet aber natürlich auch, dass Sie mehrere Tasmota-Sensoren mit unterschiedlicher Konfiguration über eigene Templates konfigurieren müssen.

Daher habe ich erst einmal kein eigenes PowerShell-Script zur Einbindung in PRTG entwickelt, denn auch da müsste ich ja parametrisieren.

Abruf über die Statusseite

Wenn Sie einfach mit einem Browser auf die Webseite des Tasmota-Device gehen, dann sehen Sie auch die ermittelten Werte. Sie werden sogar regelmäßig aktualisiert.

Dabei wird nicht die ganze Webseite neu geladen, sondern per JavaScript wird ca. alle 2,5 Sekunden die URL "http://<ipadresse>/?m=1" abgerufen und enthält einen HTML-Ausschnitt.

{t}</table>{t}
   <tr>
      <td style='width:100%;text-align:center;font-weight:bold;font-size:62px'>ON</td>
   </tr>
   <tr>
   </tr>
</table>

Die Verarbeitung erfolgt dann im Code. (Zur Lesbarkeit umgebrochen)

 x = new XMLHttpRequest();
                x.onreadystatechange = ()=>{
                    if (x.readyState == 4 && x.status == 200) {
                        var s = x.responseText.replace(/{t}/g, "<table style='width:100%'>")
                                              .replace(/{s}/g, "<tr><th>")
                                              .replace(/{m}/g, "</th><td style='width:20px;white-space:nowrap'>")
                                              .replace(/{e}/g, "</td></tr>");
                        eb('l1').innerHTML = s;
                        clearTimeout(ft);
                        clearTimeout(lt);
                        lt = setTimeout(la, 2345);
                    }
                }
                ;
                x.open('GET', '.?m=1' + a, true);
                x.send();
                ft = setTimeout(la, 2e4);

Oben ist der Handler zum parsen der Rückgabe, wenn der GET mit ".?m=1" ausgelöst wurde. Theoretisch können Sie als auch diese "API" nutzen, um alle konfigurierten Dienste auszugeben und abzugreifen.

Der Weg verbietet sich aber, denn Änderungen an der Ausgabe würden ihren Code stören. Dann nutzen besser die offizielle WebAPI

Weitere Links