Seite 1 von 3

MQTT send command

Verfasst: 22. Sep 2024 16:55
von mothabrain
Hallo zusammen,

ich schaffe es nicht, per MQTT commands an den MQTT Broker für folgendes Thing zu übermitteln:

Code: Alles auswählen

UID: mqtt:topic:d72ce1a115:37f1569f1b
label: mqtt.schlafzimmer.heater
thingTypeUID: mqtt:topic
configuration:
  payloadNotAvailable: offline
  payloadAvailable: online
  transformationPattern: JSONPATH:$.state
  availabilityTopic: zigbee2mqtt/schlafzimmer.heater/availability
bridgeUID: mqtt:broker:d72ce1a115
channels:
  - id: mqttschlafzimmerheaterlocal_temperature
    channelTypeUID: mqtt:number
    label: mqtt.schlafzimmer.heater.local_temperature
    description: ""
    configuration:
      unit: °C
      qos: 1
      stateTopic: zigbee2mqtt/schlafzimmer.heater
      transformationPattern: JSONPATH:$.local_temperature
  - id: mqttschlafzimmerheatercurrent_heating_setpoint
    channelTypeUID: mqtt:number
    label: mqtt.schlafzimmer.heater.current_heating_setpoint
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/schlafzimmer.heater/set
      postCommand: true
      min: 5
      qos: 2
      transformationPatternOut: JSONPATH:$.current_heating_setpoint
      max: 30
Ein Dimmer Item hab ich an den command channel gebunden, dem der Channel auch folgt.

Leider wird lt. MQTT Explorer nichts von OH gepostet.

Das Auslesen der "mqtt.schlafzimmer.heater.local_temperature" hingegen funktioniert.

Hatte jemand eine Idee oder ein Tipp, der die ganze Sache ans laufen bringen könnte?

Re: MQTT send command

Verfasst: 22. Sep 2024 18:07
von Harka
Moin,
schmeiß mal Dein "Outgoing Value Transformation" weg und trage bei "Outgoing Value Format" folgendes ein:

Code: Alles auswählen

{"occupied_heating_setpoint": %s}
Wenn damit zwar Daten im Explorer ankommen aber vom Thermostat die Annahme verweigert wird, kannst Du noch das leer lassen von "Unit Of Measurement" versuchen.

Re: MQTT send command

Verfasst: 22. Sep 2024 18:22
von mothabrain
Hi, danke für den Tipp. Leider hat es mit

Code: Alles auswählen

{"occupied_heating_setpoint": %s} 
und mit

Code: Alles auswählen

{"current_heating_setpoint": %s}
nicht funktioniert. der Explorer bekommt einfach kein Post von OH.

Re: MQTT send command

Verfasst: 22. Sep 2024 18:34
von Harka
Was für ein Gerät hast Du? Bei Modell anklicken oder hier raus fischen -> https://www.zigbee2mqtt.io/supported-devices/
Die Befehle können sich je nach Gerät auch unterscheiden. Z.B. current_heating_setpoint_auto

Re: MQTT send command

Verfasst: 22. Sep 2024 18:42
von mothabrain
Manufacturer
Siterwell
Model
GS361A-H04
Zigbee Model
TS0601
Zigbee Manufacturer
_TZE200_hhrtiq0x

per zigbee2mqtt kann ich das Teil steuern
per mqtt explorer mit publish auch

Re: MQTT send command

Verfasst: 22. Sep 2024 19:09
von Harka
https://www.zigbee2mqtt.io/devices/GS361A-H04.html
per mqtt explorer mit publish auch
Was genau schickst Du wie ab?
Bei einem unserer Thermostate habe ich gerade

Code: Alles auswählen

zigbee2mqtt/Aqara_Thermostat/set
{"occupied_heating_setpoint": 6}
erfolgreich getestet.

Code: Alles auswählen

{"current_heating_setpoint": %s}
wäre für Dein Thermostat in OH meine Erwartung gewesen. Wird die local_temperature von OH empfangen? Ich wundere mich etwas über den Punkt in schlafzimmer.heater, aber kein Plan ob das Auswirkungen hat.

Re: MQTT send command

Verfasst: 22. Sep 2024 19:21
von mothabrain
Ich publishe ins Topic
zigbee2mqtt/schlafzimmer.heater/set

als JSON value
{"current_heating_setpoint": %s}

erfolgreich. Der Thermostat reagiert dann sofort.

Die local_temperature wird von OH tadellos empfangen

Ich wundere mich etwas über den Punkt in schlafzimmer.heater, aber kein Plan ob das Auswirkungen hat.

Das ist nur mein internes Label.

Re: MQTT send command

