Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    T
    • Profile
    • Following 0
    • Followers 1
    • Topics 12
    • Posts 102
    • Best 7
    • Groups 2

    Tictactoo

    @Tictactoo

    Pro

    8
    Reputation
    106
    Profile views
    102
    Posts
    1
    Followers
    0
    Following
    Joined Last Online

    Tictactoo Follow
    Pro Starter

    Best posts made by Tictactoo

    • Alexa-Adapter empfängt keine History mehr
      Systemdata Bitte Ausfüllen
      Hardwaresystem: RaspberryPi 4
      Arbeitsspeicher: 2GB
      Festplattenart: SD-Karte
      Betriebssystem: Raspbian
      Nodejs-Version: 12.20.1
      NPM-Version: 6.14.10

      Abend zusammen,

      seit heute morgen bekomme ich leider keine History mehr über den alexa2.0-Adapter in ioBroker. Ich glaube nicht, dass ich irgendwas gemacht hab, was dazu geführt hat. Die Buttons wie "tellstory" usw funktionieren noch, nur die History wird nicht mehr aktualisiert leider. Der Adapter steht auf grün. Der Log sieht nach dem Neustart des Adapters wie folgt aus:

      2021-02-02 18:20:49.043 - info: host.raspberrypi stopInstance system.adapter.alexa2.0 (force=false, process=true)
      2021-02-02 18:20:49.052 - info: host.raspberrypi stopInstance system.adapter.alexa2.0 send kill signal
      2021-02-02 18:20:49.056 - info: alexa2.0 (1147) Got terminate signal TERMINATE_YOURSELF
      2021-02-02 18:20:49.064 - info: alexa2.0 (1147) terminating
      2021-02-02 18:20:49.066 - info: alexa2.0 (1147) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
      2021-02-02 18:20:49.626 - info: host.raspberrypi instance system.adapter.alexa2.0 terminated with code 11 (ADAPTER_REQUESTED_TERMINATION)
      2021-02-02 18:20:52.126 - info: host.raspberrypi instance system.adapter.alexa2.0 started with pid 31088
      2021-02-02 18:20:53.989 - info: alexa2.0 (31088) starting. Version 3.6.0 in /opt/iobroker/node_modules/iobroker.alexa2, node: v12.20.1, js-controller: 3.1.6
      2021-02-02 18:20:54.753 - info: alexa2.0 (31088) Proxy IP not set, use first network interface (192.168.178.66) instead
      2021-02-02 18:20:59.743 - info: alexa2.0 (31088) Alexa-Push-Connection established. Disable Polling
      2021-02-02 18:21:20.541 - info: alexa2.0 (31088) Subscribing to states...
      

      Ist der Fehler bekannt?

      posted in Error/Bug
      T
      Tictactoo
    • RE: 2 Draht Türklingel Zigbee oder WLAN ohne Cloud

      Vielleicht hilft euch folgendes Video weiter. Damit habe ich meine Türklingel auch "smart" gemacht.

      https://www.youtube.com/watch?v=Rqgc1lQU2GM

      Die nötige Hardware ist günstig zu bekommen und es war auch nicht wirklich viel Aufwand. Ich bin kein Elektriker, aber je nach Stromversorgung müsste man auch einfach das Relais gegen eines für eine höhere Spannung austauschen können. Aber natürlich ist wie immer, wenn man mit Strom arbeitet, absolute Vorsicht geboten!

      posted in Hardware
      T
      Tictactoo
    • RE: [Aufruf] Welche guten JavaScripts setzt ihr ein?

      @tobasium Hi, ich hab mir ein gobales Skript angelegt, in der ich alle Geräte eintrage mit ihrer ID, so dass ich gleiche Geräte in verschiedenen Skripten nicht alle von Hand ändern muss. Effektiv kannst du bei sensorID lediglich die ID des Zigbeegeräts angeben ("zigbee.0.XXXX"). Den Raum änderst du einfach in dem du den String umschreibst. Alternativ könnte man auch das Enum des Zigbeegeräts auslesen.

      Hoffe, dass dir das hilft!

      posted in JavaScript
      T
      Tictactoo
    • RE: Zigbee Adapter mit neuem Converter

      @Asgothian Okay, ich glaube ich hab mich falsch ausgedrückt. In der Baumstruktur wäre es natürlich total unsinnig, aber das war auch nicht meine Intention bei der Frage. Ich meinte eigentlich, wenn man in die Adaptereinstellungen geht, auf er Oberfläche in der alle Geräte als "Karten" aufgeführt sind. Dort sollte es doch theoretisch kein Problem sein auf Darstellungsebene die einzelnen Geräte anders anzuordnen, um eine bessere Übersicht zu bekommen. Weiß zwar nicht wie aufwendig das alles programmiert ist, aber theoretisch sollte man doch schon nach bestimmten Attributen, die sowieso angezeigt werden, vorab sortieren können?

      posted in Entwicklung
      T
      Tictactoo
    • RE: INFO / ACHTUNG : Zigbee-Adapter 0.11.x

      @arteck Ich bin gelernter Informatiker, mir ist durchaus klar, was HEX bedeutet. Du schreibst allerdings A-D? HEX geht doch aber bis F?

      posted in ioBroker Allgemein
      T
      Tictactoo
    • RE: Ohne Cloud: Alexa nur mittels Adapter steuern?

      @frankyboy73 Okay, dass ist an mir vorbei gegangen. Interessant, dass sie das jetzt eingebaut haben. Aber dann gibt es ja trotzdem ein kleines Problem: Ich mag mich irren, aber da der Alexa-Adapter die Summary ja über den Amazon-Account abgreift und nicht vom Gerät lokal aus dem Netzwerk, nutzt einem der ganze Spaß ne Steuerung ohne Cloud zu programmieren ja am Ende nichts.

      posted in Cloud Dienste
      T
      Tictactoo
    • RE: [Aufruf] Welche guten JavaScripts setzt ihr ein?

      Hi zusammen,

      ich bin grade dabei meine ganzen Skripte etwas zu überarbeiten und zusammen zu schrumpfen und dachte mir, ich teil das gern mit euch. Als erstes wäre hier mein überarbeitetes Pflanzenskript. Ich hab es mittlerweile eingedampft und ein Skript für alle Planzen zusammen. Der Unterschied zur vorherigen Version ist, dass das Skript sich nun alle Pflanzen selbst sucht, wenn sie der entsprechenden Enum-Funktion("enum.functions.plant") zugeordnet sind. Desweiteren wird immer um 0 Uhr nachts nach neuen Pflanzen gesucht wird. Außerdem werden die aktuellen Timer nun in einem State gespeichert, damit nach einem Reset des Adapters oder des Rechners nicht wieder alle losgehen. Die Namen werden bei diesem Skript aus dem Namen des jeweiligen States übernommen. Bei mir heißt beispielweise eine der Pflanzen "Flower care - Fikus benjamina (Weißer Sensor)". Per replace wird der jeweilige State und das das "Flower care -" entfernt.

      Der einzige Nachteil ist, dass die Feuchtigkeit nicht mehr pro Pflanze gesetzt werden kann, sondern die Werte für alle Pfalnzen gelten. Mir persönlich ist es wurscht, weil 95% aller Pflanzen bei mir die gleiche Feuchtigkeit usw brauchen. Vermutlich könnte man das mit ein paar Kniffen aber auch irgendwie lösen, wenn man es will.

      /////////////////////
      ///   Parameter   ///
      
      var moistureMin = 15;
      var moistureMax = 60;
      
      var fertilityMin = 350;
      var fertilityMax = 2000;
      
      var temperatureMin = 10;
      var temperatureMax = 32;
      
      /*var lightMin = 1500;
      var lightMax = 6000;*/
      
      ////////////////////////////
      ///   Lokale Variablen   ///
      
      var timer = {};
      var timeouts = {};
      
      var moistureArray;
      var fertilityArray;
      var temperatureArray;
      
      var timerState = "javascript.0.plantTimer";
      
      ///////////////////////////////////
      ///   Variablen initalisieren   ///
      
      if(getState(timerState).notExist)
      {
          createState("plantTimer", {type: "object"});
      }
      
      setTimeout(function() {getPlants();}, 1000);
      
      //////////////////////
      ///   Monitoring   ///
      
      setTimeout(function() {
          //Moisture-Check
          on({id: moistureArray, change: "ne"}, function (obj) {
              timer = getState(timerState).val;
      
              if(!timer)
                  return;
      
              if(getState(obj.id).val < moistureMin && !timer[obj.id])
              {
                  var raum = getObject(obj.id, 'rooms').enumNames[0].de;
                  var pflanzenName = getObject(obj.id.replace('.moisture', "")).common.name.replace("Flower care - ", "");
      
                  sendTo('telegram.0', 'Du solltest deinen ' + pflanzenName + ' im ' + raum + ' dringend gießen.');
      
                  timer[obj.id] = true;
                  setState(timerState, {val: timer});
                  timeouts[obj.id] = setTimeout(function() {boolTimer(obj.id)}, 14400000);
              }
          });
      
          //Fertility-Check
          on({id: fertilityArray, change: "ne"}, function (obj) {
              timer = getState(timerState).val;
      
              if(!timer)
                  return;
      
              if(getState(obj.id).val < fertilityMin && !timer[obj.id])
              {
                  var raum = getObject(obj.id, 'rooms').enumNames[0].de;
                  var pflanzenName = getObject(obj.id.replace('.fertility', "")).common.name.replace("Flower care - ", "");
      
                  sendTo('telegram.0', 'Dein ' + pflanzenName + ' im ' + raum + ' könnte etwas Dünger vertragen.');
                  
                  timer[obj.id] = true;
                  setState(timerState, {val: timer});
                  timeouts[obj.id] = setTimeout(function() {boolTimer(obj.id)}, 14400000);
              }
          });
      
      
          //Temprature-Check
          on({id: temperatureArray, change: "ne"}, function (obj) {  
              timer = getState(timerState).val;
      
              if(!timer)
                  return;
      
              if(getState(obj.id).val < temperatureMin && !timer[obj.id])
              {
                  var raum = getObject(obj.id, 'rooms').enumNames[0].de;
                  var pflanzenName = getObject(obj.id.replace('.temperature', "")).common.name.replace("Flower care - ", "");
      
                  sendTo('telegram.0', 'Deinem ' + pflanzenName + ' im ' + raum + ' ist es etwas zu kalt.');
                  
                  timer[obj.id] = true;
                  setState(timerState, {val: timer});
                  timeouts[obj.id] = setTimeout(function() {boolTimer(obj.id)}, 14400000);
              }
          });
      
          schedule("0 0 * * *", function()
          {
              getPlants();
          });
      
      }, 2000);
      
      function boolTimer(id){
          timer = getState(timerState).val;
          timer[id] = false;
          log("Timer: " + id + " wurde zurückgeetzt!");
          setState(timerState, {val: timer});
      }
      
      function getPlants()
      {
          moistureArray = [];
          fertilityArray = [];
          temperatureArray = [];
      
          timer = getState(timerState).val;
      
          if(!timer)
          {
              timer = {};
          }
      
          var plants = getObject("enum.functions.plant").common.members;
          for(let i = 0; i < plants.length; i++) {
              var moisture = plants[i] + '.moisture';
              var fertility = plants[i] + '.fertility';
              var temperature = plants[i] + '.temperature';
      
              moistureArray.push(moisture);
              if(timer[moisture] == null)
              {
                  timer[moisture] = false;  
              }
              try {
                  if (timer[moisture] && timeouts[moisture]._destroyed)
                  {
                      timeouts[moisture] = setTimeout(function() {boolTimer(moisture)}, 14400000);
                  }            
              }
              catch(err) {
                  if(getState(moisture).val < moistureMin)
                  {
                      timer[moisture] = false;
                  }
      
                  if (timer[moisture])
                  {
                      timeouts[moisture] = setTimeout(function() {boolTimer(moisture)}, 14400000);
                  }  
              }
      
              fertilityArray.push(fertility);
              if(timer[fertility] == null)
              {
                  timer[fertility] = false;  
              }
              try {
                  if (timer[fertility] && timeouts[fertility]._destroyed)
                  {
                      timeouts[fertility] = setTimeout(function() {boolTimer(fertility)}, 14400000);
                  }            
              }
              catch(err) {
                  if(getState(fertility).val < fertilityMin)
                  {
                      timer[fertility] = false;
                  }
      
                  if (timer[fertility])
                  {
                      timeouts[fertility] = setTimeout(function() {boolTimer(fertility)}, 14400000);
                  }  
              }
      
              temperatureArray.push(temperature);
              if(timer[temperature] == null)
              {
                  timer[temperature] = false;  
              }
              try {
                  if (timer[temperature] && timeouts[temperature]._destroyed)
                  {
                      log(temperature);
                      timeouts[temperature] = setTimeout(function() {boolTimer(temperature)}, 14400000);
                  }            
              }
              catch(err) {
                  if(getState(temperature).val < temperatureMin)
                  {
                      timer[temperature] = false;
                  }
                  if (timer[temperature])
                  {              
                      log(temperature);
                      timeouts[temperature] = setTimeout(function() {boolTimer(temperature)}, 14400000);
                  }  
              }
          }
      
          log(timer);
          setState(timerState, {val: timer});
      }
      

      Update: Hab leider festgestellt, dass ich einen kleinen Fehler beim Programmieren gemacht habt und leider manche Timer mehrfach gesetzt werden. Ich teste grade einen Fix dafür und update es, wenn es klappt.

      Update2: Wies aussieht läuft es nun wohl richtig! Auf V2 geupdatet.

      Update3: Nochmal ein paar kleine Fehler gefunden! Auf V2.1 geupdatet.

      Update4: Auf V3 geupdatet.

      posted in JavaScript
      T
      Tictactoo

    Latest posts made by Tictactoo

    • RE: Jarvis V3 - LevelBody Min-Max von Datenpunkt

      @mcu Danke! 👍

      posted in Visualisierung
      T
      Tictactoo
    • Jarvis V3 - LevelBody Min-Max von Datenpunkt

      Hallo zusammen,

      ich hab nach langem Mal wieder versucht mit Jarvis 3.1.2 eine Visualisierung für meine Wohnung auf die Beine zu stellen. Bisher hat das auch recht gut geklappt, aber im Moment stehe ich vor einem kleinen Rätsel.

      Ich habe eine Statelist für meine Thermostate hinzugefügt, die per Zigbee ins Smarthome eingebunden sind. Die Temperatur am Thermostat würde ich gern über einen Regler per LevelBody steuern. In der alten Version von Jarvis, die ich vor Ewigkieten benutzt hab, da hat es die Min-Max aus dem Datenpunkt übernommen, sofern es definiert war. Leider ist das jetzt nicht mehr der Fall. Aktuell zeigt es mir von 0 bis 100 an.

      Hat mir jemand einen Tipp, wie sich das lösen lässt? Danke schon Mal!

      2.PNG 3.PNG 1.PNG 4.PNG

      posted in Visualisierung
      T
      Tictactoo
    • Multi-Host für größere Bluetoothabdeckung?

      Hi zusammen,

      ich hab ne frage bezüglich des Mutlihostings. Ich hab leider das Problem, dass meine Wohnung zu groß ist, um per Bluetooth alles abzudecken. Daraus resultiert, dass leider in Küche und Schlafzimmer meine Pflanzensensoren nicht überwacht werden können. Nun dachte ich mir, dass es ja den Multi-Host-Modus gibt. Weiß jemand, ob es möglich ist eine zweite BLE Instanz auf einem Raspi-Zero zu installieren und diesen dann als Instanz vom Hauptgerät auszulesen, um so quasi an die Daten zu kommen? Entsprechend würde ich natürlich den Raspi-Zero in eine andere Ecke der Wohnung packen, um die fehlden Sensoren abzudecken.

      Beste Grüße
      TicTacToo

      Edit: Habs jetzt einfach mal versucht und es geht. Topic kann also geschlossen werden.

      posted in ioBroker Allgemein
      T
      Tictactoo
    • RE: Alexa-Adapter empfängt keine History mehr

      @apollon77 Bei mir funktioniert es nach der Aktualisierung auf die 3.6.2 wieder, danke!

      posted in Error/Bug
      T
      Tictactoo
    • Alexa-Adapter empfängt keine History mehr
      Systemdata Bitte Ausfüllen
      Hardwaresystem: RaspberryPi 4
      Arbeitsspeicher: 2GB
      Festplattenart: SD-Karte
      Betriebssystem: Raspbian
      Nodejs-Version: 12.20.1
      NPM-Version: 6.14.10

      Abend zusammen,

      seit heute morgen bekomme ich leider keine History mehr über den alexa2.0-Adapter in ioBroker. Ich glaube nicht, dass ich irgendwas gemacht hab, was dazu geführt hat. Die Buttons wie "tellstory" usw funktionieren noch, nur die History wird nicht mehr aktualisiert leider. Der Adapter steht auf grün. Der Log sieht nach dem Neustart des Adapters wie folgt aus:

      2021-02-02 18:20:49.043 - info: host.raspberrypi stopInstance system.adapter.alexa2.0 (force=false, process=true)
      2021-02-02 18:20:49.052 - info: host.raspberrypi stopInstance system.adapter.alexa2.0 send kill signal
      2021-02-02 18:20:49.056 - info: alexa2.0 (1147) Got terminate signal TERMINATE_YOURSELF
      2021-02-02 18:20:49.064 - info: alexa2.0 (1147) terminating
      2021-02-02 18:20:49.066 - info: alexa2.0 (1147) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
      2021-02-02 18:20:49.626 - info: host.raspberrypi instance system.adapter.alexa2.0 terminated with code 11 (ADAPTER_REQUESTED_TERMINATION)
      2021-02-02 18:20:52.126 - info: host.raspberrypi instance system.adapter.alexa2.0 started with pid 31088
      2021-02-02 18:20:53.989 - info: alexa2.0 (31088) starting. Version 3.6.0 in /opt/iobroker/node_modules/iobroker.alexa2, node: v12.20.1, js-controller: 3.1.6
      2021-02-02 18:20:54.753 - info: alexa2.0 (31088) Proxy IP not set, use first network interface (192.168.178.66) instead
      2021-02-02 18:20:59.743 - info: alexa2.0 (31088) Alexa-Push-Connection established. Disable Polling
      2021-02-02 18:21:20.541 - info: alexa2.0 (31088) Subscribing to states...
      

      Ist der Fehler bekannt?

      posted in Error/Bug
      T
      Tictactoo
    • RE: [Aufruf] Welche guten JavaScripts setzt ihr ein?

      Abend zusammen,

      hier noch ein zweites überarbeitetes Skript. Hier haben wir meinen Heizungswächter. Dieser sammelt sich selbst alle 30 Minuten alle Heizungen ("enum.functions.heating") und Fenster-/Türkontakte("enum.functions.window_door_sensor") per enum-Funktion zusammen. Anschließend frägt das Skript ab, ob einer der Kontakte geöffnet/geschlossen wurde.

      Wird ein Fenster/Tür geöffnet, werden alle Thermostate im Raum (per enum-Raum ermittelt) auf 5 Grad gestellt und ihre letzte Temperatur in einem State gespeichert. Werden Türen/Fenster wieder geschlossen, prüft das Skript, ob alle Kontakte im Raum geschlossen sind. Ist das der Fall, werden alle Thermostate wieder auf ihre ursprüngliche Temperatur gestellt.

      //State initalisieren
      if(getState("javascript.0.lastValueThermostate").notExist)
      {
         createState("lastValueThermostate", {type: "object"});
      }
      
      var lastValues = getState("javascript.0.lastValueThermostate").val;
      if(lastValues == null)
      {
         lastValues = {};
      }
      
      //Thermostate und Kontakte initalisieren
      var heatingEnums;
      var thermostate;
      var contact;
      var contactRoom;
      
      getHeatingsAndContacts();
      
      //OnChange Events
      on({id: contact, val: true}, function (obj) {
         var value = obj.state.val;
         var oldValue= obj.oldState.val;
      
         if (value == oldValue)
             return;
      
         var raum = getObject(obj.id, 'rooms').enumIds[0];
         var raumName = getObject(obj.id, 'rooms').enumNames[0].de;
         var devices = thermostate[raum];
      
         if(devices.length < 1)
             return;
      
         for(let i = 0; i < devices.length; i++) {
             var device = devices[i];
      
             if(!getState(device + '.heating_setpnt_current').notExist)
             {
                 if(getState(device + '.heating_setpnt_current').val > 5)
                 {
                     log ("Tür/Fenster geöffnet. Temperatur im " + raumName + " auf 5 Grad gestellt.");
                     lastValues = getState("javascript.0.lastValueThermostate").val;
                     lastValues[device] = getState(device + '.heating_setpnt_current').val;
                     setState("javascript.0.lastValueThermostate", {val: lastValues});
                     setState(device + '.heating_setpnt_current', 5); 
                 }
                 else
                 {
                     log ("2. Tür/Fenster geöffnet. Temperatur im " + raumName + " ist bereits auf 5 Grad gestellt.");
                 }
             }
             else
             {
                 if(getState(device + '.target_temperature').val > 5)
                 {
                     log ("Tür/Fenster geöffnet. Temperatur im " + raumName + " auf 5 Grad gestellt.");
                     lastValues = getState("javascript.0.lastValueThermostate").val;
                     lastValues[device] = getState(device + '.target_temperature').val;
                     setState("javascript.0.lastValueThermostate", {val: lastValues});
                     setState(device + '.target_temperature', 5); 
                 }
                 else
                 {
                     log ("2. Tür/Fenster geöffnet. Temperatur im " + raumName + " ist bereits auf 5 Grad gestellt.");
                 }
             }
         }
      });
      
      on({id: contact, val: false}, function (obj) {
         var value = obj.state.val;
         var oldValue= obj.oldState.val;
      
         if (value == oldValue)
             return;
      
         var raum = getObject(obj.id, 'rooms').enumIds[0];
         var raumName = getObject(obj.id, 'rooms').enumNames[0].de;
         var devices = thermostate[raum];
      
         if(devices < 1)
             return;
      
         var tempOpen = false;
         var tempContacts = contactRoom[raum];
         for(let i = 0; i < tempContacts.length; i++) {
             if(getState(tempContacts[i] + ".opened").val)
                 tempOpen = true;
         }
      
         if(!tempOpen)
         {
             for(let i = 0; i < devices.length; i++) {
                 var device = devices[i];
      
                 log ("Tür/Fenster geschlossen. Temperatur im " + raumName + " auf " + lastValues[device] + " Grad gestellt.");
                 if(!getState(device + '.heating_setpnt_current').notExist)
                 {
                     setState(device + '.heating_setpnt_current', lastValues[device]);
                 }
                 else
                 {
                     setState(device + '.target_temperature', lastValues[device]);
                 }
             }
         } 
         else
         {
             log ("Ein weiteres Tür/Fenster ist noch geöffnet. Temperatur im " + raumName + " bleibt unverändert.");
         }
      });
      
      //Schedule für neue Geräte alle 30 Minuten
      
      schedule("*/30 * * * *", function()
      {
         getHeatingsAndContacts();
      });
      
      //Functions
      
      function getHeatingsAndContacts()
      {
         heatingEnums = getObject("enum.functions.heating").common.members;
         thermostate = {};
         for(let i = 0; i < heatingEnums.length; i++) {
             
             if(thermostate[getObject(heatingEnums[i], 'rooms').enumIds[0]] == null)
             {
                 thermostate[getObject(heatingEnums[i], 'rooms').enumIds[0]] = [];   
             }
      
             thermostate[getObject(heatingEnums[i], 'rooms').enumIds[0]].push(heatingEnums[i]);
         }
      
         contact = getObject("enum.functions.window_door_sensor").common.members;
         contactRoom = {};
         for(let i = 0; i < contact.length; i++) {
      
             if(contactRoom[getObject(contact[i], 'rooms').enumIds[0]] == null)
             {
                 contactRoom[getObject(contact[i], 'rooms').enumIds[0]] = [];   
             }
             contactRoom[getObject(contact[i], 'rooms').enumIds[0]].push(contact[i]);
             contact[i] = contact[i] + ".opened";
         }
      }
      

      Da ich zuvor für jeden Raum ein eigenes Skript hatte, ist der Vorteil für ich hier, die Übersichtlichkeit des einen Skripts. Dadurch, dass der Schedule variabel die neuen Geräte hinzugefügt werden, ist natürlich auch schön, dass man nichts weiter tun muss als sie in Zigbee zu adden. In meinem Fall benutze ich ein Tuya TS0601 und vier Spirit SPZB0001. Entsprechend ist das Skirpt für deren States eingestellt. Per Anpassung des else if Blocks lassen sich theoretisch allerdings noch andere Thermostate ergänzen.

      posted in JavaScript
      T
      Tictactoo
    • RE: [Aufruf] Welche guten JavaScripts setzt ihr ein?

      Hi zusammen,

      ich bin grade dabei meine ganzen Skripte etwas zu überarbeiten und zusammen zu schrumpfen und dachte mir, ich teil das gern mit euch. Als erstes wäre hier mein überarbeitetes Pflanzenskript. Ich hab es mittlerweile eingedampft und ein Skript für alle Planzen zusammen. Der Unterschied zur vorherigen Version ist, dass das Skript sich nun alle Pflanzen selbst sucht, wenn sie der entsprechenden Enum-Funktion("enum.functions.plant") zugeordnet sind. Desweiteren wird immer um 0 Uhr nachts nach neuen Pflanzen gesucht wird. Außerdem werden die aktuellen Timer nun in einem State gespeichert, damit nach einem Reset des Adapters oder des Rechners nicht wieder alle losgehen. Die Namen werden bei diesem Skript aus dem Namen des jeweiligen States übernommen. Bei mir heißt beispielweise eine der Pflanzen "Flower care - Fikus benjamina (Weißer Sensor)". Per replace wird der jeweilige State und das das "Flower care -" entfernt.

      Der einzige Nachteil ist, dass die Feuchtigkeit nicht mehr pro Pflanze gesetzt werden kann, sondern die Werte für alle Pfalnzen gelten. Mir persönlich ist es wurscht, weil 95% aller Pflanzen bei mir die gleiche Feuchtigkeit usw brauchen. Vermutlich könnte man das mit ein paar Kniffen aber auch irgendwie lösen, wenn man es will.

      /////////////////////
      ///   Parameter   ///
      
      var moistureMin = 15;
      var moistureMax = 60;
      
      var fertilityMin = 350;
      var fertilityMax = 2000;
      
      var temperatureMin = 10;
      var temperatureMax = 32;
      
      /*var lightMin = 1500;
      var lightMax = 6000;*/
      
      ////////////////////////////
      ///   Lokale Variablen   ///
      
      var timer = {};
      var timeouts = {};
      
      var moistureArray;
      var fertilityArray;
      var temperatureArray;
      
      var timerState = "javascript.0.plantTimer";
      
      ///////////////////////////////////
      ///   Variablen initalisieren   ///
      
      if(getState(timerState).notExist)
      {
          createState("plantTimer", {type: "object"});
      }
      
      setTimeout(function() {getPlants();}, 1000);
      
      //////////////////////
      ///   Monitoring   ///
      
      setTimeout(function() {
          //Moisture-Check
          on({id: moistureArray, change: "ne"}, function (obj) {
              timer = getState(timerState).val;
      
              if(!timer)
                  return;
      
              if(getState(obj.id).val < moistureMin && !timer[obj.id])
              {
                  var raum = getObject(obj.id, 'rooms').enumNames[0].de;
                  var pflanzenName = getObject(obj.id.replace('.moisture', "")).common.name.replace("Flower care - ", "");
      
                  sendTo('telegram.0', 'Du solltest deinen ' + pflanzenName + ' im ' + raum + ' dringend gießen.');
      
                  timer[obj.id] = true;
                  setState(timerState, {val: timer});
                  timeouts[obj.id] = setTimeout(function() {boolTimer(obj.id)}, 14400000);
              }
          });
      
          //Fertility-Check
          on({id: fertilityArray, change: "ne"}, function (obj) {
              timer = getState(timerState).val;
      
              if(!timer)
                  return;
      
              if(getState(obj.id).val < fertilityMin && !timer[obj.id])
              {
                  var raum = getObject(obj.id, 'rooms').enumNames[0].de;
                  var pflanzenName = getObject(obj.id.replace('.fertility', "")).common.name.replace("Flower care - ", "");
      
                  sendTo('telegram.0', 'Dein ' + pflanzenName + ' im ' + raum + ' könnte etwas Dünger vertragen.');
                  
                  timer[obj.id] = true;
                  setState(timerState, {val: timer});
                  timeouts[obj.id] = setTimeout(function() {boolTimer(obj.id)}, 14400000);
              }
          });
      
      
          //Temprature-Check
          on({id: temperatureArray, change: "ne"}, function (obj) {  
              timer = getState(timerState).val;
      
              if(!timer)
                  return;
      
              if(getState(obj.id).val < temperatureMin && !timer[obj.id])
              {
                  var raum = getObject(obj.id, 'rooms').enumNames[0].de;
                  var pflanzenName = getObject(obj.id.replace('.temperature', "")).common.name.replace("Flower care - ", "");
      
                  sendTo('telegram.0', 'Deinem ' + pflanzenName + ' im ' + raum + ' ist es etwas zu kalt.');
                  
                  timer[obj.id] = true;
                  setState(timerState, {val: timer});
                  timeouts[obj.id] = setTimeout(function() {boolTimer(obj.id)}, 14400000);
              }
          });
      
          schedule("0 0 * * *", function()
          {
              getPlants();
          });
      
      }, 2000);
      
      function boolTimer(id){
          timer = getState(timerState).val;
          timer[id] = false;
          log("Timer: " + id + " wurde zurückgeetzt!");
          setState(timerState, {val: timer});
      }
      
      function getPlants()
      {
          moistureArray = [];
          fertilityArray = [];
          temperatureArray = [];
      
          timer = getState(timerState).val;
      
          if(!timer)
          {
              timer = {};
          }
      
          var plants = getObject("enum.functions.plant").common.members;
          for(let i = 0; i < plants.length; i++) {
              var moisture = plants[i] + '.moisture';
              var fertility = plants[i] + '.fertility';
              var temperature = plants[i] + '.temperature';
      
              moistureArray.push(moisture);
              if(timer[moisture] == null)
              {
                  timer[moisture] = false;  
              }
              try {
                  if (timer[moisture] && timeouts[moisture]._destroyed)
                  {
                      timeouts[moisture] = setTimeout(function() {boolTimer(moisture)}, 14400000);
                  }            
              }
              catch(err) {
                  if(getState(moisture).val < moistureMin)
                  {
                      timer[moisture] = false;
                  }
      
                  if (timer[moisture])
                  {
                      timeouts[moisture] = setTimeout(function() {boolTimer(moisture)}, 14400000);
                  }  
              }
      
              fertilityArray.push(fertility);
              if(timer[fertility] == null)
              {
                  timer[fertility] = false;  
              }
              try {
                  if (timer[fertility] && timeouts[fertility]._destroyed)
                  {
                      timeouts[fertility] = setTimeout(function() {boolTimer(fertility)}, 14400000);
                  }            
              }
              catch(err) {
                  if(getState(fertility).val < fertilityMin)
                  {
                      timer[fertility] = false;
                  }
      
                  if (timer[fertility])
                  {
                      timeouts[fertility] = setTimeout(function() {boolTimer(fertility)}, 14400000);
                  }  
              }
      
              temperatureArray.push(temperature);
              if(timer[temperature] == null)
              {
                  timer[temperature] = false;  
              }
              try {
                  if (timer[temperature] && timeouts[temperature]._destroyed)
                  {
                      log(temperature);
                      timeouts[temperature] = setTimeout(function() {boolTimer(temperature)}, 14400000);
                  }            
              }
              catch(err) {
                  if(getState(temperature).val < temperatureMin)
                  {
                      timer[temperature] = false;
                  }
                  if (timer[temperature])
                  {              
                      log(temperature);
                      timeouts[temperature] = setTimeout(function() {boolTimer(temperature)}, 14400000);
                  }  
              }
          }
      
          log(timer);
          setState(timerState, {val: timer});
      }
      

      Update: Hab leider festgestellt, dass ich einen kleinen Fehler beim Programmieren gemacht habt und leider manche Timer mehrfach gesetzt werden. Ich teste grade einen Fix dafür und update es, wenn es klappt.

      Update2: Wies aussieht läuft es nun wohl richtig! Auf V2 geupdatet.

      Update3: Nochmal ein paar kleine Fehler gefunden! Auf V2.1 geupdatet.

      Update4: Auf V3 geupdatet.

      posted in JavaScript
      T
      Tictactoo
    • RE: [Aufruf] Welche guten JavaScripts setzt ihr ein?

      @tobasium Das Skript liegt im global-Order, denn man im Experternmodus sieht. Das Skirpt besteht nur aus Variablen und den jeweiligen IDs der Zigbeegeräte, die ich den Variablen zugewiesen hab. Sobald das Skript gespeichert ist, kann man die Variablen in jedem anderen Skript abrufen.

      posted in JavaScript
      T
      Tictactoo
    • RE: [Aufruf] Welche guten JavaScripts setzt ihr ein?

      @tobasium Hi, ich hab mir ein gobales Skript angelegt, in der ich alle Geräte eintrage mit ihrer ID, so dass ich gleiche Geräte in verschiedenen Skripten nicht alle von Hand ändern muss. Effektiv kannst du bei sensorID lediglich die ID des Zigbeegeräts angeben ("zigbee.0.XXXX"). Den Raum änderst du einfach in dem du den String umschreibst. Alternativ könnte man auch das Enum des Zigbeegeräts auslesen.

      Hoffe, dass dir das hilft!

      posted in JavaScript
      T
      Tictactoo
    • RE: Nicht zuordenbarer Fehler

      Moin zusammen,

      ich konnte den Fehler mit Hilfe von Arteck lösen, aber ich komm grade beim besten Willen nicht mehr darauf, wie wir das gemacht hatten... Falls es mir wieder einfällt, lasse ich es euch wissen.

      posted in ioBroker Allgemein
      T
      Tictactoo
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo