[gelöst:] Verständnisprobleme mit DOIF

Begonnen von Kornelius777, 02 November 2022, 18:29:20

Vorheriges Thema - Nächstes Thema

Kornelius777

Hallo zusammen!

Mein Wasserzähler (https://github.com/jomjol/AI-on-the-edge-device/wiki) arbeitet grundsätzlich ganz gut, aber zur Bereinigung der Werte möchte ich nur dann in die Datenbank schreiben lassen, wenn
- der Wert größer als 1 ist und
- das Reading "error" den Wert "no error" hat.

Hierzu habe ich mir ein DOIF gebastelt:
define doif_MQTT_wasser DOIF ([MQTT_wasser:value] > 1 and [MQTT_wasser:error] eq "no error") (setreading MQTT_wasser value_bereinigt {(ReadingsVal("MQTT_wasser","value",0))})

Jetzt habe ich allerdings zwei "Herausforderungen", die ich nicht alleine gelöst bekomme...

Erstens: Mein Verständnis war, dass das DOIF jedesmal loslegt, wenn sich ein neuer Wert für [MQTT_wasser:value] ergibt. Leider ist das nicht so.
Was muss ich ändern, damit das DOIF bei jedem neuen Wert für [MQTT_wasser:value] loslegt?

Zweitens: "Ab und zu"  ::) wird ein neuer Wert für "MQTT_wasser value_bereinigt" errechnet - der landet dann aber nicht in der Datenbank.
Wo ist denn nur mein Denkfehler? (Natürlich habe ich an attr MQTT_wasser DbLogInclude changeabsolut_liter,value_bereinigt gedacht...)

Danke euch allen für Hilfestellung!

Grüße!

Kornelius

Ralli

Dieses DOIF kennt nur einen Zweig. Sobald dieser einmal ausgelöst ist, wird er nie wieder ausgelöst, so lange nicht entweder eine andere (hier nicht vorhandene) Bedingung erfüllt ist oder das Attribut do always gesetzt ist.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

Kornelius777

Herzlichen Dank!

(Du wirst alt wie 'ne Kuh und lernst immernoch dazu...)

Das löst zumindest die erste Herausforderung :-D

Kornelius777

Kann das jemand nachvollziehen, dass das Reading (aus dem DOIF berechnet) nicht in die DB geschrieben wird?
Wo liegt denn hier der Fehler?

Kornelius777

Offenbar schreibt das DOIF tatsächlich an der Datenbank vorbei.

Ich habe das DOIF nun angepasst in
defmod doif_MQTT_wasser_1 DOIF ([MQTT_wasser:value] > 1 and [MQTT_wasser:error] eq "no error") (setreading MQTT_wasser value_bereinigt1 {(ReadingsVal("MQTT_wasser","value",0))})
mit "value_bereinigt1" als Zwischenwert.

Im Device "MQTT_wasser" nutze ich nun ein userreading:
value_bereinigt {ReadingsVal("MQTT_wasser","value_bereinigt1",0)}

Und DER Wert landet nun in der DB.

:-\

MadMax-FHEM

Warum machst du es nicht gleich NUR als userReadings, also OHNE EXTRA DOIF?

Das ist doch total unnötig...

Und du solltest beim userReadings mit Trigger arbeiten!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kornelius777

#6
...weil ich einfach nicht weiß, wie ich die beiden Bedingungen im userreading unterbringen müsste.

Magst du mir helfen?

Könnte das so aussehen?
value_bereinigt {if (ReadingsVal($name,"value",'')>1 and ReadingsVal($name,"error",'') eq "no error"){ReadingsVal($name,"value","")}}

MadMax-FHEM

#7
Ich habe mal mit einem dummy probiert, hier zum Einfügen per Klick auf userReadings:


value_bereinigt:value.* {my $ActValue=ReadingsNum($name,"value_bereinigt",0); my $NewValue=ReadingsNum($name,"value",0); my $Error=ReadingsVal($name,"error",""); if($NewValue > 1 && $Error eq "no error"){return $NewValue}else{return $ActValue}}


Geht auch weniger ausführlich aber so evtl. verständlicher...

Ich habe ReadingsNum genommen, annehmend, dass es um eine Zahl geht, immerhin vergleichst du ja mit '<' und einer Zahl '1' ;)

EDIT: bzgl. des Triggers bin ich unsicher. Also bei meinem dummy hat es so funktioniert. Evtl. geht auch ohne .* (vermutlich sogar). Allerdings ist der Name des userReadings bei diesem Trigger nicht so gut, weil ja theoretisch (praktisch, hmmm, evtl. nicht, weil die "Event-Aktion" bereits "durch" ist) das userReadings sich selbst triggert. Evtl. einen anderen Namen überlegen, der nicht mit value anfängt...
EDIT: wobei ich mal bei mir geschaut habe und feststellen musste, dass ich die Namen auch so gewählt habe weight -> weight_cleaned (userReadings) und läuft seit einiger Zeit...

EDIT: bzgl. der Frage warum das DOIF nicht gleich geloggt wird. Hast du oder mach doch einfach mal den Eventmonitor auf und schaue, ob das DOIF auch ein Event value_bereinigt auslöst. Weil das u.U. wegen "Verhinderung einer Loop" unterbunden wird... Ansonsten habe ich auch keine Ahnung warum das nicht gleich geloggt wurde/wird...

EDIT: das sollte auch gehen

value_bereinigt:value.* {my $ActValue=ReadingsNum($name,"value_bereinigt",0); my $NewValue=ReadingsNum($name,"value",0); my $Error=ReadingsVal($name,"error",""); $NewValue > 1 && $Error eq "no error" ? return $NewValue : return $ActValue}


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kornelius777

Wow. DANKE!

Ich habe es angepasst:
bereinigt:value.* {my $ActValue=ReadingsNum($name,"bereinigt",0); my $NewValue=ReadingsNum($name,"value",0); my $Error=ReadingsVal($name,"error",""); if($NewValue > 1 && $Error eq "no error"){return $NewValue}else{return $ActValue}}

Auf diese Art gibt es keine Referenz auf sich selbst.

Vielen Dank, dass du dir solch eine Mühe gemacht hast!

MadMax-FHEM

Zitat von: Kornelius777 am 02 November 2022, 20:03:07
Wow. DANKE!

Vielen Dank, dass du dir solch eine Mühe gemacht hast!

Klar gerne!

Viel Spaß noch, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)