ich bin etwas am rätseln mit dem setreading auf ein mqtt2 device
Folgenes szenario: ein Temperaturwert soll nur geändert werden wenn er einen bestimmten wert hat.
Im Notify steht folgendes:
G32_Grill.ExternSensor.* { if ($EVTPART1 eq "1500" ) {fhem("setreading ".$NAME." ".$EVTPART0." n/a")}}
G32_Grill ist ein mqtt2 device. Es meldet mir mit ExternSensor1-4 werte, und nur wenn 1500 drin steht soll das Reading auf n/a gesetzt werden.
Es Triggert auch wunderbar. Aber der Ausführungsteil schlägt fehl.
2024.02.14 18:31:28 5: Triggering 1500_check
2024.02.14 18:31:28 4: 1500_check exec { if ($EVTPART1 eq "1500" ) {fhem("setreading ".$NAME." ".$EVTPART0." n/a")}}
2024.02.14 18:31:28 3: 1500_check return value: Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.
Also mal die Variablen durch feste Namen ersetzt setreading G32_Grill ExternSensor1 n/a
... selber Fehler
Mache ich das jedoch auf ein hm Device, funktioniert es.
Setzen über cmd line geht auch wunderbar.
Der Gedanke das aufs selbe Device Probleme gibt, hatte ich auch mit einen sleep ebenso ohne erfolg getestet.
Meine Vermutung ist, es hat etwas damit zu tun das es ein MQTT2 device ist.
mit userreading hatte ich es auch probiert, und funktioniert ebenfalls nicht.
list vom mqtt2 device
defmod G32_Grill MQTT2_DEVICE grill_78e36d177d5c
attr G32_Grill event-on-change-reading .*
attr G32_Grill readingList grill_78e36d177d5c:G32_Grill/debug:.* debug\
grill_78e36d177d5c:G32_Grill/sensor/bt_signalst__rke/.* BluetoothSignal\
grill_78e36d177d5c:G32_Grill/sensor/g32_licht/.* Licht\
grill_78e36d177d5c:G32_Grill/sensor/g32_haube/.* Haube\
grill_78e36d177d5c:G32_Grill/sensor/g32_sensor_1/.* Zone1\
grill_78e36d177d5c:G32_Grill/sensor/g32_sensor_2/.* Zone2\
grill_78e36d177d5c:G32_Grill/sensor/g32_sensor_3/.* Zone3\
grill_78e36d177d5c:G32_Grill/sensor/g32_sensor_4/.* Zone4\
grill_78e36d177d5c:G32_Grill/sensor/g32_external_sensor_1/.* ExternSensor1\
grill_78e36d177d5c:G32_Grill/sensor/g32_external_sensor_2/.* ExternSensor2\
grill_78e36d177d5c:G32_Grill/sensor/g32_external_sensor_3/.* ExternSensor3\
grill_78e36d177d5c:G32_Grill/sensor/g32_external_sensor_4/.* ExternSensor4\
grill_78e36d177d5c:G32_Grill/sensor/g32_gasbuddy_f__llstand/.* Gasbuddy\
Hmm, da es mit festen Werten auch nicht klappt, scheint es in der Tat etwas mit der Eventverarbeitung (etvl. der Reihenfolge, durch den Namen vorgegeben) zu tun zu haben.
Jedenfalls könnte man, wenn man schon doppelte Anfühungszeichen verwendet , auch die Interpolation lesbarer machen und den Doppelpunkt entfernen:
G32_Grill.ExternSensor.* { if ($EVTPART1 eq "1500" ) {chop($EVTPART0); fhem("setreading $NAME $EVTPART0 n/a")}}
Da das hier aber ein MQTT2_DEVICE ist, kannst du das auch per Perl-Anweisung in der readingList erledigen lassen:
G32_Grill/sensor/g32_external_sensor_1/.* {if ($EVENT eq '1500') return {ExternSensor1=>'n/a'}; return {ExternSensor1=>$EVENT}}
Ok Danke.
Ja das mit den Anführungszeichen ;-) man probiert so vieles und am ende bleibt sowas dann übrig :-)
Aber mit dem Einbauen im readingList ist eine gute Idee und sorgt für weniger last
Aber da stimmt mit der Syntax noch was nicht: syntax error at (eval 347575) line 1, near ") return"
syntax error at (eval 347575) line 1, near "}}"
Mist, sowas sollte man nicht aus dem Kopf zusammenschustern...
So könnte es klappen (immer noch ungetestet):
G32_Grill/sensor/g32_external_sensor_1/.* {if ($EVENT eq '1500') {return {ExternSensor1=>'n/a'}}; return {ExternSensor1=>$EVENT}}
Super Danke, das funktioniert perfekt. Readinglist ist die beste Lösung.