Shelly BLU Motion und MQTT

Geflasht oder ungeflasht ...

Moderator: seppy

Piko
Beiträge: 93
Registriert: 26. Nov 2019 19:05
Answers: 0

Shelly BLU Motion und MQTT

Beitrag von Piko »

Irgendwie will es nicht so recht.

ich häng euch mal die rule usw. an

Code: Alles auswählen

1
var Bewegung, Battery, _Adresse, Lux, Zustand;

Bewegung = actions.Transformation.transform('JSONPATH', '$.motion', items.getItem('Generic_MQTT_Thing_BLE_String').state);
Battery = actions.Transformation.transform('JSONPATH', '$.battery', items.getItem('Generic_MQTT_Thing_BLE_String').state);
console.info(Battery);
_Adresse = actions.Transformation.transform('JSONPATH', '$.addr', items.getItem('Generic_MQTT_Thing_BLE_String').state);
Lux = actions.Transformation.transform('JSONPATH', '$.lux', items.getItem('Generic_MQTT_Thing_BLE_String').state);
Zustand = actions.Transformation.transform('JSONPATH', '$.state', items.getItem('Generic_MQTT_Thing_BLE_String').state);
if (_Adresse == 'b0:c7:de:7d:e8:16') {
  items.getItem('Lux_Bewegunsmelder1').sendCommand(Lux);
  items.getItem('Battery_BWM_Kitchen').sendCommand(Battery);
  items.getItem('Generic_MQTT_Thing_Test_bewegung_2').sendCommand(Bewegung);
}
if (_Adresse == '3c:2e:f5:bd:27:75') {
  items.getItem('Lux_Balkontuer').sendCommand(Lux);
  items.getItem('Battery_DW_1').sendCommand(Battery);
  items.getItem('Zustand_DW_1').sendCommand(Zustand);
}
​
lux item

Code: Alles auswählen

label: Lux Balkontür

type: Number:Illuminance

category: ""

groupNames:

  - Wohnzimmer_Haupt

tags:

  - Point

​

und der auszug aus der sitemap

Code: Alles auswählen

Frame label="Fenster" {
                Switch item=Zustand_DW_1 mappings=["OFF "=" Zu", "On "=" Offen"]
                Text item=Lux_Balkontuer
                Text item=Battery_DW_1
wenn ich in den einstellungen auf die lux items gehe habe diese werte, nur in der sitemap nicht.


Gesendet von iPad mit Tapatalk

Harka
Beiträge: 309
Registriert: 30. Apr 2021 13:13
Answers: 15

Re: Shelly BLU Motion und MQTT

Beitrag von Harka »

Sorry für den unvorteilhaften Lösungsvorschlag mit StateDescription. Der Code ist sicher Ausbaufähig aber tut ja was er soll.
Zur aktuellen Baustelle - versuch mal, wie oben schon erwähnt wurde,

Code: Alles auswählen

Text item=Lux_Balkontuer label="Lux_Balkontuer [%d lx]"

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

Re: Shelly BLU Motion und MQTT

Beitrag von udo1toni »

Warum machst Du das in einer Rule?
Definiere das Thing, definiere die Items und verlinke beide Elemente.

Im Übrigen ist das .sendCommand() in diesem Zusammenhang falsch, stattdessen müsstest Du, wenn schon, dann postUpdate() verwenden.

Aber noch mal: Das macht man nicht mit Rules.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Piko
Beiträge: 93
Registriert: 26. Nov 2019 19:05
Answers: 0

Re: Shelly BLU Motion und MQTT

Beitrag von Piko »

Ich hab das mit einer rule gemacht weil Shelly alles auf dem gleichen Channel sendet.

Um die verschiedene Geräte zu unterscheiden hab ich dann die rule genommen und anhand der Adressen unterschieden welcher Sensor sich gemeldet hat.

Ich hoffe einfach darauf das der Mini bald im Shellybinding integriert ist. Dann wird’s vermutlich deutlich leichter.

Trotzdem danke bis hierher.


Gesendet von iPhone mit Tapatalk

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

Re: Shelly BLU Motion und MQTT

Beitrag von udo1toni »

Nein, dann hast Du einfach was falsch konfiguriert.
Jedes Gerät muss ein eigenes Topic zugewiesen bekommen.

Abgesehen davon ist auch die Unterscheidung verschiedener Geräte kein Problem:

Code: Alles auswählen

Type switch  : kMotion "Küche Bewegung"  [ stateTopic="<das/topic/der/wahl>", transformationPattern="REGEX:(.*b0.c7.de.7d.e8.16.*)∩JSONPATH:$.motion",  on="1" ,off="0" ]
Type number  : kLux    "Küche Lux"       [ stateTopic="<das/topic/der/wahl>", transformationPattern="REGEX:(.*b0.c7.de.7d.e8.16.*)∩JSONPATH:$.lux",     unit="lx" ]
Type number  : kBat    "Küche Batterie"  [ stateTopic="<das/topic/der/wahl>", transformationPattern="REGEX:(.*b0.c7.de.7d.e8.16.*)∩JSONPATH:$.battery", unit="%" ]
Type contact : bState  "Balkon Zustand"  [ stateTopic="<das/topic/der/wahl>", transformationPattern="REGEX:(.*3c.2e.f5.bd.27.75.*)∩JSONPATH:$.state",  on="1" ,off="0" ]
Type number  : bLux    "Balkon Lux"      [ stateTopic="<das/topic/der/wahl>", transformationPattern="REGEX:(.*3c.2e.f5.bd.27.75.*)∩JSONPATH:$.lux",     unit="lx" ]
Type number  : bBat    "Balkon Batterie" [ stateTopic="<das/topic/der/wahl>", transformationPattern="REGEX:(.*3c.2e.f5.bd.27.75.*)∩JSONPATH:$.battery", unit="%" ]
Kann alles auch als ein Thing angelegt werden, mit identischem stateTopic.
Über das REGEX (muss natürlich installiert sein, genau wie JSONPATH) werden einfach die nicht passenden JSON Objekte weggefiltert.

Das Symbol bedeutet übrigens Schnittmenge, ist in der Zeichentabelle von Windows allerdings als Durchschnitt benannt. In der UI ist es jeweils im Hilfstext erwähnt, wenn es um Transformation Services geht, die man miteinander verketten kann.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 199
Registriert: 22. Sep 2018 10:38
Answers: 4

Re: Shelly BLU Motion und MQTT

Beitrag von nw378 »

Frohes neues Jahr!

Ich versuche ebenfalls, meine Bluetooth-Shellys vom Binding-Script auf MQTT umzustellen, da das script häufiger mal aussetzt.

Dies ist mein State Topic: shellyplus1-wohn/events/rpc

Es kommen sowohl beim MQTT Explorer als auch im OH Log Telegramme an.

Die Incoming Value Transformations habe ich so erstellt:

Code: Alles auswählen

REGEX:(.*d8:7a:3b:d6:72:c0.*)∩JSONPATH:$.Window
Leider erhalte ich folgende Fehlermeldung im Log:

Code: Alles auswählen

2024-01-02 11:35:56.287 [WARN ] [t.generic.ChannelStateTransformation] - Executing the JSONPATH-transformation failed: Invalid path '$.Window' in '{"src":"shellyplus1-441793a83aec","dst":"shellyplus1-wohn/events","method":"NotifyEvent","params":{"ts":1704191756.27,"events":[{"component":"script:1", "id":1, "event":"oh-blu.data", "data":{"encryption":false,"BTHome_version":2,"pid":246,"Battery":100,"Illuminance":0,"Window":0,"Rotation":0,"addr":"d8:7a:3b:d6:72:c0","rssi":-58}, "ts":1704191756.27}]}}'
Was mache ich falsch?

EDIT:

auch als Text-Konfiguration komme ich nicht weiter:

Code: Alles auswählen

Thing mqtt:topic:9146e08a52:MQTT_Shelly "MQTT_Shelly" (mqtt:broker:9146e08a52) {
    Channels:
      Type contact : cTerrasse "Terrassentür" [ stateTopic="shellyplus1-wohn/events/rpc", transformationPattern="REGEX:(.*d8:7a:3b:d6:72:c0.*)∩JSONPATH:$.Window",  CLOSED="1" ,OPEN="0" ] }
Mit der gleichen Fehlermeldung...
openHAB 4.1.0 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Shelly BLU Motion und MQTT

Beitrag von udo1toni »

Der Pfad ist einfach falsch.

Das hier ist das JSON Objekt (etwas menschenfreundlicher formatiert):

Code: Alles auswählen

{
    "src": "shellyplus1-441793a83aec",
    "dst": "shellyplus1-wohn/events",
    "method": "NotifyEvent",
    "params": {
        "ts": 1704191756.27,
        "events": [
            {
                "component": "script:1",
                "id": 1,
                "event": "oh-blu.data",
                "data": {
                    "encryption": false,
                    "BTHome_version": 2,
                    "pid": 246,
                    "Battery": 100,
                    "Illuminance": 0,
                    "Window": 0,
                    "Rotation": 0,
                    "addr": "d8:7a:3b:d6:72:c0",
                    "rssi": -58
                },
                "ts": 1704191756.27
            }
        ]
    }
}
Der Pfad zum gesuchten Wert lautet in diesem Fall

Code: Alles auswählen

$.params.events[0].data.Window
Insgesamt also

Code: Alles auswählen

REGEX:(.*d8:7a:3b:d6:72:c0.*)∩JSONPATH:$.params.events[0].data.Window
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 199
Registriert: 22. Sep 2018 10:38
Answers: 4

Re: Shelly BLU Motion und MQTT

Beitrag von nw378 »

Das es sowas "einfaches" ist, hab ich mir fast gedacht. :D

Irgendwie erschließt sich mir die Logik von JSONPath und REGEX nicht... :?

Wie immer, vielen Dank Udo.
openHAB 4.1.0 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Shelly BLU Motion und MQTT

Beitrag von udo1toni »

Die Logik von JSON ist eigentlich ganz einfach. Du bewegst Dich sozusagen durch einen Baum. An jeder Stelle, an der der Stamm sich verzweigt, gibt es entweder einzelne Werte oder Arrays (entweder, oder, nie gemischt). Knoten innerhalb eines Arrays können, müssen aber nicht benannt sein. Einzelwerte sind immer benannt. Mit JSONPath hangelst Du Dich von der Wurzel ausgehend bis zur Spitze (dem zu übergebenden Wert) entlang, von Name zu Name. Wenn man unbenannte Arrays hat (hier die events), dann kann man die Knoten einfach abzählen (mit 0 beginnend) oder auch einen Knoten anhand der darunter liegenden Werte selektieren, das kann wichtig sein, weil die Reihenfolge der Daten innerhalb des JSON Objekts streng genommen nicht fix ist.

Bei REGEX (Regular Expressions) erstellt man ein Muster, auf dass die Suche matchen muss. Dabei kann man Teile der Suche, oder auch die gesamte Suche markieren und REGEX liefert dann die markierten Teile zurück. openHAB nutzt eine "abgespeckte" Version von REGEX, die leider etliche fortgeschrittene Funktionen vermissen lässt, aber die Grundfunktionen reichen nun mal locker in 95 % der Fälle aus. Für die restlichen 5 % muss man dann halt ein Script erstellen. Das erstellte Muster muss irgendwo im untersuchten String zu finden sein, ansonsten liefert REGEX einen leeren String zurück. Die Ausgabe von REGEX ist immer der Teil des Musters, der in runden Klammern steht (). Alles außerhalb der Klammern muss zwar matchen, wird aber "weggeschnitten", was oftmals beim Zerlegen einer html-Ausgabe die einfachste Möglichkeit ist, an die Daten zu kommen.

Für die genauen Regeln (sowohl JSONPATH als auch REGEX) möchte ich auf Tante Google verweisen, da gibt es extrem gute Kompendien und Tester, in denen man den Ausgangstext eingeben und dann die Filter daran ausprobieren kann - aber Achtung, wie erwähnt handelt es sich in openHAB um abgespeckte Versionen, Spezialitäten wie z.B. REGEX innerhalb eines JSONPath (ja, das geht eigentlich) oder Verweise auf andere Teile des REGEX Ausdrucks gehen nicht, nur weil ein Filterausdruck im Online Tester funktioniert, bedeutet das nicht zwingend, dass er auch in openHAB funktioniert...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 199
Registriert: 22. Sep 2018 10:38
Answers: 4

Re: Shelly BLU Motion und MQTT

Beitrag von nw378 »

Ich glaube, die Herausforderung liegt daran, dass - im Gegensatz zum Programmieren, wo man sich vom Simplen hin zu Komplexerem steigern kann - man bei JSON direkt vor dem großen Berg steht.

Der zarte Hinweis aufs Googlen ( -> Tester!!) ist super.
Ich hatte mich zuvor durch die Beschreibung der Addons bei OH gelesen; der Berg wurde nicht wirklich kleiner.
In meinem Beispiel hätte ich niemals [0] eingefügt....

Auf der Seite https://jsonpathfinder.com/ kann man sich durch den Pfad durchklicken, und der Pfadausdruck wird angezeigt:
Screenshot 2024-01-03 173947.png
Bzgl. Regex ist mir auch folgendes Zitat über den Weg gelaufen: "Manche Programmierer nennen RegEx auch scherzhaft schreibgeschützten Code"... :lol:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.1.0 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Antworten