Shelly Blu in FHEM einbinden

Begonnen von Neeein, 28 Februar 2024, 21:21:52

Vorheriges Thema - Nächstes Thema

Neeein

Guten Abend liebe Foristen,


Ich möchte gerne die neuen Shelly Blu Fenster/Türkontakte in FHEM einbinden, aber meine Suche war bis jetzt nicht von Erfolg gekrönt.

Kann mir evtl. Jemand auf die Sprünge helfen?
Vielleicht gibt es das ja bereits als Modul in FHEM. Oder ein Script für die Plus/Pro Shelly's (Gatewayfunktion) die das übernehmen und an FHEM (In einen Dummy) übergeben... das selbst zu programmieren bin ich leider nicht fähig.

Freue mich auf eure konstruktiven Vorschläge und Ideen 😊

LG

JoWiemann

Hallo,

da Du Dich ja kundig gemacht hast, das richtige Forum gefunden hast und auch gesucht hast, frage ich mich warum Du das Shelly Modul: https://forum.fhem.de/index.php?topic=118446.0 oder die Shelly MQTT Integration: https://forum.fhem.de/index.php?topic=94060.0 nicht gefunden hast.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

marvin78

Ich weiß nicht, ob die Bluetooth-Geräte über die genannten Wege eingebunden werden können. Ich gehe nicht davon aus.

Neeein

@jowiemann damit bekomme ich, meinem Verständnis nach, die Blu nicht eingebunden.

Wenn man sich das aktuelle Video zu den Shelly Blu Geräten von Haus-automation auf YouTube anschaut(keine Ahnung ob ich den Link posten darf, deshalb lasse ich es) dann verweist er darauf dass es die fw mit MQTT nicht gibt und er ein Script auf den pro/plus Geräten laufen lassen muss, damit die Werte weitergegeben werden.

Da das aber für HA und nicht für Fhem geeignet ist, bringt mich das nicht weiter und so gut coden kann ich nicht um mir das anzupassen 🙂
Grüße

marvin78

Ich verstehe auch den Sinn hinter solchen Bluetoothgeräten nicht (es sei denn man will sie NICHT in HA Systeme einbinden). Mein Rat: Autauschen gegen HM, ZWave, Zigbee....

isy

Ich denke, neeein hat das Problem korrekt beschrieben.
Nach etwas Lesen bei Shelly kann mal die "Blu" wohl mit der pro/plus Serie über BT koppeln. Oder über einen Bluetooth Gateway Stick.
Darüber werden vermutlich mqtt Messages generiert.

VG Helmut
Ein Weg wird erst zu einem Weg, wenn man ihn geht

Beta-User

OpenMQTTGateway kennt die wohl...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Neeein

#7
Ich habe eine Lösung für mich gefunden. Bestimmt nicht schön, vor allem sehr "einfach", da keine wirklichen Programmierkenntnisse habe, also fühlt euch bitte frei mir eure Vorschläge, Erleichterungen, unnötige Schritte etc. mitzuteilen und das Ding zu optimieren.
Gerne dürft ihr meine Anleitung und meinen Code benutzen und abändern. Ich übernehme dafür keine Haftung.


Ich habe ein 99Utils auf die passenden Werte von der ShellyBlu: Door/Window, Motion und Button geschrieben, die ich aus dem eigentlichen MQTTdevice herauskopiert habe. Diese Werden mit jedem ShellyBlu-Event und für jedes ShellyBlu Device in einen eigenen Dummy geschrieben, der dann für Aktionen etc. weiterverwendet werden kann.


