Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [gelöst]Befehle zusammenfassen möglich?

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    776

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    18
    1
    6.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

[gelöst]Befehle zusammenfassen möglich?

Scheduled Pinned Locked Moved JavaScript
12 Posts 2 Posters 1.1k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    baluderbär
    wrote on last edited by baluderbär
    #1

    Hallo zusammen,
    eine kurze Frage. Ich benutze ein Skript zur Abfrage der Batteriestatus der Komponenten von HM und Osram (zigbee).

        //Add device rules
        addDeviceCounter("lowbat",         $('channel[state.id=*0.LOWBAT]'),                     true);
        addDeviceCounter("battery_deconz", $('channel[state.id=*.battery]'),                     true);
    

    Ist es möglich die Zeilen 2+3 zusammenzufassen, so dass alle z.B. unter einem DP angezeigt werden? Momentan sehen die DP so aus.
    Unbenannt.PNG

    Liebe Grüße und einen schönen 2. Weihnachtsfeiertag
    Martin

    ioBroker auf VM Proxmox (Intel NUC-Kit i3-7100U 2.4GHz HD620 NUC7I3BNH)

    paul53P 1 Reply Last reply
    0
    • B baluderbär

      Hallo zusammen,
      eine kurze Frage. Ich benutze ein Skript zur Abfrage der Batteriestatus der Komponenten von HM und Osram (zigbee).

          //Add device rules
          addDeviceCounter("lowbat",         $('channel[state.id=*0.LOWBAT]'),                     true);
          addDeviceCounter("battery_deconz", $('channel[state.id=*.battery]'),                     true);
      

      Ist es möglich die Zeilen 2+3 zusammenzufassen, so dass alle z.B. unter einem DP angezeigt werden? Momentan sehen die DP so aus.
      Unbenannt.PNG

      Liebe Grüße und einen schönen 2. Weihnachtsfeiertag
      Martin

      paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by
      #2

      @baluderbär sagte in Befehle zusammenfassen möglich?:

      Zeilen 2+3 zusammenzufassen, so dass alle z.B. unter einem DP angezeigt werden?

      Versuche es mal so:

      const ids = [];
      $('hm-rpc.*.0.LOWBAT').each(function(id,i) {
          ids.push(id);
      });
      $('zigbee.*.battery').each(function(id,i) {
          ids.push(id);
      });
      
      const idsLowbatt = {};
      for(let i =0; i < ids.length; i++) {
          idsLowbatt[i] = ids[i];
      }
      idsLowbatt.length = ids.length; // Gesamtanzahl IDs
      

      idsLowbatt enthält alle IDs im Selektor-Format.

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      B 1 Reply Last reply
      0
      • paul53P paul53

        @baluderbär sagte in Befehle zusammenfassen möglich?:

        Zeilen 2+3 zusammenzufassen, so dass alle z.B. unter einem DP angezeigt werden?

        Versuche es mal so:

        const ids = [];
        $('hm-rpc.*.0.LOWBAT').each(function(id,i) {
            ids.push(id);
        });
        $('zigbee.*.battery').each(function(id,i) {
            ids.push(id);
        });
        
        const idsLowbatt = {};
        for(let i =0; i < ids.length; i++) {
            idsLowbatt[i] = ids[i];
        }
        idsLowbatt.length = ids.length; // Gesamtanzahl IDs
        

        idsLowbatt enthält alle IDs im Selektor-Format.

        B Offline
        B Offline
        baluderbär
        wrote on last edited by
        #3

        @paul53 Servus Paul, erst einmal danke. Aber ich glaube ich hänge mal besser das ganze Skript an, weil ich nicht weiß wie ich deinen Code in den alten implementieren soll. So fit bin ich leider nicht.

        //Add device rules
            addDeviceCounter("lowbat",         $('channel[state.id=*0.LOWBAT]'),                     true);
            addDeviceCounter("battery_deconz", $('channel[state.id=*.battery]'),                     true);
            addDeviceCounter("sticky_unreach", $('channel[state.id=*.STICKY_UNREACH]'),              true);
            addDeviceCounter("unreach",        $('channel[state.id=*.UNREACH]'),                     true);
            addDeviceCounter("config_pending", $('channel[state.id=*.CONFIG_PENDING]'),              true);
            //addDeviceCounter("open_windows",   $('channel{TYPE=SHUTTER_CONTACT}[state.id=*.STATE]'), true);
            //addDeviceCounter("on_lights",      $('channel{TYPE=DIMMER}[state.id=*.LEVEL]'),          function(state){return state>0;});
            //addDeviceCounter("open_shutters",  $('channel{TYPE=BLIND}[state.id=*.LEVEL]'),           function(state){return state>0;});
            //addDeviceCounter("playing_music",  $('channel[state.id=*audio-*.playing]'),              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);
                        if ((typeof val_to_count === 'function' && val_to_count(status)) ||
                            (typeof val_to_count === 'boolean'  && val_to_count == status)) {
                            //Get parent object
                            var parentChannelId = id.slice(id.lastIndexOf("."));
                            var parentDevicelId = id.split(".").slice(0,-2).join(".");
                            var deviceObject = getObject(parentDevicelId);
                            //remember device name
                            d_list.push(deviceObject.common.name);
                        }                
                        ++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(''));
                    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 5 Minutes
                schedule("*/5 * * * *", countDevs);
            
                //Evaluate for the first time
                countDevs();
            }
        

        ioBroker auf VM Proxmox (Intel NUC-Kit i3-7100U 2.4GHz HD620 NUC7I3BNH)

        paul53P 1 Reply Last reply
        0
        • B baluderbär

          @paul53 Servus Paul, erst einmal danke. Aber ich glaube ich hänge mal besser das ganze Skript an, weil ich nicht weiß wie ich deinen Code in den alten implementieren soll. So fit bin ich leider nicht.

          //Add device rules
              addDeviceCounter("lowbat",         $('channel[state.id=*0.LOWBAT]'),                     true);
              addDeviceCounter("battery_deconz", $('channel[state.id=*.battery]'),                     true);
              addDeviceCounter("sticky_unreach", $('channel[state.id=*.STICKY_UNREACH]'),              true);
              addDeviceCounter("unreach",        $('channel[state.id=*.UNREACH]'),                     true);
              addDeviceCounter("config_pending", $('channel[state.id=*.CONFIG_PENDING]'),              true);
              //addDeviceCounter("open_windows",   $('channel{TYPE=SHUTTER_CONTACT}[state.id=*.STATE]'), true);
              //addDeviceCounter("on_lights",      $('channel{TYPE=DIMMER}[state.id=*.LEVEL]'),          function(state){return state>0;});
              //addDeviceCounter("open_shutters",  $('channel{TYPE=BLIND}[state.id=*.LEVEL]'),           function(state){return state>0;});
              //addDeviceCounter("playing_music",  $('channel[state.id=*audio-*.playing]'),              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);
                          if ((typeof val_to_count === 'function' && val_to_count(status)) ||
                              (typeof val_to_count === 'boolean'  && val_to_count == status)) {
                              //Get parent object
                              var parentChannelId = id.slice(id.lastIndexOf("."));
                              var parentDevicelId = id.split(".").slice(0,-2).join(".");
                              var deviceObject = getObject(parentDevicelId);
                              //remember device name
                              d_list.push(deviceObject.common.name);
                          }                
                          ++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(''));
                      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 5 Minutes
                  schedule("*/5 * * * *", countDevs);
              
                  //Evaluate for the first time
                  countDevs();
              }
          
          paul53P Offline
          paul53P Offline
          paul53
          wrote on last edited by paul53
          #4

          @baluderbär sagte:

          das ganze Skript

          const ids = [];
          $('hm-rpc.*.0.LOWBAT').each(function(id, i) {ids.push(id);});
          $('deconz.*.battery').each(function(id, i) {ids.push(id);});
          $('hm-rpc.*.0.STICKY_UNREACH').each(function(id, i) {ids.push(id);});
          $('hm-rpc.*.0.UNREACH').each(function(id, i) {ids.push(id);});
          $('hm-rpc.*.0.CONFIG_PENDING').each(function(id, i) {ids.push(id);});
           
          const idsService = {};
          for(let i =0; i < ids.length; i++) {
              idsService[i] = ids[i];
          }
          idsService.length = ids.length;
          
          addDeviceCounter('Servicemeldungen', idsService, true); // Ersatz für Zeilen 2 - 6
          
          function deviceName(id) {
              id = id.substring(0, id.lastIndexOf('.'));
              if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
              id = id.substring(0, id.lastIndexOf('.'));
              if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
          }
          

          Wozu "STICKY_UNREACH" ? Das ist keine echte Servicemeldung, sondern eine CCU-interne Selbsthaltung von "UNREACH".

          @baluderbär sagte:

                              var parentChannelId = id.slice(id.lastIndexOf("."));
                              var parentDevicelId = id.split(".").slice(0,-2).join(".");
                              var deviceObject = getObject(parentDevicelId);
          

          Das passt sicherlich nicht für Deconz, deshalb verwende die Funktion deviceName(id).

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          B 1 Reply Last reply
          0
          • paul53P paul53

            @baluderbär sagte:

            das ganze Skript

            const ids = [];
            $('hm-rpc.*.0.LOWBAT').each(function(id, i) {ids.push(id);});
            $('deconz.*.battery').each(function(id, i) {ids.push(id);});
            $('hm-rpc.*.0.STICKY_UNREACH').each(function(id, i) {ids.push(id);});
            $('hm-rpc.*.0.UNREACH').each(function(id, i) {ids.push(id);});
            $('hm-rpc.*.0.CONFIG_PENDING').each(function(id, i) {ids.push(id);});
             
            const idsService = {};
            for(let i =0; i < ids.length; i++) {
                idsService[i] = ids[i];
            }
            idsService.length = ids.length;
            
            addDeviceCounter('Servicemeldungen', idsService, true); // Ersatz für Zeilen 2 - 6
            
            function deviceName(id) {
                id = id.substring(0, id.lastIndexOf('.'));
                if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
                id = id.substring(0, id.lastIndexOf('.'));
                if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
            }
            

            Wozu "STICKY_UNREACH" ? Das ist keine echte Servicemeldung, sondern eine CCU-interne Selbsthaltung von "UNREACH".

            @baluderbär sagte:

                                var parentChannelId = id.slice(id.lastIndexOf("."));
                                var parentDevicelId = id.split(".").slice(0,-2).join(".");
                                var deviceObject = getObject(parentDevicelId);
            

            Das passt sicherlich nicht für Deconz, deshalb verwende die Funktion deviceName(id).

            B Offline
            B Offline
            baluderbär
            wrote on last edited by
            #5

            @paul53
            Bekomme folgende Fehlermeldung beim Ausführen:

            14:02:40.741	info	javascript.0 (744) Stop script script.js.common.Test
            14:02:40.829	info	javascript.0 (744) Start javascript script.js.common.Test
            14:02:40.834	info	javascript.0 (744) script.js.common.Test: registered 0 subscriptions and 0 schedules
            14:02:40.835	error	javascript.0 (744) script.js.common.Test: ReferenceError: addDeviceCounter is not defined
            14:02:40.835	error	javascript.0 (744) at script.js.common.Test:14:1
            14:02:40.835	error	javascript.0 (744) at script.js.common.Test:16:3
            

            ioBroker auf VM Proxmox (Intel NUC-Kit i3-7100U 2.4GHz HD620 NUC7I3BNH)

            paul53P 1 Reply Last reply
            0
            • B baluderbär

              @paul53
              Bekomme folgende Fehlermeldung beim Ausführen:

              14:02:40.741	info	javascript.0 (744) Stop script script.js.common.Test
              14:02:40.829	info	javascript.0 (744) Start javascript script.js.common.Test
              14:02:40.834	info	javascript.0 (744) script.js.common.Test: registered 0 subscriptions and 0 schedules
              14:02:40.835	error	javascript.0 (744) script.js.common.Test: ReferenceError: addDeviceCounter is not defined
              14:02:40.835	error	javascript.0 (744) at script.js.common.Test:14:1
              14:02:40.835	error	javascript.0 (744) at script.js.common.Test:16:3
              
              paul53P Offline
              paul53P Offline
              paul53
              wrote on last edited by paul53
              #6

              @baluderbär sagte:

              ReferenceError: addDeviceCounter is not defined

              Das restliche Script muss da auch rein: Ich habe nur den geänderten Anfang (bis ursprünglich Zeile 10) dargestellt.

              const ids = [];
              $('hm-rpc.*.0.LOWBAT').each(function(id, i) {ids.push(id);});
              $('deconz.*.battery').each(function(id, i) {ids.push(id);});
              $('hm-rpc.*.0.STICKY_UNREACH').each(function(id, i) {ids.push(id);});
              $('hm-rpc.*.0.UNREACH').each(function(id, i) {ids.push(id);});
              $('hm-rpc.*.0.CONFIG_PENDING').each(function(id, i) {ids.push(id);});
               
              const idsService = {};
              for(let i =0; i < ids.length; i++) {
                  idsService[i] = ids[i];
              }
              idsService.length = ids.length;
               
              addDeviceCounter('Servicemeldungen', idsService, true); // Ersatz für Zeilen 2 - 6
              
              /******************************************
              * Code - do not change anything bellow this line *
              ******************************************/
               
              function deviceName(id) {
                  id = id.substring(0, id.lastIndexOf('.'));
                  if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
                  id = id.substring(0, id.lastIndexOf('.'));
                  if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
              }
              
              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);
                              if ((typeof val_to_count === 'function' && val_to_count(status)) ||
                                  (typeof val_to_count === 'boolean'  && val_to_count == status)) {
                                 //remember device name
                                  d_list.push(deviceName(id));
                              }                
                              ++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(''));
                          setState(state_counter,  d_list.length);
                          setState(state_total,    d_count);
                      }
                  
                      //Re-evaluate when a device status changes
                      on(ids, countDevs);
                  
                      //Re-evaluate each 5 Minutes
                      schedule("*/5 * * * *", countDevs);
                  
                      //Evaluate for the first time
                      countDevs();
                  }
              

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              B 1 Reply Last reply
              0
              • paul53P paul53

                @baluderbär sagte:

                ReferenceError: addDeviceCounter is not defined

                Das restliche Script muss da auch rein: Ich habe nur den geänderten Anfang (bis ursprünglich Zeile 10) dargestellt.

                const ids = [];
                $('hm-rpc.*.0.LOWBAT').each(function(id, i) {ids.push(id);});
                $('deconz.*.battery').each(function(id, i) {ids.push(id);});
                $('hm-rpc.*.0.STICKY_UNREACH').each(function(id, i) {ids.push(id);});
                $('hm-rpc.*.0.UNREACH').each(function(id, i) {ids.push(id);});
                $('hm-rpc.*.0.CONFIG_PENDING').each(function(id, i) {ids.push(id);});
                 
                const idsService = {};
                for(let i =0; i < ids.length; i++) {
                    idsService[i] = ids[i];
                }
                idsService.length = ids.length;
                 
                addDeviceCounter('Servicemeldungen', idsService, true); // Ersatz für Zeilen 2 - 6
                
                /******************************************
                * Code - do not change anything bellow this line *
                ******************************************/
                 
                function deviceName(id) {
                    id = id.substring(0, id.lastIndexOf('.'));
                    if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
                    id = id.substring(0, id.lastIndexOf('.'));
                    if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
                }
                
                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);
                                if ((typeof val_to_count === 'function' && val_to_count(status)) ||
                                    (typeof val_to_count === 'boolean'  && val_to_count == status)) {
                                   //remember device name
                                    d_list.push(deviceName(id));
                                }                
                                ++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(''));
                            setState(state_counter,  d_list.length);
                            setState(state_total,    d_count);
                        }
                    
                        //Re-evaluate when a device status changes
                        on(ids, countDevs);
                    
                        //Re-evaluate each 5 Minutes
                        schedule("*/5 * * * *", countDevs);
                    
                        //Evaluate for the first time
                        countDevs();
                    }
                
                B Offline
                B Offline
                baluderbär
                wrote on last edited by
                #7

                @paul53
                ich sage doch, ich hab keine Ahnung vom Programmieren 🤦

                Hier das Skript:

                 //Add device rules
                    
                const ids = [];
                $('hm-rpc.*.0.LOWBAT').each(function(id, i) {ids.push(id);});
                $('deconz.*.battery').each(function(id, i) {ids.push(id);});
                $('hm-rpc.*.0.STICKY_UNREACH').each(function(id, i) {ids.push(id);});
                $('hm-rpc.*.0.UNREACH').each(function(id, i) {ids.push(id);});
                $('hm-rpc.*.0.CONFIG_PENDING').each(function(id, i) {ids.push(id);});
                 
                const idsService = {};
                for(let i =0; i < ids.length; i++) {
                    idsService[i] = ids[i];
                }
                idsService.length = ids.length;
                 
                addDeviceCounter('Servicemeldungen', idsService, true); // Ersatz für Zeilen 2 - 6
                
                    
                    /******************************************
                     * 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);
                                if ((typeof val_to_count === 'function' && val_to_count(status)) ||
                                    (typeof val_to_count === 'boolean'  && val_to_count == status)) {
                                    //Get parent object
                                    var parentChannelId = id.slice(id.lastIndexOf("."));
                                    var parentDevicelId = id.split(".").slice(0,-2).join(".");
                                    var deviceObject = getObject(parentDevicelId);
                                    //remember device name
                                    d_list.push(deviceObject.common.name);
                                }                
                                ++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(''));
                            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 5 Minutes
                        schedule("*/5 * * * *", countDevs);
                    
                        //Evaluate for the first time
                        countDevs();
                    }
                

                ... und nun folgender Fehler:

                14:11:40.090	info	javascript.0 (744) Stop script script.js.common.DeviceCounter_Kopie
                14:11:40.177	info	javascript.0 (744) Start javascript script.js.common.DeviceCounter_Kopie
                14:11:40.182	info	javascript.0 (744) script.js.common.DeviceCounter_Kopie: registered 0 subscriptions and 0 schedules
                14:11:40.182	error	javascript.0 (744) script.js.common.DeviceCounter_Kopie: TypeError: selector.on is not a function
                14:11:40.182	error	javascript.0 (744) at addDeviceCounter (script.js.common.DeviceCounter_Kopie:62:18)
                14:11:40.183	error	javascript.0 (744) at script.js.common.DeviceCounter_Kopie:16:1
                14:11:40.183	error	javascript.0 (744) at script.js.common.DeviceCounter_Kopie:72:3
                

                ioBroker auf VM Proxmox (Intel NUC-Kit i3-7100U 2.4GHz HD620 NUC7I3BNH)

                paul53P 1 Reply Last reply
                0
                • B baluderbär

                  @paul53
                  ich sage doch, ich hab keine Ahnung vom Programmieren 🤦

                  Hier das Skript:

                   //Add device rules
                      
                  const ids = [];
                  $('hm-rpc.*.0.LOWBAT').each(function(id, i) {ids.push(id);});
                  $('deconz.*.battery').each(function(id, i) {ids.push(id);});
                  $('hm-rpc.*.0.STICKY_UNREACH').each(function(id, i) {ids.push(id);});
                  $('hm-rpc.*.0.UNREACH').each(function(id, i) {ids.push(id);});
                  $('hm-rpc.*.0.CONFIG_PENDING').each(function(id, i) {ids.push(id);});
                   
                  const idsService = {};
                  for(let i =0; i < ids.length; i++) {
                      idsService[i] = ids[i];
                  }
                  idsService.length = ids.length;
                   
                  addDeviceCounter('Servicemeldungen', idsService, true); // Ersatz für Zeilen 2 - 6
                  
                      
                      /******************************************
                       * 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);
                                  if ((typeof val_to_count === 'function' && val_to_count(status)) ||
                                      (typeof val_to_count === 'boolean'  && val_to_count == status)) {
                                      //Get parent object
                                      var parentChannelId = id.slice(id.lastIndexOf("."));
                                      var parentDevicelId = id.split(".").slice(0,-2).join(".");
                                      var deviceObject = getObject(parentDevicelId);
                                      //remember device name
                                      d_list.push(deviceObject.common.name);
                                  }                
                                  ++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(''));
                              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 5 Minutes
                          schedule("*/5 * * * *", countDevs);
                      
                          //Evaluate for the first time
                          countDevs();
                      }
                  

                  ... und nun folgender Fehler:

                  14:11:40.090	info	javascript.0 (744) Stop script script.js.common.DeviceCounter_Kopie
                  14:11:40.177	info	javascript.0 (744) Start javascript script.js.common.DeviceCounter_Kopie
                  14:11:40.182	info	javascript.0 (744) script.js.common.DeviceCounter_Kopie: registered 0 subscriptions and 0 schedules
                  14:11:40.182	error	javascript.0 (744) script.js.common.DeviceCounter_Kopie: TypeError: selector.on is not a function
                  14:11:40.182	error	javascript.0 (744) at addDeviceCounter (script.js.common.DeviceCounter_Kopie:62:18)
                  14:11:40.183	error	javascript.0 (744) at script.js.common.DeviceCounter_Kopie:16:1
                  14:11:40.183	error	javascript.0 (744) at script.js.common.DeviceCounter_Kopie:72:3
                  
                  paul53P Offline
                  paul53P Offline
                  paul53
                  wrote on last edited by paul53
                  #8

                  @baluderbär sagte:

                  TypeError: selector.on is not a function

                  Dann ersetze Zeilen 62 - 64 durch:

                          on(ids, countDevs);
                  

                  Das habe ich in diesem Script bereits gemacht.

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  B 1 Reply Last reply
                  0
                  • paul53P paul53

                    @baluderbär sagte:

                    TypeError: selector.on is not a function

                    Dann ersetze Zeilen 62 - 64 durch:

                            on(ids, countDevs);
                    

                    Das habe ich in diesem Script bereits gemacht.

                    B Offline
                    B Offline
                    baluderbär
                    wrote on last edited by
                    #9

                    @paul53 Hatte deine Änderung nicht gesehen.
                    Mit deinem letzten Stand des Skriptes bekomme ich dies hier:

                    14:43:41.400	info	javascript.0 (744) Stop script script.js.common.DeviceCounter_Kopie
                    14:43:41.489	info	javascript.0 (744) Start javascript script.js.common.DeviceCounter_Kopie
                    14:43:41.497	info	javascript.0 (744) script.js.common.DeviceCounter_Kopie: registered 325 subscriptions and 1 schedule
                    14:43:41.497	error	javascript.0 (744) script.js.common.DeviceCounter_Kopie: TypeError: selector.each is not a function
                    14:43:41.497	error	javascript.0 (744) at countDevs (script.js.common.DeviceCounter_Kopie:43:22)
                    14:43:41.497	error	javascript.0 (744) at addDeviceCounter (script.js.common.DeviceCounter_Kopie:68:9)
                    14:43:41.498	error	javascript.0 (744) at script.js.common.DeviceCounter_Kopie:14:1
                    14:43:41.498	error	javascript.0 (744) at script.js.common.DeviceCounter_Kopie:71:3
                    

                    ioBroker auf VM Proxmox (Intel NUC-Kit i3-7100U 2.4GHz HD620 NUC7I3BNH)

                    paul53P 1 Reply Last reply
                    0
                    • B baluderbär

                      @paul53 Hatte deine Änderung nicht gesehen.
                      Mit deinem letzten Stand des Skriptes bekomme ich dies hier:

                      14:43:41.400	info	javascript.0 (744) Stop script script.js.common.DeviceCounter_Kopie
                      14:43:41.489	info	javascript.0 (744) Start javascript script.js.common.DeviceCounter_Kopie
                      14:43:41.497	info	javascript.0 (744) script.js.common.DeviceCounter_Kopie: registered 325 subscriptions and 1 schedule
                      14:43:41.497	error	javascript.0 (744) script.js.common.DeviceCounter_Kopie: TypeError: selector.each is not a function
                      14:43:41.497	error	javascript.0 (744) at countDevs (script.js.common.DeviceCounter_Kopie:43:22)
                      14:43:41.497	error	javascript.0 (744) at addDeviceCounter (script.js.common.DeviceCounter_Kopie:68:9)
                      14:43:41.498	error	javascript.0 (744) at script.js.common.DeviceCounter_Kopie:14:1
                      14:43:41.498	error	javascript.0 (744) at script.js.common.DeviceCounter_Kopie:71:3
                      
                      paul53P Offline
                      paul53P Offline
                      paul53
                      wrote on last edited by paul53
                      #10

                      @baluderbär sagte:

                      TypeError: selector.each is not a function

                      Dann lässt sich der Selektor offenbar so nicht konstruieren. Also muss man die Funktionen auf das Array ids umstellen. Zeilen 43 - 52:

                          for(let i = 0; i < ids.length; i++) {
                               let status = getState(ids[i]).val;
                               if ((typeof val_to_count === 'function' && val_to_count(status)) || (typeof val_to_count === 'boolean'  && val_to_count == status)) {
                                   //remember device name
                                  d_list.push(deviceName(ids[i]));
                               }                
                               ++d_count;  // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
                          }
                      

                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                      paul53P 1 Reply Last reply
                      0
                      • paul53P paul53

                        @baluderbär sagte:

                        TypeError: selector.each is not a function

                        Dann lässt sich der Selektor offenbar so nicht konstruieren. Also muss man die Funktionen auf das Array ids umstellen. Zeilen 43 - 52:

                            for(let i = 0; i < ids.length; i++) {
                                 let status = getState(ids[i]).val;
                                 if ((typeof val_to_count === 'function' && val_to_count(status)) || (typeof val_to_count === 'boolean'  && val_to_count == status)) {
                                     //remember device name
                                    d_list.push(deviceName(ids[i]));
                                 }                
                                 ++d_count;  // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
                            }
                        
                        paul53P Offline
                        paul53P Offline
                        paul53
                        wrote on last edited by paul53
                        #11

                        @paul53
                        Versuche es mal mit diesem Script.

                        // Servicemeldungen
                            
                        const ids = [];
                        $('hm-rpc.*.0.LOWBAT$').each(function(id, i) {ids.push(id);});
                        $('deconz.*.battery').each(function(id, i) {ids.push(id);});
                        $('hm-rpc.*.0.UNREACH$').each(function(id, i) {ids.push(id);});
                        $('hm-rpc.*.0.CONFIG_PENDING').each(function(id, i) {ids.push(id);});
                        
                        const total = $('hm-rpc.*.0.UNREACH').length + $('deconz.*.battery').length;
                        const path = '0_userdata.0.Servicemeldungen.';
                        const idTotal = path + 'total';
                        createState(idTotal, total, {type: 'number', name: 'Geräteanzahl gesamt', role: 'value'});
                        //List of devices that match condition
                        const idList = path + 'list';
                        createState(idList, "", {type: 'string', name: 'Liste der Geräte mit Servicemeldungen', role: 'info'});
                        //Number of devices that match condition
                        const idCounter = path + 'counter';
                        createState(idCounter, 0, {type: 'number', name: 'Anzahl der Geräte mit Servicemeldungen', role: 'value'});
                        
                        function deviceName(id) {
                            id = id.substring(0, id.lastIndexOf('.'));
                            if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
                            id = id.substring(0, id.lastIndexOf('.'));
                            if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
                        }
                        
                        function countDevs() {
                            var d_list  = [];
                            for(let i = 0; i < ids.length; i++) {
                                if(getState(ids[i]).val) {
                                     let device = deviceName(ids[i]);
                                     if(!d_list.includes(device)) d_list.push(device);
                                } 
                            }    
                            log("Geräte mit Servicemeldungen: " + d_list);
                            setState(idList, d_list.join(', '), true);
                            setState(idCounter, d_list.length, true);
                        }
                            
                        // Re-evaluate when a device status changes
                        on(ids, countDevs);
                            
                        // Re-evaluate each 5 Minutes
                        // schedule("*/5 * * * *", countDevs);
                            
                        // Evaluate for the first time
                        if(existsState(idList)) countDevs();
                        

                        Ob die Funktion deviceName(id) mit Deconz funktioniert, weiß ich nicht, da ich die ID-Struktur des Deconz-Adapters nicht kenne.

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        B 1 Reply Last reply
                        0
                        • paul53P paul53

                          @paul53
                          Versuche es mal mit diesem Script.

                          // Servicemeldungen
                              
                          const ids = [];
                          $('hm-rpc.*.0.LOWBAT$').each(function(id, i) {ids.push(id);});
                          $('deconz.*.battery').each(function(id, i) {ids.push(id);});
                          $('hm-rpc.*.0.UNREACH$').each(function(id, i) {ids.push(id);});
                          $('hm-rpc.*.0.CONFIG_PENDING').each(function(id, i) {ids.push(id);});
                          
                          const total = $('hm-rpc.*.0.UNREACH').length + $('deconz.*.battery').length;
                          const path = '0_userdata.0.Servicemeldungen.';
                          const idTotal = path + 'total';
                          createState(idTotal, total, {type: 'number', name: 'Geräteanzahl gesamt', role: 'value'});
                          //List of devices that match condition
                          const idList = path + 'list';
                          createState(idList, "", {type: 'string', name: 'Liste der Geräte mit Servicemeldungen', role: 'info'});
                          //Number of devices that match condition
                          const idCounter = path + 'counter';
                          createState(idCounter, 0, {type: 'number', name: 'Anzahl der Geräte mit Servicemeldungen', role: 'value'});
                          
                          function deviceName(id) {
                              id = id.substring(0, id.lastIndexOf('.'));
                              if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
                              id = id.substring(0, id.lastIndexOf('.'));
                              if(existsObject(id) && getObject(id).type == 'device') return getObject(id).common.name;
                          }
                          
                          function countDevs() {
                              var d_list  = [];
                              for(let i = 0; i < ids.length; i++) {
                                  if(getState(ids[i]).val) {
                                       let device = deviceName(ids[i]);
                                       if(!d_list.includes(device)) d_list.push(device);
                                  } 
                              }    
                              log("Geräte mit Servicemeldungen: " + d_list);
                              setState(idList, d_list.join(', '), true);
                              setState(idCounter, d_list.length, true);
                          }
                              
                          // Re-evaluate when a device status changes
                          on(ids, countDevs);
                              
                          // Re-evaluate each 5 Minutes
                          // schedule("*/5 * * * *", countDevs);
                              
                          // Evaluate for the first time
                          if(existsState(idList)) countDevs();
                          

                          Ob die Funktion deviceName(id) mit Deconz funktioniert, weiß ich nicht, da ich die ID-Struktur des Deconz-Adapters nicht kenne.

                          B Offline
                          B Offline
                          baluderbär
                          wrote on last edited by
                          #12

                          @paul53
                          Vielen Dank. Ich habe das vorletzte Skript nun am laufen und werde schauen ob alles funktioniert.
                          Echt klasse wie du immer wieder hilfst 👍

                          ioBroker auf VM Proxmox (Intel NUC-Kit i3-7100U 2.4GHz HD620 NUC7I3BNH)

                          1 Reply Last reply
                          0

                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                          With your input, this post could be even better 💗

                          Register Login
                          Reply
                          • Reply as topic
                          Log in to reply
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes


                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          627

                          Online

                          32.8k

                          Users

                          82.7k

                          Topics

                          1.3m

                          Posts
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                          ioBroker Community 2014-2025
                          logo
                          • Login

                          • Don't have an account? Register

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Home
                          • Recent
                          • Tags
                          • Unread 0
                          • Categories
                          • Unreplied
                          • Popular
                          • GitHub
                          • Docu
                          • Hilfe