Notify reagiert nicht auf alle Statusänderungen

Begonnen von Tristec, 05 Januar 2014, 21:17:09

Vorheriges Thema - Nächstes Thema

Tristec

Hallo,

ich habe das Problem, dass mein Notify nicht immer auf Statusänderungen reagiert. Ich habe mehrere Thermostate HM-CC-RT-DN im Einsatz und möchte die Anzahl d. wartenden Befehle aus der Variable protCmdPend mit im Frontend anzeigen.  Dazu habe ich ein Notify welches auf Statusänderungen des einzelnen Thermostates (z.B. SZ_Heizung) reagieren soll:

# Statusanzeige für Befehle in Warteschleife (CMDs_pending)
define Homemetatic_PendingState dummy
attr Homemetatic_PendingState fp_wohnung 230,728,2,

define getDevicePendingStates notify SZ_Heizung {\
my @@thermostate=("SZ_Heizung");;\
my ($result_str, $state, $PendingCount) = ("","","");;\
\
foreach my $HM_device (@@thermostate) {\
$state = ReadingsVal($HM_device,"state",0);;\
$PendingCount = fhem ("get $HM_device param protCmdPend");;\
$PendingCount = ($PendingCount ne 'undefined') ? $PendingCount: "keine";;\
$result_str .= $HM_device.":".$PendingCount;;\
$result_str .= '<br/><a href="/fhem/floorplan/wohnung?cmd.SZ_Heizung=set SZ_Heizung burstXmit">Push!</a>';;\
} \
fhem ("setstate Homemetatic_PendingState ".$result_str);;\
Log 1, "DEBUG: State=".$state." PendingCount=".$PendingCount;;\
}


Die Funktion funktioniert derzeit aber nur wenn ich diese manuell mit
trigger SZ_Heizung auslöse oder das Thermostat sich wieder einmal meldet:

2014.01.05 20:51:37 5: Triggering SZ_Heizung (5 changes)
2014.01.05 20:51:37 5: Notify loop for SZ_Heizung battery: ok
2014.01.05 20:51:37 4: eventTypes: CUL_HM SZ_Heizung battery: ok -> battery: ok
2014.01.05 20:51:37 4: eventTypes: CUL_HM SZ_Heizung batteryLevel: 3 V -> batteryLevel: .* V
2014.01.05 20:51:37 4: eventTypes: CUL_HM SZ_Heizung measured-temp: 24.7 -> measured-temp: .*
2014.01.05 20:51:37 4: eventTypes: CUL_HM SZ_Heizung desired-temp: 6 -> desired-temp: .*
2014.01.05 20:51:37 4: eventTypes: CUL_HM SZ_Heizung actuator: 0 % -> actuator: .* %
2014.01.05 20:51:37 5: Triggering getDevicePendingStates



Nun habe ich noch einen anderen Versuch gestartet und wollte den Status direkt in SZ_Heizung anpassen und im Floorplan anzeigen:



define getDevicePendingStates notify SZ_Heizung {\
my $state = ReadingsVal("SZ_Heizung","state",0);;\
my $PendingCount = fhem ("get SZ_Heizung param protCmdPend");;\
$PendingCount = ($PendingCount ne 'undefined') ? $PendingCount: "keine";;\
fhem("attr SZ_Heizung stateFormat ".$state."<br/>".$PendingCount);;\
}


Beim Auslösen einer Aktion greift das Notify einmalig z.B. wenn sich STATE (SZ_Heizung) von CMDs_done auf CMDs_processing ändert. Wird danach burstXmit abgesetzt und STATE ändert sich von CMDs_processing wieder auf CMDs_done reagiert das Notify nicht mehr:

Aktion: es wurde im Dropdown Menü ein neuer Wert für desired-temp gewählt:

Fhem

STATE: CMDs_processing...<br/>1 CMDs pending
protCmdPend: <undefined>
state: CMDs_done

Frontend:

SZ_Heizung
CMDs_processing...
1 CMDs pending

danach

Fhem

STATE: CMDs_processing...<br/>1 CMDs pending
protCmdPend: <undefined>
state: CMDs_done


Wo liegt hier mein Denkfehler?

Gruß Tristan

justme1968

#1
notifys hängen nur an readings. in einem device kann sich STATE (das ist nicht das gleiche wie das reading state) und die internal values ändern ohne das sich ein reading ändert. STATE und protCmdPend sind internal values und triggern keine notifys.

so viel ich weiss ändert sich für die meisten hm devices keine readings wenn nur versucht wird etwas zu senden. erst wenn das device das bestätigt ändern sich readings und es werden events erzeugt die dann die notifys triggern. die ausnahme hiervon sind alle devices die geschalten werden. da ändert sich das reading state auf ein set-xxx. das sollte mit notify auszuwerten sein.

wenn es dir reicht das die werte beim seitenaufbau aktuell sind und nicht per longpoll aktualisiert werden müssen kannst du eine readingGroup direkt auf TYPE=HM-CC-RT-DN:+protCmdPend definieren. das sammelt alle werte und zeigt sie in einer tabelle. wenn du möchtest das sie der wert zumindest dann aktualisiert wenn sich das device meldet kannst du mit einem user reading in der art 'protCmdPend {InternalVal($name,"protCmdPend", "")}' aus dem internal value ein reading mit gleichem namen machen und dann z.b. die readings group darauf definieren:  TYPE=HM-CC-RT-DN:protCmdPend

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Tristec