Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Frage: RegExp in on()

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Frage: RegExp in on()

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

      Hallo,

      Ich bin neu beim ioBroker und bin gerade ausgiebig am Testen. Bei mir läuft derzeit alles mit CCU.IO und eigener Visualisierung völlig problemlos, aber mit ioBoker hoffe ich, mittelfristig alle Programme aus der CCU rauswerden zu können und eine ordentliche Script-Sprache als Werkzeug zur Verfügung zu haben. Die ersten Tests sehen sehr gut aus. Meinen Glückwunsch und vollen Respekt für diese Entwicklungsleistung und weiter so! Die ersten kleineren Programme werden wohl bald zu ioBroker migrieren können, wenn die Stabilität des Gesamtsystems passt.

      Jetzt hänge ich allerdings bei einer Kleinigkeit mit den RegExps in on(). Die scheinen nicht mit {name:…} zu funktionieren, sondern offenbar nur mit id. Ist das korrekt beobachtet?

      Ich habe meine RPC-Objekte mit einen für mich sinnigen Namen versehen (Beispiel: /Wohnzimmer/Tuer/DGK:1.STATE für einen Drehgriffkontakt). Jetzt hatte ich gehofft, dass ich mittels RegExp auf on({name:..} mehrere states mit einem on() erschlagen kann, zum Beispiel für einen optischen TFK, der zusätzlich zu den DGK an jeder Tür sitzt.

      Beste Grüsse,

      bentschik

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

        War ein Fehler drin. Ist gefixt in 1.0.0

        1 Reply Last reply Reply Quote 0
        • P
          pix last edited by

          @Bluefox:

          Ist gefixt in 1.0.0 `
          Glückwunsch zur 1 des Javacript-Adapters! :lol:

          Grüße,

          Pix

          1 Reply Last reply Reply Quote 0
          • B
            bentschik last edited by

            Bestätigt.

            Bluefox, ich Danke dir!

            Gruss,

            Bentschik

            1 Reply Last reply Reply Quote 0
            • B
              bentschik last edited by

              Hallo,

              Eine weitere Frage, oder auch Feature-Request zu dem Thema:

              Innerhalb einer eigenen setSubscription-Funktion baue ich die RegExp für on() dynamisch zusammen, um mir das Escaping der regExp-spezifischen Zeichen zu sparen.

              Ein setSubscription-Aufruf würde so aussehen:

              setSubscription("/AZB/Tuer-R");
              
              

              Das Escaping übernimmt die setSubscription-Funktion und übergibt die fertige RegExp an on().

              Bei der regexp-Syntax von on() kann ich keine Variablen unterbingen:

              on({name:/\/AZB\/Tuer-R\/.*?\:1\.STATE$/,change:"ne"}, function(obj) {
              
              

              Wenn ich die RegExp als String behandle, wird sie nicht mehr als RegExp erkannt.

              Daher hatte ich den Gedanken, anstatt der regExp ein regExp-Objekt zu übergeben. Das scheint allerdings nicht zu funktionieren. Stumpfer Test:

              var r = new RegExp("\/AZB\/Tuer-R\/.*?\:1\.STATE$");
              on({name:r,change:"ne"}, function(obj) {
              ...
              
              

              Die Verwendung eines RegExp-Objekts als value für name wäre daher vielleicht eine gute Ergänzung, ausser, es gibt noch einen anderen Workaround, um Variablen bei on() in eine RegExp zu bekommen.

              Beste Grüsse,

              Bentschik

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

                Das muss gehen.

                Gib einen Beispiel, welcher durch diesen RegExp erkannt werden muss.

                1 Reply Last reply Reply Quote 0
                • B
                  bentschik last edited by

                  Hi Bluefox,

                  Ich habe mal die Instanz des Javascript-Adapters neugestartet, nachdem zu meintest, dass das laufen müsste. Jetzt funktioniert es mit den RegExp-Objekt. Also alles gut!

                  Danke & beste Grüsse,

                  Bentschik

                  1 Reply Last reply Reply Quote 0
                  • blauholsten
                    blauholsten Developer last edited by

                    Hi,

                    muss das Thema nochmal hoch holen!

                    Ich würde auch gern mithilfe von RegExp mehrer Signale in einen On Aufruf packen. (Falls das geht)

                    Ich komme leider nicht weiter, habe schon tausend Sachen probiert, und muss jetzt leider aufgeben. 😢

                    var a = "hm-rpc.0.MEQ075xxxx.1.STATE";
                    var b = "hm-rpc.0.MEQ075xxxx.1.STATE";
                    var c = "hm-rpc.0.MEQ075xxxx.1.STATE";
                    
                    var x = new RegExp("?????");
                    
                    on({id: x, val: true}, function(dp)
                    {
                        log('haut hin');
                    
                    });
                    
                    1 Reply Last reply Reply Quote 0
                    • ruhr70
                      ruhr70 last edited by

                      @blauholsten:

                      Hi,

                      muss das Thema nochmal hoch holen!

                      Ich würde auch gern mithilfe von RegExp mehrer Signale in einen On Aufruf packen. (Falls das geht)

                      Ich komme leider nicht weiter, habe schon tausend Sachen probiert, und muss jetzt leider aufgeben. 😢

                      var a = "hm-rpc.0.MEQ075xxxx.1.STATE";
                      var b = "hm-rpc.0.MEQ075xxxx.1.STATE";
                      var c = "hm-rpc.0.MEQ075xxxx.1.STATE";
                      
                      var x = new RegExp("?????");
                      
                      on({id: x, val: true}, function(dp)
                      {
                          log('haut hin');
                          
                      });
                      ```` `  
                      

                      Probier mal:

                      var a = "hm-rpc.0.MEQ075xxxx.1.STATE";
                      var b = "hm-rpc.0.MEQ075xxxx.1.STATE";
                      var c = "hm-rpc.0.MEQ075xxxx.1.STATE";
                      
                      var x = /\hm-rpc\.0\.MEQ075[0-9]{4}\.1\.STATE$/; 
                      
                      on(x, function(obj) {
                       if (obj.state.val) log('haut hin');    
                      });
                      

                      Keine Ahnung, ob es passt. RegEx ist ein Buch mit sieben Siegeln.

                      Hab das mal so unter https://regex101.com/#javascript zusammengeklickt.

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

                        oder:

                        var x = new RegExp("\hm-rpc\.0\.MEQ075[0-9]{4}\.1\.STATE$");
                        on({id:x,change:'ne'}, function (obj) {
                         if (obj.state.val) log('haut hin');    
                        });
                        
                        
                        1 Reply Last reply Reply Quote 0
                        • blauholsten
                          blauholsten Developer last edited by

                          @ruhr70:

                          oder:

                          var x = new RegExp("\hm-rpc\.0\.MEQ075[0-9]{4}\.1\.STATE$");
                          on({id:x,change:'ne'}, function (obj) {
                           if (obj.state.val) log('haut hin');    
                          });
                          
                          ```` `  
                          

                          Hi,

                          haut hin! 🙂

                          Ich habe nur gedacht, man könne das "variabel" machen. Und dadurch mehrere Trigger in einen on erschlagen.

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

                            @blauholsten:

                            Ich habe nur gedacht, man könne das "variabel" machen. Und dadurch mehrere Trigger in einen on erschlagen. `

                            Danke für die Rückmeldung!

                            Das wiederum verstehe ich nun nicht. Das ist doch variabel und Du hast alle drei Trigger in einem on.

                            1 Reply Last reply Reply Quote 0
                            • blauholsten
                              blauholsten Developer last edited by

                              Hi,

                              ich ist sicherlich von mir blöd gewählt dass alles drei HomeMatic Kontakte sind. Stellt man sich aber vor man hat 15 verschiedene Datenpunkte, ….....

                              Aber eigentlich ist es nur rein Interesse halber, ob es möglich wäre.

                              1 Reply Last reply Reply Quote 0
                              • P
                                pix last edited by

                                Zur Not kannst du alle Datenpunkte einem Gewerk (homematic) oder Aufzählung (ioBroker) zuordnen und das dann abfragen. Gab's hier ja schon häufiger.

                                Gruß

                                Pix

                                1 Reply Last reply Reply Quote 0
                                • blauholsten
                                  blauholsten Developer last edited by

                                  @pix:

                                  oder Aufzählung (ioBroker) zuordnen und das dann abfragen. Gab's hier ja schon häufiger.

                                  Gruß

                                  Pix `

                                  Hi,

                                  Danke das kannte ich so nicht.!

                                  Könntest du mir noch erklären wie ich das als````
                                  $(selector).on

                                  benutze?
                                  
                                  Hier meine angelegten Sachen.
                                   ![671_unbenannt.png](/assets/uploads/files/671_unbenannt.png) 
                                  1 Reply Last reply Reply Quote 0
                                  • P
                                    pix last edited by

                                    Probier mal:

                                    var cacheSelectorState = $('channel[state.id=*.STATE](alarmanlage="sensoren")');
                                    
                                    cacheSelectorState.on(function(obj) {   
                                        machWas(obj);
                                    });
                                    
                                    

                                    Kommt so aus dem http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564

                                    Gruß

                                    Pix

                                    1 Reply Last reply Reply Quote 0
                                    • blauholsten
                                      blauholsten Developer last edited by

                                      @pix:

                                      Probier mal:

                                      var cacheSelectorState = $('channel[state.id=*.STATE](alarmanlage="sensoren")');
                                      
                                      cacheSelectorState.on(function(obj) {   
                                          machWas(obj);
                                      });
                                      
                                      

                                      Kommt so aus dem http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564

                                      Gruß

                                      Pix `

                                      Hi Pix,

                                      geht leider nicht. Ich hatte es im Vorfeld schon so ähnlich mit Hilfe der Doku probiert.

                                      *$('channel(Alarmanlage=sensoren)').on(function(id)
                                      

                                      Ich weis aber leider nicht was "channel" bedeutet. :roll:

                                      1 Reply Last reply Reply Quote 0
                                      • blauholsten
                                        blauholsten Developer last edited by

                                        Hi,

                                        ich bekomme es leider nicht hin erstellte Aufzählungen im Skript zu benutzen! Könnte jemand mal eine kleine Erklärung geben wie das geht?

                                        DANKE

                                        1 Reply Last reply Reply Quote 0
                                        • Jey Cee
                                          Jey Cee Developer last edited by

                                          Hi blauholsten,

                                          hier mal ein skript von mir:

                                          var actors = $('*.STATE(functions=nachtruhe)');
                                          
                                          on({
                                              id: "javascript.0.Nachtruhe"/*Nachtruhe*/,
                                              change: 'ne'
                                          }, function(obj) {
                                              if (getState("javascript.0.Nachtruhe"/*Nachtruhe*/).val === true){
                                                  actors.each(function (id){
                                                      if(getState(id).val === true){
                                                      setState(id, false);}
                                                  });
                                              }
                                          });
                                          

                                          Das skript funktioniert jetzt einwandfrei. Zu beachten ist bei der Aufzählung das es verschiedene Schreibweisen gibt, hierzu mal in die Doku vom Javascript Adapter auf Github schauen. Entscheidend ist die Richtig auszuwählen/finden. Ich hatte Anfangs eine sehr lange Schreibweise von einem anderen skript hier aus dem Forum übernommen, dabei wurden mir nur 2 von 3 der Aufgezählten Objekte/Datenpunkte gefunden egal was ich gemacht habe. Die Objekte/Datenpunkte waren alle vom gleichen Geräte Typ. Erst als ich die kürzeste Form genommen hab hat es geklappt.

                                          Alles was nach "$" in der Klammer kommt sind Filter. In meinem Beispiel Filtere ich nach "STATE" und der Aufzählung "nachtruhe" in Funktionen.

                                          > Ich weis aber leider nicht was "channel" bedeutet. :roll:
                                          Das ist ein Filter der In den Objekten/Datenpunkten nach "channel" sucht und nur innerhalb der gefundenen Objekten/Datenpunkten nach den weiteren Filtern sucht.

                                          Ich hoffe ich konnte dir Helfen.

                                          Was bei mir noch offen ist, ist in on() auf die Änderung zu reagieren das will einfach nicht klappen.

                                          1 Reply Last reply Reply Quote 0
                                          • blauholsten
                                            blauholsten Developer last edited by

                                            @pix:

                                            Zur Not kannst du alle Datenpunkte einem Gewerk (homematic) oder Aufzählung (ioBroker) zuordnen und das dann abfragen. Gab's hier ja schon häufiger.

                                            Gruß

                                            Pix `

                                            Hi,

                                            habe gerade auf der Website gelesen, das Aufzählung rein für Homematic ist.

                                            Zitat > Hier werden die Favoriten, Gewerke und Räume aus der Homematic-CCU aufgelistet.

                                            Gibt es dennoch eine Möglichkeit verschiedene Datenpunkte zu einem Trigger zusammen zu fassen? Oder ist dies gar nicht möglich?

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            1.2k
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            7
                                            28
                                            5118
                                            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