diff --git a/CODEOWNERS b/CODEOWNERS index 77a2ee8355b412eb43c86333216151b771e0de2f..ce170df3602e2332f3f54f5291c4bb40b1e01839 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -229,7 +229,7 @@ homeassistant/components/pi_hole/* @fabaff @johnluetke homeassistant/components/plaato/* @JohNan homeassistant/components/plant/* @ChristianKuehnel homeassistant/components/plex/* @jjlawren -homeassistant/components/plugwise/* @laetificat @CoMPaTech +homeassistant/components/plugwise/* @laetificat @CoMPaTech @bouwew homeassistant/components/point/* @fredrike homeassistant/components/ps4/* @ktnrg45 homeassistant/components/ptvsd/* @swamp-ig diff --git a/homeassistant/components/plugwise/climate.py b/homeassistant/components/plugwise/climate.py index b3b4cf3c1d441c7dbe0ed2e42ba033ab591563ab..fa1ac86941b914e5919bb4d3a3e99ad8cf9d6361 100644 --- a/homeassistant/components/plugwise/climate.py +++ b/homeassistant/components/plugwise/climate.py @@ -9,9 +9,11 @@ import homeassistant.helpers.config_validation as cv from homeassistant.components.climate import PLATFORM_SCHEMA, ClimateDevice from homeassistant.components.climate.const import ( CURRENT_HVAC_HEAT, + CURRENT_HVAC_COOL, CURRENT_HVAC_IDLE, + HVAC_MODE_HEAT, + HVAC_MODE_HEAT_COOL, HVAC_MODE_AUTO, - HVAC_MODE_OFF, SUPPORT_PRESET_MODE, SUPPORT_TARGET_TEMPERATURE, ) @@ -33,6 +35,7 @@ _LOGGER = logging.getLogger(__name__) # Configuration directives CONF_MIN_TEMP = "min_temp" CONF_MAX_TEMP = "max_temp" +CONF_LEGACY = "legacy_anna" # Default directives DEFAULT_NAME = "Plugwise Thermostat" @@ -44,7 +47,8 @@ DEFAULT_MIN_TEMP = 4 DEFAULT_MAX_TEMP = 30 # HVAC modes -ATTR_HVAC_MODES = [HVAC_MODE_AUTO, HVAC_MODE_OFF] +HVAC_MODES_1 = [HVAC_MODE_HEAT, HVAC_MODE_AUTO] +HVAC_MODES_2 = [HVAC_MODE_HEAT_COOL, HVAC_MODE_AUTO] # Read platform configuration PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( @@ -52,6 +56,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_HOST): cv.string, + vol.Optional(CONF_LEGACY, default=False): cv.boolean, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Optional(CONF_MIN_TEMP, default=DEFAULT_MIN_TEMP): cv.positive_int, @@ -67,6 +72,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): config[CONF_PASSWORD], config[CONF_HOST], config[CONF_PORT], + config[CONF_LEGACY], ) try: api.ping_anna_thermostat() @@ -92,15 +98,28 @@ class ThermostatDevice(ClimateDevice): self._name = name self._domain_objects = None self._outdoor_temperature = None - self._active_schema = None + self._selected_schema = None self._preset_mode = None - self._hvac_modes = ATTR_HVAC_MODES + self._presets = None + self._presets_list = None + self._heating_status = None + self._cooling_status = None + self._schema_names = None + self._schema_status = None + self._current_temperature = None + self._thermostat_temperature = None + self._boiler_temperature = None + self._water_pressure = None + self._schedule_temperature = None + self._hvac_mode = None @property def hvac_action(self): """Return the current action.""" - if self._api.get_heating_status(self._domain_objects): + if self._heating_status: return CURRENT_HVAC_HEAT + if self._cooling_status: + return CURRENT_HVAC_COOL return CURRENT_HVAC_IDLE @property @@ -122,49 +141,80 @@ class ThermostatDevice(ClimateDevice): def device_state_attributes(self): """Return the device specific state attributes.""" attributes = {} - attributes["outdoor_temperature"] = self._outdoor_temperature - attributes["available_schemas"] = self._api.get_schema_names( - self._domain_objects - ) - attributes["active_schema"] = self._active_schema + if self._outdoor_temperature: + attributes["outdoor_temperature"] = self._outdoor_temperature + attributes["available_schemas"] = self._schema_names + attributes["selected_schema"] = self._selected_schema + if self._boiler_temperature: + attributes["boiler_temperature"] = self._boiler_temperature + if self._water_pressure: + attributes["water_pressure"] = self._water_pressure return attributes - def update(self): - """Update the data from the thermostat.""" - _LOGGER.debug("Update called") - self._domain_objects = self._api.get_domain_objects() - self._outdoor_temperature = self._api.get_outdoor_temperature( - self._domain_objects - ) - self._active_schema = self._api.get_active_schema_name(self._domain_objects) + @property + def preset_modes(self): + """Return the available preset modes list. + + And make the presets with their temperatures available. + """ + return self._presets_list + + @property + def hvac_modes(self): + """Return the available hvac modes list.""" + if self._heating_status is not None: + if self._cooling_status is not None: + return HVAC_MODES_2 + return HVAC_MODES_1 + return None @property def hvac_mode(self): """Return current active hvac state.""" - if self._api.get_schema_state(self._domain_objects): + if self._schema_status: return HVAC_MODE_AUTO - return HVAC_MODE_OFF + if self._heating_status: + if self._cooling_status: + return HVAC_MODE_HEAT_COOL + return HVAC_MODE_HEAT + return None @property - def preset_mode(self): - """Return the active preset mode.""" - return self._api.get_current_preset(self._domain_objects) + def target_temperature(self): + """Return the target_temperature. - @property - def preset_modes(self): - """Return the available preset modes list without values.""" - presets = list(self._api.get_presets(self._domain_objects)) - return presets + From the XML the thermostat-value is used because it updates 'immediately' + compared to the target_temperature-value. This way the information on the card + is "immediately" updated after changing the preset, temperature, etc. + """ + return self._thermostat_temperature @property - def hvac_modes(self): - """Return the available hvac modes list.""" - return self._hvac_modes + def preset_mode(self): + """Return the active selected schedule-name. + + Or return the active preset, or return Temporary in case of a manual change + in the set-temperature with a weekschedule active, + or return Manual in case of a manual change and no weekschedule active. + """ + if self._presets: + presets = self._presets + preset_temperature = presets.get(self._preset_mode, "none") + if self.hvac_mode == HVAC_MODE_AUTO: + if self._thermostat_temperature == self._schedule_temperature: + return "{}".format(self._selected_schema) + if self._thermostat_temperature == preset_temperature: + return self._preset_mode + return "Temporary" + if self._thermostat_temperature != preset_temperature: + return "Manual" + return self._preset_mode + return None @property def current_temperature(self): - """Return the current temperature.""" - return self._api.get_temperature(self._domain_objects) + """Return the current room temperature.""" + return self._current_temperature @property def min_temp(self): @@ -176,11 +226,6 @@ class ThermostatDevice(ClimateDevice): """Return the maximum temperature possible to set.""" return self._max_temp - @property - def target_temperature(self): - """Return the target temperature.""" - return self._api.get_target_temperature(self._domain_objects) - @property def temperature_unit(self): """Return the unit of measured temperature.""" @@ -203,11 +248,39 @@ class ThermostatDevice(ClimateDevice): if hvac_mode == HVAC_MODE_AUTO: schema_mode = "true" self._api.set_schema_state( - self._domain_objects, self._active_schema, schema_mode + self._domain_objects, self._selected_schema, schema_mode ) def set_preset_mode(self, preset_mode): """Set the preset mode.""" _LOGGER.debug("Changing preset mode") - self._preset_mode = preset_mode self._api.set_preset(self._domain_objects, preset_mode) + + def update(self): + """Update the data from the thermostat.""" + _LOGGER.debug("Update called") + self._domain_objects = self._api.get_domain_objects() + self._outdoor_temperature = self._api.get_outdoor_temperature( + self._domain_objects + ) + self._selected_schema = self._api.get_active_schema_name(self._domain_objects) + self._preset_mode = self._api.get_current_preset(self._domain_objects) + self._presets = self._api.get_presets(self._domain_objects) + self._presets_list = list(self._api.get_presets(self._domain_objects)) + self._heating_status = self._api.get_heating_status(self._domain_objects) + self._cooling_status = self._api.get_cooling_status(self._domain_objects) + self._schema_names = self._api.get_schema_names(self._domain_objects) + self._schema_status = self._api.get_schema_state(self._domain_objects) + self._current_temperature = self._api.get_current_temperature( + self._domain_objects + ) + self._thermostat_temperature = self._api.get_thermostat_temperature( + self._domain_objects + ) + self._schedule_temperature = self._api.get_schedule_temperature( + self._domain_objects + ) + self._boiler_temperature = self._api.get_boiler_temperature( + self._domain_objects + ) + self._water_pressure = self._api.get_water_pressure(self._domain_objects) diff --git a/homeassistant/components/plugwise/manifest.json b/homeassistant/components/plugwise/manifest.json index 1069c0bcdf02bdc490c1cc6ea792a708e7205bb6..e786b6a7f8ed70276d28727ed71ceb5876a76f5a 100644 --- a/homeassistant/components/plugwise/manifest.json +++ b/homeassistant/components/plugwise/manifest.json @@ -3,6 +3,6 @@ "name": "Plugwise", "documentation": "https://www.home-assistant.io/integrations/plugwise", "dependencies": [], - "codeowners": ["@laetificat","@CoMPaTech"], - "requirements": ["haanna==0.10.1"] + "codeowners": ["@laetificat","@CoMPaTech","@bouwew"], + "requirements": ["haanna==0.13.5"] } diff --git a/requirements_all.txt b/requirements_all.txt index 04a858ce3b979e0d70ca36031ac0c21d14490080..282d04ac77c66e1ad5dac91600191226fb9d686e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -613,7 +613,7 @@ ha-ffmpeg==2.0 ha-philipsjs==0.0.8 # homeassistant.components.plugwise -haanna==0.10.1 +haanna==0.13.5 # homeassistant.components.habitica habitipy==0.2.0