FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: harald654 am 15 November 2018, 21:22:07

Titel: Noify mit IF ELSE
Beitrag von: harald654 am 15 November 2018, 21:22:07
Hallo,
ich versuche über ein Fenstersensor das Thermostat auf off (bei Fenster open)bzw on (bei Fenster close) zu stellen.

Da mein Fenstersensor den Zustand nur im Reading alarm mit weiterem Text anzegt
AccessControl: Window/Door is closed, arg 0000
habe ich zur Vereinfachung ein userReadings mit Namen zustand angelegt welches nur "open" oder "close" anzeigt:
userReadings zustand {(split(/,|is /, ReadingsVal($name,"alarm","")))[1]}
Das Reading zustand wollte ich nun mittels eines Notify nutzen um das Thermostat auf off zu stellen wenn das Fenster offen ist und auf on wenn es wieder geschlossen wird.
Hierz habe ich eine IF ELSE im DEF des notifys angelegt wie es in der comandref beschrieben ist:
IF ([ZWave_SENSOR_NOTIFICATION_20:zustand] eq "open") (ZWave_THERMOSTAT_33 tmOff) ELSE (ZWave_THERMOSTAT_33 tmHeating)
leifer funktioniert das nicht ???
was geht ist:
ZWave_SENSOR_NOTIFICATION_20.zustand:.open set ZWave_THERMOSTAT_33 tmOff
aber dann müsste ich ein zweites notify für das einschalten des Thermostats verwenden :-\
Kann jemand weiterhelfen?
Titel: Antw:Noify mit IF ELSE
Beitrag von: Otto123 am 15 November 2018, 21:24:33
Hi,

und wenn Du das set einfach auch innerhalb Deiner Befehle im IF und ELSE verwendest?  ::)

IF ([ZWave_SENSOR_NOTIFICATION_20:zustand] eq "open") (set ZWave_THERMOSTAT_33 tmOff) ELSE (set ZWave_THERMOSTAT_33 tmHeating)

Gruß Otto
Titel: Antw:Noify mit IF ELSE
Beitrag von: harald654 am 15 November 2018, 21:38:50
Hallo Otto,

danke für die schnelle Antwort. Da ist mir ein Fehler unterlaufen beim kopieren ins Forum, natürlich muss das set dazu. Danke fürs korrigieren.
Mit set geht es aber leider auch nicht :'(

Im Eventmonitor wird folgendes angezeigt, wenn das Fenster geöffnet wird:
2018-11-15 21:32:03 ZWave ZWave_SENSOR_NOTIFICATION_20 alarm: AccessControl: Window/Door is open, arg 0000
2018-11-15 21:32:03 ZWave ZWave_SENSOR_NOTIFICATION_20 zustand: open
2018-11-15 21:32:03 ZWave ZWave_SENSOR_NOTIFICATION_20 alarm: AccessControl: Window/Door is open, arg 0000
2018-11-15 21:32:03 ZWave ZWave_SENSOR_NOTIFICATION_20 zustand: open
2018-11-15 21:32:03 ZWave ZWave_SENSOR_NOTIFICATION_20 alarm: AccessControl: Window/Door is open, arg 0000
2018-11-15 21:32:03 ZWave ZWave_SENSOR_NOTIFICATION_20 zustand: open


Ist vieleicht das mehrfachsenden des Fenstersensors ein Problem?
Titel: Antw:Noify mit IF ELSE
Beitrag von: Beta-User am 15 November 2018, 22:24:31
Habe den Eindruck, dass da Trigger und Ausführungsteil vermischt sind. Bitte gib mal beide Events für auf und zu und schau nochmal in das wiki zu notify, da ist näher erklärt, was ich meine.

Oder du zeigst uns ein list...

Dann könnte im Ausführungsteil $EVENT genutzt werden. Und ggf. die Zahl der Events reduziert, drei mal ist komisch. Attribut: event-on.... suchen und setzen.

Sicher, dass das userreading erforderlich ist? Evtl. macht sich stateFormat besser, aber aufhübschen würde ich zuletzt machen und lieber echte Events nutzen.
Titel: Antw:Noify mit IF ELSE
Beitrag von: Otto123 am 15 November 2018, 22:32:24
Naja, Dein notify triggert auf open, der ELSE Fall wird und kann also nie eintreten :)

Das wiederholte triggern kannst Du mit event-on-change-reading unterbinden.

Damit das Ratespiel nicht weitergeht, solltest Du exakte (und nicht manipulierte) listings von allen beteiligten Definitionen posten.

Dein notify sollte auf open und close triggern und dann entsprechend den IF und ELSE Fall erreichen.

ZWave_SENSOR_NOTIFICATION_20.zustand:.(open|close)

Gruß Otto
Titel: Antw:Noify mit IF ELSE
Beitrag von: harald654 am 16 November 2018, 00:00:34
Ahhhh danke euch beiden,
mit:
ZWave_SENSOR_NOTIFICATION_20.zustand:.(open|closed) IF ([ZWave_SENSOR_NOTIFICATION_20:zustand] eq "open") (set ZWave_THERMOSTAT_33 tmOff) ELSE (set ZWave_THERMOSTAT_33 tmHeating)
geht es jetzt :)

Was ich aber nicht ganz verstehe, wenn ich dich richtig verstanden habe hätte:
IF ([ZWave_SENSOR_NOTIFICATION_20:zustand] eq "open") (set ZWave_THERMOSTAT_33 tmOff)
zumdest das Thermostat auf off stellen müssen?

