Untitled
unknown
plain_text
2 years ago
3.8 kB
4
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...