Schritt 1 (einen MQTT Server auf der FHEM Instanz starten (falls noch nicht vorhanden):
define DEINWUNSCHNAMEFUERDEINENSERVER MQTT2_SERVER 1883 global

Schritt 2:
Ein beliebiges deiner Plus und Pro Devices aussuchen, welches als Gateway für die ShellyBlu arbeiten soll. Die Shelly App öffnen oder die direkte IP im Browser aufrufen.
In den Scriptbereich gehen und das Script aus Github einfügen:
Hier die URL: Code für das Shelly Script
Ich habe das Script ab Zeile 79 genutzt, wo die Versionsnummer zu finden war. "// v.02" war es bei mir.
Bei "});" ist Schluss, die ´´´ gehören nicht auf den Shelly

Jetzt beim gleichen Device im Bereich Netzwerke MQTT aktivieren, Art der Verbindung bei RPC... den Haken machen. Im zweiten Feld weiter unten dann die IP und den MQTT Port deiner FHEM-Instanz eingeben, bei mir war es 192.168.0.2:1883 Passwort und Benutzername habe ich nicht vergeben. Wird bei dir vielleicht anders sein.

-> Schritt 2 wiederholen, bis alle deine Shelly Pros und Plus eingebunden sind die du einbinden möchtest.
Jetzt werden die ShellyBludaten, die die Shellys via Bluetooth empfangen an euren FHEM gesendet und in den (normalerweise automatisch) angelegten MQTT-Devices im Raum MQTT2_Device gespeichert. Der Payload aller ShellyBlu wird jedoch immer im entsprechenden Plus/Pro Device mit abgelegt und mit jeder Aktualisierung irgend eines ShellyBlu sofort mit dessen Werten überschrieben. Deshalb Schritt 3 da ich den aktuellen Stand der ShellyBlu behalten will und später nach den Dummywerten Aktionen auslösen möchte.

Das ist nicht von mir, ich habe keine Rechte daran, also auf eigene Gefahr benutzen!


Schritt 3
In deinem Fhem auf "edit files" gehen und eine "99_Utils" öffnen, welche ist egal.

Dann den alten Code löschen und den neuen Code einfügen und unter anderem Namen speichern. In meinem Fall 99_UtilsShellyBlu.pm

##############################################
# $Id: 99_UtilsShellyBlu.pm 1932 $
package main;

######## doShellyBlu ###############
#
# Aufruf: doShellyBlu("<device>")

sub doShellyBlu($) {
my ($device) = @_;
my $payload_BTHome_version = ReadingsVal("$device","payload_BTHome_version", 0);
my $payload_address = ReadingsVal("$device","payload_address", 0);
my $payload_battery = ReadingsVal("$device","payload_battery", 0);
my $payload_encryption = ReadingsVal("$device","payload_encryption", 0);
my $payload_illuminance = ReadingsVal("$device","payload_illuminance", 0);
my $payload_pid = ReadingsVal("$device","payload_pid", 0);
my $payload_rotation = ReadingsVal("$device","payload_rotation", 0);
my $payload_rssi = ReadingsVal("$device","payload_rssi", 0);
my $payload_window = ReadingsVal("$device","payload_window", 0);
my$payload_motion = ReadingsVal("$device","payload_motion", 0);
my $payload_temperature = ReadingsVal("$device","payload_temperature", 0);
my $name = ReadingsVal("$device","payload_address",0); $name =~ s/:$//; $name =~ s/://g;
my $deviceDummy = "ShellyBlu".$name;
my $notifyname = "N_doShellyBlu".$device;

    fhem "defmod $deviceDummy dummy;attr $deviceDummy room Shelly;attr $deviceDummy event-on-change-reading .*;";
    fhem "define $notifyname notify $device:payload_.* {doShellyBlu('$device')};attr $notifyname event-on-change-reading .*;";
    fhem "setreading $deviceDummy BTHome_version $payload_BTHome_version";
    fhem "setreading $deviceDummy BTaddress $payload_address";
    fhem "setreading $deviceDummy battery $payload_battery";
    fhem "setreading $deviceDummy encryption $payload_encryption";
    fhem "setreading $deviceDummy illuminance $payload_illuminance";
    fhem "setreading $deviceDummy pid $payload_pid";
    fhem "setreading $deviceDummy rotation $payload_rotation";
    fhem "setreading $deviceDummy rssi $payload_rssi";
    fhem "setreading $deviceDummy WindowDoor $payload_window";
    fhem "setreading $deviceDummy temperature $payload_temperature";
    fhem "setreading $deviceDummy motion $payload_motion";
   
}

Da ich keine "richtigen Shelly Devices" anlegen kann ist es ein Dummy geworden, in den ich die Werte aus dem MQTT Payload der Door/Window ShellyBlu schreibe.

Der Code legt auch ein Notify an, der auf MQTT befehle reagiert und die 99_Utils aufruft um die aktuellen Daten in den Dummy zu schreiben.


Schritt 4:
Den Code einmal initial mit jedem Shelly Plus/Pro Device ausführen.
{doShellyBlu('MQTT2_shellyXXX')}XXX ist hierbei der Name unter dem das Device im MQTT2_Deviceraum abgelegt ist. Das Scipt legt jetzt alle erforderlichen Dummys etc. insbesondere aber den Notify an, sobald neue ShellyBlu-Werte geliefert werden an.

-> Schritt 4 wiederholen, bis alle Plus und Pro-Devices die du in Schritt zwei ausgewählt hast einmal ausgeführt wurden.


Schritt 5:
Mit dem Dummy arbeiten;

Ich habe mir Beispielsweise eine "Notöffnung für die Terrasse gebaut um das zu testen.
define doif_Notausgang doif ([ShellyBlub00112233:WindowDoor] eq "1" and [EG.RLWohnzimmerRechts] ne "Hoch") (set EG.RLWohnzimmerRechts on)00112233 steht hierbei für deinen Dummy dessen Werte du nutzen willst, der im Raum Shelly angelegt wurde.
Letzten Endes soll der Rollladen direkt mit Öffnung der entsprechenden Tür aufgehen, wenn er nicht oben ist.
Warum ich hier DOIF und nicht Notify verwendet habe... Ich wollte das auch mal testen...



Wunschliste:
- Eine Pushmitteilung mit pushover, wenn ich das Haus verlasse, aber noch ein oder mehrere Fester/Tür(en) offen steht/stehen. Am besten sollen hier auch gesammelt die jeweiligen Fenster/Türen drin stehen, damit man nicht suchen muss.
- Eine Pushmitteilung, wenn irgendein ShellyBlu einen Batteriestand von unter 10 hat.
- Rollladen "schlitzen" wenn das Fenster auf Kipp gesetzt wird, soll ja Luft rein.


Noch nicht getestet, weil nicht genug hardware:
- Ich habe noch nicht testen können, wie es sich verhält, wenn mehrere Shellys die ShellyBlu Werte empfangen und an FHEM anliefern. Evtl. müsste dann ein Timeout im Dummy gesetzt werden um das zu "entprellen" und Mehrfachauslösungen zu vermeiden.


LG N3331N

Neeein

#8
Zitat von: marvin78 am 29 Februar 2024, 14:23:42Ich verstehe auch den Sinn hinter solchen Bluetoothgeräten nicht (es sei denn man will sie NICHT in HA Systeme einbinden). Mein Rat: Autauschen gegen HM, ZWave, Zigbee....

Dann kann ich dir für meinen Fall leicht begründen :)
- Weil ich gerne mit Technik bastel,
- Shelly genial finde
- die Blu-Serie verdammt klein und unaufällig ist
und damit zum Hauptpunkt:

