DOIF oder nicht DOIF, der richtige Weg für meine Alarmanlage ?!

Begonnen von mfeske, 10 Januar 2025, 20:57:01

Vorheriges Thema - Nächstes Thema

mfeske

Hallo zusammen,
ich bastle eine kleine Alarmanlage und bin am überlegen ob die Umsetzung mit DOIF das richtige ist oder ob ich mich verzettele.
Was soll passieren.
Wenn die Bewohner anwesend sind soll die Anlage auf unscharf / 0 stehen.
Wenn die Bewohner abwesend sind soll die Anlage auf scharf / 2 stehen.
Über einen Taster (momentan nur ein Dummy später vielleicht auch Hardware) sollen die Bewohner die Anlage auf unscharf / 0 stellen können zum Beispiel wenn der Nachbar mit dem Schlüssel das Haus betritt.
Über den gleichen Taster soll der User auch wieder auf scharf / 2 stellen können.
Ein Zwischenzustand mit dem Taster wäre dann noch die Bewohner sind zu Hause und wollen die Anlage trotzdem halb-scharf / 1 stellen bzw. unscharf / 0 stellen.
Tür- Fensterkontakte sollen nach dem Zustand der Anlage schauen. Ist der Zustand 1 oder 2 und einer der Kontakte öffnet sich soll Alarm ausgelöst werden; erste Idee nur eine Pushover Nachricht, nach Bestätigung dann vielleicht auch eine Sirene oder ähnliches.

Die Anwesenheitssteuerung habe ich bereits mit geofancy, RESIDENTS, ROOMMATE umgesetzt. Das funktioniert, Bewohner wird entsprechend auf absent / home gesetzt.

rgr_Bewohner
Internals:
   DURATIONTIMER 1736538559.20196
   FUUID      678066c3-f33f-be1a-943d-0dbe5904cd91d175
   FVERSION   10_RESIDENTS.pm:0.195330/2019-06-02
   NAME       rgr_Bewohner
   NOTIFYDEV  global,rr_location_michael,rr_location_tania
   NR         63
   NTFY_ORDER 50-rgr_Bewohner
   READY      1
   ROOMMATES  rr_location_michael,rr_location_tania
   STATE      home
   TYPE       RESIDENTS
   eventCount 113
   READINGS:

   TIMER:
     rgr_Bewohner_DurationTimer:
       HASH       rgr_Bewohner
       MODIFIER   DurationTimer
       NAME       rgr_Bewohner_DurationTimer
Attributes:
   alias      Bewohner
   devStateIcon .*home:status_available:absent .*absent:status_away_1:home .*gone:status_standby:home .*none:control_building_empty .*gotosleep:status_night:asleep .*asleep:status_night:awoken .*awoken:status_available:home .*:user_unknown:home
   group      Home State
   icon       control_building_filled
   room       Haus
   webCmd     state

rr_location_michael
Internals:
   DEF        rgr_Bewohner
   DURATIONTIMER 1736538619.11532
   FUUID      678041a4-f33f-be1a-6f14-c8f212165627472e
   FVERSION   20_ROOMMATE.pm:0.195330/2019-06-02
   NAME       rr_location_michael
   NOTIFYDEV  global,
   NR         57
   NTFY_ORDER 50-rr_location_michael
   READY      1
   RESIDENTGROUPS rgr_Bewohner
   STATE      home
   SUBTYPE    adult
   TYPE       ROOMMATE
   eventCount 113
   READINGS:
   TIMER:
     rr_location_michael_DurationTimer:
       HASH       rr_location_michael
       MODIFIER   DurationTimer
       NAME       rr_location_michael_DurationTimer
Attributes:
   alias      Michael
   devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown:home
   group      location
   icon       people_sensor
   room       Haus
   rr_realname group
   sortby     1
   webCmd     state
rr_location_tania
Internals:
   DEF        rgr_Bewohner
   DURATIONTIMER 1736538679.17869
   FUUID      678041c3-f33f-be1a-adb7-597b297d9bff07f3
   FVERSION   20_ROOMMATE.pm:0.195330/2019-06-02
   NAME       rr_location_tania
   NOTIFYDEV  global,
   NR         58
   NTFY_ORDER 50-rr_location_tania
   READY      1
   RESIDENTGROUPS rgr_Bewohner
   STATE      home
   SUBTYPE    adult
   TYPE       ROOMMATE
   eventCount 114
   READINGS:
   TIMER:
     rr_location_tania_DurationTimer:
       HASH       rr_location_tania
       MODIFIER   DurationTimer
       NAME       rr_location_tania_DurationTimer