Verfasst: 22. Sep 2024 19:30
von Harka
Mmmh, ein Versuch noch. Kommen Befehle von OH wirklich nicht an? Es geht nicht um den langen JSON-Wert sondern um set
Forum_09_Z2M.png
Wenn Doch aber mit Einheit -> siehe oben.

Re: MQTT send command

Verfasst: 22. Sep 2024 19:52
von udo1toni
Erst mal möchte ich empfehlen, den Broker und das Thing neu anzulegen, d72ce1a115 ist einfach keine sinnvolle ID. Eine sprechende ID wäre z.B. mosquitto, das ergäbe dann für den Broker mqtt:broker:mosquitto. Und für den Thermostaten ergäbe sich z.B. mqtt:topic:mosquitto:heater_1, was dann auch den Bezug einfacher macht.
Die ID der Channel sollte nach Möglichkeit keine Redundanz im Namen haben, z.B. mqttschlafzimmerheatercurrent_heating_setpoint ist ja nur der letzte Teil der UID, vollständig (mit der Thing UID zusammen) ergibt sich mqtt:topic:mosquitto:heater_1:mqttschlafzimmerheatercurrent_heating_setpoint, womit mqtt, heater und heating komplett unnötig sind. Ob schlafzimmer an dieser Stelle sinnvoll ist, ist auch nicht so ganz sicher (stell Dir vor, Du tauschst mal Module untereinander aus, z.B. weil Du ein moderneres Modul als Ersatz für ein defektes nachkaufst, dieses dann aber gerne in einem bestimmten Raum einsetzen willst). Du könntest aber den Raum zur Not auch in der Thing UID mit einbauen, also statt heater_1 z.B. heaterSchlaf. Das ergäbe dann z.B. mqtt:topic:mosquitto:heaterSchlaf:setpoint. Solange es sich nicht um ein Klimagerät handelt (dann wäre heater verkehrt...) erscheint es mir nicht sinnvoll, setpoint noch explizit mit current_heating aufzublähen. Was willst Du denn sonst an einem Thermostaten setzen?
qos solltest Du erst zum Schluss setzen, wenn überhaupt. Es kann gute Gründe geben, qos zu setzen, aber während der Entwicklung ist sowas irrelevant.
postCommand darf nicht auf true gesetzt werden! Es geht dabei darum, dass eine ankommende Nachricht von openHAB als Befehl gewertet wird. Stattdessen möchtest Du unbedingt :) dass auch die Solltemperatur in °C angezeigt wird, und noch viel wichtiger, openHAB sollte auch Änderungen außerhalb openHAB mitbekommen, Du brauchst also das stateTopic.
Sollte dann etwa so aussehen:

Code: Alles auswählen

UID: mqtt:topic:mosquitto:heaterSchlaf
label: Schlafzimmer Heizung
thingTypeUID: mqtt:topic
configuration:
  payloadNotAvailable: offline
  payloadAvailable: online
  transformationPattern: JSONPATH:$.state
  availabilityTopic: zigbee2mqtt/schlafzimmer.heater/availability
bridgeUID: mqtt:broker:mosquitto
channels:
  - id: local_temperature
    channelTypeUID: mqtt:number
    label: "Temperatur ist"
    description: ""
    configuration:
      unit: °C
      stateTopic: zigbee2mqtt/schlafzimmer.heater
      transformationPattern: JSONPATH:$.local_temperature
  - id: setpoint
    channelTypeUID: mqtt:number
    label: "Temperatur soll"
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/schlafzimmer.heater/set
      stateTopic: zigbee2mqtt/schlafzimmer.heater
      transformationPattern: JSONPATH:$.current_heating_setpoint
      unit: °C
      min: 5
      formatBeforePublish: "{\"current_heating_setpoint\": %s}"
      max: 30
Ungetestet, ich habe keine solchen ZigBee Komponenten.
Was die LAbel betrifft: Die sind dafür da, dass Du in der Oberfläche siehst, was der Channel/das Thing macht.
Und formatBeforePublish: Vermutlich musst Du die Anführungszeichen mittels \ escapen...

Re: MQTT send command

Verfasst: 22. Sep 2024 20:58
von mothabrain
Danke für die Hilfe.
Ich bin vor mehreren Jahren mit OH angefangen und habe meine Config nach bestem Wissen und Gewissen aufgebaut.
Jetzt muss ich wohl mal nachjustieren ;)

Ich habe alle Sachen wie oben beschrieben geändert und endlich kommt im Exlorer auch ein Wert an:

set = {"current_heating_setpoint": 30 °C}
Escapen musste ich im Format nicht.

Allerdings stört er sich noch an dem "°C".

Unit Of Measurement hatte ich daraufhin leer gelassen, aber dann geht wieder nichts durch.