Bewässerungssteuerung - Vorstellung und Ideensammlung

Begonnen von funclass, 29 Oktober 2016, 22:22:41

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Ich bin irritiert beim Begriff "Daylie" in deinem Code. Ist das ein Tippfehler oder hast du das ganz bewusst in dieser Form gewählt?

Das hat natürlich nichts mit der Programmierung zu tun. Ist mir nur beim Durchscrollen aufgefallen.

JHo

Zitat von: funclass am 15 Juni 2020, 21:01:47
Versuche mal bitte ein leeres Notify anzulegen und kopiere danach folgenden Code in die def:
[...]
Ohne dieses Notify kann das Hauptdevice nicht mit der Logik ,,kommunizieren"
Ja, das war's. Meine Dummies schalten ein und ich bekomme Pushmessages. Danke!

Dein Update der Vorabbenachrichtigung erinnert mich an meinen vierten Punkt, den ich in deinem ursprünglichen Code noch gepimpt hatte: Die Pushbenachrichtigungen: warum soll am nächsten Tag nicht bewässert werden bzw. warum wird wie viel bewässert (Pause nicht abgelaufen; zu viel geregnet, zu hoher Niederschlag prognostiziert). Das hatte mir geholfen, zu verstehen, was warum passiert und damit auch, wo die Fehler in meinen Anpassungen liegen.

1: FHEM auf Ubuntu, MAX!Cube, Wand- und Heizkörperthermostate, Eco-Schalter, diverse LaCrosse-Sensoren, per remote angebundene DS18B20-Sensoren
2: FHEM auf Raspi 3, Max!Cube, Wand- und Heizkörperthermostate, Eco-Schalter, ht_pitiny-Adapter zu Junkers FW120

funclass

Zitat von: FunkOdyssey am 15 Juni 2020, 21:59:35
Ich bin irritiert beim Begriff "Daylie" in deinem Code. Ist das ein Tippfehler oder hast du das ganz bewusst in dieser Form gewählt?

Das hat natürlich nichts mit der Programmierung zu tun. Ist mir nur beim Durchscrollen aufgefallen.

Ja stimmt, schwieriges Wort. Daily sieht besser aus, werd es mal fixen.
Danke.

Stefan_Hvr

Zitat von: funclass am 15 Juni 2020, 21:01:47
Seltsam, dass bei dir das Notify nicht angelegt werden kann. Evtl. hab ich nen Copy&Paste Fehler in der Methode (hab das Anlegen danach nicht mehr getestet).

Missing right curly or square bracket at (eval 369289) line 1, at end of line syntax error at (eval 369289) line 1, at EOF
...bekomme ich, wenn ich den Block direkt als notify anlegen möchte
mit dummy notify und dann die DEF Einfügen hat's geklappt.
Viele Grüße aus Hannover
EnOcean, Zigbee, Shelly MQTT, Homebridge, Fritzbox, Harmonyhub, Alexa, Worx MQTT, Sonos MQTT, Tahoma, Telegram, Vorwerk,IRoomba MQTT, Buderus Km200,
seit 08/2019 Hausautomation mit FHEM

funclass

Dann kann ich auch nicht wirklich sagen was FHEM da nicht gefällt. Da ich das Notify auch Stück für Stück aufgebaut hab, hatte ich dieses ,,Problem" nicht.
Wenn's so klappt, ist es ja auch erstmal gut.

Stefan_Hvr

Zitat von: funclass am 15 Juni 2020, 22:22:18
Dann kann ich auch nicht wirklich sagen was FHEM da nicht gefällt. Da ich das Notify auch Stück für Stück aufgebaut hab, hatte ich dieses ,,Problem" nicht.
Wenn's so klappt, ist es ja auch erstmal gut.

Ich glaube das liegt an den Backslashs...so sieht mein RAW Export aus.

define notify_Beregnung notify Beregnung:.* {\
my $action = $EVTPART0;;\
if ($action eq "pct:") {\
# Intensität geändert\
my $last = OldReadingsVal($NAME,"pct",100);;\
fhem "setreading Beregnung lastPct $last";;\
sprinklePctDuration();;\
} elsif ($action eq "on:") {\
# Beregnung eingeschaltet\
fhem "setreading Beregnung mode standby";;\
} elsif ($action eq "off:") {\
# Beregnung ausgeschaltet\
if (ReadingsVal("Beregnung", "mode", "standby") ne "standby") {\
sprinkleStop("mainswitch");;\
}\
} elsif ($action eq "activeZone:") {\
# aktive Beregnungszone geändert\
sprinkleChangeActiveZone($EVTPART1);;\
} elsif ($action eq "action:") {\
# manueller Befehl\
my $command = $EVTPART1;;\
if ($command eq "start") {\
sprinkleStart("manual");;\
} elsif ($command eq "stop") {\
sprinkleStop("manual");;\
} elsif ($command eq "delay") {\
sprinkleDelay();;\
} elsif ($command eq "reset") {\
sprinkleReset();;\
}\
} elsif ($action eq "isRaining:") {\
# aktive Beregnungszone geändert\
if (($EVTPART1 == 1) && (ReadingsVal("Beregnung", "mode", "standby") eq "auto")) {\
sprinkleStop("rain");;\
}\
} else {\
# unbekannte Aktion\
}\
}\

