Untitled

mail@pastecode.io avatar
unknown
plain_text
8 months ago
3.8 kB
1
Indexable
Never
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()