Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Frage zu Fensterskript

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Frage zu Fensterskript

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      martinschm @paul53 last edited by

      @paul53 said in Frage zu Fensterskript:

      @martinschm
      Zeige mal (mind.) einen Objektbaum, aus dem die Zuordnung des Gewerkes "fenster" ersichtlich ist.

                  var Status = getState(windows[i]+ ".state").val;
      

      + ".state" ist sicherlich falsch !

      Hier der Objektbaum
      278d5bff-1680-42fe-b1dc-cac955ef2c81-image.png

      Das +.state muß ich bei Xiaomi Sensoren machen. Ansonsten klappt es nicht. Das Skript läuft wie gesagt auch durch wenn man es manuell neulädt.

      paul53 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @martinschm last edited by paul53

        @martinschm sagte:

        Hier der Objektbaum

        Ich meinte nicht den Gewerkeobjektbaum, sondern den Objektbaum mit Fenster-Geräten und -Datenpunkten, bei dem man die Gewerkezuordnung sieht.

        Das +.state muß ich bei Xiaomi Sensoren machen.

        Hast Du das Gewerk Kanälen zugeordnet ? Dann muss der Trigger anders aussehen.

        $('channel[state.id=*.state](functions=fenster)').on
        

        oder Du ersetzt alles ab Zeile 38 durch:

        on(/.+\.state$/, countOpenWindowsDoors);
        
        countOpenWindowsDoors();
        
        M 1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @martinschm last edited by

          @martinschm sagte:

          Das Skript läuft wie gesagt auch durch wenn man es manuell neulädt.

          Das Original-Skript setzt voraus, dass das Gewerk dem Datenpunkt (Name "Is opened") zugeordnet wird und nicht dem Kanal.

          1 Reply Last reply Reply Quote 0
          • M
            martinschm @paul53 last edited by martinschm

            @paul53 said in Frage zu Fensterskript:

            @martinschm sagte:

            Hier der Objektbaum

            Ich meinte nicht den Gewerkeobjektbaum, sondern den Objektbaum mit Fenster-Geräten und -Datenpunkten, bei dem man die Gewerkezuordnung sieht.

            Das +.state muß ich bei Xiaomi Sensoren machen.

            Hast Du das Gewerk Kanälen zugeordnet ? Dann muss der Trigger anders aussehen.

            $('channel[state.id=*.state](functions=fenster)').on
            

            oder Du ersetzt alles ab Zeile 38 durch:

            on(/.+\.state$/, countOpenWindowsDoors);
            
            countOpenWindowsDoors();
            

            Der Objektbaum sieht so aus:
            55cbdb6a-b9c2-44d0-9d21-402a7bd3373c-image.png

            Dachte es reicht wenn die Fenster einer Aufzählung zugeordnet sind und das Skript da durchläuft.

            Ich sehe grade in dem Artikel (https://www.smarthome-tricks.de/software-iobroker/iobroker-aufzaehlungen-fuer-das-zaehlen-von-offenen-fenstern-oder-tueren-verwenden/), das dort nur die States und nicht die Geräte zugeordnet wurden.

            Wie muß ich das Skript denn ändern wenn ich lieber das Gerät als den State zuordnen will ?

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

              @martinschm sagte:

              Wie muß ich das Skript denn ändern wenn ich lieber das Gerät als den State zuordnen will ?

              Das habe ich in meiner vorletzten Antwort geschrieben. Alles ab Zeile 38 ersetzen durch

              on(/.+\.state$/, countOpenWindowsDoors); // triggert alle .state bei Wertänderung
              
              countOpenWindowsDoors(); // Skriptstart
              

              Hier wird kein Selector verwendet, sondern ein RegExp, mit dem auf alle Datenpunkte getriggert wird, die mit ".state" enden. Die Selektion nach Gewerk erfolgt in der Funktion countOpenWindowsDoors().

              R M 2 Replies Last reply Reply Quote 0
              • R
                ReverZ @paul53 last edited by ReverZ

                @paul53

                Bei meinen Xiaomi-Kontakten muss der Teil so heissen, damit es funktioniert (contact statt state):

                on(/.+\.contact$/, countOpenWindowsDoors); // triggert alle .contact bei Wertänderung
                countOpenWindowsDoors();
                

                Oder:

                function registerSubscription()
                {
                $('state[state.id=*.contact](functions=fenster)').on(function(obj) {
                countOpenWindowsDoors();
                });
                 
                $('state[state.id=*.contact](functions=tueren)').on(function(obj) {
                countOpenWindowsDoors();
                });
                }
                

                Und ich hab natürlich überall Status durch !Status ersetzt, da der Wert "true" ist, wenn der Kontakt geschlossen und nicht offen ist:

                if ( !Status ) { openWindows = openWindows + 1; }
                

                Aber Achtung: Ich verwende den Zigbee-Adapter. Hier sind die Datenpunkte und Werte unterschiedlich zum MiHome-Adapter.

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

                  @ReverZ sagte:

                  contact statt state

                  Verwendet ihr verschiedene Adapter ?

                  R M 2 Replies Last reply Reply Quote 0
                  • R
                    ReverZ @paul53 last edited by

                    @paul53
                    Ich verwende die Version 0.10.2 des Zigbee-Adapters.

                    1 Reply Last reply Reply Quote 0
                    • M
                      martinschm @paul53 last edited by

                      @paul53 said in Frage zu Fensterskript:

                      @ReverZ sagte:

                      contact statt state

                      Verwendet ihr verschiedene Adapter ?

                      Ich verwende den Xiaomi Adapter

                      1 Reply Last reply Reply Quote 0
                      • R
                        ReverZ last edited by

                        Ah OK, das erklärt natürlich einiges.

                        1 Reply Last reply Reply Quote 0
                        • M
                          martinschm @paul53 last edited by

                          @paul53 said in Frage zu Fensterskript:

                          @martinschm sagte:

                          Wie muß ich das Skript denn ändern wenn ich lieber das Gerät als den State zuordnen will ?

                          Das habe ich in meiner vorletzten Antwort geschrieben. Alles ab Zeile 38 ersetzen durch

                          on(/.+\.state$/, countOpenWindowsDoors); // triggert alle .state bei Wertänderung
                          
                          countOpenWindowsDoors(); // Skriptstart
                          

                          Hier wird kein Selector verwendet, sondern ein RegExp, mit dem auf alle Datenpunkte getriggert wird, die mit ".state" enden. Die Selektion nach Gewerk erfolgt in der Funktion countOpenWindowsDoors().

                          Aber wird dann nicht auf alle Sensoren mit state reagiert, also auch Bewegungsmelder oder Rauchmelder

                          R paul53 2 Replies Last reply Reply Quote 0
                          • R
                            ReverZ @martinschm last edited by

                            @martinschm
                            Mit der Subscription ja aber in deiner Funktion wird ja widerum auf die gewünschten Aufzählungen "gefiltert". Hat paul53 weiter oben auch schon erklärt.

                            M 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @martinschm last edited by

                              @martinschm sagte:

                              wird dann nicht auf alle Sensoren mit state reagiert

                              Ja, aber da sie nicht in den "members" enthalten sind, passiert nichts.

                              1 Reply Last reply Reply Quote 0
                              • M
                                martinschm @ReverZ last edited by

                                @ReverZ said in Frage zu Fensterskript:

                                @martinschm
                                Mit der Subscription ja aber in deiner Funktion wird ja widerum auf die gewünschten Aufzählungen "gefiltert". Hat paul53 weiter oben auch schon erklärt.

                                Hi, ok hab ich am Handy wahrscheinlich überlesen. Finde die Handhabung nicht so vorteilhaft, da wird ja unter Umständen viel zu häufig das Skript aufgerufen nur um dann nichts zu machen.

                                Da muss ich mal nach einer anderen Lösung schauen.

                                Danke schonmal für eure Hilfe.

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

                                  @martinschm sagte:

                                  Finde die Handhabung nicht so vorteilhaft, da wird ja unter Umständen viel zu häufig das Skript aufgerufen nur um dann nichts zu machen.

                                  Ob die Filterung in der Javascript-Instanz oder im eigenen Skript vorgenommen wird, macht keinen großen Unterschied. Etwas Entlastung bringt das Einlesen der Arrays windows und doors außerhalb der Funktion.

                                  const windows = getObject("enum.functions.fenster").common.members;
                                  const doors = getObject("enum.functions.tueren").common.members;
                                  
                                  function countOpenWindowsDoors() {
                                  
                                  M 1 Reply Last reply Reply Quote 0
                                  • M
                                    martinschm @paul53 last edited by

                                    @paul53 said in Frage zu Fensterskript:

                                    @martinschm sagte:

                                    Finde die Handhabung nicht so vorteilhaft, da wird ja unter Umständen viel zu häufig das Skript aufgerufen nur um dann nichts zu machen.

                                    Ob die Filterung in der Javascript-Instanz oder im eigenen Skript vorgenommen wird, macht keinen großen Unterschied. Etwas Entlastung bringt das Einlesen der Arrays windows und doors außerhalb der Funktion.

                                    const windows = getObject("enum.functions.fenster").common.members;
                                    const doors = getObject("enum.functions.tueren").common.members;
                                    
                                    function countOpenWindowsDoors() {
                                    

                                    Kann ich nicht eine Subscription auf die Objekte einer Aufzählung machen?

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

                                      @martinschm sagte:

                                      Kann ich nicht eine Subscription auf die Objekte einer Aufzählung machen?

                                      Nein, außer mit einem Selector. Subscriben kann man nur Datenpunkte, Deine Aufzählungen enthalten aber Channels. Wie ich weiter oben schon mal geschrieben habe, kannst Du es mit einem veränderten Selector versuchen.

                                      $('channel[state.id=*.state](functions=fenster)').on(countOpenWindowsDoors);
                                      $('channel[state.id=*.state](functions=tueren)').on(countOpenWindowsDoors);
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • First post
                                        Last post

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      814
                                      Online

                                      31.8k
                                      Users

                                      80.0k
                                      Topics

                                      1.3m
                                      Posts

                                      3
                                      19
                                      659
                                      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