Skip to content

Commit

Permalink
Add Danfoss Air HRV support (home-assistant#20138)
Browse files Browse the repository at this point in the history
* Add support for Danfoss Air HRV systems.

* Correct lint errors after initial commit of Danfoss Air HRV support.

* A couple of lint fixes for danfoss_air.

* Refactor to comply with HA standards.

* Style fix.

* Use wildcard for danfoss_air in .coveragerc.

* Remove config example from header documentation.
Correct import name for platforms.
  • Loading branch information
JonasPed authored and cgarwood committed Jan 23, 2019
1 parent 16a4180 commit c6cee1c
Show file tree
Hide file tree
Showing 5 changed files with 220 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ omit =
homeassistant/components/digital_ocean.py
homeassistant/components/*/digital_ocean.py

homeassistant/components/danfoss_air/*

homeassistant/components/dominos.py

homeassistant/components/doorbird.py
Expand Down
83 changes: 83 additions & 0 deletions homeassistant/components/danfoss_air/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
"""
Support for Danfoss Air HRV.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/danfoss_air/
"""
from datetime import timedelta
import logging

import voluptuous as vol

from homeassistant.const import CONF_HOST
from homeassistant.helpers import discovery
import homeassistant.helpers.config_validation as cv
from homeassistant.util import Throttle

REQUIREMENTS = ['pydanfossair==0.0.6']

_LOGGER = logging.getLogger(__name__)

DANFOSS_AIR_PLATFORMS = ['sensor', 'binary_sensor']
DOMAIN = 'danfoss_air'

MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60)

CONFIG_SCHEMA = vol.Schema({
DOMAIN: vol.Schema({
vol.Required(CONF_HOST): cv.string,
}),
}, extra=vol.ALLOW_EXTRA)


def setup(hass, config):
"""Set up the Danfoss Air component."""
conf = config[DOMAIN]

hass.data[DOMAIN] = DanfossAir(conf[CONF_HOST])

for platform in DANFOSS_AIR_PLATFORMS:
discovery.load_platform(hass, platform, DOMAIN, {}, config)

return True


class DanfossAir:
"""Handle all communication with Danfoss Air CCM unit."""

def __init__(self, host):
"""Initialize the Danfoss Air CCM connection."""
self._data = {}

from pydanfossair.danfossclient import DanfossClient

self._client = DanfossClient(host)

def get_value(self, item):
"""Get value for sensor."""
if item in self._data:
return self._data[item]

return None

@Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self):
"""Use the data from Danfoss Air API."""
_LOGGER.debug("Fetching data from Danfoss Air CCM module")
from pydanfossair.commands import ReadCommand
self._data[ReadCommand.exhaustTemperature] \
= self._client.command(ReadCommand.exhaustTemperature)
self._data[ReadCommand.outdoorTemperature] \
= self._client.command(ReadCommand.outdoorTemperature)
self._data[ReadCommand.supplyTemperature] \
= self._client.command(ReadCommand.supplyTemperature)
self._data[ReadCommand.extractTemperature] \
= self._client.command(ReadCommand.extractTemperature)
self._data[ReadCommand.humidity] \
= round(self._client.command(ReadCommand.humidity), 2)
self._data[ReadCommand.filterPercent] \
= round(self._client.command(ReadCommand.filterPercent), 2)
self._data[ReadCommand.bypass] \
= self._client.command(ReadCommand.bypass)

_LOGGER.debug("Done fetching data from Danfoss Air CCM module")
56 changes: 56 additions & 0 deletions homeassistant/components/danfoss_air/binary_sensor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
"""
Support for the for Danfoss Air HRV binary sensor platform.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.danfoss_air/
"""
from homeassistant.components.binary_sensor import BinarySensorDevice
from homeassistant.components.danfoss_air import DOMAIN \
as DANFOSS_AIR_DOMAIN


def setup_platform(hass, config, add_devices, discovery_info=None):
"""Set up the available Danfoss Air sensors etc."""
from pydanfossair.commands import ReadCommand
data = hass.data[DANFOSS_AIR_DOMAIN]

sensors = [["Danfoss Air Bypass Active", ReadCommand.bypass]]

dev = []

for sensor in sensors:
dev.append(DanfossAirBinarySensor(data, sensor[0], sensor[1]))

add_devices(dev, True)


class DanfossAirBinarySensor(BinarySensorDevice):
"""Representation of a Danfoss Air binary sensor."""

def __init__(self, data, name, sensor_type):
"""Initialize the Danfoss Air binary sensor."""
self._data = data
self._name = name
self._state = None
self._type = sensor_type

@property
def name(self):
"""Return the name of the sensor."""
return self._name

@property
def is_on(self):
"""Return the state of the sensor."""
return self._state

@property
def device_class(self):
"""Type of device class."""
return "opening"

def update(self):
"""Fetch new state data for the sensor."""
self._data.update()

self._state = self._data.get_value(self._type)
76 changes: 76 additions & 0 deletions homeassistant/components/danfoss_air/sensor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"""
Support for the for Danfoss Air HRV sensor platform.
For more details about this component, please refer to the documentation at
https://home-assistant.io/components/sensor.danfoss_air/
"""
from homeassistant.components.danfoss_air import DOMAIN \
as DANFOSS_AIR_DOMAIN
from homeassistant.const import TEMP_CELSIUS
from homeassistant.helpers.entity import Entity


def setup_platform(hass, config, add_devices, discovery_info=None):
"""Set up the available Danfoss Air sensors etc."""
from pydanfossair.commands import ReadCommand

data = hass.data[DANFOSS_AIR_DOMAIN]

sensors = [
["Danfoss Air Exhaust Temperature", TEMP_CELSIUS,
ReadCommand.exhaustTemperature],
["Danfoss Air Outdoor Temperature", TEMP_CELSIUS,
ReadCommand.outdoorTemperature],
["Danfoss Air Supply Temperature", TEMP_CELSIUS,
ReadCommand.supplyTemperature],
["Danfoss Air Extract Temperature", TEMP_CELSIUS,
ReadCommand.extractTemperature],
["Danfoss Air Remaining Filter", '%',
ReadCommand.filterPercent],
["Danfoss Air Humidity", '%',
ReadCommand.humidity]
]

dev = []

for sensor in sensors:
dev.append(DanfossAir(data, sensor[0], sensor[1], sensor[2]))

add_devices(dev, True)


class DanfossAir(Entity):
"""Representation of a Sensor."""

def __init__(self, data, name, sensorUnit, sensorType):
"""Initialize the sensor."""
self._data = data
self._name = name
self._state = None
self._type = sensorType
self._unit = sensorUnit

@property
def name(self):
"""Return the name of the sensor."""
return self._name

@property
def state(self):
"""Return the state of the sensor."""
return self._state

@property
def unit_of_measurement(self):
"""Return the unit of measurement."""
return self._unit

def update(self):
"""Update the new state of the sensor.
This is done through the DanfossAir object tthat does the actually
communication with the Air CCM.
"""
self._data.update()

self._state = self._data.get_value(self._type)
3 changes: 3 additions & 0 deletions requirements_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -954,6 +954,9 @@ pycsspeechtts==1.0.2
# homeassistant.components.daikin
pydaikin==0.9

# homeassistant.components.danfoss_air
pydanfossair==0.0.6

# homeassistant.components.deconz
pydeconz==47

Expand Down

0 comments on commit c6cee1c

Please sign in to comment.