Pumpenmonitoring - Triggering Item unzuverlässig

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von int5749 »

Hallo zusammen,

seit einigen Wochen zeigt unser Pumpenmonitoring ein seltsames Verhalten :? Nach einem Neustart von openHAB scheint es zunächst zu laufen, und dann fängt irgendwann der Hokus-Pokus an: Und zwar läuft die Entwässerungspumpe an, es erscheint aber keine Meldung zur Abschaltung. Beim nächsten Start der Pumpe scheint es dann, das erst die Meldung zur Abschaltung (dann natürlich mit einer viel zu langen Laufzeit) und bei der Abschaltung die Meldung die eigentlich beim einschalten erfolgen sollte. Ich suche schon wie Bolle seit einigen Tagen aber scheine derzeit betriebsblind zu sein und hoffe ihr seht dort etwas.

Wie in den Rules zu sehen, logge ich bereits einiges, was mir leider auch noch nicht geholfen hat hinter das Problem zu kommen.
Dort sieht man auch, das es manchmal läuft, manchmal (mittlerweile schon fast meistens) dann aber auch nicht.
Dies war bereits vor dem Update auf 3.2.0 der Fall, aber nicht so häufig. Damals vermutete ich einen Zusammenhang mit dem laufen einer anderen Pumpe, obwohl ich schon unterschiedliche Timer nutze.

Logeinsträge

Code: Alles auswählen

10.01.2022 05:28	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe ist angelaufen.
10.01.2022 05:28 	INFO 	org.openhab.core.model.script.Water 	 - Note: Entwässerungspumpe lief 1998 Sekunden
10.01.2022 05:28	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.72 mA.
10.01.2022 05:28	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.620000000000001 mA.
10.01.2022 05:29	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe hat abgeschaltet.
10.01.2022 05:29	INFO 	org.openhab.core.model.script.Water 	-1641788942
10.01.2022 05:29	INFO 	org.openhab.core.model.script.Water 	 - Note: Alarmtimer für Entwässerungspumpe gestartet


10.01.2022 06:39	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe ist angelaufen.
10.01.2022 06:39	INFO 	org.openhab.core.model.script.Water 	-1641793173
10.01.2022 06:39	INFO 	org.openhab.core.model.script.Water 	 - Note: Alarmtimer für Entwässerungspumpe gestartet
10.01.2022 06:39	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 13.07 mA.
10.01.2022 06:39	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.700000000000001 mA.
10.01.2022 06:39	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.43 mA.
10.01.2022 06:39	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe hat abgeschaltet.
10.01.2022 06:39	INFO 	org.openhab.core.model.script.Water 	 - Note: Entwässerungspumpe lief 13 Sekunden

10.01.2022 06:57	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe ist angelaufen.
10.01.2022 06:57	INFO 	org.openhab.core.model.script.Water 	-1641794264
10.01.2022 06:57	INFO 	org.openhab.core.model.script.Water 	 - Note: Alarmtimer für Entwässerungspumpe gestartet
10.01.2022 06:57	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.88 mA.
10.01.2022 06:57	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.56 mA.
10.01.2022 06:57	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe hat abgeschaltet.
10.01.2022 06:57	INFO 	org.openhab.core.model.script.Water 	 - Note: Entwässerungspumpe lief 13 Sekunden

10.01.2022 07:16	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe ist angelaufen.
10.01.2022 07:16	INFO 	org.openhab.core.model.script.Water 	 - Note: Entwässerungspumpe lief 1099 Sekunden
10.01.2022 07:16	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.8 mA.
10.01.2022 07:16	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.64 mA.
10.01.2022 07:16	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 2.49 mA.
10.01.2022 07:16	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe hat abgeschaltet.
10.01.2022 07:16	INFO 	org.openhab.core.model.script.Water 	-1641795378
10.01.2022 07:16	INFO 	org.openhab.core.model.script.Water 	 - Note: Alarmtimer für Entwässerungspumpe gestartet

10.01.2022 07:34	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe ist angelaufen.
10.01.2022 07:34	INFO 	org.openhab.core.model.script.Water 	-1641796474
10.01.2022 07:34	INFO 	org.openhab.core.model.script.Water 	 - Note: Alarmtimer für Entwässerungspumpe gestartet
10.01.2022 07:34	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 13.34 mA.
10.01.2022 07:34	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 13.05 mA.
10.01.2022 07:34	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.64 mA.
10.01.2022 07:34	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.59 mA.
10.01.2022 07:34	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe hat abgeschaltet.

