Die im EnergyCounter erfassten Messwerte werden über ein RFM12B-Funkprotokoll auf 868MHz an die BaseStation übertragen. Die BaseStation dient als Gateway und reicht die Messwerte per LAN/WLAN an OpenHAB weiter. Der EnergyCounter kann unterschiedlich konfiguriert werden:
- Funktion1: 12x S0-Zählimpulse
- Funktion2: Solarthermische Messwerte
Wurden im Sketch beide Messfunktionen ausgewählt, erfolgt die Übertragung der beiden Funktionen in getrennten Funkpaketen. Dies ist darin begründet, dass ein Funkpaket maximal 66 Byte Nutzdaten transportieren kann!
Paketrahmen Funk
Zum Einsatz kommt die Arduino-Library von JeeLabs, welche für die RFM12B-Funkmodulegeschrieben wurde. Die Struktur der Funkpakete muss exakt definiert sein, damit die Basisstation aus der per Funk übertragenen Byte-Folge die einzelnen Messwerte identifizieren und in einen URL-Aufruf für den OpenHAB-Server transferieren kann.
0xAA | 0xAA | 0xAA | 0x2D | Group | HDR | LEN | DATA | CRC | CRC |
Die Bedeutung der Paketbestandteile:
0xAA | Preamble [3 Byte] |
0xAA | |
0xAA | |
0x2D | Sync [1 Byte] |
Group | NetGroup [1 Byte] |
HDR | Header [1 Byte] |
LEN | Länge Nutzlast [1 Byte] |
DATA | Nutzlast [0..66 Bytes] |
CRC | CRC [2 Bytes] |
CRC |
Header
Der Header eines Pakets besteht aus einem Byte:
CTL | DST | ACK | Node ID |
dies bedeutet
CTL | Control Bit: Steuert, ob ein Paket als normales Daten- oder Acknowledge-Paket interpretiert wird |
DST | Destination Bit: 0=Broadcast, 1=Daten an einen definierten Knoten senden |
ACK | Acknowledge Bit: 0=Kein Ack., 1=Ack. |
Node ID | 5 Bit: ID = 0...31 |
Zusammenfassend werden folgende Kombinationen verwendet:
- normales Paket, kein ACK angefordert: CTL = 0, ACK = 0
- normales Paket, ACK anfordern: CTL = 0, ACK = 1
- ACK Antwort Paket: CTL = 1, ACK = 0
- Die CTL = 1, ACK = 1 Kombination wird nicht genutzt
Nutzlast
Jedes Datenpaket kann eine maximale Nutzlast von 66 Byte befördern. In diesen 66 Byte sind alle Messdaten, Status- und Fehlermeldungen unterzubringen. Die Kopplung zwischen Sensor und Basistation ist bidirektional und beinhaltet unterschiedliche Telegramme.
S0-Zählimpulse
Wenn der SerialMonitor der IDE geöffnet ist, werden die Daten im Klartext angezeigt. Die "Variable" wird mit ausgegeben, um die Identifizierung zu vereinfachen.
Variable | Typ | Werte | Bedeutung |
P | Byte | 1 | Package Type: 1=S0-Werte |
S | Byte | 0...255 | Paket-Sequenz: fotlaufendes Hochzählen des Pakets |
C0 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 0 |
C1 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 1 |
C2 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 2 |
C3 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 3 |
C4 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 4 |
C5 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 5 |
C6 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 6 |
C7 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 7 |
C8 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 8 |
C9 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 9 |
C10 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 10 |
C11 | Unsigned Integer | 0...65535 | S0-Impulse innerhalb Sample Interval Channel 11 |
SI | Unsigned Integer | 0...65535 | Sample Interval in Sekunden. Default=60 |
Die Übertragung per Funkpaket erfolgt binär, wobei der Typ "Byte" ein Byte belegt und der Typ "Integer" zwei Byte. Dadurch wird das Funkpaket kurz gehalten.
Solarthermie-Werte
Wenn der SerialMonitor der Arduino-IDE geöffnet ist, werden die Daten im Klartext angezeigt. Die "Variable" wird mit ausgegeben, um die Identifizierung zu vereinfachen.
Variable | Typ | Werte | Bedeutung |
P | Byte | 2 | Package Type: 2=Solarthermie-Werte |
S | Byte | 0...255 | Paket-Sequenz: fotlaufendes Hochzählen des Pakets |
T0 | Integer | -32767...32767 | Temperatur in 0,01°C: Vorlauf Solar |
T1 | Integer | -32767...32767 | Temperatur in 0,01°C: Rücklauf Solar |
T2 | Integer | -32767...32767 | Temperatur in 0,01°C: Schichtspeicher oben |
T3 | Integer | -32767...32767 | Temperatur in 0,01°C: Schichtspeicher mitte |
T4 | Integer | -32767...32767 | Temperatur in 0,01°C: Schichtspeicher unten |
IMP | Unsigned Integer | 0...65535 | Solarpumpen-Impulse |
FR | Unsigned Integer | 0...65535 | Solar Flow in 0,1 L |
HP | Unsigned Integer | 0...65535 | Heat Power in 0,1 W (Leistung) |
HQ | Unsigned Integer | 0...65535 | Heat Quantity in 0,1 Wh (Energie) |
PU | Unsigned Integer | 0...65535 | Laufzeit in Sekunden: Solarpumpe |
BU | Unsigned Integer | 0...65535 | Laufzeit in Sekunden: Gasbrenner |
WW | Unsigned Integer | 0...65535 | Laufzeit in Sekunden: Warmwasser-Anforderung |
HTG | Unsigned Integer | 0...65535 | Laufzeit in Sekunden: Heizungs-Anforderung |
Die Übertragung per Funkpaket erfolgt binär, wobei der Typ "Byte" ein Byte belegt und der Typ "Integer" zwei Byte. Dadurch wird das Funkpaket kurz gehalten.
![]() |
Änderungen am Funkprotokoll des EnergyCounter führen zwangsläufig zu Änderungen am Sketch der BaseStation und sind schwierig zu debuggen. |