- Muss auch der Regierung gefallen... und das geht nur bei nicht auffallen :)    <--- dies ist Spaß

marvin78

Ja. Sowas, wie eine Regierung habe ich nicht, wir sind gleichberechtigte Partner mit rationalem und differenziertem Denken. Deshalb kann ich es auch nicht nachvollziehen. ;) Ich würde hier keine Kompromisse machen.

Neeein

Zitat von: marvin78 am 01 März 2024, 13:07:16Ja. Sowas, wie eine Regierung habe ich nicht, wir sind gleichberechtigte Partner mit rationalem und differenziertem Denken. Deshalb kann ich es auch nicht nachvollziehen. ;) Ich würde hier keine Kompromisse machen.
Das war auch eher im Spaß gemeint :) ich finde einfach die Größe richtig gut und habe nichts passenderes für meinen Anwendungsfall gefunden. Das schöne an FHEM ist ja, das irgendwie alles mit irgendwie allem geht.

DasQ

Zitat von: marvin78 am 29 Februar 2024, 14:23:42Ich verstehe auch den Sinn hinter solchen Bluetoothgeräten nicht (es sei denn man will sie NICHT in HA Systeme einbinden). Mein Rat: Autauschen gegen HM, ZWave, Zigbee....

Für mich der entscheidende Grund ist, Laut Hersteller bis zu 5jahre mit einer CR2032 Batterie
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

