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. JavaScript
  5. [Vorlage] Bewässerung mit Gardena 6-Fach Verteiler

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    978

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

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

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
1 Beiträge 1 Kommentatoren 251 Aufrufe 1 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 Offline
    T Offline
    TobStar
    schrieb am zuletzt editiert von
    #1

    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 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

    537

    Online

    32.6k

    Benutzer

    82.2k

    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