attr notify_Beregnung group Beregnung
attr notify_Beregnung room Bewässerungsautomatik
Viele Grüße aus Hannover
EnOcean, Zigbee, Shelly MQTT, Homebridge, Fritzbox, Harmonyhub, Alexa, Worx MQTT, Sonos MQTT, Tahoma, Telegram, Vorwerk,IRoomba MQTT, Buderus Km200,
seit 08/2019 Hausautomation mit FHEM

funclass

#81
Sind die noch drin? Ja, das wird's sein. Hab die RAW-Definitions meiner Devices kopiert und eigentlich alle Backslashes entfernt. Da ist bei dem Notify wohl was schiefgegangen.

Muss mir wohl doch mal wieder nen Notebook zulegen. Am iPad sind solche größeren Aktionen irgendwie noch ziemlich umständlich.

Nachtrag: im FHEM-Editor sieht es eigentlich gut aus... :o

Stefan_Hvr

#82
Zitat von: funclass am 15 Juni 2020, 22:40:58
Sind die noch drin? Ja, das wird's sein. Hab die RAW-Definitions meiner Devices kopiert und eigentlich alle Backslashes entfernt. Da ist bei dem Notify wohl was schiefgegangen.

Muss mir wohl doch mal wieder nen Notebook zulegen. Am iPad sind solche größeren Aktionen irgendwie noch ziemlich umständlich.

Nachtrag: im FHEM-Editor sieht es eigentlich gut aus... :o

Entschuldige, ich glaube die Backslashs müssen drin sein. Damit läuft das Define vom Notify rein. Ohne läuft es nicht rein.
die Backslashs sind aus meinem RAW

Gerade nochmal die RAW kopiert, das notify gelöscht und wieder neu eingerichtet...mit Backslashs geht es definitv.
Viele Grüße aus Hannover
EnOcean, Zigbee, Shelly MQTT, Homebridge, Fritzbox, Harmonyhub, Alexa, Worx MQTT, Sonos MQTT, Tahoma, Telegram, Vorwerk,IRoomba MQTT, Buderus Km200,
seit 08/2019 Hausautomation mit FHEM

Stefan_Hvr

Zitat von: funclass am 15 Juni 2020, 22:40:58
Sind die noch drin? Ja, das wird's sein. Hab die RAW-Definitions meiner Devices kopiert und eigentlich alle Backslashes entfernt. Da ist bei dem Notify wohl was schiefgegangen.

Muss mir wohl doch mal wieder nen Notebook zulegen. Am iPad sind solche größeren Aktionen irgendwie noch ziemlich umständlich.

Nachtrag: im FHEM-Editor sieht es eigentlich gut aus... :o

So sieht es bei mir aus:
Viele Grüße aus Hannover
EnOcean, Zigbee, Shelly MQTT, Homebridge, Fritzbox, Harmonyhub, Alexa, Worx MQTT, Sonos MQTT, Tahoma, Telegram, Vorwerk,IRoomba MQTT, Buderus Km200,
seit 08/2019 Hausautomation mit FHEM

Stefan_Hvr

#84
Hi Christian,

Du hattest um Rückmeldung gebeten:

1.) Es wäre cool, wenn Du Deinen ersten Beitrag editierst und auf den Eintrag #60 verweist, wo Du von den Neuerungen sprichst.
2.) Wenn man eine Zone manuell startet kommt die Meldung
Ventil01 Rasen vorne für 0.25 Minuten eingeschaltet.
nächste Zone: 2 in 00:00:16 Modus ist single

--> bei Single kommt doch aber gar keine "nächste Zone". Ich hab daher Zeile 177 geändert in:

if ($mode ne "single") {fhem ("set xxxxx_home_Bot message \@-xxxxxxxxxxxx nächste Zone: $nextZone in $time Modus ist $mode");}
if ($mode eq "single") {fhem ("set xxxxx_home_Bot message \@-xxxxxxxxxxxx nächste Zone: Keine nächste Zone - Modus ist $mode");}
/code]

siehst Du hier Nebenwirkungen?

Viele Grüße aus Hannover
EnOcean, Zigbee, Shelly MQTT, Homebridge, Fritzbox, Harmonyhub, Alexa, Worx MQTT, Sonos MQTT, Tahoma, Telegram, Vorwerk,IRoomba MQTT, Buderus Km200,
seit 08/2019 Hausautomation mit FHEM

