Small refactoring of MQTT switch (#19010)

This commit is contained in:
Paulus Schoutsen 2018-12-05 14:47:02 +01:00 committed by GitHub
commit 578a2cf357
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -86,18 +86,9 @@ class MqttSwitch(MqttAvailability, MqttDiscoveryUpdate, MqttEntityDeviceInfo,
self._state = False self._state = False
self._sub_state = None self._sub_state = None
self._name = None
self._icon = None
self._state_topic = None
self._command_topic = None
self._qos = None
self._retain = None
self._payload_on = None
self._payload_off = None
self._state_on = None self._state_on = None
self._state_off = None self._state_off = None
self._optimistic = None self._optimistic = None
self._template = None
self._unique_id = config.get(CONF_UNIQUE_ID) self._unique_id = config.get(CONF_UNIQUE_ID)
# Load config # Load config
@ -106,9 +97,10 @@ class MqttSwitch(MqttAvailability, MqttDiscoveryUpdate, MqttEntityDeviceInfo,
availability_topic = config.get(CONF_AVAILABILITY_TOPIC) availability_topic = config.get(CONF_AVAILABILITY_TOPIC)
payload_available = config.get(CONF_PAYLOAD_AVAILABLE) payload_available = config.get(CONF_PAYLOAD_AVAILABLE)
payload_not_available = config.get(CONF_PAYLOAD_NOT_AVAILABLE) payload_not_available = config.get(CONF_PAYLOAD_NOT_AVAILABLE)
qos = config.get(CONF_QOS)
device_config = config.get(CONF_DEVICE) device_config = config.get(CONF_DEVICE)
MqttAvailability.__init__(self, availability_topic, self._qos, MqttAvailability.__init__(self, availability_topic, qos,
payload_available, payload_not_available) payload_available, payload_not_available)
MqttDiscoveryUpdate.__init__(self, discovery_hash, MqttDiscoveryUpdate.__init__(self, discovery_hash,
self.discovery_update) self.discovery_update)
@ -129,32 +121,28 @@ class MqttSwitch(MqttAvailability, MqttDiscoveryUpdate, MqttEntityDeviceInfo,
def _setup_from_config(self, config): def _setup_from_config(self, config):
"""(Re)Setup the entity.""" """(Re)Setup the entity."""
self._name = config.get(CONF_NAME) self._config = config
self._icon = config.get(CONF_ICON)
self._state_topic = config.get(CONF_STATE_TOPIC)
self._command_topic = config.get(CONF_COMMAND_TOPIC)
self._qos = config.get(CONF_QOS)
self._retain = config.get(CONF_RETAIN)
self._payload_on = config.get(CONF_PAYLOAD_ON)
self._payload_off = config.get(CONF_PAYLOAD_OFF)
state_on = config.get(CONF_STATE_ON) state_on = config.get(CONF_STATE_ON)
self._state_on = state_on if state_on else self._payload_on self._state_on = state_on if state_on else config.get(CONF_PAYLOAD_ON)
state_off = config.get(CONF_STATE_OFF) state_off = config.get(CONF_STATE_OFF)
self._state_off = state_off if state_off else self._payload_off self._state_off = state_off if state_off else \
config.get(CONF_PAYLOAD_OFF)
self._optimistic = config.get(CONF_OPTIMISTIC) self._optimistic = config.get(CONF_OPTIMISTIC)
config.get(CONF_UNIQUE_ID)
self._template = config.get(CONF_VALUE_TEMPLATE)
async def _subscribe_topics(self): async def _subscribe_topics(self):
"""(Re)Subscribe to topics.""" """(Re)Subscribe to topics."""
if self._template is not None: template = self._config.get(CONF_VALUE_TEMPLATE)
self._template.hass = self.hass if template is not None:
template.hass = self.hass
@callback @callback
def state_message_received(topic, payload, qos): def state_message_received(topic, payload, qos):
"""Handle new MQTT state messages.""" """Handle new MQTT state messages."""
if self._template is not None: if template is not None:
payload = self._template.async_render_with_possible_json_value( payload = template.async_render_with_possible_json_value(
payload) payload)
if payload == self._state_on: if payload == self._state_on:
self._state = True self._state = True
@ -163,15 +151,16 @@ class MqttSwitch(MqttAvailability, MqttDiscoveryUpdate, MqttEntityDeviceInfo,
self.async_schedule_update_ha_state() self.async_schedule_update_ha_state()
if self._state_topic is None: if self._config.get(CONF_STATE_TOPIC) is None:
# Force into optimistic mode. # Force into optimistic mode.
self._optimistic = True self._optimistic = True
else: else:
self._sub_state = await subscription.async_subscribe_topics( self._sub_state = await subscription.async_subscribe_topics(
self.hass, self._sub_state, self.hass, self._sub_state,
{'state_topic': {'topic': self._state_topic, {CONF_STATE_TOPIC:
'msg_callback': state_message_received, {'topic': self._config.get(CONF_STATE_TOPIC),
'qos': self._qos}}) 'msg_callback': state_message_received,
'qos': self._config.get(CONF_QOS)}})
if self._optimistic: if self._optimistic:
last_state = await self.async_get_last_state() last_state = await self.async_get_last_state()
@ -191,7 +180,7 @@ class MqttSwitch(MqttAvailability, MqttDiscoveryUpdate, MqttEntityDeviceInfo,
@property @property
def name(self): def name(self):
"""Return the name of the switch.""" """Return the name of the switch."""
return self._name return self._config.get(CONF_NAME)
@property @property
def is_on(self): def is_on(self):
@ -211,7 +200,7 @@ class MqttSwitch(MqttAvailability, MqttDiscoveryUpdate, MqttEntityDeviceInfo,
@property @property
def icon(self): def icon(self):
"""Return the icon.""" """Return the icon."""
return self._icon return self._config.get(CONF_ICON)
async def async_turn_on(self, **kwargs): async def async_turn_on(self, **kwargs):
"""Turn the device on. """Turn the device on.
@ -219,8 +208,11 @@ class MqttSwitch(MqttAvailability, MqttDiscoveryUpdate, MqttEntityDeviceInfo,
This method is a coroutine. This method is a coroutine.
""" """
mqtt.async_publish( mqtt.async_publish(
self.hass, self._command_topic, self._payload_on, self._qos, self.hass,
self._retain) self._config.get(CONF_COMMAND_TOPIC),
self._config.get(CONF_PAYLOAD_ON),
self._config.get(CONF_QOS),
self._config.get(CONF_RETAIN))
if self._optimistic: if self._optimistic:
# Optimistically assume that switch has changed state. # Optimistically assume that switch has changed state.
self._state = True self._state = True
@ -232,8 +224,11 @@ class MqttSwitch(MqttAvailability, MqttDiscoveryUpdate, MqttEntityDeviceInfo,
This method is a coroutine. This method is a coroutine.
""" """
mqtt.async_publish( mqtt.async_publish(
self.hass, self._command_topic, self._payload_off, self._qos, self.hass,
self._retain) self._config.get(CONF_COMMAND_TOPIC),
self._config.get(CONF_PAYLOAD_OFF),
self._config.get(CONF_QOS),
self._config.get(CONF_RETAIN))
if self._optimistic: if self._optimistic:
# Optimistically assume that switch has changed state. # Optimistically assume that switch has changed state.
self._state = False self._state = False