Ihr habt mir ja beide empfohlen lieder das richtige readings zu triggen, sprich alarm.
habt ihr das so gemeint:
ZWave_SENSOR_NOTIFICATION_20.alarm:.AccessControl:.Window/Door.is.(open|closed).*  IF ([ZWave_SENSOR_NOTIFICATION_20:alarm] eq "AccessControl: Window/Door is open.*") (set ZWave_THERMOSTAT_33 tmOff) ELSE (set ZWave_THERMOSTAT_33 tmHeating)
bzw. abgekürzt:
ZWave_SENSOR_NOTIFICATION_20.alarm:.*(open|closed).*  IF ([ZWave_SENSOR_NOTIFICATION_20:alarm] eq ".*open.*") (set ZWave_THERMOSTAT_33 tmOff) ELSE (set ZWave_THERMOSTAT_33 tmHeating)

hier noch die List des Fenstersensors:
Internals:
   DEF        f7160c53 20
   IODev      ZWDongle_0
   LASTInputDev ZWDongle_0
   MSGCNT     489
   NAME       ZWave_SENSOR_NOTIFICATION_20
   NR         75
   STATE      closed
   TYPE       ZWave
   ZWDongle_0_MSGCNT 489
   ZWDongle_0_RAWMSG 000410140a7105000000ff06170000b500
   ZWDongle_0_TIME 2018-11-15 23:26:18
   ZWaveSubDevice no
   homeId     f7160c53
   isWakeUp   1
   lastMsgSent 1542311096.61041
   nodeIdHex  14
   READINGS:
     2018-11-10 14:54:21   CMD             ZW_APPLICATION_UPDATE
     2018-11-12 13:52:47   SEND_DATA       failed:00
     2018-11-11 18:31:38   UNPARSED        ALARM 0a7101000000ff06120000
     2018-11-15 23:26:18   alarm           AccessControl: Window/Door is closed, arg 0000
     2018-11-12 13:52:49   configLedIndication On
     2018-10-08 09:40:10   model           Sensative Strips
     2018-10-08 09:40:10   modelConfig     sensative/strips.xml
     2018-10-08 09:40:10   modelId         019a-0003-0003
     2018-11-12 13:52:50   neighborUpdate  failed
     2018-11-11 18:09:29   timeToAck       0.032
     2018-11-15 20:45:05   transmit        NO_ACK
     2018-11-15 20:44:55   wakeup          notification
     2018-11-15 23:26:18   zustand         closed
Attributes:
   IODev      ZWDongle_0
   alarmDevice Sensor
   alarmSettings alarm0,|STATE:.close|xxx|off
   alias      Sens_SchlZmrFen
   classes    ZWAVEPLUS_INFO VERSION MANUFACTURER_SPECIFIC SENSOR_BINARY CONFIGURATION ALARM DEVICE_RESET_LOCALLY ASSOCIATION ASSOCIATION_GRP_INFO BATTERY WAKE_UP POWERLEVEL
   room       Alarmanlage,ZWave
   stateFormat {(split(/,|is /, ReadingsVal($name,"alarm","")))[1]}
   userReadings zustand {(split(/,|is /, ReadingsVal($name,"alarm","")))[1]}


PS: das mit dem mehrfachsenden des Festersensors liegt warscheinlich an z-Wave, wird der Empfang nicht bestätigt wird laut Wiki bis zu drei mal die Botschaft wiederholt (muss ich mal schauen warum nicht bestätigt wird, aber das gehört erstmal nicht hier her ;))
Titel: Antw:Noify mit IF ELSE
Beitrag von: Beta-User am 16 November 2018, 06:44:54
Ja, das mit der 2. Variante war gemeint gewesen.

Du kannst auch mit $EVENT arbeiten, statt dem "set magic" (ersetzt das mit den eckigen Klammern).

Zuletzt würde ich noch empfehlen, gleich nur mit Perl zu arbeiten. Jedenfalls nach meiner eigenen Erfahrung ist das zwar im ersten Moment gefühlt viel umständlicher, aber man gewöhnt sich schnell dran und ist auf die Dauer viel flexibler. Hier könnte man z.B. mit einer "enthält"-Abfrage (=~/open/) auf $EVENT arbeiten.

Just my2ct.
Titel: Antw:Noify mit IF ELSE
Beitrag von: Otto123 am 16 November 2018, 09:11:05
Moin,

ZitatWas ich aber nicht ganz verstehe, wenn ich dich richtig verstanden habe hätte:
Code: [Auswählen]
IF ([ZWave_SENSOR_NOTIFICATION_20:zustand] eq "open") (set ZWave_THERMOSTAT_33 tmOff)
zumdest das Thermostat auf off stellen müssen?
Ja das hätte passieren müssen. Der Zweig war ja da funktional.

Du solltes auf alle Fälle noch dies setzen:
attr ZWave_SENSOR_NOTIFICATION_20 event-on-change-reading .*
Zitatevent-on-change-reading
Dieses Attribut enthält eine durch Kommata getrennte Liste von "readings". Wenn gesetzt, erzeugen nur Veränderungen der gelisteten "readings" ein Ereignis. Wenn die aktualiserten Werte der gelisteten "readings" identisch sind, wird kein Ereignis generiert.

Sonst produzierst Du unnötig Funkverkehr.

Gruß Otto

Gruß Otto