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 ); });
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden