From 9afaebfa120bd77ad78ae74b9f6bb6d50ccd073a Mon Sep 17 00:00:00 2001 From: estevez-dev Date: Fri, 16 Aug 2019 13:29:41 +0300 Subject: [PATCH] Resolves #401 Climate support fixes --- lib/entity_class/climate_entity.class.dart | 79 ++++++++----------- .../controls/climate_controls.dart | 65 +++++++-------- lib/entity_widgets/state/climate_state.dart | 26 +++--- 3 files changed, 81 insertions(+), 89 deletions(-) diff --git a/lib/entity_class/climate_entity.class.dart b/lib/entity_class/climate_entity.class.dart index 672e0db..d634415 100644 --- a/lib/entity_class/climate_entity.class.dart +++ b/lib/entity_class/climate_entity.class.dart @@ -10,71 +10,57 @@ class ClimateEntity extends Entity { ); static const SUPPORT_TARGET_TEMPERATURE = 1; - static const SUPPORT_TARGET_TEMPERATURE_HIGH = 2; - static const SUPPORT_TARGET_TEMPERATURE_LOW = 4; - static const SUPPORT_TARGET_HUMIDITY = 8; - static const SUPPORT_TARGET_HUMIDITY_HIGH = 16; - static const SUPPORT_TARGET_HUMIDITY_LOW = 32; - static const SUPPORT_FAN_MODE = 64; - static const SUPPORT_OPERATION_MODE = 128; - static const SUPPORT_HOLD_MODE = 256; - static const SUPPORT_SWING_MODE = 512; - static const SUPPORT_AWAY_MODE = 1024; - static const SUPPORT_AUX_HEAT = 2048; - static const SUPPORT_ON_OFF = 4096; + static const SUPPORT_TARGET_TEMPERATURE_RANGE = 2; + static const SUPPORT_TARGET_HUMIDITY = 4; + static const SUPPORT_FAN_MODE = 8; + static const SUPPORT_PRESET_MODE = 16; + static const SUPPORT_SWING_MODE = 32; + static const SUPPORT_AUX_HEAT = 64; + + + //static const SUPPORT_OPERATION_MODE = 16; + //static const SUPPORT_HOLD_MODE = 256; + //static const SUPPORT_AWAY_MODE = 1024; + //static const SUPPORT_ON_OFF = 4096; ClimateEntity(Map rawData, String webHost) : super(rawData, webHost); bool get supportTargetTemperature => ((supportedFeatures & ClimateEntity.SUPPORT_TARGET_TEMPERATURE) == ClimateEntity.SUPPORT_TARGET_TEMPERATURE); - bool get supportTargetTemperatureHigh => ((supportedFeatures & - ClimateEntity.SUPPORT_TARGET_TEMPERATURE_HIGH) == - ClimateEntity.SUPPORT_TARGET_TEMPERATURE_HIGH); - bool get supportTargetTemperatureLow => ((supportedFeatures & - ClimateEntity.SUPPORT_TARGET_TEMPERATURE_LOW) == - ClimateEntity.SUPPORT_TARGET_TEMPERATURE_LOW); + bool get supportTargetTemperatureRange => ((supportedFeatures & + ClimateEntity.SUPPORT_TARGET_TEMPERATURE_RANGE) == + ClimateEntity.SUPPORT_TARGET_TEMPERATURE_RANGE); bool get supportTargetHumidity => ((supportedFeatures & ClimateEntity.SUPPORT_TARGET_HUMIDITY) == ClimateEntity.SUPPORT_TARGET_HUMIDITY); - bool get supportTargetHumidityHigh => ((supportedFeatures & - ClimateEntity.SUPPORT_TARGET_HUMIDITY_HIGH) == - ClimateEntity.SUPPORT_TARGET_HUMIDITY_HIGH); - bool get supportTargetHumidityLow => ((supportedFeatures & - ClimateEntity.SUPPORT_TARGET_HUMIDITY_LOW) == - ClimateEntity.SUPPORT_TARGET_HUMIDITY_LOW); bool get supportFanMode => ((supportedFeatures & ClimateEntity.SUPPORT_FAN_MODE) == ClimateEntity.SUPPORT_FAN_MODE); - bool get supportOperationMode => ((supportedFeatures & - ClimateEntity.SUPPORT_OPERATION_MODE) == - ClimateEntity.SUPPORT_OPERATION_MODE); - bool get supportHoldMode => - ((supportedFeatures & ClimateEntity.SUPPORT_HOLD_MODE) == - ClimateEntity.SUPPORT_HOLD_MODE); bool get supportSwingMode => ((supportedFeatures & ClimateEntity.SUPPORT_SWING_MODE) == ClimateEntity.SUPPORT_SWING_MODE); - bool get supportAwayMode => - ((supportedFeatures & ClimateEntity.SUPPORT_AWAY_MODE) == - ClimateEntity.SUPPORT_AWAY_MODE); + bool get supportPresetMode => + ((supportedFeatures & ClimateEntity.SUPPORT_PRESET_MODE) == + ClimateEntity.SUPPORT_PRESET_MODE); bool get supportAuxHeat => ((supportedFeatures & ClimateEntity.SUPPORT_AUX_HEAT) == ClimateEntity.SUPPORT_AUX_HEAT); - bool get supportOnOff => - ((supportedFeatures & ClimateEntity.SUPPORT_ON_OFF) == - ClimateEntity.SUPPORT_ON_OFF); - List get operationList => attributes["operation_list"] != null - ? (attributes["operation_list"] as List).cast() + List get hvacModes => attributes["hvac_modes"] != null + ? (attributes["hvac_modes"] as List).cast() : null; - List get fanList => attributes["fan_list"] != null - ? (attributes["fan_list"] as List).cast() + List get fanModes => attributes["fan_modes"] != null + ? (attributes["fan_modes"] as List).cast() : null; - List get swingList => attributes["swing_list"] != null - ? (attributes["swing_list"] as List).cast() + List get presetModes => attributes["preset_modes"] != null + ? (attributes["preset_modes"] as List).cast() + : null; + List get swingModes => attributes["swing_modes"] != null + ? (attributes["swing_modes"] as List).cast() : null; double get temperature => _getDoubleAttributeValue('temperature'); + double get currentTemperature => _getDoubleAttributeValue('current_temperature'); double get targetHigh => _getDoubleAttributeValue('target_temp_high'); double get targetLow => _getDoubleAttributeValue('target_temp_low'); double get maxTemp => _getDoubleAttributeValue('max_temp') ?? 100.0; @@ -83,11 +69,12 @@ class ClimateEntity extends Entity { double get maxHumidity => _getDoubleAttributeValue('max_humidity'); double get minHumidity => _getDoubleAttributeValue('min_humidity'); double get temperatureStep => _getDoubleAttributeValue('target_temp_step') ?? 0.5; - String get operationMode => attributes['operation_mode']; + String get hvacAction => attributes['hvac_action']; String get fanMode => attributes['fan_mode']; + String get presetMode => attributes['preset_mode']; String get swingMode => attributes['swing_mode']; bool get awayMode => attributes['away_mode'] == "on"; - bool get isOff => state == EntityState.off; + //bool get isOff => state == EntityState.off; bool get auxHeat => attributes['aux_heat'] == "on"; @override @@ -96,10 +83,8 @@ class ClimateEntity extends Entity { if (supportTargetTemperature) { historyConfig.numericAttributesToShow.add("temperature"); } - if (supportTargetTemperatureHigh) { + if (supportTargetTemperatureRange) { historyConfig.numericAttributesToShow.add("target_temp_high"); - } - if (supportTargetTemperatureLow) { historyConfig.numericAttributesToShow.add("target_temp_low"); } } diff --git a/lib/entity_widgets/controls/climate_controls.dart b/lib/entity_widgets/controls/climate_controls.dart index ca1984d..ac68481 100644 --- a/lib/entity_widgets/controls/climate_controls.dart +++ b/lib/entity_widgets/controls/climate_controls.dart @@ -19,22 +19,22 @@ class _ClimateControlWidgetState extends State { double _tmpTargetLow = 0.0; double _tmpTargetHigh = 0.0; double _tmpTargetHumidity = 0.0; - String _tmpOperationMode; + String _tmpHVACMode; String _tmpFanMode; String _tmpSwingMode; - bool _tmpAwayMode = false; - bool _tmpIsOff = false; + String _tmpPresetMode; + //bool _tmpIsOff = false; bool _tmpAuxHeat = false; void _resetVars(ClimateEntity entity) { _tmpTemperature = entity.temperature; _tmpTargetHigh = entity.targetHigh; _tmpTargetLow = entity.targetLow; - _tmpOperationMode = entity.operationMode; + _tmpHVACMode = entity.state; _tmpFanMode = entity.fanMode; _tmpSwingMode = entity.swingMode; - _tmpAwayMode = entity.awayMode; - _tmpIsOff = entity.isOff; + _tmpPresetMode = entity.presetMode; + //_tmpIsOff = entity.isOff; _tmpAuxHeat = entity.auxHeat; _tmpTargetHumidity = entity.targetHumidity; @@ -116,11 +116,11 @@ class _ClimateControlWidgetState extends State { }); } - void _setOperationMode(ClimateEntity entity, value) { + void _setHVACMode(ClimateEntity entity, value) { setState(() { - _tmpOperationMode = value; + _tmpHVACMode = value; _changedHere = true; - eventBus.fire(new ServiceCallEvent(entity.domain, "set_operation_mode", entity.entityId,{"operation_mode": "$_tmpOperationMode"})); + eventBus.fire(new ServiceCallEvent(entity.domain, "set_hvac_mode", entity.entityId,{"hvac_mode": "$_tmpHVACMode"})); _resetStateTimer(entity); }); } @@ -143,23 +143,23 @@ class _ClimateControlWidgetState extends State { }); } - void _setAwayMode(ClimateEntity entity, value) { + void _setPresetMode(ClimateEntity entity, value) { setState(() { - _tmpAwayMode = value; + _tmpPresetMode = value; _changedHere = true; - eventBus.fire(new ServiceCallEvent(entity.domain, "set_away_mode", entity.entityId,{"away_mode": "${_tmpAwayMode ? 'on' : 'off'}"})); + eventBus.fire(new ServiceCallEvent(entity.domain, "set_preset_mode", entity.entityId,{"preset_mode": "$_tmpPresetMode"})); _resetStateTimer(entity); }); } - void _setOnOf(ClimateEntity entity, value) { + /*void _setOnOf(ClimateEntity entity, value) { setState(() { _tmpIsOff = !value; _changedHere = true; eventBus.fire(new ServiceCallEvent(entity.domain, "${_tmpIsOff ? 'turn_off' : 'turn_on'}", entity.entityId, null)); _resetStateTimer(entity); }); - } + }*/ void _setAuxHeat(ClimateEntity entity, value) { setState(() { @@ -196,33 +196,34 @@ class _ClimateControlWidgetState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - _buildOnOffControl(entity), + //_buildOnOffControl(entity), _buildTemperatureControls(entity), _buildTargetTemperatureControls(entity), _buildHumidityControls(entity), _buildOperationControl(entity), _buildFanControl(entity), _buildSwingControl(entity), - _buildAwayModeControl(entity), + _buildPresetModeControl(entity), _buildAuxHeatControl(entity) ], ), ); } - Widget _buildAwayModeControl(ClimateEntity entity) { - if (entity.supportAwayMode) { - return ModeSwitchWidget( - caption: "Away mode", - onChange: (value) => _setAwayMode(entity, value), - value: _tmpAwayMode, + Widget _buildPresetModeControl(ClimateEntity entity) { + if (entity.supportPresetMode) { + return ModeSelectorWidget( + options: entity.presetModes, + onChange: (mode) => _setPresetMode(entity, mode), + caption: "Preset", + value: _tmpPresetMode, ); } else { return Container(height: 0.0, width: 0.0,); } } - Widget _buildOnOffControl(ClimateEntity entity) { + /*Widget _buildOnOffControl(ClimateEntity entity) { if (entity.supportOnOff) { return ModeSwitchWidget( onChange: (value) => _setOnOf(entity, value), @@ -232,7 +233,7 @@ class _ClimateControlWidgetState extends State { } else { return Container(height: 0.0, width: 0.0,); } - } + }*/ Widget _buildAuxHeatControl(ClimateEntity entity) { if (entity.supportAuxHeat ) { @@ -247,12 +248,12 @@ class _ClimateControlWidgetState extends State { } Widget _buildOperationControl(ClimateEntity entity) { - if (entity.supportOperationMode) { + if (entity.hvacModes != null) { return ModeSelectorWidget( - onChange: (mode) => _setOperationMode(entity, mode), - options: entity.operationList, + onChange: (mode) => _setHVACMode(entity, mode), + options: entity.hvacModes, caption: "Operation", - value: _tmpOperationMode, + value: _tmpHVACMode, ); } else { return Container(height: 0.0, width: 0.0); @@ -262,7 +263,7 @@ class _ClimateControlWidgetState extends State { Widget _buildFanControl(ClimateEntity entity) { if (entity.supportFanMode) { return ModeSelectorWidget( - options: entity.fanList, + options: entity.fanModes, onChange: (mode) => _setFanMode(entity, mode), caption: "Fan mode", value: _tmpFanMode, @@ -276,7 +277,7 @@ class _ClimateControlWidgetState extends State { if (entity.supportSwingMode) { return ModeSelectorWidget( onChange: (mode) => _setSwingMode(entity, mode), - options: entity.swingList, + options: entity.swingModes, value: _tmpSwingMode, caption: "Swing mode" ); @@ -308,7 +309,7 @@ class _ClimateControlWidgetState extends State { Widget _buildTargetTemperatureControls(ClimateEntity entity) { List controls = []; - if ((entity.supportTargetTemperatureLow) && (entity.targetLow != null)) { + if ((entity.supportTargetTemperatureRange) && (entity.targetLow != null)) { controls.addAll([ TemperatureControlWidget( value: _tmpTargetLow, @@ -321,7 +322,7 @@ class _ClimateControlWidgetState extends State { ) ]); } - if ((entity.supportTargetTemperatureHigh) && (entity.targetHigh != null)) { + if ((entity.supportTargetTemperatureRange) && (entity.targetHigh != null)) { controls.add( TemperatureControlWidget( value: _tmpTargetHigh, diff --git a/lib/entity_widgets/state/climate_state.dart b/lib/entity_widgets/state/climate_state.dart index 4a37134..9499116 100644 --- a/lib/entity_widgets/state/climate_state.dart +++ b/lib/entity_widgets/state/climate_state.dart @@ -8,13 +8,19 @@ class ClimateStateWidget extends StatelessWidget { String targetTemp = "-"; if ((entity.supportTargetTemperature) && (entity.temperature != null)) { targetTemp = "${entity.temperature}"; - } else if ((entity.supportTargetTemperatureLow) && - (entity.targetLow != null)) { - targetTemp = "${entity.targetLow}"; - if ((entity.supportTargetTemperatureHigh) && - (entity.targetHigh != null)) { - targetTemp += " - ${entity.targetHigh}"; - } + } else if ((entity.supportTargetTemperatureRange) && + (entity.targetLow != null) && + (entity.targetHigh != null)) { + targetTemp = "${entity.targetLow} - ${entity.targetHigh}"; + } + String displayState = ''; + if (entity.hvacAction != null) { + displayState = "${entity.hvacAction} (${entity.displayState})"; + } else { + displayState = "${entity.displayState}"; + } + if (entity.presetMode != null) { + displayState += " - ${entity.presetMode}"; } return Padding( padding: EdgeInsets.fromLTRB( @@ -25,7 +31,7 @@ class ClimateStateWidget extends StatelessWidget { children: [ Row( children: [ - Text("${entity.state}", + Text("$displayState", textAlign: TextAlign.right, style: new TextStyle( fontWeight: FontWeight.bold, @@ -38,8 +44,8 @@ class ClimateStateWidget extends StatelessWidget { )) ], ), - entity.attributes["current_temperature"] != null ? - Text("Currently: ${entity.attributes["current_temperature"]}", + entity.currentTemperature != null ? + Text("Currently: ${entity.currentTemperature}", textAlign: TextAlign.right, style: new TextStyle( fontSize: Sizes.stateFontSize,