""" Support for monitoring a Smappee energy sensor. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.smappee/ """ import logging from datetime import timedelta from homeassistant.components.smappee import DATA_SMAPPEE from homeassistant.helpers.entity import Entity DEPENDENCIES = ['smappee'] _LOGGER = logging.getLogger(__name__) SENSOR_PREFIX = 'Smappee' SENSOR_TYPES = { 'solar': ['Solar', 'mdi:white-balance-sunny', 'local', 'W', 'solar'], 'active_power': ['Active Power', 'mdi:power-plug', 'local', 'W', 'active_power'], 'current': ['Current', 'mdi:gauge', 'local', 'A', 'current'], 'voltage': ['Voltage', 'mdi:gauge', 'local', 'V', 'voltage'], 'active_cosfi': ['Power Factor', 'mdi:gauge', 'local', '%', 'active_cosfi'], 'alwayson_today': ['Always On Today', 'mdi:gauge', 'remote', 'kWh', 'alwaysOn'], 'solar_today': ['Solar Today', 'mdi:white-balance-sunny', 'remote', 'kWh', 'solar'], 'power_today': ['Power Today', 'mdi:power-plug', 'remote', 'kWh', 'consumption'], 'water_sensor_1': ['Water Sensor 1', 'mdi:water', 'water', 'm3', 'value1'], 'water_sensor_2': ['Water Sensor 2', 'mdi:water', 'water', 'm3', 'value2'], 'water_sensor_temperature': ['Water Sensor Temperature', 'mdi:temperature-celsius', 'water', '°', 'temperature'], 'water_sensor_humidity': ['Water Sensor Humidity', 'mdi:water-percent', 'water', '%', 'humidity'], 'water_sensor_battery': ['Water Sensor Battery', 'mdi:battery', 'water', '%', 'battery'], } SCAN_INTERVAL = timedelta(seconds=30) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Smappee sensor.""" smappee = hass.data[DATA_SMAPPEE] dev = [] if smappee.is_remote_active: for location_id in smappee.locations.keys(): for sensor in SENSOR_TYPES: if 'remote' in SENSOR_TYPES[sensor]: dev.append(SmappeeSensor(smappee, location_id, sensor, SENSOR_TYPES[sensor])) elif 'water' in SENSOR_TYPES[sensor]: for items in smappee.info[location_id].get('sensors'): dev.append(SmappeeSensor( smappee, location_id, '{}:{}'.format(sensor, items.get('id')), SENSOR_TYPES[sensor])) if smappee.is_local_active: for location_id in smappee.locations.keys(): for sensor in SENSOR_TYPES: if 'local' in SENSOR_TYPES[sensor]: if smappee.is_remote_active: dev.append(SmappeeSensor(smappee, location_id, sensor, SENSOR_TYPES[sensor])) else: dev.append(SmappeeSensor(smappee, None, sensor, SENSOR_TYPES[sensor])) add_entities(dev, True) class SmappeeSensor(Entity): """Implementation of a Smappee sensor.""" def __init__(self, smappee, location_id, sensor, attributes): """Initialize the Smappee sensor.""" self._smappee = smappee self._location_id = location_id self._attributes = attributes self._sensor = sensor self.data = None self._state = None self._name = self._attributes[0] self._icon = self._attributes[1] self._type = self._attributes[2] self._unit_of_measurement = self._attributes[3] self._smappe_name = self._attributes[4] @property def name(self): """Return the name of the sensor.""" if self._location_id: location_name = self._smappee.locations[self._location_id] else: location_name = 'Local' return "{} {} {}".format(SENSOR_PREFIX, location_name, self._name) @property def icon(self): """Icon to use in the frontend.""" return self._icon @property def state(self): """Return the state of the sensor.""" return self._state @property def unit_of_measurement(self): """Return the unit of measurement of this entity, if any.""" return self._unit_of_measurement @property def device_state_attributes(self): """Return the state attributes of the device.""" attr = {} if self._location_id: attr['Location Id'] = self._location_id attr['Location Name'] = self._smappee.locations[self._location_id] return attr def update(self): """Get the latest data from Smappee and update the state.""" self._smappee.update() if self._sensor in ['alwayson_today', 'solar_today', 'power_today']: data = self._smappee.consumption[self._location_id] if data: consumption = data.get('consumptions')[-1] _LOGGER.debug("%s %s", self._sensor, consumption) value = consumption.get(self._smappe_name) self._state = round(value / 1000, 2) elif self._sensor == 'active_cosfi': cosfi = self._smappee.active_cosfi() _LOGGER.debug("%s %s", self._sensor, cosfi) if cosfi: self._state = round(cosfi, 2) elif self._sensor == 'current': current = self._smappee.active_current() _LOGGER.debug("%s %s", self._sensor, current) if current: self._state = round(current, 2) elif self._sensor == 'voltage': voltage = self._smappee.active_voltage() _LOGGER.debug("%s %s", self._sensor, voltage) if voltage: self._state = round(voltage, 3) elif self._sensor == 'active_power': data = self._smappee.instantaneous _LOGGER.debug("%s %s", self._sensor, data) if data: value1 = [float(i['value']) for i in data if i['key'].endswith('phase0ActivePower')] value2 = [float(i['value']) for i in data if i['key'].endswith('phase1ActivePower')] value3 = [float(i['value']) for i in data if i['key'].endswith('phase2ActivePower')] active_power = sum(value1 + value2 + value3) / 1000 self._state = round(active_power, 2) elif self._sensor == 'solar': data = self._smappee.instantaneous _LOGGER.debug("%s %s", self._sensor, data) if data: value1 = [float(i['value']) for i in data if i['key'].endswith('phase3ActivePower')] value2 = [float(i['value']) for i in data if i['key'].endswith('phase4ActivePower')] value3 = [float(i['value']) for i in data if i['key'].endswith('phase5ActivePower')] power = sum(value1 + value2 + value3) / 1000 self._state = round(power, 2) elif self._type == 'water': sensor_name, sensor_id = self._sensor.split(":") data = self._smappee.sensor_consumption[self._location_id]\ .get(int(sensor_id)) if data: tempdata = data.get('records') if tempdata: consumption = tempdata[-1] _LOGGER.debug("%s (%s) %s", sensor_name, sensor_id, consumption) value = consumption.get(self._smappe_name) self._state = value