MQTT - Python Postgres JSON
Полагаю, что необходимо четко описать, чего я пытаюсь достичь. Надеюсь, я достаточно ясен. Если нет, пожалуйста, дайте мне знать.
Уровень устройства - Я разрабатываю конкретный шаблон для аппаратного/программного обеспечения IoT. Устройства основаны на ESP32 и работают на микропитоне локально на устройстве и подключены к серверу mosquitto по wifi. Каждое устройство использует pub/sub через MQTT. В настоящее время это работает, так как я могу успешно отправлять и передавать данные на mosquitto, запущенный локально в моей сети.
Локальный уровень сервера - Запуск MQTT клиента Paho с psycopg2 позволяет программе python на моей серверной машине читать входящие MQTT сообщения и затем вставлять сообщение в postgres. Это работает безупречно. сообщение в -> хранить в БД. Довольно просто.
Monitoring Console - Это будет веб-портал на django, который будет извлекать данные устройства, хранящиеся в БД, для отображения. Довольно стандартный материал. Пока не работает, но django - это не проблема с postgres.
Вот часть, которую я пытаюсь обхватить своим толстым медленным мозгом.
Каждое устройство будет либо уникальным для всей системы, либо в одной системе может быть несколько одинаковых устройств. Каждое устройство должно иметь uuid, относящийся к отдельному устройству. Каждое устройство может иметь несколько сценариев ввода/вывода данных. Устройство может считывать значение с датчика, а затем отправлять MQTT-сообщение с uuid устройства, uuid датчика и значением (значениями) с датчика. Некоторые датчики имеют несколько значений в зависимости от типа (например, температура, влажность, CO2 и т.д.).
Проблема заключается в том, что для определения устройства и его периферийных устройств внутри устройства мне необходимо зарегистрировать устройство в БД с уникальным идентификатором устройства, идентификатором датчика и т.д. Я планирую использовать JSON сообщение через MQTT, где устройство создает uuid'ы для устройства в целом, и uuid'ы для всех периферийных устройств, подключенных к устройству. Как только это будет сохранено в БД, я буду использовать информацию для создания приборной панели, где устройство будет автоматически отображаться в веб-интерфейсе.
Идея состоит в том, чтобы понять, как извлечь JSON и затем вставить пару ключ/значение в форму, которая может быть вставлена в БД, чтобы я мог 1. Создать устройство на приборной панели из каждого устройства, зарегистрированного автоматически на основе uuid устройства для каждого устройства 2. Соотнести периферийные устройства из каждого уникального устройства с представлением приборной панели для этого устройства 3. На основе доступных периферийных устройств контролировать или управлять
Пример рудиментарного JSON:
{
device: "GLify_Zone_Pro",
uuid: "xyz123"
},
{
sensor: "DHT11",
uuid: "some value"
},
{
relay: "GL4",
uuid: "uuid"
}
Тип устройства "GLify_Zone_Pro" будет вставлен в таблицу, специфичную для этого типа устройства. Если тип устройства "GLify_Zone_xx", то оно будет помещено в таблицу, специфичную для этого типа устройства, через рутину postgres для этого типа устройства с колонками, специфичными для связанных с этим типом устройства периферийных устройств. Для каждого из них форма JSON будет специфична для типа устройства с парами ключ/значение для каждого периферийного устройства. Довольно просто.
- Устройство загружается и посылает сообщение о том, что оно теперь подключено к системе, со своей формой данных, как указано выше.
- Сервер получает сообщение и регистрирует устройство в БД как тип устройства, указанный в пакете данных JSON.
- Если устройство уже находится в БД, то по понятным причинам произойдет перезагрузка и регистрация будет пропущена. Сервер посылает обратно сообщение устройству, в котором говорится, что оно либо уже зарегистрировано, либо зарегистрировано сейчас. Устройство начнет свою основную работу по отправке сообщений или ожиданию входящих сообщений для ответа. .
- Устройство видит сообщение и начинает посылать показания или принимать команды через MQTT. Команды, отправленные устройству, будут передаваться с уникальным uuid устройства, и если устройство увидит свой uuid в полученном пакете, оно выполнит все, что ему приказано. Включить свет, запустить вентилятор и т.д. В настоящее время я могу отправлять команды в виде не-JSON и управлять платой с локального сервера. .
Итак, вот вопрос:
Я могу создать JSON из dict и передать его по проводу через MQTT. После того, как сервер получит сообщение, нужно ли мне превратить его обратно в dict и посмотреть, какой это тип устройства, чтобы решить, в какую таблицу вставить устройство?
Как мне взять ключ/значение и вставить его в БД. {("device": "xxx_xxx_xxx", "uuid": "xxxxxx"), ("sensor": "xxxx", "uuid": "xxxxxx")} при условии, что требуется использовать dict? Или просто использовать необработанный набор JSON и вставить его в цикле for в таблицу DB?
После того, как я получил устройство в БД и успешно зарегистрировал его, остальное - семантика, поскольку теперь django отвечает за получение данных, а затем использует строки шаблона для создания представления для этого устройства и его периферийных устройств. Часть, на которой я спотыкаюсь, это как перейти от JSON к вставке в БД на основе сообщения. Я уже могу получить пакет JSON в свой .py через paho и вывести сообщение на терминал. Мне просто нужна помощь в понимании лучшей практики для надежной вставки JSON в БД.
Вот... Данные JSON для каждого типа устройства всегда будут одинаковыми. Лучшее, что я могу предположить, это оператор switch для каждой регистрации. case 1 - "GLify_Pro" insert into table xxxx etc... Или выполнить последовательные if/else. Будет около 10 типов устройств, так что любой из них будет довольно быстрым.
Я искренне надеюсь, что достаточно подробно описал постановку задачи и буду признателен за любую помощь и/или предложения по улучшению схемы. Конечной целью является IoT решение plug and play через MQTT с PG DB BE и Django FE.