Java Error in Presence Simulation

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

Moderatoren: Cyrelian, seppy

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

Java Error in Presence Simulation

Beitrag von int5749 »

Hallo zusammen,

ich habe eine Presence Simulation, in der ich immer ein paar Sekunden zur gespeichterten Zeit abweiche um es wenigstens noch ein wenig zufälliger zu gestalten. Hierzu hatte ich wenige Sekunden über eine Zufallszahl ergänzt.

Sniplet

Code: Alles auswählen

var int randomTime = (new java.util.Random).nextInt(5)
t_presence = createTimer(now.plusSeconds(randomTime), [ |
Heute habe ich bemerkt, das diese Rule nicht mehr läuft :o
Im Log erscheint der folgende Fehler, leider weiß ich auch nicht mit welchem Update sich dies "eingeschlichen" hat :(
failed: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap') in ki
Leider finde ich dazu derzeit keine Lösung bei Google oder dem englischen Forum :roll: und hoffe hier konnte dies schon jemand lösen?
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Java Error in Presence Simulation

Beitrag von udo1toni »

Tipp 1: vermeide möglichst Primitives (int ist eine Primitive - Integer wäre das passende Objekt)
Tipp2: Um den Fehler einzugrenzen, definiere die Variable als String und logge den Wert, so dass Du Aufschluss darüber erhältst, warum java.util.Random.nextInt(5) keine Zahl liefert.

Grundsätzlich scheint mir der Code in Ordnung zu sein. Wichtig ist halt, dass man keine imports verwenden darf, das hast Du ja aber auch nicht getan...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

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

Re: Java Error in Presence Simulation

Beitrag von int5749 »

OK, Tipps umgesetzt aber nun bin ich verwirrt.

Aktuelle Rule

Code: Alles auswählen

rule "Presence Simulator"
when
	Time cron "0 */1 * * * ?"
then
	val actions = getActions("pushover", "pushover:pushover-account:account")
	logInfo("Presence","START RULE")
	if (Absence.state == ON) {
		println("-> Presence Simulation")
		t_presence?.cancel															// timer beenden, falls vorhanden
		t_presence = null															// Zeiger löschen
		gLights_auto.members.filter(f|f.state.toString!==f.historicState(new DateTimeType().zonedDateTime.minusDays(7),"jdbc").state.toString).forEach[ m|
			logInfo("Presence","Random Time ist: VORHER")
			var String randomTime = (new java.util.Random).nextInt(5).toString
			logInfo("Presence","Random Time ist: {}",randomTime)
			//var Integer randomTime = (new java.util.Random).nextInt(5)
			t_presence = createTimer(now.plusSeconds(randomTime), [ |
			m.sendCommand(m.historicState(new DateTimeType().zonedDateTime.minusDays(7),"jdbc").state.toString)
			logInfo("Presence","Restore {} to historic state: {}",m.name, m.historicState(new DateTimeType().zonedDateTime.minusDays(7),"jdbc").state)
			actions.sendMessageToDevice("J", "Restore " + m.name + " to historic state: " + m.historicState(new DateTimeType().zonedDateTime.minusDays(7),"jdbc").state, "Presence Simulation")
			])
		]
	}
end
Fehler im Log:

Code: Alles auswählen

12:45:00.259 [INFO ] [rg.openhab.core.model.script.Presence] - START RULE
12:45:00.262 [ERROR] [.internal.handler.ScriptActionHandler] - Script execution of rule with UID 'ki-7' failed: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap') in ki
Evtl. überholt der Fehler die Ausgabe von "logInfo("Presence","Random Time ist: VORHER")" im Log?? Aber schlauer werde ich durch die Meldung leider auch nicht :roll:
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Java Error in Presence Simulation

Beitrag von udo1toni »

Du hast schon mal einen grundsätzlichen Fehler in Deiner Rule.
Wenn Du in einer Schleife (forEach) Timer anlegst, dann brauchst Du für jeden angelegten Timer eine eigene Variable.
Das heißt, Du musst mit einer Hashmap oder einem Array für die Timer arbeiten - Einschränkung siehe unten.

Dann das hier: new DateTimeType().zonedDateTime.minusDays(7) vier Mal. Warum?
Abgesehen davon, dass es unnötig kompliziert ist, nutzt man in so einem Fall definitiv eine lokale Konstante oder meinetwegen eine Variable.

Das gleiche gilt für den historicState, der auch mehrfach verwendet wird - pro Item, versteht sich.

Was die Timersache betrifft: Wenn wir tatsächlich von einer Varianz von fünf Sekunden sprechen, lässt Du die Variable einfach weg, der Timer ist ja innerhalb fünf Sekunden eh rum, da braucht es normalerweise keine Kontrolle.

Eventuell reicht es schon, die Variablen unbestimmt zu definieren, um etwas mehr Klarheit zu bekommen.

Code: Alles auswählen

rule "Presence Simulator"
when
    Time cron "0 * * * * ?"
then
    if(Absence.state != ON)                                                      // Hauptschalter aus?
        return;                                                                  // dann Abbruch

    logInfo("Presence","START RULE")
    val past = now.minusDays(7)                                                  // jetzt vor sieben Tagen

    gLights_auto.members.filter[ f | f.state != f.historicState(past,"jdbc").state ].forEach[ m |
        logInfo("presence","Random Time ist: VORHER")
        var randomTime = (new java.util.Random).nextInt(5)
        logInfo("presence","Random Time ist: {}",randomTime)
        createTimer(now.plusSeconds(randomTime), [ |
            val actions = getActions("pushover", "pushover:pushover-account:account")
            val oldValue = m.historicState(past,"jdbc").state
            m.sendCommand(oldValue.toString)
            logInfo("presence","Restore {} to historic state: {}",m.name, oldValue)
            actions.sendMessageToDevice("J", "Restore " + m.name + " to historic state: " + oldValue.toString, "Presence Simulation")
        ])
    ]
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

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

Re: Java Error in Presence Simulation

Beitrag von int5749 »

Ja, nicht ganz so sauber programmiert, da kommt der Laie bei mir durch :? :roll:

Habe den Code mal 1:1 eingebaut und meinen minütlichen Trigger beibehalten.
Die Meldung bleibt aber die gleiche :cry:

Code: Alles auswählen

19:03:00.139 [INFO ] [rg.openhab.core.model.script.Presence] - START RULE
19:03:00.146 [ERROR] [.internal.handler.ScriptActionHandler] - Script execution of rule with UID 'ki-7' failed: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap') in ki
Mein Code hatte mit älteren Versionen von openHAB problemlos funktioniert, auch wundert mich ein Java Fehler.

Die 5 Sekunden sind nach weiterer Überlegung eher suboptimal und könnten auch entfallen. Dennoch wurmt mich der Fehler ;-)
Ziel der 5 Sekunden war eine gewisse Abweichung von der gespeicherten Zeit zu erreichen, aber 5 Sek. schon eher zu wenig.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Java Error in Presence Simulation

Beitrag von int5749 »

Seltsam ist ja, das nicht einmal die Ausgabe im Log direkt vor dem Aufruf des Java Befehls für Random erfolgt.

Evtl. ist ja auch die Datenbank defekt, das waren auf einmal 366 Items persistiert, obwohl in der Gruppe deutlich weniger sind.
Ich habe die Tabellen in der DB einfach mal gelöscht, die DB komprimiert und es werden nun wieder Werte geschrieben.

I'll keep you posted
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Java Error in Presence Simulation

Beitrag von udo1toni »

Nächste Frage... Wenn Du die Zeile mit var randomTime =... weg lässt (und halt stattdessen einen Integer Wert in die Variable schreibst)
funktioniert die Rule, es kommt also zu keinen weiteren Fehlermeldungen?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

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

Re: Java Error in Presence Simulation

Beitrag von int5749 »

Ich hatte sowohl die Zeile mit var random … weggelassen und auch den gesamten Timer Block.
Also nur Filterung und dann ggfs setzen des alten Wertes (schreibe von iPad, sonst hätte ich Code gepostet)

Trotz dieser Reduzierung kommt der gleiche Fehler.

Daher und da die Logausgabe direkt vor var random…. nicht erfolgt, also direkt hinter der Filterung, tippe ich derzeit auf einen Fehler bei der Abfrage der DB.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Java Error in Presence Simulation

Beitrag von udo1toni »

So sieht's aus.

Mein erster Tipp: Lass den Filter weg und prüfe stattdessen innerhalb der Schleife, ob der aktuelle Zustand abweicht.

Hintergrund: Es könnte sein, dass durch den Filter zu viele Abfragen auf einmal gegen die Datenbank geschickt werden. Außerdem könnte es sein, dass einzelne Items keinen Wert zurückliefern, eventuell gibt es dann ein Problem.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

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

Re: Java Error in Presence Simulation

Beitrag von int5749 »

Hallo wieder ;-)

Der Fehler war mal weg, doch ist nun wieder da :-/ Zum einen war die SQLite DB wieder mit Werten geflutet => Anderes Topic
Ich habe die DB reduziert und es werden neue Werte geschrieben und scheinbar auch gelesen.

Code-Schnipsel mit Log-Einträgen

Code: Alles auswählen

    logInfo("Presence","START RULE")
    val past = now.minusDays(7)                                                  // jetzt vor sieben Tagen
    logInfo("Presence","Datum: {}", past)

    gLights_auto.members.filter[ f | f.state != f.historicState(past,"jdbc").state ].forEach[ m |
          logInfo("presence","Restore {} to historic state!",m.name)
            val actions = getActions("pushover", "pushover:pushover-account:account")
            val oldValue = m.historicState(past,"jdbc").state
            m.sendCommand(oldValue.toString)
            logInfo("presence","Restore {} to historic state: {}",m.name, oldValue)
            actions.sendMessageToDevice("J", "Restore " + m.name + " to historic state: " + oldValue.toString, "Presence Simulation")
    ]
Log Derzeit
19:10:00.531 [INFO ] [rg.openhab.core.model.script.Presence] - START RULE
19:10:00.532 [INFO ] [rg.openhab.core.model.script.Presence] - Datum: 2023-09-26T19:10:00.532542018+02:00[Europe/Berlin]
19:10:00.536 [ERROR] [.internal.handler.ScriptActionHandler] - Script execution of rule with UID 'ki-7' failed: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap') in ki
Also scheint die Abfrage der DB ja zu klappen, nur der Filter nicht mehr :-/ Leider habe ich noch Verständnisprobleme was Du mit
udo1toni hat geschrieben: 7. Mai 2023 23:46 Mein erster Tipp: Lass den Filter weg und prüfe stattdessen innerhalb der Schleife, ob der aktuelle Zustand abweicht.
meinst :-/

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

Antworten