Ventilsteuerung (Bewässerung) mit vier Kreisen und HM-LC-SW4-SM-2

Begonnen von remo, 04 Dezember 2020, 14:42:58

Vorheriges Thema - Nächstes Thema

remo

Mein Stand soweit.
Ohne Logik, Optik so gut wie fertig.


defmod dummy_BewaesserungAuto_VorneSeite dummy
attr dummy_BewaesserungAuto_VorneSeite alias vorne + Seite

defmod dummy_BewaesserungAuto_Hinten1 dummy
attr dummy_BewaesserungAuto_Hinten1 alias hinten1

defmod dummy_BewaesserungAuto_Hinten2 dummy
attr dummy_BewaesserungAuto_Hinten2 alias hinten2

defmod dummy_BewaesserungAuto_HeckeBeet dummy
attr dummy_BewaesserungAuto_HeckeBeet alias Hecke + Beet



attr dummy_BewaesserungAuto_.* setList \
state:on,off \
start:00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45,05:00,05:15,05:30,05:45,06:00,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00 \
duration:15,30,45,60,90,120,180 mon:X,- tue:X,- wed:X,- thu:X,- fri:X,- sat:X,- sun:X,-

attr dummy_BewaesserungAuto_.* readingList \
state start duration mon tue wed thu fri sat sun



attr dummy_BewaesserungAuto_.* webCmd \
:start:duration:mon:tue:wed:thu:fri:sat:sun

attr dummy_BewaesserungAuto_.* webCmdLabel \
:Startzeit:Dauer:Mo:Di:Mi:Do:Fr:Sa:So

attr dummy_BewaesserungAuto_.* devStateIcon \
on:ios-on-green:off off:ios-off:on .*:ios-NACK:off



vencam

Hallo remo!

ich bin aktuell auch am Überlegen wie ich meine Bewässerungssteuerung relativ simple umsetze.
Die aktuelle Optik von dir, gefällt mir sehr gut! Ist im Endeffekt genau das was ich auch will.

Bist du mit der Logik schon vorangekommen?

remo

Hallo vencam.

Sorry, dass ich so spät antworte!

Inzwischen hat sich viel getan.
Die Bewässerung läuft wie geplant.
Keine Aussetzer oder dergleichen.

Ich habe auch an der Optik gebastelt.
Die Möglichkeit mit den Tagen usw. hat sich (für mich) als unpraktisch erwiesen.

Ich habe es jetzt folgendermaßen gelöst (und bin sehr zufrieden) - Optik:


define dummy_Bewaesserung_aktiv dummy
attr dummy_Bewaesserung_aktiv alias aktiv

defmod dummy_BewaesserungAuto_VorneSeite dummy
attr dummy_BewaesserungAuto_VorneSeite alias vorne + Seite

defmod dummy_BewaesserungAuto_Hinten1 dummy
attr dummy_BewaesserungAuto_Hinten1 alias hinten1

defmod dummy_BewaesserungAuto_Hinten2 dummy
attr dummy_BewaesserungAuto_Hinten2 alias hinten2

defmod dummy_BewaesserungAuto_HeckeBeet dummy
attr dummy_BewaesserungAuto_HeckeBeet alias Hecke + Beet



attr dummy_Bewaesserung_aktiv readingList state start tage
attr dummy_Bewaesserung_aktiv setList state:on,off \
start:19:00,19:30,20:00,20:30,21:00,21:30,22:00,22:30,23:00,01:00,01:30,02:00,02:30,03:00,03:30,04:00,04:30,05:00 \
tage:1,2,3,4,5,6,7

attr dummy_Bewaesserung_aktiv webCmd :start:tage
attr dummy_Bewaesserung_aktiv webCmdLabel :Start:Tage
attr dummy_Bewaesserung_aktiv devStateIcon on:ios-on-green:off off:ios-off:on .*:ios-NACK:off