10.01.2022 07:53 	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe ist angelaufen.
10.01.2022 07:53	INFO 	org.openhab.core.model.script.Water 	 - Note: Entwässerungspumpe lief 1136 Sekunden
10.01.2022 07:53	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 13.13 mA.
10.01.2022 07:53	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.700000000000001 mA.
10.01.2022 07:53	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.59 mA.
10.01.2022 07:53	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe hat abgeschaltet.
10.01.2022 07:53	INFO 	org.openhab.core.model.script.Water 	-1641797623
10.01.2022 07:53	INFO 	org.openhab.core.model.script.Water 	 - Note: Alarmtimer für Entwässerungspumpe gestartet

10.01.2022 08:12	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe ist angelaufen.
10.01.2022 08:12	INFO 	org.openhab.core.model.script.Water 	-1641798754
10.01.2022 08:12	INFO 	org.openhab.core.model.script.Water 	 - Note: Alarmtimer für Entwässerungspumpe gestartet
10.01.2022 08:12	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 13.07 mA.
10.01.2022 08:12	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.72 mA.
10.01.2022 08:12	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 12.620000000000001 mA.
10.01.2022 08:12	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe zieht derzeit 2.19 mA.
10.01.2022 08:12	INFO 	org.openhab.core.model.script.Water 	 - Entwässerungspumpe hat abgeschaltet.
Auch wenn nur ein Teil der Rule betroffen zu sein scheint (für die Enwässerungspumpe) poste ich einmal die komplette Rule

Items

Code: Alles auswählen

Group:Number:SUM	gPump			"Pumpen"
Group			gPumpOn

	// virtuelle Schalter
Switch PumpFeedingWater_vSwitch		"Hauswasserwerk"				(gPumpOn)
Switch PumpWasteWater_vSwitch		"Schmutzwasserpumpe"			(gPumpOn)
Switch PumpDrainage_vSwitch			"Entwässerungspumpe"			(gPumpOn)

Number PumpWasteWater_Power			"Schmutzwasser [%.2f W]"			(gPump, Pump_Power_Chart, ePumpWasteWater)		["Measurement", "Power"]	{channel="knx:"}
Number PumpFeedingWater_Power		"Hauswasserwerk [%.2f W]"		(gPump, Pump_Power_Chart, ePumpFeedingWater)	["Measurement", "Power"]	{channel="knx:"}
Number PumpDrainage_Power			"Entwässerungspumpe [%.2f W]"	(gPump, Pump_Power_Chart, ePumpDrainage)		["Measurement", "Power"]	{channel="knx:"}
Rules

Code: Alles auswählen

var long Drainage_Starttime
var Number Drainage_Length

var Timer t_watchdogdrainage = null	//Timer zur Überwachung der Entwässerungspumpe
var Timer t_watchdogfeeding = null	//Timer zur Überwachung des Hauswasserwerks

rule PumpMonitor     //(Erkennung der Pumpe)
when
	Member of gPump changed
then
	val myPump = gPumpOn.members.filter[ i|i.name.contains(triggeringItem.name.split("_").get(0))].head
	if (triggeringItem.state > 0 && previousState == 0 && myPump.state != ON) {
		myPump.postUpdate(ON)
		logInfo("Water", "{} ist angelaufen.", triggeringItem.label)
	} else if (triggeringItem.state > 0 && previousState > 0) {
		logInfo("Water", "{} zieht derzeit {} mA.", triggeringItem.label, triggeringItem.state)
	} else if (triggeringItem.state == 0 && previousState > 0 && myPump.state != OFF) {
		myPump.postUpdate(OFF)
		logInfo("Water", "{} hat abgeschaltet.", triggeringItem.label)
	}
end

rule PumpAction      //(Aktion und Meldung)
when
	Member of gPumpOn received update
then
	val actions = getActions("pushover", "pushover:pushover-account:account")
	/* Entwässerungspumpe EIN */
	if (triggeringItem.state == (ON) && triggeringItem.name.split("_").get(0) == PumpDrainage_Power.name.split("_").get(0)) {
		if (t_watchdogdrainage === null) {
			Drainage_Starttime = new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000
			logInfo("Water", Drainage_Starttime.toString)
			logInfo("Water", "Note: Alarmtimer für {} gestartet", PumpDrainage_vSwitch.label)
			actions.sendMessageToDevice("iPhone", PumpDrainage_vSwitch.label + " ist angelaufen.", "Notification")

			t_watchdogdrainage = createTimer(now.plusSeconds(45))[ |
				if (PumpDrainage_vSwitch.state == ON) {
					Drainage_Length = (new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000) - Drainage_Starttime
					actions.sendMessageToDevice("iPhone", PumpDrainage_vSwitch.label + " läuft seit " + Drainage_Length.toString + " Sekunden!", "Alert: " + OffsetDateTime.now().toString)
					if (Parents.state == ON) {
						if (SleepMode.state == 1) {
							Steckd_OG_Schlafz_Schrank.sendCommand(ON)
							Lampe_OG_Flur_Deko.sendCommand(ON)
						} else if (Night.state == ON && SleepMode.state == 0) {
							Lampe_EG_Deko_Wand.sendCommand(ON)
						}
						t_watchdogdrainage.reschedule(now.plusSeconds(30))
					} else {
						t_watchdogdrainage.reschedule(now.plusSeconds(30))
					}
				} else if (PumpDrainage_vSwitch.state == (OFF)) {
					t_watchdogdrainage.cancel
					t_watchdogdrainage = null
					return;
				}
			]
		}
	/* Entwässerungspumpe AUS (zur Überwachung) */
	} else if (triggeringItem.state == (OFF) && triggeringItem.name.split("_").get(0) == PumpDrainage_Power.name.split("_").get(0)) {
		Drainage_Length = (new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000) - Drainage_Starttime
		actions.sendMessageToDevice("iPhone", PumpDrainage_vSwitch.label + " hat nach " + Drainage_Length.toString + " Sekunden abgeschaltet.", "Notification")
		logInfo("Water", "Note: {} lief {} Sekunden", PumpDrainage_vSwitch.label, Drainage_Length.toString)

		t_watchdogdrainage.cancel
		t_watchdogdrainage = null
		return;
	/* Hauswasserwerk EIN */
//raus weil Gardena Binding noch nicht aktiv	} else if (triggeringItem.state == (ON) && triggeringItem.name.split("_").get(0) == PumpFeedingWater_Power.name.split("_").get(0) && myIrrigationSwitchVis.state == ON) {
	} else if (triggeringItem.state == (ON) && triggeringItem.name.split("_").get(0) == PumpFeedingWater_Power.name.split("_").get(0)) {
		logInfo("Water", "{} ist angelaufen", PumpFeedingWater_vSwitch.label)
		if (t_watchdogfeeding === null) {
			logInfo("Water", "Note: Alarmtimer für {} gestartet", PumpFeedingWater_vSwitch.label)
			t_watchdogfeeding = createTimer(now.plusSeconds(10))[ |
				if (PumpFeedingWater_vSwitch.state == (ON) && Parents.state == ON) {
					logInfo("Water", "Note: Lampe_EG_Deko_Wand.sendCommand(ON)")
				} else if (PumpFeedingWater_vSwitch.state == (ON) && Parents.state == OFF) {
					actions.sendMessageToDevice("iPhone", PumpFeedingWater_vSwitch.label + " läuft seit 10 Sekunden!", "Alert")
					t_watchdogfeeding.reschedule(now.plusSeconds(10))
					logInfo("Water", "Note: Pumpe läuft 10 Sec.")
				} else if (PumpFeedingWater_vSwitch.state == (OFF)) {
					t_watchdogfeeding.cancel
					t_watchdogfeeding = null
					logInfo("Water", "Timer beendet")
					return;
				}
			]
		}
	/* Schmutzwasserpumpe EIN */
	} else if (triggeringItem.state == (ON) && (triggeringItem.name.split("_").get(0) == PumpWasteWater_Power.name.split("_").get(0)) && Washer_Power.state > 0) {
		return;
	} else if (triggeringItem.state == (ON) && (triggeringItem.name.split("_").get(0) == PumpWasteWater_Power.name.split("_").get(0))) {
		actions.sendMessageToDevice("iPhone", "Warum läuft die " + PumpWasteWater_vSwitch.label + "?", "Alert")
		return;
	}
end
von udo1toni » 13. Jan 2022 15:55
Eventuell läuft die Rule zeitgleich mehrfach. Eventuell wäre es besser, den Trigger auf changed zu ändern, statt received update.
Diese Zeile:

Code: Alles auswählen

022-01-13 00:23:01.200 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe ist angelaufen.
stammt nicht aus dieser Rule! Oder Du hast nicht den aktuellen Code gepostet... Im Code steht nur an zwei Stellen das Wort "angelaufen", und die eine Stelle ist ein pushover, welches nicht im log landet. Die andere Stelle wird nur ausgeführt, wenn das Hauswasserwerk läuft. und muss entsprechend ein anderes Label ausgeben.
Gehe zur vollständigen Antwort
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von int5749 »

Man(n) sollte das Log dann auch komplett lesen und nicht nur nach dem gewählten Logger "Water" filtern.

Der Timer wird manchmal nicht abgebrochen
Script execution of rule with UID 'ki-19' failed: cannot invoke method public abstract boolean org.openhab.core.model.script.actions.Timer.cancel() on null in ki
Somit stellt sich die Frage: Was ich dort NULL und führt zum Abbruch :?
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von udo1toni »

Erst mal hast Du an einigen Stellen Deinen Code etwas kompliziert gestaltet...

Code: Alles auswählen

