Bewässerungssteuerung - Vorstellung und Ideensammlung

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

Vorheriges Thema - Nächstes Thema

funclass

#60
Hallo Leute,

aus den kleinen, geplanten Änderungen ist nun doch ein Komplettumbau geworden. Deshalb hat es auch etwas länger gedauert. Ich habe nun die komplette Logik in eine eigene Datei ausgelagert und die FHEM-Devices soweit wie möglich zusammengefasst. Ich habe die meisten Szenarien durchgetestet, nur einsetzenden Regen hab ich noch nicht getestet (ist im Coding aber umgesetzt). Ich post hier erstmal den Code, werde später mal noch einiges dazu dokumentieren.

Ich habe auch eine Methode integriert, die die Devices selbst anlegt (für die Beregungszonen wird ein Beispiel angelegt, der Rest muss per Copy ,,gecloned" werden).

Ich werde Abend nochmal ein paar Zeilen dazu schreiben.

funclass

#61
Wie schon erwähnt, habe ich im Grunde alles nochmal neu geschrieben. Readings und Befehle hab ich versucht konsequent in englisch zu benennen, das macht es evtl. später einfacher ein Modul draus zu bauen. Ebenso hab ich versucht alle relevanten Befehle in die Set-List zu integrieren. Durch die massiven Änderungen gibt es bestimmt noch ein paar Bugs oder Verbesserungsbedarf, hierbei freue ich mich natürlich über Feedback bzw. Unterstützung.
Wie fängt man nun an? Zuerst muss die Datei 99_sprinkleUtils.pm ins FHEM-Verzeichnis kopiert werden. Anschießend kann mit dem Befehl {generateSprinkleDevices()} das Anlegen der Devices angestoßen werden. Hier ließe sich noch etwas individualisieren, hab aber aus Zeitmangel erstmal etwas spartanisch zusammengeschrieben. Alle Devices werden im Room ,,Außen" angelegt. Es wird nur eine Beregnungszone als Beispiel angelegt (Beregnung_Zone09). Ich nutze derzeit 8 Zonen, diese können per copy erzeugt werden und müssen am Ende des Namens durchnummeriert sein, beginnend bei 01. Theoretisch lassen sich bis zu 99 Zonen definieren, hierzu muss bei Bedarf im Hauptdevice die Setlist so erweitert werden, dass im Befehl ,,activeZone" die entsprechende Anzahl hinterlegt wird.

Nun werde ich zu den einzelnen Devices ein paar Dinge schreiben...

funclass

#62
Beregnung_Zone01 ... Beregnung_Zone08:

Verknüpfung der Steuerung zu den eigentlichen Steuerventilen. Es ist möglich von hier aus eine einzelne Zone direkt zu starten, hierzu ist es derzeit nicht notwendig, dass das Hauptdevice oder die Zone den Status ,,on" hat.

Befehle:

  • on/off - de-/aktiviert die Zone, so dass diese im manuellen oder automatischen Beregnungszyklus übersprungen wird
  • maxDuration - setzt die Dauer in Minuten, die die Zone braucht um die gewünschte Menge Wasser (wird im Hauptdevice hinterlegt) auszubringen, entspricht also der maximalen Dauer pro Zone bei 100% Intensität
  • valve - Name des Devices für das/die zugehörigen Ventile setzen, bei mehreren Ventilen sind die Namen kommagetrennt zu speichern (Hinweis: im Code werden die Ventile via on-for-timer geschaltet, sollten die Devices diesen Befehl nicht unterstützen, muss dies in der Methode sprinkleChangeActiveZone geändert werden)
  • start/stop - Zone im Single-Mode starten bzw. stoppen

Readings:

bis auf die Readings zu den oben genannten Befehlen gibt es noch ein weiteres (pctDuration), welches die Beregnungsdauer bezogen auf die aktuelle Prozenteinstellung im Hauptdevice angibt.

funclass

#63
Beregnung (Hauptdevice):

Um die automatische Berechnung anhand des bisherigen Niederschlags und die Abschaltung bei Regen nutzen zu können, müssen von (irgendeinem) vorhandenem Wetterdevice folgende Daten in die benannten Readings geschrieben werden:


  • rainfall - aktuelle Regenrate (Liter/qm)
  • rainDay - kummulierter Niederschlag des laufenden Tages

Befehle:

  • on/off - Bewässerungssteuerung komplett de-/aktivieren
  • activeZone - Einschalten einer Beregnungszone (bei mehr als 8 Zonen muss die setList entsprechend erweitert werden)
  • start/stop - Beregnungszyklus manuell starten oder stoppen, deaktivierte Beregnungszonen werden übersprungen
  • intervalDays - dauer in Tagen, zwischen zwei (vollständigen) automatischen Beregnungszyklen
  • defaultIntervalPrecipitation - Beregnungsmenge in Litern, welche für einen vollen Zyklus gelten sollen
  • updateDaylieRainTime - Zeitangabe in HH:MM wann die Übernahme des Tagesniederschlags und Berechnung der restl. Tage bis zur nächsten Beregnung stattfinden soll, idealerweise kurz vor Mitternacht bevor die Tagesmenge vom Wetterdevice auf 0 zurückgesetzt wird
  • startTime - Zeitangabe in HH:MM wann der automatische Beregnungszyklus starten soll (abhängig vom bisherigen Niederschlag und vergangenen Tage)
  • prenotificationTime - Zeitangabe in HH:MM wann am Tag vor der automatischen Beregnung ggf. eine Benachtigung versendet werden soll (abhängig vom Reading prenotification)
  • notifications - auf 1 setzen, wenn diverse Benachrichtigungen versendet werden sollen (z.B. ZoneXY eingeschaltet usw.), hierzu ist in der sendMessage Methode der korrekte Befehl für den Nachrichtenversand anzupassen
  • prenotification - auf 1 setzen, wenn am Tag vor dem Automatikzyklus benachrichtigt werden soll (ich kann damit in Abhängigkeit der Wetterlage entscheiden, ob ich ggf. noch einen Tag warte...)
  • delay - heute/morgen anstehende, automatische Beregnung um einen Tag verzögern
  • pct - Intensität aller Beregnungszonen ändern (Dauer wird auch an den Zonen angezeigt)
  • rainThreshold - Niederschlagsmenge, ab der das Reading isRaining auf 1 springen soll (um z.B. bei leichtem Nieselregen den laufenden Zyklus nicht zu unterbrechen)
  • reset - bisherige Niederschlagsmenge und Tageszähler zurück setzen

Readings:

viele Readings erklären sich aus den Befehlen, darüber hinaus gibt es folgende...

  • daysLeft - verbleibende Tage bis zur nächsten, automatischen Beregnung (sofern bis dahin kein ausreichender Niederschlag fällt)
  • isRaining - 1 wenn Schwellwert für aktuellen Niederschlag überschritten wird
  • lastPct - letzte Intensitätseinstellung (wird für die Änderung und Wiederherstellung im Automatikmodus verwendet)
  • mode - aktueller Status der Steuerung (standby: Ruhemodus, auto: automatischer Zyklus läuft, manual: manueller Zyklus läuft, single: einzelne Zone wurde gestartet)
  • totalPrecipitation - kummulierter Niederschlagswert seit der letzten automatischen Beregnung

Alle Befehle werden über das notify_Beregnung Device an die entsprechenden Methoden weitergeleitet.
Die 3 Zeitsteuerungen werden über das doif de_Beregnung realisiert.
Sicherlich hätte man das auch alles in einem DoIf bündeln können, ich vertraue für einfache Dinge dem Notify-Device aber irgendwie mehr.

funclass

Ich habe mir zusätzlich noch eine Readingsgroup zur Anzeige der echten Ventilstati eingerichtet. Dies ist aber nicht zwingend notwendig. Hiermit sieht man nur sehr schön welche Ventile tatsächlich grad eingeschaltet sind.

Sieht bei mir so aus:

defmod Beregungskreise readingsGroup Relais0(1|2|3|4|5|6|7|8|9):value
attr Beregungskreise mapping %ALIAS
attr Beregungskreise valueIcon {'value.on' => 'sani_sprinkling@0000FF', 'value.off' => 'sani_sprinkling'}

Das Ventil 9 steuert meine Tropfbewässerung, für welche ich eine etwas ,,einfachere" Zeitsteuerung für die tägliche Aktivierung nutze.

Diese Infos sollten eigentlich erstmal ausreichen um das ganze besser zu verstehen und nutzen zu können. Ich habe noch ein paar Ideen wie z.B. Presets für eigene Beregnungs-Zonen-Gruppen. Wann ich das integriere kann ich aber noch nicht sagen. Wer mag kann das Ganze auch gern mal als Wiki-Eintrag verfassen, dann lassen sich die Infos besser aktuell halten und wir/ich müllen diesen Thread hier nicht so zu.

Nun erstmal viel Spaß damit.
VG Christian

Stefan_Hvr

#65
Guten Abend Christian,

Erstmal "sieht schick aus", rein optisch und Dein herangehen:

Erste Rückmeldung:

Zitat von: funclass am 14 Juni 2020, 20:48:57
Wie schon erwähnt, habe ich im Grunde alles nochmal neu geschrieben. (...) hierbei freue ich mich natürlich über Feedback bzw. Unterstützung.[/code]

Zuerst muss die Datei 99_sprinkleUtils.pm ins FHEM-Verzeichnis kopiert werden. --> Check
Anschießend kann mit dem Befehl {generateSprinkleDevices()} das Anlegen der Devices angestoßen werden. --> Check
Es wird nur eine Beregnungszone als Beispiel angelegt (Beregnung_Zone09). --> Check
Ich nutze derzeit 8 Zonen, diese können per copy erzeugt werden und müssen am Ende des Namens durchnummeriert sein, beginnend bei 01.-->OK

Beregnung_Zone01 ... Beregnung_Zone08: Verknüpfung der Steuerung zu den eigentlichen Steuerventilen. UND valve - Name des Devices für das/die zugehörigen Ventile setzen, bei mehreren Ventilen sind die Namen kommagetrennt zu speichern --> okay, habe ich gemacht. Ja ich starte immer das Hauptventil mit, daher sieht das Readings bei mir so aus:

setstate Beregnung_Zone01 2020-06-15 00:28:41 valve Relais01,Relais09

Zitatstart/stop - Zone im Single-Mode starten bzw. stoppen
--> das klappt bei mir (noch nicht). Das notify wird getriggert (sichtbar an der Uhrzeit)
Auszug Eventmonitor
2020-06-15 00:07:01 dummy Beregnung activeZone: 01
2020-06-15 00:07:01 dummy Beregnung_Zone01 action: start
2020-06-15 00:07:01 dummy Beregnung_Zone01 action: none


sub sprinkleSingleMode($) {
my ($zoneName) = @_;
my $mode = ReadingsVal("Beregnung", "mode", "standby");
my $zoneNumber = substr($zoneName,length($zoneName)-2,2);
if ($mode eq "standby") {
$zoneNumber = $zoneNumber + 0;
fhem ("setreading Beregnung mode single");
fhem ("setreading Beregnung activeZone $zoneNumber");
} elsif ($mode eq "single") {
fhem ("setreading Beregnung activeZone $zoneNumber");
}
fhem ("set $zoneName action none");
}


--> hier komme ich momentan noch nicht weiter....

Auch die Aktive Zone im Hauptdevice wird gesetzt "activeZone"

kann es sein, dass das Notify nicht passt?


defmod notify_Beregnungszone notify Beregnung_Zone.*:.* {\
my $zone = $NAME;;\
my $action = $EVTPART0;;\
if ($action eq "action:") {\
# Einzel-Beregnung gestartet oder gestoppt\
if ($EVTPART1 eq "start") {\
sprinkleSingleMode($zone);;\
} else {\
sprinkleStopSingleMode($zone);;\
}\
} elsif ($action eq "on") {\
# Zone aktiviert\
} elsif ($action eq "off") {\
# Zone deaktiviert\
} else {\
# andere Aktion\
}\
}
attr notify_Beregnungszone group Beregnung
attr notify_Beregnungszone room Außen


Fehlt bei on und off nicht die Aktion?

Grüße Stefan
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

#66
Hallo Stefan,

soweit ich das beurteilen kann, klingt deine Einrichtung erstmal ganz gut.

Die Notifys machen auch das was sie sollen (die fehlende Aktion bei on/off ist nicht relevant, da das bei state nicht notwendig ist). Wenn im Hauptdevice die aktive Zone gesetzt wird, klappt das auch alles. Die Ursache bei dir scheint in der Methode ,, sprinkleChangeActiveZone($)" zu liegen. Diese wird aufgerufen, sobald sich die aktive Zone ändert. In Zeile 163 wird der eigentliche Schaltbefehl gegeben. Du kannst ja mal versuchen diesen manuell auszulösen z.B. so:

set $zoneValve on-for-timer $seconds  ->

set Relais01,Relais09 on-for-timer 60

Du kannst auch mal direkt Testen die Zone zu setzen, dann aber anschließend manuell wieder auf 0 setzen, weil bei Direktzugriff kein Timer geschrieben wird.

set Beregnung activeZone 1

Was ich grad noch sehe ist, dass in der Methode ,,sprinkleSingleMode()" die Bereinigung der Vornull evtl. über das IF könnte. Im event-Monitor ist zu sehen, dass deine aktive Zone mit Vornull angegeben ist. Das könnte zu Problemen führen. Mach mal bitte aus:


...
if ($mode eq "standby") {
$zoneNumber = $zoneNumber + 0;
...


das:

...
$zoneNumber = $zoneNumber + 0;
if ($mode eq "standby") {
...


Das ändere ich bei mir auch gleich mal.

VG Christian

Stefan_Hvr

Zitat von: funclass am 15 Juni 2020, 08:56:19
Mooooin,

Wenn im Hauptdevice die aktive Zone gesetzt wird, klappt das auch alles.
Es wird activeZone 1-6 und 9 gesetzt. (ohne führende Null)

ZitatDie Ursache bei dir scheint in der Methode ,, sprinkleChangeActiveZone($)" zu liegen. Diese wird aufgerufen, sobald sich die aktive Zone ändert.
--> genau, durch das notify

In Zeile 163 wird der eigentliche Schaltbefehl gegeben. Du kannst ja mal versuchen diesen manuell auszulösen z.B. so:

set $zoneValve on-for-timer $seconds  ->

set Relais01,Relais09 on-for-timer 60
--> geht on   off  on-for-timer 60 alles ok


Du kannst auch mal direkt Testen die Zone zu setzen, dann aber anschließend manuell wieder auf 0 setzen, weil bei Direktzugriff kein Timer geschrieben wird.

set Beregnung activeZone 1

Was ich grad noch sehe ist, dass in der Methode ,,sprinkleSingleMode()" die Bereinigung der Vornull evtl. über das IF könnte. Im event-Monitor ist zu sehen, dass deine aktive Zone mit Vornull angegeben ist. Das könnte zu Problemen führen. Mach mal bitte aus:


...
if ($mode eq "standby") {
$zoneNumber = $zoneNumber + 0;
...


das:

...
$zoneNumber = $zoneNumber + 0;
if ($mode eq "standby") {
...


2020-06-15 10:23:36 dummy Beregnung activeZone: 1
2020-06-15 10:23:36 dummy Beregnung_Zone01 action: start
2020-06-15 10:23:36 dummy Beregnung_Zone01 action: none

--> nun ist ohne Null, aber leider keine Änderung

Aber eine generelle Frage....die 99_sprinkleUtils.pm muss nach einer Änderung neu geladen werden oder ähnliches?

VG Christian
[/quote]
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

Das klingt irgendwie danach, dass die Methode ,, sprinkleChangeActiveZone($)" entweder gar nicht getriggert wird, oder bei dir nicht sauber funktioniert. Passiert etwas wenn du im Hauptdevice manuell eine Zone setzt?

Solange du die Utils mit dem internen FHEM-Editor bearbeitest muss nichts neu geladen werden.

JHo

#69
Stefan, ist bei dir das notify_Beregnung angelegt? Das klappt bei mir nicht, und daher (?) funktioniert die Einschaltung auch nicht.

Edit: Log hilft sicher:
2020.06.15 14:50:24 3: 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
}
} : syntax error at (eval 391966) line 22, at EOF
syntax error at (eval 391966) line 24, near "} elsif"
Global symbol "$command" requires explicit package name (did you forget to declare "my $command"?) at (eval 391966) line 24.
syntax error at (eval 391966) line 26, near "} elsif"
Global symbol "$command" requires explicit package name (did you forget to declare "my $command"?) at (eval 391966) line 26.
Global symbol "$command" requires explicit package name (did you forget to declare "my $command"?) at (eval 391966) line 28.
Global symbol "$action" requires explicit package name (did you forget to declare "my $action"?) at (eval 391966) line 31.
Unmatched right curly bracket at (eval 391966) line 39, at end of line
Unmatched right curly bracket at (eval 391966) line 39, at end of line

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

JHo

... und nochmal ich: Danke Christian für die erneut viele Arbeit, die du da rein gesteckt hast.
Wenn ich den Code bei mir zum Laufen bekommen habe, versuche ich, dort hinein meine Anpassungen reinzueditieren und das hier zu dokumentieren.
Was habe ich gemacht:

  • Einbezug der Regenmengen nicht nur des letzten, sondern der letzten 3 Tage: wenn's eine Woche geschüttet hat, muss nicht am nächsten oder übernächsten Tag wieder bewässert werden. Hast du vielleicht durchs Nullen der $daysLeft einfacher erledigt?
  • Einbezug der Evapotranspirationsprognose. Berücksichtigt die vorhergesagte Verdunstung für die kommenden 3 Tage, wenn sie eine längere (heiß, sonnig, trocken) oder kürzere (kühler, bedeckt) Bewässerung nötig machten könnte. Die PEvap-Prognosen sind immer ziemlich spekulativ und sehr von den lokalen Bedingungen abhängig, aber m.E. doch besser als nichts.
  • Einbezug der prognostizierten Regenmenge (simpel aus Regenmenge x Wahrscheinlichkeit) am nächsten Tag. Falls Mengenprognose > Grenzwert, wird der Tageszähler (jetzt $daysLeft) um eins verringert.
Ob ein Wiki-Eintrag übersichtlicher wird...? Zumindest jetzt, bis alle Bugs "raus" sind, kann ich mir das nicht vorstellen.

Viele Grüße, 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

#71
Zitat von: JHo am 15 Juni 2020, 15:20:30
... und nochmal ich: Danke Christian für die erneut viele Arbeit, die du da rein gesteckt hast.
Wenn ich den Code bei mir zum Laufen bekommen habe, versuche ich, dort hinein meine Anpassungen reinzueditieren und das hier zu dokumentieren.
Was habe ich gemacht:

  • Einbezug der Regenmengen nicht nur des letzten, sondern der letzten 3 Tage: wenn's eine Woche geschüttet hat, muss nicht am nächsten oder übernächsten Tag wieder bewässert werden. Hast du vielleicht durchs Nullen der $daysLeft einfacher erledigt?
  • Einbezug der Evapotranspirationsprognose. Berücksichtigt die vorhergesagte Verdunstung für die kommenden 3 Tage, wenn sie eine längere (heiß, sonnig, trocken) oder kürzere (kühler, bedeckt) Bewässerung nötig machten könnte. Die PEvap-Prognosen sind immer ziemlich spekulativ und sehr von den lokalen Bedingungen abhängig, aber m.E. doch besser als nichts.
  • Einbezug der prognostizierten Regenmenge (simpel aus Regenmenge x Wahrscheinlichkeit) am nächsten Tag. Falls Mengenprognose > Grenzwert, wird der Tageszähler (jetzt $daysLeft) um eins verringert.
Ob ein Wiki-Eintrag übersichtlicher wird...? Zumindest jetzt, bis alle Bugs "raus" sind, kann ich mir das nicht vorstellen.

Viele Grüße, Jan
Hallo Jan,

zu deinen 3 Punkten:

  • genau das ist eigentlich das Ziel was ich verfolgt hab: die Niederschlagsmenge über einen definierten Zeitraum zu berücksichtigen. Die Tagesmenge wird deshalb kurz vor Mitternacht auf den Totalwert addiert. Wenn nach X Tagen die Gesamtmenge nicht dem Sollwert entspricht, dann wird Bewässert.
  • Verdunstungsgrad wäre auf jeden Fall ein sinnvolles Feature. Ich hab mich bisher immer mit der Berechnung schwer getan.
  • Meine Erfahrungen mit der Regenprognose sind eher schlecht. Deshalb hab ich das (noch) nicht automatisiert. Es spricht aber auch nicht gegen eine konfigurierbare Option.
    Wichtig: um die Beregnung wegen wahrscheinlichem Regen zu verzögern muss daysLeft um 1 erhöht werden. Denn bei 0 (oder kleiner) wird Bewässert.

VG Christian

funclass

Zitat von: JHo am 15 Juni 2020, 14:52:44
Stefan, ist bei dir das notify_Beregnung angelegt? Das klappt bei mir nicht, und daher (?) funktioniert die Einschaltung auch nicht.

Edit: Log hilft sicher:
2020.06.15 14:50:24 3: 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
}
} : syntax error at (eval 391966) line 22, at EOF
syntax error at (eval 391966) line 24, near "} elsif"
Global symbol "$command" requires explicit package name (did you forget to declare "my $command"?) at (eval 391966) line 24.
syntax error at (eval 391966) line 26, near "} elsif"
Global symbol "$command" requires explicit package name (did you forget to declare "my $command"?) at (eval 391966) line 26.
Global symbol "$command" requires explicit package name (did you forget to declare "my $command"?) at (eval 391966) line 28.
Global symbol "$action" requires explicit package name (did you forget to declare "my $action"?) at (eval 391966) line 31.
Unmatched right curly bracket at (eval 391966) line 39, at end of line
Unmatched right curly bracket at (eval 391966) line 39, at end of line

VG, Jan

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

Versuche mal bitte ein leeres Notify anzulegen und kopiere danach folgenden Code in die def:


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


Ohne dieses Notify kann das Hauptdevice nicht mit der Logik ,,kommunizieren"

funclass

#73
Hab eben noch einen Fehler in der Vorabbenachrichtigung gefunden. Anbei die korrigierte Fassung:


sub sprinklePrenotification() {
my $daysLeft = ReadingsVal("Beregnung", "daysLeft", 0);
my $prenotification = ReadingsVal("Beregnung", "prenotification", 0);
my $state = ReadingsVal("Beregnung", "state", "off");
my $totalPrecipitation = ReadingsVal("Beregnung", "totalPrecipitation", 0) + ReadingsVal("Beregnung", "rainDay", 0);
my $defaultIntervalPrecipitation = ReadingsVal("Beregnung", "defaultIntervalPrecipitation", 0);
if (($prenotification == 1) && ($daysLeft < 2) && ($state eq "on") && ($totalPrecipitation < $defaultIntervalPrecipitation)) {
sendMessage("Morgen wird voraussichtlich der Rasen bewässert.");
}
}

Stefan_Hvr

Hallo Christian, Hallo Jan,

Zitat von: JHo am 15 Juni 2020, 14:52:44
Stefan, ist bei dir das notify_Beregnung angelegt? Das klappt bei mir nicht, und daher (?) funktioniert die Einschaltung auch nicht.
Edit: Log hilft sicher:

--> Quickcheck: Ihr beide habt 100 Punkte. Das notify war nicht angelegt.
Log: so weit war ich gestern Nacht noch nicht  ;)
Habe das notify angelegt und Zone 1 gestartet. Geht, auch in Verbindung mit zwei Ventilen (Hauptventil)

Ich schau jetzt mal weiter. Danke ihr Beiden!!!!

Wiki: Wenn damit begonnen wird müsste auf jeden Fall (temporär) ein Hinweis auf den Status und ein Link zu diesen Posts mit rein.

Beste Grüße und bis gleich ;)
Stefan


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