Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Vorlage] Bewässerung mit Gardena 6-Fach Verteiler

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Vorlage] Bewässerung mit Gardena 6-Fach Verteiler

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

      Hallo zusammen,

      ich habe mich nochmal an mein Bewässerungs-Script zur Steuerung des Gardena 6-Fach Verteilers gemacht und es so gestaltet das es einfach zu bedienen ist.

      Die aktuellste Version des Scripts findet Ihr auf GitHub unter https://github.com/GodHunter/iobroker-sprinkling-gardena dort sind auch alle Informationen zur Einrichtung beschrieben.

      Das Script selbst besteht aus 2 Teilen, das eine ist für die Automatik zuständig und berücksichtig dabei den Niederschlag für den aktuellen Tag und das andere ist für die eigentliche Schaltung zuständig.

      Beregnung_starten.js

      const pfad   = "0_userdata.0.Beregnung.Garten.";
      const device = "sonoff.0.Sonoff-Garten.POWER";
      const alive  = getState( 'sonoff.0.Sonoff-Garten.alive' ).val; 
      
      const debug  = true;
      
      schedule("* 4-22 * * *", main);
      
      function main(){
      
          if( debug )  log('-== STARTE BEWÄSSERUNGS-ROUTINE ==-');
          if( !alive ) log(device +' ist nicht erreichbar', 'error');
      
          //Objekte anlegen
          if(!existsState( pfad +'Allgemein.Aktiv' )) {
              createStates( pfad );
              return true;
          };
      
          const positionen = []; //Objekt hält wartende Positionen
          let total = 0; //Anzahl aller aktiven Positionen
      
          var selector = $('state[state.id=0_userdata.0.Beregnung.Garten.*._Aktiv]');    
          selector.each(function (obj, index) {
              
              //Alle aktiven Verteilerpositionen einlesen
              if( getState( obj ).val === true ){
                  var objekt = obj.split(/\.(?=[^\.]+$)/);
                  total++;
      
                  //Alle wartenden Objekte einlesen
                  if( getState( objekt[0] +'._Warte' ).val === true ) positionen.push( Number( objekt[0].slice(-1) ) );
      
              }
          
          });
      
          //Wenn Beregnung ausstehend und keine aktive Beregnung
          if( positionen.length !== 0 && getState( pfad +'Allgemein.Aktiv' ).val === false && alive ) {
              
              if( debug ) log( total +' Positionen sind eingetragen.' );
      
              let vtposition = Number( getState( pfad +'Verteiler.Allgemein.Position' ).val +1 );
              if( vtposition > total ) vtposition = 1;      
          
              if( positionen.includes( vtposition ) === false ){ //Umschalten wenn Kanal nicht wartend
                  
                  if(debug) log( 'Verteiler wird umgeschalten ( Bereich '+ vtposition +' )' );
      
                  einschalten(  vtposition );
                  setTimeout(
                      function() {
                          ausschalten();
                      }
                  , 20000);
      
              } else { //Beregnung starten
      
                  var dauer = Number( getState( pfad +'Verteiler.'+ vtposition +'.Dauer' ).val );
                  if( debug ) log( 'Beregnung wird gestartet ( Bereich '+ Number( vtposition ) +' / '+ dauer +' Minuten )' );
      
                  setState( pfad +'Allgemein.Aktiv', true, true );
                  setState( pfad +'Allgemein.Restlaufzeit', dauer, true );
                  setState( pfad +'Verteiler.'+ vtposition +'._Warte', false, true );
      
                  //Nächste Beregnung zurücksetzen
                  if( Number( getState( pfad +'Verteiler.'+ vtposition +'.NaechsteBeregnung' ).val ) === 0 ) setState( pfad +'Verteiler.'+ vtposition +'.NaechsteBeregnung', Number( getState( pfad +'Verteiler.'+ vtposition +'.Intervall' ).val ) );
      
                  einschalten(  vtposition );
      
              }
      
          } else if( getState( pfad +'Allgemein.Aktiv' ).val === true ){ //Anhaltende Beregnung
      
              var laufzeit = Number( getState( pfad +'Allgemein.Restlaufzeit' ).val );
              
              if( Number( laufzeit-1 ) > 0 ) {
               
                  if( debug ) log( 'Aktive Beregnung ( Bereich '+ getState( pfad +'Verteiler.Allgemein.Position' ).val +' / '+ Number( laufzeit-1 ) +' Minuten ).' );
                  setState( pfad +'Allgemein.Restlaufzeit', Number( laufzeit-1 ), true );
      
              } else if( alive ) {
      
                  if( debug ) log( 'Beregnung wird beendet ( Bereich '+ getState( pfad +'Verteiler.Allgemein.Position' ).val +' )' );
                  setState( pfad +'Allgemein.Aktiv', false, true );
                  setState( pfad +'Allgemein.Restlaufzeit', Number( 0 ), true );
                  ausschalten();
      
              } else log( 'Die Beregnung konnte nicht beendet werden.', 'error');
      
          } else if( debug ) log('Keine geplante Beregnung.');
      
          if(debug) log('-== BEENDE BEWÄSSERUNGS-ROUTINE ==-');
      
      }
      
      function einschalten( x ){
          setState( pfad +'Verteiler.Allgemein.Position', Number( x ), true );
          setState( device, true );
      }
      
      function ausschalten(){
          setState( device, false );
      }
      
      function createStates(pfad){
          
          createState(pfad +'Allgemein.Automatik', false, {read: true, write: true, type: 'boolean', desc: 'Automatikmodus An / Aus'});
          createState(pfad +'Allgemein.Aktiv', false, {read: true, write: true, type: 'boolean', desc: 'Aktive Beregnung'});
          createState(pfad +'Allgemein.Restlaufzeit', 0, {read: true, write: true, type: 'number', unit: 'Minuten', desc: 'Warten auf laufende Bewässerung'});
          createState(pfad +'Verteiler.Allgemein.Position', 1, {read: true, write: true, type: 'number', desc: 'Aktuelle Position des Verteilers'});
          createState(pfad +'Verteiler.Allgemein.Gesamt', 4, {read: true, write: true, type: 'number', desc: 'Anzahl der angeschlossenen Ventile'});
      
          for (let i = 1; i <= 6; i++) {
              createState(pfad +'Verteiler.'+ i +'._Aktiv', false, {read: true, write: true, type: 'boolean', desc: 'Bereich angeschlossen'});
              createState(pfad +'Verteiler.'+ i +'.Dauer', 5, {read: true, write: true, type: 'number', unit: 'Minuten', desc: 'Dauer der Bewässerung'});
              createState(pfad +'Verteiler.'+ i +'._Warte', false, {read: true, write: true, type: 'boolean', desc: 'Wartet auf Bewässerung'});
              createState(pfad +'Verteiler.'+ i +'.Bezeichnung', 'Position '+ i, {read: true, write: true, type: 'number', desc: 'Nummer des Ventils'});
              createState(pfad +'Verteiler.'+ i +'.Intervall', 4, {read: true, write: true, type: 'number', unit: 'Tage', desc: 'Gewünschter Beregnungsintervall in Tagen'});
              createState(pfad +'Verteiler.'+ i +'.NaechsteBeregnung', 4, {read: true, write: true, type: 'number', unit: 'Tage',  desc: 'Verbleibende Tage bis zur Beregnung'});
          };
      
      }
      

      Beregnung_planen.js

      const pfad  = "0_userdata.0.Beregnung.Garten.";
      const debug = true;
      
      const niederschlagsmenge = Number( 2 );
      const niederschlag = "0_userdata.0.Systemdaten.Wetter.d0.Niederschlagsmengein24h";
      
      schedule("30 2 * * *", main);
      
      function main(){
      
          if( debug ) log('-== STARTE BEWÄSSERUNGS-PLANUNG ==-');
      
          if( getState( pfad +'Allgemein.Automatik' ).val === true ){
      
              var selector = $('state[state.id='+ pfad +'Verteiler.*.NaechsteBeregnung]');    
              selector.each(function (obj, index) {
                  
                  var objekt = obj.split(/\.(?=[^\.]+$)/);
                  var position = Number( objekt[0].slice(-1) );
                  var aktiv = getState( objekt[0] +'._Aktiv' ).val;
                  
                  
                  //Bei Regen zurücksetzen
                  if( Number( getState( niederschlag ).val ) >= niederschlagsmenge && aktiv ){
      
                      if( debug ) log('Setze Bereich '+ position +' wegen Regen zurück.');
                      setState( obj, Number( getState( objekt[0] +'.Intervall' ).val ), true );
      
                  } else if( aktiv ) {
      
                      //Beregnung bei erreichen des Intervalles einplanen
                      if( Number( getState(obj ).val -1 ) === 0 ){
                          
                          if( debug ) log('Plane Beregnung für den Bereich '+ position +' ein.'); 
                          setState( obj, Number( getState( obj ).val -1 ), true );
                          setState( objekt[0] +'._Warte', true, true);
                      
                      } else { //Nächste Beregnung runterzählen
      
                          if( debug ) log('Beregnung für den Bereich '+ position +' startet in '+ Number( getState( obj ).val -1 ) +' Tagen.');
                          setState( obj, Number( getState( obj ).val -1 ), true );
      
                      }
      
                  }
      
              })
      
          }
      
          if( debug ) log('-== ENDE BEWÄSSERUNGS-PLANUNG ==-');
      
      }
      
      //Beregnung zurücksetzen bei Automatik aus
      $( 'state[state.id='+ pfad +'Allgemein.Automatik]' ).on( function (obj) {
      
          if( getState( obj.id ).val === false ){
      
              var selector    = $( 'state[state.id='+ pfad +'Verteiler.*.NaechsteBeregnung]' );
      
              selector.each(function (obj, i) {
                  
                  var objekt = obj.split(/\.(?=[^\.]+$)/);
                  setState( obj, getState( objekt[0] +'.Intervall' ).val, true );
                  setState( objekt[0] +'._Warte', false, true );
      
              });
      
          }
          
      });
      
      //Bei Veränderung des Intervalls
      $('state[state.id='+ pfad +'Verteiler.*.Intervall]').on( function (obj) {
      
          var objekt = obj.id.split(/\.(?=[^\.]+$)/);
          if( getState( obj.id ).val < getState( objekt[0] +'.NaechsteBeregnung' ).val) setState( objekt[0] +'.NaechsteBeregnung', getState( obj.id ).val, true );
      
      });
      
      1 Reply Last reply Reply Quote 0
      • First post
        Last post

      Support us

      ioBroker
      Community Adapters
      Donate

      786
      Online

      31.8k
      Users

      80.0k
      Topics

      1.3m
      Posts

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