Login
Register
Forum
Kontakt
Bitmania
2013-10-30 06:44
by bitman
RFM12 Mehrzweck Funknetz
RFM12 Network

Heute stelle ich nun mal ein Projekt vor an dem ich in den letzten Wochen gearbeitet habe.
Es ist zwar noch nicht ganz fertig, stellt aber schon einen schönen Zwischenstand dar.

Es handelt sich um ein Mehrzweck-Funksystem auf Basis des RFM12-Funkmoduls.


Die Ausgangssituation
Ich habe bereits verschiedene Funksysteme im Einsatz, die aber alle nicht recht zusammenpassen.
Dabei gibt es einige Probleme die mir nicht gefallen, die ich damit aber nicht abstellen kann:

- Funk-Wetterstation mit ihren Innen- und Aussensensoren (868MHz) mit einem eigenen Empfänger.
CON: Die Anbindung ist ineffizient, ich weis nie warum ich einen Sensor nicht empfange (Akku leer oder schlechte Funkverbindung)
- Stromzählersensor mit einem 868MHz CUL als Empfänger, Auswertung per FHEM
CON: einzig für diesen Sensor habe ich hier ein FHEM am start, das hätte ich gerne weg.
- ein paar Funksteckdosen mit einem 434MHz CUL als Empfänger, Steuerung per FHEM
Con: In jedem Baumarkt gibts es die Fernsteuerungen um bei mir Funksteckdosen ein-ausschalten


Es muß also etwas neues her:

Mein neues Konzept soll es ermöglichen selber Funk-Nodes zu bauen, damit man nicht auf fertiges angewiesen ist.
Eine Funk-Node kann z.B. ein Temperatur-Sensor, ein Schalter, Funksteckdose oder was auch immer sein.
Die Nodes sollen sich untereinander verbinden können.
Eine oder mehrere beliebige Nodes sollen als Zugang zum Netz per seriellem Interface genutzt werden können.
Das Protokoll soll flexibel und für Erweiterungen offen sein.
Auch Kombinationen sollen möglich sein (z.B. temperaturmessender Fenster-Offen-Sensor)




Hier sieht man den Prototypen den ich mir zum Entwickeln gebaut habe



Am Prototypen habe ich zusätzlich noch je Seite eine Sockel-Reihe am ATMega328.



Daran konnte ich mit dem Logic-Analyzer Signale abgreifen um z.B. den DHT22 zu implementieren:







Eigenschaften:
+ Bidirektional
+ Verschlüsselte Datenübertragung (XTEA 128 Bit Verschlüsselung)
+ Gateway-Funktion (Relaisstation, für abgelegene Nodes)
+ Sleep-Mode für Batteriebetrieb
+ Batteriestand-Überwachung
+ Jeder Node kann eine eigene ID zugewiesen werden (bis zu 65534 IDs im Netz)
+ Konfiguration der Node per Funk (keine DIP-Schalter in der Node hinter der Schrankwand)


Anwendungsbeispiele:
+ Wetterstation Sensor Temperatur (DHT22 AM2302 RHT03)
+ Wetterstation Sensor Luftfeuchte (DHT22 AM2302 RHT03)
+ Fensterkontakt / Türkontakt: Externer Schalter dessen Betätigung (Öffnen und Schließen) jeweils signalisiert wird
+ 3 weitere I-O-Ports die aus der Ferne als Ausgang oder Eingang, An/Aus geschaltet werden bzw. deren Zustand ausgelesen werden kann.
~ Funksteckdose
- Wetterstation Sensor Luftdruck (GY-65 BMP085)
- Bewegungsmelder
- geplant: Rückbestätigung von Funkpaketen
- geplant: Stromzähler-Sensor
- geplant: Wasserzähler-Sensor
- geplant: Gaszähler-Sensor
- geplant: Wassermelder (z.B. im Keller bei Überschwemmungen)

+ implementiert
~ halbwegs
- noch nicht implementiert


Jede Node kann man mit einem USB-Serial-Adapter an einen Rechner anschließen und dann z.B. mit einem Terminalprogramm mit dem Funknetz interagieren.
Also z.B. Commands in das Netz an andere Nodes senden oder Informationen aus dem Netz herauslesen.
Die Stromversorgung läuft entweder über USB-Verbindung, ein Netzteil oder Batterie.
In meinem Anwendungsfall werde ich eine Node an einen Server anschließen der z.B. Wetterdaten auswertet.



Hardware:





Layout in 600dpi



Eagle-Layoutfiles: file
Die Firmware Stand heute: file

Entgegen dem Schaltplan ist ein ATMega328 im Einsatz (die 8K Flash des ATMega88 reichten schon bald nicht mehr)








Es gibt zwei Hauptbetriebsarten einer Node:

1) Master-Node:
Anzeige eintreffender Commands & Meldungen anderer Nodes im Netz

2) Satellit-Node:
Anzeige eintreffender Commands & Meldungen nur an diese Node selber addressiert
Sleep-Mode



Eine Node kann (sofern sie nicht im Sleep-Mode ist) von einer anderen Node als Relaisstation verwendet werden.
Zum Beispiel wenn das Signal einer Node den eigentlichen Empfänger aufgrund ungünstiger Lage oder Entfernung nicht direkt erreichen kann.
Ein Gateway kann z.B. ein Sattelit sein, oder eine Master-Node (darf sich aber nicht im Sleep Mode befinden)


Netz-Beispiel:



Node-A ist in diesem Beispiel eine Master Node
Node-B ein Sensor (und Gateway für die abgelegene Node-D)
Node-C ein Sensor
Node-D ein weiter entfernter Sensor, erreicht Node-A nur über Gateway-Node-B (und umgekehrt)


Jede Node kann eine 16 bit Node-ID zugewiesen werden, damit sind 65536 IDs im Netz möglich
Nach dem Zusammenbauen und Flashen reagiert eine Node auf die ID ffff.


0x0000	das gesamte Netz, nicht einer Node zu zuweisen
::
0xffff default ID nach dem Firmware flashen



Serielles Interface
Man kann einen PC mit einem Terminalprogramm über einen USB-Seriell-Wandler mit einer Node verbinden, dort Meldungen angezeigt bekommen und auch Commands absetzen.
Hier sieht man Meldungen

:::
1111: S-- 01 0007 000a 0000 999 999 5120 07 00 00 o 1.20 20131027-1824
2222: INT1 PD3 close
2222: S-- 01 0009 0003 0000 544 216 5143 07 00 00 c 1.20 20131027-1828
1111: S-- 01 0008 000c 0000 999 999 5120 07 00 00 o 1.20 20131027-1824
2222: INT1 PD3 close
:::



Interpretation der Statusmeldung:
2222: S-- 01 0009 0003 0000 544 216 5143 07 00 00 c 1.20 20131027-1828

2222             Node ID
S-- Mode im Satelit-Modus
0009 TX Paket-Sequence-Nr
0003 RX Paket-Sequence-Nr
0000 Checksum Error Counter
544 54.4% Luftfeuchte
216 21.6°C Temperatur
5143 5.143 V Betriebsspannung (bzw Batteriespannung)
07 DDRC
00 PINC
00 PORTC
c closed
1.20 Firmware Version
20131027-1828 Build Timestamp




Gateway-Funktion:
Jede Node kann in einem gesendeten Paket angeben ob das Paket von einer anderen Node als Gateway wiederholt werden soll (Relaisstation)
Dazu kann man in jeder Node eine Gateway-Liste definieren.

Beispiel:

Die Node 1000 soll alle Pakete an Ziel Node 2000 mit der Info Gateway 3000 senden.
Wenn eine Node mit ID 3000 diese Pakete empfängt, wird sie diese erneut versenden.
set node 1000 gwlist 2000 3000

Eine Erklärung der Commands findet sich weiter unten.


Sleep-Funktion:
Damit man Nodes mit Batterien betreiben kann habe ich eine Sleep-Funktion eingebaut.
Das heisst man kann eine Node in den Schlaf versetzen, woraufhin sie nur noch alle 20 Sekunden aufwacht, einen Status an ID 0000 (das Netz) versendet und sich wieder schlafen legt (Die Zeitspanne wird noch definierbar gemacht, im Betrieb werde ich das auf mindestens 60sec ändern, zur Entwicklung verwende ich noch 20sec, so ist es auch im Firmwarebeispiel hier). Im 868MHz Band gild es die Belegungsvorschriften zu beachten!

Wenn man nun aber eine Node erreichen möchte muß man sie zuvor wieder aufwecken.
Dazu kann man einer Master-Node sagen welche Sattelit-Node sich nach Versenden der Statusmeldung nicht wieder schlafen legen soll:

