From 7d28d5f222a4db1037b28d979fdab036109d03cc Mon Sep 17 00:00:00 2001 From: Jens Maus Date: Thu, 15 Oct 2026 10:39:55 +0000 Subject: [PATCH 1/2] webui: show the maintenance datapoints in the maintenance channel tile This applies OpenCCU rootfs patch 0144-WebUI-ControlForMaintenanceChannel.patch: - The maintenance channel (:0) of a device in "Status und Bedienung" shows the commonly known maintenance datapoints of BidCos and HmIP devices (e.g. UNREACH, STICKY_UNREACH, LOW_BAT, CONFIG_PENDING, DUTY_CYCLE, RSSI_DEVICE/RSSI_PEER, OPERATING_VOLTAGE, TIME_OF_OPERATION and the error flags) instead of no control. - RSSI values are shown in dBm ("n/a" below -200 dBm), TIME_OF_OPERATION in years and days. - Add the optionUnitY and stringTableStickyUnreachTrue/False translations. --- .../rega/www/esp/controls/maintenance.fn | 369 +++++++++++++++++- .../rega/www/esp/datapointconfigurator.fn | 6 + .../webui/js/lang/de/translate.lang.option.js | 1 + .../js/lang/de/translate.lang.stringtable.js | 2 + .../webui/js/lang/en/translate.lang.option.js | 1 + .../js/lang/en/translate.lang.stringtable.js | 2 + 6 files changed, 380 insertions(+), 1 deletion(-) diff --git a/src/webui/rega/www/esp/controls/maintenance.fn b/src/webui/rega/www/esp/controls/maintenance.fn index 012c7208a..f67adef1c 100644 --- a/src/webui/rega/www/esp/controls/maintenance.fn +++ b/src/webui/rega/www/esp/controls/maintenance.fn @@ -103,4 +103,371 @@ function ::CreateHeatingCooling() { Call("/esp/controls/maintenance.fn::CreateNoFunction()"); } -} \ No newline at end of file +} + +function ::OutputMaintenanceDataPoint() +{ + if (outLevel > 1) { WriteLine(""); outLevel = 0; } + WriteLine("
"); + Write("" # mnDPText # ""); + Write("" # mnDPValue); + if (mnDPUnit != "") { Write(" " # mnDPUnit); } + Write(""); + WriteLine("
"); + outLevel = outLevel + 1; +} + +function ::OutputMaintenanceFloatDP() +{ + object oDP = cObj.DPByHssDP(mnDP); + if (oDP) { + mnDPValue = oDP.Value().ToString(1); + Call("/esp/controls/maintenance.fn::OutputMaintenanceDataPoint()"); + } + mnDP = ""; + mnDPText = ""; + mnDPValue = ""; + mnDPUnit = ""; +} + +function ::OutputMaintenanceTimeOfOperationDP() +{ + object oDP = cObj.DPByHssDP(mnDP); + if (oDP) { + mnDPValue = (oDP.Value().ToInteger() / 86400); + if (mnDPValue >= 365) { + mnDPValue = (mnDPValue / 365) # " ${optionUnitY} " # (mnDPValue % 365); + } + Call("/esp/controls/maintenance.fn::OutputMaintenanceDataPoint()"); + } + mnDP = ""; + mnDPText = ""; + mnDPValue = ""; + mnDPUnit = ""; +} + +function ::OutputMaintenanceValueDP() +{ + object oDP = cObj.DPByHssDP(mnDP); + if (oDP) { + mnDPValue = oDP.Value(); + Call("/esp/controls/maintenance.fn::OutputMaintenanceDataPoint()"); + } + mnDP = ""; + mnDPText = ""; + mnDPValue = ""; + mnDPUnit = ""; +} + +function ::OutputMaintenanceRSSIDP() +{ + object oDP = cObj.DPByHssDP(mnDP); + if (oDP) { + integer rssiValue = oDP.Value().ToInteger(); + if (oDP.ValueType() == ivtByte) { + rssiValue = (rssiValue - 256); + } + + if (rssiValue < -200) { + mnDPValue = "n/a"; + } else { + mnDPValue = rssiValue.ToString(0); + } + mnDPUnit = "dBm"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceDataPoint()"); + } + mnDP = ""; + mnDPText = ""; + mnDPValue = ""; + mnDPUnit = ""; +} + +function ::OutputMaintenanceEnumDP() +{ + object oDP = cObj.DPByHssDP(mnDP); + if (oDP) { + if (oDP.Value().ToInteger() == 0) { + mnDPValue = mnDPValue0; + } elseif (oDP.Value().ToInteger() == 1) { + mnDPValue = mnDPValue1; + } elseif (oDP.Value().ToInteger() == 2) { + mnDPValue = mnDPValue2; + } elseif (oDP.Value().ToInteger() == 3) { + mnDPValue = mnDPValue3; + } + Call("/esp/controls/maintenance.fn::OutputMaintenanceDataPoint()"); + } + mnDP = ""; + mnDPText = ""; + mnDPValue = ""; + mnDPValue0 = ""; + mnDPValue1 = ""; + mnDPValue2 = ""; + mnDPValue3 = ""; + mnDPUnit = ""; +} + +function ::OutputMaintenanceBoolDP() +{ + object oDP = cObj.DPByHssDP(mnDP); + if (oDP) { + if ((oDP.Value() == "true") || (oDP.Value().ToInteger() == 1)) { + mnDPValue = mnDPTrue; + } else { + mnDPValue = mnDPFalse; + } + object oDPAlarm = cObj.DPByHssDP(mnDP # "_ALARM"); + if (oDPAlarm) { + if (oDPAlarm.Value().ToInteger() == 1) { + mnDPValue = mnDPValue # " [ALARM]"; + } elseif (oDPAlarm.Value().ToInteger() == 2) { + mnDPValue = mnDPValue # " [ACKNOWLEDGED]"; + } + } + Call("/esp/controls/maintenance.fn::OutputMaintenanceDataPoint()"); + } + mnDP = ""; + mnDPText = ""; + mnDPValue = ""; + mnDPTrue = ""; + mnDPFalse = ""; + mnDPUnit = ""; +} + +function ::CreateDeviceMaintenanceChannel() +{ + WriteLine(""); + WriteLine(""); + WriteLine(""); + + integer outLevel = 0; + string mnDP = ""; + string mnDPText = ""; + string mnDPTrue = ""; + string mnDPFalse = ""; + string mnDPValue = ""; + string mnDPValue0 = ""; + string mnDPValue1 = ""; + string mnDPValue2 = ""; + string mnDPValue3 = ""; + string mnDPUnit = ""; + + mnDP = "ACTUAL_TEMPERATURE"; + mnDPText = "${stringTableClimateControlRTTransceiverActualTemp}:"; + mnDPUnit = "°C"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceFloatDP()"); + + mnDP = "ACTUAL_TEMPERATURE_STATUS"; + mnDPText = "${stringTableClimateControlRTTransceiverActualTemp}:"; + mnDPValue0 = "${lblNormal}"; + mnDPValue1 = "${lblUnknown}"; + mnDPValue2 = "${lblOverflow}"; + mnDPValue3 = "${lblUnderflow}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceEnumDP()"); + + !mnDP = "AES_KEY"; + !mnDPText = "AES_KEY:"; + !Call("/esp/controls/maintenance.fn::OutputMaintenanceValueDP()"); + + mnDP = "CONFIG_PENDING"; + mnDPText = ""; + mnDPTrue = "${stringTableConfigPendingTrue}"; + mnDPFalse = "${stringTableConfigPendingFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "DATE_TIME_UNKNOWN"; + mnDPText = ""; + mnDPTrue = "${stringTableDateTimeUnknownTrue}"; + mnDPFalse = "${stringTableDateTimeUnknownFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "DEVICE_IN_BOOTLOADER"; + mnDPText = "${stringTableDeviceInBootloader}:"; + mnDPTrue = "${dialogYes}"; + mnDPFalse = "${dialogNo}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "DUTY_CYCLE"; + mnDPText = ""; + mnDPTrue = "${stringTableDutyCycleTrue}"; + mnDPFalse = "${stringTableDutyCycleFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "DUTYCYCLE"; + mnDPText = ""; + mnDPTrue = "${stringTableDutyCycleTrue}"; + mnDPFalse = "${stringTableDutyCycleFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + !mnDP = "ENTER_BOOTLOADER"; + !mnDPText = "ENTER_BOOTLOADER:"; + !Call("/esp/controls/maintenance.fn::OutputMaintenanceValueDP()"); + + mnDP = "ERROR_BAD_RECHARGEABLE_BATTERY_HEALTH"; + mnDPText = ""; + mnDPTrue = "${stringTableErrorBadRechargeableBatteryHealthTrue}"; + mnDPFalse = "${stringTableErrorBadRechargeableBatteryHealthFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "ERROR_CODE"; + mnDPText = "${stringTableErrorCode}:"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceValueDP()"); + + mnDP = "ERROR_COMMUNICATION_PARTICLE_MATTER_SENSOR"; + mnDPText = "ERROR_COMMUNICATION_PARTICLE_MATTER_SENSOR:"; + mnDPTrue = "TRUE"; + mnDPFalse = "FALSE"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "ERROR_COMMUNICATION_TEMP_AND_HUMIDITY_SENSOR"; + mnDPText = ""; + mnDPTrue = "${stringTableErrorCommunicationTempAndHumiditySensorTrue}"; + mnDPFalse = "${stringTableErrorCommunicationTempAndHumiditySensorFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "ERROR_PARTICULATE_MATTER_MEASUREMENT"; + mnDPText = ""; + mnDPTrue = "${stringTableErrorParticulateMatterMeasurementTrue}"; + mnDPFalse = "${stringTableErrorParticulateMatterMeasurementFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "ERROR_TEMP_OR_HUMIDITY_MEASUREMENT"; + mnDPText = ""; + mnDPTrue = "${stringTableErrorTempOrHumidityMeasurementTrue}"; + mnDPFalse = "${stringTableErrorTempOrHumidityMeasurementFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "ERROR_NON_FLAT_POSITIONING"; + mnDPText = ""; + mnDPTrue = "${stringTableErrorNonFlatPositioningTrue}"; + mnDPFalse = "${stringTableErrorNonFlatPositioningFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "ERROR_OVERHEAT"; + mnDPText = ""; + mnDPTrue = "${stringTableErrorOverheatTrue}"; + mnDPFalse = "${stringTableErrorOverheatFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "ERROR_SABOTAGE"; + mnDPText = ""; + mnDPTrue = "${stringTableErrorSabotageTrue}"; + mnDPFalse = "${stringTableErrorSabotageFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "ERROR_UNDERVOLTAGE"; + mnDPText = ""; + mnDPTrue = "${stringTableErrorUndervoltageTrue}"; + mnDPFalse = "${stringTableErrorUndervoltageFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "HEATING_COOLING"; + mnDPText = ""; + mnDPTrue = "${stringTableHeating}"; + mnDPFalse = "${stringTableCooling}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "HUMIDITY_ALARM"; + mnDPText = ""; + mnDPTrue = "${stringTableHumidityAlarmTrue}"; + mnDPFalse = "${stringTableHumidityAlarmFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "INHIBIT"; + mnDPText = ""; + mnDPTrue = "${stringTableInhibitTrue}"; + mnDPFalse = "${stringTableInhibitFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "LOW_BAT"; + mnDPText = ""; + mnDPTrue = "${stringTableBatteryEmpty}"; + mnDPFalse = "${stringTableBatteryOk}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "LOWBAT"; + mnDPText = ""; + mnDPTrue = "${stringTableBatteryEmpty}"; + mnDPFalse = "${stringTableBatteryOk}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "OPERATING_VOLTAGE"; + mnDPText = "${stringTableOperationVoltage}:"; + mnDPUnit = "V"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceFloatDP()"); + + mnDP = "OPERATING_VOLTAGE_STATUS"; + mnDPText = "${stringTableOperationVoltageState}:"; + mnDPValue0 = "${lblNormal}"; + mnDPValue1 = "${lblUnknown}"; + mnDPValue2 = "${lblOverflow}"; + mnDPValue3 = "${lblExternal}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceEnumDP()"); + + mnDP = "RSSI_DEVICE"; + mnDPText = "${stringTableRSSIDevice}:"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceRSSIDP()"); + + mnDP = "RSSI_PEER"; + mnDPText = "${stringTableRSSIPeer}:"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceRSSIDP()"); + + mnDP = "SABOTAGE"; + mnDPText = ""; + mnDPTrue = "${stringTableSabotageContactWasActive}"; + mnDPFalse = "${stringTableSabotageContactOk}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "SENSOR_ERROR"; + mnDPText = ""; + mnDPTrue = "${stringTableSensorErrorTrue}"; + mnDPFalse = "${stringTableSensorErrorFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "STICKY_SABOTAGE"; + mnDPText = ""; + mnDPTrue = "${stringTableSabotageStickyTrue}"; + mnDPFalse = "${stringTableSabotageStickyFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "STICKY_UNREACH"; + mnDPText = ""; + mnDPTrue = "${stringTableStickyUnreachTrue}"; + mnDPFalse = "${stringTableStickyUnreachFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "TEMPERATURE_LIMITER"; + mnDPText = ""; + mnDPTrue = "${stringTableTemperatureLimiterTrue}"; + mnDPFalse = "${stringTableTemperatureLimiterFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "TIME_OF_OPERATION"; + mnDPText = "${stringTableTimeOfOperation}:"; + mnDPUnit = "${optionUnitD}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceTimeOfOperationDP()"); + + mnDP = "TIME_OF_OPERATION_STATUS"; + mnDPText = "${stringTableTimeOfOperation}:"; + mnDPValue0 = "${lblNormal}"; + mnDPValue1 = "${lblUnknown}"; + mnDPValue2 = "${lblOverflow}"; + mnDPValue3 = ""; + Call("/esp/controls/maintenance.fn::OutputMaintenanceEnumDP()"); + + mnDP = "UPDATE_PENDING"; + mnDPText = ""; + mnDPTrue = "${stringTableUpdatePendingTrue}"; + mnDPFalse = "${stringTableUpdatePendingFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + mnDP = "UNREACH"; + mnDPText = ""; + mnDPTrue = "${stringTableUnreachTrue}"; + mnDPFalse = "${stringTableUnreachFalse}"; + Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); + + WriteLine(""); + WriteLine("
"); + WriteLine(""); + } diff --git a/src/webui/rega/www/esp/datapointconfigurator.fn b/src/webui/rega/www/esp/datapointconfigurator.fn index f5e2abc35..acaf94f14 100644 --- a/src/webui/rega/www/esp/datapointconfigurator.fn +++ b/src/webui/rega/www/esp/datapointconfigurator.fn @@ -1362,6 +1362,12 @@ function ::dcCreate() } } } + ! create device maintenance channel information + if (ictCH == ictMaintenance) { + WriteLine( '' ); + Call("/esp/controls/maintenance.fn::CreateDeviceMaintenanceChannel()"); + isKnownControl = true; + } if (!isKnownControl) { WriteLine( '
' ); diff --git a/src/webui/www/webui/js/lang/de/translate.lang.option.js b/src/webui/www/webui/js/lang/de/translate.lang.option.js index 0429bca4e..5fe000889 100644 --- a/src/webui/www/webui/js/lang/de/translate.lang.option.js +++ b/src/webui/www/webui/js/lang/de/translate.lang.option.js @@ -198,6 +198,7 @@ jQuery.extend(true, langJSON, { "optionUnit8H" : "8 Stunden", "optionUnit8M": "8 Minuten", "optionUnit90S" : "90 Sekunden", + "optionUnitY" : "Jahre", "optionUnitD" : "Tage", "optionUnitH" : "Stunden", "optionUnitM" : "Minuten", diff --git a/src/webui/www/webui/js/lang/de/translate.lang.stringtable.js b/src/webui/www/webui/js/lang/de/translate.lang.stringtable.js index 02450cfcd..ffa5220b6 100644 --- a/src/webui/www/webui/js/lang/de/translate.lang.stringtable.js +++ b/src/webui/www/webui/js/lang/de/translate.lang.stringtable.js @@ -219,6 +219,8 @@ jQuery.extend(true,langJSON, { "stringTableConfButtonTimePermanent" : "dauerhaft", "stringTableConfigPendingFalse" : "Konfigurationsdaten zur %DCbertragung: Nein", "stringTableConfigPendingTrue" : "Konfigurationsdaten zur %DCbertragung: Ja", + "stringTableStickyUnreachFalse" : "Kommunikation war gest%F6rt: Nein", + "stringTableStickyUnreachTrue" : "Kommunikation war gest%F6rt: Ja", "stringTableControlMode" : "Modus Auto/Manu/Urlaub", "stringTableCoolingDisable" : "K%FChlen im K%FChlmode", "stringTableCurrentDetectionBehavior" : "Verhalten", diff --git a/src/webui/www/webui/js/lang/en/translate.lang.option.js b/src/webui/www/webui/js/lang/en/translate.lang.option.js index d83415a30..5e9331894 100644 --- a/src/webui/www/webui/js/lang/en/translate.lang.option.js +++ b/src/webui/www/webui/js/lang/en/translate.lang.option.js @@ -198,6 +198,7 @@ jQuery.extend(true, langJSON, { "optionUnit8H" : "8 hours", "optionUnit8M": "8 minutes", "optionUnit90S" : "90 seconds", + "optionUnitY" : "Years", "optionUnitD" : "Days", "optionUnitH" : "Hours", "optionUnitM" : "Minutes", diff --git a/src/webui/www/webui/js/lang/en/translate.lang.stringtable.js b/src/webui/www/webui/js/lang/en/translate.lang.stringtable.js index 513f809f0..2caf6d212 100644 --- a/src/webui/www/webui/js/lang/en/translate.lang.stringtable.js +++ b/src/webui/www/webui/js/lang/en/translate.lang.stringtable.js @@ -219,6 +219,8 @@ jQuery.extend(true,langJSON, { "stringTableConfButtonTimePermanent" : "permanent", "stringTableConfigPendingFalse" : "There is no configuration data to be transmitted", "stringTableConfigPendingTrue" : "Configuration data is ready for transmission", + "stringTableStickyUnreachFalse" : "Device communication was disturbed: No", + "stringTableStickyUnreachTrue" : "Device communication was disturbed: Yes", "stringTableControlMode" : "Auto/manu/party mode", "stringTableCoolingDisable" : "Cooling in cooling mode", "stringTableCurrentDetectionBehavior" : "Response", From c1ecd3f4587c43dd78598a9f99a7783f462f96ae Mon Sep 17 00:00:00 2001 From: Jens Maus Date: Thu, 15 Oct 2026 11:12:55 +0000 Subject: [PATCH 2/2] webui: correct the sabotage, heating/cooling and fine dust labels of the maintenance tile This applies the fix of OpenCCU/OpenCCU#4441 to the maintenance channel tile, as found in the review of this PR: - ERROR_SABOTAGE: the texts of stringTableErrorSabotageTrue/False are swapped, so use them the other way round. - HEATING_COOLING: 1 means cooling, as in CreateHeatingCooling(). - ERROR_COMMUNICATION_PARTICLE_MATTER_SENSOR: use the existing stringTableErrorCommunicationParticulateMatterSensorTrue/False texts. --- src/webui/rega/www/esp/controls/maintenance.fn | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/webui/rega/www/esp/controls/maintenance.fn b/src/webui/rega/www/esp/controls/maintenance.fn index f67adef1c..b1bcc5a6c 100644 --- a/src/webui/rega/www/esp/controls/maintenance.fn +++ b/src/webui/rega/www/esp/controls/maintenance.fn @@ -314,9 +314,9 @@ function ::CreateDeviceMaintenanceChannel() Call("/esp/controls/maintenance.fn::OutputMaintenanceValueDP()"); mnDP = "ERROR_COMMUNICATION_PARTICLE_MATTER_SENSOR"; - mnDPText = "ERROR_COMMUNICATION_PARTICLE_MATTER_SENSOR:"; - mnDPTrue = "TRUE"; - mnDPFalse = "FALSE"; + mnDPText = ""; + mnDPTrue = "${stringTableErrorCommunicationParticulateMatterSensorTrue}"; + mnDPFalse = "${stringTableErrorCommunicationParticulateMatterSensorFalse}"; Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); mnDP = "ERROR_COMMUNICATION_TEMP_AND_HUMIDITY_SENSOR"; @@ -351,8 +351,9 @@ function ::CreateDeviceMaintenanceChannel() mnDP = "ERROR_SABOTAGE"; mnDPText = ""; - mnDPTrue = "${stringTableErrorSabotageTrue}"; - mnDPFalse = "${stringTableErrorSabotageFalse}"; + ! the texts of stringTableErrorSabotageTrue/False are swapped + mnDPTrue = "${stringTableErrorSabotageFalse}"; + mnDPFalse = "${stringTableErrorSabotageTrue}"; Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); mnDP = "ERROR_UNDERVOLTAGE"; @@ -363,8 +364,8 @@ function ::CreateDeviceMaintenanceChannel() mnDP = "HEATING_COOLING"; mnDPText = ""; - mnDPTrue = "${stringTableHeating}"; - mnDPFalse = "${stringTableCooling}"; + mnDPTrue = "${stringTableCooling}"; + mnDPFalse = "${stringTableHeating}"; Call("/esp/controls/maintenance.fn::OutputMaintenanceBoolDP()"); mnDP = "HUMIDITY_ALARM";