Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [done]Erweiterungswunsch

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [done]Erweiterungswunsch

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      soef last edited by

      Hallo,

      das ist schon ein ganz tolles Projekt! Was hier auf die Beine gestellt wurde ist echt super!

      Einen Erweiterungswunsch im JavaScript-Adapter hätte ich. Soweit ich das sehe gibt es zwar

      ein on(), bzw. subscribe(), aber kein unsubscribe(). Ein on(), temporär in einer function zu nutzen

      ist praktisch um z.B. nach Abschluss einer eingeleiteten Aktion eine weitere Aktion auszuführen.

      Das funktioniert soweit auch, nur bleibt die Subscription auch nach verlassen der Funktion bestehen.

      Daher fehlt in dieser Situation ein unsubscribe().

      Ich weiß, das ließe sich auch über ein globales subscribe() und entsprechender Abfrage bestimmter

      Variablen erledigen, aber das ist nicht so elegant und es wird dauerhaft eine Subscription verwendet,

      die nur temporär benötigt wird.

      Hier einmal ein Script Beispiel und ein paar Zeilen Code, wie der JavaScript-Adapter erweitert werden

      könnte. Ist nur ein Vorschlag um meinen Wunsch zu erläutern.

      
      var dp = "test.switch";
           dp1 = "test.switch1";
      
      createState(dp, dp);
      createState(dp1, dp1);
      
      on({id:"javascript.0." + dp, change: 'any'}, function (data) {
      
          log ("+++++++++++++++++++++");
      
          on({id:"javascript.0." + dp1, change: 'any', uid: "0815"}, function (data) {
              log("2222222222222");
              //unsubscribe("0815");
              unsubscribe("javascript.0." + dp1);
          });
      });
      
      

      javascript.js

       `unsubscribe: function (pattern) {
           for (var i = subscriptions.length - 1; i >= 0 ; i--) {
               //if (subscriptions[i].name == name && subscriptions[i].pattern.uid== pattern) {
               if (subscriptions[i].name == name && subscriptions[i].pattern.id == pattern) {
                   adapter.log.info("unsubscribe: " + name + ': ' + pattern);
                   subscriptions.splice(i, 1);
                   sandbox.__engine.__subscriptions -= 1;
                   break;
               }
           }
      },
      
      subscribe: function (pattern, callbackOrId, value) {` 
      
      Ich würde mich sehr über eine Reaktion freuen.[/i][/i][/i][/i]
      
      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        Ich werde nicht groß reagieren. Ich baue einfach ein. :lol:

        Danke für die fertige Lösung. :!:

        1 Reply Last reply Reply Quote 0
        • V
          vegetto last edited by

          Eine gute Ergänzung zu clearSchedule() 🙂

          Btw: ich denke, dass ich das Problem bei clearSchedule gefunden habe:

          `clearSchedule: function (schedule) {
                          for (var i = 0; i < script.schedules.length; i++) {
                              if (script.schedules[i]) {` 
          
          Wenn ich es richtig verstehe würde dieses code alle scheduled Funktionen entfernen. Das slice sollte ein splice(-i,1), oder?
          
          Solte es so ausehen? Ich bin ein Javscript anfanger so vielleicht habe ich es nicht richtig verstanden...
          
          `~~[code]~~
          Wie kann ich es testen? Kann ich das javascript.js einfach bei mir editieren und dann das Javascript adpaptor neue starten?
          clearSchedule: function (schedule) {
            for (var i = script.schedules.length - 1; i >= 0 ; i--) {
              if (script.schedules[i] == schedule) {
                if (!mods['node-schedule'].cancelJob(script.schedules[i])) {
                  adapter.log.error('Error by canceling scheduled job');
                }
                delete script.schedules[i];
                script.schedules.splice(i, 1);
                return true;
              }
            }
            return false;
          },` [/i][/i][/i][/code][/i]
          
          1 Reply Last reply Reply Quote 0
          • Bluefox
            Bluefox last edited by

            Hast du absolut recht:

            script.schedules.splice(i, 1);
            

            ist richtig.

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

              https://github.com/ioBroker/ioBroker.ja … nsubscribe

              ### 1.0.4 (2015-10-30)
              * (bluefox) add unsubscribe
              
              

              ### unsubscribe

              unsubscribe(id or handler)

              Remove all subscriptions for given object ID or for given handler.

              // By handler
              var mySubscription = on({id: "javascript.0.myState", change: 'any'}, function (data) {
                  // unsubscribe after first trigger
                  if (unsubscribe(mySubscription)) {
                      log('Subscription deleted');
                  }
              });
              
              // by Object ID
              on({id: "javascript.0.myState1", change: 'ne'}, function (data) {
                  log('Some event');
              });
              
              on({id: "javascript.0.myState1", change: 'any'}, function (data) {
                  // unsubscribe 
                  if (unsubscribe("javascript.0.myState1")) {
                      log('All subscriptions deleted');
                  }
              });
              
              
              1 Reply Last reply Reply Quote 0
              • V
                vegetto last edited by

                @Bluefox:

                Hast du absolut recht:

                script.schedules.splice(i, 1);
                

                ist richtig. `

                Das "schedule" Parameter wird nicht benutz, oder? Sollte das if nicht so sein?

                `if ((script.schedules[i]) && (script.schedules[i] == schedule)){` [/i][/i]
                
                1 Reply Last reply Reply Quote 0
                • Bluefox
                  Bluefox last edited by

                  Oh je…

                  Ja. Aber so reicht:

                  `if (script.schedules[i] == schedule){` 
                  
                  Danke.[/i]
                  
                  1 Reply Last reply Reply Quote 0
                  • V
                    vegetto last edited by

                    @Bluefox:

                    Oh je…

                    Ja. Aber so reicht:

                    `if (script.schedules[i] == schedule){` 
                    
                    Danke.
                    
                    1.0.5 aktiviert und jetzt funktionier alles prima: kein Absturz mehr! Vielen Dank!
                    
                    Ich werde meine State Machine script in anderem Post senden, wo ich clearSchedule benutze. Vielleicht hilft es jemand.[/i]
                    ``` ` 
                    1 Reply Last reply Reply Quote 0
                    • S
                      soef last edited by

                      Danke an Bluefox. Super, auch dass das Object als eindeutige Bedingung verwendet werden kann. Bin begeistert, auch über die schnelle Umsetzung.

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      928
                      Online

                      31.7k
                      Users

                      79.7k
                      Topics

                      1.3m
                      Posts

                      3
                      9
                      1741
                      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