#!/bin/bash # Test script for device_simulator.py set -e # Exit on error echo "=== Device Simulator Test Suite ===" echo "" # 1. Stop all running services echo "1. Stoppe alle laufenden Services..." pkill -f "device_simulator" 2>/dev/null || true pkill -f "uvicorn apps" 2>/dev/null || true pkill -f "apps.abstraction" 2>/dev/null || true sleep 2 echo " ✓ Services gestoppt" echo "" # 2. Start services echo "2. Starte Services..." poetry run python -m apps.abstraction.main > /tmp/abstraction.log 2>&1 & ABSTRACTION_PID=$! echo " Abstraction Layer gestartet (PID: $ABSTRACTION_PID)" sleep 2 poetry run uvicorn apps.api.main:app --host 0.0.0.0 --port 8001 > /tmp/api.log 2>&1 & API_PID=$! echo " API Server gestartet (PID: $API_PID)" sleep 2 poetry run python tools/device_simulator.py > /tmp/simulator.log 2>&1 & SIM_PID=$! echo " Device Simulator gestartet (PID: $SIM_PID)" sleep 2 echo " ✓ Alle Services laufen" echo "" # 3. Test API reachability echo "3. Teste API Erreichbarkeit..." if timeout 3 curl -s http://localhost:8001/devices > /dev/null; then echo " ✓ API antwortet" else echo " ✗ API antwortet nicht!" echo " API Log:" tail -10 /tmp/api.log exit 1 fi echo "" # 4. Test Light Operations echo "4. Teste Lampen-Operationen..." # 4.1 Power On echo " 4.1 Lampe einschalten (test_lampe_1)..." RESPONSE=$(timeout 3 curl -s -X POST http://localhost:8001/devices/test_lampe_1/set \ -H "Content-Type: application/json" \ -d '{"type":"light","payload":{"power":"on"}}') echo " Response: $RESPONSE" sleep 1 # 4.2 Check state via MQTT echo " 4.2 Prüfe State via MQTT..." STATE=$(timeout 2 mosquitto_sub -h 172.16.2.16 -t 'vendor/test_lampe_1/state' -C 1) echo " State: $STATE" if echo "$STATE" | grep -q '"power": "on"'; then echo " ✓ Power ist ON" else echo " ✗ Power nicht ON!" fi # 4.3 Brightness echo " 4.3 Helligkeit setzen (75%)..." RESPONSE=$(timeout 3 curl -s -X POST http://localhost:8001/devices/test_lampe_1/set \ -H "Content-Type: application/json" \ -d '{"type":"light","payload":{"brightness":75}}') echo " Response: $RESPONSE" sleep 1 STATE=$(timeout 2 mosquitto_sub -h 172.16.2.16 -t 'vendor/test_lampe_1/state' -C 1) echo " State: $STATE" if echo "$STATE" | grep -q '"brightness": 75'; then echo " ✓ Brightness ist 75" else echo " ✗ Brightness nicht 75!" fi echo "" # 5. Test Thermostat Operations echo "5. Teste Thermostat-Operationen..." # 5.1 Set mode and target echo " 5.1 Setze Mode HEAT und Target 22.5°C..." RESPONSE=$(timeout 3 curl -s -X POST http://localhost:8001/devices/test_thermo_1/set \ -H "Content-Type: application/json" \ -d '{"type":"thermostat","payload":{"mode":"heat","target":22.5}}') echo " Response: $RESPONSE" sleep 1 STATE=$(timeout 2 mosquitto_sub -h 172.16.2.16 -t 'vendor/test_thermo_1/state' -C 1) echo " State: $STATE" if echo "$STATE" | grep -q '"mode": "heat"' && echo "$STATE" | grep -q '"target": 22.5'; then echo " ✓ Mode ist HEAT, Target ist 22.5" else echo " ✗ Mode oder Target nicht korrekt!" fi # 5.2 Wait for temperature drift echo " 5.2 Warte 6 Sekunden auf Temperature Drift..." sleep 6 STATE=$(timeout 2 mosquitto_sub -h 172.16.2.16 -t 'vendor/test_thermo_1/state' -C 1) echo " State: $STATE" CURRENT=$(echo "$STATE" | grep -o '"current": [0-9.]*' | grep -o '[0-9.]*$') echo " Current Temperature: ${CURRENT}°C" if [ -n "$CURRENT" ]; then echo " ✓ Temperature drift funktioniert" else echo " ✗ Temperature drift nicht sichtbar!" fi # 5.3 Set mode OFF echo " 5.3 Setze Mode OFF..." RESPONSE=$(timeout 3 curl -s -X POST http://localhost:8001/devices/test_thermo_1/set \ -H "Content-Type: application/json" \ -d '{"type":"thermostat","payload":{"mode":"off","target":22.5}}') echo " Response: $RESPONSE" sleep 1 STATE=$(timeout 2 mosquitto_sub -h 172.16.2.16 -t 'vendor/test_thermo_1/state' -C 1) if echo "$STATE" | grep -q '"mode": "off"'; then echo " ✓ Mode ist OFF" else echo " ✗ Mode nicht OFF!" fi echo "" # 6. Check simulator log echo "6. Simulator Log (letzte 20 Zeilen)..." tail -20 /tmp/simulator.log echo "" # 7. Summary echo "=== Test Summary ===" echo "✓ Alle Tests abgeschlossen" echo "" echo "Laufende Prozesse:" echo " Abstraction: PID $ABSTRACTION_PID" echo " API: PID $API_PID" echo " Simulator: PID $SIM_PID" echo "" echo "Logs verfügbar in:" echo " /tmp/abstraction.log" echo " /tmp/api.log" echo " /tmp/simulator.log"