Seite 1 von 1

Rollladensteuerung über MQTT Binding

Verfasst: 11. Dez 2023 11:21
von Proton
Hallo zusammen,
durch eine falsche Bestellung habe ich mir jetzt auch noch ZigBee ins Haus geholt. Ums kurz zu machen, bei mir läuft jetzt zigbee2mqtt mit Mosquittto.
Das funktioniert auch, denn wenn ich über MQTT Explorer einen Wert setze, reagiert das Gerät,
Mein Problem ist die Verknüpfung mit openhab. Das Thing und die Channels wurden von mir manuell angelegt, aber da scheine ich was falsch gemacht zu haben, denn die Steuerung funktioniert nicht.
Es gibt vier Channels
Bild

Den Channel Status habe ich als Rollershutter definiert, aber UP setzt den Wert auf "0", DOWN auf "100" und STOP auf "STOP",
Ich habe auf irgendeiner Seite was von einer Umwandlung gelesen, aber nichts über das wie was und wo und sonst bin ich auch nicht fündig geworden und deswegen wieder hier gelandet. :roll:

Schönen Gruß

Re: Rollladensteuerung über MQTT Binding

Verfasst: 11. Dez 2023 15:31
von udo1toni
Die Frage ist ja, wie Du die Channel definiert hast. :)

Um das noch etwas zu erweitern: Es gibt unter den Advanced Options extra Feder für Up Value und Down Value - und auch ein Feld für Stop Value - dort musst Du die entsprechenden Schlüsselworte eintragen.
Falls Du mit Json Objekten Arbeitest, musst Du außerdem noch das Outgoing Value Format anpassen, so dass gültiges JSON erzeugt wird (das kannst Du ja leicht über den MQTT Explorer prüfen)

Re: Rollladensteuerung über MQTT Binding

Verfasst: 13. Dez 2023 21:08
von Proton
So, ich bin leider erst jetzt dazu gekommen es zu testen.
Wenn man die Wert beim Anlegen des Channel setzt und als Topic nicht

Code: Alles auswählen

zigbee2mqtt/gemeinschaftsraum/zemismart/state
sondern

Code: Alles auswählen

zigbee2mqtt/gemeinschaftsraum/zemismart/set
wählt (das bedeutet für mich auch, dass die Werte als JSON übertragen werden), dann funktioniert die Steuerung.
Bild
Dafür schon mal vielen Dank!

Jetzt ist mein Problem die Position. Dieser Channel wurde als Number definiert und wenn ich über den MQTT-Explorer an das Topic

Code: Alles auswählen

zigbee2mqtt/gemeinschaftsraum/zemismart/set
ein JSON sende,

Code: Alles auswählen

{
  "position": 40
}
dann fährt das Gerät auf diese Position. Wenn ich diesen Wert über einen Slider an das Item sende, wird der Wert gesetzt, was im Explorer ersichtlich ist, aber nicht als JSON und deswegen reagiert das Gerät auch nicht.
Ich dachte ich hätte schon die Lösung gefunden, aber irgendwie bekomme ich die Werte nicht übereinander.
Bild

:roll:

Schönen Gruß

Re: Rollladensteuerung über MQTT Binding

Verfasst: 13. Dez 2023 22:34
von udo1toni
Du kannst nicht JSONPATH für die outgoing Value Transformation verwenden.
Für eine outgoing Value Transformation bräuchtest Du ein inverses JSONPATH :)

Stattdessen musst Du das Outgoing Value Format anpassen:

Code: Alles auswählen

formatBeforePublish: '{"position": %s}'

Re: Rollladensteuerung über MQTT Binding

Verfasst: 14. Dez 2023 08:28
von Proton
Gut zu wissen, dass ich auf dem richtigen Weg war. Ich hatte bereits

Code: Alles auswählen

{"position": %s}
beim Outgoing Value Format eingetragen, aber halt auch JSONPATH beim Outgoing Value Transformation. :oops: Woran man wohl erkennen kann, dass ich nicht weiß wofür das gut ist :D
Jetzt funktioniert es auf jeden Fall, vielen Dank!

Re: Rollladensteuerung über MQTT Binding

Verfasst: 14. Dez 2023 12:59
von udo1toni
Proton hat geschrieben: 14. Dez 2023 08:28 Woran man wohl erkennen kann, dass ich nicht weiß wofür das gut ist
JSONPATH filtert aus einem JSON Objekt einen einzelnen Wert heraus :)

Universell kann JSONPATH auch Teile eines JSON Objekts als neues JSON Objekt ausliefern, allerdings (leider) nicht in openHAB, hier wird immer ein einzelner Wert geliefert.

JSONPATH filtert das JSON Objekt nach den angegebenen Kriterien, es verfolgt einen vorgegebenen Pfad bis zum gewünschten Wert. Ich schreibe "filtert", weil die Pfad nicht zwingend absolut sein muss. Hat man z.B. ein JSON Objekt, welches Werte mehrerer Sensoren liefert, so können diese als Liste vorliegen. Beispiel:

Code: Alles auswählen

{
    "sensors": [
        {
            "name": "sensor2",
            "value": 2
        },
        {
            "name": "sensor1",
            "value": 1
        },
        {
            "name": "sensor3",
            "value": 3
        }
    ]
}
Was gleich auffällt: Die Liste ist nicht sortiert (zumindest nicht nach einem Kriterium, welches erkennbar ist). Und ich verrate noch ein Detail,m welches nur über mehrere Ojekte zu sehen wäre: Mal ist sensor1 der letzte Sensor in der Liste, mal der erste, mal der zweite. Die Sensoren springen also munter in der Liste herum, man kann nicht einfach immer den zweiten Sensorwert verwenden, um sensor1 abzufragen.

Und nun kann JSONPATH beweisen, was in ihm steckt :) indem man den Wert relativ abfragt.

Code: Alles auswählen

JSONPATH:$[?(@.name=='sensor1')].value
wird immer den Wert von sensor1 liefern, gleich an welcher Stelle der Liste der Sensor auftaucht.
JSONPATH ist ein sehr mächtiges Werkzeug :)
Es gibt noch andere Details, die in der openHAB Implementation von JSONPATH nicht funktionieren, z.B. sollte es möglich sein, im Filter mit Regular Expressions zu arbeiten, z.B. um aus einem DateTime Feld nur die Stunde als Kriterium zu verwenden, aber irgendwas ist ja immer :)

Re: Rollladensteuerung über MQTT Binding

Verfasst: 14. Dez 2023 18:40
von Proton
Ah okay, wieder was gelernt.
Dafür nochmals vielen Dank! :)

Re: Rollladensteuerung über MQTT Binding

Verfasst: 14. Dez 2023 18:56
von udo1toni
Immer gerne :)