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. Meine Skriptesammlung

NEWS

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

Meine Skriptesammlung

Geplant Angeheftet Gesperrt Verschoben JavaScript
14 Beiträge 3 Kommentatoren 2.7k Aufrufe 5 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.
  • LSchulzeL Offline
    LSchulzeL Offline
    LSchulze
    schrieb am zuletzt editiert von LSchulze
    #1

    Moin,

    ich möchte euch an meinen Skripten teilhaben lassen. Ich würde mir feedback wünschen, solange es konstruktiv ist.

    Grundpfeiler der Skripte

    • Sensorig von Aktoren trennen
    • Lieber 3 kleine, als ein großes Skript
    • any bei "On()" Ereignissen vermeiden

    Todo:

    • Wie gehe ich mit Fehlerfällen um?
    • Wie gehe ich mit leeren Batterien oder verlorenen Zigbee Verbindungen um?

    Architektur

    • Zigbee, Homematic IP, Shelly im Einsatz.
    • IOBroker auf einem NUC

    Aktuelles Netz

    LSchulzeL paul53P 2 Antworten Letzte Antwort
    0
    • LSchulzeL LSchulze

      Moin,

      ich möchte euch an meinen Skripten teilhaben lassen. Ich würde mir feedback wünschen, solange es konstruktiv ist.

      Grundpfeiler der Skripte

      • Sensorig von Aktoren trennen
      • Lieber 3 kleine, als ein großes Skript
      • any bei "On()" Ereignissen vermeiden

      Todo:

      • Wie gehe ich mit Fehlerfällen um?
      • Wie gehe ich mit leeren Batterien oder verlorenen Zigbee Verbindungen um?

      Architektur

      • Zigbee, Homematic IP, Shelly im Einsatz.
      • IOBroker auf einem NUC

      Aktuelles Netz

      LSchulzeL Offline
      LSchulzeL Offline
      LSchulze
      schrieb am zuletzt editiert von LSchulze
      #2

      Starten möchte ich damit, eine Variable zu erstellen, die mir anzeigt ob in einem Raum in den letzten Minuten eine Bewegung stattfand. Diese Variable kann dann von anderen Skripten abgefragt werden um zB das Licht anzumachen, das Rollo hochzufahren oder die Musikanlage zu starten.

      Hierbei ist wichtig die Grenzen der eingesetzten Human Motion detektoren zu kennen. Bei Ikea und Aqara erhaltet ihr zB nur bei größeren Bewegungen auch eine Aktualisierung der Occupancy. Bei Ikea kann sogar nur alle paar Minuten eine erneute Bewegung erkannt werden. Bei Aqara gibt es einen Trick17 um dieses Limit zu verringern. Aus diesem Grund habe ich mich für diesen Aufbau entschieden:

      Es wird die Bewegungsvariable auf True gesetzt, sobald die erste Occupancy Meldung vom Motion Detektor kommt, dann wird gewartet bis dieser Occupancy-Wert das erste mal false wird. Dann wird ein Timer gestartet und löst zB 10 Minuten später aus und schaltet die Variable wieder auf false. Sollte sich in der Zwischenzeit erneut jemand bewegt haben, wird der Timer zurückgesetzt.

      Geräte:

      • Aqara Human Motion Sensor RTCGQ01LM
      • TRÅDFRI Funk-Bewegungsmelder E1525/E1745

      Setup:

      bewegungssensorID kann ein Aqara oder Ikea Bewegungsmelder sein. Beide verwenden "occupancy" um eine Bewegung zu melden. Es wird nur gt/lt dieser Meldungen ausgewertet.

      Es gibt 2 Javascript Variablen

      • Boolean darüber ob in einem Raum bewegung stattgefunden hat
      • Limit für den Timeout, in Minuten hinterlegt. Deswegen noch eine Umrechnung statt.
      var bewegungssensorID  = 'zigbee.0.588e81fffe4204f9'; //Bewegungssensor, der geprüft werden soll
      var raumBewegungID     = 'javascript.0.variables.BewegungBüro'; //Gerät, dass geschaltet werden soll
      var timeoutLimitID     = 'javascript.0.variables.timeoutBüroLimit';
      var timeoutLimit       = getState(timeoutLimitID).val * 60 * 1000;
      
      var timeout;
      
      on({id: bewegungssensorID + '.occupancy', change: "gt"}, function (obj) {
        var value = obj.state.val;  var oldValue = obj.oldState.val;
      
        (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); // Es gab Bewegung, setze timeout zurück
      
        setState(raumBewegungID, true, true); // setze Raum
      });
      
      on({id: bewegungssensorID + '.occupancy', change: "lt"}, function (obj) {
        var value = obj.state.val;  var oldValue = obj.oldState.val;
      
        timeout = setTimeout(function () {
          setState(raumBewegungID, false, true); // Wenn der Timeout erreicht ist, setze Raum zurück
        }, timeoutLimit);
      });
      

      V002 - Noch in der Erprobung

      • Ich habe mittlerweile Räume mit mehreren Sensoren
      • Es soll nur beim wechsel von True auf False und vice verse etwas ausgeführt werden.
      • nachdem in einem Raum mehrere Sensoren ausgelöst haben und nach 3 Minuten den Timer auslösen, kann es passieren, dass der 2. Sensor keinen timeout starten kann, deswegen setze ich jedesmal auch alle Timer zurück und starte dann den aktuellen. Ich hoffe das löst einen alten Bug in meiner Steuerung :)
      const raumID       = 'javascript.0.variables.BewegungBüro';
      const ids          = ['zigbee.0.588e81fffe4204f9.occupancy', 'zigbee.0.588e81fffe42b19e.occupancy'];
      
      var timeoutLimitID = 'javascript.0.variables.timeoutBüroLimit';
      var timeoutLimit   = getState(timeoutLimitID).val * 60 * 1000;
      var timeout 
      
      on(ids, function(obj) { 
          var value = obj.state.val;  var oldValue = obj.oldState.val;
          if(value != oldValue) // triggert bei Wertänderung
          {
               if(value>oldValue){
                  (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); // Sollte ein Timer laufen, setzen wir ihn zurück
                  setState(raumID, true, true); // setze Raum
              }
              else{
                  (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); // Sollte ein Timer laufen, setzen wir ihn zurück
                  timeout = setTimeout(function () {
                      setState(raumID, false, true); // Wenn der Timeout erreicht ist, setze Raum zurück
                  }, timeoutLimit);
              }
          }
      });
      
      
      
      
      
      
      
      LSchulzeL 1 Antwort Letzte Antwort
      0
      • LSchulzeL LSchulze

        Starten möchte ich damit, eine Variable zu erstellen, die mir anzeigt ob in einem Raum in den letzten Minuten eine Bewegung stattfand. Diese Variable kann dann von anderen Skripten abgefragt werden um zB das Licht anzumachen, das Rollo hochzufahren oder die Musikanlage zu starten.

        Hierbei ist wichtig die Grenzen der eingesetzten Human Motion detektoren zu kennen. Bei Ikea und Aqara erhaltet ihr zB nur bei größeren Bewegungen auch eine Aktualisierung der Occupancy. Bei Ikea kann sogar nur alle paar Minuten eine erneute Bewegung erkannt werden. Bei Aqara gibt es einen Trick17 um dieses Limit zu verringern. Aus diesem Grund habe ich mich für diesen Aufbau entschieden:

        Es wird die Bewegungsvariable auf True gesetzt, sobald die erste Occupancy Meldung vom Motion Detektor kommt, dann wird gewartet bis dieser Occupancy-Wert das erste mal false wird. Dann wird ein Timer gestartet und löst zB 10 Minuten später aus und schaltet die Variable wieder auf false. Sollte sich in der Zwischenzeit erneut jemand bewegt haben, wird der Timer zurückgesetzt.

        Geräte:

        • Aqara Human Motion Sensor RTCGQ01LM
        • TRÅDFRI Funk-Bewegungsmelder E1525/E1745

        Setup:

        bewegungssensorID kann ein Aqara oder Ikea Bewegungsmelder sein. Beide verwenden "occupancy" um eine Bewegung zu melden. Es wird nur gt/lt dieser Meldungen ausgewertet.

        Es gibt 2 Javascript Variablen

        • Boolean darüber ob in einem Raum bewegung stattgefunden hat
        • Limit für den Timeout, in Minuten hinterlegt. Deswegen noch eine Umrechnung statt.
        var bewegungssensorID  = 'zigbee.0.588e81fffe4204f9'; //Bewegungssensor, der geprüft werden soll
        var raumBewegungID     = 'javascript.0.variables.BewegungBüro'; //Gerät, dass geschaltet werden soll
        var timeoutLimitID     = 'javascript.0.variables.timeoutBüroLimit';
        var timeoutLimit       = getState(timeoutLimitID).val * 60 * 1000;
        
        var timeout;
        
        on({id: bewegungssensorID + '.occupancy', change: "gt"}, function (obj) {
          var value = obj.state.val;  var oldValue = obj.oldState.val;
        
          (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); // Es gab Bewegung, setze timeout zurück
        
          setState(raumBewegungID, true, true); // setze Raum
        });
        
        on({id: bewegungssensorID + '.occupancy', change: "lt"}, function (obj) {
          var value = obj.state.val;  var oldValue = obj.oldState.val;
        
          timeout = setTimeout(function () {
            setState(raumBewegungID, false, true); // Wenn der Timeout erreicht ist, setze Raum zurück
          }, timeoutLimit);
        });
        

        V002 - Noch in der Erprobung

        • Ich habe mittlerweile Räume mit mehreren Sensoren
        • Es soll nur beim wechsel von True auf False und vice verse etwas ausgeführt werden.
        • nachdem in einem Raum mehrere Sensoren ausgelöst haben und nach 3 Minuten den Timer auslösen, kann es passieren, dass der 2. Sensor keinen timeout starten kann, deswegen setze ich jedesmal auch alle Timer zurück und starte dann den aktuellen. Ich hoffe das löst einen alten Bug in meiner Steuerung :)
        const raumID       = 'javascript.0.variables.BewegungBüro';
        const ids          = ['zigbee.0.588e81fffe4204f9.occupancy', 'zigbee.0.588e81fffe42b19e.occupancy'];
        
        var timeoutLimitID = 'javascript.0.variables.timeoutBüroLimit';
        var timeoutLimit   = getState(timeoutLimitID).val * 60 * 1000;
        var timeout 
        
        on(ids, function(obj) { 
            var value = obj.state.val;  var oldValue = obj.oldState.val;
            if(value != oldValue) // triggert bei Wertänderung
            {
                 if(value>oldValue){
                    (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); // Sollte ein Timer laufen, setzen wir ihn zurück
                    setState(raumID, true, true); // setze Raum
                }
                else{
                    (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); // Sollte ein Timer laufen, setzen wir ihn zurück
                    timeout = setTimeout(function () {
                        setState(raumID, false, true); // Wenn der Timeout erreicht ist, setze Raum zurück
                    }, timeoutLimit);
                }
            }
        });
        
        
        
        
        
        
        
        LSchulzeL Offline
        LSchulzeL Offline
        LSchulze
        schrieb am zuletzt editiert von LSchulze
        #3

        Die eben angelegten Datenpunkt wird im nächsten Skript eingesetzt um eine Deckenlampe zu steuern.

        Geräte

        • Hier wird eine Yeelight Lampe verwendet.

        Mögliche Probleme

        • Wenn ich auf "any" Change im "On()" Event achte, werden u.U. zuviele Aktionen ausgelöst. - Man muss die Nachrichten auf gt/lt filtern.
        • Die Lampe nur schalten, wenn Sie nicht schon an ist.
        • Es wurde ein IsDaytime Datenpunkt hinzugefügt.

        TODO

        • Wenn ein Lichtschalter betätigt wird, soll die automatische Ausschaltung überschrieben werden.

        [V002]

        var raumBewegungID  = 'javascript.0.variables.BewegungBüro'; 
        var deviceID        = 'yeelight-2.0.Büro_Deckenlampe'; //Gerät, dass geschaltet werden soll
        var onlyNighttime   = true
        var nighttimeID     = 'javascript.0.variables.DraußenEsIstHell'
        
        on(raumBewegungID, function (obj) { // triggert bei Wertänderung
          var value = obj.state.val;
          
          // Schalte das Gerät, sofern die Tageszeit es zulässt und es nicht bereits den Sollzustand hat. 
          if (((   onlyNighttime && getState(nighttimeID).val == false) // Ist es Nacht?
                || onlyNighttime == false )                             // Oder ist das egal?
                && getState(deviceID + ".control.power").val != value) { 
            setState(deviceID + ".control.power"/*power*/, value);
          }
        });
        
        LSchulzeL paul53P 2 Antworten Letzte Antwort
        0
        • LSchulzeL LSchulze

          Moin,

          ich möchte euch an meinen Skripten teilhaben lassen. Ich würde mir feedback wünschen, solange es konstruktiv ist.

          Grundpfeiler der Skripte

          • Sensorig von Aktoren trennen
          • Lieber 3 kleine, als ein großes Skript
          • any bei "On()" Ereignissen vermeiden

          Todo:

          • Wie gehe ich mit Fehlerfällen um?
          • Wie gehe ich mit leeren Batterien oder verlorenen Zigbee Verbindungen um?

          Architektur

          • Zigbee, Homematic IP, Shelly im Einsatz.
          • IOBroker auf einem NUC

          Aktuelles Netz

          paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von paul53
          #4

          @LSchulze sagte:

          Ich würde mir feedback wünschen, solange es konstruktiv ist.

          Zwei Trigger auf den gleichen Datenpunkt sind Ressourcen-Verschwendung.

          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

          1 Antwort Letzte Antwort
          0
          • LSchulzeL LSchulze

            Die eben angelegten Datenpunkt wird im nächsten Skript eingesetzt um eine Deckenlampe zu steuern.

            Geräte

            • Hier wird eine Yeelight Lampe verwendet.

            Mögliche Probleme

            • Wenn ich auf "any" Change im "On()" Event achte, werden u.U. zuviele Aktionen ausgelöst. - Man muss die Nachrichten auf gt/lt filtern.
            • Die Lampe nur schalten, wenn Sie nicht schon an ist.
            • Es wurde ein IsDaytime Datenpunkt hinzugefügt.

            TODO

            • Wenn ein Lichtschalter betätigt wird, soll die automatische Ausschaltung überschrieben werden.

            [V002]

            var raumBewegungID  = 'javascript.0.variables.BewegungBüro'; 
            var deviceID        = 'yeelight-2.0.Büro_Deckenlampe'; //Gerät, dass geschaltet werden soll
            var onlyNighttime   = true
            var nighttimeID     = 'javascript.0.variables.DraußenEsIstHell'
            
            on(raumBewegungID, function (obj) { // triggert bei Wertänderung
              var value = obj.state.val;
              
              // Schalte das Gerät, sofern die Tageszeit es zulässt und es nicht bereits den Sollzustand hat. 
              if (((   onlyNighttime && getState(nighttimeID).val == false) // Ist es Nacht?
                    || onlyNighttime == false )                             // Oder ist das egal?
                    && getState(deviceID + ".control.power").val != value) { 
                setState(deviceID + ".control.power"/*power*/, value);
              }
            });
            
            LSchulzeL Offline
            LSchulzeL Offline
            LSchulze
            schrieb am zuletzt editiert von
            #5

            Problemstellung:

            Im Badezimmer fehlt mir eine einfache Möglichkeit zwischen Radiosendern auf einem Chromecast Gerät wechseln zu können.

            • eine festdefinierte Liste von MP3 Sendern. Es ist wichtig, dass die MP3 ausgelesen wirtd aus den M3U Dateien, die die Sender zur Verfügung stellen.
            • Mögliche Probleme, ein Volumen unter 0% und über 100% ist ungültig.
            • Beim drehen wird das Volumen alle x mm um 5 % erhöht. Ich habe hier noch nicht die perfekte Kombination gefunden, aber es ist wichtig zu wissen, dass egal ist wie schnell man es dreht, es wird beim drehen einfach alle x ms/sek der Wert erhöht.

            Geräte:

            • Irgendein Chromecast Gerät aus dem Chromecast Adapter
            • IKEA E1744 SYMFOISK

            ToDo

            • Ich konnte noch keine Spotfy Playlist abspielen.
            • Das starten vom DLF Stream dauert teilweise lange.
            • 3 Fach Click ist noch nicht belegt.

            Aktionen
            Drehregler zum steuern vom Volumen
            1 Click - Start / Pause
            2 Click - Nächster Radiosender
            3 Click - wird nicht verwendet.

            var deviceID = 'zigbee.0.680ae2fffe37314a';
            var volumenID = "javascript.0.variables.VolumenKüche";
            var chromecastID = 'chromecast.0.Küche_Home';
            var radiosenderListe = ['http://www.wdr.de/wdrlive/media/1live_fiehe.m3u', 'http://st01.dlf.de/dlf/01/128/mp3/stream.mp3', 'http://st03.dlf.de/dlf/03/128/mp3/stream.mp3', 'http://wdr-1live-specials.icecast.wdr.de/wdr/1live/specials/mp3/128/stream.mp3?ar-distributor=ffa1', null];
            
            var last = 1;
            on({id: deviceID + '.rotate_right', change: "any"}, function (obj) {
                var newState = getState(volumenID).val + 5;
                if(newState > 100)
                    newState = 100;
                setState(volumenID, newState);
            });
            on({id: deviceID + '.rotate_left', change: "any"}, function (obj) {
                var newState = getState(volumenID).val - 5;
                if(newState < 0)
                    newState = 0;
                setState(volumenID, newState);
            });
            
            on({id: deviceID + '.rotate_stop', change: "gt"}, function (obj) {
                setState(".status.volume", getState(volumenID));
            });
            
            on({id: deviceID + '.button_play_pause', change: "gt"}, function (obj) {
                
                if(getState(chromecastID + ".player.paused").val == false)
                {
            
                    getState(chromecastID + ".player.paused", function (err, state) {
                        setState(chromecastID + ".player.pause"/*Küche_Home.player.play*/, state ? !state.val : true);
                    }); 
                }
                else
                {
                    getState(chromecastID + ".player.paused", function (err, state) {
                        setState(chromecastID + ".player.play"/*Küche_Home.player.play*/, state ? state.val : true);
                    }); 
            
                }
                
            });
            
            on({id: deviceID + '.button_skip_foward', change: "gt"}, function (obj) {
                setState(chromecastID + ".player.url2play", (radiosenderListe[(last - 1)]));
                
                last = last + 1;
                if(last>4)
                    last = 0;
            });
            
            
            
            LSchulzeL A 2 Antworten Letzte Antwort
            0
            • LSchulzeL LSchulze

              Problemstellung:

              Im Badezimmer fehlt mir eine einfache Möglichkeit zwischen Radiosendern auf einem Chromecast Gerät wechseln zu können.

              • eine festdefinierte Liste von MP3 Sendern. Es ist wichtig, dass die MP3 ausgelesen wirtd aus den M3U Dateien, die die Sender zur Verfügung stellen.
              • Mögliche Probleme, ein Volumen unter 0% und über 100% ist ungültig.
              • Beim drehen wird das Volumen alle x mm um 5 % erhöht. Ich habe hier noch nicht die perfekte Kombination gefunden, aber es ist wichtig zu wissen, dass egal ist wie schnell man es dreht, es wird beim drehen einfach alle x ms/sek der Wert erhöht.

              Geräte:

              • Irgendein Chromecast Gerät aus dem Chromecast Adapter
              • IKEA E1744 SYMFOISK

              ToDo

              • Ich konnte noch keine Spotfy Playlist abspielen.
              • Das starten vom DLF Stream dauert teilweise lange.
              • 3 Fach Click ist noch nicht belegt.

              Aktionen
              Drehregler zum steuern vom Volumen
              1 Click - Start / Pause
              2 Click - Nächster Radiosender
              3 Click - wird nicht verwendet.

              var deviceID = 'zigbee.0.680ae2fffe37314a';
              var volumenID = "javascript.0.variables.VolumenKüche";
              var chromecastID = 'chromecast.0.Küche_Home';
              var radiosenderListe = ['http://www.wdr.de/wdrlive/media/1live_fiehe.m3u', 'http://st01.dlf.de/dlf/01/128/mp3/stream.mp3', 'http://st03.dlf.de/dlf/03/128/mp3/stream.mp3', 'http://wdr-1live-specials.icecast.wdr.de/wdr/1live/specials/mp3/128/stream.mp3?ar-distributor=ffa1', null];
              
              var last = 1;
              on({id: deviceID + '.rotate_right', change: "any"}, function (obj) {
                  var newState = getState(volumenID).val + 5;
                  if(newState > 100)
                      newState = 100;
                  setState(volumenID, newState);
              });
              on({id: deviceID + '.rotate_left', change: "any"}, function (obj) {
                  var newState = getState(volumenID).val - 5;
                  if(newState < 0)
                      newState = 0;
                  setState(volumenID, newState);
              });
              
              on({id: deviceID + '.rotate_stop', change: "gt"}, function (obj) {
                  setState(".status.volume", getState(volumenID));
              });
              
              on({id: deviceID + '.button_play_pause', change: "gt"}, function (obj) {
                  
                  if(getState(chromecastID + ".player.paused").val == false)
                  {
              
                      getState(chromecastID + ".player.paused", function (err, state) {
                          setState(chromecastID + ".player.pause"/*Küche_Home.player.play*/, state ? !state.val : true);
                      }); 
                  }
                  else
                  {
                      getState(chromecastID + ".player.paused", function (err, state) {
                          setState(chromecastID + ".player.play"/*Küche_Home.player.play*/, state ? state.val : true);
                      }); 
              
                  }
                  
              });
              
              on({id: deviceID + '.button_skip_foward', change: "gt"}, function (obj) {
                  setState(chromecastID + ".player.url2play", (radiosenderListe[(last - 1)]));
                  
                  last = last + 1;
                  if(last>4)
                      last = 0;
              });
              
              
              
              LSchulzeL Offline
              LSchulzeL Offline
              LSchulze
              schrieb am zuletzt editiert von
              #6

              Problemstellung:
              Jedes Zimmer hat eine Bewegungserkennung, doch manchmal will ich im Schlafzimmer das Licht selbst steuern.

              • An/Aus auf einer Taste
              • Lichtwärme
              • Mond Modus
              • Helligkeit regeln.

              Geräte:
              IKEA E1524/E1810 - TRADFRI remote control
              Eine yeelight Lampe, oder jede andere mit diesen Modi

              Mögliche Probleme

              • Wieder nur dann schalten, wenn es auch etwas zum schalten gibt.
              • Wieder nur gt/lt Events auswerten

              Todos:

              • Helligkeiten von 20% und drunter werden eigenlicht nicht benötigt.
              • Ich würde es eher so machen wenn ich durch die Helligkeitsmodi gehe, 50% Mondmodus, dann 100% Mondmodus, dann 20% ohne Mond, 50 % ohne Mond, 80% ohne Mond, 100% ohne Mond.
              • Eine Aktion in diesem Skript sollte den Bewegungsmelder erstmal für längere Zeit deaktivieren?

              Aktionen

              • power -> Schaltet das Licht an/aus
              • up click -> es wird Heller
              • down click -> es wird dunkler
              • right click hold -> Mondmodus wird aktiviert/deaktiviert
              • right click -> Licht wird kälter
              • left click -> Licht wird wärmer
              var lastBri = 100;
              var lastCT  = 1;
              var deviceID = 'zigbee.0.ec1bbdfffeed42cf';
              var lightID = 'yeelight-2.0.Büro_Deckenlampe.control';
              
              
              on({id: deviceID + ".toggle", change: "gt"}, function(obj) { 
                setState(lightID + '.power', !getState(lightID + '.power').val);
              });
               
              on({id: deviceID + ".up_click", change: "gt"}, function(obj) { 
                var bri = getState(lightID + '.active_bright').val
                if (bri < 90) {
                    setState(lightID + '.active_bright', bri+10);
                    lastBri = bri+10;
                    return;
                }
                else setState(lightID + '.active_bright', 100) 
              });
               
              on({id: deviceID + ".down_click", change: "gt"}, function(obj) { 
                var bri = getState(lightID + '.active_bright').val
                if (bri > 10) {
                    setState(lightID + '.active_bright', bri-10);
                    lastBri = bri-10;
                    return;
                }
                else setState(lightID + '.active_bright', 0) 
              });
              
              on({id: deviceID + ".right_button", change: "gt"}, function(obj) { 
                setState(lightID + '.moon_mode', !getState(lightID + '.moon_mode').val);
              });
              
              
              on({id: deviceID + ".right_click", change: "gt"}, function(obj) { 
                setState(lightID + ".ct", ([2700, 3500, 4000, 5500, 6500][(lastCT - 1)]));
                lastCT = lastCT + 1; 
                if(lastCT>5)
                  lastCT = 5;
              });
              
              on({id: deviceID + ".left_click", change: "gt"}, function(obj) { 
                setState(lightID + ".ct", ([2700, 3500, 4000, 5500, 6500][(lastCT - 1)]));
                lastCT = lastCT - 1;
                if(lastCT<1)
                  lastCT = 1;
              });
              
              
              1 Antwort Letzte Antwort
              0
              • LSchulzeL LSchulze

                Die eben angelegten Datenpunkt wird im nächsten Skript eingesetzt um eine Deckenlampe zu steuern.

                Geräte

                • Hier wird eine Yeelight Lampe verwendet.

                Mögliche Probleme

                • Wenn ich auf "any" Change im "On()" Event achte, werden u.U. zuviele Aktionen ausgelöst. - Man muss die Nachrichten auf gt/lt filtern.
                • Die Lampe nur schalten, wenn Sie nicht schon an ist.
                • Es wurde ein IsDaytime Datenpunkt hinzugefügt.

                TODO

                • Wenn ein Lichtschalter betätigt wird, soll die automatische Ausschaltung überschrieben werden.

                [V002]

                var raumBewegungID  = 'javascript.0.variables.BewegungBüro'; 
                var deviceID        = 'yeelight-2.0.Büro_Deckenlampe'; //Gerät, dass geschaltet werden soll
                var onlyNighttime   = true
                var nighttimeID     = 'javascript.0.variables.DraußenEsIstHell'
                
                on(raumBewegungID, function (obj) { // triggert bei Wertänderung
                  var value = obj.state.val;
                  
                  // Schalte das Gerät, sofern die Tageszeit es zulässt und es nicht bereits den Sollzustand hat. 
                  if (((   onlyNighttime && getState(nighttimeID).val == false) // Ist es Nacht?
                        || onlyNighttime == false )                             // Oder ist das egal?
                        && getState(deviceID + ".control.power").val != value) { 
                    setState(deviceID + ".control.power"/*power*/, value);
                  }
                });
                
                paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von
                #7

                @LSchulze sagte:

                Die eben angelegte Variable wird im nächsten Skript eingesetzt um eine Deckenlampe zu steuern.

                Bitte für einen Datenpunkt nicht die Bezeichnung "Variable" verwenden, da es zu Verwechslungen mit Script-Variablen kommen kann.

                Effizienterer Code:

                const raumBewegungID  = 'javascript.0.variables.BewegungBüro'; 
                const deviceID        = 'yeelight-2.0.Büro_Deckenlampe'; //Gerät, dass geschaltet werden soll
                 
                on(raumBewegungID, function (obj) { // triggert bei Wertänderung
                  var value = obj.state.val;
                 
                  // Schalte das Gerät, sofern es nicht den Sollzustand hat.
                  if (getState(deviceID + ".control.power").val != value) {
                    setState(deviceID + ".control.power"/*power*/, value);
                  }
                });
                

                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

                LSchulzeL 1 Antwort Letzte Antwort
                1
                • LSchulzeL Offline
                  LSchulzeL Offline
                  LSchulze
                  schrieb am zuletzt editiert von LSchulze
                  #8

                  Problemstellung:
                  Ist es gerade Hell draußen?

                  • Aktuell wird ein boolean Datenpunkt gefüllt mit aktuellen Astrodaten.
                  • 1x alle 30 Minuten (Falls der Server nicht aktiv war, als die Sonne aufgegangen ist
                  • Ansonsten beim ende vom Sonnenaufgang und beim start des Sonnenuntergangs wird der Datenpunkt per schedule gefüllt.

                  TODO

                  • Auswertung von Aqara Bewegungssensoren für zB das Schlafzimmer. Wenn dort die Gardienen zugezogen sind, soll auch tagsüber das Licht angehen. Man könnte also auch die Helligkeitsangabe in den Bewegungssensoren auslesen.
                  var draußenEsIstHellID = "javascript.0.variables.DraußenEsIstHell"
                  
                  schedule({astro: "sunriseEnd", shift: 0}, function () {
                    setState(draußenEsIstHellID, true, true);
                  });
                  schedule({astro: "sunsetStart", shift: 0}, function () {
                    setState(draußenEsIstHellID, false, true);
                  });
                  schedule("*/30 * * * *", function () {
                    if (compareTime(getAstroDate("sunriseEnd", undefined, 0), null, ">", null) && compareTime(getAstroDate("sunsetStart", undefined, 0), null, "<", null)) {
                      setState(draußenEsIstHellID, true, true);
                    } else {
                      setState(draußenEsIstHellID, false, true);
                    }
                  });
                  
                  
                  
                  
                  paul53P 1 Antwort Letzte Antwort
                  0
                  • paul53P paul53

                    @LSchulze sagte:

                    Die eben angelegte Variable wird im nächsten Skript eingesetzt um eine Deckenlampe zu steuern.

                    Bitte für einen Datenpunkt nicht die Bezeichnung "Variable" verwenden, da es zu Verwechslungen mit Script-Variablen kommen kann.

                    Effizienterer Code:

                    const raumBewegungID  = 'javascript.0.variables.BewegungBüro'; 
                    const deviceID        = 'yeelight-2.0.Büro_Deckenlampe'; //Gerät, dass geschaltet werden soll
                     
                    on(raumBewegungID, function (obj) { // triggert bei Wertänderung
                      var value = obj.state.val;
                     
                      // Schalte das Gerät, sofern es nicht den Sollzustand hat.
                      if (getState(deviceID + ".control.power").val != value) {
                        setState(deviceID + ".control.power"/*power*/, value);
                      }
                    });
                    
                    LSchulzeL Offline
                    LSchulzeL Offline
                    LSchulze
                    schrieb am zuletzt editiert von
                    #9

                    @paul53 said in Meine Skriptesammlung:

                    @LSchulze sagte:

                    Die eben angelegte Variable wird im nächsten Skript eingesetzt um eine Deckenlampe zu steuern.

                    Bitte für einen Datenpunkt nicht die Bezeichnung "Variable" verwenden, da es zu Verwechslungen mit Script-Variablen kommen kann.

                    Effizienterer Code:

                    const raumBewegungID  = 'javascript.0.variables.BewegungBüro'; 
                    const deviceID        = 'yeelight-2.0.Büro_Deckenlampe'; //Gerät, dass geschaltet werden soll
                     
                    on(raumBewegungID, function (obj) { // triggert bei Wertänderung
                      var value = obj.state.val;
                     
                      // Schalte das Gerät, sofern es nicht den Sollzustand hat.
                      if (getState(deviceID + ".control.power").val != value) {
                        setState(deviceID + ".control.power"/*power*/, value);
                      }
                    });
                    

                    Ich habe deinen Vorschlag in der V002 eingesetzt.

                    1 Antwort Letzte Antwort
                    0
                    • LSchulzeL LSchulze

                      Problemstellung:
                      Ist es gerade Hell draußen?

                      • Aktuell wird ein boolean Datenpunkt gefüllt mit aktuellen Astrodaten.
                      • 1x alle 30 Minuten (Falls der Server nicht aktiv war, als die Sonne aufgegangen ist
                      • Ansonsten beim ende vom Sonnenaufgang und beim start des Sonnenuntergangs wird der Datenpunkt per schedule gefüllt.

                      TODO

                      • Auswertung von Aqara Bewegungssensoren für zB das Schlafzimmer. Wenn dort die Gardienen zugezogen sind, soll auch tagsüber das Licht angehen. Man könnte also auch die Helligkeitsangabe in den Bewegungssensoren auslesen.
                      var draußenEsIstHellID = "javascript.0.variables.DraußenEsIstHell"
                      
                      schedule({astro: "sunriseEnd", shift: 0}, function () {
                        setState(draußenEsIstHellID, true, true);
                      });
                      schedule({astro: "sunsetStart", shift: 0}, function () {
                        setState(draußenEsIstHellID, false, true);
                      });
                      schedule("*/30 * * * *", function () {
                        if (compareTime(getAstroDate("sunriseEnd", undefined, 0), null, ">", null) && compareTime(getAstroDate("sunsetStart", undefined, 0), null, "<", null)) {
                          setState(draußenEsIstHellID, true, true);
                        } else {
                          setState(draußenEsIstHellID, false, true);
                        }
                      });
                      
                      
                      
                      
                      paul53P Offline
                      paul53P Offline
                      paul53
                      schrieb am zuletzt editiert von paul53
                      #10

                      @LSchulze sagte:

                      Ist es gerade Hell draußen?

                      Genügt dafür nicht die Funktion isAstroDay des Javascript-Adapters ?

                      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

                      1 Antwort Letzte Antwort
                      0
                      • LSchulzeL Offline
                        LSchulzeL Offline
                        LSchulze
                        schrieb am zuletzt editiert von LSchulze
                        #11

                        Problemstellung:
                        Sind alle Fenster in einem Raum geschlossen?

                        • Manche Räume haben bei mir 10 einzelne Fenster, eine gigantische IF Abfrage wäre da natürlich mist.
                        • Es wird auf das Event eines Sensors gewartet, dann wird der ganze Raum geprüft.
                        • Wenn alle Fenstersensoren also melden, dass sie geschlossen sind wird die Variable auf false gesetzt, ansosnten true.

                        Geräte

                        • Aqara Fenstersensor MCCGQ11LM oder MCCGQ01LM

                        Von paul53 übernommen

                        const roomID   = 'javascript.0.variables.Schließsensoren.BadezimmerOffen';
                        const ids = ['zigbee.0.00158d00040be1df.opened', 'zigbee.0.00158d00024904cc.opened'];
                         
                        on(ids, function() { // triggert bei Wertänderung
                            let istEinFensterOffen = false; 
                            for (let i in ids) {
                                if (getState(ids[i]).val) istEinFensterOffen = true; // Uns interessieren nur true Werte. 
                            }
                         
                            // Nachdem alle abgefragt wurden, setze den Wert.
                            setState(roomID, istEinFensterOffen, true);
                        });
                        
                        
                        
                        
                        
                        paul53P 1 Antwort Letzte Antwort
                        0
                        • LSchulzeL LSchulze

                          Problemstellung:
                          Sind alle Fenster in einem Raum geschlossen?

                          • Manche Räume haben bei mir 10 einzelne Fenster, eine gigantische IF Abfrage wäre da natürlich mist.
                          • Es wird auf das Event eines Sensors gewartet, dann wird der ganze Raum geprüft.
                          • Wenn alle Fenstersensoren also melden, dass sie geschlossen sind wird die Variable auf false gesetzt, ansosnten true.

                          Geräte

                          • Aqara Fenstersensor MCCGQ11LM oder MCCGQ01LM

                          Von paul53 übernommen

                          const roomID   = 'javascript.0.variables.Schließsensoren.BadezimmerOffen';
                          const ids = ['zigbee.0.00158d00040be1df.opened', 'zigbee.0.00158d00024904cc.opened'];
                           
                          on(ids, function() { // triggert bei Wertänderung
                              let istEinFensterOffen = false; 
                              for (let i in ids) {
                                  if (getState(ids[i]).val) istEinFensterOffen = true; // Uns interessieren nur true Werte. 
                              }
                           
                              // Nachdem alle abgefragt wurden, setze den Wert.
                              setState(roomID, istEinFensterOffen, true);
                          });
                          
                          
                          
                          
                          
                          paul53P Offline
                          paul53P Offline
                          paul53
                          schrieb am zuletzt editiert von paul53
                          #12

                          @LSchulze sagte:

                          on(getState(j_list[0]).val, function (obj) { // triggert bei Wertänderung

                          Das funktioniert nicht, denn man kann nicht auf Werte von Datenpunkten triggern. Richtig:

                          on(j_list, function (obj) { // triggert bei Wertänderung eines der Datenpunkte
                          

                          So benötigt man auch nur einen Trigger, da man ein "Array of IDs" übergeben kann.

                          EDIT: Vorschlag:

                          const roomID   = 'javascript.0.variables.Schließsensoren.BadezimmerOffen';
                          const ids = ['zigbee.0.00158d00040be1df.opened', 'zigbee.0.00158d00024904cc.opened'];
                           
                          on(ids, function() { // triggert bei Wertänderung
                              let istEinFensterOffen = false; 
                              for (let i in ids) {
                                  if (getState(ids[i]).val) istEinFensterOffen = true; // Uns interessieren nur true Werte. 
                              }
                           
                              // Nachdem alle abgefragt wurden, setze den Wert.
                              setState(roomID, istEinFensterOffen, true);
                          });
                          

                          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

                          LSchulzeL 1 Antwort Letzte Antwort
                          0
                          • paul53P paul53

                            @LSchulze sagte:

                            on(getState(j_list[0]).val, function (obj) { // triggert bei Wertänderung

                            Das funktioniert nicht, denn man kann nicht auf Werte von Datenpunkten triggern. Richtig:

                            on(j_list, function (obj) { // triggert bei Wertänderung eines der Datenpunkte
                            

                            So benötigt man auch nur einen Trigger, da man ein "Array of IDs" übergeben kann.

                            EDIT: Vorschlag:

                            const roomID   = 'javascript.0.variables.Schließsensoren.BadezimmerOffen';
                            const ids = ['zigbee.0.00158d00040be1df.opened', 'zigbee.0.00158d00024904cc.opened'];
                             
                            on(ids, function() { // triggert bei Wertänderung
                                let istEinFensterOffen = false; 
                                for (let i in ids) {
                                    if (getState(ids[i]).val) istEinFensterOffen = true; // Uns interessieren nur true Werte. 
                                }
                             
                                // Nachdem alle abgefragt wurden, setze den Wert.
                                setState(roomID, istEinFensterOffen, true);
                            });
                            
                            LSchulzeL Offline
                            LSchulzeL Offline
                            LSchulze
                            schrieb am zuletzt editiert von
                            #13

                            @paul53 ah!

                            darüber bin ich auch gestolpert.

                            1 Antwort Letzte Antwort
                            0
                            • LSchulzeL LSchulze

                              Problemstellung:

                              Im Badezimmer fehlt mir eine einfache Möglichkeit zwischen Radiosendern auf einem Chromecast Gerät wechseln zu können.

                              • eine festdefinierte Liste von MP3 Sendern. Es ist wichtig, dass die MP3 ausgelesen wirtd aus den M3U Dateien, die die Sender zur Verfügung stellen.
                              • Mögliche Probleme, ein Volumen unter 0% und über 100% ist ungültig.
                              • Beim drehen wird das Volumen alle x mm um 5 % erhöht. Ich habe hier noch nicht die perfekte Kombination gefunden, aber es ist wichtig zu wissen, dass egal ist wie schnell man es dreht, es wird beim drehen einfach alle x ms/sek der Wert erhöht.

                              Geräte:

                              • Irgendein Chromecast Gerät aus dem Chromecast Adapter
                              • IKEA E1744 SYMFOISK

                              ToDo

                              • Ich konnte noch keine Spotfy Playlist abspielen.
                              • Das starten vom DLF Stream dauert teilweise lange.
                              • 3 Fach Click ist noch nicht belegt.

                              Aktionen
                              Drehregler zum steuern vom Volumen
                              1 Click - Start / Pause
                              2 Click - Nächster Radiosender
                              3 Click - wird nicht verwendet.

                              var deviceID = 'zigbee.0.680ae2fffe37314a';
                              var volumenID = "javascript.0.variables.VolumenKüche";
                              var chromecastID = 'chromecast.0.Küche_Home';
                              var radiosenderListe = ['http://www.wdr.de/wdrlive/media/1live_fiehe.m3u', 'http://st01.dlf.de/dlf/01/128/mp3/stream.mp3', 'http://st03.dlf.de/dlf/03/128/mp3/stream.mp3', 'http://wdr-1live-specials.icecast.wdr.de/wdr/1live/specials/mp3/128/stream.mp3?ar-distributor=ffa1', null];
                              
                              var last = 1;
                              on({id: deviceID + '.rotate_right', change: "any"}, function (obj) {
                                  var newState = getState(volumenID).val + 5;
                                  if(newState > 100)
                                      newState = 100;
                                  setState(volumenID, newState);
                              });
                              on({id: deviceID + '.rotate_left', change: "any"}, function (obj) {
                                  var newState = getState(volumenID).val - 5;
                                  if(newState < 0)
                                      newState = 0;
                                  setState(volumenID, newState);
                              });
                              
                              on({id: deviceID + '.rotate_stop', change: "gt"}, function (obj) {
                                  setState(".status.volume", getState(volumenID));
                              });
                              
                              on({id: deviceID + '.button_play_pause', change: "gt"}, function (obj) {
                                  
                                  if(getState(chromecastID + ".player.paused").val == false)
                                  {
                              
                                      getState(chromecastID + ".player.paused", function (err, state) {
                                          setState(chromecastID + ".player.pause"/*Küche_Home.player.play*/, state ? !state.val : true);
                                      }); 
                                  }
                                  else
                                  {
                                      getState(chromecastID + ".player.paused", function (err, state) {
                                          setState(chromecastID + ".player.play"/*Küche_Home.player.play*/, state ? state.val : true);
                                      }); 
                              
                                  }
                                  
                              });
                              
                              on({id: deviceID + '.button_skip_foward', change: "gt"}, function (obj) {
                                  setState(chromecastID + ".player.url2play", (radiosenderListe[(last - 1)]));
                                  
                                  last = last + 1;
                                  if(last>4)
                                      last = 0;
                              });
                              
                              
                              
                              A Offline
                              A Offline
                              aking
                              schrieb am zuletzt editiert von
                              #14

                              @lschulze said in Meine Skriptesammlung:

                              IKEA E1744 SYMFOISK

                              Hallo,
                              Dein Skript bildet eigentlich genau das ab, was ich möchte. Habe mir also die Symfonisk Remote geholt und eingebunden. Insgesamt entspricht meine Konfiguration auch Deiner, also Homematic, Shelly, Zigbee, Chromecast.
                              Habe nun Dein Skript genommen und die Objekte entsprechend angepasst. Das Skript wird gestartet und laut Log gibt es auch keinen Fehler:
                              javascript.0 2021-01-23 17:55:48.399 info (29768) script.js.Media.Chromecast_: registered 5 subscriptions and 0 schedules

                              Allerdings passiert überhaupt nichts, wenn ich etwas an der Remote mache. Habe ich etwas vergessen? Ich bin mit Skripten nicht betraut, nur mit ein wenig Blockly. Wenn Du mir weiterhelfen könntest, wäre das klasse!

                              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

                              491

                              Online

                              32.4k

                              Benutzer

                              81.5k

                              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