Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. [Vorlage] Gartenbewässerung mit 4 Ventilen

NEWS

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

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

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

[Vorlage] Gartenbewässerung mit 4 Ventilen

Geplant Angeheftet Gesperrt Verschoben Blockly
415 Beiträge 22 Kommentatoren 80.0k Aufrufe 36 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T tombox

    @Kuddel Sieht gut aus. Könnte man auch in ein Adapter umwandeln? Hast du vor das selber zu machen oder kann man dir dabei helfen?
    Leider ist ein Blockly, gibt es eine gute Lösung das Blockly in javascript umzuwandeln?

    K Offline
    K Offline
    Kuddel
    schrieb am zuletzt editiert von
    #341

    @tombox ein Adapter wäre natürlich wesentlich besser.

    davon habe ich aber überhaupt keine Ahnung.

    @darkiop hat ja schon den Link von meinem github Issue gepostet

    D 1 Antwort Letzte Antwort
    1
    • K Kuddel

      @tombox ein Adapter wäre natürlich wesentlich besser.

      davon habe ich aber überhaupt keine Ahnung.

      @darkiop hat ja schon den Link von meinem github Issue gepostet

      D Offline
      D Offline
      darkiop
      Most Active
      schrieb am zuletzt editiert von
      #342

      @Kuddel Hab heut Abend nochmal die 2.1.0 laufen gelassen zum Bewässern, absolut stabil bisher.

      Proxmox-ioBroker-Redis-HA Doku: https://forum.iobroker.net/topic/47478/dokumentation-einer-proxmox-iobroker-redis-ha-umgebung

      1 Antwort Letzte Antwort
      0
      • T tombox

        @Kuddel Sieht gut aus. Könnte man auch in ein Adapter umwandeln? Hast du vor das selber zu machen oder kann man dir dabei helfen?
        Leider ist ein Blockly, gibt es eine gute Lösung das Blockly in javascript umzuwandeln?

        dslraserD Offline
        dslraserD Offline
        dslraser
        Forum Testing Most Active
        schrieb am zuletzt editiert von dslraser
        #343

        @tombox sagte in [Vorlage] Gartenbewässerung mit 4 Ventilen:

        Leider ist ein Blockly, gibt es eine gute Lösung das Blockly in javascript umzuwandeln?

        umwandeln kannst Du es doch selbst im Javascript Adapter.

        var vars_pfad, vars_aktor_typ, vars_aktor_name, vars_sonnenaufgang, vars_sonoff_ip, vars_sonnenuntergang, vars_morgens_verzoegerung_sonnenaufgang, vars_abends_verzoegerung_sonnenuntergang, vars_pumpe, startzeit_sonnenaufgang, vars_notify_mail, startzeit_sonnenaufgang_stunde, vars_bewaesserung_aktiv, vars_notify_alexa, startzeit_sonnenaufgang_minute, vars_notify_alexa_device, vars_feste_startzeit_1_uhrzeit_start_stunde, vars_feste_startzeit_1_uhrzeit_start_minute, vars_feste_startzeit_2_uhrzeit_start_stunde, vars_feste_startzeit_2_uhrzeit_start_minute, vars_feste_startzeit_3_uhrzeit_start_stunde, vars_feste_startzeit_3_uhrzeit_start_minute, timeout, vars_notify_pushover, vars_notify_log, vars_morgens_uhrzeit_start_stunde, vars_bewaesserung_pause, vars_wetter_max_temp, vars_morgens_urhzeit_start_minute, morgens, vars_schwellwert_temperatur, vars_ventil_1, vars_ventil_2, vars_ventil_3, vars_ventil_4, vars_ventil_1_dauer, vars_ventil_2_dauer, vars_ventil_3_dauer, vars_ventil_4_dauer, vars_wetter_regen, info_enduhrzeit_raw, vars_schwellwert_regen, abends, info_endzeit_stunde, vars_morgens_uhrzeit_start, info_endzeit_minute, vars_ventil_1_ende, startzeit_sonnenuntergang, vars_restlautzeit_in_sek, info_endzeit_sekunde, ventil_enduhrzeit_raw, vars_ventil_2_ende, ventil_1_dauer, vars_ventil_1_aktor, vars_ventil_2_aktor, vars_ventil_3_aktor, vars_ventil_4_aktor, startzeit_sonnenuntergang_stunde, vars_morgens_aktiv, startzeit_fix_stunde, ventil_enduhrzeit_std, vars_ventil_3_ende, vars_ventil_1_restzeit, waitmail2, vars_bewaesserung_automatik, startzeit_sonnenuntergang_minute, vars_abends_uhrzeit_start_stunde, vars_abends_uhrzeit_start_minute, startzeit_fix_minute, ventil_enduhrzeit_min, vars_ventil_4_ende, vars_ventil_1_restzeit_in_sek, vars_laufzeit_gesamt_in_sek, vars_feste_startzeit_1_uhrzeit_start, ventil_enduhrzeit_sek, ventil_enduhrzeit_verzoegerung, vars_anzahl_aktive_ventile, vars_abends_aktiv, fix_1, ventil_2_dauer, restlaufzeit_vis_min, info_endzeit_aktive_ventile, vars_ventil_2_restzeit, ventil_3_dauer, ventil_4_dauer, restlaufzeit_vis_sek, vars_lautzeit_ende_uhrzeit, vars_ventil_2_restzeit_in_sek, vars_aktives_ventil, vars_restlautzeit, startzeit_fix_2_stunde, vars_ventil_1_name, info_text, restzeit, startzeit_fix_2_minunte, vars_ventil_2_name, info_betreff, vars_feste_startzeit_2_uhrzeit_start, vars_ventil_3_restzeit, vars_ventil_3_name, vars_abends_uhrzeit_start, vars_feste_startzeit_1_aktiv, fix_2, vars_ventil_3_restzeit_in_sek, vars_ventil_4_name, restzeit_gesamt_min, restzeit_gesamt_sek, vars_ventil_1_aktor_ontime, vars_ventil_4_restzeit_in_sek, ventil_1_rest, startzeit_fix_3_stunde, vars_ventil_4_restzeit, vars_ventil_2_aktor_ontime, startzeit_fix_3_minute, ventil_2_rest, vars_feste_startzeit_3_uhrzeit_start, vars_ventil_3_aktor_ontime, vars_feste_startzeit_2_aktiv, fix_3, restzeit_ventil_min, ventil_3_rest, restzeit_ventil_sek, vars_ventil_4_aktor_ontime, ventil_4_rest, vars_feste_startzeit_3_aktiv;
        
        /**
        * Datenpunkte erstellen.Einmalig ausführen!
        */
        function Datenpunkte_erstellen() {
           /**
            * Create states under 0_userdata.0 or javascript.x
            * Current Version:     https://github.com/Mic-M/iobroker.createUserStates
            * Support:             https://forum.iobroker.net/topic/26839/
            * Autor:               Mic (ioBroker) | Mic-M (github)
            * Version:             1.1 (26 January 2020)
            * Example:             see https://github.com/Mic-M/iobroker.createUserStates#beispiel
            * -----------------------------------------------
            * PLEASE NOTE: Per https://github.com/ioBroker/ioBroker.javascript/issues/474, the used function setObject()
            *              executes the callback PRIOR to completing the state creation. Therefore, we use a setTimeout and counter.
            * -----------------------------------------------
            * @param {string} where          Where to create the state: '0_userdata.0' or 'javascript.x'.
            * @param {boolean} force         Force state creation (overwrite), if state is existing.
            * @param {array} statesToCreate  State(s) to create. single array or array of arrays
            * @param {object} [callback]     Optional: a callback function -- This provided function will be executed after all states are created.
            */
        
           /**
           * Hier bitte den Speicherort,den Pfad eintragen und den Namen der Kreise eingeben
           * Beispiele:
        
           	speicherort = '0_userdata.0.'
           	speicherort = 'javascript.0'
        
           	pfad = 'bewasserung.'
           	pfad = 'Gardena.Bewaesserung.'
        
               kreis1 = 'Hecke'
               kreis2 = 'Rasen'
        
           */
           speicherort = 'javascript.0'
           pfad = 'bewaesserung.'
           kreis1 = 'Hecke'
           kreis2 = 'Rasen'
           kreis3 = 'Beet'
           kreis4 = 'kl. Rasen'
        
        
           function createUserStates(where, force, statesToCreate, callback = undefined) {
        
               const WARN = false; // Only for 0_userdata.0: Throws warning in log, if state is already existing and force=false. Default is false, so no warning in log, if state exists.
               const LOG_DEBUG = false; // To debug this function, set to true
               // Per issue #474 (https://github.com/ioBroker/ioBroker.javascript/issues/474), the used function setObject() executes the callback
               // before the state is actual created. Therefore, we use a setTimeout and counter as a workaround.
               const DELAY = 50; // Delay in milliseconds (ms). Increase this to 100, if it is not working.
        
               // Validate "where"
               if (where.endsWith('.')) where = where.slice(0, -1); // Remove trailing dot
               if ( (where.match(/^((javascript\.([1-9][0-9]|[0-9]))$|0_userdata\.0$)/) == null) ) {
                   log('This script does not support to create states under [' + where + ']', 'error');
                   return;
               }
        
               // Prepare "statesToCreate" since we also allow a single state to create
               if(!Array.isArray(statesToCreate[0])) statesToCreate = [statesToCreate]; // wrap into array, if just one array and not inside an array
        
               // Add "where" to STATES_TO_CREATE
               for (let i = 0; i < statesToCreate.length; i++) {
                   let lpPath = statesToCreate[i][0].replace(/\.*\./g, '.'); // replace all multiple dots like '..', '...' with a single '.'
                   lpPath = lpPath.replace(/^((javascript\.([1-9][0-9]|[0-9])\.)|0_userdata\.0\.)/,'') // remove any javascript.x. / 0_userdata.0. from beginning
                   lpPath = where + '.' + lpPath; // add where to beginning of string
                   statesToCreate[i][0] = lpPath;
               }
        
               if (where != '0_userdata.0') {
                   // Create States under javascript.x
                   let numStates = statesToCreate.length;
                   statesToCreate.forEach(function(loopParam) {
                       if (LOG_DEBUG) log('[Debug] Now we are creating new state [' + loopParam[0] + ']');
                       let loopInit = (loopParam[1]['def'] == undefined) ? null : loopParam[1]['def']; // mimic same behavior as createState if no init value is provided
                       createState(loopParam[0], loopInit, force, loopParam[1], function() {
                           numStates--;
                           if (numStates === 0) {
                               if (LOG_DEBUG) log('[Debug] All states processed.');
                               if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                   if (LOG_DEBUG) log('[Debug] Function to callback parameter was provided');
                                   return callback();
                               } else {
                                   return;
                               }
                           }
                       });
                   });
               } else {
                   // Create States under 0_userdata.0
                   let numStates = statesToCreate.length;
                   let counter = -1;
                   statesToCreate.forEach(function(loopParam) {
                       counter += 1;
                       if (LOG_DEBUG) log ('[Debug] Currently processing following state: [' + loopParam[0] + ']');
                       if( ($(loopParam[0]).length > 0) && (existsState(loopParam[0])) ) { // Workaround due to https://github.com/ioBroker/ioBroker.javascript/issues/478
                           // State is existing.
                           if (WARN && !force) log('State [' + loopParam[0] + '] is already existing and will no longer be created.', 'warn');
                           if (!WARN && LOG_DEBUG) log('[Debug] State [' + loopParam[0] + '] is already existing. Option force (=overwrite) is set to [' + force + '].');
                           if(!force) {
                               // State exists and shall not be overwritten since force=false
                               // So, we do not proceed.
                               numStates--;
                               if (numStates === 0) {
                                   if (LOG_DEBUG) log('[Debug] All states successfully processed!');
                                   if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                       if (LOG_DEBUG) log('[Debug] An optional callback function was provided, which we are going to execute now.');
                                       return callback();
                                   }
                               } else {
                                   // We need to go out and continue with next element in loop.
                                   return; // https://stackoverflow.com/questions/18452920/continue-in-cursor-foreach
                               }
                           } // if(!force)
                       }
        
                       // State is not existing or force = true, so we are continuing to create the state through setObject().
                       let obj = {};
                       obj.type = 'state';
                       obj.native = {};
                       obj.common = loopParam[1];
                       setObject(loopParam[0], obj, function (err) {
                           if (err) {
                               log('Cannot write object for state [' + loopParam[0] + ']: ' + err);
                           } else {
                               if (LOG_DEBUG) log('[Debug] Now we are creating new state [' + loopParam[0] + ']')
                               let init = null;
                               if(loopParam[1].def === undefined) {
                                   if(loopParam[1].type === 'number') init = 0;
                                   if(loopParam[1].type === 'boolean') init = false;
                                   if(loopParam[1].type === 'string') init = '';
                               } else {
                                   init = loopParam[1].def;
                               }
                               setTimeout(function() {
                                   setState(loopParam[0], init, true, function() {
                                       if (LOG_DEBUG) log('[Debug] setState durchgeführt: ' + loopParam[0]);
                                       numStates--;
                                       if (numStates === 0) {
                                           if (LOG_DEBUG) log('[Debug] All states processed.');
                                           if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                               if (LOG_DEBUG) log('[Debug] Function to callback parameter was provided');
                                               return callback();
                                           }
                                       }
                                   });
                               }, DELAY + (20 * counter) );
                           }
                       });
                   });
               }
           }
        
           let statesToCreate = [
        
              //Bewässerung
              [pfad+'bewaesserung_aktiv', {'name':'bewaesserung_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'bewaesserung_automatik', {'name':'bewaesserung_automatik','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'bewaesserung_pause', {'name':'bewaesserung_pause','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
        
              //Timer
              [pfad+'lautzeit_gesamt_in_sek', {'name':'lautzeit_gesamt_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
              [pfad+'lautzeit_ende_uhrzeit', {'name':'lautzeit_ende_uhrzeit','type':'string','read':true,'write':true,'role':'string','def': '00:00','unit': 'Uhr'}],
              [pfad+'restlautzeit', {'name':'restlautzeit','type': 'string','read':true,'write':true,'role':'string','def':0,'unit':'Minuten'}],
              [pfad+'restlautzeit_in_sek', {'name':'restlautzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
        
              //Ventile
              [pfad+'ventile.aktives_ventil', {'name': 'aktives_ventil','type':'string','read':true,'write':true,'role':'string','def':'aus'}],
              [pfad+'ventile.anzahl_aktive_ventile', {'name':'anzahl_aktive_ventile','type':'number','read':true,'write':true,'role':'number','def':0,'min':0, 'max':4} ],
        
              //Ventil 1
              [pfad+'ventile.ventil_1.ventil_1', {'name':'ventil_1','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'ventile.ventil_1.ventil_1_dauer', {'name': 'ventil_1_dauer','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
              [pfad+'ventile.ventil_1.ventil_1_ende', {'name':'ventil_1_ende','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'ventile.ventil_1.ventil_1_name', {'name':'ventil_1_name','type':'string','read':true,'write':true,'role':'string','def':kreis1}],
              [pfad+'ventile.ventil_1.ventil_1_restzeit', {'name':'ventil_1_restzeit','type': 'string','read':true,'write':true,'role':'string','def':'0:00','unit':'Minuten'}],
              [pfad+'ventile.ventil_1.ventil_1_restzeit_in_sek', {'name':'ventil_1_restzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
        
              //Ventil 2
              [pfad+'ventile.ventil_2.ventil_2', {'name':'ventil_2','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'ventile.ventil_2.ventil_2_dauer', {'name': 'ventil_2_dauer','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
              [pfad+'ventile.ventil_2.ventil_2_ende', {'name':'ventil_2_ende','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'ventile.ventil_2.ventil_2_name', {'name':'ventil_2_name','type':'string','read':true,'write':true,'role':'string','def':kreis2}],
              [pfad+'ventile.ventil_2.ventil_2_restzeit', {'name':'ventil_2_restzeit','type': 'string','read':true,'write':true,'role':'string','def':'0:00','unit':'Minuten'}],
              [pfad+'ventile.ventil_2.ventil_2_restzeit_in_sek', {'name':'ventil_2_restzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
        
              //Ventil 3
              [pfad+'ventile.ventil_3.ventil_3', {'name':'ventil_3','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'ventile.ventil_3.ventil_3_dauer', {'name': 'ventil_3_dauer','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
              [pfad+'ventile.ventil_3.ventil_3_ende', {'name':'ventil_3_ende','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'ventile.ventil_3.ventil_3_name', {'name':'ventil_3_name','type':'string','read':true,'write':true,'role':'string','def':kreis3}],
              [pfad+'ventile.ventil_3.ventil_3_restzeit', {'name':'ventil_3_restzeit','type': 'string','read':true,'write':true,'role':'string','def':'0:00','unit':'Minuten'}],
              [pfad+'ventile.ventil_3.ventil_3_restzeit_in_sek', {'name':'ventil_3_restzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
        
              //Ventil 4
              [pfad+'ventile.ventil_4.ventil_4', {'name':'ventil_4','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'ventile.ventil_4.ventil_4_dauer', {'name': 'ventil_4_dauer','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
              [pfad+'ventile.ventil_4.ventil_4_ende', {'name':'ventil_4_ende','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'ventile.ventil_4.ventil_4_name', {'name':'ventil_4_name','type':'string','read':true,'write':true,'role':'string','def':kreis4}],
              [pfad+'ventile.ventil_4.ventil_4_restzeit', {'name':'ventil_4_restzeit','type': 'string','read':true,'write':true,'role':'string','def':'0:00','unit':'Minuten'}],
              [pfad+'ventile.ventil_4.ventil_4_restzeit_in_sek', {'name':'ventil_4_restzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
        
              //Zeitplan
              [pfad+'zeitplan.sonnenaufgang', {'name':'sonnenaufgang','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'zeitplan.sonnenuntergang', {'name':'sonnenuntergang','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              //Morgens
              [pfad+'zeitplan.morgens_aktiv', {'name':'morgens_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'zeitplan.morgens_uhrzeit_start', {'name':'morgens_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'zeitplan.morgens_uhrzeit_start_stunde', {'name':'morgens_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':'0'}],
              [pfad+'zeitplan.morgens_uhrzeit_start_minute', {'name':'morgens_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':'0'}],
              [pfad+'zeitplan.morgens_verzoegerung_sonnenaufgang', {'name':'morgens_verzoegerung_sonnenaufgang','type': 'string','read':true,'write':true,'role':'string','def':0,'unit':'Minuten'}],
        
              //Abends
              [pfad+'zeitplan.abends_aktiv', {'name':'abends_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'zeitplan.abends_uhrzeit_start', {'name':'abends_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'zeitplan.abends_uhrzeit_start_stunde', {'name':'abends_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':'0'}],
              [pfad+'zeitplan.abends_uhrzeit_start_minute', {'name':'abends_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':'0'}],
              [pfad+'zeitplan.abends_verzoegerung_sonnenuntergang', {'name':'abends_verzoegerung_sonnenuntergang','type': 'string','read':true,'write':true,'role':'string','def':0,'unit':'Minuten'}],
        
              //Feste Startzeit 1
              [pfad+'zeitplan.feste_startzeit_1_aktiv', {'name':'feste_startzeit_1_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'zeitplan.feste_startzeit_1_uhrzeit_start', {'name':'feste_startzeit_1_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'zeitplan.feste_startzeit_1_uhrzeit_start_stunde', {'name':'feste_startzeit_1_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':0}],
              [pfad+'zeitplan.feste_startzeit_1_uhrzeit_start_minute', {'name':'feste_startzeit_1_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':0}],
        
              //Feste Startzeit 2
              [pfad+'zeitplan.feste_startzeit_2_aktiv', {'name':'feste_startzeit_2_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'zeitplan.feste_startzeit_2_uhrzeit_start', {'name':'feste_startzeit_2_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'zeitplan.feste_startzeit_2_uhrzeit_start_stunde', {'name':'feste_startzeit_2_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':0}],
              [pfad+'zeitplan.feste_startzeit_2_uhrzeit_start_minute', {'name':'feste_startzeit_2_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':0}],
        
              //Feste Startzeit 3
              [pfad+'zeitplan.feste_startzeit_3_aktiv', {'name':'feste_startzeit_3_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
              [pfad+'zeitplan.feste_startzeit_3_uhrzeit_start', {'name':'feste_startzeit_3_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
              [pfad+'zeitplan.feste_startzeit_3_uhrzeit_start_stunde', {'name':'feste_startzeit_3_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':0}],
              [pfad+'zeitplan.feste_startzeit_3_uhrzeit_start_minute', {'name':'feste_startzeit_3_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':0}],
           ];
               createUserStates(speicherort, false, statesToCreate);
        }
        
        /**
        * Beschreibe diese Funktion …
        */
        function Variablen_definieren() {
         // --- Die folgenden Variablen bitte anpassen ---
         // Bitte hier den Speicheroprt angeben.z.B.javascript.0.bewasserung0_userdata.0.Garten.Bewasserung
         vars_pfad = 'javascript.0.bewaesserung.';
         // Mögliche Werte:hm = Homematic Aktorsonoff = Sonoff Aktor
         vars_aktor_typ = 'hm';
         // Hier bitte dem Namen des Aktor eintragen.hm-rpc.0.QEQ12345678sonoff.0.Bewaesserung
         vars_aktor_name = 'hm-rpc.0.QEQ0661312';
         // Nur notendig wenn ein Sonoff Aktor verwendet wird.Bitte die IP vom aktor eintragen
         vars_sonoff_ip = '192.168.4.110';
         // Pfad zum STATE um die Pumpe zu aktivieren.Falls
         // nicht notwensig, einfach das Feld leer lassen.
         vars_pumpe = '';
         // Soll per Mail über Start und Stop informiert werden?Mögliche Werte:truefalse
         vars_notify_mail = true;
         // Soll per Alexa über Start und Stop informiert werden?Mögliche Werte:truefalse
         vars_notify_alexa = false;
         // Hier bitte den State vom Alexa Device Eintragen:Beispiel:alexa2.0.Echo-Devices.ABCDEFGHIJK.Commands.announcement
         vars_notify_alexa_device = 'javascript.0.echo.sprachausgabe_alle_geraete';
         // Soll per Pushover über Start und Stop informiert werden?Mögliche Werte:truefalse
         vars_notify_pushover = false;
         // Sollen bei Start und Stop Log-Einträge generiert werden ?Mögliche Werte:truefalse
         vars_notify_log = false;
         // Wettervorhersage: Tagehöchstwertz.B.:
         // daswetter.0.NextDays.Location_1.Day_1.Maximale_Temperatur_valuefalse,
         // wenn keine Werte verwendet werden können
         vars_wetter_max_temp = 'daswetter.0.NextDays.Location_1.Day_1.Maximale_Temperatur_value';
         // Hier bitte den Schwellwerte der Temepratur eingeben, ab wann in der
         // Automatik beregnet werden soll.z.B.: 24 fuer groesser/gleich 24°C
         vars_schwellwert_temperatur = 0;
         // Wettervorhersage: erwartete Regenmengez.B.:daswetter.0.NextDaysDetailed.Location_1.Day_1.rain_valuefalse, wenn keine Werte verwendet werden koennen
         vars_wetter_regen = 'daswetter.0.NextDaysDetailed.Location_1.Day_1.rain_value';
         // Hier bitte den Schwellwerte der maximalen Regenmenge eingeben,
         // bis wann die Automatik beregnen soll.z.B.: 0.5 fuer 0.5mm
         vars_schwellwert_regen = 0;
         // --- Ab hier nichts mehr aendern ---
         // Bewaesserung
         vars_bewaesserung_aktiv = String(vars_pfad) + 'bewaesserung_aktiv';
         vars_bewaesserung_automatik = String(vars_pfad) + 'bewaesserung_automatik';
         vars_bewaesserung_pause = String(vars_pfad) + 'bewaesserung_pause';
         // Laufzeit
         vars_laufzeit_gesamt_in_sek = String(vars_pfad) + 'lautzeit_gesamt_in_sek';
         vars_lautzeit_ende_uhrzeit = String(vars_pfad) + 'lautzeit_ende_uhrzeit';
         vars_restlautzeit = String(vars_pfad) + 'restlautzeit';
         vars_restlautzeit_in_sek = String(vars_pfad) + 'restlautzeit_in_sek';
         // Ventile
         if (vars_aktor_typ == 'hm') {
           vars_ventil_1_aktor = String(vars_aktor_name) + '.1.STATE';
           vars_ventil_1_aktor_ontime = String(vars_aktor_name) + '.1.ON_TIME';
           vars_ventil_2_aktor = String(vars_aktor_name) + '.2.STATE';
           vars_ventil_2_aktor_ontime = String(vars_aktor_name) + '.2.ON_TIME';
           vars_ventil_3_aktor = String(vars_aktor_name) + '.3.STATE';
           vars_ventil_3_aktor_ontime = String(vars_aktor_name) + '.3.ON_TIME';
           vars_ventil_4_aktor = String(vars_aktor_name) + '.4.STATE';
           vars_ventil_4_aktor_ontime = String(vars_aktor_name) + '.4.ON_TIME';
         }
         if (vars_aktor_typ == 'sonoff') {
           vars_ventil_1_aktor = String(vars_aktor_name) + '.POWER1';
           vars_ventil_2_aktor = String(vars_aktor_name) + '.POWER2';
           vars_ventil_3_aktor = String(vars_aktor_name) + '.POWER3';
           vars_ventil_4_aktor = String(vars_aktor_name) + '.POWER4';
         }
         vars_aktives_ventil = String(vars_pfad) + 'ventile.aktives_ventil';
         vars_anzahl_aktive_ventile = String(vars_pfad) + 'ventile.anzahl_aktive_ventile';
         //   Ventil 1
         vars_ventil_1 = String(vars_pfad) + 'ventile.ventil_1.ventil_1';
         vars_ventil_1_dauer = String(vars_pfad) + 'ventile.ventil_1.ventil_1_dauer';
         vars_ventil_1_ende = String(vars_pfad) + 'ventile.ventil_1.ventil_1_ende';
         vars_ventil_1_name = String(vars_pfad) + 'ventile.ventil_1.ventil_1_name';
         vars_ventil_1_restzeit = String(vars_pfad) + 'ventile.ventil_1.ventil_1_restzeit';
         vars_ventil_1_restzeit_in_sek = String(vars_pfad) + 'ventile.ventil_1.ventil_1_restzeit_in_sek';
         //   Ventil 2
         vars_ventil_2 = String(vars_pfad) + 'ventile.ventil_2.ventil_2';
         vars_ventil_2_dauer = String(vars_pfad) + 'ventile.ventil_2.ventil_2_dauer';
         vars_ventil_2_ende = String(vars_pfad) + 'ventile.ventil_2.ventil_2_ende';
         vars_ventil_2_name = String(vars_pfad) + 'ventile.ventil_2.ventil_2_name';
         vars_ventil_2_restzeit = String(vars_pfad) + 'ventile.ventil_2.ventil_2_restzeit';
         vars_ventil_2_restzeit_in_sek = String(vars_pfad) + 'ventile.ventil_2.ventil_2_restzeit_in_sek';
         //   Ventil 3
         vars_ventil_3 = String(vars_pfad) + 'ventile.ventil_3.ventil_3';
         vars_ventil_3_dauer = String(vars_pfad) + 'ventile.ventil_3.ventil_3_dauer';
         vars_ventil_3_ende = String(vars_pfad) + 'ventile.ventil_3.ventil_3_ende';
         vars_ventil_3_name = String(vars_pfad) + 'ventile.ventil_3.ventil_3_name';
         vars_ventil_3_restzeit = String(vars_pfad) + 'ventile.ventil_3.ventil_3_restzeit';
         vars_ventil_3_restzeit_in_sek = String(vars_pfad) + 'ventile.ventil_3.ventil_3_restzeit_in_sek';
         //   Ventil 4
         vars_ventil_4 = String(vars_pfad) + 'ventile.ventil_4.ventil_4';
         vars_ventil_4_dauer = String(vars_pfad) + 'ventile.ventil_4.ventil_4_dauer';
         vars_ventil_4_ende = String(vars_pfad) + 'ventile.ventil_4.ventil_4_ende';
         vars_ventil_4_name = String(vars_pfad) + 'ventile.ventil_4.ventil_4_name';
         vars_ventil_4_restzeit = String(vars_pfad) + 'ventile.ventil_4.ventil_4_restzeit';
         vars_ventil_4_restzeit_in_sek = String(vars_pfad) + 'ventile.ventil_4.ventil_4_restzeit_in_sek';
         // Zeitplan
         vars_sonnenaufgang = String(vars_pfad) + 'zeitplan.sonnenaufgang';
         vars_sonnenuntergang = String(vars_pfad) + 'zeitplan.sonnenuntergang';
         //   Morgens
         vars_morgens_aktiv = String(vars_pfad) + 'zeitplan.morgens_aktiv';
         vars_morgens_uhrzeit_start = String(vars_pfad) + 'zeitplan.morgens_uhrzeit_start';
         vars_morgens_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.morgens_uhrzeit_start_stunde';
         vars_morgens_urhzeit_start_minute = String(vars_pfad) + 'zeitplan.morgens_uhrzeit_start_minute';
         vars_morgens_verzoegerung_sonnenaufgang = String(vars_pfad) + 'zeitplan.morgens_verzoegerung_sonnenaufgang';
         //   Abends
         vars_abends_aktiv = String(vars_pfad) + 'zeitplan.abends_aktiv';
         vars_abends_uhrzeit_start = String(vars_pfad) + 'zeitplan.abends_uhrzeit_start';
         vars_abends_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.abends_uhrzeit_start_stunde';
         vars_abends_uhrzeit_start_minute = String(vars_pfad) + 'zeitplan.abends_uhrzeit_start_minute';
         vars_abends_verzoegerung_sonnenuntergang = String(vars_pfad) + 'zeitplan.abends_verzoegerung_sonnenuntergang';
         //   Feste Startzeit 1
         vars_feste_startzeit_1_aktiv = String(vars_pfad) + 'zeitplan.feste_startzeit_1_aktiv';
         vars_feste_startzeit_1_uhrzeit_start = String(vars_pfad) + 'zeitplan.feste_startzeit_1_uhrzeit_start';
         vars_feste_startzeit_1_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.feste_startzeit_1_uhrzeit_start_stunde';
         vars_feste_startzeit_1_uhrzeit_start_minute = String(vars_pfad) + 'zeitplan.feste_startzeit_1_uhrzeit_start_minute';
         // Feste Startzeit 2
         vars_feste_startzeit_2_aktiv = String(vars_pfad) + 'zeitplan.feste_startzeit_2_aktiv';
         vars_feste_startzeit_2_uhrzeit_start = String(vars_pfad) + 'zeitplan.feste_startzeit_2_uhrzeit_start';
         vars_feste_startzeit_2_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.feste_startzeit_2_uhrzeit_start_stunde';
         vars_feste_startzeit_2_uhrzeit_start_minute = String(vars_pfad) + 'zeitplan.feste_startzeit_2_uhrzeit_start_minute';
         // Feste Startzeit 3
         vars_feste_startzeit_3_aktiv = String(vars_pfad) + 'zeitplan.feste_startzeit_3_aktiv';
         vars_feste_startzeit_3_uhrzeit_start = String(vars_pfad) + 'zeitplan.feste_startzeit_3_uhrzeit_start';
         vars_feste_startzeit_3_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.feste_startzeit_3_uhrzeit_start_stunde';
         vars_feste_startzeit_3_uhrzeit_start_minute = String(vars_pfad) + 'zeitplan.feste_startzeit_3_uhrzeit_start_minute';
        }
        
        
        Variablen_definieren();
        // Sonnenauf- und Sonnenuntergang
        schedule("10 0,12 * * *", function () {
         setStateDelayed(vars_sonnenaufgang, ('' + formatDate(getDateObject(getAstroDate("sunrise", undefined, 0)), "hh:mm")), true, parseInt(0, 10), false);
         setStateDelayed(vars_sonnenuntergang, ('' + formatDate(getDateObject(getAstroDate("sunset", undefined, 0)), "hh:mm")), true, parseInt(0, 10), false);
        });
        // Startzeit fuer Automatik berechnen
        on({id: new RegExp(vars_morgens_verzoegerung_sonnenaufgang + "|" + vars_abends_verzoegerung_sonnenuntergang + "|" + vars_sonnenaufgang + "|" + vars_sonnenuntergang), change: "ne"}, function (obj) {
           // Morgens
         startzeit_sonnenaufgang = (function () {var v = getDateObject(getAstroDate("sunrise", undefined, 0)); return v.getHours() * 60 + v.getMinutes();})() + parseFloat(getState(vars_morgens_verzoegerung_sonnenaufgang).val);
         startzeit_sonnenaufgang_stunde = Math.floor(startzeit_sonnenaufgang / 60);
         startzeit_sonnenaufgang_minute = startzeit_sonnenaufgang - startzeit_sonnenaufgang_stunde * 60;
         // Stunde und Minute in Objekt fuer cron
         setStateDelayed(vars_morgens_uhrzeit_start_stunde, ('' + startzeit_sonnenaufgang_stunde), true, parseInt(0, 10), false);
         setStateDelayed(vars_morgens_urhzeit_start_minute, ('' + startzeit_sonnenaufgang_minute), true, parseInt(0, 10), false);
         // Uhrzeit fuer VIS
         if (startzeit_sonnenaufgang_stunde < 10) {
           startzeit_sonnenaufgang_stunde = '0' + String(startzeit_sonnenaufgang_stunde);
         }
         if (startzeit_sonnenaufgang_minute < 10) {
           startzeit_sonnenaufgang_minute = '0' + String(startzeit_sonnenaufgang_minute);
         }
         setStateDelayed(vars_morgens_uhrzeit_start, ([startzeit_sonnenaufgang_stunde,':',startzeit_sonnenaufgang_minute].join('')), true, parseInt(0, 10), false);
         // Abends
         startzeit_sonnenuntergang = (function () {var v = getDateObject(getAstroDate("sunset", undefined, 0)); return v.getHours() * 60 + v.getMinutes();})() + parseFloat(getState(vars_abends_verzoegerung_sonnenuntergang).val);
         startzeit_sonnenuntergang_stunde = Math.floor(startzeit_sonnenuntergang / 60);
         startzeit_sonnenuntergang_minute = startzeit_sonnenuntergang - startzeit_sonnenuntergang_stunde * 60;
         // Stunde und Minute in Objekt fuer cron
         setStateDelayed(vars_abends_uhrzeit_start_stunde, ('' + startzeit_sonnenuntergang_stunde), true, parseInt(0, 10), false);
         setStateDelayed(vars_abends_uhrzeit_start_minute, ('' + startzeit_sonnenuntergang_minute), true, parseInt(0, 10), false);
         // Uhrzeit fuer VIS
         if (startzeit_sonnenuntergang_stunde < 10) {
           startzeit_sonnenuntergang_stunde = '0' + String(startzeit_sonnenuntergang_stunde);
         }
         if (startzeit_sonnenuntergang_minute < 10) {
           startzeit_sonnenuntergang_minute = '0' + String(startzeit_sonnenuntergang_minute);
         }
         setStateDelayed(vars_abends_uhrzeit_start, ([startzeit_sonnenuntergang_stunde,':',startzeit_sonnenuntergang_minute].join('')), true, parseInt(0, 10), false);
        });
        // Pumpe einschalten
        on({id: vars_bewaesserung_aktiv, change: "ne"}, function (obj) {
         var value = obj.state.val;
         var oldValue = obj.oldState.val;
         if (getState(vars_bewaesserung_aktiv).val == true && vars_pumpe != '') {
           if (getState(vars_pumpe).val == false) {
             setStateDelayed(vars_pumpe, true, false, parseInt(0, 10), false);
           }
         } else if (getState(vars_bewaesserung_aktiv).val == false && vars_pumpe != '') {
           if (getState(vars_pumpe).val == true) {
             setStateDelayed(vars_pumpe, false, false, parseInt(0, 10), false);
           }
         }
        });
        // Bewaesserung autom. starten
        on({id: new RegExp(vars_morgens_verzoegerung_sonnenaufgang + "|" + vars_abends_verzoegerung_sonnenuntergang + "|" + vars_feste_startzeit_1_uhrzeit_start_stunde + "|" + vars_feste_startzeit_1_uhrzeit_start_minute + "|" + vars_feste_startzeit_2_uhrzeit_start_stunde + "|" + vars_feste_startzeit_2_uhrzeit_start_minute + "|" + vars_feste_startzeit_3_uhrzeit_start_stunde + "|" + vars_feste_startzeit_3_uhrzeit_start_minute + "|" + vars_sonnenaufgang), change: "ne"}, function (obj) {
           timeout = setTimeout(function () {
           // Morgens
           (function () {if (morgens) {clearSchedule(morgens); morgens = null;}})();
           morgens = schedule(('' + getState(vars_morgens_urhzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_morgens_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
             if (getState(vars_morgens_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == true && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
               setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
             }
           });
           // Abends
           (function () {if (abends) {clearSchedule(abends); abends = null;}})();
           abends = schedule(('' + getState(vars_abends_uhrzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_abends_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
             if (getState(vars_abends_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == true && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
               setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
             }
           });
           // Feste Uhrzeit 1
           if (getState(vars_feste_startzeit_1_uhrzeit_start_stunde).val < '10') {
             startzeit_fix_stunde = '0' + String(getState(vars_feste_startzeit_1_uhrzeit_start_stunde).val);
           } else {
             startzeit_fix_stunde = getState(vars_feste_startzeit_1_uhrzeit_start_stunde).val;
           }
           if (getState(vars_feste_startzeit_1_uhrzeit_start_minute).val < '10') {
             startzeit_fix_minute = '0' + String(getState(vars_feste_startzeit_1_uhrzeit_start_minute).val);
           } else {
             startzeit_fix_minute = getState(vars_feste_startzeit_1_uhrzeit_start_minute).val;
           }
           setStateDelayed(vars_feste_startzeit_1_uhrzeit_start, ([startzeit_fix_stunde,':',startzeit_fix_minute].join('')), true, parseInt(0, 10), false);
           (function () {if (fix_1) {clearSchedule(fix_1); fix_1 = null;}})();
           fix_1 = schedule(('' + getState(vars_feste_startzeit_1_uhrzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_feste_startzeit_1_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
             if (getState(vars_feste_startzeit_1_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == false && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
               setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
             }
           });
           // Feste Uhrzeit 2
           if (getState(vars_feste_startzeit_2_uhrzeit_start_stunde).val < '10') {
             startzeit_fix_2_stunde = '0' + String(getState(vars_feste_startzeit_2_uhrzeit_start_stunde).val);
           } else {
             startzeit_fix_2_stunde = getState(vars_feste_startzeit_2_uhrzeit_start_stunde).val;
           }
           if (getState(vars_feste_startzeit_2_uhrzeit_start_minute).val < '10') {
             startzeit_fix_2_minunte = '0' + String(getState(vars_feste_startzeit_2_uhrzeit_start_minute).val);
           } else {
             startzeit_fix_2_minunte = getState(vars_feste_startzeit_2_uhrzeit_start_minute).val;
           }
           setStateDelayed(vars_feste_startzeit_2_uhrzeit_start, ([startzeit_fix_2_stunde,':',startzeit_fix_2_minunte].join('')), true, parseInt(0, 10), false);
           (function () {if (fix_2) {clearSchedule(fix_2); fix_2 = null;}})();
           fix_2 = schedule(('' + getState(vars_feste_startzeit_2_uhrzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_feste_startzeit_2_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
             if (getState(vars_feste_startzeit_2_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == false && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
               setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
             }
           });
           // Feste Uhrzeit 3
           if (getState(vars_feste_startzeit_3_uhrzeit_start_stunde).val < '10') {
             startzeit_fix_3_stunde = '0' + String(getState(vars_feste_startzeit_3_uhrzeit_start_stunde).val);
           } else {
             startzeit_fix_3_stunde = getState(vars_feste_startzeit_3_uhrzeit_start_stunde).val;
           }
           if (getState(vars_feste_startzeit_3_uhrzeit_start_minute).val < '10') {
             startzeit_fix_3_minute = '0' + String(getState(vars_feste_startzeit_3_uhrzeit_start_minute).val);
           } else {
             startzeit_fix_3_minute = getState(vars_feste_startzeit_3_uhrzeit_start_minute).val;
           }
           setStateDelayed(vars_feste_startzeit_3_uhrzeit_start, ([startzeit_fix_3_stunde,':',startzeit_fix_3_minute].join('')), true, parseInt(0, 10), false);
           (function () {if (fix_3) {clearSchedule(fix_3); fix_3 = null;}})();
           fix_3 = schedule(('' + getState(vars_feste_startzeit_3_uhrzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_feste_startzeit_3_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
             if (getState(vars_feste_startzeit_3_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == false && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
               setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
             }
           });
         }, 1000);
        });
        // Enduhrzeiten berechnen
        on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_bewaesserung_pause), change: "ne"}, function (obj) {
           // Gesamt
         if (getState(vars_bewaesserung_aktiv).val == true) {
           // Enduhrzeit berechnen
           // Jedes Ventil startet mit einer Verzögerung von 1 Sekunde.
           // Daher wird pro Ventil 1 Sekunde auf die Gesamtlaufzeit drauf
           // gerechnetGesamtlaufzeit = Jetzt + Laufzeit + Umschaltsekunden
           info_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_restlautzeit_in_sek).val;
           info_endzeit_stunde = Math.floor(info_enduhrzeit_raw / 3600);
           info_endzeit_minute = Math.floor((info_enduhrzeit_raw - info_endzeit_stunde * 3600) / 60);
           info_endzeit_sekunde = info_enduhrzeit_raw - info_endzeit_stunde * 3600;
           info_endzeit_sekunde = info_endzeit_sekunde - info_endzeit_minute * 60;
           // Mail Stunden formatieren bei kleiner 10
           if (info_endzeit_stunde < 10) {
             info_endzeit_stunde = '0' + String(info_endzeit_stunde);
           }
           // Mail Minuten formatieren bei kleiner 10
           if (info_endzeit_minute < 10) {
             info_endzeit_minute = '0' + String(info_endzeit_minute);
           }
           // Mail Sekunden formatieren bei kleiner 10
           if (info_endzeit_sekunde < '10') {
             info_endzeit_sekunde = '0' + String((new Date().getSeconds()));
           }
           setStateDelayed(vars_lautzeit_ende_uhrzeit, ([info_endzeit_stunde,':',info_endzeit_minute,':',info_endzeit_sekunde,' Uhr'].join('')), true, parseInt(0, 10), false);
         }
         // pro Ventil
         if (getState(vars_bewaesserung_aktiv).val == true && getState(vars_bewaesserung_pause).val == false) {
           // Ventil 1 End-Uhrzeit
           if (getState(vars_ventil_1).val == true) {
             // Plus 1 Sekuden fpr das setzen des wertes ON_TIME des HM Aktors
             ventil_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_ventil_1_restzeit_in_sek).val + 1;
             ventil_enduhrzeit_std = Math.floor(ventil_enduhrzeit_raw / 3600);
             ventil_enduhrzeit_min = Math.floor((ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) / 60);
             ventil_enduhrzeit_sek = ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600;
             ventil_enduhrzeit_sek = ventil_enduhrzeit_sek - ventil_enduhrzeit_min * 60;
             if (ventil_enduhrzeit_std < 10) {
               ventil_enduhrzeit_std = '0' + String(ventil_enduhrzeit_std);
             }
             if (ventil_enduhrzeit_min < 10) {
               ventil_enduhrzeit_min = '0' + String(ventil_enduhrzeit_min);
             }
             if (ventil_enduhrzeit_sek < 10) {
               ventil_enduhrzeit_sek = '0' + String(ventil_enduhrzeit_sek);
             }
             setStateDelayed(vars_ventil_1_ende, ([ventil_enduhrzeit_std,':',ventil_enduhrzeit_min,':',ventil_enduhrzeit_sek].join('')), true, parseInt(0, 10), false);
           } else {
             setStateDelayed(vars_ventil_1_ende, 'deaktiviert', true, parseInt(0, 10), false);
           }
           // Ventil 2 End-Uhrzeit
           if (getState(vars_ventil_2).val == true) {
             // Pro aktivem Ventil kommt 1 Sekunde Verzögerung für das setzen von ON_TIME hinzu
             if (getState(vars_ventil_1).val == false) {
               ventil_enduhrzeit_verzoegerung = 1;
             } else if (getState(vars_ventil_1).val == true) {
               ventil_enduhrzeit_verzoegerung = 2;
             }
             ventil_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_ventil_1_restzeit_in_sek).val + getState(vars_ventil_2_restzeit_in_sek).val + ventil_enduhrzeit_verzoegerung;
             ventil_enduhrzeit_std = Math.floor(ventil_enduhrzeit_raw / 3600);
             ventil_enduhrzeit_min = Math.floor((ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) / 60);
             ventil_enduhrzeit_sek = ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600;
             ventil_enduhrzeit_sek = ventil_enduhrzeit_sek - ventil_enduhrzeit_min * 60;
             if (ventil_enduhrzeit_std < 10) {
               ventil_enduhrzeit_std = '0' + String(ventil_enduhrzeit_std);
             }
             if (ventil_enduhrzeit_min < 10) {
               ventil_enduhrzeit_min = '0' + String(ventil_enduhrzeit_min);
             }
             if (ventil_enduhrzeit_sek < 10) {
               ventil_enduhrzeit_sek = '0' + String(ventil_enduhrzeit_sek);
             }
             setStateDelayed(vars_ventil_2_ende, ([ventil_enduhrzeit_std,':',ventil_enduhrzeit_min,':',ventil_enduhrzeit_sek].join('')), true, parseInt(0, 10), false);
           } else {
             setStateDelayed(vars_ventil_2_ende, 'deaktiviert', true, parseInt(0, 10), false);
           }
           // Ventil 3 End-Uhrzeit
           if (getState(vars_ventil_3).val == true) {
             // Pro aktivem Ventil kommt 1 Sekunde Verzögerung für das setzen von ON_TIME hinzu
             if (getState(vars_ventil_3).val == true) {
               if (getState(vars_ventil_1).val == false && getState(vars_ventil_2).val == false) {
                 ventil_enduhrzeit_verzoegerung = 1;
               }
               if (getState(vars_ventil_1).val == true || getState(vars_ventil_2).val == true) {
                 ventil_enduhrzeit_verzoegerung = 2;
               }
               if (getState(vars_ventil_1).val == true && getState(vars_ventil_2).val == true) {
                 ventil_enduhrzeit_verzoegerung = 3;
               }
             }
             ventil_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_ventil_1_restzeit_in_sek).val + getState(vars_ventil_2_restzeit_in_sek).val + getState(vars_ventil_3_restzeit_in_sek).val + ventil_enduhrzeit_verzoegerung;
             ventil_enduhrzeit_std = Math.floor(ventil_enduhrzeit_raw / 3600);
             ventil_enduhrzeit_min = Math.floor((ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) / 60);
             ventil_enduhrzeit_sek = (ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) - ventil_enduhrzeit_min * 60;
             if (ventil_enduhrzeit_std < 10) {
               ventil_enduhrzeit_std = '0' + String(ventil_enduhrzeit_std);
             }
             if (ventil_enduhrzeit_min < 10) {
               ventil_enduhrzeit_min = '0' + String(ventil_enduhrzeit_min);
             }
             if (ventil_enduhrzeit_sek < 10) {
               ventil_enduhrzeit_sek = '0' + String(ventil_enduhrzeit_sek);
             }
             setStateDelayed(vars_ventil_3_ende, ([ventil_enduhrzeit_std,':',ventil_enduhrzeit_min,':',ventil_enduhrzeit_sek].join('')), true, parseInt(0, 10), false);
           } else {
             setStateDelayed(vars_ventil_3_ende, 'deaktiviert', true, parseInt(0, 10), false);
           }
           // Ventil 4 End-Uhrzeit
           if (getState(vars_ventil_4).val == true) {
             // Pro aktivem Ventil kommt 1 Sekunde Verzögerung für das setzen von ON_TIME hinzu
             if (getState(vars_ventil_4).val == true) {
               if (getState(vars_ventil_1).val == false && getState(vars_ventil_2).val == false && getState(vars_ventil_3).val == false) {
                 ventil_enduhrzeit_verzoegerung = 1;
               }
               if (getState(vars_ventil_1).val == true || getState(vars_ventil_2).val == true || getState(vars_ventil_3).val == true) {
                 ventil_enduhrzeit_verzoegerung = 2;
               }
               if (getState(vars_ventil_1).val == true && getState(vars_ventil_2).val == true && getState(vars_ventil_3).val == false) {
                 ventil_enduhrzeit_verzoegerung = 3;
               }
               if (getState(vars_ventil_1).val == false && getState(vars_ventil_2).val == true && getState(vars_ventil_3).val == true) {
                 ventil_enduhrzeit_verzoegerung = 3;
               }
               if (getState(vars_ventil_1).val == true && getState(vars_ventil_2).val == false && getState(vars_ventil_3).val == true) {
                 ventil_enduhrzeit_verzoegerung = 3;
               }
               if (getState(vars_ventil_1).val == true && getState(vars_ventil_2).val == true && getState(vars_ventil_3).val == true) {
                 ventil_enduhrzeit_verzoegerung = 4;
               }
             }
             ventil_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_ventil_1_restzeit_in_sek).val + getState(vars_ventil_2_restzeit_in_sek).val + getState(vars_ventil_3_restzeit_in_sek).val + getState(vars_ventil_4_restzeit_in_sek).val + ventil_enduhrzeit_verzoegerung;
             ventil_enduhrzeit_std = Math.floor(ventil_enduhrzeit_raw / 3600);
             ventil_enduhrzeit_min = Math.floor((ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) / 60);
             ventil_enduhrzeit_sek = (ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) - ventil_enduhrzeit_min * 60;
             if (ventil_enduhrzeit_std < 10) {
               ventil_enduhrzeit_std = '0' + String(ventil_enduhrzeit_std);
             }
             if (ventil_enduhrzeit_min < 10) {
               ventil_enduhrzeit_min = '0' + String(ventil_enduhrzeit_min);
             }
             if (ventil_enduhrzeit_sek < 10) {
               ventil_enduhrzeit_sek = '0' + String(ventil_enduhrzeit_sek);
             }
             setStateDelayed(vars_ventil_4_ende, ([ventil_enduhrzeit_std,':',ventil_enduhrzeit_min,':',ventil_enduhrzeit_sek].join('')), true, parseInt(0, 10), false);
           } else {
             setStateDelayed(vars_ventil_4_ende, 'deaktiviert', true, parseInt(0, 10), false);
           }
         } else if (getState(vars_bewaesserung_aktiv).val == false) {
           setStateDelayed(vars_ventil_1_ende, '', true, parseInt(0, 10), false);
           setStateDelayed(vars_ventil_2_ende, '', true, parseInt(0, 10), false);
           setStateDelayed(vars_ventil_3_ende, '', true, parseInt(0, 10), false);
           setStateDelayed(vars_ventil_4_ende, '', true, parseInt(0, 10), false);
         }
        });
        // Laufzeiten setzen
        on({id: new RegExp(vars_ventil_1 + "|" + vars_ventil_2 + "|" + vars_ventil_3 + "|" + vars_ventil_4 + "|" + vars_ventil_1_dauer + "|" + vars_ventil_2_dauer + "|" + vars_ventil_3_dauer + "|" + vars_ventil_4_dauer + "|" + vars_bewaesserung_aktiv), change: "ne"}, function (obj) {
           // Laufzeit Ventile
         if (getState(vars_bewaesserung_aktiv).val == false) {
           // Ventil 1 - Laufzeit
           if (getState(vars_ventil_1).val == true) {
             ventil_1_dauer = getState(vars_ventil_1_dauer).val;
           } else {
             ventil_1_dauer = 0;
           }
           setStateDelayed(vars_ventil_1_restzeit, (String(ventil_1_dauer / 60) + ':00'), true, parseInt(0, 10), false);
           setStateDelayed(vars_ventil_1_restzeit_in_sek, ventil_1_dauer, true, parseInt(0, 10), false);
           // Ventil 2 - Laufzeit
           if (getState(vars_ventil_2).val == true) {
             ventil_2_dauer = getState(vars_ventil_2_dauer).val;
           } else {
             ventil_2_dauer = 0;
           }
           setStateDelayed(vars_ventil_2_restzeit, (String(ventil_2_dauer / 60) + ':00'), true, parseInt(0, 10), false);
           setStateDelayed(vars_ventil_2_restzeit_in_sek, ventil_2_dauer, true, parseInt(0, 10), false);
           // Ventil 3 - Laufzeit
           if (getState(vars_ventil_3).val == true) {
             ventil_3_dauer = getState(vars_ventil_3_dauer).val;
           } else {
             ventil_3_dauer = 0;
           }
           setStateDelayed(vars_ventil_3_restzeit, (String(ventil_3_dauer / 60) + ':00'), true, parseInt(0, 10), false);
           setStateDelayed(vars_ventil_3_restzeit_in_sek, ventil_3_dauer, true, parseInt(0, 10), false);
           // Ventil 4 - Laufzeit
           if (getState(vars_ventil_4).val == true) {
             ventil_4_dauer = getState(vars_ventil_4_dauer).val;
           } else {
             ventil_4_dauer = 0;
           }
           setStateDelayed(vars_ventil_4_restzeit, (String(ventil_4_dauer / 60) + ':00'), true, parseInt(0, 10), false);
           setStateDelayed(vars_ventil_4_restzeit_in_sek, ventil_4_dauer, true, parseInt(0, 10), false);
         }
         // Gesamtlaufzeit
         if (getState(vars_bewaesserung_aktiv).val == false) {
           // Gesamtlaufzeit in Sek
           // Pro aktives Ventil wird auf die Gesamtlaufzeit eine
           // Sekunden drauf gerechnet für das setzen der ON_TIME
           setStateDelayed(vars_laufzeit_gesamt_in_sek, (ventil_1_dauer + ventil_2_dauer + ventil_3_dauer + ventil_4_dauer + getState(vars_ventil_1).val + getState(vars_ventil_2).val + getState(vars_ventil_3).val + getState(vars_ventil_4).val), true, parseInt(0, 10), false);
           setStateDelayed(vars_restlautzeit_in_sek, (ventil_1_dauer + ventil_2_dauer + ventil_3_dauer + ventil_4_dauer + getState(vars_ventil_1).val + getState(vars_ventil_2).val + getState(vars_ventil_3).val + getState(vars_ventil_4).val), true, parseInt(0, 10), false);
           // Gesamtlaufzeit fuer die VIS
           restlaufzeit_vis_min = Math.floor(getState(vars_laufzeit_gesamt_in_sek).val / 60);
           restlaufzeit_vis_sek = getState(vars_laufzeit_gesamt_in_sek).val - restlaufzeit_vis_min * 60;
           if (restlaufzeit_vis_sek < 10) {
             restlaufzeit_vis_sek = '0' + String(restlaufzeit_vis_sek);
           }
           setStateDelayed(vars_restlautzeit, ([restlaufzeit_vis_min,':',restlaufzeit_vis_sek].join('')), true, parseInt(0, 10), false);
         }
        });
        // Mail / Pushover / Alexa
        on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_bewaesserung_pause), change: "ne"}, function (obj) {
           // Start
         if (getState(vars_bewaesserung_aktiv).val == true && getState(vars_bewaesserung_pause).val == false) {
           // Mail Text und Betreff
           waitmail2 = setTimeout(function () {
             // Aktive Ventile
             if (getState(vars_ventil_1).val == true) {
               info_endzeit_aktive_ventile = ['Ventil 1 (',getState(vars_ventil_1_name).val,'): ',getState(vars_ventil_1_ende).val,' Uhr'].join('');
             }
             if (getState(vars_ventil_2).val == true) {
               info_endzeit_aktive_ventile = [info_endzeit_aktive_ventile,'\n','Ventil 2 (',getState(vars_ventil_2_name).val,'): ',getState(vars_ventil_2_ende).val,' Uhr'].join('');
             }
             if (getState(vars_ventil_3).val == true) {
               info_endzeit_aktive_ventile = [info_endzeit_aktive_ventile,'\n','Ventil 3 (',getState(vars_ventil_3_name).val,'): ',getState(vars_ventil_3_ende).val,' Uhr'].join('');
             }
             if (getState(vars_ventil_4).val == true) {
               info_endzeit_aktive_ventile = [info_endzeit_aktive_ventile,'\n','Ventil 4 (',getState(vars_ventil_4_name).val,'): ',getState(vars_ventil_4_ende).val,' Uhr'].join('');
             }
             info_text = ['Die Gartenbewässerung wurde akiviert.','\n','\n','Bewässerungsdauer: ' + String(getState(vars_restlautzeit).val),'\n',['Start: ',formatDate(new Date(), "hh:mm:ss"),' Uhr'].join(''),'\n','Ende: ',getState(vars_lautzeit_ende_uhrzeit).val,'\n','\n','Aktive Ventile:','\n',info_endzeit_aktive_ventile].join('');
             info_betreff = ['+++ ',formatDate(new Date(), "hh:mm"),' Uhr - Gartenbewässerung aktiviert +++'].join('');
             if (vars_notify_mail == true) {
               sendTo("email", "send", {
                  text: info_text,
                  to: getState("javascript.0.mailadressen.mailadresse_daniel").val,
                  subject: info_betreff
               });
             }
             if (vars_notify_pushover == true) {
               sendTo("pushover.0", "send", {
                  message: info_text,
                  sound: "",
                  title: info_betreff
               });
             }
           }, 1000);
           // Sprachausgabe
           if (vars_notify_alexa == true) {
             if (info_endzeit_minute != '00') {
               setStateDelayed(vars_notify_alexa_device, (['Gartenbewässerung gestartet. ende um ',info_endzeit_stunde,' Uhr ',info_endzeit_minute,' und ',info_endzeit_stunde,' Sekunden'].join('')), true, parseInt(0, 10), false);
             } else {
               setStateDelayed(vars_notify_alexa_device, (['Gartenbewässerung gestartet. ende um ',info_endzeit_stunde,'Uhr ',' und ',info_endzeit_stunde,'Sekunden'].join('')), true, parseInt(0, 10), false);
             }
           }
         }
         // Stop
         if (getState(vars_bewaesserung_aktiv).val == false) {
           if (vars_notify_mail == true) {
             sendTo("email", "send", {
                text: 'Gartenbewässerung beendet',
                to: getState("javascript.0.mailadressen.mailadresse_daniel").val,
                subject: (['+++ ',formatDate(new Date(), "hh:mm"),' Uhr - Gartenbewässerung beendet +++'].join(''))
             });
           }
           if (vars_notify_pushover == true) {
             sendTo("pushover.0", "send", {
                message: '',
                sound: "",
                title: (['+++ ',formatDate(new Date(), "hh:mm"),' Uhr - Gartenbewässerung beendet +++'].join(''))
             });
           }
           if (vars_notify_alexa == true) {
             setStateDelayed(vars_notify_alexa_device, 'Gartenbewässerung beendet.', true, parseInt(0, 10), false);
           }
         }
        });
        // Log Eintraege
        on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_ventil_1_aktor + "|" + vars_ventil_2_aktor + "|" + vars_ventil_3_aktor + "|" + vars_ventil_4_aktor), change: "ne"}, function (obj) {
           if (vars_notify_log == true) {
           // +++ Bewässerung gestartet +++
           // Log Eintrag wird nur ausgegeben, wenn alle Ventile aus
           // sind, und die Variable sich vor 1 Sek geändert hat.
           if (getState(vars_bewaesserung_aktiv).val == true && formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_bewaesserung_aktiv).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_bewaesserung_aktiv).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 1 && getState(vars_ventil_1_aktor).lc == false && getState(vars_ventil_2_aktor).lc == false && getState(vars_ventil_3_aktor).lc == false && getState(vars_ventil_4_aktor).lc == false) {
             console.log('+++ Bewässerung gestartet +++');
           } else if (getState(vars_bewaesserung_aktiv).val == false) {
             console.log('+++ Bewässerung beendet +++');
           }
           // Ventil 1
           if (formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_ventil_1_aktor).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_ventil_1_aktor).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 5) {
             if (getState(vars_ventil_1_aktor).val == true) {
               console.log((['+++ Bewässerung: Ventil 1 - ',getState(vars_ventil_1_name).val,' aktiv +++'].join('')));
             }
           }
           // Ventil 2
           if (formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_ventil_2_aktor).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_ventil_2_aktor).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 5) {
             if (getState(vars_ventil_2_aktor).val == true) {
               console.log((['+++ Bewässerung: Ventil 2 - ',getState(vars_ventil_2_name).val,' aktiv +++'].join('')));
             }
           }
           // Ventil 3
           if (formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_ventil_3_aktor).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_ventil_3_aktor).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 5) {
             if (getState(vars_ventil_3_aktor).val == true) {
               console.log((['+++ Bewässerung: Ventil 3 - ',getState(vars_ventil_3_name).val,' aktiv +++'].join('')));
             }
           }
           // Ventil 4
           if (formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_ventil_4_aktor).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_ventil_4_aktor).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 5) {
             if (getState(vars_ventil_4_aktor).val == true) {
               console.log((['+++ Bewässerung: Ventil 4 - ',getState(vars_ventil_4_name).val,' aktiv +++'].join('')));
             }
           }
         }
        });
        // Aktive Ventile zaehlen
        on({id: new RegExp(vars_ventil_1_aktor + "|" + vars_ventil_2_aktor + "|" + vars_ventil_3_aktor + "|" + vars_ventil_4_aktor), change: "ne"}, function (obj) {
           setStateDelayed(vars_anzahl_aktive_ventile, 0, true, parseInt(0, 10), false);
         setStateDelayed(vars_anzahl_aktive_ventile, (getState(vars_ventil_1_aktor).val + getState(vars_ventil_2_aktor).val + getState(vars_ventil_3_aktor).val + getState(vars_ventil_4_aktor).val), true, parseInt(0, 10), false);
        });
        // Ventil Steuerung
        on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_bewaesserung_pause + "|" + vars_restlautzeit_in_sek), change: "ne"}, function (obj) {
           if (getState(vars_bewaesserung_aktiv).val == true && getState(vars_bewaesserung_pause).val == false) {
           // Ventil 1
           if (getState(vars_ventil_1).val == true && getState(vars_ventil_1_restzeit_in_sek).val != 0) {
             if (getState(vars_ventil_1_aktor).val == false && getState(vars_anzahl_aktive_ventile).val < 3) {
               // Einshaltdauer setzen
               if (vars_aktor_typ == 'hm') {
                 // ON_TIME fuer Homematic
                 setStateDelayed(vars_ventil_1_aktor_ontime, parseFloat(getState(vars_ventil_1_restzeit_in_sek).val), false, parseInt(0, 10), false);
               } else if (vars_aktor_typ == 'sonoff') {
                 // PulseTime fuer Sonoff
                 try {
                   require("request")((['http://',vars_sonoff_ip,'/cm?cmnd=PulseTime1%20 ',100 + getState(vars_ventil_1_restzeit_in_sek).val].join(''))).on("error", function (e) {console.error(e);});
                 } catch (e) { console.error(e); }
               }
               setStateDelayed(vars_ventil_1_aktor, true, false, parseInt(1000, 10), false);
               setStateDelayed(vars_aktives_ventil, 'ventil_1', true, parseInt(1000, 10), false);
             }
           }
           // Ventil 2
           if ((getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && getState(vars_ventil_2).val == true && getState(vars_ventil_2_restzeit_in_sek).val != 0) {
             if (getState(vars_ventil_2_aktor).val == false && getState(vars_anzahl_aktive_ventile).val < 3) {
               // Ventil 1 ausschalten
               if (getState(vars_ventil_1_aktor).val == true) {
                 setStateDelayed(vars_ventil_1_aktor, false, false, parseInt(0, 10), false);
               }
               // Einshaltdauer setzen
               if (vars_aktor_typ == 'hm') {
                 // ON_TIME fuer Homematic
                 setStateDelayed(vars_ventil_2_aktor_ontime, parseFloat(getState(vars_ventil_2_restzeit_in_sek).val), false, parseInt(0, 10), false);
               } else if (vars_aktor_typ == 'sonoff') {
                 // PulseTime fuer Sonoff
                 try {
                   require("request")((['http://',vars_sonoff_ip,'/cm?cmnd=PulseTime2%20 ',100 + getState(vars_ventil_2_restzeit_in_sek).val].join(''))).on("error", function (e) {console.error(e);});
                 } catch (e) { console.error(e); }
               }
               setStateDelayed(vars_ventil_2_aktor, true, false, parseInt(1000, 10), false);
               setStateDelayed(vars_aktives_ventil, 'ventil_2', true, parseInt(1000, 10), false);
             }
           }
           // Ventil 3
           if ((getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && (getState(vars_ventil_2).val == false || getState(vars_ventil_2_restzeit_in_sek).val == 0) && getState(vars_ventil_3).val == true && getState(vars_ventil_3_restzeit_in_sek).val != 0) {
             if (getState(vars_ventil_3_aktor).val == false && getState(vars_anzahl_aktive_ventile).val < 3) {
               // Ventil 2 ausschalten
               if (getState(vars_ventil_2_aktor).val == true) {
                 setStateDelayed(vars_ventil_2_aktor, false, false, parseInt(0, 10), false);
               }
               // Einshaltdauer setzen
               if (vars_aktor_typ == 'hm') {
                 // ON_TIME fuer Homematic
                 setStateDelayed(vars_ventil_3_aktor_ontime, parseFloat(getState(vars_ventil_3_restzeit_in_sek).val), false, parseInt(0, 10), false);
               } else if (vars_aktor_typ == 'sonoff') {
                 // PulseTime fuer Sonoff
                 try {
                   require("request")((['http://',vars_sonoff_ip,'/cm?cmnd=PulseTime3%20 ',100 + getState(vars_ventil_3_restzeit_in_sek).val].join(''))).on("error", function (e) {console.error(e);});
                 } catch (e) { console.error(e); }
               }
               setStateDelayed(vars_ventil_3_aktor, true, false, parseInt(1000, 10), false);
               setStateDelayed(vars_aktives_ventil, 'ventil_3', true, parseInt(1000, 10), false);
             }
           }
           // Ventil 4
           if ((getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && (getState(vars_ventil_2).val == false || getState(vars_ventil_2_restzeit_in_sek).val == 0) && (getState(vars_ventil_3).val == false || getState(vars_ventil_3_restzeit_in_sek).val == 0) && getState(vars_ventil_4).val == true && getState(vars_ventil_4_restzeit_in_sek).val != 0) {
             if (getState(vars_ventil_4_aktor).val == false && getState(vars_anzahl_aktive_ventile).val < 3) {
               // Ventil 3 ausschalten
               if (getState(vars_ventil_3_aktor).val == true) {
                 setStateDelayed(vars_ventil_3_aktor, false, false, parseInt(0, 10), false);
               }
               // Einshaltdauer setzen
               if (vars_aktor_typ == 'hm') {
                 // ON_TIME fuer Homematic
                 setStateDelayed(vars_ventil_4_aktor_ontime, parseFloat(getState(vars_ventil_4_restzeit_in_sek).val), false, parseInt(0, 10), false);
               } else if (vars_aktor_typ == 'sonoff') {
                 // PulseTime fuer Sonoff
                 try {
                   require("request")((['http://',vars_sonoff_ip,'/cm?cmnd=PulseTime4%20 ',100 + getState(vars_ventil_4_restzeit_in_sek).val].join(''))).on("error", function (e) {console.error(e);});
                 } catch (e) { console.error(e); }
               }
               setStateDelayed(vars_ventil_4_aktor, true, false, parseInt(1000, 10), false);
               setStateDelayed(vars_aktives_ventil, 'ventil_4', true, parseInt(1000, 10), false);
             }
           }
         } else if (getState(vars_bewaesserung_aktiv).val == true && getState(vars_bewaesserung_pause).val == true) {
           // Ventil 1 pausieren
           if (getState(vars_ventil_1_aktor).val == true) {
             setStateDelayed(vars_ventil_1_aktor, false, false, parseInt(0, 10), false);
           }
           // Ventil 2 pausieren
           if (getState(vars_ventil_2_aktor).val == true) {
             setStateDelayed(vars_ventil_2_aktor, false, false, parseInt(0, 10), false);
           }
           // Ventil 3 pausieren
           if (getState(vars_ventil_3_aktor).val == true) {
             setStateDelayed(vars_ventil_3_aktor, false, false, parseInt(0, 10), false);
           }
           // Ventil 4 pausieren
           if (getState(vars_ventil_4_aktor).val == true) {
             setStateDelayed(vars_ventil_4_aktor, false, false, parseInt(0, 10), false);
           }
         } else if (getState(vars_bewaesserung_aktiv).val == false && getState(vars_bewaesserung_pause).val == false) {
           setStateDelayed(vars_aktives_ventil, 'aus', true, parseInt(0, 10), false);
         }
        });
        // Restzeit gesamt berechnen
        on({id: vars_bewaesserung_aktiv, change: "ne"}, function (obj) {
         var value = obj.state.val;
         var oldValue = obj.oldState.val;
         if (getState(vars_bewaesserung_aktiv).val == true) {
           restzeit = setInterval(function () {
             if (getState(vars_bewaesserung_pause).val == false) {
               setStateDelayed(vars_restlautzeit_in_sek, (getState(vars_restlautzeit_in_sek).val - 1), true, parseInt(0, 10), false);
               restzeit_gesamt_min = Math.floor(getState(vars_restlautzeit_in_sek).val / 60);
               restzeit_gesamt_sek = getState(vars_restlautzeit_in_sek).val - restzeit_gesamt_min * 60;
               // 0 hinzufuegen wenn Minuten < 10
               if (restzeit_gesamt_min < 10) {
                 restzeit_gesamt_min = '0' + String(restzeit_gesamt_min);
               }
               // 0 hinzufuegen wenn Sekunden < 10
               if (restzeit_gesamt_sek < 10) {
                 restzeit_gesamt_sek = '0' + String(restzeit_gesamt_sek);
               }
               setStateDelayed(vars_restlautzeit, ([restzeit_gesamt_min,':',restzeit_gesamt_sek].join('')), true, parseInt(0, 10), false);
               if (getState(vars_restlautzeit_in_sek).val == 0) {
                 setStateDelayed(vars_bewaesserung_aktiv, false, true, parseInt(0, 10), false);
                 (function () {if (restzeit) {clearInterval(restzeit); restzeit = null;}})();
               }
             }
           }, 1000);
         } else if (getState(vars_bewaesserung_aktiv).val == false) {
           (function () {if (restzeit) {clearInterval(restzeit); restzeit = null;}})();
         }
        });
        // Restzeit Ventile berechnen
        on({id: vars_bewaesserung_aktiv, change: "ne"}, function (obj) {
         var value = obj.state.val;
         var oldValue = obj.oldState.val;
         if (getState(vars_bewaesserung_aktiv).val == true) {
           // Ventil 1
           if (getState(vars_ventil_1).val == true) {
             // Umschaltverzögerung für ON_TIME
             setStateDelayed(vars_ventil_1_restzeit_in_sek, (getState(vars_ventil_1_restzeit_in_sek).val + 1), true, parseInt(0, 10), false);
             ventil_1_rest = setInterval(function () {
               if (getState(vars_bewaesserung_pause).val == false && getState(vars_ventil_1).val == true && getState(vars_ventil_1_restzeit_in_sek).val != 0) {
                 setStateDelayed(vars_ventil_1_restzeit_in_sek, (getState(vars_ventil_1_restzeit_in_sek).val - 1), true, parseInt(0, 10), false);
                 // VIS Anzeige setzen
                 restzeit_ventil_min = Math.floor(getState(vars_ventil_1_restzeit_in_sek).val / 60);
                 restzeit_ventil_sek = getState(vars_ventil_1_restzeit_in_sek).val - restzeit_ventil_min * 60;
                 if (restzeit_ventil_sek < 10) {
                   setStateDelayed(vars_ventil_1_restzeit, ([restzeit_ventil_min,':0',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                 } else {
                   setStateDelayed(vars_ventil_1_restzeit, ([restzeit_ventil_min,':',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                 }
               }
               if (getState(vars_ventil_1_restzeit_in_sek).val == 0) {
                 (function () {if (ventil_1_rest) {clearInterval(ventil_1_rest); ventil_1_rest = null;}})();
               }
             }, 1000);
           }
           // Ventil 2
           if (getState(vars_ventil_2).val == true) {
             // Umschaltverzögerung für ON_TIME
             setStateDelayed(vars_ventil_2_restzeit_in_sek, (getState(vars_ventil_2_restzeit_in_sek).val + 1), true, parseInt(0, 10), false);
             ventil_2_rest = setInterval(function () {
               if (getState(vars_bewaesserung_pause).val == false && (getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && getState(vars_ventil_2).val == true && getState(vars_ventil_2_restzeit_in_sek).val != 0) {
                 setStateDelayed(vars_ventil_2_restzeit_in_sek, (getState(vars_ventil_2_restzeit_in_sek).val - 1), true, parseInt(0, 10), false);
                 // VIS Anzeige setzen
                 restzeit_ventil_min = Math.floor(getState(vars_ventil_2_restzeit_in_sek).val / 60);
                 restzeit_ventil_sek = getState(vars_ventil_2_restzeit_in_sek).val - restzeit_ventil_min * 60;
                 if (restzeit_ventil_sek < 10) {
                   setStateDelayed(vars_ventil_2_restzeit, ([restzeit_ventil_min,':0',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                 } else {
                   setStateDelayed(vars_ventil_2_restzeit, ([restzeit_ventil_min,':',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                 }
               }
               if (getState(vars_ventil_2_restzeit_in_sek).val == 0) {
                 (function () {if (ventil_2_rest) {clearInterval(ventil_2_rest); ventil_2_rest = null;}})();
               }
             }, 1000);
           }
           // Ventil 3
           if (getState(vars_ventil_3).val == true) {
             // Umschaltverzögerung für ON_TIME
             setStateDelayed(vars_ventil_3_restzeit_in_sek, (getState(vars_ventil_3_restzeit_in_sek).val + 1), true, parseInt(0, 10), false);
             ventil_3_rest = setInterval(function () {
               if (getState(vars_bewaesserung_pause).val == false && (getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && (getState(vars_ventil_2).val == false || getState(vars_ventil_2_restzeit_in_sek).val == 0) && getState(vars_ventil_3).val == true && getState(vars_ventil_3_restzeit_in_sek).val != 0) {
                 setStateDelayed(vars_ventil_3_restzeit_in_sek, (getState(vars_ventil_3_restzeit_in_sek).val - 1), true, parseInt(0, 10), false);
                 // VIS Anzeige setzen
                 restzeit_ventil_min = Math.floor(getState(vars_ventil_3_restzeit_in_sek).val / 60);
                 restzeit_ventil_sek = getState(vars_ventil_3_restzeit_in_sek).val - restzeit_ventil_min * 60;
                 if (restzeit_ventil_sek < 10) {
                   setStateDelayed(vars_ventil_3_restzeit, ([restzeit_ventil_min,':0',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                 } else {
                   setStateDelayed(vars_ventil_3_restzeit, ([restzeit_ventil_min,':',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                 }
               }
               if (getState(vars_ventil_3_restzeit_in_sek).val == 0) {
                 (function () {if (ventil_3_rest) {clearInterval(ventil_3_rest); ventil_3_rest = null;}})();
               }
             }, 1000);
           }
           // Ventil 4
           if (getState(vars_ventil_4).val == true) {
             // Umschaltverzögerung für ON_TIME
             setStateDelayed(vars_ventil_4_restzeit_in_sek, (getState(vars_ventil_4_restzeit_in_sek).val + 1), true, parseInt(0, 10), false);
             ventil_4_rest = setInterval(function () {
               if (getState(vars_bewaesserung_pause).val == false && (getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && (getState(vars_ventil_2).val == false || getState(vars_ventil_2_restzeit_in_sek).val == 0) && (getState(vars_ventil_3).val == false || getState(vars_ventil_3_restzeit_in_sek).val == 0) && getState(vars_ventil_4).val == true && getState(vars_ventil_4_restzeit_in_sek).val != 0) {
                 setStateDelayed(vars_ventil_4_restzeit_in_sek, (getState(vars_ventil_4_restzeit_in_sek).val - 1), true, parseInt(0, 10), false);
                 // VIS Anzeige setzen
                 restzeit_ventil_min = Math.floor(getState(vars_ventil_4_restzeit_in_sek).val / 60);
                 restzeit_ventil_sek = getState(vars_ventil_4_restzeit_in_sek).val - restzeit_ventil_min * 60;
                 if (restzeit_ventil_sek < 10) {
                   setStateDelayed(vars_ventil_4_restzeit, ([restzeit_ventil_min,':0',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                 } else {
                   setStateDelayed(vars_ventil_4_restzeit, ([restzeit_ventil_min,':',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                 }
               }
               if (getState(vars_ventil_4_restzeit_in_sek).val == 0) {
                 (function () {if (ventil_4_rest) {clearInterval(ventil_4_rest); ventil_4_rest = null;}})();
               }
             }, 1000);
           }
         } else {
           (function () {if (ventil_1_rest) {clearInterval(ventil_1_rest); ventil_1_rest = null;}})();
           (function () {if (ventil_2_rest) {clearInterval(ventil_2_rest); ventil_2_rest = null;}})();
           (function () {if (ventil_3_rest) {clearInterval(ventil_3_rest); ventil_3_rest = null;}})();
           (function () {if (ventil_4_rest) {clearInterval(ventil_4_rest); ventil_4_rest = null;}})();
         }
        });
        // Manuelles abschalten -> alle Ventile abschalten
        on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_restlautzeit_in_sek), change: "ne"}, function (obj) {
           if (getState(vars_bewaesserung_aktiv).val == false || getState(vars_restlautzeit_in_sek).val == 0) {
           // Ventil 1
           if (getState(vars_ventil_1_aktor).val == true) {
             setStateDelayed(vars_ventil_1_aktor, false, false, parseInt(0, 10), false);
           }
           // Ventil 2
           if (getState(vars_ventil_2_aktor).val == true) {
             setStateDelayed(vars_ventil_2_aktor, false, false, parseInt(0, 10), false);
           }
           // Ventil 3
           if (getState(vars_ventil_3_aktor).val == true) {
             setStateDelayed(vars_ventil_3_aktor, false, false, parseInt(0, 10), false);
           }
           // Ventil 4
           if (getState(vars_ventil_4_aktor).val == true) {
             setStateDelayed(vars_ventil_4_aktor, false, false, parseInt(0, 10), false);
           }
           // Pause
           if (getState(vars_bewaesserung_pause).val == true) {
             setStateDelayed(vars_bewaesserung_pause, false, true, parseInt(0, 10), false);
           }
         }
        });
        
        

        T 1 Antwort Letzte Antwort
        0
        • Hitzi 69H Offline
          Hitzi 69H Offline
          Hitzi 69
          schrieb am zuletzt editiert von
          #344

          Habe es jetzt mit dem neuen Script laufen lassen und die DPs neu angelegt. Hat jetzt funktioniert aber es Screenshot_20200409-211427_Fully Kiosk Browser.jpg kommen Fehler im Log

          1 Antwort Letzte Antwort
          0
          • dslraserD dslraser

            @tombox sagte in [Vorlage] Gartenbewässerung mit 4 Ventilen:

            Leider ist ein Blockly, gibt es eine gute Lösung das Blockly in javascript umzuwandeln?

            umwandeln kannst Du es doch selbst im Javascript Adapter.

            var vars_pfad, vars_aktor_typ, vars_aktor_name, vars_sonnenaufgang, vars_sonoff_ip, vars_sonnenuntergang, vars_morgens_verzoegerung_sonnenaufgang, vars_abends_verzoegerung_sonnenuntergang, vars_pumpe, startzeit_sonnenaufgang, vars_notify_mail, startzeit_sonnenaufgang_stunde, vars_bewaesserung_aktiv, vars_notify_alexa, startzeit_sonnenaufgang_minute, vars_notify_alexa_device, vars_feste_startzeit_1_uhrzeit_start_stunde, vars_feste_startzeit_1_uhrzeit_start_minute, vars_feste_startzeit_2_uhrzeit_start_stunde, vars_feste_startzeit_2_uhrzeit_start_minute, vars_feste_startzeit_3_uhrzeit_start_stunde, vars_feste_startzeit_3_uhrzeit_start_minute, timeout, vars_notify_pushover, vars_notify_log, vars_morgens_uhrzeit_start_stunde, vars_bewaesserung_pause, vars_wetter_max_temp, vars_morgens_urhzeit_start_minute, morgens, vars_schwellwert_temperatur, vars_ventil_1, vars_ventil_2, vars_ventil_3, vars_ventil_4, vars_ventil_1_dauer, vars_ventil_2_dauer, vars_ventil_3_dauer, vars_ventil_4_dauer, vars_wetter_regen, info_enduhrzeit_raw, vars_schwellwert_regen, abends, info_endzeit_stunde, vars_morgens_uhrzeit_start, info_endzeit_minute, vars_ventil_1_ende, startzeit_sonnenuntergang, vars_restlautzeit_in_sek, info_endzeit_sekunde, ventil_enduhrzeit_raw, vars_ventil_2_ende, ventil_1_dauer, vars_ventil_1_aktor, vars_ventil_2_aktor, vars_ventil_3_aktor, vars_ventil_4_aktor, startzeit_sonnenuntergang_stunde, vars_morgens_aktiv, startzeit_fix_stunde, ventil_enduhrzeit_std, vars_ventil_3_ende, vars_ventil_1_restzeit, waitmail2, vars_bewaesserung_automatik, startzeit_sonnenuntergang_minute, vars_abends_uhrzeit_start_stunde, vars_abends_uhrzeit_start_minute, startzeit_fix_minute, ventil_enduhrzeit_min, vars_ventil_4_ende, vars_ventil_1_restzeit_in_sek, vars_laufzeit_gesamt_in_sek, vars_feste_startzeit_1_uhrzeit_start, ventil_enduhrzeit_sek, ventil_enduhrzeit_verzoegerung, vars_anzahl_aktive_ventile, vars_abends_aktiv, fix_1, ventil_2_dauer, restlaufzeit_vis_min, info_endzeit_aktive_ventile, vars_ventil_2_restzeit, ventil_3_dauer, ventil_4_dauer, restlaufzeit_vis_sek, vars_lautzeit_ende_uhrzeit, vars_ventil_2_restzeit_in_sek, vars_aktives_ventil, vars_restlautzeit, startzeit_fix_2_stunde, vars_ventil_1_name, info_text, restzeit, startzeit_fix_2_minunte, vars_ventil_2_name, info_betreff, vars_feste_startzeit_2_uhrzeit_start, vars_ventil_3_restzeit, vars_ventil_3_name, vars_abends_uhrzeit_start, vars_feste_startzeit_1_aktiv, fix_2, vars_ventil_3_restzeit_in_sek, vars_ventil_4_name, restzeit_gesamt_min, restzeit_gesamt_sek, vars_ventil_1_aktor_ontime, vars_ventil_4_restzeit_in_sek, ventil_1_rest, startzeit_fix_3_stunde, vars_ventil_4_restzeit, vars_ventil_2_aktor_ontime, startzeit_fix_3_minute, ventil_2_rest, vars_feste_startzeit_3_uhrzeit_start, vars_ventil_3_aktor_ontime, vars_feste_startzeit_2_aktiv, fix_3, restzeit_ventil_min, ventil_3_rest, restzeit_ventil_sek, vars_ventil_4_aktor_ontime, ventil_4_rest, vars_feste_startzeit_3_aktiv;
            
            /**
            * Datenpunkte erstellen.Einmalig ausführen!
            */
            function Datenpunkte_erstellen() {
               /**
                * Create states under 0_userdata.0 or javascript.x
                * Current Version:     https://github.com/Mic-M/iobroker.createUserStates
                * Support:             https://forum.iobroker.net/topic/26839/
                * Autor:               Mic (ioBroker) | Mic-M (github)
                * Version:             1.1 (26 January 2020)
                * Example:             see https://github.com/Mic-M/iobroker.createUserStates#beispiel
                * -----------------------------------------------
                * PLEASE NOTE: Per https://github.com/ioBroker/ioBroker.javascript/issues/474, the used function setObject()
                *              executes the callback PRIOR to completing the state creation. Therefore, we use a setTimeout and counter.
                * -----------------------------------------------
                * @param {string} where          Where to create the state: '0_userdata.0' or 'javascript.x'.
                * @param {boolean} force         Force state creation (overwrite), if state is existing.
                * @param {array} statesToCreate  State(s) to create. single array or array of arrays
                * @param {object} [callback]     Optional: a callback function -- This provided function will be executed after all states are created.
                */
            
               /**
               * Hier bitte den Speicherort,den Pfad eintragen und den Namen der Kreise eingeben
               * Beispiele:
            
               	speicherort = '0_userdata.0.'
               	speicherort = 'javascript.0'
            
               	pfad = 'bewasserung.'
               	pfad = 'Gardena.Bewaesserung.'
            
                   kreis1 = 'Hecke'
                   kreis2 = 'Rasen'
            
               */
               speicherort = 'javascript.0'
               pfad = 'bewaesserung.'
               kreis1 = 'Hecke'
               kreis2 = 'Rasen'
               kreis3 = 'Beet'
               kreis4 = 'kl. Rasen'
            
            
               function createUserStates(where, force, statesToCreate, callback = undefined) {
            
                   const WARN = false; // Only for 0_userdata.0: Throws warning in log, if state is already existing and force=false. Default is false, so no warning in log, if state exists.
                   const LOG_DEBUG = false; // To debug this function, set to true
                   // Per issue #474 (https://github.com/ioBroker/ioBroker.javascript/issues/474), the used function setObject() executes the callback
                   // before the state is actual created. Therefore, we use a setTimeout and counter as a workaround.
                   const DELAY = 50; // Delay in milliseconds (ms). Increase this to 100, if it is not working.
            
                   // Validate "where"
                   if (where.endsWith('.')) where = where.slice(0, -1); // Remove trailing dot
                   if ( (where.match(/^((javascript\.([1-9][0-9]|[0-9]))$|0_userdata\.0$)/) == null) ) {
                       log('This script does not support to create states under [' + where + ']', 'error');
                       return;
                   }
            
                   // Prepare "statesToCreate" since we also allow a single state to create
                   if(!Array.isArray(statesToCreate[0])) statesToCreate = [statesToCreate]; // wrap into array, if just one array and not inside an array
            
                   // Add "where" to STATES_TO_CREATE
                   for (let i = 0; i < statesToCreate.length; i++) {
                       let lpPath = statesToCreate[i][0].replace(/\.*\./g, '.'); // replace all multiple dots like '..', '...' with a single '.'
                       lpPath = lpPath.replace(/^((javascript\.([1-9][0-9]|[0-9])\.)|0_userdata\.0\.)/,'') // remove any javascript.x. / 0_userdata.0. from beginning
                       lpPath = where + '.' + lpPath; // add where to beginning of string
                       statesToCreate[i][0] = lpPath;
                   }
            
                   if (where != '0_userdata.0') {
                       // Create States under javascript.x
                       let numStates = statesToCreate.length;
                       statesToCreate.forEach(function(loopParam) {
                           if (LOG_DEBUG) log('[Debug] Now we are creating new state [' + loopParam[0] + ']');
                           let loopInit = (loopParam[1]['def'] == undefined) ? null : loopParam[1]['def']; // mimic same behavior as createState if no init value is provided
                           createState(loopParam[0], loopInit, force, loopParam[1], function() {
                               numStates--;
                               if (numStates === 0) {
                                   if (LOG_DEBUG) log('[Debug] All states processed.');
                                   if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                       if (LOG_DEBUG) log('[Debug] Function to callback parameter was provided');
                                       return callback();
                                   } else {
                                       return;
                                   }
                               }
                           });
                       });
                   } else {
                       // Create States under 0_userdata.0
                       let numStates = statesToCreate.length;
                       let counter = -1;
                       statesToCreate.forEach(function(loopParam) {
                           counter += 1;
                           if (LOG_DEBUG) log ('[Debug] Currently processing following state: [' + loopParam[0] + ']');
                           if( ($(loopParam[0]).length > 0) && (existsState(loopParam[0])) ) { // Workaround due to https://github.com/ioBroker/ioBroker.javascript/issues/478
                               // State is existing.
                               if (WARN && !force) log('State [' + loopParam[0] + '] is already existing and will no longer be created.', 'warn');
                               if (!WARN && LOG_DEBUG) log('[Debug] State [' + loopParam[0] + '] is already existing. Option force (=overwrite) is set to [' + force + '].');
                               if(!force) {
                                   // State exists and shall not be overwritten since force=false
                                   // So, we do not proceed.
                                   numStates--;
                                   if (numStates === 0) {
                                       if (LOG_DEBUG) log('[Debug] All states successfully processed!');
                                       if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                           if (LOG_DEBUG) log('[Debug] An optional callback function was provided, which we are going to execute now.');
                                           return callback();
                                       }
                                   } else {
                                       // We need to go out and continue with next element in loop.
                                       return; // https://stackoverflow.com/questions/18452920/continue-in-cursor-foreach
                                   }
                               } // if(!force)
                           }
            
                           // State is not existing or force = true, so we are continuing to create the state through setObject().
                           let obj = {};
                           obj.type = 'state';
                           obj.native = {};
                           obj.common = loopParam[1];
                           setObject(loopParam[0], obj, function (err) {
                               if (err) {
                                   log('Cannot write object for state [' + loopParam[0] + ']: ' + err);
                               } else {
                                   if (LOG_DEBUG) log('[Debug] Now we are creating new state [' + loopParam[0] + ']')
                                   let init = null;
                                   if(loopParam[1].def === undefined) {
                                       if(loopParam[1].type === 'number') init = 0;
                                       if(loopParam[1].type === 'boolean') init = false;
                                       if(loopParam[1].type === 'string') init = '';
                                   } else {
                                       init = loopParam[1].def;
                                   }
                                   setTimeout(function() {
                                       setState(loopParam[0], init, true, function() {
                                           if (LOG_DEBUG) log('[Debug] setState durchgeführt: ' + loopParam[0]);
                                           numStates--;
                                           if (numStates === 0) {
                                               if (LOG_DEBUG) log('[Debug] All states processed.');
                                               if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                                   if (LOG_DEBUG) log('[Debug] Function to callback parameter was provided');
                                                   return callback();
                                               }
                                           }
                                       });
                                   }, DELAY + (20 * counter) );
                               }
                           });
                       });
                   }
               }
            
               let statesToCreate = [
            
                  //Bewässerung
                  [pfad+'bewaesserung_aktiv', {'name':'bewaesserung_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'bewaesserung_automatik', {'name':'bewaesserung_automatik','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'bewaesserung_pause', {'name':'bewaesserung_pause','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
            
                  //Timer
                  [pfad+'lautzeit_gesamt_in_sek', {'name':'lautzeit_gesamt_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
                  [pfad+'lautzeit_ende_uhrzeit', {'name':'lautzeit_ende_uhrzeit','type':'string','read':true,'write':true,'role':'string','def': '00:00','unit': 'Uhr'}],
                  [pfad+'restlautzeit', {'name':'restlautzeit','type': 'string','read':true,'write':true,'role':'string','def':0,'unit':'Minuten'}],
                  [pfad+'restlautzeit_in_sek', {'name':'restlautzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
            
                  //Ventile
                  [pfad+'ventile.aktives_ventil', {'name': 'aktives_ventil','type':'string','read':true,'write':true,'role':'string','def':'aus'}],
                  [pfad+'ventile.anzahl_aktive_ventile', {'name':'anzahl_aktive_ventile','type':'number','read':true,'write':true,'role':'number','def':0,'min':0, 'max':4} ],
            
                  //Ventil 1
                  [pfad+'ventile.ventil_1.ventil_1', {'name':'ventil_1','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'ventile.ventil_1.ventil_1_dauer', {'name': 'ventil_1_dauer','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
                  [pfad+'ventile.ventil_1.ventil_1_ende', {'name':'ventil_1_ende','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'ventile.ventil_1.ventil_1_name', {'name':'ventil_1_name','type':'string','read':true,'write':true,'role':'string','def':kreis1}],
                  [pfad+'ventile.ventil_1.ventil_1_restzeit', {'name':'ventil_1_restzeit','type': 'string','read':true,'write':true,'role':'string','def':'0:00','unit':'Minuten'}],
                  [pfad+'ventile.ventil_1.ventil_1_restzeit_in_sek', {'name':'ventil_1_restzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
            
                  //Ventil 2
                  [pfad+'ventile.ventil_2.ventil_2', {'name':'ventil_2','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'ventile.ventil_2.ventil_2_dauer', {'name': 'ventil_2_dauer','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
                  [pfad+'ventile.ventil_2.ventil_2_ende', {'name':'ventil_2_ende','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'ventile.ventil_2.ventil_2_name', {'name':'ventil_2_name','type':'string','read':true,'write':true,'role':'string','def':kreis2}],
                  [pfad+'ventile.ventil_2.ventil_2_restzeit', {'name':'ventil_2_restzeit','type': 'string','read':true,'write':true,'role':'string','def':'0:00','unit':'Minuten'}],
                  [pfad+'ventile.ventil_2.ventil_2_restzeit_in_sek', {'name':'ventil_2_restzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
            
                  //Ventil 3
                  [pfad+'ventile.ventil_3.ventil_3', {'name':'ventil_3','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'ventile.ventil_3.ventil_3_dauer', {'name': 'ventil_3_dauer','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
                  [pfad+'ventile.ventil_3.ventil_3_ende', {'name':'ventil_3_ende','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'ventile.ventil_3.ventil_3_name', {'name':'ventil_3_name','type':'string','read':true,'write':true,'role':'string','def':kreis3}],
                  [pfad+'ventile.ventil_3.ventil_3_restzeit', {'name':'ventil_3_restzeit','type': 'string','read':true,'write':true,'role':'string','def':'0:00','unit':'Minuten'}],
                  [pfad+'ventile.ventil_3.ventil_3_restzeit_in_sek', {'name':'ventil_3_restzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
            
                  //Ventil 4
                  [pfad+'ventile.ventil_4.ventil_4', {'name':'ventil_4','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'ventile.ventil_4.ventil_4_dauer', {'name': 'ventil_4_dauer','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
                  [pfad+'ventile.ventil_4.ventil_4_ende', {'name':'ventil_4_ende','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'ventile.ventil_4.ventil_4_name', {'name':'ventil_4_name','type':'string','read':true,'write':true,'role':'string','def':kreis4}],
                  [pfad+'ventile.ventil_4.ventil_4_restzeit', {'name':'ventil_4_restzeit','type': 'string','read':true,'write':true,'role':'string','def':'0:00','unit':'Minuten'}],
                  [pfad+'ventile.ventil_4.ventil_4_restzeit_in_sek', {'name':'ventil_4_restzeit_in_sek','type':'number','read':true,'write':true,'role':'number','def':0,'unit':'Sekunden'}],
            
                  //Zeitplan
                  [pfad+'zeitplan.sonnenaufgang', {'name':'sonnenaufgang','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'zeitplan.sonnenuntergang', {'name':'sonnenuntergang','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  //Morgens
                  [pfad+'zeitplan.morgens_aktiv', {'name':'morgens_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'zeitplan.morgens_uhrzeit_start', {'name':'morgens_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'zeitplan.morgens_uhrzeit_start_stunde', {'name':'morgens_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':'0'}],
                  [pfad+'zeitplan.morgens_uhrzeit_start_minute', {'name':'morgens_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':'0'}],
                  [pfad+'zeitplan.morgens_verzoegerung_sonnenaufgang', {'name':'morgens_verzoegerung_sonnenaufgang','type': 'string','read':true,'write':true,'role':'string','def':0,'unit':'Minuten'}],
            
                  //Abends
                  [pfad+'zeitplan.abends_aktiv', {'name':'abends_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'zeitplan.abends_uhrzeit_start', {'name':'abends_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'zeitplan.abends_uhrzeit_start_stunde', {'name':'abends_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':'0'}],
                  [pfad+'zeitplan.abends_uhrzeit_start_minute', {'name':'abends_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':'0'}],
                  [pfad+'zeitplan.abends_verzoegerung_sonnenuntergang', {'name':'abends_verzoegerung_sonnenuntergang','type': 'string','read':true,'write':true,'role':'string','def':0,'unit':'Minuten'}],
            
                  //Feste Startzeit 1
                  [pfad+'zeitplan.feste_startzeit_1_aktiv', {'name':'feste_startzeit_1_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'zeitplan.feste_startzeit_1_uhrzeit_start', {'name':'feste_startzeit_1_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'zeitplan.feste_startzeit_1_uhrzeit_start_stunde', {'name':'feste_startzeit_1_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':0}],
                  [pfad+'zeitplan.feste_startzeit_1_uhrzeit_start_minute', {'name':'feste_startzeit_1_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':0}],
            
                  //Feste Startzeit 2
                  [pfad+'zeitplan.feste_startzeit_2_aktiv', {'name':'feste_startzeit_2_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'zeitplan.feste_startzeit_2_uhrzeit_start', {'name':'feste_startzeit_2_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'zeitplan.feste_startzeit_2_uhrzeit_start_stunde', {'name':'feste_startzeit_2_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':0}],
                  [pfad+'zeitplan.feste_startzeit_2_uhrzeit_start_minute', {'name':'feste_startzeit_2_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':0}],
            
                  //Feste Startzeit 3
                  [pfad+'zeitplan.feste_startzeit_3_aktiv', {'name':'feste_startzeit_3_aktiv','type':'boolean','read':true,'write':true,'role':'switch','def':false}],
                  [pfad+'zeitplan.feste_startzeit_3_uhrzeit_start', {'name':'feste_startzeit_3_uhrzeit_start','type':'string','read':true,'write':true,'role':'string','def':'00:00','unit':'Uhr'}],
                  [pfad+'zeitplan.feste_startzeit_3_uhrzeit_start_stunde', {'name':'feste_startzeit_3_uhrzeit_start_stunde','type':'string','read':true,'write':true,'role':'string','def':0}],
                  [pfad+'zeitplan.feste_startzeit_3_uhrzeit_start_minute', {'name':'feste_startzeit_3_uhrzeit_start_minute','type':'string','read':true,'write':true,'role':'string','def':0}],
               ];
                   createUserStates(speicherort, false, statesToCreate);
            }
            
            /**
            * Beschreibe diese Funktion …
            */
            function Variablen_definieren() {
             // --- Die folgenden Variablen bitte anpassen ---
             // Bitte hier den Speicheroprt angeben.z.B.javascript.0.bewasserung0_userdata.0.Garten.Bewasserung
             vars_pfad = 'javascript.0.bewaesserung.';
             // Mögliche Werte:hm = Homematic Aktorsonoff = Sonoff Aktor
             vars_aktor_typ = 'hm';
             // Hier bitte dem Namen des Aktor eintragen.hm-rpc.0.QEQ12345678sonoff.0.Bewaesserung
             vars_aktor_name = 'hm-rpc.0.QEQ0661312';
             // Nur notendig wenn ein Sonoff Aktor verwendet wird.Bitte die IP vom aktor eintragen
             vars_sonoff_ip = '192.168.4.110';
             // Pfad zum STATE um die Pumpe zu aktivieren.Falls
             // nicht notwensig, einfach das Feld leer lassen.
             vars_pumpe = '';
             // Soll per Mail über Start und Stop informiert werden?Mögliche Werte:truefalse
             vars_notify_mail = true;
             // Soll per Alexa über Start und Stop informiert werden?Mögliche Werte:truefalse
             vars_notify_alexa = false;
             // Hier bitte den State vom Alexa Device Eintragen:Beispiel:alexa2.0.Echo-Devices.ABCDEFGHIJK.Commands.announcement
             vars_notify_alexa_device = 'javascript.0.echo.sprachausgabe_alle_geraete';
             // Soll per Pushover über Start und Stop informiert werden?Mögliche Werte:truefalse
             vars_notify_pushover = false;
             // Sollen bei Start und Stop Log-Einträge generiert werden ?Mögliche Werte:truefalse
             vars_notify_log = false;
             // Wettervorhersage: Tagehöchstwertz.B.:
             // daswetter.0.NextDays.Location_1.Day_1.Maximale_Temperatur_valuefalse,
             // wenn keine Werte verwendet werden können
             vars_wetter_max_temp = 'daswetter.0.NextDays.Location_1.Day_1.Maximale_Temperatur_value';
             // Hier bitte den Schwellwerte der Temepratur eingeben, ab wann in der
             // Automatik beregnet werden soll.z.B.: 24 fuer groesser/gleich 24°C
             vars_schwellwert_temperatur = 0;
             // Wettervorhersage: erwartete Regenmengez.B.:daswetter.0.NextDaysDetailed.Location_1.Day_1.rain_valuefalse, wenn keine Werte verwendet werden koennen
             vars_wetter_regen = 'daswetter.0.NextDaysDetailed.Location_1.Day_1.rain_value';
             // Hier bitte den Schwellwerte der maximalen Regenmenge eingeben,
             // bis wann die Automatik beregnen soll.z.B.: 0.5 fuer 0.5mm
             vars_schwellwert_regen = 0;
             // --- Ab hier nichts mehr aendern ---
             // Bewaesserung
             vars_bewaesserung_aktiv = String(vars_pfad) + 'bewaesserung_aktiv';
             vars_bewaesserung_automatik = String(vars_pfad) + 'bewaesserung_automatik';
             vars_bewaesserung_pause = String(vars_pfad) + 'bewaesserung_pause';
             // Laufzeit
             vars_laufzeit_gesamt_in_sek = String(vars_pfad) + 'lautzeit_gesamt_in_sek';
             vars_lautzeit_ende_uhrzeit = String(vars_pfad) + 'lautzeit_ende_uhrzeit';
             vars_restlautzeit = String(vars_pfad) + 'restlautzeit';
             vars_restlautzeit_in_sek = String(vars_pfad) + 'restlautzeit_in_sek';
             // Ventile
             if (vars_aktor_typ == 'hm') {
               vars_ventil_1_aktor = String(vars_aktor_name) + '.1.STATE';
               vars_ventil_1_aktor_ontime = String(vars_aktor_name) + '.1.ON_TIME';
               vars_ventil_2_aktor = String(vars_aktor_name) + '.2.STATE';
               vars_ventil_2_aktor_ontime = String(vars_aktor_name) + '.2.ON_TIME';
               vars_ventil_3_aktor = String(vars_aktor_name) + '.3.STATE';
               vars_ventil_3_aktor_ontime = String(vars_aktor_name) + '.3.ON_TIME';
               vars_ventil_4_aktor = String(vars_aktor_name) + '.4.STATE';
               vars_ventil_4_aktor_ontime = String(vars_aktor_name) + '.4.ON_TIME';
             }
             if (vars_aktor_typ == 'sonoff') {
               vars_ventil_1_aktor = String(vars_aktor_name) + '.POWER1';
               vars_ventil_2_aktor = String(vars_aktor_name) + '.POWER2';
               vars_ventil_3_aktor = String(vars_aktor_name) + '.POWER3';
               vars_ventil_4_aktor = String(vars_aktor_name) + '.POWER4';
             }
             vars_aktives_ventil = String(vars_pfad) + 'ventile.aktives_ventil';
             vars_anzahl_aktive_ventile = String(vars_pfad) + 'ventile.anzahl_aktive_ventile';
             //   Ventil 1
             vars_ventil_1 = String(vars_pfad) + 'ventile.ventil_1.ventil_1';
             vars_ventil_1_dauer = String(vars_pfad) + 'ventile.ventil_1.ventil_1_dauer';
             vars_ventil_1_ende = String(vars_pfad) + 'ventile.ventil_1.ventil_1_ende';
             vars_ventil_1_name = String(vars_pfad) + 'ventile.ventil_1.ventil_1_name';
             vars_ventil_1_restzeit = String(vars_pfad) + 'ventile.ventil_1.ventil_1_restzeit';
             vars_ventil_1_restzeit_in_sek = String(vars_pfad) + 'ventile.ventil_1.ventil_1_restzeit_in_sek';
             //   Ventil 2
             vars_ventil_2 = String(vars_pfad) + 'ventile.ventil_2.ventil_2';
             vars_ventil_2_dauer = String(vars_pfad) + 'ventile.ventil_2.ventil_2_dauer';
             vars_ventil_2_ende = String(vars_pfad) + 'ventile.ventil_2.ventil_2_ende';
             vars_ventil_2_name = String(vars_pfad) + 'ventile.ventil_2.ventil_2_name';
             vars_ventil_2_restzeit = String(vars_pfad) + 'ventile.ventil_2.ventil_2_restzeit';
             vars_ventil_2_restzeit_in_sek = String(vars_pfad) + 'ventile.ventil_2.ventil_2_restzeit_in_sek';
             //   Ventil 3
             vars_ventil_3 = String(vars_pfad) + 'ventile.ventil_3.ventil_3';
             vars_ventil_3_dauer = String(vars_pfad) + 'ventile.ventil_3.ventil_3_dauer';
             vars_ventil_3_ende = String(vars_pfad) + 'ventile.ventil_3.ventil_3_ende';
             vars_ventil_3_name = String(vars_pfad) + 'ventile.ventil_3.ventil_3_name';
             vars_ventil_3_restzeit = String(vars_pfad) + 'ventile.ventil_3.ventil_3_restzeit';
             vars_ventil_3_restzeit_in_sek = String(vars_pfad) + 'ventile.ventil_3.ventil_3_restzeit_in_sek';
             //   Ventil 4
             vars_ventil_4 = String(vars_pfad) + 'ventile.ventil_4.ventil_4';
             vars_ventil_4_dauer = String(vars_pfad) + 'ventile.ventil_4.ventil_4_dauer';
             vars_ventil_4_ende = String(vars_pfad) + 'ventile.ventil_4.ventil_4_ende';
             vars_ventil_4_name = String(vars_pfad) + 'ventile.ventil_4.ventil_4_name';
             vars_ventil_4_restzeit = String(vars_pfad) + 'ventile.ventil_4.ventil_4_restzeit';
             vars_ventil_4_restzeit_in_sek = String(vars_pfad) + 'ventile.ventil_4.ventil_4_restzeit_in_sek';
             // Zeitplan
             vars_sonnenaufgang = String(vars_pfad) + 'zeitplan.sonnenaufgang';
             vars_sonnenuntergang = String(vars_pfad) + 'zeitplan.sonnenuntergang';
             //   Morgens
             vars_morgens_aktiv = String(vars_pfad) + 'zeitplan.morgens_aktiv';
             vars_morgens_uhrzeit_start = String(vars_pfad) + 'zeitplan.morgens_uhrzeit_start';
             vars_morgens_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.morgens_uhrzeit_start_stunde';
             vars_morgens_urhzeit_start_minute = String(vars_pfad) + 'zeitplan.morgens_uhrzeit_start_minute';
             vars_morgens_verzoegerung_sonnenaufgang = String(vars_pfad) + 'zeitplan.morgens_verzoegerung_sonnenaufgang';
             //   Abends
             vars_abends_aktiv = String(vars_pfad) + 'zeitplan.abends_aktiv';
             vars_abends_uhrzeit_start = String(vars_pfad) + 'zeitplan.abends_uhrzeit_start';
             vars_abends_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.abends_uhrzeit_start_stunde';
             vars_abends_uhrzeit_start_minute = String(vars_pfad) + 'zeitplan.abends_uhrzeit_start_minute';
             vars_abends_verzoegerung_sonnenuntergang = String(vars_pfad) + 'zeitplan.abends_verzoegerung_sonnenuntergang';
             //   Feste Startzeit 1
             vars_feste_startzeit_1_aktiv = String(vars_pfad) + 'zeitplan.feste_startzeit_1_aktiv';
             vars_feste_startzeit_1_uhrzeit_start = String(vars_pfad) + 'zeitplan.feste_startzeit_1_uhrzeit_start';
             vars_feste_startzeit_1_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.feste_startzeit_1_uhrzeit_start_stunde';
             vars_feste_startzeit_1_uhrzeit_start_minute = String(vars_pfad) + 'zeitplan.feste_startzeit_1_uhrzeit_start_minute';
             // Feste Startzeit 2
             vars_feste_startzeit_2_aktiv = String(vars_pfad) + 'zeitplan.feste_startzeit_2_aktiv';
             vars_feste_startzeit_2_uhrzeit_start = String(vars_pfad) + 'zeitplan.feste_startzeit_2_uhrzeit_start';
             vars_feste_startzeit_2_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.feste_startzeit_2_uhrzeit_start_stunde';
             vars_feste_startzeit_2_uhrzeit_start_minute = String(vars_pfad) + 'zeitplan.feste_startzeit_2_uhrzeit_start_minute';
             // Feste Startzeit 3
             vars_feste_startzeit_3_aktiv = String(vars_pfad) + 'zeitplan.feste_startzeit_3_aktiv';
             vars_feste_startzeit_3_uhrzeit_start = String(vars_pfad) + 'zeitplan.feste_startzeit_3_uhrzeit_start';
             vars_feste_startzeit_3_uhrzeit_start_stunde = String(vars_pfad) + 'zeitplan.feste_startzeit_3_uhrzeit_start_stunde';
             vars_feste_startzeit_3_uhrzeit_start_minute = String(vars_pfad) + 'zeitplan.feste_startzeit_3_uhrzeit_start_minute';
            }
            
            
            Variablen_definieren();
            // Sonnenauf- und Sonnenuntergang
            schedule("10 0,12 * * *", function () {
             setStateDelayed(vars_sonnenaufgang, ('' + formatDate(getDateObject(getAstroDate("sunrise", undefined, 0)), "hh:mm")), true, parseInt(0, 10), false);
             setStateDelayed(vars_sonnenuntergang, ('' + formatDate(getDateObject(getAstroDate("sunset", undefined, 0)), "hh:mm")), true, parseInt(0, 10), false);
            });
            // Startzeit fuer Automatik berechnen
            on({id: new RegExp(vars_morgens_verzoegerung_sonnenaufgang + "|" + vars_abends_verzoegerung_sonnenuntergang + "|" + vars_sonnenaufgang + "|" + vars_sonnenuntergang), change: "ne"}, function (obj) {
               // Morgens
             startzeit_sonnenaufgang = (function () {var v = getDateObject(getAstroDate("sunrise", undefined, 0)); return v.getHours() * 60 + v.getMinutes();})() + parseFloat(getState(vars_morgens_verzoegerung_sonnenaufgang).val);
             startzeit_sonnenaufgang_stunde = Math.floor(startzeit_sonnenaufgang / 60);
             startzeit_sonnenaufgang_minute = startzeit_sonnenaufgang - startzeit_sonnenaufgang_stunde * 60;
             // Stunde und Minute in Objekt fuer cron
             setStateDelayed(vars_morgens_uhrzeit_start_stunde, ('' + startzeit_sonnenaufgang_stunde), true, parseInt(0, 10), false);
             setStateDelayed(vars_morgens_urhzeit_start_minute, ('' + startzeit_sonnenaufgang_minute), true, parseInt(0, 10), false);
             // Uhrzeit fuer VIS
             if (startzeit_sonnenaufgang_stunde < 10) {
               startzeit_sonnenaufgang_stunde = '0' + String(startzeit_sonnenaufgang_stunde);
             }
             if (startzeit_sonnenaufgang_minute < 10) {
               startzeit_sonnenaufgang_minute = '0' + String(startzeit_sonnenaufgang_minute);
             }
             setStateDelayed(vars_morgens_uhrzeit_start, ([startzeit_sonnenaufgang_stunde,':',startzeit_sonnenaufgang_minute].join('')), true, parseInt(0, 10), false);
             // Abends
             startzeit_sonnenuntergang = (function () {var v = getDateObject(getAstroDate("sunset", undefined, 0)); return v.getHours() * 60 + v.getMinutes();})() + parseFloat(getState(vars_abends_verzoegerung_sonnenuntergang).val);
             startzeit_sonnenuntergang_stunde = Math.floor(startzeit_sonnenuntergang / 60);
             startzeit_sonnenuntergang_minute = startzeit_sonnenuntergang - startzeit_sonnenuntergang_stunde * 60;
             // Stunde und Minute in Objekt fuer cron
             setStateDelayed(vars_abends_uhrzeit_start_stunde, ('' + startzeit_sonnenuntergang_stunde), true, parseInt(0, 10), false);
             setStateDelayed(vars_abends_uhrzeit_start_minute, ('' + startzeit_sonnenuntergang_minute), true, parseInt(0, 10), false);
             // Uhrzeit fuer VIS
             if (startzeit_sonnenuntergang_stunde < 10) {
               startzeit_sonnenuntergang_stunde = '0' + String(startzeit_sonnenuntergang_stunde);
             }
             if (startzeit_sonnenuntergang_minute < 10) {
               startzeit_sonnenuntergang_minute = '0' + String(startzeit_sonnenuntergang_minute);
             }
             setStateDelayed(vars_abends_uhrzeit_start, ([startzeit_sonnenuntergang_stunde,':',startzeit_sonnenuntergang_minute].join('')), true, parseInt(0, 10), false);
            });
            // Pumpe einschalten
            on({id: vars_bewaesserung_aktiv, change: "ne"}, function (obj) {
             var value = obj.state.val;
             var oldValue = obj.oldState.val;
             if (getState(vars_bewaesserung_aktiv).val == true && vars_pumpe != '') {
               if (getState(vars_pumpe).val == false) {
                 setStateDelayed(vars_pumpe, true, false, parseInt(0, 10), false);
               }
             } else if (getState(vars_bewaesserung_aktiv).val == false && vars_pumpe != '') {
               if (getState(vars_pumpe).val == true) {
                 setStateDelayed(vars_pumpe, false, false, parseInt(0, 10), false);
               }
             }
            });
            // Bewaesserung autom. starten
            on({id: new RegExp(vars_morgens_verzoegerung_sonnenaufgang + "|" + vars_abends_verzoegerung_sonnenuntergang + "|" + vars_feste_startzeit_1_uhrzeit_start_stunde + "|" + vars_feste_startzeit_1_uhrzeit_start_minute + "|" + vars_feste_startzeit_2_uhrzeit_start_stunde + "|" + vars_feste_startzeit_2_uhrzeit_start_minute + "|" + vars_feste_startzeit_3_uhrzeit_start_stunde + "|" + vars_feste_startzeit_3_uhrzeit_start_minute + "|" + vars_sonnenaufgang), change: "ne"}, function (obj) {
               timeout = setTimeout(function () {
               // Morgens
               (function () {if (morgens) {clearSchedule(morgens); morgens = null;}})();
               morgens = schedule(('' + getState(vars_morgens_urhzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_morgens_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
                 if (getState(vars_morgens_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == true && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
                   setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
                 }
               });
               // Abends
               (function () {if (abends) {clearSchedule(abends); abends = null;}})();
               abends = schedule(('' + getState(vars_abends_uhrzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_abends_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
                 if (getState(vars_abends_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == true && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
                   setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
                 }
               });
               // Feste Uhrzeit 1
               if (getState(vars_feste_startzeit_1_uhrzeit_start_stunde).val < '10') {
                 startzeit_fix_stunde = '0' + String(getState(vars_feste_startzeit_1_uhrzeit_start_stunde).val);
               } else {
                 startzeit_fix_stunde = getState(vars_feste_startzeit_1_uhrzeit_start_stunde).val;
               }
               if (getState(vars_feste_startzeit_1_uhrzeit_start_minute).val < '10') {
                 startzeit_fix_minute = '0' + String(getState(vars_feste_startzeit_1_uhrzeit_start_minute).val);
               } else {
                 startzeit_fix_minute = getState(vars_feste_startzeit_1_uhrzeit_start_minute).val;
               }
               setStateDelayed(vars_feste_startzeit_1_uhrzeit_start, ([startzeit_fix_stunde,':',startzeit_fix_minute].join('')), true, parseInt(0, 10), false);
               (function () {if (fix_1) {clearSchedule(fix_1); fix_1 = null;}})();
               fix_1 = schedule(('' + getState(vars_feste_startzeit_1_uhrzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_feste_startzeit_1_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
                 if (getState(vars_feste_startzeit_1_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == false && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
                   setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
                 }
               });
               // Feste Uhrzeit 2
               if (getState(vars_feste_startzeit_2_uhrzeit_start_stunde).val < '10') {
                 startzeit_fix_2_stunde = '0' + String(getState(vars_feste_startzeit_2_uhrzeit_start_stunde).val);
               } else {
                 startzeit_fix_2_stunde = getState(vars_feste_startzeit_2_uhrzeit_start_stunde).val;
               }
               if (getState(vars_feste_startzeit_2_uhrzeit_start_minute).val < '10') {
                 startzeit_fix_2_minunte = '0' + String(getState(vars_feste_startzeit_2_uhrzeit_start_minute).val);
               } else {
                 startzeit_fix_2_minunte = getState(vars_feste_startzeit_2_uhrzeit_start_minute).val;
               }
               setStateDelayed(vars_feste_startzeit_2_uhrzeit_start, ([startzeit_fix_2_stunde,':',startzeit_fix_2_minunte].join('')), true, parseInt(0, 10), false);
               (function () {if (fix_2) {clearSchedule(fix_2); fix_2 = null;}})();
               fix_2 = schedule(('' + getState(vars_feste_startzeit_2_uhrzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_feste_startzeit_2_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
                 if (getState(vars_feste_startzeit_2_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == false && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
                   setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
                 }
               });
               // Feste Uhrzeit 3
               if (getState(vars_feste_startzeit_3_uhrzeit_start_stunde).val < '10') {
                 startzeit_fix_3_stunde = '0' + String(getState(vars_feste_startzeit_3_uhrzeit_start_stunde).val);
               } else {
                 startzeit_fix_3_stunde = getState(vars_feste_startzeit_3_uhrzeit_start_stunde).val;
               }
               if (getState(vars_feste_startzeit_3_uhrzeit_start_minute).val < '10') {
                 startzeit_fix_3_minute = '0' + String(getState(vars_feste_startzeit_3_uhrzeit_start_minute).val);
               } else {
                 startzeit_fix_3_minute = getState(vars_feste_startzeit_3_uhrzeit_start_minute).val;
               }
               setStateDelayed(vars_feste_startzeit_3_uhrzeit_start, ([startzeit_fix_3_stunde,':',startzeit_fix_3_minute].join('')), true, parseInt(0, 10), false);
               (function () {if (fix_3) {clearSchedule(fix_3); fix_3 = null;}})();
               fix_3 = schedule(('' + getState(vars_feste_startzeit_3_uhrzeit_start_minute).val).trim() + ' ' + ('' + getState(vars_feste_startzeit_3_uhrzeit_start_stunde).val).trim() + ' ' + '*'.trim() + ' ' + '4-10'.trim() + ' ' + '*'.trim(), function () {
                 if (getState(vars_feste_startzeit_3_aktiv).val == true && getState(vars_bewaesserung_automatik).val == true && getState(vars_bewaesserung_aktiv).val == false && (getState(vars_wetter_max_temp).val >= vars_schwellwert_temperatur || vars_wetter_max_temp == 'false') && (getState(vars_wetter_regen).val <= vars_schwellwert_regen || vars_wetter_regen == 'false')) {
                   setStateDelayed(vars_bewaesserung_aktiv, true, true, parseInt(0, 10), false);
                 }
               });
             }, 1000);
            });
            // Enduhrzeiten berechnen
            on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_bewaesserung_pause), change: "ne"}, function (obj) {
               // Gesamt
             if (getState(vars_bewaesserung_aktiv).val == true) {
               // Enduhrzeit berechnen
               // Jedes Ventil startet mit einer Verzögerung von 1 Sekunde.
               // Daher wird pro Ventil 1 Sekunde auf die Gesamtlaufzeit drauf
               // gerechnetGesamtlaufzeit = Jetzt + Laufzeit + Umschaltsekunden
               info_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_restlautzeit_in_sek).val;
               info_endzeit_stunde = Math.floor(info_enduhrzeit_raw / 3600);
               info_endzeit_minute = Math.floor((info_enduhrzeit_raw - info_endzeit_stunde * 3600) / 60);
               info_endzeit_sekunde = info_enduhrzeit_raw - info_endzeit_stunde * 3600;
               info_endzeit_sekunde = info_endzeit_sekunde - info_endzeit_minute * 60;
               // Mail Stunden formatieren bei kleiner 10
               if (info_endzeit_stunde < 10) {
                 info_endzeit_stunde = '0' + String(info_endzeit_stunde);
               }
               // Mail Minuten formatieren bei kleiner 10
               if (info_endzeit_minute < 10) {
                 info_endzeit_minute = '0' + String(info_endzeit_minute);
               }
               // Mail Sekunden formatieren bei kleiner 10
               if (info_endzeit_sekunde < '10') {
                 info_endzeit_sekunde = '0' + String((new Date().getSeconds()));
               }
               setStateDelayed(vars_lautzeit_ende_uhrzeit, ([info_endzeit_stunde,':',info_endzeit_minute,':',info_endzeit_sekunde,' Uhr'].join('')), true, parseInt(0, 10), false);
             }
             // pro Ventil
             if (getState(vars_bewaesserung_aktiv).val == true && getState(vars_bewaesserung_pause).val == false) {
               // Ventil 1 End-Uhrzeit
               if (getState(vars_ventil_1).val == true) {
                 // Plus 1 Sekuden fpr das setzen des wertes ON_TIME des HM Aktors
                 ventil_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_ventil_1_restzeit_in_sek).val + 1;
                 ventil_enduhrzeit_std = Math.floor(ventil_enduhrzeit_raw / 3600);
                 ventil_enduhrzeit_min = Math.floor((ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) / 60);
                 ventil_enduhrzeit_sek = ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600;
                 ventil_enduhrzeit_sek = ventil_enduhrzeit_sek - ventil_enduhrzeit_min * 60;
                 if (ventil_enduhrzeit_std < 10) {
                   ventil_enduhrzeit_std = '0' + String(ventil_enduhrzeit_std);
                 }
                 if (ventil_enduhrzeit_min < 10) {
                   ventil_enduhrzeit_min = '0' + String(ventil_enduhrzeit_min);
                 }
                 if (ventil_enduhrzeit_sek < 10) {
                   ventil_enduhrzeit_sek = '0' + String(ventil_enduhrzeit_sek);
                 }
                 setStateDelayed(vars_ventil_1_ende, ([ventil_enduhrzeit_std,':',ventil_enduhrzeit_min,':',ventil_enduhrzeit_sek].join('')), true, parseInt(0, 10), false);
               } else {
                 setStateDelayed(vars_ventil_1_ende, 'deaktiviert', true, parseInt(0, 10), false);
               }
               // Ventil 2 End-Uhrzeit
               if (getState(vars_ventil_2).val == true) {
                 // Pro aktivem Ventil kommt 1 Sekunde Verzögerung für das setzen von ON_TIME hinzu
                 if (getState(vars_ventil_1).val == false) {
                   ventil_enduhrzeit_verzoegerung = 1;
                 } else if (getState(vars_ventil_1).val == true) {
                   ventil_enduhrzeit_verzoegerung = 2;
                 }
                 ventil_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_ventil_1_restzeit_in_sek).val + getState(vars_ventil_2_restzeit_in_sek).val + ventil_enduhrzeit_verzoegerung;
                 ventil_enduhrzeit_std = Math.floor(ventil_enduhrzeit_raw / 3600);
                 ventil_enduhrzeit_min = Math.floor((ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) / 60);
                 ventil_enduhrzeit_sek = ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600;
                 ventil_enduhrzeit_sek = ventil_enduhrzeit_sek - ventil_enduhrzeit_min * 60;
                 if (ventil_enduhrzeit_std < 10) {
                   ventil_enduhrzeit_std = '0' + String(ventil_enduhrzeit_std);
                 }
                 if (ventil_enduhrzeit_min < 10) {
                   ventil_enduhrzeit_min = '0' + String(ventil_enduhrzeit_min);
                 }
                 if (ventil_enduhrzeit_sek < 10) {
                   ventil_enduhrzeit_sek = '0' + String(ventil_enduhrzeit_sek);
                 }
                 setStateDelayed(vars_ventil_2_ende, ([ventil_enduhrzeit_std,':',ventil_enduhrzeit_min,':',ventil_enduhrzeit_sek].join('')), true, parseInt(0, 10), false);
               } else {
                 setStateDelayed(vars_ventil_2_ende, 'deaktiviert', true, parseInt(0, 10), false);
               }
               // Ventil 3 End-Uhrzeit
               if (getState(vars_ventil_3).val == true) {
                 // Pro aktivem Ventil kommt 1 Sekunde Verzögerung für das setzen von ON_TIME hinzu
                 if (getState(vars_ventil_3).val == true) {
                   if (getState(vars_ventil_1).val == false && getState(vars_ventil_2).val == false) {
                     ventil_enduhrzeit_verzoegerung = 1;
                   }
                   if (getState(vars_ventil_1).val == true || getState(vars_ventil_2).val == true) {
                     ventil_enduhrzeit_verzoegerung = 2;
                   }
                   if (getState(vars_ventil_1).val == true && getState(vars_ventil_2).val == true) {
                     ventil_enduhrzeit_verzoegerung = 3;
                   }
                 }
                 ventil_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_ventil_1_restzeit_in_sek).val + getState(vars_ventil_2_restzeit_in_sek).val + getState(vars_ventil_3_restzeit_in_sek).val + ventil_enduhrzeit_verzoegerung;
                 ventil_enduhrzeit_std = Math.floor(ventil_enduhrzeit_raw / 3600);
                 ventil_enduhrzeit_min = Math.floor((ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) / 60);
                 ventil_enduhrzeit_sek = (ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) - ventil_enduhrzeit_min * 60;
                 if (ventil_enduhrzeit_std < 10) {
                   ventil_enduhrzeit_std = '0' + String(ventil_enduhrzeit_std);
                 }
                 if (ventil_enduhrzeit_min < 10) {
                   ventil_enduhrzeit_min = '0' + String(ventil_enduhrzeit_min);
                 }
                 if (ventil_enduhrzeit_sek < 10) {
                   ventil_enduhrzeit_sek = '0' + String(ventil_enduhrzeit_sek);
                 }
                 setStateDelayed(vars_ventil_3_ende, ([ventil_enduhrzeit_std,':',ventil_enduhrzeit_min,':',ventil_enduhrzeit_sek].join('')), true, parseInt(0, 10), false);
               } else {
                 setStateDelayed(vars_ventil_3_ende, 'deaktiviert', true, parseInt(0, 10), false);
               }
               // Ventil 4 End-Uhrzeit
               if (getState(vars_ventil_4).val == true) {
                 // Pro aktivem Ventil kommt 1 Sekunde Verzögerung für das setzen von ON_TIME hinzu
                 if (getState(vars_ventil_4).val == true) {
                   if (getState(vars_ventil_1).val == false && getState(vars_ventil_2).val == false && getState(vars_ventil_3).val == false) {
                     ventil_enduhrzeit_verzoegerung = 1;
                   }
                   if (getState(vars_ventil_1).val == true || getState(vars_ventil_2).val == true || getState(vars_ventil_3).val == true) {
                     ventil_enduhrzeit_verzoegerung = 2;
                   }
                   if (getState(vars_ventil_1).val == true && getState(vars_ventil_2).val == true && getState(vars_ventil_3).val == false) {
                     ventil_enduhrzeit_verzoegerung = 3;
                   }
                   if (getState(vars_ventil_1).val == false && getState(vars_ventil_2).val == true && getState(vars_ventil_3).val == true) {
                     ventil_enduhrzeit_verzoegerung = 3;
                   }
                   if (getState(vars_ventil_1).val == true && getState(vars_ventil_2).val == false && getState(vars_ventil_3).val == true) {
                     ventil_enduhrzeit_verzoegerung = 3;
                   }
                   if (getState(vars_ventil_1).val == true && getState(vars_ventil_2).val == true && getState(vars_ventil_3).val == true) {
                     ventil_enduhrzeit_verzoegerung = 4;
                   }
                 }
                 ventil_enduhrzeit_raw = (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) + getState(vars_ventil_1_restzeit_in_sek).val + getState(vars_ventil_2_restzeit_in_sek).val + getState(vars_ventil_3_restzeit_in_sek).val + getState(vars_ventil_4_restzeit_in_sek).val + ventil_enduhrzeit_verzoegerung;
                 ventil_enduhrzeit_std = Math.floor(ventil_enduhrzeit_raw / 3600);
                 ventil_enduhrzeit_min = Math.floor((ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) / 60);
                 ventil_enduhrzeit_sek = (ventil_enduhrzeit_raw - ventil_enduhrzeit_std * 3600) - ventil_enduhrzeit_min * 60;
                 if (ventil_enduhrzeit_std < 10) {
                   ventil_enduhrzeit_std = '0' + String(ventil_enduhrzeit_std);
                 }
                 if (ventil_enduhrzeit_min < 10) {
                   ventil_enduhrzeit_min = '0' + String(ventil_enduhrzeit_min);
                 }
                 if (ventil_enduhrzeit_sek < 10) {
                   ventil_enduhrzeit_sek = '0' + String(ventil_enduhrzeit_sek);
                 }
                 setStateDelayed(vars_ventil_4_ende, ([ventil_enduhrzeit_std,':',ventil_enduhrzeit_min,':',ventil_enduhrzeit_sek].join('')), true, parseInt(0, 10), false);
               } else {
                 setStateDelayed(vars_ventil_4_ende, 'deaktiviert', true, parseInt(0, 10), false);
               }
             } else if (getState(vars_bewaesserung_aktiv).val == false) {
               setStateDelayed(vars_ventil_1_ende, '', true, parseInt(0, 10), false);
               setStateDelayed(vars_ventil_2_ende, '', true, parseInt(0, 10), false);
               setStateDelayed(vars_ventil_3_ende, '', true, parseInt(0, 10), false);
               setStateDelayed(vars_ventil_4_ende, '', true, parseInt(0, 10), false);
             }
            });
            // Laufzeiten setzen
            on({id: new RegExp(vars_ventil_1 + "|" + vars_ventil_2 + "|" + vars_ventil_3 + "|" + vars_ventil_4 + "|" + vars_ventil_1_dauer + "|" + vars_ventil_2_dauer + "|" + vars_ventil_3_dauer + "|" + vars_ventil_4_dauer + "|" + vars_bewaesserung_aktiv), change: "ne"}, function (obj) {
               // Laufzeit Ventile
             if (getState(vars_bewaesserung_aktiv).val == false) {
               // Ventil 1 - Laufzeit
               if (getState(vars_ventil_1).val == true) {
                 ventil_1_dauer = getState(vars_ventil_1_dauer).val;
               } else {
                 ventil_1_dauer = 0;
               }
               setStateDelayed(vars_ventil_1_restzeit, (String(ventil_1_dauer / 60) + ':00'), true, parseInt(0, 10), false);
               setStateDelayed(vars_ventil_1_restzeit_in_sek, ventil_1_dauer, true, parseInt(0, 10), false);
               // Ventil 2 - Laufzeit
               if (getState(vars_ventil_2).val == true) {
                 ventil_2_dauer = getState(vars_ventil_2_dauer).val;
               } else {
                 ventil_2_dauer = 0;
               }
               setStateDelayed(vars_ventil_2_restzeit, (String(ventil_2_dauer / 60) + ':00'), true, parseInt(0, 10), false);
               setStateDelayed(vars_ventil_2_restzeit_in_sek, ventil_2_dauer, true, parseInt(0, 10), false);
               // Ventil 3 - Laufzeit
               if (getState(vars_ventil_3).val == true) {
                 ventil_3_dauer = getState(vars_ventil_3_dauer).val;
               } else {
                 ventil_3_dauer = 0;
               }
               setStateDelayed(vars_ventil_3_restzeit, (String(ventil_3_dauer / 60) + ':00'), true, parseInt(0, 10), false);
               setStateDelayed(vars_ventil_3_restzeit_in_sek, ventil_3_dauer, true, parseInt(0, 10), false);
               // Ventil 4 - Laufzeit
               if (getState(vars_ventil_4).val == true) {
                 ventil_4_dauer = getState(vars_ventil_4_dauer).val;
               } else {
                 ventil_4_dauer = 0;
               }
               setStateDelayed(vars_ventil_4_restzeit, (String(ventil_4_dauer / 60) + ':00'), true, parseInt(0, 10), false);
               setStateDelayed(vars_ventil_4_restzeit_in_sek, ventil_4_dauer, true, parseInt(0, 10), false);
             }
             // Gesamtlaufzeit
             if (getState(vars_bewaesserung_aktiv).val == false) {
               // Gesamtlaufzeit in Sek
               // Pro aktives Ventil wird auf die Gesamtlaufzeit eine
               // Sekunden drauf gerechnet für das setzen der ON_TIME
               setStateDelayed(vars_laufzeit_gesamt_in_sek, (ventil_1_dauer + ventil_2_dauer + ventil_3_dauer + ventil_4_dauer + getState(vars_ventil_1).val + getState(vars_ventil_2).val + getState(vars_ventil_3).val + getState(vars_ventil_4).val), true, parseInt(0, 10), false);
               setStateDelayed(vars_restlautzeit_in_sek, (ventil_1_dauer + ventil_2_dauer + ventil_3_dauer + ventil_4_dauer + getState(vars_ventil_1).val + getState(vars_ventil_2).val + getState(vars_ventil_3).val + getState(vars_ventil_4).val), true, parseInt(0, 10), false);
               // Gesamtlaufzeit fuer die VIS
               restlaufzeit_vis_min = Math.floor(getState(vars_laufzeit_gesamt_in_sek).val / 60);
               restlaufzeit_vis_sek = getState(vars_laufzeit_gesamt_in_sek).val - restlaufzeit_vis_min * 60;
               if (restlaufzeit_vis_sek < 10) {
                 restlaufzeit_vis_sek = '0' + String(restlaufzeit_vis_sek);
               }
               setStateDelayed(vars_restlautzeit, ([restlaufzeit_vis_min,':',restlaufzeit_vis_sek].join('')), true, parseInt(0, 10), false);
             }
            });
            // Mail / Pushover / Alexa
            on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_bewaesserung_pause), change: "ne"}, function (obj) {
               // Start
             if (getState(vars_bewaesserung_aktiv).val == true && getState(vars_bewaesserung_pause).val == false) {
               // Mail Text und Betreff
               waitmail2 = setTimeout(function () {
                 // Aktive Ventile
                 if (getState(vars_ventil_1).val == true) {
                   info_endzeit_aktive_ventile = ['Ventil 1 (',getState(vars_ventil_1_name).val,'): ',getState(vars_ventil_1_ende).val,' Uhr'].join('');
                 }
                 if (getState(vars_ventil_2).val == true) {
                   info_endzeit_aktive_ventile = [info_endzeit_aktive_ventile,'\n','Ventil 2 (',getState(vars_ventil_2_name).val,'): ',getState(vars_ventil_2_ende).val,' Uhr'].join('');
                 }
                 if (getState(vars_ventil_3).val == true) {
                   info_endzeit_aktive_ventile = [info_endzeit_aktive_ventile,'\n','Ventil 3 (',getState(vars_ventil_3_name).val,'): ',getState(vars_ventil_3_ende).val,' Uhr'].join('');
                 }
                 if (getState(vars_ventil_4).val == true) {
                   info_endzeit_aktive_ventile = [info_endzeit_aktive_ventile,'\n','Ventil 4 (',getState(vars_ventil_4_name).val,'): ',getState(vars_ventil_4_ende).val,' Uhr'].join('');
                 }
                 info_text = ['Die Gartenbewässerung wurde akiviert.','\n','\n','Bewässerungsdauer: ' + String(getState(vars_restlautzeit).val),'\n',['Start: ',formatDate(new Date(), "hh:mm:ss"),' Uhr'].join(''),'\n','Ende: ',getState(vars_lautzeit_ende_uhrzeit).val,'\n','\n','Aktive Ventile:','\n',info_endzeit_aktive_ventile].join('');
                 info_betreff = ['+++ ',formatDate(new Date(), "hh:mm"),' Uhr - Gartenbewässerung aktiviert +++'].join('');
                 if (vars_notify_mail == true) {
                   sendTo("email", "send", {
                      text: info_text,
                      to: getState("javascript.0.mailadressen.mailadresse_daniel").val,
                      subject: info_betreff
                   });
                 }
                 if (vars_notify_pushover == true) {
                   sendTo("pushover.0", "send", {
                      message: info_text,
                      sound: "",
                      title: info_betreff
                   });
                 }
               }, 1000);
               // Sprachausgabe
               if (vars_notify_alexa == true) {
                 if (info_endzeit_minute != '00') {
                   setStateDelayed(vars_notify_alexa_device, (['Gartenbewässerung gestartet. ende um ',info_endzeit_stunde,' Uhr ',info_endzeit_minute,' und ',info_endzeit_stunde,' Sekunden'].join('')), true, parseInt(0, 10), false);
                 } else {
                   setStateDelayed(vars_notify_alexa_device, (['Gartenbewässerung gestartet. ende um ',info_endzeit_stunde,'Uhr ',' und ',info_endzeit_stunde,'Sekunden'].join('')), true, parseInt(0, 10), false);
                 }
               }
             }
             // Stop
             if (getState(vars_bewaesserung_aktiv).val == false) {
               if (vars_notify_mail == true) {
                 sendTo("email", "send", {
                    text: 'Gartenbewässerung beendet',
                    to: getState("javascript.0.mailadressen.mailadresse_daniel").val,
                    subject: (['+++ ',formatDate(new Date(), "hh:mm"),' Uhr - Gartenbewässerung beendet +++'].join(''))
                 });
               }
               if (vars_notify_pushover == true) {
                 sendTo("pushover.0", "send", {
                    message: '',
                    sound: "",
                    title: (['+++ ',formatDate(new Date(), "hh:mm"),' Uhr - Gartenbewässerung beendet +++'].join(''))
                 });
               }
               if (vars_notify_alexa == true) {
                 setStateDelayed(vars_notify_alexa_device, 'Gartenbewässerung beendet.', true, parseInt(0, 10), false);
               }
             }
            });
            // Log Eintraege
            on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_ventil_1_aktor + "|" + vars_ventil_2_aktor + "|" + vars_ventil_3_aktor + "|" + vars_ventil_4_aktor), change: "ne"}, function (obj) {
               if (vars_notify_log == true) {
               // +++ Bewässerung gestartet +++
               // Log Eintrag wird nur ausgegeben, wenn alle Ventile aus
               // sind, und die Variable sich vor 1 Sek geändert hat.
               if (getState(vars_bewaesserung_aktiv).val == true && formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_bewaesserung_aktiv).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_bewaesserung_aktiv).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 1 && getState(vars_ventil_1_aktor).lc == false && getState(vars_ventil_2_aktor).lc == false && getState(vars_ventil_3_aktor).lc == false && getState(vars_ventil_4_aktor).lc == false) {
                 console.log('+++ Bewässerung gestartet +++');
               } else if (getState(vars_bewaesserung_aktiv).val == false) {
                 console.log('+++ Bewässerung beendet +++');
               }
               // Ventil 1
               if (formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_ventil_1_aktor).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_ventil_1_aktor).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 5) {
                 if (getState(vars_ventil_1_aktor).val == true) {
                   console.log((['+++ Bewässerung: Ventil 1 - ',getState(vars_ventil_1_name).val,' aktiv +++'].join('')));
                 }
               }
               // Ventil 2
               if (formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_ventil_2_aktor).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_ventil_2_aktor).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 5) {
                 if (getState(vars_ventil_2_aktor).val == true) {
                   console.log((['+++ Bewässerung: Ventil 2 - ',getState(vars_ventil_2_name).val,' aktiv +++'].join('')));
                 }
               }
               // Ventil 3
               if (formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_ventil_3_aktor).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_ventil_3_aktor).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 5) {
                 if (getState(vars_ventil_3_aktor).val == true) {
                   console.log((['+++ Bewässerung: Ventil 3 - ',getState(vars_ventil_3_name).val,' aktiv +++'].join('')));
                 }
               }
               // Ventil 4
               if (formatDate(new Date(), "DD.MM.YYYY") == formatDate(getDateObject(getState(vars_ventil_4_aktor).lc), "DD.MM.YYYY") && (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds()) - (function () {var v = getDateObject(getState(vars_ventil_4_aktor).lc); return v.getHours() * 3600 + v.getMinutes() * 60 + v.getSeconds();})() <= 5) {
                 if (getState(vars_ventil_4_aktor).val == true) {
                   console.log((['+++ Bewässerung: Ventil 4 - ',getState(vars_ventil_4_name).val,' aktiv +++'].join('')));
                 }
               }
             }
            });
            // Aktive Ventile zaehlen
            on({id: new RegExp(vars_ventil_1_aktor + "|" + vars_ventil_2_aktor + "|" + vars_ventil_3_aktor + "|" + vars_ventil_4_aktor), change: "ne"}, function (obj) {
               setStateDelayed(vars_anzahl_aktive_ventile, 0, true, parseInt(0, 10), false);
             setStateDelayed(vars_anzahl_aktive_ventile, (getState(vars_ventil_1_aktor).val + getState(vars_ventil_2_aktor).val + getState(vars_ventil_3_aktor).val + getState(vars_ventil_4_aktor).val), true, parseInt(0, 10), false);
            });
            // Ventil Steuerung
            on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_bewaesserung_pause + "|" + vars_restlautzeit_in_sek), change: "ne"}, function (obj) {
               if (getState(vars_bewaesserung_aktiv).val == true && getState(vars_bewaesserung_pause).val == false) {
               // Ventil 1
               if (getState(vars_ventil_1).val == true && getState(vars_ventil_1_restzeit_in_sek).val != 0) {
                 if (getState(vars_ventil_1_aktor).val == false && getState(vars_anzahl_aktive_ventile).val < 3) {
                   // Einshaltdauer setzen
                   if (vars_aktor_typ == 'hm') {
                     // ON_TIME fuer Homematic
                     setStateDelayed(vars_ventil_1_aktor_ontime, parseFloat(getState(vars_ventil_1_restzeit_in_sek).val), false, parseInt(0, 10), false);
                   } else if (vars_aktor_typ == 'sonoff') {
                     // PulseTime fuer Sonoff
                     try {
                       require("request")((['http://',vars_sonoff_ip,'/cm?cmnd=PulseTime1%20 ',100 + getState(vars_ventil_1_restzeit_in_sek).val].join(''))).on("error", function (e) {console.error(e);});
                     } catch (e) { console.error(e); }
                   }
                   setStateDelayed(vars_ventil_1_aktor, true, false, parseInt(1000, 10), false);
                   setStateDelayed(vars_aktives_ventil, 'ventil_1', true, parseInt(1000, 10), false);
                 }
               }
               // Ventil 2
               if ((getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && getState(vars_ventil_2).val == true && getState(vars_ventil_2_restzeit_in_sek).val != 0) {
                 if (getState(vars_ventil_2_aktor).val == false && getState(vars_anzahl_aktive_ventile).val < 3) {
                   // Ventil 1 ausschalten
                   if (getState(vars_ventil_1_aktor).val == true) {
                     setStateDelayed(vars_ventil_1_aktor, false, false, parseInt(0, 10), false);
                   }
                   // Einshaltdauer setzen
                   if (vars_aktor_typ == 'hm') {
                     // ON_TIME fuer Homematic
                     setStateDelayed(vars_ventil_2_aktor_ontime, parseFloat(getState(vars_ventil_2_restzeit_in_sek).val), false, parseInt(0, 10), false);
                   } else if (vars_aktor_typ == 'sonoff') {
                     // PulseTime fuer Sonoff
                     try {
                       require("request")((['http://',vars_sonoff_ip,'/cm?cmnd=PulseTime2%20 ',100 + getState(vars_ventil_2_restzeit_in_sek).val].join(''))).on("error", function (e) {console.error(e);});
                     } catch (e) { console.error(e); }
                   }
                   setStateDelayed(vars_ventil_2_aktor, true, false, parseInt(1000, 10), false);
                   setStateDelayed(vars_aktives_ventil, 'ventil_2', true, parseInt(1000, 10), false);
                 }
               }
               // Ventil 3
               if ((getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && (getState(vars_ventil_2).val == false || getState(vars_ventil_2_restzeit_in_sek).val == 0) && getState(vars_ventil_3).val == true && getState(vars_ventil_3_restzeit_in_sek).val != 0) {
                 if (getState(vars_ventil_3_aktor).val == false && getState(vars_anzahl_aktive_ventile).val < 3) {
                   // Ventil 2 ausschalten
                   if (getState(vars_ventil_2_aktor).val == true) {
                     setStateDelayed(vars_ventil_2_aktor, false, false, parseInt(0, 10), false);
                   }
                   // Einshaltdauer setzen
                   if (vars_aktor_typ == 'hm') {
                     // ON_TIME fuer Homematic
                     setStateDelayed(vars_ventil_3_aktor_ontime, parseFloat(getState(vars_ventil_3_restzeit_in_sek).val), false, parseInt(0, 10), false);
                   } else if (vars_aktor_typ == 'sonoff') {
                     // PulseTime fuer Sonoff
                     try {
                       require("request")((['http://',vars_sonoff_ip,'/cm?cmnd=PulseTime3%20 ',100 + getState(vars_ventil_3_restzeit_in_sek).val].join(''))).on("error", function (e) {console.error(e);});
                     } catch (e) { console.error(e); }
                   }
                   setStateDelayed(vars_ventil_3_aktor, true, false, parseInt(1000, 10), false);
                   setStateDelayed(vars_aktives_ventil, 'ventil_3', true, parseInt(1000, 10), false);
                 }
               }
               // Ventil 4
               if ((getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && (getState(vars_ventil_2).val == false || getState(vars_ventil_2_restzeit_in_sek).val == 0) && (getState(vars_ventil_3).val == false || getState(vars_ventil_3_restzeit_in_sek).val == 0) && getState(vars_ventil_4).val == true && getState(vars_ventil_4_restzeit_in_sek).val != 0) {
                 if (getState(vars_ventil_4_aktor).val == false && getState(vars_anzahl_aktive_ventile).val < 3) {
                   // Ventil 3 ausschalten
                   if (getState(vars_ventil_3_aktor).val == true) {
                     setStateDelayed(vars_ventil_3_aktor, false, false, parseInt(0, 10), false);
                   }
                   // Einshaltdauer setzen
                   if (vars_aktor_typ == 'hm') {
                     // ON_TIME fuer Homematic
                     setStateDelayed(vars_ventil_4_aktor_ontime, parseFloat(getState(vars_ventil_4_restzeit_in_sek).val), false, parseInt(0, 10), false);
                   } else if (vars_aktor_typ == 'sonoff') {
                     // PulseTime fuer Sonoff
                     try {
                       require("request")((['http://',vars_sonoff_ip,'/cm?cmnd=PulseTime4%20 ',100 + getState(vars_ventil_4_restzeit_in_sek).val].join(''))).on("error", function (e) {console.error(e);});
                     } catch (e) { console.error(e); }
                   }
                   setStateDelayed(vars_ventil_4_aktor, true, false, parseInt(1000, 10), false);
                   setStateDelayed(vars_aktives_ventil, 'ventil_4', true, parseInt(1000, 10), false);
                 }
               }
             } else if (getState(vars_bewaesserung_aktiv).val == true && getState(vars_bewaesserung_pause).val == true) {
               // Ventil 1 pausieren
               if (getState(vars_ventil_1_aktor).val == true) {
                 setStateDelayed(vars_ventil_1_aktor, false, false, parseInt(0, 10), false);
               }
               // Ventil 2 pausieren
               if (getState(vars_ventil_2_aktor).val == true) {
                 setStateDelayed(vars_ventil_2_aktor, false, false, parseInt(0, 10), false);
               }
               // Ventil 3 pausieren
               if (getState(vars_ventil_3_aktor).val == true) {
                 setStateDelayed(vars_ventil_3_aktor, false, false, parseInt(0, 10), false);
               }
               // Ventil 4 pausieren
               if (getState(vars_ventil_4_aktor).val == true) {
                 setStateDelayed(vars_ventil_4_aktor, false, false, parseInt(0, 10), false);
               }
             } else if (getState(vars_bewaesserung_aktiv).val == false && getState(vars_bewaesserung_pause).val == false) {
               setStateDelayed(vars_aktives_ventil, 'aus', true, parseInt(0, 10), false);
             }
            });
            // Restzeit gesamt berechnen
            on({id: vars_bewaesserung_aktiv, change: "ne"}, function (obj) {
             var value = obj.state.val;
             var oldValue = obj.oldState.val;
             if (getState(vars_bewaesserung_aktiv).val == true) {
               restzeit = setInterval(function () {
                 if (getState(vars_bewaesserung_pause).val == false) {
                   setStateDelayed(vars_restlautzeit_in_sek, (getState(vars_restlautzeit_in_sek).val - 1), true, parseInt(0, 10), false);
                   restzeit_gesamt_min = Math.floor(getState(vars_restlautzeit_in_sek).val / 60);
                   restzeit_gesamt_sek = getState(vars_restlautzeit_in_sek).val - restzeit_gesamt_min * 60;
                   // 0 hinzufuegen wenn Minuten < 10
                   if (restzeit_gesamt_min < 10) {
                     restzeit_gesamt_min = '0' + String(restzeit_gesamt_min);
                   }
                   // 0 hinzufuegen wenn Sekunden < 10
                   if (restzeit_gesamt_sek < 10) {
                     restzeit_gesamt_sek = '0' + String(restzeit_gesamt_sek);
                   }
                   setStateDelayed(vars_restlautzeit, ([restzeit_gesamt_min,':',restzeit_gesamt_sek].join('')), true, parseInt(0, 10), false);
                   if (getState(vars_restlautzeit_in_sek).val == 0) {
                     setStateDelayed(vars_bewaesserung_aktiv, false, true, parseInt(0, 10), false);
                     (function () {if (restzeit) {clearInterval(restzeit); restzeit = null;}})();
                   }
                 }
               }, 1000);
             } else if (getState(vars_bewaesserung_aktiv).val == false) {
               (function () {if (restzeit) {clearInterval(restzeit); restzeit = null;}})();
             }
            });
            // Restzeit Ventile berechnen
            on({id: vars_bewaesserung_aktiv, change: "ne"}, function (obj) {
             var value = obj.state.val;
             var oldValue = obj.oldState.val;
             if (getState(vars_bewaesserung_aktiv).val == true) {
               // Ventil 1
               if (getState(vars_ventil_1).val == true) {
                 // Umschaltverzögerung für ON_TIME
                 setStateDelayed(vars_ventil_1_restzeit_in_sek, (getState(vars_ventil_1_restzeit_in_sek).val + 1), true, parseInt(0, 10), false);
                 ventil_1_rest = setInterval(function () {
                   if (getState(vars_bewaesserung_pause).val == false && getState(vars_ventil_1).val == true && getState(vars_ventil_1_restzeit_in_sek).val != 0) {
                     setStateDelayed(vars_ventil_1_restzeit_in_sek, (getState(vars_ventil_1_restzeit_in_sek).val - 1), true, parseInt(0, 10), false);
                     // VIS Anzeige setzen
                     restzeit_ventil_min = Math.floor(getState(vars_ventil_1_restzeit_in_sek).val / 60);
                     restzeit_ventil_sek = getState(vars_ventil_1_restzeit_in_sek).val - restzeit_ventil_min * 60;
                     if (restzeit_ventil_sek < 10) {
                       setStateDelayed(vars_ventil_1_restzeit, ([restzeit_ventil_min,':0',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                     } else {
                       setStateDelayed(vars_ventil_1_restzeit, ([restzeit_ventil_min,':',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                     }
                   }
                   if (getState(vars_ventil_1_restzeit_in_sek).val == 0) {
                     (function () {if (ventil_1_rest) {clearInterval(ventil_1_rest); ventil_1_rest = null;}})();
                   }
                 }, 1000);
               }
               // Ventil 2
               if (getState(vars_ventil_2).val == true) {
                 // Umschaltverzögerung für ON_TIME
                 setStateDelayed(vars_ventil_2_restzeit_in_sek, (getState(vars_ventil_2_restzeit_in_sek).val + 1), true, parseInt(0, 10), false);
                 ventil_2_rest = setInterval(function () {
                   if (getState(vars_bewaesserung_pause).val == false && (getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && getState(vars_ventil_2).val == true && getState(vars_ventil_2_restzeit_in_sek).val != 0) {
                     setStateDelayed(vars_ventil_2_restzeit_in_sek, (getState(vars_ventil_2_restzeit_in_sek).val - 1), true, parseInt(0, 10), false);
                     // VIS Anzeige setzen
                     restzeit_ventil_min = Math.floor(getState(vars_ventil_2_restzeit_in_sek).val / 60);
                     restzeit_ventil_sek = getState(vars_ventil_2_restzeit_in_sek).val - restzeit_ventil_min * 60;
                     if (restzeit_ventil_sek < 10) {
                       setStateDelayed(vars_ventil_2_restzeit, ([restzeit_ventil_min,':0',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                     } else {
                       setStateDelayed(vars_ventil_2_restzeit, ([restzeit_ventil_min,':',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                     }
                   }
                   if (getState(vars_ventil_2_restzeit_in_sek).val == 0) {
                     (function () {if (ventil_2_rest) {clearInterval(ventil_2_rest); ventil_2_rest = null;}})();
                   }
                 }, 1000);
               }
               // Ventil 3
               if (getState(vars_ventil_3).val == true) {
                 // Umschaltverzögerung für ON_TIME
                 setStateDelayed(vars_ventil_3_restzeit_in_sek, (getState(vars_ventil_3_restzeit_in_sek).val + 1), true, parseInt(0, 10), false);
                 ventil_3_rest = setInterval(function () {
                   if (getState(vars_bewaesserung_pause).val == false && (getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && (getState(vars_ventil_2).val == false || getState(vars_ventil_2_restzeit_in_sek).val == 0) && getState(vars_ventil_3).val == true && getState(vars_ventil_3_restzeit_in_sek).val != 0) {
                     setStateDelayed(vars_ventil_3_restzeit_in_sek, (getState(vars_ventil_3_restzeit_in_sek).val - 1), true, parseInt(0, 10), false);
                     // VIS Anzeige setzen
                     restzeit_ventil_min = Math.floor(getState(vars_ventil_3_restzeit_in_sek).val / 60);
                     restzeit_ventil_sek = getState(vars_ventil_3_restzeit_in_sek).val - restzeit_ventil_min * 60;
                     if (restzeit_ventil_sek < 10) {
                       setStateDelayed(vars_ventil_3_restzeit, ([restzeit_ventil_min,':0',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                     } else {
                       setStateDelayed(vars_ventil_3_restzeit, ([restzeit_ventil_min,':',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                     }
                   }
                   if (getState(vars_ventil_3_restzeit_in_sek).val == 0) {
                     (function () {if (ventil_3_rest) {clearInterval(ventil_3_rest); ventil_3_rest = null;}})();
                   }
                 }, 1000);
               }
               // Ventil 4
               if (getState(vars_ventil_4).val == true) {
                 // Umschaltverzögerung für ON_TIME
                 setStateDelayed(vars_ventil_4_restzeit_in_sek, (getState(vars_ventil_4_restzeit_in_sek).val + 1), true, parseInt(0, 10), false);
                 ventil_4_rest = setInterval(function () {
                   if (getState(vars_bewaesserung_pause).val == false && (getState(vars_ventil_1).val == false || getState(vars_ventil_1_restzeit_in_sek).val == 0) && (getState(vars_ventil_2).val == false || getState(vars_ventil_2_restzeit_in_sek).val == 0) && (getState(vars_ventil_3).val == false || getState(vars_ventil_3_restzeit_in_sek).val == 0) && getState(vars_ventil_4).val == true && getState(vars_ventil_4_restzeit_in_sek).val != 0) {
                     setStateDelayed(vars_ventil_4_restzeit_in_sek, (getState(vars_ventil_4_restzeit_in_sek).val - 1), true, parseInt(0, 10), false);
                     // VIS Anzeige setzen
                     restzeit_ventil_min = Math.floor(getState(vars_ventil_4_restzeit_in_sek).val / 60);
                     restzeit_ventil_sek = getState(vars_ventil_4_restzeit_in_sek).val - restzeit_ventil_min * 60;
                     if (restzeit_ventil_sek < 10) {
                       setStateDelayed(vars_ventil_4_restzeit, ([restzeit_ventil_min,':0',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                     } else {
                       setStateDelayed(vars_ventil_4_restzeit, ([restzeit_ventil_min,':',restzeit_ventil_sek].join('')), true, parseInt(0, 10), false);
                     }
                   }
                   if (getState(vars_ventil_4_restzeit_in_sek).val == 0) {
                     (function () {if (ventil_4_rest) {clearInterval(ventil_4_rest); ventil_4_rest = null;}})();
                   }
                 }, 1000);
               }
             } else {
               (function () {if (ventil_1_rest) {clearInterval(ventil_1_rest); ventil_1_rest = null;}})();
               (function () {if (ventil_2_rest) {clearInterval(ventil_2_rest); ventil_2_rest = null;}})();
               (function () {if (ventil_3_rest) {clearInterval(ventil_3_rest); ventil_3_rest = null;}})();
               (function () {if (ventil_4_rest) {clearInterval(ventil_4_rest); ventil_4_rest = null;}})();
             }
            });
            // Manuelles abschalten -> alle Ventile abschalten
            on({id: new RegExp(vars_bewaesserung_aktiv + "|" + vars_restlautzeit_in_sek), change: "ne"}, function (obj) {
               if (getState(vars_bewaesserung_aktiv).val == false || getState(vars_restlautzeit_in_sek).val == 0) {
               // Ventil 1
               if (getState(vars_ventil_1_aktor).val == true) {
                 setStateDelayed(vars_ventil_1_aktor, false, false, parseInt(0, 10), false);
               }
               // Ventil 2
               if (getState(vars_ventil_2_aktor).val == true) {
                 setStateDelayed(vars_ventil_2_aktor, false, false, parseInt(0, 10), false);
               }
               // Ventil 3
               if (getState(vars_ventil_3_aktor).val == true) {
                 setStateDelayed(vars_ventil_3_aktor, false, false, parseInt(0, 10), false);
               }
               // Ventil 4
               if (getState(vars_ventil_4_aktor).val == true) {
                 setStateDelayed(vars_ventil_4_aktor, false, false, parseInt(0, 10), false);
               }
               // Pause
               if (getState(vars_bewaesserung_pause).val == true) {
                 setStateDelayed(vars_bewaesserung_pause, false, true, parseInt(0, 10), false);
               }
             }
            });
            
            

            T Offline
            T Offline
            tombox
            schrieb am zuletzt editiert von tombox
            #345

            @dslraser Danke für den Hinweis wußte nicht das es so einfach ist.

            @Kuddel hast du ein Wunsch wie der Adapter heißen soll? "Gartenbewaesserung" ?
            Planst du in nächster Zeit noch Verbesserungen?

            K 1 Antwort Letzte Antwort
            0
            • T tombox

              @dslraser Danke für den Hinweis wußte nicht das es so einfach ist.

              @Kuddel hast du ein Wunsch wie der Adapter heißen soll? "Gartenbewaesserung" ?
              Planst du in nächster Zeit noch Verbesserungen?

              K Offline
              K Offline
              Kuddel
              schrieb am zuletzt editiert von
              #346

              @tombox wie wäre es mit Sprinkler-Control ?

              T 1 Antwort Letzte Antwort
              0
              • K Kuddel

                @tombox wie wäre es mit Sprinkler-Control ?

                T Offline
                T Offline
                tombox
                schrieb am zuletzt editiert von
                #347

                @Kuddel die ioBroker community ist eher deutschsprachig ich glaube die meisten werden bei google eher nach gartenbewässerung suchen als sprinkler control

                K 1 Antwort Letzte Antwort
                0
                • T tombox

                  @Kuddel die ioBroker community ist eher deutschsprachig ich glaube die meisten werden bei google eher nach gartenbewässerung suchen als sprinkler control

                  K Offline
                  K Offline
                  Kuddel
                  schrieb am zuletzt editiert von
                  #348

                  @tombox ja das hast du natürlich recht.

                  dann gern "Gartenbewässerung"

                  dslraserD 1 Antwort Letzte Antwort
                  0
                  • K Kuddel

                    @tombox ja das hast du natürlich recht.

                    dann gern "Gartenbewässerung"

                    dslraserD Offline
                    dslraserD Offline
                    dslraser
                    Forum Testing Most Active
                    schrieb am zuletzt editiert von dslraser
                    #349

                    @Kuddel sagte in [Vorlage] Gartenbewässerung mit 4 Ventilen:

                    @tombox ja das hast du natürlich recht.

                    dann gern "Gartenbewässerung"

                    Falls es mal einen Adapter geben sollte, könnte man da auch andere Systeme berücksichtigen ?
                    Weil, ich fummele hier ja auch aktuell an einem Blockly, in Verbindung mit dem neuen Gardena Adapter.
                    Leider müßte ich Dein @Kuddel Blockly für den Gardena Adapter auch komplett umstricken.

                    T 1 Antwort Letzte Antwort
                    0
                    • dslraserD dslraser

                      @Kuddel sagte in [Vorlage] Gartenbewässerung mit 4 Ventilen:

                      @tombox ja das hast du natürlich recht.

                      dann gern "Gartenbewässerung"

                      Falls es mal einen Adapter geben sollte, könnte man da auch andere Systeme berücksichtigen ?
                      Weil, ich fummele hier ja auch aktuell an einem Blockly, in Verbindung mit dem neuen Gardena Adapter.
                      Leider müßte ich Dein @Kuddel Blockly für den Gardena Adapter auch komplett umstricken.

                      T Offline
                      T Offline
                      tombox
                      schrieb am zuletzt editiert von
                      #350

                      @dslraser könntest du kurz skizzieren welche Sachen dynamisch konfigurierbar sein müssen damit sie auch mit dem gardena adapter funktionieren würden

                      dslraserD 1 Antwort Letzte Antwort
                      0
                      • T tombox

                        @dslraser könntest du kurz skizzieren welche Sachen dynamisch konfigurierbar sein müssen damit sie auch mit dem gardena adapter funktionieren würden

                        dslraserD Offline
                        dslraserD Offline
                        dslraser
                        Forum Testing Most Active
                        schrieb am zuletzt editiert von dslraser
                        #351

                        @tombox sagte in [Vorlage] Gartenbewässerung mit 4 Ventilen:

                        @dslraser könntest du kurz skizzieren welche Sachen dynamisch konfigurierbar sein müssen damit sie auch mit dem gardena adapter funktionieren würden

                        Die Gardena Geräte haben ein eigenes Gateway, ähnlich wie z.B. der HUE Adapter. Die Geräte lassen sich über eine App oder auch im Browser über deren Cloud bedienen. Ich habe es bisher in meinem Blockly so erstellt, das sowohl die Bedienung über die App in den eigenen Datenpunkten angezeigt wird und umgekehrt auch die eigenen Datenpunkte die Bewässerung schaltet. Die Laufzeit der Ventile wird mit dem Wert 60 (oder ein vielfaches davon, aber maximal 3540 = 59 Minuten als Text eingegeben, aber es dürfen nur max. 2 Ventile gleichzeitig geöffnet werden, ist in der App auch nicht anders möglich) Es können an das Irrigation Control max 6 Ventile und eine Pumpe angeschlossen werden, wobei es auch andere "intelligente" Bewässerungssteuerungen von Gardena gibt, nicht nur das Irrigation Control. Es können auch mehrere davon betrieben werden. Ebenso sind Sensoren (Temperatur/Helligkeit sowie Bodenfeuchte integrierbar, auch die kann der Adapter schon. Genauso gehen über den Adapter auch die Gardena Mäher.
                        Der Rest steht eigentlich in der Adapterbeschreibung, schau da am Besten mal rein.

                        Gardena smarte Gartengeräte

                        1 Antwort Letzte Antwort
                        0
                        • K Kuddel

                          Habe gerade v2.1.0 auf Seite 1 hochgeladen.

                          Neue Funktion: Pause

                          Bei mir hat alles geklappt.

                          Bitte mal testen.

                          Bei der Mailbenachrichtingung werde ich noch ein wenig verbessern.

                          In meiner VIS sieht das dann so aus:

                          Aktiv:
                          72c0755f-adc2-4016-bb3b-22350e9511a0-grafik.png

                          Pause:
                          6f97b31c-7e08-473b-a241-cf30ffad2a00-grafik.png

                          B Offline
                          B Offline
                          benziman
                          schrieb am zuletzt editiert von benziman
                          #352

                          @Kuddel

                          Kannst du die VIS auch nochmalen hochladen, bitte?
                          Ich verwende das jetzt testweise auf dem Tablet, wie habt ihr denn das mit dem Login an der VIS gelöst?
                          Will mich da nicht immer mit dem admin anmelden müssen, angemeldet bleiben wäre auch praktisch.

                          Jeman deine Idee?

                          D 1 Antwort Letzte Antwort
                          0
                          • S Offline
                            S Offline
                            Serial13579
                            schrieb am zuletzt editiert von
                            #353

                            Vielen Dank nochmal du hast das ja echt Klasse weiterentwickelt.
                            Ich stehe aber gerade etwas auf dem Schlauch und zwar finde ich nicht wo du die Sonoff Ventile ansteuerst, evtl nicht mit eingebaut oder bin ich einfach blind ? :D Wird bei der On-time von Homematic direkt eingeschaltet ?
                            Ich könnte das einschalten ja einfach noch dahinter setzten wollte nur erstmal fragen, evtl habe ich es ja nur übersehen.

                            D 1 Antwort Letzte Antwort
                            0
                            • S Serial13579

                              Vielen Dank nochmal du hast das ja echt Klasse weiterentwickelt.
                              Ich stehe aber gerade etwas auf dem Schlauch und zwar finde ich nicht wo du die Sonoff Ventile ansteuerst, evtl nicht mit eingebaut oder bin ich einfach blind ? :D Wird bei der On-time von Homematic direkt eingeschaltet ?
                              Ich könnte das einschalten ja einfach noch dahinter setzten wollte nur erstmal fragen, evtl habe ich es ja nur übersehen.

                              D Offline
                              D Offline
                              darkiop
                              Most Active
                              schrieb am zuletzt editiert von
                              #354

                              @Serial13579 Schau mal in die Funktion Variablen_definieren() - da wird die IP vom Sonoff definiert.

                              Proxmox-ioBroker-Redis-HA Doku: https://forum.iobroker.net/topic/47478/dokumentation-einer-proxmox-iobroker-redis-ha-umgebung

                              S 1 Antwort Letzte Antwort
                              0
                              • B benziman

                                @Kuddel

                                Kannst du die VIS auch nochmalen hochladen, bitte?
                                Ich verwende das jetzt testweise auf dem Tablet, wie habt ihr denn das mit dem Login an der VIS gelöst?
                                Will mich da nicht immer mit dem admin anmelden müssen, angemeldet bleiben wäre auch praktisch.

                                Jeman deine Idee?

                                D Offline
                                D Offline
                                darkiop
                                Most Active
                                schrieb am zuletzt editiert von darkiop
                                #355

                                @benziman sagte in [Vorlage] Gartenbewässerung mit 4 Ventilen:

                                Kannst du die VIS auch nochmalen hochladen, bitte?

                                Die gibts doch hier: https://forum.iobroker.net/topic/24319/vorlage-steuerung-gartenbewässerung

                                Ich verwende das jetzt testweise auf dem Tablet, wie habt ihr denn das mit dem Login an der VIS gelöst?
                                Will mich da nicht immer mit dem admin anmelden müssen, angemeldet bleiben wäre auch praktisch.
                                Jeman deine Idee?

                                Login für die VIS? Wenn dann hast du den bewusst aktiviert:

                                92e28796-f0cb-4609-8f83-a17c9acdfb9b-grafik.png

                                Proxmox-ioBroker-Redis-HA Doku: https://forum.iobroker.net/topic/47478/dokumentation-einer-proxmox-iobroker-redis-ha-umgebung

                                B 1 Antwort Letzte Antwort
                                0
                                • D darkiop

                                  @Serial13579 Schau mal in die Funktion Variablen_definieren() - da wird die IP vom Sonoff definiert.

                                  S Offline
                                  S Offline
                                  Serial13579
                                  schrieb am zuletzt editiert von
                                  #356

                                  @darkiop das stimmt, aber da geht es ja nur darum dem Sonoff die Dauer zu senden, davon schaltet er sich aber noch nicht ein.

                                  D 1 Antwort Letzte Antwort
                                  0
                                  • S Serial13579

                                    @darkiop das stimmt, aber da geht es ja nur darum dem Sonoff die Dauer zu senden, davon schaltet er sich aber noch nicht ein.

                                    D Offline
                                    D Offline
                                    darkiop
                                    Most Active
                                    schrieb am zuletzt editiert von
                                    #357

                                    @Serial13579 --> vars_aktor_name = Pfad zum Objekt vom Sonoff, z.B. sonoff.0.Bewaesserung.

                                    Geschaltet wird damit dann unter "Ventil Steuerung":

                                    c166ded7-9c80-4678-9c88-ea3f2cbae1ea-grafik.png

                                    Proxmox-ioBroker-Redis-HA Doku: https://forum.iobroker.net/topic/47478/dokumentation-einer-proxmox-iobroker-redis-ha-umgebung

                                    1 Antwort Letzte Antwort
                                    0
                                    • D Offline
                                      D Offline
                                      darkiop
                                      Most Active
                                      schrieb am zuletzt editiert von darkiop
                                      #358

                                      @Kuddel Ich würde die Dauer bei mir in Minuten übergeben wollen um auch Widgets nutzen zu können die keine Werteliste unterstützen.

                                      Könntest du das noch bei dir einbauen - würde mir zukünftige Anpassungen beim Testen ersparen :)

                                      Und noch eine Idee: Ein %-Wert für die Restdauer je Ventil ermöglicht in der Visulisierung neue Wege :)

                                      69b32c40-e6ad-4629-ae8e-5bbfccac4c00-grafik.png

                                      Proxmox-ioBroker-Redis-HA Doku: https://forum.iobroker.net/topic/47478/dokumentation-einer-proxmox-iobroker-redis-ha-umgebung

                                      1 Antwort Letzte Antwort
                                      0
                                      • F Offline
                                        F Offline
                                        Fuga
                                        schrieb am zuletzt editiert von
                                        #359

                                        Ich habe gerade alles neu importiert und auch das VIS neu gemacht. Ich wollte mal die Option Fix Zeitplan ausprobieren.
                                        Das Vis zeigt noch auf javascript.0.bewaesserung.zeitplan.feste_startzeit_uhrzeit_start_stunde den punkt gibt es nicht bei mir aber dafür Feste_Startzeit für 1 2 und 3.
                                        Wie war das jetzt geplant? Ich gebe eine Startzeit an und er geht dann alle Ventile durch die ich Aktiv habe?

                                        D K 2 Antworten Letzte Antwort
                                        0
                                        • F Fuga

                                          Ich habe gerade alles neu importiert und auch das VIS neu gemacht. Ich wollte mal die Option Fix Zeitplan ausprobieren.
                                          Das Vis zeigt noch auf javascript.0.bewaesserung.zeitplan.feste_startzeit_uhrzeit_start_stunde den punkt gibt es nicht bei mir aber dafür Feste_Startzeit für 1 2 und 3.
                                          Wie war das jetzt geplant? Ich gebe eine Startzeit an und er geht dann alle Ventile durch die ich Aktiv habe?

                                          D Offline
                                          D Offline
                                          darkiop
                                          Most Active
                                          schrieb am zuletzt editiert von
                                          #360

                                          @Fuga sagte in [Vorlage] Gartenbewässerung mit 4 Ventilen:

                                          Wie war das jetzt geplant? Ich gebe eine Startzeit an und er geht dann alle Ventile durch die ich Aktiv habe?

                                          Ja, die DPs in der VIS musst du noch entsprechend anpassen.

                                          Proxmox-ioBroker-Redis-HA Doku: https://forum.iobroker.net/topic/47478/dokumentation-einer-proxmox-iobroker-redis-ha-umgebung

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          900

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

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

                                          • Du hast noch kein Konto? Registrieren

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