majestro84

Hallo,

ich habe es nun wie folgt gelöst.
Schritt 1 und 2 bleiben wie bei Neeein seinem Beitrag.
In Schritt2 habe ich das Script beim MQTT Publish etwas angepasst so das im Topic nun auch die BtMac steht.
Zeile 161
MQTT.publish(SHELLY_ID + '/' + result.addr + '/events/ble', JSON.stringify(message));

In dem in FHEM dann vorhanden MQTT2_Device habe ich das attr brigderegex gesetzt.
bridgeRegexp .*mac":"([A-Za-z0-9:]+)?.*:.* "shelly_$1"
Internals:
   CFGFN     
   CID        shellyplus2pm_c049ef856700
   DEF        shellyplus2pm_c049ef856700
   FUUID      65f16e58-f33f-3405-593d-27228845401f8aa1
   IODev      MQTT_Server
   LASTInputDev MQTT_Server
   MQTT_Server_CONN MQTT_Server_192.1.170.44_61934
   MQTT_Server_MSGCNT 622
   MQTT_Server_TIME 2024-03-13 13:05:00
   MSGCNT     622
   NAME       MQTT2_shellyplus2pm_c049ef856788
   NR         937
   STATE      ???
   TYPE       MQTT2_DEVICE
Attributes:
   bridgeRegexp .*mac":"([A-Za-z0-9:]+)?.*:.* "shelly_$1"
   readingList shellyplus2pm_c049ef856788:shellyplus2pm-c049ef856788/events/rpc:.* { json2nameValue($EVENT) }
shellyplus2pm_c049ef856788:shellyplus2pm-c049ef856788/online:.* online
   room       MQTT2_DEVICE

So wird nun auf Grund der unterschiedlichen Mac Adresse der BLU Devices jeweils ein neunes Gerät unter MQTT2_Device angelegt.
Diese habe ich dann wie folgt konfiguriert.
defmod Shelly_BLU_DoorWindow MQTT2_DEVICE shelly_38:39:8f:f8:88:40
attr Shelly_BLU_DoorWindow devStateIcon open:fts_window_1w_open@red tilted:fts_window_1w_tilt@yellow closed:fts_window_1w@green
attr Shelly_BLU_DoorWindow icon fts_window_1w
attr Shelly_BLU_DoorWindow jsonMap payload_BTHome_version:BTHome_version\
payload_address:mac\
payload_button:button\
payload_battery:battery\
payload_encryption:encryption\
payload_illuminance:illuminance\
payload_pid:pid\
payload_rotation:rotation\
payload_rssi:rssi\
payload_window:window
attr Shelly_BLU_DoorWindow model shellybludw
attr Shelly_BLU_DoorWindow readingList shellyplus2pm-c049ef856700/38_39_8f_f8_88_40/events/ble:.* { json2nameValue($EVENT, '', $JSONMAP) }
attr Shelly_BLU_DoorWindow room MQTT2_DEVICE
attr Shelly_BLU_DoorWindow userReadings state:(window|rotation).* { ReadingsVal($name,"window","") eq "0" ? 'closed' : ReadingsNum($name,"rotation",1) > 0 ? 'tilted' :'open' }

So bekommt man im state open|closed|tilted angezeigt und kann den Sensor zum Beispiel in ASC verwenden.

Für Anpassungen an dem Konstrukt um es evtl zu vereinfachen bzw. sauberer zu haben schreibt gerne.
@Beta-User evtl. kann das Device Shelly_BLU_DoorWindow dann auch so in die attrTemplates übernommen werden.

