hass-core/homeassistant/components/binary_sensor/mqtt.py

108 lines
3.5 KiB
Python
Raw Normal View History

2015-11-20 23:43:59 +01:00
"""
2016-03-07 20:21:08 +01:00
Support for MQTT binary sensors.
2015-11-20 23:43:59 +01:00
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.mqtt/
"""
import logging
2015-12-14 21:38:56 +01:00
import voluptuous as vol
from homeassistant.core import callback
2016-02-18 21:27:50 -08:00
import homeassistant.components.mqtt as mqtt
from homeassistant.components.binary_sensor import (
BinarySensorDevice, DEVICE_CLASSES_SCHEMA)
from homeassistant.const import (
CONF_NAME, CONF_VALUE_TEMPLATE, CONF_PAYLOAD_ON, CONF_PAYLOAD_OFF,
CONF_SENSOR_CLASS, CONF_DEVICE_CLASS)
from homeassistant.components.mqtt import (CONF_STATE_TOPIC, CONF_QOS)
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.deprecation import get_deprecated
2015-11-20 23:43:59 +01:00
_LOGGER = logging.getLogger(__name__)
DEFAULT_NAME = 'MQTT Binary sensor'
DEFAULT_PAYLOAD_OFF = 'OFF'
DEFAULT_PAYLOAD_ON = 'ON'
DEPENDENCIES = ['mqtt']
2015-11-20 23:43:59 +01:00
PLATFORM_SCHEMA = mqtt.MQTT_RO_PLATFORM_SCHEMA.extend({
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string,
vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string,
vol.Optional(CONF_SENSOR_CLASS): DEVICE_CLASSES_SCHEMA,
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
})
2015-11-20 23:43:59 +01:00
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices, discovery_info=None):
"""Set up the MQTT binary sensor."""
if discovery_info is not None:
config = PLATFORM_SCHEMA(discovery_info)
value_template = config.get(CONF_VALUE_TEMPLATE)
if value_template is not None:
value_template.hass = hass
2015-11-20 23:43:59 +01:00
add_devices([MqttBinarySensor(
hass,
config.get(CONF_NAME),
config.get(CONF_STATE_TOPIC),
get_deprecated(config, CONF_DEVICE_CLASS, CONF_SENSOR_CLASS),
config.get(CONF_QOS),
config.get(CONF_PAYLOAD_ON),
config.get(CONF_PAYLOAD_OFF),
value_template
)])
2015-11-20 23:43:59 +01:00
class MqttBinarySensor(BinarySensorDevice):
2016-03-10 20:51:58 +01:00
"""Representation a binary sensor that is updated by MQTT."""
2016-03-07 20:21:08 +01:00
def __init__(self, hass, name, state_topic, device_class, qos, payload_on,
2016-03-10 20:51:58 +01:00
payload_off, value_template):
2016-03-07 20:21:08 +01:00
"""Initialize the MQTT binary sensor."""
2015-11-20 23:43:59 +01:00
self._hass = hass
self._name = name
self._state = False
self._state_topic = state_topic
self._device_class = device_class
2015-11-20 23:43:59 +01:00
self._payload_on = payload_on
self._payload_off = payload_off
self._qos = qos
@callback
2015-11-20 23:43:59 +01:00
def message_received(topic, payload, qos):
"""A new MQTT message has been received."""
2015-12-14 21:38:56 +01:00
if value_template is not None:
payload = value_template.async_render_with_possible_json_value(
payload)
2015-11-20 23:43:59 +01:00
if payload == self._payload_on:
self._state = True
hass.async_add_job(self.async_update_ha_state())
2015-11-20 23:43:59 +01:00
elif payload == self._payload_off:
self._state = False
hass.async_add_job(self.async_update_ha_state())
2015-11-20 23:43:59 +01:00
mqtt.subscribe(hass, self._state_topic, message_received, self._qos)
@property
def should_poll(self):
"""No polling needed."""
2015-11-20 23:43:59 +01:00
return False
@property
def name(self):
2016-03-07 20:21:08 +01:00
"""Return the name of the binary sensor."""
2015-11-20 23:43:59 +01:00
return self._name
@property
def is_on(self):
2016-03-07 20:21:08 +01:00
"""Return true if the binary sensor is on."""
2015-11-20 23:43:59 +01:00
return self._state
2016-03-10 20:51:58 +01:00
@property
def device_class(self):
2016-03-10 20:51:58 +01:00
"""Return the class of this sensor."""
return self._device_class