FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Motivierte linke Hände am 03 März 2024, 14:10:05

Titel: setList - mehrere Werte mit Komma?
Beitrag von: Motivierte linke Hände am 03 März 2024, 14:10:05
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!
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: TomLee am 03 März 2024, 14:22:03
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
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: Motivierte linke Hände am 03 März 2024, 14:33:31
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.
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: betateilchen am 03 März 2024, 14:35:21
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?
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: TomLee am 03 März 2024, 14:41:18
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}) }
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: Motivierte linke Hände am 03 März 2024, 14:46:03
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!  :)
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: betateilchen am 03 März 2024, 14:49:55
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.
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: TomLee am 03 März 2024, 14:52:48
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}
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: TomLee am 03 März 2024, 15:15:17
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.
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: Motivierte linke Hände am 03 März 2024, 15:24:19
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.
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: TomLee am 03 März 2024, 15:43:17
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}
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: Motivierte linke Hände am 03 März 2024, 15:54:57
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.
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: TomLee am 03 März 2024, 16:07:36
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 ?
Titel: Aw: setList - mehrere Werte mit Komma?
Beitrag von: betateilchen am 03 März 2024, 19:46:09
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.