Hi, die Syntax von setList ist ja bekanntermaßen:
attr <device> setList <Reading1>:⟨<Modifier1>,⟩<Value1>,<Value2>,<...> <Reading2>:⟨<Modifier2>,⟩<Value1>,<Value2>,<...> ...
Was mache ich denn, wenn ich Werte mit Komma übergeben muss? (Ich habe z.B. ein MQTT-Thermostat eingebunden, dass die Temperatur als Komma-Wert haben möchte - bei Punkt gibt es einen Fehler). Das Escapen des Kommas mit ; oder \ hat nicht geklappt.
Gibt es hier einen Weg, ohne einen Dummy oder etwas Ähnliches dazwischenhängen zu müssen und Punkte zu Kommas zu konvertieren?
Danke!
ZitatWas mache ich denn, wenn ich Werte mit Komma übergeben muss? (Ich habe z.B. ein MQTT-Thermostat eingebunden, dass die Temperatur als Komma-Wert haben möchte - bei Punkt gibt es einen Fehler).
Hallo,
erster Gedanke: "Vorne" ganz normal mit Punkt übergeben und "hinten" auf die Perl-Ebene wechseln um in dem übergebenen Wert vor dem senden den Punkt durch Komma zu ersetzen ?
Thomas
Gerne - wie? ;D
Mein Versuch:
setList desired-temp:5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0,28.5,29.0,29.5,30.0 $DEVICETOPIC/set {"occupied_heating_setpoint": $EVTPART1 =~ tr/\./,/ }
führt zu nichts - keiner Fehlermeldung, aber auch keiner Aktion.
Zitat von: Motivierte linke Hände am 03 März 2024, 14:10:05Ich habe z.B. ein MQTT-Thermostat eingebunden, dass die Temperatur als Komma-Wert haben möchte - bei Punkt gibt es einen Fehler
Wie wäre es mit einem kompletten list des devices, um das es geht?
ZitatGerne - wie? ;D
Müsste so tun, ungetestet:
desired-temp:selectnumbers,5.0,0.5,30,1,lin {$EVTPART1 =~ s/\./,/g;return qq($DEVICETOPIC/set {"occupied_heating_setpoint":$EVTPART1}) }
Danke. Da passiert hier dasselbe wie bei meinem Versuch: nichts
D.h. ich stelle im WebIf set auf "desired-temp", wähle eine Temperatur aus und klicke auf "set". Kein Fehler, keine Meldung im Log, kein Befehl per MQTT abgesetzt.
Aber die kurze Schreibweise für die Temperaturen ist nett! :)
Dann machst Du aber irgendwas anderes falsch.
Nachdem TomLee den doppelten Doppelpunkt korrigiert hat, funktioniert das Beispiel bei mir fast problemlos.
defmod d2 MQTT2_DEVICE
attr d2 setList desired-temp:selectnumbers,5.0,0.5,30,1,lin {$EVTPART1 =~ s/\./,/g;;return qq($DEVICETOPIC/set {"occupied_heating_setpoint":$EVTPART1}) }
liefert im Log:
2024.03.03 14:46:21 3: MQTT2_DEVICE set d2 desired-temp 5.0
Warum funktioniert es nur fast? Den veränderten Wert mit dem Komma im Wert muss man gemäß json-Spezifikation als String übergeben, weil es kein numerischer Wert mehr ist.
Zeig mal deine Definition.
Habs bei mir jetzt doch nachvollzogen und da geht es zumindest wie gewünscht "raus", schau:
Testdevice:
defmod MQTT2_mymqtt_0xFF41 MQTT2_DEVICE mymqtt_127271749911043
attr MQTT2_mymqtt_0xFF41 IODev MQTT2_Server
attr MQTT2_mymqtt_0xFF41 room MQTT2_DEVICE
attr MQTT2_mymqtt_0xFF41 setList desired-temp:selectnumbers,5.0,0.5,30,1,lin {$EVTPART1 =~ s/\./,/g;;return qq($DEVICETOPIC/set {"occupied_heating_setpoint":$EVTPART1}) }
setstate MQTT2_mymqtt_0xFF41 desired-temp
setstate MQTT2_mymqtt_0xFF41 2024-02-02 20:21:38 IODev MQTT2_Server
setstate MQTT2_mymqtt_0xFF41 2024-03-03 14:51:22 state desired-temp
Trafficmonitor:
14:51:22.762 SENT MQTT2_mymqtt_0xFF41/set {"occupied_heating_setpoint":5,0}
ZitatAber die kurze Schreibweise für die Temperaturen ist nett!
Mal nur so am Rande (falls du Alexa nutzt), hab mich bezüglich der Sprachsteuerung eines Thermostaten mit Alexa vor kurzem mal etwas genauer beschäftigt. Ich hab irgendwas in Erinnerung das der setter desired-temp per Sprache nicht klappt, wenn man die "Kurzschreibweise" verwendet.
Danke für die zahlreiche Hilfe. Ich habe mal die Fehler beseitigt, die vor dem Rechner lagen oder in den Fingern lagen und ich gefunden habe. Befehle gehen nun raus, findet man auch, wenn man ins richtige Logfile schaut.
Mosquitto habe ich gesagt, er soll alles mitloggen. Ich habe hier zwei baugleiche Thermostatköpfe. Den einen (Hzg_OG1) habe ich angepasst wie von TomLee vorgeschlagen. Der andere (Hzg_OG2) übermittelt noch "Punkt-Temperaturen".
Mosquitto schreibt mit:
Hzg_OG1:
{"occupied_heating_setpoint":"9,5"}
{"level":"error","message":"Publish 'set' 'occupied_heating_setpoint' to 'Hzg_OG1' failed: 'Error: 'occupied_heating_setpoint' is not a number, got string (9,5)'"}
Hzg_OG2:
{"level":"error","message":"Publish 'set' 'occupied_heating_setpoint' to 'Hzg_OG2' failed: 'Error: 'occupied_heating_setpoint' is not a number, got string (12.5)'"}
Fazit: Danke, der Tipp hat funktioniert, es werden nun Komma-Werte übermittelt. Unglücklicherweise löst das das Problem nicht, weil was ganz anderes auch noch kaputt ist. :)
Ich hänge jetzt einfach mal hier ein List des Thermostatkopfes an, mache dafür aber auch gerne ein neues Thema auf:
Internals:
CID zigbee_Hzg_OG1
DEF zigbee_Hzg_OG1
FUUID 63f8dc53-f55f-e1ef-9e26-ecd13258fac6d496
IODev myBroker
LASTInputDev myBroker
MSGCNT 155
NAME Hzg_OG_rechts
NR 1024
STATE 18.2°C
TYPE MQTT2_DEVICE
eventCount 52
myBroker_MSGCNT 155
myBroker_TIME 2024-03-03 15:21:16
JSONMAP:
child_lock btnLock
local_temperature temperature
local_temperature_calibration temp-calibration
occupied_heating_setpoint desired-temp
pi_heating_demand valvePos
system_mode mode
READINGS:
2024-03-03 03:02:50 IODev myBroker
2023-03-04 02:00:32 associatedWith MQTT2_zigbee_bridge
2023-03-01 22:30:45 attrTemplateVersion 20230224
2024-03-03 03:02:57 availability_state online
2024-03-03 15:21:16 battery 58
2024-03-03 15:21:16 boost OFF
2024-03-03 15:21:16 btnLock UNLOCK
2024-03-03 15:21:16 desired-temp 10
2024-03-03 15:21:16 display_brightness 7
2024-03-03 15:21:16 display_ontime 10
2024-03-03 15:21:16 display_orientation normal
2024-03-03 15:21:16 displayed_temperature measured
2024-03-03 15:21:16 linkquality 43
2024-03-03 15:21:16 mode heat
2024-03-03 15:21:16 remote_temperature 0
2024-03-03 15:21:16 running_state idle
2024-03-03 15:21:16 setpoint_change_source externally
2024-03-03 15:14:46 state desired-temp
2024-03-03 15:21:16 temp-calibration -0.5
2024-03-03 15:21:16 temperature 17.7
2024-03-03 15:21:16 update_installed_version 889787668
2024-03-03 15:21:16 update_latest_version 889787668
2023-12-29 22:08:32 update_progress 100
2023-12-29 22:08:32 update_remaining 23
2024-03-03 15:21:16 update_state idle
2024-03-03 15:21:16 valvePos 0
2024-03-03 15:21:16 valve_adapt_process false
2024-03-03 15:21:16 valve_adapt_status success
2024-03-03 15:21:16 window_open OFF
Attributes:
devStateIcon LOCKED:secur_lock:btnLock+UNLOCK UNLOCKED:secur_open:btnLock+LOCK
devicetopic zigbee2mqtt/Hzg_OG1
event-on-change-reading battery,valvePos,temperature,desired-temp
fp_fp_Grundriss_OG 378,450,5,Hzg_OG_rechts,
genericDeviceType thermostat
jsonMap occupied_heating_setpoint:desired-temp local_temperature:temperature local_temperature_calibration:temp-calibration system_mode:mode pi_heating_demand:valvePos child_lock:btnLock
model zigbee2mqtt_bosch_radiator_thermostat_ii
readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
zigbee2mqtt/Hzg_OG1/availability:.* { json2nameValue($EVENT, 'availability_', $JSONMAP) }
room Cfg_Heizung,OG
setList desired-temp:selectnumbers,5.0,0.5,30,1,lin {$EVTPART1 =~ s/\./,/g;;return qq($DEVICETOPIC/set {"occupied_heating_setpoint":"$EVTPART1"}) }
temp-calibration:slider,-5.0,0.5,5.0,1 $DEVICETOPIC/set {"local_temperature_calibration": "$EVTPART1"}
btnLock:LOCK,UNLOCK $DEVICETOPIC/set {"child_lock": "$EVTPART1"}
boost:ON,OFF $DEVICETOPIC/set {"boost": "$EVTPART1"}
mode:heat,auto,off $DEVICETOPIC/set {"system_mode": "$EVTPART1"}
display_orientation:normal,flipped $DEVICETOPIC/set {"display_orientation": "$EVTPART1"}
display_ontime:slider,5,1,30,1 $DEVICETOPIC/set {"display_ontime": "$EVTPART1"}
display_brightness:slider,0,1,10,1 $DEVICETOPIC/set {"display_brightness": "$EVTPART1"}
window_open:ON,OFF $DEVICETOPIC/set {"window_open": "$EVTPART1"}
stateFormat {ReadingsVal($name, "temperature", 0) - ReadingsVal($name, "temp-calibration", 0)."°C"}
webCmd desired-temp
Und: Nein, kein Alexa hier.
Vermutung liegt nahe das daß eigentliche Problem ist, das du alle numerischen Werte in Quotes (also als String) sendest.
Klappt das nicht einfach ohne die Hochkomma:
desired-temp:selectnumbers,5.0,0.5,30,1,lin $DEVICETOPIC/set {"occupied_heating_setpoint":$EVTPART1}
Ohne Anführungszeichen hatte ich vorher getestet, das gibt ganz komische Fehler:
Client (null) received PUBLISH (d0, q0, r0, m0, 'zigbee2mqtt/Hzg_OG1/set', ... (34 bytes))
{"occupied_heating_setpoint":12,0}
Client (null) received PUBLISH (d0, q0, r0, m0, 'zigbee2mqtt/bridge/logging', ... (65 bytes))
{"level":"error","message":"Invalid message 'null', skipping..."}
Nur der Vollständigkeit halber: Andere Werte kann ich setzen, z.B. window_open:
Client (null) received PUBLISH (d0, q0, r0, m0, 'zigbee2mqtt/Hzg_OG1/set', ... (22 bytes))
{"window_open": "OFF"}
Client (null) received PUBLISH (d0, q0, r0, m0, 'zigbee2mqtt/bridge/logging', ... (705 bytes))
{"level":"info","message":"MQTT publish: topic 'zigbee2mqtt/Hzg_OG1', payload '{\"battery\":58,\"boost\":\"OFF\",\"child_lock\":\"UNLOCK\",\"display_brightness\":7,\"display_ontime\":10,\"display_orientation\":\"normal\",\"displayed_temperature\":\"measured\",\"linkquality\":47,\"local_temperature\":17.7,\"local_temperature_calibration\":-0.5,\"occupied_heating_setpoint\":8,\"pi_heating_demand\":0,\"remote_temperature\":0,\"running_state\":\"idle\",\"setpoint_change_source\":\"externally\",\"system_mode\":\"heat\",\"update\":{\"installed_version\":889787668,\"latest_version\":889787668,\"state\":\"idle\"},\"valve_adapt_process\":false,\"valve_adapt_status\":\"success\",\"window_open\":\"OFF\"}'"}
Und ohne Komma und ohne Punkt geht es auch:
Client (null) received PUBLISH (d0, q0, r0, m0, 'zigbee2mqtt/Hzg_OG1/set', ... (32 bytes))
{"occupied_heating_setpoint":13}
Client (null) received PUBLISH (d0, q0, r0, m0, 'zigbee2mqtt/bridge/logging', ... (706 bytes))
{"level":"info","message":"MQTT publish: topic 'zigbee2mqtt/Hzg_OG1', payload '{\"battery\":58,\"boost\":\"OFF\",\"child_lock\":\"UNLOCK\",\"display_brightness\":7,\"display_ontime\":10,\"display_orientation\":\"normal\",\"displayed_temperature\":\"measured\",\"linkquality\":43,\"local_temperature\":17.7,\"local_temperature_calibration\":-0.5,\"occupied_heating_setpoint\":13,\"pi_heating_demand\":0,\"remote_temperature\":0,\"running_state\":\"idle\",\"setpoint_change_source\":\"externally\",\"system_mode\":\"heat\",\"update\":{\"installed_version\":889787668,\"latest_version\":889787668,\"state\":\"idle\"},\"valve_adapt_process\":false,\"valve_adapt_status\":\"success\",\"window_open\":\"OFF\"}'"}
In zigbee2mqtt kann man die Werte mit Komma einstellen und setzen. Aber ich glaube, ich gebe auf, das mit FHEM umsetzen zu wollen und bleibe da bei ganzen Gradzahlen.
Zitat von: Motivierte linke Hände am 03 März 2024, 15:54:57Ohne Anführungszeichen hatte ich vorher getestet, das gibt ganz komische Fehler:
Client (null) received PUBLISH (d0, q0, r0, m0, 'zigbee2mqtt/Hzg_OG1/set', ... (34 bytes))
{"occupied_heating_setpoint":12,0}
Client (null) received PUBLISH (d0, q0, r0, m0, 'zigbee2mqtt/bridge/logging', ... (65 bytes))
{"level":"error","message":"Invalid message 'null', skipping..."}
Hier wurde der Wert aber mit Komma gesendet.
Was steht im Log von z2m mit:
desired-temp:selectnumbers,5.0,0.5,30,1,lin $DEVICETOPIC/set {"occupied_heating_setpoint":$EVTPART1}
Und wenn du in z2m Werte mit Komma einstellst ?
Nochmal:
In json dürfen (genauer: müssen) nur numerische Werte - gemäß Schema-Definition bei floating values mit einem Dezimalpunkt - ohne Anführungszeichen übergeben werden, um als Zahl zu gelten.
Wird ein Komma als Dezimaltrenner in einem Zahlenwert per json übertragen, muss dieser Wert in Anführungszeichen stehen und wird als String betrachtet.