PumpDrainage_Power.name.split("_").get(0)
Da es sich um ein fixes Item handelt, kannst Du stattdessen auch

Code: Alles auswählen

"PumpDrainage"
schreiben. .get() liefert einen String aus einer Liste zurück. .split() bildet eine Liste, indem es einen String an den Stellen aufbricht, die in der Klammer definiert sind. .name liefert einen String. ;)

Da Du an etlichen Stellen auf den ersten Teil des Namens des triggernden Items zugreifst, böte es sich an, den zu Beginn der Rule in einer lokalen Konstanten zu speichern (spart Taktzyklen)

Es gibt auch noch einige andere Punkte, die vereinfacht werden können.
Am Ende einer Rule braucht es kein return; (zum Beispiel) das gilt auch für Timer-Code

Innerhalb eines Timers ist es sinnlos, diesen Timer mit myTimer.cancel stoppen zu wollen. das .cancel verhindert nur, dass der Code gestartet wird, dieser läuft zu dem Zeitpunkt aber schon. Außerhalb eines Timers sieht die Sache natürlich anders aus. Allerdings musst Du dann sicherstellen, dass der Timer auch tatsächlich existiert.
Oder Du schreibst statt myTimer.cancel einfach myTimer?.cancel. Das Fragezeichen ist synonym für diesen Code:

Code: Alles auswählen

if(myTimer !== null) myTimer.cancel
A propos null: NULL ist etwas komplett anderes als null. Deshalb ist es gefährlich, das bei der Fehlerbeschreibung zum Hervorheben zu verwenden. Nutze stattdessen lieber null oder null ;)

Eventuell musst Du die Timer nicht einfach mit now.plusSeconds() starten, sondern mit localDateTime.now.plusSeconds(), das ist aber nur so eine vage Idee...
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von int5749 »

udo1toni hat geschrieben: 10. Jan 2022 11:13 Erst mal hast Du an einigen Stellen Deinen Code etwas kompliziert gestaltet...

Code: Alles auswählen

PumpDrainage_Power.name.split("_").get(0)
Da es sich um ein fixes Item handelt, kannst Du stattdessen auch

Code: Alles auswählen

"PumpDrainage"
schreiben. .get() liefert einen String aus einer Liste zurück. .split() bildet eine Liste, indem es einen String an den Stellen aufbricht, die in der Klammer definiert sind. .name liefert einen String. ;)
Da dachte man(n) man macht es smart :roll:
udo1toni hat geschrieben: 10. Jan 2022 11:13 Da Du an etlichen Stellen auf den ersten Teil des Namens des triggernden Items zugreifst, böte es sich an, den zu Beginn der Rule in einer lokalen Konstanten zu speichern (spart Taktzyklen)
Stimmt :oops: geändert
udo1toni hat geschrieben: 10. Jan 2022 11:13 Es gibt auch noch einige andere Punkte, die vereinfacht werden können.
Wieder etwas gelernt (hoffentlich behalte ich dies) und geändert
udo1toni hat geschrieben: 10. Jan 2022 11:13 A propos null: NULL ist etwas komplett anderes als null. Deshalb ist es gefährlich, das bei der Fehlerbeschreibung zum Hervorheben zu verwenden. Nutze stattdessen lieber null oder null ;)
:arrow: OK
udo1toni hat geschrieben: 10. Jan 2022 11:13 Eventuell musst Du die Timer nicht einfach mit now.plusSeconds() starten, sondern mit localDateTime.now.plusSeconds(), das ist aber nur so eine vage Idee...
Würde ich im zweiten Schritt testen, nachdem ich die ganzen Änderungen mal 1-3 Tage beobachtet habe. Obwohl der Timer an sich ja ohne Probleme läuft. Evtl. lag es ja dem den überflüssigen return's

Schon einmal besten Dank und der angepasste Code lautet nun:

Code: Alles auswählen

var long Drainage_Starttime
var Number Drainage_Length

var Timer t_watchdogdrainage = null	//Timer zur Überwachung der Entwässerungspumpe
var Timer t_watchdogfeeding = null	//Timer zur Überwachung des Hauswasserwerks

rule PumpMonitor
when
	Member of gPump changed
then
	val myPump = gPumpOn.members.filter[ i|i.name.contains(triggeringItem.name.split("_").get(0))].head
	if (triggeringItem.state > 0 && previousState == 0 && myPump.state != ON) {
		myPump.postUpdate(ON)
		logInfo("Water", "{} ist angelaufen.", triggeringItem.label)
	} else if (triggeringItem.state > 0 && previousState > 0) {
		logInfo("Water", "{} zieht derzeit {} mA.", triggeringItem.label, triggeringItem.state)
	} else if (triggeringItem.state == 0 && previousState > 0 && myPump.state != OFF) {
		myPump.postUpdate(OFF)
		logInfo("Water", "{} hat abgeschaltet.", triggeringItem.label)
	}
