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.

    Online Compiler


    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

    mosquitto/bash/html/cgi auf RPI 2B+/Sprachsteuerung via IFTTT/4xGoogle-Home-Mini

    3 Mal editiert, zuletzt von HoerMirAuf ()

  • [...]


    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 () 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

    Online Compiler


    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

    mosquitto/bash/html/cgi auf RPI 2B+/Sprachsteuerung via IFTTT/4xGoogle-Home-Mini