Attributes:
   alias      Tania
   devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown:home
   group      location
   icon       people_sensor
   room       Haus
   rr_realname group
   sortby     1
   webCmd     state
geofancy
Internals:
   DEF        geo
   FUUID      678049d2-f33f-be1a-16da-e2588886afa9215e
   FVERSION   98_GEOFANCY.pm:0.189950/2019-03-22
   NAME       geofancy
   NR         59
   STATE      initialized
   TYPE       GEOFANCY
   READINGS:
   fhem:
     infix      geo
Attributes:
   devAlias   E9:Michael
   room       Haus
Für die Alarmanlage als solche habe ich zunächst zum probieren Dummys angelegt:

mehrere Kontakte
Internals:
   FUUID      67807424-f33f-be1a-1b32-05ee3b9f1dd91fd4
   NAME       Aussentuer_Garten_Alarm
   NR         64
   STATE      ???
   TYPE       dummy
Attributes:
   room       Alarmanlage
   verbose    0

Status
Internals:
   FUUID      67807828-f33f-be1a-6f3e-56d9bde8e61ee267
   NAME       Alarm_Status
   NR         68
   STATE      ???
   TYPE       dummy
Attributes:
   room       Alarmanlage
Taster
nternals:
   CFGFN     
   FUUID      67816ae7-f33f-be1a-7c06-39d56c9a9d1ba135
   NAME       Alarm_Taster
   NR         69
   STATE      ???
   TYPE       dummy
Attributes:
   room       Alarmanlage

Würde mich über Ideen und Hinweise von Euch freuen.
Gruß
Micha
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

Per

Was ist die eigentliche Frage?

Wenn ich das richtig sehe, sind es vier Status:
1: save: alles scharf
2: Nachbar: Dummy ± Geofency off
3: Shell: Dummy + Geofency on
4: Home: off

Da jetzt die Sensoren zuordnen...

mfeske