end

rule PumpAction
when
	Member of gPumpOn received update
then
	val actions = getActions("pushover", "pushover:pushover-account:account")
	val vName = triggeringItem.name.split("_").get(0)

	/* Entwässerungspumpe EIN */
	if (triggeringItem.state == (ON) && vName == "PumpDrainage") {
		if (t_watchdogdrainage === null) {
			Drainage_Starttime = new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000
			logInfo("Water", Drainage_Starttime.toString)
			logInfo("Water", "Note: Alarmtimer für {} gestartet", PumpDrainage_vSwitch.label)
			actions.sendMessageToDevice("iPhone", PumpDrainage_vSwitch.label + " ist angelaufen.", "Notification")

			t_watchdogdrainage = createTimer(now.plusSeconds(45))[ |
				if (PumpDrainage_vSwitch.state == ON) {
					Drainage_Length = (new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000) - Drainage_Starttime
					actions.sendMessageToDevice("iPhone", PumpDrainage_vSwitch.label + " läuft seit " + Drainage_Length.toString + " Sekunden!", "Alert: " + OffsetDateTime.now().toString)
					if (Parents.state == ON) {
						if (SleepMode.state == 1) {
							Steckd_OG_Schlafz_Schrank.sendCommand(ON)
							Lampe_OG_Flur_Deko.sendCommand(ON)
						} else if (Night.state == ON && SleepMode.state == 0) {
							Lampe_EG_Deko_Wand.sendCommand(ON)
						}
						t_watchdogdrainage.reschedule(now.plusSeconds(30))
					} else {
						t_watchdogdrainage.reschedule(now.plusSeconds(30))
					}
				}
			]
		}
	/* Entwässerungspumpe AUS (zur Überwachung) */
	} else if (triggeringItem.state == (OFF) && vName == "PumpDrainage") {
		Drainage_Length = (new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000) - Drainage_Starttime
		actions.sendMessageToDevice("iPhone", PumpDrainage_vSwitch.label + " hat nach " + Drainage_Length.toString + " Sekunden abgeschaltet.", "Notification")
		logInfo("Water", "Note: {} lief {} Sekunden", PumpDrainage_vSwitch.label, Drainage_Length.toString)

		t_watchdogdrainage?.cancel
		t_watchdogdrainage = null

	/* Hauswasserwerk EIN */
//raus weil Gardena Binding noch nicht aktiv	} else if (triggeringItem.state == (ON) && vName == PumpFeedingWater_Power.name.split("_").get(0) && myIrrigationSwitchVis.state == ON) {
	} else if (triggeringItem.state == (ON) && vName == "PumpFeedingWater") {
		logInfo("Water", "{} ist angelaufen", PumpFeedingWater_vSwitch.label)
		if (t_watchdogfeeding === null) {
			logInfo("Water", "Note: Alarmtimer für {} gestartet", PumpFeedingWater_vSwitch.label)
			t_watchdogfeeding = createTimer(now.plusSeconds(10))[ |
				if (PumpFeedingWater_vSwitch.state == (ON) && Parents.state == ON) {
					logInfo("Water", "Note: Lampe_EG_Deko_Wand.sendCommand(ON)")
				} else if (PumpFeedingWater_vSwitch.state == (ON) && Parents.state == OFF) {
					actions.sendMessageToDevice("iPhone", PumpFeedingWater_vSwitch.label + " läuft seit 10 Sekunden!", "Alert")
					t_watchdogfeeding.reschedule(now.plusSeconds(10))
					logInfo("Water", "Note: Pumpe läuft 10 Sec.")
				}
			]
		}
	} else if (triggeringItem.state == (OFF) && vName == "PumpFeedingWater") {
		logInfo("Water", "Timer für {} beendet", PumpFeedingWater_vSwitch.label)
		t_watchdogfeeding?.cancel
		t_watchdogfeeding = null

	/* Schmutzwasserpumpe EIN */
	} else if (triggeringItem.state == (ON) && (vName == "PumpWasteWater") && Washer_Power.state > 0) {
		logInfo("Water", "WA läuft")
	} else if (triggeringItem.state == (ON) && (vName == "PumpWasteWater") && Washer_Power.state == 0) {
		actions.sendMessageToDevice("iPhone", "Warum läuft die " + PumpWasteWater_vSwitch.label + "?", "Alert")
	}
end
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von udo1toni »

Schau mal, etwas anderer Ansatz...

Code: Alles auswählen

var long Drainage_Starttime
var Number Drainage_Length

var Timer t_watchdogdrainage = null    //Timer zur Überwachung der Entwässerungspumpe
var Timer t_watchdogfeeding = null    //Timer zur Überwachung des Hauswasserwerks

