Source code for festivalgrid.device_templates.mqtt_device
import uuid
import socket
from django.conf import settings
import paho.mqtt.client as paho
from .device import DeviceTemplate
[docs]def init_mqtt(client_id=None, on_message=False, on_connect=False, on_disconnect=False):
"""This will open a connection to the mqtt broker and register any callbacks you pass in as parameters.
:param client_id: The name this connection should register as with the broker.
:type client_id: str.
:param on_message: Callback function that gets called when a new message is received.
:type on_message: function.
:param on_connect: Callback function that gets called when the connection to the broker is successful.
:type on_connect: function.
:param on_disconnect: Callback function that gets called when the broker disconnects.
:type on_disconnect: function.
:returns: paho.Client -- the paho Client object instance
"""
if client_id is None:
client_id = 'festivalgrid-%s' % uuid.uuid4()
client = paho.Client(client_id, clean_session=False)
if on_message:
client.on_message = on_message
if on_connect:
client.on_connect = on_connect
if on_disconnect:
client.on_disconnect = on_disconnect
if settings.MQTT_USERNAME:
client.username_pw_set(settings.MQTT_USERNAME, settings.MQTT_PASSWORD)
if settings.MQTT_TLS:
client.tls_set()
# wait for mqtt host
socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex((settings.MQTT_HOST, int(settings.MQTT_PORT)))
client.connect(settings.MQTT_HOST, settings.MQTT_PORT, 5)
return client
[docs]class MQTTDevice(DeviceTemplate):
"""The base class for MQTT based devices.
.. note::
:class:`.Tasmota` is a good reference for implementing new MQTT based device templates.
"""
_client = None
[docs] def send_mqtt_message(self, topic, message):
"""Use this to send a message to the mqtt broker.
:param topic: The topic this message should be published under.
:type topic: str.
:param message: The message that should be published.
:type message: str.
"""
if not self._client:
self._client = init_mqtt('festivalgrid-device-template-%d' % self.device.pk)
topic = "festivalgrid/" + self.device.mqtt_topic + "/" + topic
self._client.publish(topic, message)
[docs] def notify_setup_change(self, model):
"""Pings both the worker and mqtt_broker services that they should reload the setup."""
self.send_mqtt_message("setup_changed", model)