define notify_Bewaesserung_aktiv_EIN notify dummy_Bewaesserung_aktiv.on { fhem ("set at_BewaesserungAuto active") }
define notify_Bewaesserung_aktiv_AUS notify dummy_Bewaesserung_aktiv.off { fhem ("set at_BewaesserungAuto inactive") }
define notify_Bewaesserung_aktiv notify dummy_Bewaesserung_aktiv { \
fhem ("set at_BewaesserungAuto modifyTimeSpec {(ReadingsVal('dummy_Bewaesserung_aktiv','start',''))}") }



attr dummy_BewaesserungAuto_.* readingList state
attr dummy_BewaesserungAuto_.* setList state:15,30,45,60,90

attr dummy_BewaesserungAuto_.* webCmd state
attr dummy_BewaesserungAuto_.* webCmdLabel Dauer

attr dummy_Bewaesserung.* room BEWÄSSERUNG
attr dummy_Bewaesserung.* group 01_Zeitprogramme (autom. sprengen/wässern)



Auch die Logik möchte ich gerne teilen.


Logik:

define at_BewaesserungAuto at *{(ReadingsVal('dummy_Bewaesserung_aktiv','start','19:19'))} { \
my $tage = (ReadingsVal('dummy_Bewaesserung_aktiv','tage',''));; \
my $rest = ($yday % $tage);; \
my $dauer_VorneSeite = (ReadingsVal('dummy_BewaesserungAuto_VorneSeite','state','') * 60);; \
my $dauer_Hinten1 = (ReadingsVal('dummy_BewaesserungAuto_Hinten1','state','') * 60);; \
my $dauer_Hinten2 = (ReadingsVal('dummy_BewaesserungAuto_Hinten2','state','') * 60);; \
my $dauer_HeckeBeet = (ReadingsVal('dummy_BewaesserungAuto_HeckeBeet','state','') * 60);; \
my $dauer_total = ($dauer_VorneSeite + $dauer_Hinten1 + $dauer_Hinten2 + $dauer_HeckeBeet);; \
if ($rest == 0) \
{ fhem (" \
set schalter_Pumpe off;; \
set schalter_Ventil.* off;; \
set schalter_Pumpe on-for-timer $dauer_total;; \
set schalter_Ventil4 on-for-timer $dauer_Hinten2;; \
sleep $dauer_Hinten2;; \
set schalter_Ventil3 on-for-timer $dauer_Hinten1;; \
sleep $dauer_Hinten1;; \
set schalter_Ventil1 on-for-timer $dauer_VorneSeite;; \
sleep $dauer_VorneSeite;; \
set schalter_Ventil2 on-for-timer $dauer_HeckeBeet;; \
")};;}

attr at_BewaesserungAuto computeAfterInit 1



Wie gesagt, es funktioniert sehr gut.


Liebe Grüße


EDIT:
Ich probiere auch gerade etwas mit ESPEasy herum.
Der Regensensor läuft schon (für den Landroiden).
Bodenfeuchtesensoren kommen danach. Dann kann ich die Bewässerung noch weiter optimieren.

remo

Vielleicht noch etwas für die Pros:

Ich stehe im Moment voll auf dem Schlauch. Logisches Denken ist gerade nicht so bei mir  :o

Mein Plan ist, mir irgendwie ausgeben zu lassen wann die nächste Sprengung erfolgt.
Also zB ,,heute" ,,morgen" ,,übermorgen" ,,Samstag" ,,Dienstag" usw.

Es muss doch irgendwie möglich sein zu ermitteln wenn zB:
Gestern gesprengt wurde und Tage auf 4 eingestellt ist, ich mir eine Ausgabe erzeugen kann die ,,Freitag" anzeigt. Bzw wenn ich ,,Tage" heute auf ,,2" ändere die Ausgabe live auf ,,morgen" springt wenn gestern gesprengt wurde.

Hab mit Addition/Subtraktionen von $yday und $wday experimentiert, aber ich habe gerade echt einen Knoten im Hirn!

Vielleicht hat jemand einen Anstoß für mich?!

Gruß

Otto123

#109
Hi,

es gab da mal einen sehr umfangreichen "Näherungsthread" mit vielleicht aus heutiger Sicht nicht sehr bezogenem Titel https://forum.fhem.de/index.php?topic=103238.0
Da ging es darum die Anzahl Tage zwischen einem Datum in der Zukunft und heute herauszufinden. Hat nur im umgekehrten Sinne etwas mit deiner Frage zu tun, erinnert mich aber daran :)

Abgeleitet aus dem Thread:
Tag ausgeben: {strftime('%A',localtime(time))}
Tag in 4 Tagen ausgeben {strftime('%A',localtime(time+3600*24*4))}
https://metacpan.org/pod/POSIX::strftime::GNU#FORMAT

So mache ich an andere Stelle aus 0 -> heute und 1 -> morgen - ansonsten die Zahl der Tage:
{ my $day = 4;; $day ? ($day>1 ? $day:"morgen"):"heute" }
Zusammen ergibt das:
{ my $day = 4;; $day ? ($day>1 ? strftime('%A',localtime(time+3600*24*$day)):"morgen"):"heute" }

Die Umstellung auf übermorgen überlasse ich Dir :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

remo

Hi Otto,

Danke! Das hilft!

Ich brauche

den letzten Zeitpunkt des Sprengens + Anzahl der Tage = nächste Sprengung
nächste Sprenung - heute = (heute | morgen | übermorgen | <Mo-FR>)


Aber alles gut.
Dein Denkanstoß hat den Knoten gelöst ;)

Ich werde den fertigen Code dann posten.

vencam

Zitat von: remo am 13 Juli 2021, 20:58:11
Hallo vencam.

Sorry, dass ich so spät antworte!

Inzwischen hat sich viel getan.
Die Bewässerung läuft wie geplant.
Keine Aussetzer oder dergleichen.

Ich habe auch an der Optik gebastelt.
Die Möglichkeit mit den Tagen usw. hat sich (für mich) als unpraktisch erwiesen.

Ich habe es jetzt folgendermaßen gelöst (und bin sehr zufrieden) - Optik:


define dummy_Bewaesserung_aktiv dummy
attr dummy_Bewaesserung_aktiv alias aktiv

defmod dummy_BewaesserungAuto_VorneSeite dummy
attr dummy_BewaesserungAuto_VorneSeite alias vorne + Seite

defmod dummy_BewaesserungAuto_Hinten1 dummy
attr dummy_BewaesserungAuto_Hinten1 alias hinten1

defmod dummy_BewaesserungAuto_Hinten2 dummy
attr dummy_BewaesserungAuto_Hinten2 alias hinten2

defmod dummy_BewaesserungAuto_HeckeBeet dummy
attr dummy_BewaesserungAuto_HeckeBeet alias Hecke + Beet



attr dummy_Bewaesserung_aktiv readingList state start tage
attr dummy_Bewaesserung_aktiv setList state:on,off \
start:19:00,19:30,20:00,20:30,21:00,21:30,22:00,22:30,23:00,01:00,01:30,02:00,02:30,03:00,03:30,04:00,04:30,05:00 \
tage:1,2,3,4,5,6,7

attr dummy_Bewaesserung_aktiv webCmd :start:tage
attr dummy_Bewaesserung_aktiv webCmdLabel :Start:Tage
attr dummy_Bewaesserung_aktiv devStateIcon on:ios-on-green:off off:ios-off:on .*:ios-NACK:off

define notify_Bewaesserung_aktiv_EIN notify dummy_Bewaesserung_aktiv.on { fhem ("set at_BewaesserungAuto active") }
define notify_Bewaesserung_aktiv_AUS notify dummy_Bewaesserung_aktiv.off { fhem ("set at_BewaesserungAuto inactive") }
define notify_Bewaesserung_aktiv notify dummy_Bewaesserung_aktiv { \
fhem ("set at_BewaesserungAuto modifyTimeSpec {(ReadingsVal('dummy_Bewaesserung_aktiv','start',''))}") }



attr dummy_BewaesserungAuto_.* readingList state
attr dummy_BewaesserungAuto_.* setList state:15,30,45,60,90