rule "Pump Monitor"     //(Erkennung der Pumpe)
when
    Member of gPump changed
then
    val myPump = gPumpOn.members.filter[ i|i.name.contains(triggeringItem.name.split("_").get(0))].head
    if (triggeringItem.state > 0 && previousState == 0 && myPump.state != ON) {
        myPump.postUpdate(ON)
        logInfo("Water", "{} ist angelaufen.", triggeringItem.label)
    } else if (triggeringItem.state > 0 && previousState > 0) {
        logInfo("Water", "{} zieht derzeit {} mA.", triggeringItem.label, triggeringItem.state)
    } else if (triggeringItem.state == 0 && previousState > 0 && myPump.state != OFF) {
        myPump.postUpdate(OFF)
        logInfo("Water", "{} hat abgeschaltet.", triggeringItem.label)
    }
end

rule "Pump Action"      //(Aktion und Meldung)
when
    Member of gPumpOn received update
then
    val actions = getActions("pushover", "pushover:pushover-account:account")
    switch(triggeringItem.name.split("_").get(0)) {
        case "PumpDrainage"     : {        /* Entwässerungspumpe EIN */
            val strLabel = PumpDrainage_vSwitch.label
            if (triggeringItem.state == ON) {
                if (t_watchdogdrainage === null) {
                    Drainage_Starttime = new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000
                    logInfo("Water", Drainage_Starttime.toString)
                    logInfo("Water", "Note: Alarmtimer für {} gestartet", strLabel)
                    actions.sendMessageToDevice("iPhone", strLabel + " ist angelaufen.", "Notification")

                    t_watchdogdrainage = createTimer(now.plusSeconds(45),[ |
                        if (PumpDrainage_vSwitch.state == ON) {
                            Drainage_Length = (new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000) - Drainage_Starttime
                            actions.sendMessageToDevice("iPhone", PumpDrainage_vSwitch.label + " läuft seit " + Drainage_Length.toString + " Sekunden!", "Alert: " + OffsetDateTime.now().toString)
                            if (Parents.state == ON) {
                                if (SleepMode.state == 1) {
                                    Steckd_OG_Schlafz_Schrank.sendCommand(ON)
                                    Lampe_OG_Flur_Deko.sendCommand(ON)
                                } else if (Night.state == ON && SleepMode.state == 0) {
                                    Lampe_EG_Deko_Wand.sendCommand(ON)
                                }
                            } 
                            t_watchdogdrainage.reschedule(now.plusSeconds(30))
                        } else if (PumpDrainage_vSwitch.state == (OFF)) {
                            t_watchdogdrainage = null
                        }
                    ])
                }
            } else {        /* Entwässerungspumpe AUS (zur Überwachung) */
                Drainage_Length = (new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000) - Drainage_Starttime
                actions.sendMessageToDevice("iPhone", strLabel + " hat nach " + Drainage_Length.toString + " Sekunden abgeschaltet.", "Notification")
                logInfo("Water", "Note: {} lief {} Sekunden", strLabel, Drainage_Length.toString)

                t_watchdogdrainage.cancel
                t_watchdogdrainage = null
                return;
            }
        }
        case "PumpFeedingWater" : {        /* Hauswasserwerk EIN */
            if(triggeringItem.state == ON) {    //raus weil Gardena Binding noch nicht aktiv      && myIrrigationSwitchVis.state == ON) 
                logInfo("Water", "{} ist angelaufen", PumpFeedingWater_vSwitch.label)
                if (t_watchdogfeeding === null) {
                    logInfo("Water", "Note: Alarmtimer für {} gestartet", PumpFeedingWater_vSwitch.label)
                    t_watchdogfeeding = createTimer(now.plusSeconds(10), [ |
                        if (PumpFeedingWater_vSwitch.state == (ON)) {
                            if(Parents.state == ON) {
                                logInfo("Water", "Note: Lampe_EG_Deko_Wand.sendCommand(ON)")
                            } else {
                                actions.sendMessageToDevice("iPhone", PumpFeedingWater_vSwitch.label + " läuft seit 10 Sekunden!", "Alert")
                                t_watchdogfeeding.reschedule(now.plusSeconds(10))
                                logInfo("Water", "Note: Pumpe läuft 10 Sec.")
                            }
                        } else {
                            t_watchdogfeeding = null
                            logInfo("Water", "Timer beendet")
                        }
                    ])
                }
            }
        }
        case "PumpWasteWater"   : {        /* Schmutzwasserpumpe EIN */
            if (triggeringItem.state == ON && Washer_Power.state == 0) {
                actions.sendMessageToDevice("iPhone", "Warum läuft die " + PumpWasteWater_vSwitch.label + "?", "Alert")
            }
        }
    }
end
... natürlich ohne Prüfung auf Lauffähigkeit...
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von int5749 »

udo1toni hat geschrieben: 10. Jan 2022 12:17 Schau mal, etwas anderer Ansatz...
Danke. Auch sehr interessant die Vorgehensweise über eine case-switch. Werde ich auch gerne testen ;)

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von int5749 »

udo1toni hat geschrieben: 10. Jan 2022 12:17 ... natürlich ohne Prüfung auf Lauffähigkeit...
Nachdem meine geänderte Rule sich direkt nach ein paar Anläufen der Pumpe genauso fehlerhaft verhalten hat, habe ich Deinen Vorschlag auch direkt mal getestet. Zunöchst sah es gut aus (aber das tat es mit den Änderungen auch mit meiner Rule), aber nach einigen Läufen tritt das gleiche Verhalten auf :cry:

Code: Alles auswählen

2022-01-10 18:32:00.594 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe ist angelaufen.
2022-01-10 18:32:00.597 [INFO ] [org.openhab.core.model.script.Water ] - 1641835920
2022-01-10 18:32:00.599 [INFO ] [org.openhab.core.model.script.Water ] - Note: Alarmtimer für Entwässerungspumpe gestartet
2022-01-10 18:32:01.161 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 13.450000000000001 mA.
2022-01-10 18:32:06.158 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 12.83 mA.
2022-01-10 18:32:11.152 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 12.72 mA.
2022-01-10 18:32:13.932 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe hat abgeschaltet.
2022-01-10 18:32:14.670 [INFO ] [org.openhab.core.model.script.Water ] - Note: Entwässerungspumpe lief 13 Sekunden
und dann wird scheinbar der Timer nicht mehr beendet?

Code: Alles auswählen

2022-01-10 19:00:23.463 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe ist angelaufen.
2022-01-10 19:00:23.465 [INFO ] [org.openhab.core.model.script.Water ] - 1641837623
2022-01-10 19:00:23.465 [INFO ] [org.openhab.core.model.script.Water ] - Note: Alarmtimer für Entwässerungspumpe gestartet
2022-01-10 19:00:24.581 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 13.23 mA.
2022-01-10 19:00:29.577 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 12.88 mA.
2022-01-10 19:00:34.571 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 12.56 mA.
2022-01-10 19:00:36.262 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 3.85 mA.
2022-01-10 19:00:39.568 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe hat abgeschaltet.

2022-01-10 19:29:16.194 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe ist angelaufen.
2022-01-10 19:29:16.196 [INFO ] [org.openhab.core.model.script.Water ] - 1641839356
2022-01-10 19:29:16.197 [INFO ] [org.openhab.core.model.script.Water ] - Note: Alarmtimer für Entwässerungspumpe gestartet
2022-01-10 19:29:16.728 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 13.61 mA.
2022-01-10 19:29:17.972 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 13.23 mA.
2022-01-10 19:29:22.969 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 12.8 mA.
2022-01-10 19:29:27.966 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 12.540000000000001 mA.
2022-01-10 19:29:29.529 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe hat abgeschaltet.
Und hier die genau 1744 = 29 Minuten später wird der Timer beendet, obwohl die Pumpe noch läuft??

Code: Alles auswählen

2022-01-10 19:58:20.662 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe ist angelaufen.
2022-01-10 19:58:21.194 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 13.61 mA.
2022-01-10 19:58:21.477 [INFO ] [org.openhab.core.model.script.Water ] - Note: Entwässerungspumpe lief 1744 Sekunden
2022-01-10 19:58:21.478 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'ki-19' failed: cannot invoke method public abstract boolean org.openhab.core.model.script.actions.Timer.cancel() on null in ki
2022-01-10 19:58:26.351 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 12.91 mA.
2022-01-10 19:58:31.346 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe zieht derzeit 12.72 mA.
2022-01-10 19:58:33.998 [INFO ] [org.openhab.core.model.script.Water ] - Entwässerungspumpe hat abgeschaltet.
2022-01-10 19:58:34.288 [INFO ] [org.openhab.core.model.script.Water ] - Note: Entwässerungspumpe lief 1757 Sekunden
2022-01-10 19:58:34.289 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'ki-19' failed: cannot invoke method public abstract boolean org.openhab.core.model.script.actions.Timer.cancel() on null in ki
Das ich seit einiger Zeit die Fehler vom Amazon Binding habe, sollte ja eine Auswirkung haben?

Code: Alles auswählen

2022-01-10 19:01:26.910 [INFO ] [control.internal.WebSocketConnection] - Web Socket close 1005. Reason: null
2022-01-10 19:02:31.181 [INFO ] [control.internal.WebSocketConnection] - Web Socket close 1005. Reason: null
2022-01-10 19:03:35.639 [INFO ] [control.internal.WebSocketConnection] - Web Socket close 1005. Reason: null
2022-01-10 19:04:38.029 [INFO ] [control.internal.WebSocketConnection] - Web Socket close 1005. Reason: null
2022-01-10 19:05:40.238 [INFO ] [control.internal.WebSocketConnection] - Web Socket close 1005. Reason: null
2022-01-10 19:06:46.681 [INFO ] [control.internal.WebSocketConnection] - Web Socket close 1005. Reason: null
2022-01-10 19:07:53.035 [INFO ] [control.internal.WebSocketConnection] - Web Socket close 1005. Reason: null
2022-01-10 19:09:01.527 [INFO ] [control.internal.WebSocketConnection] - Web Socket close 1005. Reason: null
2022-01-10 19:10:05.966 [INFO ] [control.internal.WebSocketConnection] - Web Socket close 1005. Reason: null
Ich steh voll auf dem Schlauch :?

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von udo1toni »

Vielleicht ein paar zusätzliche Loginformationen im Timer (im 2. Timer hast Du das schon eingebaut, im 1. noch nicht...)

Code: Alles auswählen

t_watchdogdrainage = createTimer(now.plusSeconds(45),[ |
    if (PumpDrainage_vSwitch.state == ON) {
        Drainage_Length = (new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000) - Drainage_Starttime
        actions.sendMessageToDevice("iPhone", PumpDrainage_vSwitch.label + " läuft seit " + Drainage_Length.toString + " Sekunden!", "Alert: " + OffsetDateTime.now().toString)
        if (Parents.state == ON) {
            if (SleepMode.state == 1) {
                Steckd_OG_Schlafz_Schrank.sendCommand(ON)
                Lampe_OG_Flur_Deko.sendCommand(ON)
            } else if (Night.state == ON && SleepMode.state == 0) {
                Lampe_EG_Deko_Wand.sendCommand(ON)
            }
        }
        logInfo("Water","Watchdog Drainage wird erneut geplant")  // <--------------
        t_watchdogdrainage.reschedule(now.plusSeconds(30))
    } else {
        logInfo("Water","Watchdog Drainage wird gelöscht")  // <--------------
        t_watchdogdrainage = null
    }
])
Kannst Du einen Blick auf die Speicherauslastung werfen, wenn die Rule nicht mehr richtig läuft?
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von int5749 »

udo1toni hat geschrieben: 10. Jan 2022 22:38 Vielleicht ein paar zusätzliche Loginformationen im Timer (im 2. Timer hast Du das schon eingebaut, im 1. noch nicht...)
Sind eingebaut
udo1toni hat geschrieben: 10. Jan 2022 22:38 Kannst Du einen Blick auf die Speicherauslastung werfen, wenn die Rule nicht mehr richtig läuft?
Gerade, nach dem Einbau der Loginformationen und einem speichern der Rule, lief alles wie erwartet. Dies war aber auch in der Nacht teilweise der Fall.
Derzeit läuft diese Pumpe ca. alle 40-45 Min für ca. 15 Sek. an. Die Rule läuft "nur" in ca. 30% der Fälle wie erwartet.

Gerade, als die Rule normal funktioniert hat lag die Systemlast im "Der Rechner spielt sich an den Füßen" Bereich
220111 - Systemstate while Drainage Pump running.JPG
Aber auch ansonsten sehe ich derzeit keine Auffälligkeiten (Systemlast der letzten 24h)
220110 - Skynet CPU and RAM.JPG
Der Peak war ein Neustart von openHAB im Rahmen der Analyse.

Nächstes Update mit Logeinträgen im Laufe des Tages, nachdem die Pumpe ein paar mal gelaufen ist.

Viele Grüße
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Pumpenmonitoring - Triggering Item unzuverlässig

Beitrag von int5749 »

udo1toni hat geschrieben: 10. Jan 2022 22:38 Vielleicht ein paar zusätzliche Loginformationen im Timer (im 2. Timer hast Du das schon eingebaut, im 1. noch nicht...)
Es ist zum Mäusemelken.

Wenn ich es nicht besser wüsste, würde ich sagen: das war des Rätsels Lösung, denn seit ich heute Morgen das zusätzliche Logging eingebaut habe, ist der Fehler nicht mehr aufgetreten :?: :?: :?: Egal ob ich dies manuell triggere über die virtuellen Schalter oder ob die Pumpe tatsächlich läuft (wie gesagt: alle 40-50 Min). Natürlich klappt auch das erweiterte Logging, wenn ich den Schalter einfach mal 2-3 Minuten ON lasse.

Ich werde dies weiter beobachten, denn auch im Log ist der Fehler nicht mehr enthalten.

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Antworten