Beregnungs Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Cyrelian
Beiträge: 601
Answers: 4
Registriert: 24. Sep 2015 17:55

Beregnungs Rule

Beitrag von Cyrelian »

Hallo zusammen,

hab Seppy´s Rule mal abgewandelt....kann es aber noch nicht testen. Würde der mittlere Teil mit dem Timer so funktionieren :?:

Code: Alles auswählen

val String filename = "irrigation.rules"
var Timer ABIrrigationTimer = null
var Number Duration = 15

/* -------------  Gartenbewässerung --------------------
*/
rule "Irrigation"
when
  Item ABBeregnung changed
then
  //Prüfen ob der Automower in der Ladestation ist
  if (Automower_StatusCode.state = 1056){
    //Beregnung wird aktiviert
    if (ABBeregnung.state == ON){
      logInfo(filename,"Beregnung", "Beregnung wird aktiviert")
      ABBeregnungMGV1.sendCommand(ON)
      //Timer für automatische Abschaltung
      if (ABIrrigationTimer === null) {
        ABIrrigationTimer = createTimer(now.plusMinutes(Duration)) [|
            	ABBeregnungMGV1.sendCommand(OFF)
                ABBeregnungMGV2.sendCommand(ON)
                ABIrrigationTimer.reschedule(now.plusMinutes(Duration))
            	ABBeregnungMGV2.sendCommand(OFF)
                ABBeregnungMGV3.sendCommand(ON)
                ABIrrigationTimer.reschedule(now.plusMinutes(Duration))                
            	ABBeregnungMGV3.sendCommand(OFF)
                ABIrrigationTimer = null
            	logInfo(filename,"Beregnung", "Beregnung wird deaktiviert")
          	]
      	}
    } else if (ABBeregnung.state == OFF){
      	gABBeregnung.allMembers.filter(x | x.state == ON).forEach[item |
		item.sendCommand(OFF)
        logInfo(filename,"Beregnung", "Beregnung wird deaktiviert")
    } else {
      ABIrrigationTimer = null
    }
  } else {
    logInfo(filename,"Beregnung", "Automower fährt noch!")
  }
end
CYA
Cyrelian

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

Re: Beregnungs Rule

Beitrag von udo1toni »

Möchtest Du mehrere Bereiche nacheinander beregnen? Das geht so nicht. Der gesamte Code innerhalb des Timers wird komplett ausgeführt. Möglich ist aber so etwas:

Code: Alles auswählen

val String filename = "irrigation.rules"                        // Loggername
val iRegnerMax = 3                                              // Anzahl Regner
var Number nRegner = 0                                          // Aktueller Regner

var Timer ABIrrigationTimer = null                              // Regnertimer
var Number Duration = 15                                        // Dauer

rule "Irrigation"
when
    Item ABBeregnung changed
then
    if (Automower_StatusCode.state != 1056) {                   //Prüfen ob der Automower in der Ladestation ist
        logInfo(filename,"Beregnung: Automower fährt noch!")
        return
    }

    if (ABBeregnung.state == OFF && gABBeregnung.allMembers.filter(x | x.state == ON).size > 0) {
        logInfo(filename,"Beregnung: Beregnung wird deaktiviert")
        gABBeregnung.allMembers.filter(x | x.state != OFF).forEach[ item |
            item.sendCommand(OFF) 
        ]
        ABIrrigationTimer.cancel
        ABIrrigationTimer = null
    }

    else if (ABBeregnung.state == ON){                          //Beregnung wird aktiviert
        logInfo(filename,"Beregnung: Beregnung wird aktiviert")
        if (ABIrrigationTimer !== null) 
            ABIrrigationTimer.cancel
        nRegner = 0
        ABIrrigationTimer = createTimer(now.plusSeconds(1), [ |
            if (nRegner > 0 && nRegner <= iRegnerMax) {
                sendCommand("ABBeregnungMGV" + nRegner.toString,OFF)
                logInfo(filename,"Beregnung: Regner MGV{} wird deaktiviert",nRegner) 
            }
            nRegner = nRegner + 1
            if (nRegner <= iRegnerMax) {
                sendCommand("ABBeregnungMGV" + nRegner.toString,ON)
                logInfo(filename,"Beregnung: Regner MGV{} wird aktiviert",nRegner)
                ABIrrigationTimer.reschedule(now.plusMinutes(Duration))
            }
            if (nRegner > iRegnerMax)
                ABIrrigationTimer = null
        ])
    }
end
Weil es vielleicht nicht so ganz selbsterklärend ist...:
  • Zuerst wird geprüft, ob der Automower läuft, ist das der Fall, wird die Rule mit entsprechendem Log abgebrochen.
  • Danach wird geprüft, ob die Beregnung ausgeschaltet wurde, aber noch Regner an sind. Ist das der Fall, werden alle eingeschalteten Regner abgeschaltet und der Timer gestoppt und reinitialisiert.
Als letztes bleibt eigentlich nur übrig, dass die Beregnung aktiviert wurde (im Grunde könnte man also die Bedingung weg lassen...)
Jetzt kommt also der interessante Teil:
  • erster Schritt ist, zu prüfen, ob etwa noch ein aktiver Timer vorhanden ist und diesen notfalls zu deaktivieren (ich hab mir jetzt gespart, die Regner alle abzuschalten, eigentlich müsste man das auch noch tun.)
  • Die Variable nRegner wird initialisiert.
  • Als nächstes wird der Timer gestartet, mit einer sehr kurzen Dauer. Vielleicht könnte man sogar now() als Startzeit setzen, das hab ich aber noch nie probiert.
  • Im Timer wird nun in Abhängigkeit der Variablen nRegner ein Regner gestoppt und der nächste Regner gestartet, mitsamt Log :)
  • Solange der letzte Regner noch nicht gestoppt wurde (nRegner <= iRegnerMax) wird der Timer erneut gestartet.
  • Im letzten Durchlauf wird der letzte Regner gestoppt. Nun überschreitet nRegner aber iRegnerMax, der Timer wird nicht erneut gestartet, die Timervariable wird reinitialisiert und die Beregnung ist beendet.
