Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] Shelly Überwachungs-Skript: Frage zu Trigger

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] Shelly Überwachungs-Skript: Frage zu Trigger

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

      Hallo zusammen,

      ich habe mir ein Skript geschrieben, das meine Shellys überwacht und alle Details in meiner VIS darstellt

      ec5231d8-f94c-40ae-b1d1-7ba021cd7c20-grafik.png

      Als Trigger nutze ich folgendes :

      • alle 60 Sekunden
      • Skript Start
      • Änderung eines DP bzgl. der Sortierung in der VIS

      Jetzt würde ich gerne das Skript starten, wenn sich der Online-Status von einem Shelly ändern.

      Leider funktioniert das noch nicht so ganz

      //Trigger definieren
       schedule("* * * * *", shelly);
       shelly
       on({ id: "0_userdata.0.shelly-devices.Sortierung" }, shelly);
       on({ id: "shelly.0.*.online" },shelly);
      

      Kann jemand helfen?

      haus-automatisierung 1 Reply Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @Kuddel last edited by

        @kuddel Du musst mit dem $-Selector arbeiten: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#---selector

        $('shelly.0.*.online').on(shelly);
        
        K paul53 2 Replies Last reply Reply Quote 0
        • K
          Kuddel @haus-automatisierung last edited by Kuddel

          @haus-automatisierung sagte in Shelly Überwachungs-Skript: Frage zu Trigger:

          $('shelly.0.*.online').on(shelly);

          Super, funktioniert.

          Vielen Dank für die schnelle Hilfe

          W 1 Reply Last reply Reply Quote 0
          • W
            wobbix @Kuddel last edited by

            @kuddel
            Moin,
            könntest du mir dein Script evtl. zur verfügung stellen?
            Das ist genau das was ich grade suche. Ist aber für mich leider immer noch zu komplex zum selber basteln.

            Würde mich freuen.

            Gruß
            Wobbix

            K 1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @haus-automatisierung last edited by

              @haus-automatisierung sagte: mit dem $-Selector arbeiten:

              oder mit RegExp:

              on(/^shelly\.0\..+\.online$/, shelly);
              
              1 Reply Last reply Reply Quote 1
              • K
                Kuddel @wobbix last edited by Kuddel

                @wobbix

                function shelly(obj) {
                
                   //Devices-Anzahl erstellen
                   if(!existsState('0_userdata.0.shelly-devices.Anzahl')){
                       createState('0_userdata.0.shelly-devices.Anzahl', 0, { name: 'Anzahl', desc: 'Anzahl der Devices', type: 'number'});
                   };
                
                   //Sortierung erstellen
                   if(!existsState('0_userdata.0.shelly-devices.Sortierung')){
                       createState('0_userdata.0.shelly-devices.Sortierung', 0, {name: 'Sortierung',type: "number", def: 0, states: {0:"Name",1:"IP",2:"Raum",3:"Update",4:"Gereat",5:"Status",6:"Uptime"}});
                   };
                
                
                   var counter = 0;
                   var status_counter = 0;
                   var offline_devices = 0;
                   let list_of_devices = [];
                
                   var cacheSelector = $('[id=shelly.0.*.name]');
                   counter = counter+1;
                   cacheSelector.each(function(id, i) {
                       var id = id.replace('.name','');
                       geraetename = getState(id + ".name").val;
                       devicename = id
                       devicenameName = devicename.replace('shelly.0.','');
                 
                       //Gerätetatus
                       var connected = getState("shelly.0." + devicenameName + ".online").val;
                       if(connected == true) {var status = 1}
                       else{var status = 0}
                       
                       //IP-Adresse
                       var ip = getState("shelly.0." + devicenameName + ".hostname").val;
                
                       //Raum
                       if(geraetename.indexOf("_AZ_") > 0 ){ raum = "Ankleide";}
                       if(geraetename.indexOf("_BZ_") > 0 ){ raum = "Badezimmer";}
                       if(geraetename.indexOf("_BR_") > 0 ){ raum = "Buero";}
                       if(geraetename.indexOf("_FL_") > 0 ){ raum = "Flur";}
                       if(geraetename.indexOf("_GA_") > 0 ){ raum = "Garten";}
                       if(geraetename.indexOf("_KE_") > 0 ){ raum = "Keller";}
                       if(geraetename.indexOf("_KZ_") > 0 ){ raum = "Kinderzimmer";}
                       if(geraetename.indexOf("_KU_") > 0 ){ raum = "Kueche";}
                       if(geraetename.indexOf("_SZ_") > 0 ){ raum = "Schlafzimmer";}
                       if(geraetename.indexOf("_WZ_") > 0 ){ raum = "Wohnzimmer";}
                       if(geraetename.indexOf("Test") > 0 ){ raum = "Test";}
                
                       //Typ
                       var geraet = getState("shelly.0." + devicenameName + ".id").val;
                       if(geraet == 'shelly1') {geraet = 'Shelly 1';}
                       if(geraet == 'shelly1pm') {geraet = 'Shelly 1 PM';}
                       if(geraet == 'shellyswitch25') {geraet = 'Shelly 2.5';}
                       if(geraet == 'shellyplug-s') {geraet = 'Shelly Plug S';}
                       if(geraet == 'shellyplug') {geraet = 'Shelly Plug';}
                       if(geraet == 'shellyrgbw2') {geraet = 'Shelly RGBW 2';}
                       if(geraet == 'shellyplus1') {geraet = 'Shelly Plus 1';}
                
                       
                       //Infos abfragen
                       if(status == 1 ) {
                           var status = "1"
                
                           //Uptime
                   		var uptime = getState("shelly.0." + devicenameName + ".uptime").val;
                           var tage = Math.floor(uptime / (24*3600));
                           var stunden = Math.floor((uptime % (24*3600))/3600);
                           var minuten = Math.floor((uptime % (3600))/60);
                           //var sekunden = Math.floor(uptime % 60);      
                           if (stunden < 10) {stunden = "0"+stunden};
                           if (minuten < 10) {minuten = "0"+minuten};				
                           if (tage == 1) {uptime = tage.toString()+" Tag, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";};
                           if (tage != 1) {uptime = tage.toString()+" Tage, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";}
                       
                           //var gereat = gereat.charAt(0).toUpperCase() + gereat.slice(1);
                
                           //Power
                           if(geraet != "Shelly RGBW 2") {
                               var power = getState("shelly.0." + devicenameName + ".Relay0.Switch").val;    
                           }
                           else{
                               var power = getState("shelly.0." + devicenameName + ".lights.Switch").val;    
                           }
                
                           //Verbauch
                           if(geraetename.startsWith("SD_")){
                               var verbrauch = getState("shelly.0." + devicenameName + ".Relay0.Power").val; 
                               //verbrauch = Number(verbrauch);
                           }
                           else{var verbrauch = 0;}
                
                
                           //Update
                           var update = getState("shelly.0." + devicenameName + ".firmware").val; 
                           if(update == true)   {update = "veraltet"}
                           else{update = "aktuell"}
                           if(!(update)) {update = ""}
                   		
                   		//Version
                   		var version = getState("shelly.0." + devicenameName + ".version").val;
                
                   		//Shelly Plus 1
                   		if(geraet == 'Shelly Plus 1') {
                   			//Version in String konverteiren
                   			version = String(version);
                
                   			//Suchen vom Slash in der Version
                   			indexslash = version.indexOf('/');
                
                   			//Funktion zum Suchen des - in der Versionsnummer
                   			function getPosition(string, subString, index) {return string.split(subString, index).join(subString).length;}
                
                   			//Minus in der Versionsnummer suchen
                   			position = getPosition(version, '-', 2);
                
                   			//Version auslesen
                   			version = version.substring(indexslash +1, position);
                
                   		}
                   		//normale Shellys
                   		else{
                   			//Version in String konverteiren
                   			version = String(version);
                
                   			//Suche vom v in Version
                   			indexv = version.indexOf('v');
                   			
                   			//Funktion zum Suchen des 2. Punktes in der Versionsnummer
                   			function getPosition(string, subString, index) {return string.split(subString, index).join(subString).length;}
                
                   			//2. Punkt in der Versionsnummer suchen
                   			position_punkt = getPosition(version, '.', 2);
                   			
                   			//Version auslesen
                   			if(position_punkt < 25){version = version.substring(indexv +1, position_punkt +2);}
                   			else{
                   				position_bindestrich = getPosition(version, '-', 2);
                   				version = version.substring(indexv +1, position_bindestrich);
                   			}
                   		}
                
                         
                           
                       }
                       if(status == false){
                           var status = "0"
                           var uptime = ""
                           var version = ""
                           //var ip = ""
                           //var geraet = ""
                           var power = false
                           var update = ""
                           var verbrauch = 0
                
                           offline_devices = offline_devices+1;
                       }
                       
                       //Alle Werte eines Gerätes in JSON schreiben
                       list_of_devices.push({"DeviceName": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Geraet": geraet, "Power": power, "Update": update, "Raum": raum, "Verbrauch": verbrauch});
                
                   }); 
                   
                
                
                   //JSON sortieren
                   var sortierung = getState("0_userdata.0.shelly-devices.Sortierung").val;
                   //Nach Namen sortieren
                   if(sortierung == 0){
                       list_of_devices.sort((a, b) => {
                   		return a.DeviceName.localeCompare(b.DeviceName);
                       });
                   };
                   
                   //Nach IP sortieren
                   if(sortierung == 1){
                       list_of_devices.sort((a, b) => {
                   		return a.IP.localeCompare(b.IP);
                       });
                   };
                
                   //Nach Raum sortieren
                   if(sortierung == 2){
                       list_of_devices.sort((a, b) => {
                   		//return a.Raum.localeCompare(b.Raum);
                           return a.Raum.localeCompare(b.Raum) || a.DeviceName.localeCompare(b.DeviceName);
                       });
                   };
                
                   //Nach Gerätetyp sortieren
                   if(sortierung == 3){
                       list_of_devices.sort((a, b) => {
                   		return a.Geraet.localeCompare(b.Geraet) || a.DeviceName.localeCompare(b.DeviceName);
                       });
                   };
                
                   //Nach Firmware sortieren
                   if(sortierung == 4){
                       list_of_devices.sort((a, b) => {
                   		return a.Version.localeCompare(b.Version) || a.DeviceName.localeCompare(b.DeviceName);
                       });
                   };
                
                   //Nach Status sortieren
                   if(sortierung == 5){
                       list_of_devices.sort((a, b) => {
                   		return a.Status.localeCompare(b.Status) || a.DeviceName.localeCompare(b.DeviceName);
                       });
                   };
                
                   //Nach Uptime sortieren
                   if(sortierung == 6){
                       list_of_devices.sort((a, b) => {
                   		return a.Uptime.localeCompare(b.Uptime) || a.DeviceName.localeCompare(b.DeviceName);
                       });
                   };
                
                   
                
                   //console.log(list_of_devices)
                     
                
                
                   //Inhalt aus JSON in DPs schreiben
                   counter = 0;
                   list_of_devices.forEach(device => {
                       //Device Counter
                       counter = counter+1;
                
                       
                       // Device-Name
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Device-Name";
                       createState(dp, 'empty', { name: 'Device-Name', desc: '', type: 'string', role: '',read: true, write: true }); 
                       setStateDelayed(dp, device.DeviceName, 800);
                       
                       // Uptime
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Uptime"; 
                       createState(dp, 'empty', { name: 'Uptime', desc: '', type: 'string', role: '',read: true, write: true });
                       setStateDelayed(dp, device.Uptime, 800);
                       
                       // Status
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Status";
                       createState(dp, 'empty', { name: 'Status', desc: '', type: 'string', role: '',read: true, write: true }); 
                       setStateDelayed(dp, device.Status, 800);
                       
                       // Version
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Version";
                       createState(dp, 'empty', { name: 'Version', desc: '', type: 'string', role: '',read: true, write: true }); 
                       setStateDelayed(dp, device.Version, 800);
                       
                       // IP
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".IP";
                       createState(dp, 'empty', { name: 'IP', desc: '', type: 'string', role: '',read: true, write: true }); 
                       setStateDelayed(dp, device.IP, 800);
                       
                       // Gereatetyp
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Geraet";
                       createState(dp, 'empty', { name: 'Geraet', desc: '', type: 'string', role: '',read: true, write: true }); 
                       setStateDelayed(dp, device.Geraet, 800);
                       
                       // Power
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Power";
                       createState(dp, 'empty', { name: 'Power', desc: '', type: 'boolean', role: '',read: true, write: true }); 
                       setStateDelayed(dp, device.Power, 800);
                       
                       // Verbrauch
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Verbrauch";
                       createState(dp, 'empty', { name: 'Verbrauch', desc: '', type: 'number', role: '',read: true, write: true }); 
                       setStateDelayed(dp, device.Verbrauch, 800);
                       
                       // Update
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Update";
                       createState(dp, 'empty', { name: 'Update', desc: '', type: 'string', role: '',read: true, write: true }); 
                       setStateDelayed(dp, device.Update, 800);
                       
                       // Raum
                       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Raum";
                       createState(dp, 'empty', { name: 'Raum', desc: '', type: 'string', role: '',read: true, write: true }); 
                       setStateDelayed(dp, device.Raum, 800);
                       // Raum
                
                   });
                   
                   // 1 von der Anzahl der Offlien-Geräte abziehen (wenn Shelly offline), da der Shelly von der Druckerbeleuchtung nicht immer an ist
                   var shellyrgbw2 = getState("shelly.0.SHRGBW2#A89CF7#1.online").val;
                   if(shellyrgbw2 == false) {offline_devices = offline_devices -1};
                   
                   // 1 von der Anzahl der Offlien-Geräte abziehen (wenn Shelly offline), wenn der Pool abgebaut ist (Letzte Änderung Leistung > 12h)
                   var whirlpool_power_last_change = getState("alias.0.Garten.SD_GA_Whirlpool.POWER").lc;
                   var date1 = new Date(whirlpool_power_last_change);
                   var date2 = new Date();
                   var diff = date2.getTime() - date1.getTime();
                   var stunden = Math.floor(diff / (1000 * 60 * 60));
                   if(stunden > 0){offline_devices = offline_devices -1;}
                
                
                   //Gesamt Anzahl der online Geräte berechnen
                   dp="0_userdata.0.shelly-devices.Anzahl";
                   createState(dp, 'empty', { name: 'Anzahl', desc: '', type: 'number', role: '',read: true, write: true }); 
                   setStateDelayed(dp, counter, 800);
                   
                
                   
                   //Letzte aktualisierung
                   var datum = new Date();
                   var heute = datum.getDate()+ "." + (datum.getMonth()+ 1)+"." + datum.getFullYear()+" " +datum.getHours() +":" + datum.getMinutes() +":" + datum.getSeconds() + " Uhr" ;
                   createState('0_userdata.0.shelly-devices.Letztes_Update', 0, { name: 'Letztes_Update', desc: '', type: 'string', role: '',read: true, write: true }); 
                   setStateDelayed('0_userdata.0.shelly-devices.Letztes_Update', heute, 800);
                
                   //Alle Geräte online
                   if(status_counter == counter) {
                   	dp="0_userdata.0.shelly-devices.Alle_Devices_verbunden";
                   	createState(dp, 'empty', { name: 'Alle_Devices_verbunden', desc: '', type: 'string', role: '',read: true, write: true }); 
                   	setStateDelayed(dp, "1", 800);
                   }
                   else{
                   	dp="0_userdata.0.shelly-devices.Alle_Devices_verbunden";
                   	createState(dp, 'empty', { name: 'Alle_Devices_verbunden', desc: '', type: 'string', role: '',read: true, write: true }); 
                   	setStateDelayed(dp, "0", 800);
                   }
                   
                   //Anzahl offline Geräte
                   dp="0_userdata.0.shelly-devices.Anzahl_offline_Devices";
                   createState(dp, 'empty', { name: 'Anzahl_offline_Devices', desc: '', type: 'number', role: '',read: true, write: true }); 
                   setStateDelayed(dp, offline_devices, 800);
                
                
                }
                
                //Trigger definieren
                schedule("* * * * *", shelly);
                on({ id: "0_userdata.0.shelly-devices.Sortierung" }, shelly);
                $('shelly.0.*.online').on(shelly); 
                shelly();
                
                
                
                
                

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

                Support us

                ioBroker
                Community Adapters
                Donate

                809
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                4
                6
                388
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo