Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. ruhr70

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    • Profile
    • Following 0
    • Followers 1
    • Topics 169
    • Posts 2270
    • Best 7
    • Groups 1

    ruhr70

    @ruhr70

    8
    Reputation
    410
    Profile views
    2270
    Posts
    1
    Followers
    0
    Following
    Joined Last Online
    Website herwig.de

    ruhr70 Follow
    Pro

    Best posts made by ruhr70

    • [Vorlage] Multi Ereignislisten Skript

      .

      Skript Vorlage: Multi Ereignislisten - Letzte Änderung: 27.05.2018

      Es können nun mehrere Ereignislisten mit einem Skript verwaltet werden.

      Z.B. eine Liste mit html Formatierungen für VIS, Listen für Telegram, usw.

      Zusätzlich wird für jeden Wochentag eine aktuelle Liste angelegt, sowie eine Liste "heute" nur mit den Einträgen des heutigen Tags.

      Einträge können im Datenpunkt event der jeweiligen Liste vorgenommen werden oder mit dem globalen Skript event(text,list,color)

      Vorgeleistete und Eigene Listen

      Die Listen "default", "Montag" bis "Sonntag" und "heute" können um beliebig weitere Listen ergänzt werden.

      Sie dazu die Kommentare im Skript.

      Die Listen können individuell konfiguriert werden:

      • neuster Eintrag oben oder unten

      • je Liste: Datumsformat vor dem EIntrag

      • soll die Liste auch mit dem aktuellen Wochentag und der Liste "heute" repliziert werden

      • Tagesstempel ja/nein zum Tageswechsel

      Version:

      • 0.2.3 Fix: Tageslisten wurden nicht mehr gelöscht
      Fix: Tageststart-String wurde beim Tageswechsel mehrwach in den Wochentag geschrieben
      
      • 0.2.2 Schnell aufeinanderfolgende Events in einer Liste wurden nicht erfasst. Umstellung von Datenpunkt auf Variable

        Colorlog entfernt, da im aktuellem Admin 3 nicht mehr unterstützt

      • 0.2.1 Anzeige Tagestart "neuer Tag" korrigiert

      • 0.2.0 Anpassung: durch Apollon77 (danke!):

        • Subscriptions werden nun nach dem Callback und nicht nach dem TImer aufgerufen

        Anzeige "neuer Tag" korrigiert

      • 0.1.1 Korrektur String bei Tageswechsel

      • 0.1.0 Veröffentlichung im Forum

      Skript Multi Ereignislisten

      // Erstellt Ereignislisten 
      //========================
      //
      // Version:             0.2.3 (27.05.2018)
      // Autor:               ruhr70
      // Skript im Forum:     https://forum.iobroker.net/viewtopic.php?f=21&t=13209#p139023
      // Skript auf Github:   n.v.
      //
      // Events können über die globale Funktion event(text,list); geschrieben werden
      // Events werden mit der globalen Funktion
      // event(text,liste) als Text  in die ID:  pfad+liste+".event"  geschrieben
      // ohne Angabe wird die Liste "default" verwendet
      // je Liste werden folgende Datenpunkte erstellt:
      // .eventlistStr        -> Liste als String, z.B. für Telegram
      // .eventlistHTML       -> Liste mit html Tags, wenn übergeben und als Zeilenumbruch, z.B. für VIS
      // .eventlistArr        -> die Liste als Array (ein String je Eintrag) für das Skript. Kann auch anderweitig verwendet werden.
      // .event               -> wird durch die globale Funktion event() beschrieben. Oder auf anderem Wege. der Inhalt wird in die entsprechende Liste als Eintrag übernommen.
      // Erstellung eines Eintrags in einer Liste:
      // 1.) die Datenpunkte mit der Endung .event können direkt beschrieben werden
      // 2.) mit der globalen Funktion event(text,liste)
      // globale Funktion event(text,liste)  (extra Skript, unter globale Skripte zu speichern)
      // --------------------------------------------------------------------------------------
      // text: der Eintrag, der mit dem aktuellen Zeitstempel in die Liste geschrieben werden soll
      // liste: (optional, wenn nicht angegeben, wird die Liste "default" verwendet)
      // event("**Tür** geöffnet");
      // erstellt in der Liste "default" in der html Liste einen Eintrag, mit fettgeschriebener "Tür"
      // erstellt in der Liste "default" in der str Liste einen Eintrag "Tür geöffnet" ohne Formatierung
      // Ereignislisten
      // --------------
      // "default" -> Liste muss vorhanden sein, wird verwendet, wenn in der globalen Funktion nicht angegeben
      // Listen "Montag" bis "Sonntag": Tageslisten. Für jeden Tag wird eine neue Lsite begonnen
      // "heute" - Einträge vom heutigen Tage werden, wenn geünscht, zusätzlich in die Liste "heute" geschrieben
      //  plus eigene Listen
      // Changelog:
      // ----------
      // 0.2.3 Fix: Tageslisten wurden nicht mehr gelöscht
      //       Fix: Tageststart-String wurde beim Tageswechsel mehrwach in den Wochentag geschrieben
      // 0.2.2 Colorlog entfernt, da im aktuellem Admin 3 nicht mehr unterstützt
      //       Schnell aufeinanderfolgende Events in einer Liste wurden nicht erfasst. Umstellung von Datenpunkt auf Variable
      // 0.2.1 Anzeige Tagestart "neuer Tag" korrigiert
      // 0.2.0 Anpassungen durch Apollon77 (danke!): 
      //       - Subscriptions werden nun nach dem Callback und nicht nach dem TImer aufgerufen
      // 0.1.1 String Tageswechsel korrigiert, Link zum Forum
      // 0.1.0 Veröffentlichung im Formu
      // ========================================================================================
      // Individuelle Konfiguration
      // ========================================================================================
      var defaultListe        = "default";            // Liste, die verwendet wird, wenn im event() nicht angegeben.
      var pfad                = "Ereignisliste"+".";  // Pfad, in dem die Listen angelegt werden sollen
      // Defaultwerte, wenn bei Listen im JSON nicht definiert
      var defaultLaenge       = 50;                   // default: maximale Anzahl von Ereignissen, wenn im JSON nicht angegeben
      var defaultNeusteOben   = true;                 // default: neuste Nachrichten oben true
      var defaultTagesstart   = true;                 // default: soll ein Tagesstempel in der Liste zum Start des Tages eingefügt werden
      var defaultInWochenTag  = true;                 // default: Listeneintrag auch bei der Tagesliste ("heute") und dem heutigen Wochentag
      var defaultZeitstempel  = 'DD.MM. hh:mm';       // Default Zeitstempel (Formate, wie bei der ioBroker Javascript FUnktion formatDate())
      var trennerZeitstempel  = " ";                  // Trenner zwischen Zeitstempel und Text
      function tagesstartTxt() {
          return "##### " + wochentagStr() + ", den " + formatDate(new Date(), "DD.MM.JJJJ") + " #####";
      }
      // Log Einstellungen für das Skript
      var logOn               = true;                 // Logging für das Skript einschalten
      // Definition der Ereignislisten:
      // ==============================
      // laenge:         max. Anzahl der Einträge. Danach wird der älteste Eintrag ersetzt.                    
      // neusteOben:     true ->  neuster Eintrag erfolgt oben, false -> neuster EIntrag erfolgt unten
      // tagesstart:     zum Tagesstart wird ein Eintrag mit Wochentag und Datum erzeugt
      // inWochentag     true -> Einträge für diese Liste werden in die Liste des jeweiligen Wochentags und in die Liste "heute" geschrieben
      // zeitstempel      default, wenn nicht angegeben, Ansonsten String, wie bei der Funktion formateDate()
       var listenJson  = {
                          "default": {
                              "laenge":50,
                              "neusteOben":true,
                              "tagesstart":true,
                              "inWochtag":true
                          },
                          "Montag": {
                              "laenge":50,
                              "neusteOben":false,
                              "tagesstart":true
                          },
                          "Dienstag": {
                              "laenge":50,
                              "neusteOben":true,
                              "tagesstart":true
                          },
                          "Mittwoch": {
                              "laenge":50,
                              "neusteOben":true,
                              "tagesstart":true
                          },
                          "Donnerstag": {
                              "laenge":50,
                              "neusteOben":true,
                              "tagesstart":true
                          },
                          "Freitag": {
                              "laenge":50,
                              "neusteOben":true,
                              "tagesstart":true
                          },
                          "Samstag": {
                              "laenge":50,
                              "neusteOben":true,
                              "tagesstart":true
                          },
                          "Sonntag": {
                              "laenge":50,
                              "neusteOben":true,
                              "tagesstart":true
                          },
                          "heute": {
                              "laenge":50,
                              "neusteOben":true,
                              "tagesstart":true
                          },
                          "test": {
                              "laenge":10,
                              "neusteOben":false,
                              "tagesstart":false,
                              "inWochtag":false,
                              "zeitstempel":"YYYY-MM-DD hh:mm"
                          },
                          "wichtig": {
                              "laenge":50,
                              "neusteOben":true,
                              "tagesstart":true,
                              "inWochtag":false
                          }
      }
      // ========================================================================================
      // Ab hier muss nichts angepasst werden
      // ========================================================================================
      // Korrektur für 0.2.1
      var arrayTage = new Array ("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
      var subsError = false;
      var triggerArr  = [];
      var jsonArr = {};
      // Korrektur für 0.2.1
      Array.prototype.enthaelt = function(a) {  
          for (var i=0; i<this.length; i++)/if/(a="==" this[i])/return/true/false/}/function/makejsonarr()/{/for/(var/liste/in/listenjson)/jsonarr[liste]="readListEvent(pfad+liste+&quot;.eventlistArr&quot;);" datenpunkte/für/die/eventlisten/anlegen/dpanlegen(callback)/var/stateliste="[];" zeitstempel="listenJson[liste].zeitstempel;" (typeof/"undefined")/hier/wird/als/array/angelegt/stateliste.push({id:/pfad+liste+".eventlistarr",/val:formatdate(new/date(),/zeitstempel)/+/trennerzeitstempel/'datenpunkt/angelegt',/write:/false});/string/mit/\n/pfad+liste+".eventliststr",/val:"",/html-string/<br="">\n für VIS
              stateListe.push({id: pfad+liste+".eventlistHTML", val:"", write: false});
              /*Aktueller Event*/ // überwachter Datenpunkt
              stateListe.push({id: pfad+liste+".event", val:"", write: false});
              // Array für die Subscritions der Events je Liste
              triggerArr.push("javascript."+instance+"."+pfad+liste+".event");
          }
           function anlegen() {
              if (!stateListe.length) {
                  if(logOn) log("dpAnlegen() durchgelaufen");
                  callback();
                  return;
              }
              var aktuellerState = stateListe.shift();
              createState(aktuellerState.id, aktuellerState.val, {type: 'string', role: 'value', read: true, write: aktuellerState.write}, anlegen);
          }
          anlegen();
      }
      function wochentagStr() {
          var datumAktuell = new Date();
          var wochenTagAktuell = datumAktuell.getDay();
          var tagName = arrayTage[wochenTagAktuell];
          return tagName;
      }
      function htmlToStr(html) {
          var str = "";
          str = html.replace(/( )/ig, " ");          //   in Leerzeichen umwandeln
          // Verbesserung möglich: hier über eine Tabelle (z.B. json) html Sonderzeichenumwandeln
          str = html.replace(/(&.*;|<([^>]+)>)/ig, "");  // alle übrigen html Sonderzeichen & html Tags rausfiltern
          return str;
      }
      function readListEvent(id) {                     // lese ein JSON aus einem string Datenpunkt
          var list;
          try {
              list = JSON.parse(getState(id).val);
          } catch (ex) {
              list = [];
          }
          if(!list) list = [];
          return list;
      }
      function writeListEvent(list,id) {              // schreibt ein JSON in einen Datenpunkt als String
          setState(id, JSON.stringify(list));
      }
      function getEventsListStr(events) {
          var text = '';
          for (var i = 0; i < events.length; i++) {
              text += (text ? '\n' : '') + htmlToStr(events[i]);
          }
          return text;
      }
      function getEventsListHtml(events) {
          var text = '';
          for (var i = 0; i < events.length; i++) {
              text += (text ? '\n' : '') + events[i];
          }
          return text;
      }
      // Ereignis in der entsprechenden Liste schreiben
      function writeEvent(text,eventlist) {
          // var listeArr = readListEvent(pfad+eventlist+".eventlistArr");               // liest die Liste aus einem Datenpunkt
          var neusteOben = listenJson[eventlist].neusteOben;
          if (typeof neusteOben == "undefined") neusteOben = defaultNeusteOben;
          var laenge = listenJson[eventlist].laenge;
          if (typeof laenge == "undefined") laenge = defaultLaenge;
          var zeitstempel = listenJson[eventlist].zeitstempel;
          if (typeof zeitstempel == "undefined") zeitstempel = defaultZeitstempel;
          if(neusteOben) {                                                                            // Liste oben ergänzen (neusteOben = true)
              jsonArr[eventlist].unshift(formatDate(new Date(), zeitstempel)+ trennerZeitstempel + text);       // fügt den Text als Event am Anfag der Liste ein
              if(logOn) log("Liste: " + eventlist + " - Wert geschrieben: " + text);
              if (jsonArr[eventlist].length > laenge) jsonArr[eventlist].pop();                                           // kürzt die Liste hinten, wenn die maximale Länge erreicht ist
          } else {                                                                                    // oder Liste unten ergänzen  (neusteOben = false)
              jsonArr[eventlist].push(formatDate(new Date(), zeitstempel)+ trennerZeitstempel + text);          // fügt den Text als Event am Ende der Liste ein
              if(logOn) log("Liste: " + eventlist + " - Wert geschrieben: " + text);
              if (jsonArr[eventlist].length > laenge) jsonArr[eventlist].shift();                                         // kürzt die Liste oben, wenn die maximale Länge erreicht ist
          }
          writeListEvent(jsonArr[eventlist], pfad+eventlist+".eventlistArr");             // schreibt das Array der Liste in den Datenpunkt zurück
          setState(pfad+eventlist+".eventlistStr",getEventsListStr(jsonArr[eventlist]));  // erzeugt aus dem Array den String mit \n für neue Zeilen
          setState(pfad+eventlist+".eventlistHTML",getEventsListHtml(jsonArr[eventlist]));// erzeugt aus dem Array den String mit 
      \n für neue Zeilen, html Tags bleiben erhalten
      }
      // Subscriptions für die Events je Liste
      // -----------------------------------------------------------------------------
      function setSubscriptions() {
          on({id:triggerArr,change:'any'}, function (obj) {  // wenn ein neuer Event geschrieben wird
              var eventlist = obj.name.replace(pfad,"").replace(".event","");
              var inWochentag = listenJson[eventlist].inWochtag;
              if (typeof inWochentag == "undefined") inWochentag = defaultInWochenTag;
              if (!obj.newState.ack && obj.newState.val) {
                  if(logOn) log("Event für die Liste '" + eventlist + "' erkannt: " + obj.state.val);
                  writeEvent(obj.state.val,eventlist);
                  if(obj.state.val == tagesstartTxt()) return; // 0.2.3 Fix: Tagesstart: nicht noch einmal in eine andere Liste schreiben
                  if(wochentagStr() != eventlist) {                               // zusätzlich in die Wochentagsliste schreiben, außer es war ein Eintrag für den Wochentag
                      if(inWochentag) writeEvent(obj.state.val,wochentagStr());   // nicht schreiben, wenn die Liste von der Wochentagliste ausgenommen ist
                  }
                  if(wochentagStr() != "heute") {                                 // zusätzlich in die Tagesliste schreiben, außer es war ein Eintrag für die Liste "heute"
                  if(inWochentag) writeEvent(obj.state.val,"heute");              // nicht schreiben, wenn die Liste von der Wochentagliste ausgenommen ist
                  }
              }
          });
          if(logOn) log("Skript: " + name + " -> Subscriptions angelegt");    
      }
      // CRON für Tagesüberschrift und Bereinigung von "heute" und dem aktuellen "Wochentag"
      function tagesstart() {
          if(logOn) log("Skript: " + name + " -> Tagesstart wird ausgeführt");
          for (var liste in listenJson) {
              if (logOn) log("Tagesstart: Liste + " + liste + " wird verarbeitet");
              var tagesstartVar = listenJson[liste].tagesstart;
              if (typeof tagesstartVar == "undefined") tagesstartVar = defaultTagesstart;
              var zeitstempel = listenJson[liste].zeitstempel;
              if (typeof zeitstempel == "undefined") zeitstempel = defaultZeitstempel;
              if(liste == "heute" || liste == wochentagStr()) {
                  jsonArr[liste] = []; // 0.2.3 Fix
                  setState(pfad+liste+".eventlistArr","[]");
                  setState(pfad+liste+".eventlistStr","");
                  setState(pfad+liste+".eventlistHTML","");
                  if (logOn) log("Tagesstart: Liste + " + liste + " wird gelöscht");
                  if(tagesstartVar) {
                      setState(pfad+liste+".event",tagesstartTxt());
                      if (logOn) log("Tagesstart: Liste + " + liste + " wird gesetzt:" + tagesstartTxt());
                  }
              } else {
                  if(tagesstartVar && !(liste == "heute" || arrayTage.enthaelt(liste))) { // Korrektur für 0.2.1
                      setState(pfad+liste+".event",tagesstartTxt());
                      if (logOn) log("Tagesstart: Liste + " + liste + " wird gesetzt:" + tagesstartTxt());
                  }
              }
          }
      }
       schedule("0 0 * * *", tagesstart);
      // Wird ausgeführt, wenn das Skript gestoppt wird:
      // -----------------------------------------------
      onStop(function skriptStop () {
          if(logOn) log("----------- Skript: " + name + " -> wurde beendet -----------");
          // Funktionen, die noch ausgeführt werden sollen, wenn das Skript beendet wurde:
      }, 100 /*ms*/);
      // --------------- Script start ----------------                                
      function main() {
          // Funktionen, die nach dem Anlagen der Datenpunkte ausgeführt werden sollen:
          // ...
          makeJsonArr();
          if(logOn) log("Skript: " + name + " ist bereit");    
      
      }
      // Skript start
      if(logOn) log("----------- Skript: " + name + " -> gestartet -----------");
      dpAnlegen(function() {
          setSubscriptions();
          main();
      });</this.length;
      

      Das globale Skript event(text,liste,color):

      *Parameter list ist optional. Ohne Angabe wird die Liste "default" verwendet. Ab Version 0.3.0 kann auch ein Array an Listen angegeben werden, z.B. ["test","wichtig"], wenn direkt in zwei Listen geschrieben werden soll.

      • Parameter color ist optional. Ohne Angabe werden keine html Tags für die Farbe zum Eintrag hinzugefügt.

      14.05.2018: Version 0.3.0:für den Parameter list wird nun auch ein Array mit Strings akzeptiert.

      // globale Funktion: event(text,list,color);
      // -----------------------------------------
      //
      // Autor:   ruhr70
      // Version: 0.3.0
      //
      // https://forum.iobroker.net/viewtopic.php?f=21&t=13209#p139023
      // 
      // Schreibt einen Text in einen Datenpunkt, um von einen Ereignislisten-Skript verarbeitet zu werden.
      // list ist optional. Wenn keine Liste angegeben wurde, wird die default-Liste verwendet.
      // 
      // schreibt Ereignise für das Skript: "multi Ereignislisten.js", siehe Forum-LInk oben
      //
      // Parameter:
      // 
      // text:string              Text als String (html ergänzungen möglich), der in die Ereignisliste geschrieben werden soll
      // list:string/stringArray  optional: Listenname(n) als String (ohne Angabe wird die eingestellte Defaultliste verwendet)
      // color:string             optional: gültige html-Farbe als String (ohne ANgabe wird keine Farbe verwendet)
      // 
      // Changelog:
      //
      // 0.3.0    als "list" ist auch ein Array möglich mit den Listen für das Ereignis // Doku angepasst
      // 0.2.2    keine Angabe einer Farbe: Skriptkorrektur
      // 0.2.1    optionaler Parameter color (String mit einer html Farbe, färbt die ganze Zeile farbig ein )
      // 0.2.0    Unterstützung von mehreren Ereignislisten
      //
      // individuelle Anpassungen (im Bereich <- individuelle Einstellungen ->):
      //
      // defaultPfad              entsprechend der eigenen Einstellungen anpassen
      // defaultList              gewünschte default Liste, wenn kein Listenname angegeben wird
      //
      //
      // Beispiele zur Anwendung in den eigenen Skripten:
      //
      // event("Tür geöffnet");  // erstellt einen Eintrag "Tür geöffnet" in der default-Liste
      // event("neue externe IP-Adresse","wichtig"); // erstellt einen Eintrag "neue externe IP-Adresse" in der Liste "wichtig"
      // event("Alarm ausgelöst"),["wichtig","default"],"rot"); // erstellt einen Eintrag "Alarm ausgelöst" in den Listen wichtig und default in der html-Farbe rot.
       // Hilfsfunktion
      function eventSetEvent(text,list,color,logonEvent,defaultPfad) {
          var test = list.replace(/[a-zA-Z0-9_\-äÄöÖüÜß]/g,"");
          if (test.length !== 0) {
              log("global event(). Angegebene Liste ("+list+")enthält ungültige Zeichen ("+test+"). Funktion nicht ausgeführt.","warn");
              return;
          }
          if(logonEvent) log("global event() event: " + text);
          if(logonEvent) log("global event() in Liste: " + list);
          if(typeof color != 'undefined') {
              text = '' + text + "";
              if(logonEvent) log("global event() Zeile farbig: " + color);
          }
          if(list.length >0) {
              list = list +".";
          } else {
              log("global event(). Angegebene Liste ist ungültig. Funktion nicht ausgeführt.","warn");
              return;
          }
      
          setState(defaultPfad+list+"event",text);
      }
       function event(text,list,color) {
           // <- START individuelle Einstellungen:
          var logonEvent = false;  // Logs ausgeben: true = ja, false = keine Logs
          var defaultPfad         = "javascript.0.Ereignisliste"+".";
          var defaultList         = "default"; 
          // individuelle Einstellungen ENDE ->
          if(typeof list == 'undefined') { // prüft ob eine Liste mit übergeben wurde
              if(logonEvent) log("global event(). Es wurde keine Liste angegeben. Es wird die Defaultliste verwendet");
              list = defaultList;
          }
          if (list instanceof Array) {
              if(logonEvent) log("global event() Array mit Listen empfangen: " + list);
              for (var i = 0; i < list.length; i++) {
                  eventSetEvent(text,list[i],color,logonEvent,defaultPfad);
              }
          } else {
              eventSetEvent(text,list,color,logonEvent,defaultPfad);
          }
      }
      
      posted in Skripten / Logik
      ruhr70
      ruhr70
    • RE: Grafana und Prometheus in iobroker ein-bzw.anbinden

      Mir fehlt die Bedanken Funktion 😉

      Schönes Howto!

      posted in Praktische Anwendungen (Showcase)
      ruhr70
      ruhr70
    • Beispiel: aktuelles Datum formatieren und ausgeben

      Anbei ein Beispiel für eine node-red function, die das aktuelle Datum in ein beliebiges Format umwandelt.

      327_2015-05-01_tst_umwandeln.jpg

      Code in der Funktion:

      ! ````
      // (1) wandelt timestamo ins ISO Datumformat um
      //msg.timestamp= new Date().toISOString()
      ! // (2) beliebiges Datum festlegbar: hier: YYYY-MM-DD HH:MM.SS
      // (Ausgabeformat wird danz am Ende zusammengestellt)
      var now = new Date();
      var year = now.getFullYear();
      var month = now.getMonth()+1;
      var day = now.getDate();
      var hour = now.getHours();
      var minute = now.getMinutes();
      var second = now.getSeconds();
      if(month.toString().length == 1) {
      var month = '0'+month;
      }
      if(day.toString().length == 1) {
      var day = '0'+day;
      }
      if(hour.toString().length == 1) {
      var hour = '0'+hour;
      }
      if(minute.toString().length == 1) {
      var minute = '0'+minute;
      }
      if(second.toString().length == 1) {
      var second = '0'+second;
      }
      ! // Variante1: wenn z.B. nicht ein vorhandener Payload
      // überschrieben werden soll, sondern um ein
      // Datum ergänzt werden soll.
      ! //msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;
      ! // Variante 2: Function gibt die aktuelle Zeit als payload aus
      msg.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;
      ! return msg;

      
      Node-red Flow:
      
      >! ````
      [{"id":"63c5d5c5.9c3a2c","type":"function","name":"now aktuelles Datum","func":"// (1) wandelt timestamo ins ISO Datumformat um\n//msg.timestamp= new Date().toISOString()\n\n\n// (2) beliebiges Datum festlegbar: hier: YYYY-MM-DD HH:MM.SS\n//     (Ausgabeformat wird danz am Ende zusammengestellt)\nvar now     = new Date(); \nvar year    = now.getFullYear();\nvar month   = now.getMonth()+1; \nvar day     = now.getDate();\nvar hour    = now.getHours();\nvar minute  = now.getMinutes();\nvar second  = now.getSeconds(); \nif(month.toString().length == 1) {\nvar month = '0'+month;\n}\nif(day.toString().length == 1) {\nvar day = '0'+day;\n}   \nif(hour.toString().length == 1) {\nvar hour = '0'+hour;\n}\nif(minute.toString().length == 1) {\nvar minute = '0'+minute;\n}\nif(second.toString().length == 1) {\nvar second = '0'+second;\n} \n  \n//msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\nmsg.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\n\n\nreturn msg;","outputs":1,"x":996.2500152587891,"y":485.00000762939453,"z":"9d9dc866.626238","wires":[["d5e189e4.2a1e78","40557647.bfaa88"]]},{"id":"d5e189e4.2a1e78","type":"ioBroker out","name":"","topic":"TestDatum2","ack":"true","autoCreate":"true","x":1214.166660308838,"y":484.58338928222656,"z":"9d9dc866.626238","wires":[]},{"id":"8820471a.77dfb8","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":801.2500228881836,"y":484.16673278808594,"z":"9d9dc866.626238","wires":[["63c5d5c5.9c3a2c"]]},{"id":"40557647.bfaa88","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1216.250015258789,"y":440.00000762939453,"z":"9d9dc866.626238","wires":[]}]
      

      In dem Beispiel wird nicht das Datum der Nachricht umgewandelt, sondern vom der aktuellen Zeit (Date()).

      Test und Beispiel zum Verständnis:
      327_2015-05-01_tst_umwandeln_2.jpg

      Node-red Flow:

      ! ````
      [{"id":"76a3a5f9.895c5c","type":"function","name":"now aktuelles Datum","func":"// (1) wandelt timestamo ins ISO Datumformat um\n//msg.timestamp= new Date().toISOString()\n\n\n// (2) beliebiges Datum festlegbar: hier: YYYY-MM-DD HH:MM.SS\n// (Ausgabeformat wird danz am Ende zusammengestellt)\nvar now = new Date(); \nvar year = now.getFullYear();\nvar month = now.getMonth()+1; \nvar day = now.getDate();\nvar hour = now.getHours();\nvar minute = now.getMinutes();\nvar second = now.getSeconds(); \nif(month.toString().length == 1) {\nvar month = '0'+month;\n}\nif(day.toString().length == 1) {\nvar day = '0'+day;\n} \nif(hour.toString().length == 1) {\nvar hour = '0'+hour;\n}\nif(minute.toString().length == 1) {\nvar minute = '0'+minute;\n}\nif(second.toString().length == 1) {\nvar second = '0'+second;\n} \n\n\n// Variante1: wenn z.B. nicht ein vorhandener Payload\n// überschrieben werden soll, sondern um ein\n// Datum ergänzt werden soll. \n\n//msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\n\n// Variante 2: Function gobt die aktuelle Zeit als payload aus\nmsg.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\n\nreturn msg;","outputs":1,"x":1112.500015258789,"y":136.66663551330566,"z":"9d9dc866.626238","wires":[["9686a94e.697958","7237ae9e.8dc85","c557ecb1.3aa81"]]},{"id":"9686a94e.697958","type":"ioBroker out","name":"","topic":"TestDatum","ack":"true","autoCreate":"true","x":1311.6666450500488,"y":135.00000190734863,"z":"9d9dc866.626238","wires":[]},{"id":"7237ae9e.8dc85","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1315.833396911621,"y":98.33335304260254,"z":"9d9dc866.626238","wires":[]},{"id":"470bde4f.b8f42","type":"inject","name":"","topic":"Beispiel Datumsformat","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":638.7500076293945,"y":138.33336067199707,"z":"9d9dc866.626238","wires":[["2a14ac81.d5eb54","c9fa1333.3605f"]]},{"id":"2a14ac81.d5eb54","type":"debug","name":"","active":true,"console":"false","complete":"false","x":838.7500114440918,"y":91.2500057220459,"z":"9d9dc866.626238","wires":[]},{"id":"c557ecb1.3aa81","type":"template","name":"Beispiel Object","field":"payload","template":"Topic: {{topic}} -\nTimestamp aus dem inject Node: \n{{tst}} -\nUmwandlung aus der function "now...":\n{{payload}}","x":1103.750015258789,"y":228.75000381469727,"z":"9d9dc866.626238","wires":[["5bb61570.a449ec"]]},{"id":"c9fa1333.3605f","type":"function","name":"Test msg.payload = msg.tst","func":"msg.tst = msg.payload;\nreturn msg;","outputs":1,"x":882.5000152587891,"y":136.25000190734863,"z":"9d9dc866.626238","wires":[["76a3a5f9.895c5c"]]},{"id":"5bb61570.a449ec","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1332.5000190734863,"y":227.50000381469727,"z":"9d9dc866.626238","wires":[]}]

      
      Der Lerneffekt für mich war dabei, wie man mehrere Informationen in einer Message (msg) (=Object?) weitergibt und einzeln verarbeitet/ergänzen/ausgeben kann.
      
      Die msg, die zuletzt am template ankommt (template verwende ich z.B. in anderen Flows, um eine Email zusammenzubauen), enthält die Informationen ****msg.topic**** (aus dem inject node), ****msg.tst**** (Ursprung als msg.payload aus dem inject node, Umwandlung in der folgenden Funktion in msg.tst) und ****msg.payload**** aus der Funktion, die das aktuelle Datum (Date()) in ein lesbares Datumsformat umwandelt.
      
      ****Statt die aktuelle Zeit in der Funktion zu erzeugen soll nun die Zeit aus der msg (im Beispiel msg.payload aus dem inject node) in ein lesbares Datum umgewandelt werden:****
      
       ![327_2015-05-01_tst_umwandeln_3.jpg](/assets/uploads/files/327_2015-05-01_tst_umwandeln_3.jpg) 
      
      Hierzu muss der Code in der Funktion um eine Zeile ergänzt werden.
      
      Nachdem die Variable now mit dem aktuellen Datum erzeugt wurde, wird diese neu gestellt und zwar mit dem msg.payload aus dem inject node.
      
      var now = new Date();
      
      ****now.setTime(msg.payload); // Zeit aus dem Payload****
      
      Das ganze Script aus der Funktion, um diese Zeile ergänzt:
      
      >! ````
      // (1) wandelt timestamo ins ISO Datumformat um
      //msg.timestamp= new Date().toISOString()
      >! // (2) beliebiges Datum festlegbar: hier: YYYY-MM-DD HH:MM.SS
      //     (Ausgabeformat wird danz am Ende zusammengestellt)
      >! var now     = new Date(); 
      now.setTime(msg.payload); // Zeit aus dem Payload
      var year    = now.getFullYear();
      var month   = now.getMonth()+1; 
      var day     = now.getDate();
      var hour    = now.getHours();
      var minute  = now.getMinutes();
      var second  = now.getSeconds(); 
      if(month.toString().length == 1) {
      var month = '0'+month;
      }
      if(day.toString().length == 1) {
      var day = '0'+day;
      }   
      if(hour.toString().length == 1) {
      var hour = '0'+hour;
      }
      if(minute.toString().length == 1) {
      var minute = '0'+minute;
      }
      if(second.toString().length == 1) {
      var second = '0'+second;
      } 
      
      //msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;
      msg.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;
      >! return msg;
      

      Eine Bitte. Sollte ich etwas falsch verstanden habe, bin ich um jeden Hinweis und jede Korrektur dankbar!

      posted in Skripten / Logik
      ruhr70
      ruhr70
    • [SKRIPT] Philips hue dynamische Szenen - update

      Anbei die aktualisierte Fassung (neue Szenen) des Skripts für dynamische Lichtszenen mit Philips hue.

      Folgende Szenen sind in der aktualisierten Fassung enthalten:

          "kamin":
              "description":  "roter Farbverlauf",
          "wald":
              "description":  "grüner Farbverlauf",
          "sonne":
              "description":  "gelb/oranger Farbverlauf",
          "blau":
              "description":  "Energie, blauer Farbverlauf",
          "strobo":
              "description":  "Stroboskop",
          "feuer":
              "description":  "pulsierende Farben",
          "regenbogen":
              "description":  "das gesamte Farbspektrum",
          "love":
              "description":  "langsam wechselnder Farbverlauf im lila/violetten Bereich, bis zu den Endpunkten blau und rot",
      

      Mit strobo wird die Wohnung zur Disco 😉

      Bei Szenen, wie Kamin, Sonne, Wald, usw. verändern die Lampen innerhalb des angegeben Spektrums zufällig (Zeit und Farbe) die Farbe, so dass eine leicht dynamische Lichtstimmung entsteht.

      Skript V 0.3.1:

      // hue Szenzen - Script für ioBroker
      // V 0.3.1
      //
      // es empfiehlt sich den hue-Adapter-Loglevel auf "warn" zu stellen (viele Farbänderungen)
      //
      // Benutzung über Vis, bzw. Datenpunkte
      // ------------------------------------
      //
      // die Szenen können über Datenpunkte, z.B. über Vis eingeschaltet und gesteuert werden.
      //
      // javascript.0.hue.szene.arbeitszimmer.szene = "love" -> schaltet die Szene "love" im Arbeitszimmer ein
      // javascript.0.hue.szene.arbeitszimmer.szene = "aus"  -> schaltet die aktive Szene im Arbeitszimmer aus, die Lampen gehen aus
      // javascript.0.hue.szene.arbeitszimmer.szene = "stop" -> stoppt die Szene, die Lampen der Gruppe "arbeitszimmer" leuchten weiter
      //
      // javascript.0.hue.szene.arbeitszimmer.bri_inc = -16  -> reduziert de Helligkeit der Szene um 16 Punkte
      //
      // javascript.0.hue.szene.arbeitszimmer.bri     = 200  -> ändert die Helligkeit der Szene direkt auf den Wert 200
      // javascript.0.hue.szene.arbeitszimmer.sat     = 200  -> ändert die Sättigung  der Szene direkt auf den Wert 200
      //
      //
      // Benutzung über Javascript (Funktionen)
      // --------------------------------------
      //
      // szeneStart(lampenGruppe,szene,bri); // bri ist optional
      //
      // Beispiel:
      //
      // szeneStart("wohnzimmer","sonne");  // startet in der Lampengruppe "wohnzimmer" die Szene "sonne"
      //
      //
      // szeneStop(lampenGruppe);
      //
      //
      // lampenAus(lampenGruppe);
      //
      //
      //
      //
      //
      //
      //
      //
       // todo
      // ----
      //
      // Rotalarm     Effekt
      //
      // prüfen:
      // -------
      //
      //
      // erledigt:
      // ---------
      // bri          optional übergeben (zur Laufzeit veränderbar)
      // Einschaltzeit beim ersten Einschalten
      // sat          optional übergeben (zur Laufzeit veränderbar)
      // Änderungen sat, bri per on() überwachen und Lampen in aktiver Gruppe sofort anpassen
      // neue DP Strukutur ()
      //
      //
       // ------------ ANFANG der individuellen Konfiguration ------------
       // die eigenen Lampen in Gruppen sortiert (die Farbverläufe und Effekte werden nach Gruppen aktiviert)
       var lampen ={
          "wohnzimmer":       // Lampengruppe
              [
                  "hue.0.Hue_2_AZ.wohnzimmer.kugel",
                  "hue.0.Hue_2_AZ.wohnzimmer.stehlampe.oben",
                  "hue.0.Hue_2_AZ.wohnzimmer.stehlampe.mitte",
                  "hue.0.Hue_2_AZ.wohnzimmer.stehlampe.unten",
                  "hue.0.Hue_2_AZ.küche.kühlschrank.lc"
              ],
          "schlafzimmer":     // Lampengruppe
              [
                  "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.links",
                  "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.mitte",
                  "hue.0.Hue_2_AZ.schlafzimmer.decke.hinten.rechts",
                  "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.links",
                  "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.mitte",
                  "hue.0.Hue_2_AZ.schlafzimmer.decke.vorne.rechts"
              ],
          "arbeitszimmer":    // Lampengruppe
              [
                  "hue.0.Hue_2_AZ.arbeitszimmer.schreibtisch.ls",
                  "hue.0.Hue_2_AZ.arbeitszimmer.vorhang",
                  "hue.0.Hue_2_AZ.arbeitszimmer.regal.li.re"
              ]
      };
       var hueSzenenApapterPfad = "hue.szene.";    // wo sollen die Datenpunkte in den ioBroker Objekten angelegt werden
                                                  // je Lampengruppe werden die Datenpunkte:
                                                  // .szene       -> Änderung der Szene per Datenpunkt, z.B. über VIS oder im Script per szeneStart(lampenGruppe,szene,bri);
                                                  // .bri         -> Änderung der Helligkeit per Datenpunkt (0-254)
                                                  // .sat         -> Änderung der Farbsättigung per Datenpunkt ())0-254)
                                                  // .bri_inc     -> Erhöhung/Verminderung der Helligkeit per Datenpunkt (positiver Wert = Heller, negativer Wert = dunkler)
                                                  // .sat_inc     -> Erhöhung/Verminderung der Sättigung per Datenpunkt  (positiver Wert = mehr Farbe, negativer Wert = blasser)
                                                  // angelegt
                                                  // z.B. unter: javascript.0.hue.szene.arbeitszimmer.szene (Javascfript Instanz 0, Pfad = "hue.szene.")
       // globaler Parameter: Zufällige Zeit zwischen den Wechsel zwischen zwei Farben, je Lampe, in der aktivierten Szene in ms
      // (wenn keine individuelle Zeit in der Szene definiert ist)
      var delayMin =  1000;   // minimale Zeit in ms einer Lampe, um in die nächste Farbe zu wechseln
      var delayMax =  3000;   // maximale Zeit in ms einer Lampe, um in die nächste Farbe zu wechseln
       // ------------ ENDE der individuellen Konfiguration ------------
       // -------------------------------------------------------------------------
      // Script: Logik & Szenen - ab hier muss in der Regel nichts geändert werden
      // -------------------------------------------------------------------------
       var szenen = {
          "beispiel":
          {
              "description":  "Beispielszene",    // optional: Beschreibung der Szene
              "delayMin":     2000,               // optional (ohne werden die globalen Einstellungen verwendet)
              "delayMax":     9000,               // optional (ohne werden die globalen Einstellungen verwendet)
              "hueMin":       0,                  // niedrigste Farbe im Verlauf
              "hueMax":       50000               // höchste Farbe im Verlauf
          },
          "kamin":
          {
              "description":  "roter Farbverlauf",
              "hueMin":       0,
              "hueMax":       10000
          },
          "wald":
          {
              "description":  "grüner Farbverlauf",
              "hueMin":       20000,
              "hueMax":       27000
          },
          "sonne":
          {
              "description":  "gelb/oranger Farbverlauf",
              "hueMin":       10000,
              "hueMax":       17000
          },
          "blau":
          {
              "description":  "Energie, blauer Farbverlauf",
              "hueMin":       44000,
              "hueMax":       48000
          },
          "strobo":
          {
              "description":  "Stroboskop",
              "ct":           153,
              "delayMin":     500,
              "delayMax":     800
          },
          "feuer":
          {
              "description":  "pulsierende Farben",
              "delayMin":     200,
              "delayMax":     600,
              "hueMin":       0,
              "hueMax":       17000
          },
          "regenbogen":
          {
              "description":  "das gesamte Farbspektrum",
              "delayMin":     1000,
              "delayMax":     8000,
              "hueMin":       0,
              "hueMax":       65355
          },
           "love":
          {
              "description":  "langsam wechselnder Farbverlauf im lila/violetten Bereich, bis zu den Endpunkten blau und rot",
              "delayMin":     5000,
              "delayMax":     8000,
              "hueMin":       46920,
              "hueMax":       65355
          }
      };
       // ##### Script Variablen #####
       var timer =             {};
      var nextDelay =         {};
      var szeneAktiv =        [];
      var szene =             [];
       //  ##### Script Funktionen #####
       function rand(min, max) {
          return Math.floor(Math.random() * (max - min + 1)) + min;
      }
       function dpAnlegen() {
          for (var lampenGruppe in lampen) {
              createState(hueSzenenApapterPfad + lampenGruppe + ".szene","aus");
              createState(hueSzenenApapterPfad + lampenGruppe + ".infoAktiveSzene","keine");
              createState(hueSzenenApapterPfad + lampenGruppe + ".bri",254);
              createState(hueSzenenApapterPfad + lampenGruppe + ".bri_inc",0);
              createState(hueSzenenApapterPfad + lampenGruppe + ".sat",254);
              createState(hueSzenenApapterPfad + lampenGruppe + ".sat_inc",0);
              log(hueSzenenApapterPfad + lampenGruppe + " wurde angelegt","info");
          }
      }
       function restoreSzenen() {
          for (var lampenGruppe in lampen) {
              var aktiveSzene = getState(hueSzenenApapterPfad + lampenGruppe + ".szene").val;
              var bri = getState(hueSzenenApapterPfad + lampenGruppe + ".bri").val;
              if (aktiveSzene != "aus") {
                  log("im der Gruppe: " + lampenGruppe + " wurde die Szene: " + aktiveSzene + " wieder aktiviert.");
                  setState(hueSzenenApapterPfad + lampenGruppe + ".infoAktiveSzene",aktiveSzene);
                  szeneStart(lampenGruppe,aktiveSzene,bri);
              }
          }
      }
       function varsAnlegen() {
          // Script-Variablen für jede Lampengruppe anlagen
          for (var lampenGruppe in lampen) {
              timer[lampenGruppe] =           [];
              nextDelay[lampenGruppe] =       [];
              szeneAktiv[lampenGruppe] =      false;
              szene[lampenGruppe] =           null;
              // Script-Variablen für jede Lampe in jeder Lampengruppe anlegen
              for (var i = 0; i < lampen[lampenGruppe].length; i++) {                 // timer und die nächste Delayzeit für jede Lampe zurückstellen
                  timer[lampenGruppe][i] = null;
                  nextDelay[lampenGruppe][i] = 0;
              }
          }
      }
       function szenenwechsel (lampenGruppe,lampe,delay) {
          delay = Math.floor(delay / 100);                                            // der zufällige Wert für die nächste Lichtfarbe wird auch als transitiontime verwendet (dazu wird das delay durch 100 geteilt)
          //log("aktive Szene: hueMin: " + szenen[szene[lampenGruppe]]["hueMin"] + " hueMax: " + szenen[szene[lampenGruppe]]["hueMax"]);
          var hue = rand(szenen[szene[lampenGruppe]].hueMin,szenen[szene[lampenGruppe]].hueMax);
          var bri = getState(hueSzenenApapterPfad + lampenGruppe+".bri").val;
          var sat = getState(hueSzenenApapterPfad + lampenGruppe+".sat").val;
          var command = '{"on":true,"hue":' + hue + ',"sat":' + sat + ',"bri":' + bri + ',"transitiontime":' + delay + ',"colormode":"hs"}';
          //log ("Lampe: " + lampen[lampenGruppe][lampe] + " # command: " + command);
          if (bri == 0) command = '{"on":false,"bri":0}';
          setState(lampen[lampenGruppe][lampe] + ".command", command);
      }
       function stroboskop(lampenGruppe,lampe) {
          var command = '{"on":true,"ct":153,"bri":254,"transitiontime":0,"colormode":"ct"}';
          setState(lampen[lampenGruppe][lampe] + ".command", command);
          command = '{"on":false,"transitiontime":0}';
          setState(lampen[lampenGruppe][lampe] + ".command", command);
      }
       function berechneDelay (lampenGruppe,lampe){
          // globale Delay-Einstellungen übernehmen
          var delayMinTemp = delayMin;
          var delayMaxTemp = delayMax;
          // globale Delay-Einstellungen überschreiben, wenn in der Szene ein eingener Delay definiert ist
          if (szenen[szene[lampenGruppe]].delayMin) delayMinTemp = szenen[szene[lampenGruppe]].delayMin;
          if (szenen[szene[lampenGruppe]].delayMax) delayMaxTemp = szenen[szene[lampenGruppe]].delayMax;
          nextDelay[lampenGruppe][lampe] = rand(delayMinTemp,delayMaxTemp);
      }
       function szeneTimer(lampenGruppe,lampe) {
          var delay = nextDelay[lampenGruppe][lampe] || 0;
          var aktuelleSzene = szene[lampenGruppe];
          //log("gesetztes Delay: " + delay);
          if (timer[lampenGruppe][lampe]) clearTimeout(timer[lampenGruppe][lampe]);
          timer[lampenGruppe][lampe]  = setTimeout(function() {
              timer[lampenGruppe][lampe] = null;
              berechneDelay(lampenGruppe,lampe);
              switch (aktuelleSzene) {
                  case "strobo":
                      stroboskop(lampenGruppe,lampe);
                      break;
                  default:
                      szenenwechsel(lampenGruppe,lampe,nextDelay[lampenGruppe][lampe]);
                      break;
              }
              //log("Delay = " + nextDelay[lampenGruppe][lampe] + " # Lampe: " + lampen[lampenGruppe][lampe]);
              szeneTimer(lampenGruppe,lampe); // ruft den Timer nach Ablauf wieder auf
          },delay);
      }
       function check254(check) {
          if (check !== 0) if (!check) check = 254;
          check = parseInt(check);
          if (check > 254) check =254;
          if (check <= 0 ) check = 0;
          return check;
      }
       function setBri(lampenGruppe,aktiveSzene,bri) {
          if (szenen[aktiveSzene].bri) bri = szenen[aktiveSzene].bri;
          bri = check254(bri);
          setState(hueSzenenApapterPfad + lampenGruppe+".bri", bri);
      }
       function setSat(lampenGruppe,aktiveSzene,sat) {
          if (szenen[aktiveSzene].sat) sat = szenen[aktiveSzene].sat;
          sat = check254(sat);
          setState(hueSzenenApapterPfad + lampenGruppe+".sat", sat);
      }
       function szeneStart(lampenGruppe,aktiveSzene,bri,sat) {
          if (!szenen[aktiveSzene]) {                                                 // undefinierte Szenen abfangen
              log("# hue Szenen Script: undefinierte Szene wurde versucht aufzurufen: " + aktiveSzene,"error");
              return;
          }
          szene[lampenGruppe] = aktiveSzene;
          setBri(lampenGruppe,aktiveSzene,bri);
          setSat(lampenGruppe,aktiveSzene,sat);
          if (!szeneAktiv[lampenGruppe]) {
              szeneAktiv[lampenGruppe] = true;
              for (var i = 0; i < lampen[lampenGruppe].length; i++) {                 // für alle Lampen den timer starten
                  nextDelay[lampenGruppe][i] = 0;
                  szeneTimer(lampenGruppe,i);
              }
          }
      }
       function szeneStop(lampenGruppe) {                                              // alle aktiven timer löschen
          for (var i = 0; i < lampen[lampenGruppe].length; i++) {
              clearTimeout(timer[lampenGruppe][i]);
              log("Timer: " + lampen[lampenGruppe][i] + " gestoppt");
          }
          szeneAktiv[lampenGruppe] =  false;
          szene[lampenGruppe] =       null;
      }
       function lampenAus(lampenGruppe) {
          for (var i = 0; i < lampen[lampenGruppe].length; i++) {
              setState(lampen[lampenGruppe][i]+".command",'{"on":false}');
          }
      }
       function setBriSat(com,wert,lampenGruppe) {
          if (wert != check254(wert)) {
              wert = check254(wert);
              setState(hueSzenenApapterPfad + lampenGruppe + "." + com, wert);    //korrigiert bri/sat und  ruft diese on() Funktion direkt wieder auf
          } else {
              //log("Lampengruppe: " + lampenGruppe + " # " + com + ": " + wert + " empfangen","warn");
              if (szeneAktiv[lampenGruppe]) {                                         // wenn die Szene in der Gruppe aktiv ist:
                  for (var i = 0; i < lampen[lampenGruppe].length; i++) {             // für alle Lampen der Gruppe
                      setState(lampen[lampenGruppe][i] + "." + com, wert);            // die Helligkeit/Saturation direkt ändern
                      //log(com + ": " + wert + " # " + lampen[lampenGruppe][i] + " gesetzt","warn");
                  }
              }
          }
      }
       function changeBriSat (com, wert, lampenGruppe) {
          com = com.replace("_inc", "");
          var alterWert = getState(hueSzenenApapterPfad + lampenGruppe + "." + com).val;
          wert = parseInt(wert) + alterWert;
          setState(hueSzenenApapterPfad + lampenGruppe + "." + com, wert);            //setzt bri/sat neu. Dies ruft die on() Funktion direkt wieder auf, diesmal mit bri/sat
      }
       //  ##### Überwachte Datenpunkte #####
       // Änderung der Helligkeit (.bri) oder Farbsättigung (.sat) während der Laufzeit über einen Datenpunkt
       var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.(sat|bri)");
      on({"id":reg , "change": "ne"}, function (obj) {
          var com = obj.id.split('.').pop();
          var	str = obj.id.replace(/\.(bri|sat)$/, "");
          var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.'));
          var lampenGruppe = str.replace(reg2, "");
          var wert = obj.newState.val;
          setBriSat (com, wert, lampenGruppe);
      });
       // Änderung der Helligkeit oder Farbsättignung als adaptiver Wert (.bri_inc, .sat_inc)
       var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.(sat_inc|bri_inc)");
      on({"id":reg , "change": "any"}, function (obj) {
          var com = obj.id.split('.').pop();
          var	str = obj.id.replace(/\.(sat_inc|bri_inc)$/, "");
          var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.'));
          var lampenGruppe = str.replace(reg2, "");
          var wert = obj.newState.val;
          changeBriSat (com, wert, lampenGruppe);
      });
       // Änderung einer Szene während der Laufzeit, z.B. über VIS
       var reg = new RegExp("^javascript\\.\\d+\\." + hueSzenenApapterPfad.replace('.', '\\.') + ".*\\.szene");
      on(reg , function (obj) {
          var	str = obj.id.replace(/\.szene$/, "");
          var reg2 = new RegExp("^javascript\\.\\d+\\."+ hueSzenenApapterPfad.replace('.', '\\.'));
          var lampenGruppe = str.replace(reg2, "");
          var neueSzene =         obj.newState.val;
          log("Lampengruppe: " + lampenGruppe + " # Szene: " + neueSzene + " empfangen");
          switch (neueSzene) {
              case "aus":
                  szeneStop(lampenGruppe);
                  lampenAus(lampenGruppe);
                  log(lampenGruppe + " Szene deaktiviert");
                  break;
              case "stop":
                  szeneStop(lampenGruppe);
                  log(lampenGruppe + " Szene angehalten");
                  break;
              default:
                  if (szenen[neueSzene]) {
                      // TODO: bri nur ermitteln, wenn in der Szene kein eigener bri festgelegt ist
                      var bri = getState(hueSzenenApapterPfad + lampenGruppe+".bri").val;
                      bri = check254(bri);
                      if (bri == 0) bri = 254;
                      szeneStart(lampenGruppe,neueSzene,bri);
                      setState(hueSzenenApapterPfad + lampenGruppe+".infoAktiveSzene", neueSzene);
                      log(lampenGruppe + " Szene: " + neueSzene + " gestartet");
                      break;
                  }
                  log("### unbekannte Szene: " + neueSzene,"error");
                  break;
          }
      });
       //  ##### Scriptstart #####
       dpAnlegen();        // je einen Datenpunkt pro Lampengruppe anlegen
      varsAnlegen();      // die für das Script notwendigen Variablen erstellen
       // warte bis alle States und Objekte angelegt werden.
      // 500ms und dann starte main();
      function main() {
       //  ##### Scriptstart main() #####
           restoreSzenen();    // aktiviert zuletzt eingestellte Szenen
       }
      setTimeout(main, 500);
      

      Das alte Widget funktioniert weiterhin und kann um die neuen Szenen erweitert werden:
      327_iobroker_20dynamische_20hue_20szenen_20widget.png
      http://forum.iobroker.net/viewtopic.php ... che#p10055

      posted in Skripten / Logik
      ruhr70
      ruhr70
    • RE: Fronius Symo Hybrid über Javaskript auslesen (Json)

      @SolarElch:

      bekomme ich folgende vier Werte zurück, kann mir der IOBroker diese auslesen, anzeigen und wegspeichern? `

      probier mal:

      
      var request = require("request");
      
      var myJson;
      
      var pfad = "Fronius_Symo_Hybrid.";
      
      var idDAY_ENERGY        = pfad + "ENERGY_DAY";
      var idPAC               = pfad + "PAC";
      var idYEAR_ENERGY       = pfad + "ENERGY_YEAR";
      var idTOTAL_ENERGY      = pfad + "ENERGY_TOTAL";
      
      createState(idDAY_ENERGY, 0, {
          name: 'Energie Tag',
          desc: 'Energie Tag',
          type: 'number',
          role: 'value',
          unit: 'Wh'
      });
      
      createState(idPAC, 0, {
          name: 'Leistung',
          desc: 'Leistung',
          type: 'number',
          role: 'value',
          unit: 'W'
      });
      
      createState(idYEAR_ENERGY, 0, {
          name: 'Energie Jahr',
          desc: 'Leistung',
          type: 'Energie Jahr',
          role: 'value',
          unit: 'Wh'
      });
      
      createState(idTOTAL_ENERGY, 0, {
          name: 'Energie Total',
          desc: 'Leistung',
          type: 'Energie total',
          role: 'value',
          unit: 'Wh'
      });
      
      function parseJson(text) {
          if (text === "") return {};
          try {
              json = JSON.parse(text);
          } catch (ex) {
              json = {};
          }
          if(!json) json = {};
          return json;
      }
      
      function readJson(url, callback) {
          request(url, function (err, state, body){
              if (body) {
                  var json = parseJson(body);
                  callback(null, json);
              } else {
                  var error = "(" + err + ") ERROR bei Abfrage von: " + url;
                  log(error, "warn");  
                  callback(error, null);
              }
          });
      }
      
      var url = 'http://10.0.0.6/solar_api/v1/GetInverterRealtimeData.cgi?Scope=System';
      
      readJson(url, function(err,json) {
          if(!err) {
              myJson = json;
              //log(myJson.LocationList.StopLocation[0].name);
              log("DAY_ENERGY: "      + myJSON.Body.Data.DAY_ENERGY.Values[1],"info");
              log("PAC: "             + myJSON.Body.Data.PAC.Values[1],"info");
              log("YEAR_ENERGY: "     + myJSON.Body.Data.YEAR_ENERGY.Values[1],"info");
              log("TOTAL_ENERGY: "    + myJSON.Body.Data.TOTAL_ENERGY.Values[1],"info");
              setState(idDAY_ENERGY   ,myJSON.Body.Data.DAY_ENERGY.Values[1]);
              setState(idPAC          ,myJSON.Body.Data.PAC.Values[1]);
              setState(idYEAR_ENERGY  ,myJSON.Body.Data.YEAR_ENERGY.Values[1]);
              setState(idTOTAL_ENERGY ,myJSON.Body.Data.TOTAL_ENERGY.Values[1]);
          } else {
              log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn");
              myJson = {};
          }
      });
      
      
      posted in Skripten / Logik
      ruhr70
      ruhr70
    • RE: Script beenden

      Keine Ahnung, ob das elegant ist…

      pack Dein Programm in eine Funktion. Diese kannst Du im Verlauf dann mit return; beenden.

      
      function main () {
      
          log("Hallo ");
          return;
          log("Du");
      }
      
      main();
      
      

      Gib im Log:

      Hallo

      aus.

      posted in Skripten / Logik
      ruhr70
      ruhr70
    • RE: (gelöst) Javascript switch case & vis

      oje…

      habe mich selbst reingelegt. Ich lass den peinlichen Eintrag mal drin, falls noch jemand drüber stolpert.

      Im vis habe ich im Widget den String, der geschrieben werden soll in Anführungszeichen gesetzt.

      In Vis: "rot"

      Dann wird als String auch "rot" geschrieben, inkl. Anführungszeichen.

      der case würde dann '"rot'" lauten (einfache Anführungszeichen, normale Anführungszeichen, ...).

      Ist natürlich quatsch...

      In Vis: rot

      eintragen

      dann passt der case auch mit "rot"

      posted in Skripten / Logik
      ruhr70
      ruhr70

    Latest posts made by ruhr70

    • RE: [Aufruf] Neuer Adapter Ubuntu-Monitor

      Top. Kann ich gut gebrauchen <emoji seq="1f600">😀</emoji>

      posted in Tester
      ruhr70
      ruhr70
    • RE: [Neuer Adapter] Unite - Geräte Verbinden

      super! werde ich mir anschauen <emoji seq="1f603">😃</emoji>

      posted in Entwicklung
      ruhr70
      ruhr70
    • RE: [Gelöst] Umstellung auf Iot macht große Probleme

      GitHub Account anlegen und dann auf

      https://github.com/ioBroker/ioBroker.openhab/issues

      News Issue

      Gesendet von iPad mit Tapatalk

      posted in ioBroker Allgemein
      ruhr70
      ruhr70
    • RE: Lest ihr eigentlich bevor ihr Schreibt? :x

      @Eisbaeeer:

      UND manchmal auch das. Hmmm, gespendet hab ich bisher nur code.
      filename="Forum2.png" index="0">~~ `

      Ich habe am Anfang einmal per PayPal gespendet.

      Ansonsten hole ich mir einfach die kostenpflichtigen Dienste als als Spende, auch wenn ich sie erst später benötige.

      Win Win. Unterstützung und man hat auch was davon.

      Gesendet von iPad mit Tapatalk

      posted in ioBroker Allgemein
      ruhr70
      ruhr70
    • RE: [Erledigt] js-controller hohe Load

      @apollon77:

      Wenn Ihr ne gescheite SSD/HDD habt empfehle ich sogar AOF als Variante weil Du dann keinen Datenverlust hast. Am Ende aber auch hier: backup nicht vergessen!! Das File liegt nicht im ioBroker-Verzeichnis `

      Da hatte Paul53 Mal was im Forum geschrieben, wie man das umstellt, das Redis ins ioBroker-Verzeichnis Verzeichnis speichert

      Gesendet von iPad mit Tapatalk

      posted in Error/Bug
      ruhr70
      ruhr70
    • RE: [Neuer Adapter] ASUSWRT

      Daumen hoch!

      posted in Tester
      ruhr70
      ruhr70
    • RE: IP Check Script ??

      Beim Parsen hättest Du direkt die Daten zum weiterverarbeitet, reagieren…. Z.B. Telegram...

      Screenshot müsste hiermit gehen:

      https://github.com/ioBroker/ioBroker.phantomjs

      Gesendet von iPad mit Tapatalk

      posted in Skripten / Logik
      ruhr70
      ruhr70
    • RE: I-Broker unter Windows 10 VM

      Ich würde die aktuellste 8er nehmen.

      posted in ioBroker Allgemein
      ruhr70
      ruhr70
    • RE: Remote Skript Debugging mit VSCode

      Vielleicht hilft das:

      viewtopic.php?f=20&t=4564&p=187360&hili … gen#p61477

      posted in Skripten / Logik
      ruhr70
      ruhr70
    • RE: [Vorlage] Synchronisation / Backup von Fileserver in Cloud und Erfolgsanzeige in VIS

      Wow! Super durchdacht und schön gelöst.

      Danke fürs teilen und der ausführlichen Beschreibung!

      posted in Praktische Anwendungen (Showcase)
      ruhr70
      ruhr70
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo