Fehler in Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Fehler in Rule

Beitrag von bastler »

ja genau richtig

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Fehler in Rule

Beitrag von SaschaQ »

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.

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Fehler in Rule

Beitrag von bastler »

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...

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Fehler in Rule

Beitrag von SaschaQ »

Achso das meinst du. das habe ich nicht verstanden.

Mache ich. Ich melde mich.

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Fehler in Rule

Beitrag von SaschaQ »

Der Fehler kommt wenn diese Rule in der Alltag.rules Datei ist.

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



bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Fehler in Rule

Beitrag von bastler »

og_arbeitszimmersascha_schreibtisch(ON)... was mir auf die schnelle auffällt:
du hast zwei mal in deinem code stehen:

Code: Alles auswählen

og_arbeitszimmersascha_schreibtisch(ON)
bzw

Code: Alles auswählen

og_arbeitszimmersascha_schreibtisch(OFF)
was ist das? ein schalter? dann müsste es aber doch heißen:

Code: Alles auswählen

og_arbeitszimmersascha_schreibtisch.sendCommand(ON)
bzw

Code: Alles auswählen

og_arbeitszimmersascha_schreibtisch.sendCommand(OFF)

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Fehler in Rule

Beitrag von SaschaQ »

Besten Dank, das wars.

Blöder Fehler. Aber ist mir nicht aufgefallen.

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Fehler in Rule

Beitrag von bastler »

... 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

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

Re: Fehler in Rule

Beitrag von udo1toni »

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):

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 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
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Fehler in Rule

Beitrag von SaschaQ »

Hi Udo,

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

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?

Antworten