#2
Hallo @Per,
danke für den Beitrag.
Es ist halt alles schon ziemlich lange her :-(
Ein erster versuch es einfach zu machen funktioniert schon mal nicht :-(
Internals:
   DEF        ([Bewohner:"absent"]) (set Alarm_Status scharf_03) DOELSE (set Alarm_Status scharf_00)
   FUUID      67866ae1-f33f-be1a-fc23-1e504674516f0aba
   MODEL      FHEM
   NAME       DOIF_Bewohner_Alarm
   NOTIFYDEV  global,Bewohner
   NR         70
   NTFY_ORDER 50-DOIF_Bewohner_Alarm
   STATE      initialized
   TYPE       DOIF
   VERSION    29460 2024-12-29 20:25:48
   READINGS:
     2025-01-14 14:47:13   cmd             0
     2025-01-14 14:47:13   mode            enabled
     2025-01-14 14:47:13   state           initialized
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       Bewohner:
         0:
           &STATE     ^Bewohner$
   condition:
     0          ::EventDoIf('Bewohner',$hash,'absent',1)
   do:
     0:
       0          set Alarm_Status scharf_03
     1:
       0          set Alarm_Status scharf_00
   helper:
     NOTIFYDEV  global,Bewohner
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
   trigger:
     all         Bewohner
   uiState:
   uiTable:
Attributes:
   room       Alarmanlage,Haus


Gruß
Micha
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

Per

Ich würde schon mal nicht auf Event triggern, sondern auf Zustand. Oder, falls es mehrere Bewohner gibt, auf die Anzahl der an- oder anwesenden.

mfeske

Zitat von: Per am 16 Januar 2025, 18:55:08Ich würde schon mal nicht auf Event triggern, sondern auf Zustand. Oder, falls es mehrere Bewohner gibt, auf die Anzahl der an- oder anwesenden.
Hallo Per,
Du meinst ich sollte also rr_location* presence auswerten / zählen ?

Momentan sind es zwei Bewohner, aber ja es leuchtet mir ein das es so auch Sinn machen würde wenn mal jemand dazu kommt muss man nciht alles neu machen.

Internals:
   DEF        rgr_Bewohner
   DURATIONTIMER 1737103202.26498
   FUUID      678041c3-f33f-be1a-adb7-597b297d9bff07f3
   FVERSION   20_ROOMMATE.pm:0.195330/2019-06-02
   NAME       rr_location_tania
   NOTIFYDEV  global,
   NR         58
   NTFY_ORDER 50-rr_location_tania
   READY      1
   RESIDENTGROUPS rgr_Bewohner
   STATE      gone
   SUBTYPE    adult
   TYPE       ROOMMATE
   eventCount 3987
   READINGS:
     2025-01-17 09:39:02   durTimerAbsence 66:54:36
     2025-01-17 09:39:02   durTimerAbsence_cr 4015
     2025-01-14 14:44:26   durTimerPresence 00:00:00
     2025-01-14 14:44:26   durTimerPresence_cr 0
     2025-01-09 22:38:26   durTimerSleep   00:00:00
     2025-01-09 22:38:26   durTimerSleep_cr 0
     2025-01-10 20:47:19   lastArrival     2025-01-10 20:47:19
     2025-01-14 14:44:26   lastDeparture   2025-01-14 14:44:26
     2025-01-10 20:47:19   lastDurAbsence  01:00:53
     2025-01-10 20:47:19   lastDurAbsence_cr 61
     2025-01-14 14:44:26   lastDurPresence 89:57:07
     2025-01-14 14:44:26   lastDurPresence_cr 5397
     2025-01-14 14:44:26   lastLocation    home
     2025-01-14 14:44:26   lastMood        calm
     2025-01-15 06:49:58   lastState       absent
     2025-01-14 14:44:26   location        underway
     2025-01-14 14:44:26   mood            -
     2025-01-14 14:44:26   presence        absent
     2025-01-15 06:49:58   state           gone
     2025-01-09 22:41:09   wayhome         0
   TIMER:
     rr_location_tania_DurationTimer:
       HASH       rr_location_tania
       MODIFIER   DurationTimer
       NAME       rr_location_tania_DurationTimer
Attributes:
   alias      Tania
   devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown:home
   group      location
   icon       people_sensor
   room       Haus
   rr_realname group
   sortby     1
   webCmd     state

Könntest Du mir da ein wenig mehr auf die Sprünge helfen ?
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

mfeske

Mein Versuch mit

Internals:
   DEF        {
    # Liste der Geräte
    my @devices = qw(rr_location_michael rr_location_tania);
    my $count = 0;
    foreach my $dev (@devices) {
        # Prüfe das Reading 'state' auf 'home'
        $count++ if (ReadingsVal($dev, "state", "") eq "home");
    }
    return $count > 1;
}
(
    # Aktionen, wenn Bedingung erfüllt
    { Log 1, "Mehr als ein Gerät ist zuhause" },
    { fhem("set Alarm_Status 0") }
)
DOELSE
(
    # Aktionen, wenn Bedingung nicht erfüllt
    { Log 1, "Weniger oder genau ein Gerät ist zuhause" },
    { fhem("set Alarm_Status 3") }
)
   FUUID      678a644a-f33f-be1a-664c-48c069fc7ff8098c
   MODEL      Perl
   NAME       Alarm_Presence_DOIF
   NOTIFYDEV  global
   NR         71
   NTFY_ORDER 50-Alarm_Presence_DOIF
   STATE      ???
   TYPE       DOIF
   VERSION    29460 2024-12-29 20:25:48
   eventCount 1
   READINGS:
     2025-01-19 16:06:22   mode            enabled
   Regex:
     accu:
     bar:
     barAvg:
     collect:
   condition:
     0         
    # Liste der Geräte
    my @devices = qw(rr_location_michael rr_location_tania);
    my $count = 0;
    foreach my $dev (@devices) {
        # Prüfe das Reading 'state' auf 'home'
        $count++ if (ReadingsVal($dev, "state", "") eq "home");
    }
    return $count > 1;

     1           Log 1, "Mehr als ein Gerät ist zuhause"
     2           fhem("set Alarm_Status 0")
     3           Log 1, "Weniger oder genau ein Gerät ist zuhause"
     4           fhem("set Alarm_Status 3")
   helper:
     NOTIFYDEV  global
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
     0          block_01
     1          block_02
     2          block_03
     3          block_04
     4          block_05
   uiState:
   uiTable:
Attributes:
   room       Alarmanlage

funktioniert leider nicht, auch wenn beide absent oder home sind, ändert sich nichts an Alarm_Status und die ??? bei state bleiben.
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)


mfeske

#7
Hallo Per,

vielen Dank für den Link. Ich hoffe das tut es jetzt und ich habe mir kein Ei gelegt.
([#"^rr_location_:home":state:"home"] != 0) (set pushmsg msg "es ist jemand zu Hause", set Alarm_Status 0)
DOELSEIF
([#"^rr_location_:home":state:"home"] == 0) (set pushmsg msg "es ist niemand zu Hause", set Alarm_Status 3)

im Fall von
([#"_Alarm$:opened":state:"opened"] != 0) (set pushmsg msg "Kontakt $DEVICE wurde geöffnet. Es sind folgende Kontakte offen: [@"_Alarm$":state:"opened"]")
DOELSEIF
([#"_Alarm$:closed":state:"open"] == 0) (set pushmsg msg "alle Kontakte geschlossen")

Funktionieren zwar die push Ausgaben, aber im state steht korrekt nur alle Kontakte geschlossen;
wenn etwas geöffnet ist kommt die Meldung zwar korrekt in der push Nachricht aber im state steht $DEVICE zuletzt geöffnet

Internals:
   CFGFN     
   DEF        ([#"_Alarm$:opened":state:"opened"] != 0) (set pushmsg msg "Kontakt $DEVICE wurde geöffnet. Es sind folgende Kontakte offen: [@"_Alarm$":state:"opened"]")
DOELSEIF
([#"_Alarm$:closed":state:"open"] == 0) (set pushmsg msg "alle Kontakte geschlossen")
   FUUID      678d3cd1-f33f-be1a-c7f2-dad1fd51a7b4aa33
   MODEL      FHEM
   NAME       Alarm_Kontakte_DOIF
   NOTIFYDEV  .*(_Alarm$).*,global
   NR         79
   NTFY_ORDER 50-di_Fenster
   STATE      $DEVICE zuletzt geöffnet
   TYPE       DOIF
   VERSION    29460 2024-12-29 20:25:48
   eventCount 20
   READINGS:
     2025-01-19 19:54:55   Device          Aussentuer_Strasse_Alarm
     2025-01-19 19:54:55   cmd             1
     2025-01-19 19:54:55   cmd_event       Aussentuer_Strasse_Alarm
     2025-01-19 19:54:55   cmd_nr          1
     2025-01-19 19:48:07   mode            enabled
     2025-01-19 19:54:55   state           $DEVICE zuletzt geöffnet
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       :
         0:
           "_Alarm$:opened" _Alarm$:opened
         1:
           "_Alarm$:closed" _Alarm$:closed
   attr:
     cmdState:
       0:
         $DEVICE zuletzt geöffnet
       1:
         alle geschlossen
     wait:
     waitdel:
   condition:
     0          ::AggregateDoIf($hash,'#','_Alarm$','state','"opened"') != 0
     1          ::AggregateDoIf($hash,'#','_Alarm$','state','"open"') == 0
   do:
     0:
       0          set pushmsg msg "Kontakt $DEVICE wurde geöffnet. Es sind folgende Kontakte offen: [@"_Alarm$":state:"opened"]"
     1:
       0          set pushmsg msg "alle Kontakte geschlossen"
     2:
   helper:
     NOTIFYDEV  .*(_Alarm$).*,global
     event      opened
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Aussentuer_Strasse_Alarm
     timerevent opened
     triggerDev Aussentuer_Strasse_Alarm
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: Aussentuer_Strasse_Alarm
       $DEVICE zuletzt geöffnet
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: Aussentuer_Strasse_Alarm
       state: $DEVICE zuletzt geöffnet
     timerevents:
       opened
     timereventsState:
       state: opened
     triggerEvents:
       opened
     triggerEventsState:
       state: opened
   internals:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   cmdState   $DEVICE zuletzt geöffnet|alle geschlossen
   do         always
   room       Alarmanlage
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)