Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [done]Erweiterungswunsch

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

[done]Erweiterungswunsch

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
9 Beiträge 3 Kommentatoren 1.9k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • S Offline
    S Offline
    soef
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    0
    • BluefoxB Offline
      BluefoxB Offline
      Bluefox
      schrieb am zuletzt editiert von
      #2

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

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

      1 Antwort Letzte Antwort
      0
      • V Offline
        V Offline
        vegetto
        schrieb am zuletzt editiert von
        #3

        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 Antwort Letzte Antwort
        0
        • BluefoxB Offline
          BluefoxB Offline
          Bluefox
          schrieb am zuletzt editiert von
          #4

          Hast du absolut recht:

          script.schedules.splice(i, 1);
          

          ist richtig.

          1 Antwort Letzte Antwort
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            schrieb am zuletzt editiert von
            #5

            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 Antwort Letzte Antwort
            0
            • V Offline
              V Offline
              vegetto
              schrieb am zuletzt editiert von
              #6

              @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 Antwort Letzte Antwort
              0
              • BluefoxB Offline
                BluefoxB Offline
                Bluefox
                schrieb am zuletzt editiert von
                #7

                Oh je…

                Ja. Aber so reicht:

                `if (script.schedules[i] == schedule){` 
                
                Danke.[/i]
                
                1 Antwort Letzte Antwort
                0
                • V Offline
                  V Offline
                  vegetto
                  schrieb am zuletzt editiert von
                  #8

                  @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 Antwort Letzte Antwort
                  0
                  • S Offline
                    S Offline
                    soef
                    schrieb am zuletzt editiert von
                    #9

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

                    1 Antwort Letzte Antwort
                    0
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    826

                    Online

                    32.4k

                    Benutzer

                    81.5k

                    Themen

                    1.3m

                    Beiträge
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2025
                    logo
                    • Anmelden

                    • Du hast noch kein Konto? Registrieren

                    • Anmelden oder registrieren, um zu suchen
                    • Erster Beitrag
                      Letzter Beitrag
                    0
                    • Home
                    • Aktuell
                    • Tags
                    • Ungelesen 0
                    • Kategorien
                    • Unreplied
                    • Beliebt
                    • GitHub
                    • Docu
                    • Hilfe