Beispiel: wenn sich Node 2000 meldet, soll sie wach bleiben
set awake 2000




MML-Commands:

Über eine serielle Verbindung können Commands an eine direkt angeschlossene Node geschickt werden.
Die Node prüft weder die Syntax noch gibt sie Fehlermeldungen bei falscher Syntax zurück.
Den Platz im Microcontroller für diese Checks habe ich mir gespart.

Die Commands unterliegen der Struktur: Verb Object Component Attribute

Verb	[Object]	Component	Attribute
set id ____
set node ____ id ____
set node ____ gwlist ____ ____

Das 'Object' ist optional, wenn weggelassen dann wirkt sich das Command auf die Node selber aus an die man per Serial-Interface angeschlossen ist.
NodeIDs (____) sind 4stellig hexadezimal anzugeben.



Bisher Implementierte Commands:

Lokal ('diese Node' bedeutet: die per USB angeschlossene Node):
set id ____             # setzt für diese Node die Node ID ____
set gwlist ____ ____ # setzt für diese Node für Ziel ____ den Gateway ____
set master # wechselt für diese Node den Modus 'Master' oder 'Satellit'
set sleep # setzt für diese Node den Modus Sleep
set debug # wechselt für diese Node den Modus 'Debug' oder 'nicht Debug'
set awake ____ # wenn sich Node ____ meldet soll sie aus dem Modeus Sleep aufgeweckt werden
get gwlist # zeigt die Gateway-Liste dieser Dode an
get awake # zeigt die Liste der aufzuweckenden Nodes (wenn sie sich mal melden)
del awake ____ # löscht eine Node aus der Liste der aufzuweckenden Nodes
del gwlist ____ # löscht den Gateway für Ziel ____



Konfiguration von entfernten Nodes per Funk:
set node ____ id ____            # setzt die Node ID von ____ auf ____
set node ____ gwlist ____ ____ # setzt auf Node ____ für Ziel ____ den Gateway ____
set node ____ sleep # setzt für Node ____ den Modus 'Sleep'

set node ____ pc_ in # setzt auf der Node ____ PortC _ als Eingang
set node ____ pc_ out # setzt auf der Node ____ PortC _ als Ausgang
set node ____ pc_ off # schaltet auf der Node ____ PortC _ aus (wenn als Ausgang definiert)
set node ____ pc_ on # schaltet auf der Node ____ PortC _ ein (wenn als Ausgang definiert)


get node ____ gwlist # Bringt Node ____ dazu die Gateway-Liste zu schicken und zeigt sie dann an
del node ____ gwlist ____ # löscht auf Node ____ den Gateway für Ziel ____

get node ____ stat # Bringt Node ____ dazu eine Statusmeldung von sich zu geben




Funk-Protokoll:

Die Daten werden mit einem 128bit Schlüssel XTEA chiffriert.
Ein entschlüsseltes Paket sieht zum Beispiel so aus:




Wie geht's weiter...

Aktuell handelt es sich hier noch um einen Zwischenstand den ich aber trotzdem schonmal kundtun wollte.
Als nächstes stehen der Luftdrucksensor an und auch ein Bewegungsmelder den ich hier schon liegen habe.
Der Code muß auch noch weiter aufgeräumt und optimiert werden.






2 Comments

fristle 2016-08-18 09:26 ^ 363

Posts: 1
Registered: 2016-08-18
Hi,

ich verfolge das RFM12 Network schon eine Weile und finde die Umsetzung richtig gut.
Du schreibst, dass Du von FHEM weg gegangen bist.

Welche Lösung betreibst Du aktuell zur Auswertung der Nodes?
Ist eine Implementation der Nodes in FHEM dennoch möglich?

Freundliche Grüße
fristle

bitman 2016-08-19 18:08 ^ 364

Moderator
Posts: 110
Pages: 99
Registered: 2010-07-09
Hi fristle,

ich hab da ein eigenes Python Script geschrieben, was aber aber ziemlich auf meine Bedürfnisse zugeschnitten ist.
Die Integration der RFM12 Nodes in FHEM müssten die FHEM-Macher voran treiben.
hast du mal RFM12 Nodes von hier nachgebaut?
Interessiert mich, denn bisher hab ich nicht viel Feedback bekommen.
In letzter Zeit habe ich auch nichts neues hinzugefügt.
Wenn du Ideen hast, für neue Features oder so dann immer ran smiley

bitman