Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
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

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    492

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.6k

[gelöst]Befehle zusammenfassen möglich?

Geplant Angeheftet Gesperrt Verschoben JavaScript
12 Beiträge 2 Kommentatoren 997 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • 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
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    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
      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
      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
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
          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
            schrieb am zuletzt editiert von
            #7

            @paul53
            ich sage doch, ich hab keine Ahnung vom Programmieren :face_palm:

            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 Antwort Letzte Antwort
            0
            • B baluderbär

              @paul53
              ich sage doch, ich hab keine Ahnung vom Programmieren :face_palm:

              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
              schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
              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
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                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
                  schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                  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
                    schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                    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
                      schrieb am zuletzt editiert von
                      #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 :+1:

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

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      639

                      Online

                      32.5k

                      Benutzer

                      81.8k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe