[Gelöst] MQTT Topics für Thermostat angeben

Tuya basierte Hardware. Geflasht oder ungeflasht ...

Moderator: seppy

Antworten
Shibo83
Beiträge: 5
Registriert: 30. Dez 2022 20:20

[Gelöst] MQTT Topics für Thermostat angeben

Beitrag von Shibo83 »

Hallo zusammen,

ich bin dabei, ein Raumthermostat, das über die Tuya App gesteuert werden kann, in meine bestehende openHAB3 Umgebung einzubinden und habe dazu folgende Anleitung befolgt:

https://edv.mueggelland.de/tuya-geraete ... hne-cloud/

Bis zu dem Punkt, ab dem ich die Channel einbinden möchte, hat auch soweit alles funktioniert und ich kann die Kommunikation zwischen Tuya-MQTT und dem Thermostat debuggen.

Code: Alles auswählen

 tuya-mqtt:tuyapi Received JSON data from device bf8395a38b7589e4e7u3g3 -> {"1":true,"2":160,"3":173,"4":"cold","5":"0","8":false,"13":false,"16":0,"20":0,"21":30,"25":"1","26":false,"31":false,"41":"1","42":"3","101":false,"105":5,"107":35} +16ms
 
 tuya-mqtt:state MQTT DPS JSON: tuya/wz_thermostat/dps/state ->  {"1":true,"2":160,"3":173,"4":"cold","5":"0","8":false,"13":false,"16":0,"20":0,"21":30,"25":"1","26":false,"31":false,"41":"1","42":"3","101":false,"105":5,"107":35} +0ms
 tuya-mqtt:state MQTT DPS1: tuya/wz_thermostat/dps/1/state ->  true +3ms
 tuya-mqtt:state MQTT DPS2: tuya/wz_thermostat/dps/2/state ->  160+1ms
 tuya-mqtt:state MQTT DPS3: tuya/wz_thermostat/dps/3/state ->  173 +1ms
Wenn ich zu Testzwecken nun einen Channel mit dem Topic tuya/wz_thermostat/dps/3/state erstelle, zeigt mir das verlinkte Item einen Wert von 170 °C an. Dieser Wert ist konstant und entspricht scheinbar nur zufällig in etwa dem Wert im Debug. Ich nehme also an, mit der Konfiguration meines Channels stimmt grundsätzlich etwas nicht. Kann jemand anhand des obigen Debugs und des Screenshots sehen, wo mein Fehler bei der Konfiguration des Channels liegt?

Danke und viele Grüße
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Shibo83 am 2. Jan 2023 13:27, insgesamt 1-mal geändert.

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: MQTT Topics für Thermostat angeben

Beitrag von udo1toni »

Der Channel in openHAB ist der eine Endpunkt der Kommunikation, das Tuya Device ist das andere Ende. Die Kommunikation läuft so:
Tuya Device <-> tuya-mqtt <-> mqtt Broker <-> openHAB.
Zum Debuggen wäre also zunächst der mqtt Broker wichtig (also z.B. mit dem MQTT Explorer auf den Broker verbinden und die Topics dort inspizieren)

Der Wert wird vermutlich in zehntel Grad Celsius angegeben sein. Die Ist-Temperatur ist ein Wert, der nur ausgelesen wird. Entsprechend darf kein command Topic gesetzt werden. Screenshots sind eigentlich unnötig, interessanter wäre die Code-Ansicht des Things, als Code-Block eingefügt, denn es gibt noch weitere Parameter, die nicht angezeigt werden, aber im Code enthalten sind. Diese Parameter wären auch wichtig, um eventuelle Probleme zu beseitigen.
Wenn Du ein UoM Item mit einem Channel verknüpfst, der keine Unit liefert, ist das Verhalten einigermaßen ungewiss. Also zumindest vorläufig ein Number Item verwenden (statt Number:Temperature) oder die Unit korrekt setzen :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Shibo83
Beiträge: 5
Registriert: 30. Dez 2022 20:20

