mirror of
https://github.com/home-assistant/core.git
synced 2025-04-24 09:17:53 +00:00
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:
parent
f2962a0d16
commit
14752baf27
@ -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/*
|
||||
|
@ -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
|
||||
|
8
homeassistant/components/elv/manifest.json
Normal file
8
homeassistant/components/elv/manifest.json
Normal 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"]
|
||||
}
|
103
homeassistant/components/elv/switch.py
Normal file
103
homeassistant/components/elv/switch.py
Normal 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
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user