attr dummy_BewaesserungAuto_.* webCmd state
attr dummy_BewaesserungAuto_.* webCmdLabel Dauer

attr dummy_Bewaesserung.* room BEWÄSSERUNG
attr dummy_Bewaesserung.* group 01_Zeitprogramme (autom. sprengen/wässern)



Auch die Logik möchte ich gerne teilen.


Logik:

define at_BewaesserungAuto at *{(ReadingsVal('dummy_Bewaesserung_aktiv','start','19:19'))} { \
my $tage = (ReadingsVal('dummy_Bewaesserung_aktiv','tage',''));; \
my $rest = ($yday % $tage);; \
my $dauer_VorneSeite = (ReadingsVal('dummy_BewaesserungAuto_VorneSeite','state','') * 60);; \
my $dauer_Hinten1 = (ReadingsVal('dummy_BewaesserungAuto_Hinten1','state','') * 60);; \
my $dauer_Hinten2 = (ReadingsVal('dummy_BewaesserungAuto_Hinten2','state','') * 60);; \
my $dauer_HeckeBeet = (ReadingsVal('dummy_BewaesserungAuto_HeckeBeet','state','') * 60);; \
my $dauer_total = ($dauer_VorneSeite + $dauer_Hinten1 + $dauer_Hinten2 + $dauer_HeckeBeet);; \
if ($rest == 0) \
{ fhem (" \
set schalter_Pumpe off;; \
set schalter_Ventil.* off;; \
set schalter_Pumpe on-for-timer $dauer_total;; \
set schalter_Ventil4 on-for-timer $dauer_Hinten2;; \
sleep $dauer_Hinten2;; \
set schalter_Ventil3 on-for-timer $dauer_Hinten1;; \
sleep $dauer_Hinten1;; \
set schalter_Ventil1 on-for-timer $dauer_VorneSeite;; \
sleep $dauer_VorneSeite;; \
set schalter_Ventil2 on-for-timer $dauer_HeckeBeet;; \
")};;}

attr at_BewaesserungAuto computeAfterInit 1



Wie gesagt, es funktioniert sehr gut.


Liebe Grüße


EDIT:
Ich probiere auch gerade etwas mit ESPEasy herum.
Der Regensensor läuft schon (für den Landroiden).
Bodenfeuchtesensoren kommen danach. Dann kann ich die Bewässerung noch weiter optimieren.

Servus remo,

kein Problem und danke, das du hier deine Logik mit uns teilst. Muss mir mal deinen Code in Ruhe anschauen.

Soweit funktioniert bei mir auch alles, Optik ist zufällig auch wie deine jetzige geworden :)
Habe allerdings mit einigen DOIFs gearbeitet, nicht ganz so übersichtlich aber für den Anfang reicht es erstmal.

Aktuell versuche ich für die Zisterne noch eine Logik zu programmieren, im Moment aber leider nicht viel Zeit.

Grüße

remo

Ist ja witzig.
Ähnelt sich ja wirklich ziemlich  ;D

Für mein Konstrukt hat sich ergeben, dass wenn ich wässere, ich gleich alles ein mal hintereinander weg schalte. Heute Zone 1 und morgen Zone 2 macht bei mir keinen Sinn.

@Otto:
Erste Erfolge. Code kommt.

vencam

Musste heut morgen auch etwas schmunzeln, als ich deinen Screenshot gesehen habe :)

Da geb ich dir Recht! Im Endeffekt lässt mal 1x alles durchlaufen und gut.

Bodenfeuchte steht bei mir auch noch auf der Liste. Welchen Sensor möchtest du verwenden?

remo

Auf einen Bodenfeuchtesensor hab ich mich noch nicht festgelegt.
Gibt ja einige. Hätte gerne einen, der auch etwas hält, zwecks Korrosion.




remo


remo

So. Fertig.



Nochmal zusammenfassend:

