PV-Anlage (autark) 12 V 300Wh für automatische Gartenbewässerung nutzen

  • Mit einem 1500 W Inverter von 12V auf 220 V ist eine 700 W Pumpe gerade so ansteuerbar, wenn die Leistung aus einer 110 Ah 12V Batterie gezogen wird.

    110Ah Akku 13,6 V- bei Vollgeladen kann er bis 12 V ca. 60% seiner Leistung abgeben

    somit 1300Wh * 0,6 = ca 790 Wh verfügbar und kann damit auch bewölkte Tage ausgleichen, da mit 250Wh täglich 20 Minuten realistisches Bewässern möglich ist.

    Weil das Schalten dringend in Zyklen (ca 90 Sekunden) erfolgen muss um eine Batterie- und Inverterüberlastung im unbetreuten Betrieb zu vermeiden (10 V / 70 A im Grenzbetrieb) bietet sich die Schaltsteuerung mit einer NOUS AT1 Steckdose und Rule in Variante 1 an.

    Drei Situationen sind wesentlich in der Rule-Umsetzung.

    1. Kein WLAN vorhanden nur Hotspot vom Handy zur Kontrollzeit für eine Zeitsynchronisation

    2. die Spannung am Inverter/Tasmoat-System bricht zusammen (PV/AKKU-Strom <10V /=0V ) Neustart Tasmota ist zu organisieren
    3. die Spannung bleibt stabil über die Nacht sowie zur Bewässerungszeit und es wird die evtl. vorhandene WIFI-Synchronzeit fortgeschrieben für eine Bewässerung zur Vorgabezeit

    Nachteil der Variante 1 Lösung ist der "hohe" Stromverbrauch durch den Inverter im Leerlauf (<10% Nennleistung - ca. 250Wh pro Tag), da die Schaltsteckdose an der 220V Seite des Inverters den durchgängigen Betrieb erfordert und nur so die Gartenpumpe zur Spritzzeit am Morgen oder Abend selbstständig zuschalten kann.

    Variante 2

    ist eine in das Invertergehäuse integrierte Tasmota-Schaltung die eine Zuschaltung des gesamten Inverters mit fester Anschaltung der Pumpe organisiert und damit 220 Wh Leerlaufleistung vom Inverter am Akku täglich frei werden.

    Variante 2a ist dann eine Erweiterung auf Winterschaltung des Inverters mit Tasmota-Schalfmodus bei der nur zyklisch Überwachungen und Akku-/Inverterheizung organisiert werden.

    Den letzte Sommer haben wir Variante 1 erfolgreich mit dem folgenden Code gefahren und bereiten für diesen Sommer Variante 2 vor.

    Konsoleneingabe
    teleperiod 60
    Timezone 99
    voltageset 230
    PowerSet xx.x

    Reset 99 - boot count zero
    SetOption36 20 - 20 Boots zulassen bis RESET-Firmware in 10 s
    #nach Neustart 3 Stunden warten (erster Systemstart erfolgt erst am Folgetag ! - aktueller Tag manuell bewässern )

    [empfohlene Einstellungen der Variablen]

    mem1 - Sekunden bis Zyklusneustart [ 900]
    mem2 - Sekunden für eine Bewässerungszeit [90]
    mem3 - volle Einschaltungen
    mem4 - Summe Ausschaltungen
    mem5 - Pause-Spannungsausfall [20000]
    mem6 - Pause-Bewässerung(Morgen) [80000]
    mem7 - Tageslaufzeitvorgabe Anzahl Einschaltungen pro Tag [15] = ca. 250 Wh
    mem8 - Tageslaufzeit aktuell
    mem9 - Spannungs-Trigger [215] aus wenn unterschritten um die nächste Nacht aktiv zu überstehen
    mem12 - Pause einen Tag

    VAR1 - Übergabe Aus-Zeit
    VAR2 - Übergabezeit
    VAR3 - aktueller Energieverbrauch
    VAR4 - Zentraler Schalter AUS=0 Ein=2
    VAR5 - erste Schaltzeit am Tag [600 = 10 Uhr]
    VAR6 - Zusammenstellung websend Station, Spannung, Power
    VAR7 - Tageslaufeincounter (Vergleich mit VAR1)
    VAR8 - Spannungsvergleich
    VAR9 - Info-Trigger
    VAR10 - Startzeit
    VAR11 - Endzeit
    VAR12 - Pause nach neuem Tag
    VAR13 - Neustartzeitübergabe
    VAR15 - T1 Reflektion
    VAR16 - eventTrigger

    counter1 - Tagesanzahl
    counter2 - Summe erfolgreie AUS
    counter3 - Bootanzahl


    Umsetzung:
    template {"NAME":"Count1=EINday<p>Counter2=AUSsum<p>Counter3=Bootcount","GPIO":[32,353,352,354,2720,2656,0,0,2624,320,224,225,226,0],"FLAG":0,"BASE":49}


    ' Button1 am Gerät Zyklusstart ohne Wifi-Kopplung bis Unterspannung
    ' Power1 "Dose" Start ohne Timer
    ' Power2 "EIN-Zyklus" Zyklusstart
    ' Power3 "Count 0" Werte zurückstellen

    1.)
    'nach Neustart steht die Tasmotazeit auf 4:20 Uhr(260) im Jahr 2020!, wenn kein WLAN-Zeit (aus Hotspot)
    'bei Spannungszusammenbruch Neustart nach VAR5 verminder um 300 Minuten
    'VAR4 0 schaltet zentral AUS und setzt RuleTimer1 auf mem1

    rule1
    ON System#Init do backlog time 1587435620; Power1 0; Power3 0; VAR13 %mem1%; VAR7 %mem7%; VAR5 %mem5%; VAR1 0; VAR2 %mem4% endon
    on Wifi#Connected do Backlog time 0; VAR5 %MEM5% endon
    on time#Minute<300 do Backlog VAR14 %timestamp% endon
    on VAR14#State$<2020- do Backlog ==>Notzeit; VAR5 %MEM5%; SUB5 300 endon
    on Time#Minute=%VAR5% do Backlog Ruletimer1 5; VAR1 1 endon
    on Rules#Timer=1 do Backlog VAR4 9 endon
    on Rules#Timer=2 do Backlog VAR4 0; VAR13 %mem1% endon


    2.)
    Ein/Ausschalten

    Rule2
    on VAR4#State==0 do backlog Power1 0; RuleTimer2 0; RuleTimer1 %VAR13%; ADD2 1; mem3 %VAR1%; VAR4 5; Power2 0 endon
    on VAR4#State==9 do backlog Power1 1; RuleTimer2 %mem2%; ADD1 1; mem4 %VAR2%; VAR4 5 endon


    3.)
    'Abschalten bei Unterspannung für 22 Stunden (bei
    'Abschalten wenn Counter mem7 erreicht

    rule3
    on ENERGY#Voltage<%mem9% do Backlog VAR13 80600; SUB4 1 endon
    on VAR1#State>%VAR7% do Backlog VAR13 80600; VAR4 0 endon
    on VAR1#State do counter1 %mem3% endon
    on VAR2#State do counter2 %mem4% endon
    on INFO3#bootcount do counter3 %value% endon
    on Button1#State=1 do Backlog RuleTimer1 5; Var1 0 endon
    on Power2#State=1 do Backlog Ruletimer1 5; VAR1 0 endon
    on Power3#State=1 do Backlog mem3 0; mem4 0; VAR1 0; VAR2 0; EnergyToday1 0; EnergyTotal1 0; Power3 0 endon

    4.)

    PROD-Umgebung einstellen:
    backlog NtpServer1 172.20.10.1; NtpServer3 3.de.pool.ntp.org; NtpServer2 2.de.pool.ntp.org; Timezone 99;
    mem1 900; mem2 90; mem9 215; mem3 0; mem4 0; VAR1 0; VAR2 0; mem7 0; VAR7 0; mem5 600; SetOption0 0;
    SetOption21 1; SetOption36 20; Webbutton2 Start<p>Zyklus; Webbutton1 Dose; Webbutton3 Count 0; Rule1 1; Rule2 1; Rule3 1


    Test-Umgebung:
    backlog mem1 9; mem2 90; mem9 222; mem3 0; mem4 0; mem7 0; VAR7 0


    PS1: die Basis ist eine Standard-Tasmota Applikation auf einer NOUS AT1 Steckdose.

    Eine Nutzung einer Shelly Plug S Stackdose ist nur mit wesentlichen Veränderungen in der Unterspannungsabschaltung möglich (liegt bei Anfrage vor), da im Auszustand keine Spannung gemessen werden kann.

    PS2: mit dem folgenden Geräteeinsatz kann eine Gartenpumpe mit begrenzter Leistung nach jedem Schaltvorgang eine neue der 6 Abgänge aktiv schalten (per Geräteumschalter auch Reduktion auf 2-5 Abgänge möglich) .

    siehe Amazon: https://amzn.eu/d/gTz9puo

    2 Mal editiert, zuletzt von karoCB (27. Januar 2024 um 15:03)

  • Jetzt geht es in den Frühling und es ist Zeit die Variante 2 zu integrieren und einen Nachbau euch zu ermöglichen.

    Es ist noch nicht alles in der Software untergebracht (Bootanzahl mit JSON im Script auslesen, habe ich noch Sorgen und die realen Laufzeiten heute, gestern und der Durchschnitt berechnet). Ebenso fehlt mir noch Zeit mit dem jetzigen Code die 2-tägliche Abarbeitungen zu unterstützen. 2a) ist dann geplant erst im Herbst gefordert und hat auch noch etwas Zeit.

    Aktuell steht der Code auf Test - minimale Zykluszeit in der festen Wartepause.

    Für Hinweise bin ich dankbar. Mit einem ESP32C3 super mini kann sofort getestet werden, da die blaue LED wie das Relais geschaltet wird. Die Spannungsüberwachung wird sicherlich im Leerlauf nicht zuschlagen.

    PS: Die WebUI-Steuerung hängt im aktuellen Zustand an einem Handy-Hotspot bei der Anlagenbegehung. Am Tage läuft das System ohne WLAN und kopplet sich nur bei Besuch wieder an. Fernziel auf eigenes Access-Point umbauen um mehr als 2 Steuerungsclients zu ermöglichen, doch die Unsichtbarkeit des WLANs bekomme ich aktuell nicht hin.

    =============================

    im Anhang der aktuell Stand

    Achtung! Standardbutton ausgeschalten

    (Backdoor zum Editor über Versionsnummer)

  • karoCB 3. März 2024 um 20:09

    Hat den Titel des Themas von „PV-Anlage (autark) 12 V 300W für automatische Gartenbewässerung nutzen“ zu „PV-Anlage (autark) 12 V 300Wh für automatische Gartenbewässerung nutzen“ geändert.
  • neues Release 3.0 mit maximaler Ausnutzung von PV-Leistung !

    (Spritzen am Tage ist oft nicht sinnvoll aber einen Wassertank/Pool füllen mit PV-Leistung wenn sie verfügbar ist )

    Timer==>"Pool füllen" realisiert Einschaltung Inverter bis zur eingestellten Unterspannungsauslösung (11 V) (Abschaltungszeit kommt in die Dateiliste) und Neuzuschaltung wenn Ladespannung >13.8 Volt erreicht ist.

    ( offen ist noch die tägliche Durchschnittsberechnung für einen schnellen Überblick im WebUI)

    >D 48
    ; Startminute
    P9=0
    stm=0
    ;dynamische Laufvariable
    i=0
    cnt=0
    at=0
    BD=""
    st1="Start"
    sel1=0
    boo=0
    ges=0
    heu=0
    Hsu=0
    Tsu=0
    Msu=0
    Ssu=0
    p:pu=0 ; Laufzeiteinstellung
    sle=0
    wla=0
    p12=120 ;
    p:p22=1
    p:rb1=2
    p:putz=10 ; Tageszyklen
    putz1=0 ; Tageszyklenzähler
    bu1=0
    bu2=0
    bl=0
    an1=200
    stime=0
    mi=0
    test=0
    USaus=0
    USan=0
    USS=0
    Wert=0
    p:oset=-500 ; Timeroffset
    v1=0 ; Timerstartvergleich
    v2=0 ; Timerzeit -Pause
    v3=0 ; Timerzeit -Aktivzeit
    it=0 ; Intervall Tageszyklenübergabe
    F=0 ; Flag
    ;Dateiystem ======
    fr=0
    Pu=0
    Pl=0
    A1=""
    A2=""
    str1=""
    res=0


    >B
    ;Notzeitzeit setzen
    =>time 1587435620
    ;LED blue
    spinm(8 1)
    spin(8 1)
    ;GPIO02 Relais (out-Kanal)
    spinm(2 1)
    ; Time nur für Test ===========
    =>time 0
    putz1=putz ; Abreitswert durch Speicherwert ersetzen
    v1=millis
    an1=200 ; 1Sek Start überbrücken
    Tsu=1
    USS=11 ;Unterspannungsabschaltungspannung
    ;USS=31.41 ;Unterspannungsabschaltungspannung Testsystem
    USaus=0 ; Schleifenabbruchzeit d. Unterspannung
    USan=13.8 ; Startspannung für Poolfüllen
    ;USan=30.60 ; Startspannung für Poolfüllen Testsystem
    Wert=0 ; Übergabewert für Datenerhebeung

    ;P9=9000 ; 15 Sek - für Test Pause
    ;P9=90000 ; 150 Sek - für Test 120 +30 Sek Pause
    P9=900000 ;15 Min <<<======Pausenwert
    F=0
    =>Webbutton1 Datendatei leeren
    =>Webbutton2 Anzeigedaten Reset
    +>status 1
    =>WebColor {"WebColor":["#cccccc","#2f3133","#3d3f41","#dddddd","#293134","#ffb000","#293134","#ff5661","#008000","#ffffff","#ec7600","#bf5f00","#d43535","#931f1f","#47c266","#5aaf6f","#ffffff","#999999","#bc4d90"]}
    =#datenw() ; Wenn System bootes - Daten schreiben

    >E
    ;BootCount lesen
    str1=sb(gwr("BootCount\":"3) 0 3)
    boo=str1

    >F
    ;Inverter einschalten manuell
    ;print bu2 %0bu2%
    if chg[bu2]>0
    then
    if bu2>0
    then
    st1="Inverter läuft"
    spin(2 1) ;AN
    spin(8 0)
    putz1=0
    else
    st1="Inverter aus"
    spin(8 1) ;AUS
    spin(2 0)
    putz1=0
    endif
    endif

    ; Anpassung Zyklusanzahl
    if chg[putz]>0
    then
    putz1=putz
    v1=millis
    ;heu=0
    endif

    if chg[pu]>0
    then
    putz1=putz
    v1=millis
    ;heu=0
    endif

    >S
    ; Tagesanfang Durchlaufzähler rücksetzen und Datenerhebung
    if time==2
    or
    bu1>0
    then
    Wert=Hsu
    =#datenw()
    putz1=putz
    ges=heu
    Tsu=Tsu+1
    Msu=Msu+heu/60
    Ssu=Msu/Tsu
    heu=0
    Hsu=0
    endif

    ; für ca. Anzeigezeit
    stime=(sunset/60-2)
    if rb1==1
    then
    stm=780+oset-time
    else
    stm=sunset+oset-time
    endif

    ; Timerfunktionen===============
    if chg[p22]>0
    then
    switch p22
    case 1 ; Timer aktiv
    putz1=putz
    v1=millis
    spin(8 0) ;An
    spin(2 1)
    case 2 ; Timer deaktiv
    putz1=putz
    v1=millis
    spin(8 1) ;Aus
    spin(2 0)
    case 3 ; Timer 2 tägig
    print ohne Funktion
    ends
    svar
    endif

    mi=mins
    if chg[mi]>0
    then
    print %mi%
    switch mi
    case 00.00 ;00. Minute Datenspeichern
    Wert=Hsu
    =#datenw()
    ends

    if p22==4 ; Winterschaltung
    then
    print Winteraufwärmen Minute prüfen
    switch mi
    case 15.00 ;15. Minute starten
    print Winteraufwärmen ein
    =#datenw()
    spin(8 0) ;An
    spin(2 1)
    case 30.00 ;30. Minute aus
    print Winteraufwärmen aus
    =#datenw()
    spin(8 1) ;Aus
    spin(2 0)
    ends
    endif
    endif ; Ende mi=mins =======

    if p22==5 ; Poolfüllen bei viel PV
    then
    if an1>USan
    then
    st1="Pool füllen"
    spin(8 0) ;An
    spin(2 1)
    endif
    endif


    ; ======Abarbeitung Timer ======dynamisch =========================
    ;-------------Intervall Laufzeit-----------------
    ;neg Zeit und pos. Anzahltageszyken dann Laufzeit + Pause abarbeiten
    ; Zeit ran, noch Umläufe
    if stm<0 ; Startminute neg. dann Abarbeitung
    and
    putz1>0 ; Durchläufe nicht abgearbeitet
    and
    p22==1 ; Timer aktiv
    then
    ;Laufzeit in ms neg. dann aktiv
    v3=millis-v1-(pu*1000)+USaus
    if v3<0 ;-Start große Schleife---------
    then
    spin(2 1) ; >>>>>Inverter An <<<<<
    spin(8 0)
    Wert=heu
    =#datenw()
    st1="Aktiv noch "+s(putz1)+" Mal"
    print Aktiv noch %putz1%
    heu=(millis-v1)/1000
    print Zyklusaktivzeit %v3%
    test=putz-putz1
    print 0_____ %test%
    if test==0.00
    or
    test=putz-1 ;1. Datensatz und letzten Satz speichern <<<===========
    then
    Wert=heu
    =#datenw()
    print Speichersatz_______
    else
    print Zwischensatz
    endif
    else
    spin(8 1) ;Aus
    spin(2 0)
    st1="Pause noch "+s(v2/60000)+" Minuten"
    endif

    ;!!v2 = Zeit - Startzeit - P9 Pause (900.000=15Min 9000=3Sek)
    v2=millis-v1-P9
    if v2<0
    then
    ; print Zykluspausenzeit %v2%
    else
    print _____v1-laden___
    v1=millis
    putz1=putz1-1
    USaus=0 ; Rücksetzen Unterspannungsabbruch für neuen Zyklus
    Hsu=Hsu+heu
    Wert=Hsu
    =#datenw()
    spin(8 1) ;Aus
    spin(2 0)
    st1="warte auf Zyklus"
    endif
    else ;-else große Schleife---------
    v1=millis
    endif ;-Ende große Timer-Schleife---------
    ;========================================================
    ;Synchronisation
    if bu1>0
    then
    =>time 0
    bu1=0
    ; =#datenw()
    endif

    ;Datumprüfen
    if year<2021
    then
    if sel1<1
    then
    sel1=1
    BD="<marquee> <<----------</marquee>"
    else
    sel1=0
    endif
    else
    BD="<hr>"
    endif


    ;Unterspannungsprüfung (11V -aus)
    if (an1<USS and st1="Inverter läuft")
    then
    st1="Unterspannung!!"
    spin(8 1) ; Aus
    spin(2 0)
    Wert=heu
    =#datenw()
    ; putz1=0 ; Schleifenabbruch für den gesamten Tag
    USaus=150000 ; Schleifenabbruch für das Intervall
    endif
    an1=adc(1)/112

    ; Datei löschen/neu
    if pwr[1]>0
    then
    =#neuedatei()
    =>power1 0
    endif

    ; Daten löschen
    if pwr[2]>0
    then
    ges=0
    Tsu=0
    Msu=0
    Ssu=0
    heu=0
    Hsu=0
    =>power2 0
    endif

    >W
    ;Standardbutton ausschalten
    ;<style>form button{display:none}</style>
    ; Hinergrundbilder2
    <style>table tbody tr th{color:#11ffff;}table tbody tr td{color:#ff00ff;}h2{color:#fff;}h4{color:#f1b24c;}#ptd{color:#f3e463;padding:0px;}</style>
    <style>body{background-color:green;background-size:100p;background-repeat:no-repeat;}</style>
    sl(0 120 pu "0" " " "120")
    @Inverter Sekunden Laufzeit ==>%0pu%
    sl(0 20 putz "0" " " "20")
    @Inverter Anzahl Tageszyklen ==>%0putz%
    @<hr>
    @pd(p22 "Timer=====> " 100 "aktiv" "passiv" "2tägig aktiv" "Winter" "Pool füllen")
    rb(rb1 "__Startzeit_Timer_______" 150 "feste 13:00 Uhr " "sunset %stime% Uhr")
    nm(-700 600 1 oset "Timeroffset [min]: " 66 0)
    bu(bu1 "OK" "Zeit synchronisieren")
    bu(bu2 "manuell AUS" "manuell EIN")
    %BD%
    Datum :{m} %2.0day%.%2.0month%.%4.0year% -%2.0hours%:%2.0mins%:%2.0secs%
    %BD%
    <h3>Inverterlauf</h3>
    jetzt [sek]:{m} %0heu%
    heute [sek]:{m} %0Hsu%
    gestern [sek]:{m} %0ges%
    Tage/Summe/Schitt-Min :{m} %0Tsu% / %0Msu% / %0Ssu%
    Bootcount :{m} %0boo%
    @Spannung [V]: %an1%
    @Status: %st1%
    Tageszeitminute:{m} %0time%
    Start in Minuten:{m} %0stm%
    <a href="https://forum.creationx.de/ufs/Pump_Daten.csv" style="color:graee">_Pump_Daten.csv__</a>
    <h6><a href="https://forum.creationx.de/s10?" target="_blank">Version 3.0.%0slen%</a>

    #neuedatei()
    fr=fo("/Pump_Daten.csv" 1)
    str1="Datum; Zeit; BootCount; Spannung; Laufzeit \r\n"
    res=fw(str1 fr)
    fc(fr)

    #datenw()
    ; Datum Zeit trennen "," und schreiben
    str1=s(2.2an1)
    =#komma()
    A2=str1
    str1="\r\n"+sb(tstamp 8 2)+"."+sb(tstamp 5 2)+";"+sb(tstamp 11 5)+";"+s(0boo)+";"+A2+";"+s(5.0Wert)
    fr=fo("/Pump_Daten.csv" 2)
    res=fw(str1 fr)
    print __Daten___ %str1%
    fc(fr)

    #komma()
    ; Datensatz "." umwandeln
    Pu=ins(str1 ".")
    if Pu>-1
    then
    Pu=ins(str1 ".")
    Pl=sl(str1)
    str1=sb(str1 0 Pu)+","+sb(str1 Pu+1 Pl-Pu)

    4 Mal editiert, zuletzt von karoCB (14. Juni 2024 um 11:12)