| Objekt | Typ | Größe | Produzent (ISR) | Konsument (Task) | Zweck |
|---|---|---|---|---|---|
| beepTaskHandle | Task Notification | 32-bit Zähler im TCB | timerIsr alle 10 msvTaskNotifyGiveFromISR |
beepTask Core 0, Prio 5ulTaskNotifyTake(pdTRUE, …) |
Takt für Beep-State-Machine. Kein Heap-Objekt nötig, schneller als Semaphore. pdTRUE = Zähler nach Take auf 0 → verhält sich wie Binary Semaphore. |
| rfEventQueue | Queue – RfEvent_t | 8 Einträge × 5 B | pinLevelChangeIsr bei jeder FlankexQueueSendFromISR |
rfDecodeTask Core 0, Prio 4xQueueReceive |
Überträgt {dtMicros, pinValue}. dtMicros wird in der ISR gemessen und by-value kopiert — Task decodiert den gespeicherten Wert, kein erneutes micros() nötig. Queue statt Notification, weil Nutzdaten übertragen werden. |
| Situation | Grund |
|---|---|
| Mehrere Tasks warten auf dasselbe Ereignis | Task Notification ist 1:1 — ein Handle, ein Empfänger |
| Mutex / gegenseitiger Ausschluss | xSemaphoreCreateMutex() mit Priority Inheritance; Notification hat keine Mutex-Semantik |
| Produzent soll Feedback erhalten wenn voll | Counting Semaphore meldet errQUEUE_FULL; Notification-Zähler läuft lautlos über |
| Signalgeber kennt Empfänger nicht | Semaphore ist ein eigenständiges Objekt das man übergeben kann; Notification braucht TaskHandle_t |
| Objekt | Protokoll | Key-Bytes | Anzahl Keys | Key-Index-Offset | Basisklasse |
|---|---|---|---|---|---|
| receiverSw | SmartWares Manchester OOK | 8 B | 22 | 0 | Receiver433 |
| receiverAiggend | 3-Byte-Key PWM | 3 B + 1 Richtungs-B | konfigurierbar | +30 | Receiver3ByteKey |
| receiverOval | 3-Byte-Key PWM | 3 B + 1 Richtungs-B | konfigurierbar | +40 | Receiver3ByteKey |
| receiverKerui | 3-Byte-Key PWM | 3 B + 1 Richtungs-B | konfigurierbar | +50 | Receiver3ByteKey |
| receiverThermo | Funk-Thermometer PWM | 4 B (36 bit, 4 bit ignoriert) | – | – | Receiver433 |
| Name | Sensor-Typ | Key-Nr (mit Offset) | Wait-Zeit-Quelle |
|---|---|---|---|
| fensterWz | Kerui | 2 + 50 = 52 | waitTimeDs (Temperatur) |
| fensterBadUnten | Aiggend | 3 + 30 = 33 | waitTimeDs |
| fensterKueche | Oval | 2 + 40 = 42 | waitTimeDs |
| fensterToniNeu | Oval | 1 + 40 = 41 | waitTimeDs |
| Name | Sensor-Typ | Key-Nr (mit Offset) | Wait-Zeit-Quelle |
|---|---|---|---|
| fensterBadOben | Aiggend | 1 + 30 = 31 | waitTimeDs |
| fensterFlo | Aiggend | 2 + 30 = 32 | waitTimeDs |
| fensterHanna | Oval | 5 + 40 = 45 | waitTimeDs |
| fensterFloBuero | Oval | 4 + 40 = 44 | waitTimeDs |
| Sonder-Objekte (immer instanziiert) | |||
|---|---|---|---|
| Name | Sensor-Typ | Key-Nr | Besonderheit |
| fensterGefrier | SmartWares | 10 | Feste Wait-Zeit: 30 s (hardcodiert in ShallPiep()) |
| Modus | onTime | offTime | requestCount | Reihenfolge |
|---|---|---|---|---|
| piepFast | 20 ms | 80 ms | 2 Mal | 1. |
| piepSlow | 500 ms | 100 ms | 1 Mal | 2. |
| piepPauseLong | 0 ms | 1000 ms | 120 × = 60 s | 3. (Standardpause) |
| piepPauseShort | 0 ms | 1000 ms | 20 × = 10 s | 3. (nach 6 min Dauerbeeep) |
| Außentemperatur | Wartezeit | Erklärung |
|---|---|---|
| < −5 °C | 5 min | Kurz – kalte Luft, schnelles Lüften |
| −5 … 19,5 °C | 5 … 30 min (linear) | Lineare Interpolation: 5 + (T+5)×25/24,5 |
| 19,5 … 25 °C | ~2 Wochen | Kein Alarm – Sommer, Lüften sinnvoll |
| > 25 °C | 30 min | Heiß – kurze Alarmverzögerung |
| kein Sensor-Wert | 10 min | Default bis erste Thermo-Meldung |
| GPIO | Richtung | Funktion |
|---|---|---|
| 26 | INPUT_PULLUP | DIN_FUNK – 433-MHz-Datensignal → pinLevelChangeIsr |
| 12 | OUTPUT HIGH | DOUT_FUNK_VCC – Versorgung Empfängermodul |
| 32 | OUTPUT LOW | DOUT_FUNK_GND – GND Empfängermodul |
| 18 | OUTPUT | DOUT_PIEP_VCC – Buzzer-Versorgung (geschaltet via toneRequest) |
| 33 | LEDC PWM | DOUT_PIEP_PWM – Buzzer-PWM 2 kHz, Ch 12, duty 127 |
| 16 | OUTPUT HIGH | DOUT_TEST_TIMER – Debug-Pin |
| GPIO | Funktion | Interface |
|---|---|---|
| 14 | TFT_PIN_CLK (SCK) | SPI – Adafruit ST7735 (VERSION_BIG_DISPLAY) |
| 13 | TFT_PIN_MOSI (SDA) | |
| 22 | TFT_PIN_RST (RES) | |
| 21 | TFT_PIN_DC (RS) | |
| 15 | TFT_PIN_CS |
| Topic | Retain | Wann | Payload (Beispiel) |
|---|---|---|---|
| fenster/system/EG | nein | Connect, Reset | {"e":"hello","client":"FensterpiepserEG_v2.0.8"} |
| fenster/status/EG | ja | Fenster bewegt / Beep gestartet | {"t":1700000000,"e":"move","n":4,"f":["Wohnz",…],"o":[0,1,…],"b":[0,0,…]} |
| fenster/temprh/EG | ja | Neues Thermo-Paket (~50 s) | {"T":7,"rh":65,"t":1700000000,"raw":3422534} |
| fenster/rssi/EG | nein | Alle 600 s | {"rssi":-62} |
| Variable | Typ | volatile | Schreiber | Leser | Anmerkung |
|---|---|---|---|---|---|
| tDecis | uint32_t | ✓ | timerIsr (Core 1) | loopTask, beepTask, Fenster::ShallPiep | Monoton steigend, 32-bit-Reads atomar auf LX6 |
| bRequestShortBeep | bool | ✓ | loopTask (Core 1) | beepTask (Core 0) | Cross-Core; single-byte write atomar |
| loopCountSincePause | uint32_t | ✓ | loopTask (Core 1) | pinLevelChangeIsr (Core 1) | RF-Debounce nach Key-Empfang |
| PiepPattern::startRequest PiepPattern::stopRequest | uint8_t | ✓ | loopTask via Start()/Stop() | beepTask via TaskCyclic() | Cross-Core; Flags, nicht Zähler |
| toneRequest | uint8_t | – | beepTask (exklusiv) | beepTask | Kein Cross-Core-Zugriff mehr nach Refactoring |
| Event | Intervall | Aufruf |
|---|---|---|
| XcpEvent(0) | 10 ms | xcpLoop() in loopTask (millis-basiert) |
| XcpEvent(1) | 100 ms | xcpLoop() |
| XcpEvent(2) | 500 ms | xcpLoop() |
| XcpEvent(3) | 1000 ms | xcpLoop() |