Seite 1 von 3

Fehler in Rule

Verfasst: 10. Mär 2020 14:17
von SaschaQ
Hallo zusammen,

ich habe in Openhab die folgende Rule gebaut:
und bekomme immer diesen Fehler

Code: Alles auswählen

2020-03-10 14:13:19.319 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'Alltag.rules', using it anyway:
This expression is not allowed in this context, since it doesn't cause any side effects.
This expression is not allowed in this context, since it doesn't cause any side effects.
Hat jemand eine Ahnung wo hier der Fehler liegt?


Code: Alles auswählen


/************************************************** Alltag Rules ********************************************/

rule "Schlafen"
when
    Item all_schlafen received command or
	Item all_schlafen_prion_schalter received command
	
then
    if (receivedCommand==ON) {

	
	dg_schlafzimmerrechts_rol.sendCommand(100)
	dg_schlafzimmerlinks_rol.sendCommand(100)
	dg_kinderzimmer2_rol.sendCommand(100)
	dg_badezimmer2_rol.sendCommand(100)
	dg_schlafzimmerrechts_rol_so.sendCommand(ON)
	dg_schlafzimmerlinks_rol_so.sendCommand(ON)
	dg_kinderzimmer2_rol_so.sendCommand(ON)
	dg_badezimmer2_rol_so.sendCommand(ON)
	dg_schlafzimmer1_db.sendCommand(OFF)
	dg_schlafzimmer2_db.sendCommand(OFF)
	dg_kinderzimmer2_db.sendCommand(OFF)
	dg_badezimmer2_db.sendCommand(OFF)
	dg_badezimmer2_wb.sendCommand(OFF)
	dg_schlafzimmer_kleiderschrank.sendCommand(OFF)
	
	if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {	
	Thread::sleep(2500)
	echo_dot_schlafzimmer_TTS_Volume.sendCommand(60)
	echo_dot_schlafzimmer_TTS.sendCommand('Gute Nacht Kerstin und Sascha')
	Thread::sleep(2500)
	echo_dot_schlafzimmer_TTS_Volume.sendCommand(30)
	}
	
	
	}
	else {
	
	dg_schlafzimmerrechts_rol_so.sendCommand(OFF)
	dg_schlafzimmerlinks_rol_so.sendCommand(OFF)
	dg_kinderzimmer2_rol_so.sendCommand(OFF)
	dg_badezimmer2_rol_so.sendCommand(OFF)
	dg_schlafzimmerrechts_rol.sendCommand(0)
	dg_schlafzimmerlinks_rol.sendCommand(0)
	dg_kinderzimmer2_rol.sendCommand(0)
	dg_badezimmer2_rol.sendCommand(0)

	if (ws_daemmerungswert.state < 100) {


	}
	
	if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {	
	Thread::sleep(2500)
	echo_dot_schlafzimmer_TTS_Volume.sendCommand(60)
	echo_dot_schlafzimmer_TTS.sendCommand('Guten Morgen Kerstin und Sascha')
	Thread::sleep(2500)
	echo_dot_schlafzimmer_TTS_Volume.sendCommand(30)
	}
	
	}
	
end

rule "Kochen"
when
    Item all_kochen received command or
	Item all_kochen_prion_schalter received command
then
     if (receivedCommand==ON) {
	
		if (ws_helligkeit_ost.state < 100) {
		
		
		
		}
		
		eg_kueche_arbeitsplatte.sendCommand(ON)
		eg_kueche_haengeschraenke.sendCommand(ON)
	if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {	
	Thread::sleep(2500)
	echo_wohnzimmer_TTS_Volume.sendCommand(60)
	echo_wohnzimmer_TTS.sendCommand('Viel Spaß beim Kochen')
	Thread::sleep(2500)
	echo_wohnzimmer_TTS_Volume.sendCommand(30)
	}
		}
	else {

	eg_kueche_db.sendCommand(OFF)
	eg_kueche_arbeitsplatte.sendCommand(OFF)
	eg_kueche_haengeschraenke.sendCommand(OFF)

	}
end

rule "Kind schlafen"
when
    Item all_kind_schlafen received command or
	Item all_kind_schlafen_prion_schalter received command
then
   if (receivedCommand==ON) {
	    
	dg_schlafzimmerrechts_rol.sendCommand(100)
	dg_schlafzimmerlinks_rol.sendCommand(100)
	dg_kinderzimmer2_rol.sendCommand(100)
	dg_badezimmer2_rol.sendCommand(100)
	dg_schlafzimmerlinks_rol_so.sendCommand(ON)
	dg_schlafzimmerrechts_rol_so.sendCommand(ON)
	dg_kinderzimmer2_rol_so.sendCommand(ON)
	dg_badezimmer2_rol_so.sendCommand(ON)
	if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {
	Thread::sleep(2500)
	echo_dot_schlafzimmer_TTS_Volume.sendCommand(60)
	echo_dot_schlafzimmer_TTS.sendCommand('Schlaf gut kleiner Hendrik')
	Thread::sleep(2500)
	echo_dot_schlafzimmer_TTS_Volume.sendCommand(30)
}
		}
		
	else {

	dg_schlafzimmerlinks_rol_so.sendCommand(OFF)
	dg_schlafzimmerrechts_rol_so.sendCommand(OFF)
	dg_kinderzimmer2_rol_so.sendCommand(OFF)
	dg_badezimmer2_rol_so.sendCommand(OFF)
	dg_schlafzimmerrechts_rol.sendCommand(0)
	dg_schlafzimmerlinks_rol.sendCommand(0)
	dg_kinderzimmer2_rol.sendCommand(0)
	dg_badezimmer2_rol.sendCommand(0)


	}
end

rule "Hendrik schlafen"
when
    Item all_hendrik_schlafen received command or
	Item all_hendrik_schlafen_prion_schalter received command
then
   if (receivedCommand==ON) {
	
	if (ws_daemmerungswert.state < 10) {

	og_kinderzimmer_rol.sendCommand(100)
	og_kinderzimmer_rol_so.sendCommand(ON)
	if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {
	Thread::sleep(2500)
	echo_dot_kinderzimmer_TTS_Volume.sendCommand(60)
	echo_dot_kinderzimmer_TTS.sendCommand('Schlaf gut großer Hendrik')
	Thread::sleep(2500)
	echo_dot_kinderzimmer_TTS_Volume.sendCommand(30)
	
	}
	}
	
	if (ws_daemmerungswert.state > 10) {

	og_kinderzimmer_rol.sendCommand(100)
	og_kinderzimmer_rol_so.sendCommand(ON)
	if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {
	Thread::sleep(2500)
	echo_dot_kinderzimmer_TTS_Volume.sendCommand(60)
	echo_dot_kinderzimmer_TTS.sendCommand('Schlaf gut großer Hendrik')
	Thread::sleep(2500)
	echo_dot_kinderzimmer_TTS_Volume.sendCommand(30)
	
	}
	}

}
			
	else {
	og_kinderzimmer_rol_so.sendCommand(OFF)
	og_kinderzimmer_rol.sendCommand(0)
	

	}
end

rule "Weihnachtsbeleuchtung Ende November bis Mitte Januar"
when

Item ws_daemmerung changed to OPEN or
Item ws_daemmerung changed to CLOSED

then

if (ws_daemmerung.state==OPEN) { 

if((now.getMonthOfYear == 11 && now.getDayOfMonth > 26) || (now.getMonthOfYear == 12) || (now.getMonthOfYear == 1 && now.getDayOfMonth < 16)) {

au_terrasse_st.sendCommand(ON)
au_eingang_st.sendCommand(ON)

}
}
else {

if (ws_daemmerung.state==CLOSED) { 

if((now.getMonthOfYear == 11 && now.getDayOfMonth > 26) || (now.getMonthOfYear == 12) || (now.getMonthOfYear == 1 && now.getDayOfMonth < 16)) {

au_terrasse_st.sendCommand(OFF)
au_eingang_st.sendCommand(OFF)

}
}
}

end 

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

rule "Weihnachtsbeleuchtung"
when

    Item all_weihnachtsbeleuchtung received command or
	Item all_weihnachtsbeleuchtung_prion_schalter received command
then

   if (receivedCommand==ON) {
	  
	smartplug1.sendCommand(ON)
	smartplug2.sendCommand(ON)
	smartplug3.sendCommand(ON)
	eg_wohnzimmer_stehlampe.sendCommand(ON)
	
}
		
	else {

	smartplug1.sendCommand(OFF)
	smartplug2.sendCommand(OFF)
	smartplug3.sendCommand(OFF)
	eg_wohnzimmer_stehlampe.sendCommand(OFF)
	
	}
end




Re: Fehler in Rule

Verfasst: 10. Mär 2020 15:06
von bastler
es wäre sehr hilfreich wenn du die rules nacheinander einzeln probierst (also die anderen immer mit "//" deaktivierst) damit man weiß von welchem rule der fehler kommt.

was mir auffällt ist dass du oft zb bei received command==on viele items auf ON schaltest, und die gleichen items bei received command=OFF dann OFF schaltest. das könntest du vereinfachen indem du schreibst:
z.b.

Code: Alles auswählen

then
    dg_schlafzimmerrechts_rol_so.sendCommand(receivedCommand)
    ...

Re: Fehler in Rule

Verfasst: 10. Mär 2020 15:18
von SaschaQ
Vielen Dank- Das werde ich umsetzen.

Gibt es jemanden er weiß woher die Expression Fehler kommen.
Die Rules laufen sauber aber immer beim Neustarten von Openhab kommen die beiden Fehler.

Re: Fehler in Rule

Verfasst: 10. Mär 2020 16:13
von bastler
... falls keiner sonst helfen kann: wie gesagt probier doch immer bis auf ein rule die anderen auszukommentieren. weil beim speichern der rule wird die neu geladen und da muß der fehler auch kommen. so kannst du sehen wann der fehler nicht mehr kommt und weißt schon mal welches der rules die probleme macht

Re: Fehler in Rule

Verfasst: 10. Mär 2020 16:40
von udo1toni
Also, die Meldung ist auf Level INFO, damit handelt es sich streng genommen nicht um einen Fehler, sondern nur eine Information. Die darauf folgenden zwei Meldungen besagen, dass Du einen Befehl nutzt, der keinerlei Wirkung entfaltet und somit unnötig ist. dabei handelt es sich um zwei if Statements mit leerem Body. Ob das nun ein Fehler ist (Du wolltest eigentlich an diesen Stellen etwas erledigen lassen) oder nicht (Du hast an dieser Stelle schon mal etwas vorbereitet), kannst nur Du wissen.

Grundsätzlich solltest Du darauf achten, dass die Indentation (Einrückung) korrekt ist. Das spielt für die Ausführung zwar keine Rolle, aber es hilft, die Übersicht zu behalten.

An einigen Stellen ist Dein Code unnötig kompliziert. z.B.

Code: Alles auswählen

rule "Weihnachtsbeleuchtung"
when

    Item all_weihnachtsbeleuchtung received command or
	Item all_weihnachtsbeleuchtung_prion_schalter received command
then

   if (receivedCommand==ON) {
	  
	smartplug1.sendCommand(ON)
	smartplug2.sendCommand(ON)
	smartplug3.sendCommand(ON)
	eg_wohnzimmer_stehlampe.sendCommand(ON)
	
}
		
	else {

	smartplug1.sendCommand(OFF)
	smartplug2.sendCommand(OFF)
	smartplug3.sendCommand(OFF)
	eg_wohnzimmer_stehlampe.sendCommand(OFF)
	
	}
end
geht einfacher so:

Code: Alles auswählen

