Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Fenster offen Script, Drehgriffkontakte einbinden

    NEWS

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    Fenster offen Script, Drehgriffkontakte einbinden

    This topic has been deleted. Only users with topic management privileges can see it.
    • coyote
      coyote Most Active last edited by

      Bräuchte etwas Hilfe von den Script Profis 😉

      Ich nutze mometan folgendes Script (ist hier aus dem Forum), um die offenen Fenster zu zählen und unter anderem in Vis anzuzeigen.

      Jetzt habe ich noch Drehgriffkontakte und würde die gerne mit einbinden. Wenn die Drehgriffe in Stellung offen sind funktioniert schon (im Script status ===2) aber wie muss ich das Script weiter ändern, damit mir auch die Fenster im Zustand "gekippt" (status===1) angegeben bzw. der gekippt Status mit in das Array geschrieben wird

      createState('zählen_Fenster.anzahlFenster', 0);    // wenn benötigt: Anzahl der vorhandenen Fenster
      createState('zählen_Fenster.anzahlFensterauf', 0);  // Anzahl der Fenster, die an sind als Variable unter Javascript.0 anlegen
      createState('zählen_Fenster.textFensterauf', " ");  // Anzahl der Fenster, die an sind als Variable unter Javascript.0 anlegen
      
      var cacheSelector = $('channel[state.id=*.STATE](functions=Fenster)');
      
      var cacheSelectorState  = $('channel[state.id=*.STATE](functions=Fenster)');
      
      function countFenster(obj) {
           // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Fenster auf 0
          var anzahlFenster = 0;
          var anzahlFensterauf = 0;
          var textFensterauf = [];
      
         log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val);    // Info im Log, welcher Zustand sich geändert hat
      
         cacheSelectorState.each(function (id, i) {                       // Schleife für jedes gefundenen Element *.STATE im Gewerk Fenster
              var status = getState(id).val;                          // Zustand *.STATE abfragen (jedes Element)
              var obj    = getObject(id);
              if (status === true || status === 2) {    // wenn Zustand = true, dann wird die Anzahl der Fenster hochgezählt/Zustand 2 ist für Drehgriff offen
                   textFensterauf.push(obj.common.name);    // Zu Array hinzufügen
              }                
              log("Fenster Nr. " + i + ": " + getObject(id).common.name + ": " + status);
              ++anzahlFenster;                                        // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status
          }); 
      
          // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
              log("Text: " + anzahlFensterauf);
              log("Anzahl Fenster: " + anzahlFenster + " # davon Fenster offen: " +  anzahlFensterauf);
      
          // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
         setState("zählen_Fenster.textFensterauf", textFensterauf.join(',
      '));    // Schreibt die aktuelle Namen der offenen Fenster
         setState("zählen_Fenster.anzahlFensterauf", textFensterauf.length);    // Schreibt die aktuelle Anzahl der offenen Fenster
         setState("zählen_Fenster.anzahlFenster", anzahlFenster);        // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Fenster
      }
      
      1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        Hallo,

        ich nutze dieses Skript:

        ! ````
        /* System Zahl Fenster
        ! zählt die Fenster in allen Räumen und meldet die offenen Fenster namentlich
        Daten kommen vom Gewerk 'Fenster'
        ! erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564
        05.08.2015 STATE aus der Ausgabe entfernt nach Idee von stephan61 http://forum.iobroker.org/viewtopic.php?f=21&t=473&start=20#p9267
        02.12.2015 Fehler beseitigt bei Anzahl Fenster, wenn offen (Unterscheidung RHS und TFK)
        Überprüfung des Zustandes (function fensterstatus) und Übergabe an Text
        25.01.2016 Fenster Nummer in Log korrigiert (+1)
        02.03.2016 Ansage für TTS aufbereitet
        */
        ! function fensterstatus(zustand) {
        var meldung;
        switch (zustand) {
        case 1:
        meldung = 'RHS gekippt';
        break;
        case 2:
        meldung = 'RHS offen';
        break;
        case true:
        meldung = 'TFK offen';
        break;
        default:
        meldung = 'geschlossen';
        break;
        }
        return(meldung);
        }
        ! createState('zählen_Fenster.anzahlFenster', { // wenn benötigt: Anzahl der vorhandenen Fenster
        type: 'number',
        min: 0,
        def: 0,
        role: 'value'
        });
        createState('zählen_Fenster.anzahlFensterauf', { // Anzahl der Fenster, die auf sind als Variable unter Javascript.0 anlegen
        type: 'number',
        min: 0,
        def: 0,
        role: 'value'
        });
        createState('zählen_Fenster.textFensterauf', { // Anzahl der offenen Fenster und deren Namen als Variable unter Javascript.0 anlegen
        type: 'string',
        def: ' ',
        role: 'value'
        });
        ! var cacheSelectorState = $('channelstate.id=*.STATE');
        ! function countFenster(obj) {
        // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Fenster auf 0
        var anzahlFenster = 0;
        var anzahlFensterauf = 0;
        var textFensterauf = [];
        ! log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat

        cacheSelectorState.each(function (id, i) {                                  // Schleife für jedes gefundenen Element *.STATE im Gewerk Fenster
            var status = getState(id).val;                                          // Zustand *.STATE abfragen (jedes Element)
            var obj    = getObject(id);
            var name = getObject(id).common.name;
            var devicename = name.substring(0, name.indexOf(".STATE"));             //.state aus Text entfernen
            if (status /*TFK*/ || status === 1 || status === 2 /*RHS*/) {  // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt
                 ++anzahlFensterauf;
                 textFensterauf.push(devicename + ' (' + fensterstatus(status) + ')');  // Name und Zustand zum Array hinzufügen
            }                
            log('Fenster #' + (i+1) + ': ' + devicename + ' ' + fensterstatus(status)/* + ' (' + status + ' / ' + typeof status + ')'*/);
            ++anzahlFenster;                                                        // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status
        }); 
        
        // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
            log("Text: " + textFensterauf);
            log("Anzahl Fenster: " + anzahlFenster + " - davon Fenster auf: " +  anzahlFensterauf);
        

        ! // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
        setState("zählen_Fenster.textFensterauf", textFensterauf.join(',
        ')); // Schreibt die aktuelle Namen der offenen Fenster
        setState("zählen_Fenster.anzahlFensterauf", textFensterauf.length); // Schreibt die aktuelle Anzahl der offenen Fenster
        setState("zählen_Fenster.anzahlFenster", anzahlFenster); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Fenster
        }
        ! cacheSelectorState.on(function(obj) { // bei Zustandänderung *. STATE im Gewerk Fenster
        countFenster(obj);
        });
        ! // Variable für Ansage aufbereiten
        createState('zählen_Fenster.textFensteraufAnsage', {
        type: 'string',
        def: ' ',
        role: 'value'
        });
        // Anzahl der Fenster, die auf sind, für Ansage aufbereitet
        var idQuelle = 'javascript.0.zählen_Fenster.textFensterauf',
        idAnsage = 'javascript.0.zählen_Fenster.textFensteraufAnsage';
        ! on(idQuelle, function (obj) {
        var text = obj.state.val;
        text = text.replace(/RHS/g, 'Drehgriff'); // RegEx Suche greedy
        text = text.replace(/TFK/g, 'Reedkontakt'); // soll alle Vorkommen ersetzen
        text = (text.length > 1) ? 'Geöffnete Fenster: ' + text : 'Alle Fenster sind verschlossen';
        setState(idAnsage, text);
        });
        ! ````

        Gruß

        Pix

        Editiert am 2.7.2016 (Replace mit regex-Suche)

        1 Reply Last reply Reply Quote 0
        • coyote
          coyote Most Active last edited by

          Hi Pix,

          erst mal danke, sieht schon gut aus soweit. Am Schluss des Scripts wird der Text aufbereitet für die Ansage, jedoch wird bei mir nur jeweils der erste TFK durch Reedkontakt und der erste RHS durch Drehgriff ersetzt. Bei den weiteren Aufzählungen steht noch TFK bzw. RHS drin

          1 Reply Last reply Reply Quote 0
          • P
            pix last edited by

            Hallo coyote,

            du hast Recht. Habe das Skript oben geändert. Der replace-Befehl war falsch angewendet. Bei einfacher Suche nach einem String, wird nur dessen erstes Vorkommen ersetzt. Man muss Reguläre Ausdrücke (gierig) verwenden, dann gehts 8-)

            text = text.replace(/RHS/g, 'Drehgriff'); // RegEx Suche greedy
            

            Gruß

            Pix

            1 Reply Last reply Reply Quote 0
            • D
              deifel last edited by

              Hallo,

              sorry, dass ich dieses alte Thema ausgrabe, aber ich bin aktuell an meinen Fensterabfragen dran und muss mich (leider) als völliger Laie jetzt mit Scripten auseinandersetzen.

              Ich möchte dabei nur das ein Metro Dialog Widget nutzen, um beim Anklicken einen zusätzlichen Dialog zu bekommen mit den aktuell geöffneten Fenstern.

              Alle Fenster sind in Homematic dem Gewerk "Fenster" zugeordnet.

              Meine Frage (sorry für die Anfängerfragen):

              Wo und wie muss ich das Script erstellen? Brauche ich z. B. Blockly dazu oder kann ich das irgendwie im Widget oder allgemein einbauen?

              Blockly habe ich zwar installiert, aber da stehe ich völlig vor dem Berg und weiß nicht mal, wie ich es starten kann (über den Web-Adapter)?

              Nochmals sorry für meine Fragen und bitte keine Links zur Doku von IOBroker - die hab ich versucht zu lesen - aber wenn man kein Programmierer ist und nur einige einfache Dinge umsetzen möchte, dann ist das nicht so einfach…

              Grüße

              Frank

              1 Reply Last reply Reply Quote 0
              • P
                pix last edited by

                Hallo Frank,

                dieser Thread ist gelöst. Bitte öffne einen neuen Thread mit deinem Anliegen.

                Allerdings mache ich mir wenig Hoffnung, dass dir ohne Dokumentation geholfen werden kann. Denn hier können wir nur ergänzende Hilfe zu den Dokus geben. Wenn dir die Doku, nicht ausreicht, mache einen Thread auf "Frage zur Doku: THEMA".

                Trotzdem Doku-Links:

                Einsteiger: http://www.iobroker.net/docu/?page_id=6317&lang=de

                Einführung Programmieren mit Javascript http://www.iobroker.net/docu/?page_id=2786&lang=de

                Adapter JavaScript Script http://www.iobroker.net/docu/?page_id=6818&lang=de

                Gruß

                Pix

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

                Support us

                ioBroker
                Community Adapters
                Donate

                805
                Online

                32.0k
                Users

                80.5k
                Topics

                1.3m
                Posts

                3
                6
                2296
                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