Интеграция Paho MQTT с Django - PullRequest
       10

Интеграция Paho MQTT с Django

0 голосов
/ 04 сентября 2018

Я делаю проект, который использует Django и MQTT. Есть ситуация, когда я хочу повторно подписаться на все темы, относящиеся к моделям в базе данных, когда мой веб-сервер Django повторно подключается к брокеру после отключения по какой-либо причине. У меня есть модель комнаты, как показано ниже:

class Room(models.Model):
building    = models.ForeignKey(Building, on_delete= models.CASCADE)
number      = models.PositiveIntegerField()
available   = models.BooleanField(default=True)
power       = models.BooleanField(default=False)

class Meta:
    ordering = ['building', 'number']
    unique_together = ['building', 'number']

def __str__(self):
    return f"{self.building.bid}/{self.number}"

def get_mqtt_topic(self):
    return f"{self.building.bid}/{self.number}"

Метод get_mqtt_topic () вернет тему MQTT, связанную с комнатой. Код клиента MQTT mqtt / client.py:

import paho.mqtt.client as mqtt
from .tasks import *
from .models import Room
def on_connect(client, userdata, flags, rc):
   print("Connecting to CloudMQTT broker: "+ mqtt.connack_string(rc))
   room_mqtt = [(room.get_mqtt_topic(), 1) for room in Room.objects.all()]
   client.subscribe(room_mqtt)

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

Поскольку я поместил приведенный ниже код в init .py, чтобы запустить клиент mqtt в другом потоке, отличном от приложения django.

from mqtt.client import client

client.loop_start()

поэтому я получил эту ошибку: django.core.exceptions.AppRegistryNotReady: приложения еще не загружены.

1 Ответ

0 голосов
/ 30 октября 2018

У меня та же ошибка, мое предварительное решение - импортировать внутри метода on_connect.

import paho.mqtt.client as mqtt
from .tasks import *
def on_connect(client, userdata, flags, rc):
    from .models import Room
    print("Connecting to CloudMQTT broker: "+ mqtt.connack_string(rc))
    room_mqtt = [(room.get_mqtt_topic(), 1) for room in Room.objects.all()]
    client.subscribe(room_mqtt)

client = mqtt.Client()
client.on_connect = on_connect
...