Skip to content

Commit

Permalink
add support for fans
Browse files Browse the repository at this point in the history
  • Loading branch information
fiva authored and fiva committed Dec 6, 2020
1 parent 5e698bd commit 743fc40
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 2 deletions.
7 changes: 6 additions & 1 deletion custom_components/nhc2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions custom_components/nhc2/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
139 changes: 139 additions & 0 deletions custom_components/nhc2/fan.py
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion custom_components/nhc2/manifest.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down

0 comments on commit 743fc40

Please sign in to comment.