Homestatus mit Notify und DoIf Reihenfolge

Begonnen von hugo, 24 Oktober 2023, 15:46:04

Vorheriges Thema - Nächstes Thema

hugo

Hallo zusammen,
folgendes Problem stellt sich mir.
HomeStatus als dummy definiert. Beim Wechsel des Status werden verschiedene DoIfs ausgeführt. Funktioniert soweit auch.
Jetzt überwache ich den Wasserverbrauch. Dieser soll je nach HomeStatus Meldungen bzw Aktionen ausführen, was auch funktioniert.
Beim Umschalten z.B. auf HomeStatus 4 sollte erst das Reading auf CN.WasserCounter:appCountsPerHourTemp = 0 gesetzt werden, damit das Wasserventil nicht sofort schließt sondern erst bei einem erneuten Auftreten dieses Ereignis.
Also Abfolge momentan
Homestatus = 1
CN.WasserCounter:appCountsPerHourTemp] = 35
HomeStatus = 4
di.WasserAlarm DOIF cmd2 wird ausgeführt. Was zu diesem Zeitpunkt nicht erfolgen sollte.

Deshalb wollte ich per Notify den CN.WasserCounter:appCountsPerHourTemp auf "0".

Zähler wird auf = gestzt, aber di.WasserAlarm DOIF cmd2 wird trotzdem ausgeführt.

Kann vor der Ausführung des Doif eine Pause eingebaut werden oder die Reihenfolge bestimmt werden, damit zuerst das notify und dann das DoIf erfolgt?


define HausStatus dummy
attr HausStatus devStateIcon 1:system_fhem 2:scene_sleeping_alternat 3:car 4:scene_visit_guests
attr HausStatus group A_HOME
attr HausStatus icon system_fhem_reboot@blue
attr HausStatus readingList state
attr HausStatus room Alarm,Zentrale
attr HausStatus setList state:1,2,3,4
attr HausStatus sortby 1
attr HausStatus webCmd state
#   FUUID      5c8231e3-f33f-07c9-955a-14fdd15422a56056
#   NAME       HausStatus
#   NR         83
#   STATE      1
#   TYPE       dummy
#   eventCount 18
#   READINGS:
#     2023-10-24 14:59:06   state           1
#
setstate HausStatus 1
setstate HausStatus 2023-10-24 14:59:06 state 1


define nf.HausStatus notify HausStatus:4 setreading CN.WasserCounter appCountsPerHourTemp 0
attr nf.HausStatus room Alarm
#   CFGFN     
#   DEF        HausStatus:4 setreading CN.WasserCounter appCountsPerHourTemp 0
#   FUUID      6537bd8a-f33f-07c9-6570-93e86319e4b514f6
#   NAME       nf.HausStatus
#   NOTIFYDEV  HausStatus
#   NR         1210561
#   NTFY_ORDER 50-nf.HausStatus
#   REGEXP     HausStatus:4
#   STATE      2023-10-24 14:57:57
#   TRIGGERTIME 1698152278.06765
#   TYPE       notify
#   eventCount 3
#   READINGS:
#     2023-10-24 14:56:56   state           active
#     2023-10-24 14:57:57   triggeredByDev  HausStatus
#     2023-10-24 14:57:57   triggeredByEvent 4
#
setstate nf.HausStatus 2023-10-24 14:57:57
setstate nf.HausStatus 2023-10-24 14:56:56 state active
setstate nf.HausStatus 2023-10-24 14:57:57 triggeredByDev HausStatus
setstate nf.HausStatus 2023-10-24 14:57:57 triggeredByEvent 4



define di.WasserAlarm DOIF ([CN.WasserCounter:appCountsPerHourTemp] eq "0" and [$SELF:myStatus] eq "aktiv")\
 () \
DOELSEIF ([CN.WasserCounter:appCountsPerHourTemp] > "0" and [HausStatus] eq "4" and [WasserVentil] eq "auf" and [$SELF:myStatus] eq "aktiv")\
 (set WasserVentil zu, msg push 0 |Wasseralarm Urlaub|Ventil zu)\
DOELSEIF ([CN.WasserCounter:appCountsPerHourTemp] > "50" and [HausStatus] eq "3" and [WasserVentil] eq "auf" and [$SELF:myStatus] eq "aktiv")\
 (set WasserVentil zu, msg push 0 |Wasseralarm Away|Ventil zu) \
DOELSEIF ([CN.WasserCounter:appCountsPerHourTemp] > "180" and [$SELF:myStatus] eq "aktiv")\
 (set WasserVentil zu, msg push 0 |Achtung Wasseralarm|Ventil zu) \
