Shelly BLU Motion und MQTT

Geflasht oder ungeflasht ...

Moderator: seppy

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

Re: Shelly BLU Motion und MQTT

Beitrag von udo1toni »

nw378 hat geschrieben: 3. Jan 2024 17:41 Auf der Seite https://jsonpathfinder.com/ kann man sich durch den Pfad durchklicken, und der Pfadausdruck wird angezeigt:
Ja, eine der vielen möglichen Seiten :)
Wenn man VS Code am Start hat (das ist der bevorzugte Editor für openHAB Textdateien...) kann man auch dort ein passenden Plugin installieren. Die Formatierung erledigt VS Code auch nativ, Als Plugin für Pfade nutze ich JSON Path Status Bar, das blendet in der Statuszeile (ganz unten, rechts) den passenden Pfad ein, wenn man einen Wert im JSON anklickt, und ein Klick auf den angezeigten Pfad übernimmt diesen dann direkt in die Zwischenablage.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet

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

Re: Shelly BLU Motion und MQTT

Beitrag von nw378 »

Getestet und für gut bewertet. Merci!
openHAB 4.2.2 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Shelly BLU Motion und MQTT

Beitrag von nw378 »

Piko hat geschrieben: 30. Dez 2023 22:30 Ja das klappt, jetzt muss ich das nur noch für mich anpassen.

Das sollte ich aber hinbekommen.

Ich hätte nicht gedacht das es so einfach ist :D

Manchmal ließt man auch einfach zu viel als einfach auszuprobieren.

Danke auf jedenfall bis hierher :)
Hallo Piko,

hast Du das stabil zum Laufen bekommen? Mein BLU Motion Sensor sendet zwar fleißig in die Shelly CLoud (in der APP ist die Bewegung sichtbar),
aber das Gateway (Shelly Plus1) stellt irgendwann das Senden der MQTT Payloads ein.
Mal "hilft" ein Neustart des Plus1, mal muss ich den BLU Motion reseten. Leider alles andere als stabil... :x
openHAB 4.2.2 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Shelly BLU Motion und MQTT

Beitrag von Piko »

nw378 hat geschrieben: 6. Jan 2024 10:26

Hallo Piko,

hast Du das stabil zum Laufen bekommen? Mein BLU Motion Sensor sendet zwar fleißig in die Shelly CLoud (in der APP ist die Bewegung sichtbar),
aber das Gateway (Shelly Plus1) stellt irgendwann das Senden der MQTT Payloads ein.
Mal "hilft" ein Neustart des Plus1, mal muss ich den BLU Motion reseten. Leider alles andere als stabil... :x
Hi, also ich hab es dann so umgesetzt wie Udo es gesagt hat und es läuft bei mir bisher ohne probleme.

Allerdings habe ich derzeit auch das Gateway im einsatz mit nem Shellyscript für Mqtt.

Deshalb wird bei mir auch alles mit dem selben topic gesendet, was ja für mich das größere Problem war.

Ich glaub da kann ich dir also eher weniger weiter helfen.

Lg

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

Re: Shelly BLU Motion und MQTT

Beitrag von nw378 »

Piko hat geschrieben: 10. Jan 2024 12:31
Hi, also ich hab es dann so umgesetzt wie Udo es gesagt hat und es läuft bei mir bisher ohne probleme.

Allerdings habe ich derzeit auch das Gateway im einsatz mit nem Shellyscript für Mqtt.

Deshalb wird bei mir auch alles mit dem selben topic gesendet, was ja für mich das größere Problem war.

Ich glaub da kann ich dir also eher weniger weiter helfen.

Lg

Ich glaube, du kannst mir doch weiterhelfen.

Denn ich habe auch ein Shelly Gateway (welches über die Shelly Cloud die Nachrichten zum Plus1 gesendet hat; von dort dann MQTT).

Welches Script setzt Du ein? Könntest Du das hier mal posten, oder einen Link?

VG
openHAB 4.2.2 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Shelly BLU Motion und MQTT

Beitrag von Piko »

nw378 hat geschrieben: 10. Jan 2024 16:53
Ich glaube, du kannst mir doch weiterhelfen.

Denn ich habe auch ein Shelly Gateway (welches über die Shelly Cloud die Nachrichten zum Plus1 gesendet hat; von dort dann MQTT).

Welches Script setzt Du ein? Könntest Du das hier mal posten, oder einen Link?

VG
Gefunden habe ich es in der Libary allerdings hab ich durchs testen den Namen geändert.

Aber hier mal das Script als Code

Code: Alles auswählen

let mqttPrefix = Shelly.getComponentConfig( "mqtt" ).topic_prefix;
let BTHOME_SVC_ID_STR = "fcd2";
let last_packet_id;
let last_addr;

let uint8  = 0;
let int8   = 1;
let uint16 = 2;
let int16  = 3;
let uint24 = 4;
let int24  = 5;
function getByteSize(type) {
  if (type === uint8 || type === int8) return 1;
  if (type === uint16 || type === int16) return 2;
  if (type === uint24 || type === int24) return 3;
  return null;
}
let BTH = [];
BTH[0x00] = { n: "pid", t: uint8 };
BTH[0x01] = { n: "battery", t: uint8 };
BTH[0x05] = { n: "lux", t: uint24, f: 0.01 };
//BTH[0x1a] = { n: "Door", t: uint8 };
//BTH[0x20] = { n: "Moisture", t: uint8 };
BTH[0x21] = { n: "motion", t: uint8 };
BTH[0x2d] = { n: "state", t: uint8 };
BTH[0x3a] = { n: "button", t: uint8 };
BTH[0x3f] = { n: "tilt", t: int16, f: 0.1 };
let buttonEvent = ["-","S","SS","SSS","L"];
let BTHomeDecoder = {
  utoi: function (num, bitsz) {
    let mask = 1 << (bitsz - 1);
    return num & mask ? num - (1 << bitsz) : num;
  },
  getUInt8: function (buffer) {
    return buffer.at(0);
  },
  getInt8: function (buffer) {
    return this.utoi(this.getUInt8(buffer), 8);
  },
  getUInt16LE: function (buffer) {
    return 0xffff & ((buffer.at(1) << 8) | buffer.at(0));
  },
  getInt16LE: function (buffer) {
    return this.utoi(this.getUInt16LE(buffer), 16);
  },
  getUInt24LE: function (buffer) {
    return (
      0x00ffffff & ((buffer.at(2) << 16) | (buffer.at(1) << 8) | buffer.at(0))
    );
  },
  getInt24LE: function (buffer) {
    return this.utoi(this.getUInt24LE(buffer), 24);
  },
  getBufValue: function (type, buffer) {
    if (buffer.length < getByteSize(type)) return null;
    let res = null;
    if (type === uint8)  res = this.getUInt8(buffer);
    if (type === int8)   res = this.getInt8(buffer);
    if (type === uint16) res = this.getUInt16LE(buffer);
    if (type === int16)  res = this.getInt16LE(buffer);
    if (type === uint24) res = this.getUInt24LE(buffer);
    if (type === int24)  res = this.getInt24LE(buffer);
    return res;
  },
  unpack: function (buffer) {
    // beacons might not provide BTH service data
    if (typeof buffer !== "string" || buffer.length === 0) return null;
    let result = {};
    let _dib = buffer.at(0);
    result["encryption"] = _dib & 0x1 ? true : false;
    result["BTHome_version"] = _dib >> 5;
    if (result["BTHome_version"] !== 2) return null;
    //Can not handle encrypted data
    if (result["encryption"]) return result;
    buffer = buffer.slice(1);
    let _bth;
    let _value;
    while (buffer.length > 0) {
      _bth = BTH[buffer.at(0)];
      if (typeof _bth === "undefined") {
        console.log("BTH: unknown type",buffer.at(0));
        break;
      }
      buffer = buffer.slice(1);
      _value = this.getBufValue(_bth.t, buffer);
      if (_value === null) break;
      if (typeof _bth.f !== "undefined") _value = _value * _bth.f;
      result[_bth.n] = _value;
      buffer = buffer.slice(getByteSize(_bth.t));
    }
    return result;
  },
};
function shellyBLUParser(res)
{
    let result  = BTHomeDecoder.unpack( res.service_data[BTHOME_SVC_ID_STR] );
    result.addr = res.addr;
    result.rssi = res.rssi;
    return result;
}
BLE.Scanner.Start( {duration_ms: BLE.Scanner.INFINITE_SCAN},
    function(event,result,ud)
    {
        if( event === BLE.Scanner.SCAN_RESULT && 
            result !== null &&
            result.service_data !== undefined &&
            result.service_data[BTHOME_SVC_ID_STR] !== undefined )
        {
            let BTHparsed = shellyBLUParser( result );
            if( BTHparsed !== null )
            {
                print( JSON.stringify( BTHparsed ) );
                if( last_packet_id !== BTHparsed.pid )
                if( last_packet_id !== BTHparsed.pid || last_addr !== BTHparsed.addr )
                {
                    last_packet_id = BTHparsed.pid;
                    last_addr      = BTHparsed.addr;
                    if( BTHparsed.button !== undefined )
                    {
                        BTHparsed.button = buttonEvent[BTHparsed.button];
                    }
                    if( BTHparsed.state !== undefined )
                    {
                        BTHparsed.state = BTHparsed.state ? "open" : "close";
                    }
                    MQTT.publish( mqttPrefix+"/ble", JSON.stringify( BTHparsed ), 1, false );
                }
            }
        }
    } );
print( "started" );
Ich hoffe das hilft dir weiter!

PS: ich fürchte und hoffe zu gleich, das von Udo nachher kommt, pass das mal so und so an dann hast du auch jeweils einen eigenen Topic :-D

markdh
Beiträge: 1
Registriert: 2. Feb 2022 10:11
Answers: 0

Re: Shelly BLU Motion und MQTT

Beitrag von markdh »

Hallo zusammen,

mit den shelly blu hatte ich auch so meine Probleme. Werde hier mal zusammenfassen, wie ich zum Ziel gekommen bin. (openHAB 4.1.0)

Als erstes ist im Script auf dem Shelly, der als Gateway läuft in Zeile 97 eine Korrektur vorzunehmen. Macht man das nicht, hier hängt sich das Script wohl nach ein paar Stunden immer auf und wird auf dem Shelly gestoppt.
if (typeof _bth === "undefined") {

Um zu verhindern, dass dieses durch Openhab wieder überschrieben wird, sollte man es umbenennen, bzw. manuell erstellen und anders benennen.
Anschließend kann man in Openhab "BLU Gateway Unterstützung aktivieren" deaktivieren.

Nun sollten die BLU shellys, wenn sie über den Button am Gerät aufgeweckt werden, über den Scan in Openhab gefunden werden.

Bei den BLU motion hatte ich das Problem, dass diese nicht dauerhaft online waren. Hier hat geholfen diese manuell mit der entsprechenden MAC Adresse als BLU Button einzubinden. (einen nützliche App hierzu, shelly Debug)

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

Re: Shelly BLU Motion und MQTT

Beitrag von nw378 »

Danke für den Nachtrag. Insbesondere die Beschreibung mit dem fehlerhaften Script deckt sich mit meinem Fehlerbild.

Werde ich mal ausprobieren.
openHAB 4.2.2 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Antworten