Seite 3 von 3

Re: Shelly BLU Motion und MQTT

Verfasst: 3. Jan 2024 18:38
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.

Re: Shelly BLU Motion und MQTT

Verfasst: 4. Jan 2024 15:47
von nw378
Getestet und für gut bewertet. Merci!

Re: Shelly BLU Motion und MQTT

Verfasst: 6. Jan 2024 10:26
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

Re: Shelly BLU Motion und MQTT

Verfasst: 10. Jan 2024 12:31
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

Re: Shelly BLU Motion und MQTT

Verfasst: 10. Jan 2024 16:53
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

Re: Shelly BLU Motion und MQTT

Verfasst: 10. Jan 2024 22:50
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

Re: Shelly BLU Motion und MQTT

Verfasst: 13. Feb 2024 20:23
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)

Re: Shelly BLU Motion und MQTT

Verfasst: 14. Feb 2024 20:43
von nw378
Danke für den Nachtrag. Insbesondere die Beschreibung mit dem fehlerhaften Script deckt sich mit meinem Fehlerbild.

Werde ich mal ausprobieren.