DOELSEIF ([CN.WasserCounter:appCountsPerHourTemp] > "100" and [$SELF:myStatus] eq "aktiv")\
 ( msg push 0 |Wasserverbrauch STD-Wasseralarm pro Stunde)\
DOELSEIF ([$SELF:myStatus] eq "restart") \
 (set WasserVentil auf,set $SELF myStatus aktiv)\
DOELSEIF ([$SELF:myStatus] eq "inaktiv") \
   (msg push 0 |Wasseralarm inaktiv|keine Ueberwachung)
attr di.WasserAlarm alias Wasseralarm
attr di.WasserAlarm devStateIcon initialized|cmd_1|cmd_6:message_attention@green cmd_2|cmd_3|cmd_4:Wecker.Immer@red cmd_5:message_attention@red cmd_7:general_aus@red
attr di.WasserAlarm disable 0
attr di.WasserAlarm group Wasser
attr di.WasserAlarm icon message_attention@blue
attr di.WasserAlarm readingList myStatus
attr di.WasserAlarm room Keller
attr di.WasserAlarm setList myStatus:aktiv,inaktiv,restart
attr di.WasserAlarm webCmd myStatus
#   DEF        ([CN.WasserCounter:appCountsPerHourTemp] eq "0" and [$SELF:myStatus] eq "aktiv")
# ()
#DOELSEIF ([CN.WasserCounter:appCountsPerHourTemp] > "20" and [HausStatus] eq "4" and [WasserVentil] eq "auf" and [$SELF:myStatus] eq "aktiv")
# (set WasserVentil zu, msg push 0 |Wasseralarm Urlaub|Ventil zu)
#DOELSEIF ([CN.WasserCounter:appCountsPerHourTemp] > "50" and [HausStatus] eq "3" and [WasserVentil] eq "auf" and [$SELF:myStatus] eq "aktiv")
# (set WasserVentil zu, msg push 0 |Wasseralarm Away|Ventil zu)
#DOELSEIF ([CN.WasserCounter:appCountsPerHourTemp] > "180" and [$SELF:myStatus] eq "aktiv")
# (set WasserVentil zu, msg push 0 |Achtung Wasseralarm|Ventil zu)
#DOELSEIF ([CN.WasserCounter:appCountsPerHourTemp] > "100" and [$SELF:myStatus] eq "aktiv")
# ( msg push 0 |Wasserverbrauch STD-Wasseralarm pro Stunde)
#DOELSEIF ([$SELF:myStatus] eq "restart")
# (set WasserVentil auf,set $SELF myStatus aktiv)
#DOELSEIF ([$SELF:myStatus] eq "inaktiv")
#   (msg push 0 |Wasseralarm inaktiv|keine Ueberwachung)
#   FUUID      5c8231e4-f33f-07c9-de78-fe5298e07264cda0
#   MODEL      FHEM
#   NAME       di.WasserAlarm
#   NOTIFYDEV  HausStatus,WasserVentil,CN.WasserCounter,di.WasserAlarm,global
#   NR         101
#   NTFY_ORDER 50-di.WasserAlarm
#   STATE      cmd_1
#   TYPE       DOIF
#   VERSION    26655 2022-11-05 18:33:59
#   eventCount 21
#   READINGS:
#     2023-10-24 14:59:06   Device          HausStatus
#     2023-10-24 14:57:58   cmd             1
#     2023-10-24 14:57:58   cmd_event       CN.WasserCounter
#     2023-10-24 14:57:58   cmd_nr          1
#     2023-10-24 14:57:58   e_CN.WasserCounter_appCountsPerHourTemp 0
#     2023-10-24 14:59:06   e_HausStatus_STATE 1
#     2023-10-24 14:58:33   e_WasserVentil_STATE auf
#     2023-10-24 14:57:37   mode            enabled
#     2023-08-21 21:19:29   myStatus        aktiv
#     2023-10-24 14:57:58   state           cmd_1
#   Regex:
#     accu:
#     collect:
#     cond:
#       CN.WasserCounter:
#         0:
#           appCountsPerHourTemp ^CN.WasserCounter$:^appCountsPerHourTemp:
#         1:
#           appCountsPerHourTemp ^CN.WasserCounter$:^appCountsPerHourTemp:
#         2:
#           appCountsPerHourTemp ^CN.WasserCounter$:^appCountsPerHourTemp:
#         3:
#           appCountsPerHourTemp ^CN.WasserCounter$:^appCountsPerHourTemp:
#         4:
#           appCountsPerHourTemp ^CN.WasserCounter$:^appCountsPerHourTemp:
#       HausStatus:
#         0:
#         1:
#           &STATE     ^HausStatus$
#         2:
#           &STATE     ^HausStatus$
#         3:
#         4:
#         5:
#         6:
#       WasserVentil:
#         0:
#         1:
#           &STATE     ^WasserVentil$
#         2:
#           &STATE     ^WasserVentil$
#         3:
#         4:
#         5:
#         6:
#       di.WasserAlarm:
#         0:
#           myStatus   ^di.WasserAlarm$:^myStatus:
#         1:
#           myStatus   ^di.WasserAlarm$:^myStatus:
#         2:
#           myStatus   ^di.WasserAlarm$:^myStatus:
#         3:
#           myStatus   ^di.WasserAlarm$:^myStatus:
#         4:
#           myStatus   ^di.WasserAlarm$:^myStatus:
#         5:
#           myStatus   ^di.WasserAlarm$:^myStatus:
#         6:
#           myStatus   ^di.WasserAlarm$:^myStatus:
#   attr:
#     cmdState:
#     wait:
#     waitdel:
#   condition:
#     0          ::ReadingValDoIf($hash,'CN.WasserCounter','appCountsPerHourTemp') eq "0" and ::ReadingValDoIf($hash,'di.WasserAlarm','myStatus') eq "aktiv"
#     1          ::ReadingValDoIf($hash,'CN.WasserCounter','appCountsPerHourTemp') > "0" and ::InternalDoIf($hash,'HausStatus','STATE') eq "4" and ::InternalDoIf($hash,'WasserVentil','STATE') eq "auf" and ::ReadingValDoIf($hash,'di.WasserAlarm','myStatus') eq "aktiv"
#     2          ::ReadingValDoIf($hash,'CN.WasserCounter','appCountsPerHourTemp') > "50" and ::InternalDoIf($hash,'HausStatus','STATE') eq "3" and ::InternalDoIf($hash,'WasserVentil','STATE') eq "auf" and ::ReadingValDoIf($hash,'di.WasserAlarm','myStatus') eq "aktiv"
#     3          ::ReadingValDoIf($hash,'CN.WasserCounter','appCountsPerHourTemp') > "180" and ::ReadingValDoIf($hash,'di.WasserAlarm','myStatus') eq "aktiv"
#     4          ::ReadingValDoIf($hash,'CN.WasserCounter','appCountsPerHourTemp') > "100" and ::ReadingValDoIf($hash,'di.WasserAlarm','myStatus') eq "aktiv"
#     5          ::ReadingValDoIf($hash,'di.WasserAlarm','myStatus') eq "restart"
#     6          ::ReadingValDoIf($hash,'di.WasserAlarm','myStatus') eq "inaktiv"
#   do:
#     0:
#       0         
#     1:
#       0          set WasserVentil zu, msg push 0 |Wasseralarm Urlaub|Ventil zu
#     2:
#       0          set WasserVentil zu, msg push 0 |Wasseralarm Away|Ventil zu
#     3:
#       0          set WasserVentil zu, msg push 0 |Achtung Wasseralarm|Ventil zu
#     4:
#       0           msg push 0 |Wasserverbrauch STD-Wasseralarm pro Stunde
#     5:
#       0          set WasserVentil auf,set di.WasserAlarm myStatus aktiv
#     6:
#       0          msg push 0 |Wasseralarm inaktiv|keine Ueberwachung
#     7:
#   helper:
#     NOTIFYDEV  HausStatus,WasserVentil,CN.WasserCounter,di.WasserAlarm,global
#     event      1
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#     timerdev   CN.WasserCounter
#     timerevent appCountsPerHourTemp: 0
#     triggerDev HausStatus
#     timerevents:
#       appCountsPerHourTemp: 0
#     timereventsState:
#       appCountsPerHourTemp: 0
#     triggerEvents:
#       1
#     triggerEventsState:
#       state: 1
#   internals:
#     all         HausStatus:STATE WasserVentil:STATE
#   readings:
#     all         CN.WasserCounter:appCountsPerHourTemp di.WasserAlarm:myStatus
#   trigger:
#   uiState:
#   uiTable:
#
setstate di.WasserAlarm cmd_1
setstate di.WasserAlarm 2023-10-24 14:59:06 Device HausStatus
setstate di.WasserAlarm 2023-10-24 14:57:58 cmd 1
setstate di.WasserAlarm 2023-10-24 14:57:58 cmd_event CN.WasserCounter
setstate di.WasserAlarm 2023-10-24 14:57:58 cmd_nr 1
setstate di.WasserAlarm 2023-10-24 14:57:58 e_CN.WasserCounter_appCountsPerHourTemp 0
setstate di.WasserAlarm 2023-10-24 14:59:06 e_HausStatus_STATE 1
setstate di.WasserAlarm 2023-10-24 14:58:33 e_WasserVentil_STATE auf
setstate di.WasserAlarm 2023-10-24 14:57:37 mode enabled
setstate di.WasserAlarm 2023-08-21 21:19:29 myStatus aktiv
setstate di.WasserAlarm 2023-10-24 14:57:58 state cmd_1


