Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Gesperrt
Benutzeravatar
udo1toni
Beiträge: 14147
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von udo1toni »

Die Sonoffs sprechen von Haus aus kein mqtt, sondern nur mit der Hersteller-Cloud. Für openHAB gibt es kein Binding für diese Cloud - es widerspricht der Idee von openHAB, Cloud-Dienste zu nutzen, wenn dies vermeidbar ist, also wurde nie ein Binding für "Sonoff nativ" entwickelt, schließlich gibt es schon seit Jahren Tasmota, was nebenbei auch noch mehr Funktionen bietet.

Anders sieht es bei den Shellies aus, die können nicht nur ab Werk mit mqtt umgehen, sie haben auch eine offengelegte API und lassen sich leicht komplett ohne Cloud nutzen, deshalb gibt es inzwischen auch ein Binding, welches den "Haus-Code" der Shellies spricht.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

juschi
Beiträge: 13
Registriert: 23. Mär 2020 21:49
Answers: 0

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von juschi »

Ich hab mich die letzte Zeit auch etwas mit einer automatischen Bewässerung beschäftigt. Dabei wollte ich es so einfach wie möglich halten ... evtl hat ja jemand Spaß an der Einstellung:

Code: Alles auswählen

rule	"Bewässerungsautomatik"
when	Time cron "0 0 0/1 1/1 * ? *"
then	var Number var_wetter_berechnet_gestern	= 	wetter_rain_now.averageSince(now.withTimeAtStartOfDay.minusDays(1), "rrd4j")
		var Number var_temperatur_heute_avg		= 	(((wetter_temp_min_tag_0.state as Number).intValue) + 
													 ((wetter_temp_max_tag_0.state as Number).intValue)) / 2
		
		sendCommand(bewaesserung_regen_berechnet_gestern,	var_wetter_berechnet_gestern)
		sendCommand(bewaesserung_regen_berechnet_heute, 	(wetter_rain_tag_0.state as Number).floatValue)
		sendCommand(bewaesserung_regen_berechnet_morgen, 	(wetter_rain_tag_1.state as Number).floatValue)
		sendCommand(bewaesserung_temp_berechnet_aktuell, 	(wetter_temp_now.state as Number).intValue)
		sendCommand(bewaesserung_automatik_dauer_status, 	var_temperatur_heute_avg)
		
		if (now.getHourOfDay == 0) { sendCommand(bewaesserung_automatik_anzahl, 0) }
		// Prüfe Bedingungen
		if ( bewaesserung_automatik_control.state 			== 	ON) {
		if ( now.getHourOfDay								== 	(bewaesserung_automatik_start_1.state as Number).intValue || 
			 now.getHourOfDay								== 	(bewaesserung_automatik_start_2.state as Number).intValue) {
		if ( var_wetter_berechnet_gestern 					<=	bewaesserung_regen_gestern_max_setpoint.state &&
			(wetter_rain_tag_0.state as Number).floatValue	<=	(bewaesserung_regen_heute_max_setpoint.state as Number).floatValue &&
			(wetter_rain_tag_1.state as Number).floatValue 	<=	(bewaesserung_regen_morgen_max_setpoint.state as Number).floatValue) {
		if	((wetter_temp_now.state as Number).intValue		>=	(bewaesserung_temp_min_setpoint.state as Number).intValue) {
			
			// Verteilung
			if (var_temperatur_heute_avg < 14) {
				if (now.getHourOfDay == (bewaesserung_automatik_start_1.state as Number).intValue && bewaesserung_automatik_anzahl.state == 0) {
					sendCommand(bewaesserung_automatik_dauer_last, (bewaesserung_automatik_dauer_kalt.state as DecimalType).intValue*1/2) }
				if (now.getHourOfDay == (bewaesserung_automatik_start_2.state as Number).intValue && bewaesserung_automatik_anzahl.state == 1) {
					sendCommand(bewaesserung_automatik_dauer_last, (bewaesserung_automatik_dauer_kalt.state as DecimalType).intValue*1/2) }
				if (now.getHourOfDay == (bewaesserung_automatik_start_2.state as Number).intValue && bewaesserung_automatik_anzahl.state == 0) {
					sendCommand(bewaesserung_automatik_dauer_last, (bewaesserung_automatik_dauer_kalt.state as DecimalType).intValue) }}
			if (var_temperatur_heute_avg >= 14 && var_temperatur_heute_avg < 20) {
				if (now.getHourOfDay == (bewaesserung_automatik_start_1.state as Number).intValue && bewaesserung_automatik_anzahl.state == 0) {
					sendCommand(bewaesserung_automatik_dauer_last, (bewaesserung_automatik_dauer_normal.state as DecimalType).intValue*1/3) }
				if (now.getHourOfDay == (bewaesserung_automatik_start_2.state as Number).intValue && bewaesserung_automatik_anzahl.state == 1) {
					sendCommand(bewaesserung_automatik_dauer_last, (bewaesserung_automatik_dauer_normal.state as DecimalType).intValue*2/3) }
				if (now.getHourOfDay == (bewaesserung_automatik_start_2.state as Number).intValue && bewaesserung_automatik_anzahl.state == 0) {
					sendCommand(bewaesserung_automatik_dauer_last, (bewaesserung_automatik_dauer_normal.state as DecimalType).intValue) }}
			if (var_temperatur_heute_avg >= 20) {
				if (now.getHourOfDay == (bewaesserung_automatik_start_1.state as Number).intValue && bewaesserung_automatik_anzahl.state == 0) {
					sendCommand(bewaesserung_automatik_dauer_last, (bewaesserung_automatik_dauer_warm.state as DecimalType).intValue*1/4) }
				if (now.getHourOfDay == (bewaesserung_automatik_start_2.state as Number).intValue && bewaesserung_automatik_anzahl.state == 1) {
					sendCommand(bewaesserung_automatik_dauer_last, (bewaesserung_automatik_dauer_warm.state as DecimalType).intValue*3/4) }
				if (now.getHourOfDay == (bewaesserung_automatik_start_2.state as Number).intValue && bewaesserung_automatik_anzahl.state == 0) {
					sendCommand(bewaesserung_automatik_dauer_last, (bewaesserung_automatik_dauer_warm.state as DecimalType).intValue) }}
									
			Thread::sleep(1000)
			sendCommand(bewaesserung_automatik_anzahl, (bewaesserung_automatik_anzahl.state as Number).intValue + 1)
			sendCommand(bewaesserung_automatik_dauer, (bewaesserung_automatik_dauer_last.state as Number).intValue)
			if (astro_sun_daylight.state == ON) { echo_unten_kueche_tts.sendCommand("Bewässerung wurde gestartet") }
			sendBroadcastNotification("Bewässerungsautomatik")
			sendCommand(switch_garten_pumpe_control, ON)
			createTimer(now.plusMinutes((bewaesserung_automatik_dauer_last.state as DecimalType).intValue), 
				[| 	sendCommand(switch_garten_pumpe_control, OFF)
					sendCommand(bewaesserung_automatik_dauer, 0) ]) }}}}
