Solax Inverter Sensor Component (#22579)

* Solax inverter direct API

* Linter compliance

* lint++

* move api communication to external lib

* lint++

* requirements

* Revert "requirements"

This reverts commit 82a6c0c095.

* potentially?

* Addressing review comments

* Also update CODEOWNERS

* Only update sensor state if data has changed
This commit is contained in:
Robin Wohlers-Reichel
2019-05-26 12:55:30 +10:00
committed by Rohan Kapoor
parent e6d7f6ed71
commit 7959c04d1e
6 changed files with 123 additions and 0 deletions

View File

@ -546,6 +546,7 @@ omit =
homeassistant/components/sochain/sensor.py
homeassistant/components/socialblade/sensor.py
homeassistant/components/solaredge/sensor.py
homeassistant/components/solax/sensor.py
homeassistant/components/somfy_mylink/*
homeassistant/components/sonarr/sensor.py
homeassistant/components/songpal/media_player.py

View File

@ -210,6 +210,7 @@ homeassistant/components/sma/* @kellerza
homeassistant/components/smarthab/* @outadoc
homeassistant/components/smartthings/* @andrewsayre
homeassistant/components/smtp/* @fabaff
homeassistant/components/solax/* @squishykid
homeassistant/components/sonos/* @amelchio
homeassistant/components/spaceapi/* @fabaff
homeassistant/components/spider/* @peternijssen

View File

@ -0,0 +1 @@
"""The solax component."""

View File

@ -0,0 +1,11 @@
{
"domain": "solax",
"name": "Solax Inverter",
"documentation": "https://www.home-assistant.io/components/solax",
"requirements": [
"solax==0.0.3"
],
"dependencies": [],
"codeowners": ["@squishykid"]
}

View File

@ -0,0 +1,106 @@
"""Support for Solax inverter via local API."""
import asyncio
from datetime import timedelta
import logging
import voluptuous as vol
from homeassistant.const import (
TEMP_CELSIUS,
CONF_IP_ADDRESS
)
from homeassistant.helpers.entity import Entity
import homeassistant.helpers.config_validation as cv
from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.event import async_track_time_interval
_LOGGER = logging.getLogger(__name__)
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_IP_ADDRESS): cv.string,
})
SCAN_INTERVAL = timedelta(seconds=30)
async def async_setup_platform(hass, config, async_add_entities,
discovery_info=None):
"""Platform setup."""
import solax
api = solax.solax.RealTimeAPI(config[CONF_IP_ADDRESS])
endpoint = RealTimeDataEndpoint(hass, api)
hass.async_add_job(endpoint.async_refresh)
async_track_time_interval(hass, endpoint.async_refresh, SCAN_INTERVAL)
devices = []
for sensor in solax.INVERTER_SENSORS:
unit = solax.INVERTER_SENSORS[sensor][1]
if unit == 'C':
unit = TEMP_CELSIUS
devices.append(Inverter(sensor, unit))
endpoint.sensors = devices
async_add_entities(devices)
class RealTimeDataEndpoint:
"""Representation of a Sensor."""
def __init__(self, hass, api):
"""Initialize the sensor."""
self.hass = hass
self.api = api
self.data = {}
self.ready = asyncio.Event()
self.sensors = []
async def async_refresh(self, now=None):
"""Fetch new state data for the sensor.
This is the only method that should fetch new data for Home Assistant.
"""
from solax import SolaxRequestError
try:
self.data = await self.api.get_data()
self.ready.set()
except SolaxRequestError:
if now is not None:
self.ready.clear()
else:
raise PlatformNotReady
for sensor in self.sensors:
if sensor.key in self.data:
sensor.value = self.data[sensor.key]
sensor.async_schedule_update_ha_state()
class Inverter(Entity):
"""Class for a sensor."""
def __init__(self, key, unit):
"""Initialize an inverter sensor."""
self.key = key
self.value = None
self.unit = unit
@property
def state(self):
"""State of this inverter attribute."""
return self.value
@property
def name(self):
"""Name of this inverter attribute."""
return self.key
@property
def unit_of_measurement(self):
"""Return the unit of measurement."""
return self.unit
@property
def should_poll(self):
"""No polling needed."""
return False

View File

@ -1653,6 +1653,9 @@ socialbladeclient==0.2
# homeassistant.components.solaredge
solaredge==0.0.2
# homeassistant.components.solax
solax==0.0.3
# homeassistant.components.honeywell
somecomfort==0.5.2