# Helios easyControls
Helios Heat-Recovery Ventilation devices use a Modbus protocol to communicate with different sensors, switches, etc. Some devices come with an integrated web interface (easyControls) as well as a Modbus TCP/IP Gateway.
-See https://www.easycontrols.net/de/service/downloads/send/4-software/16-modbus-dokumentation-f%C3%BCr-kwl-easycontrols-ger%C3%A4te for the corresponding specification.
+See the corresponding [specification](https://www.easycontrols.net/de/service/downloads/send/4-software/16-modbus-dokumentation-f%C3%BCr-kwl-easycontrols-ger%C3%A4te).
## Supported Things
| operatingHoursNhz | general | Operating hours afterheater (in minutes) (0 - 2^32-1 min) | Number:Time | R |
| outputPowerVhz | general | Output power of preheater (in percent) (0 - 2^32-1 %) | Number:Dimensionless | R |
| outputPowerNhz | general | Output power of afterheater (in percent) (0 - 2^32-1 %) | Number:Dimensionless | R |
-| errors | general | Errors as integer value (0 - 2^32-1) | Number | R |
-| warnings | general | Warnings as integer value (0 - 2^32-1) | Number | R |
-| infos | general | Infos as integer value (0 - 2^32-1) | Number | R |
-| noOfErrors | general | Number of bit-coded errors (0 - 32) | Number | R |
-| noOfWarnings | general | Number of bit-coded warnings (0 - 8) | Number | R |
-| noOfInfos | general | Number of bit-coded infos (0 - 8) | Number | R |
-| errorsMsg | general | Errors as string | String | R |
-| warningsMsg | general | Warnings as string | String | R |
-| infosMsg | general | Infos as string | String | R |
-| statusFlags | general | Status flags | String | R |
+| errors | general | Errors as integer value (see [Errors / Warnings / Infos](#errors-warnings-infos)) (0 - 2^32-1) | Number | R |
+| warnings | general | Warnings as integer value (see [Errors / Warnings / Infos](#errors-warnings-infos)) (0 - 2^32-1) | Number | R |
+| infos | general | Infos as integer value (see [Errors / Warnings / Infos](#errors-warnings-infos)) (0 - 2^32-1) | Number | R |
+| noOfErrors | general | Number of bit-coded errors (see [Errors / Warnings / Infos](#errors-warnings-infos)) (0 - 32) | Number | R |
+| noOfWarnings | general | Number of bit-coded warnings (see [Errors / Warnings / Infos](#errors-warnings-infos)) (0 - 8) | Number | R |
+| noOfInfos | general | Number of bit-coded infos (see [Errors / Warnings / Infos](#errors-warnings-infos)) (0 - 8) | Number | R |
+| errorsMsg | general | Errors as string (see [Errors / Warnings / Infos](#errors-warnings-infos)) | String | R |
+| warningsMsg | general | Warnings as string (see [Errors / Warnings / Infos](#errors-warnings-infos)) | String | R |
+| infosMsg | general | Infos as string (see [Errors / Warnings / Infos](#errors-warnings-infos)) | String | R |
+| statusFlags | general | Status flags (see [Errors / Warnings / Infos](#errors-warnings-infos)) | String | R |
| bypassStatus | general | Status of the bypass (OFF = closed, ON = open) | Switch | R |
| bypassFrom | unitConfig | Bypass active from | DateTime | RW |
| bypassTo | unitConfig | Bypass active to | DateTime | RW |
```
*Parameters:*
+
* *day:* The day from when the bypass should be active
* *month:* The month from when the bypass should be active
```
*Parameters:*
+
* *day:* The day until when the bypass should be active
* *month:* The month until when the bypass should be active
+```
+public Map<String, Object> getErrorMessages()
+```
+
+*Return values:*
+
+* *errorMessages:* A `List<String>` object containing all error messages
+
+
+```
+public Map<String, Object> getWarningMessages()
+```
+
+*Return values:*
+
+* *warningMessages:* A `List<String>` object containing all warning messages
+
+
+```
+public Map<String, Object> getInfoMessages()
+```
+
+*Return values:*
+
+* *infoMessages:* A `List<String>` object containing all info messages
+
+
+```
+public Map<String, Object> getStatusMessages()
+```
+
+*Return values:*
+
+* *statusMessages:* A `List<String>` object containing all status messages
+
+
+```
+public Map<String, Object> getMessages()
+```
+
+*Return values:*
+
+* *errorMessages:* A `List<String>` object containing all error messages
+* *warningMessages:* A `List<String>` object containing all warning messages
+* *infoMessages:* A `List<String>` object containing all info messages
+* *statusMessages:* A `List<String>` object containing all status messages
+
+
## Properties
The binding provides the following properties:
| sensorConfigKwlFtf8 | Sensor configuration (installed or not) KWL-FTF 8 (OFF = no sensor, ON = sensor installed) |
+## Errors / Warnings / Infos
+
+Errors, warnings and infos of the device are provided in a bit encoded way. I.e. each bit in a 8 bit or 32 bit variable encodes potentially multiple errors, warnings or infos.
+Also status flags are provided this way. For details please refer to the manufacturer's [specification](https://www.easycontrols.net/de/service/downloads/send/4-software/16-modbus-dokumentation-f%C3%BCr-kwl-easycontrols-ger%C3%A4te).
+
+Based on that concept, errors, warnings and infos are provided in 3 different ways:
+
+* As an unsigned integer value with the decimal representation of the encoded bits
+* The total number of encoded errors, warning or infos
+* The bit encoded as a string
+
+Since there can potentially be several errors, warnings or infos, using a simple MAP to display the corresponding message in a UI will not work in all cases. String items with multiple lines will not display properly in the UIs.
+Therefore the binding provides actions to retrieve the different messages as an `ArrayList<String>` object which can then be used to e.g. send the messages via email.
+
+
## Full Example
### Thing Configuration
```
// Manual operation
-Number KWL_Manual "Manual operation" <fan> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#operatingMode"}
-Number KWL_Stage "KWL fan stage" <fan> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#fanStage"}
-Number:Dimensionless KWL_Stage_Percent "KWL fan stage [%d %unit%]" <fan> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#percentageFanStage"}
+Number KWL_Manual "Manual operation" <fan> (gKWL) ["Control"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#operatingMode"}
+Number KWL_Stage "KWL fan stage" <fan> (gKWL) ["Setpoint", "Level"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#fanStage"}
+Number:Dimensionless KWL_Stage_Percent "KWL fan stage [%d %unit%]" <fan> (gKWL) ["Status", "Level"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#percentageFanStage"}
// Party mode
-Switch KWL_Party_Mode "Party mode" <parents> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeStatus"}
-Number:Time KWL_Party_Mode_Duration "Party mode duration [%d %unit%]" <clock> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeDuration"}
-Number KWL_Party_Mode_Stage "Party mode fan stage" <fan> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeFanStage"}
-Number:Time KWL_Party_Mode_Remaining "Party mode remaining time [%d %unit%]" <clock> (gKWL) {channel="modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#partyModeRemainingTime"}
+Switch KWL_Party_Mode "Party mode" <parents> (gKWL) ["Control"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeStatus"}
+Number:Time KWL_Party_Mode_Duration "Party mode duration [%d %unit%]" <clock> (gKWL) ["Setpoint", "Duration"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeDuration"}
+Number KWL_Party_Mode_Stage "Party mode fan stage" <fan> (gKWL) ["Setpoint", "Level"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeFanStage"}
+Number:Time KWL_Party_Mode_Remaining "Party mode remaining time [%d %unit%]" <clock> (gKWL) ["Status", "Duration"] {channel="modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#partyModeRemainingTime"}
// Standby mode
-Switch KWL_Standby_Mode "Standby mode" <fan_off> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeStatus"}
-Number:Time KWL_Standby_Mode_Duration "Standby mode duration [%d %unit%]" <clock> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeDuration"}
-Number KWL_Standby_Mode_Stage "Standby mode fan stage" <fan> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeFanStage"}
-Number:Time KWL_Standby_Mode_Remaining "Standby mode remaining time [%d %unit%]" <clock> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeRemainingTime"}
+Switch KWL_Standby_Mode "Standby mode" <fan_off> (gKWL) ["Control"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeStatus"}
+Number:Time KWL_Standby_Mode_Duration "Standby mode duration [%d %unit%]" <clock> (gKWL) ["Setpoint", "Duration"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeDuration"}
+Number KWL_Standby_Mode_Stage "Standby mode fan stage" <fan> (gKWL) ["Setpoint", "Level"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeFanStage"}
+Number:Time KWL_Standby_Mode_Remaining "Standby mode remaining time [%d %unit%]" <clock> (gKWL) ["Status", "Duration"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeRemainingTime"}
// Status infos
-Number:Temperature KWL_Temp_Outide_Air "Temperature outside air [%.1f °C]" <temperature> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureOutsideAir"}
-Number:Temperature KWL_Temp_Supply_Air "Temperature supply air [%.1f °C]" <temperature> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureSupplyAir"}
-Number:Temperature KWL_Temp_Outgoing_Air "Temperature outgoing air [%.1f °C]" <temperature> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureOutgoingAir"}
-Number:Temperature KWL_Temp_Extract_Air "Temperature extract air [%.1f °C]" <temperature> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureExtractAir"}
-Number KWL_Supply_Air_RPM "RPM supply air [%d]" <fan> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#supplyAirRpm"}
-Number KWL_Extract_Air_RPM "RPM extract air [%d]" <fan> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#extractAirRpm"}
-Number KWL_Filter_Change "Filter change [MAP(helios_yes_no.map):%s]" <none> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:unitConfig#filterChange"}
-Number:Time KWL_Filter_Change_Remaining "Filter change [%d %unit%]" <clock> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#filterChangeRemainingTime"}
-
-Number KWL_Errors "Number errors [%d]" <error> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfErrors"}
-String KWL_Errors_String "Error messages [%s]" <error> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#errorsMsg"}
-Number KWL_Warnings "Number warnings [%d]" <warning> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfWarnings"}
-String KWL_Warnings_String "Warning messages [%s]" <warning> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#warningsMsg"}
-Number KWL_Infos "Number infos [%d]" <info> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfInfos"}
-String KWL_Infos_String "Info messages [%s]" <info> (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#infosMsg"}
+Number:Temperature KWL_Temp_Outide_Air "Temperature outside air [%.1f °C]" <temperature> (gKWL) ["Measurement", "Temperature"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureOutsideAir"}
+Number:Temperature KWL_Temp_Supply_Air "Temperature supply air [%.1f °C]" <temperature> (gKWL) ["Measurement", "Temperature"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureSupplyAir"}
+Number:Temperature KWL_Temp_Outgoing_Air "Temperature outgoing air [%.1f °C]" <temperature> (gKWL) ["Measurement", "Temperature"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureOutgoingAir"}
+Number:Temperature KWL_Temp_Extract_Air "Temperature extract air [%.1f °C]" <temperature> (gKWL) ["Measurement", "Temperature"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureExtractAir"}
+Number KWL_Supply_Air_RPM "RPM supply air [%d]" <fan> (gKWL) ["Measurement", "Property"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#supplyAirRpm"}
+Number KWL_Extract_Air_RPM "RPM extract air [%d]" <fan> (gKWL) ["Measurement", "Property"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#extractAirRpm"}
+Number KWL_Filter_Change "Filter change [MAP(helios_yes_no.map):%s]" <none> (gKWL) ["Status"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:unitConfig#filterChange"}
+Number:Time KWL_Filter_Change_Remaining "Filter change [%d %unit%]" <clock> (gKWL) ["Status", "Duration"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#filterChangeRemainingTime"}
+
+Number KWL_Errors "Number errors [%d]" <error> (gKWL) ["Status"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfErrors"}
+String KWL_Errors_String "Error messages [%s]" <error> (gKWL) ["Status"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#errorsMsg"}
+Number KWL_Warnings "Number warnings [%d]" <warning> (gKWL) ["Status"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfWarnings"}
+String KWL_Warnings_String "Warning messages [%s]" <warning> (gKWL) ["Status"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#warningsMsg"}
+Number KWL_Infos "Number infos [%d]" <info> (gKWL) ["Status"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfInfos"}
+String KWL_Infos_String "Info messages [%s]" <info> (gKWL) ["Status"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#infosMsg"}
+String KWL_Status_Flags "Status Flags [%s]" <info> (gKWL) ["Status"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#statusFlags"}
```
### Rule
```
-rule "Rest filter change remaining time"
+import java.util.List
+import java.util.Map
+
+rule "Reset filter change remaining time"
when
Item Rem_KWL_Filter received command OFF
then
val kwlActions = getActions("modbus.helioseasycontrols", "modbus:helios-easycontrols:modbus-gateway:kwl")
kwlActions.resetFilterChangeTimer()
end
+
+
+rule "Log KWL messages"
+ when
+ Item KWL_Errors_String changed or
+ Item KWL_Warnings_String changed or
+ Item KWL_Infos_String changed or
+ KWL_Status_Flags changed
+ then
+ val kwlActions = getActions("modbus.helioseasycontrols", "modbus:helios-easycontrols:modbus-gateway:kwl")
+ val Map<String, List<String>> msg = kwlActions.getMessages
+ logInfo("KWL Error Messages", msg.get("errorMessages").toString)
+ logInfo("KWL Warning Messages", msg.get("warningMessages").toString)
+ logInfo("KWL Info Messages", msg.get("infoMessages").toString)
+ logInfo("KWL Status Messages", msg.get("statusMessages").toString)
+end
+
```
### Transformation
*/
package org.openhab.binding.modbus.helioseasycontrols.internal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.annotation.ActionInput;
+import org.openhab.core.automation.annotation.ActionOutput;
import org.openhab.core.automation.annotation.RuleAction;
import org.openhab.core.thing.binding.ThingActions;
import org.openhab.core.thing.binding.ThingActionsScope;
private void triggerSwitch(String variableName) {
try {
if (handler != null) {
+
handler.writeValue(variableName, "1");
}
} catch (HeliosException e) {
logger.warn("Error executing action triggering switch for variable {}: {}", variableName, e.getMessage());
+ } catch (InterruptedException e) {
+ logger.debug(
+ "{} encountered Exception when trying to lock Semaphore for writing variable {} to the device: {}",
+ HeliosEasyControlsActions.class.getSimpleName(), variableName, e.getMessage());
}
}
- @RuleAction(label = "reset filter change timer", description = "Sets the filter change timer back to the configured interval.")
+ @RuleAction(label = "@text/action.resetFilterChangeTimer.label", description = "@text/action.resetFilterChangeTimer.description")
public void resetFilterChangeTimer() {
triggerSwitch(HeliosEasyControlsBindingConstants.FILTER_CHANGE_RESET);
}
((HeliosEasyControlsActions) actions).resetFilterChangeTimer();
}
- @RuleAction(label = "reset error messages", description = "Reset error/warning/info messages.")
+ @RuleAction(label = "@text/action.resetErrors.label", description = "@text/action.resetErrors.description")
public void resetErrors() {
triggerSwitch(HeliosEasyControlsBindingConstants.RESET_FLAG);
}
((HeliosEasyControlsActions) actions).resetErrors();
}
- @RuleAction(label = "reset to factory defaults", description = "Reset device to factory defaults.")
+ @RuleAction(label = "@text/action.resetToFactoryDefaults.label", description = "@text/action.resetToFactoryDefaults.description")
public void resetToFactoryDefaults() {
triggerSwitch(HeliosEasyControlsBindingConstants.FACTORY_RESET);
}
((HeliosEasyControlsActions) actions).resetToFactoryDefaults();
}
- @RuleAction(label = "reset individual switching times", description = "Reset individual switching times.")
+ @RuleAction(label = "@text/action.resetSwitchingTimes.label", description = "@text/action.resetSwitchingTimes.description")
public void resetSwitchingTimes() {
triggerSwitch(HeliosEasyControlsBindingConstants.FACTORY_SETTING_WZU);
}
((HeliosEasyControlsActions) actions).resetSwitchingTimes();
}
- @RuleAction(label = "set system date and time", description = "Sets the device's system date and time based on OH's system date and time.")
+ @RuleAction(label = "@text/action.setSysDateTime.label", description = "@text/action.setSysDateTime.description")
public void setSysDateTime() {
HeliosEasyControlsHandler handler = this.handler;
if (handler != null) {
- handler.setSysDateTime();
+ try {
+ handler.setSysDateTime();
+ } catch (InterruptedException e) {
+ logger.debug(
+ "{} encountered Exception when trying to lock Semaphore for setting system date and time on the device: {}",
+ HeliosEasyControlsActions.class.getSimpleName(), e.getMessage());
+ }
}
}
private void setBypass(boolean from, int day, int month) {
HeliosEasyControlsHandler handler = this.handler;
if (handler != null) {
- handler.setBypass(from, day, month);
+ try {
+ handler.setBypass(from, day, month);
+ } catch (InterruptedException e) {
+ logger.debug(
+ "{} encountered Exception when trying to lock Semaphore for setting bypass date on the device: {}",
+ HeliosEasyControlsActions.class.getSimpleName(), e.getMessage());
+ }
}
}
- @RuleAction(label = "set the bypass from day and month", description = "Sets the day and month from when the bypass should be active.")
+ @RuleAction(label = "@text/action.setBypassFrom.label", description = "@text/action.setBypassFrom.description")
public void setBypassFrom(
- @ActionInput(name = "day", label = "bypass from day", description = "The day from when the bypass should be active") int day,
- @ActionInput(name = "month", label = "bypass from month", description = "The month from when the bypass should be active") int month) {
+ @ActionInput(name = "day", label = "@text/action.setBypassFrom.inputParams.day.label", description = "@text/action.setBypassFrom.inputParams.day.description") int day,
+ @ActionInput(name = "month", label = "@text/action.setBypassFrom.inputParams.month.label", description = "@text/action.setBypassFrom.inputParams.month.description") int month) {
setBypass(true, day, month);
}
((HeliosEasyControlsActions) actions).setBypassFrom(day, month);
}
- @RuleAction(label = "set the bypass to day and month", description = "Sets the day and month until when the bypass should be active.")
+ @RuleAction(label = "@text/action.setBypassTo.label", description = "@text/action.setBypassTo.description")
public void setBypassTo(
- @ActionInput(name = "day", label = "bypass to day", description = "The day until when the bypass should be active") int day,
- @ActionInput(name = "month", label = "bypass to month", description = "The month until when the bypass should be active") int month) {
+ @ActionInput(name = "day", label = "@text/action.setBypassTo.inputParams.day.label", description = "@text/action.setBypassTo.inputParams.day.description") int day,
+ @ActionInput(name = "month", label = "@text/action.setBypassTo.inputParams.day.label", description = "@text/action.setBypassTo.inputParams.day.description") int month) {
setBypass(false, day, month);
}
public static void setBypassTo(ThingActions actions, int day, int month) {
((HeliosEasyControlsActions) actions).setBypassTo(day, month);
}
+
+ @RuleAction(label = "@text/action.getErrorMessages.label", description = "@text/action.getErrorMessages.description")
+ public @ActionOutput(name = "errorMessages", type = "java.util.List<String>") List<String> getErrorMessages() {
+ return (handler != null) ? handler.getErrorMessages() : new ArrayList<String>();
+ }
+
+ public static List<String> getErrorMessages(ThingActions actions) {
+ return ((HeliosEasyControlsActions) actions).getErrorMessages();
+ }
+
+ @RuleAction(label = "@text/action.getWarningMessages.label", description = "@text/action.getWarningMessages.description")
+ public @ActionOutput(name = "warningMessages", type = "java.util.List<String>") List<String> getWarningMessages() {
+ return (handler != null) ? handler.getWarningMessages() : new ArrayList<String>();
+ }
+
+ public static List<String> getWarningMessages(ThingActions actions) {
+ return ((HeliosEasyControlsActions) actions).getWarningMessages();
+ }
+
+ @RuleAction(label = "@text/action.getInfoMessages.label", description = "@text/action.getInfoMessages.description")
+ public @ActionOutput(name = "infoMessages", type = "java.util.List<String>") List<String> getInfoMessages() {
+ return (handler != null) ? handler.getInfoMessages() : new ArrayList<String>();
+ }
+
+ public static List<String> getInfoMessages(ThingActions actions) {
+ return ((HeliosEasyControlsActions) actions).getInfoMessages();
+ }
+
+ @RuleAction(label = "@text/action.getStatusMessages.label", description = "@text/action.getStatusMessages.description")
+ public @ActionOutput(name = "statusMessages", type = "java.util.List<String>") List<String> getStatusMessages() {
+ return (handler != null) ? handler.getStatusMessages() : new ArrayList<String>();
+ }
+
+ public static List<String> getStatusMessages(ThingActions actions) {
+ return ((HeliosEasyControlsActions) actions).getStatusMessages();
+ }
+
+ @RuleAction(label = "@text/action.getMessages.label", description = "@text/action.getMessages.description")
+ public @ActionOutput(name = "errorMessages", type = "java.util.List<String>") @ActionOutput(name = "warningMessages", type = "java.util.List<String>") @ActionOutput(name = "infoMessages", type = "java.util.List<String>") @ActionOutput(name = "statusMessages", type = "java.util.List<String>") Map<String, Object> getMessages() {
+ Map<String, Object> messages = new HashMap<>();
+ HeliosEasyControlsHandler handler = this.handler;
+ if (handler != null) {
+ messages.put("errorMessages", handler.getErrorMessages());
+ messages.put("warningMessages", handler.getWarningMessages());
+ messages.put("infoMessages", handler.getInfoMessages());
+ messages.put("statusMessages", handler.getStatusMessages());
+ }
+ return messages;
+ }
+
+ public static Map<String, Object> getMessages(ThingActions actions) {
+ return ((HeliosEasyControlsActions) actions).getMessages();
+ }
}
// List of all Channel IDs
// -----------------------
// Device Config
- public final static String SYS_DATE = "sysdate"; // for the combined item (based on DATE, TIME and
+ public static final String SYS_DATE = "sysdate"; // for the combined item (based on DATE, TIME and
// TIME_ZONE_DIFFERENCE_TO_GMT)
- public final static String DATE = "date";
- public final static String TIME = "time";
- public final static String TIME_ZONE_DIFFERENCE_TO_GMT = "timeZoneDifferenceToGmt";
- public final static String SUMMER_WINTER = "summerWinter";
- public final static String ACCESS_HELIOS_PORTAL = "accessHeliosPortal";
- public final static String AUTO_SW_UPDATE = "autoSwUpdate";
- public final static String MIN_FAN_STAGE = "minFanStage";
- public final static String COMFORT_TEMP = "comfortTemp";
- public final static String SUPPLY_AIR_FAN_STAGE = "supplyAirFanStage";
- public final static String EXTRACT_AIR_FAN_STAGE = "extractAirFanStage";
+ public static final String DATE = "date";
+ public static final String TIME = "time";
+ public static final String TIME_ZONE_DIFFERENCE_TO_GMT = "timeZoneDifferenceToGmt";
+ public static final String SUMMER_WINTER = "summerWinter";
+ public static final String ACCESS_HELIOS_PORTAL = "accessHeliosPortal";
+ public static final String AUTO_SW_UPDATE = "autoSwUpdate";
+ public static final String MIN_FAN_STAGE = "minFanStage";
+ public static final String COMFORT_TEMP = "comfortTemp";
+ public static final String SUPPLY_AIR_FAN_STAGE = "supplyAirFanStage";
+ public static final String EXTRACT_AIR_FAN_STAGE = "extractAirFanStage";
// Operation
- public final static String PARTY_MODE_DURATION = "partyModeDuration";
- public final static String PARTY_MODE_FAN_STAGE = "partyModeFanStage";
- public final static String PARTY_MODE_REMAINING_TIME = "partyModeRemainingTime";
- public final static String PARTY_MODE_STATUS = "partyModeStatus";
- public final static String STANDBY_MODE_DURATION = "standbyModeDuration";
- public final static String STANDBY_MODE_FAN_STAGE = "standbyModeFanStage";
- public final static String STANDBY_MODE_REMAINING_TIME = "standbyModeRemainingTime";
- public final static String STANDBY_MODE_STATUS = "standbyModeStatus";
- public final static String HOLIDAY_PROGRAMME = "holidayProgramme";
- public final static String HOLIDAY_PROGRAMME_FAN_STAGE = "holidayProgrammeFanStage";
- public final static String HOLIDAY_PROGRAMME_START = "holidayProgrammeStart";
- public final static String HOLIDAY_PROGRAMME_END = "holidayProgrammeEnd";
- public final static String HOLIDAY_PROGRAMME_INTERVAL = "holidayProgrammeInterval";
- public final static String HOLIDAY_PROGRAMME_ACTIVATION_TIME = "holidayProgrammeActivationTime";
- public final static String OPERATING_MODE = "operatingMode";
- public final static String FAN_STAGE = "fanStage";
- public final static String PERCENTAGE_FAN_STAGE = "percentageFanStage";
- public final static String TEMPERATURE_OUTSIDE_AIR = "temperatureOutsideAir";
- public final static String TEMPERATURE_SUPPLY_AIR = "temperatureSupplyAir";
- public final static String TEMPERATURE_OUTGOING_AIR = "temperatureOutgoingAir";
- public final static String TEMPERATURE_EXTRACT_AIR = "temperatureExtractAir";
- public final static String VHZ_DUCT_SENSOR = "vhzDuctSensor";
- public final static String NHZ_DUCT_SENSOR = "nhzDuctSensor";
- public final static String NHZ_RETURN_SENSOR = "nhzReturnSensor";
- public final static String SUPPLY_AIR_RPM = "supplyAirRpm";
- public final static String EXTRACT_AIR_RPM = "extractAirRpm";
- public final static String OPERATING_HOURS_SUPPLY_AIR_VENT = "operatingHoursSupplyAirVent";
- public final static String OPERATING_HOURS_EXTRACT_AIR_VENT = "operatingHoursExtractAirVent";
+ public static final String PARTY_MODE_DURATION = "partyModeDuration";
+ public static final String PARTY_MODE_FAN_STAGE = "partyModeFanStage";
+ public static final String PARTY_MODE_REMAINING_TIME = "partyModeRemainingTime";
+ public static final String PARTY_MODE_STATUS = "partyModeStatus";
+ public static final String STANDBY_MODE_DURATION = "standbyModeDuration";
+ public static final String STANDBY_MODE_FAN_STAGE = "standbyModeFanStage";
+ public static final String STANDBY_MODE_REMAINING_TIME = "standbyModeRemainingTime";
+ public static final String STANDBY_MODE_STATUS = "standbyModeStatus";
+ public static final String HOLIDAY_PROGRAMME = "holidayProgramme";
+ public static final String HOLIDAY_PROGRAMME_FAN_STAGE = "holidayProgrammeFanStage";
+ public static final String HOLIDAY_PROGRAMME_START = "holidayProgrammeStart";
+ public static final String HOLIDAY_PROGRAMME_END = "holidayProgrammeEnd";
+ public static final String HOLIDAY_PROGRAMME_INTERVAL = "holidayProgrammeInterval";
+ public static final String HOLIDAY_PROGRAMME_ACTIVATION_TIME = "holidayProgrammeActivationTime";
+ public static final String OPERATING_MODE = "operatingMode";
+ public static final String FAN_STAGE = "fanStage";
+ public static final String PERCENTAGE_FAN_STAGE = "percentageFanStage";
+ public static final String TEMPERATURE_OUTSIDE_AIR = "temperatureOutsideAir";
+ public static final String TEMPERATURE_SUPPLY_AIR = "temperatureSupplyAir";
+ public static final String TEMPERATURE_OUTGOING_AIR = "temperatureOutgoingAir";
+ public static final String TEMPERATURE_EXTRACT_AIR = "temperatureExtractAir";
+ public static final String VHZ_DUCT_SENSOR = "vhzDuctSensor";
+ public static final String NHZ_DUCT_SENSOR = "nhzDuctSensor";
+ public static final String NHZ_RETURN_SENSOR = "nhzReturnSensor";
+ public static final String SUPPLY_AIR_RPM = "supplyAirRpm";
+ public static final String EXTRACT_AIR_RPM = "extractAirRpm";
+ public static final String OPERATING_HOURS_SUPPLY_AIR_VENT = "operatingHoursSupplyAirVent";
+ public static final String OPERATING_HOURS_EXTRACT_AIR_VENT = "operatingHoursExtractAirVent";
// Heater
- public final static String PRE_HEATER_STATUS = "preHeaterStatus";
- public final static String WEEK_PROFILE_NHZ = "weekProfileNhz";
- public final static String RUN_ON_TIME_VHZ_NHZ = "runOnTimeVhzNhz";
- public final static String OPERATING_HOURS_VHZ = "operatingHoursVhz";
- public final static String OPERATING_HOURS_NHZ = "operatingHoursNhz";
- public final static String OUTPUT_POWER_VHZ = "outputPowerVhz";
- public final static String OUTPUT_POWER_NHZ = "outputPowerNhz";
+ public static final String PRE_HEATER_STATUS = "preHeaterStatus";
+ public static final String WEEK_PROFILE_NHZ = "weekProfileNhz";
+ public static final String RUN_ON_TIME_VHZ_NHZ = "runOnTimeVhzNhz";
+ public static final String OPERATING_HOURS_VHZ = "operatingHoursVhz";
+ public static final String OPERATING_HOURS_NHZ = "operatingHoursNhz";
+ public static final String OUTPUT_POWER_VHZ = "outputPowerVhz";
+ public static final String OUTPUT_POWER_NHZ = "outputPowerNhz";
// Humidity control
- public final static String HUMIDITY_CONTROL_SET_VALUE = "humidityControlSetValue";
- public final static String HUMIDITY_CONTROL_STEPS = "humidityControlSteps";
- public final static String HUMIDITY_STOP_TIME = "humidityStopTime";
- public final static String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_1 = "externalSensorKwlFtfHumidity1";
- public final static String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_2 = "externalSensorKwlFtfHumidity2";
- public final static String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_3 = "externalSensorKwlFtfHumidity3";
- public final static String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_4 = "externalSensorKwlFtfHumidity4";
- public final static String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_5 = "externalSensorKwlFtfHumidity5";
- public final static String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_6 = "externalSensorKwlFtfHumidity6";
- public final static String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_7 = "externalSensorKwlFtfHumidity7";
- public final static String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_8 = "externalSensorKwlFtfHumidity8";
- public final static String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_1 = "externalSensorKwlFtfTemperature1";
- public final static String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_2 = "externalSensorKwlFtfTemperature2";
- public final static String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_3 = "externalSensorKwlFtfTemperature3";
- public final static String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_4 = "externalSensorKwlFtfTemperature4";
- public final static String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_5 = "externalSensorKwlFtfTemperature5";
- public final static String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_6 = "externalSensorKwlFtfTemperature6";
- public final static String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_7 = "externalSensorKwlFtfTemperature7";
- public final static String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_8 = "externalSensorKwlFtfTemperature8";
+ public static final String HUMIDITY_CONTROL_SET_VALUE = "humidityControlSetValue";
+ public static final String HUMIDITY_CONTROL_STEPS = "humidityControlSteps";
+ public static final String HUMIDITY_STOP_TIME = "humidityStopTime";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_1 = "externalSensorKwlFtfHumidity1";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_2 = "externalSensorKwlFtfHumidity2";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_3 = "externalSensorKwlFtfHumidity3";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_4 = "externalSensorKwlFtfHumidity4";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_5 = "externalSensorKwlFtfHumidity5";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_6 = "externalSensorKwlFtfHumidity6";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_7 = "externalSensorKwlFtfHumidity7";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_HUMIDITY_8 = "externalSensorKwlFtfHumidity8";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_1 = "externalSensorKwlFtfTemperature1";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_2 = "externalSensorKwlFtfTemperature2";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_3 = "externalSensorKwlFtfTemperature3";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_4 = "externalSensorKwlFtfTemperature4";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_5 = "externalSensorKwlFtfTemperature5";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_6 = "externalSensorKwlFtfTemperature6";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_7 = "externalSensorKwlFtfTemperature7";
+ public static final String EXTERNAL_SENSOR_KWL_FTF_TEMPERATURE_8 = "externalSensorKwlFtfTemperature8";
// CO2 control
- public final static String CO2_CONTROL_SET_VALUE = "co2ControlSetValue";
- public final static String CO2_CONTROL_STEPS = "co2ControlSteps";
- public final static String EXTERNAL_SENSOR_KWL_CO2_1 = "externalSensorKwlCo21";
- public final static String EXTERNAL_SENSOR_KWL_CO2_2 = "externalSensorKwlCo22";
- public final static String EXTERNAL_SENSOR_KWL_CO2_3 = "externalSensorKwlCo23";
- public final static String EXTERNAL_SENSOR_KWL_CO2_4 = "externalSensorKwlCo24";
- public final static String EXTERNAL_SENSOR_KWL_CO2_5 = "externalSensorKwlCo25";
- public final static String EXTERNAL_SENSOR_KWL_CO2_6 = "externalSensorKwlCo26";
- public final static String EXTERNAL_SENSOR_KWL_CO2_7 = "externalSensorKwlCo27";
- public final static String EXTERNAL_SENSOR_KWL_CO2_8 = "externalSensorKwlCo28";
- public final static String SENSOR_NAME_CO2_1 = "sensorNameCo21";
- public final static String SENSOR_NAME_CO2_2 = "sensorNameCo22";
- public final static String SENSOR_NAME_CO2_3 = "sensorNameCo23";
- public final static String SENSOR_NAME_CO2_4 = "sensorNameCo24";
- public final static String SENSOR_NAME_CO2_5 = "sensorNameCo25";
- public final static String SENSOR_NAME_CO2_6 = "sensorNameCo26";
- public final static String SENSOR_NAME_CO2_7 = "sensorNameCo27";
- public final static String SENSOR_NAME_CO2_8 = "sensorNameCo28";
+ public static final String CO2_CONTROL_SET_VALUE = "co2ControlSetValue";
+ public static final String CO2_CONTROL_STEPS = "co2ControlSteps";
+ public static final String EXTERNAL_SENSOR_KWL_CO2_1 = "externalSensorKwlCo21";
+ public static final String EXTERNAL_SENSOR_KWL_CO2_2 = "externalSensorKwlCo22";
+ public static final String EXTERNAL_SENSOR_KWL_CO2_3 = "externalSensorKwlCo23";
+ public static final String EXTERNAL_SENSOR_KWL_CO2_4 = "externalSensorKwlCo24";
+ public static final String EXTERNAL_SENSOR_KWL_CO2_5 = "externalSensorKwlCo25";
+ public static final String EXTERNAL_SENSOR_KWL_CO2_6 = "externalSensorKwlCo26";
+ public static final String EXTERNAL_SENSOR_KWL_CO2_7 = "externalSensorKwlCo27";
+ public static final String EXTERNAL_SENSOR_KWL_CO2_8 = "externalSensorKwlCo28";
+ public static final String SENSOR_NAME_CO2_1 = "sensorNameCo21";
+ public static final String SENSOR_NAME_CO2_2 = "sensorNameCo22";
+ public static final String SENSOR_NAME_CO2_3 = "sensorNameCo23";
+ public static final String SENSOR_NAME_CO2_4 = "sensorNameCo24";
+ public static final String SENSOR_NAME_CO2_5 = "sensorNameCo25";
+ public static final String SENSOR_NAME_CO2_6 = "sensorNameCo26";
+ public static final String SENSOR_NAME_CO2_7 = "sensorNameCo27";
+ public static final String SENSOR_NAME_CO2_8 = "sensorNameCo28";
// VOC control
- public final static String VOC_CONTROL_SET_VALUE = "vocControlSetValue";
- public final static String VOC_CONTROL_STEPS = "vocControlSteps";
- public final static String EXTERNAL_SENSOR_KWL_VOC_1 = "externalSensorKwlVoc1";
- public final static String EXTERNAL_SENSOR_KWL_VOC_2 = "externalSensorKwlVoc2";
- public final static String EXTERNAL_SENSOR_KWL_VOC_3 = "externalSensorKwlVoc3";
- public final static String EXTERNAL_SENSOR_KWL_VOC_4 = "externalSensorKwlVoc4";
- public final static String EXTERNAL_SENSOR_KWL_VOC_5 = "externalSensorKwlVoc5";
- public final static String EXTERNAL_SENSOR_KWL_VOC_6 = "externalSensorKwlVoc6";
- public final static String EXTERNAL_SENSOR_KWL_VOC_7 = "externalSensorKwlVoc7";
- public final static String EXTERNAL_SENSOR_KWL_VOC_8 = "externalSensorKwlVoc8";
- public final static String SENSOR_NAME_VOC_1 = "sensorNameVoc1";
- public final static String SENSOR_NAME_VOC_2 = "sensorNameVoc2";
- public final static String SENSOR_NAME_VOC_3 = "sensorNameVoc3";
- public final static String SENSOR_NAME_VOC_4 = "sensorNameVoc4";
- public final static String SENSOR_NAME_VOC_5 = "sensorNameVoc5";
- public final static String SENSOR_NAME_VOC_6 = "sensorNameVoc6";
- public final static String SENSOR_NAME_VOC_7 = "sensorNameVoc7";
- public final static String SENSOR_NAME_VOC_8 = "sensorNameVoc8";
+ public static final String VOC_CONTROL_SET_VALUE = "vocControlSetValue";
+ public static final String VOC_CONTROL_STEPS = "vocControlSteps";
+ public static final String EXTERNAL_SENSOR_KWL_VOC_1 = "externalSensorKwlVoc1";
+ public static final String EXTERNAL_SENSOR_KWL_VOC_2 = "externalSensorKwlVoc2";
+ public static final String EXTERNAL_SENSOR_KWL_VOC_3 = "externalSensorKwlVoc3";
+ public static final String EXTERNAL_SENSOR_KWL_VOC_4 = "externalSensorKwlVoc4";
+ public static final String EXTERNAL_SENSOR_KWL_VOC_5 = "externalSensorKwlVoc5";
+ public static final String EXTERNAL_SENSOR_KWL_VOC_6 = "externalSensorKwlVoc6";
+ public static final String EXTERNAL_SENSOR_KWL_VOC_7 = "externalSensorKwlVoc7";
+ public static final String EXTERNAL_SENSOR_KWL_VOC_8 = "externalSensorKwlVoc8";
+ public static final String SENSOR_NAME_VOC_1 = "sensorNameVoc1";
+ public static final String SENSOR_NAME_VOC_2 = "sensorNameVoc2";
+ public static final String SENSOR_NAME_VOC_3 = "sensorNameVoc3";
+ public static final String SENSOR_NAME_VOC_4 = "sensorNameVoc4";
+ public static final String SENSOR_NAME_VOC_5 = "sensorNameVoc5";
+ public static final String SENSOR_NAME_VOC_6 = "sensorNameVoc6";
+ public static final String SENSOR_NAME_VOC_7 = "sensorNameVoc7";
+ public static final String SENSOR_NAME_VOC_8 = "sensorNameVoc8";
// Errors
- public final static String ERROR_OUTPUT_FUNCTION = "errorOutputFunction";
- public final static String ERRORS = "errors";
- public final static String WARNINGS = "warnings";
- public final static String INFOS = "infos";
- public final static String NO_OF_ERRORS = "noOfErrors";
- public final static String NO_OF_WARNINGS = "noOfWarnings";
- public final static String NO_OF_INFOS = "noOfInfos";
- public final static String ERRORS_MSG = "errorsMsg";
- public final static String WARNINGS_MSG = "warningsMsg";
- public final static String INFOS_MSG = "infosMsg";
- public final static String STATUS_FLAGS = "statusFlags";
+ public static final String ERROR_OUTPUT_FUNCTION = "errorOutputFunction";
+ public static final String ERRORS = "errors";
+ public static final String WARNINGS = "warnings";
+ public static final String INFOS = "infos";
+ public static final String NO_OF_ERRORS = "noOfErrors";
+ public static final String NO_OF_WARNINGS = "noOfWarnings";
+ public static final String NO_OF_INFOS = "noOfInfos";
+ public static final String ERRORS_MSG = "errorsMsg";
+ public static final String WARNINGS_MSG = "warningsMsg";
+ public static final String INFOS_MSG = "infosMsg";
+ public static final String STATUS_FLAGS = "statusFlags";
// Filter
- public final static String FILTER_CHANGE = "filterChange";
- public final static String FILTER_CHANGE_INTERVAL = "filterChangeInterval";
- public final static String FILTER_CHANGE_REMAINING_TIME = "filterChangeRemainingTime";
+ public static final String FILTER_CHANGE = "filterChange";
+ public static final String FILTER_CHANGE_INTERVAL = "filterChangeInterval";
+ public static final String FILTER_CHANGE_REMAINING_TIME = "filterChangeRemainingTime";
// Bypass
- public final static String BYPASS_ROOM_TEMPERATURE = "bypassRoomTemperature";
- public final static String BYPASS_MIN_OUTSIDE_TEMPERATURE = "bypassMinOutsideTemperature";
- public final static String BYPASS_STATUS = "bypassStatus";
- public final static String BYPASS_FROM = "bypassFrom"; // for the combined item (based on BYPASS_FROM_DAY and
+ public static final String BYPASS_ROOM_TEMPERATURE = "bypassRoomTemperature";
+ public static final String BYPASS_MIN_OUTSIDE_TEMPERATURE = "bypassMinOutsideTemperature";
+ public static final String BYPASS_STATUS = "bypassStatus";
+ public static final String BYPASS_FROM = "bypassFrom"; // for the combined item (based on BYPASS_FROM_DAY and
// BYPASS_FROM_MONTH)
- public final static String BYPASS_FROM_DAY = "bypassFromDay";
- public final static String BYPASS_FROM_MONTH = "bypassFromMonth";
- public final static String BYPASS_TO = "bypassTo"; // for the combined item (based on BYPASS_TO_DAY and
+ public static final String BYPASS_FROM_DAY = "bypassFromDay";
+ public static final String BYPASS_FROM_MONTH = "bypassFromMonth";
+ public static final String BYPASS_TO = "bypassTo"; // for the combined item (based on BYPASS_TO_DAY and
// BYPASS_TO_MONTH)
- public final static String BYPASS_TO_DAY = "bypassToDay";
- public final static String BYPASS_TO_MONTH = "bypassToMonth";
+ public static final String BYPASS_TO_DAY = "bypassToDay";
+ public static final String BYPASS_TO_MONTH = "bypassToMonth";
// List of all Properties
// ----------------------
// Device Config
- public final static String ARTICLE_DESCRIPTION = "articleDescription";
- public final static String REF_NO = "refNo";
- public final static String SER_NO = "serNo";
- public final static String PROD_CODE = "prodCode";
- public final static String MAC_ADDRESS = "macAddress";
- public final static String SOFTWARE_VERSION_BASIS = "softwareVersionBasis";
- public final static String DATE_FORMAT = "dateFormat";
- public final static String LANGUAGE = "language";
- public final static String UNIT_CONFIG = "unitConfig";
- public final static String KWL_BE = "kwlBe";
- public final static String KWL_BEC = "kwlBec";
- public final static String EXTERNAL_CONTACT = "externalContact";
- public final static String FUNCTION_TYPE_KWL_EM = "functionTypeKwlEm";
- public final static String HEAT_EXCHANGER_TYPE = "heatExchangerType";
- public final static String OFFSET_EXTRACT_AIR = "offsetExtractAir";
- public final static String ASSIGNMENT_FAN_STAGES = "assignmentFanStages";
- public final static String VOLTAGE_FAN_STAGE_1_EXTRACT_AIR = "voltageFanStage1ExtractAir";
- public final static String VOLTAGE_FAN_STAGE_2_EXTRACT_AIR = "voltageFanStage2ExtractAir";
- public final static String VOLTAGE_FAN_STAGE_3_EXTRACT_AIR = "voltageFanStage3ExtractAir";
- public final static String VOLTAGE_FAN_STAGE_4_EXTRACT_AIR = "voltageFanStage4ExtractAir";
- public final static String VOLTAGE_FAN_STAGE_1_SUPPLY_AIR = "voltageFanStage1SupplyAir";
- public final static String VOLTAGE_FAN_STAGE_2_SUPPLY_AIR = "voltageFanStage2SupplyAir";
- public final static String VOLTAGE_FAN_STAGE_3_SUPPLY_AIR = "voltageFanStage3SupplyAir";
- public final static String VOLTAGE_FAN_STAGE_4_SUPPLY_AIR = "voltageFanStage4SupplyAir";
- public final static String FAN_STAGE_STEPPED_0TO2V = "fanStageStepped0to2v";
- public final static String FAN_STAGE_STEPPED_2TO4V = "fanStageStepped2to4v";
- public final static String FAN_STAGE_STEPPED_4TO6V = "fanStageStepped4to6v";
- public final static String FAN_STAGE_STEPPED_6TO8V = "fanStageStepped6to8v";
- public final static String FAN_STAGE_STEPPED_8TO10V = "fanStageStepped8to10v";
+ public static final String ARTICLE_DESCRIPTION = "articleDescription";
+ public static final String REF_NO = "refNo";
+ public static final String SER_NO = "serNo";
+ public static final String PROD_CODE = "prodCode";
+ public static final String MAC_ADDRESS = "macAddress";
+ public static final String SOFTWARE_VERSION_BASIS = "softwareVersionBasis";
+ public static final String DATE_FORMAT = "dateFormat";
+ public static final String LANGUAGE = "language";
+ public static final String UNIT_CONFIG = "unitConfig";
+ public static final String KWL_BE = "kwlBe";
+ public static final String KWL_BEC = "kwlBec";
+ public static final String EXTERNAL_CONTACT = "externalContact";
+ public static final String FUNCTION_TYPE_KWL_EM = "functionTypeKwlEm";
+ public static final String HEAT_EXCHANGER_TYPE = "heatExchangerType";
+ public static final String OFFSET_EXTRACT_AIR = "offsetExtractAir";
+ public static final String ASSIGNMENT_FAN_STAGES = "assignmentFanStages";
+ public static final String VOLTAGE_FAN_STAGE_1_EXTRACT_AIR = "voltageFanStage1ExtractAir";
+ public static final String VOLTAGE_FAN_STAGE_2_EXTRACT_AIR = "voltageFanStage2ExtractAir";
+ public static final String VOLTAGE_FAN_STAGE_3_EXTRACT_AIR = "voltageFanStage3ExtractAir";
+ public static final String VOLTAGE_FAN_STAGE_4_EXTRACT_AIR = "voltageFanStage4ExtractAir";
+ public static final String VOLTAGE_FAN_STAGE_1_SUPPLY_AIR = "voltageFanStage1SupplyAir";
+ public static final String VOLTAGE_FAN_STAGE_2_SUPPLY_AIR = "voltageFanStage2SupplyAir";
+ public static final String VOLTAGE_FAN_STAGE_3_SUPPLY_AIR = "voltageFanStage3SupplyAir";
+ public static final String VOLTAGE_FAN_STAGE_4_SUPPLY_AIR = "voltageFanStage4SupplyAir";
+ public static final String FAN_STAGE_STEPPED_0TO2V = "fanStageStepped0to2v";
+ public static final String FAN_STAGE_STEPPED_2TO4V = "fanStageStepped2to4v";
+ public static final String FAN_STAGE_STEPPED_4TO6V = "fanStageStepped4to6v";
+ public static final String FAN_STAGE_STEPPED_6TO8V = "fanStageStepped6to8v";
+ public static final String FAN_STAGE_STEPPED_8TO10V = "fanStageStepped8to10v";
// Heater
- public final static String VHZ_TYPE = "vhzType";
+ public static final String VHZ_TYPE = "vhzType";
// Humidty control
- public final static String HUMIDITY_CONTROL_STATUS = "humidityControlStatus";
- public final static String KWL_FTF_CONFIG_0 = "kwlFtfConfig0";
- public final static String KWL_FTF_CONFIG_1 = "kwlFtfConfig1";
- public final static String KWL_FTF_CONFIG_2 = "kwlFtfConfig2";
- public final static String KWL_FTF_CONFIG_3 = "kwlFtfConfig3";
- public final static String KWL_FTF_CONFIG_4 = "kwlFtfConfig4";
- public final static String KWL_FTF_CONFIG_5 = "kwlFtfConfig5";
- public final static String KWL_FTF_CONFIG_6 = "kwlFtfConfig6";
- public final static String KWL_FTF_CONFIG_7 = "kwlFtfConfig7";
- public final static String SENSOR_CONFIG_KWL_FTF_1 = "sensorConfigKwlFtf1";
- public final static String SENSOR_CONFIG_KWL_FTF_2 = "sensorConfigKwlFtf2";
- public final static String SENSOR_CONFIG_KWL_FTF_3 = "sensorConfigKwlFtf3";
- public final static String SENSOR_CONFIG_KWL_FTF_4 = "sensorConfigKwlFtf4";
- public final static String SENSOR_CONFIG_KWL_FTF_5 = "sensorConfigKwlFtf5";
- public final static String SENSOR_CONFIG_KWL_FTF_6 = "sensorConfigKwlFtf6";
- public final static String SENSOR_CONFIG_KWL_FTF_7 = "sensorConfigKwlFtf7";
- public final static String SENSOR_CONFIG_KWL_FTF_8 = "sensorConfigKwlFtf8";
- public final static String SENSOR_NAME_HUMIDITY_AND_TEMP_1 = "sensorNameHumidityAndTemp1";
- public final static String SENSOR_NAME_HUMIDITY_AND_TEMP_2 = "sensorNameHumidityAndTemp2";
- public final static String SENSOR_NAME_HUMIDITY_AND_TEMP_3 = "sensorNameHumidityAndTemp3";
- public final static String SENSOR_NAME_HUMIDITY_AND_TEMP_4 = "sensorNameHumidityAndTemp4";
- public final static String SENSOR_NAME_HUMIDITY_AND_TEMP_5 = "sensorNameHumidityAndTemp5";
- public final static String SENSOR_NAME_HUMIDITY_AND_TEMP_6 = "sensorNameHumidityAndTemp6";
- public final static String SENSOR_NAME_HUMIDITY_AND_TEMP_7 = "sensorNameHumidityAndTemp7";
- public final static String SENSOR_NAME_HUMIDITY_AND_TEMP_8 = "sensorNameHumidityAndTemp8";
+ public static final String HUMIDITY_CONTROL_STATUS = "humidityControlStatus";
+ public static final String KWL_FTF_CONFIG_0 = "kwlFtfConfig0";
+ public static final String KWL_FTF_CONFIG_1 = "kwlFtfConfig1";
+ public static final String KWL_FTF_CONFIG_2 = "kwlFtfConfig2";
+ public static final String KWL_FTF_CONFIG_3 = "kwlFtfConfig3";
+ public static final String KWL_FTF_CONFIG_4 = "kwlFtfConfig4";
+ public static final String KWL_FTF_CONFIG_5 = "kwlFtfConfig5";
+ public static final String KWL_FTF_CONFIG_6 = "kwlFtfConfig6";
+ public static final String KWL_FTF_CONFIG_7 = "kwlFtfConfig7";
+ public static final String SENSOR_CONFIG_KWL_FTF_1 = "sensorConfigKwlFtf1";
+ public static final String SENSOR_CONFIG_KWL_FTF_2 = "sensorConfigKwlFtf2";
+ public static final String SENSOR_CONFIG_KWL_FTF_3 = "sensorConfigKwlFtf3";
+ public static final String SENSOR_CONFIG_KWL_FTF_4 = "sensorConfigKwlFtf4";
+ public static final String SENSOR_CONFIG_KWL_FTF_5 = "sensorConfigKwlFtf5";
+ public static final String SENSOR_CONFIG_KWL_FTF_6 = "sensorConfigKwlFtf6";
+ public static final String SENSOR_CONFIG_KWL_FTF_7 = "sensorConfigKwlFtf7";
+ public static final String SENSOR_CONFIG_KWL_FTF_8 = "sensorConfigKwlFtf8";
+ public static final String SENSOR_NAME_HUMIDITY_AND_TEMP_1 = "sensorNameHumidityAndTemp1";
+ public static final String SENSOR_NAME_HUMIDITY_AND_TEMP_2 = "sensorNameHumidityAndTemp2";
+ public static final String SENSOR_NAME_HUMIDITY_AND_TEMP_3 = "sensorNameHumidityAndTemp3";
+ public static final String SENSOR_NAME_HUMIDITY_AND_TEMP_4 = "sensorNameHumidityAndTemp4";
+ public static final String SENSOR_NAME_HUMIDITY_AND_TEMP_5 = "sensorNameHumidityAndTemp5";
+ public static final String SENSOR_NAME_HUMIDITY_AND_TEMP_6 = "sensorNameHumidityAndTemp6";
+ public static final String SENSOR_NAME_HUMIDITY_AND_TEMP_7 = "sensorNameHumidityAndTemp7";
+ public static final String SENSOR_NAME_HUMIDITY_AND_TEMP_8 = "sensorNameHumidityAndTemp8";
// CO2 control
- public final static String CO2_CONTROL_STATUS = "co2ControlStatus";
+ public static final String CO2_CONTROL_STATUS = "co2ControlStatus";
// VOC control
- public final static String VOC_CONTROL_STATUS = "vocControlStatus";
+ public static final String VOC_CONTROL_STATUS = "vocControlStatus";
// List of all variables used in actions
- public final static String FILTER_CHANGE_RESET = "filterChangeReset";
- public final static String FACTORY_SETTING_WZU = "factorySettingWzu";
- public final static String FACTORY_RESET = "factoryReset";
- public final static String RESET_FLAG = "resetFlag";
+ public static final String FILTER_CHANGE_RESET = "filterChangeReset";
+ public static final String FACTORY_SETTING_WZU = "factorySettingWzu";
+ public static final String FACTORY_RESET = "factoryReset";
+ public static final String RESET_FLAG = "resetFlag";
// List of all unused variables (defined in the specification but not implemented as channels, properties or
// actions)
- public final static String GLOBAL_MANUAL_WEB_UPDATE = "globalManualWebUpdate";
- public final static String PORTAL_GLOBALS_ERROR_FOR_WEB = "portalGlobalsErrorForWeb";
- public final static String CLEAR_ERROR = "clearError";
- public final static String TBD = "tbd";
- public final static String LOGOUT = "logout";
+ public static final String GLOBAL_MANUAL_WEB_UPDATE = "globalManualWebUpdate";
+ public static final String PORTAL_GLOBALS_ERROR_FOR_WEB = "portalGlobalsErrorForWeb";
+ public static final String CLEAR_ERROR = "clearError";
+ public static final String TBD = "tbd";
+ public static final String LOGOUT = "logout";
// List of all Configuration Parameters
- public final static String CONFIG_REFRESH_INTERVAL = "refreshInterval";
+ public static final String CONFIG_REFRESH_INTERVAL = "refreshInterval";
+
+ // Messages
+ public static final String PREFIX_ERROR_MSG = "error.";
+ public static final int BITS_ERROR_MSG = 32;
+ public static final String PREFIX_WARNING_MSG = "warning.";
+ public static final int BITS_WARNING_MSG = 8;
+ public static final String PREFIX_INFO_MSG = "info.";
+ public static final int BITS_INFO_MSG = 8;
+ public static final String PREFIX_STATUS_MSG = "stateflag.";
+ public static final int BITS_STATUS_MSG = 32;
// Other constants
- public final static int UNIT_ID = 180;
- public final static int START_ADDRESS = 1;
- public final static String VARIABLES_DEFINITION_FILE = "variables.json";
- public final static int MAX_TRIES = 5;
+ public static final int UNIT_ID = 180;
+ public static final int START_ADDRESS = 1;
+ public static final String VARIABLES_DEFINITION_FILE = "variables.json";
+ public static final int MAX_TRIES = 5;
+ public static final String PROPERTIES_PREFIX = "property.";
// List of all variables that have to be updated regardless if they are linked to an item
- public final static List<String> ALWAYS_UPDATE_VARIABLES = Arrays.asList(
+ public static final List<String> ALWAYS_UPDATE_VARIABLES = Arrays.asList(
HeliosEasyControlsBindingConstants.DATE_FORMAT, HeliosEasyControlsBindingConstants.DATE,
HeliosEasyControlsBindingConstants.TIME, HeliosEasyControlsBindingConstants.TIME_ZONE_DIFFERENCE_TO_GMT,
HeliosEasyControlsBindingConstants.BYPASS_FROM_DAY, HeliosEasyControlsBindingConstants.BYPASS_FROM_MONTH,
- HeliosEasyControlsBindingConstants.BYPASS_TO_DAY, HeliosEasyControlsBindingConstants.BYPASS_TO_MONTH);
+ HeliosEasyControlsBindingConstants.BYPASS_TO_DAY, HeliosEasyControlsBindingConstants.BYPASS_TO_MONTH,
+ HeliosEasyControlsBindingConstants.ERRORS, HeliosEasyControlsBindingConstants.WARNINGS,
+ HeliosEasyControlsBindingConstants.INFOS, HeliosEasyControlsBindingConstants.STATUS_FLAGS);
// List of all properties
- public final static List<String> PROPERTY_NAMES = Arrays.asList(
+ public static final List<String> PROPERTY_NAMES = Arrays.asList(
HeliosEasyControlsBindingConstants.ARTICLE_DESCRIPTION, HeliosEasyControlsBindingConstants.REF_NO,
HeliosEasyControlsBindingConstants.SER_NO, HeliosEasyControlsBindingConstants.PROD_CODE,
HeliosEasyControlsBindingConstants.MAC_ADDRESS, HeliosEasyControlsBindingConstants.SOFTWARE_VERSION_BASIS,
import java.nio.charset.StandardCharsets;
import java.time.ZoneId;
import java.time.ZonedDateTime;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
private final Logger logger = LoggerFactory.getLogger(HeliosEasyControlsHandler.class);
+ private final HeliosEasyControlsTranslationProvider translationProvider;
+
private @Nullable HeliosEasyControlsConfiguration config;
private @Nullable ScheduledFuture<?> pollingJob;
private int dateFormat = -1;
private ZonedDateTime sysDate = ZonedDateTime.now(); // initialize with local system time as a best guess
// before reading from device
+ private long errors = 0;
+ private int warnings = 0;
+ private int infos = 0;
+ private String statusFlags = "";
- private class BypassDate {
- private final int[] MONTH_MAX_DAYS = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ private static class BypassDate {
+ private static final int[] MONTH_MAX_DAYS = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// initialization to avoid issues when updating before all variables were read
private int month = 1;
private @Nullable BypassDate bypassFrom, bypassTo;
- public HeliosEasyControlsHandler(Thing thing) {
+ public HeliosEasyControlsHandler(Thing thing, HeliosEasyControlsTranslationProvider translationProvider) {
super(thing);
+ this.translationProvider = translationProvider;
}
/**
if (command instanceof OnOffType) {
value = command == OnOffType.ON ? "1" : "0";
} else if (command instanceof DateTimeType) {
- ZonedDateTime d = ((DateTimeType) command).getZonedDateTime();
- if (channelId.equals(HeliosEasyControlsBindingConstants.SYS_DATE)) {
- setSysDateTime(d);
- } else if (channelId.equals(HeliosEasyControlsBindingConstants.BYPASS_FROM)) {
- this.setBypass(true, d.getDayOfMonth(), d.getMonthValue());
- } else if (channelId.equals(HeliosEasyControlsBindingConstants.BYPASS_TO)) {
- this.setBypass(false, d.getDayOfMonth(), d.getMonthValue());
- } else {
- value = formatDate(channelId, ((DateTimeType) command).getZonedDateTime());
+ try {
+ ZonedDateTime d = ((DateTimeType) command).getZonedDateTime();
+ if (channelId.equals(HeliosEasyControlsBindingConstants.SYS_DATE)) {
+ setSysDateTime(d);
+ } else if (channelId.equals(HeliosEasyControlsBindingConstants.BYPASS_FROM)) {
+ this.setBypass(true, d.getDayOfMonth(), d.getMonthValue());
+ } else if (channelId.equals(HeliosEasyControlsBindingConstants.BYPASS_TO)) {
+ this.setBypass(false, d.getDayOfMonth(), d.getMonthValue());
+ } else {
+ value = formatDate(channelId, ((DateTimeType) command).getZonedDateTime());
+ }
+ } catch (InterruptedException e) {
+ logger.debug(
+ "{} encountered Exception when trying to lock Semaphore for writing variable {} to the device: {}",
+ HeliosEasyControlsHandler.class.getSimpleName(), channelId, e.getMessage());
}
} else if ((command instanceof DecimalType) || (command instanceof StringType)) {
value = command.toString();
// convert item's unit to the Helios device's unit
Map<String, HeliosVariable> variableMap = this.variableMap;
if (variableMap != null) {
- String unit = variableMap.get(channelId).getUnit();
- QuantityType<?> val = (QuantityType<?>) command;
- if (unit != null) {
- switch (unit) {
- case HeliosVariable.UNIT_DAY:
- val = val.toUnit(Units.DAY);
- break;
- case HeliosVariable.UNIT_HOUR:
- val = val.toUnit(Units.HOUR);
- break;
- case HeliosVariable.UNIT_MIN:
- val = val.toUnit(Units.MINUTE);
- break;
- case HeliosVariable.UNIT_SEC:
- val = val.toUnit(Units.SECOND);
- break;
- case HeliosVariable.UNIT_VOLT:
- val = val.toUnit(Units.VOLT);
- break;
- case HeliosVariable.UNIT_PERCENT:
- val = val.toUnit(Units.PERCENT);
- break;
- case HeliosVariable.UNIT_PPM:
- val = val.toUnit(Units.PARTS_PER_MILLION);
- break;
- case HeliosVariable.UNIT_TEMP:
- val = val.toUnit(SIUnits.CELSIUS);
- break;
+ HeliosVariable v = variableMap.get(channelId);
+ if (v != null) {
+ String unit = v.getUnit();
+ QuantityType<?> val = (QuantityType<?>) command;
+ if (unit != null) {
+ switch (unit) {
+ case HeliosVariable.UNIT_DAY:
+ val = val.toUnit(Units.DAY);
+ break;
+ case HeliosVariable.UNIT_HOUR:
+ val = val.toUnit(Units.HOUR);
+ break;
+ case HeliosVariable.UNIT_MIN:
+ val = val.toUnit(Units.MINUTE);
+ break;
+ case HeliosVariable.UNIT_SEC:
+ val = val.toUnit(Units.SECOND);
+ break;
+ case HeliosVariable.UNIT_VOLT:
+ val = val.toUnit(Units.VOLT);
+ break;
+ case HeliosVariable.UNIT_PERCENT:
+ val = val.toUnit(Units.PERCENT);
+ break;
+ case HeliosVariable.UNIT_PPM:
+ val = val.toUnit(Units.PARTS_PER_MILLION);
+ break;
+ case HeliosVariable.UNIT_TEMP:
+ val = val.toUnit(SIUnits.CELSIUS);
+ break;
+ }
+ value = val != null ? String.valueOf(val.doubleValue()) : null; // ignore the UoM
}
- value = val != null ? String.valueOf(val.doubleValue()) : null; // ignore the UoM
}
}
}
} catch (HeliosException e) {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"Writing value " + v + "to channel " + channelId + " failed: " + e.getMessage());
+ } catch (InterruptedException e) {
+ logger.debug(
+ "{} encountered Exception when trying to lock Semaphore for writing variable {} to the device: {}",
+ HeliosEasyControlsHandler.class.getSimpleName(), channelId, e.getMessage());
+
}
});
}
* @return The value if the transaction succeeded, <tt>null</tt> otherwise
* @throws HeliosException Thrown if the variable is read-only or the provided value is out of range
*/
- public void writeValue(String variableName, String value) throws HeliosException {
+ public void writeValue(String variableName, String value) throws HeliosException, InterruptedException {
if (this.variableMap == null) {
this.handleError("Variable definition is unavailable.", ThingStatusDetail.CONFIGURATION_ERROR);
return;
if (variableMap != null) {
HeliosVariable v = variableMap.get(variableName);
- if (!v.hasWriteAccess()) {
- throw new HeliosException("Variable " + variableName + " is read-only");
- } else if (!v.isInAllowedRange(value)) {
- throw new HeliosException(
- "Value " + value + " is outside of allowed range of variable " + variableName);
- } else if (this.comms != null) {
- // write to device
- String payload = v.getVariableString() + "=" + value;
- ModbusCommunicationInterface comms = this.comms;
- if (comms != null) {
- final Semaphore lock = transactionLocks.get(comms.getEndpoint());
- try {
- lock.acquire();
- comms.submitOneTimeWrite(
- new ModbusWriteRegisterRequestBlueprint(HeliosEasyControlsBindingConstants.UNIT_ID,
- HeliosEasyControlsBindingConstants.START_ADDRESS, preparePayload(payload),
- true, HeliosEasyControlsBindingConstants.MAX_TRIES),
- result -> {
- lock.release();
- updateStatus(ThingStatus.ONLINE);
- }, failureInfo -> {
- lock.release();
- updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
- "Error writing to device: " + failureInfo.getCause().getMessage());
- });
- } catch (InterruptedException e) {
- logger.warn(
- "{} encountered Exception when trying to lock Semaphore for writing variable {} to the device: {}",
- HeliosEasyControlsHandler.class.getSimpleName(), variableName, e.getMessage());
+ if (v != null) {
+ if (!v.hasWriteAccess()) {
+ throw new HeliosException("Variable " + variableName + " is read-only");
+ } else if (!v.isInAllowedRange(value)) {
+ throw new HeliosException(
+ "Value " + value + " is outside of allowed range of variable " + variableName);
+ } else if (this.comms != null) {
+ // write to device
+ String payload = v.getVariableString() + "=" + value;
+ ModbusCommunicationInterface comms = this.comms;
+ if (comms != null) {
+ final Semaphore lock = transactionLocks.get(comms.getEndpoint());
+ if (lock != null) {
+ lock.acquire();
+ comms.submitOneTimeWrite(new ModbusWriteRegisterRequestBlueprint(
+ HeliosEasyControlsBindingConstants.UNIT_ID,
+ HeliosEasyControlsBindingConstants.START_ADDRESS, preparePayload(payload), true,
+ HeliosEasyControlsBindingConstants.MAX_TRIES), result -> {
+ lock.release();
+ updateStatus(ThingStatus.ONLINE);
+ }, failureInfo -> {
+ lock.release();
+ updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
+ "Error writing to device: " + failureInfo.getCause().getMessage());
+ });
+ }
}
+ } else { // comms is null
+ this.handleError("Modbus communication interface is null",
+ ThingStatusDetail.COMMUNICATION_ERROR);
}
- } else { // comms is null
- this.handleError("Modbus communication interface is null", ThingStatusDetail.COMMUNICATION_ERROR);
}
}
}
if ((comms != null) && (variableMap != null)) {
final Semaphore lock = transactionLocks.get(comms.getEndpoint());
HeliosVariable v = variableMap.get(variableName);
- if (v.hasReadAccess()) {
+ if ((v != null) && v.hasReadAccess() && (lock != null)) {
try {
lock.acquire(); // will block until lock is available
} catch (InterruptedException e) {
this.sysDate = sysDate;
}
- private void setSysDateTime(ZonedDateTime date) {
+ private void setSysDateTime(ZonedDateTime date) throws InterruptedException {
try {
this.writeValue(HeliosEasyControlsBindingConstants.DATE,
this.formatDate(HeliosEasyControlsBindingConstants.DATE, date));
}
}
- protected void setSysDateTime() {
+ protected void setSysDateTime() throws InterruptedException {
this.setSysDateTime(ZonedDateTime.now());
}
}
}
- protected void setBypass(boolean from, int day, int month) {
+ protected void setBypass(boolean from, int day, int month) throws InterruptedException {
BypassDate bypassDate = new BypassDate(day, month);
try {
this.writeValue(from ? HeliosEasyControlsBindingConstants.BYPASS_FROM_DAY
}
}
+ private List<String> getMessages(long bitMask, int bits, String prefix) {
+ ArrayList<String> msg = new ArrayList<String>();
+ long mask = 1;
+ for (int i = 0; i < bits; i++) {
+ if ((bitMask & mask) != 0) {
+ msg.add(translationProvider.getText(prefix + i));
+ }
+ mask <<= 1;
+ }
+ return msg;
+ }
+
+ /**
+ * Transforms the errors provided by the device into a human readable form (the basis for the
+ * corresponding action)
+ *
+ * @return an <code>List</code> of messages indicated by the error flags sent by the device
+ */
+ protected List<String> getErrorMessages() {
+ return this.getMessages(this.errors, HeliosEasyControlsBindingConstants.BITS_ERROR_MSG,
+ HeliosEasyControlsBindingConstants.PREFIX_ERROR_MSG);
+ }
+
+ /**
+ * Transforms the warnings provided by the device into a human readable form (the basis for the
+ * corresponding action)
+ *
+ * @return an <code>List</code> of messages indicated by the warning flags sent by the device
+ */
+ protected List<String> getWarningMessages() {
+ return this.getMessages(this.warnings, HeliosEasyControlsBindingConstants.BITS_WARNING_MSG,
+ HeliosEasyControlsBindingConstants.PREFIX_WARNING_MSG);
+ }
+
+ /**
+ * Transforms the infos provided by the device into a human readable form (the basis for the
+ * corresponding action)
+ *
+ * @return an <code>List</code> of messages indicated by the info flags sent by the device
+ */
+ protected List<String> getInfoMessages() {
+ return this.getMessages(this.infos, HeliosEasyControlsBindingConstants.BITS_INFO_MSG,
+ HeliosEasyControlsBindingConstants.PREFIX_INFO_MSG);
+ }
+
+ /**
+ * Transforms the status flags provided by the device into a human readable form (the basis for the
+ * corresponding action)
+ *
+ * @return an <code>List</code> of messages indicated by the status flags sent by the device
+ */
+ protected List<String> getStatusMessages() {
+ ArrayList<String> msg = new ArrayList<String>();
+ if (this.statusFlags.length() == HeliosEasyControlsBindingConstants.BITS_STATUS_MSG) {
+ for (int i = 0; i < HeliosEasyControlsBindingConstants.BITS_STATUS_MSG; i++) {
+ String key = HeliosEasyControlsBindingConstants.PREFIX_STATUS_MSG + i + "."
+ + (this.statusFlags.substring(HeliosEasyControlsBindingConstants.BITS_STATUS_MSG - i - 1,
+ HeliosEasyControlsBindingConstants.BITS_STATUS_MSG - i));
+ String text = translationProvider.getText(key);
+ if (!text.equals(key)) { // there is a text in the properties file (no text => flag is irrelevant)
+ msg.add(text);
+ }
+ }
+ } else {
+ msg.add("Status messages have not yet been read from the device");
+ }
+ return msg;
+ }
+
/**
* Returns a DateTimeType object based on the provided String and the device's configured date format
*
if ((parts.length == 2) && (v.getVariableString().equals(parts[0]))) {
if (this.isProperty(v.getName())) {
try {
- updateProperty(v.getName(), v.formatPropertyValue(parts[1]));
+ updateProperty(
+ translationProvider
+ .getText(HeliosEasyControlsBindingConstants.PROPERTIES_PREFIX + v.getName()),
+ v.formatPropertyValue(parts[1], translationProvider));
} catch (HeliosException e) {
logger.warn("{} encountered Exception when trying to update property: {}",
HeliosEasyControlsHandler.class.getSimpleName(), e.getMessage());
if (state != null) {
updateState(v.getGroupAndName(), state);
updateStatus(ThingStatus.ONLINE);
- // update date format and UTC offset upon read
+ // update date format and messages upon read
if (v.getName().equals(HeliosEasyControlsBindingConstants.DATE_FORMAT)) {
this.dateFormat = Integer.parseInt(value);
+ } else if (v.getName().equals(HeliosEasyControlsBindingConstants.ERRORS)) {
+ this.errors = Long.parseLong(value);
+ } else if (v.getName().equals(HeliosEasyControlsBindingConstants.WARNINGS)) {
+ this.warnings = Integer.parseInt(value);
+ } else if (v.getName().equals(HeliosEasyControlsBindingConstants.INFOS)) {
+ this.infos = Integer.parseInt(value);
}
}
}
case "String":
if (variableType.equals(HeliosVariable.TYPE_STRING)) {
updateState(v.getGroupAndName(), StringType.valueOf(value));
+ if (v.getName().equals(HeliosEasyControlsBindingConstants.STATUS_FLAGS)) {
+ this.statusFlags = value;
+ }
}
break;
case "DateTime":
import org.openhab.core.thing.binding.BaseThingHandlerFactory;
import org.openhab.core.thing.binding.ThingHandler;
import org.openhab.core.thing.binding.ThingHandlerFactory;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
/**
* The {@link HeliosEasyControlsHandlerFactory} is responsible for creating things and thing
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Collections
.singleton(THING_TYPE_HELIOS_VENTILATION_EASY_CONTROLS);
+ private final HeliosEasyControlsTranslationProvider translationProvider;
+
+ @Activate
+ public HeliosEasyControlsHandlerFactory(@Reference HeliosEasyControlsTranslationProvider translationProvider,
+ ComponentContext componentContext) {
+ super.activate(componentContext);
+ this.translationProvider = translationProvider;
+ }
@Override
public boolean supportsThingType(ThingTypeUID thingTypeUID) {
protected @Nullable ThingHandler createHandler(Thing thing) {
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
if (THING_TYPE_HELIOS_VENTILATION_EASY_CONTROLS.equals(thingTypeUID)) {
- return new HeliosEasyControlsHandler(thing);
+ return new HeliosEasyControlsHandler(thing, this.translationProvider);
}
return null;
}
--- /dev/null
+/**
+ * Copyright (c) 2010-2021 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.modbus.helioseasycontrols.internal;
+
+import java.util.Locale;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+
+/**
+ * This class provides translated texts
+ *
+ * @author Bernhard Bauer - Initial contribution
+ */
+@NonNullByDefault
+@Component(service = HeliosEasyControlsTranslationProvider.class)
+public class HeliosEasyControlsTranslationProvider {
+
+ private final Bundle bundle;
+ private final TranslationProvider i18nProvider;
+ private final LocaleProvider localeProvider;
+
+ @Activate
+ public HeliosEasyControlsTranslationProvider(@Reference TranslationProvider i18nProvider,
+ @Reference LocaleProvider localeProvider, BundleContext context) {
+ this.bundle = context.getBundle();
+ this.i18nProvider = i18nProvider;
+ this.localeProvider = localeProvider;
+ }
+
+ public HeliosEasyControlsTranslationProvider(final HeliosEasyControlsTranslationProvider other) {
+ this.bundle = other.bundle;
+ this.i18nProvider = other.i18nProvider;
+ this.localeProvider = other.localeProvider;
+ }
+
+ public String getText(String key, @Nullable Object... arguments) {
+ try {
+ Locale locale = localeProvider.getLocale();
+ String message = i18nProvider.getText(bundle, key, this.getDefaultText(key), locale, arguments);
+ if (message != null) {
+ return message;
+ }
+ } catch (IllegalArgumentException e) {
+ }
+ return "Unable to load message for key " + key;
+ }
+
+ public @Nullable String getDefaultText(String key) {
+ return i18nProvider.getText(bundle, key, key, Locale.ENGLISH);
+ }
+}
if (this.type.equals(HeliosVariable.TYPE_INTEGER)) {
// using long becuase some variable are specified with a max of 2^32-1
// parsing double to allow floating point values to be processed as well
- long l = new Double(value).longValue();
+ long l = Double.valueOf(value).longValue();
return (minVal.longValue() <= l) && (maxVal.longValue() >= l);
} else if (this.type.equals(HeliosVariable.TYPE_FLOAT)) {
double d = Double.parseDouble(value);
return false;
}
+ private String getText(String property, String value, HeliosEasyControlsTranslationProvider translationProvider)
+ throws HeliosException {
+ String key = "property." + property + "." + value;
+ String text = translationProvider.getText(key);
+ if (!key.equals(text)) {
+ return text;
+ } else {
+ throw new HeliosException("Illegal value for variable " + this.getName() + ": " + value);
+ }
+ }
+
/**
* Depending on the type of variable this method formats the provided value according to the interpretation of its
* value
*
* @param value The value to format
+ * @param translationProvider The i18n translation provider to use for finding internationalized texts
* @return The formatted value
* @throws HeliosException if the provided value doesn't fit to the variable
*/
- public String formatPropertyValue(String value) throws HeliosException {
+ public String formatPropertyValue(String value, HeliosEasyControlsTranslationProvider translationProvider)
+ throws HeliosException {
switch (this.getName()) {
case HeliosEasyControlsBindingConstants.DATE_FORMAT:
- switch (value) {
- case "0":
- return "dd.mm.yyyy";
- case "1":
- return "mm.dd.yyyy";
- case "2":
- return "yyyy.mm.dd";
- }
- throw new HeliosException(this.createErrorMessage(value));
case HeliosEasyControlsBindingConstants.UNIT_CONFIG:
- return value.equals("1") ? "DIBt" : "PHI";
+ case HeliosEasyControlsBindingConstants.HEAT_EXCHANGER_TYPE:
+ case HeliosEasyControlsBindingConstants.ASSIGNMENT_FAN_STAGES:
+ case HeliosEasyControlsBindingConstants.VHZ_TYPE:
+ return this.getText(this.getName(), value, translationProvider);
case HeliosEasyControlsBindingConstants.KWL_BE:
case HeliosEasyControlsBindingConstants.KWL_BEC:
- return value.equals("1") ? "On" : "Off";
+ return this.getText("onOff", value, translationProvider);
case HeliosEasyControlsBindingConstants.EXTERNAL_CONTACT:
case HeliosEasyControlsBindingConstants.FUNCTION_TYPE_KWL_EM:
- return "Function " + value;
- case HeliosEasyControlsBindingConstants.HEAT_EXCHANGER_TYPE:
- switch (value) {
- case "1":
- return "Plastic";
- case "2":
- return "Aluminium";
- case "3":
- return "Enthalpy";
- }
- throw new HeliosException(this.createErrorMessage(value));
+ return this.getText("function", value, translationProvider);
case HeliosEasyControlsBindingConstants.OFFSET_EXTRACT_AIR:
case HeliosEasyControlsBindingConstants.VOLTAGE_FAN_STAGE_1_EXTRACT_AIR:
case HeliosEasyControlsBindingConstants.VOLTAGE_FAN_STAGE_2_EXTRACT_AIR:
case HeliosEasyControlsBindingConstants.VOLTAGE_FAN_STAGE_3_SUPPLY_AIR:
case HeliosEasyControlsBindingConstants.VOLTAGE_FAN_STAGE_4_SUPPLY_AIR:
return this.getUnit() != null ? value + this.getUnit() : value;
- case HeliosEasyControlsBindingConstants.ASSIGNMENT_FAN_STAGES:
- return value.equals("0") ? "0...10V" : "stepped";
case HeliosEasyControlsBindingConstants.FAN_STAGE_STEPPED_0TO2V:
case HeliosEasyControlsBindingConstants.FAN_STAGE_STEPPED_2TO4V:
case HeliosEasyControlsBindingConstants.FAN_STAGE_STEPPED_4TO6V:
case HeliosEasyControlsBindingConstants.SENSOR_NAME_HUMIDITY_AND_TEMP_7:
case HeliosEasyControlsBindingConstants.SENSOR_NAME_HUMIDITY_AND_TEMP_8:
return value;
- case HeliosEasyControlsBindingConstants.VHZ_TYPE:
- switch (value) {
- case "1":
- return "EH-basis";
- case "2":
- return "EH-EWR";
- case "3":
- return "SEWT";
- case "4":
- return "LEWT";
- }
- throw new HeliosException(this.createErrorMessage(value));
case HeliosEasyControlsBindingConstants.KWL_FTF_CONFIG_0:
case HeliosEasyControlsBindingConstants.KWL_FTF_CONFIG_1:
case HeliosEasyControlsBindingConstants.KWL_FTF_CONFIG_2:
case HeliosEasyControlsBindingConstants.KWL_FTF_CONFIG_5:
case HeliosEasyControlsBindingConstants.KWL_FTF_CONFIG_6:
case HeliosEasyControlsBindingConstants.KWL_FTF_CONFIG_7:
- switch (value) {
- case "1":
- return "Relative Humidity";
- case "2":
- return "Temperature";
- case "3":
- return "Combined";
- }
- throw new HeliosException(this.createErrorMessage(value));
+ return this.getText("kwlFtfConfig", value, translationProvider);
case HeliosEasyControlsBindingConstants.SENSOR_CONFIG_KWL_FTF_1:
case HeliosEasyControlsBindingConstants.SENSOR_CONFIG_KWL_FTF_2:
case HeliosEasyControlsBindingConstants.SENSOR_CONFIG_KWL_FTF_3:
case HeliosEasyControlsBindingConstants.SENSOR_CONFIG_KWL_FTF_6:
case HeliosEasyControlsBindingConstants.SENSOR_CONFIG_KWL_FTF_7:
case HeliosEasyControlsBindingConstants.SENSOR_CONFIG_KWL_FTF_8:
- return value.equals("0") ? "No sensor" : "Sensor installed";
+ return this.getText("sensorConfig", value, translationProvider);
case HeliosEasyControlsBindingConstants.HUMIDITY_CONTROL_STATUS:
case HeliosEasyControlsBindingConstants.CO2_CONTROL_STATUS:
case HeliosEasyControlsBindingConstants.VOC_CONTROL_STATUS:
- switch (value) {
- case "0":
- return "Off";
- case "1":
- return "Stepped";
- case "2":
- return "Continuous";
- }
- throw new HeliosException(this.createErrorMessage(value));
+ return this.getText("controlStatus", value, translationProvider);
default:
return value;
}
}
- private String createErrorMessage(String value) {
- return "Illegal value for variable " + this.getName() + ": " + value;
- }
-
@Override
public int compareTo(HeliosVariable v) {
return getVariable() - v.getVariable();
xsi:schemaLocation="https://openhab.org/schemas/binding/v1.0.0 https://openhab.org/schemas/binding-1.0.0.xsd">
<name>HeliosEasyControls Binding</name>
- <description>This is the binding for a Helios ventilation system with easyControls using a Modbus TCP implementation.</description>
+ <description>This binding supports the integration of Helios ventilation systems with easyControls using a Modbus TCP
+ implementation.</description>
</binding:binding>
--- /dev/null
+# actions
+
+action.resetFilterChangeTimer.label = reset filter change timer
+action.resetFilterChangeTimer.description = Sets the filter change timer back to the configured interval
+action.resetErrors.label = reset messages
+action.resetErrors.description = Reset error/warning/info messages
+action.resetToFactoryDefaults.label = reset to factory defaults
+action.resetToFactoryDefaults.description = Reset device to factory defaults
+action.resetSwitchingTimes.label = reset individual switching times
+action.resetSwitchingTimes.description = Reset individual switching times
+action.setSysDateTime.label = set system date and time
+action.setSysDateTime.description = Sets the device's system date and time based on OH's system date and time
+action.setBypassFrom.label = set the bypass from day and month
+action.setBypassFrom.description = Sets the day and month from when the bypass should be active
+action.setBypassFrom.inputParams.day.label = bypass from day
+action.setBypassFrom.inputParams.day.description = The day from when the bypass should be active
+action.setBypassFrom.inputParams.month.label = bypass from month
+action.setBypassFrom.inputParams.month.description = The month from when the bypass should be active
+action.setBypassTo.label = set the bypass to day and month
+action.setBypassTo.description = Sets the day and month until when the bypass should be active
+action.setBypassTo.inputParams.day.label = bypass to day
+action.setBypassTo.inputParams.day.description = The day until when the bypass should be active
+action.setBypassTo.inputParams.day.label = bypass to month
+action.setBypassTo.inputParams.day.description = The month until when the bypass should be active
+action.getErrorMessages.label = get the list of error messages
+action.getErrorMessages.description = Returns the list of the device's error messages
+action.getWarningMessages.label = get the list of warning messages
+action.getWarningMessages.description = Returns the list of the device's warning messages
+action.getInfoMessages.label = get the list of info messages
+action.getInfoMessages.description = Returns the list of the device's info messages
+action.getStatusMessages.label = get the list of status messages
+action.getStatusMessages.description = Returns the list of the device's status messages
+action.getMessages.label = get the list of error, warning, info and status messages
+action.getMessages.description = Returns the list of the device's error, warning, info and status messages
--- /dev/null
+# actions
+
+action.resetFilterChangeTimer.label = Restlaufzeit Filter zurücksetzen
+action.resetFilterChangeTimer.description = Setzt die Restlaufzeit des Filters zurück auf das konfigurierte Intervall
+action.resetErrors.label = Nachrichten zurücksetzen
+action.resetErrors.description = Setzt Fehler-/Warnungs- und Info-Nachrichten zurück
+action.resetToFactoryDefaults.label = Werksreset
+action.resetToFactoryDefaults.description = Setzt das Gerät auf die Werkseinstellungen zurück
+action.resetSwitchingTimes.label = Individuelle Schaltzeiten zurücksetzen
+action.resetSwitchingTimes.description = Setzt individuelle Schaltzeiten zurück
+action.setSysDateTime.label = Systemdatum und -uhrzeit setzen
+action.setSysDateTime.description = Setzt das Systemdatum und die -uhrzeit des Geräts besierend auf Systemdatum -und -uhrzeit von OH
+action.setBypassFrom.label = Bypass von Tag und Monat setzen
+action.setBypassFrom.description = Setzt den Tag und das Monat ab wann der Bypass aktiv sein soll
+action.setBypassFrom.inputParams.day.label = Bypass von Tag
+action.setBypassFrom.inputParams.day.description = Der Tag ab wann der Bypass aktiv sein soll
+action.setBypassFrom.inputParams.month.label = Bypass von Monat
+action.setBypassFrom.inputParams.month.description = Das Monat ab wann der Bypass aktiv sein soll
+action.setBypassTo.label = Bypass bis Tag und Monat setzen
+action.setBypassTo.description = Setzt den Tag und das Monat bis wann der Bypass aktiv sein soll
+action.setBypassTo.inputParams.day.label = Bypass bis Tag
+action.setBypassTo.inputParams.day.description = Der Tag bis wann der Bypass aktiv sein soll
+action.setBypassTo.inputParams.day.label = Bypass bis Monat
+action.setBypassTo.inputParams.day.description = Das Monat bis wann der Bypass aktiv sein soll
+action.getErrorMessages.label = Liste der Fehlermeldungen erhalten
+action.getErrorMessages.description = Gibt die Liste der Fehlermeldungen des Geräts zurück
+action.getWarningMessages.label = Liste der Warnmeldungen erhalten
+action.getWarningMessages.description = Gibt die Liste der Warnmeldungen des Geräts zurück
+action.getInfoMessages.label = Liste der Infomeldungen erhalten
+action.getInfoMessages.description = Gibt die Liste der Infomeldungen des Geräts zurück
+action.getStatusMessages.label = Liste der Statusmeldungen erhalten
+action.getStatusMessages.description = Gibt die Liste der Statusmeldungen des Geräts zurück
+action.getMessages.label = Liste der Fehler-, Warn-, Info- und Statusmeldungen erhalten
+action.getMessages.description = Gibt die Liste der Fehler-, Warn-, Info- und Statusmeldungen des Geräts zurück
--- /dev/null
+# Helios easyControls errors according to bit encoding (the number represents the bit encoding the error)
+error.0 = Fan speed error supply air (outside air)
+error.1 = Fan speed error extract air (outgoing air)
+error.2 = n/a
+error.3 = SD card error when writing EEPROM data (flash ring buffer full)
+error.4 = Bus overcurrent
+error.5 = n/a
+error.6 = Basis: error VHZ EH (Zero-crossing detection)
+error.7 = Ext. module (VHZ): error VZH EH (Zero-crossing detection)
+error.8 = Ext. module (NHZ): error NZH EH (Zero-crossing detection)
+error.9 = Basis: Internal temp. sensor error (T1) - outside air (missing or cable break)
+error.10 = Basis: Internal temp. sensor error (T2) - supply air (missing or cable break)
+error.11 = Basis: Internal temp. sensor error (T3) - extract air (missing or cable break)
+error.12 = Basis: Internal temp. sensor error (T4) - outgoing air (missing or cable break)
+error.13 = Basis: Internal temp. sensor error (T1) - outside air (short circuit)
+error.14 = Basis: Internal temp. sensor error (T2) - supply air (short circuit)
+error.15 = Basis: Internal temp. sensor error (T3) - extract air (short circuit)
+error.16 = Basis: Internal temp. sensor error (T4) - outgoing air (short circuit)
+error.17 = Ext. module configured as VHZ, but missing or malfunctioned
+error.18 = Ext. module configured as NHZ, but missing or malfunctioned
+error.19 = Ext. module (VHZ): Duct sensor (T5) - outside air (missing or cable break)
+error.20 = Ext. module (NHZ): Duct sensor (T6) - supply air (missing or cable break)
+error.21 = Ext. module (NHZ): Duct sensor (T7) - return WW-Register (missing or cable break)
+error.22 = Ext. module (VHZ): Duct sensor (T5) - outside air (short circuit)
+error.23 = Ext. module (NHZ): Duct sensor (T6) - supply air (short circuit)
+error.24 = Ext. module (NHZ): Duct sensor (T7) - return WW-Register (short circuit)
+error.25 = Ext. module (VHZ): safety limiter automatic
+error.26 = Ext. module (VHZ): safety limiter manual
+error.27 = Ext. module (NHZ): safety limiter automatic
+error.28 = Ext. module (NHZ): safety limiter manual
+error.29 = Ext. module (NHZ): Frost protection WW-Reg. measured via WW-return (T7) (switching threshold adjustable per variable list e.g. <7°C)
+error.30 = Ext. module (NHZ): Frost protection WW-Reg. measured via supply air sensor (T6) (switching threshold adjustable per variable list e.g. <7°C)
+error.31 = Frost protection external WW Reg.: (fixed <5°C only PHI), measured via supply air duct sensor (ext. module (NHZ) od. basis)
--- /dev/null
+# Helios easyControls errors according to bit encoding (the number represents the bit encoding the error)
+error.0 = Drehzahlfehler Lüfter Zuluft (Außenluft)
+error.1 = Drehzahlfehler Lüfter Abluft (Fortluft)
+error.2 = n/a
+error.3 = SD-Karten-Fehler beim Schreiben der EEPROM Daten (Flash Ringpuffer voll)
+error.4 = Bus Überstrom
+error.5 = n/a
+error.6 = Basis: Fehler VHZ EH (Null-Durchgangserkennung)
+error.7 = Erw. Modul (VHZ): Fehler VZH EH (Null-Durchgangserkennung)
+error.8 = Erw. Modul (NHZ): Fehler NZH EH (Null-Durchgangserkennung)
+error.9 = Basis: Interner Temp-Sensorfehler (T1) - Außenluft (fehlt oder Kabelbruch)
+error.10 = Basis: Interner Temp-Sensorfehler (T2) - Zuluft (fehlt oder Kabelbruch)
+error.11 = Basis: Interner Temp-Sensorfehler (T3) - Abluft (fehlt oder Kabelbruch)
+error.12 = Basis: Interner Temp-Sensorfehler (T4) - Fortluft (fehlt oder Kabelbruch)
+error.13 = Basis: Interner Temp-Sensorfehler (T1) - Außenluft (Kurzschluss)
+error.14 = Basis: Interner Temp-Sensorfehler (T2) - Zuluft (Kurzschluss)
+error.15 = Basis: Interner Temp-Sensorfehler (T3) - Abluft (Kurzschluss)
+error.16 = Basis: Interner Temp-Sensorfehler (T4) - Fortluft (Kurzschluss)
+error.17 = Erw. Modul als VHZ konfiguriert, aber nicht vorh. oder ausgefallen
+error.18 = Erw. Modul als NHZ konfiguriert, aber nicht vorh. oder ausgefallen
+error.19 = Erw. Modul (VHZ): Kanalfühler (T5) - Außenluft (fehlt oder Kabelbruch)
+error.20 = Erw. Modul (NHZ): Kanalfühler (T6) - Zuluft (fehlt oder Kabelbruch)
+error.21 = Erw. Modul (NHZ): Kanalfühler (T7) - Rücklauf WW-Register (fehlt oder Kabelbruch)
+error.22 = Erw. Modul (VHZ): Kanalfühler (T5) - Außenluft (Kurzschluss)
+error.23 = Erw. Modul (NHZ): Kanalfühler (T6) - Zuluft (Kurzschluss)
+error.24 = Erw. Modul (NHZ): Kanalfühler (T7) - Rücklauf WW-Register (Kurzschluss)
+error.25 = Erw. Modul (VHZ): Sicherheitsbegrenzer automatisch
+error.26 = Erw. Modul (VHZ): Sicherheitsbegrenzer manuell
+error.27 = Erw. Modul (NHZ): Sicherheitsbegrenzer automatisch
+error.28 = Erw. Modul (NHZ): Sicherheitsbegrenzer manuell
+error.29 = Erw. Modul (NHZ): Frostschutz WW-Reg. gemessen über WW-Rücklauf (T7) (Schaltschwelle per Variablenliste einstellbar z.B. <7°C)
+error.30 = Erw. Modul (NHZ): Frostschutz WW-Reg. gemessen über Zuluft-Fühler (T6) (Schaltschwelle per Variablenliste einstellbar z.B. <7°C)
+error.31 = Frostschutz externes WW Reg.: (fest <5°C nur PHI), gemessen über Zuluftkanal-Fühler (Erw. Modul (NHZ) od. Basis)
--- /dev/null
+# binding
+binding.modbus.name = HeliosEasyControls Binding
+binding.modbus.description = Dieses Binding erlaubt die Integration von Helios KWL Geräten mit easyControls via Modbus TCP
+
+# thing type
+thing-type.modbus.helios-easycontrols.label = Helios KWL
+thing-type.modbus.helios-easycontrols.description = Erlaubt die Steuerung von Helios KWL Geräten mit easyControls via Modbus TCP
+
+# thing type configuration
+thing-type.config.modbus.helios-easycontrols.refreshInterval.label = Refresh Intervall
+thing-type.config.modbus.helios-easycontrols.refreshInterval.description = Refresh Intervall
+
+# channel groups
+thing-type.modbus.helios-easycontrols.group.general.label = Allgemein
+thing-type.modbus.helios-easycontrols.group.general.description = Allgemeine Parameter / Statusinformationen
+thing-type.modbus.helios-easycontrols.group.operation.label = Betrieb
+thing-type.modbus.helios-easycontrols.group.operation.description = Steuerung der Betriebsarten
+thing-type.modbus.helios-easycontrols.group.unitConfig.label = Gerätekonfiguration
+thing-type.modbus.helios-easycontrols.group.unitConfig.description = Konfigurationsparameter der KWL
+thing-type.modbus.helios-easycontrols.group.profiles.label = Profile
+thing-type.modbus.helios-easycontrols.group.profiles.description = Profile für den Betrieb des Geräts
+thing-type.modbus.helios-easycontrols.group.humidityControl.label = Feuchte-Steuerung
+thing-type.modbus.helios-easycontrols.group.humidityControl.description = Konfiguration der Sensoren für die Feuchte- und/oder Temperatur-Steuerung
+thing-type.modbus.helios-easycontrols.group.co2Control.label = CO2-Steuerung
+thing-type.modbus.helios-easycontrols.group.co2Control.description = Konfiguration der Sensoren für die CO2-Steuerung
+thing-type.modbus.helios-easycontrols.group.vocControl.label = VOC-Steuerung
+thing-type.modbus.helios-easycontrols.group.vocControl.description = Konfiguration der Sensoren für die VOC-Steuerung
+
+# channel group types
+channel-group-type.modbus.general.label = Allgemein
+channel-group-type.modbus.general.description = Allgemeine Parameter / Statusinformationen
+channel-group-type.modbus.operation.label = Betrieb
+channel-group-type.modbus.operation.description = Steuerung der Betriebsarten
+channel-group-type.modbus.unitConfig.label = Gerätekonfiguration
+channel-group-type.modbus.unitConfig.description = Konfigurationsparameter der KWL
+channel-group-type.modbus.profiles.label = Profile
+channel-group-type.modbus.profiles.description = Profile für den Betrieb des Geräts
+channel-group-type.modbus.humidityControl.label = Feuchte-Steuerung
+channel-group-type.modbus.humidityControl.description = Konfiguration der Sensoren für die Feuchte- und/oder Temperatur-Steuerung
+channel-group-type.modbus.co2Control.label = CO2-Steuerung
+channel-group-type.modbus.co2Control.description = Konfiguration der Sensoren für die CO2-Steuerung
+channel-group-type.modbus.vocControl.label = VOC-Steuerung
+channel-group-type.modbus.vocControl.description = Konfiguration der Sensoren für die VOC-Steuerung
+
+# channel types
+channel-type.modbus.sysdate.label = Systemdatum und -uhrzeit
+channel-type.modbus.sysdate.description = Das Systemdatum bzw. die Systemuhrzeit der KWL
+channel-type.modbus.summerWinter.label = Sommer-/Winterzeit
+channel-type.modbus.summerWinter.description = Zeigt an, ob Sommer- oder Winterzeit aktiv ist
+channel-type.modbus.summerWinter.state.option.0 = Winterzeit
+channel-type.modbus.summerWinter.state.option.1 = Sommerzeit
+channel-type.modbus.enableDisable.label = Aktivieren/deaktivieren
+channel-type.modbus.enableDisable.description = Verwendet für Funktionalität die aktiviert oder deaktiviert sein kann
+channel-type.modbus.minFanStage.label = Minimale Lüfterstufe
+channel-type.modbus.minFanStage.description = Minimale Lüfterstufe (0 oder 1)
+channel-type.modbus.onOff.label = Ein/aus
+channel-type.modbus.onOff.description = Verwendet für Konfigurationen die ein- oder ausgeschaltet sein können
+channel-type.modbus.humidityControlSetValue.label = Feuchte-Steuerung Sollwert
+channel-type.modbus.humidityControlSetValue.description = Feuchte-Steuerung Sollwert (in Prozent)
+channel-type.modbus.humidityControlSteps.label = Feuchte-Steuerung Stufen
+channel-type.modbus.humidityControlSteps.description = Feuchte-Steuerung Stufen (in Prozent)
+channel-type.modbus.humidityStopTime.label = Feuchte-Steuerung Stoppzeit
+channel-type.modbus.humidityStopTime.description = Feuchte-Steuerung Stoppzeit in Stunden (0-24)
+channel-type.modbus.ppmControlSetValue.label = Sollwert ppm-Steuerung
+channel-type.modbus.ppmControlSetValue.description = Sollwert für ppm-basierte Steuerung (in ppm)
+channel-type.modbus.ppmControlSteps.label = Stufen ppm-Steuerung
+channel-type.modbus.ppmControlSteps.description = Stufen für ppm-basierte Steuerung (in ppm)
+channel-type.modbus.comfortTemp.label = Komforttemperatur
+channel-type.modbus.comfortTemp.description = Komforttemperatur
+channel-type.modbus.duration.label = Dauer
+channel-type.modbus.duration.description = Dauer für Betriebsarten (in Minuten)
+channel-type.modbus.fanStage.label = Lüfterstufe
+channel-type.modbus.fanStage.description = Lüfterstufe
+channel-type.modbus.remainingTime.label = Restzeit
+channel-type.modbus.remainingTime.description = Restzeit für Betriebsarten (in Minuten)
+channel-type.modbus.operatingMode.label = Betriebsart
+channel-type.modbus.operatingMode.description = Betriebsart (automatisch/manuell)
+channel-type.modbus.operatingMode.state.option.0 = automatisch
+channel-type.modbus.operatingMode.state.option.1 = manuell
+channel-type.modbus.percentage.label = Prozentwert
+channel-type.modbus.percentage.description = Prozentwert
+channel-type.modbus.temperature.label = Temperatur
+channel-type.modbus.temperature.description = Temperatur
+channel-type.modbus.sensorValue.label = Sensorwert
+channel-type.modbus.sensorValue.description = Messwert eines Sensors
+channel-type.modbus.weekProfileNhz.label = Wochenprofil NHZ
+channel-type.modbus.weekProfileNhz.description = Wochenprofil NHZ
+channel-type.modbus.weekProfileNhz.state.option.0 = Standard 1
+channel-type.modbus.weekProfileNhz.state.option.1 = Standard 2
+channel-type.modbus.weekProfileNhz.state.option.2 = Festwert
+channel-type.modbus.weekProfileNhz.state.option.3 = Individuell 1
+channel-type.modbus.weekProfileNhz.state.option.4 = Individuell 2
+channel-type.modbus.weekProfileNhz.state.option.5 = NA
+channel-type.modbus.weekProfileNhz.state.option.6 = aus
+channel-type.modbus.rpm.label = RPM
+channel-type.modbus.rpm.description = RPM
+channel-type.modbus.holidayProgramme.label = Urlaubsprogramm
+channel-type.modbus.holidayProgramme.description = Urlaubsprogramm
+channel-type.modbus.holidayProgramme.state.option.0 = aus
+channel-type.modbus.holidayProgramme.state.option.1 = Intervall
+channel-type.modbus.holidayProgramme.state.option.2 = konstant
+channel-type.modbus.date.label = Datum
+channel-type.modbus.date.description = Datum
+channel-type.modbus.holidayProgrammeInterval.label = Intervall Urlaubsprogramm
+channel-type.modbus.holidayProgrammeInterval.description = Intervall Urlaubsprogramm (in Stunden)
+channel-type.modbus.holidayProgrammeActivationTime.label = Urlaubsprogramm Einschaltzeit
+channel-type.modbus.holidayProgrammeActivationTime.description = Urlaubsprogramm Einschaltzeit (in Minuten)
+channel-type.modbus.runOnTimeVhzNhz.label = Nachlaufzeit VHZ/NHZ
+channel-type.modbus.runOnTimeVhzNhz.description = Nachlaufzeit VHZ/NHZ (in Sekunden)
+channel-type.modbus.errorOutputFunction.label = Funktion Störausgang
+channel-type.modbus.errorOutputFunction.description = Funktion Störausgang (Sammelstörung oder nur Fehler)
+channel-type.modbus.errorOutputFunction.state.option.1 = Sammelstörung
+channel-type.modbus.errorOutputFunction.state.option.2 = nur Fehler
+channel-type.modbus.filterChange.label = Filterwechsel
+channel-type.modbus.filterChange.description = Filterwechsel
+channel-type.modbus.filterChange.state.option.0 = nein
+channel-type.modbus.filterChange.state.option.1 = ja
+channel-type.modbus.filterChangeInterval.label = Intervall Filterwechsel
+channel-type.modbus.filterChangeInterval.description = Intervall Filterwechsel (in Monaten)
+channel-type.modbus.filterChangeRemainingTime.label = Filter Restlaufzeit
+channel-type.modbus.filterChangeRemainingTime.description = Filter Restlaufzeit (in Minuten)
+channel-type.modbus.bypassRoomTemperature.label = Bypass Raumtemperatur
+channel-type.modbus.bypassRoomTemperature.description = Bypass Raumtemperatur
+channel-type.modbus.bypassMinOutsideTemperature.label = Minimale Auß\9fentemperatur für Bypass
+channel-type.modbus.bypassMinOutsideTemperature.description = Minimale Auß\9fentemperatur für Bypass
+channel-type.modbus.offsetExtractAir.label = Offset Abluft
+channel-type.modbus.offsetExtractAir.description = Offset Abluft
+channel-type.modbus.operatingHours.label = Betriebsstunden
+channel-type.modbus.operatingHours.description = Betriebsstunden (in Minuten)
+channel-type.modbus.outputPower.label = Leistung
+channel-type.modbus.outputPower.description = Leistung VHZ/NHZ (in Prozent)
+channel-type.modbus.errors.label = Fehler
+channel-type.modbus.errors.description = Fehler codiert als ganzzahliger Wert
+channel-type.modbus.warnings.label = Warnungen
+channel-type.modbus.warnings.description = Warnungen codiert als ganzzahliger Wert
+channel-type.modbus.infos.label = Infos
+channel-type.modbus.infos.description = Infos codiert als ganzzahliger Wert
+channel-type.modbus.noOfErrors.label = Anzahl Fehler
+channel-type.modbus.noOfErrors.description = Anzahl Fehler
+channel-type.modbus.noOfWarnings.label = Anzahl Warnungen
+channel-type.modbus.noOfWarnings.description = Anzahl Warnungen
+channel-type.modbus.noOfInfos.label = Anzahl Infos
+channel-type.modbus.noOfInfos.description = Anzahl Infos
+channel-type.modbus.message.label = Fehler / Warnungen / Infos
+channel-type.modbus.message.description = Fehler / Warnungen / Infos codiert als Zeichenkette
+channel-type.modbus.sensorConfig.label = Sensor-Konfiguration
+channel-type.modbus.sensorConfig.description = Sensor-Konfiguration (installiert oder nicht)
+channel-type.modbus.bypassStatus.label = Status Bypass
+channel-type.modbus.bypassStatus.description = Status Bypass
+channel-type.modbus.bypass.label = Bypass aktiv von/bis (Tag und Monat)
+channel-type.modbus.bypass.description = Bypass wird von diesem Tag und Monat an aktiviert/deaktiviert
+
+# channels (general)
+channel-group-type.modbus.general.channel.preHeaterStatus.label = Status Vorheizung
+channel-group-type.modbus.general.channel.preHeaterStatus.description = Status Vorheizung
+channel-group-type.modbus.general.channel.nhzDuctSensor.label = NHZ Kanalfühler
+channel-group-type.modbus.general.channel.nhzReturnSensor.label = NHZ Rücklauffühler
+channel-group-type.modbus.general.channel.vhzDuctSensor.label = VHZ Kanalfühler
+channel-group-type.modbus.general.channel.temperatureOutsideAir.label = Temperatur Auߟenluft
+channel-group-type.modbus.general.channel.temperatureSupplyAir.label = Temperatur Zuluft
+channel-group-type.modbus.general.channel.temperatureOutgoingAir.label = Temperatur Fortluft
+channel-group-type.modbus.general.channel.temperatureExtractAir.label = Temperatur Abluft
+channel-group-type.modbus.general.channel.supplyAirRpm.label = Zuluft RPM
+channel-group-type.modbus.general.channel.extractAirRpm.label = Abluft RPM
+channel-group-type.modbus.general.channel.operatingHoursSupplyAirVent.label = Betriebsstunden Zuluft-Ventilator
+channel-group-type.modbus.general.channel.operatingHoursExtractAirVent.label = Betriebsstunden Abluft-Ventilator
+channel-group-type.modbus.general.channel.operatingHoursVhz.label = Betriebsstunden VHZ
+channel-group-type.modbus.general.channel.operatingHoursNhz.label = Betriebsstunden NHZ
+channel-group-type.modbus.general.channel.outputPowerVhz.label = Leistung VHZ
+channel-group-type.modbus.general.channel.outputPowerNhz.label = Leistung NHZ
+channel-group-type.modbus.general.channel.autoSwUpdate.label = Auto SW Update
+channel-group-type.modbus.general.channel.autoSwUpdate.description = Zeigt an, ob automatische Software-Updates aktiviert sind
+channel-group-type.modbus.general.channel.accessHeliosPortal.label = Access Helios Portal
+channel-group-type.modbus.general.channel.accessHeliosPortal.description = Zeigt an, ob Zugriff auf das Helios-Portal aktiviert ist
+channel-group-type.modbus.operation.channel.partyModeDuration.label = Partybetrieb Dauer
+channel-group-type.modbus.operation.channel.preHeaterStatus.description = Partybetrieb Dauer (in Minuten)
+channel-group-type.modbus.operation.channel.partyModeFanStage.label = Partybetrieb Lüfterstufe
+channel-group-type.modbus.operation.channel.partyModeFanStage.description = Partybetrieb Lüfterstufe
+channel-group-type.modbus.operation.channel.partyModeRemainingTime.label = Partybetrieb Restzeit
+channel-group-type.modbus.operation.channel.partyModeRemainingTime.description = Partybetrieb Restzeit
+channel-group-type.modbus.operation.channel.partyModeStatus.label = Partybetrieb Status
+channel-group-type.modbus.operation.channel.partyModeStatus.description = Partybetrieb Status
+channel-group-type.modbus.operation.channel.standbyModeDuration.label = Ruhebetrieb Dauer
+channel-group-type.modbus.operation.channel.standbyaterStatus.description = Ruhebetrieb Dauer (in Minuten)
+channel-group-type.modbus.operation.channel.standbyModeFanStage.label = Ruhebetrieb Lüfterstufe
+channel-group-type.modbus.operation.channel.standbyModeFanStage.description = Ruhebetrieb Lüfterstufe
+channel-group-type.modbus.operation.channel.standbyModeRemainingTime.label = Ruhebetrieb Restzeit
+channel-group-type.modbus.operation.channel.standbyModeRemainingTime.description = Ruhebetrieb Restzeit
+channel-group-type.modbus.operation.channel.standbyModeStatus.label = Ruhebetrieb Status
+channel-group-type.modbus.operation.channel.standbyModeStatus.description = Ruhebetrieb Status
+channel-group-type.modbus.operation.channel.holidayProgrammeStart.label = Urlaubsprogramm Start
+channel-group-type.modbus.operation.channel.holidayProgrammeStart.description = Urlaubsprogramm Start
+channel-group-type.modbus.operation.channel.holidayProgrammeEnd.label = Urlaubsprogramm Ende
+channel-group-type.modbus.operation.channel.holidayProgrammeEnd.description = Urlaubsprogramm Ende
+channel-group-type.modbus.operation.channel.percentageFanStage.label = Prozentuelle Lüfterstufe
+channel-group-type.modbus.operation.channel.percentageFanStage.description = Prozentuelle Lüfterstufe
+channel-group-type.modbus.co2Control.channel.co2ControlSetValue.label = Status CO2-Steuerung
+channel-group-type.modbus.co2Control.channel.co2ControlSetValue.description = Status CO2-Steuerung
+channel-group-type.modbus.co2Control.channel.co2ControlSteps.label = Stufen CO2-Steuerung
+channel-group-type.modbus.co2Control.channel.co2ControlSteps.description = Stufen CO2-Steuerung (in ppm)
+channel-group-type.modbus.vocControl.channel.vocControlSetValue.label = Status VOC-Steuerung
+channel-group-type.modbus.vocControl.channel.vocControlSetValue.description = Status VOC-Steuerung
+channel-group-type.modbus.vocControl.channel.vocControlSteps.label = Stufen VOC-Steuerung
+channel-group-type.modbus.vocControl.channel.vocControlSteps.description = Stufen VOC-Steuerung (in ppm)
--- /dev/null
+# Helios easyControls infos according to bit encoding (the number represents the bit encoding the info)
+info.0 = Filter change
+info.1 = Frost protection WT
+info.2 = SD card error
+info.3 = Failure of external module (more info in log file)
+info.4 = n/a
+info.5 = n/a
+info.6 = n/a
+info.7 = n/a
--- /dev/null
+# Helios easyControls infos according to bit encoding (the number represents the bit encoding the info)
+info.0 = Filterwechsel
+info.1 = Frostschutz WT
+info.2 = SD-Karten Fehler
+info.3 = Ausfall eines externen Moduls (weitere Info im Logfile)
+info.4 = n/a
+info.5 = n/a
+info.6 = n/a
+info.7 = n/a
--- /dev/null
+# Thing properties
+property.articleDescription = Article Description
+property.refNo = Ref No
+property.macAddress = MAC Address
+property.language = Language
+property.voltageFanStage1ExtractAir = Voltage Fan Stage 1 Extract Air
+property.voltageFanStage2ExtractAir = Voltage Fan Stage 2 Extract Air
+property.voltageFanStage3ExtractAir = Voltage Fan Stage 3 Extract Air
+property.voltageFanStage4ExtractAir = Voltage Fan Stage 4 Extract Air
+property.voltageFanStage1SupplyAir = Voltage Fan Stage 1 Supply Air
+property.voltageFanStage2SupplyAir = Voltage Fan Stage 2 Supply Air
+property.voltageFanStage3SupplyAir = Voltage Fan Stage 3 Supply Air
+property.voltageFanStage4SupplyAir = Voltage Fan Stage 4 Supply Air
+property.kwlBe = KWL-BE active
+property.kwlBec = KWL-BEC active
+property.unitConfig = Unit Config
+property.unitConfig.1 = DIBt
+property.unitConfig.2 = PHI
+property.kwlFtfConfig0 = KWL-FTF Config 0
+property.kwlFtfConfig1 = KWL-FTF Config 1
+property.kwlFtfConfig2 = KWL-FTF Config 2
+property.kwlFtfConfig3 = KWL-FTF Config 3
+property.kwlFtfConfig4 = KWL-FTF Config 4
+property.kwlFtfConfig5 = KWL-FTF Config 5
+property.kwlFtfConfig6 = KWL-FTF Config 6
+property.kwlFtfConfig7 = KWL-FTF Config 7
+property.humidityControlStatus = Humidity Control Status
+property.co2ControlStatus = CO2 Control Status
+property.vocControlStatus = VOC Control Status
+property.dateFormat = Date Format
+property.dateFormat.0 = dd.mm.yyyy
+property.dateFormat.1 = mm.dd.yyyy
+property.dateFormat.2 = yyyy.mm.dd
+property.heatExchangerType = Heat Exchanger Type
+property.heatExchangerType.1 = Plastic
+property.heatExchangerType.2 = Aluminium
+property.heatExchangerType.3 = Enthalpy
+property.serNo = Serial No
+property.prodCode = Production Code
+property.vhzType = Pre Heater Type
+property.vhzType.1 = EH-Basis
+property.vhzType.2 = EH-ERW
+property.vhzType.3 = SEWT
+property.vhzType.4 = LEWT
+property.functionTypeKwlEm = Function Type KWL-EM
+property.externalContact = External Contact
+property.fanStageStepped0to2v = Fan Stage Stepped 0-2V
+property.fanStageStepped2to4v = Fan Stage Stepped 2-4V
+property.fanStageStepped4to6v = Fan Stage Stepped 4-6V
+property.fanStageStepped6to8v = Fan Stage Stepped 6-8V
+property.fanStageStepped8to10v = Fan Stage Stepped 8-10V
+property.offsetExtractAir = Offset Ext Air
+property.assignmentFanStages = Assignment Fan Stages
+property.assignmentFanStages.0 = 0..10V
+property.assignmentFanStages.1 = Stepped
+property.sensorNameHumidityAndTemp1 = Sensor Name Humidity+Temperature 1
+property.sensorNameHumidityAndTemp2 = Sensor Name Humidity+Temperature 2
+property.sensorNameHumidityAndTemp3 = Sensor Name Humidity+Temperature 3
+property.sensorNameHumidityAndTemp4 = Sensor Name Humidity+Temperature 4
+property.sensorNameHumidityAndTemp5 = Sensor Name Humidity+Temperature 5
+property.sensorNameHumidityAndTemp6 = Sensor Name Humidity+Temperature 6
+property.sensorNameHumidityAndTemp7 = Sensor Name Humidity+Temperature 7
+property.sensorNameHumidityAndTemp8 = Sensor Name Humidity+Temperature 8
+property.sensorNameCo21 = Sensor Name CO2 1
+property.sensorNameCo22 = Sensor Name CO2 2
+property.sensorNameCo23 = Sensor Name CO2 3
+property.sensorNameCo24 = Sensor Name CO2 4
+property.sensorNameCo25 = Sensor Name CO2 5
+property.sensorNameCo26 = Sensor Name CO2 6
+property.sensorNameCo27 = Sensor Name CO2 7
+property.sensorNameCo28 = Sensor Name CO2 8
+property.sensorNameVoc1 = Sensor Name VOC 1
+property.sensorNameVoc2 = Sensor Name VOC 2
+property.sensorNameVoc3 = Sensor Name VOC 3
+property.sensorNameVoc4 = Sensor Name VOC 4
+property.sensorNameVoc5 = Sensor Name VOC 5
+property.sensorNameVoc6 = Sensor Name VOC 6
+property.sensorNameVoc7 = Sensor Name VOC 7
+property.sensorNameVoc8 = Sensor Name VOC 8
+property.softwareVersionBasis = SW Version Basis
+property.sensorConfigKwlFtf1 = Sensor Config KWL-FTF 1
+property.sensorConfigKwlFtf2 = Sensor Config KWL-FTF 2
+property.sensorConfigKwlFtf3 = Sensor Config KWL-FTF 3
+property.sensorConfigKwlFtf4 = Sensor Config KWL-FTF 4
+property.sensorConfigKwlFtf5 = Sensor Config KWL-FTF 5
+property.sensorConfigKwlFtf6 = Sensor Config KWL-FTF 6
+property.sensorConfigKwlFtf7 = Sensor Config KWL-FTF 7
+property.sensorConfigKwlFtf8 = Sensor Config KWL-FTF 8
+
+# general values
+property.onOff.1 = On
+property.onOff.0 = Off
+property.function.1 = Function 1
+property.function.2 = Function 2
+property.function.3 = Function 3
+property.function.4 = Function 4
+property.function.5 = Function 5
+property.function.6 = Function 6
+property.kwlFtfConfig.1 = Relative Humidity
+property.kwlFtfConfig.2 = Temperature
+property.kwlFtfConfig.3 = Relative Humidity and Temperature
+property.sensorConfig.0 = No sensor
+property.sensorConfig.1 = Sensor installed
+property.controlStatus.0 = Off
+property.controlStatus.1 = Stepped
+property.controlStatus.2 = Continuous
--- /dev/null
+# Thing properties
+property.articleDescription = Artikelbeschreibung
+property.refNo = Ref Nr
+property.macAddress = MAC Adresse
+property.language = Sprache
+property.voltageFanStage1ExtractAir = Spannung Lüfterstufe 1 Abluft
+property.voltageFanStage2ExtractAir = Spannung Lüfterstufe 2 Abluft
+property.voltageFanStage3ExtractAir = Spannung Lüfterstufe 3 Abluft
+property.voltageFanStage4ExtractAir = Spannung Lüfterstufe 4 Abluft
+property.voltageFanStage1SupplyAir = Spannung Lüfterstufe 1 Zuluft
+property.voltageFanStage2SupplyAir = Spannung Lüfterstufe 2 Zuluft
+property.voltageFanStage3SupplyAir = Spannung Lüfterstufe 3 Zuluft
+property.voltageFanStage4SupplyAir = Spannung Lüfterstufe 4 Zuluft
+property.kwlBe = KWL-BE aktiv
+property.kwlBec = KWL-BEC aktiv
+property.unitConfig = Gerätekonfiguration
+property.unitConfig.1 = DIBt
+property.unitConfig.2 = PHI
+property.kwlFtfConfig0 = KWL-FTF Konfiguration 0
+property.kwlFtfConfig1 = KWL-FTF Konfiguration 1
+property.kwlFtfConfig2 = KWL-FTF Konfiguration 2
+property.kwlFtfConfig3 = KWL-FTF Konfiguration 3
+property.kwlFtfConfig4 = KWL-FTF Konfiguration 4
+property.kwlFtfConfig5 = KWL-FTF Konfiguration 5
+property.kwlFtfConfig6 = KWL-FTF Konfiguration 6
+property.kwlFtfConfig7 = KWL-FTF Konfiguration 7
+property.humidityControlStatus = Status Feuchte-Steuerung
+property.co2ControlStatus = Status CO2-Steuerung
+property.vocControlStatus = Status VOC-Steuerung
+property.dateFormat = Datumsformat
+property.dateFormat.0 = dd.mm.yyyy
+property.dateFormat.1 = mm.dd.yyyy
+property.dateFormat.2 = yyyy.mm.dd
+property.heatExchangerType = Wärmetauscher Typ
+property.heatExchangerType.1 = Kunststoff
+property.heatExchangerType.2 = Aluminium
+property.heatExchangerType.3 = Enthalpie
+property.serNo = Seriennummer
+property.prodCode = Produktions-Code
+property.vhzType = VHZ Typ
+property.vhzType.1 = EH-Basis
+property.vhzType.2 = EH-ERW
+property.vhzType.3 = SEWT
+property.vhzType.4 = LEWT
+property.functionTypeKwlEm = Funktion KWL-EM
+property.externalContact = Externer Kontakt
+property.fanStageStepped0to2v = Lüfterstufe stufig 0-2V
+property.fanStageStepped2to4v = Lüfterstufe stufig 2-4V
+property.fanStageStepped4to6v = Lüfterstufe stufig 4-6V
+property.fanStageStepped6to8v = Lüfterstufe stufig 6-8V
+property.fanStageStepped8to10v = Lüfterstufe stufig 8-10V
+property.offsetExtractAir = Offset Abluft
+property.assignmentFanStages = Zuordnung Lüfterstufen
+property.assignmentFanStages.0 = 0..10V
+property.assignmentFanStages.1 = Stufig
+property.sensorNameHumidityAndTemp1 = Sensorname Feuchte+Temperatur 1
+property.sensorNameHumidityAndTemp2 = Sensorname Feuchte+Temperatur 2
+property.sensorNameHumidityAndTemp3 = Sensorname Feuchte+Temperatur 3
+property.sensorNameHumidityAndTemp4 = Sensorname Feuchte+Temperatur 4
+property.sensorNameHumidityAndTemp5 = Sensorname Feuchte+Temperatur 5
+property.sensorNameHumidityAndTemp6 = Sensorname Feuchte+Temperatur 6
+property.sensorNameHumidityAndTemp7 = Sensorname Feuchte+Temperatur 7
+property.sensorNameHumidityAndTemp8 = Sensorname Feuchte+Temperatur 8
+property.sensorNameCo21 = Sensorname CO2 1
+property.sensorNameCo22 = Sensorname CO2 2
+property.sensorNameCo23 = Sensorname CO2 3
+property.sensorNameCo24 = Sensorname CO2 4
+property.sensorNameCo25 = Sensorname CO2 5
+property.sensorNameCo26 = Sensorname CO2 6
+property.sensorNameCo27 = Sensorname CO2 7
+property.sensorNameCo28 = Sensorname CO2 8
+property.sensorNameVoc1 = Sensorname VOC 1
+property.sensorNameVoc2 = Sensorname VOC 2
+property.sensorNameVoc3 = Sensorname VOC 3
+property.sensorNameVoc4 = Sensorname VOC 4
+property.sensorNameVoc5 = Sensorname VOC 5
+property.sensorNameVoc6 = Sensorname VOC 6
+property.sensorNameVoc7 = Sensorname VOC 7
+property.sensorNameVoc8 = Sensorname VOC 8
+property.softwareVersionBasis = SW Version Basis
+property.sensorConfigKwlFtf1 = Sensor Konfiguration KWL-FTF 1
+property.sensorConfigKwlFtf2 = Sensor Konfiguration KWL-FTF 2
+property.sensorConfigKwlFtf3 = Sensor Konfiguration KWL-FTF 3
+property.sensorConfigKwlFtf4 = Sensor Konfiguration KWL-FTF 4
+property.sensorConfigKwlFtf5 = Sensor Konfiguration KWL-FTF 5
+property.sensorConfigKwlFtf6 = Sensor Konfiguration KWL-FTF 6
+property.sensorConfigKwlFtf7 = Sensor Konfiguration KWL-FTF 7
+property.sensorConfigKwlFtf8 = Sensor Konfiguration KWL-FTF 8
+
+# general values
+property.onOff.1 = Ein
+property.onOff.0 = Aus
+property.function.1 = Funktion 1
+property.function.2 = Funktion 2
+property.function.3 = Funktion 3
+property.function.4 = Funktion 4
+property.function.5 = Funktion 5
+property.function.6 = Funktion 6
+property.kwlFtfConfig.1 = Relative Luftfeuchtigkeit
+property.kwlFtfConfig.2 = Temperatur
+property.kwlFtfConfig.3 = Relative Luftfeuchtigkeit und Temperatur
+property.sensorConfig.0 = Kein sensor
+property.sensorConfig.1 = Sensor installiert
+property.controlStatus.0 = Aus
+property.controlStatus.1 = Stufig
+property.controlStatus.2 = Stufenlos
--- /dev/null
+# Helios easyControls status flags according to bit encoding (the first number represents the bit encoding the status flag,
+# the second number indicates the possible bit states)
+stateflag.0.1 = System pre-initialized (display in BT in the meantime: SYSTEM BOOTING)
+stateflag.1.1 = System software update active (display in BT in the meantime: SYSTEM LOADING)
+stateflag.2.1 = Firware update is activated
+stateflag.3.1 = INBA is active
+stateflag.4.1 = Party mode
+stateflag.5.1 = Standby mode
+stateflag.6.1 = Holiday mode
+stateflag.7.1 = VHZ is configured on Basis-Module
+stateflag.8.1 = VHZ is configured on ext. module
+stateflag.9.1 = Ext. module VHZ active (e.g. BT display: Menu item VHZ overlay)
+stateflag.10.1 = VHZ configured
+stateflag.11.0 = VHZ: Heating type electrical
+stateflag.11.1 = VHZ: Heating type brine (earth or air)
+stateflag.12.1 = NHZ configured (temperature profile set unequal HEATING OFF)
+stateflag.13.1 = Ext. module NHZ active (e.g. BT display: Menu item NHZ overlay)
+stateflag.14.1 = NHZ active (control, error, identical to "Auxiliary heating.On")
+stateflag.15.0 = NHZ: Heating type electrical
+stateflag.15.1 = NHZ: Heating type warm water
+stateflag.16.1 = CO2 control on
+stateflag.17.1 = Humi control on
+stateflag.18.1 = VOC control on
+stateflag.19.1 = n/a
+stateflag.20.1 = min. an external contact connected (EM or ES)
+stateflag.21.1 = External contact function active
+stateflag.22.1 = External access permitted
+stateflag.23.1 = External access active
+stateflag.24.1 = Defrost heat exchanger
+stateflag.25.1 = Defrost warm water register
+stateflag.26.1 = Filter change due
+stateflag.27.0 = Config_2 (PHI)
+stateflag.27.1 = Config_1 (DIBT)
+stateflag.28.1 = BEC-U1 deactivated via web (pure display function)
+stateflag.29.1 = Lock control panel
+stateflag.30.1 = Master Password required (set when incorrect PW has been entered 3 times)
+stateflag.31.1 = Fan stage display in %
+
+stateflag.unavailable = Status messages have not yet been read from the device
--- /dev/null
+# Helios easyControls status flags according to bit encoding (the first number represents the bit encoding the status flag,
+# the second number indicates the possible bit states)
+stateflag.0.1 = System fertig initialisiert (Anzeige im BT bis dahin: SYSTEM BOOTING)
+stateflag.1.1 = System Softwareupdate aktiv (Anzeige im BT bis dahin: SYSTEM LOADING)
+stateflag.2.1 = Firwareupdate wird aktiviert
+stateflag.3.1 = INBA ist aktiv
+stateflag.4.1 = Partybetrieb
+stateflag.5.1 = Ruhebetrieb
+stateflag.6.1 = Urlaubsbetrieb
+stateflag.7.1 = VHZ ist auf Basis-Modul konfiguriert
+stateflag.8.1 = VHZ ist auf ErwModul konfiguriert
+stateflag.9.1 = ErwModul VHZ aktiv (z.B. BT-Anzeige: Menüpunkt VHZ einblenden)
+stateflag.10.1 = VHZ konfiguriert
+stateflag.11.0 = VHZ: Heizungstyp elektrisch
+stateflag.11.1 = VHZ: Heizungstyp Sole (Erde oder Luft)
+stateflag.12.1 = NHZ konfiguriert (Temperatur eingestellt ungl. HEIZUNG AUS)
+stateflag.13.1 = ErwModul NHZ aktiv (z.B. BT-Anzeige: Menüpunkt NHZ einblenden)
+stateflag.14.1 = NHZ aktiv (Regelung, Fehler, identisch mit "Nachheizung.Ein")
+stateflag.15.0 = NHZ: Heizungstyp elektrisch
+stateflag.15.1 = NHZ: Heizungstyp Warmwasser
+stateflag.16.1 = CO2 Regelung ein
+stateflag.17.1 = Humi Regelung ein
+stateflag.18.1 = VOC Regelung ein
+stateflag.19.1 = n/a
+stateflag.20.1 = min. ein externer Kontakt angeschlossen (EM oder ES)
+stateflag.21.1 = Externe Kontaktfunktion aktiv
+stateflag.22.1 = Externen Zugriff zulassen
+stateflag.23.1 = Externer Zugriff aktiv
+stateflag.24.1 = Defrost Wärmetauscher
+stateflag.25.1 = Defrost Warmwasserregister
+stateflag.26.1 = Filterwechsel fällig
+stateflag.27.0 = Konfig_2 (PHI)
+stateflag.27.1 = Konfig_1 (DIBT)
+stateflag.28.1 = BEC-U1 über Web deaktiviert (reine Anzeigefunktion)
+stateflag.29.1 = Bedienteil sperren
+stateflag.30.1 = Master Password required (Wird gesetzt wenn 3x falsches PW eingegeben wurde)
+stateflag.31.1 = Anzeige der Lüfterstufe in %
+
+stateflag.unavailable = Statusmeldungen wurden noch nicht vom Gerät übertragen
--- /dev/null
+# Helios easyControls warnings according to bit encoding (the number represents the bit encoding the warning)
+warning.0 = Internal humidity sensor provides no value
+warning.1 = n/a
+warning.2 = n/a
+warning.3 = n/a
+warning.4 = n/a
+warning.5 = n/a
+warning.6 = n/a
+warning.7 = n/a
--- /dev/null
+# Helios easyControls warnings according to bit encoding (the number represents the bit encoding the warning)
+warning.0 = Interner Feuchtefühler liefert keinen Wert
+warning.1 = n/a
+warning.2 = n/a
+warning.3 = n/a
+warning.4 = n/a
+warning.5 = n/a
+warning.6 = n/a
+warning.7 = n/a
<description>VOC control status</description>
</channel>
<channel id="vocControlSteps" typeId="ppmControlSteps">
- <label>CO2 Control Steps</label>
- <description>CO2 control steps (in ppm)</description>
+ <label>VOC Control Steps</label>
+ <description>VOC control steps (in ppm)</description>
</channel>
<!-- External CO2 Sensors -->
<channel id="externalSensorKwlVoc1" typeId="sensorValue"/>
<channel-type id="runOnTimeVhzNhz" advanced="true">
<item-type>Number:Time</item-type>
<label>Stopping Time Preheater/Afterheater</label>
- <description>Stopping time preheater/afterheater in seconds</description>
+ <description>Stopping time preheater/afterheater</description>
<category>Heating</category>
<state min="60" max="120" step="1" pattern="%d %unit%" readOnly="false"/>
</channel-type>
<channel-type id="errors" advanced="false">
<item-type>Number</item-type>
<label>Errors</label>
- <description>Errors as integer value</description>
+ <description>Errors encoded as integer value</description>
<state min="0" max="4294967295" step="1" pattern="%d" readOnly="true"/>
</channel-type>
<channel-type id="warnings" advanced="false">
<item-type>Number</item-type>
<label>Warnings</label>
- <description>Warnings as integer value</description>
+ <description>Warnings encoded as integer value</description>
<state min="0" max="255" step="1" pattern="%d" readOnly="true"/>
</channel-type>
<channel-type id="infos" advanced="false">
<item-type>Number</item-type>
<label>Infos</label>
- <description>Infos as integer value</description>
+ <description>Infos encoded as integer value</description>
<state min="0" max="255" step="1" pattern="%d" readOnly="true"/>
</channel-type>