setList - mehrere Werte mit Komma?

Begonnen von Motivierte linke Hände, 03 März 2024, 14:10:05

Vorheriges Thema - Nächstes Thema

Motivierte linke Hände

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!
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

TomLee

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

Motivierte linke Hände

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.
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#4
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}) }

Motivierte linke Hände

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!  :)
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

betateilchen

#6
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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#7
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}

TomLee

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.

Motivierte linke Hände

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.
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

TomLee

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}

Motivierte linke Hände

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.
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

TomLee

#12
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 ?

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!