Viele Grüße
Alex
Server: Fujitsu ESPRIMO Q920 - aktuellen FHEM-Docker Image:Z-Wave (RollerShutter,DoorWindow,Socket,PIR,....) | ENIGMA2 | EGPM2LAN | BLE-Tag(PRESENCE) | HUE | alexa-fhem | Shelly | MQTT2
1.Pi-Zero:Viessmann(optolink) mit 89_VCONTROL300.pm
2.Pi3 Dongle Server: Zigbee2MQTT(CC1352P-2), Z-Wave(UZB1), BT

Beta-User

Hmmm, spontane Meinung: Das mit den scripts auf dem Shelly ist schon sehr speziell, und dann noch Änderungen daran vorzunehmen, macht es noch spezieller (und ist eine Sache, die man bei updates etc. ggf. leicht vergißt).

Ginge es nicht einfacher, wenn man

a) im "Hauptdevice" (optional!) den (unveränderten) events/ble-Topic auswertet und da erst mal per regex, (suchen-ersetzen für die Doppelpunkte) einen prefix extrahiert für jedes Device und dann nur den "payload"-JSON (also einen Auszug aus dem ganzen?) durch json2nameValue() auspacken läßt? Dann braucht es uU. hier kein $JSONMAP, also im Ergebnis dann 'json2nameValue($innerPayload,"${prefix}_")' als Rückgabeanweisung;

b) für die "Sub-Devices " könnte man das mit der "suche die richtige MAC-Adresse" auch in der readingList (hinter dem Doppelpunkt) filtern und dann wieder direkt nur den payload-JSON auspacken? (Rückgabeanweisung: 'json2nameValue($innerPayload)')?

Mir ist klar, dass das sehr abstrakt klingt, aber zumindest das Extrahieren des "inneren JSON" macht z.B. "tasmota_zigbee2tasmota_light_dimmer"...

Aber: Wenn jemand was funktionierendes liefert, checke ich gerne ein, was halt da ist. Es sollte dann bitte eine Anleitung mit rein, wie es gedacht ist, damit wir nicht irgendwann Rückfragen haben, die zumindest ich nicht beantworten kann. Von daher neige ich eben eher dazu, die "Intelligenz" lieber direkt im Code zu plazieren.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

DasQ

#14
Zitat von: Beta-User am 29 Februar 2024, 15:51:55OpenMQTTGateway kennt die wohl...

Hab ich jetzt spartanisch genau so umgesetzt. Hatte dieses Wochenende leider was anderes zu erledigen, ansonsten wäre es schon fertig.
Aber es erspart den dämlichen Umweg über die shelly mit original Firmware (App und Cloud) die Software Konfiguration.

Die shelly blu door kann man über die Debug App aktualisieren und Grund konfigurieren. Den Rest erledigt OMG (OpenMQTTGateway). Den muß ich aber erst noch grundlegend konfigurieren, weil der im Augenblick Zeug empfängt, das glaubt man nicht.

Ach ja @Beta-User ich hab in dem Mqtt Thread schon halbherzig angefangen den ein oder anderen Verbesserungsvorschlag zu verfassen bzgl OMG Template. Könntest du mal auf deren Homepage schauen, da hat sich etliches getan was man konfigurieren kann. Ich schreib das gerade zusammen, allerdings kämpf ich mit den Set.

BTW. Arbeite ich gerade auch noch daran das ganze in tasmota zum laufen zu bekommen.
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

Kai-Alfonso

Zitat von: majestro84 am 13 März 2024, 14:38:58Hallo,

ich habe es nun wie folgt gelöst.
Schritt 1 und 2 bleiben wie bei Neeein seinem Beitrag.
In Schritt2 habe ich das Script beim MQTT Publish etwas angepasst so das im Topic nun auch die BtMac steht.
Zeile 161
MQTT.publish(SHELLY_ID + '/' + result.addr + '/events/ble', JSON.stringify(message));

Danke Alex, ich habe einen Shelly Blu Wall Switch 4 - wie muss ich denn das Skript umschreiben, das ich