Man könnte auch noch den Switch ABBeregnung zurücksetzen...

Beachte bitte auch die Schreibweise des log-Befehls, es sind genau zwei Strings als Parameter angegeben, der erste String ist der Loggername, der zweite String ist die zu loggende Meldung. Wenn man möchte, kann man aber diesen zweiten String vorher zusammensetzen lassen, dabei wird die {} mit dem angegebenen Wert ersetzt, openHAB achtet dabei auch auf das passende Format. Es können mehrere Ersetzungen verwendet werden, die Variablen werden der Reihenfolge nach verwendet.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
Cyrelian
Beiträge: 601
Answers: 4
Registriert: 24. Sep 2015 17:55

Re: Beregnungs Rule

Beitrag von Cyrelian »

Hi,

dachte ich mir fast, dass das nicht so einfach wie ich mir das gedacht habe. Ja, ich möchte drei Bereiche nacheinander beregnen.
Was mir noch unklar ist:

In den Teil startet er den ABIrrigationTimer.reschedule(now.plusMinutes(Duration)) mit 15min. Danach fängt er wieder mit "if (nRegner > 0 && nRegner <= iRegnerMax)" an oder?

Code: Alles auswählen

        ABIrrigationTimer = createTimer(now.plusSeconds(1), [ |
            if (nRegner > 0 && nRegner <= iRegnerMax) {
                sendCommand("ABBeregnungMGV" + nRegner.toString,OFF)
                logInfo(filename,"Beregnung: Regner MGV{} wird deaktiviert",nRegner) 
            }
            nRegner = nRegner + 1
            if (nRegner <= iRegnerMax) {
                sendCommand("ABBeregnungMGV" + nRegner.toString,ON)
                logInfo(filename,"Beregnung: Regner MGV{} wird aktiviert",nRegner)
                ABIrrigationTimer.reschedule(now.plusMinutes(Duration))
            }
            if (nRegner > iRegnerMax)
                ABIrrigationTimer = null
        ])
THX
Cyrelian

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

Re: Beregnungs Rule

Beitrag von udo1toni »

Der Timer legt das Lambda (das ist der Teil zwischen [ und ] ) im Speicher ab, als eine Art Script. Wenn der Timer abgelaufen ist, wird dieses Script zur Ausführung gebracht. Wenn das Script vollständig abgearbeitet wurde, wird das Script aus dem Speicher entfernt, es sei denn, das Script wird erneut geplant (mit reschedule). Dann wird der Code im Speichergehalten und der Timer erneut geplant.

nRegner ist eine Variable, die global definiert ist. Sie behält also ihren Wert unabhängig vom Abarbeitungsstatus bei. Innerhalb des Timercodes wird diese Variable hochgezählt, mit jedem Durchlauf um 1. Deshalb kann diese Variable als Abbruchkriterium verwendet werden.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
seppy
Beiträge: 738
Answers: 4
Registriert: 24. Sep 2015 20:25
Wohnort: Bonn

Re: Beregnungs Rule

Beitrag von seppy »

Hallo Zusammen,

hier mal meine komplette Rule Sammlung zu dem Thema. Als Anregung ...

Rules:

Code: Alles auswählen

import org.joda.time.DateTime

// Variablen für Rule "AutomaticIrrigation"
var int duration
var int interval
var SwitchItem mgv
var SwitchItem state
var DateTimeItem lastrun
var DateTimeItem nextrun
var Timer IrrigationTimer

/**
 * Vollautomatische Gartenbewässerung
 * 
 * ACHTUNG: Magnetventile werden über separate Regel geschaltet!
 */
