# Smart Home Dashboard Development **Meta-Description:** Smart Home Dashboard mit React und WebSocket. Real-time Updates, Device Control und responsive Design für die Heimautomatisierung. **Keywords:** Smart Home Dashboard, React, WebSocket, Home Automation, Real-time UI, Device Control, IoT Dashboard --- ## Einführung Ein **Smart Home Dashboard** ist die zentrale Steuerung für alle vernetzten Geräte. Mit **React**, **WebSocket** und modernem UI-Design bauen wir ein responsives Dashboard für Echtzeit-Monitoring und Gerätesteuerung. --- ## Dashboard Architecture ``` ┌─────────────────────────────────────────────────────────────┐ │ SMART HOME DASHBOARD ARCHITECTURE │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Frontend: │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ React + Next.js │ │ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ │ │ Device │ │ Room │ │ Scenes │ │ │ │ │ │ Cards │ │ View │ │ Manager │ │ │ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ │ │ Energy │ │ Climate │ │ Security │ │ │ │ │ │ Monitor │ │ Control │ │ Panel │ │ │ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ WebSocket / REST │ │ │ │ │ Backend: ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ API Gateway / BFF │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────────────┬───────────┴───────────┬────────────┐ │ │ │ MQTT │ Home Assistant │ Database │ │ │ │ Broker │ API │ (States) │ │ │ └────────────┴───────────────────────┴────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## React Dashboard Components ```typescript // components/dashboard/DeviceCard.tsx 'use client'; import { useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Switch } from '@/components/ui/switch'; import { Slider } from '@/components/ui/slider'; import { cn } from '@/lib/utils'; interface DeviceCardProps { device: { id: string; name: string; type: 'light' | 'switch' | 'sensor' | 'thermostat'; state: 'on' | 'off'; brightness?: number; temperature?: number; humidity?: number; setpoint?: number; }; onStateChange: (id: string, state: Partial) => void; } export function DeviceCard({ device, onStateChange }: DeviceCardProps) { const [isLoading, setIsLoading] = useState(false); const handleToggle = async (checked: boolean) => { setIsLoading(true); await onStateChange(device.id, { state: checked ? 'on' : 'off' }); setIsLoading(false); }; const handleBrightness = async (value: number[]) => { await onStateChange(device.id, { brightness: value[0] }); }; const handleSetpoint = async (value: number[]) => { await onStateChange(device.id, { setpoint: value[0] }); }; return ( {device.name} {(device.type === 'light' || device.type === 'switch') && ( )} {/* Light with Brightness */} {device.type === 'light' && device.brightness !== undefined && (
Brightness {device.brightness}%
)} {/* Sensor Readings */} {device.type === 'sensor' && (
{device.temperature !== undefined && (
{device.temperature}°C
Temperature
)} {device.humidity !== undefined && (
{device.humidity}%
Humidity
)}
)} {/* Thermostat */} {device.type === 'thermostat' && (
{device.temperature}°C
Current
Setpoint {device.setpoint}°C
)}
); } ``` --- ## Room View ```typescript // components/dashboard/RoomView.tsx 'use client'; import { useState, useEffect } from 'react'; import { DeviceCard } from './DeviceCard'; import { useSmartHome } from '@/hooks/useSmartHome'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Home, Sofa, Bed, UtensilsCrossed, Bath, TreeDeciduous } from 'lucide-react'; const roomIcons: Record = { all: Home, living_room: Sofa, bedroom: Bed, kitchen: UtensilsCrossed, bathroom: Bath, outdoor: TreeDeciduous }; export function RoomView() { const { devices, rooms, updateDevice, isConnected } = useSmartHome(); const [activeRoom, setActiveRoom] = useState('all'); const filteredDevices = activeRoom === 'all' ? devices : devices.filter(d => d.room === activeRoom); return (
{/* Connection Status */}
{isConnected ? 'Connected' : 'Disconnected'}
{/* Room Tabs */} All {rooms.map(room => { const Icon = roomIcons[room.id] || Home; return ( {room.name} ); })}
{filteredDevices.map(device => ( ))}
{filteredDevices.length === 0 && (
No devices in this room
)}
); } ``` --- ## WebSocket Hook ```typescript // hooks/useSmartHome.ts 'use client'; import { useState, useEffect, useCallback, useRef } from 'react'; interface Device { id: string; name: string; type: 'light' | 'switch' | 'sensor' | 'thermostat'; room: string; state: 'on' | 'off'; brightness?: number; temperature?: number; humidity?: number; setpoint?: number; lastUpdated: string; } interface Room { id: string; name: string; } interface SmartHomeState { devices: Device[]; rooms: Room[]; isConnected: boolean; } export function useSmartHome() { const [state, setState] = useState({ devices: [], rooms: [], isConnected: false }); const wsRef = useRef(null); const reconnectTimeoutRef = useRef(); const connect = useCallback(() => { const wsUrl = process.env.NEXT_PUBLIC_WS_URL || 'ws://localhost:3001'; const ws = new WebSocket(wsUrl); ws.onopen = () => { console.log('WebSocket connected'); setState(prev => ({ ...prev, isConnected: true })); // Request initial state ws.send(JSON.stringify({ type: 'get_state' })); }; ws.onmessage = (event) => { const message = JSON.parse(event.data); switch (message.type) { case 'initial_state': setState(prev => ({ ...prev, devices: message.devices, rooms: message.rooms })); break; case 'device_update': setState(prev => ({ ...prev, devices: prev.devices.map(d => d.id === message.device.id ? { ...d, ...message.device, lastUpdated: new Date().toISOString() } : d ) })); break; case 'device_added': setState(prev => ({ ...prev, devices: [...prev.devices, message.device] })); break; case 'device_removed': setState(prev => ({ ...prev, devices: prev.devices.filter(d => d.id !== message.deviceId) })); break; } }; ws.onclose = () => { console.log('WebSocket disconnected'); setState(prev => ({ ...prev, isConnected: false })); // Reconnect after 5 seconds reconnectTimeoutRef.current = setTimeout(connect, 5000); }; ws.onerror = (error) => { console.error('WebSocket error:', error); }; wsRef.current = ws; }, []); useEffect(() => { connect(); return () => { if (reconnectTimeoutRef.current) { clearTimeout(reconnectTimeoutRef.current); } wsRef.current?.close(); }; }, [connect]); const updateDevice = useCallback(async ( deviceId: string, updates: Partial ) => { // Optimistic Update setState(prev => ({ ...prev, devices: prev.devices.map(d => d.id === deviceId ? { ...d, ...updates } : d ) })); // Send to server wsRef.current?.send(JSON.stringify({ type: 'update_device', deviceId, updates })); }, []); const executeScene = useCallback((sceneId: string) => { wsRef.current?.send(JSON.stringify({ type: 'execute_scene', sceneId })); }, []); return { ...state, updateDevice, executeScene }; } ``` --- ## Scene Manager ```typescript // components/dashboard/SceneManager.tsx 'use client'; import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Sun, Moon, Film, Coffee, PartyPopper, Power } from 'lucide-react'; interface Scene { id: string; name: string; icon: string; description: string; } const defaultScenes: Scene[] = [ { id: 'morning', name: 'Good Morning', icon: 'sun', description: 'Wake up routine' }, { id: 'movie', name: 'Movie Time', icon: 'film', description: 'Dim lights for movies' }, { id: 'goodnight', name: 'Good Night', icon: 'moon', description: 'All lights off' }, { id: 'party', name: 'Party Mode', icon: 'party', description: 'Colorful lights' }, { id: 'away', name: 'Away', icon: 'power', description: 'Energy saving mode' }, { id: 'coffee', name: 'Coffee Break', icon: 'coffee', description: 'Cozy atmosphere' } ]; const iconMap: Record = { sun: Sun, moon: Moon, film: Film, coffee: Coffee, party: PartyPopper, power: Power }; interface SceneManagerProps { onExecute: (sceneId: string) => void; } export function SceneManager({ onExecute }: SceneManagerProps) { const [activeScene, setActiveScene] = useState(null); const [isExecuting, setIsExecuting] = useState(false); const handleExecute = async (sceneId: string) => { setIsExecuting(true); setActiveScene(sceneId); await onExecute(sceneId); setTimeout(() => { setIsExecuting(false); }, 1000); }; return ( Scenes
{defaultScenes.map(scene => { const Icon = iconMap[scene.icon] || Sun; const isActive = activeScene === scene.id; return ( ); })}
); } ``` --- ## Climate Control ```typescript // components/dashboard/ClimateControl.tsx 'use client'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Thermometer, Droplets, Wind, Plus, Minus } from 'lucide-react'; interface ClimateControlProps { temperature: number; humidity: number; setpoint: number; mode: 'heat' | 'cool' | 'auto' | 'off'; onSetpointChange: (value: number) => void; onModeChange: (mode: string) => void; } export function ClimateControl({ temperature, humidity, setpoint, mode, onSetpointChange, onModeChange }: ClimateControlProps) { const adjustSetpoint = (delta: number) => { const newValue = Math.max(16, Math.min(28, setpoint + delta)); onSetpointChange(newValue); }; return ( Climate {/* Current Values */}
{temperature}°C
Current
{humidity}%
Humidity
{/* Setpoint Control */}
{setpoint}°C
Target
{/* Mode Selection */}
{['heat', 'cool', 'auto', 'off'].map(m => ( ))}
); } ``` --- ## Energy Monitor ```typescript // components/dashboard/EnergyMonitor.tsx 'use client'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Progress } from '@/components/ui/progress'; import { Zap, TrendingDown, TrendingUp } from 'lucide-react'; interface EnergyData { currentPower: number; // Watts todayUsage: number; // kWh monthlyUsage: number; // kWh monthlyBudget: number; // kWh trend: 'up' | 'down' | 'stable'; trendPercent: number; } interface EnergyMonitorProps { data: EnergyData; } export function EnergyMonitor({ data }: EnergyMonitorProps) { const budgetUsage = (data.monthlyUsage / data.monthlyBudget) * 100; const TrendIcon = data.trend === 'up' ? TrendingUp : TrendingDown; return ( Energy {/* Current Power */}
{data.currentPower.toLocaleString()} W
Current Power
{/* Usage Stats */}
{data.todayUsage.toFixed(1)} kWh
Today
{data.monthlyUsage.toFixed(0)} kWh
This Month
{/* Budget Progress */}
Monthly Budget {budgetUsage.toFixed(0)}%
{data.monthlyUsage.toFixed(0)} / {data.monthlyBudget} kWh
{/* Trend */}
{data.trend === 'up' ? '+' : '-'}{data.trendPercent}% vs last week
); } ``` --- ## Main Dashboard Layout ```typescript // app/dashboard/page.tsx 'use client'; import { RoomView } from '@/components/dashboard/RoomView'; import { SceneManager } from '@/components/dashboard/SceneManager'; import { ClimateControl } from '@/components/dashboard/ClimateControl'; import { EnergyMonitor } from '@/components/dashboard/EnergyMonitor'; import { useSmartHome } from '@/hooks/useSmartHome'; export default function DashboardPage() { const { devices, executeScene, updateDevice } = useSmartHome(); // Aggregate climate data const climateDevice = devices.find(d => d.type === 'thermostat'); // Mock energy data (in production: from API) const energyData = { currentPower: 1234, todayUsage: 12.5, monthlyUsage: 245, monthlyBudget: 300, trend: 'down' as const, trendPercent: 8 }; return (

Smart Home

Welcome back!

{/* Main Area - Devices */}
{/* Sidebar */}
{climateDevice && ( updateDevice(climateDevice.id, { setpoint: value }) } onModeChange={(mode) => console.log('Mode:', mode) } /> )}
); } ``` --- ## Fazit Smart Home Dashboard mit React bietet: 1. **Real-time Updates**: WebSocket für Live-Daten 2. **Intuitive UI**: Room-basierte Navigation 3. **Responsive Design**: Desktop & Mobile 4. **Szenen & Automation**: One-Click Control Das perfekte Interface für Smart Home Control. --- ## Bildprompts 1. "Smart home dashboard on tablet, dark mode with glowing device cards" 2. "Room view with connected devices, modern UI design" 3. "Energy monitoring graph with real-time power consumption" --- ## Quellen - [React Documentation](https://react.dev/) - [shadcn/ui Components](https://ui.shadcn.com/) - [WebSocket API](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) - [Home Assistant Dashboard](https://www.home-assistant.io/dashboards/)