Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst]Zustand invertieren, Fenster offen Script

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst]Zustand invertieren, Fenster offen Script

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

      reagiere doch per Script auf den zustand des Datenpunktes und invertiere es

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

        Naja, glaube so einfach ist es nicht.

        Das Script holt ja alle Werte vom Gewerk Fenster

        Hier mal das Script:

        /* 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  = $('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);
                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');
            text = text.replace(/TFK/g, 'Reedkontakt');
            text = (text.length > 1) ? text : 'Alle Fenster sind verschlossen';
            setState(idAnsage, text);
        });
        
        1 Reply Last reply Reply Quote 0
        • W
          weimaraner last edited by

          Ist das mit homematic und einer ccu? Falls ja, dort kannst du -zumindest bei den Funk TFKs- einstellen, ob offen=true oder offen=false ist. Habe ich bei einem auch so gemacht.

          Grüße Andreas

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

            Das ist korrekt, mit den TFK's geht das, aber leider nicht mit den Digital Eingängen des 12/14 Wired Moduls.

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

              Keiner eine Idee wie ich das lösen könnte?

              Gesendet von meinem Pixel mit Tapatalk

              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 last edited by

                @coyote:

                Keiner eine Idee wie ich das lösen könnte? `
                Du kannst die Tatsache auswerten, dass die wired Geräte in einer anderen Instanz (z.B. 1) von hm-rpc sind.

                ...
                        var status = getState(id).val;                                          // Zustand *.STATE abfragen (jedes Element)
                        if(id.split('.')[1] == '1') status = !status;  // wired in Instanz hm-rpc.1 ?
                        ...
                
                
                1 Reply Last reply Reply Quote 0
                • coyote
                  coyote Most Active last edited by

                  Hallo paul,

                  Danke für deine Hilfe, die Idee ist an sich gar nicht schlecht, nur muss ich dann wohl doch noch etwas umverdraten, da ich einmal Kontakte an den TTL Eingängen und einmal an den anderen analog/digital Eingängen habe.

                  Muss mich wohl für eine Richtung entscheiden, was anderes bleibt mir wohl nicht oder fällt dir noch was ein wie ich es über Script lösen kann?

                  Gesendet von meinem Pixel mit Tapatalk

                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    @coyote:

                    fällt dir noch was ein wie ich es über Script lösen kann? `
                    Du kannst auch noch die Kanäle auswerten:

                    ...
                            var status = getState(id).val;                                          // Zustand *.STATE abfragen (jedes Element)
                            var ch = parseInt(id.split('.')[3]);
                            if(id.split('.')[1] == '1' && ch >= 15 && ch <= 20)) status = !status;  // wired Instanz hm-rpc.1 und Kanäle 15 bis 20
                            ...
                    
                    1 Reply Last reply Reply Quote 0
                    • coyote
                      coyote Most Active last edited by

                      Aha, na das ist ja klasse. Das sollte gehen. Und wie baue ich das jetzt in das obige Script ein, damit ich zum Schluss nur einen Javascript Datenpunkt bzww ein Array hab mit allen Fenstern?

                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 last edited by

                        @coyote:

                        Und wie baue ich das jetzt in das obige Script ein, `
                        Hinter die Zeilen

                            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)
                        
                        
                        1 Reply Last reply Reply Quote 0
                        • coyote
                          coyote Most Active last edited by

                          Ok, werde ich gleich mal testen.

                          Hab aber noch ne Frage dazu. Ich habe auf 2 Modulen die Kontakte auf unterschiedlichen und auch mal auf gleichen Kanälen bzw. auf einem Modul ist auf Kanal 15 ein Reedkontakt vom Fenster auf dem zweiten Modul ist mein Klingelsignal.

                          Das sollte aber kein Problem sein oder? Da das Script ja nur im Gewerk Fenster sucht

                          1 Reply Last reply Reply Quote 0
                          • paul53
                            paul53 last edited by

                            @coyote:

                            Das sollte aber kein Problem sein oder? Da das Script ja nur im Gewerk Fenster sucht `
                            Sehe ich auch so.

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

                              Funktioniert wie jetzt gewünscht. Danke Paul [THUMBS UP SIGN]

                              Gesendet von meinem Pixel mit Tapatalk

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              495
                              Online

                              31.7k
                              Users

                              79.8k
                              Topics

                              1.3m
                              Posts

                              4
                              14
                              2708
                              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