File size: 4,671 Bytes
b8fba85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
104
105
106
107
108
109
import gradio as gr
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import plotly.graph_objects as go
from plotly.subplots import make_subplots

def visualize_sensor_data(file):
    """Visualize IoT sensor data from uploaded CSV file"""
    if file is None:
        return generate_sample_chart(), "πŸ“Š Showing sample IoT sensor data"
    
    try:
        df = pd.read_csv(file.name)
        
        # Create subplots
        fig = make_subplots(
            rows=2, cols=2,
            subplot_titles=('Temperature (Β°C)', 'Humidity (%)', 'Vibration (Hz)', 'Power (W)')
        )
        
        # Add traces
        if 'timestamp' in df.columns or 'time' in df.columns:
            x_col = 'timestamp' if 'timestamp' in df.columns else 'time'
        else:
            x_col = df.columns[0]
            
        if 'temperature' in df.columns:
            fig.add_trace(go.Scatter(x=df[x_col], y=df['temperature'], name='Temperature', line=dict(color='#ff6b6b')), row=1, col=1)
        if 'humidity' in df.columns:
            fig.add_trace(go.Scatter(x=df[x_col], y=df['humidity'], name='Humidity', line=dict(color='#4ecdc4')), row=1, col=2)
        if 'vibration' in df.columns:
            fig.add_trace(go.Scatter(x=df[x_col], y=df['vibration'], name='Vibration', line=dict(color='#95e1d3')), row=2, col=1)
        if 'power' in df.columns:
            fig.add_trace(go.Scatter(x=df[x_col], y=df['power'], name='Power', line=dict(color='#f38181')), row=2, col=2)
        
        fig.update_layout(height=600, showlegend=False, title_text="IoT Sensor Data Visualization")
        
        summary = f"βœ… Data loaded: {len(df)} records | Columns: {', '.join(df.columns.tolist())}"
        return fig, summary
        
    except Exception as e:
        return generate_sample_chart(), f"⚠️ Error: {str(e)}. Showing sample data instead."

def generate_sample_chart():
    """Generate sample IoT sensor data for demonstration"""
    timestamps = pd.date_range(start=datetime.now() - timedelta(hours=24), periods=100, freq='15min')
    
    df = pd.DataFrame({
        'timestamp': timestamps,
        'temperature': 20 + np.random.randn(100) * 5,
        'humidity': 60 + np.random.randn(100) * 10,
        'vibration': 50 + np.random.randn(100) * 15,
        'power': 100 + np.random.randn(100) * 20
    })
    
    fig = make_subplots(
        rows=2, cols=2,
        subplot_titles=('Temperature (Β°C)', 'Humidity (%)', 'Vibration (Hz)', 'Power (W)')
    )
    
    fig.add_trace(go.Scatter(x=df['timestamp'], y=df['temperature'], name='Temperature', line=dict(color='#ff6b6b')), row=1, col=1)
    fig.add_trace(go.Scatter(x=df['timestamp'], y=df['humidity'], name='Humidity', line=dict(color='#4ecdc4')), row=1, col=2)
    fig.add_trace(go.Scatter(x=df['timestamp'], y=df['vibration'], name='Vibration', line=dict(color='#95e1d3')), row=2, col=1)
    fig.add_trace(go.Scatter(x=df['timestamp'], y=df['power'], name='Power', line=dict(color='#f38181')), row=2, col=2)
    
    fig.update_layout(height=600, showlegend=False, title_text="Sample IoT Sensor Data (24 Hours)")
    
    return fig

# Create Gradio interface
with gr.Blocks(title="IoT Sensor Visualizer - Anktechsol", theme=gr.themes.Soft()) as demo:
    gr.Markdown("""
    # 🌐 IoT Sensor Visualizer for Edge AI Projects
    ### by **Anktechsol** - AI + IoT Experts
    
    Upload your IoT sensor CSV file to visualize temperature, humidity, vibration, and power data.
    **No file?** We'll show you sample data!
    
    **Expected CSV format:** `timestamp, temperature, humidity, vibration, power`
    """)
    
    with gr.Row():
        with gr.Column(scale=1):
            file_input = gr.File(label="πŸ“ Upload CSV File", file_types=[".csv"])
            visualize_btn = gr.Button("πŸ“Š Visualize Data", variant="primary", size="lg")
            gr.Markdown("""---
            ### πŸ”— Links
            - [Anktechsol Website](https://anktechsol.com)
            - [More AIoT Tools](https://huggingface.co/anktechsol)
            """)
        
        with gr.Column(scale=3):
            plot_output = gr.Plot(label="Sensor Data Visualization")
            status_output = gr.Textbox(label="Status", interactive=False)
    
    # Event handler
    visualize_btn.click(
        fn=visualize_sensor_data,
        inputs=[file_input],
        outputs=[plot_output, status_output]
    )
    
    # Auto-load sample data on startup
    demo.load(fn=lambda: (generate_sample_chart(), "πŸ“Š Sample data loaded. Upload your CSV to visualize your IoT data!"), 
              outputs=[plot_output, status_output])

if __name__ == "__main__":
    demo.launch()