[gelöst] Beregnung/mehrere Kreise schaltbar/Sonnenstandabhängig/Pumpen gesteuert

Begonnen von holle75, 03 April 2017, 17:43:09

Vorheriges Thema - Nächstes Thema

Per

Ändere doch die zweite Bedingung mal in:
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and ?[Xtender_AC_out:Power__W:d] < 1200)
Ich habe den Eindruck, dass ist ein "außenliegendes" Problem, die Leistung des Xtender_AC_out geht natürlich hoch, wenn Pumpen aus- und runter, wenn sie angehen. Du willst aber den Moment, bevor sie geschaltet werden.
Im ersten Fall scheint es aber beabsichtigt zu sein, wobei es da bestimmt auch noch zu Seiteneffekten kommen kann. Aber zumindest hat der hier nicht reingegrätscht.
Die Timer hat schön gearbeitet, nachdem er die Trigger bekommen hat. Da sehe ich keinen Fehler.

Du könntest mal noch den Zähler # mitloggen (über attr cmdState oder attr status oder so.)

holle75

so ist doch die zweite Bedingung?

Aber guter Punkt!

Klar, das erklärt, warum cmd 2 erst wieder getriggert werden kann, nachdem die Pozzopumpe ausgeschaltet wird und der Stromverbrauch unter 1200 W sinkt. Somit kann auch das wait nicht vorher überschrieben werden.

Ich bin ganz anfänglich davon ausgegangen, dass NUR EINMAL die Beregner cmd 2 auslösen und dann am Ende cmd 3..... und habe darüber, dass das ja mehrmals geschieht dann im Problemfinden gar nicht weiter nachgedacht.

mmh, aber wie erreiche ich dann die Funktionalität, dass er bei mehr als 2500W die Pozzopumpe abschaltet, aber bei unter 1200W wieder einschaltet?

Per

Zitat von: holle75 am 19 Juli 2017, 12:20:23mmh, aber wie erreiche ich dann die Funktionalität, dass er bei mehr als 2500W die Pozzopumpe abschaltet, aber bei unter 1200W wieder einschaltet?
Kann es sein, dass beim Ein-/Ausschalten die Werte überschwingen?

Kannst du die gewünschte (!) Funktion dieses DOIF mal als Textaufgabe schreiben? Manchmal findet man (ich!) Fehler, wenn man versucht, einem GGüber das Erdachte zu erklären.

holle75

überschwingen (Anlauf Pumpen) tun die Werte nicht, da der Zähler nur alle 10 sekunden gelesen wird und die Werte mit ausreichend Spatz gewählt sind. Habe jetzt nochmal cmd 1 "abgesichert" und aus cmd 2 den Stromzähler rausgenommen. Nicht probiert, aber die Logik des Problems habe ich jetzt erkannt. Am Strom sollte es gelegen haben.

so siehts aus:
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([12:30-14:00] and [Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:Laufzeit] < 9000 and [?$SELF:cmd] ne "2" and [?$SELF:cmd] ne "3") \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0") \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "2") \
(set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out:Power__W:d] > 2500 and ([?$SELF:cmd_seqnr] eq "1" or [?$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)

attr PozzoHauptOben_PUMPE_PozzoDOIF group Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF readingList Laufzeit mitBeregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF room System
attr PozzoHauptOben_PUMPE_PozzoDOIF setList mitBeregnung:mit_Beregnung,Mittags
attr PozzoHauptOben_PUMPE_PozzoDOIF sortby 7
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,9000-[$SELF:Laufzeit]:2:10:0:0
attr PozzoHauptOben_PUMPE_PozzoDOIF webCmd mitBeregnung


was ich erreichen möchte:

- zwischen 12:30 und 14:00 soll die Zisterne gefüllt werden (wenn die Pumpe nicht schon mit den Beregnern lief, resp die verbleibende Zeit soll gelaufen werden). Hier kann ich wählen (var mitBeregnung), ob die Pumpe mit den Beregnern läuft, oder generell erst Mittags.

- wenn die Beregner laufen (und ich das wünsche ... var mitBeregnung) soll PozzoPumpe laufen.
- wenn die Beregner stehen, soll PozzoPumpe stehen (bis zum Mittag ... Restlaufzeit).
- egal ob Mittags oder mit den Beregnern, soll die Pumpe ausgehen, wenn der Stromverbrauch über 2500W (inkl Pumpe) liegt und  wieder loslaufen, wenn der Stromverbrauch (dann ohne Pumpe) unter 1200W liegt.

Per

Zitat von: holle75 am 19 Juli 2017, 13:25:18- egal ob Mittags oder mit den Beregnern, soll die Pumpe ausgehen, wenn der Stromverbrauch über 2500W (inkl Pumpe) liegt und  wieder loslaufen, wenn der Stromverbrauch (dann ohne Pumpe) unter 1200W liegt.
Soll sie Mittag oder mit den Pumpen angehen, wenn der Verbrauch zwischen 1200W und (2500-Pumpe)W liegt?

Per

Ich bin mal von Loslaufen ausgegangen:
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([Xtender_AC_out:Power__W:d] > 2500) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([12:30-14:00] and [?$SELF:Laufzeit] < 9000 and (([?$SELF:cmd] ne "1"  and [Xtender_AC_out:Power__W:d] < 2000) or ([Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_1) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and (([?$SELF:cmd] ne "1"  and [Xtender_AC_out:Power__W:d] < 2000) or [Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "3") \
(set $SELF cmd_1) \
DOELSEIF ([Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:cmd] eq "1") \
()



Wenn myreading freigeschaltet wird oder du dir die Beta runter lädst, kannst du auch vereinfachen:
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([Xtender_AC_out:Power__W:d] > 2500) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([12:30-14:00] and [?$SELF:Laufzeit] < 9000 and [$SELF:sperre]) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_1) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and [$SELF:sperre]) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "3") \
(set $SELF cmd_1) \
DOELSEIF ([Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:cmd] eq "1") \
()

attr PozzoHauptOben_PUMPE_PozzoDOIF sperre:(([?$SELF:cmd] ne "1"  and [Xtender_AC_out:Power__W:d] < 2000) or [Xtender_AC_out:Power__W:d] < 1200)


Dazu bei beiden
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 0:180,9000-[$SELF:Laufzeit]:2:10:180
Die 2000 sind mal (2500 - Pumpe) mit Pumpe = 500W angenommen.

Klammern und Sonderzeichen sind nochmal zu prüfen, da ich unterwegs bin und keinen Zugriff auf eine Fhem-Oberfläche habe.

holle75

ein paar Fragen ;)

define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([Xtender_AC_out:Power__W:d] > 2500) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \

müßte ich noch gegen ein falsches Berechnen der Laufzeit absichern. Darf also nur eintreten, wenn das DOIF die Pumpe anmacht, sonst würde das überschreiten von 2500W (außerhalb) immer eine neue Laufzeit berechnen.

Die PozzoPumpe zieht ca 1000W, deswegen die Schwellen bei unter 1200W (~ 1000W Grundverbrauch inkl. Zisternenpumpe) und 2500W wenn die PozzoPumpe dazu kommt.

GanzGanz verstehe ich die Zusammenhänge jetzt nicht, aber ich probiere es mal so:

