# G2H LoRaWAN Heat Control Intelligente Heizungssteuerung für STM32WL basierte LoRaWAN-Geräte mit dualer Temperaturüberwachung. ## Funktionsübersicht ### Sensoren - **SHT4X**: Raumtemperatur und Luftfeuchtigkeit - **MLX90614**: IR-Bodentemperatur (optional) - **Relais**: Heizungssteuerung (Ein/Aus) ### Automatische Heizungsregelung Das System schaltet die Heizung automatisch basierend auf zwei Temperaturschwellwerten: 1. **Raumtemperatur** (Standard: 21°C) 2. **Bodentemperatur** (Standard: 22°C, nur wenn Sensor verfügbar) **Regel**: Heizung ist AN wenn **beide** Bedingungen erfüllt sind: - Raumtemperatur < Schwellwert UND - Bodentemperatur < Schwellwert (falls Sensor verfügbar) **Fallback**: Wenn MLX90614-Sensor nicht verfügbar → nur Raumtemperatur wird überwacht. ## LoRaWAN-Konfiguration ### Netzwerk - **Aktivierung**: ABP (Activation by Personalization) - **Region**: EU868 - **Port**: 2 - **Sendeintervall**: Standard 10 Minuten (konfigurierbar 1-255 min) ## Downlink-Befehle Alle Befehle als Base64 in ChirpStack eingeben: ### Kombinierte Konfiguration (3 Bytes) **Format**: `[heating_enable][room_temp][floor_temp]` | Beschreibung | Hex | Base64 | Funktion | |--------------|-----|--------|----------| | Heizung AN, 22°C Raum, 25°C Boden | `01 16 19` | `ARYa` | Automatik aktiviert mit neuen Schwellwerten | | Heizung AUS | `00 14 18` | `ABQa` | Heizung komplett deaktiviert | | Heizung AN, 20°C Raum, 24°C Boden | `01 14 18` | `ARQa` | Automatik mit niedrigeren Schwellwerten | ### Sendeintervall ändern (2 Bytes) **Format**: `'i'[minuten]` | Beschreibung | Hex | Base64 | Funktion | |--------------|-----|--------|----------| | 5 Minuten Intervall | `69 05` | `aQU=` | Häufigere Übertragung | | 15 Minuten Intervall | `69 0F` | `aQ8=` | Normale Übertragung | | 60 Minuten Intervall | `69 3C` | `aTw=` | Seltene Übertragung | **Hinweis**: - Temperaturwerte: 0-255°C möglich - Sendeintervall: 1-255 Minuten möglich - Heating Enable: 0=AUS (Relais bleibt aus), 1=AN (automatische Regelung) ## Datenformat (Uplink) Alle 10 Minuten wird ein 7-Byte Datenpaket gesendet: | Byte | Inhalt | Format | |------|--------|--------| | 0-1 | Raumtemperatur | int16 × 100 (z.B. 2134 = 21.34°C) | | 2-3 | Bodentemperatur | int16 × 100 | | 4-5 | Luftfeuchtigkeit | int16 × 100 (z.B. 4520 = 45.20%) | | 6 | Relais-Status | 0 = AUS, 1 = AN | ## Betriebsmodi ### 1. Automatik-Modus (Standard) - Heizung wird automatisch basierend auf Temperaturschwellwerten gesteuert - Beide Temperaturen werden überwacht (falls MLX-Sensor verfügbar) ### 2. Manueller Override - Aktiviert durch Heizung AUS Befehl (Byte 0 = 0) → Heizung permanent AUS - Deaktiviert durch Heizung AN Befehl (Byte 0 = 1) ### 3. Sensor-Fallback - Wenn MLX90614 nicht verfügbar → nur Raumtemperatur wird überwacht - Automatische Erkennung bei jedem Lesezyklus ## Status-Ausgabe Über serielle Konsole (115200 baud): ``` hum: 45.20% temp: 21.34 °C floor_temp: 19.87 °C relais: 1 (manual: 0, temp_th: 21°C, floor_th: 22°C) ``` - **relais**: 0=AUS, 1=AN - **manual**: 0=Automatik, 1=Manueller Override - **temp_th**: Raumtemperatur-Schwellwert - **floor_th**: Bodentemperatur-Schwellwert ## Fehlerbehandlung ### MLX90614-Sensor nicht verfügbar ``` [ERR] MLX90614 reading sensor values failed 5 times with error 251! ``` → System wechselt automatisch zu Raumtemperatur-only Modus ### LoRaWAN-Verbindungsfehler ``` [WRN] LoRaWAN busy (duty cycle), retrying in 1s... ``` → Automatische Wiederholung nach 1 Sekunde ## Beispiel-Szenarien ### Szenario 1: Normale Heizung - Raumtemp: 19°C (< 21°C) ✓ - Bodentemp: 20°C (< 22°C) ✓ - **Resultat**: Heizung AN ### Szenario 2: Überhitzungsschutz - Raumtemp: 23°C (≥ 21°C) ✗ - Bodentemp: 20°C (< 22°C) ✓ - **Resultat**: Heizung AUS ### Szenario 3: Bodentemperaturschutz - Raumtemp: 19°C (< 21°C) ✓ - Bodentemp: 25°C (≥ 22°C) ✗ - **Resultat**: Heizung AUS ### Szenario 4: Sensor-Ausfall - Raumtemp: 19°C (< 21°C) ✓ - MLX-Sensor: Nicht verfügbar - **Resultat**: Heizung AN (nur Raumtemp wird geprüft) ## Setup & Installation ### 1. Framework Setup (Windows) ```bash # Automatische PlatformIO-Konfiguration setup_framework.bat ``` ### 2. Neues Gerät einrichten #### 2.1 ChirpStack Konfiguration 1. **Application erstellen** (falls nicht vorhanden): - Name: `G2H-Heat-Control` - Description: `LoRaWAN Heizungssteuerung` 2. **Device Profile erstellen** (falls nicht vorhanden): - Name: `STM32WL-ABP` - Region: `EU868` - MAC Version: `1.0.4` - Regional Parameters Revision: `RP002-1.0.3` - Activation: `ABP` - Class: `A` - Supports OTAA: ❌ - ADR Algorithm: `Default` 3. **Device erstellen**: - **General Tab**: - Device name: `Heat-Controller-001` (eindeutig wählen) - Device description: `Heizungssteuerung Raum XY` - Device EUI: Neue eindeutige EUI generieren (z.B. `4633500400ABCD01`) - Device Profile: `STM32WL-ABP` - Skip FCnt check: ✅ (für Entwicklung/Test) - **Activation Tab** (ABP): - Device address: Neue Adresse generieren (z.B. `01234567`) - Network session key: 32 Zeichen Hex (z.B. `268FDA933F4CAEBF96A30FE76027A41E`) - Application session key: 32 Zeichen Hex (z.B. `408009CA1D9FE2B822F4684D76331300`) #### 2.2 Firmware-Konfiguration Öffne `src/lora/lorawan.h` und trage die ChirpStack-Werte ein: ```c /* ABP Configuration */ #define LORAWAN_DEV_ADDR {0x01, 0x23, 0x45, 0x67} // Device Address (Big Endian!) #define LORAWAN_NWKS_KEY {0x26, 0x8F, 0xDA, 0x93, \ // Network Session Key 0x3F, 0x4C, 0xAE, 0xBF, \ 0x96, 0xA3, 0x0F, 0xE7, \ 0x60, 0x27, 0xA4, 0x1E} #define LORAWAN_APPS_KEY {0x40, 0x80, 0x09, 0xCA, \ // Application Session Key 0x1D, 0x9F, 0xE2, 0xB8, \ 0x22, 0xF4, 0x68, 0x4D, \ 0x76, 0x33, 0x13, 0x00} ``` **Wichtig**: DevEUI wird in `src/lora/lorawan.c` gesetzt: ```c // Zeile ~113-120: Eindeutige DevEUI eintragen dev_eui[0] = 0x46; // Entspricht ChirpStack DevEUI dev_eui[1] = 0x33; // 4633500400ABCD01 wird zu: dev_eui[2] = 0x50; // {0x46, 0x33, 0x50, 0x04, dev_eui[3] = 0x04; // 0x00, 0xAB, 0xCD, 0x01} dev_eui[4] = 0x00; dev_eui[5] = 0xAB; dev_eui[6] = 0xCD; dev_eui[7] = 0x01; // Letztes Byte für Gerät eindeutig machen ``` #### 2.3 Format-Konvertierung ChirpStack → Code | ChirpStack | Code Format | Beispiel | |------------|-------------|----------| | Device Address: `01234567` | `{0x01, 0x23, 0x45, 0x67}` | Big Endian Bytes | | DevEUI: `4633500400ABCD01` | `dev_eui[0] = 0x46; ... dev_eui[7] = 0x01;` | Byte Array | | Session Keys: `268F...A41E` | `{0x26, 0x8F, ..., 0x1E}` | 16 Byte Array | ### 3. Build & Flash ```bash # Projekt kompilieren pio run # Firmware flashen (Device per USB verbinden) pio run -t upload ``` ### 4. Verification 1. **Serielle Konsole** öffnen (115200 baud): ``` === Device starting === DevEUI: 46:33:50:04:00:AB:CD:01 DevAddr: 0x67452301 ✓ Successfully activated LoRaWAN network via ABP ``` 2. **ChirpStack Monitoring**: - Device sollte nach ~30 Sekunden erste Uplinks senden - LoRaWAN Frames Tab: Uplinks alle 10 Minuten - Payload: 7 Bytes Sensordaten 3. **Test Downlink**: - In ChirpStack: Queue Downlink - Payload: `ARYa` (Base64) - Heizung AN, 22°C Raum, 25°C Boden - Port: 2 - Confirmed: ❌ ### 5. Troubleshooting #### Keine Uplinks in ChirpStack - [ ] DevEUI in Code korrekt gesetzt? - [ ] DevAddr Big Endian konvertiert? - [ ] Session Keys richtig formatiert? - [ ] Gateway in Reichweite und online? #### ABP Activation Failed - [ ] Device Profile auf ABP konfiguriert? - [ ] Skip FCnt Check aktiviert? - [ ] Korrekte Region (EU868)? #### Sensor Fehler ``` [ERR] MLX90614 reading sensor values failed 5 times ``` → Normal wenn kein Bodensensor angeschlossen, System läuft trotzdem