Hallo,
ich habe meine Rauchmelder über ein DOIF bei Alarm automatisiert.
Es funktioniert soweit auch, ich möchte allerdings zusätzlich gemeldet bekommen welcher Rauchmelder ausgelöst hat.
Ich habe kein Idee wie ich das in die Telebot Nachricht einbaue.
Wer kann helfen?
Hier das Listing:
Internals:
DEF ([MQTT2_ioBroker:rauchmelder_ankleiderzimmer_smoke] eq "true" or [MQTT2_ioBroker:rauchmelder_buero_smoke] eq "true" or [MQTT2_ioBroker:rauchmelder_flur1og_smoke] eq "true" or [MQTT2_ioBroker:rauchmelder_flur2og_smoke] eq "true" or [MQTT2_ioBroker:rauchmelder_flureg_smoke] eq "true" or [MQTT2_ioBroker:rauchmelder_haustuer_smoke] eq "true" or [MQTT2_ioBroker:rauchmelder_keller_smoke] eq "true" or [MQTT2_ioBroker:rauchmelder_schlafzimmer_smoke] eq "true" or [MQTT2_ioBroker:rauchmelder_wohnzimmer_smoke] eq "true") (set teleBot message ALARM!! Rauchmelder ausgelöst!!!)(set rauchalarm on) DOELSE (set rauchalarm off)
FUUID 5fbfbae0-f33f-8863-4d78-d1a85bb1f8bd58d7
MODEL FHEM
NAME doif_rauchalarm
NOTIFYDEV global,MQTT2_ioBroker
NR 584
NTFY_ORDER 50-doif_rauchalarm
STATE cmd_2
TYPE DOIF
VERSION 28546 2024-02-23 20:11:05
eventCount 805
READINGS:
2024-03-23 18:03:56 Device MQTT2_ioBroker
2024-03-23 18:03:56 cmd 2
2024-03-23 18:03:56 cmd_event MQTT2_ioBroker
2024-03-23 18:03:56 cmd_nr 2
2024-03-23 14:02:12 e_MQTT2_ioBroker_rauchmelder_ankleiderzimmer_smoke false
2024-03-23 18:03:49 e_MQTT2_ioBroker_rauchmelder_buero_smoke false
2024-03-23 17:59:11 e_MQTT2_ioBroker_rauchmelder_flur1og_smoke false
2024-03-23 18:00:06 e_MQTT2_ioBroker_rauchmelder_flur2og_smoke false
2024-03-23 18:03:56 e_MQTT2_ioBroker_rauchmelder_flureg_smoke false
2024-03-23 18:02:39 e_MQTT2_ioBroker_rauchmelder_haustuer_smoke false
2024-03-23 18:02:15 e_MQTT2_ioBroker_rauchmelder_keller_smoke false
2024-03-23 17:59:42 e_MQTT2_ioBroker_rauchmelder_schlafzimmer_smoke false
2024-03-23 17:59:15 e_MQTT2_ioBroker_rauchmelder_wohnzimmer_smoke false
2024-03-23 14:01:56 mode enabled
2024-03-23 18:03:56 state cmd_2
2024-03-23 17:01:28 wait_timer no timer
Regex:
accu:
bar:
barAvg:
collect:
cond:
MQTT2_ioBroker:
0:
rauchmelder_ankleiderzimmer_smoke ^MQTT2_ioBroker$:^rauchmelder_ankleiderzimmer_smoke:
rauchmelder_buero_smoke ^MQTT2_ioBroker$:^rauchmelder_buero_smoke:
rauchmelder_flur1og_smoke ^MQTT2_ioBroker$:^rauchmelder_flur1og_smoke:
rauchmelder_flur2og_smoke ^MQTT2_ioBroker$:^rauchmelder_flur2og_smoke:
rauchmelder_flureg_smoke ^MQTT2_ioBroker$:^rauchmelder_flureg_smoke:
rauchmelder_haustuer_smoke ^MQTT2_ioBroker$:^rauchmelder_haustuer_smoke:
rauchmelder_keller_smoke ^MQTT2_ioBroker$:^rauchmelder_keller_smoke:
rauchmelder_schlafzimmer_smoke ^MQTT2_ioBroker$:^rauchmelder_schlafzimmer_smoke:
rauchmelder_wohnzimmer_smoke ^MQTT2_ioBroker$:^rauchmelder_wohnzimmer_smoke:
attr:
cmdState:
repeatcmd:
30
repeatsame:
wait:
waitdel:
waitsame:
condition:
0 ::ReadingValDoIf($hash,'MQTT2_ioBroker','rauchmelder_ankleiderzimmer_smoke') eq "true" or ::ReadingValDoIf($hash,'MQTT2_ioBroker','rauchmelder_buero_smoke') eq "true" or ::ReadingValDoIf($hash,'MQTT2_ioBroker','rauchmelder_flur1og_smoke') eq "true" or ::ReadingValDoIf($hash,'MQTT2_ioBroker','rauchmelder_flur2og_smoke') eq "true" or ::ReadingValDoIf($hash,'MQTT2_ioBroker','rauchmelder_flureg_smoke') eq "true" or ::ReadingValDoIf($hash,'MQTT2_ioBroker','rauchmelder_haustuer_smoke') eq "true" or ::ReadingValDoIf($hash,'MQTT2_ioBroker','rauchmelder_keller_smoke') eq "true" or ::ReadingValDoIf($hash,'MQTT2_ioBroker','rauchmelder_schlafzimmer_smoke') eq "true" or ::ReadingValDoIf($hash,'MQTT2_ioBroker','rauchmelder_wohnzimmer_smoke') eq "true"
do:
0:
0 set teleBot message ALARM!! Rauchmelder ausgelöst!!!
1 set rauchalarm on
1:
0 set rauchalarm off
helper:
NOTIFYDEV global,MQTT2_ioBroker
event rauchmelder_flureg_smoke: false
globalinit 1
last_timer 0
sleepdevice MQTT2_ioBroker
sleepsubtimer 0
sleeptimer -1
timerdev MQTT2_ioBroker
timerevent rauchmelder_flureg_smoke: false
triggerDev MQTT2_ioBroker
timerevents:
rauchmelder_flureg_smoke: false
timereventsState:
rauchmelder_flureg_smoke: false
triggerEvents:
rauchmelder_flureg_smoke: false
triggerEventsState:
rauchmelder_flureg_smoke: false
hmccu:
internals:
readings:
all MQTT2_ioBroker:rauchmelder_ankleiderzimmer_smoke MQTT2_ioBroker:rauchmelder_buero_smoke MQTT2_ioBroker:rauchmelder_flur1og_smoke MQTT2_ioBroker:rauchmelder_flur2og_smoke MQTT2_ioBroker:rauchmelder_flureg_smoke MQTT2_ioBroker:rauchmelder_haustuer_smoke MQTT2_ioBroker:rauchmelder_keller_smoke MQTT2_ioBroker:rauchmelder_schlafzimmer_smoke MQTT2_ioBroker:rauchmelder_wohnzimmer_smoke
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
alias doif_rauchalarm
do always
repeatcmd 30
room Sicherheit,System
Danke Gruß Stefan
$EVENT mit Perl zerlegen.
Wobei ich hier eh mit Events (und RegEx) statt mit Status arbeiten würde.
Mit dem Platzhalter $DEVICE kannst du das triggernde Device in der Nachricht angeben.
Das ist hier immer MQTT2_ioBroker, hilft also nicht weiter.
Hi,
wie Per schon schrieb, mit Perl den $EVENT zerlegen, z.B. so:
my($dv,$evnt) = split(" ",$EVENT);
In $dv sollte dann der Rauchmelder stehen, den kannst du dann weiterschicken.
Für die Syntax in einem fhem-DOIF musst Du mal hier rumsuchen, da gibt es etliche Beispiele, wie man Perl-code einbaut. Ich nutze nur noch Perl-DOIF....
Und für die Triggerung würde ich auch Per's Vorschlag nehmen und auf Eventtriggerung umstellen.
Um da nicht ewig zu probieren und rätseln einfach mal den Eventmonitor auf die Rauchmelder laufen lassen, egal ob true oder false, die Zeile markieren und das DOIF "erzeugen" lassen, also die vorgeschlagene DEF kopieren und in deinem DOIF nutzen. Halt noch etwas anpassen, damit alle Rauchmelder erfasst werden.
In etwa so:
([MQTT2_ioBroker:"^rauchmelder_.*_smoke:.true$"])
das sollte alle erfassen, wenn sie entsprechende Namen haben.
Probier mal
Viel Erfolg!
Sany
Vielleicht wäre es einfacher
- das MQTT2_DEVICE aufzusplitten, oder
- MQTT am ioBroker anders einzustellen...?
Die Readings kommen an und werden erkannt, aber ich bin aber mit Perl noch nicht so bewandert.
Wo setzte ich den Vorschlag von Sany
my($dv,$evnt) = split(" ",$EVENT);
hier jetzt ein?
([MQTT2_ioBroker:"^rauchmelder_.*_smoke:.true$"]) (set teleBot message ALARM!! Rauchmelder ausgelöst!!!)(set rauchalarm on) DOELSE (set rauchalarm off)
Zitat von: tilly001 am 24 März 2024, 17:00:44Die Readings kommen an und werden erkannt, aber ich bin aber mit Perl noch nicht so bewandert.
Dein "Problem" ist m.E. doch eher, dass du Readings hast, die eigentlich Devices sein sollten, es "hängt" also alles, was von ioBroker (mit diesen Einstellungen) kommt, "eine Ebene zu tief"...
Natürlich kann man auch mit dem weiterarbeiten, was du jetzt hast, aber es ist m.E. halt weder "intuitiv", noch einfacher, weil du nicht nur den Event splitten musst (was passiert, wenn es mal 3 Teile sind...?), sondern dann auch noch $EVTPART1 (bzw. "$dv") nachbearbeiten, weil da vermutlich ein Doppelpunkt steht, wo du ihn nicht haben magst.
Vielleicht zeigst du schlicht ein list (oder "copy for forum" von deinem MQTT2_DEVICE (oder "show MQTT Trafic" am IO)? Dann könnte man das ggf. einfacher beurteilen...
Listing MQTT2 Device:
define MQTT2_ioBroker MQTT2_DEVICE ioBroker
attr MQTT2_ioBroker DbLogExclude .*
attr MQTT2_ioBroker alias MQTT2_ioBroker
attr MQTT2_ioBroker disable 0
attr MQTT2_ioBroker group MQTT
attr MQTT2_ioBroker readingList ioBroker:alive:.* alive\
ioBroker:down:.* down\
ioBroker:ham/0/Haust\xc3\xbcr/Battery/Haustuer-Battery-Level:.* Haustuer-Battery-Level\
ioBroker:ham/0/Haust\xc3\xbcr/Latch/Haustuer-Latch-Current-State:.* Haustuer-Latch-Current-State\
ioBroker:ham/0/Haust\xc3\xbcr/Lock/Haustuer-Lock-Current-State:.* Haustuer-Lock-Current-State\
ioBroker:Qcells/SolarErtragTag:.* SolarErtragTag\
ioBroker:Qcells/EinspeisungTag:.* EinspeisungTag\
ioBroker:Qcells/BezugTag:.* BezugTag\
ioBroker:Qcells/PVLeistung2:.* PVLeistung2\
ioBroker:Qcells/PVLeistung1:.* PVLeistung1\
ioBroker:QCells/SolarErtragTotal:.* SolarErtragTotal\
ioBroker:QCells/InputEnergyChargeToday:.* InputEnergyChargeToday\
ioBroker:QCells/OutputEnergyChargeToday:.* OutputEnergyChargeToday\
ioBroker:QCells/KapazitaetBatterie:.* KapazitaetBatterie\
ioBroker:BWWP/TemperaturSollSet:.* TemperaturSollSet\
ioBroker:BWWP/TemperaturIst:.* TemperaturIst\
ioBroker:BWWP/Betriebsart:.* Betriebsart\
ioBroker:rauchmelder/buero/smoke:.* rauchmelder_buero_smoke\
ioBroker:rauchmelder/buero/batterylow:.* rauchmelder_buero_batterylow\
ioBroker:rauchmelder/keller/smoke:.* rauchmelder_keller_smoke\
ioBroker:rauchmelder/haustuer/smoke:.* rauchmelder_haustuer_smoke\
ioBroker:rauchmelder/schlafzimmer/smoke:.* rauchmelder_schlafzimmer_smoke\
ioBroker:rauchmelder/flur2og/smoke:.* rauchmelder_flur2og_smoke\
ioBroker:rauchmelder/ankleidezimmer/smoke:.* rauchmelder_ankleidezimmer_smoke\
ioBroker:rauchmelder/wohnzimmer/smoke:.* rauchmelder_wohnzimmer_smoke\
ioBroker:rauchmelder/flureg/smoke:.* rauchmelder_flureg_smoke\
ioBroker:rauchmelder/flur1og/smoke:.* rauchmelder_flur1og_smoke\
ioBroker:rauchmelder/buero/alarm:.* alarm
attr MQTT2_ioBroker room System
# CID ioBroker
# DEF ioBroker
# FUUID 61c4a8ae-f33f-8863-2d6f-51a2f4daff8cfb6c
# IODev MQTT2_FHEM_Server
# LASTInputDev MQTT2_FHEM_Server
# MQTT2_FHEM_Server_CONN MQTT2_FHEM_Server_127.0.0.1_57754
# MQTT2_FHEM_Server_MSGCNT 406367
# MQTT2_FHEM_Server_TIME 2024-03-24 17:16:50
# MSGCNT 406367
# NAME MQTT2_ioBroker
# NR 767
# STATE Online
# TYPE MQTT2_DEVICE
# eventCount 406435
# OLDREADINGS:
# READINGS:
# 2024-03-17 12:37:35 Betriebsart 1
# 2024-03-24 00:00:34 BezugTag 0
# 2024-03-02 12:58:46 EcoDesign_Temperatur_Ist 52.6
# 2024-03-24 11:33:54 EinspeisungTag 0.01
# 2024-03-24 17:16:39 Haustuer-Battery-Level 60
# 2024-03-24 17:16:39 Haustuer-Latch-Current-State 1
# 2024-03-24 17:16:39 Haustuer-Lock-Current-State 0
# 2024-03-17 17:21:24 IODev MQTT2_FHEM_Server
# 2024-03-24 17:15:12 InputEnergyChargeToday 6.6
# 2024-03-24 16:50:12 KapazitaetBatterie 96
# 2024-03-24 15:44:22 OutputEnergyChargeToday 4.2
# 2024-03-24 17:16:50 PVLeistung1 812
# 2024-03-24 17:16:50 PVLeistung2 329
# 2024-03-24 17:14:32 SolarErtragTag 10.8
# 2024-03-24 17:14:32 SolarErtragTotal 2790.8
# 2024-03-24 16:54:23 TemperaturIst 53.3
# 2024-03-17 12:37:35 TemperaturSollSet 55
# 2024-03-24 16:43:45 alarm false
# 2024-03-17 17:21:55 alive Online
# 2024-03-23 13:57:10 auchmelder_ankleiderzimmer_smoke true
# 2024-03-16 08:51:43 battery 100
# 2024-03-16 08:50:39 battery_low false
# 2024-03-16 08:51:56 batterylow false
# 2023-12-01 05:09:02 down Offline
# 2024-03-24 17:15:58 rauchmelder_ankleidezimmer_smoke false
# 2024-03-24 17:14:57 rauchmelder_buero_batterylow false
# 2024-03-24 17:15:27 rauchmelder_buero_smoke true
# 2024-03-24 17:15:17 rauchmelder_flur1og_smoke false
# 2024-03-24 17:16:10 rauchmelder_flur2og_smoke false
# 2024-03-24 17:14:58 rauchmelder_flureg_smoke false
# 2024-03-24 17:13:46 rauchmelder_haustuer_smoke false
# 2024-03-24 17:13:20 rauchmelder_keller_smoke false
# 2024-03-24 17:15:47 rauchmelder_schlafzimmer_smoke false
# 2024-03-24 17:15:19 rauchmelder_wohnzimmer_smoke false
# 2024-03-17 17:22:22 subscriptions rauchmelder/buero/alarm rauchmelder/buero/maxduration
# hmccu:
#
setstate MQTT2_ioBroker Online
setstate MQTT2_ioBroker 2024-03-17 12:37:35 Betriebsart 1
setstate MQTT2_ioBroker 2024-03-24 00:00:34 BezugTag 0
setstate MQTT2_ioBroker 2024-03-02 12:58:46 EcoDesign_Temperatur_Ist 52.6
setstate MQTT2_ioBroker 2024-03-24 11:33:54 EinspeisungTag 0.01
setstate MQTT2_ioBroker 2024-03-24 17:16:39 Haustuer-Battery-Level 60
setstate MQTT2_ioBroker 2024-03-24 17:16:39 Haustuer-Latch-Current-State 1
setstate MQTT2_ioBroker 2024-03-24 17:16:39 Haustuer-Lock-Current-State 0
setstate MQTT2_ioBroker 2024-03-17 17:21:24 IODev MQTT2_FHEM_Server
setstate MQTT2_ioBroker 2024-03-24 17:15:12 InputEnergyChargeToday 6.6
setstate MQTT2_ioBroker 2024-03-24 16:50:12 KapazitaetBatterie 96
setstate MQTT2_ioBroker 2024-03-24 15:44:22 OutputEnergyChargeToday 4.2
setstate MQTT2_ioBroker 2024-03-24 17:16:50 PVLeistung1 812
setstate MQTT2_ioBroker 2024-03-24 17:16:50 PVLeistung2 329
setstate MQTT2_ioBroker 2024-03-24 17:14:32 SolarErtragTag 10.8
setstate MQTT2_ioBroker 2024-03-24 17:14:32 SolarErtragTotal 2790.8
setstate MQTT2_ioBroker 2024-03-24 16:54:23 TemperaturIst 53.3
setstate MQTT2_ioBroker 2024-03-17 12:37:35 TemperaturSollSet 55
setstate MQTT2_ioBroker 2024-03-24 16:43:45 alarm false
setstate MQTT2_ioBroker 2024-03-17 17:21:55 alive Online
setstate MQTT2_ioBroker 2024-03-23 13:57:10 auchmelder_ankleiderzimmer_smoke true
setstate MQTT2_ioBroker 2024-03-16 08:51:43 battery 100
setstate MQTT2_ioBroker 2024-03-16 08:50:39 battery_low false
setstate MQTT2_ioBroker 2024-03-16 08:51:56 batterylow false
setstate MQTT2_ioBroker 2023-12-01 05:09:02 down Offline
setstate MQTT2_ioBroker 2024-03-24 17:15:58 rauchmelder_ankleidezimmer_smoke false
setstate MQTT2_ioBroker 2024-03-24 17:14:57 rauchmelder_buero_batterylow false
setstate MQTT2_ioBroker 2024-03-24 17:15:27 rauchmelder_buero_smoke true
setstate MQTT2_ioBroker 2024-03-24 17:15:17 rauchmelder_flur1og_smoke false
setstate MQTT2_ioBroker 2024-03-24 17:16:10 rauchmelder_flur2og_smoke false
setstate MQTT2_ioBroker 2024-03-24 17:14:58 rauchmelder_flureg_smoke false
setstate MQTT2_ioBroker 2024-03-24 17:13:46 rauchmelder_haustuer_smoke false
setstate MQTT2_ioBroker 2024-03-24 17:13:20 rauchmelder_keller_smoke false
setstate MQTT2_ioBroker 2024-03-24 17:15:47 rauchmelder_schlafzimmer_smoke false
setstate MQTT2_ioBroker 2024-03-24 17:15:19 rauchmelder_wohnzimmer_smoke false
setstate MQTT2_ioBroker 2024-03-17 17:22:22 subscriptions rauchmelder/buero/alarm rauchmelder/buero/maxduration
So könnte dann z.B. einer der Rauchmelder aussehen:
define Rauchmelder_Buero MQTT2_DEVICE
attr Rauchmelder_Buero group Sensor
attr Rauchmelder_Buero room Buero
attr Rauchmelder_Buero readingList \
rauchmelder/buero/smoke:.* {{smoke => $EVENT eq 'true' ? 'on':'off'}}\
rauchmelder/buero/batterylow:.* batterylow
Nachtrag: Wenn das mit dem Hash als Rückgabe nicht klappt (oder nicht gewünscht ist):
attr Rauchmelder_Buero readingList \
rauchmelder/buero/smoke:.* smoke\
rauchmelder/buero/batterylow:.* batterylow
Dann für jedes Device ein DOIF??... Ich stehe gerade auf dem Schlauch ...
Zitat von: tilly001 am 24 März 2024, 21:29:42Dann für jedes Device ein DOIF??... Ich stehe gerade auf dem Schlauch ...
Natürlich nicht...
Verwende das Modul nicht, aber ein notify für alle Rauchmelder würde diesen Job erledigen; geht ziemlich sicher auch mit DOIF, wenn man das bevorzugt....
So es läuft jetzt wie gewollt:
Jeder Rauchmelder hat ein eigenes Device.
(["^Rauchmelder_.*:smoke:.true$"]) (set teleBot message ALARM!! $DEVICE ausgelöst!!!) (set rauchalarm on) DOELSEIF (["^Rauchmelder_.*:smoke:.false$"]) (set rauchalarm off)
Gruß Stefan
Danke erst mal für die Rückmeldung, dass die Aufteilung in mehrere MQTT2_DEVICE-Instanzen nachvollziehbar war.
Zweifel an der Rückstelllogik hatte ich ja bereits per pm addressiert, Danke für's Wiederöffnen des Threads!
Wie würde dein Notify dazu aussehen?
Zitat von: Beta-User am 26 März 2024, 12:02:44Zweifel an der Rückstelllogik hatte ich ja bereits per pm addressiert, Danke für's Wiederöffnen des Threads!
Hmmm, ist schierig, da eine direkte Antwort (in Code) drauf zu geben.
Zum einen würde ich "Mehrzeiler" immer in myUtils-Code verpacken, und zum anderen ist das mit dem "Status-Dummy" eine Lösung, die ich eher vermeiden würde, weil da Abhängigkeitskaskaden entstehen können, die man nicht sauber auflösen kann, wenn man nicht genau weiß, wie die Event-Abarbeitung in fhem.pl abläuft...
Vermutlich würde ich das eher mit einem monitoring-Device lösen (und damit den Status aller Rauchmelder konsolidieren) und die Message für's Alarmieren (ausgehend von zuverlässig auslösenden Rauchmeldern ohne viele Fehlalarme) direkt über den "msg"-Befehl versenden (siehe msgConfig). Ob das dann direkt über das monitoring-Device ginge oder über ein separates notify (hörend auf alle Rauchmelder) habe ich noch nicht überlegt, vermutlich letzteres; vernetzte Rauchmelder stehen noch auf meiner "todo". Ein Beispiel für notify+myutils für (alle) Fenstersensoren habe ich irgendwo gepostet, aber das macht dann halt auch was anderes... Die Rauchmelder sind zwar jetzt da, aber deconz kennt die (noch?) nicht, so dass ich grade wieder überlege, auf zigbee2mqtt zu wechseln (was aber andere Umfeldarbeiten bedingen würde).
Der Vorteil von DOIF ist ja gerade, Device (Status) und Code an einer Stelle zu haben. Bzw bei Perl DOIF sich das Auslagern auf myutil zu sparen. In myutil packe ich (!) nur Code, den ich an verschiedenen Stellen brauche, und das ist seeehr wenig.
Zitat von: Per am 27 März 2024, 06:30:15Der Vorteil von DOIF ist ja gerade, Device (Status) und Code an einer Stelle zu haben. Bzw bei Perl DOIF sich das Auslagern auf myutil zu sparen. In myutil packe ich (!) nur Code, den ich an verschiedenen Stellen brauche, und das ist seeehr wenig.
Die Frage wäre, wie bekomme ich die Prüfung in das DOIF, sodass das DOELSEIF nur auslöst wenn alle Rauchmelder "false" melden.
Da kannst du aggregieren. Entweder du zählst die mit Status "false" gg die Anzahl oder "true" und 0.
So jetzt läuft es ....
(["^Rauchmelder_.*:smoke:.true$"]) (set teleBot message ALARM!! $DEVICE ausgelöst!!!) (set rauchalarm on) DOELSEIF ([#"^Rauchmelder":smoke:"true"] == 0) (set rauchalarm off)
Wenn du dein DOIF "rauchalarm" nennst und die beiden Status "on" und "off" sparst du eventuell ein Device, wenn es ein Dummy ist