1. übermittelt bekomme, welcher Button (1-4) gedrückt wurde und
2. wie der Payload ist (einmal gedrückt (1) zweimal gedrückt (2) dreimal gedrückt (3) und lang gedrückt (254)

Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

satprofi

warum verkauft shelly keine motion2 mehr, dafür die blu? um seine kostenpflichtige cloud zu fördern? motion2 nicht lieferbar, bei niemanden.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

satprofi

Zitat von: Neeein am 28 Februar 2024, 21:21:52Guten Abend liebe Foristen,


Ich möchte gerne die neuen Shelly Blu Fenster/Türkontakte in FHEM einbinden, aber meine Suche war bis jetzt nicht von Erfolg gekrönt.

Kann mir evtl. Jemand auf die Sprünge helfen?
Vielleicht gibt es das ja bereits als Modul in FHEM. Oder ein Script für die Plus/Pro Shelly's (Gatewayfunktion) die das übernehmen und an FHEM (In einen Dummy) übergeben... das selbst zu programmieren bin ich leider nicht fähig.

Freue mich auf eure konstruktiven Vorschläge und Ideen 😊

LG

bei amazon gibts gerade den bluetoith/wifi dongle um 12.-, hab ich mir bestellt. damit geht auch mqtt mit fhem , etc.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

WW

Zitatbei amazon gibts gerade den bluetoith/wifi dongle um 12.-, hab ich mir bestellt. damit geht auch mqtt mit fhem , etc.

Auch preislich interessant:

Shelly Smart Security Bundle Regular

Gibts immer mal für unter 45,-€
FHEM 6.x im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl), Azzurro-WR/Pylontech-Batterie

satprofi

Viiielen Dank an NEEEIN. Dein Script passt für meine motions. Dachte das Gateway übersetzt das zu Mqtt automatisch, in der App sehe ich die Motion´s alle, nur FHEM empfing nicht. das man scripte auch noch braucht, ist nicht sehr userfreundlich. 
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

satprofi

noch eine Frage, werden keine Temperaturdaten mehr von den Blu mitgesendet?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

gvzdus

Moin, ich bin gerade am gleichen Thema:
https://forum.fhem.de/index.php?topic=139547.0

Nein, Temperatur kommt mit den Geräten nicht mit. Ich habe Shelly Motion, Shelly Button, Shelly WallSwitch 4 und Shelly Door&Window auf der Thread-Seite mit jeweiligem Output drauf.

Mein Ansatz ist - auch durch Rudis und Beta-Users Tipps - übrigens der Gleiche:
- Script auf den Shelly installieren (musste ich natürlich anpassen, u.a. auch für den Wallswitch 4 mit seinen 4 Buttons)
- auf MQTT-Topic posten
- "bridgeregex" neue Geräte anlegen lassen.

