Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Anzahl Datenpunkte geändert - wie Trigger anpassen?

    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

    Anzahl Datenpunkte geändert - wie Trigger anpassen?

    This topic has been deleted. Only users with topic management privileges can see it.
    • BananaJoe
      BananaJoe Most Active last edited by

      Ich habe in einem Skript einen Trigger auf alle Datenpunkte eines Adapters gesetzt, und zwar wie folgt:

      // Und eine weitere Subscription auf "life.360.0.myplaces.*.*.isPresent"
      $(dp_myplaces + ".*.*.isPresent").on( function (obj) {
      //on({ id: dp_circle + ".*.membersPresent", change: "ne" }, function (obj) {
          var value = obj.state.val;
          if (value == true) {
              MyPlaces_AssignPeopleAndPlaces(obj.id);
          }
      });
      

      Wenn ich nun in der Life360 App einen weiteren Ort erstelle so scheint der Adapter dies auch zeitnah mitzubekommen. Aber mein Skript nicht. Der Adapter erstellt den neuen Ort (und müsste sofort festgestellt haben das dort jemand "Present" ist, mein Skript bekam das aber erst nach einem Neustart raus.
      Ich vermute weil die neuen Datenpunkte halt noch nicht im Trigger / Subscription waren.

      Also, wie löst man das am besten?

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

        @bananajoe sagte: die neuen Datenpunkte halt noch nicht im Trigger / Subscription waren.

        Die neuen Datenpunkte sind noch nicht im Puffer der Javascript-Instanz.

        @bananajoe sagte in Anzahl Datenpunkte geändert - wie Trigger anpassen?:

        wie löst man das am besten?

        Mit

        on(RegExp, function(dp) {});
        

        anstelle des Selektors.

        on(/^life360\.0\.myplaces\..+\.isPresent$/, function(dp) {
        
        1 Reply Last reply Reply Quote 0
        • BananaJoe
          BananaJoe Most Active last edited by

          @paul53 sagte in Anzahl Datenpunkte geändert - wie Trigger anpassen?:

          on(RegExp, function(dp) {});

          Also so etwa?

          // Pfad mit dem Kreis der Überwacht werden soll. Den "channel" unterhalb von life360.x.circles der Überwacht werden soll
          const dp_circle = "life360.0.circles.8a95a98d-adb3-4df4-bb0c-e374f4f8f161";
          var on_dp_circle = "/^" + dp_circle + "\..+\.membersPresent$/"
          
          on(on_dp_circle , function(dp) {
              var value = obj.state.val;
              if (value == true) {
                  MyPlaces_AssignPeopleAndPlaces(obj.id);
          });
          

          Ich hab gesehen das du hier im Forum schon oft Fragen dazu beantwortest hast.
          ich bin mir nicht sicher bezüglich der Schreibweisen und ob ich das wie oben stehend verketten kann:

          /^ muss Anfangen mit
          \.. eine beliebige Anzahl von Zeichen (war das nicht ein Punkt?)
          + muss mindestens einmal vorkommen?
          $/ Zeichenkettenende / Zeilenende?
          

          Ich nutze sonst den RegExBuddy - aber da muss ich das passende Verfahren einstellen, das wäre dann JavaScript? die / und \ verwirren mich ein wenig

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

            @bananajoe sagte: Also so etwa?

            Nein, RegExp ist kein String, also funktioniert auch keine String-Verkettung. Wie man RegExp verkettet, entzieht sich meiner Kenntnis.

            @bananajoe sagte in Anzahl Datenpunkte geändert - wie Trigger anpassen?:

            die / und \ verwirren mich ein wenig

            / markieren Anfang und Ende eines RegExp. \ vor einem Punkt meinen den Punkt selbst, da der Punkt im RegExp sonst eine besondere Bedeutung hat (beliebiges Zeichen).

            BananaJoe 1 Reply Last reply Reply Quote 0
            • BananaJoe
              BananaJoe Most Active @paul53 last edited by

              @paul53 also müsste ich das hart-verdrahtet in das Skript packen.
              Ich schau mal ob ich noch was dazu finde - aber schon mal vielen Dank

              T 1 Reply Last reply Reply Quote 0
              • T
                ticaki Developer @BananaJoe last edited by ticaki

                @bananajoe

                const dp_circle = "life360\.0\.circles\.8a95a98d-adb3-4df4-bb0c-e374f4f8f161";
                 var on_dp_circle = "/^" + dp_circle + "\..+\.membersPresent$/"
                

                oder ne Funktion:

                const dp_circle = "life360.0.circles.8a95a98d-adb3-4df4-bb0c-e374f4f8f161";
                let r = getRegEx(dp_circle, '^');
                r += '.*\.membersPresent$';
                on({ id: new RegExp(r), change: 'ne' }, ...)
                
                function getRegEx(value, firstChar) {
                    let path = value.split('.');
                    if (value[value.length-1] == '.') path.splice(path.length-1,1);
                    let r = '';
                    if (firstChar !== undefined) r+=firstChar;
                    for (let a=0;a<path.length;a++) {
                        if (path[a]) r+=path[a]+'\.';
                    }
                    return r;
                }
                
                BananaJoe 1 Reply Last reply Reply Quote 0
                • BananaJoe
                  BananaJoe Most Active @ticaki last edited by

                  @ticaki irgendwie ist die Antwort nicht ganz so wie du diese erstellen wolltest - glaube ich.
                  Zumindest scheinst du diese wieder geändert zu haben.

                  Die Function macht was? Ermittelt die vorhandenen Datenpunkte einzeln? Und die On Springt an wenn einer dazu kommt? oder gelöscht wird?

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    ticaki Developer @BananaJoe last edited by ticaki

                    @bananajoe
                    Hallo, war gestern etwas zu müde. Ich hatte zuerst vorgeschlagen das du mit einem schedule überprüft ob sich

                    $(dp_myplaces + ".*.*.isPresent")
                    

                    verändert und wenn ja, das Skript neu startest.

                    var oldDps = $(dp_myplaces + ".*.*.isPresent");
                    
                    schedule('*/5 * * * *', function() {
                      if (JSON.stringify(oldDps) != JSON.stringify($(dp_myplaces + ".*.*.isPresent"))) restartScript();
                    })
                    

                    Dann gesehen das RegEx neue Datenpunkt erfasst, und weil du mit dem /\ durcheinanderkommst. dir meine Funktion hier rein kopiert die jeden Punkt in einem Datenpunkt gegen

                    \.
                    

                    tauscht.

                    RegEx findet keine gelöschten Datenpunkte soweit mir bekannt, sondern nur neue.

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    747
                    Online

                    31.8k
                    Users

                    80.0k
                    Topics

                    1.3m
                    Posts

                    3
                    8
                    191
                    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