In Tasmota den Messwert vor dem MQTT-publish ändern...

  • Hallo,
    ein Wemos D1 mini, mit Tasmota DE 14.6.0 geflasht, soll einen Bodenfeuchtesensor auslesen.
    Ist es z.B. mit rules möglich, dass über mqtt ein Mittelwert aus mehreren Messungen gesendet wird, anstatt dass jeder Wert gesendet wird und ich im IOBroker den Mittelwert bilde?
    Könnte man diesen Wert dann noch in % umrechnen? Ich hab da was gefunden - SCALE1.
    Mein Topic ist: "Zitronenbaum/Bodenfeuchte/" in %.
    Vielen Dank schon mal!

    • Offizieller Beitrag

    Moin.

    Ist im Prinzip möglich, indem Du die Werte in einer Variablen addierst, einen counter mit hochzählst und dann bei Counterwert X den Variablenwert durch diesen teilst.

    Die Umrechnung in % geht auch ...

    Rechnen mit Tasmota Rules - CREATIONX - Smart Home Forum

  • ... indem Du die Werte in einer Variablen addierst, einen counter mit hochzählst und dann bei Counterwert X den Variablenwert durch diesen teilst.

    Rechnen mit Tasmota Rules

    Naja - das ist mir ja schon klar... Aber: Es soll ja erst über MQTT gesendet werden, wenn dieser Vorgang abgeschlossen ist.
    Normalerweise werden die Messwerte an den Server gesendet wenn 300ms vergangen sind (oder was da eingestellt ist).
    Ich muss demnach den Wert der Variablen in der MQTT-Nachricht verändern bevor diese abgeschickt wird. Richtig?
    Ich kann aber nicht direkt in die VVariablen der Messwerte neue Daten schreiben - oder? Ist mit nicht gelungen.
    Kann ich einen Trigger auf die Variable mit dem berechneten Mittelwert setzen? D.h. immer wenn die aktualisiert ist, dann senden?
    Ich danke schon mal für dein Hirnschmalz!!!

    • Offizieller Beitrag

    Hi.

    Wie schauen die Messwerte den im Log aus?

    Das der jeweilge Werte über MQTT gesendet wird stört ja nicht. Was wir brauchen ist ein zusätzlicher Wert der den Mittelwert übermittelt, im Bsp genannt M10 (Mittelwert von 10 Messungen)

    Mir stelle mir das dann als Rule so vor:

    Code
    on system init do backlog var1 0; var2 0; var3 0; endon
    on <MESSWERT> do backlog add1 %value%; var2 add 1 endon
    on var2#state>=10 do backlog scale3 %var1%,0,10,0,1; var1 0; var2 0 endon
    on var3#state do publish stat/<DEVICENAME>/M10 %value% endon

    Um das dann in Prozent umzurechnen bräuchte man noch den 100% Wert.

    scale<x> <MITTELWERTWERT>,0,<100%_WERT>,0,100

  • Ahh... vielen Dank!
    Im Log steht diese Zeile:
    09:15:21.274 MQT: Zitronenbaum/Bodenfeuchte/SENSOR = {"Time":"2025-04-25T09:15:21","ANALOG":{"A0":741}}
    Wie kann ich den Messwert anspprechen?
    Ich kann den nicht mit SENSOR#ANALOG#A0.%value% o.ä. auslesen.

    • Offizieller Beitrag

    Das geht so:

    on analog#a0>WERTX do IRGENDWAS endon

    bzw.

    on analog#a0 do IRGENDWAS endon

    Was es beim Analog schwierig machen wird ist das der Wert vermutlich viel zu oft ändert und schwankt.

    Da muss man evtl mit einer Wertematrix arbeiten. Um sich das zu verdeutlichen, kannst Du dir das hier mal ansehen:

    HoerMirAuf
    27. April 2022 um 09:46
  • Vielen Dank, ich glaube ich habe das meiste verstanden...
    Ich probiere es erstmal ohne Wertematrix.

    Die Regel sieht nun so aus:
    rule1
    on system init do backlog var1 0; var2 0; var3 0; endon
    on analog#a0 do do backlog add1 %value%; var2 add 1 endon
    on var2#state>=10 do backlog scale3 %var1%,0,10,0,1; var1 0; var2 0 endon
    on var3#state do publish stat/Zitronenbaum/Bodenfeuchte/M10 %value% endon

    Auf der Konsole kommt aber folgendes in schöner Wiederholung:
    11:51:10.443 RUL: ANALOG#A0 performs 'do backlog add1 738; var2 add 1'
    11:51:10.450 MQT: Zitronenbaum/Bodenfeuchte/RESULT = {"Command":"Unknown","Input":"DO backlog add1 738; var2 add 1"}
    Das steht dann auch im IOBroker unter RESULT. M10 wird nicht angelegt.
    Ich denke mal, ich hab da noch einen Fehler drin... - oder?

    • Offizieller Beitrag

    Hi

    du hast 2x "do" in deiner Rule:

    on analog#a0 do do backlog add1 %value%; var2 add 1 endon

    ich hab allerdings auch eine Schreibfehler in meinem Beispiel (var2 add1).

    Nimm das mal:

    Code
    rule1
    on system init do backlog var1 0; var2 0; var3 0; endon
    on analog#a0 do backlog add1 %value%; add2 1 endon
    on var2#state>=10 do backlog scale3 %var1%,0,10,0,1; var1 0; var2 0 endon
    on var3#state do publish stat/Zitronenbaum/Bodenfeuchte/M10 %value% endon

    Wie gesagt triggert die Rule recht viel ....

    Man kann das auch mit einer Hysterese einschränken:

    (In der var6 steht der Hysteresenwert +-5)

    Code
    rule1
    on system init do backlog var1 0; var2 0; var3 0; var4 0; var5 0; var6 5 endon
    on analog#a0>=%var4% do backlog add1 %value%; add2 1; var4 %value%; add4 %var6%; var5 %value%; sub5 %var6%  endon
    on analog#a0<=%var5% do backlog add1 %value%; add2 1; var4 %value%; add4 %var6%; var5 %value%; sub5 %var6%  endon
    on var2#state>=10 do backlog scale3 %var1%,0,10,0,1; var1 0; var2 0 endon
    on var3#state do publish stat/Zitronenbaum/Bodenfeuchte/M10 %value% endon
  • Sorry, leider muss man auch manchmal etwas anderes machen als Bodenfeuchte-Sensoren zu konfigurieren.... :(
    Ich habe im 1. Vorschlag das scale noch etwas angepasst:
    scale3 %var1%,0,1000,0,100; jetzt kommen die M10-Werte wieder dreistellig.
    Die Rule funktioniert sehr gut.
    Mit dem Hysteresis-Vorschlag komme ich nicht so klar. +-5 bedeutet doch, dass nur Werte einbezogen werden, die sich um +-5 vom vorherigen Wert unterscheiden. Wahrscheinlich muss var4 auch noch Null gesetzt werden, der wird immer weiter hochgezählt.
    Bis hierher vielen Dank für Deine Hilfe!!! Alleine hätte ich das nicht hinbekommen.

    • Offizieller Beitrag

    Moin

    Um Nachkommastellen usw. zu definieren, kann man auch CALCRES setzen. (Siehe Tasmota Commands)

    Mit dem Hysteresis-Vorschlag komme ich nicht so klar. +-5 bedeutet doch, dass nur Werte einbezogen werden, die sich um +-5 vom vorherigen Wert

    Ganz genau, damit wird nicht ganz so oft getriggert. Das hängt aber von der größe der Wertänderung und der Hysterese ab. Da muss man mit spielen. Ist die Hysterese zu groß wird zu wenig getriggert und ist sie zu niedrig, bringt sie nichts. Deshalb ist sie auch als Variable gesetzt [var6] umd das leichter anpassen zu können ohne die ganz Rule umzuschrieben.

    Wahrscheinlich muss var4 auch noch Null gesetzt werden, der wird immer weiter hochgezählt.

    Nach meinem Beispiel nicht. var 4 wird bei jedem triggern mit dem aktuellen triggerwert gefüttert [var4 %value%] und dann um den Hystereswert erhöht [add4 %var6%] ... dasselbe mit var5 nur das diese um den Triggerwert reduziert wird.

    Um mehr zu sagen müsste man jetzt den Konsolenoutput sehen....

  • Ich habe mal das Log von der Konsole kopiert.
    Erstens für Rule1 (Mittelwert). Das scheint in Ordnung zu sein.
    Hier die Rule, so wie sie jetzt eingegeben ist:

    Code
    rule1 on
    system init do backlog var1 0; var2 0; var3 0; endon 
    on analog#a0 do backlog add1 %value%; add2 1 endon on 
    var2#state>=10 do backlog scale3 %var1%,0,10,0,1; var1 0; var2 0 endon
    on var3#state do publish /Bodenfeuchte/Zitronenbaum/M10 %value% endon 

    Hier das Log zu Rule1:

    Hier die Rule2:

    Code
    rule2:
    on system init do backlog var1 0; var2 0; var3 0; var4 0; var5 0; var6 5 endon
    on analog#a0>=%var4% do backlog add1 %value%; add2 1; var4 %value%; add4 %var6%; var5 %value%; sub5 %var6%  endon
    on analog#a0<=%var5% do backlog add1 %value%; add2 1; var4 %value%; add4 %var6%; var5 %value%; sub5 %var6%  endon
    on var2#state>=10 do backlog scale3 %var1%,0,10,0,1; var1 0; var2 0 endon
    on var3#state do publish /Bodenfeuchte/Zitronenbaum/M10 %value% endon

    Hier das Log zu Rule2:

    Code
    ...kommt in der nächsten Antwort (zu viele Zeichen).


    Der größte Wert ist 729.


    ...und so kommt es im IOBroker an:

    1799,2 ist größer als der größte Messwert.
    Ich seh da leider nicht wo in Rule2 der Fehler steckt...