Dauer in dem Tasmota in einem "Status" war per MQTT an Node-Red übergeben

  • Hallo zusammen,

    ich suche verzweifelt nach einer Möglichkeit, dass Tasmota mir über MQTT mitteilt, wie lange ein GPIO (Hier: Gosund-Steckdose) in den letzten 24h bspw. auf dem Status "On" steht.

    Hintergrund:

    Ich habe in Node-Red eine PV-Überschusssteuerung für einen Heizverbraucher (ca. 300W) implementiert.

    Dazu lese ich am Zentralzähler (ebenfalls Tasmota per MQTT) aus, ob aktuell min. 500W eingespeist werden. Ist das der Fall, wird die Gosund angeschaltet.

    Steigt der EVU-Bezug über 200W wird der Verbraucher wieder ausgeschaltet. Eine klassische Hysterese also.

    Das klappt auch super. Allerdings gibt es Tage, an denen die Sonne zu wenig scheint, und der Verbraucher somit nie angeschaltet wird.

    Idee ist nun folgende:

    - Ist der Verbraucher kürzer als nn Minuten in den letzten 24h eingeschaltet gewesen, dann übersteuere (per Node-Red) die Hysterese und schalt das Ding ein.

    - Ausschalten, sobald schwellwert (der Laufzeit) überschritten.

    Klar könnte man das auch komplett in Node-Red lösen, in dem man einen Timer mitlaufen lässt und da dann die Logik draufsetzt.

    Ich hätte es aber halt lieber, wenn Tasmota mir über mqtt mitteilt, wie lange das Teil in den letzten 24h "an" war.

    Habt Ihr eine Idee, wie man das ggf. mit dem Scripting lösen kann?

    Beste Grüße

    iNT2k

  • Moin.

    Naja .... wenn dir das in Sekunden reicht, könnte man die Einschaltzeit in ne Variable (var1) zählen lassen. Die wird dann ja per MQTT übertragen.

    Delay ist allerdings nicht besonders exakt. Wenn das nicht genau genug ist kann man es mit Ruletimer versuchen.

    In den Zeitprogrammen einen Timer auf 00:00 Uhr und auf "Regel" konfigurieren der täglich um 00:00H die Variable zurücksetzt.

    Mit Delay:

    rule1 on clock#timer=1 do var1 0 endon on power1#state do backlog rule2 %value%; var1 %var1% endon

    rule2 on var1#state do backlog delay 10; add1 1 endon

    Mit Ruletimer

    rule1 on clock#timer=1 do var1 0 endon on power1#state do backlog rule2 %value%; ruletimer1 1 endon

    rule2 on rules#timer=1 do backlog add1 1; ruletimer1 1 endon

    Edit:

    Geht natürlich auch in Minuten indem man den Delay auf 600 oder den Ruletimer auf 60 setzt.

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

    3 Mal editiert, zuletzt von HoerMirAuf (14. Oktober 2021 um 07:11)

  • [...]

    In den Zeitprogrammen einen Timer auf 00:00 Uhr und auf "Regel" konfigurieren der täglich um 00:00H die Variable zurücksetzt.

    [...]

    Schaut auf den ersten Blick gut aus. Er zählt brav hoch, sofern die Gsound "ON" ist.

    Zum Verständniss: Der Timer in den "Zeitprogrammen" setzt die Var wie genau zurück? Geschieht das über das

    Code
     ... clock#timer=1 do var1 0... 

    ?

    Und noch eine kleinigkeit: Er published das als "stat/gosund/RESULT" - konkret in einem JSON, was da auf den MQTT gelegt wird. Problem an der Sache: Der Wert sollte ein Integer oder Float sein, kommt aber als String.

    Also statt {"Add1":500} kommt ein {"Add1":"500"}

    Kann man das ändern? Und gibts die Möglichkeit die Variable anders zu benennen?

    Einmal editiert, zuletzt von int2k (13. Oktober 2021 um 17:18) aus folgendem Grund: Edit: JSON-String vs. value ergänzt

  • Moin.

    Zum Verständniss: Der Timer in den "Zeitprogrammen" setzt die Var wie genau zurück?

    Ja, genau. Das passiert über den Clocktimer, der die var1 mit 0 beschreibt. Die sollte eigentlich auch im Json übertragen werden add1 zeigt dann eigentlich nur den Wert zu dem addiert wurde, was natürlich var1 entspricht. Wenn im Zeitplan ein Timer mit Aktion auf "Regel" steht wird zur eingestellten Zeit ein event clock#timer<x> ausgeführt. In der Rule1 wird dieser Trigger ausgewertet um den Zähler (var1) zu reseten.

    Kann man das ändern? Und gibts die Möglichkeit die Variable anders zu benennen?

    Die Variablennamen kannst du nicht ändern aber du kannst ein eigenes MQTT Publish nach Deinen Wünschen senden. Da kann man dann spielen, will man das mit jeder Teleperiod (default 300 Sekunden, kann man aber auch bis auf 10 runterschrauben) oder bei jeder Wertänderung (MQTT Datenlast??)

    Beispiel:

    Delay:

    rule2 on var1#state do backlog delay 10; add1 1; publish stat/<topic>/RESULT {"Laufzeit":%value%} endon

    Ruletimer

    rule2 on rules#timer=1 do backlog add1 1; ruletimer1 1 endon on var1#state do publish stat/<topic>/RESULT {"Laufzeit":%value%} endon

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

  • Hallo zusammen,

    ich hänge mich mal hier ein.

    Ich würde gerne das selbe für einen Sonoff 4ch haben.

    Also z.B. für Kanal 1 die Dauer die er auf "on" gestanden ist in Sekunden. Das ganze dann um 0 Uhr zurücksetzen lassen.

    Der Wert soll dann pro Kanal an NodeRed per MQTT überliefert werden.

    Wie mache ich das am einfachsten?

    Oder geht das evtl. besser direkt in NodeRed?

  • Hi.

    Da kannst fast 1:1 die Rule Vorschlage von hier übernehmen:

    HoerMirAuf
    13. Oktober 2021 um 09:17

    Wenn nur zum Rücksetzungszeitpunkt der Wert übermittelt werden soll muss das halt dann beim clock#timer mit rein:

    Code
    rule1
    on clock#timer=1 do backlog publish stat/<topic>/RESULT {"Laufzeit":%var1%}; var1 0 endon
    on power1#state do backlog rule2 %value%; ruletimer1 1 endon
    Code
    rule2
    on rules#timer=1 do backlog add1 1; ruletimer1 1 endon

    rule1 1

    Bei mehreren Kanälen wird komplizierter, weil man ja ein logisches UND braucht zum zählen:

    Power<x>=1 UND Rule#timer=<x>

    Entweder macht man das mit den conditional Rules die extra einkompiliert werden oder man trickst mit variablen ob's geht und da nicht die Rule-Laufzeiten einen Strich durch die Rechnung machen muss getestet werden ( hab ich jetzt nicht weil kein 4CH vorhanden):

    Code
    rule1
    on clock#timer=1 do backlog publish stat/<topic>/RESULT {"Laufzeit1":%var1%, "Laufzeit2":%var3%, "Laufzeit3":%var5%, "Laufzeit4":%var7%}; var1 0; var3 0; var5 0; var7 0 endon

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

    4 Mal editiert, zuletzt von HoerMirAuf (6. Mai 2022 um 10:22)