Ich nenne die Geräte aber beim Autocreate "bth_" (also z.B. "MQTT2_bth_<addresse>"), weil Bluetooth Home - gerade dank Shelly - sich als Standard ansieht (https://bthome.io).

Wo ich schon dabei bin:
Meine "bridgeRegex" für jeden Shelly, der Gateway sein soll:
.*:bthome/bth_([a-z_0-9_]+):.* "bth_$1"
Und "mein" Script für jeden Gateway-Shelly:
/******************* START CHANGE HERE *******************/
// Script for BThome->MQTT->FHEM, based on "ble-shelly-motion.js" from library
// version 0.1, 20241021

let CONFIG = {
  // When set to true, debug messages will be logged to the console
  debug: true,

  // When set to true and the script ownes the scanner, the scan will be active.
  // Active scan means the scanner will ping back the Bluetooth device to receive all its data, but it will drain the battery faster
  active: false,

  // When `allowedMacAddresses` is set to null, events from every bluetooth device are accepted.
  allowedMacAddresses: null,
  //allowedMacAddresses: [
  //  "aa:bc:12:34:56:78", // events only from these mac addresses are allowed.
  //  "11:22:33:45:5a:bc",
  //],

  /**
   * Called when packet from filtered Shelly BLU Motion devices is received.
   * @param {Object} eventData Object, containing all parameters received from the Shelly BLU Motion device. Example: {"encryption":false,"BTHome_version":2,"pid":16,"battery":100,"illuminance":109,"motion":1,"button":1,"rssi":-53,"address":"aa:bc:12:34:56:78"}
   */
  onStatusUpdate: function (eventData) {
    // Do nothing at the moment.
  }
};
/******************* STOP CHANGE HERE *******************/

let ALLTERCO_MFD_ID_STR = "0ba9";
let BTHOME_SVC_ID_STR = "fcd2";

let uint8 = 0;
let int8 = 1;
let uint16 = 2;
let int16 = 3;
let uint24 = 4;
let int24 = 5;

//Logs the provided message with an optional prefix to the console.
function logger(message, prefix) {
  //exit if the debug isn't enabled
  if (!CONFIG.debug) {
    return;
  }

  let finalText = "";

  //if the message is list loop over it
  if (Array.isArray(message)) {
    for (let i = 0; i < message.length; i++) {
      finalText = finalText + " " + JSON.stringify(message[i]);
    }
  } else {
    finalText = JSON.stringify(message);
  }

  //the prefix must be string
  if (typeof prefix !== "string") {
    prefix = "";
  } else {
    prefix = prefix + ":";
  }

  //log the result
  console.log(prefix, finalText);
}

// The BTH object defines the structure of the BTHome data
let BTH = {};
BTH[0x00] = { n: "pid", t: uint8 };
BTH[0x01] = { n: "batteryPercent", t: uint8, u: "%" };
BTH[0x02] = { n: "temperature", t: int16, f: 0.01, u: "tC" };
BTH[0x03] = { n: "humidity", t: uint16, f: 0.01, u: "%" };
BTH[0x05] = { n: "illuminance", t: uint24, f: 0.01 };
BTH[0x21] = { n: "motion", t: uint8 };
BTH[0x2d] = { n: "window", t: uint8 };
BTH[0x3a] = { n: "button", t: uint8 };
BTH[0x3f] = { n: "rotation", t: int16, f: 0.1 };

function getByteSize(type) {
  if (type === uint8 || type === int8) return 1;
  if (type === uint16 || type === int16) return 2;
  if (type === uint24 || type === int24) return 3;
  //impossible as advertisements are much smaller;
  return 255;
}

// functions for decoding and unpacking the service data from Shelly BLU devices
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;
  },

  // Unpacks the service data buffer from a Shelly BLU device
  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;
    let _cntr = 0;
    while (buffer.length > 0) {
      _bth = BTH[buffer.at(0)];
      if (typeof _bth === "undefined") {
        logger("unknown type", "BTH");
        break;
      }
      buffer = buffer.slice(1);
      _value = this.getBufValue(_bth.t, buffer);
      if (_value === null) break;
      if (typeof _bth.f !== "undefined") _value = _value * _bth.f;
      // Added: BLU Wallswitch4 has multiple buttons
      if (typeof result[_bth.n] !== "undefined") {
        result[_bth.n + "_" + _cntr++] = result[_bth.n];
        delete result[_bth.n];
      }
      result[_cntr>0 ? _bth.n + "_" + _cntr++ : _bth.n] = _value;
      buffer = buffer.slice(getByteSize(_bth.t));
    }
    return result;
  },
};

function onReceivedPacket (data) {
  if(CONFIG._processedMacAddresses !== null) {
    if(CONFIG._processedMacAddresses.indexOf(data.address) < 0) {
      logger(["Received event from", data.address, "outside of the allowed addresses"], "Info");
      return;
    }
  }

  logger(["Shelly BTH packet: ", data], "Info");
  if (MQTT.isConnected()) {
    MQTT.publish("bthome/bth_" + data.address, JSON.stringify(data));
  }
}

//saving the id of the last packet, this is used to filter the duplicated packets
let lastPacketId = 0x100;

// Callback for the BLE scanner object
function BLEScanCallback(event, result) {
  //exit if not a result of a scan
  if (event !== BLE.Scanner.SCAN_RESULT) {
    return;
  }

  //exit if service_data member is missing
  if (
    typeof result.service_data === "undefined" ||
    typeof result.service_data[BTHOME_SVC_ID_STR] === "undefined"
  ) {
    return;
  }

  let unpackedData = BTHomeDecoder.unpack(
    result.service_data[BTHOME_SVC_ID_STR]
  );

  //exit if unpacked data is null or the device is encrypted
  if (
    unpackedData === null ||
    typeof unpackedData === "undefined" ||
    unpackedData["encryption"]
  ) {
    logger("Encrypted devices are not supported", "Error");
    return;
  }

  //exit if the event is duplicated
  if (lastPacketId === unpackedData.pid) {
    return;
  }

  lastPacketId = unpackedData.pid;

  unpackedData.rssi = result.rssi;
  unpackedData.address = result.addr;

  onReceivedPacket(unpackedData);
}

