Added ELV PCA 301 smart emeter switch (#23300)

* added pca

* removed req from py

* try to fix codeowners

* redo req

* ran codeowners

* processed comments

* fix style

* fix style

* fix style

* Set availalbe to False when communication fails.
This commit is contained in:
majuss 2019-06-20 00:41:43 +02:00 committed by Paulus Schoutsen
parent f2962a0d16
commit 14752baf27
5 changed files with 116 additions and 0 deletions

View File

@ -157,6 +157,7 @@ omit =
homeassistant/components/eight_sleep/*
homeassistant/components/eliqonline/sensor.py
homeassistant/components/elkm1/*
homeassistant/components/elv/switch.py
homeassistant/components/emby/media_player.py
homeassistant/components/emoncms/sensor.py
homeassistant/components/emoncms_history/*

View File

@ -72,6 +72,7 @@ homeassistant/components/ecovacs/* @OverloadUT
homeassistant/components/edp_redy/* @abmantis
homeassistant/components/egardia/* @jeroenterheerdt
homeassistant/components/eight_sleep/* @mezz64
homeassistant/components/elv/* @majuss
homeassistant/components/emby/* @mezz64
homeassistant/components/enigma2/* @fbradyirl
homeassistant/components/enocean/* @bdurrer

View File

@ -0,0 +1,8 @@
{
"domain": "elv",
"name": "ELV PCA",
"documentation": "https://www.home-assistant.io/components/pca",
"dependencies": [],
"codeowners": ["@majuss"],
"requirements": ["pypca==0.0.4"]
}

View File

@ -0,0 +1,103 @@
"""Support for PCA 301 smart switch."""
import logging
import voluptuous as vol
from homeassistant.components.switch import (
SwitchDevice, PLATFORM_SCHEMA, ATTR_CURRENT_POWER_W)
from homeassistant.const import (
CONF_NAME, CONF_DEVICE, EVENT_HOMEASSISTANT_STOP)
import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__)
ATTR_TOTAL_ENERGY_KWH = 'total_energy_kwh'
DEFAULT_NAME = 'PCA 301'
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Required(CONF_DEVICE): cv.string
})
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the PCA switch platform."""
import pypca
from serial import SerialException
name = config[CONF_NAME]
usb_device = config[CONF_DEVICE]
try:
pca = pypca.PCA(usb_device)
pca.open()
entities = [SmartPlugSwitch(pca, device, name)
for device in pca.get_devices()]
add_entities(entities, True)
except SerialException as exc:
_LOGGER.warning("Unable to open serial port: %s", exc)
return
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, pca.close)
pca.start_scan()
class SmartPlugSwitch(SwitchDevice):
"""Representation of a PCA Smart Plug switch."""
def __init__(self, pca, device_id, name):
"""Initialize the switch."""
self._device_id = device_id
self._name = name
self._state = None
self._available = True
self._emeter_params = {}
self._pca = pca
@property
def name(self):
"""Return the name of the Smart Plug, if any."""
return self._name
@property
def available(self) -> bool:
"""Return if switch is available."""
return self._available
@property
def is_on(self):
"""Return true if switch is on."""
return self._state
def turn_on(self, **kwargs):
"""Turn the switch on."""
self._pca.turn_on(self._device_id)
def turn_off(self, **kwargs):
"""Turn the switch off."""
self._pca.turn_off(self._device_id)
@property
def device_state_attributes(self):
"""Return the state attributes of the device."""
return self._emeter_params
def update(self):
"""Update the PCA switch's state."""
try:
self._emeter_params[ATTR_CURRENT_POWER_W] = "{:.1f}".format(
self._pca.get_current_power(self._device_id))
self._emeter_params[ATTR_TOTAL_ENERGY_KWH] = "{:.2f}".format(
self._pca.get_total_consumption(self._device_id))
self._available = True
self._state = self._pca.get_state(self._device_id)
except (OSError) as ex:
if self._available:
_LOGGER.warning(
"Could not read state for %s: %s", self.name, ex)
self._available = False

View File

@ -1290,6 +1290,9 @@ pyowlet==1.0.2
# homeassistant.components.openweathermap
pyowm==2.10.0
# homeassistant.components.elv
pypca==0.0.4
# homeassistant.components.lcn
pypck==0.6.1