Untitled
unknown
plain_text
2 years ago
3.8 kB
5
Indexable
import paho.mqtt.client as mqtt
import json
from datetime import datetime
import time
import matplotlib.pyplot as plt
# Параметры подключения к MQTT-брокеру
HOST = "192.168.2.23" # IP чемодана
PORT = 1883 # Стандартный порт подключения для Mosquitto
KEEPALIVE = 60 # Время ожидания доставки сообщения, если при отправке оно будет превышено, брокер будет считаться недоступным
# Словарь с топиками и собираемыми из них параметрами
SUB_TOPICS = {
'/devices/wb-m1w2_14/controls/External Sensor 1': 'temperature',
'/devices/wb-msw-v3_21/controls/Sound Level': 'sound',
'/devices/wb-msw-v3_21/controls/CO2': 'CO2',
'/devices/wb-msw-v3_21/controls/Air Quality (VOC)': 'air quality'
}
JSON_LIST = []
# Создание словарей для хранения данных JSON и XML
JSON_DICT = {}
for value in SUB_TOPICS.values():
JSON_DICT[value] = 0
# Функция получения данных из JSON-файла
def get_data_from_json(filename):
with open(filename, 'r') as file:
file_data = json.load(file)
return file_data
def create_plots(plots_data_lists):
# Создание графиков для отображения данных
fig, axs = plt.subplots(1, 2, figsize=(15, 6))
axs[0].plot(plots_data_lists['time'], plots_data_lists['air quality'])
axs[0].set_xlabel('время')
axs[0].set_ylabel('Качество воздуха')
axs[0].set_title('Качество воздуха')
axs[1].hist(plots_data_lists['sound'])
axs[1].set_xlabel('Время')
axs[1].set_ylabel('Уровень звука')
axs[1].set_title('Звук')
return fig, axs
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
for topic in SUB_TOPICS.keys():
client.subscribe(topic)
def on_message(client, userdata, msg):
payload = msg.payload.decode()
topic = msg.topic
param_name = SUB_TOPICS[topic]
JSON_DICT[param_name] = payload
JSON_DICT['time'] = str(datetime.now())
# Запись данных в JSON файл
JSON_LIST.append(JSON_DICT)
with open('data.json', 'w') as json_file:
json_string = json.dumps(JSON_LIST, indent=4)
json_file.write(json_string)
def main():
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(HOST, PORT, KEEPALIVE)
client.loop_start()
while True:
json_data = get_data_from_json('data.json')
plots_data_lists = {
'CO2': [],
'sound': [],
'date': [],
'temperature': [],
'air quality': []
}
for json_dict in json_data:
param_name = SUB_TOPICS.get(json_dict.get('topic'))
if param_name:
JSON_DICT[param_name] = json_dict.get('payload')
JSON_DICT['time'] = json_dict.get('time')
JSON_LIST.append(JSON_DICT)
plots_data_lists['CO2'].append(int(json_dict.get('CO2')))
plots_data_lists['time'].append(datetime.fromisoformat(json_dict.get('time')))
plots_data_lists['sound'].append(float(json_dict.get('sound')))
plots_data_lists['air quality'].append(float(json_dict.get('air quality')))
plots_data_lists['temperature'].append(float(json_dict.get('temperature')))
fig, axs = create_plots(plots_data_lists)
plt.show()
time.sleep(5)
if __name__ == "__main__":
main()
Editor is loading...