rule "AutomaticIrrigation"
when
	Time cron  "0 0/15 8-21 * * ?" or
	Item sysStarted changed to ON
then
	if (GlobalAutoIrrigation.state == ON){
		logDebug("Homebox.GardenRules:AutomaticIrrigation", "Starte automatische Beregnungssteuerung, prüfe auf Jobs")
	 	gAussenBeregnungSegments?.members.forEach[segments |
	 		if (gAussenBeregnungState.state == ON && IrrigationTimer !== null){
				gAussenBeregnungState?.members.forEach[x|
					if (x.state == ON){	
						logInfo("Homebox.GardenRules:AutomaticIrrigation", "Laufende Bewässerung in Segment \"" + transform("MAP","devices.map",x.name) + "\" gefunden")
					}
				]				
			} else {
				logDebug("Homebox.GardenRules:AutomaticIrrigation", "Setze Parameter für " + transform("MAP","devices.map",segments.name) + ":")
				(segments as GroupItem)?.members.forEach[el |
					if (el.name.contains("Duration")){
						duration = Integer::parseInt(el.state.toString)
						logDebug("Homebox.GardenRules:AutomaticIrrigation", "     " + el.name + ": \"" + duration + "\"")
					} else if (el.name.contains("Interval")) {
						interval = Integer::parseInt(el.state.toString)
						logDebug("Homebox.GardenRules:AutomaticIrrigation", "     " + el.name + ": \"" + interval + "\"")
					} else if (el.name.contains("MGV")){	
						mgv = el as SwitchItem
						logDebug("Homebox.GardenRules:AutomaticIrrigation", "     " + el.name + ": \"" + mgv + "\"")
					} else if(el.name.contains("State")){
						state = el as SwitchItem
						logDebug("Homebox.GardenRules:AutomaticIrrigation", "     " + el.name + ": \"" + state + "\"")
					} else if (el.name.contains("LastRun")){
						lastrun = el as DateTimeItem
						logDebug("Homebox.GardenRules:AutomaticIrrigation", "     " + el.name + ": \"" + lastrun + "\"")
					} else if (el.name.contains("NextRun")){
						nextrun = el as DateTimeItem
						logDebug("Homebox.GardenRules:AutomaticIrrigation", "     " + el.name + ": \"" + nextrun + "\"")
					} else{
						logDebug("Homebox.GardenRules:AutomaticIrrigation", "Parameter unbekannt, bitte prüfen")
					}	
				]
				logDebug("Homebox.GardenRules:AutomaticIrrigation", "Prüfe Segement \"" + transform("MAP","devices.map",segments.name) + "\"")
				var Integer hour = now.getHourOfDay
				/**
				 * Keine weitere Prüfung auf Bedingungen wenn
				 * 
				 * Die Bodenfeuchtigkeit ausreichen 
				 */
				if (AussenBodenfeuchtesensor.state == CLOSED){
					logDebug("Homebox.GardenRules:AutomaticIrrigation", "Der Boden ist feucht genug, Beregung nicht notwendig")
				} 
				/**
				 * Das Segment auf Handbetrieb steht
				 */
				else if (interval == -1){
					logDebug("Homebox.GardenRules:AutomaticIrrigation", "Das Segment \"" + transform("MAP","devices.map",segments.name) + "\" steht auf Handbetrieb")
				}
				/**
				 * Der letzte Bewässerungslauf innerhalb des angegebenen Intervalls gelegen hat
				 */
				else if (state.changedSince(now.minusHours(interval)) == true){
					logDebug("Homebox.GardenRules:AutomaticIrrigation", "Segment " + transform("MAP","devices.map",segments.name) + " innherhalb der letzten " + interval.toString + " Stunden gelaufen")
				}
				/**
				 * Zeitfenster zwischen 8:00 - 11.00 oder 17:00 - 21:00 Uhr
				 */
				else if (hour < 8 || (hour > 11 && hour < 17) || hour > 21){
					logDebug("Homebox.GardenRules:AutomaticIrrigation", "Nicht im Beregnungszeitfenster, keine weitere Aktion")
				}
				/** 
				 * Regen letzte 30 Min > 0 = Es regent
				 */
				else if (NetatmoRainCurr.state >= 0.1){
					logInfo("Homebox.GardenRules:AutomaticIrrigation", "Es regnet, keine weitere Aktion")
				} 
				/**
				 * Der Wind zu stark ist
				 */
				else if (NetatmoWindStrength.state >= 5){
					logInfo("Homebox.GardenRules:AutomaticIrrigation", "Es stürmt, keine weitere Aktion")
				} 
				/**
				 * Regen vorhergesagt ist
				 */
				else if (WeatherRainForecast1_MM.state >= 5 || WeatherRainForecast0_MM.state >= 5){
					logInfo("Homebox.GardenRules:AutomaticIrrigation", "Es soll regnen, keine weitere Aktion")
				} 
				/**
				 * Zu wenig Wasser in der Zisterne
				 */
				else if (AussenZisterneFillingLevel.state < 20){
					logInfo("Homebox.GardenRules:AutomaticIrrigation", "Zu wenig Wasser in de Zisterne, keine weitere Aktion")
				} 
				/**
				 * Sonst Beregnungsprogram starten
				 */
				else {
					state.sendCommand(ON)
					logInfo("Homebox.GardenRules:AutomaticIrrigation", "Bewässerung für " + transform("MAP","devices.map",segments.name) + " mit Laufzeit " + duration.toString + " Minuten gestartet")
					pushover("Automatische Bewässerung für " + transform("MAP","devices.map",segments.name) + " mit Laufzeit " + duration.toString + " Minuten gestartet")
					
					/**
					 * Wenn Timer vorhanden, diesen beenden
					 */
					if (IrrigationTimer !== null){
						IrrigationTimer.cancel()
						logInfo("Homebox.GardenRules:AutomaticIrrigation", "Laufenden Timer beendet")
					}
					logInfo("Homebox.GardenRules:AutomaticIrrigation", "Starte neuen Timer")
					IrrigationTimer = createTimer(now.plusMinutes(duration)) [|
						state.sendCommand(OFF)
						lastrun.postUpdate(new DateTimeType())
						logInfo("Homebox.GardenRules:AutomaticIrrigation", "Bewässerung für " + segments.name + " beendet")
						pushover("Automatische Bewässerung für " + transform("MAP","devices.map",segments.name) + " nach Laufzeit " + duration.toString + " Minuten beendet")
						IrrigationTimer = null
					]
				
				}
			}
		]	
	}
