NEWS
[Vorlage] Bewässerung mit Gardena 6-Fach Verteiler
-
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 ); });