Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Timeout bei Event wieder stoppen, dynamische Instanz

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    966

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Timeout bei Event wieder stoppen, dynamische Instanz

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
7 Beiträge 3 Kommentatoren 64 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • S Offline
    S Offline
    Sesamstrasse
    schrieb am zuletzt editiert von Sesamstrasse
    #1

    Hallo zusammen,

    ich habe sehr viele Fenster und wenn es draußen kalt ist, lasse ich mich gerne erinnern, falls noch ein Fenster beim Lüften vergessen wurde zu schließen. Das klappt auch soweit super. Mein Skripkt hat aber noch eine kleine Schwäche. Wenn das Fenster/ die Tür zwischenzeitlich geschlossen wurde, wird der Timer nicht zurückgesetzt. Wenn man es dann wieder öffnet, z.B. Haustüre, kommt die Meldung, dass selbiges noch offen ist sehr, schnell aufgrund des alten vorherigen Timers.

    Da ich den Trigger über die Schleife für jedes Fenster aktiviere, habe ich nicht wirklich eine Instanz wo ich mir den aktiven Timer wiederholen kann. In Java hätte ich jetzt mit einer Hashmap gearbeitet. Ich bin mir aber nicht sicher, was hier in JavaScript der elegante Weg ist, um das zu programmieren. Hat hier jemand einen Tipp, bzw. etwas Codesnipsle?

    Vielen Dank
    Flo

    console.log('started...');
    
    const windowDetect = $('zigbee.0.*.opened');
    var temperaturLinit = 14;
    var count = 0;
    var timeout = 600000;
    //timeout = 10000;
    
    windowDetect.each(function (id, i) {
        let room = getObject(id, 'rooms').enumNames[0];
        if (typeof room == 'object') room = room.de;
        let funtions = getObject(id, 'functions').enumNames[0];
        if (typeof funtions == 'object') funtions = funtions.de;
        let message = room + ' ' + funtions + ' steht offen!';
        registerTrigger(id, message);
        count++;
    });
    
    console.log(count + ' sensors registered...');
    
    
    function registerTrigger(id, message) {
    
        on({ id: id, change: "ne" }, async function (obj) {
           
            //Lüftungscheck
            //console.log('Lüftungscheck');
            //console.log('getState("zigbee.0.00124b002918d071.temperature").val ' + getState("zigbee.0.00124b002918d071.temperature").val);
            //console.log('temperaturLinit ' + temperaturLinit);
            //console.log('new Date().getMonth() ' + new Date().getMonth());
           
            if (getState("zigbee.0.00124b002918d071.temperature").val < temperaturLinit && ((new Date().getMonth() < 4) || (new Date().getMonth() > 9))) {
                // console.log('Lüftungscheck true');
                if (obj.state.val) {
                    //console.log('Lüftungscheck obj true');
                    setTimeout(async function () {
                        let count = 1;
                        //console.log('Lüftungscheck count ' + count);
                        while (count < 10 && getState(obj.id).val && getState("zigbee.0.00124b002918d071.temperature").val < temperaturLinit) {
                            count++;
                            await alexaAnnounce(message);
                            await telegram(message);
                            await wait(timeout);
                        }
                    }, timeout);
                }
            }
        });
    }
    
    
    paul53P 1 Antwort Letzte Antwort
    0
    • arteckA Offline
      arteckA Offline
      arteck
      Developer Most Active
      schrieb am zuletzt editiert von
      #2

      na ja irgendwo musst du dir den timer merken.. pro fenster..

      zigbee hab ich, zwave auch, nuc's genauso und HA auch

      paul53P 1 Antwort Letzte Antwort
      0
      • arteckA arteck

        na ja irgendwo musst du dir den timer merken.. pro fenster..

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von paul53
        #3

        @arteck sagte: timer merken.. pro fenster..

        ... und count pro Fenster.

        Array of timers und Array of counts, korrespondierend zu einem Array of ids, um den Index zu ermitteln.

        const ids = $('zigbee.0.*.opened').toArray();
        const timers = new Array(ids.length).fill(null);
        const counts = new Array(ids.length).fill(0);
        

        EDIT: Verwende Intervalle.

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        1 Antwort Letzte Antwort
        0
        • arteckA Offline
          arteckA Offline
          arteck
          Developer Most Active
          schrieb am zuletzt editiert von arteck
          #4

          ich hätte mir das fenster als counter genommen.. es darf ja nur einer pro fenster laufen..

          zigbee hab ich, zwave auch, nuc's genauso und HA auch

          1 Antwort Letzte Antwort
          0
          • S Sesamstrasse

            Hallo zusammen,

            ich habe sehr viele Fenster und wenn es draußen kalt ist, lasse ich mich gerne erinnern, falls noch ein Fenster beim Lüften vergessen wurde zu schließen. Das klappt auch soweit super. Mein Skripkt hat aber noch eine kleine Schwäche. Wenn das Fenster/ die Tür zwischenzeitlich geschlossen wurde, wird der Timer nicht zurückgesetzt. Wenn man es dann wieder öffnet, z.B. Haustüre, kommt die Meldung, dass selbiges noch offen ist sehr, schnell aufgrund des alten vorherigen Timers.

            Da ich den Trigger über die Schleife für jedes Fenster aktiviere, habe ich nicht wirklich eine Instanz wo ich mir den aktiven Timer wiederholen kann. In Java hätte ich jetzt mit einer Hashmap gearbeitet. Ich bin mir aber nicht sicher, was hier in JavaScript der elegante Weg ist, um das zu programmieren. Hat hier jemand einen Tipp, bzw. etwas Codesnipsle?

            Vielen Dank
            Flo

            console.log('started...');
            
            const windowDetect = $('zigbee.0.*.opened');
            var temperaturLinit = 14;
            var count = 0;
            var timeout = 600000;
            //timeout = 10000;
            
            windowDetect.each(function (id, i) {
                let room = getObject(id, 'rooms').enumNames[0];
                if (typeof room == 'object') room = room.de;
                let funtions = getObject(id, 'functions').enumNames[0];
                if (typeof funtions == 'object') funtions = funtions.de;
                let message = room + ' ' + funtions + ' steht offen!';
                registerTrigger(id, message);
                count++;
            });
            
            console.log(count + ' sensors registered...');
            
            
            function registerTrigger(id, message) {
            
                on({ id: id, change: "ne" }, async function (obj) {
                   
                    //Lüftungscheck
                    //console.log('Lüftungscheck');
                    //console.log('getState("zigbee.0.00124b002918d071.temperature").val ' + getState("zigbee.0.00124b002918d071.temperature").val);
                    //console.log('temperaturLinit ' + temperaturLinit);
                    //console.log('new Date().getMonth() ' + new Date().getMonth());
                   
                    if (getState("zigbee.0.00124b002918d071.temperature").val < temperaturLinit && ((new Date().getMonth() < 4) || (new Date().getMonth() > 9))) {
                        // console.log('Lüftungscheck true');
                        if (obj.state.val) {
                            //console.log('Lüftungscheck obj true');
                            setTimeout(async function () {
                                let count = 1;
                                //console.log('Lüftungscheck count ' + count);
                                while (count < 10 && getState(obj.id).val && getState("zigbee.0.00124b002918d071.temperature").val < temperaturLinit) {
                                    count++;
                                    await alexaAnnounce(message);
                                    await telegram(message);
                                    await wait(timeout);
                                }
                            }, timeout);
                        }
                    }
                });
            }
            
            
            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von paul53
            #5

            @Sesamstrasse sagte: etwas Codesnipsle?

            Versuche es mal so:

            const ids = $('zigbee.0.*.opened').toArray();
            const timers = new Array(ids.length).fill(null);
            const counts = new Array(ids.length);
            const mesgs = [];
            const timeout = 600000;
            const temperaturLimit = 14;
            
            for(let i = 0; i < ids.length; i++) {
                const id = ids[i];
                let room = getObject(id, 'rooms').enumNames[0];
                if (typeof room == 'object') room = room.de;
                let funktion = getObject(id, 'functions').enumNames[0];
                if (typeof funktion == 'object') funktion = funktion.de;
                mesgs[i] = room + ' ' + funktion + ' steht offen!';
            };
            
            on(ids, function(dp) {
                const idx = ids.indexOf(dp.id);
                if(dp.state.val && getState("zigbee.0.00124b002918d071.temperature").val < temperaturLimit && ((new Date().getMonth() < 4) || (new Date().getMonth() > 9))) {
                    let counts[idx] = 10;
                    timers[idx] = setInterval(function() {
                        if(counts[idx] > 0) {
                            alexaAnnounce(mesgs[idx]);
                            telegram(mesgs[idx]);
                            counts[idx]--;
                        } else {
                            clearInterval(timers[idx]);
                            timers[idx] = null;
                        }
                    }, timeout);
                } else if(timers[idx]) {
                    clearInterval(timers[idx]);
                    timers[idx] = null;
                }
            });
            

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            1 Antwort Letzte Antwort
            1
            • S Offline
              S Offline
              Sesamstrasse
              schrieb am zuletzt editiert von
              #6

              Vielen Dank euch für die schnelle Hilfe! Funzt perfekt.

              1 Antwort Letzte Antwort
              0
              • S Offline
                S Offline
                Sesamstrasse
                schrieb am zuletzt editiert von
                #7

                Und den Bug mit den counts habe ich noch gar nicht realisiert. In Java wäre das gegangenen :) ein zweites mal vielen Dank!

                1 Antwort Letzte Antwort
                0
                Antworten
                • In einem neuen Thema antworten
                Anmelden zum Antworten
                • Älteste zuerst
                • Neuste zuerst
                • Meiste Stimmen


                Support us

                ioBroker
                Community Adapters
                Donate

                733

                Online

                32.6k

                Benutzer

                82.2k

                Themen

                1.3m

                Beiträge
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                ioBroker Community 2014-2025
                logo
                • Anmelden

                • Du hast noch kein Konto? Registrieren

                • Anmelden oder registrieren, um zu suchen
                • Erster Beitrag
                  Letzter Beitrag
                0
                • Home
                • Aktuell
                • Tags
                • Ungelesen 0
                • Kategorien
                • Unreplied
                • Beliebt
                • GitHub
                • Docu
                • Hilfe