Resolves #401 Climate support fixes

This commit is contained in:
estevez-dev 2019-08-16 13:29:41 +03:00
parent 929abea5d3
commit 9afaebfa12
3 changed files with 81 additions and 89 deletions

View File

@ -10,71 +10,57 @@ class ClimateEntity extends Entity {
); );
static const SUPPORT_TARGET_TEMPERATURE = 1; static const SUPPORT_TARGET_TEMPERATURE = 1;
static const SUPPORT_TARGET_TEMPERATURE_HIGH = 2; static const SUPPORT_TARGET_TEMPERATURE_RANGE = 2;
static const SUPPORT_TARGET_TEMPERATURE_LOW = 4; static const SUPPORT_TARGET_HUMIDITY = 4;
static const SUPPORT_TARGET_HUMIDITY = 8; static const SUPPORT_FAN_MODE = 8;
static const SUPPORT_TARGET_HUMIDITY_HIGH = 16; static const SUPPORT_PRESET_MODE = 16;
static const SUPPORT_TARGET_HUMIDITY_LOW = 32; static const SUPPORT_SWING_MODE = 32;
static const SUPPORT_FAN_MODE = 64; static const SUPPORT_AUX_HEAT = 64;
static const SUPPORT_OPERATION_MODE = 128;
static const SUPPORT_HOLD_MODE = 256;
static const SUPPORT_SWING_MODE = 512; //static const SUPPORT_OPERATION_MODE = 16;
static const SUPPORT_AWAY_MODE = 1024; //static const SUPPORT_HOLD_MODE = 256;
static const SUPPORT_AUX_HEAT = 2048; //static const SUPPORT_AWAY_MODE = 1024;
static const SUPPORT_ON_OFF = 4096; //static const SUPPORT_ON_OFF = 4096;
ClimateEntity(Map rawData, String webHost) : super(rawData, webHost); ClimateEntity(Map rawData, String webHost) : super(rawData, webHost);
bool get supportTargetTemperature => ((supportedFeatures & bool get supportTargetTemperature => ((supportedFeatures &
ClimateEntity.SUPPORT_TARGET_TEMPERATURE) == ClimateEntity.SUPPORT_TARGET_TEMPERATURE) ==
ClimateEntity.SUPPORT_TARGET_TEMPERATURE); ClimateEntity.SUPPORT_TARGET_TEMPERATURE);
bool get supportTargetTemperatureHigh => ((supportedFeatures & bool get supportTargetTemperatureRange => ((supportedFeatures &
ClimateEntity.SUPPORT_TARGET_TEMPERATURE_HIGH) == ClimateEntity.SUPPORT_TARGET_TEMPERATURE_RANGE) ==
ClimateEntity.SUPPORT_TARGET_TEMPERATURE_HIGH); ClimateEntity.SUPPORT_TARGET_TEMPERATURE_RANGE);
bool get supportTargetTemperatureLow => ((supportedFeatures &
ClimateEntity.SUPPORT_TARGET_TEMPERATURE_LOW) ==
ClimateEntity.SUPPORT_TARGET_TEMPERATURE_LOW);
bool get supportTargetHumidity => ((supportedFeatures & bool get supportTargetHumidity => ((supportedFeatures &
ClimateEntity.SUPPORT_TARGET_HUMIDITY) == ClimateEntity.SUPPORT_TARGET_HUMIDITY) ==
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 => bool get supportFanMode =>
((supportedFeatures & ClimateEntity.SUPPORT_FAN_MODE) == ((supportedFeatures & ClimateEntity.SUPPORT_FAN_MODE) ==
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 => bool get supportSwingMode =>
((supportedFeatures & ClimateEntity.SUPPORT_SWING_MODE) == ((supportedFeatures & ClimateEntity.SUPPORT_SWING_MODE) ==
ClimateEntity.SUPPORT_SWING_MODE); ClimateEntity.SUPPORT_SWING_MODE);
bool get supportAwayMode => bool get supportPresetMode =>
((supportedFeatures & ClimateEntity.SUPPORT_AWAY_MODE) == ((supportedFeatures & ClimateEntity.SUPPORT_PRESET_MODE) ==
ClimateEntity.SUPPORT_AWAY_MODE); ClimateEntity.SUPPORT_PRESET_MODE);
bool get supportAuxHeat => bool get supportAuxHeat =>
((supportedFeatures & ClimateEntity.SUPPORT_AUX_HEAT) == ((supportedFeatures & ClimateEntity.SUPPORT_AUX_HEAT) ==
ClimateEntity.SUPPORT_AUX_HEAT); ClimateEntity.SUPPORT_AUX_HEAT);
bool get supportOnOff =>
((supportedFeatures & ClimateEntity.SUPPORT_ON_OFF) ==
ClimateEntity.SUPPORT_ON_OFF);
List<String> get operationList => attributes["operation_list"] != null List<String> get hvacModes => attributes["hvac_modes"] != null
? (attributes["operation_list"] as List).cast<String>() ? (attributes["hvac_modes"] as List).cast<String>()
: null; : null;
List<String> get fanList => attributes["fan_list"] != null List<String> get fanModes => attributes["fan_modes"] != null
? (attributes["fan_list"] as List).cast<String>() ? (attributes["fan_modes"] as List).cast<String>()
: null; : null;
List<String> get swingList => attributes["swing_list"] != null List<String> get presetModes => attributes["preset_modes"] != null
? (attributes["swing_list"] as List).cast<String>() ? (attributes["preset_modes"] as List).cast<String>()
: null;
List<String> get swingModes => attributes["swing_modes"] != null
? (attributes["swing_modes"] as List).cast<String>()
: null; : null;
double get temperature => _getDoubleAttributeValue('temperature'); double get temperature => _getDoubleAttributeValue('temperature');
double get currentTemperature => _getDoubleAttributeValue('current_temperature');
double get targetHigh => _getDoubleAttributeValue('target_temp_high'); double get targetHigh => _getDoubleAttributeValue('target_temp_high');
double get targetLow => _getDoubleAttributeValue('target_temp_low'); double get targetLow => _getDoubleAttributeValue('target_temp_low');
double get maxTemp => _getDoubleAttributeValue('max_temp') ?? 100.0; double get maxTemp => _getDoubleAttributeValue('max_temp') ?? 100.0;
@ -83,11 +69,12 @@ class ClimateEntity extends Entity {
double get maxHumidity => _getDoubleAttributeValue('max_humidity'); double get maxHumidity => _getDoubleAttributeValue('max_humidity');
double get minHumidity => _getDoubleAttributeValue('min_humidity'); double get minHumidity => _getDoubleAttributeValue('min_humidity');
double get temperatureStep => _getDoubleAttributeValue('target_temp_step') ?? 0.5; 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 fanMode => attributes['fan_mode'];
String get presetMode => attributes['preset_mode'];
String get swingMode => attributes['swing_mode']; String get swingMode => attributes['swing_mode'];
bool get awayMode => attributes['away_mode'] == "on"; 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"; bool get auxHeat => attributes['aux_heat'] == "on";
@override @override
@ -96,10 +83,8 @@ class ClimateEntity extends Entity {
if (supportTargetTemperature) { if (supportTargetTemperature) {
historyConfig.numericAttributesToShow.add("temperature"); historyConfig.numericAttributesToShow.add("temperature");
} }
if (supportTargetTemperatureHigh) { if (supportTargetTemperatureRange) {
historyConfig.numericAttributesToShow.add("target_temp_high"); historyConfig.numericAttributesToShow.add("target_temp_high");
}
if (supportTargetTemperatureLow) {
historyConfig.numericAttributesToShow.add("target_temp_low"); historyConfig.numericAttributesToShow.add("target_temp_low");
} }
} }

View File

@ -19,22 +19,22 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
double _tmpTargetLow = 0.0; double _tmpTargetLow = 0.0;
double _tmpTargetHigh = 0.0; double _tmpTargetHigh = 0.0;
double _tmpTargetHumidity = 0.0; double _tmpTargetHumidity = 0.0;
String _tmpOperationMode; String _tmpHVACMode;
String _tmpFanMode; String _tmpFanMode;
String _tmpSwingMode; String _tmpSwingMode;
bool _tmpAwayMode = false; String _tmpPresetMode;
bool _tmpIsOff = false; //bool _tmpIsOff = false;
bool _tmpAuxHeat = false; bool _tmpAuxHeat = false;
void _resetVars(ClimateEntity entity) { void _resetVars(ClimateEntity entity) {
_tmpTemperature = entity.temperature; _tmpTemperature = entity.temperature;
_tmpTargetHigh = entity.targetHigh; _tmpTargetHigh = entity.targetHigh;
_tmpTargetLow = entity.targetLow; _tmpTargetLow = entity.targetLow;
_tmpOperationMode = entity.operationMode; _tmpHVACMode = entity.state;
_tmpFanMode = entity.fanMode; _tmpFanMode = entity.fanMode;
_tmpSwingMode = entity.swingMode; _tmpSwingMode = entity.swingMode;
_tmpAwayMode = entity.awayMode; _tmpPresetMode = entity.presetMode;
_tmpIsOff = entity.isOff; //_tmpIsOff = entity.isOff;
_tmpAuxHeat = entity.auxHeat; _tmpAuxHeat = entity.auxHeat;
_tmpTargetHumidity = entity.targetHumidity; _tmpTargetHumidity = entity.targetHumidity;
@ -116,11 +116,11 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
}); });
} }
void _setOperationMode(ClimateEntity entity, value) { void _setHVACMode(ClimateEntity entity, value) {
setState(() { setState(() {
_tmpOperationMode = value; _tmpHVACMode = value;
_changedHere = true; _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); _resetStateTimer(entity);
}); });
} }
@ -143,23 +143,23 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
}); });
} }
void _setAwayMode(ClimateEntity entity, value) { void _setPresetMode(ClimateEntity entity, value) {
setState(() { setState(() {
_tmpAwayMode = value; _tmpPresetMode = value;
_changedHere = true; _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); _resetStateTimer(entity);
}); });
} }
void _setOnOf(ClimateEntity entity, value) { /*void _setOnOf(ClimateEntity entity, value) {
setState(() { setState(() {
_tmpIsOff = !value; _tmpIsOff = !value;
_changedHere = true; _changedHere = true;
eventBus.fire(new ServiceCallEvent(entity.domain, "${_tmpIsOff ? 'turn_off' : 'turn_on'}", entity.entityId, null)); eventBus.fire(new ServiceCallEvent(entity.domain, "${_tmpIsOff ? 'turn_off' : 'turn_on'}", entity.entityId, null));
_resetStateTimer(entity); _resetStateTimer(entity);
}); });
} }*/
void _setAuxHeat(ClimateEntity entity, value) { void _setAuxHeat(ClimateEntity entity, value) {
setState(() { setState(() {
@ -196,33 +196,34 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
_buildOnOffControl(entity), //_buildOnOffControl(entity),
_buildTemperatureControls(entity), _buildTemperatureControls(entity),
_buildTargetTemperatureControls(entity), _buildTargetTemperatureControls(entity),
_buildHumidityControls(entity), _buildHumidityControls(entity),
_buildOperationControl(entity), _buildOperationControl(entity),
_buildFanControl(entity), _buildFanControl(entity),
_buildSwingControl(entity), _buildSwingControl(entity),
_buildAwayModeControl(entity), _buildPresetModeControl(entity),
_buildAuxHeatControl(entity) _buildAuxHeatControl(entity)
], ],
), ),
); );
} }
Widget _buildAwayModeControl(ClimateEntity entity) { Widget _buildPresetModeControl(ClimateEntity entity) {
if (entity.supportAwayMode) { if (entity.supportPresetMode) {
return ModeSwitchWidget( return ModeSelectorWidget(
caption: "Away mode", options: entity.presetModes,
onChange: (value) => _setAwayMode(entity, value), onChange: (mode) => _setPresetMode(entity, mode),
value: _tmpAwayMode, caption: "Preset",
value: _tmpPresetMode,
); );
} else { } else {
return Container(height: 0.0, width: 0.0,); return Container(height: 0.0, width: 0.0,);
} }
} }
Widget _buildOnOffControl(ClimateEntity entity) { /*Widget _buildOnOffControl(ClimateEntity entity) {
if (entity.supportOnOff) { if (entity.supportOnOff) {
return ModeSwitchWidget( return ModeSwitchWidget(
onChange: (value) => _setOnOf(entity, value), onChange: (value) => _setOnOf(entity, value),
@ -232,7 +233,7 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
} else { } else {
return Container(height: 0.0, width: 0.0,); return Container(height: 0.0, width: 0.0,);
} }
} }*/
Widget _buildAuxHeatControl(ClimateEntity entity) { Widget _buildAuxHeatControl(ClimateEntity entity) {
if (entity.supportAuxHeat ) { if (entity.supportAuxHeat ) {
@ -247,12 +248,12 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
} }
Widget _buildOperationControl(ClimateEntity entity) { Widget _buildOperationControl(ClimateEntity entity) {
if (entity.supportOperationMode) { if (entity.hvacModes != null) {
return ModeSelectorWidget( return ModeSelectorWidget(
onChange: (mode) => _setOperationMode(entity, mode), onChange: (mode) => _setHVACMode(entity, mode),
options: entity.operationList, options: entity.hvacModes,
caption: "Operation", caption: "Operation",
value: _tmpOperationMode, value: _tmpHVACMode,
); );
} else { } else {
return Container(height: 0.0, width: 0.0); return Container(height: 0.0, width: 0.0);
@ -262,7 +263,7 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
Widget _buildFanControl(ClimateEntity entity) { Widget _buildFanControl(ClimateEntity entity) {
if (entity.supportFanMode) { if (entity.supportFanMode) {
return ModeSelectorWidget( return ModeSelectorWidget(
options: entity.fanList, options: entity.fanModes,
onChange: (mode) => _setFanMode(entity, mode), onChange: (mode) => _setFanMode(entity, mode),
caption: "Fan mode", caption: "Fan mode",
value: _tmpFanMode, value: _tmpFanMode,
@ -276,7 +277,7 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
if (entity.supportSwingMode) { if (entity.supportSwingMode) {
return ModeSelectorWidget( return ModeSelectorWidget(
onChange: (mode) => _setSwingMode(entity, mode), onChange: (mode) => _setSwingMode(entity, mode),
options: entity.swingList, options: entity.swingModes,
value: _tmpSwingMode, value: _tmpSwingMode,
caption: "Swing mode" caption: "Swing mode"
); );
@ -308,7 +309,7 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
Widget _buildTargetTemperatureControls(ClimateEntity entity) { Widget _buildTargetTemperatureControls(ClimateEntity entity) {
List<Widget> controls = []; List<Widget> controls = [];
if ((entity.supportTargetTemperatureLow) && (entity.targetLow != null)) { if ((entity.supportTargetTemperatureRange) && (entity.targetLow != null)) {
controls.addAll(<Widget>[ controls.addAll(<Widget>[
TemperatureControlWidget( TemperatureControlWidget(
value: _tmpTargetLow, value: _tmpTargetLow,
@ -321,7 +322,7 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> {
) )
]); ]);
} }
if ((entity.supportTargetTemperatureHigh) && (entity.targetHigh != null)) { if ((entity.supportTargetTemperatureRange) && (entity.targetHigh != null)) {
controls.add( controls.add(
TemperatureControlWidget( TemperatureControlWidget(
value: _tmpTargetHigh, value: _tmpTargetHigh,

View File

@ -8,13 +8,19 @@ class ClimateStateWidget extends StatelessWidget {
String targetTemp = "-"; String targetTemp = "-";
if ((entity.supportTargetTemperature) && (entity.temperature != null)) { if ((entity.supportTargetTemperature) && (entity.temperature != null)) {
targetTemp = "${entity.temperature}"; targetTemp = "${entity.temperature}";
} else if ((entity.supportTargetTemperatureLow) && } else if ((entity.supportTargetTemperatureRange) &&
(entity.targetLow != null)) { (entity.targetLow != null) &&
targetTemp = "${entity.targetLow}"; (entity.targetHigh != null)) {
if ((entity.supportTargetTemperatureHigh) && targetTemp = "${entity.targetLow} - ${entity.targetHigh}";
(entity.targetHigh != null)) { }
targetTemp += " - ${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( return Padding(
padding: EdgeInsets.fromLTRB( padding: EdgeInsets.fromLTRB(
@ -25,7 +31,7 @@ class ClimateStateWidget extends StatelessWidget {
children: <Widget>[ children: <Widget>[
Row( Row(
children: <Widget>[ children: <Widget>[
Text("${entity.state}", Text("$displayState",
textAlign: TextAlign.right, textAlign: TextAlign.right,
style: new TextStyle( style: new TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@ -38,8 +44,8 @@ class ClimateStateWidget extends StatelessWidget {
)) ))
], ],
), ),
entity.attributes["current_temperature"] != null ? entity.currentTemperature != null ?
Text("Currently: ${entity.attributes["current_temperature"]}", Text("Currently: ${entity.currentTemperature}",
textAlign: TextAlign.right, textAlign: TextAlign.right,
style: new TextStyle( style: new TextStyle(
fontSize: Sizes.stateFontSize, fontSize: Sizes.stateFontSize,