Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. javascript subscribe mit parameter

    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

    javascript subscribe mit parameter

    This topic has been deleted. Only users with topic management privileges can see it.
    • I
      ignis-draco last edited by

      Hi,

      ich bin dabei vom MaxCube auf den Maxcul zu wechseln dafür benötige ich jedoch ein paar Funktionen die ich jetzt selber schreiben muss.
      Aktuell bin ich dabei die "Fenster offen Heizung aus" Funktion zu bauen.
      Im Prinzip habe ich das auch am laufen :

      on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) {
          if (getState('maxcul.0.NEQ1152113.isOpen').val == true){
              setState('maxcul.0.NEQ1255028.mode',6);
          }else{
              setState('maxcul.0.NEQ1255028.mode',0);
          }
      });
      

      Da ich das für jedes Fenster /Raum machen müsste habe ich mir überlegt das ich lieber eine Funktion schreibe die dann als Parameter das Fenster und das/die Thermostat(e) bekommt.

      function window_change(window, thermostat){
       if (getState(window + '.isOpen').val == true){
              setState(thermostat +'.mode',6);
          }else{
              setState(thermostat +'.mode',0);
          }
      }
      

      Jetzt müsste ich aber beim "on" die Parameter mit geben. Geht das Überhaupt?

      on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' },window_change,('maxcul.0.NEQ1152113',''maxcul.0.NEQ1255028.mode"));
      

      oder muss ich das anderes schreiben das die window_change Funktion selber überprüfen muss um welches Fenster es sich handelt? Prinzipiell könnte ich über das Fenster Enum iterieren um herauszufinden welches offen ist und dann über die Räume das passende Thermostat zu finden.
      Das wäre aber für mein Verständnis sehr umständlich da ja eigendlich bekannt ist welches Fenster bewegt wurde.

      Über einen Tipp würde ich mich sehr freuen.

      Gruß Arne

      arteck Asgothian H 3 Replies Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active @ignis-draco last edited by arteck

        @ignis-draco bau ein array mit window, thermostat..

        dann schaust du nach ob sich was geändert hat

        on({id: [
          'maxcul.0.NEQ1152113.isOpen',
          'maxcul.0.NEQ1ewrwe13.isOpen',
          'maxcul.0.NEQ1w4443.isOpen',
        ], change: 'ne'}, function (obj) {
        
        
        
        });
        

        holst dir aus dem obj welches fenster ist den nu offen und arbeitest das laut dem array ab

        p.s:

        if (getState(window + '.isOpen').val){
        

        das reicht als abfrage

        1 Reply Last reply Reply Quote 0
        • Asgothian
          Asgothian Developer @ignis-draco last edited by Asgothian

          @ignis-draco

          Mal vorne angefangen:

          an Stelle von

          on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) {
              if (getState('maxcul.0.NEQ1152113.isOpen').val == true){
                  setState('maxcul.0.NEQ1255028.mode',6);
              }else{
                  setState('maxcul.0.NEQ1255028.mode',0);
              }
          });
          

          kannst Du auch direkt

          on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) {
              if (obj.state.val == true){
                  setState('maxcul.0.NEQ1255028.mode',6);
              }else{
                  setState('maxcul.0.NEQ1255028.mode',0);
              }
          });
          

          nutzen. damit entfällt zumindest eine Variable. Das andere geht meiner Erfahrung nach nicht, weswegen ich das so lösen würde:

          function my_trigger(sensor, trigger, aktor) {
             const _actor = aktor;
             on({ id:sensor, change:trigger }, function (obj) {
              if (obj.state.val == true){
                  setState(_actor,6);
              } else {
                  setState(_actor,0);
              }
          }
          

          Wenn ich die Gültigkeit von Variablen und Konstanten richtig verstanden habe ist so sicher gestellt das die Funktion im Trigger mit den korrekten Werten aufgerufen wird.

          Die Funktion kannst du dann für Dein Beispiel so aufrufen:

          my_trigger('maxcul.0.NEQ1152113.isOpen', 'any', 'maxcul.0.NEQ1255028.mode')
          
          1 Reply Last reply Reply Quote 0
          • UncleSam
            UncleSam Developer last edited by

            Den ersten Code kannst du vereinfachen:

            on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) {
                if (obj.state.val == true){
                    setState('maxcul.0.NEQ1255028.mode',6);
                }else{
                    setState('maxcul.0.NEQ1255028.mode',0);
                }
            });
            

            Du musst also nicht das Objekt abfragen, du bekommst alles im Parameter übergeben.

            Nun zu deiner eigentlichen Frage: fast richtig. Du musst einfach eine (anonyme) Funktion verwenden:

            on(
                { id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' },
                function (obj) { window_change('maxcul.0.NEQ1255028.mode') });
            

            Das erste Argument habe ich absichtlich weggelassen, da du ja den Wert bereits bekommst (siehe oben).

            Asgothian 1 Reply Last reply Reply Quote 0
            • UncleSam
              UncleSam Developer last edited by

              ... und scheinbar beginnen alle Entwickler gleichzeitig zu arbeiten 🤣

              1 Reply Last reply Reply Quote 1
              • H
                homecineplexx @ignis-draco last edited by

                @ignis-draco said in javascript subscribe mit parameter:

                Hi,

                ich bin dabei vom MaxCube auf den Maxcul zu wechseln dafür benötige ich jedoch ein paar Funktionen die ich jetzt selber schreiben muss.
                Aktuell bin ich dabei die "Fenster offen Heizung aus" Funktion zu bauen.
                Im Prinzip habe ich das auch am laufen :

                on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) {
                    if (getState('maxcul.0.NEQ1152113.isOpen').val == true){
                        setState('maxcul.0.NEQ1255028.mode',6);
                    }else{
                        setState('maxcul.0.NEQ1255028.mode',0);
                    }
                });
                

                Da ich das für jedes Fenster /Raum machen müsste habe ich mir überlegt das ich lieber eine Funktion schreibe die dann als Parameter das Fenster und das/die Thermostat(e) bekommt.

                function window_change(window, thermostat){
                 if (getState(window + '.isOpen').val == true){
                        setState(thermostat +'.mode',6);
                    }else{
                        setState(thermostat +'.mode',0);
                    }
                }
                

                Jetzt müsste ich aber beim "on" die Parameter mit geben. Geht das Überhaupt?

                on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' },window_change,('maxcul.0.NEQ1152113',''maxcul.0.NEQ1255028.mode"));
                

                oder muss ich das anderes schreiben das die window_change Funktion selber überprüfen muss um welches Fenster es sich handelt? Prinzipiell könnte ich über das Fenster Enum iterieren um herauszufinden welches offen ist und dann über die Räume das passende Thermostat zu finden.
                Das wäre aber für mein Verständnis sehr umständlich da ja eigendlich bekannt ist welches Fenster bewegt wurde.

                Über einen Tipp würde ich mich sehr freuen.

                Gruß Arne

                Hallo
                also wenn du schon einen Trigger mit dem Object hast, dann brauchst du dir den state nicht nochmals mit getState holen, sondern es reicht so

                on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) {
                    var isOpen = obj.state.val;
                
                    if (isOpen == true){
                        setState('maxcul.0.NEQ1255028.mode',6);
                    }else{
                        setState('maxcul.0.NEQ1255028.mode',0);
                    }
                });
                
                
                1 Reply Last reply Reply Quote 0
                • Asgothian
                  Asgothian Developer @UncleSam last edited by

                  modules:composer.user_said_in, @unclesam, javascript subscribe mit parameter

                  Nun zu deiner eigentlichen Frage: fast richtig. Du musst einfach eine (anonyme) Funktion verwenden:

                                                                                                                                               on(                                                                                                                                                                                { id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' },                                                                                                                                                                                function (obj) { window_change('maxcul.0.NEQ1255028.mode') });                                            
                  

                  Das erste Argument habe ich absichtlich weggelassen, da du ja den Wert bereits bekommst (siehe oben).

                  Hmm.. Muss da nicht noch ein parameter rein ob das Fenster auf Wert 0 oder Wert 6 gesetzt werden muss ? Also so:

                  on( { id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { window_change('maxcul.0.NEQ1255028.mode', (obj.state.val?6:0)) });
                  
                  UncleSam 1 Reply Last reply Reply Quote 0
                  • UncleSam
                    UncleSam Developer @Asgothian last edited by

                    @asgothian Richtig, wollte eigentlich obj übergeben, aber hab ich dann vergessen.

                    1 Reply Last reply Reply Quote 0
                    • I
                      ignis-draco last edited by

                      Hi @ll,

                      wo das nenne ich mal schnelle Reaktion und gleich so viele.

                      Auf die Idee in der anonymen Funktion einfach meine Funktion aufzurufen hätte ich auch selber kommen können 😞.
                      Das ich über obj ja auch an den state dran kommen wir mir nicht so bewusst (muss in meinen anderen Skripten schauen ob ich das da auch verwenden kann).
                      Ich mache das jetzt erstmal so.

                      function window_change(thermostat, value){
                          for (let i of thermostat){
                              setState(i +'.mode',value);
                          }
                      }
                      
                      on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) {
                      window_change(['maxcul.0.NEQ1255028'],(obj.state.val?6:0)) 
                      });
                      

                      Vielleicht ändere ich das noch mal so dass es automatisch durch die enums erzeugt wird jedoch glaube ich das eine Änderung (neues Thermostat oder Fenstersensor) nicht so häufig passiert.

                      vielen dank noch mal für die vielen hilfreichen antworten.

                      Gruß
                      Arne

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      921
                      Online

                      31.8k
                      Users

                      80.0k
                      Topics

                      1.3m
                      Posts

                      5
                      9
                      513
                      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