Vielen Dank schon jetzt mal für eure Hilfe und Ideen

Gruß Josef
Raspi 3 mit CUL HM-MOD-UART; nanoCUL
Homematic: HM-SEC-SCo 5x;HM-LC-SW1-BA-PCB 3x;HM-Dis-EP-WM55; HM-LC-SW4-PCB; ARLO;
Somfy RTS Rollo 14x; Alexa; GardenaSmartDevice; Stromzähler(GPIO); shelly1; shelly2.5;Wasserzähler(GPIO);Brennerstuhlsteckdosen;

KernSani

Hi Josef,
mir ist ehrlich gesagt nicht ganz klar, was du erreichen möchtest, bzw. wo das Problem liegt. Kannst du es so formulieren, dass man es versteht, wenn man deine Installation nicht im Detail kennt?
Ich verstehe: Die willst einen Counter zurücksetzen und ein Ventil zu machen, das Ventil soll aber erst später geschlossen werden - da gibt es im DOIF z.B. das wait-Attribut, oder ein simples AT, um Dinge verzögert auszuführen, ich fürchte aber, das ist nicht die Antwort die du suchst.
Grüße,
Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

hugo

Hallo Oli, mir ist bewusst das ich es nicht ordentlich beschreiben kann. Versuche es nochmal mit anderen Worten.
Mein Wasserzähler zeigt einen Verbrauch von 30l an. Wenn ich jetzt den HomeStatus auf 4 setze springt das DoIf an und macht das Wasserventil zu. Dies ist aber zu diesem Zeitpunkt noch nicht gewollt. Der Wert 30 ist ja ein aktueller Wert und hat im Prinzip nichts mit der Überwachung im HomeStatus 4 zu tun.

