File size: 3,446 Bytes
4640057
 
 
 
 
 
 
 
 
 
bcf4441
 
 
 
4bec42e
 
bcf4441
 
4640057
bcf4441
 
4640057
bcf4441
4640057
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bcf4441
4640057
 
 
bcf4441
4640057
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import streamlit as st
import paho.mqtt.client as mqtt
import json
from queue import Queue
from threading import Thread
import pandas as pd
import time

st.title("Real-Time Sensor Data Dashboard")

# Form for MQTT Configuration
with st.form("mqtt_form"):
    MQTT_HOST = st.text_input("Enter your MQTT host:", "b6bdb89571144b3d8e5ca4bbe666ddb5.s1.eu.hivemq.cloud")
    MQTT_PORT = st.number_input("Enter the port number:", min_value=1, max_value=65535, value=8883)
    MQTT_USERNAME = st.text_input("Enter your MQTT username:", "LuthiraMQ")
    MQTT_PASSWORD = st.text_input("Enter your MQTT password:", "jLVx8y9v83gmgERTr0AP", type="password")
    MQTT_TOPIC = st.text_input("Enter your MQTT topic:", "sensors/bme680/data")
    submit_button = st.form_submit_button(label="Submit")

if submit_button:
    st.success("MQTT Configuration Submitted")

message_queue = Queue()

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to MQTT broker")
        client.subscribe(MQTT_TOPIC)
    else:
        print(f"Failed to connect, return code {rc}")

def on_message(client, userdata, msg):
    try:
        message = msg.payload.decode()
        message_queue.put(message)
    except Exception as e:
        print(f"Error decoding message: {e}")

def start_mqtt_client():
    client = mqtt.Client()
    client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
    client.on_connect = on_connect
    client.on_message = on_message
    client.tls_set()

    try:
        client.connect(MQTT_HOST, MQTT_PORT, keepalive=60)
        client.loop_start()
    except Exception as e:
        print(f"Failed to connect to MQTT broker: {e}")

Thread(target=start_mqtt_client, daemon=True).start()

st.subheader("Live Sensor Data")
col1, col2 = st.columns(2)
with col1:
    st.markdown("### Temperature Over Time")
    temperature_chart = st.line_chart([])
with col2:
    st.markdown("### Humidity Over Time")
    humidity_chart = st.line_chart([])

pressure_gauge = st.empty()
gas_gauge = st.empty()

sensor_data = pd.DataFrame(columns=["timestamp", "temperature", "humidity", "pressure", "gas"])

while True:
    if not message_queue.empty():
        message = message_queue.get()
        try:
            parsed_message = json.loads(message)

            # Extract sensor values
            temperature = parsed_message.get("temperature")
            humidity = parsed_message.get("humidity")
            pressure = parsed_message.get("pressure")
            gas = parsed_message.get("gas")
            timestamp = time.time()

            # Add new data to the DataFrame
            new_row = pd.DataFrame([{
                "timestamp": timestamp,
                "temperature": temperature,
                "humidity": humidity,
                "pressure": pressure,
                "gas": gas,
            }])
            sensor_data = pd.concat([sensor_data, new_row], ignore_index=True)
            temperature_chart.line_chart(sensor_data[["temperature"]])
            humidity_chart.line_chart(sensor_data[["humidity"]])
            pressure_gauge.metric(
                label="Pressure (hPa)",
                value=f"{pressure:.2f}" if pressure else "N/A",
            )
            gas_gauge.metric(
                label="Gas (ohms)",
                value=f"{gas:.2f}" if gas else "N/A",
            )
        except json.JSONDecodeError:
            st.error("Failed to parse JSON payload")
    
    time.sleep(0.1)