define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([Xtender_AC_out:Power__W:d] > 2500 and ([?$SELF:cmd_seqnr] eq "1" or [?$SELF:cmd] eq "3")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([12:30-14:00] and [?$SELF:Laufzeit] < 9000 and (([?$SELF:cmd] ne "1" and [Xtender_AC_out:Power__W:d] < 2500) or [Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_1) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and (([?$SELF:cmd] ne "1"  and [Xtender_AC_out:Power__W:d] < 2500) or [Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "3") \
(set $SELF cmd_1) \
DOELSEIF ([Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:cmd] eq "1") \
() \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)

attr PozzoHauptOben_PUMPE_PozzoDOIF wait 0:180,9000-[$SELF:Laufzeit]:2:10:180:0

Per

Was hängen denn noch für Verbraucher dran?

Die tägliche Rücksetzung hatte ich vergessen  :-[

holle75

Ich habe jetzt mal deine Idee aufgegriffen und in "mein" DOIF reingebastelt. So verstehe ich es wenigstens ganz. Obs richtig ist ....


define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([12:30-14:00] and [Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:Laufzeit] < 9000 and [?$SELF:cmd] ne "2") \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and (([?$SELF:cmd] ne "4" and [Xtender_AC_out:Power__W:d] < 2500) or [Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "2") \
(set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out:Power__W:d] > 2500 and ([?$SELF:cmd_seqnr] eq "1" or [?$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)


attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,9000-[$SELF:Laufzeit]:2:10:0:0


... und teste. Falls dir was auffällt, lass wissen.

Per


holle75

Oh, wie ne Eins .... habe die ganze Beregnung noch wesentlich weiter aufgebohrt und denke, damit jetzt unter den 10 komplexesten Beregnungen im "Hobbybereich" weltweit zu liegen :D

Nee, keine Ahnung, aber in Kombi mit der Wetterstation und Sensoren und Wettervorhersagen und Pumpen und Anwesenheit und SolaranlagenVerbrauch und und und funktioniert das wirklich schön. Ich schreib dir jetzt mal noch im anderen Thread wegen dem "skippen"

https://forum.fhem.de/index.php/topic,91605.msg841813.html#msg841813

Rheininsel

Ich habe mich damit auch letztes Jahr beschäftigt und in diesem Jahr sind aus ursprünglich 4 Bewässerungskreisen schon 12 geworden, welche in unterschiedlicher Dauer angesteuert werden können (siehe Anhang).
Dahinter liegen rund 380 Zeilen DOIF für eine Ansteuerung morgens, abends oder eben zu beiden Zeiten...

Da auch meine Pumpe nicht alle Kreise zusammen versorgen kann, so sucht sich das Script selbst seine "passenden" Größen zusammen um die Pumpe nicht zu überfordern. Ebenfalls ist es möglich mit dem letzten Auswahlfeld den entprechenden Kreis manuell für eine dort auswählbare Zeit zu starten. Ich müsste jetzt nur mal versuchen das ganze in den neuen Perl-Modus zu packen bzw. Subs hinzu zu fügen, dann könnte das Script auch mit der Hälfte des Codes auskommen können.

Grüße
Gregor

Damian

Zitat von: Rheininsel am 09 Oktober 2018, 10:45:58
Ich habe mich damit auch letztes Jahr beschäftigt und in diesem Jahr sind aus ursprünglich 4 Bewässerungskreisen schon 12 geworden, welche in unterschiedlicher Dauer angesteuert werden können (siehe Anhang).
Dahinter liegen rund 380 Zeilen DOIF für eine Ansteuerung morgens, abends oder eben zu beiden Zeiten...

Da auch meine Pumpe nicht alle Kreise zusammen versorgen kann, so sucht sich das Script selbst seine "passenden" Größen zusammen um die Pumpe nicht zu überfordern. Ebenfalls ist es möglich mit dem letzten Auswahlfeld den entprechenden Kreis manuell für eine dort auswählbare Zeit zu starten. Ich müsste jetzt nur mal versuchen das ganze in den neuen Perl-Modus zu packen bzw. Subs hinzu zu fügen, dann könnte das Script auch mit der Hälfte des Codes auskommen können.

Grüße
Gregor

Hast du viele DOIFs oder alles in einem?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rheininsel

Derzeit ist es verteilt in mehrere. Der große Steuerungs-DIIF hat dabei die 380 Zeilen Code, da ich sehr viele Berechnungen drin machen muss (Perl).

Damian

Zitat von: Rheininsel am 09 Oktober 2018, 19:57:13
Derzeit ist es verteilt in mehrere. Der große Steuerungs-DIIF hat dabei die 380 Zeilen Code, da ich sehr viele Berechnungen drin machen muss (Perl).
OK.

Das wäre tatsächlich eine Herausforderung, die Sache sauber im Perl Modus abzubilden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF