Wert eines Status-Events passt nicht zum Status

Begonnen von juemuc, 30 April 2017, 20:15:40

Vorheriges Thema - Nächstes Thema

juemuc

Hallo,

ich setze bei meinem Waschmaschinen-Device den Status in Abhängigkeit von Stromverbrauch. Dies funktioniert bestens. Wenn ich aber den Statuswechsel im DOIF abfrage, ist dort immer der letzte Status im Event-Wert vorhanden.
Bsp.: Ich setze den Status der Waschmaschine von running auf done. Dann hat das Reading state der Waschmaschine den Wert done. Das Reading e_Waschmaschine_state des DOIF aber running.
Hier meine Definitionen:
Waschmaschine
defmod Waschmaschine dummy
attr Waschmaschine userattr configPowerDone
attr Waschmaschine configPowerDone 3.00
attr Waschmaschine devStateIcon Aus:general_aus@black An:scene_washing_machine@red
attr Waschmaschine devStateStyle style="text-align:right"
attr Waschmaschine group Statusinformationen
attr Waschmaschine icon scene_washing_machine@black
attr Waschmaschine room Bad,Statuszentrale
attr Waschmaschine sortby 0,5
attr Waschmaschine stateFormat { my $state = ReadingsVal($name, "state", "");; my $power = ReadingsVal($name, "power", "");; if($state eq 'on') { "An" } elsif($state eq "done") { "Fertig" } elsif($state eq "running") { "waschmaschine_03 ($power W)" } else { "Aus" } }

setstate Waschmaschine Fertig
setstate Waschmaschine 2017-04-30 20:02:36 power 2
setstate Waschmaschine 2017-04-30 20:02:37 state done

defmod Waschmaschine.Fertig.DOIF DOIF ([Waschmaschine:state] eq 'done') \
(set Sonos_Buero:FILTER=state=appeared Speak 25 de \
    'Die Waschmaschine ist fertig!')
attr Waschmaschine.Fertig.DOIF do always
attr Waschmaschine.Fertig.DOIF event-on-change-reading .*
attr Waschmaschine.Fertig.DOIF wait 180

setstate Waschmaschine.Fertig.DOIF cmd_1
setstate Waschmaschine.Fertig.DOIF 2017-04-30 20:02:36 Device Waschmaschine
setstate Waschmaschine.Fertig.DOIF 2017-04-30 19:48:18 cmd 1
setstate Waschmaschine.Fertig.DOIF 2017-04-30 19:48:18 cmd_event Waschmaschine
setstate Waschmaschine.Fertig.DOIF 2017-04-30 19:48:18 cmd_nr 1
setstate Waschmaschine.Fertig.DOIF 2017-04-30 20:02:36 e_Waschmaschine_state running
setstate Waschmaschine.Fertig.DOIF 2017-04-30 19:48:18 state cmd_1
setstate Waschmaschine.Fertig.DOIF 2017-04-30 20:02:15 wait_timer no timer


Wie am Zeitstempel zu sehen ist, wird zum gleichen Zeitpunkt in dem Device Waschmaschine das Reading state auf done gesetzt und im DOIF das Reading e_Waschmaschine_state auf running.

Wo liegt der Fehler?

Viele Grüße
juemuc
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Thorsten Pferdekaemper

Warum interessiert Dich dieses Reading im DOIF?
Gruß,
   Thorsten
FUIP

juemuc

ZitatWarum interessiert Dich dieses Reading im DOIF?
Gruß,
   Thorsten

In Abhängigkeit vom Wert "done" möchte ich eine Aktion starten
VG
juemuc
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Thorsten Pferdekaemper

Dabei beziehst Du Dich doch auf Waschmaschine:state und nicht auf Waschmaschine.Fertig.DOIF:e_Waschmaschine_state. ...und das ist auch gut so. Nochmal: was willst Du jetzt mit e_Waschmaschine_state?
Gruß,
   Thorsten 
FUIP

juemuc

#4
Durch die DOIF-Definition werte ich ja nicht den Status des Gerätes direkt aus, sondern das Event, welches durch die Statusänderung erzeugt wird. Ich vermute, dass Waschmaschine.Fertig.DOIF:e_Waschmaschine_state den Wert des Ereignisses darstellt. Der Wert von Waschmaschine.Fertig.DOIF:e_Waschmaschine_power stimmt ja auch immer mit dem Wert im Device überein. Ich könnte natürlich das DOIF anders definieren, aber ich wüsste gerne die Ursache für dieses Verhalten. Ich habe bisher alle meine DOIFs so definiert, dass sie das Ereignis auswerten.

Ich habe gerade festgestellt, dass auch eine Änderung der DOIF-Definition nicht zum Ziel führt. Das DOIF enthält wohl die notwendigen Informationen in den e_Waschmaschine_Readings. Ich bin ratlos.

VG
juemuc
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Thorsten Pferdekaemper

Zitat von: juemuc am 01 Mai 2017, 14:10:05
Durch die DOIF-Definition werte ich ja nicht den Status des Gerätes direkt aus, sondern das Event, welches durch die Statusänderung erzeugt wird.
Hä?
Warum enthält dann Deine Definition das hier?
[Waschmaschine:state]
Gruß,
   Thorsten
FUIP

juemuc

#6
Genau das ist meine Frage. Warum funktioniert es nicht :-(

Ups. Ich werte ja schon den Status und nicht das Event aus. Sorry für die Verwirrung. Das Ergebnis ist aber sowohl bei der Abfrage des Ereignisses als auch bei der Abfrage des Status gleich.

Wenn sich der Status des Gerätes sich von running nach done ändert, reagiert das DOIF nicht. Es bei einer erneuten Änderung. Also immer eine Statusänderung später. Meine Vermutung ist nun, dass es an dem Inhalt dieser Variablen liegt.

VG
juemuc 
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Thorsten Pferdekaemper

Nein, es liegt daran, dass "state" ein etwas besonderes Reading ist.
Die Lösung ist wahrscheinlich einfach [Waschmaschine] anstatt [Waschmaschine:state] hinzuschreiben.
Alternativ beim DOIF das Attribut addStateEvent setzen.
Gruß,
   Thorsten
FUIP

Damian

Die Readings im DOIF, die mit e_ beginnen entsprechen den Events, für die sich das DOIF-Modul aufgrund der Definition interessiert. Diese stellen lediglich eine Information dar, die man für Analyzezwecke heranziehen kann.

2017-04-30 20:02:36 e_Waschmaschine_state running

bedeutet lediglich, dass um 20:02:36 das entsprechende Ereignis stattgefunden hat, welches aufgrund des fehlenden DOELSE-Zweigs in deiner Definition zu keiner Aktion geführt hat.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

juemuc

#9
Ja das habe ich vermutet. Aber genau um diese Zeit wurde der Status des Device auf "done" gesetzt (über ein anderes DOIF). Diese Statusänderung kann ich im DOIF nicht erkennen, da hier immer der "alte" Status zur Verfügung steht.

1. DOIF erkennt Änderung des Stromverbrauchs und setzt den Wert in der Waschmaschine (funktioniert bestens)
2. DOIF erkennt Änderung des Stromverbrauchs in der Waschmaschine und setzt in Abhängigkeit des alten Status einen neuen Status (funktioniert bestens)
3. DOIF soll nun auf diese Statusänderung reagieren -> Funktioniert nicht, da hier noch der "letzte" Status zur Verfügung steht, der im 2. DOIF verändert wurde. (warum auch immer).

Ich habe dies gesplittet, um im dritten DOIF mit einem "wait" ggf. auf eine weitere Zustandsänderung reagieren zu können. Ansonsten funktionieren alle DOIFs wie gewünscht.

@Thorsten: Die von Dir vorgeschlagenen Anpassungen haben leider zu keinem Erfolg geführt.

VG
juemuc
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Thorsten Pferdekaemper

Zitat von: juemuc am 01 Mai 2017, 18:40:23@Thorsten: Die von Dir vorgeschlagenen Anpassungen haben leider zu keinem Erfolg geführt.
Ok, dann muss sich das der DOIF-Meister nochmal anschauen oder Du baust das ganze um auf notify, dann kann ich Dir vielleicht helfen.
Ich kann mir nur noch vorstellen, dass das event-on-change-reading .* in einem DOIF seltsame Effekte haben kann.
Gruß,
   Thorsten
FUIP

juemuc

Im notify kann ich aber keine Verzögerung einbauen oder. Das 3. DOIF soll nur dann ausgeführt werden, wenn die Waschmaschine nicht innerhalb von 3 Minuten ausgeschaltet wird :-) Ansonsten könnte ich die Meldung ja auch direkt im 2. DOIF mit ausgeben.

VG
juemuc
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

KernSani

Zitat von: juemuc am 01 Mai 2017, 20:22:56
Im notify kann ich aber keine Verzögerung einbauen
Du kannst ein temporäres at oder sleep nutzen, aber mit DOIF ist's komfortabler.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Thorsten Pferdekaemper

Zitat von: juemuc am 01 Mai 2017, 20:22:56
Im notify kann ich aber keine Verzögerung einbauen oder. Das 3. DOIF soll nur dann ausgeführt werden, wenn die Waschmaschine nicht innerhalb von 3 Minuten ausgeschaltet wird :-) Ansonsten könnte ich die Meldung ja auch direkt im 2. DOIF mit ausgeben.
Üblicherweise macht man das in etwa so:

define blabla notify Waschmaschine:.done sleep 180;; IF ([Waschmaschine] eq "done") (tuwasauchimmerdutunwillst)

Gruß,
   Thorsten
FUIP

KernSani

Gib mal ein list des DOIF, wenn es nicht macht, was es machen sollte (sprich wenn die Waschmaschine "done" ist)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...