diff --git a/CODEOWNERS b/CODEOWNERS index 13b48f0bd423b..9e56bb4d5b467 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -164,6 +164,7 @@ /bundles/org.openhab.binding.powermax/ @lolodomo /bundles/org.openhab.binding.pulseaudio/ @peuter /bundles/org.openhab.binding.pushbullet/ @hakan42 +/bundles/org.openhab.binding.radiothermostat/ @mlobstein /bundles/org.openhab.binding.regoheatpump/ @crnjan /bundles/org.openhab.binding.rfxcom/ @martinvw @paulianttila /bundles/org.openhab.binding.rme/ @kgoderis diff --git a/bom/openhab-addons/pom.xml b/bom/openhab-addons/pom.xml index e8eec5fe346bf..263cd1c063409 100644 --- a/bom/openhab-addons/pom.xml +++ b/bom/openhab-addons/pom.xml @@ -809,6 +809,11 @@ org.openhab.binding.pushbullet ${project.version} + + org.openhab.addons.bundles + org.openhab.binding.radiothermostat + ${project.version} + org.openhab.addons.bundles org.openhab.binding.regoheatpump diff --git a/bundles/org.openhab.binding.radiothermostat/.classpath b/bundles/org.openhab.binding.radiothermostat/.classpath new file mode 100644 index 0000000000000..a5d95095ccaaf --- /dev/null +++ b/bundles/org.openhab.binding.radiothermostat/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.radiothermostat/.project b/bundles/org.openhab.binding.radiothermostat/.project new file mode 100644 index 0000000000000..6efb0cb2923e5 --- /dev/null +++ b/bundles/org.openhab.binding.radiothermostat/.project @@ -0,0 +1,23 @@ + + + org.openhab.binding.radiothermostat + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/bundles/org.openhab.binding.radiothermostat/NOTICE b/bundles/org.openhab.binding.radiothermostat/NOTICE new file mode 100644 index 0000000000000..38d625e349232 --- /dev/null +++ b/bundles/org.openhab.binding.radiothermostat/NOTICE @@ -0,0 +1,13 @@ +This content is produced and maintained by the openHAB project. + +* Project home: https://www.openhab.org + +== Declared Project Licenses + +This program and the accompanying materials are made available under the terms +of the Eclipse Public License 2.0 which is available at +https://www.eclipse.org/legal/epl-2.0/. + +== Source Code + +https://github.com/openhab/openhab-addons diff --git a/bundles/org.openhab.binding.radiothermostat/README.md b/bundles/org.openhab.binding.radiothermostat/README.md new file mode 100644 index 0000000000000..ab307b4cd4904 --- /dev/null +++ b/bundles/org.openhab.binding.radiothermostat/README.md @@ -0,0 +1,202 @@ +# RadioThermostat Binding + +This binding connects RadioThermostat/3M Filtrete models CT30, CT50/3M50, CT80, etc. with built-in Wi-Fi module to openHAB. + +The binding retrieves and periodically updates all basic system information from the thermostat. +The main thermostat functions such as thermostat mode, fan mode, temperature set point and hold mode can be controlled. +System run-time information and humidity readings are polled less frequently and can be disabled completely if not desired. +Humidity information is available only when using a CT80 thermostat and I have noticed that the humidity reported is very inaccurate. + +The main caveat for using this binding is to keep in mind that the web server in the thermostat is very slow. +Do not over load it with excessive amounts of simultaneous commands. +When changing the thermostat mode, the current temperature set point is cleared and a refresh of the thermostat data is done to get the new mode's set point. +Since retrieving the thermostat's data is the slowest operation, it will take several seconds after changing the mode before the new set point is displayed. +The 'Program Mode' command is untested and according to the published API is only available on a CT80 Rev B. + +## Supported Things + +There is exactly one supported thing type, which represents the thermostat. +It has the `rtherm` id. +Multiple Things can be added if more than one thermostat is to be controlled. + +## Discovery + +Auto-discovery is supported if the thermostat can be located on the local network using SSDP. +Otherwise the thing must be manually added. + +## Binding Configuration + +The binding has no configuration options, all configuration is done at Thing level. + +## Thing Configuration + +The thing has a few configuration parameters: + +| Parameter | Description | +|-----------------|-----------------------------------------------------------------------------------------------------------| +| hostName | The host name or IP address of the thermostat. Mandatory. | +| refresh | Overrides the refresh interval of the thermostat data. Optional, the default is 2 minutes. | +| logRefresh | Overrides the refresh interval of the run-time logs & humidity data. Optional, the default is 10 minutes. | +| isCT80 | Flag to enable additional features only available on the CT80 thermostat. Optional, the default is false. | +| disableLogs | Disable retrieval of run-time logs from the thermostat. Optional, the default is false. | + +## Channels + +The thermostat information that is retrieved is available as these channels: + +| Channel ID | Item Type | Description | +|------------------------|----------------------|---------------------------------------------------------------------------| +| temperature | Number:Temperature | The current temperature reading of the thermostat | +| humidity | Number:Dimensionless | The current humidity reading of the thermostat (CT80 only) | +| mode | Number | The current operating mode of the HVAC system | +| fan_mode | Number | The current operating mode of the fan | +| program_mode | Number | The program schedule that the thermostat is running (CT80 Rev B only) | +| set_point | Number:Temperature | The current temperature set point of the thermostat | +| status | Number | Indicates the current running status of the HVAC system | +| fan_status | Number | Indicates the current fan status of the HVAC system | +| override | Number | Indicates if the normal program set-point has been manually overridden | +| hold | Switch | Indicates if the current set point temperature is to be held indefinitely | +| day | Number | The current day of the week reported by the thermostat (0 = Monday) | +| hour | Number | The current hour of the day reported by the thermostat (24 hr) | +| minute | Number | The current minute past the hour reported by the thermostat | +| dt_stamp | String | The current day of the week and time reported by the thermostat (E HH:mm) | +| today_heat_runtime | Number:Time | The total number of minutes of heating run-time today | +| today_cool_runtime | Number:Time | The total number of minutes of cooling run-time today | +| yesterday_heat_runtime | Number:Time | The total number of minutes of heating run-time yesterday | +| yesterday_cool_runtime | Number:Time | The total number of minutes of cooling run-time yesterday | + +## Full Example + +radiotherm.map: + +```text +UNDEF_stus=- +NULL_stus=- +-_stus=- +0_stus=Off +1_stus=Heating +2_stus=Cooling +UNDEF_fstus=- +NULL_fstus=- +-_fstus=- +0_fstus=Off +1_fstus=On +UNDEF_mode=- +NULL_mode=- +-_mode=- +0_mode=Off +1_mode=Heat +2_mode=Cool +3_mode=Auto +UNDEF_fan=- +NULL_fan=- +-_fan=- +0_fan=Auto +1_fan=Auto/Circulate +2_fan=On +UNDEF_pgm=- +NULL_pgm=- +-_pgm=- +-1_pgm=None +0_pgm=Program A +1_pgm=Program B +2_pgm=Vacation +3_pgm=Holiday +UNDEF_over=- +NULL_over=- +-_over=- +0_over=No +1_over=Yes + +``` + +radiotherm.things: + +```java +radiothermostat:rtherm:mytherm1 "My 1st floor thermostat" [ hostName="192.168.10.1", refresh=2, logRefresh=10, isCT80=false, disableLogs=false ] +radiothermostat:rtherm:mytherm2 "My 2nd floor thermostat" [ hostName="mythermhost2", refresh=1, logRefresh=20, isCT80=true, disableLogs=false ] +``` + +radiotherm.items: + +```java +Number:Temperature Therm_Temp "Current Temperature [%.1f °F] " { channel="radiothermostat:rtherm:mytherm1:temperature" } +// Humidity only supported on CT80 +Number Therm_Hum "Current Humidity [%d %%]" { channel="radiothermostat:rtherm:mytherm1:humidity" } +Number Therm_Mode "Thermostat Mode [MAP(radiotherm.map):%s_mode]" { channel="radiothermostat:rtherm:mytherm1:mode" } +// The Auto/Circulate option will only appear for CT80 +Number Therm_Fmode "Fan Mode [MAP(radiotherm.map):%s_fan]" { channel="radiothermostat:rtherm:mytherm1:fan_mode" } +// Program Mode only supported on CT80 Rev B +Number Therm_Pmode "Program Mode [MAP(radiotherm.map):%s_pgm]" { channel="radiothermostat:rtherm:mytherm1:program_mode" } +Number:Temperature Therm_Setpt "Set Point [%d]" { channel="radiothermostat:rtherm:mytherm1:set_point" } +Number Therm_Status "Status [MAP(radiotherm.map):%s_stus]" { channel="radiothermostat:rtherm:mytherm1:status" } +Number Therm_FanStatus "Fan Status [MAP(radiotherm.map):%s_fstus]" { channel="radiothermostat:rtherm:mytherm1:fan_status" } +Number Therm_Override "Override [MAP(radiotherm.map):%s_over]" { channel="radiothermostat:rtherm:mytherm1:override" } +Switch Therm_Hold "Hold" { channel="radiothermostat:rtherm:mytherm1:hold" } + +Number Therm_Day "Thermostat Day [%s]" { channel="radiothermostat:rtherm:mytherm1:day" } +Number Therm_Hour "Thermostat Hour [%s]" { channel="radiothermostat:rtherm:mytherm1:hour" } +Number Therm_Minute "Thermostat Minute [%s]" { channel="radiothermostat:rtherm:mytherm1:minute" } +String Therm_Dstmp "Thermostat DateStamp [%s]"