Re: MQTT Topics für Thermostat angeben

Beitrag von Shibo83 »

Das Command Topic habe ich rausgenommen und den Broker mit dem MQTT Explorer inspiziert. Das Ergebnis sieht praktisch so aus, wie ich es erwartet hatte. Hier die Code-Ansicht des Thermostats:

Code: Alles auswählen

UID: mqtt:topic:MQTT_Broker_Bridge:WZ_Thermostat
label: WZ Thermostat
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:MQTT_Broker_Bridge
channels:
  - id: WZ_Thermostat_Ist_Temp
    channelTypeUID: mqtt:number
    label: WZ Thermostat Ist Temp
    description: ""
    configuration:
      stateTopic: tuya/wz_thermostat/dps/3/state
Wenn der Broker die Daten wie im Screenshot korrekt empfängt, kann die Ursache zumindest nicht an der Konfiguration von Tuya-MQTT liegen, richtig? Mir würde schon ein Stein vom Herzen fallen, wenn ich das nicht mehr anrühren müsste.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Shibo83
Beiträge: 5
Registriert: 30. Dez 2022 20:20

Re: MQTT Topics für Thermostat angeben

Beitrag von Shibo83 »

Die Lösung war einfacher als gedacht. Bei der Erstellung des Items habe ich fälschlicherweise "Folgen" als Profil gewählt, da ich dachte, wenn der Wert automatisch aktualisiert werden soll, sei dies richtig.

Korrekt ist aber das Standardprofil. Der Wert wird nun wie gewünscht aktualisiert, sobald das Thermostat einen neuen Status schickt. Nun muss ich nur noch rausbekommen, wie ich den Wert in eine lesbare Temperatur konvertiere.

Vielen Dank für deine schnelle Hilfe!

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: MQTT Topics für Thermostat angeben

Beitrag von udo1toni »

Ja, das Konvertieren könnte recht einfach funktionieren, und zwar gibt es im Channel oben rechts ein Kästchen "Show advanced". Das hakst Du an.
Auf der neuen Seite bekommst Du wie weiteren möglichen Parameter der Channels. Unter Anderem gibt es da ein Feld Unit. Dort trägst Du ganz frech d°C ein. Das kleine d ist die Kennzeichnung für dezi, also zehntel.
Kann sein, dass es damit schon erledigt ist, sofern das Item auf Number:Temperature steht.

Sollte das nicht funktionieren, könntest Du noch spaßeshalber °dC ausprobieren, aber von der Namenslogik müsste eigentlich das erstgenannte korrekt sein. Der Punkt ist: Mit der Unit teilst Du dem System nicht nur mit, dass es sich um Grad Celsius handelt, sondern darüber hinaus auch noch die Wertigkeit.

Wenn alle Stricke reißen und es so leider nicht funktioniert, kannst Du immer noch mit der JS-Transformation arbeiten (die musst Du zunächst installieren). Die JS Transformation transformiert, wie der Name schon vermuten lässt, den gelieferten Wert mittels eines JavaScript Scripts. Das Script ist einfach genug:

Code: Alles auswählen

(function(value) {
  var returnValue = value / 10;
  return returnValue
})(input)
Wahlweise kannst Du das Script auch noch ausgefeilter gestalten, z.B. nach der Berechnung auf eine Nachkommastelle kürzen. Allerdings speichert openHAB Number Werte ohnehin als Float, so dass Nachkommastellen fast zwangsläufig verhunzt werden.

Das JS-Script musst Du in der Dateistruktur von openHAB ablegen, und zwar im Ordner $OPENHAB_CONF/transform/ in einer Datei, deren Name mit .js endet, z.B. divideby10.js. Im Channel gibst Du dann als transformationPattern (auch unter show advanced...) einfach JS:divideby10.js an, also der Name der zu nutzenden Transformation, gefolgt von einem Doppelpunkt, gefolgt vom zu übergebenden Parameter. Der Wert als solches wird automatisch übertragen und muss nicht extra mit angegeben werden.

