rule "Betriebsart Heizung 2"
when
System started or
//Member of gHeizBetriebsart or
Item Heizung_KanalA_Betriebsart changed or
Item Heizung_KanalB_Betriebsart changed or
Item Heizung_KanalC_Betriebsart changed or
Item Heizung_KanalD_Betriebsart changed or
Item Heizung_KanalE_Betriebsart changed or
Item Heizung_KanalF_Betriebsart changed or
Item Heizung_KanalG_Betriebsart changed or
Item Heizung_KanalH_Betriebsart changed
then
val betriebsart = triggeringItem
val switchkomfort = triggeringItem.name.substring(2) + "_Komfort"
val switchnacht = triggeringItem.name.substring(2) + "_Nacht"
val switchfrost = triggeringItem.name.substring(2) + "_Frost"
if (betriebsart.state.toString.contains("Frost")) {
logInfo("Heizung","Betriebsart Heizung ist in Frostschutz")
postUpdate(switchfrost, ON)
}
else{
if(betriebsart.state==1) {
switchkomfort.sendCommand(ON)
switchnacht.sendCommand(OFF)
switchfrost.sendCommand(OFF)}
else if(betriebsart.state==2) {
switchkomfort.sendCommand(OFF)
switchnacht.sendCommand(OFF)
switchfrost.sendCommand(OFF)}
else if(betriebsart.state==3) {
switchkomfort.sendCommand(OFF)
switchnacht.sendCommand(ON)
switchfrost.sendCommand(OFF)}
else if(betriebsart.state==4) {
switchkomfort.sendCommand(OFF)
switchnacht.sendCommand(OFF)
switchfrost.sendCommand(ON)}
}
end
I get this error on startup of the rule an when an item is triggered:
2018-11-15 22:58:43.609 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Betriebsart Heizung 2': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(java.lang.String,java.lang.String) on instance: null
I have no idea what the Problem is. I have tried to design this rule with different solutions from this forum. Additionally the rule is not triggered with the “Member of trigger”.
thanks for your support, but unfortunately the rule does not run correct. Still the error:
Error during the execution of startup rule 'Betriebsart Heizung 2': cannot invoke method public abstract java.lang.String org.eclipse.smarthome.core.items.Item.getName() on null
after loading the rule and when firering:
2018-11-16 10:19:40.774 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Betriebsart Heizung 2': The name 's' cannot be resolved to an item or type; line 38, column 54, length 1
2018-11-16 10:19:42.671 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Error during the execution of startup rule 'Betriebsart Heizung 2': cannot invoke method public abstract java.lang.String org.eclipse.smarthome.core.items.Item.getName() on null
I have no idea…. seems like there is someting with the s.lastIndexOf…… because VSCode highlighted the “s.” as undifined. what does the “s.” is for?
Actual rule design:
ule "Betriebsart Heizung 2"
when
System started or
//Member of gHeizBetriebsart or
Item Heizung_KanalA_Betriebsart changed or
Item Heizung_KanalB_Betriebsart changed or
Item Heizung_KanalC_Betriebsart changed or
Item Heizung_KanalD_Betriebsart changed or
Item Heizung_KanalE_Betriebsart changed or
Item Heizung_KanalF_Betriebsart changed or
Item Heizung_KanalG_Betriebsart changed or
Item Heizung_KanalH_Betriebsart changed
then
val betriebsart = triggeringItem
val switchkomfort = triggeringItem.name.substring(0, s.lastIndexOf("_")) + "_Komfort"
val switchnacht = triggeringItem.name.substring(0, s.lastIndexOf("_")) + "_Nacht"
val switchfrost = triggeringItem.name.substring(0, s.lastIndexOf("_")) + "_Frost"
logInfo("Heizung", "" +switchkomfort+ "")
if (betriebsart.state.toString.contains("Frost")) {
logInfo("Heizung","Betriebsart Heizung ist in Frostschutz")
postUpdate(switchfrost, "ON")
}
else{
if(betriebsart.state==1) {
sendCommand(switchkomfort, "ON")
sendCommand(switchnacht,"OFF")
sendCommand(switchfrost,"OFF")}
else if(betriebsart.state==2) {
sendCommand(switchkomfort, "OFF")
sendCommand(switchnacht,"OFF")
sendCommand(switchfrost,"OFF")}
else if(betriebsart.state==3) {
sendCommand(switchkomfort,"OFF")
sendCommand(switchnacht,"OFF")}
else if(betriebsart.state==4) {
sendCommand(switchkomfort, "OFF")
sendCommand(switchnacht,"OFF")
sendCommand(switchfrost,"ON")}
}
end
Try that.
I removed the betriebsart val. Not needed just use triggeringItem
I added the s variable definition
When you have cascading if like you have, it is clearer to use a switch case statement
rule "Betriebsart Heizung 2"
when
System started or
//Member of gHeizBetriebsart or
Item Heizung_KanalA_Betriebsart changed or
Item Heizung_KanalB_Betriebsart changed or
Item Heizung_KanalC_Betriebsart changed or
Item Heizung_KanalD_Betriebsart changed or
Item Heizung_KanalE_Betriebsart changed or
Item Heizung_KanalF_Betriebsart changed or
Item Heizung_KanalG_Betriebsart changed or
Item Heizung_KanalH_Betriebsart changed
then
val s = triggeringItem.name.toString
val switchkomfort = triggeringItem.name.substring(0, s.lastIndexOf("_")) + "_Komfort"
val switchnacht = triggeringItem.name.substring(0, s.lastIndexOf("_")) + "_Nacht"
val switchfrost = triggeringItem.name.substring(0, s.lastIndexOf("_")) + "_Frost"
logInfo("Heizung", "" + switchkomfort + "")
if (triggeringItem.state.toString.contains("Frost")) {
logInfo("Heizung","Betriebsart Heizung ist in Frostschutz")
postUpdate(switchfrost, "ON")
} else {
switch triggeringItem.state {
case 1 : {
sendCommand(switchkomfort, "ON")
sendCommand(switchnacht,"OFF")
sendCommand(switchfrost,"OFF") }
case 2 : {
sendCommand(switchkomfort, "OFF")
sendCommand(switchnacht,"OFF")
sendCommand(switchfrost,"OFF") }
case 3 : {
sendCommand(switchkomfort,"OFF")
sendCommand(switchnacht,"OFF") }
case 4 : {
sendCommand(switchkomfort, "OFF")
sendCommand(switchnacht,"OFF")
sendCommand(switchfrost,"ON") }
}
}
end
You can do some self-help here. Yo’ve identified the problem area, the log tells you it is not happy about ‘state’.
So we can see it’s something about diagnose
Let’s look back, what kind of thing is it? We defined it earlier on as a string.
Items have .state methods, but strings do not. So there’s the problem.
So what can we do? Well, if diagnose is already a string, we can take away the parts trying to make it into a string
if (diagnose.contains(“Frost”))