// Initializes the script and performs the necessary checks and configurations
function init() {
  //exit if can't find the config
  if (typeof CONFIG === "undefined") {
    console.log("Error: Undefined config");
    return;
  }

  //get the config of ble component
  let BLEConfig = Shelly.getComponentConfig("ble");

  //exit if the BLE isn't enabled
  if (!BLEConfig.enable) {
    console.log(
      "Error: The Bluetooth is not enabled, please enable it from settings"
    );
    return;
  }

  //check if the scanner is already running
  if (BLE.Scanner.isRunning()) {
    console.log("Info: The BLE gateway is running, the BLE scan configuration is managed by the device");
  }
  else {
    //start the scanner
    let bleScanner = BLE.Scanner.Start({
        duration_ms: BLE.Scanner.INFINITE_SCAN,
        active: CONFIG.active
    });

    if(!bleScanner) {
      console.log("Error: Can not start new scanner");
    }
  }

  if (
    typeof CONFIG.allowedMacAddresses !== "undefined"
  ) {
    if(CONFIG.allowedMacAddresses !== null) {
      // Process configured mac addresses all to lower case and remove duplicates.
      CONFIG._processedMacAddresses =
        CONFIG
          .allowedMacAddresses
          .map(function (mac) { return mac.toLowerCase(); })
          .filter(function (value, index, array) { return array.indexOf(value) === index; })
    }
    else {
      CONFIG._processedMacAddresses = null;
    }
  }

  //subscribe a callback to BLE scanner
  BLE.Scanner.Subscribe(BLEScanCallback);
}

init();

muc46

Guten Morgen,
code snippets laufen stabil auf shelly "gatewy" device und FHEM. Das verwendete BLU RC Button 4 device schickt nach click auf eine Taste zwei Pakete, wobei im ersten Pakete für die gedrückte Taste 0x0FE als Wert mitgegeben wird und im zweiten Pakete als Wert dann "button press event"(https://shelly-api-docs.shelly.cloud/docs-ble/Devices/wall_us/), z.B. bei einem kurzen Drücken 0x01. Werden zwei Tasten gleichzeitig gedrückt wird im ersten Paket aber nur für eine der gedrückten Tasten der Wert 0xFE gesendet, im zweiten Paket dann ein Wert für die jeweilige Taste.

Gibt es einen Grund, dass zwei Pakete geschickt werden, insbesondere dass es der Wert 0xFE ist?
Vielleicht aus Sicherheitsgründen, um ein weiteres, also das zweite, Paket mit den "echten" "button press events" anzukündigen?

Gibt es dasselbe Verhalten auf bei anderen Devices dieser Shelly Serie?

gvzdus

Für das 0xFE gibt es einen "guten Grund" (und ich kenne ein ähnliches Verhalten bei anderen Shelly-"Schaltern"):
Man will eine schnellstmögliche Reaktion. "Die Taste ist gedrückt" ist das erste, was der Shelly sagen kann. Ob es ein kurzer Click, langer Click oder Mehrfachclick war, kann dagegen erst nach einer Latenz beurteilt werden.
Daher kannst Du, wenn Du nicht lang/mehrfach unterschiedlich behandelst, z.B. das Licht schon beim 0xFE einschalten.
Was bei 2 Tasten gleichzeitig passiert, weiß ich nicht, und ich kann mir auch vorstellen, dass hier nicht ganz sichergestellt ist, dass alles sauber ankommt.

Ich habe mein Script oben übrigens noch überarbeitet, sodass es kompatibler zu Zigbee-Devices ist, und außerdem den Shelly BLU H&T unterstützt.