Aber wie gesagt, probiere ruhig erst mal die Variante mit d°C oder °dC aus, theoretisch sollte das funktionieren.

Um das noch am Rande zu erwähnen, weil das Teilen durch zehn nun nicht die große Herausforderung darstellt... Du könntest auch d°F angeben, dann würde der Wert als zehntel Grad Fahrenheit verwendet. Das Item vom Typ Number:Temperature sollte aber (weil das System auf metrisch konfiguriert ist) weiterhin °C anzeigen. Und Du könntest natürlich die Temperatur auch in Kelvin anzeigen lassen, indem Du als Display Pattern K angibst - dann kommen halt 273,15 zur Temperatur in °C hinzu. Das funktioniert auch mit anderen Maßeinheiten, schau dazu bei Interesse in der offiziellen Doku: https://www.openhab.org/docs/concepts/u ... enting-uom das ist ein extrem mächtiges Werkzeug, wenn man um dessen Existenz weiß... :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Shibo83
Beiträge: 5
Registriert: 30. Dez 2022 20:20

Re: MQTT Topics für Thermostat angeben

Beitrag von Shibo83 »

Danke für den Tipp, dass es einfach über die Angabe der Unit gesteuert werden kann. Ich war schon der Ansicht, das müsse über die Incoming Value Transformation gelöst werden.

Allerdings habe ich nun ein komisches Anzeigeverhalten. Nachdem ich die Einheit d°C angegeben und das Item auf Number:Temperature gesetzt hatte, wurden kurzzeitig tatsächlich 17,2°C angezeigt, wie am Graphen erkennbar ist. Jedoch sprang die Anzeige relativ schnell wieder um und zeigt nun 172 d°C. Daraus schließe ich, dass es zwar grundsätzlich auf diese Weise gelöst werden kann, aber irgendetwas noch nicht rund läuft.

Code: Alles auswählen

channels:
  - id: WZ_Thermostat_Ist_Temp
    channelTypeUID: mqtt:number
    label: WZ Thermostat Ist Temp
    description: ""
    configuration:
      stateTopic: tuya/wz_thermostat/dps/3/state
      unit: d°C
  - id: WZ_Thermostat_Soll_Temp
    channelTypeUID: mqtt:number
    label: WZ Thermostat Soll Temp
    description: ""
    configuration:
      commandTopic: tuya/wz_thermostat/dps/2/command
      stateTopic: tuya/wz_thermostat/dps/2/state
      postCommand: true
Während dies geschah, habe ich parallel am Soll-Channel die gleichen Änderungen vornehmen wollen, der nicht nur einen Wert abfragen, sondern auch setzen soll. Wahrscheinlich Zufall, dass sich die Anzeige währenddessen änderte, aber ich wollte es nicht unter den Tisch fallen lassen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Shibo83
Beiträge: 5
Registriert: 30. Dez 2022 20:20

Re: MQTT Topics für Thermostat angeben

Beitrag von Shibo83 »

Zum Abschluss der Geschichte, hier die Lösung, falls jemand zukünftig ein ähnliches Problem hat:

Die Angabe der Unit d°C hat leider nicht geholfen. Dass der Wert einmal passte, muss irgendein umgefallenes Bit oder ähnliches gewesen sein. Wie von udo1toni vorgeschlagen, habe ich das Problem mithilfe einer JS Transformation gelöst. An dieser Stelle vielen Dank für den Tipp. Mit dem Einstellen des Soll-Werts funktioniert es übrigens auf ähnliche Weise. Nur, dass der ausgehende Wert multipliziert werden muss.

Code: Alles auswählen

  - id: WZ_Thermostat_Soll_Temp
    channelTypeUID: mqtt:number
    label: WZ Thermostat Soll Temp
    description: ""
    configuration:
      commandTopic: tuya/wz_thermostat/dps/2/command
      postCommand: true
      transformationPatternOut: JS:multiplyby10.js
      stateTopic: tuya/wz_thermostat/dps/2/state
      transformationPattern: JS:divideby10.js

Antworten