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.
    • paul53
      paul53 @Archimedeus last edited by

      @Archimedeus sagte:

      ich experimentiere mit dem Script zum ählen von Devices:

      Wie sieht das Experiment (Script) aus ?

      A 1 Reply Last reply Reply Quote 0
      • 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

                                738
                                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