76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
|
"""
|
||
|
Support for UPnP Sensors (IGD).
|
||
|
|
||
|
For more details about this platform, please refer to the documentation at
|
||
|
https://home-assistant.io/components/sensor.upnp/
|
||
|
"""
|
||
|
import logging
|
||
|
|
||
|
from homeassistant.components.upnp import DATA_UPNP, UNITS
|
||
|
from homeassistant.helpers.entity import Entity
|
||
|
|
||
|
_LOGGER = logging.getLogger(__name__)
|
||
|
|
||
|
# sensor_type: [friendly_name, convert_unit, icon]
|
||
|
SENSOR_TYPES = {
|
||
|
'byte_received': ['received bytes', True, 'mdi:server-network'],
|
||
|
'byte_sent': ['sent bytes', True, 'mdi:server-network'],
|
||
|
'packets_in': ['packets received', False, 'mdi:server-network'],
|
||
|
'packets_out': ['packets sent', False, 'mdi:server-network'],
|
||
|
}
|
||
|
|
||
|
|
||
|
def setup_platform(hass, config, add_devices, discovery_info=None):
|
||
|
"""Set up the IGD sensors."""
|
||
|
upnp = hass.data[DATA_UPNP]
|
||
|
unit = discovery_info['unit']
|
||
|
add_devices([
|
||
|
IGDSensor(upnp, t, unit if SENSOR_TYPES[t][1] else None)
|
||
|
for t in SENSOR_TYPES], True)
|
||
|
|
||
|
|
||
|
class IGDSensor(Entity):
|
||
|
"""Representation of a UPnP IGD sensor."""
|
||
|
|
||
|
def __init__(self, upnp, sensor_type, unit=""):
|
||
|
"""Initialize the IGD sensor."""
|
||
|
self._upnp = upnp
|
||
|
self.type = sensor_type
|
||
|
self.unit = unit
|
||
|
self.unit_factor = UNITS[unit] if unit is not None else 1
|
||
|
self._name = 'IGD {}'.format(SENSOR_TYPES[sensor_type][0])
|
||
|
self._state = None
|
||
|
|
||
|
@property
|
||
|
def name(self):
|
||
|
"""Return the name of the sensor."""
|
||
|
return self._name
|
||
|
|
||
|
@property
|
||
|
def state(self):
|
||
|
"""Return the state of the device."""
|
||
|
if self._state is None:
|
||
|
return None
|
||
|
return format(self._state / self.unit_factor, '.1f')
|
||
|
|
||
|
@property
|
||
|
def icon(self):
|
||
|
"""Icon to use in the frontend, if any."""
|
||
|
return SENSOR_TYPES[self.type][2]
|
||
|
|
||
|
@property
|
||
|
def unit_of_measurement(self):
|
||
|
"""Return the unit of measurement of this entity, if any."""
|
||
|
return self.unit
|
||
|
|
||
|
def update(self):
|
||
|
"""Get the latest information from the IGD."""
|
||
|
if self.type == "byte_received":
|
||
|
self._state = self._upnp.totalbytereceived()
|
||
|
elif self.type == "byte_sent":
|
||
|
self._state = self._upnp.totalbytesent()
|
||
|
elif self.type == "packets_in":
|
||
|
self._state = self._upnp.totalpacketreceived()
|
||
|
elif self.type == "packets_out":
|
||
|
self._state = self._upnp.totalpacketsent()
|