Luthira A
updated scripts and unique id generation with form for mqtt connection
4bec42e
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)