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
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...
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
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.
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 ?
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.
Aggregation (https://forum.fhem.de/index.php?topic=70624.0)
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