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

                            483
                            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