rule "heating mode"
when
Item BF_Cinema_Mode changed or
Item BF_Cinema_ModeFake
then
if (triggeringItem.name.contains("Fake")) {
BF_Cinema_Mode.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
} else {
BF_Cinema_ModeFake.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
}
end
Put all the items in the same group, for example: gThermostats
Then the rule is:
import org.eclipse.smarthome.model.script.ScriptServiceUtil //AT THE VERY TOP OF THE RULES FILES!!
rule "heating mode"
when
Member of gThermostats changed
then
if (triggeringItem.name.contains("Fake")) {
val realItem = ScriptServiceUtil.getItemRegistry.getItem(triggeringItem.name.toString.replace("_Fake", ""))
realItem.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
} else {
val fakeItem = ScriptServiceUtil.getItemRegistry.getItem(triggeringItem.name.toString + "Fake")
fakeItem.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
}
end
2019-02-23 17:40:50.267 [WARN ] [rthome.model.script.actions.BusEvent] - Cannot convert ‘AUTOMATIC’ to a state type which item ‘BF_Cinema_ModeFake’ accepts: [DecimalType, QuantityType, UnDefType].
when
Item BF_Cinema_Mode changed or
Item BF_Cinema_ModeFake changed
then
if (triggeringItem.name.contains("Fake")) {
BF_Cinema_Mode.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
}
else {
BF_Cinema_ModeFake.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
}
end
Compared to your suggestion, I added one “changed” in the rule after the OR
I also installed the MAP binding (not sure if it is needed).
I am wondering if I need the homematic binding too?
When I tried that, I got stuck in a long list of things changing (rather than the item triggering the change):
019-02-24 01:59:51.477 [vent.ItemStateChangedEvent] - FF_Bath_ModeFake changed from AUTOMATIC to heatcool
2019-02-24 01:59:51.479 [vent.ItemStateChangedEvent] - FF_MasterBedroom_ModeFake changed from heatcool to AUTOMATIC
2019-02-24 01:59:51.499 [vent.ItemStateChangedEvent] - FF_MasterBedroom_ModeFake changed from AUTOMATIC to heatcool
I made “Mode_Fake” and “Mode” part of the same group.
But I need a way of changing Mode, when Mode_Fake receives a command (because that would be triggered by via google home).
But I need a way of changing Mode_Fake, when Mode changes (because that would be triggered by sitemap)
Solved it by waiting for “received command” rather than state change:
import org.eclipse.smarthome.model.script.ScriptServiceUtil //AT THE VERY TOP OF THE RULES FILES!!
rule "heating mode"
when
Member of gThermo received command
then
if (triggeringItem.name.contains("Fake")) {
val realItem = ScriptServiceUtil.getItemRegistry.getItem(triggeringItem.name.toString.replace("_Fake", ""))
realItem.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
} else {
val fakeItem = ScriptServiceUtil.getItemRegistry.getItem(triggeringItem.name.toString + "Fake")
fakeItem.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
}
end
2019-02-24 02:41:02.619 [ome.event.ItemCommandEvent] - Item ‘GF_Toilet_Mode’ received command MANUAL
2019-02-24 02:41:02.634 [nt.ItemStatePredictedEvent] - GF_Toilet_Mode predicted to become MANUAL
2019-02-24 02:41:02.640 [vent.ItemStateChangedEvent] - GF_Toilet_Mode changed from AUTOMATIC to MANUAL
2019-02-24 02:41:02.713 [vent.ItemStateChangedEvent] - GF_Toilet_ModeFake changed from NULL to heatcool
2019-02-24 02:41:37.828 [ome.event.ItemCommandEvent] - Item ‘GF_Toilet_ModeFake’ received command heat
2019-02-24 02:41:37.846 [vent.ItemStateChangedEvent] - GF_Toilet_ModeFake changed from heatcool to heat
2019-02-24 02:41:37.857 [vent.ItemStateChangedEvent] - GF_Toilet_ModeFake changed from heat to BOOST
rule "heating mode"
when
Member of gThermo received command
then
if (triggeringItem.name.contains("Fake")) {
val realItem = ScriptServiceUtil.getItemRegistry.getItem(triggeringItem.name.toString.replace("**Fake**", ""))
realItem.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
} else {
val fakeItem = ScriptServiceUtil.getItemRegistry.getItem(triggeringItem.name.toString + "Fake")
fakeItem.postUpdate(transform("MAP", "heatingmode.map", triggeringItem.state.toString))
}
end
The bolded “Fake” was previously “_Fake”.
But no impact.