Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Aqara RTCGQ11LM - no_occupancy_since fehlt über Zigbee2MQTT

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    Aqara RTCGQ11LM - no_occupancy_since fehlt über Zigbee2MQTT

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      Amylopektin last edited by

      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?

      A K 2 Replies Last reply Reply Quote 0
      • A
        Amylopektin @Amylopektin last edited by

        @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);
        
        
        K 1 Reply Last reply Reply Quote 0
        • K
          Kaskadeur111 @Amylopektin last edited by

          @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.

          d220e3fa-a84f-4b3e-8ee1-e9be3328679a-image.png

          fa37b1f1-9ea5-4810-8d0a-8481e616e5fa-image.png

          5664ff18-9efd-495b-8738-c449fda99943-image.png

          1 Reply Last reply Reply Quote 0
          • K
            Kaskadeur111 @Amylopektin last edited by

            @amylopektin

            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();
            });
            
            
            1 Reply Last reply Reply Quote 0
            • arteck
              arteck Developer Most Active last edited by arteck

              @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
              20e27500-e609-4227-927a-7974602a5247-grafik.png

              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

              78e88d4e-36c1-4a03-8b44-dd387db41a66-grafik.png

              ich würde mal behaupten dass soll so nicht..

              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate
              FAQ Cloud / IOT
              HowTo: Node.js-Update
              HowTo: Backup/Restore
              Downloads
              BLOG

              756
              Online

              31.6k
              Users

              79.5k
              Topics

              1.3m
              Posts

              nooccupancysince rtcgq11lm zigbee2mqtt
              3
              5
              299
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo