mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 01:07:10 +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/eight_sleep/*
|
||||||
homeassistant/components/eliqonline/sensor.py
|
homeassistant/components/eliqonline/sensor.py
|
||||||
homeassistant/components/elkm1/*
|
homeassistant/components/elkm1/*
|
||||||
|
homeassistant/components/elv/switch.py
|
||||||
homeassistant/components/emby/media_player.py
|
homeassistant/components/emby/media_player.py
|
||||||
homeassistant/components/emoncms/sensor.py
|
homeassistant/components/emoncms/sensor.py
|
||||||
homeassistant/components/emoncms_history/*
|
homeassistant/components/emoncms_history/*
|
||||||
|
@ -72,6 +72,7 @@ homeassistant/components/ecovacs/* @OverloadUT
|
|||||||
homeassistant/components/edp_redy/* @abmantis
|
homeassistant/components/edp_redy/* @abmantis
|
||||||
homeassistant/components/egardia/* @jeroenterheerdt
|
homeassistant/components/egardia/* @jeroenterheerdt
|
||||||
homeassistant/components/eight_sleep/* @mezz64
|
homeassistant/components/eight_sleep/* @mezz64
|
||||||
|
homeassistant/components/elv/* @majuss
|
||||||
homeassistant/components/emby/* @mezz64
|
homeassistant/components/emby/* @mezz64
|
||||||
homeassistant/components/enigma2/* @fbradyirl
|
homeassistant/components/enigma2/* @fbradyirl
|
||||||
homeassistant/components/enocean/* @bdurrer
|
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
|
# homeassistant.components.openweathermap
|
||||||
pyowm==2.10.0
|
pyowm==2.10.0
|
||||||
|
|
||||||
|
# homeassistant.components.elv
|
||||||
|
pypca==0.0.4
|
||||||
|
|
||||||
# homeassistant.components.lcn
|
# homeassistant.components.lcn
|
||||||
pypck==0.6.1
|
pypck==0.6.1
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user