Wenn ich vor dem setzen des HomeStatus auf 4 den cn.wassercounter:appCountsPerHourTemp auf 0 setze passt alles und meine Überwachung von Wasserverbrauch ist aktiv. Bedeutet, wenn jetzt der Wasserverbrauch in meiner Abwesenheit größer 20 pro Stunde ist wird das Wasserventil geschlossen.

Meine Überlegung war den Counter per Notify auf Null zu setzen, wenn der HomeStatus auf 4 gesetzt wird. Dies funktioniert auch, aber der DoIf starten natürlich auch beim setzen vom Status und führt seine Aktionen aus.

Hoffe du verstehst mein Problem.

Gruß Josef
Raspi 3 mit CUL HM-MOD-UART; nanoCUL
Homematic: HM-SEC-SCo 5x;HM-LC-SW1-BA-PCB 3x;HM-Dis-EP-WM55; HM-LC-SW4-PCB; ARLO;
Somfy RTS Rollo 14x; Alexa; GardenaSmartDevice; Stromzähler(GPIO); shelly1; shelly2.5;Wasserzähler(GPIO);Brennerstuhlsteckdosen;

KernSani

#3
Ganz verstanden habe ich es glaube ich immer noch nicht, aber soweit ich das Problem verstehe, möchtest du ein reading setzen, ohne ein Event auszulösen (da dieses dann das DOIF triggern würde). Wenn ich die Problematik richtig verstanden habe, fallen mir zwei Ansätze ein:
1. Du nutzt Perl Code und setzt das Reading per readingsingleupdate, debei kann man mitgeben, ob ein Event erzeugt werden soll oder nicht (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#readingsSingleUpdate)
2. Du deaktivierst das DOIF kurzfristig, machst das setreading und aktivierst das DOIF dann wieder

Edit: 3. du überlegts nochmal ganz genau, in welchen Kombinationen von Zuständen/Ereignissen welche Aktionen erfolgen sollen (aufmalen hilft) - vielleicht kommst du dann zu einer eindeutigen Lösung   
Grüße,
Oli 
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...