Sorry, ich hatte es zuerst im falschen Bereich gepostet. Deshalb nun hier:
ich bekomme ein einfaches DOIF nicht hin und stehe völlig auf dem Schlauch....es geht um einen HMIP Wassersensor (HmIP-SWD).
Das Device:
Internals:
DEF HmIP-SWD-Wassersensor defaults
FUUID 5e161d47-f33f-d150-de87-46b1d6f1f15820f3
IODev CCU2
NAME KG_HWR_Wassersensor
NR 1192
STATE Initialized
TYPE HMCCUDEV
ccuaddr 00189A4995CDBC
ccudevstate active
ccuif HmIP-RF
ccuname HmIP-SWD-Wassersensor
ccutype HmIP-SWD
channels 3
statevals devstate
READINGS:
2020-01-08 23:52:53 0.ERROR_CODE 0
2020-01-08 23:52:53 0.ERROR_NON_FLAT_POSITIONING 0
2020-01-08 23:52:53 0.LOW_BAT ok
2020-01-08 23:52:53 0.UNREACH alive
2020-01-08 23:52:53 1.ALARMSTATE ok
2020-01-08 23:52:53 1.MOISTURE_DETECTED ok
2020-01-08 23:52:53 1.WATERLEVEL_DETECTED ok
2020-01-08 23:52:53 battery ok
2020-01-08 23:52:53 hmstate Initialized
2020-01-09 00:04:24 state Initialized
hmccu:
devspec HmIP-SWD-Wassersensor
Attributes:
IODev CCU2
ccureadingfilter (^ALARMSTATE|^LOW_BAT|^UNREACH|^MOISTURE_DETECTED|^WATERLEVEL_DETECTED|^ERROR_NON_FLAT_POSITIONING|^ERROR_CODE)
ccureadingformat datapoint
ccureadingname 0.(LOWBAT|LOW_BAT):+battery
event-on-change-reading . *
genericDeviceType LeakSensor
group Schaltdosen
homebridgeMapping LeakDetected=1.ALARMSTATE,values=ok:0;Alarm:1 StatusTampered=0.ERROR_NON_FLAT_POSITIONING StatusFault=0.ERROR_CODE
room Hausstatus
stateFormat Status: 1.ALARMSTATE | Feuchtigkeitserkennung: 1.MOISTURE_DETECTED | Wassererkennung: 1.WATERLEVEL_DETECTED
substitute ALARMSTATE!(0|false):ok,(1|true):Alarm;LOW_BAT!(0|false):ok,(1|true):low;MOISTURE_DETECTED!(0|false):ok,(1|true):Alarm;WATERLEVEL_DETECTED!(0|false):ok,(1|true):Alarm;ERROR_NON_FLAT_POSITIONING!(0|false):0,(1|true):1
Ich möchte eine Telegram-Nachricht, wenn sich der Alarm- und/oder Batteriestatus ändert.
Aber das DOIF wird einfach nicht ausgelöst, bei keinem Reading:
Internals:
DEF ([KG_HWR_Wassersensor:1.ALARMSTATE] eq "Alarm") (set Telegram message Wassersensor KG_HWR ALARM!)
FUUID 5e165ff8-f33f-d150-f0f3-932ee175156e796b
MODEL FHEM
NAME Wassersensor_Alarmierung_DOIF
NOTIFYDEV global,KG_HWR_Wassersensor
NR 1198
NTFY_ORDER 50-Wassersensor_Alarmierung_DOIF
STATE initialized
TYPE DOIF
VERSION 20500 2019-11-12 17:54:48
READINGS:
2020-01-09 00:37:06 cmd 0
2020-01-09 00:37:06 mode enabled
2020-01-09 00:37:06 state initialized
Regex:
accu:
cond:
KG_HWR_Wassersensor:
0:
1.ALARMSTATE ^KG_HWR_Wassersensor$:^1.ALARMSTATE:
condition:
0 ::ReadingValDoIf($hash,'KG_HWR_Wassersensor','1.ALARMSTATE') eq "Alarm"
do:
0:
0 set Telegram message Wassersensor KG_HWR ALARM!
1:
helper:
DEVFILTER ^global$|^KG_HWR_Wassersensor$
NOTIFYDEV global|KG_HWR_Wassersensor
globalinit 1
last_timer 0
sleeptimer -1
readings:
all KG_HWR_Wassersensor:1.ALARMSTATE
uiState:
uiTable:
Attributes:
do always
room Licht
Internals:
DEF ([KG_HWR_Wassersensor:battery] eq "low") (set Telegram message Wassersensor KG_HWR Batterie leer!)
FUUID 5e165ff8-f33f-d150-f0f3-932ee175156e796b
MODEL FHEM
NAME Wassersensor_Alarmierung_DOIF
NOTIFYDEV global,KG_HWR_Wassersensor
NR 1198
NTFY_ORDER 50-Wassersensor_Alarmierung_DOIF
STATE initialized
TYPE DOIF
VERSION 20500 2019-11-12 17:54:48
READINGS:
2020-01-09 00:35:47 cmd 0
2020-01-09 00:35:47 mode enabled
2020-01-09 00:35:47 state initialized
Regex:
accu:
cond:
KG_HWR_Wassersensor:
0:
battery ^KG_HWR_Wassersensor$:^battery:
condition:
0 ::ReadingValDoIf($hash,'KG_HWR_Wassersensor','battery') eq "low"
do:
0:
0 set Telegram message Wassersensor KG_HWR Batterie leer!
1:
helper:
DEVFILTER ^global$|^KG_HWR_Wassersensor$
NOTIFYDEV global|KG_HWR_Wassersensor
globalinit 1
last_timer 0
sleeptimer -1
readings:
all KG_HWR_Wassersensor:battery
uiState:
uiTable:
Attributes:
do always
room Licht
Ich teste dann immer mit
trigger KG_HWR_Wassersensor 1.ALARMSTATE: Alarm
oder
trigger KG_HWR_Wassersensor battery: low
Im Eventmonitor kann ich sehen, dass der Wert gesetzt wird. Aber im DOIF passiert gar nichts.
Was mache ich verkehrt?
trigger generiert ein Ereignis, setzt das Reading aber nicht.
([KG_HWR_Wassersensor:1.ALARMSTATE] eq "Alarm") ist kein Ereignissteuerung sondern Zustandsteuerung: Kommando wird ausgeführt wenn das Reading sich ändert (oder mit do always mind. aktualisiert wird)
Teste lieber mit
setreading KG_HWR_Wassersensor 1.ALARMSTATE Alarm
Zitat von: amenomade am 09 Januar 2020, 01:30:18
Teste lieber mit
setreading KG_HWR_Wassersensor 1.ALARMSTATE Alarm
Danke. Allerdings funktioniert das bei mir nur, wenn ich dann manuell im DOIF ein "checkall" ausführe (also set KG_HWR_Wassersensor_DOIF checkall).
Von alleine erkennt das DOIF die Änderung des Readings nicht....?
Weilevent-on-change-reading . *
falsch ist. Kein Leerzeichen zwischen Punkt und Stern
DANKE. Das war es, es funktioniert. Ich hätte den Fehler mit Leerzeichen nicht gefunden, da hätte ich nicht mehr drauf geschaut. Nochmals Danke.
Schön. Überleg aber ob do always in Kombination mit event-on-change-reading sinnvoll ist...
Bei weiderkehrendem "Alarm" Status wird durch event-on-change-reading das DOIF nicht mehr getriggert. do always stört nicht... aber ist überflüssig. Erst wenn inzwischen eine Zustandsänderung (z.B. auf noAlarm) erfolgt ist, wird eine erneuete "Alarm" ein neues Telegram anstossen
Ok danke, dann muss ich mir das nochmal genau ansehen. Ich dachte eigentlich, "do always" würde genau das bewirken - ein erneutes ausführen des gleichen Befehls bei erneutem Trigger.
Zitat von: errazzor am 09 Januar 2020, 02:03:50
Ich dachte eigentlich, "do always" würde genau das bewirken - ein erneutes ausführen des gleichen Befehls bei erneutem Trigger.
So ist es auch. Nur... mit event-on-change-reading gibt es kein "bei erneutem Trigger" solange das Reading nicht geändert wird.
Mit attr repeatcmd auf dem DOIF kannst Dir trotzdem regelmässig ein Telegram schicken lassen, solange der Wassersensor bei Alarm bleibt. Wäre auch eine Alternative.
Ich merke gerade - das denken funktioniert zu dieser Uhrzeit nicht mehr so richtig. Natürlich hast Du Recht :)
Vielen Dank für den Hinweis !