Mein Ziel war, mir anzeigen zu lassen, wann die nächste geplante Bewässerung in Abhängigkeit von Tage erfolgt.
Dabei sollte berücksichtigt werden wann die letzte geplante Bewässerung stattgefunden hat.
Die nächste geplante Bewässerung sollte dann komfortabel als heute / morgen / übermorgen / [Wochentag] angezeigt werden - relativ zu heute.

Dabei sollte sich die Anzeige / die Berechnung der nächsten geplanten Bewässerung dynamisch und in Echtzeit anpassen,
sobald der Wert Tage manuell geändert wird.



Mein Ansatz:

Es wird ein Hilfs-Dummy, welcher nach der geplanten Bewässerung, welche ja nach eingestelltem Zeitplan automatisch stattfindet, gesetzt.
Somit habe ich einen Zeitstempel des letzten Laufes.

define at_BewaesserungAuto at *{(ReadingsVal('dummy_Bewaesserung_aktiv','start','19:19'))} { \
my $tage = (ReadingsVal('dummy_Bewaesserung_aktiv','tage',''));; \
my $rest = ($yday % $tage);;

...

set dummy_Bewaess_lief on;; \
")};;}



Dann wird (nochmal Danke für den Ansatz, Otto) mittels regelmäßigem at (geht vielleicht auch schöner) etwas Zeit-Jongliererei betrieben:

define at_Bewaesserung_next at +*01:00 { \
my $active =  ReadingsVal('dummy_Bewaesserung_aktiv','state',''));; \
my $tage = (ReadingsVal('dummy_Bewaesserung_aktiv','tage',''));; \
my $then = (ReadingsTimestamp('dummy_Bewaess_lief', 'state', ''));; \
my $next1 = (time_str2num($then) + $tage * 60 * 60 * 24);; \
my $next2 = strftime("%Y-%m-%d",localtime($next1));; \
my $now = (strftime("%Y-%m-%d",localtime(time)));; \
my $diff1 = (((((time_str2num($next2)) - (time_str2num($now))) / 60) / 60) / 24);; \
my $nextDay = (strftime('%A',localtime(time+3600*24*$diff1)));; \
if ($active == on) { \
if ($diff1 == 0) {fhem("set dummy_Bewaesserung_next heute;;")};; \
if ($diff1 == 1) {fhem("set dummy_Bewaesserung_next morgen;;")};; \
if ($diff1 == 2) {fhem("set dummy_Bewaesserung_next übermorgen;;")};; \
if ($diff1 >= 3) {fhem("set dummy_Bewaesserung_next $nextDay;;")};; } \
else { {fhem("set dummy_Bewaesserung_next -;;")} };; }


Wobei der konkrete nächste "Termin" direkt in einen weiteren Dummy geschrieben wird.



Aktualisierung/Berechnung bei manueller Änderung von Tage:

define notify_Bewaesserung_aktiv notify dummy_Bewaesserung_aktiv { \
fhem ("set at_BewaesserungAuto modifyTimeSpec {(ReadingsVal('dummy_Bewaesserung_aktiv','start',''))};; set at_Bewaesserung_next execNow;;") }


set at_Bewaesserung_next execNow
ist ausschlaggebend.



Fertig.


Ich hoffe das ist nicht zu wirr und hilft dem einen oder anderen etwas.

Gerne kann ich auch mal meine gesamte Bewässerungsteuerung posten.

Gruß

vencam

Danke für deinen Code, mal schauen wie und ob ich das evtl. noch bei mir unterbringen kann.

Bin jetzt leider nicht "der" Programmierer aber wenn meins mal fertig ist, dann werde ich das hier auch veröffentlichen :)


remo

Funktioniert echt gut.
Hätte man aber alles noch etwas eleganter machen können.
Aber mein FHEM ist sowieso eine Dauerbaustelle...

@EinenAdmin:

Ich hatte damals hier im Forum schon einen Account mit ,,remo".
Durch Inaktivität wurde der aber gelöscht.
Gibt es eine Möglichkeit, meinen alten Account mit meinem jetzigen zu verbinden, sodass meine Beiträge wieder einheitlich sind?

Gruß