From 743fc40c4fd3d0cd365bfc7af195b06fb4ab0c84 Mon Sep 17 00:00:00 2001 From: fiva Date: Sun, 6 Dec 2020 18:01:40 +0100 Subject: [PATCH] add support for fans --- custom_components/nhc2/__init__.py | 7 +- custom_components/nhc2/const.py | 1 + custom_components/nhc2/fan.py | 139 +++++++++++++++++++++++++++ custom_components/nhc2/manifest.json | 2 +- 4 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 custom_components/nhc2/fan.py diff --git a/custom_components/nhc2/__init__.py b/custom_components/nhc2/__init__.py index fed7d9be..a3f8debb 100644 --- a/custom_components/nhc2/__init__.py +++ b/custom_components/nhc2/__init__.py @@ -12,7 +12,7 @@ from .const import DOMAIN, KEY_GATEWAY, CONF_SWITCHES_AS_LIGHTS from .helpers import extract_versions -REQUIREMENTS = ['nhc2-coco==1.2.4'] +REQUIREMENTS = ['nhc2-coco==1.3.2'] _LOGGER = logging.getLogger(__name__) @@ -110,6 +110,11 @@ def process_sysinfo(nhc2_sysinfo): entry, 'cover') ) + hass.async_create_task( + hass.config_entries.async_forward_entry_setup( + entry, 'fan') + ) + return process_sysinfo hass.data.setdefault(KEY_GATEWAY, {})[entry.entry_id] = coco diff --git a/custom_components/nhc2/const.py b/custom_components/nhc2/const.py index 4faeddd4..cccd1a48 100644 --- a/custom_components/nhc2/const.py +++ b/custom_components/nhc2/const.py @@ -7,6 +7,7 @@ LIGHT = 'Light' SWITCH = 'Switch' COVER = 'Cover' +FAN = 'Fan' CONF_SWITCHES_AS_LIGHTS = 'switches_as_lights' DEFAULT_PORT = 8883 KEY_MANUAL = 'MANUAL_IP_HOST' diff --git a/custom_components/nhc2/fan.py b/custom_components/nhc2/fan.py new file mode 100644 index 00000000..a33faffa --- /dev/null +++ b/custom_components/nhc2/fan.py @@ -0,0 +1,139 @@ +"""Support for NHC2 lights.""" +import logging +from typing import Any + +from homeassistant.components.fan import SPEED_HIGH, SPEED_LOW, SPEED_MEDIUM, FanEntity, SUPPORT_SET_SPEED +from nhc2_coco import CoCo +from nhc2_coco.coco_device_class import CoCoDeviceClass +from nhc2_coco.coco_fan import CoCoFan +from nhc2_coco.coco_fan_speed import CoCoFanSpeed + +from .const import DOMAIN, KEY_GATEWAY, BRAND, FAN +from .helpers import nhc2_entity_processor + +KEY_GATEWAY = KEY_GATEWAY +KEY_ENTITY = 'nhc2_fans' + +SPEED_BOOST = 'boost' + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry(hass, config_entry, async_add_entities): + """Load NHC2 lights based on a config entry.""" + hass.data.setdefault(KEY_ENTITY, {})[config_entry.entry_id] = [] + gateway: CoCo = hass.data[KEY_GATEWAY][config_entry.entry_id] + _LOGGER.debug('Platform is starting') + gateway.get_devices(CoCoDeviceClass.FANS, + nhc2_entity_processor(hass, + config_entry, + async_add_entities, + KEY_ENTITY, + lambda x: NHC2HassFan(x)) + ) + + +class NHC2HassFan(FanEntity): + """Representation of an NHC2 Fan.""" + + def __init__(self, nhc2fan: CoCoFan): + """Initialize a light.""" + self._nhc2fan = nhc2fan + self._fan_speed = self._convert_fan_speed_nhc22hass(nhc2fan.fan_speed) + nhc2fan.on_change = self._on_change + + def set_speed(self, speed: str) -> None: + nhc2speed = self._convert_fan_speed_hass2nhc2(speed) + self._nhc2fan.change_speed(nhc2speed) + + def set_direction(self, direction: str) -> None: + pass + + def turn_on(self, speed: str = None, **kwargs) -> None: + if speed is not None: + self.set_speed(speed) + + def turn_off(self, **kwargs: Any) -> None: + pass + + def _on_change(self): + self._fan_speed = self._convert_fan_speed_nhc22hass(self._nhc2fan.fan_speed) + self.schedule_update_ha_state() + + @property + def speed(self) -> str: + """Return the current speed.""" + return self._fan_speed + + @property + def speed_list(self) -> list: + """Get the list of available speeds.""" + return [SPEED_HIGH, + SPEED_LOW, + SPEED_MEDIUM, + SPEED_BOOST] + + @property + def unique_id(self): + """Return the lights UUID.""" + return self._nhc2fan.uuid + + @property + def uuid(self): + """Return the lights UUID.""" + return self._nhc2fan.uuid + + @property + def should_poll(self): + """Return false, since the light will push state.""" + return False + + @property + def name(self): + """Return the lights name.""" + return self._nhc2fan.name + + @property + def available(self): + """Return true if the light is online.""" + return self._nhc2fan.online + + @property + def device_info(self): + """Return the device info.""" + return { + 'identifiers': { + (DOMAIN, self.unique_id) + }, + 'name': self.name, + 'manufacturer': BRAND, + 'model': FAN, + 'via_hub': (DOMAIN, self._nhc2fan.profile_creation_id), + } + + @property + def supported_features(self): + """Return supported features.""" + return SUPPORT_SET_SPEED + + # Helper functions + + def _convert_fan_speed_nhc22hass(self, fan_speed: CoCoFanSpeed) -> str: + if fan_speed == CoCoFanSpeed.HIGH: + return SPEED_HIGH + if fan_speed == CoCoFanSpeed.LOW: + return SPEED_LOW + if fan_speed == CoCoFanSpeed.MEDIUM: + return SPEED_MEDIUM + if fan_speed == CoCoFanSpeed.BOOST: + return SPEED_BOOST + + def _convert_fan_speed_hass2nhc2(self, fan_speed: str) -> CoCoFanSpeed: + if fan_speed == SPEED_HIGH: + return CoCoFanSpeed.HIGH + if fan_speed == SPEED_LOW: + return CoCoFanSpeed.LOW + if fan_speed == SPEED_MEDIUM: + return CoCoFanSpeed.MEDIUM + if fan_speed == SPEED_BOOST: + return CoCoFanSpeed.BOOST diff --git a/custom_components/nhc2/manifest.json b/custom_components/nhc2/manifest.json index 42208681..3ebbe2cd 100644 --- a/custom_components/nhc2/manifest.json +++ b/custom_components/nhc2/manifest.json @@ -1,7 +1,7 @@ { "domain": "nhc2", "name": "Niko Home Control II", - "requirements": ["nhc2-coco==1.2.4"], + "requirements": ["nhc2-coco==1.3.2"], "config_flow": true, "issue_tracker": "https://github.com/filipvh/hass-nhc2/issues", "documentation": "https://github.com/filipvh/hass-nhc2/blob/master/README.md",