NEWS
Aqara RTCGQ11LM - no_occupancy_since fehlt über Zigbee2MQTT
-
Hallo zusammen,
ich bin aktuell von Zigbee-HomeAutomation (iobroker.zigbee Adapter) auf MQTT/Zigbee2MQTT zu wechsel. Ich habe nur leider ein Problem bei dem ich gerade nicht weiter komme.
Im Zigbee-HomeAutomation hatte ich beim Bewegungsmelder den Wert "no_motion" = Sekunden seit der letzten Bewegungserkennung. Diesen Wert verwende ich in Skripten zum Steuern von Lichtern.
Im MQTT Explorer konnte ich prüfen, dass die Werte korrekt übermittelt werden. Jedoch scheint das den Zigbee2MQTT Adapter in iobroker nicht zu interessieren.
Hat jemand von Euch nen Tipp?
-
@amylopektin
Laut Github Comments sieht es aktuell "dünn" aus, was eine Anpassung bzgl. "no_occupancy_since" angeht.Habe jetzt einen Workaround dafür.
Solange der State "Occupancy" sich nicht verändert, wird bis zu 1200 Sekunden hochgezählt. Danach erfolgt keine Aktualisierung mehr. Sollte sich der State "Occupancy" während oder nach dem Hochzählen verändern, wird von neuem hochgezählt. Initial wird - wenn Occupancy auf true ist, gezählt. Wenn Occupancy auf false ist, wird der eingestellte Maximalwert an Sekunden in den State geschrieben (Default 1200 Sekunden). Der Rest sollte aus dem Script heraus ersichtlich sein.// Bewegungsmelder-Datenpunkte const motionSensor1 = "zigbee2mqtt.0.0x00158d0007752803.occupancy"; // Ersetze dies durch den tatsächlichen Pfad zum Bewegungsmelder 1 const motionSensor2 = "zigbee2mqtt.0.0x00158d000775a2dd.occupancy"; // Ersetze dies durch den tatsächlichen Pfad zum Bewegungsmelder 2 // Ziel-Datenpunkte für die Sekunden seit letzter Bewegung const state1 = "0_userdata.0.Custom_Variables.Treppenaufgang.Bewegungsmelder_EG.no_occupancy_since"; const state2 = "0_userdata.0.Custom_Variables.Treppenaufgang.Bewegungsmelder_OG.no_occupancy_since"; // Maximale Sekundenanzahl (1200 Sekunden = 20 Minuten) const maxSeconds = 1200; // Variable für die Zeitintervalle in Sekunden, nach denen der Zähler erhöht wird const interval = 10; // Setze diesen Wert auf die gewünschte Anzahl an Sekunden // Timer-Variablen let timer1 = null; let timer2 = null; // Funktion zum Starten oder Zurücksetzen des Timers für einen Sensor function startOrResetTimer(sensor, state, timer) { if (timer) clearInterval(timer); // Vorherigen Timer stoppen setState(state, 0); // Zähler auf 0 setzen // Neuen Timer starten return setInterval(() => { let currentValue = getState(state).val; if (currentValue < maxSeconds) { setState(state, currentValue + interval); } else { clearInterval(timer); // Timer stoppen, wenn maxSeconds erreicht sind } }, interval * 1000); // Intervall in Millisekunden (z.B. alle 10 Sekunden) } // Bewegungsmelder 1 überwachen on({id: motionSensor1, change: "ne"}, function (obj) { if (obj.state.val && !obj.oldState.val) { // Wechsel von false auf true timer1 = startOrResetTimer(motionSensor1, state1, timer1); } }); // Bewegungsmelder 2 überwachen on({id: motionSensor2, change: "ne"}, function (obj) { if (obj.state.val && !obj.oldState.val) { // Wechsel von false auf true timer2 = startOrResetTimer(motionSensor2, state2, timer2); } }); // Initialisierung: Timer oder Initialwert setzen function initializeState(sensor, state) { if (getState(sensor).val) { // Wenn Occupancy auf true steht timer1 = startOrResetTimer(sensor, state, timer1); // Timer starten } else { // Wenn Occupancy auf false steht setState(state, maxSeconds); // Wert auf 1200 Sekunden setzen } } // Initialisierung für beide Bewegungsmelder initializeState(motionSensor1, state1); initializeState(motionSensor2, state2);
-
@amylopektin sagte in Aqara RTCGQ11LM - no_occupancy_since fehlt über Zigbee2MQTT:
utomation hatte ich beim Bewegungsmelder de
Verdammt... genau das hab ich auch grad bemerkt... habe jetzt 40 Geräte vom Zigbee Adapter umgestellt auf Zigbee2Mqtt und jetzt kommen 10 Bewegungsmelder... Datenpunkt fehlt mir auch :-(. Habe einige Scripte die die no Occupancy since werte verwenden.
Ich werde dein Script verwenden, Danke dafür.
Über Kurz oder Lang wäre das ne ziemlich coole Nummer wenn das im Zigbee2Mqtt Adapter eingearbeitet werden würde... die Konfiguration wann die Werte gesendet werden sollen gibt es in Zigbee2Mqtt ja bereits, nur müsste das als Datenpunkt in iobroker angelegt werden.
-
ich habe hier ein besseres Script (habe ich mir damals für meine Aquara P1 programmiert und gerade noch angepasst:)
Es durchsucht alle Geräte im "Zigbee2Mqtt.0" welche einen Datenpunkt "occupancy" haben (sollten also nur Bewegungsmelder sein).
Es legt den Datenpunkt "no_motion" als Zahlenwert an und aktualisiert ihn alle 10 Sekunden wenn occupancy auf false steht (zählt auf unbegrenzte Zeit in 10 Sekunden Schritten nach oben) oder setzt no_motion auf "0" wenn occupancy auf true geht.
Mit diesem Script brauchst du also nicht alle Bewegungsmelder im Script erfassen.
Einfach ein Javascript anlegen Code reinkopieren, starten und freuen
///////////////////////////////////////////////////////// // Bei Scriptstart Subscription-Objekte festlegen ////// ///////////////////////////////////////////////////////// var object_occupancy = $('channel[state.id=zigbee2mqtt.0.*.occupancy]'); // Alle Sensoren mit occupancy ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Funktion, die prüft, ob der no_motion-Datenpunkt existiert, und ihn bei Bedarf erstellt function checkAndCreateNoMotion(id) { var parentDeviceId = id.split(".").slice(0,-1).join("."); // Geräte-ID ohne .occupancy var noMotionId = parentDeviceId + '.no_motion'; // no_motion-Datenpunkt // Prüfen, ob der no_motion-Datenpunkt existiert if (!existsState(noMotionId)) { setObject(noMotionId, { type: 'state', common: { name: 'No Motion Duration', type: 'number', role: 'value', unit: 's', def: 0, read: true, write: true }, native: {} }); } } // Hauptfunktion, die die Sensoren durchläuft und den no_motion-Wert setzt function Schleife() { object_occupancy.each(function (id, i) { checkAndCreateNoMotion(id); // Prüfen und ggf. Anlegen des no_motion-Datenpunkts var occupancy = getState(id).val; // occupancy-Wert ermitteln (true/false) var occupancy_changezeitpunkt = getState(id).lc; // Zeitstempel letzte Änderung var aktuelles_Datum = new Date().getTime(); var parentDeviceId = id.split(".").slice(0,-1).join("."); var noMotionId = parentDeviceId + '.no_motion'; if (occupancy === false) { // wenn occupancy auf false steht, ermitteln seit wann var differenz = Math.round((aktuelles_Datum - occupancy_changezeitpunkt) / 1000); // Differenz in Sekunden setState(noMotionId, differenz, true); } else if (occupancy === true) { // wenn occupancy auf true -> last Motion auf 0 setzen setState(noMotionId, 0, true); } }); } /////////////////////////////////////////////////////////// // Trigger /////////////////////////////////////////////// /////////////////////////////////////////////////////////// object_occupancy.on(function() { // bei Zustandänderung occupancy (true/false) Schleife(); }); schedule("*/10 * * * * *", function () { // jede 10 Sekunden Schleife(); });
-
@amylopektin sagte in Aqara RTCGQ11LM - no_occupancy_since fehlt über Zigbee2MQTT:
Laut Github Comments sieht es aktuell "dünn" aus, was eine Anpassung bzgl. "no_occupancy_since" angeht.
aha... und das resultiert woraus ??? ich seh auf GIT kein issue dafür
das Gerät kann
und das wird bestimmt auch so angezeigt...
das von dir erwähnte no_motion ist eine besonderheit von zigbee2mqtt... das wird nicht DIREKT vom Gerät geliefert...
ausserdem was ist das da im object
ich würde mal behaupten dass soll so nicht..