JHo

Zitat von: Stefan_Hvr am 15 Juni 2020, 23:23:15
Ich hab daher Zeile 177 geändert in:

if ($mode ne "single") {fhem ("set xxxxx_home_Bot message \@-xxxxxxxxxxxx nächste Zone: $nextZone in $time Modus ist $mode");}
if ($mode eq "single") {fhem ("set xxxxx_home_Bot message \@-xxxxxxxxxxxx nächste Zone: Keine nächste Zone - Modus ist $mode");}


Hallo Stefan, warum nicht direkt per sendMessage? Bei mir funktioniert das dann so (Zeile 177 ersetzen):
if ($mode ne "single") {sendMessage("nächste Zone: $nextZone in $time Modus ist $mode");}
if ($mode eq "single") {sendMessage("nächste Zone: Keine nächste Zone - Modus ist $mode");}


Frage an Christian: ist die grundsätzliche Logik vergleichbar mit den ursprünglichen Ideen geblieben? Würde (mir) viele Fragen sparen, weil du ja vorne einiges erklärt hast... Mir fällt z.B. auf: gestern hat es heftig geregnet (>> defaultIntervalPrecipitation), d.h. der Tageszähler ist unverändert auf 3. Wäre er schon niedriger gewesen (z.B. 1), hätte der Regen ihn dann einen Tag hochgesetzt (2) oder gleich wieder auf den Wert der intervalDays (3) - komplettes Überspringen des Zyklus oder "nur" verschieben um einen Tag?
Im Device finde ich auch noch die "menge_soll" als Reading - das ist ein vergessenes Überbleibsel aus der ursprünglichen Version und kann gelöscht werden, oder?

Danke! Jan
1: FHEM auf Ubuntu, MAX!Cube, Wand- und Heizkörperthermostate, Eco-Schalter, diverse LaCrosse-Sensoren, per remote angebundene DS18B20-Sensoren
2: FHEM auf Raspi 3, Max!Cube, Wand- und Heizkörperthermostate, Eco-Schalter, ht_pitiny-Adapter zu Junkers FW120

funclass

#86
Hallo,

die Benachrichtigung sendMessage("nächste Zone: $nextZone in $time Modus ist $mode") hatte ich eigentlich nur zu debugging-zwecken drin. Kann aus meiner Sicht raus, oder einfach nur auskommentieren. Hier wollte ich prüfen ob die Ermittlung der nächsten Zone welche auf on steht funktioniert sowie ob die Formatierung für den Timer passt.

Die Grundsätzliche Logik ist gleich geblieben, einziger (gravierender) Unterschied zur Ursprungsversion ist, dass der Tageszähler nun runter und nicht mehr rauf zählt. D.h. wenn die gewünschte Bewässerungsmenge in totalPrecipitation erreicht ist (also größer oder gleich defaultIntervalPrecipitation ist), dann wird der Tageszähler auf den eingestellten Interval gesetzt (intervalDays) und zählt täglich runter, solange die Sollmenge nicht wieder erreicht ist. Wenn der Tageszähler auf 0 steht und die startTime erreicht ist, dann wird Bewässert. Das hat den Vorteil, dass an dem Reading intervalDays sofort ablesbar ist, wie viele Tage noch bis zum nächsten Automatikmodus vergehen.
An dem Tag, an dem ein voller Zyklus (also 100%) bewässert wurde ohne, dass durch irgend einen Grund (manueller Stopp, oder Regen) unterbrochen wurde, wird im Anschluss der Wert totalPrecipitation um den Betrag defaultIntervalPrecipitation erhöht. Somit wird Abends beim Update der Zähler festgestellt, dass die gewünschte Menge erreicht ist und der Tageszähler wird wieder auf den eingestellten Intervall hochgesetzt. In diese Berechnung (sprinklePrecipitationUpdate) könnten nun auch andere Daten wie Verdunstung und Regenprognose ect. einfließen.

Dass die Berechnung korrekt funktioniert, müsst ihr noch ein eigenes Notify anlegen, was die beiden Readings rainfall und rainDay füttert. Ich habe das z.B. so gelöst, dass bei jeder Aktualisierung meines Wetterdevices diese beiden Werte in die Beregnungssteuerung gepushed werden (alle 2 Minuten). Somit weiß die Steuerung jederzeit was Sache ist und muss sich nicht selbst um das holen der Wetterdaten kümmern. Das könnte man sicherlich auch noch konfigurierbar machen, aber das hängt immer von der lokalen Einrichtung der Wetterdaten usw. ab.

Die alten, deutsch benannten Readings wie z.B. tage_soll und menge_soll können alle raus. Diese wurden komplett durch neue ersetzt. Über die setList lassen sich die neuen Sollwerte nun auch endlich komfortabel pflegen.

