130 lines
3.5 KiB
Python
130 lines
3.5 KiB
Python
"""Support for monitoring a Sense energy sensor device."""
|
|
import logging
|
|
|
|
from homeassistant.components.binary_sensor import BinarySensorDevice
|
|
from homeassistant.core import callback
|
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
|
|
|
from . import SENSE_DATA, SENSE_DEVICE_UPDATE
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
BIN_SENSOR_CLASS = "power"
|
|
MDI_ICONS = {
|
|
"ac": "air-conditioner",
|
|
"aquarium": "fish",
|
|
"car": "car-electric",
|
|
"computer": "desktop-classic",
|
|
"cup": "coffee",
|
|
"dehumidifier": "water-off",
|
|
"dishes": "dishwasher",
|
|
"drill": "toolbox",
|
|
"fan": "fan",
|
|
"freezer": "fridge-top",
|
|
"fridge": "fridge-bottom",
|
|
"game": "gamepad-variant",
|
|
"garage": "garage",
|
|
"grill": "stove",
|
|
"heat": "fire",
|
|
"heater": "radiatior",
|
|
"humidifier": "water",
|
|
"kettle": "kettle",
|
|
"leafblower": "leaf",
|
|
"lightbulb": "lightbulb",
|
|
"media_console": "set-top-box",
|
|
"modem": "router-wireless",
|
|
"outlet": "power-socket-us",
|
|
"papershredder": "shredder",
|
|
"printer": "printer",
|
|
"pump": "water-pump",
|
|
"settings": "settings",
|
|
"skillet": "pot",
|
|
"smartcamera": "webcam",
|
|
"socket": "power-plug",
|
|
"sound": "speaker",
|
|
"stove": "stove",
|
|
"trash": "trash-can",
|
|
"tv": "television",
|
|
"vacuum": "robot-vacuum",
|
|
"washer": "washing-machine",
|
|
}
|
|
|
|
|
|
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
|
"""Set up the Sense binary sensor."""
|
|
if discovery_info is None:
|
|
return
|
|
data = hass.data[SENSE_DATA]
|
|
|
|
sense_devices = await data.get_discovered_device_data()
|
|
devices = [
|
|
SenseDevice(data, device)
|
|
for device in sense_devices
|
|
if device["tags"]["DeviceListAllowed"] == "true"
|
|
]
|
|
async_add_entities(devices)
|
|
|
|
|
|
def sense_to_mdi(sense_icon):
|
|
"""Convert sense icon to mdi icon."""
|
|
return "mdi:{}".format(MDI_ICONS.get(sense_icon, "power-plug"))
|
|
|
|
|
|
class SenseDevice(BinarySensorDevice):
|
|
"""Implementation of a Sense energy device binary sensor."""
|
|
|
|
def __init__(self, data, device):
|
|
"""Initialize the Sense binary sensor."""
|
|
self._name = device["name"]
|
|
self._id = device["id"]
|
|
self._icon = sense_to_mdi(device["icon"])
|
|
self._data = data
|
|
self._undo_dispatch_subscription = None
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the binary sensor is on."""
|
|
return self._name in self._data.active_devices
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the binary sensor."""
|
|
return self._name
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return the id of the binary sensor."""
|
|
return self._id
|
|
|
|
@property
|
|
def icon(self):
|
|
"""Return the icon of the binary sensor."""
|
|
return self._icon
|
|
|
|
@property
|
|
def device_class(self):
|
|
"""Return the device class of the binary sensor."""
|
|
return BIN_SENSOR_CLASS
|
|
|
|
@property
|
|
def should_poll(self):
|
|
"""Return the deviceshould not poll for updates."""
|
|
return False
|
|
|
|
async def async_added_to_hass(self):
|
|
"""Register callbacks."""
|
|
|
|
@callback
|
|
def update():
|
|
"""Update the state."""
|
|
self.async_schedule_update_ha_state(True)
|
|
|
|
self._undo_dispatch_subscription = async_dispatcher_connect(
|
|
self.hass, SENSE_DEVICE_UPDATE, update
|
|
)
|
|
|
|
async def async_will_remove_from_hass(self):
|
|
"""Undo subscription."""
|
|
if self._undo_dispatch_subscription:
|
|
self._undo_dispatch_subscription()
|