[openthermgateway] Fix for #9205 incorrect control setpoint override (#9206)

* Initial attempt to resolve issue with flickering statuses when override
present on OTGW
* Update Units

Signed-off-by: James Melville <jamesmelville@gmail.com>
This commit is contained in:
James Melville 2020-12-08 01:03:40 +00:00 committed by GitHub
parent e19c16565d
commit 20e03c257a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 259 additions and 121 deletions

View File

@ -32,36 +32,40 @@ The configuration settings for the thing are Hostname/IP address and Port, which
The OpenTherm Gateway binding supports the following channels: The OpenTherm Gateway binding supports the following channels:
| Channel Type ID | Item Type | Description | Read Only | | Channel Type ID | Item Type | Description | Read Only |
|----------------------|-----------|----------------------------------------------------------|-----------| |--------------------------|----------------------|----------------------------------------------------------|-----------|
| roomtemp | Number | Current sensed room temperature | yes | | roomtemp | Number:Temperature | Current sensed room temperature | yes |
| roomsetpoint | Number | Current room temperature setpoint | yes | | roomsetpoint | Number:Temperature | Current room temperature setpoint | yes |
| temperaturetemporary | Number | Temporary override room temperature setpoint | no | | temperaturetemporary | Number:Temperature | Temporary override room temperature setpoint | no |
| temperatureconstant | Number | Constant override room temperature setpoint | no | | temperatureconstant | Number:Temperature | Constant override room temperature setpoint | no |
| controlsetpoint | Number | Central heating water setpoint | yes | | controlsetpoint | Number:Temperature | Central heating water setpoint set at boiler | yes |
| dhwtemp | Number | Domestic hot water temperature | yes | | controlsetpointrequested | Number:Temperature | Central heating water setpoint requested by thermostat | yes |
| tdhwset | Number | Domestic hot water temperature setpoint | yes | | controlsetpointoverride | Number:Temperature | Central heating water setpoint configured at gateway | no |
| overridedhwsetpoint | Number | Domestic hot water temperature setpoint override | no | | dhwtemp | Number:Temperature | Domestic hot water temperature | yes |
| flowtemp | Number | Boiler water temperature | yes | | tdhwset | Number:Temperature | Domestic hot water temperature setpoint | yes |
| returntemp | Number | Return water temperature | yes | | overridedhwsetpoint | Number:Temperature | Domestic hot water temperature setpoint override | no |
| outsidetemp | Number | Outside temperature | no | | flowtemp | Number:Temperature | Boiler water temperature | yes |
| waterpressure | Number | Central heating water pressure | yes | | returntemp | Number:Temperature | Return water temperature | yes |
| ch_enable | Switch | Central heating enabled | yes | | outsidetemp | Number:Temperature | Outside temperature | no |
| ch_mode | Switch | Central heating active | yes | | waterpressure | Number:Pressure | Central heating water pressure | yes |
| dhw_enable | Switch | Domestic hot water enabled | yes | | ch_enable | Switch | Central heating enabled set at boiler | yes |
| dhw_mode | Switch | Domestic hot water active | yes | | ch_enablerequested | Switch | Central heating enabled requested by thermostat | yes |
| flame | Switch | Burner active | yes | | ch_enableoverride | Switch | Central heating enabled overridden at gateway | yes |
| modulevel | Number | Relative modulation level | yes | | ch_mode | Switch | Central heating active | yes |
| maxrelmdulevel | Number | Maximum relative modulation level | yes | | dhw_enable | Switch | Domestic hot water enabled | yes |
| fault | Switch | Fault indication | yes | | dhw_mode | Switch | Domestic hot water active | yes |
| servicerequest | Switch | Service required | yes | | flame | Switch | Burner active | yes |
| lockout-reset | Switch | Lockout-reset enabled | yes | | modulevel | Number:Dimensionless | Relative modulation level | yes |
| lowwaterpress | Switch | Low water pressure fault | yes | | maxrelmdulevel | Number:Dimensionless | Maximum relative modulation level | yes |
| gasflamefault | Switch | Gas or flame fault | yes | | fault | Switch | Fault indication | yes |
| airpressfault | Switch | Air pressure fault | yes | | servicerequest | Switch | Service required | yes |
| waterovtemp | Switch | Water over-temperature fault | yes | | lockout-reset | Switch | Lockout-reset enabled | yes |
| oemfaultcode | Switch | OEM fault code | yes | | lowwaterpress | Switch | Low water pressure fault | yes |
| sendcommand | Text | Channel to send commands to the OpenTherm Gateway device | no | | gasflamefault | Switch | Gas or flame fault | yes |
| airpressfault | Switch | Air pressure fault | yes |
| waterovtemp | Switch | Water over-temperature fault | yes |
| oemfaultcode | Switch | OEM fault code | yes |
| sendcommand | Text | Channel to send commands to the OpenTherm Gateway device | no |
## Full Example ## Full Example
@ -74,25 +78,29 @@ Thing openthermgateway:otgw:1 [ ipaddress="192.168.1.100", port=8000, connection
### demo.items ### demo.items
``` ```
Number RoomTemperature "Room temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:roomtemp" } Number:Temperature RoomTemperature "Room temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:roomtemp" }
Number RoomSetpoint "Room setpoint [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:roomsetpoint" } Number:Temperature RoomSetpoint "Room setpoint [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:roomsetpoint" }
Number TemporaryRoomSetpointOverride "Temporary room setpoint override [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:temperaturetemporary" } Number:Temperature TemporaryRoomSetpointOverride "Temporary room setpoint override [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:temperaturetemporary" }
Number ConstantRoomSetpointOverride "Constant room setpoint override [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:temperatureconstant" } Number:Temperature ConstantRoomSetpointOverride "Constant room setpoint override [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:temperatureconstant" }
Number ControlSetpoint "Control setpoint [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:controlsetpoint" } Number:Temperature ControlSetpoint "Control setpoint [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:controlsetpoint" }
Number DomesticHotWaterTemperature "Domestic hot water temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:dhwtemp" } Number:Temperature ControlSetpointRequested "Control setpoint requested [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:controlsetpointrequested" }
Number DomesticHotWaterSetpoint "Domestic hot water setpoint [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:tdhwset" } Number:Temperature ControlSetpointOverride "Control setpoint override [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:controlsetpointoverride" }
Number DomesticHotWaterSetpointOverride "Domestic hot water setpoint override [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:overridedhwsetpoint" } Number:Temperature DomesticHotWaterTemperature "Domestic hot water temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:dhwtemp" }
Number BoilerWaterTemperature "Boiler water temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:flowtemp" } Number:Temperature DomesticHotWaterSetpoint "Domestic hot water setpoint [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:tdhwset" }
Number ReturnWaterTemperature "Return water temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:returntemp" } Number:Temperature DomesticHotWaterSetpointOverride "Domestic hot water setpoint override [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:overridedhwsetpoint" }
Number OutsideTemperature "Outside temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:outsidetemp" } Number:Temperature BoilerWaterTemperature "Boiler water temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:flowtemp" }
Number CentralHeatingWaterPressure "Central heating water pressure [%.1f bar]" { channel="openthermgateway:otgw:1:waterpressure" } Number:Temperature ReturnWaterTemperature "Return water temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:returntemp" }
Number:Temperature OutsideTemperature "Outside temperature [%.1f °C]" <temperature> { channel="openthermgateway:otgw:1:outsidetemp" }
Number:Pressure CentralHeatingWaterPressure "Central heating water pressure [%.1f bar]" { channel="openthermgateway:otgw:1:waterpressure" }
Switch CentralHeatingEnabled "Central heating enabled" <switch> { channel="openthermgateway:otgw:1:ch_enable" } Switch CentralHeatingEnabled "Central heating enabled" <switch> { channel="openthermgateway:otgw:1:ch_enable" }
Switch CentralHeatingEnabledRequested "Central heating enabled requested" <switch> { channel="openthermgateway:otgw:1:ch_enablerequested" }
Switch CentralHeatingEnabledOverride "Central heating enabled override" <switch> { channel="openthermgateway:otgw:1:ch_enableoverride" }
Switch CentralHeatingActive "Central heating active" <switch> { channel="openthermgateway:otgw:1:ch_mode" } Switch CentralHeatingActive "Central heating active" <switch> { channel="openthermgateway:otgw:1:ch_mode" }
Switch DomesticHotWaterEnabled "Domestic hot water enabled" <switch> { channel="openthermgateway:otgw:1:dhw_enable" } Switch DomesticHotWaterEnabled "Domestic hot water enabled" <switch> { channel="openthermgateway:otgw:1:dhw_enable" }
Switch DomesticHotWaterActive "Domestic hot water active" <switch> { channel="openthermgateway:otgw:1:dhw_mode" } Switch DomesticHotWaterActive "Domestic hot water active" <switch> { channel="openthermgateway:otgw:1:dhw_mode" }
Switch BurnerActive "Burner active" <switch> { channel="openthermgateway:otgw:1:flame" } Switch BurnerActive "Burner active" <switch> { channel="openthermgateway:otgw:1:flame" }
Number RelativeModulationLevel "Relative modulation level [%.1f %%]" { channel="openthermgateway:otgw:1:modulevel" } Number:Dimensionless RelativeModulationLevel "Relative modulation level [%.1f %%]" { channel="openthermgateway:otgw:1:modulevel" }
Number MaximumRelativeModulationLevel "Maximum relative modulation level [%.1f %%]" { channel="openthermgateway:otgw:1:maxrelmdulevel" } Number:Dimensionless MaximumRelativeModulationLevel "Maximum relative modulation level [%.1f %%]" { channel="openthermgateway:otgw:1:maxrelmdulevel" }
Switch Fault "Fault indication" <switch> { channel="openthermgateway:otgw:1:fault" } Switch Fault "Fault indication" <switch> { channel="openthermgateway:otgw:1:fault" }
Switch ServiceRequest "Service required" <switch> { channel="openthermgateway:otgw:1:servicerequest" } Switch ServiceRequest "Service required" <switch> { channel="openthermgateway:otgw:1:servicerequest" }
Switch LockoutReset "Lockout-reset" <switch> { channel="openthermgateway:otgw:1:lockout-reset" } Switch LockoutReset "Lockout-reset" <switch> { channel="openthermgateway:otgw:1:lockout-reset" }
@ -114,6 +122,8 @@ sitemap demo label="Main Menu" {
Setpoint item="TemporaryRoomSetpointOverride" icon="temperature" label="Temporary room setpoint override [%.1f °C]" minValue="0" maxValue="30" step="0.1" Setpoint item="TemporaryRoomSetpointOverride" icon="temperature" label="Temporary room setpoint override [%.1f °C]" minValue="0" maxValue="30" step="0.1"
Setpoint item="ConstantRoomSetpointOverride" icon="temperature" label="Constant room setpoint override [%.1f °C]" minValue="0" maxValue="30" step="0.1" Setpoint item="ConstantRoomSetpointOverride" icon="temperature" label="Constant room setpoint override [%.1f °C]" minValue="0" maxValue="30" step="0.1"
Text item="ControlSetpoint" icon="temperature" label="Control setpoint [%.1f °C]" Text item="ControlSetpoint" icon="temperature" label="Control setpoint [%.1f °C]"
Text item="ControlSetpointRequested" icon="temperature" label="Control setpoint requested [%.1f °C]"
Setpoint item="ControlSetpointOverride" icon="temperature" label="Control setpoint override [%.1f °C]" minValue="0" maxValue="100" step="1"
Text item="DomesticHotWaterTemperature" icon="temperature" label="Domestic hot water temperature [%.1f °C]" Text item="DomesticHotWaterTemperature" icon="temperature" label="Domestic hot water temperature [%.1f °C]"
Text item="DomesticHotWaterSetpoint" icon="temperature" label="Domestic hot water setpoint [%.1f °C]" Text item="DomesticHotWaterSetpoint" icon="temperature" label="Domestic hot water setpoint [%.1f °C]"
Setpoint item="DomesticHotWaterSetpointOverride" icon="temperature" label="Domestic hot water setpoint override [%.1f °C]" minValue="0" maxValue="100" step="0.1" Setpoint item="DomesticHotWaterSetpointOverride" icon="temperature" label="Domestic hot water setpoint override [%.1f °C]" minValue="0" maxValue="100" step="0.1"
@ -122,6 +132,8 @@ sitemap demo label="Main Menu" {
Setpoint item="OutsideTemperature" icon="temperature" label="Outside temperature [%.1f °C]" minValue="-40" maxValue="100" step="0.1" Setpoint item="OutsideTemperature" icon="temperature" label="Outside temperature [%.1f °C]" minValue="-40" maxValue="100" step="0.1"
Text item="CentralHeatingWaterPressure" icon="" label="Central heating water pressure [%.1f bar]" Text item="CentralHeatingWaterPressure" icon="" label="Central heating water pressure [%.1f bar]"
Switch item="CentralHeatingEnabled" icon="switch" label="Central heating enabled" Switch item="CentralHeatingEnabled" icon="switch" label="Central heating enabled"
Switch item="CentralHeatingEnabledRequested" icon="switch" label="Central heating enabled requested"
Switch item="CentralHeatingEnabledOverride" icon="switch" label="Central heating enabled override"
Switch item="CentralHeatingActive" icon="switch" label="Central heating active" Switch item="CentralHeatingActive" icon="switch" label="Central heating active"
Switch item="DomesticHotWaterEnabled" icon="switch" label="Domestic hot water enabled" Switch item="DomesticHotWaterEnabled" icon="switch" label="Domestic hot water enabled"
Switch item="DomesticHotWaterActive" icon="switch" label="Domestic hot water active" Switch item="DomesticHotWaterActive" icon="switch" label="Domestic hot water active"

View File

@ -46,8 +46,12 @@ public class OpenThermGatewayBindingConstants {
public static final String CHANNEL_RETURN_TEMPERATURE = "returntemp"; public static final String CHANNEL_RETURN_TEMPERATURE = "returntemp";
public static final String CHANNEL_OUTSIDE_TEMPERATURE = "outsidetemp"; public static final String CHANNEL_OUTSIDE_TEMPERATURE = "outsidetemp";
public static final String CHANNEL_CENTRAL_HEATING_WATER_SETPOINT = "controlsetpoint"; public static final String CHANNEL_CENTRAL_HEATING_WATER_SETPOINT = "controlsetpoint";
public static final String CHANNEL_REQUESTED_CENTRAL_HEATING_WATER_SETPOINT = "controlsetpointrequested";
public static final String CHANNEL_OVERRIDE_CENTRAL_HEATING_WATER_SETPOINT = "controlsetpointoverride";
public static final String CHANNEL_CENTRAL_HEATING_WATER_PRESSURE = "waterpressure"; public static final String CHANNEL_CENTRAL_HEATING_WATER_PRESSURE = "waterpressure";
public static final String CHANNEL_CENTRAL_HEATING_ENABLED = "ch_enable"; public static final String CHANNEL_CENTRAL_HEATING_ENABLED = "ch_enable";
public static final String CHANNEL_REQUESTED_CENTRAL_HEATING_ENABLED = "ch_enablerequested";
public static final String CHANNEL_OVERRIDE_CENTRAL_HEATING_ENABLED = "ch_enableoverride";
public static final String CHANNEL_CENTRAL_HEATING_MODE = "ch_mode"; public static final String CHANNEL_CENTRAL_HEATING_MODE = "ch_mode";
public static final String CHANNEL_DOMESTIC_HOT_WATER_TEMPERATURE = "dhwtemp"; public static final String CHANNEL_DOMESTIC_HOT_WATER_TEMPERATURE = "dhwtemp";
public static final String CHANNEL_DOMESTIC_HOT_WATER_ENABLED = "dhw_enable"; public static final String CHANNEL_DOMESTIC_HOT_WATER_ENABLED = "dhw_enable";
@ -68,8 +72,10 @@ public class OpenThermGatewayBindingConstants {
public static final Set<String> SUPPORTED_CHANNEL_IDS = Collections public static final Set<String> SUPPORTED_CHANNEL_IDS = Collections
.unmodifiableSet(Stream.of(CHANNEL_ROOM_TEMPERATURE, CHANNEL_ROOM_SETPOINT, CHANNEL_FLOW_TEMPERATURE, .unmodifiableSet(Stream.of(CHANNEL_ROOM_TEMPERATURE, CHANNEL_ROOM_SETPOINT, CHANNEL_FLOW_TEMPERATURE,
CHANNEL_RETURN_TEMPERATURE, CHANNEL_OUTSIDE_TEMPERATURE, CHANNEL_CENTRAL_HEATING_WATER_PRESSURE, CHANNEL_RETURN_TEMPERATURE, CHANNEL_OUTSIDE_TEMPERATURE, CHANNEL_CENTRAL_HEATING_WATER_PRESSURE,
CHANNEL_CENTRAL_HEATING_ENABLED, CHANNEL_CENTRAL_HEATING_MODE, CHANNEL_CENTRAL_HEATING_ENABLED, CHANNEL_REQUESTED_CENTRAL_HEATING_ENABLED,
CHANNEL_CENTRAL_HEATING_WATER_SETPOINT, CHANNEL_DOMESTIC_HOT_WATER_TEMPERATURE, CHANNEL_OVERRIDE_CENTRAL_HEATING_ENABLED, CHANNEL_CENTRAL_HEATING_MODE,
CHANNEL_CENTRAL_HEATING_WATER_SETPOINT, CHANNEL_REQUESTED_CENTRAL_HEATING_WATER_SETPOINT,
CHANNEL_OVERRIDE_CENTRAL_HEATING_WATER_SETPOINT, CHANNEL_DOMESTIC_HOT_WATER_TEMPERATURE,
CHANNEL_DOMESTIC_HOT_WATER_ENABLED, CHANNEL_DOMESTIC_HOT_WATER_MODE, CHANNEL_DOMESTIC_HOT_WATER_ENABLED, CHANNEL_DOMESTIC_HOT_WATER_MODE,
CHANNEL_DOMESTIC_HOT_WATER_SETPOINT, CHANNEL_FLAME, CHANNEL_RELATIVE_MODULATION_LEVEL, CHANNEL_DOMESTIC_HOT_WATER_SETPOINT, CHANNEL_FLAME, CHANNEL_RELATIVE_MODULATION_LEVEL,
CHANNEL_MAXIMUM_MODULATION_LEVEL, CHANNEL_FAULT, CHANNEL_SERVICEREQUEST, CHANNEL_REMOTE_RESET, CHANNEL_MAXIMUM_MODULATION_LEVEL, CHANNEL_FAULT, CHANNEL_SERVICEREQUEST, CHANNEL_REMOTE_RESET,

View File

@ -40,6 +40,7 @@ import org.openhab.core.thing.binding.BaseThingHandler;
import org.openhab.core.types.Command; import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType; import org.openhab.core.types.RefreshType;
import org.openhab.core.types.State; import org.openhab.core.types.State;
import org.openhab.core.types.UnDefType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -87,6 +88,10 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
GatewayCommand gatewayCommand = null; GatewayCommand gatewayCommand = null;
if (command instanceof OnOffType) {
OnOffType onOff = (OnOffType) command;
gatewayCommand = GatewayCommand.parse(code, onOff == OnOffType.ON ? "1" : "0");
}
if (command instanceof QuantityType<?>) { if (command instanceof QuantityType<?>) {
QuantityType<?> quantityType = ((QuantityType<?>) command).toUnit(SIUnits.CELSIUS); QuantityType<?> quantityType = ((QuantityType<?>) command).toUnit(SIUnits.CELSIUS);
@ -106,6 +111,16 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
if (conn != null) { if (conn != null) {
conn.sendCommand(gatewayCommand); conn.sendCommand(gatewayCommand);
if (code == GatewayCommandCode.ControlSetpoint) {
if (gatewayCommand.getMessage().equals("0.0")) {
updateState(
OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_CENTRAL_HEATING_WATER_SETPOINT,
UnDefType.UNDEF);
}
updateState(OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_CENTRAL_HEATING_ENABLED,
OnOffType.from(!gatewayCommand.getMessage().equals("0.0")));
}
} }
} }
} }
@ -153,7 +168,8 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
for (DataItem dataItem : dataItems) { for (DataItem dataItem : dataItems) {
String channelId = dataItem.getSubject(); String channelId = dataItem.getSubject();
if (!OpenThermGatewayBindingConstants.SUPPORTED_CHANNEL_IDS.contains(channelId)) { if (!OpenThermGatewayBindingConstants.SUPPORTED_CHANNEL_IDS.contains(channelId)
|| (dataItem.getFilteredCode() != null && dataItem.getFilteredCode() != message.getCode())) {
continue; continue;
} }
@ -264,6 +280,10 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
return GatewayCommandCode.TemperatureOutside; return GatewayCommandCode.TemperatureOutside;
case OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_DHW_SETPOINT: case OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_DHW_SETPOINT:
return GatewayCommandCode.SetpointWater; return GatewayCommandCode.SetpointWater;
case OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_CENTRAL_HEATING_WATER_SETPOINT:
return GatewayCommandCode.ControlSetpoint;
case OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_CENTRAL_HEATING_ENABLED:
return GatewayCommandCode.CentralHeating;
case OpenThermGatewayBindingConstants.CHANNEL_SEND_COMMAND: case OpenThermGatewayBindingConstants.CHANNEL_SEND_COMMAND:
return null; return null;
default: default:

View File

@ -0,0 +1,49 @@
/**
* Copyright (c) 2010-2020 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.openthermgateway.internal;
/**
* The {@link CodeType} field is not part of OpenTherm specification, but added by OpenTherm Gateway.
* It can be any of the following:
*
* T: Message received from the thermostat
* B: Message received from the boiler
* R: Request sent to the boiler
* A: Response returned to the thermostat
* E: Parity or stop bit error
*
* @author Arjen Korevaar - Initial contribution
* @author James Melville - Introduced code filtering functionality
*/
public enum CodeType {
/**
* Message received from the thermostat
*/
T,
/**
* Message received from the boiler
*/
B,
/**
* Request sent to the boiler from OTGW, only present if value modified by OTGW
*/
R,
/**
* Response returned to the thermostat from OTGW, only present if value modified by OTGW
*/
A,
/**
* Parity or stop bit error
*/
E
}

View File

@ -31,6 +31,7 @@ public class DataItem {
private int bitpos; private int bitpos;
private String subject; private String subject;
private @Nullable Unit<?> unit; private @Nullable Unit<?> unit;
private @Nullable CodeType filteredCode;
public int getID() { public int getID() {
return id; return id;
@ -60,17 +61,32 @@ public class DataItem {
return unit; return unit;
} }
public @Nullable CodeType getFilteredCode() {
return filteredCode;
}
public DataItem(int id, Msg msg, ByteType byteType, DataType dataType, int bit, String subject) { public DataItem(int id, Msg msg, ByteType byteType, DataType dataType, int bit, String subject) {
this(id, msg, byteType, dataType, bit, subject, null, null);
}
public DataItem(int id, Msg msg, ByteType byteType, DataType dataType, int bit, String subject, Unit<?> unit) {
this(id, msg, byteType, dataType, bit, subject, unit, null);
}
public DataItem(int id, Msg msg, ByteType byteType, DataType dataType, int bit, String subject,
CodeType filteredCode) {
this(id, msg, byteType, dataType, bit, subject, null, filteredCode);
}
public DataItem(int id, Msg msg, ByteType byteType, DataType dataType, int bit, String subject,
@Nullable Unit<?> unit, @Nullable CodeType filteredCode) {
this.id = id; this.id = id;
this.msg = msg; this.msg = msg;
this.byteType = byteType; this.byteType = byteType;
this.dataType = dataType; this.dataType = dataType;
this.bitpos = bit; this.bitpos = bit;
this.subject = subject; this.subject = subject;
}
public DataItem(int id, Msg msg, ByteType byteType, DataType dataType, int bit, String subject, Unit<?> unit) {
this(id, msg, byteType, dataType, bit, subject);
this.unit = unit; this.unit = unit;
this.filteredCode = filteredCode;
} }
} }

View File

@ -17,6 +17,7 @@ import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.library.unit.SIUnits; import org.openhab.core.library.unit.SIUnits;
import org.openhab.core.library.unit.Units;
/** /**
* The {@link DataItemGroup} represents a list of all possible DataItem messages within the OpenTherm specification. * The {@link DataItemGroup} represents a list of all possible DataItem messages within the OpenTherm specification.
@ -31,24 +32,32 @@ public class DataItemGroup {
private static Map<Integer, DataItem[]> createDataItemGroups() { private static Map<Integer, DataItem[]> createDataItemGroups() {
HashMap<Integer, DataItem[]> g = new HashMap<>(); HashMap<Integer, DataItem[]> g = new HashMap<>();
g.put(0, new DataItem[] { new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 0, "ch_enable"), g.put(0, new DataItem[] {
new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 1, "dhw_enable"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 0, "ch_enable", CodeType.B),
new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 2, "cooling_enabled"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 0, "ch_enablerequested", CodeType.T),
new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 3, "otc_active"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 0, "ch_enableoverride", CodeType.R),
new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 4, "ch2_enable"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 1, "dhw_enable", CodeType.B),
new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 5, "0x00:5"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 2, "cooling_enabled", CodeType.B),
new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 6, "0x00:6"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 3, "otc_active", CodeType.B),
new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 7, "0x00:7"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 4, "ch2_enable", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 0, "fault"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 5, "0x00:5", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 1, "ch_mode"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 6, "0x00:6", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 2, "dhw_mode"), new DataItem(0, Msg.READ, ByteType.HIGHBYTE, DataType.FLAGS, 7, "0x00:7", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 3, "flame"), new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 0, "fault", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 4, "cooling"), new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 1, "ch_mode", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 5, "ch2E"), new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 2, "dhw_mode", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 6, "diag"), new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 3, "flame", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 7, "0x00:7") }); new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 4, "cooling", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 5, "ch2E", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 6, "diag", CodeType.B),
new DataItem(0, Msg.READ, ByteType.LOWBYTE, DataType.FLAGS, 7, "0x00:7", CodeType.B) });
g.put(1, new DataItem[] { g.put(1, new DataItem[] {
new DataItem(1, Msg.WRITE, ByteType.BOTH, DataType.FLOAT, 0, "controlsetpoint", SIUnits.CELSIUS) }); new DataItem(1, Msg.WRITE, ByteType.BOTH, DataType.FLOAT, 0, "controlsetpoint", SIUnits.CELSIUS,
CodeType.B),
new DataItem(1, Msg.WRITE, ByteType.BOTH, DataType.FLOAT, 0, "controlsetpointrequested",
SIUnits.CELSIUS, CodeType.T),
new DataItem(1, Msg.WRITE, ByteType.BOTH, DataType.FLOAT, 0, "controlsetpointoverride", SIUnits.CELSIUS,
CodeType.R) });
g.put(2, new DataItem[] { new DataItem(2, Msg.WRITE, ByteType.HIGHBYTE, DataType.FLAGS, 0, "0x02:0"), g.put(2, new DataItem[] { new DataItem(2, Msg.WRITE, ByteType.HIGHBYTE, DataType.FLAGS, 0, "0x02:0"),
new DataItem(2, Msg.WRITE, ByteType.HIGHBYTE, DataType.FLAGS, 1, "0x02:1"), new DataItem(2, Msg.WRITE, ByteType.HIGHBYTE, DataType.FLAGS, 1, "0x02:1"),
new DataItem(2, Msg.WRITE, ByteType.HIGHBYTE, DataType.FLAGS, 2, "0x02:2"), new DataItem(2, Msg.WRITE, ByteType.HIGHBYTE, DataType.FLAGS, 2, "0x02:2"),
@ -105,13 +114,16 @@ public class DataItemGroup {
new DataItem(12, Msg.READ, ByteType.LOWBYTE, DataType.UINT8, 0, "0x0c:l") }); new DataItem(12, Msg.READ, ByteType.LOWBYTE, DataType.UINT8, 0, "0x0c:l") });
g.put(13, new DataItem[] { new DataItem(13, Msg.READ, ByteType.HIGHBYTE, DataType.UINT8, 0, "0x0d:h"), g.put(13, new DataItem[] { new DataItem(13, Msg.READ, ByteType.HIGHBYTE, DataType.UINT8, 0, "0x0d:h"),
new DataItem(13, Msg.READ, ByteType.LOWBYTE, DataType.UINT8, 0, "0x0d:l") }); new DataItem(13, Msg.READ, ByteType.LOWBYTE, DataType.UINT8, 0, "0x0d:l") });
g.put(14, new DataItem[] { new DataItem(14, Msg.READ, ByteType.LOWBYTE, DataType.FLOAT, 0, "maxrelmdulevel") }); g.put(14, new DataItem[] {
new DataItem(14, Msg.READ, ByteType.LOWBYTE, DataType.FLOAT, 0, "maxrelmdulevel", Units.PERCENT) });
g.put(15, new DataItem[] { new DataItem(15, Msg.READ, ByteType.HIGHBYTE, DataType.UINT8, 0, "maxcapkw"), g.put(15, new DataItem[] { new DataItem(15, Msg.READ, ByteType.HIGHBYTE, DataType.UINT8, 0, "maxcapkw"),
new DataItem(15, Msg.READ, ByteType.LOWBYTE, DataType.UINT8, 0, "maxcapprc") }); new DataItem(15, Msg.READ, ByteType.LOWBYTE, DataType.UINT8, 0, "maxcapprc") });
g.put(16, new DataItem[] { g.put(16, new DataItem[] {
new DataItem(16, Msg.WRITE, ByteType.BOTH, DataType.FLOAT, 0, "roomsetpoint", SIUnits.CELSIUS) }); new DataItem(16, Msg.WRITE, ByteType.BOTH, DataType.FLOAT, 0, "roomsetpoint", SIUnits.CELSIUS) });
g.put(17, new DataItem[] { new DataItem(17, Msg.READ, ByteType.BOTH, DataType.FLOAT, 0, "modulevel") }); g.put(17, new DataItem[] {
g.put(18, new DataItem[] { new DataItem(18, Msg.READ, ByteType.BOTH, DataType.FLOAT, 0, "waterpressure") }); new DataItem(17, Msg.READ, ByteType.BOTH, DataType.FLOAT, 0, "modulevel", Units.PERCENT) });
g.put(18, new DataItem[] {
new DataItem(18, Msg.READ, ByteType.BOTH, DataType.FLOAT, 0, "waterpressure", Units.BAR) });
g.put(19, new DataItem[] { new DataItem(19, Msg.READ, ByteType.BOTH, DataType.FLOAT, 0, "dhwflow") }); g.put(19, new DataItem[] { new DataItem(19, Msg.READ, ByteType.BOTH, DataType.FLOAT, 0, "dhwflow") });
g.put(20, new DataItem[] { new DataItem(20, Msg.READWRITE, ByteType.BOTH, DataType.DOWTOD, 0, "dowtod") }); g.put(20, new DataItem[] { new DataItem(20, Msg.READWRITE, ByteType.BOTH, DataType.DOWTOD, 0, "dowtod") });
g.put(21, new DataItem[] { new DataItem(21, Msg.READWRITE, ByteType.HIGHBYTE, DataType.UINT8, 0, "month"), g.put(21, new DataItem[] { new DataItem(21, Msg.READWRITE, ByteType.HIGHBYTE, DataType.UINT8, 0, "month"),

View File

@ -27,22 +27,12 @@ public class Message {
private static final Pattern messagePattern = Pattern.compile("[TBRA]{1}[A-F0-9]{8}"); private static final Pattern messagePattern = Pattern.compile("[TBRA]{1}[A-F0-9]{8}");
/* private CodeType code;
* The code field is not part of OpenTherm specification, but added by OpenTherm Gateway.
* It can be any of the following:
*
* T: Message received from the thermostat
* B: Message received from the boiler
* R: Request sent to the boiler
* A: Response returned to the thermostat
* E: Parity or stop bit error
*/
private String code;
private MessageType messageType; private MessageType messageType;
private int id; private int id;
private String data; private String data;
public String getCode() { public CodeType getCode() {
return this.code; return this.code;
} }
@ -139,8 +129,7 @@ public class Message {
// If the message is a Request sent to the boiler or an Answer returned to the // If the message is a Request sent to the boiler or an Answer returned to the
// thermostat, and it's ID is equal to the previous message, then this is an // thermostat, and it's ID is equal to the previous message, then this is an
// override sent by the OpenTherm Gateway // override sent by the OpenTherm Gateway
return other != null && this.getID() == other.getID() return other != null && this.getID() == other.getID() && (this.code == CodeType.R || this.code == CodeType.A);
&& ("R".equals(this.getCode()) || "A".equals(this.getCode()));
} }
@Override @Override
@ -148,7 +137,7 @@ public class Message {
return String.format("%s - %s - %s", this.code, this.id, this.data); return String.format("%s - %s - %s", this.code, this.id, this.data);
} }
public Message(String code, MessageType messageType, int id, String data) { public Message(CodeType code, MessageType messageType, int id, String data) {
this.code = code; this.code = code;
this.messageType = messageType; this.messageType = messageType;
this.id = id; this.id = id;
@ -158,7 +147,7 @@ public class Message {
public static @Nullable Message parse(String message) { public static @Nullable Message parse(String message) {
if (messagePattern.matcher(message).matches()) { if (messagePattern.matcher(message).matches()) {
// For now, only parse TBRA codes // For now, only parse TBRA codes
String code = message.substring(0, 1); CodeType code = CodeType.valueOf(message.substring(0, 1));
MessageType messageType = getMessageType(message.substring(1, 3)); MessageType messageType = getMessageType(message.substring(1, 3));
int id = Integer.valueOf(message.substring(3, 5), 16); int id = Integer.valueOf(message.substring(3, 5), 16);
String data = message.substring(5); String data = message.substring(5);

View File

@ -208,7 +208,8 @@ public class OpenThermGatewaySocketConnector implements OpenThermGatewayConnecto
} }
} }
if (msg.getMessageType() == MessageType.READACK || msg.getMessageType() == MessageType.WRITEDATA) { if (msg.getMessageType() == MessageType.READACK || msg.getMessageType() == MessageType.WRITEDATA
|| msg.getID() == 0 || msg.getID() == 1) {
receiveMessage(msg); receiveMessage(msg);
} }
} }

View File

@ -9,7 +9,7 @@
<label>Room Temperature</label> <label>Room Temperature</label>
<description>Current sensed room temperature</description> <description>Current sensed room temperature</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"></state> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="roomsetpoint"> <channel-type id="roomsetpoint">
@ -17,7 +17,7 @@
<label>Room Setpoint</label> <label>Room Setpoint</label>
<description>Current room temperature setpoint</description> <description>Current room temperature setpoint</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"></state> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="temperaturetemporary"> <channel-type id="temperaturetemporary">
@ -25,7 +25,7 @@
<label>Temporary Room Setpoint Override</label> <label>Temporary Room Setpoint Override</label>
<description>Temporary override room temperature setpoint</description> <description>Temporary override room temperature setpoint</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="false" min="0" max="30" step="0.1" pattern="%.1f %unit%"></state> <state readOnly="false" min="0" max="30" step="0.1" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="temperatureconstant"> <channel-type id="temperatureconstant">
@ -33,15 +33,31 @@
<label>Constant Room Setpoint Override</label> <label>Constant Room Setpoint Override</label>
<description>Constant override room temperature setpoint</description> <description>Constant override room temperature setpoint</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="false" min="0" max="30" step="0.1" pattern="%.1f %unit%"></state> <state readOnly="false" min="0" max="30" step="0.1" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="controlsetpoint"> <channel-type id="controlsetpoint">
<item-type>Number:Temperature</item-type> <item-type>Number:Temperature</item-type>
<label>Control Setpoint</label> <label>Control Setpoint</label>
<description>Central heating water setpoint</description> <description>Central heating water setpoint set at boiler</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"></state> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="controlsetpointrequested">
<item-type>Number:Temperature</item-type>
<label>Control Setpoint Requested</label>
<description>Central heating water setpoint requested by Thermostat</description>
<category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"/>
</channel-type>
<channel-type id="controlsetpointoverride">
<item-type>Number:Temperature</item-type>
<label>Control Setpoint Override</label>
<description>Central heating water setpoint configured on OTGW</description>
<category>Temperature</category>
<state readOnly="false" min="0" max="100" step="0.1" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="dhwtemp"> <channel-type id="dhwtemp">
@ -49,7 +65,7 @@
<label>Domestic Hot Water Temperature</label> <label>Domestic Hot Water Temperature</label>
<description>Domestic hot water temperature</description> <description>Domestic hot water temperature</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"></state> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="tdhwset"> <channel-type id="tdhwset">
@ -57,7 +73,7 @@
<label>Domestic Hot Water Setpoint</label> <label>Domestic Hot Water Setpoint</label>
<description>Domestic hot water temperature setpoint</description> <description>Domestic hot water temperature setpoint</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"></state> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="overridedhwsetpoint"> <channel-type id="overridedhwsetpoint">
@ -65,7 +81,7 @@
<label>Domestic Hot Water Setpoint Override</label> <label>Domestic Hot Water Setpoint Override</label>
<description>Domestic hot water temperature setpoint override</description> <description>Domestic hot water temperature setpoint override</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="false" min="0" max="100" step="0.1" pattern="%.1f %unit%"></state> <state readOnly="false" min="0" max="100" step="0.1" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="flowtemp"> <channel-type id="flowtemp">
@ -73,7 +89,7 @@
<label>Boiler Water Temperature</label> <label>Boiler Water Temperature</label>
<description>Boiler water temperature</description> <description>Boiler water temperature</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"></state> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="returntemp"> <channel-type id="returntemp">
@ -81,7 +97,7 @@
<label>Return Water Temperature</label> <label>Return Water Temperature</label>
<description>Return water temperature</description> <description>Return water temperature</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"></state> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="outsidetemp"> <channel-type id="outsidetemp">
@ -89,126 +105,139 @@
<label>Outside Temperature</label> <label>Outside Temperature</label>
<description>Outside temperature</description> <description>Outside temperature</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="false" min="-40" max="100" step="0.1" pattern="%.1f %unit%"></state> <state readOnly="false" min="-40" max="100" step="0.1" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
<channel-type id="waterpressure"> <channel-type id="waterpressure">
<item-type>Number:Dimensionless</item-type> <item-type>Number:Dimensionless</item-type>
<label>Central Heating Water Pressure</label> <label>Central Heating Water Pressure</label>
<description>Central heating water pressure</description> <description>Central heating water pressure</description>
<state readOnly="true" pattern="%.1f bar"></state> <state readOnly="true" pattern="%.1f bar"/>
</channel-type> </channel-type>
<channel-type id="ch_enable"> <channel-type id="ch_enable">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Central Heating Enabled</label> <label>Central Heating Enabled</label>
<description>Central heating enabled</description> <description>Central heating enabled set at boiler</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type>
<channel-type id="ch_enablerequested">
<item-type>Switch</item-type>
<label>Central Heating Enabled Thermostat</label>
<description>Central heating enabled requested by thermostat</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="ch_enableoverride">
<item-type>Switch</item-type>
<label>Central Heating Overridden</label>
<description>Central heating enabled overridden at OTGW</description>
</channel-type> </channel-type>
<channel-type id="ch_mode"> <channel-type id="ch_mode">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Central Heating Active</label> <label>Central Heating Active</label>
<description>Central heating active</description> <description>Central heating active</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="dhw_enable"> <channel-type id="dhw_enable">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Domestic Hot Water Enabled</label> <label>Domestic Hot Water Enabled</label>
<description>Domestic hot water enabled</description> <description>Domestic hot water enabled</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="dhw_mode"> <channel-type id="dhw_mode">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Domestic Hot Water Active</label> <label>Domestic Hot Water Active</label>
<description>Domestic hot water active</description> <description>Domestic hot water active</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="flame"> <channel-type id="flame">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Burner Active</label> <label>Burner Active</label>
<description>Burner active</description> <description>Burner active</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="modulevel"> <channel-type id="modulevel">
<item-type>Number:Dimensionless</item-type> <item-type>Number:Dimensionless</item-type>
<label>Relative Modulation Level</label> <label>Relative Modulation Level</label>
<description>Relative modulation level</description> <description>Relative modulation level</description>
<state readOnly="true" pattern="%.1f %%"></state> <state readOnly="true" pattern="%.1f %%"/>
</channel-type> </channel-type>
<channel-type id="maxrelmdulevel"> <channel-type id="maxrelmdulevel">
<item-type>Number:Dimensionless</item-type> <item-type>Number:Dimensionless</item-type>
<label>Maximum Relative Modulation Level</label> <label>Maximum Relative Modulation Level</label>
<description>Maximum relative modulation level</description> <description>Maximum relative modulation level</description>
<state readOnly="true" pattern="%.1f %%"></state> <state readOnly="true" pattern="%.1f %%"/>
</channel-type> </channel-type>
<channel-type id="fault"> <channel-type id="fault">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Fault Indication</label> <label>Fault Indication</label>
<description>Fault indication</description> <description>Fault indication</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="servicerequest"> <channel-type id="servicerequest">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Service Required</label> <label>Service Required</label>
<description>Service required</description> <description>Service required</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="lockout-reset"> <channel-type id="lockout-reset">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Lockout-Reset Enabled</label> <label>Lockout-Reset Enabled</label>
<description>Lockout-reset enabled</description> <description>Lockout-reset enabled</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="lowwaterpress"> <channel-type id="lowwaterpress">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Low Water Pressure Fault</label> <label>Low Water Pressure Fault</label>
<description>Low water pressure fault</description> <description>Low water pressure fault</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="gasflamefault"> <channel-type id="gasflamefault">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Gas Or Flame Fault</label> <label>Gas Or Flame Fault</label>
<description>Gas or flame fault</description> <description>Gas or flame fault</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="airpressfault"> <channel-type id="airpressfault">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Air Pressure Fault</label> <label>Air Pressure Fault</label>
<description>Air pressure fault</description> <description>Air pressure fault</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="waterovtemp"> <channel-type id="waterovtemp">
<item-type>Switch</item-type> <item-type>Switch</item-type>
<label>Water Over-Temperature Fault</label> <label>Water Over-Temperature Fault</label>
<description>Water over-temperature fault</description> <description>Water over-temperature fault</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="oemfaultcode"> <channel-type id="oemfaultcode">
<item-type>Number:Dimensionless</item-type> <item-type>Number:Dimensionless</item-type>
<label>OEM Fault Code</label> <label>OEM Fault Code</label>
<description>OEM fault code</description> <description>OEM fault code</description>
<state readOnly="true"></state> <state readOnly="true"/>
</channel-type> </channel-type>
<channel-type id="sendcommand"> <channel-type id="sendcommand">
<item-type>String</item-type> <item-type>String</item-type>
<label>Send Command</label> <label>Send Command</label>
<description>Channel to send commands to the OpenTherm Gateway device</description> <description>Channel to send commands to the OpenTherm Gateway device</description>
<state readOnly="false"></state> <state readOnly="false"/>
</channel-type> </channel-type>
</thing:thing-descriptions> </thing:thing-descriptions>

View File

@ -12,6 +12,8 @@
<channel id="temperaturetemporary" typeId="temperaturetemporary"/> <channel id="temperaturetemporary" typeId="temperaturetemporary"/>
<channel id="temperatureconstant" typeId="temperatureconstant"/> <channel id="temperatureconstant" typeId="temperatureconstant"/>
<channel id="controlsetpoint" typeId="controlsetpoint"/> <channel id="controlsetpoint" typeId="controlsetpoint"/>
<channel id="controlsetpointrequested" typeId="controlsetpointrequested"/>
<channel id="controlsetpointoverride" typeId="controlsetpointoverride"/>
<channel id="dhwtemp" typeId="dhwtemp"/> <channel id="dhwtemp" typeId="dhwtemp"/>
<channel id="tdhwset" typeId="tdhwset"/> <channel id="tdhwset" typeId="tdhwset"/>
<channel id="overridedhwsetpoint" typeId="overridedhwsetpoint"/> <channel id="overridedhwsetpoint" typeId="overridedhwsetpoint"/>
@ -20,6 +22,8 @@
<channel id="outsidetemp" typeId="outsidetemp"/> <channel id="outsidetemp" typeId="outsidetemp"/>
<channel id="waterpressure" typeId="waterpressure"/> <channel id="waterpressure" typeId="waterpressure"/>
<channel id="ch_enable" typeId="ch_enable"/> <channel id="ch_enable" typeId="ch_enable"/>
<channel id="ch_enablerequested" typeId="ch_enablerequested"/>
<channel id="ch_enableoverride" typeId="ch_enableoverride"/>
<channel id="ch_mode" typeId="ch_mode"/> <channel id="ch_mode" typeId="ch_mode"/>
<channel id="dhw_enable" typeId="dhw_enable"/> <channel id="dhw_enable" typeId="dhw_enable"/>
<channel id="dhw_mode" typeId="dhw_mode"/> <channel id="dhw_mode" typeId="dhw_mode"/>