Fehler in Rule
-
- Beiträge: 202
- Registriert: 2. Mär 2020 13:50
Re: Fehler in Rule
Ja so habe ich es verstanden.
Funktioniert auch.
Nur komischerweise habe ich immer noch den Fehler.
Die Rules sind oben doch gepostet. Ich habe die Änderungen von udo1toni eingepflegt.
Funktioniert auch.
Nur komischerweise habe ich immer noch den Fehler.
Die Rules sind oben doch gepostet. Ich habe die Änderungen von udo1toni eingepflegt.
-
- Beiträge: 121
- Registriert: 7. Jan 2020 19:36
Re: Fehler in Rule
ja, aber du hast in der datei sieben rules drin - und es wäre halt viel einfacher wenn man wüsste welches der sieben diese meldung erzeugt. drum wäre es eine enorme erleichterung für die die dir helfen wollen wenn du einfach zb jedes rule (temporär) in eine extra datei kopierst und schaust bei welchem rule dann gemeckert wird...
-
- Beiträge: 202
- Registriert: 2. Mär 2020 13:50
Re: Fehler in Rule
Achso das meinst du. das habe ich nicht verstanden.
Mache ich. Ich melde mich.
Mache ich. Ich melde mich.
-
- Beiträge: 202
- Registriert: 2. Mär 2020 13:50
Re: Fehler in Rule
Der Fehler kommt wenn diese Rule in der Alltag.rules Datei ist.
Jemand eine Idee wieso es dann zu der Warnung kommt?
Jemand eine Idee wieso es dann zu der Warnung kommt?
Code: Alles auswählen
rule "Sascha Homeoffice"
when
Item all_sascha_homeoffice received command or
Item all_sascha_homeoffice_prion_schalter received command
then
if (receivedCommand==ON) {
pc_arbeitszimmer_sascha.sendCommand(ON)
og_arbeitszimmersascha_rol.sendCommand(0)
og_arbeitszimmersascha_schreibtisch(ON)
if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {
Thread::sleep(2500)
echo_dot_arbeitszimmer_sascha_TTS_Volume.sendCommand(60)
echo_dot_arbeitszimmer_sascha_TTS.sendCommand('Ich wünsche dir einen angenehmen Homeoffice Tag')
Thread::sleep(2500)
echo_dot_arbeitszimmer_sascha_TTS_Volume.sendCommand(30)
}
}
else {
pc_arbeitszimmer_sascha.sendCommand(OFF)
og_arbeitszimmersascha_schreibtisch(OFF)
if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {
Thread::sleep(2500)
echo_dot_arbeitszimmer_sascha_TTS_Volume.sendCommand(60)
echo_dot_arbeitszimmer_sascha_TTS.sendCommand('Ich wünsche dir einen schönen Feierabend')
Thread::sleep(2500)
echo_dot_arbeitszimmer_sascha_TTS_Volume.sendCommand(30)
}
}
end
-
- Beiträge: 121
- Registriert: 7. Jan 2020 19:36
Re: Fehler in Rule
og_arbeitszimmersascha_schreibtisch(ON)... was mir auf die schnelle auffällt:
du hast zwei mal in deinem code stehen:
bzw
was ist das? ein schalter? dann müsste es aber doch heißen:
bzw
du hast zwei mal in deinem code stehen:
Code: Alles auswählen
og_arbeitszimmersascha_schreibtisch(ON)
Code: Alles auswählen
og_arbeitszimmersascha_schreibtisch(OFF)
Code: Alles auswählen
og_arbeitszimmersascha_schreibtisch.sendCommand(ON)
Code: Alles auswählen
og_arbeitszimmersascha_schreibtisch.sendCommand(OFF)
-
- Beiträge: 202
- Registriert: 2. Mär 2020 13:50
Re: Fehler in Rule
Besten Dank, das wars.
Blöder Fehler. Aber ist mir nicht aufgefallen.
Blöder Fehler. Aber ist mir nicht aufgefallen.
-
- Beiträge: 121
- Registriert: 7. Jan 2020 19:36
Re: Fehler in Rule
... hätte vielleicht noch einen tip wie man die regel vereinfachen kann, aber heb deine zur sicherheit auf falls ich falsch liege, ich würde meinen so könnte es auch gehen:
Code: Alles auswählen
rule "Sascha Homeoffice"
when
Item all_sascha_homeoffice received command or
Item all_sascha_homeoffice_prion_schalter received command
then
pc_arbeitszimmer_sascha.sendCommand(receivedCommand)
og_arbeitszimmersascha_schreibtisch(receivedCommand)
if (receivedCommand==ON) {
og_arbeitszimmersascha_rol.sendCommand(0)
}
if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {
Thread::sleep(2500)
echo_dot_arbeitszimmer_sascha_TTS_Volume.sendCommand(60)
echo_dot_arbeitszimmer_sascha_TTS.sendCommand(if (receivedCommand==ON) 'Ich wünsche dir einen angenehmen Homeoffice Tag' else 'Ich wünsche dir einen schönen Feierabend')
Thread::sleep(2500)
echo_dot_arbeitszimmer_sascha_TTS_Volume.sendCommand(30)
}
end
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Fehler in Rule
Das jeweils 1. Thread::sleep(2500) ist im Kontext der Rule unsinnig. Mag aber sein, dass Du hier absichtlich wartest 
Die Rule könnte ein paar Verbesserungen vertragen. Insbesondere die Thread::sleep Anweisungen mit dieser enormen Wartezeit sind keine gute Idee.
Diese Rule sollte funktionsgleich sein (unter der Voraussetzung, dass man mindestens 5 Sekunden zwischen zwei Schaltvorgängen wartet):
Der Timer ersetzt die Funktion von Thread::sleep(), mit dem Unterschied, dass während der Wartezeit der Thread nicht gesperrt ist. Weil die Variable receivedCommand im Timerkontext nicht mehr existiert, muss der Inhalt vorher gerettet werden. der Einfachheit halber erledige ich das hier mit einer Boolean Variable.
Der ternäre Operator erspart ein doppeltes sendCommand() im Code.
PS: Gute Optimierung der sendCommand() Anweisungen @bastler

