]> git.basschouten.com Git - openhab-addons.git/commitdiff
[helioseasycontrols] Internationalization + actions for messages - Attempt 2 (#9772)
authorBernhard Bauer <bern77@gmail.com>
Sat, 6 Feb 2021 16:19:01 +0000 (17:19 +0100)
committerGitHub <noreply@github.com>
Sat, 6 Feb 2021 16:19:01 +0000 (17:19 +0100)
* 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>
22 files changed:
bundles/org.openhab.binding.modbus.helioseasycontrols/README.md
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/java/org/openhab/binding/modbus/helioseasycontrols/internal/HeliosEasyControlsActions.java
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/java/org/openhab/binding/modbus/helioseasycontrols/internal/HeliosEasyControlsBindingConstants.java
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/java/org/openhab/binding/modbus/helioseasycontrols/internal/HeliosEasyControlsHandler.java
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/java/org/openhab/binding/modbus/helioseasycontrols/internal/HeliosEasyControlsHandlerFactory.java
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/java/org/openhab/binding/modbus/helioseasycontrols/internal/HeliosEasyControlsTranslationProvider.java [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/java/org/openhab/binding/modbus/helioseasycontrols/internal/HeliosVariable.java
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/binding/binding.xml
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/actions.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/actions_de.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/errors.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/errors_de.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/helioseasycontrols_de.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/infos.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/infos_de.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/properties.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/properties_de.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/stateflags.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/stateflags_de.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/warnings.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/warnings_de.properties [new file with mode: 0644]
bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/thing/thing-types.xml

index 78e7a3d9a9205fb12aa66c1b51ec0ab5645cffd8..5f25202630c8d1f99c9588cb255648c742161962 100644 (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 KWL_Errors                        "Number errors [%d]"                        <error>       (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfErrors"}
-String KWL_Errors_String                 "Error messages [%s]"                       <error>       (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#errorsMsg"}
-Number KWL_Warnings                      "Number warnings [%d]"                      <warning>     (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfWarnings"}
-String KWL_Warnings_String               "Warning messages [%s]"                     <warning>     (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#warningsMsg"}
-Number KWL_Infos                         "Number infos [%d]"                         <info>        (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfInfos"}
-String KWL_Infos_String                  "Info messages [%s]"                        <info>        (gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#infosMsg"}
+Number:Temperature KWL_Temp_Outide_Air   "Temperature outside air [%.1f °C]"         <temperature> (gKWL) ["Measurement", "Temperature"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureOutsideAir"}
+Number:Temperature KWL_Temp_Supply_Air   "Temperature supply air [%.1f °C]"          <temperature> (gKWL) ["Measurement", "Temperature"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureSupplyAir"}
+Number:Temperature KWL_Temp_Outgoing_Air "Temperature outgoing air [%.1f °C]"        <temperature> (gKWL) ["Measurement", "Temperature"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureOutgoingAir"}
+Number:Temperature KWL_Temp_Extract_Air  "Temperature extract air [%.1f °C]"         <temperature> (gKWL) ["Measurement", "Temperature"] {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureExtractAir"}
+Number KWL_Supply_Air_RPM                "RPM supply air [%d]"                       <fan>         (gKWL) ["Measurement", "Property"]    {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#supplyAirRpm"}
+Number KWL_Extract_Air_RPM               "RPM extract air [%d]"                      <fan>         (gKWL) ["Measurement", "Property"]    {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#extractAirRpm"}
+Number KWL_Filter_Change                 "Filter change [MAP(helios_yes_no.map):%s]" <none>        (gKWL) ["Status"]                     {channel="modbus:helios-easycontrols:modbus-gateway:kwl:unitConfig#filterChange"}
+Number:Time KWL_Filter_Change_Remaining  "Filter change [%d %unit%]"                 <clock>       (gKWL) ["Status", "Duration"]         {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#filterChangeRemainingTime"}
+
+Number KWL_Errors                        "Number errors [%d]"                        <error>       (gKWL) ["Status"]                     {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfErrors"}
+String KWL_Errors_String                 "Error messages [%s]"                       <error>       (gKWL) ["Status"]                     {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#errorsMsg"}
+Number KWL_Warnings                      "Number warnings [%d]"                      <warning>     (gKWL) ["Status"]                     {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfWarnings"}
+String KWL_Warnings_String               "Warning messages [%s]"                     <warning>     (gKWL) ["Status"]                     {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#warningsMsg"}
+Number KWL_Infos                         "Number infos [%d]"                         <info>        (gKWL) ["Status"]                     {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfInfos"}
+String KWL_Infos_String                  "Info messages [%s]"                        <info>        (gKWL) ["Status"]                     {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#infosMsg"}
+String KWL_Status_Flags                  "Status Flags [%s]"                         <info>        (gKWL) ["Status"]                     {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#statusFlags"}
 ```
 
 ### Rule
 
 ```
-rule "Rest filter change remaining time"
+import java.util.List
+import java.util.Map
+
+rule "Reset filter change remaining time"
     when
         Item Rem_KWL_Filter received command OFF
     then
         val kwlActions = getActions("modbus.helioseasycontrols", "modbus:helios-easycontrols:modbus-gateway:kwl")
         kwlActions.resetFilterChangeTimer()
 end
+
+
+rule "Log KWL messages"
+    when
+        Item KWL_Errors_String changed or
+        Item KWL_Warnings_String changed or
+        Item KWL_Infos_String changed or
+        KWL_Status_Flags changed
+    then
+        val kwlActions = getActions("modbus.helioseasycontrols", "modbus:helios-easycontrols:modbus-gateway:kwl")
+        val Map<String, List<String>> msg = kwlActions.getMessages
+        logInfo("KWL Error Messages", msg.get("errorMessages").toString)
+        logInfo("KWL Warning Messages", msg.get("warningMessages").toString)
+        logInfo("KWL Info Messages", msg.get("infoMessages").toString)
+        logInfo("KWL Status Messages", msg.get("statusMessages").toString)
+end
+
 ```
 
 ### Transformation
index e738b85407e7a811f7370058f60d36d407e92a6d..e2ea969abe47a1b514ff2290c7dfbd6599a42888 100644 (file)
  */
 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();
+    }
 }
index 590d151a5070884e59ee4e4b991dfe916d514758..58e117cc0d5149d3284f546e9f73a1f8776cfd50 100644 (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,
index 9fc4aa78b1038b51be037f25ce04af6663c096b7..dc1c9aa524710510e81b435d88a79d042ec8ae56 100644 (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":
index 9ea8cd8c3d19736dd2d80b971af9c9d3ba771920..d705fbb1db429d8fdd61698421fa071322b85f30 100644 (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;
     }
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/java/org/openhab/binding/modbus/helioseasycontrols/internal/HeliosEasyControlsTranslationProvider.java b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/java/org/openhab/binding/modbus/helioseasycontrols/internal/HeliosEasyControlsTranslationProvider.java
new file mode 100644 (file)
index 0000000..2aa5ffa
--- /dev/null
@@ -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);
+    }
+}
index 8fc20f33f44cc9e676feda8e3405b878d765f127..c53c4dee8b0a7a111d98633775f25d107f60edfb 100644 (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();
index 40bd9f7f42f515735ac347d26a548187fa476ef4..45392f2e6e976f36d00afccdb552597f80999115 100644 (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>
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/actions.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/actions.properties
new file mode 100644 (file)
index 0000000..1efd728
--- /dev/null
@@ -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 
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/actions_de.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/actions_de.properties
new file mode 100644 (file)
index 0000000..dbef5cd
--- /dev/null
@@ -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 
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/errors.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/errors.properties
new file mode 100644 (file)
index 0000000..e6ff8ae
--- /dev/null
@@ -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)
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/errors_de.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/errors_de.properties
new file mode 100644 (file)
index 0000000..e882264
--- /dev/null
@@ -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)
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/helioseasycontrols_de.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/helioseasycontrols_de.properties
new file mode 100644 (file)
index 0000000..10f7d7e
--- /dev/null
@@ -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ß\9fentemperatur für Bypass
+channel-type.modbus.bypassMinOutsideTemperature.description = Minimale Auß\9fentemperatur für Bypass
+channel-type.modbus.offsetExtractAir.label = Offset Abluft
+channel-type.modbus.offsetExtractAir.description = Offset Abluft 
+channel-type.modbus.operatingHours.label = Betriebsstunden
+channel-type.modbus.operatingHours.description = Betriebsstunden (in Minuten) 
+channel-type.modbus.outputPower.label = Leistung
+channel-type.modbus.outputPower.description = Leistung VHZ/NHZ (in Prozent)
+channel-type.modbus.errors.label = Fehler
+channel-type.modbus.errors.description = Fehler codiert als ganzzahliger Wert
+channel-type.modbus.warnings.label = Warnungen
+channel-type.modbus.warnings.description = Warnungen codiert als ganzzahliger Wert
+channel-type.modbus.infos.label = Infos
+channel-type.modbus.infos.description = Infos codiert als ganzzahliger Wert
+channel-type.modbus.noOfErrors.label = Anzahl Fehler
+channel-type.modbus.noOfErrors.description = Anzahl Fehler 
+channel-type.modbus.noOfWarnings.label = Anzahl Warnungen
+channel-type.modbus.noOfWarnings.description = Anzahl Warnungen 
+channel-type.modbus.noOfInfos.label = Anzahl Infos
+channel-type.modbus.noOfInfos.description = Anzahl Infos 
+channel-type.modbus.message.label = Fehler / Warnungen / Infos
+channel-type.modbus.message.description = Fehler / Warnungen / Infos codiert als Zeichenkette 
+channel-type.modbus.sensorConfig.label = Sensor-Konfiguration
+channel-type.modbus.sensorConfig.description = Sensor-Konfiguration (installiert oder nicht) 
+channel-type.modbus.bypassStatus.label = Status Bypass
+channel-type.modbus.bypassStatus.description = Status Bypass 
+channel-type.modbus.bypass.label = Bypass aktiv von/bis (Tag und Monat)
+channel-type.modbus.bypass.description = Bypass wird von diesem Tag und Monat an aktiviert/deaktiviert
+
+# channels (general)
+channel-group-type.modbus.general.channel.preHeaterStatus.label = Status Vorheizung
+channel-group-type.modbus.general.channel.preHeaterStatus.description = Status Vorheizung
+channel-group-type.modbus.general.channel.nhzDuctSensor.label = NHZ Kanalfühler
+channel-group-type.modbus.general.channel.nhzReturnSensor.label = NHZ Rücklauffühler
+channel-group-type.modbus.general.channel.vhzDuctSensor.label = VHZ Kanalfühler
+channel-group-type.modbus.general.channel.temperatureOutsideAir.label = Temperatur Auߟenluft
+channel-group-type.modbus.general.channel.temperatureSupplyAir.label = Temperatur Zuluft
+channel-group-type.modbus.general.channel.temperatureOutgoingAir.label = Temperatur Fortluft
+channel-group-type.modbus.general.channel.temperatureExtractAir.label = Temperatur Abluft
+channel-group-type.modbus.general.channel.supplyAirRpm.label = Zuluft RPM
+channel-group-type.modbus.general.channel.extractAirRpm.label = Abluft RPM
+channel-group-type.modbus.general.channel.operatingHoursSupplyAirVent.label = Betriebsstunden Zuluft-Ventilator
+channel-group-type.modbus.general.channel.operatingHoursExtractAirVent.label = Betriebsstunden Abluft-Ventilator
+channel-group-type.modbus.general.channel.operatingHoursVhz.label = Betriebsstunden VHZ
+channel-group-type.modbus.general.channel.operatingHoursNhz.label = Betriebsstunden NHZ
+channel-group-type.modbus.general.channel.outputPowerVhz.label = Leistung VHZ
+channel-group-type.modbus.general.channel.outputPowerNhz.label = Leistung NHZ
+channel-group-type.modbus.general.channel.autoSwUpdate.label = Auto SW Update
+channel-group-type.modbus.general.channel.autoSwUpdate.description = Zeigt an, ob automatische Software-Updates aktiviert sind
+channel-group-type.modbus.general.channel.accessHeliosPortal.label = Access Helios Portal
+channel-group-type.modbus.general.channel.accessHeliosPortal.description = Zeigt an, ob Zugriff auf das Helios-Portal aktiviert ist
+channel-group-type.modbus.operation.channel.partyModeDuration.label = Partybetrieb Dauer
+channel-group-type.modbus.operation.channel.preHeaterStatus.description = Partybetrieb Dauer (in Minuten)
+channel-group-type.modbus.operation.channel.partyModeFanStage.label = Partybetrieb Lüfterstufe
+channel-group-type.modbus.operation.channel.partyModeFanStage.description = Partybetrieb Lüfterstufe
+channel-group-type.modbus.operation.channel.partyModeRemainingTime.label = Partybetrieb Restzeit
+channel-group-type.modbus.operation.channel.partyModeRemainingTime.description = Partybetrieb Restzeit
+channel-group-type.modbus.operation.channel.partyModeStatus.label = Partybetrieb Status
+channel-group-type.modbus.operation.channel.partyModeStatus.description = Partybetrieb Status
+channel-group-type.modbus.operation.channel.standbyModeDuration.label = Ruhebetrieb Dauer
+channel-group-type.modbus.operation.channel.standbyaterStatus.description = Ruhebetrieb Dauer (in Minuten)
+channel-group-type.modbus.operation.channel.standbyModeFanStage.label = Ruhebetrieb Lüfterstufe
+channel-group-type.modbus.operation.channel.standbyModeFanStage.description = Ruhebetrieb Lüfterstufe
+channel-group-type.modbus.operation.channel.standbyModeRemainingTime.label = Ruhebetrieb Restzeit
+channel-group-type.modbus.operation.channel.standbyModeRemainingTime.description = Ruhebetrieb Restzeit
+channel-group-type.modbus.operation.channel.standbyModeStatus.label = Ruhebetrieb Status
+channel-group-type.modbus.operation.channel.standbyModeStatus.description = Ruhebetrieb Status
+channel-group-type.modbus.operation.channel.holidayProgrammeStart.label = Urlaubsprogramm Start
+channel-group-type.modbus.operation.channel.holidayProgrammeStart.description = Urlaubsprogramm Start
+channel-group-type.modbus.operation.channel.holidayProgrammeEnd.label = Urlaubsprogramm Ende
+channel-group-type.modbus.operation.channel.holidayProgrammeEnd.description = Urlaubsprogramm Ende
+channel-group-type.modbus.operation.channel.percentageFanStage.label = Prozentuelle Lüfterstufe
+channel-group-type.modbus.operation.channel.percentageFanStage.description = Prozentuelle Lüfterstufe
+channel-group-type.modbus.co2Control.channel.co2ControlSetValue.label = Status CO2-Steuerung
+channel-group-type.modbus.co2Control.channel.co2ControlSetValue.description = Status CO2-Steuerung
+channel-group-type.modbus.co2Control.channel.co2ControlSteps.label = Stufen CO2-Steuerung
+channel-group-type.modbus.co2Control.channel.co2ControlSteps.description = Stufen CO2-Steuerung (in ppm)
+channel-group-type.modbus.vocControl.channel.vocControlSetValue.label = Status VOC-Steuerung
+channel-group-type.modbus.vocControl.channel.vocControlSetValue.description = Status VOC-Steuerung
+channel-group-type.modbus.vocControl.channel.vocControlSteps.label = Stufen VOC-Steuerung
+channel-group-type.modbus.vocControl.channel.vocControlSteps.description = Stufen VOC-Steuerung (in ppm)
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/infos.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/infos.properties
new file mode 100644 (file)
index 0000000..34dbb6b
--- /dev/null
@@ -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
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/infos_de.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/infos_de.properties
new file mode 100644 (file)
index 0000000..6cf828f
--- /dev/null
@@ -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
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/properties.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/properties.properties
new file mode 100644 (file)
index 0000000..81e6990
--- /dev/null
@@ -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
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/properties_de.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/properties_de.properties
new file mode 100644 (file)
index 0000000..b87387f
--- /dev/null
@@ -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
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/stateflags.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/stateflags.properties
new file mode 100644 (file)
index 0000000..20d41e1
--- /dev/null
@@ -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
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/stateflags_de.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/stateflags_de.properties
new file mode 100644 (file)
index 0000000..c549306
--- /dev/null
@@ -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
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/warnings.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/warnings.properties
new file mode 100644 (file)
index 0000000..c1b6f2e
--- /dev/null
@@ -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
diff --git a/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/warnings_de.properties b/bundles/org.openhab.binding.modbus.helioseasycontrols/src/main/resources/OH-INF/i18n/warnings_de.properties
new file mode 100644 (file)
index 0000000..0713d54
--- /dev/null
@@ -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
index 6c7c34f97a27cf9ad10486bcbc03bbe739bde5ea..e509677dd28e6e7423c6397edc0a1ed2e621d81f 100644 (file)
                                <description>VOC control status</description>
                        </channel>
                        <channel id="vocControlSteps" typeId="ppmControlSteps">
-                               <label>CO2 Control Steps</label>
-                               <description>CO2 control steps (in ppm)</description>
+                               <label>VOC Control Steps</label>
+                               <description>VOC control steps (in ppm)</description>
                        </channel>
                        <!-- External CO2 Sensors -->
                        <channel id="externalSensorKwlVoc1" typeId="sensorValue"/>
        <channel-type id="runOnTimeVhzNhz" advanced="true">
                <item-type>Number:Time</item-type>
                <label>Stopping Time Preheater/Afterheater</label>
-               <description>Stopping time preheater/afterheater in seconds</description>
+               <description>Stopping time preheater/afterheater</description>
                <category>Heating</category>
                <state min="60" max="120" step="1" pattern="%d %unit%" readOnly="false"/>
        </channel-type>
        <channel-type id="errors" advanced="false">
                <item-type>Number</item-type>
                <label>Errors</label>
-               <description>Errors as integer value</description>
+               <description>Errors encoded as integer value</description>
                <state min="0" max="4294967295" step="1" pattern="%d" readOnly="true"/>
        </channel-type>
 
        <channel-type id="warnings" advanced="false">
                <item-type>Number</item-type>
                <label>Warnings</label>
-               <description>Warnings as integer value</description>
+               <description>Warnings encoded as integer value</description>
                <state min="0" max="255" step="1" pattern="%d" readOnly="true"/>
        </channel-type>
 
        <channel-type id="infos" advanced="false">
                <item-type>Number</item-type>
                <label>Infos</label>
-               <description>Infos as integer value</description>
+               <description>Infos encoded as integer value</description>
                <state min="0" max="255" step="1" pattern="%d" readOnly="true"/>
        </channel-type>