Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Frage zu DeviceCounter script [object Object]

    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

    Frage zu DeviceCounter script [object Object]

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      Archimedeus @paul53 last edited by

      @paul53

      Äh mein Script? Gibts gar nicht. Ich kann mit .val den Eintrag lesen.
      also etwa so:

      mylist = getState("javascript.0.deviceCounter.lamps_on.list").val;
      // oder mylist = getState("javascript.0.deviceCounter.lamps_on.list").toString();
      
      log(mylist); 
      

      Oder meinst du das Script, was den Datenpunkt anlegt? Das ist das "geklaute" Original s.u., da habe ich nur die Aufrufe angepasst. Fun-fact: Das Problem mit LOWBATT und LOW_BATT bei HM und HMIP hat der * gelöst 🙂

      Ich kann mit dem Rückgabewert
      javascript.0 (1891) script.js.common.Experimental.ListTest: [object Object]

      einfach nichts anfangen. Müsste man irgendwie einem Array zuweisen und dann durch mit for each oder so. Hab ein bisschen probiert und wieder verworfen. Wie gesagt, ich bon C&P Programmierer 🙂

      
      addDeviceCounter("battery_homematic",$('channel[state.id=hm-rpc.1.*.0.LOW*]'),     true);
      // Use sonoff for testing
      addDeviceCounter("lamps_on",$('state[id=*](functions=sonoff)'),                            true);
      
      /******************************************
       * Code - do not change anything bellow this line *
       ******************************************/
      function addDeviceCounter(name, selector, val_to_count) {
          //Total amount of devices found by selector
          var state_total = 'deviceCounter.' + name + '.total';
          createState(state_total, 0);
          //List of devices that match condition
          var state_list = 'deviceCounter.' + name + '.list';
          createState(state_list, "");
          //Number of devices that match condition
          var state_counter = 'deviceCounter.' + name + '.counter';
          createState(state_counter, 0);
          function countDevs(obj) {
              var d_count = 0;
              var d_list  = [];
              selector.each(function (id, i) {
                  var status = getState(id).val;
                  var obj    = getObject(id);
                  log("**********Found " + id)
                  if ((typeof val_to_count === 'function' && val_to_count(status)) ||
                      (typeof val_to_count === 'boolean'  && val_to_count == status)) {
                      //Get parent object
                      var roomsX = getObject(id,'rooms');
                      
                      //var functionsX = getObject(id,'functions');  // function behind room
                      
                      //var parentChannelId = id.slice(id.lastIndexOf("."));
                      //var parentDevicelId = id.split(".").slice(0,-2).join(".");
                      //var deviceObject = getObject(parentDevicelId);
                      //remember device name & functions
                      d_list.push(roomsX.enumNames)//, functionsX.enumNames);
                  }                
                  ++d_count;         // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
              }); 
              log("------!" +name + "(" + d_count + "): " + d_list);
              setState(state_list,     d_list.join('<br>'));
              setState(state_counter,  d_list.length);
              setState(state_total,    d_count);
          }
          
          //Re-evaluate when a device status changes
          selector.on(function(obj) {    // bei Zustandänderung *. LOWBAT in allen Gewerken
              countDevs(obj);
          });
          //Re-evaluate each 1/4 hour
          schedule("*/15 * * * *", countDevs);
          
          //Evaluate for the first time
          countDevs();
          log("TestCount Started");
      
      }
      
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @Archimedeus last edited by paul53

        @Archimedeus sagte:

                    d_list.push(roomsX.enumNames)//, functionsX.enumNames);                                                                                                                                                                            
        

        Ändere mal Zeile 37:

                        d_list.push(roomsX.enumNames[0]); //, functionsX.enumNames[0]);
        

        EDIT: Besser noch Zeilen 29 bis 37 ändern in

                        var room = getObject(id,'rooms').enumNames[0];
                        if(!d_list.includes(room)) d_list.push(room);
        
        A 1 Reply Last reply Reply Quote 0
        • A
          Archimedeus @paul53 last edited by

          @paul53 said in Frage zu DeviceCounter script [object Object]:

          var room = getObject(id,'rooms').enumNames[0];

          Leider keine Verbesserung:
          438fdf89-781c-49df-892c-87da6f249093-grafik.png

          Leider ist total jetzt auch 0, sollte 2 sein.

          Wenn ich nur wüsste, was mir JS mit [object Object] sagen will. Ich vermute, dass ist ein komplexeres Objekt, auf das man nur richtig zugreifen muss.

          Ich probiere es mal so:

          mylist = getState("javascript.0.deviceCounter.lamps_on.list").val;
          log(mylist); 
          for(var property in mylist) {
              log(property + "=" + mylist[property]);
          }
          

          Laut Google: The default conversion from an object to string is "[object Object]".

          Das Ergebnis ist kurios:

          21.12.2020, 22:13:51.887	[info ]: javascript.0 (1891) Stop script script.js.common.Experimental.ListTest
          21.12.2020, 22:13:52.041	[info ]: javascript.0 (1891) Start javascript script.js.common.Experimental.ListTest
          21.12.2020, 22:13:52.065	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: [object Object]
          21.12.2020, 22:13:52.065	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 0=[
          21.12.2020, 22:13:52.066	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 1=o
          21.12.2020, 22:13:52.066	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 2=b
          21.12.2020, 22:13:52.066	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 3=j
          21.12.2020, 22:13:52.066	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 4=e
          21.12.2020, 22:13:52.066	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 5=c
          21.12.2020, 22:13:52.067	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 6=t
          21.12.2020, 22:13:52.067	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 7= 
          21.12.2020, 22:13:52.067	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 8=O
          21.12.2020, 22:13:52.067	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 9=b
          21.12.2020, 22:13:52.067	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 10=j
          21.12.2020, 22:13:52.068	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 11=e
          21.12.2020, 22:13:52.068	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 12=c
          21.12.2020, 22:13:52.068	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 13=t
          21.12.2020, 22:13:52.068	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 14=]
          21.12.2020, 22:13:52.069	[info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: registered 0 subscriptions and 0 schedules
          
          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @Archimedeus last edited by paul53

            @Archimedeus
            Was sagt das Log (anstelle Zeile 41)?

                    log(d_list);
            

            @Archimedeus sagte in Frage zu DeviceCounter script [object Object]:

            Leider ist total jetzt auch 0, sollte 2 sein.

            An der Zählung (Zeile 39) hat sich nichts geändert ?

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

              @paul53

              Ich bin etwas weiter.

              var roomsX = getObject(id,'rooms');
              

              Die Zeile gibt schon das object Obct. Grund ist, dass in der Aufzählung direkt die Endpunkte -POWER stehen. ID ist dann also sonoff.0.sonoff1.POWER Da drin ist natürlich kein .rooms drin. Ich muss den Aufruf anders machen. Habe jetzt in der Auzählung sonoff.0.sonoff1 und versuche es so:

              addDeviceCounter("lamps_on",$('channel[id=state.*.POWER](functions=sonoff)'),                            true);
              

              Tut aber nicht, findet keine Devices. Ich glaube ioch muss mal drüber schlafen. Hast mir geholfen. Man kämpft sich bit für bit voran.

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

                @Archimedeus sagte in Frage zu DeviceCounter script [object Object]:

                Tut aber nicht, findet keine Devices.

                Versuche es mal so:

                addDeviceCounter("lamps_on",$('sonoff.0.*.POWER'), true);
                

                @Archimedeus sagte in Frage zu DeviceCounter script [object Object]:

                Das Problem mit LOWBATT und LOW_BATT bei HM und HMIP hat der * gelöst

                Das sind unterschiedliche Instanzen.

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

                  @paul53 said in Frage zu DeviceCounter script [object Object]:

                  addDeviceCounter("lamps_on",$('sonoff.0.*.POWER'), true);

                  Das findet alle devices in sonoff (auch die bridge) aber roomsX bleibt object Object.

                  Das andere

                  addDeviceCounter("battery_homematic",$('channel[state.id=hm-rpc.*.*.0.LOW*]'),     true);
                  

                  funktioniert wirklich. Er findet die LOW* aus beiden instanzen.

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

                    @Archimedeus sagte:

                    funktioniert wirklich. Er findet die LOW* aus beiden instanzen.

                    Jetzt ist auch keine Instanz angegeben. Der Selektor kann kürzer sein:

                    addDeviceCounter("battery_homematic",$('hm-rpc.*.0.LOW*'), true);
                    

                    @Archimedeus sagte in Frage zu DeviceCounter script [object Object]:

                    aber roomsX bleibt object Object.

                    Welche Version des Javascript-Adapters ? Sind Räume zugeordnet ?

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

                      @paul53
                      4.8.4 und ja es sind Räume zugewiesen. Morgen klappts. bestimmt 🙂

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

                        @Archimedeus
                        Habe nicht mehr daran gedacht: Raumname kann mehrsprachig sein. Deshalb

                                        var room = getObject(id,'rooms').enumNames[0];
                                        if(typeof room == 'object') room = room.de;
                                        if(!d_list.includes(room)) d_list.push(room);
                        
                        A 1 Reply Last reply Reply Quote 0
                        • A
                          Archimedeus @paul53 last edited by

                          @paul53 said in Frage zu DeviceCounter script [object Object]:

                          var room = getObject(id,'rooms').enumNames[0];

                          Schon besser. Problem: enumNames nimmt nur den ersten Raum. Deshalb stand im Original auch
                          d_list.push(rooms.enumNames)
                          und
                          setState(state_list, d_list.join('-'));

                          Naja, eigentlich sollte ein Gerät auch nur in einem Raum sein...

                          A 1 Reply Last reply Reply Quote 0
                          • A
                            Archimedeus @Archimedeus last edited by

                            @Archimedeus
                            Aber es tut, was es soll! Danke vielmals!

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

                              @Archimedeus sagte:

                              es tut, was es soll!

                              Sollen die Batterie-Infos tatsächlich pro Raum erfolgen ?

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              795
                              Online

                              31.8k
                              Users

                              80.0k
                              Topics

                              1.3m
                              Posts

                              2
                              15
                              501
                              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