end

rule "ControlMGV1"
when
	Item AussenBeregnungSegment1State received command 
then
	if (receivedCommand == ON) {
		if (IrrigationTimer === null){
			logInfo("Homebox.GardenRules:ControlMGV1", "Beregnung für Segement \"Beregnungssegment 1 (Vorgarten)\" manuell aktiviert, starte Timer")
			IrrigationTimer = createTimer(now.plusMinutes(Integer::parseInt(AussenBeregnungSegment1Duration.state.toString))) [|
				AussenBeregnungSegment1State.sendCommand(OFF)
				AussenBeregnungSegment1LastRun.postUpdate(new DateTimeType())
				logInfo("Homebox.GardenRules:ControlMGV1", "Manuelle Bewässerung für Segement \"Beregnungssegment 1 (Vorgarten)\" beendet")
				pushover("Manuelle Bewässerung für Segement \"Beregnungssegment 1 (Vorgarten)\" nach Laufzeit " + AussenBeregnungSegment1Duration.state.toString + " Minuten beendet")
				IrrigationTimer = null
			]
		}
		AussenBeregnungSegment1MGV.sendCommand(ON)
		logInfo("Homebox.GardenRules:ControlMGV1", "Magnetventil \"AussenBeregnungSegment1MGV\" geschaltet [ON]")
	} else {
		AussenBeregnungSegment1MGV.sendCommand(OFF)
		AussenBeregnungSegment1LastRun.postUpdate(new DateTimeType())
		if (IrrigationTimer !== null){
			IrrigationTimer.cancel()
			IrrigationTimer = null
		}
		logInfo("Homebox.GardenRules:ControlMGV1", "Magnetventil \"AussenBeregnungSegment1MGV\" geschaltet [OFF]")
	}
end

rule "ControlMGV2"
when
	Item AussenBeregnungSegment2State received command 
then
	if (receivedCommand == ON) {
		if (IrrigationTimer === null){
			logInfo("Homebox.GardenRules:ControlMGV2", "Beregnung für Segement \"Beregnungssegment 2 (Garten)\" manuell aktiviert, starte Timer")
			IrrigationTimer = createTimer(now.plusMinutes(Integer::parseInt(AussenBeregnungSegment2Duration.state.toString))) [|
				AussenBeregnungSegment2State.sendCommand(OFF)
				AussenBeregnungSegment2LastRun.postUpdate(new DateTimeType())
				logInfo("Homebox.GardenRules:ControlMGV2", "Manuelle Bewässerung für Segement \"Beregnungssegment 2 (Garten)\" beendet")
				pushover("Manuelle Bewässerung für Segement \"Beregnungssegment 2 (Garten)\" nach Laufzeit " + AussenBeregnungSegment2Duration.state.toString + " Minuten beendet")
				IrrigationTimer = null
			]
		}
		AussenBeregnungSegment2MGV.sendCommand(ON)
		logInfo("Homebox.GardenRules:ControlMGV2", "Magnetventil \"AussenBeregnungSegment2MGV\" geschaltet [ON]")
	} else {
		AussenBeregnungSegment2MGV.sendCommand(OFF)
		AussenBeregnungSegment2LastRun.postUpdate(new DateTimeType())
		if (IrrigationTimer !== null){
			IrrigationTimer.cancel()
			IrrigationTimer = null
		}
		logInfo("Homebox.GardenRules:ControlMGV2", "Magnetventil \"AussenBeregnungSegment2MGV\" geschaltet [OFF]")
	}	
