[helioseasycontrols] Internationalization + actions for messages - Attempt 2 (#9772)

* Internationalization + actions for messages

- Internationalization of UI relevant texts
- Better support for the error/warning/info/status messages received
from the device

Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Review inputs + improvements

- inputs from @ssalonen
- additional action to retrieve all messages collectively
- added rule example for handling the collective message action
- added semantic tags in items example

Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* mvn spotless:apply

Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Update bundles/org.openhab.binding.modbus.helioseasycontrols/README.md

Co-authored-by: Fabian Wolter <github@fabian-wolter.de>
Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Update bundles/org.openhab.binding.modbus.helioseasycontrols/README.md

Co-authored-by: Fabian Wolter <github@fabian-wolter.de>
Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Update bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/java/org/openhab/binding/modbus/helioseasycontrols/internal/HeliosEasyControlsHandler.java

Co-authored-by: Fabian Wolter <github@fabian-wolter.de>
Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Update bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/helioseasycontrols_de.properties

Co-authored-by: Fabian Wolter <github@fabian-wolter.de>
Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Update bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/thing/thing-types.xml

Co-authored-by: Fabian Wolter <github@fabian-wolter.de>
Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Review inputs from @fwolter

Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Inputs from @fwolter

- changed return type for actions with a single return value
- corrected findings from static code analysis

Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Removed configurationPid from TranslationProvider

Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Changes requested by @fwolter

Signed-off-by: Bernhard Bauer <bern77@gmail.com>

* Changed log level to debug when catching InterruptedException

Signed-off-by: Bernhard Bauer <bern77@gmail.com>

Co-authored-by: Fabian Wolter <github@fabian-wolter.de>
This commit is contained in:
Bernhard Bauer 2021-02-06 17:19:01 +01:00 committed by GitHub
parent 32fa27aaba
commit e04cf82c10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 1381 additions and 396 deletions

View File

@ -1,7 +1,7 @@
# 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
@ -116,16 +116,16 @@ The following channels are supported:
| 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 |
@ -183,6 +183,7 @@ public void setBypassFrom(int day, int month)
```
*Parameters:*
* *day:* The day from when the bypass should be active
* *month:* The month from when the bypass should be active
@ -192,10 +193,59 @@ public void setBypassTo(int day, int month)
```
*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:
@ -277,6 +327,21 @@ 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
@ -291,50 +356,71 @@ Bridge modbus:tcp:modbus-gateway "Modbus TCP/IP Gateway" [ host="192.168.47.11",
```
// 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: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) {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 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

View File

@ -12,9 +12,15 @@
*/
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;
@ -48,14 +54,19 @@ public class HeliosEasyControlsActions implements ThingActions {
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);
}
@ -64,7 +75,7 @@ public class HeliosEasyControlsActions implements ThingActions {
((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);
}
@ -73,7 +84,7 @@ public class HeliosEasyControlsActions implements ThingActions {
((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);
}
@ -82,7 +93,7 @@ public class HeliosEasyControlsActions implements ThingActions {
((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);
}
@ -91,11 +102,17 @@ public class HeliosEasyControlsActions implements ThingActions {
((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());
}
}
}
@ -106,14 +123,20 @@ public class HeliosEasyControlsActions implements ThingActions {
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);
}
@ -121,14 +144,67 @@ public class HeliosEasyControlsActions implements ThingActions {
((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();
}
}

View File

@ -37,239 +37,252 @@ public class HeliosEasyControlsBindingConstants {
// 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,

View File

@ -19,8 +19,10 @@ import java.lang.reflect.Type;
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;
@ -74,6 +76,8 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
private final Logger logger = LoggerFactory.getLogger(HeliosEasyControlsHandler.class);
private final HeliosEasyControlsTranslationProvider translationProvider;
private @Nullable HeliosEasyControlsConfiguration config;
private @Nullable ScheduledFuture<?> pollingJob;
@ -93,9 +97,13 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
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;
@ -142,8 +150,9 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
private @Nullable BypassDate bypassFrom, bypassTo;
public HeliosEasyControlsHandler(Thing thing) {
public HeliosEasyControlsHandler(Thing thing, HeliosEasyControlsTranslationProvider translationProvider) {
super(thing);
this.translationProvider = translationProvider;
}
/**
@ -311,15 +320,21 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
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();
@ -327,36 +342,39 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
// 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
}
}
}
@ -375,6 +393,11 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
} 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());
}
});
}
@ -404,7 +427,7 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
* @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;
@ -413,39 +436,37 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
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);
}
}
}
@ -463,7 +484,7 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
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) {
@ -536,7 +557,7 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
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));
@ -550,7 +571,7 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
}
}
protected void setSysDateTime() {
protected void setSysDateTime() throws InterruptedException {
this.setSysDateTime(ZonedDateTime.now());
}
@ -575,7 +596,7 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
}
}
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
@ -623,6 +644,75 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
}
}
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
*
@ -718,7 +808,10 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
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());
@ -772,9 +865,15 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
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);
}
}
}
@ -787,6 +886,9 @@ public class HeliosEasyControlsHandler extends BaseThingHandler {
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":

View File

@ -24,7 +24,10 @@ import org.openhab.core.thing.ThingTypeUID;
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
@ -38,6 +41,14 @@ public class HeliosEasyControlsHandlerFactory extends BaseThingHandlerFactory {
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) {
@ -48,7 +59,7 @@ public class HeliosEasyControlsHandlerFactory extends BaseThingHandlerFactory {
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;
}

View File

@ -0,0 +1,69 @@
/**
* 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);
}
}

View File

@ -380,7 +380,7 @@ public class HeliosVariable implements Comparable<HeliosVariable> {
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);
@ -395,44 +395,41 @@ public class HeliosVariable implements Comparable<HeliosVariable> {
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:
@ -443,8 +440,6 @@ public class HeliosVariable implements Comparable<HeliosVariable> {
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:
@ -459,18 +454,6 @@ public class HeliosVariable implements Comparable<HeliosVariable> {
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:
@ -479,15 +462,7 @@ public class HeliosVariable implements Comparable<HeliosVariable> {
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:
@ -496,28 +471,16 @@ public class HeliosVariable implements Comparable<HeliosVariable> {
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();

View File

@ -4,6 +4,7 @@
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>

View File

@ -0,0 +1,34 @@
# 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

View File

@ -0,0 +1,34 @@
# 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

View File

@ -0,0 +1,33 @@
# 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)

View File

@ -0,0 +1,33 @@
# 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)

View File

@ -0,0 +1,204 @@
# 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ߟentemperatur für Bypass
channel-type.modbus.bypassMinOutsideTemperature.description = Minimale Auߟentemperatur 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)

View File

@ -0,0 +1,9 @@
# 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

View File

@ -0,0 +1,9 @@
# 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

View File

@ -0,0 +1,106 @@
# 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

View File

@ -0,0 +1,106 @@
# 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

View File

@ -0,0 +1,39 @@
# 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

View File

@ -0,0 +1,39 @@
# 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

View File

@ -0,0 +1,9 @@
# 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

View File

@ -0,0 +1,9 @@
# 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

View File

@ -279,8 +279,8 @@
<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"/>
@ -504,7 +504,7 @@
<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>
@ -590,21 +590,21 @@
<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>