rule "Weihnachtsbeleuchtung"
when
    Item all_weihnachtsbeleuchtung received command or
    Item all_weihnachtsbeleuchtung_prion_schalter received command
then
    smartplug1.sendCommand(receivedCommand)
    smartplug2.sendCommand(receivedCommand)
    smartplug3.sendCommand(receivedCommand)
    eg_wohnzimmer_stehlampe.sendCommand(receivedCommand)
end
und diese Rule

Code: Alles auswählen

rule "Weihnachtsbeleuchtung Ende November bis Mitte Januar"
when

Item ws_daemmerung changed to OPEN or
Item ws_daemmerung changed to CLOSED

then

if (ws_daemmerung.state==OPEN) { 

if((now.getMonthOfYear == 11 && now.getDayOfMonth > 26) || (now.getMonthOfYear == 12) || (now.getMonthOfYear == 1 && now.getDayOfMonth < 16)) {

au_terrasse_st.sendCommand(ON)
au_eingang_st.sendCommand(ON)

}
}
else {

if (ws_daemmerung.state==CLOSED) { 

if((now.getMonthOfYear == 11 && now.getDayOfMonth > 26) || (now.getMonthOfYear == 12) || (now.getMonthOfYear == 1 && now.getDayOfMonth < 16)) {

au_terrasse_st.sendCommand(OFF)
au_eingang_st.sendCommand(OFF)

}
}
}

end 
lässt sich durch leichte Umstellung und Änderung der Bedingungen ebenfalls vereinfachen:

Code: Alles auswählen

rule "Weihnachtsbeleuchtung Ende 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)
        } else {
            au_terrasse_st.sendCommand(OFF)
            au_eingang_st.sendCommand(OFF)
        }
    }
end 
Leider reicht es nicht, getDayOfYear gegen 330 zu testen, da wir ja auch Schaltjahre haben. Das Konstrukt für das Datum sieht etwas kompliziert aus, ist aber sehr einfach, insbesondere handelt es sich um nur zwei veroderte simple Vergleiche. Durch das Umdrehen der Vergleiche spare ich auch noch einen Vergleich.

Re: Fehler in Rule

Verfasst: 13. Mär 2020 10:52
von SaschaQ
Vielen lieben Dank

Re: Fehler in Rule

Verfasst: 13. Mär 2020 10:58
von SaschaQ
Halllo Udo1toni,

ich habe gerade mal die beiden Rules angepasst.

leider noch immer der fehler

Code: Alles auswählen


[el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'Alltag.rules', using it anyway:
This expression is not allowed in this context, since it doesn't cause any side effects.
This expression is not allowed in this context, since it doesn't cause any side effects.

noch eine Idee?

Re: Fehler in Rule

Verfasst: 21. Mär 2020 09:25
von SaschaQ
Noch jemand eine Idee woran das liegen kann?

Re: Fehler in Rule

Verfasst: 21. Mär 2020 09:38
von bastler
wie schon gesagt, wenn du die rules mal teilen könntest damit man wenigstens weiß von welchem der rules das problem kommt (und dieses dann nochmal postest) dann ist es auch leichter zu helfen.

Re: Fehler in Rule

Verfasst: 21. Mär 2020 10:58
von Boris099
Hallo, mal ne kleine Verständnisfrage

mit diesem rule, und dem received command sendet man einfach das erhaltene Signal also ON oder OFF?
So erspart man sich separate Anweisungen für ON oder OFF mit else?
Habe ich das richtig verstanden?

Code: Alles auswählen

rule "Weihnachtsbeleuchtung"
when
    Item all_weihnachtsbeleuchtung received command or
    Item all_weihnachtsbeleuchtung_prion_schalter received command
then
    smartplug1.sendCommand(receivedCommand)
    smartplug2.sendCommand(receivedCommand)
    smartplug3.sendCommand(receivedCommand)
    eg_wohnzimmer_stehlampe.sendCommand(receivedCommand)
end