end

rule "MGV_Watchdog"
when
	Time cron  "0 0/15 8-21 * * ?"
then
	if (AussenBeregnungSegment1MGV.state == ON && AussenBeregnungSegment1State.state == OFF){
		AussenBeregnungSegment1MGV.sendCommand(OFF)
		logInfo("Homebox.GardenRules:MGV_Watchdog", "MGV1 per Watchdog abgeschaltet")
	} 
	else if (AussenBeregnungSegment2MGV.state == ON && AussenBeregnungSegment2State.state == OFF){
		AussenBeregnungSegment2MGV.sendCommand(OFF)
		logInfo("Homebox.GardenRules:MGV_Watchdog", "MGV2 per Watchdog abgeschaltet")
	}
end

rule "ControlPump"
when
	Item AussenBeregnungSegment1State received command or
	Item AussenBeregnungSegment2State received command
then
	if (receivedCommand == ON){
		AussenGartenBewaesserungPumpeState.sendCommand(ON)
	} else {
		AussenGartenBewaesserungPumpeState.sendCommand(OFF)
	}
end

rule "MonitorIrrigationConditions"
when
	Item NetatmoRain30Min received update or
	Item NetatmoWindStrength received update
then
	var Boolean stop = false
	if (gAussenBeregnungState.state == ON){
		// Regen
		if (NetatmoRainCurr.state >= 0.1){
			logInfo("Homebox.GardenRules:MonitorIrrigationConditions", "Beregnungsbedigungen ungünstig (Regen), wird abgeschaltet ...")
			pushover("Beregnungsbedigungen ungünstig (Regen), wird abgeschaltet ...",1)
			stop = true
		}
		// Wind
		else if (NetatmoWindStrength.state >= 5){
			logInfo("Homebox.GardenRules:MonitorIrrigationConditions", "Beregnungsbedigungen ungünstig (Wind), wird abgeschaltet ...")
			pushover("Beregnungsbedigungen ungünstig (Wind), wird abgeschaltet ...",1)
			stop = true
		}
		
		if (stop == true){
			gAussenBeregnungState?.members.forEach[el |
				if (el.state == ON){
					el.sendCommand(OFF)
					logInfo("Homebox.GardenRules:MonitorIrrigationConditions", "Segment \"" + transform("MAP","devices.map",el.name) + "\" abgeschaltet")
					pushover("Segment \"" + transform("MAP","devices.map",el.name) + "\" abgeschaltet",1)
				}
			]
		}
	}
end

rule "SetNextIrrigationRun"
when
	Item AussenBeregnungSegment1Interval changed or
	Item AussenBeregnungSegment1LastRun changed or
	Item AussenBeregnungSegment2Interval changed or
	Item AussenBeregnungSegment2LastRun changed
	//Time cron "0 0/15 8-22 * 3-10 ?"