end
Darksky liefert die Daten ... bei weitren Fragen kann ich noch gerne mal weiterhelfen

Benutzeravatar
udo1toni
Beiträge: 14147
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von udo1toni »

Die Rule sieht ja sehr ... mächtig ... aus.

Durch Deine Formatierung wird schon klar, dass die Rule viele ähnliche oder gar identische Ausdrücke enthält, was meist bedeutet, dass man sie durch einfaches Umstellen verbessern kann.
Ich hab jetzt keinen Testlauf gemacht, denke aber, das hier sollte zum gleichen Ergebnis führen:

Code: Alles auswählen

rule "Bewässerungsautomatik"
when
    Time cron "0 0 * * * ?"                                                                     // stündlich triggern
then
    // alle mehrfach verwendeten Itemstatus als Value definieren
    val Number nWeatherCalcPast = wetter_rain_now.averageSince(now.withTimeAtStartOfDay.minusDays(1), "rrd4j")
    val Number nTempTodayAvg    = ((wetter_temp_min_tag_0.state as Number).intValue + (wetter_temp_max_tag_0.state as Number).intValue) / 2
    val Number nWeatherRain0    = (wetter_rain_tag_0.state as Number).floatValue
    val Number nWeatherRain1    = (wetter_rain_tag_1.state as Number).floatValue
    val Number nWeatherTempNow  = (wetter_temp_now.state as Number).intValue
    val Number nHour = now.getHourOfDay
    var Number nWaterAutoCount = bewaesserung_automatik_anzahl.state as Number                  // Wert wird in der Rule verändert -> Variable
    
    // Anzeige aktualisieren
    bewaesserung_regen_berechnet_gestern.postUpdate(nWeatherCalcPast)
    bewaesserung_regen_berechnet_heute.postUpdate(nWeatherRain0)
    bewaesserung_regen_berechnet_morgen.postUpdate((nWeatherRain1)
    bewaesserung_temp_berechnet_aktuell.postUpdate(nWeatherTempNow)
    bewaesserung_automatik_dauer_status.postUpdate(nTempTodayAvg)

    // Um Mitternacht Bewässerungszähler zurücksetzen
    if(nHour == 0) {
        bewaesserung_automatik_anzahl.postUpdate(0)
        nWaterAutoCount = 0
    }

    // Prüfe Bedingungen
    if(bewaesserung_automatik_control.state != ON)                                              // Automatik aus -> Ende
        return;
    
    val Number nStart1 = (bewaesserung_automatik_start_1.state as Number).intValue
    val Number nStart2 = (bewaesserung_automatik_start_2.state as Number).intValue

    if(nHour != nStart1 && nHour != nStart2)                                                    // Weder Start1 noch Start2 -> Ende
        return;

    if(nWeatherCalcPast > bewaesserung_regen_gestern_max_setpoint.state ||                      // zu nass -> Ende
        nWeatherRain0 > (bewaesserung_regen_heute_max_setpoint.state as Number).floatValue || 
        nWeatherRain1 > (bewaesserung_regen_morgen_max_setpoint.state as Number).floatValue)
        return;

    if(nWeatherTempNow < (bewaesserung_temp_min_setpoint.state as Number).intValue)             // zu kalt -> Ende
        return;

    // Temperaturabhängig Bewässerungsdauer setzen
    var Number nDuration = 0
    var Number nFactor = 1
    if (nTempTodayAvg < 14) {                                                                   // Temperatur unter 14 
        nDuration = (bewaesserung_automatik_dauer_kalt.state as Number).intValue                // Dauer kalt
        nFactor = 1/2                                                                           // Aufteilung 1/2 - 1/2
    } else if (nTempTodayAvg < 20) {                                                            // Temperatur zwischen 14 und 20
        nDuration = (bewaesserung_automatik_dauer_normal.state as Number).intValue              // Dauer mittel
        nFactor = 1/3                                                                           // Aufteilung 1/3 - 2/3
    } else {                                                                                    // Temperatur über 20
        nDuration = (bewaesserung_automatik_dauer_warm.state as Number).intValue                // Dauer warm
        nFactor = 1/4                                                                           // Aufteilung 1/4 - 3/4
    }
    // Startwert ist die volle Bewässerungsdauer
    if(nHour == nStart1) {                                                                      // erste Startzeit -> es wurde noch nicht bewässert
        nDuration = nDuration * nFactor                                                         // also Faktor berücksichtigen
    } else if (nHour == nStart2 && nWaterAutoCount == 1) {                                      // zweite Startzeit und es wurde bewässert
        nDuration = nDuration * (1-nFactor)                                                     // also Gegenfaktor berücksichtigen
    }
    // Anzeige aktualisieren
    bewaesserung_automatik_dauer_last.postUpdate(nDuration)
    bewaesserung_automatik_anzahl.postUpdate(nWaterAutoCount + 1)
    bewaesserung_automatik_dauer.postUpdate(nDuration)
    if(astro_sun_daylight.state == ON)                                                          // Tagsüber Ansage
        echo_unten_kueche_tts.sendCommand("Bewässerung wurde gestartet")
    sendBroadcastNotification("Bewässerungsautomatik")                                          // Meldung
    switch_garten_pumpe_control.sendCommand(ON)                                                 // Bewässrung starten
    
    createTimer(now.plusMinutes(nDuration.intValue), [|                                         // und Ausschalttimer starten
        switch_garten_pumpe_control.sendCommand(OFF)
        bewaesserung_automatik_dauer.postUpdate(0) 
    ])
end
Ein paar Erläuterungen:
  1. Time cron: Das Jahr ist optional, der Ausdruck 1/1 im Tag oder 0/1 in der Stunde lässt sich durch einen * ersetzen. (das gilt sinngemäß auch für Minute, Sekunde und Monat)
  2. Du hast ja schon so ein paar Werte in Variablen gespeichert. Ich versuche immer, jeden Wert, den ich innerhalb einer Rule mehrfach benötige, in einer Variablen zu halten, das spart jede Menge Platz. Fixe Werte halte ich in Konstanten.
  3. Statt Bedingungen ineinander zu verschachteln, nutze ich return; zum Abbruch der Rule. Man könnte hier natürlich noch logMeldungen ausgeben, wenn das gewünscht ist.
  4. Die Bewässerungsdauer ergibt sich aus der Durchschnittstemperatur und dem Zeitpunkt (also ob es die erste oder die zweite Bewässerung des Tages ist. Statt hier immer und immer wieder fast identische Vergleiche durchzuführen und zigfach Variablen zu verwenden, ist es sinnvoller, zwei Variablen abhängig von der Temperatur zu setzen.
    Anschließend erfolgt dann die Gewichtung. Ausgangswert ist dabei die volle Bewässerungsdauer. Falls es der erste Termin ist, wird der gesetzte Faktor verwendet, falls es der zweite Termin ist und bereits bewässert wurde, wird die ergänzende Menge verwendet. Durch die Reihenfolge der Bedingungen kommt hinten das Ergebnis immer in der gleichen Variablen nDuration an, welche nun unkompliziert weiterverwendet werden kann.
  5. Da der Wert in einer Variablen steht, muss openHAB auch nicht darauf warten, dass ein asynchrones sendCommand oder postUpdate abgeschlossen wurde.
  6. Die meisten sendCommand() Anweisungen dienen hier offensichtlich nur der Darstellung in der UI. Die korrekte Action ist hier postUpdate(). openHAB lässt jedem empfangenen sendCommand() automatisch ein postUpdate() folgen, aber warum 2 Actions, wenn es auch eine tut?
  7. Und warum überhaupt die Action? Die Methode ist grundsätzlich die bessere Wahl, auch wenn das manchmal ebenfalls Tücken mit sich bringt.
    Also lieber Item.sendCommand(Befehl) als sendCommand(String,String)
Es gibt noch ein paar Randbedingungen, z.B. müssen alle verwendeten Items gültige Werte enthalten, sonst knallt es. Ebenso könnte ein Anwender Start2 vor Start1 parametrieren, oder die Dauer überschreitet den Abstand zwischen beiden Bewässerungszyklen.
Vermutlich kann es auch passieren, dass sich die Durchschnittstemperatur im Laufe das Tages nicht unerheblich ändert (die Berechnung ist hier auch etwas ... einfach gehalten).
Da bei uns meine Frau den grünen Daumen hat, bin ich, was Pflanzen betrifft raus, ich hab keine Ahnung, wie kritisch eine Überdosierung (beim ersten Durchgang die Hälfte, beim 2. Durchgang 3/4) ist.
Eventuell wäre es in dem Zusammenhang besser, bestimmte Berechnungen nur einmal am Tag durchzuführen, eben wenn das erste mal gewässert wird, und das Ergebnis zwischenzuspeichern, so dass es beim zweiten Durchgang noch zur Verfügung steht.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Fossi
Beiträge: 5
Registriert: 24. Jul 2019 22:20
Answers: 0

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von Fossi »

Meine Bewässerung habe ich auch mit dem Sonoff 4ch Pro umgesetzt. Allerdings habe ich ihn mit EspEasy geflasht.

Als Vorteil Empfinde ich die nicht auf bestimmte Devices zugeschnittene Oberfläche. Man hat immer das Gleiche und hate viele Details vor Augen.

Die Mqtt Verbindung arbeitet ähnlich zu Tasmota, so sehe ich das auch alles in Openhab.

Bild

So hab ich die Devices angelegt. Dazu habe ich Rules hinterlegt, mit denen sich über die Buttons die Relais schalten lassen. Der erste Block ist entstanden, nachdem mir meine Kinder nach dem Aufräumen des Kellers und einem damit verbundenen Stromausfall des ESP mitteilten, das sie im Garten nass geworden sind. Der erste Block sorgt dafür, das die Relais beim Einschalten ausgeschaltet werden.

Code: Alles auswählen

on System#Boot do
    gpio,12,0
    gpio,5,0
    gpio,4,0
    gpio,15,0
endon

on But_1#But do
  if [Relay_1#stat]=1
    gpio,12,0
  else
    gpio,12,1
  endif
endon

on But_2#But do
  if [Relay_2#stat]=1
    gpio,5,0
  else
    gpio,5,1
  endif
endon

on But_3#But do
  if [Relay_3#stat]=1
    gpio,4,0
  else
    gpio,4,1
  endif
endon

on But_4#But do
  if [Relay_4#stat]=1
    gpio,15,0
  else
    gpio,15,1
  endif
endon
Mir war aber nicht wohl dabei, dass die Verbindung zum Openhab für die Beendigung das Bewässerns bestehen muss. So hab ich einen Event (Rule) auf dem Esp hinterlegt:

Code: Alles auswählen

On startwater30 do 
  gpio,12,1 //start watering (open valve)
  timerSet,1,1800 //timer 1 set for 30 minutes
endon

On stopwatering do 
  timerSet,1,0 //timer 1 set to halt, used to stop watering before the timer ends!
  gpio,12,0 //stop watering (close valve)
endon
 
On Rules#Timer=1 do  
   gpio,12,0 //stop watering (close valve)
endOn

On startwatersec do
   gpio,12,1 //start watering (open valve)
   timerSet,1,%eventvalue%
endOn
Der erste Codeblock ist noch aus den ersten Versuchen der zweite Block ist für ein manuelles Beenden des Bewässerns inkl. Reset des Timers. Der dritte Block ist zum Beenden der Bewässerung über den Timer. Und der letzte ist der Spannende: Die Timerzeit wird als Variable über folgenden http request an den ESP übergeben:

Code: Alles auswählen

http://IP_DES_ESP/control?cmd=event,startwatersec=1800
1800 ist also %eventvalue% und startet den Timer somit für 30 Minuten. Damit aber noch nicht genug: Über eine Regel in Openhab habe ich mir einen Faktor hinterlegt, der eine auf der Oberfläche ausgewählte Literzahl (240 Sek für einen Liter/m² bruscht die Bewässerung des 120m² grossen Vorgartens) direkt in Sekunden umrechnet. Eine weitere Regel überprüft um 04:30, ob der Schalter für die Bewässerung eingeschltet ist und startet ggf. die Bewässerung für die in Sekunden angeforderte Literzahl und setzt danach die Bewässerungsanforderung wieder auf off. So kann ich mir den Zustand des Gartens und die Wettervorhersage ansehen und die Bewässerung "programmieren".

Code: Alles auswählen

//Bewässerung Vorgarten um 04:30 für entsprechenden Zeitraum starten
rule "Bew_Vorg_auto"
when 
	Time cron "0 30 4 * * ?" // immer 4. Stunde 30. Minute
then
	if (SC_Bew_Vorg_ON.state == ON) {
		sendHttpGetRequest("http://IP_DES_ESP/control?cmd=event,startwatersec=" + Bew_Vorg_Dauer.state)
		SC_Bew_Vorg_ON.sendCommand(OFF)
	}
end

//Bewässerung Vorgarten umrechnen und Zeit in Sekunden updaten
rule "Bew_Vorg_Dauer"
when 
	Item SC_Bew_Vorg_Lit changed
then
	Bew_Vorg_Dauer.postUpdate((SC_Bew_Vorg_Lit.state as DecimalType) * 240)
end
Sollte es also zu einem Kommunikationsausfall kommen, arbeitet der Sonoff 4ch pro die Bewässerung selbstständig ab. Kommt es zu einem Stromausfall wird der Sonoff abgeschossen, aber auch die Stromversorgung der Ventile, die damit schliessen. So schlafe ich dann doch etwas ruhiger. Die Lösung habe ich hier gepostet um vielleicht dem einen oder anderen, vielleicht auch in Teilen eine Anregung mitzugeben.

Mein nächstetes Projekt sollte eine Automatisierung sein, dafür musste ich aber erst meine Wetterstation KS300 umbauen, um die Datenerfassung verlässlicher zu machen. Darüber schreibe ich in einem eigenen Beitrag und werde den dann hier verlinken. Die Regenmenge der letzten 48 Std. wird derzeit schon erfasst, so dass ich über Regenwarscheinlichkeit, Regenmenge der letzten zwei Tage und aktuellem Regenstatus eine Regel zur Bewässerung basteln kann, die automatisch die Bewässerungszeit ermittelt und an der ESP übergibt. Den String mit der Variable habe ich leider nicht mit Mqtt umsetzen können - da kenne ich mich noch zu wenig aus. Aber die Rückmeldung über die Ventile kommt nach dem Absetzten des http Requests über Mqtt zurück. das klappt sehr gut und hat mir an dieser Stelle erstmal genügt, aber vielleicht hat da ja jemand einen Vorschlag.

Anregungen und Fragen jederzeit gern.

VG Fossi
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

juschi
Beiträge: 13
Registriert: 23. Mär 2020 21:49
Answers: 0

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von juschi »

@udo1toni Vielen Dank für die ausführliche Antwort!
Deine Beschreibungen machen mir einiges viel verständlicher. Ich muss tatsächlich sagen, dass ich mich noch nicht so lange mit openhab beschäftigt haben und es mit meinem Kenntnisstand zum Laufen bekommen habe.

Ich habe größtenteils die sendCommand Befehle benutzt um es im GUI darzustellen und die Werte "sichtbar" zu haben. Generell lasse ich das System wöchentlich neu starten, mit der Hoffnung auf bessere perfomance ... habe aber auch schon gelesen, dass viele das System immer dauerhaft laufen haben. Worauf ich eigentlich hinaus wollte, die Variablen innerhalb der Regel werden ja zurückgesetzt und ich lasse den Status der items im persistence speichern.

Vielen Dank für die ausführliche Beschreibung der Verbesserungen. Diese werde ich auf jeden Fall in den nächsten Programmierungen verwenden!

Benutzeravatar
Romel
Beiträge: 42
Registriert: 21. Mai 2020 15:32
Answers: 0

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von Romel »

Hallo Leute !

Bin Neuling hier.

Ich beschäftige mich seit kurzen mit OH2.5 und habe die Bewässerung von Cyrelian übernommen (versucht).
Meine Bewässerung besteht aus 13 ! Ventile die einzeln angesteuert werden. (geringer Wasserdruck)
Habe den Code versucht auf meine Bedürfnisse um zu schreiben. Aber anscheinend etwas übersehen.
In meiner Log Datei stehen keine Fehler aber die Bewässerung wird nicht durchgeführt.
beregnung.rules
events.txt
Vielen Dank für eure Hilfe.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 14147
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von udo1toni »

In opnehab.log könnten im Zweifel die interessanteren Informationen stehen, z.B. ob das Laden der *.rules Datei überhaupt erfolgreich war.

Bis jetzt ist mir schon mal aufgefallen, dass beim return das ; fehlt. der Befehl lautet return; Das hängt damit zusammen, dass return gewöhnlich einen Parameter mit auf den Weg bekommt, nämlich den Rückgabewert.

Ein paar andere Stellen sind zumindest fragwürdig. Bei der Regel, welche für die Übernahme der Zeit zuständig ist (Set Program A Startime) werden Stunde und Minute auf 0 gesetzt, wenn die Obergrenze überschritten wird. Einerseits kann man damit einfach nach oben "scrollen" (nach unten aber nicht...), andererseits ist die Methode .sendCommand() (genau wie .postUpdate() und auch die entsprechenden Actions) asynchron, das bedeutet, dass die Rule einfach die weiteren Befehle abarbeitet, egal, ob ob der Status nun schon geändert wurde oder nicht. Das heißt, dass eventuell z.B. in der Minute eine 60 steht statt einer 0 (oder in der Stunde eine 24 statt einer 0) wenn die Zeit in die Variable kopiert wird, wodurch dann startTime falsch ist.
Auch wenn das mit einem Klick wieder gerichtet ist, ist es doch mindestens lästig, zumal es eben nur manchmal auftreten wird. Sauberer ist es, ein Setpoint Item mit minValue und maxValue zu nutzen (0 - 23 bzw. 0-59).

Ansonsten kann man an der vorliegenden Rule sehr gut erkennen, dass der Weg so nicht besonders gut sein kann.

Du hast 13 Kreise. Meine Frage dazu: Wenn die Beregnung startet, werden alle Kreise verwendet, oder sollen Kreise wahlweise außen vor gelassen werden? Es wäre an dieser Stelle im Zweifel sinnvoller, die Umschaltung der Kreise einer Statemachine zu überlassen. Selbst wenn bestimme Regnerkreise länger und andere Regnerkreise kürzer gegenüber anderen Kreisen laufen sollen, ist das keine große Sache.

Allerdings, bei 13 Kreisen wäre die Frage, ob Du nicht lieber einen Raspberry mit openSprinkler aufsetzt und die Steuerung dorthin auslagerst, das ist auf Bewässerung spezialisiert und sehr mächtig.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Benutzeravatar
Romel
Beiträge: 42
Registriert: 21. Mai 2020 15:32
Answers: 0

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von Romel »

Guten Morgen !

Danke für die schnelle Antwort.
Bis jetzt ist mir schon mal aufgefallen, dass beim return das ; fehlt. der Befehl lautet return; Das hängt damit zusammen, dass return gewöhnlich einen Parameter mit auf den Weg bekommt, nämlich den Rückgabewert.
ok.
Ein paar andere Stellen sind zumindest fragwürdig. Bei der Regel, welche für die Übernahme der Zeit zuständig ist (Set Program A Startime) werden Stunde und Minute auf 0 gesetzt, wenn die Obergrenze überschritten wird. Einerseits kann man damit einfach nach oben "scrollen" (nach unten aber nicht...), andererseits ist die Methode .sendCommand() (genau wie .postUpdate() und auch die entsprechenden Actions) asynchron, das bedeutet, dass die Rule einfach die weiteren Befehle abarbeitet, egal, ob ob der Status nun schon geändert wurde oder nicht. Das heißt, dass eventuell z.B. in der Minute eine 60 steht statt einer 0 (oder in der Stunde eine 24 statt einer 0) wenn die Zeit in die Variable kopiert wird, wodurch dann startTime falsch ist.
Auch wenn das mit einem Klick wieder gerichtet ist, ist es doch mindestens lästig, zumal es eben nur manchmal auftreten wird. Sauberer ist es, ein Setpoint Item mit minValue und maxValue zu nutzen (0 - 23 bzw. 0-59).
Das Gefühl habe ich auch.
Ansonsten kann man an der vorliegenden Rule sehr gut erkennen, dass der Weg so nicht besonders gut sein kann.
Das hat sich der kleine Roman auch anders vorgestellt. :D
Du hast 13 Kreise. Meine Frage dazu: Wenn die Beregnung startet, werden alle Kreise verwendet, oder sollen Kreise wahlweise außen vor gelassen werden? Es wäre an dieser Stelle im Zweifel sinnvoller, die Umschaltung der Kreise einer Statemachine zu überlassen. Selbst wenn bestimme Regnerkreise länger und andere Regnerkreise kürzer gegenüber anderen Kreisen laufen sollen, ist das keine große Sache.
Bin für alles offen. ;)

Aus Sicht eines Könners wird das Problem relativ einfach zu lösen sein. Aber meine Wissen ist zu minder.
Ich lebe nur von Versuche und das ist mühsam und Fehler sind da schnell gemacht.
Hier noch das "openhab.log"
openhab.txt
Vielen Dank
Roman
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
Romel
Beiträge: 42
Registriert: 21. Mai 2020 15:32
Answers: 0

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von Romel »

Hallo

@ udo1toni : Würde dir gerne eine PN schicken. Geht aber nicht. ;)

Grüße
Roman

Benutzeravatar
udo1toni
Beiträge: 14147
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von udo1toni »

Romel hat geschrieben: 29. Mai 2020 08:07 Hallo

@ udo1toni : Würde dir gerne eine PN schicken. Geht aber nicht. ;)

Grüße
Roman
Sowas aber auch... Ich weiß nicht, wie hoch die Grenze genau gesetzt ist, aber im Zweifel bist Du noch nicht lang genug im Forum registriert :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Gesperrt