- Platform information:
- Hardware: Vmware 4x Processors 2x core ea./4GB Ram/180GB HDD
- OS: CentOS7
- Java Runtime Environment: Latest JDK
- openHAB version: OpenHab 2 Repository Installed
- Issue of the topic: Error occuring while attempting to get get OH2 to talk to the EcoBee4
Good evening all,
I have searched the forum and am not finding a resolution to this issue. I believe I have all of the required steps completed but am still not having luck getting this to cooperate. Any assistance would be greatly appreciated.
I’ve removed the api key and my ecobee ID where noted but I do have the correct values set in the actual config files below.
The Offending Error:
2018-11-13 19:42:58.314 [ERROR] [org.apache.felix.configadmin ] - [org.osgi.service.event.EventHandler, org.osgi.service.cm.ManagedService, org.openhab.binding.ecobee.EcobeeActionProvider, id=316, bundle=201/mvn:org.openhab.binding/org.openhab.binding.ecobee/1.12.0]: Updating property ecobee of configuration org.openhab.ecobee caused a problem: the given configKey 'ecobee' is unknown
org.osgi.service.cm.ConfigurationException: ecobee : the given configKey 'ecobee' is unknown
at org.openhab.binding.ecobee.internal.EcobeeBinding.updated(EcobeeBinding.java:810) [201:org.openhab.binding.ecobee:1.12.0]
My ecobee.cfg (located at /etc/openhab2/services):
################################ Ecobee Binding #######################################
#
# the private API key issued be Ecobee to use the API (required, replace with your own)
appkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
# the application scope used when authorizing the binding
# choices are smartWrite,smartRead, or ems, or multiple (required, comma-separated, no spaces)
#scope=smartWrite
# Rate at which to check if poll is to run, in ms (optional, defaults to 5000)
#granularity=5000
# Data refresh interval in ms (optional, defaults to 180000)
#refresh=180000
# Time in ms to wait after successful update, command or action before refresh (optional, defaults to 6000)
#quickpoll=6000
# Time in ms to allow an API request to complete (optional, defaults to 20000)
#timeout=20000
# the temperature scale to use when sending or receiving temperatures
# optional, defaults to Fahrenheit (F)
#tempscale=F
My ecobee.sitemap (located at etc/openhab2/sitemaps):
sitemap ecobee label="Ecobee"
{
Frame label="Thermostat" {
Text item=lastModified
Text item=actualTemperature
Text item=actualHumidity
Switch item=hvacMode label="HVAC Mode" mappings=[heat=Heat,cool=Cool,auto=Auto,off=Off]
Text item=currentClimateRef
Switch item=desiredComf mappings=[sleep=Sleep,wakeup=Wake,home=Home,away=Away,smart6=Gym,resume=Resume]
Setpoint item=desiredTemp label="Temp [%.1f °F]" minValue=50 maxValue=80 step=1 visibility=[hvacMode==heat,hvacMode==cool]
Setpoint item=desiredHeat label="Heat [%.1f °F]" minValue=50 maxValue=80 step=1 visibility=[hvacMode==auto]
Setpoint item=desiredCool label="Cool [%.1f °F]" minValue=50 maxValue=80 step=1 visibility=[hvacMode==auto]
Switch item=desiredFan mappings=[on=On,auto=Auto] // for rule supported in 1.9
}
Frame label="Hall Sensors" {
Text item=hallTemperature
Text item=hallHumidity
Text item=hallOccupancy
}
Frame label="Living Room Sensors" {
Text item=livingRoomTemperature
Text item=livingRoomOccupancy
}
}
My ecobee.items (located at etc/openhab2/items/):
DateTime lastModified "last mod [%1$tH:%1$tM:%1$tS]" { ecobee="<[**Obfuscated**#lastModified]" }
Number actualTemperature "actual temp [%.1f °F]" { ecobee="<[**Obfuscated**#runtime.actualTemperature]" }
Number actualHumidity "actual hum [%d %%]" { ecobee="<[**Obfuscated**#runtime.actualHumidity]" }
String hvacMode "hvac mode [%s]" { ecobee="=[**Obfuscated**#settings.hvacMode]" }
String currentClimateRef "sched comf [%s]" { ecobee="<[**Obfuscated**#program.currentClimateRef]" }
String desiredComf "desired comf" { ecobee="<[**Obfuscated**#runningEvent.holdClimateRef]", autoupdate="false" }
Number desiredTemp "desired temp [%.1f °F]"
Number desiredHeat "desired heat [%.1f °F]" { ecobee="<[**Obfuscated**#runtime.desiredHeat]" }
Number desiredCool "desired cool [%.1f °F]" { ecobee="<[**Obfuscated**#runtime.desiredCool]" }
String desiredFan "desired fan mode [%s]" { ecobee="<[**Obfuscated**#runtime.desiredFanMode]" }
// Address the ecobee3 unit itself as a sensor, unlike remote sensors it also supports humidity:
Number hallTemperature "hall temp [%.1f °F]" { ecobee="<[**Obfuscated**#remoteSensors(Hall).capability(temperature).value]" }
Number hallHumidity "hall hum [%d %%]" { ecobee="<[**Obfuscated**#remoteSensors(Hall).capability(humidity).value]" }
Switch hallOccupancy "hall occ [%s]" { ecobee="<[**Obfuscated**#remoteSensors(Hall).capability(occupancy).value]" }
Number livingRoomTemperature "living rm temp [%.1f °F]" { ecobee="<[**Obfuscated**#remoteSensors(Living Room).capability(temperature).value]" }
Switch livingRoomOccupancy "living rm occ [%s]" { ecobee="<[**Obfuscated**#remoteSensors(Living Room).capability(occupancy).value]" }
My ecobee.rules (located in /etc/openhab2/rules/)
rule "Populate desiredTemp from desiredHeat"
when
Item desiredHeat received update
then
if (hvacMode.state.toString == "heat" && desiredHeat.state instanceof DecimalType) {
desiredTemp.postUpdate(desiredHeat.state)
}
end
rule "Populate desiredTemp from desiredCool"
when
Item desiredCool received update
then
if (hvacMode.state.toString == "cool" && desiredCool.state instanceof DecimalType) {
desiredTemp.postUpdate(desiredCool.state)
}
end
rule TempHold
when
Item desiredTemp received command
then
switch hvacMode.state.toString {
case "heat" : desiredHeat.sendCommand(receivedCommand)
case "cool" : desiredCool.sendCommand(receivedCommand)
case "auto" : logWarn("TempHold", "in auto mode, single setpoint ignored")
case "off" : logWarn("TempHold", "in off mode, single setpoint ignored")
}
end
rule HeatHold
when
Item desiredHeat received command
then
logInfo("HeatHold", "Setting heat setpoint to " + receivedCommand.toString)
val DecimalType desiredHeatTemp = receivedCommand as DecimalType
var DecimalType desiredCoolTemp
if (desiredCool.state instanceof DecimalType) {
desiredCoolTemp = desiredCool.state as DecimalType
} else {
desiredCoolTemp = new DecimalType(90)
}
ecobeeSetHold("**Obfuscated**", desiredCoolTemp, desiredHeatTemp, null, null, null, null, null)
end
rule CoolHold
when
Item desiredCool received command
then
logInfo("CoolHold", "Setting cool setpoint to " + receivedCommand.toString)
val DecimalType desiredCoolTemp = receivedCommand as DecimalType
var DecimalType desiredHeatTemp
if (desiredHeat.state instanceof DecimalType) {
desiredHeatTemp = desiredHeat.state as DecimalType
} else {
desiredHeatTemp = new DecimalType(50)
}
ecobeeSetHold("**Obfuscated**", desiredCoolTemp, desiredHeatTemp, null, null, null, null, null)
end
rule FanHold
when
Item desiredFan received command
then
logInfo("FanHold", "Setting fan hold to " + receivedCommand.toString)
val params = newLinkedHashMap(
'isTemperatureAbsolute'-> false,
'isTemperatureRelative' -> false,
'isCoolOff' -> true,
'isHeatOff' -> true,
'coolHoldTemp' -> 90,
'heatHoldTemp' -> 50,
'fan' -> receivedCommand.toString)
ecobeeSetHold("**Obfuscated**", params, null, null, null, null)
end
rule ComfortHold
when
Item desiredComf received command
then
if (receivedCommand.toString.equals("resume")) {
ecobeeResumeProgram("**Obfuscated**", true)
} else {
ecobeeSetHold("**Obfuscated**", null, null, receivedCommand.toString, null, null, null, null)
}
end