148 lines
5.6 KiB
Python
148 lines
5.6 KiB
Python
"""
|
|
Support for MySensors sensors.
|
|
|
|
For more details about this platform, please refer to the documentation at
|
|
https://home-assistant.io/components/sensor.mysensors/
|
|
"""
|
|
import logging
|
|
|
|
from homeassistant.components import mysensors
|
|
from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT
|
|
from homeassistant.helpers.entity import Entity
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def setup_platform(hass, config, add_devices, discovery_info=None):
|
|
"""Setup the MySensors platform for sensors."""
|
|
# Only act if loaded via mysensors by discovery event.
|
|
# Otherwise gateway is not setup.
|
|
if discovery_info is None:
|
|
return
|
|
|
|
gateways = hass.data.get(mysensors.MYSENSORS_GATEWAYS)
|
|
if not gateways:
|
|
return
|
|
|
|
for gateway in gateways:
|
|
# Define the S_TYPES and V_TYPES that the platform should handle as
|
|
# states. Map them in a dict of lists.
|
|
pres = gateway.const.Presentation
|
|
set_req = gateway.const.SetReq
|
|
map_sv_types = {
|
|
pres.S_TEMP: [set_req.V_TEMP],
|
|
pres.S_HUM: [set_req.V_HUM],
|
|
pres.S_BARO: [set_req.V_PRESSURE, set_req.V_FORECAST],
|
|
pres.S_WIND: [set_req.V_WIND, set_req.V_GUST, set_req.V_DIRECTION],
|
|
pres.S_RAIN: [set_req.V_RAIN, set_req.V_RAINRATE],
|
|
pres.S_UV: [set_req.V_UV],
|
|
pres.S_WEIGHT: [set_req.V_WEIGHT, set_req.V_IMPEDANCE],
|
|
pres.S_POWER: [set_req.V_WATT, set_req.V_KWH],
|
|
pres.S_DISTANCE: [set_req.V_DISTANCE],
|
|
pres.S_LIGHT_LEVEL: [set_req.V_LIGHT_LEVEL],
|
|
pres.S_IR: [set_req.V_IR_RECEIVE],
|
|
pres.S_WATER: [set_req.V_FLOW, set_req.V_VOLUME],
|
|
pres.S_CUSTOM: [set_req.V_VAR1,
|
|
set_req.V_VAR2,
|
|
set_req.V_VAR3,
|
|
set_req.V_VAR4,
|
|
set_req.V_VAR5],
|
|
pres.S_SCENE_CONTROLLER: [set_req.V_SCENE_ON,
|
|
set_req.V_SCENE_OFF],
|
|
}
|
|
if float(gateway.protocol_version) < 1.5:
|
|
map_sv_types.update({
|
|
pres.S_AIR_QUALITY: [set_req.V_DUST_LEVEL],
|
|
pres.S_DUST: [set_req.V_DUST_LEVEL],
|
|
})
|
|
if float(gateway.protocol_version) >= 1.5:
|
|
map_sv_types.update({
|
|
pres.S_COLOR_SENSOR: [set_req.V_RGB],
|
|
pres.S_MULTIMETER: [set_req.V_VOLTAGE,
|
|
set_req.V_CURRENT,
|
|
set_req.V_IMPEDANCE],
|
|
pres.S_SOUND: [set_req.V_LEVEL],
|
|
pres.S_VIBRATION: [set_req.V_LEVEL],
|
|
pres.S_MOISTURE: [set_req.V_LEVEL],
|
|
pres.S_AIR_QUALITY: [set_req.V_LEVEL],
|
|
pres.S_DUST: [set_req.V_LEVEL],
|
|
})
|
|
map_sv_types[pres.S_LIGHT_LEVEL].append(set_req.V_LEVEL)
|
|
|
|
if float(gateway.protocol_version) >= 2.0:
|
|
map_sv_types.update({
|
|
pres.S_INFO: [set_req.V_TEXT],
|
|
pres.S_GAS: [set_req.V_FLOW, set_req.V_VOLUME],
|
|
pres.S_GPS: [set_req.V_POSITION],
|
|
pres.S_WATER_QUALITY: [set_req.V_TEMP, set_req.V_PH,
|
|
set_req.V_ORP, set_req.V_EC]
|
|
})
|
|
map_sv_types[pres.S_CUSTOM].append(set_req.V_CUSTOM)
|
|
map_sv_types[pres.S_POWER].extend(
|
|
[set_req.V_VAR, set_req.V_VA, set_req.V_POWER_FACTOR])
|
|
|
|
devices = {}
|
|
gateway.platform_callbacks.append(mysensors.pf_callback_factory(
|
|
map_sv_types, devices, MySensorsSensor, add_devices))
|
|
|
|
|
|
class MySensorsSensor(mysensors.MySensorsDeviceEntity, Entity):
|
|
"""Representation of a MySensors Sensor child node."""
|
|
|
|
@property
|
|
def force_update(self):
|
|
"""Return True if state updates should be forced.
|
|
|
|
If True, a state change will be triggered anytime the state property is
|
|
updated, not just when the value changes.
|
|
"""
|
|
return True
|
|
|
|
@property
|
|
def state(self):
|
|
"""Return the state of the device."""
|
|
return self._values.get(self.value_type)
|
|
|
|
@property
|
|
def unit_of_measurement(self):
|
|
"""Return the unit of measurement of this entity."""
|
|
pres = self.gateway.const.Presentation
|
|
set_req = self.gateway.const.SetReq
|
|
unit_map = {
|
|
set_req.V_TEMP: (TEMP_CELSIUS
|
|
if self.gateway.metric else TEMP_FAHRENHEIT),
|
|
set_req.V_HUM: '%',
|
|
set_req.V_DIMMER: '%',
|
|
set_req.V_LIGHT_LEVEL: '%',
|
|
set_req.V_DIRECTION: '°',
|
|
set_req.V_WEIGHT: 'kg',
|
|
set_req.V_DISTANCE: 'm',
|
|
set_req.V_IMPEDANCE: 'ohm',
|
|
set_req.V_WATT: 'W',
|
|
set_req.V_KWH: 'kWh',
|
|
set_req.V_FLOW: 'm',
|
|
set_req.V_VOLUME: 'm³',
|
|
set_req.V_VOLTAGE: 'V',
|
|
set_req.V_CURRENT: 'A',
|
|
}
|
|
if float(self.gateway.protocol_version) >= 1.5:
|
|
if set_req.V_UNIT_PREFIX in self._values:
|
|
return self._values[
|
|
set_req.V_UNIT_PREFIX]
|
|
unit_map.update({
|
|
set_req.V_PERCENTAGE: '%',
|
|
set_req.V_LEVEL: {
|
|
pres.S_SOUND: 'dB', pres.S_VIBRATION: 'Hz',
|
|
pres.S_LIGHT_LEVEL: 'lux'}})
|
|
if float(self.gateway.protocol_version) >= 2.0:
|
|
unit_map.update({
|
|
set_req.V_ORP: 'mV',
|
|
set_req.V_EC: 'μS/cm',
|
|
set_req.V_VAR: 'var',
|
|
set_req.V_VA: 'VA',
|
|
})
|
|
unit = unit_map.get(self.value_type)
|
|
if isinstance(unit, dict):
|
|
unit = unit.get(self.child_type)
|
|
return unit
|