Hallo,
ich habe 3 HM Rauchmelder (Flur_EG, Kinderzimmer, Keller), deren Activity und battery Status ich über ein notify Abfragen will und wenn bei allen 3 Sowohl Activity=alive, als auch battery=ok sind, dann der dummy Status_Rauchmelder auf OK gesetzt wird, ansonsten auf Not, allerdings wird der Status des dummys nicht gesetzt.
Das list des dummys sieht so aus:
Internals:
CFGFN
NAME Status_Rauchmelder
NR 476
STATE ???
TYPE dummy
Attributes:
setList OK Not
und das list des notifys
Internals:
CFGFN
DEF Kinderzimmer|Keller|Flur_EG:(Activity|battery) {
if ($Activity eq "alive" && $battery eq "ok") {
fhem("set Status_Rauchmelder OK");
}
else {
fhem("set Status_Rauchmelder Not");
} }
NAME nt_Rauchmelder_Status
NR 570
NTFY_ORDER 50-nt_Rauchmelder_Status
REGEXP Kinderzimmer|Keller|Flur_EG:(Activity|battery)
STATE active
TYPE notify
Readings:
2015-04-09 21:44:55 state active
Attributes:
was mache ich noch falsch?
Danke
Ich frage das immer mit readingsVal ab
Zitatif ($Activity eq "alive" && $battery eq "ok") {
FHEM/Perl kann kein DWIM, sowas ist noch wissenschaftliche Forschung. Oder ohne Ironie: Sowas funktioniert unter FHEM anders. Wie Paul schon schreibt, muss man die Daten muehsam mit readingsVal abfragen, und das fuer alle 3 Geraete einzeln, d.h. es muessen 6 readingsVal Aufrufe mit && verknuepft werden.
Ok, danke für den Tip,
hab dann mal ein wenig gelesen und es dann so abgeändert
Kinderzimmer|Keller|Flur_EG:(Activity|battery) {
if (ReadingsVal(Kinderzimmer:Activity eq "alive") && (ReadingsVal(Kinderzimmer:battery eq "ok")) &&
(ReadingsVal(Keller:Activity eq "alive") && (ReadingsVal(Keller:battery eq "ok")) &&
(ReadingsVal(Flur_EG:Activity eq "alive") && (ReadingsVal(Flur_EG:battery eq "ok")))
))
{
fhem("set Status_Rauchmelder OK");
}
else {
fhem("set Status_Rauchmelder Not");
} }
Allerdings klappts damit auch noch nicht, im Log gibts keinen Meldung, was mache ich noch falsch?
Danke
Falsch:
ReadingsVal(Kinderzimmer:Activity eq "alive"
Müsste (meiner bescheidenen Meinung nach) so aussehen:
ReadingsVal("Kinderzimmer","Activity","undef")
Das findet sich aber zuhauf in so gut wie jedem Codeschnipsel im Forum und im Wiki sollte sich der Syntax von ReadingsVal auch finden lassen.
Weiters würde ich
(Kinderzimmer|Keller|Flur_EG):(Activity|battery) {
Das sollte aber eher unter Anfängerfragen und nicht hier her - aber auch das ist nur meine bescheidene Meinung.
Edith. Bevor Nachfragen zu
undef kommen - das ist der Ersatzwert wenn das Reading nicht ausgelesen werden kann.
Anstelle von undef kannst du gerne auch
falsch,
Fehler,
Bombay oder
wasauchimmer nehmen.
Edith2:
Zitatim Log gibts keinen Meldung,
Dann wird das notify nicht getriggert - der fehlerhafte ReadingsVal-Syntax muss eine Meldung im Log bringen.
Zitat von: Tommy82 am 10 April 2015, 20:05:35
Ok, danke für den Tip,
hab dann mal ein wenig gelesen und es dann so abgeändert
Kinderzimmer|Keller|Flur_EG:(Activity|battery) {
if (ReadingsVal(Kinderzimmer:Activity eq "alive") && (ReadingsVal(Kinderzimmer:battery eq "ok")) &&
(ReadingsVal(Keller:Activity eq "alive") && (ReadingsVal(Keller:battery eq "ok")) &&
(ReadingsVal(Flur_EG:Activity eq "alive") && (ReadingsVal(Flur_EG:battery eq "ok")))
))
{
fhem("set Status_Rauchmelder OK");
}
else {
fhem("set Status_Rauchmelder Not");
} }
Allerdings klappts damit auch noch nicht, im Log gibts keinen Meldung, was mache ich noch falsch?
Danke
Abgesehen davon, dass es so nicht funktioniert, kannst es auch etwas einfacher haben:
define di_Rauchmelder DOIF ([Kinderzimmer:Activity] eq "alive" and [Kinderzimmer:battery] eq "ok" and
[Keller:Activity] eq "alive" and [Keller:battery] eq "ok" and [Flur_EG:Activity] eq "alive" and [Flur_EG:battery] eq "ok")
(set Status_Rauchmelder OK)
DOELSE
(set Status_Rauchmelder Not)
Hier wird im Gegensatz zum notify nur geschaltet, wenn der Zustand sich ändert.
Gruß
Damian
Hallo Puschel,
danke für deine Hinweise, habs jetzt mal so abgeändert:
(Kinderzimmer|Keller|Flur_EG):(Activity|battery) {
if (ReadingsVal("Kinderzimmer","Activity","undef") eq "alive") && (ReadingsVal("Kinderzimmer","battery","undef") eq "ok") &&
(ReadingsVal("Keller","Activity","undef") eq "alive") && (ReadingsVal("Keller","battery","undef") eq "ok")) &&
((ReadingsVal("Flur_EG","Activity","undev") eq "alive") && (ReadingsVal("Flur_EG","battery","undef") eq "ok")))
))
{
fhem("set Status_Rauchmelder OK");
}
else {
fhem("set Status_Rauchmelder Not");
} }
Allerdings ohne erfolg
@Damian,
wenn ich deinen Code übernehme gibt es diesen Fehler:
perl error in condition: ReadingValDoIf('Kinderzimmer','Activity','') eq "alive" and ReadingValDoIf('Kinderzimmer','battery','') eq "ok" andReadingValDoIf('Keller','Activity','') eq "alive" and ReadingValDoIf('Keller','battery','') eq "ok" and ReadingValDoIf('Flur_EG','Activity','') eq "alive" and ReadingValDoIf('Flur_EG','battery','') eq "ok": syntax error at (eval 138) line 1, near ""ok" andReadingValDoIf"
Hab das "and" noch vom ReadingVal getrennt und nun gehts mit dem DoIf, vielen Dank dafür
Die Loesung von Puschel wuerde auch funktionieren, wenn man bei der Verteilung von Klammer auf genauso grosszuegig waere wie bei der Klammer zu. Ich wuerde die Funktionsaufrufe alle untereinander hinschreiben, dann fallen die ueberfluessigen Klammer schneller auf. Die Vergleiche "a eq b" muss man nicht klammern (darf man aber), der if selber benoetigt eine Klammer.
Hi, hab noch ein problem eigentlich eine einfache Sache, aber steh mir total auf dem Schlauch, hab das Alarmanlagenmodul im einsatz und möchte dort den Status des level6 in einen dummy schreiben, hab das mit if und auch doif versucht, aber bekomms nicht hin....
Internals:
NAME Alarmanlage_Neu
NR 285
STATE Keine Störung
TYPE Alarm
VERSION 2.5
Readings:
2015-04-03 14:05:17 level 0
2015-04-05 11:16:55 level0 off
2015-04-10 21:34:06 level6 off
2015-03-31 20:18:07 lockstate unlocked
2015-04-10 21:34:06 short 0
2015-04-11 13:21:11 state Keine Störung
Attributes:
armact set Android_Wohnzimmer ttsSay Alarm ist scharf
armdelay 02:00
armwait set Android_Wohnzimmer ttsSay Alarm wird in 2 Minuten scharf geschaltet
cancelact set Android_Wohnzimmer ttsSay Alarm zurückgesetzt
disarmact set Android_Wohnzimmer ttsSay Alarm ist unscharf
level0end 1
level0msg 1
level0offact set FritzDect_Wohnzimmerschrank off;
level0onact define alarm0dly1 at +00:02:00 set FritzDect_Wohnzimmerschrank on;
level0start 1
level0xec disarmed
level1end 0
level1msg 0
level1start 0
level1xec disarmed
level2end 0
level2msg 0
level2start 0
level2xec disarmed
level3end 0
level3msg 0
level3start 0
level3xec disarmed
level4end 0
level4msg 0
level4start 0
level4xec disarmed
level5end 0
level5msg 0
level5start 0
level5xec disarmed
level6end 06:00
level6msg Einbruchalarm AN
level6offact set FritzDect_Wohnzimmerschrank off;
level6onact define alarm6dly1 at +00:02:00 set FritzDect_Wohnzimmerschrank on;
level6start 23:00
level6xec armed
level7end 0
level7msg 0
level7start 0
level7xec disarmed
lockstate unlock
room Alarmanlage
statedisplay graphics
Habs mit diesem notify versucht:
Internals:
DEF Alarmanlage_Neu:level6 {
my $var = Value("Alarmanlage_Neu:level6");
if ($var eq "off") {
fhem("set Status_Alaram off");
}
else {
fhem("set Status_Alaram on");
} }
NAME nt_Status_Alarm
NOTIFYDEV Alarmanlage_Neu
NR 303
NTFY_ORDER 50-nt_Status_Alarm
REGEXP Alarmanlage_Neu:level6
STATE active
TYPE notify
Readings:
2015-04-11 13:27:01 state active
Attributes:
und diesem Doif
Internals:
DEF ([Alarmanlage_Neu:level6] eq "on")
(set Status_Alaram on)
DOELSE
(set Status_Alaram off)
NAME di_Alarmanlage_Status
NR 304
NTFY_ORDER 50-di_Alarmanlage_Status
STATE initialized
TYPE DOIF
Readings:
2015-04-11 13:20:07 state initialized
Condition:
0 ReadingValDoIf('Alarmanlage_Neu','level6','') eq "on"
Devices:
0 Alarmanlage_Neu
all Alarmanlage_Neu
Do:
0 set Status_Alaram on
1 set Status_Alaram off
Helper:
last_timer 0
sleeptimer -1
Itimer:
Readings:
0 Alarmanlage_Neu:level6
all Alarmanlage_Neu:level6
State:
Attributes:
Hi,
ich hänge hier leider immer noch, was ist an meinem DOIF falsch das der Dummy nicht geschaltet wird?
Internals:
CFGFN
DEF ([Alarmanlage_Neu:level6] eq "on") (set Status_Alaram on) DOELSE (set Status_Alaram off)
NAME doif_Status_Alarmanlage
NR 15065
NTFY_ORDER 50-doif_Status_Alarmanlage
STATE ???
TYPE DOIF
Condition:
0 ReadingValDoIf('Alarmanlage_Neu','level6','') eq "on"
Devices:
0 Alarmanlage_Neu
all Alarmanlage_Neu
Do:
0 set Status_Alaram on
1 set Status_Alaram off
Helper:
last_timer 0
sleeptimer -1
Itimer:
Readings:
0 Alarmanlage_Neu:level6
all Alarmanlage_Neu:level6
State:
Attributes:
Internals:
NAME Alarmanlage_Neu
NR 268
STATE 0
TYPE Alarm
VERSION 2.5
Readings:
2015-04-03 14:05:17 level 0
2015-04-05 11:16:55 level0 off
2015-04-10 21:34:06 level6 off
2015-03-31 20:18:07 lockstate unlocked
2015-04-10 21:34:06 short 0
2015-05-01 16:01:58 state 0
Attributes:
armact set Android_Wohnzimmer ttsSay Alarm ist scharf
armdelay 02:00
armwait set Android_Wohnzimmer ttsSay Alarm wird in 2 Minuten scharf geschaltet
cancelact set Android_Wohnzimmer ttsSay Alarm zurückgesetzt
disarmact set Android_Wohnzimmer ttsSay Alarm ist unscharf
level0end 1
level0msg 1
level0offact set FritzDect_Wohnzimmerschrank off;
level0onact define alarm0dly1 at +00:02:00 set FritzDect_Wohnzimmerschrank on;
level0start 1
level0xec disarmed
level1end 0
level1msg 0
level1start 0
level1xec disarmed
level2end 0
level2msg 0
level2start 0
level2xec disarmed
level3end 0
level3msg 0
level3start 0
level3xec disarmed
level4end 0
level4msg 0
level4start 0
level4xec disarmed
level5end 0
level5msg 0
level5start 0
level5xec disarmed
level6end 06:00
level6msg Einbruchalarm AN
level6offact set FritzDect_Wohnzimmerschrank off;
level6onact define alarm6dly1 at +00:02:00 set FritzDect_Wohnzimmerschrank on;
level6start 23:00
level6xec armed
level7end 0
level7msg 0
level7start 0
level7xec disarmed
lockstate unlock
room Alarmanlage
statedisplay graphics
Internals:
NAME Status_Alaram
NR 284
STATE ???
TYPE dummy
Attributes:
Zitat von: Tommy82 am 01 Mai 2015, 16:06:03
Hi,
ich hänge hier leider immer noch, was ist an meinem DOIF falsch das der Dummy nicht geschaltet wird?
Internals:
CFGFN
DEF ([Alarmanlage_Neu:level6] eq "on") (set Status_Alaram on) DOELSE (set Status_Alaram off)
NAME doif_Status_Alarmanlage
NR 15065
NTFY_ORDER 50-doif_Status_Alarmanlage
STATE ???
TYPE DOIF
Condition:
0 ReadingValDoIf('Alarmanlage_Neu','level6','') eq "on"
Devices:
0 Alarmanlage_Neu
all Alarmanlage_Neu
Do:
0 set Status_Alaram on
1 set Status_Alaram off
Helper:
last_timer 0
sleeptimer -1
Itimer:
Readings:
0 Alarmanlage_Neu:level6
all Alarmanlage_Neu:level6
State:
Attributes:
Internals:
NAME Alarmanlage_Neu
NR 268
STATE 0
TYPE Alarm
VERSION 2.5
Readings:
2015-04-03 14:05:17 level 0
2015-04-05 11:16:55 level0 off
2015-04-10 21:34:06 level6 off
2015-03-31 20:18:07 lockstate unlocked
2015-04-10 21:34:06 short 0
2015-05-01 16:01:58 state 0
Attributes:
armact set Android_Wohnzimmer ttsSay Alarm ist scharf
armdelay 02:00
armwait set Android_Wohnzimmer ttsSay Alarm wird in 2 Minuten scharf geschaltet
cancelact set Android_Wohnzimmer ttsSay Alarm zurückgesetzt
disarmact set Android_Wohnzimmer ttsSay Alarm ist unscharf
level0end 1
level0msg 1
level0offact set FritzDect_Wohnzimmerschrank off;
level0onact define alarm0dly1 at +00:02:00 set FritzDect_Wohnzimmerschrank on;
level0start 1
level0xec disarmed
level1end 0
level1msg 0
level1start 0
level1xec disarmed
level2end 0
level2msg 0
level2start 0
level2xec disarmed
level3end 0
level3msg 0
level3start 0
level3xec disarmed
level4end 0
level4msg 0
level4start 0
level4xec disarmed
level5end 0
level5msg 0
level5start 0
level5xec disarmed
level6end 06:00
level6msg Einbruchalarm AN
level6offact set FritzDect_Wohnzimmerschrank off;
level6onact define alarm6dly1 at +00:02:00 set FritzDect_Wohnzimmerschrank on;
level6start 23:00
level6xec armed
level7end 0
level7msg 0
level7start 0
level7xec disarmed
lockstate unlock
room Alarmanlage
statedisplay graphics
Internals:
NAME Status_Alaram
NR 284
STATE ???
TYPE dummy
Attributes:
Offenbar generiert dein Device "Alarmanlage_Neu" keine Events, sonst hätte im DOIF_Modul das Reading "e_Alarmanlage_Neu..." erscheinen müssen.
Gruß
Damian
Hi, und was kann ich da machen?
Zitat von: Tommy82 am 05 Mai 2015, 20:58:58
Hi, und was kann ich da machen?
Rate mal ;D
http://forum.fhem.de/index.php/topic,26893.msg289582.html#msg289582 (http://forum.fhem.de/index.php/topic,26893.msg289582.html#msg289582)
Ich benutze das Modul zwar nicht aber ein update sollte dir wohl helfen (und ab und zu mal in den Beiträgen lesen die deine verwendeten Module betreffen).
Hallo PUschel,
danke für den Hinweis, das Modul ist aktuell, letztes Update war gestern.
Aber hast recht, vieleicht passt es jetzt besser in den Modul Thread
Benutz doch zur Abwechslung erstmal den EventMonitor.
Evtl. werden ja jetzt Events generiert und es passt nur was anderes nicht ::)
Hi, also im Eventmonitor kommt kein Event welches mit dem Alarmanlagen Modul oder Dummy zu tun hätte....