then
	gAussenBeregnungSegments?.members.forEach[segments |
		logDebug("Homebox.GardenRules:SetNextIrrigationRun", "Aktualisiere Infos für Segment \"" + transform("MAP","devices.map",segments.name) + "\"")
		(segments as GroupItem)?.members.forEach[el |
			if (el.name.contains("Interval")) {
				interval = Integer::parseInt(el.state.toString)
				logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     " + el.name + ": \"" + interval + "\"")
			} else if (el.name.contains("LastRun")){
				lastrun = el as DateTimeItem
				logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     " + el.name + ": \"" + lastrun + "\"")
			} else if (el.name.contains("NextRun")){
				nextrun = el as DateTimeItem
				logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     " + el.name + ": \"" + nextrun + "\"")
			}	
		]
		
		//Wenn ohne Wert, Default heute setzen 
		if (lastrun.state === null){
			logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     LastRun \"null\" setze default \"now\"")
			lastrun.postUpdate(new DateTimeType())
		}
		
		if (nextrun.state === null){
			logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     NextRun \"null\" setze default \"now\"")
			nextrun.postUpdate(new DateTimeType())
		}  
		
		//Nächsten Lauf nur berechnen, wenn nicht auf Handbetrieb
		if (interval > 0){
			logDebug("Homebox.GardenRules:SetNextIrrigationRun","     --> Intervallbetrieb")
			val DateTime next = new DateTime((nextrun.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
			
			logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     next.getDayOfMonth:" + next.getDayOfMonth)
			logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     now.getDayOfMonth:" + now.getDayOfMonth)
			
			/**
			 * Wenn ein Lauf ausgelassen, oder nach Neustart, aktualisiere Daten
			 */
			if (next.getDayOfMonth < now.getDayOfMonth || (next.getDayOfMonth == now.getDayOfMonth && next.getHourOfDay <= now.getHourOfDay)){
				logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     Lauf ausgelassen aktualisiere NextRun")
				var DateTime last = now
				//var DateTime next = new DateTime(last.plusHours(Integer::parseInt(AussenBeregnungSegment2Interval.state.toString)).calendar.timeInMillis)
				var String nYear = last.plusHours(interval).getYear.toString
				var String nMonth = last.plusHours(interval).getMonthOfYear.toString
				var String nDay = last.plusHours(interval).getDayOfMonth.toString
				var String nHour = last.plusHours(interval).getHourOfDay.toString
				var String nMinute = last.plusHours(interval).getMinuteOfHour.toString
				if (Integer::parseInt(nHour) < 8) {
					nMinute = "0"
					nHour = "8"
				} else if (Integer::parseInt(nHour) > 11 && Integer::parseInt(nHour) < 17) {
					nMinute = "0"
					nHour = "17"
				} else if (Integer::parseInt(nHour) > 21) {
					var Integer tmp = Integer::parseInt(nDay) + 1
					nMinute = "0"
					nHour = "8"
					nDay = tmp.toString
				} 
				var String nextStr =  nYear + "-" + nMonth + "-" + nDay + "T" + nHour + ":" + nMinute + ":00"
				logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     nextStr: " + nextStr)
				nextrun.postUpdate(new DateTimeType(nextStr))
			} else {
				var DateTime last = new DateTime((lastrun.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
				//var DateTime next = new DateTime(last.plusHours(Integer::parseInt(AussenBeregnungSegment2Interval.state.toString)).calendar.timeInMillis)
				var String nYear = last.plusHours(interval).getYear.toString
				var String nMonth = last.plusHours(interval).getMonthOfYear.toString
				var String nDay = last.plusHours(interval).getDayOfMonth.toString
				var String nHour = last.plusHours(interval).getHourOfDay.toString
				var String nMinute = last.plusHours(interval).getMinuteOfHour.toString
				if (Integer::parseInt(nHour) < 8) {
					nMinute = "0"
					nHour = "8"
				} else if (Integer::parseInt(nHour) > 21) {
					var Integer tmp = Integer::parseInt(nDay) + 1
					nMinute = "0"
					nHour = "8"
					nDay = tmp.toString
				}
				var String nextStr =  nYear + "-" + nMonth + "-" + nDay + "T" + nHour + ":" + nMinute + ":00"
				nextrun.postUpdate(new DateTimeType(nextStr))
			}
			logDebug("Homebox.GardenRules:SetNextIrrigationRun", "     Neuer Plantermin " + nextrun.state.toString)
		} else {
			logDebug("Homebox.GardenRules:SetNextIrrigationRun","     --> Handbetrieb")
		}
	]
end
Sitemap:

Code: Alles auswählen

Text label="Beregnung" icon="watering" visibility=[GlobalAutoIrrigation==ON] {
			Text item=AussenBodenfeuchtesensor valuecolor=[CLOSED="green",OPEN="red"]
			Text item=AussenBodenfeuchtesensorLastUpdate
			Text label="Beregnungssteuerung" icon="watering_config" {
				Frame label="Beregnungssegment 1 (Vorgarten)" {
					Text item=AussenBeregnungSegment1LastRun
					Text item=AussenBeregnungSegment1NextRun visibility=[AussenBeregnungSegment1Interval>0]
					Switch item=AussenBeregnungSegment1State
					Selection item=AussenBeregnungSegment1Duration mappings=[1="1 Min.", 2="2 Min.", 3="3 Min.", 4="4 Min.", 5="5 Min.", 6="6 Min.", 7="7 Min.", 8="8 Min.", 9="9 Min.", 10="10 Min.", 11="11 Min.", 12="12 Min.", 13="13 Min.", 14="14 Min.", 15="15 Min.", 20="20 Min."]
					Selection item=AussenBeregnungSegment1Interval mappings=["-1"="Manuell",1="1 Std.", 2="2 Std.", 3="3 Std.", 4="4 Std.", 5="5 Std.", 10="10 Std.", 11="11 Std.", 12="12 Std.", 13="13 Std.", 14="14 Std.", 15="15 Std.", 16="16 Std.", 17="17 Std.", 18="18 Std.", 19="19 Std.", 20="20 Std.", 21="21 Std.", 22="22 Std.", 23="23 Std.", 24="24 Std.", 36="36 Std.", 48="48 Std."]
					Switch item=AussenBeregnungSegment1MGV
				}
				Frame label="Beregnungssegment 2 (Garten 1)" {
					Text item=AussenBeregnungSegment2LastRun
					Text item=AussenBeregnungSegment2NextRun visibility=[AussenBeregnungSegment2Interval>0]
					Switch item=AussenBeregnungSegment2State
					Selection item=AussenBeregnungSegment2Duration mappings=[1="1 Min.", 2="2 Min.", 3="3 Min.", 4="4 Min.", 5="5 Min.", 6="6 Min.", 7="7 Min.", 8="8 Min.", 9="9 Min.", 10="10 Min.", 11="11 Min.", 12="12 Min.", 13="13 Min.", 14="14 Min.", 15="15 Min.", 20="20 Min."]
					Selection item=AussenBeregnungSegment2Interval mappings=["-1"="Manuell",1="1 Std.", 2="2 Std.", 3="3 Std.", 4="4 Std.", 5="5 Std.", 10="10 Std.", 11="11 Std.", 12="12 Std.", 13="13 Std.", 14="14 Std.", 15="15 Std.", 16="16 Std.", 17="17 Std.", 18="18 Std.", 19="19 Std.", 20="20 Std.", 21="21 Std.", 22="22 Std.", 23="23 Std.", 24="24 Std.", 36="36 Std.", 48="48 Std."]
					Switch item=AussenBeregnungSegment2MGV
				}
			}
			Text item=AussenZisterneFillingLiter icon="cistern"
			Switch item=AussenZisterneFillingLevelChartPeriod icon="cistern-graph" label="Verlauf Füllstand" mappings=[0="Tag", 1="Woche", 2="Monat", 3="4-Monate", 4="Jahr"]
			Image url="http://localhost/rrdchart.png?items=AussenZisterneFillingLevel&period=D&w=1024" refresh=6000 visibility=[AussenZisterneFillingLevelChartPeriod==0, AussenZisterneFillingLevelChartPeriod=="Uninitialized"]
			Image url="http://localhost/rrdchart.png?items=AussenZisterneFillingLevel&period=W&w=1024" refresh=300000 visibility=[AussenZisterneFillingLevelChartPeriod==1]
			Image url="http://localhost/rrdchart.png?items=AussenZisterneFillingLevel&period=M&w=1024" refresh=300000 visibility=[AussenZisterneFillingLevelChartPeriod==2]
			Image url="http://localhost/rrdchart.png?items=AussenZisterneFillingLevel&period=4M&w=1024" refresh=300000 visibility=[AussenZisterneFillingLevelChartPeriod==3]
			Image url="http://localhost/rrdchart.png?items=AussenZisterneFillingLevel&period=Y&w=1024" refresh=300000 visibility=[AussenZisterneFillingLevelChartPeriod==4]
			Switch item=AussenZisterneRefill icon="tap" label="Zisternen Nachfüllung aktivieren (10 Min.)" visibility=[AussenZisterneFillingLevel<20]
		}
Viel Spaß :D
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Benutzeravatar
Cyrelian
Beiträge: 601
Answers: 4
Registriert: 24. Sep 2015 17:55

Re: Beregnungs Rule

Beitrag von Cyrelian »

...mein Sohn würde jetzt sagen......KRASS ALTER :o

Benutzeravatar
Cyrelian
Beiträge: 601
Answers: 4
Registriert: 24. Sep 2015 17:55

Re: Beregnungs Rule

Beitrag von Cyrelian »

Hi udo1toni,

hab deine rule gerade mal implementiert. Leider bekomme ich folgenden Fehler, weiß aber nicht wirklich woran es liegt. Timer schein ok zu ein aber der nRegner gefällt ihm scheinbar nicht.

Code: Alles auswählen

2018-06-10 11:58:03.529 [INFO ] [rthome.model.script.irrigation.rules] - Beregnung: Beregnung wird aktiviert

2018-06-10 11:58:04.562 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.2018-06-10T11:58:04.541+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@8a382a

  <null>.nRegner = <XBinaryOperationImplCustom>

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@857bf8

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1a9d6d7

} ] threw an unhandled Exception: 

java.lang.IllegalStateException: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(java.lang.String,java.lang.String) on instance: null

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1102) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:864) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:223) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at com.sun.proxy.$Proxy140.apply(Unknown Source) [?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]

