Hallo Leute, habe schon einige Zeit in Fehlersuche und Studium Commandref investiert (falls jemand schon beim Titel genervt ist) - Forenanfragen stelle
ich immer gaaanz am Schluß!
Hintergrund: Ein umgebauter LaCrosse Sensor (LaCrosse_0C) reagiert auf Wasseranstieg bzw. Wasserkontakt im Grundrohr (funktioniert soweit siehe
Log) und soll daraufhin über ein Notify (ndWS_GR) einen Dummy (dWS_GR) setzen.
Problem: Dummy wird nicht gesetzt - siehe Screenshots. Ich gehe davon aus das das Notify schon nicht funktioniert (manuelles Triggern des Dummys
funktioniert).
Welche Abschnitte der Commandref hast du denn studiert?
Grüße
Igami
Du benutzt in deiner IF Abfrage die gleiche regexp wie für das notify, anstatt das Reading auszulesen. Das erste Beispiel in der Commandref zu IF ist ziemlich genau das was du vor hast
Edit: Die regexp von deinem notify löst auch nicht aus, da fehlt das .*.
wie soll denn dein notify matchen wenn du dort temperature angibst aber dein device T: (vermutlich state) events produziert.
gruss
andre
du würdest jedem helfen wenn du keine screenshots sondern text in einem code block postest.
Notify / Dummy / IF und alles was ich unter Google gefunden habe (was leider nicht immer zielführend ist.)
Habe den Eventlog - Screenshot durch das Log des Sensors ersetzt -> auf welche Meldungen reagiert den das Notify grundsätzlich?
(Meldungen im Eventlog unterscheiden sich von denen im Log)
Log - 2015-09-19_14:25:59 LaCrosse_0C temperature: 31.9
Eventlog - 2015-09-19 14:43:08.982 LaCrosse LaCrosse_0C T: 31.8
Wieso sind dann diese Ausdrücke (in diesem Fall temperature) im RegExp Wizard auswählbar (wäre das dann nicht sinnlos?)
Ist den die DEF grundsätzlich richtig?
LaCrosse_0C:temperature IF ([LaCrosse_0C:temperature:.*] > 28.0) (set dWS_GR Alarm)) ELSE (set dWS_GR OK)
bzw.
define ndWS_GR notify LaCrosse_0C:temperature IF ([LaCrosse_0C:temperature:.*] > 28.0) (set dWS_GR Alarm)) ELSE (set dWS_GR OK)
Gäbe es einen Unterschied zwischen
LaCrosse_0C:temperature IF ([LaCrosse_0C:temperature:.*] > 28.0) (set dWS_GR Alarm)) ELSE (set dWS_GR OK)
oder
LaCrosse_0C:temperature IF ([LaCrosse_0C:temperature] > 28.0) (set dWS_GR Alarm)) ELSE (set dWS_GR OK)
oder
LaCrosse_0C:temperature:.* IF ([LaCrosse_0C:temperature:.*] > 28.0) (set dWS_GR Alarm)) ELSE (set dWS_GR OK)
Hier nochmal der Code von Notify / Dummy:
define ndWS_GR notify LaCrosse_0C:temperature IF ([LaCrosse_0C:temperature:.*] > 28.0) (set dWS_GR Alarm)) ELSE (set dWS_GR OK)
define dWS_GR dummy
attr dWS_GR alias Wasserstand Grundrohr
attr dWS_GR devStateIcon Alarm:r_c undefined:r_ho OK:r_o
attr dWS_GR room Alarm
du verwendest temperature. im editor sehr ich temperature:.* was dann auch richtig wäre.
das heißt, meine Konfiguration wäre soweit eigentlich korrekt ?
das heißt dein notify ist falsch
bin grad verwirrt. das heißt dann?
LaCrosse_0C:temperature:.* IF ([LaCrosse_0C:temperature:.*] > 28.0) (set dWS_GR Alarm)) ELSE (set dWS_GR OK)
wäre dann korrekt?
Im Lacrosse Modul gibt es kein GET - gibt einen universellen Befehl um den (letzten) State oder das (letzte) Reading eines Devices über die
Kommandobox (in Echtzeit) abzufragen (ohne sich durchzuklicken)?
Werden die Werte die ein Sensor zwischen event-on-change-reading bzw. event-on-update-reading (jeweils ohne Änderung) liefert von FHEM
ignoriert (oder nur nicht geloggt)?
event-min-interval state:600,battery:3600,temperature:300,humidity:300
event-on-change-reading state
event-on-update-reading .*
wenn ich
LaCrosse_0C:temperature IF ([LaCrosse_0C:temperature:.*] > 28.0) (set dWS_GR Alarm)) ELSE (set dWS_GR OK)
ändere in
LaCrosse_0C:temperature:.* IF ([LaCrosse_0C:temperature:.*] > 28.0) (set dWS_GR Alarm)) ELSE (set dWS_GR OK)
erhalte ich als Ergebnis im Log
2015.09.19 16:04:16.579 3: ndWS_GR return value: IF: unknown expression format: .*
Hi,
vielleicht ist es auch nur die Anzahl der Klammern. Ich zähle eine ")" mehr als "(".
...aber meine Augen sind auch nicht mehr das, was sie mal waren.
Gruß,
Thorsten
notify wertet das event aus, daher muss hinter das temperature ein .* weil das event ja noch weiter geht. mit [<device>:<reading>] erhälst du den Wert des Readings hier ist das .* falsch, ist auch das, was das IF als Fehler ausgibt.
und nun nochmal als ganzer Satz! :D
define ndWS_GR notify LaCrosse_0C:temperature:.* IF ([LaCrosse_0C:temperature:.*] > 28.0) (set dWS_GR Alarm) ELSE (set dWS_GR OK)
richtig oder falsch? (und wenn falsch, wie richtig?)
habe deine Antwort nochmal langsam durchgelesen...
als genau andersrum, richtig?
define ndWS_GR notify LaCrosse_0C:temperature:.* IF ([LaCrosse_0C:temperature] > 28.0) (set dWS_GR Alarm) ELSE (set dWS_GR OK)
Ich flipp aus - es funzt (wenn auch nur mit Browser Reload) DANKE. ;D
eine Frage hätte ich da noch...
ich habe nach dem gleichen Schema eine Batteriewarnung erstellt (für alle batteriebetriebenen Sensoren / Aktoren). Dabei habe ich eine Problem
mit den Wildcards. Geht das eventuell mit IF gar nicht oder wie muß das aussehen?
define ndBattery_Alarm notify .*:[Bb]attery.* IF ([.*:[Bb]attery] = "low") (set dBattery_Alarm low)
2015.09.20 11:31:40.196 3: ndBattery_Alarm return value: IF: unknown Device: .*
2015.09.20 11:31:40.192 4: ndBattery_Alarm exec IF ([.*:[Bb]attery] = "low") (set dBattery_Alarm low)
Edit: Habe das [Bb] entfernt, da meine Sensoren sowieso nur battery verwenden. Löst das Problem allerdings nicht.
Gibt es an der Stelle einen Platzhalter für das Device, um nicht für jedes Device eine notify zu definieren, das denselben dummy setzen soll
(egal welcher Sensor battery low sendet)?
noch was zum Wasserstandsmelder mit umgebauten Lacrosse (Technoline) Sensoren.
das (wirklich) funktionierende notify sieht dann so aus (das sich value und reading namentlich unterscheiden (liegt das am LaCrosse Modul?)).
define ndWS_GR notify LaCrosse_0C:T:.* IF ([LaCrosse_0C:temperature] > 28.0) (set dWS_GR Alarm) ELSE (set dWS_GR OK)
oder DEF
LaCrosse_0C:T:.* IF ([LaCrosse_0C:temperature] > 28.0) (set dWS_GR Alarm) ELSE (set dWS_GR OK)
Zitat von: hmtec99 am 20 September 2015, 11:39:23
eine Frage hätte ich da noch...
ich habe nach dem gleichen Schema eine Batteriewarnung erstellt (für alle batteriebetriebenen Sensoren / Aktoren). Dabei habe ich eine Problem
mit den Wildcards. Geht das eventuell mit IF gar nicht oder wie muß das aussehen?
define ndBattery_Alarm notify .*:[Bb]attery.* IF ([.*:[Bb]attery] = "low") (set dBattery_Alarm low)
2015.09.20 11:31:40.196 3: ndBattery_Alarm return value: IF: unknown Device: .*
2015.09.20 11:31:40.192 4: ndBattery_Alarm exec IF ([.*:[Bb]attery] = "low") (set dBattery_Alarm low)
Edit: Habe das [Bb] entfernt, da meine Sensoren sowieso nur battery verwenden. Löst das Problem allerdings nicht.
Gibt es an der Stelle einen Platzhalter für das Device, um nicht für jedes Device eine notify zu definieren, das denselben dummy setzen soll
(egal welcher Sensor battery low sendet)?
Schau mal im Wiki:http://www.fhemwiki.de/wiki/Batterieüberwachung (http://www.fhemwiki.de/wiki/Batterie%C3%BCberwachung)
define n_batt_chk notify .*:battery.* { if ($EVENT !~ m/ok/) usw. (was bedeutet eigenlich m/ ?)
Habe ich bereits gelesen, die Frage ist ob das auch mit IF (fhem-Befehl) funktioniert.
define ndBattery_Alarm notify .*:battery.* IF ([.*:battery] = "low") (set dBattery_Alarm low)
Wie müßte der Platzhalter aussehen bzw. ist es überhaupt möglich an dieser Stelle einen Platzhalter zu definieren?
EDIT: Habe das ganze dahingehend geändert:
.*:battery:.* IF ([$NAME:battery] eq "low") (set dBattery_Alarm low)
damit scheint die Condition richtig zu sein, allerdings wird der Dummy nun immer gesetzt (auch bei z.B. trigger DeviceXY battery:OK) ?? :P
Zitat von: hmtec99 am 20 September 2015, 13:29:31
.*:battery:.* IF ([$NAME:battery] eq "low") (set dBattery_Alarm low)
Warum erfasst du nicht gleich mit dem Trigger deine
low Events:
.*:battery:.low set dBattery_Alarm low