Stefan_Hvr

Zitat von: JHo am 16 Juni 2020, 10:10:20
Hallo Stefan, warum nicht direkt per sendMessage? Bei mir funktioniert das dann so (Zeile 177 ersetzen):
if ($mode ne "single") {sendMessage("nächste Zone: $nextZone in $time Modus ist $mode");}
if ($mode eq "single") {sendMessage("nächste Zone: Keine nächste Zone - Modus ist $mode");}

Danke! Jan

OMG - ich Schussel. Weil ich in der commandref nach ,,sendmessage" gesucht hatte und nicht kapiert habe das es eine Subroutine ist.... da muss ich wohl gerade mal n paar Zeilen zurückandern  ::)

Dank Dir *winkmitdemzaunpfahl*
Viele Grüße aus Hannover
EnOcean, Zigbee, Shelly MQTT, Homebridge, Fritzbox, Harmonyhub, Alexa, Worx MQTT, Sonos MQTT, Tahoma, Telegram, Vorwerk,IRoomba MQTT, Buderus Km200,
seit 08/2019 Hausautomation mit FHEM

JHo

Zitat von: funclass am 16 Juni 2020, 10:43:06
Die Grundsätzliche Logik ist gleich geblieben, einziger (gravierender) Unterschied zur Ursprungsversion ist, dass der Tageszähler nun runter und nicht mehr rauf zählt. D.h. wenn die gewünschte Bewässerungsmenge in totalPrecipitation erreicht ist (also größer oder gleich defaultIntervalPrecipitation ist), dann wird der Tageszähler auf den eingestellten Interval gesetzt (intervalDays) und zählt täglich runter, solange die Sollmenge nicht wieder erreicht ist. Wenn der Tageszähler auf 0 steht und die startTime erreicht ist, dann wird Bewässert. Das hat den Vorteil, dass an dem Reading intervalDays sofort ablesbar ist, wie viele Tage noch bis zum nächsten Automatikmodus vergehen.
Wunderbar, das spart eine Menge Code (den ich damals mit reingebaut hatte). Und damit wird es ja auch wirklich unnötig, den Regen über mehrere Tage aufzusummieren.
Zitat
Dass die Berechnung korrekt funktioniert, müsst ihr noch ein eigenes Notify anlegen, was die beiden Readings rainfall und rainDay füttert. Ich habe das z.B. so gelöst, dass bei jeder Aktualisierung meines Wetterdevices diese beiden Werte in die Beregnungssteuerung gepushed werden (alle 2 Minuten).
Frage an der Stelle zum Reading rainfall. Du schreibst in deiner Erläuterung von Sonntag abend, dass das die aktuelle Regenrate in l/m² angegeben sein soll. Nur zum Verständnis, da ich dachte, Regenrate wäre in mm/h oder l/h: es geht hier weniger um den Wert an sich, sondern nur um die Feststellung, ob es gerade jetzt regnet oder eben nicht? Die Menge an sich kommt ja im rainDay unter?
1: FHEM auf Ubuntu, MAX!Cube, Wand- und Heizkörperthermostate, Eco-Schalter, diverse LaCrosse-Sensoren, per remote angebundene DS18B20-Sensoren
2: FHEM auf Raspi 3, Max!Cube, Wand- und Heizkörperthermostate, Eco-Schalter, ht_pitiny-Adapter zu Junkers FW120

funclass

Zitat von: JHo am 16 Juni 2020, 11:55:42
Wunderbar, das spart eine Menge Code (den ich damals mit reingebaut hatte). Und damit wird es ja auch wirklich unnötig, den Regen über mehrere Tage aufzusummieren.
....
Frage an der Stelle zum Reading rainfall. Du schreibst in deiner Erläuterung von Sonntag abend, dass das die aktuelle Regenrate in l/m² angegeben sein soll. Nur zum Verständnis, da ich dachte, Regenrate wäre in mm/h oder l/h: es geht hier weniger um den Wert an sich, sondern nur um die Feststellung, ob es gerade jetzt regnet oder eben nicht? Die Menge an sich kommt ja im rainDay unter?

Naja, genaugenommen wird der Momentanwert für den Niederschlag meistens in mm/qm/h angegeben, also wie viele Liter würden bei dieser Intensität in einer Stunde je Quadratmeter runterkommen. Genau so ist der Wert auch zu interpretieren.
Das Reading rainfall nutze ich tatsächlich auch nur um den "Schalter" isRaining ab einem bestimmten Schwellwert umzulegen. Wie hoch diese Schwelle ist, kann jeder für sich festlegen.

Der Wert rainDay ist wichtiger, da dieser ja kummuliert und irgendwann mit der gewünschten Menge verglichen werden soll. Aber auch hier gilt: mm/qm bzw. l/qm passt zum Rest der Logik.

VG Christian