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

      Hallo,

      bräuchte eine Lösung für folgendes Problem:

      Ich nutze das "Fenster offen" Script von Pix, um die offenen Fenster mit Drehgriff und TFK anzeigen zu lassen.

      Jetzt habe ich jedoch seit gestern noch 3 Fenster an den Digital Eingängen eines 12/14er wired Modul hängen (hab sonst nix mehr frei :-)) Diese melden aber bei geschlossenem ReedKontakt den Zustand "true".

      Für das Script ist das natürlich schlecht, da "true = offen" ist.

      Wie könnte ich die 3 Fensterkontakte mit in das Script einbauen? Kann ich irgendwie den Zustand invertieren?

      1 Reply Last reply Reply Quote 0
      • 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

                                989
                                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