Caused by: java.lang.IllegalArgumentException: argument type mismatch

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) ~[?:?]

	... 28 more

2018-06-10 11:58:04.579 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.2018-06-10T11:58:04.541+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@8a382a

  <null>.nRegner = <XBinaryOperationImplCustom>

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@857bf8

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1a9d6d7

} ] threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.

	at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]

Caused by: java.lang.IllegalStateException: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(java.lang.String,java.lang.String) on instance: null

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1102) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:864) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:223) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy140.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

	... 1 more

Caused by: java.lang.IllegalArgumentException: argument type mismatch

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:864) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:223) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy140.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

	... 1 more
CU
Cyrelian

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

Re: Beregnungs Rule

Beitrag von udo1toni »

Der Interessante Teil der Fehlermeldung ist hier

Code: Alles auswählen

Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(java.lang.String,java.lang.String) on instance: null
Was soviel heißt, dass sendCommand(String,String) nicht ausgeführt werden konnte, weil einer der beiden Strings null war (also nicht initialisiert)

Um herauszufinden, wo der Fehler liegt, solltest Du also vor jedem sendCommand in der Rule ein logInfo einbauen, in dem Du exakt das ausgibst, was Du dem sendCommand hin wirfst. Das sähe dann so aus:

Code: Alles auswählen