Die Rule könnte ein paar Verbesserungen vertragen. Insbesondere die Thread::sleep Anweisungen mit dieser enormen Wartezeit sind keine gute Idee.
Diese Rule sollte funktionsgleich sein (unter der Voraussetzung, dass man mindestens 5 Sekunden zwischen zwei Schaltvorgängen wartet):
Code: Alles auswählen
// globale Variablen zu Beginn der Datei definieren!
var Timer tEcho = null
var Boolean bEcho = false
rule "Sascha Homeoffice"
when
Item all_sascha_homeoffice received command or
Item all_sascha_homeoffice_prion_schalter received command
then
pc_arbeitszimmer_sascha.sendCommand(receivedCommand)
og_arbeitszimmersascha_schreibtisch.sendCommand(receivedCommand)
if(receivedCommand==ON) {
bEcho = true
og_arbeitszimmersascha_rol.sendCommand(0)
} else {
bEcho = false
}
if (now.getHourOfDay < 20 && now.getHourOfDay > 7 && tEcho === null) // .getHourOfDay ist vom Typ Integer
tEcho = createTimer(now.plusMillis(2500), [ | // statt Thread::sleep()
if((echo_dot_arbeitszimmer_sascha_TTS_Volume.state as Number) != 60) {
echo_dot_arbeitszimmer_sascha_TTS_Volume.sendCommand(60)
echo_dot_arbeitszimmer_sascha_TTS.sendCommand(
if(bEcho) // receivedCommand war ON
'Ich wünsche dir einen angenehmen Homeoffice Tag'
else
'Ich wünsche dir einen schönen Feierabend'
)
tEcho.reschedule(now.plusMillis(2500))
} else {
echo_dot_arbeitszimmer_sascha_TTS_Volume.sendCommand(30)
tEcho = null
}
])
end
Der ternäre Operator erspart ein doppeltes sendCommand() im Code.
PS: Gute Optimierung der sendCommand() Anweisungen @bastler
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 202
- Registriert: 2. Mär 2020 13:50
Re: Fehler in Rule
Hi Udo,
ich bekomme bei der Rule:
den folgende Fehler:
2020-11-06 18:33:45.953 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Weihnachtsbeleuchtung Anfang November bis Mitte Januar': An error occurred during the script execution: Could not invoke method: org.joda.time.DateTime.withDate(int,int,int) on instance: 2020-11-06T18:33:45.947+01:00
2020-11-06 18:33:45.953 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Weihnachtsbeleuchtung Anfang November bis Mitte Januar': An error occurred during the script execution: Could not invoke method: org.joda.time.DateTime.withDate(int,int,int) on instance: 2020-11-06T18:33:45.951+01:00
Woran liegt das?
ich bekomme bei der Rule:
Code: Alles auswählen
rule "Weihnachtsbeleuchtung Anfang November bis Mitte Januar"
when
Item ws_daemmerung changed
then
if((now.getDayOfYear > now.withDate(now.year,11,26).getDayOfYear || now.getDayOfYear < 16)) {
if(ws_daemmerung.state == OPEN) {
au_terrasse_st.sendCommand(ON)
au_eingang_st.sendCommand(ON)
au_garten_brightness.sendCommand(70)
au_vorgarten_brightness.sendCommand(70)
} else {
au_eingang_st.sendCommand(OFF)
au_terrasse_st.sendCommand(OFF)
}
}
end
2020-11-06 18:33:45.953 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Weihnachtsbeleuchtung Anfang November bis Mitte Januar': An error occurred during the script execution: Could not invoke method: org.joda.time.DateTime.withDate(int,int,int) on instance: 2020-11-06T18:33:45.947+01:00
2020-11-06 18:33:45.953 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Weihnachtsbeleuchtung Anfang November bis Mitte Januar': An error occurred during the script execution: Could not invoke method: org.joda.time.DateTime.withDate(int,int,int) on instance: 2020-11-06T18:33:45.951+01:00
Woran liegt das?