Seite 2 von 3

Re: Fehler in Rule

Verfasst: 21. Mär 2020 11:11
von bastler
ja genau richtig

Re: Fehler in Rule

Verfasst: 21. Mär 2020 14:13
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.

Re: Fehler in Rule

Verfasst: 21. Mär 2020 14:24
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...

Re: Fehler in Rule

Verfasst: 21. Mär 2020 19:02
von SaschaQ
Achso das meinst du. das habe ich nicht verstanden.

Mache ich. Ich melde mich.

Re: Fehler in Rule

Verfasst: 22. Mär 2020 12:46
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



Re: Fehler in Rule

Verfasst: 22. Mär 2020 13:30
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)

Re: Fehler in Rule

Verfasst: 22. Mär 2020 13:48
von SaschaQ
Besten Dank, das wars.

Blöder Fehler. Aber ist mir nicht aufgefallen.

Re: Fehler in Rule

Verfasst: 22. Mär 2020 14:02
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

Re: Fehler in Rule

Verfasst: 22. Mär 2020 14:41
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

Re: Fehler in Rule

Verfasst: 6. Nov 2020 18:47
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?