TH10 + MQTT + Rasp - wie einrichten?

  • ich betreibe einen Pi mit dem ich mehrere DS18B20 einlese und dokumentiere (in csv-Liste abspeichere).

    Nun suche ich nach einer Möglichkeit, auch die Daten des TH10 dort mit aufzunehmen. ... und wollte in diesem Zusammenhang MQTT verstehen lernen.

    Leider bin ich offensichtlich zu blöd um die vielen Beschreibungen im Web bzgl. MQTT zu verstehen und finde auch kein Beispiel, wie ich die Messwerte (Temperatur + Luftfeuchte) per WLAN in die Python-Routine auf dem Pi zum Abspeichern der Messdaten bekomme.

    Kann mir jemand eine für mich Newbe nachvollziehbare Anleitung nennen, wie ich das hinbekomme:

    - auf dem Pi habe ich mosquitto, mosquitto-clients und für Python paho installiert.

    (mit dem BeispielProgramm empfängt der Pi auch die TEST-Sendung)

    - der TH10 hat ein aktuelles Tasmota .... (Rule1 +2 sind mit Steueraufgaben belegt)

    in der MQTT- Seite habe ich als "host" die IP des Pi eingetragen und als Topic: "P42-WZ-TH10.001" ... alles Andere erst einmal unverändert gelassen...

    Frage1: muß ich dem TH10 sagen, dass/wie er Messwerte(Temperatur + Feuchte) senden soll - und wenn ja wie?

    Frage2 : WIE bringe ich den Pi dazu sich die Daten vom TH10 zu holen oder die von TH10 gesendeten Daten zu lesen ...

    Wie gesagt - DAS sind meine ersten Kontakte zu MQTT ... habe aber noch einige Ideen, was ich damit noch alles tun würde ....

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

  • Ähem, du kennst meinen Wiki-Eintrag MQTT - Eine Einführung, was hoffentlich dazu führt, die Funktionsweise von MQTT zu verstehen.

    Frage1: muß ich dem TH10 sagen, dass/wie er Messwerte(Temperatur + Feuchte) senden soll - und wenn ja wie?

    Standardmäßig plaudert der TH10 alle fünf Minuten seine Sensordaten aus. Mit dem Konsolenbefehl teleperiod kannst du das aber häufiger oder langsamer einstellen. teleperiod 10 bewirkt, dass die Sensordaten alle 10 Sekunden publiziert werden. Das entsprechende Topic, das du abonnieren (= subscribe) musst lautet (je nach Konfiguration) tele/MQTTName/SENSOR oder MQTTName/tele/SENSOR und sieht dann (bei mir) so aus:

    Code
    TH10/tele/SENSOR = {"Time":"2019-11-04T15:02:37","AM2301":{"Temperature":11.6,"Humidity":99.9},"TempUnit":"C"}

    Ich vermute, bei dir ist das Toppic eher tele/TH10/Sensor. Da musst du meine Beispiele entsprechend für dich umstellen.

    Die Payload, also die Botschaft, die Werte, des Topic sind also {"Time":"2019-11-04T15:02:37","AM2301":{"Temperature":11.6,"Humidity":99.9},"TempUnit":"C"}. Die Struktur dieses Ausdrucks zeigt, dass es sich um ein JSON-Statement handelt. JSON-Ausdrücke haben eine klare Struktur. Im Wesentlichen ist es "Thema" : "Inhalt", wobei "Inhalt" kann wiederum eine Struktur der Art "Thema" : "Inhalt" sein kann, also tief gestaffelte Ausdrücke.

    Mehr dazu in meinem Beitrag zur Auswertung von JSON-Ausdrücken mit dem Terminalprogramm jq. Ich denke es hilft zu verstehen, wie man in einem JSON-Ausdruck an genau den Wert kommt, den man braucht.

    Frage2 : WIE bringe ich den Pi dazu sich die Daten vom TH10 zu holen oder die von TH10 gesendeten Daten zu lesen

    Naja, das geht auf verschiedenen Wegen:

    Im Terminal mit mosquitto_sub das entsprechende Topic abonnieren:

    mosquitto_sub [-h IP des Brokers] -t TH10/stat/STATUS8

    In einem zweiten Terminal mit mosquitto_pub den status 8 abfragen, z. B. so:

    Code
    mosquitto_pub [-h IP des Brokers] -t TH10/cmnd/STATUS -m 8

    Im Terminalfenster, in dem du mosquitto_sub laufen hast, steht dann so was wie

    {"StatusSNS":{"Time":"2019-11-04T17:35:36","AM2301":{"Temperature":11.6,"Humidity":99.9},"TempUnit":"C"}}.

    Nun würde im Terminal die Stunde von jq schlagen. Denn wenn du z. B. nur den Temperaturwert haben willst, sieht der mosquitto_sub Ausdruck so aus:

    mosquitto_sub [-h IP des Brokers] -t TH10/stat/STATUS8 | jq StatusSNS.AM2301.Temperature

    Das oben beschriebene kannst du in ein Bash-Skript verpacken, ausführbar machen und die Werte z. B. in eine Datei schreiben.

    Für Python bist du mit paho-mqtt auf der richtigen Spur. Was du auch brauchst, ist die Standardbibliothek json, damit du die Ausdrücke auswerten kannst. Die Bibliothek json schreibt mit der Methode json.loads() ein JSON-Statement in ein Python-Dictionary.

    Hilfreiche Webseiten für die Abfrage mit Python:

    https://www.linux-magazin.de/ausgaben/2018/08/eclipse-iot-2/ (ab der 3. Seite gehen die Skripte los)

    http://www.steves-internet-guide.com/into-mqtt-python-client/ (alles in englisch)

    https://www.dinotools.de/2015/04/12/mqtt-mit-python-nutzen/

    Mein Tip: Fange mit mosquitto_sub in Verbindung mit jq und mosquitto_pub in zwei Terminal-Fenstern an, damit du ein "Gefühl" für MQTT und JSON bekommst, später dann die Umsetzung in Python, was die bessere Lösung ist.

    EDIT: Dies habe ich beim zweiten Lesen erst gesehen:

    ich betreibe einen Pi mit dem ich mehrere DS18B20 einlese und dokumentiere (in csv-Liste abspeichere).

    Wie wertest du den die Daten des DS18B20 aus. Hängt der direkt an den GPIOS des Pi?

  • Hallo JoergZ,

    vielen Dank für deine Ausführungen - irgenwie habe ich das Gefühl, den Wald vor lauter Bäumen nicht mehr zu finden ......

    Das Einlesen der DS18B20 habe ich von (hier) und die "Beispiel.py" von (hier) und für meine Bedürfnisse angepasst ... und übertrage derzeit nur die Temperaturwerte in eine Art "csv-Datei" (die Werte zeilenweise, durch ";" getrennt)

    Die DS18B20 werden über GPIO-Pin 4 (ist glaube ich intern GPIO7) . Momentan sind es 5 Stk, die ich in einer Tasse voll Wasser hängen und alle 30 Sec. ausgelesen werde - damit ich die Schwankungen und den Offset der einzelnen Sensoren herausfinden kann.

    An dem TH10 hängt ein "AM2301" - dessen Werte zukünftig auch in die PseudeCsvDatei eingebunden werden sollen.

    Die grundsätzliche Funktion von MQTT hatte ich schon verstanden ... aber wie ich das in der Hardware ausführen soll nicht. Dabei scheitere ich schon an den Grundbegriffen:

    in der Sonoff-MQTT-Maske soll ich den "Host" eintragen ... in den div. Seiten wird dann aber von "Server" / "Client" gesprochen oder von "Broker"

    was ist nun was? ... was der Sonoff und was der Pi? Ich bin davon ausgegangen, dass hier die IP des Pi einzutragen ist ...

    In der Maske des Sonof habe ich als Topic "P42-WZ-TH10.001" (für mich eineindeutige Bezeichnung der Messstelle) eingetragen - das weicht aber sehr von deinem Topic-Vorschlag ab - hab ich da Unsinn gemacht? Mit JSON habe ich bisher noch nichts gemacht - lässt sich aber lernen ...

    Vielleicht lese ich mir noch einmal in Ruhe die von dir empfohlenen Links durch ... und melde mich danach wieder ......


    der Sinn/ Hintergrund - zur Erklärung:
    ich habe in (m)einer Wohnung eine bisher kühle Wand. Auf der Außenseite habe ich eine Box angebracht, die mit einem Dämmstoff gefüllt ist.
    Mit den Messungen habe ich nun das Ziel a) zu prüfen, ob/wie sich das Isolationsverhalten auswirkt und b) wie sich die Luftfeuchte in unmittelbarer Wandnähe dadurch verändert - und deshalb über einen längeren Zeitraum diverse TemperaturWerte mitschreiben. Da ich schon länger mit meinem Pi ein Projekt durchführen wollte habe ich die Messdatenerfassung dort aufgebaut. Den "AM2301" kann ich aber nicht direkt an den Pi hängen, weil ich mit dem TH10 (schon länger - bisher über eWlink - jetzt per Tasmota und Rules) eine 230V-Wärmequelle abhängig von der vorliegenden Wandschichtfeuchte ansteuere um in diesem kritischen Bereich eine Schimmelbildung zu verhindern - das funktioniert bisher auch ganz gut.

    Nun möchte ich bei der Wärmedämmung testen, ob (wie sehr) sich damit der Heizbedarf reduzieren lässt.

    Und - weil es sich um ein Pi-SpaßProjekt handelt - würde ich dabei auch gerne MQTT verstehen und anwenden lernen ...

    denn ich hätte da noch mehrere AnwendungsIdeen ....

    und DANKE, dass ich hier Hilfe finden kann ...

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

  • also... ich habe jetzt folgendes eingerichtet/installiert:

    auf meinem Laptop (Ubuntu 18.04, IP 192.168.178.31) mosquitto, und mosquitto-clients installiert

    TH10 (IP: 192.168.178.23) ... "configure MQTT":

    Host: 192.168.178.31 / Port: 1883 / Client: "DVES_%06X" (unverändert) /

    User: Stefan / Password: TEST / Topic: TH10 / Full Topic: %prefix%/%topic%/ (unverändert)

    dazu habe ich folgende Fragen:

    dein Musterbefehl würde dann bei mir so aussehen: (?)

    "mosquitto_sub [-u Stefan -P TEST] -h 192.168.178.23 -v -t tele/#"

    Leider bekomme ich aber die Fehlermeldung: "Error: Unknown option '[-u' "

    Wenn ich die Eckigen Klammen weglasse: "Error: Connection refused"

    hmmm .... ? ...

    im TH10/Console steht:

    verstehe ich nicht .....


    Jetzt habe ich als IP meine eigene (Laptop-)IP eingegeben, also: mosquitto_sub -u Stefan -P TEST -h 192.168.178.31 -v -t '#'

    und JETZT sehe ich etwas: ..... Jippie!!!

    ...und jetzt herausfinden, wie ich die Verbindung vom Rasp per Python schaffe .... Morgen ist auch noch ein Tag :)

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

    2 Mal editiert, zuletzt von stepfl (4. November 2019 um 22:40)

  • Zitat

    Hilfreiche Webseiten für die Abfrage mit Python:

    https://www.linux-magazin.de/ausgaben/2018/08/eclipse-iot-2/ (ab der 3. Seite gehen die Skripte los)

    danke - das hat mit vieles klarer gemacht - auch meinen Denkfehler bzgl. der IP-Adresse im "mosquitto_sub...."-Befehl

    Nun zu meinen Fragen:

    Stimmt das , dass die Zeitangabe in der Rückmeldung NICHT der "MessungZeitpunkt" sondern der "ÜbertragungZeitpunkt" des Sensors an den MQTT-Broker steht? Mir ist klar, dass es sich hier um kleine Zeitunterschiede geht, aber - wenn es mal eine große Anzahl Sensoren gibt und ein sich schneller verändernden Verlauf verfolgt werden soll : kann man (hier im Sonoff-TH10) deren MessZeitpunkt synchronisieren?

    Also: alle Sensoren bekommen eine Wunschzeit (bzw. eine Art MessStart-Impuls) und ... nach der Zeitgleichen Messung senden diese ihre Daten (mit Angabe des Messzeitpunkts) an den Broker bzw. den Anfragenden Prozess...

    - Die selbe Frage gilt auch für die DS18B20 (ohne dass ich bisher schon gesucht hätte):
    Der DS18B20 hat ja eine "Pause" zwischen den Wandlungen von ca. 0,8 Sekunden. Weis jemand, ob der DS18B20 die Möglichkeit hat, seine AD-Wandlung mit einer Art Startsignal zu synchronisieren?

    SUPER, dass es euch hier gibt ... das hilft mir SEHR, mich zu orientieren und mich im Urwald der WebInformationen zurecht zu finden ...

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

    Einmal editiert, zuletzt von stepfl (5. November 2019 um 07:58)

  • Toll, wie du dich da rein kniest. Das wird was, da bin ich sicher!

    mosquitto_sub [-u Stefan -P TEST] -h 192.168.178.23 -v -t tele/#

    Die eckigen Klammern müssen weg, die sollten nur anzeigen, dass die Arbeit mit user/password optional ist. Ich würde das erst einrichten, wenn im Grundsatz alles läuft und verstanden ist.

    Zu ein paar Begriffen und zur "Architektur" der kleinen Hausautomation

    "Broker" und "MQTT-Server" meint dasselbe. Beides kann aber auch Hardware (ein Gerät) bedeuten bzw. Software (ein Dienst), die auf einem Gerät laufen. Dieses Gerät sollte, z. B. als MQTT-Server 24 Stunden an 7 Tagen (24/7) laufen.

    "(MQTT-)Clients" sind Geräte oder Software, die sich mit einem MQTT-Broker (=MQTT-Server) verbinden und seine Dienste in Anspruch nehmen.

    "Host" wird meist so verwendet: Es ist der Rechner (= Hardware) der dich mit einem Netzwerk verbindet. Und das kann sowohl ein Client als auch ein Server sein. Wir lassen den Begriff Host jetzt mal vorläufig weg...

    Zur Architektur:

    Dein Pi sollte 24/7 laufen. Seine Funktion: Auf ihm läuft mosquitto (das ist der MQTT-Broker, also das MQTT-Server-Programm). Auf dem Pi sollte auch jede Auswertungssoftware laufen, die MQTT-Nachrichten auswertet.

    Dein TH10 und auch dein Ubuntu Laptop sind Clients. Auf dem Laptop arbeitest du mit den beiden Programmen mosquitto_sub und mosquitto_pub und nimmst Kontakt zu deinem MQTT-Broker auf. mosquitto_pub und mosquitto_sub sind Bestandteile des Pakets mosquitto-clients. Diese beiden Programme können prinzipiell auch auf dem Pi installiert sein und benutzt werden.

    Auf dem TH10 laufen im Prinzip auch die beiden Programme mosquitto_sub und mosquitto_pub. Das heißt die Geräte abonnieren Topics vom Broker (= sub) bzw. geben Nachrichten an den Broker (= pub).

    Beispielkonfiguration (bitte mit deinen konkreten IPs umsetzten):

    Dein Pi hat die IP 192.168.178.10

    Auf dem Pi läuft mosquitto am Standardport (1883), ist also unter der Adresse 192.168.178.10:1883 erreichbar (natürlich nur mit dem MQTT-Protokoll, nicht mit HTTP!). Nun ist der PI der Host für den Dienst oder den Service "MQTT-Broker" (Da haben wir den Host wieder)

    Dein Laptop hat die IP 192.168.178.31. Du kannst mit dem mosquitto_sub Kontakt zum Broker aufnehmen, indem du diesen Befehl benutzt:

    Code
    mosquitto_sub -h 192.168.178.10 -t '#'

    Erklärung:

    Weil mosquitto_sub NICHT auf demselben Rechner läuft wie mosquitto, muss ich die IP-Adresse des Brokers mit -h 192.168.178.10 angeben. Wenn du mit User und Passwort arbeitest, setzt du hinter die IP eben noch  -u username -P passwort, falls du ach tatsächlich mit User und Passwort arbeitest. Die Angabe -t leitet das Topic. Hier gibt es die Besonderheit, dass wenn du alle Nachrichten abonnieren willst die Wildcard für "alles" in Hochkommas gesetzt werden muss, also '#'. Hast du ein konkretes einzelnes Topic, gibt es keine Hochkommas. So abonnierst du z. B. die ALLE Status-Meldungen deines TH10:

    Code
    mosquitto_sub -h 192.168.178.10 -t stat/TH10/#

    Du siehst, diese Mal ohne Hochkomma.

    Aber ich vermute mal, das alles hast du schon selber rausbekommen, oder? Und dass die IP des TH10 für MQTT keine Rolle spielt, sondern nur der Gerätename (=topic bei Tasmota)

    Noch ein paar Tipps (hoffe ich)

    • Gib deinem TH10 einen schönen Klartextnamen. Entweder über die Tasmota-Konsole mit topic Deinname oder über die Weboberfläche ->Einstellungen -> MQTT -> Eingabefeld Topic. Natürlich keine deutschen Umlaute und keine Leerstelle verwenden.
    • Sorge dafür, dass die Uhren auf dem Pi und auf dem TH10 gleich gehen (dieselbe Zeitzone, derselbe NTP-Server). Wie genau muss es denn sein? Soll das eine Echtzeitanwendung werden? Vergiss es!
    • Frag die Sensordaten gezielt ab mit mit mosquitto_pub. Damit definierst du den Zeitpunkt. Denn das Topic der gezielten Abfrage lässt sich vom Topic der automatischen Meldung (meist alle 5 Minuten, weil teleperiod auf 300 steht) unterscheiden, sodass du nur die Werte der eigenen Abfrage benutzt. Die gezielte Abfrage kannst du in die Schleife der Python Skripte einbauen. Dazu gibt es aus paho-mqtt die schicke Methode paho.mqtt.publish(). Allerdings ist die Antwort ein JSON-Ausdruck. Also wirst du dich auch damit beschäftigen müssen. Wenn die Abfrage der DS-Sensoren und des TH10 im selben Skript laufen, dürfte der Zeitunterschied sich im irrelevanten Millisekundenbereich bewegen. Den Zeitstempel, den du verwendest holst du dir dann von der Uhr des PI und verwendest nur die Auflösung HH:MM:SS. Dann sind eine Werte immer in derselben Sekunde. Allerdings wenn der DS18B20 solange braucht, bis er Daten liefert, muss die Abfrage des TH10 nach Eintreffen der DS18B20-Werte erfolgen. Der TH10 liefert recht schnell.

    Ich hoffe meine Einlassungen helfen irgendwie weiter... Ich bin gespannt!

  • Hallo Jörg,

    WOW - das nenne ich Hilfe und Begleitung .... ich ziehe den Hut!


    Deine Tips sind super - haben geholfen ....

    die (fast) Zeitsynchrone Datenerfassung klappt! - und es taucht die nächste Frage auf: - dieses Mal nicht zu MQTT sondern zum Sonoff:

    Kann ich dem TH10 auch beibringen, dass er nur dann "sendet", wenn sich der Messwert um "xx" geändert hat?
    Natürlich kann ich das auch selbst zusammenbasteln - ich will aber gerade mein Augenmerk auf das DatenLoggin im Pi legen...

    Wäre also dankbar - damit ich mein Werkzeugkasten auch mit diesem Instrument füllen kann

    Hintergrund:
    Ich betreue (privat) eine Immobilie und die haben Probleme mit der Warmwasserversorgung. Um herauszufinden, wie sich das System zeitlich verhält will ich einen Pi mit diversen Sonoffs und DS18B20 installieren und die Messdaten protokollieren.

    - so will ich z.B. so herausfinden, ob die WW-Zirkulation richtig funktioniert oder ob einzelne (z.B. TempRegelVentile) nicht sauber funktionieren.

    - oder - ob die Zirk.Stränge alle die selber RücklaufTemp haben

    - oder ... oder .... oder .... (viele Stellen, die ein genaueres Hinsehen begrüßen würden)

    ALSO - VIELEN, vielen Dank

    Gruß, Stefan

    PS: ich genieße euren angenehm positiven, hilfreichen, wertschätzenden KommunikationsStil hier ... wirklich ein tolles Forum!!!

    ps2:

    für den Pi muß ich noch herausfinden, wie ich den Messzeitpunkt von "vielen" DS18B20 auf einen (fast) gleichen Zeitpunkt setzen kann.

    Im Moment scheint der Pi immer erst die Wandlung der ersten DS18B20 abzuwarten und erst danach den nächsten anzusprechen: Wandlungszeit warten- Messwert .... Also - bei 10 Sensoren ist der Messwert des letzten Sensors 10xWandlungszeit (:= ca. 10 sec.) nach der des ersten ....

    Ziel/Wunsch wäre:

    der Pi gibt ein StartSignal (an alle Sensoren) zum Wandeln - und holt sich dann die Werte (nach einander ) bei den Sensoren ab...

    Ob DAS mit den DS18B20 geht muß ich erst noch herausfinden .... also KEINE Echtzeitmessung aber eine mit synchronen Messzeiten

    ( ... das wird dann die nächste Ausbaustufe .... )

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

  • Freut mich, wenn ich helfe konnte!

    Kann ich dem TH10 auch beibringen, dass er nur dann "sendet", wenn sich der Messwert um "xx" geändert hat?

    Möglicherweise über Rules. Da bin ich aber nicht wirklich fit drin. Vielleicht wirft HoerMirAuf und/oder NoitaercX einen Blick auf diesen Feed und kann sich dazu äußern. Schau dir auch selbst mal die Hinweise zu Rules aus unserem Wiki an und auf den Tasmota-Seiten.

    Vom Verfahren her würden mir zwei Herangehensweisen einfallen:

    Schau dir mal bei den Rules die Abschnitte über Trigger und Vergleiche (comparison) an und ob du die Werte von Triggern in Variablen schreiben kann bzw. das Ergebnis eines Vergleichs auswerten kann.

    Der andere Weg würde eher über das Skript und MQTT gehen:

    Zuerst mit teleperiod 0 die automatische Sensormeldung abschalten

    über dein Skript alle x Minuten (oder Sekunden, Stunden) das Topic status mit dem Wert 11 ansprechen. Über Terminal so:

    mosquitto_pub -h 192.168.178.23 -t cmnd/TH10/status -m 11

    Die Antwort (JSON!) auswerten und entsprechende Aktionen auslösen.

    Der Vorteil des Skriptes ist, dass du mit if ... elseif .. elseif ... else Konstrukten arbeiten kannst, was dir eine flexible Reaktionsweise erlaubt. So flexibel sind die Rules nicht, wobei die Spezialisten wie HoerMirAuf und NoitaercX mit drei Rules solche Konstruktionen "nachbauen" können.

    ich genieße euren angenehm positiven, hilfreichen, wertschätzenden KommunikationsStil hier ... wirklich ein tolles Forum!!!

    Das soll auch so bleiben! Und Leuten wie du, denen man anmerkt, dass sie selbst möglichst viel verstehen und umsetzen wollen, helfen wir auch gern, damit sie später anderen helfen können ;).

  • im "Rules-Wiki" (ganz unten) habe ich den Befehl "publish" gefunden, der das gewünschte ausführen soll(te) ...

    .... irgendwie klappt es bei mir aber nicht so, wie ich es gerne hätte - und wie ich die Beschreibung dort vertehe: sinngemäß etw. angepasst sieht mein Befehl SO aus:

    on var3#state do Publish stat/TH10/Change {"From":"%Var3%","To":"%Var4%"} endon 

    der Befehl löst auch eine Übertragung an "stat/TH10/Change" aus!

    ich hatte erwartet, dass der ÜbertragungsString so aussieht:

    stat/TH10/Change {From:[Wert von Var3] to [Wert von Var4]} 

    ... es kommt aber stat/TH10/Change {"From":"%Var3%","To":"%Var4%"} ...WAS läuft hier falsch?

    Eigentlich würde ich gerne den Status des Relais und den Wert des Sensorwerts (steht in Var3)bekomme,

    etwa so: Pwr: 0, Hygr.: 0,78% sehen... Leider schaffe ich es nicht, den ÜbertragungsString passend zu gestalten

    Das mit dem ZeitTrigger für die MQTT-Übertragung denke ich mit dem Vergleich von "timestamp" und einem passenden Eintrag z.B. in Var5 zu lösen ...

    und noch eine Frage: Gibt es die Möglichkeit den Status einer Rule abzufragen - so etwas wie "on rule1#state = 0 do ..."?

    Danke und Gruß, Stefan

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

  • es kommt aber stat/TH10/Change {"From":"%Var3%","To":"%Var4%"} ...WAS läuft hier falsch?

    Versuch es mal so:

    Code
    rule1 on tele-DHT11#humidity do Var3 %value% endon on tele-DHT11#temperature do var4 %value% endon on tele-DHT11#temperature do publish stat/TH10/Change {"Luftfeuchtigkeit":"%var3%","Temperatur":"%var4%"} endon

    wobei

    DHT11 durch den Namen deines Sensors zu ersetzen ist und die Variable

    Var4 mit %var4% oder %var3% abzurufen ist. Man achte auf die Schreibweise!

    Wichtig ist in diesem Zusammenhang die "Systemvariable" %value%. In der steckt IMMER der Wert des gerade abgerufenen Ereignisses/Sensors/Zustand. Deshalb hole ich mir im Beispiel oben zweimal nacheinander die aktuellen Werte für Feuchtigkeit und Temperatur und weise sie meinen Variablen var4 und var3 zu. Es geht nur so, denke ich.

    Der Code oben wirkt sich aus, wenn eine Meldung des Topics tele(metrie) abgegeben wird. Die Häufigkeit beeinflusst du mit dem Tasmota-Konsolenbefehl teleperiod nn wobei nn Werte zwischen 0 (=aus) und 3600 annehmen kann (=1 Stunde).

  • Hallo Jörg, hallo an die vielen, anderen Helfer,

    und wieder ein VIELEN DANK!!!


    den von dir geschilderten Ablauf habe ich auch im Rules-Wiki (ganz unten) gefunden. Nachdem ich die "publish"-Zeile noch einmal eingetippt hatte ging es plötzlich .... leider kann ich nicht sagen, woran es lag.


    Die "Tele-AD3201#Humidity..." liefert kein Trigger .... ich vermute, da ich vorher "teleperiod 0" eingegeben hatte. Leider hab ich keine detaillierte Beschreibung dazu gefunden .....

    Da das Ganze auch ohne MQTT-Verbindung seine Funktion erfüllen sol - MQTT soll (momentan) nur der Datenprotokollierung dienen - ist es eine Mischung aus Rules und MQTT geworden.

    inzwischen schaut meine Lösung so aus:

    (ich schreib meine Rules in Excel - da habe ich eine bessere Übersicht - die Einzelzeilen werden anschließend zusammengeführt,

    wenn gewünscht kann ich auch die "echte" Ruels-Zeilen noch einstellen)

    Code
    rule1
    on Power1#Boot do backlog mem1 %mem1%; var4 0 endon
    on mem1#state do backlog backlog var1 %mem1%; sub1 %mem2%; var4 0 endon
    on mem2#state do mem1 %mem1% endon
    on AM2301#Humidity do var2 %value% endon
    on AM2301#temperature do var3 %value% endon
    on var2#state>%mem1% do power 1 endon
    on var2#state<%var1% do power 0 endon
    on Power1#State!=%var5% do backlog var5 %value%; var4 0 endon
    Code
    rule2
    on var4#state=0 do backlog
    Var4 1;
    publish stat/TH10/Change {“Time“:%timestamp%,“Hyg.MIN“:%var1%,
    “Hyg.MAX“:%mem1%,"Hygr(%)":%var2%,"Power":%var5%,“Temp.“:%var3%} endon

    dabei bedeuten:

    mem1: Schaltgrenzwert AN / mem2: Schalthystherese /var1: Schaltgrenzwert AUS / VAR2: Messwert Humidity / var3: Messwert Temperatur / Var4: Hilfsvariable um "publish" auszulösen / Var5: Schaltzustand d.Relais.

    Über die Lösung Var4 / Var5 bin ich nicht sonderlich glücklich - aber ich habe keine Lösung dafür gefunden den Status "Power" zu nutzen.

    Die MQTT-Protollierung läuft auf dem Laptop und auch auf dem Rasp ( im Terminal mit "mosquitto_sub -u Stefan -P TEST -h 192.168.178.46 -v -t stat/TH10/Change > ~/TH10-Protokoll.txt")

    Die PythonVersion wird bald folgen.

    Mein GANZ GROßER DANK gehört euch hier - ohne euch ich es nicht geschafft!

    Gruß Stefan

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

  • Erst einmal Gratulation, dass du eine Lösung gefunden hast! Ob das jeweils besonders elegant ist, darüber mag sich aufregen, wer Zeit dazu hat. Deine "Selbstkritik" zu var4/var5 kann ich gar nicht so recht nachvollziehen.

    Nachdem ich die "publish"-Zeile noch einmal eingetippt hatte ging es plötzlich .... leider kann ich nicht sagen, woran es lag

    Also da tippe ich mal auf das Thema Groß-/Kleinschreibung. Du kannst eine Variabel zwar mit dem Namen Var4 definieren, aber benutzen musst du %var4%, also immer mit kleinem v. Zumindest habe ich mir den Wolf programmiert, weil ich mit den Bezeichnungen aus deinem Post #10 gearbeitet habe und da steckt der Fehler drin, den ich selbst immer weiter reproduziert habe, bis ich auch beim Neuschreiben "irrtümlich" %var4% benutzt habe - und schwupps wurde der VariablenWERT statt des VariablenNAMENS im JSON angezeigt.

  • ... und es geht weiter ... mit den Fragen!

    was ist passiert:

    Sonoff TH10 funktioniert, auf dem Pi habe ich moaquitto und mosquitto_client und in Python paho installiert.

    die Abrufe im Terminal mit mosquitto_sub -u Stefan -P TEST -h 192.168.178.46 -v -t stat/TH10/Change funktioniert wie gewünscht

    aber ich bekomme pahon in Python nicht richtig zu laufen.

    Das "subscriber.py" habe ich von hier ... und mit meinen Zugangsdaten wie oben eingerichtet:

    Aufrufe mit "stat/TH10/#" oder "stat/TH10/POWER" funktionieren wunderbar -

    leider aber nicht der Aufruf "stat/TH10/Change" ... obwohl er im parallel laufenden Terminal die richtigen Ergebnisse ausgibt.

    Woran kann das liegen? gibt es noch (einen) Parameter, den ich vergessen/übersehen habe?

    LG StePfl

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

  • Ergänze mal in dem Python-Skript nach Zeile 11 die Zeile

    client.subscribe("stat/TH10/Change")

    Die Zeile muss genauso eingerückt wie die Zeile mit dem Topic stat/TH10. Nach einem Neustart des Skriptes sollten die Meldungen auf .../Change ebenfalls im Python-Skript ankommen.

  • Danke JoergZ, DAS hatte ich schon probiert:

    Code
    def on_connect(client, userdata, flags, rc):
        print("Connected with result code " + str(rc))
    
        client.subscribe("stat/TH10/Change")
        client.subscribe("stat/TH10/POWER")
    #    client.subscribe("stat/TH10/RESULT")
    #    client.subscribe("stat/TH10/#")


    Alle anderen Topic funktionieren in der PyRoutine - nur "stat/TH10/Change" nicht .... übrigens auch mit "stat/TH10/#" nicht ...

    aber im parallel laufenden Terminal kommt alles wie gewünscht an:

    Code
    stefan@SteLT05:~$ mosquitto_sub -u Stefan -P TEST -h 192.168.178.46 -v -t stat/TH10/Change
    stat/TH10/Change {“Time“:2019-11-15T16:53:12,“Hyg.MIN“:84.800,“Hyg.MAX“:85,"Hygr(%)":85.2,"Power":0,“Temp.“:16.2}
    ....

    Ich habe auch probiert, ob da MQTT-Protokoll in 2 gleichzeitig laufenden Terminals funktioniert - nicht dass der eine Abruf den Anderen blockiert - ...

    ABER - es wunderbar (parallel) geschrieben .

    Ich bin langsam mit meinem Latein am Ende

    Einzige Idee ist, dass es noch weitere Parameter (irgendwo) einzustellen gibt, von denen ich bisher keine Ahnung habe ...

    Gruß

    StePfl

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

    Einmal editiert, zuletzt von stepfl (15. November 2019 um 17:11)

  • ... und laut Sonoff-Console sendet der TH10 auch ganz brav seine MQT-Pakete:

    17:07:33 RUL: VAR4#STATE!=0 performs "backlog var4 0; publish stat/TH10/Change {“Time“:2019-11-15T17:07:33,“Hyg.MIN“:84.800,“Hyg.MAX“:85,"Hygr(%)":85.1,"Power":1,“Temp.“:16.4}"

    17:07:33 MQT: stat/TH10/RESULT = {"Var4":"0"}

    17:07:33 RUL: VAR4#STATE=0 performs ""

    17:07:33 MQT: stat/TH10/Change = {“Time“:2019-11-15T17:07:33,“Hyg.MIN“:84.800,“Hyg.MAX“:85,"Hygr(%)":85.1,"Power":1,“Temp.“:16.4}

    ......

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

  • .... jetzt habe ich erst einmal einen anderen Weg gewählt:

    - da die MQTT-Daten aus "stat/TH10/RESULT" auch alles enthalten - nur viel mehr Datentransfer bedeuten - nehme ich diese Daten und "bastle" mir daraus den Datensatz, den ich eigentlich per "stat/TH10/Change" vom TH10 bekommen würde ...

    es funktioniert, auch wenn es ein Wenig "durch die Brust ins Auge" ist ....

    Warum das "stat/TH10/Change" NICHT funktioniert ist mir ein Rätsel ... DAS hebe ich mir für die Stunden mit Langeweile auf :)


    Und wieder: vielen Dank für dein/Euer darüberschauen meiner "Bastellösungen" und der Hilfestellungen und Verbessungsvorschläge...

    Schönes Wochenende und Gruß

    Stefan

    Gruß

    Stefan

    Tasmota-Geräte: Basic, Th10, S20, SH14 (4fach Steckdosenleiste)

  • Warum das "stat/TH10/Change" NICHT funktioniert

    Hast du es schon mal mit /change oder /CHANGE probiert

    bzw. einem komplett anderen Wort.

    Vielleicht hängt es deshalb irgendwo (Topic case-sensitive).

    LG

  • Hast du es schon mal mit /change oder /CHANGE probiert

    Habe ich unter Ubuntu gecheckt. Selbst da verhält sich MQTT (oder paho-mqtt) case insensitiv. War ich auch überrascht. Habe auch mal Change mit /# und ohne subskribiert. Machte auch nichts. Hat alles angezeigt.

    stepfl

    Ich kann das Verhalten wirklich nicht reproduzieren. Wie schreibst du Python den Python-Code? Mit einem Editor wie nano oder mit einer Entwicklungsumgebung wie idle?. Manchmal steckt der Teufel im Detail z. B. wenn die Einrückung alternativ mit 4 Leerzeichen oder mit einem Tab erzeugt wurde. Da reagiert Python manchmal etwas zickig

    Und in deinem (auskommentierten) Topic stat/TH10/# ist stat/TH10/Change doch mit enthalten?! Es müsste angezeigt werden... Aktiviere doch mal bitte diese Zeile wieder und schicke per mosquitto_pub noch ein paar Fantasie-Messages auf Fantasie-Topics wie -t stat/TH10/Test1 -m "Versuch" . Diese Meldungen müssten - bei aktiviertem stat/TH10/# angezeigt werden. Ds ist in MQTT konzeptionell so vorgesehen.