if (nRegner > 0 && nRegner <= iRegnerMax) {
                logInfo(filename,"Beregnung: Regner MGV{} wird deaktiviert",nRegner) 
                logInfo(filename,"ABBeregnungMGV{} ist der Name",nRegner) 
                sendCommand("ABBeregnungMGV" + nRegner.toString,OFF)
            }
            nRegner = nRegner + 1
            if (nRegner <= iRegnerMax) {
                logInfo(filename,"Beregnung: Regner MGV{} wird aktiviert",nRegner)
                logInfo(filename,"ABBeregnungMGV{} ist der Name",nRegner) 
                sendCommand("ABBeregnungMGV" + nRegner.toString,ON)
                ABIrrigationTimer.reschedule(now.plusMinutes(Duration))
            }
            if (nRegner > iRegnerMax)
                ABIrrigationTimer = null
Falls nun der Fehler auftritt, muss unmittelbar davor Dein logInfo stehen, in welchem Du nachschauen kannst, wie der Name des Items ist, welches openHAB nach der Rule anzusteuern versucht. Eventuell ist irgendwo ein klitzekleiner Tippfehler drin, oder irgendwas mit dem Zähler geht schief, das wird das die Fehlermeldung zeigen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
Cyrelian
Beiträge: 601
Answers: 4
Registriert: 24. Sep 2015 17:55

Re: Beregnungs Rule

Beitrag von Cyrelian »

Hi,

ok, erst steigt also schon direkt beim ersten aus.

Code: Alles auswählen

2018-06-10 19:44:57.622 [INFO ] [rthome.model.script.irrigation.rules] - Beregnung: Beregnung wird aktiviert

2018-06-10 19:44:58.640 [INFO ] [rthome.model.script.irrigation.rules] - Beregnung: Regner MGV1 wird aktiviert

2018-06-10 19:44:58.647 [INFO ] [rthome.model.script.irrigation.rules] - ABBeregnungMGV1 ist der Name

2018-06-10 19:44:58.657 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.2018-06-10T19:44:58.627+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@167e40

  <null>.nRegner = <XBinaryOperationImplCustom>

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1672789

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@18191b0

} ] threw an unhandled Exception: 

java.lang.IllegalStateException: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(java.lang.String,java.lang.String) on instance: null

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1102) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:864) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:223) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at com.sun.proxy.$Proxy140.apply(Unknown Source) [?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]

Caused by: java.lang.IllegalArgumentException: argument type mismatch

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) ~[?:?]

	... 28 more

2018-06-10 19:44:58.682 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.2018-06-10T19:44:58.627+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@167e40

  <null>.nRegner = <XBinaryOperationImplCustom>

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1672789

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@18191b0

} ] threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.

	at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]

Caused by: java.lang.IllegalStateException: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(java.lang.String,java.lang.String) on instance: null

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1102) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:864) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:223) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy140.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

	... 1 more

Caused by: java.lang.IllegalArgumentException: argument type mismatch

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:864) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:223) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy140.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

	... 1 more
dieser sendCommand läuft durch:
ABBeregnungMGV1.sendCommand(ON)

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

Re: Beregnungs Rule

Beitrag von udo1toni »

Und im sendCommand hat sich kein Tippfehler eingeschlichen (also z.B. dass ein B fehlt)?

Um ganz sicher zu gehen, können wir die Namensbildung ja in eine Variable auslagern:

Code: Alles auswählen

// schon innerhalb des Timer-Codeblocks:
var String Rname = ""
if (nRegner > 0 && nRegner <= iRegnerMax) {
                Rname = "ABBeregnungMGV" + nRegner.toString
                logInfo(filename,"Beregnung: Regner {} wird deaktiviert",Rname) 
                sendCommand(Rname,OFF)
            }
            nRegner = nRegner + 1
            if (nRegner <= iRegnerMax) {
                Rname = "ABBeregnungMGV" + nRegner.toString
                logInfo(filename,"Beregnung: Regner {} wird aktiviert",Rname)
                sendCommand(Rname,ON)
                ABIrrigationTimer.reschedule(now.plusMinutes(Duration))
            }
            if (nRegner > iRegnerMax)
                ABIrrigationTimer = null
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten