.Develop an application that send temperature and humidity sensor data to a cloud server through an HTTP-based REST API, stores the received data in a cloud database(Supabase / Firebase), and displays the sensor readings on a web-based dashboard.

IoT_Project/
│
├── sensor.py
├── dashboard.py
└── requirements.txt

pip install requests streamlit pandas

Supabase:
Open Supabase.
Login or create an account.
Click New Project.
Enter the project name: IoT_Project.
Set a database password.
Select a region and create the project.

Open SQL Editor.
Click New Query.
Copy and execute this SQL code:

CREATE TABLE sensor_data (
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    temperature FLOAT,
    humidity FLOAT,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

Copy the Project URL.
Copy the publishable API key.

sensor.py

import requests
import random
import time

# Supabase configuration
URL = "YOUR_SUPABASE_URL/rest/v1/sensor_data"
API_KEY = "YOUR_SUPABASE_PUBLISHABLE_KEY"

# HTTP headers
headers = {
    "apikey": API_KEY,
    "Authorization": "Bearer " + API_KEY,
    "Content-Type": "application/json",
    "Prefer": "return=minimal"
}

print("IoT Sensor Simulation Started")

while True:

    # Simulate sensor readings
    temperature = round(random.uniform(25, 35), 2)
    humidity = round(random.uniform(50, 80), 2)

    # Prepare sensor data
    data = {
        "temperature": temperature,
        "humidity": humidity
    }

    print("\nTemperature:", temperature, "°C")
    print("Humidity:", humidity, "%")

    try:
        # Send data using HTTP POST
        response = requests.post(
            URL,
            headers=headers,
            json=data,
            timeout=10
        )

        if response.status_code in [200, 201]:
            print("Data uploaded successfully!")
        else:
            print("Upload failed:", response.text)

    except requests.exceptions.RequestException as e:
        print("Connection error:", e)

    # Wait for 5 seconds
    time.sleep(5)


dashboard.py


import streamlit as st
import pandas as pd
import requests
import time

# Page title
st.title("IoT Monitoring Dashboard")

# Supabase configuration
URL = "YOUR_SUPABASE_URL/rest/v1/sensor_data"
API_KEY = "YOUR_SUPABASE_PUBLISHABLE_KEY"

headers = {
    "apikey": API_KEY,
    "Authorization": "Bearer " + API_KEY
}

# Refresh button
if st.button("Refresh Data"):
    st.rerun()

# Get data from Supabase
response = requests.get(
    URL,
    headers=headers,
    params={
        "select": "*",
        "order": "created_at.desc",
        "limit": "100"
    }
)

if response.status_code == 200:

    df = pd.DataFrame(response.json())

    if not df.empty:

        # Latest readings
        latest = df.iloc[0]

        st.subheader("Current Sensor Readings")

        col1, col2 = st.columns(2)

        col1.metric(
            "Temperature",
            str(latest["temperature"]) + " °C"
        )

        col2.metric(
            "Humidity",
            str(latest["humidity"]) + " %"
        )

        # Display records
        st.subheader("Sensor Data History")
        st.dataframe(df)

        # Display graphs
        st.subheader("Temperature Graph")
        st.line_chart(
            df.sort_values("created_at").set_index("created_at")[
                ["temperature"]
            ]
        )

        st.subheader("Humidity Graph")
        st.line_chart(
            df.sort_values("created_at").set_index("created_at")[
                ["humidity"]
            ]
        )

    else:
        st.warning("No sensor data available.")

else:
    st.error("Unable to fetch data from cloud.")

