Wollte das eigentlich erst später probieren, weil das Lösen und zwangsläufiges Neukalibrieren erfahrungsgemäss nicht ganz ohne Risiko für das problemlose Weiterfunktionieren der Dinger ist. Aber nun wollte ich es wissen.
In Z2M nicht unterstützt, aber gefunden wird er:
Beiträge von JSE222
VPN/Proxy erkannt
Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.
-
-
Mein Kollege meinte, dass alle BLU-Geräte als Gateway dienen können (er hat offenbar keine TRV).
Das gilt wohl nur für nicht-TRV Blu Devices, Blu Motion z.B. geht auf jeden Fall.
Die TRVs sollen aber auch Zigbee können, Button 3x kurz drücken. Ich habs nicht ausprobiert und auch nicht recherchiert ob es Integrationen (z.B. in meinem Fall für HA) gibt, oder ob dann noch direkte Kopplungen von Blu DW / HT mit den TRVs und Einstellung der Interaktionen möglich sind. -
Der 1 Mini G3 hat auch einen Off-Timer der sich retriggern lässt, direkt von einem gekoppelten Blu Motion.
Und wenn ich das Verhalten richtig interpretiert habe, parallel dazu auch vom Switch-Eingang (Schraubklemme).
Das wäre vieleicht schon mal ein Kernelement das nicht mehr in einem Script realisiert werden müsste. Hab aber noch nicht ausprobiert ob sich der Ausschalttimer auch per Script retriggern lässt, das wäre halt Voraussetzung für eine Art Universal-zeitrelais, -treppenlicht, -esstischautomatscript, was dann auch zwangsläufig wechselnde Beleuchtungszustände oder anderen Input flexibel einbeziehen könnte.
Nachteil des Ausschalttimers: Direktes Ausschalten scheint nicht mehr möglich, die eingestellte Zeit bleibt abzuwarten. -
1.5.1 Beta? Wusste gar nicht das es die gibt. Normalerweise würde ich ja sagen, warum sollte das GW abstürzen, wenn bei einem gekoppelten BLE-Device die Batterien schwach sind? Aber irgendwas stimmt mit den GWs nicht, oder zumindest bei einer Charge denn es scheint noch ein paar andere mit Problemen zu geben.
HASmartThermostat: Werde ich mal ausprobieren. Allerdings ist bei mir eine Steuerung mit externen Sensoren und Heizungssteuerung eher mittelfristiges Ziel, zuerst müssen die Dinger mal lokal stabil funktionieren. Auch als spätere Fallbacklösung. Einen ESP mit e-Bus für die Heizung muss ich mir dafür auch noch bauen.
Aktuell nutze ich die Shelly MQTT-integration von hier, die geht auch für die TRVs (und soll neuerdings auch eine Möglichkeit zur Ventilsteuerung bieten):
https://github.com/bieniu/ha-shellies-discovery-gen2 -
Hast du mal die 1.5.0-beta ins GW geflasht?
20250109-090619/1.5.0-beta1-g16e0ef4
Falls du die MQTT Integration von "bieniu" verwendest, soll die auch vorausgesetzt sein, bei den neuesten Scriptversionen.
Und die Automation muss dann angepasst werden.TRV-FW ist bei mir gleich: 20241223-130807/v1.1.3@59915705. Bei der Version davor hat nichts mehr richtig funktioniert,
bei 2 Versionen davor lief es erstmals ganz gut, hat die TRV vorm Rücksenden bewahrt.
Davor bin ich auch schon mal mit 24°C in der Bude aufgewacht.
Das Gateway hat sicher auch noch Probleme, wirkt wie Abstürze, manchmal alle paar Minuten. Manchmal bekommt man 2-3 Tage Daten, dann für Tage nichts mehr, von allen dranhängenden BLE-Geräten. Immerhin regeln die TRV dann selbständig. -
JSE222 was hat dein Beispiel mit der hier besprochen Thematik zu tun?
Dein Problem mit der Override-Funktion ist recht simpel über Aktionen zu lösen.
Ich brauche die gleiche Funktion wie der TE, habe mich daher auf die Suche begeben und etwas gefunden was zumindest einem Lösungsansatz nahekommt. Darüber hinaus dachte ich, es wäre in dem Script eine weitere Funktion enthalten, die ich, aber vielleicht auch der TE brauchen könnte. Ich werde mich auch weiter damit beschäftigen und wenn ich die vom TE gewünschte Funktion realisieren kann, hier posten. Ob mit oder ohne Override oder in beiden Varianten.
Falls das in irgendeiner Weise einen Verstoss gegen die Forenregeln, oder für Dich ein Problem darstellen sollte bitte ich um einen entsprechenden Hinweis! -
Das Web/Http-Interface des Gateways, siehe unten. App hab ich nicht. Wenn die Sensoren dort per Hand gepairt wurden, sieht das so aus (in der ersten Zeile sind TRVs die ich händisch umbenannt habe). Aber wie schon erwähnt, ich vermute die Ursache in Home Assistant. Vielleicht auch Firmwareunterschiede der einzelnen Devices, ich hab sie erst nach der Erkennung/Integration in HA alle auf den gleichen Stand gebracht.
Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen. -
Ähnliches scheint ja (wie zu erwarten, ist ja ein Standard use case) nicht nur hier im Forum schon öfter Thema gewesen zu sein. Ich hab mal von hier: Shelly 4 schaltet Shelly 1 zusätzlich zum Bluetooth Motion
das Script auf einem 1 Mini G3 ausprobiert, bis jetzt scheint der Ansatz mit Zähler ganz gut zu funktionieren.
Die Override-Funktion des Lichtschalters finde ich auch ganz praktisch, funktioniert in der Form unten für den "Aus"-Zustand. Also Lichtschalter aus=immer aus, keine Bewegungserkennung. Als override für eine genervte Testfamilie, könnte man die Logik natürlich umdrehenEdit: Keine echte Override-Funktion, doch noch was zum basteln...
Nachteil: Die Blindzeit im Blu Motion spielt wohl eine Rolle, schöner wäre natürlich wenn man alle Parameter an einer Stelle hätte.
Ich kopier das Script mal bereinigt hier rein, im Original ist irgendwas durcheinander geraten mit Blockkommentaren.Code
Alles anzeigen/******************* START CHANGE HERE *******************/ //neu // wenn ein Schalter oder Taster diese Funktion aufruft, dann wird der merker zwischen 1 und -1 gewechselt. function handeinschaltungsFunktion(){ handeinschaltung = handeinschaltung * -1; print("handeinschaltungsFunktion aufgerufen. Neue Vorgabe (positiv oder negativ): " + handeinschaltung); if (handeinschaltung > 0){ // einschalten per Hand Shelly.call("Switch.Set", { id: 0, on: true }); } else{ // ausschalten per Hand Shelly.call("Switch.Set", { id: 0, on: false }); } } // neu ende function getRelayStatus(callback) { Shelly.call("Switch.GetStatus", { id: 0 }, function(result, error_code, error_message) { if (error_code === 0) { callback(result); } else { print("Error getting relay status:", error_message); } }); } let handeinschaltung = -1; let counterInputs = 0; let CONFIG = { // When set to true, debug messages will be logged to the console debug: false, // 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, evets from every bluetooth device are accepted. // allowedMacAddresses: null, allowedMacAddresses: [ "xx:xx:xx:xx:4A:83", // events only from these mac addresses are allowed. "11:22:33:45:5a:bc", ], /** * Called when motion is reported from the filtered Shelly BLU Motion devices. * @param {Boolean} motion true, when there is a motion, false otherwise. * @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":1er("Encrypted devices are not supported", "Error"); */ motionHandler: function(motion, eventData) { getRelayStatus(function(result) { // Wenn das Licht aus ist, Zähler auf 0 setzen if (result.output === false) { print("false output. Licht ist aus. Zähler auf 0 setzen"); counterInputs = 0; } // Wenn Bewegung erkannt wird if (motion == 1) { // Wenn der Zähler auf 0 ist und das Licht an ist (Schalter oder Taster haben das Licht eingeschaltet) counterInputs = counterInputs + 1; } // Wenn keine Bewegung erkannt wird if (motion == 0) { counterInputs = counterInputs - 1; } // Sicherstellen, dass der Zähler nicht negativ wird if (counterInputs < 0) { counterInputs = 0; } // Relais (Licht) basierend auf dem Zählerstatus schalten if (counterInputs > 0) { Shelly.call("Switch.Set", { id: 0, on: true }); } else { if (handeinschaltung < 0){ // prüfung ob Licht nicht per Hand eingeschaltet wurde. Shelly.call("Switch.Set", { id: 0, on: false }); } } // Den aktuellen Zählerstand ausgeben print("Der Zähler steht auf: " + counterInputs + ". Handeinschaltung ist (positiv oder negativ) : " + handeinschaltung); }); }, /** * Called when illuminance is reported from the filtered Shelly BLU Motion devices. * @param {Number} illuminance Current illuminance value. * @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"} */ illuminanceHandler: function (illuminance, eventData) { // Compile the topic based on the mac address of the reporter. let topic = eventData.address + "/illuminance"; // print("Sensor meldet in illuminanceHandler function. Helligkeit: " + illuminance + " von Motion Sensor: " + eventData.address); // Publush the data. MQTT.publish(topic, String(illuminance)); }, /** * 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) { // bekommt es diese Info immer oder nur beim aktiven abfragen ? // if Relay == aus && eventData.motion == true && eventData.illumination == 100 ??? dunkel halt: // dann schalte relay an // if relay = an && eventData.motion == false // dann schalte relay aus console.log("Motion onStatusUpdate funktion: ", eventData.motion, "Helligkeit:", eventData.illuminance); // print("Bewegung erkannt. Motion onStatusUpdate funktion: " + eventData.motion + " von Motion Sensor: " + eventData.address); } }; /******************* 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: "battery", 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; 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; result[_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; } } if ( typeof CONFIG.motionHandler === "function" && typeof data.motion !== "undefined" ) { CONFIG.motionHandler(data.motion === 1, data); logger("Motion handler called", "Info"); } if ( typeof CONFIG.illuminanceHandler === "function" && typeof data.illuminance !== "undefined" ) { CONFIG.illuminanceHandler(data.illuminance, data); logger("Illuminance handler called", "Info"); } if (typeof CONFIG.onStatusUpdate === "function") { CONFIG.onStatusUpdate(data); logger("New status update", "Info"); } } //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();
-
Ich stelle mir gerade vor wie da seit letztem Jahr 3 Leute bei jedem Essen herumwinken und wackeln
Bin zwar selber blutiger Anfänger, aber sowas will ich auch. Also nicht das mit dem Winken...
Daher hab ich mal einen Blu Motion mit einem 1 Mini G3 gekoppelt und mir angeschaut was da über Actions geht. Eher wenig. Man hat nur einen State Change als trigger, kann condition wählen zwischen Any, is, is not, letztere 2 noch verknüpfen mit true oder false. Das ergibt für mich wenig Sinn, ausser vielleicht für Leute die auf doppelte Verneinung stehen
Ich bin hier jetzt also doch kräftig am Winken, mit Totzeit (ok, manchmal reicht auch irgendwo kratzen).
Man sieht die eingestellte Zeit bis zum "Flip" ablaufen, ein Nachtriggern, auch nach der internen Blindzeit von 60s, bringt nichts, es wird ausgeschaltet.
Vermute mal, das geht nur mit Script. -
Ein wenig getestet, Ergebnis:
Die Blu DW und -Motion sind alle über das Blu GW an HA angebunden, unabhängig davon ob sie in dessen Oberfläche sichbar sind oder nicht. Sobald das GW unversorgt ist, kommen auch von keinem Daten mehr. Bleibt die Frage wieso sie nicht auch automatisch im Web-IF des GW erscheinen, man sie dort händisch pairen muss. Vielleicht ein Feature, für Geräte die man im GW mittels Script auswerten will.
Die Frage der unterschiedlichen Namen bleibt weiter offen. Hat offenbar nichts damit zu tun ob die Sensoren im Web-IF des Gateways sichtbar sind oder nicht. Möglicherweise einfach ein Versionsunterschied in der HA Integration, ein paar der Teile sind einige Tage später dazu gekommen. -
Wir sind uns doch im klaren, daß hier lediglich eine fehlerhafte Bedruckung vorliegt? Statt 2010 sollte es wohl 2020 heißen…
Nö, der Witz war mir entgangen. Keine Ahnung seit wann es Shellies oder ESP32 gibt.
-
Das sind doch zwei völlig verschiedene Sachen 😉
Shelly App benötigt einen/mehrere „Beobachter“ um die BLU in der Oberfläche anzeigen zu können
Ich habe keine Shelly-App erwähnt, hab ich auch nirgends installiert (außer der Debug-App, aber erst nach der HA Integration installiert).
Diese Auswahl hat überhaupt nichts mit Homeassistant zu tun! In HA musst Du einen/mehrere Shellys in der Integration als Bluetooth Gateway auswählen
Wenn Du z.B einen neuen BLU Door/Window auspackst (bzw. den Button klickst) der Nähe von einem Shelly der in HA als Bluetooth Gateway eingerichtet ist => wird HA dir das Gerät sofort als neues Gerät von der Integration BTHome angezeigt. In der Shelly App musst du aber nichts machen wenn du ihn dort nicht koppeln möchtestNein, anderer Shelly ist es nicht. Ausser im Blu GW überall der Bluetooth-Scannermodus deaktiviert. Im Blu GW steht es auf "Aktiv". Nun könnte es natürlich sein, dass mit dem GW eben zwei (eigentlich drei) Varianten möglich sind:
1. Pairen mit dem Blu GW, und Device-Button (ein PITA, sehr fummelig) so dass die Geräte dort im Web-IF und danach in HA erscheinen.
2. Pairen via Blu GW mit einem dort eingehängten direkt auswertenden Gerät. Hatte ich mit einem Blu TRV,
wobei ich keine Möglichkeit gefunden habe, eine solche Verknüpfung einfach zu ändern, auch sehr fummelig. Das geht wohl eh nur übers Web-IF des Blu-GW und dort ist der Sensor dann auch zu finden, nur etwas anders als die in 1.
(hab vergessen ob ein so verknüpfter Snesor dann in HA auftaucht, vermutlich nicht, sonst hätte ich das nicht wieder geändert)
3. Die automagische Variante, ohne langes Button drücken und ohne dass das Device im Web-IF irgend eines Shellys auftaucht, dafür aber in HA und mit verschiedenen von HA irgendwie gewählten Namen. Dass ich die Namen händisch ändern kann ist klar, ich frage mich aber wie diese unterschiedliche automatische! Nomenklatur zustande kommt. -
Ich sehe hier auch diverse unklare Phänomene mit Blu DW und Motion (ja, genau die aus dem Sonderangebot von schlepptopsnachgeworfen.de oder so). Z.B.: Die ersten musste ich noch mit dem Blu-GW pairen, der Rest wurde dann plötzlich einfach automagisch in HA integriert und die tauchen im Blu-GW auch gar nicht auf.
Einige sind als "Shelly BLU Door/Window abcd" eingebunden, andere als "BTHome sensor abcd", die Motion aber alle als"SBMO-003Z abcd". Beleuchtungsmesswerte verhalten sich auch ziemlich cryptisch.
Blöderweise scheint sich das GW ab und zu wegzuhängen, oder zumindest dessen BT-Teil, erreichbar via WiFi bleibt es.
Alles sehr undurchsichtig, sobald ich näheres herausfinde schreib ich das hier. -
Seltsam. Klar für automatisierte Produktion designed, sieht aber zumindest teilweise handbestückt aus. Die diskreten Teile wahrscheinlich sogar per Pinzette und Lötkolben. Dagegen spricht aber U2, der könnte einen Reflowofen von innen gesehen haben. Vermutlich früher Prototyp oder aus erstem Batch. Reflow in Mutters Backofen schief gegangen und dann händisch die Paste nachgelötet, oder so. Been there, done that. Aber schöner