Small refactoring of MQTT switch (#19010)
This commit is contained in:
commit
578a2cf357
1 changed files with 31 additions and 36 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue