Kann schon mal passieren das ich zu technisch werde Am Ende der Nachricht ist dies auch diesmal der Fall.
Diesen "Code" auszulesen war mein erster Ansatz, da ich wie Pman die Hoffnung hatte das das von Warema eingesetzte Funkprotokoll nicht selbst implementiert ist und damit schon bekannt ist. Soweit ich das jetzt sagen kann ist es eine proprietäre Implementierung die auf aber zumindest auf IEEE 802.15.4 als unterste Schicht basiert.
Bei der Analyse bin ich aber darauf gestoßen das der Warema USB Stick die Ver- und Entschlüsselung bereits übernimmt und die Relevanten Teile der Funktelegramme per Serieller Schnittstelle bereitstellt.
Nachdem ich nun heute noch meinem WebControl vorgegaukelt habe das mein WMS Stick ein Raffstore ist habe ich zumindest die wichtigsten Teile des Seriellen Protokolls zusammen. Ich versuch es mal einigermaßen verständlich zu beschreiben. Damit sollte dann eine Implementierung für die jeweilige Smarthome Software möglich sein.
Benötigt wird dann neben der Software nur noch der Warema WMS Stick (USB Stick) für ca 55€.
<size size="150">Alles unten beschriebene ist nicht ausführlich getestet und nur durch Analysen ermittelt. Mit dem WMS Stick können die Geräte auch programmiert werden falsche Nachrichten können daher zu einer Beschädigung eurer Anlage führen. Verwendung daher auf eigene Risiko.</size>
Serielle Parameter:
Baudrate: 125000
Parity: None
Data bits: 8
Stop bits: 1
Nachrichten an und vom WMS Stick sind immer in geschweiften Klammern {} eingeschlossen, Linefeed/Return ist nicht nötig.
Die meisten Befehle die man an den USB Stick schickt werden mit "{a}" quittiert. Falls der Befehl nicht verstanden wird kommt ein "{f}" zurück.
WMS Stick Prüfen:
Ob man mit einem WMS Stick verbunden ist kann man mit folgender Sequenz: "{G}"
Der WMS Stick antwortet in diesem Fall nicht mit "{a}" sondern mit "{gWMS USB-Stick}"
Die Version des WMS Stick kann mit "{V}" abgefragt werden. in diesem Fall kommt ebenfalls kein "{a}" zurück sondern "{vVVVVVVVV }" wobei VVVVVVVV für die Versionsnummer steht.
Mit Netz verbinden:
Damit der WMS Stick mit euren Geräten im Netzwerk kommunizieren kann benötigt er den Netzwerkschlüssel den bekommt er mit folgendem Befehl:
"{K401KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK}"
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK steht hierbei für den AES Schlüssel des Netzwerks. Der WMS Stick quittiert diesen Befehl mit "{a}"
Dieser Schlüssel kann auf zwei Wegen ermittelt werden. Option 1 durch mitlauschen der Seriellen Kommunikation zwischen WMS Studio und WMS Stick. Hierfür benötigt ihr aber euer Projekt mit dem die Anlage parametriert wurde. Option 2 WMS Stick per WMS Handsender ins Netzwerk einlernen. Die hierfür nötigen Befehle an den WMS Stick habe ich zwar schon einmal mitgetracet allerdings nicht dokumentiert da ich durch Option 1 schon den Schlüssel hatte. Kann das bei Gelegenheit noch nachholen.
Danach muss noch der Funkkanal und die PANID mitgeteilt werden:
"{M%CCPPPP}" wobei CC für den Funkkanal (Default: 17) und PPPP für die PANID steht. Das Prozentzeichen könnte noch durch eine Raute (#) ersetzt werden dann empfängt man allerdings keine Broadcasts. Befehlt wird ebenfalls mit "{a}" quittiert.
Jetzt seit ihr bereits mit dem Netz verbunden und solltet Broadcast Messages eurer Wetterstation beziehungsweise Zeitsignale eures WebControls oder der WMS Zentrale empfangen.
Wetterstations Broadcast:
"{rAAAAAA708000WWL1FFFFFFL2FFRRTTFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}"
AAAAAA = SNR (Seriennummer) der Wetterstation in HEX.
7080 = Nachrichten Typ hier Wetter
WW = Wind, müsste in m/s sein.
L1 = Helligkeitswert 1
L2 = Helligkeitswert 2 (Wie aus Helligkeitswert 1 und Helligkeitswert 2 korrekt berechnet wird weiß ich noch nicht.)
RR = Niederschlag (00: Kein Regen C8: Regen)
TT = Temperatur * 10 muss also durch 10 geteilt werden. Wie Temperaturen über 25,4° und unter 0° dargestellt werden weiß ich noch nicht.
Datums/Zeit Broadcast:
"{rAAAAAA80200B080009YYNNDDHHMM0C060101}"
AAAAAA = SNR (Seriennummer) der WMS Zentrale/WebControl in HEX.
8020 = Nachrichten Typ hier Datum/Zeit
YY = Jahr 2 stellig in HEX
NN = Monat in HEX
DD = Tag in HEX
HH = Stunden in HEX
MM = Minuten in HEX
"{rAAAAAA80200B080009110A080C240C060101}" entspricht 08.10.2017 12:36
WMS Gerät winken lassen:
"{R06AAAAAA7050}" an WMS Stick schicken.
AAAAAA = SNR (Seriennummer) vom Gerät welches Winken soll in HEX.
7050 = Nachrichten Typ hier Winken
WMS Stick quittiert mit "{a}"
Status Zwischenstecker abfragen:
"{R06AAAAAA801001000005}" an WMS Stick schicken.
AAAAAA = SNR (Seriennummer) vom abzufragenden Zwischenstecker in HEX.
8010 = Nachrichten Typ hier Statusabfrage
WMS Stick quittiert mit "{a}"
Zwischenstecker schickt Status:
{rAAAAAA801101000003PPWWV1V200}
AAAAAA = SNR (Seriennummer) vom abgefragten Zwischenstecker in HEX.
8011 = Nachrichten Typ hier Statusantwort
PP = Position in % * 2 (HEX) muss daher durch 2 geteilt werden
WW = Winkel +127 in HEX. 127 entspricht daher 0°.
V1 = Position Volant 1. FF entspricht nicht vorhanden.
V2 = Position Volant 2. FF entspricht nicht vorhanden.
Kodierung von PP, WW, V1 und V2 entspricht der des WMS WebControl Protocols kann daher mit Hilfe des WebControl JavaScripts nachvollzogen werden.
Der WMS Handsender kann auch den Grund für den Letzten Fahrbefehl anzeigen (Wind, Niederschlag, Eis, …) ob und wie dies kodiert ist weiß ich noch nicht.
Zwischestecker auf Position fahren:
"{R06AAAAAA707003PPWWV1V2}"
AAAAAA = SNR (Seriennummer) vom abgefragten Zwischenstecker in HEX.
7070 = Nachrichten Typ hier Fahrbefehl
PP = Position in % * 2 (HEX) muss daher durch 2 geteilt werden
WW = Winkel +127 in HEX. 127 entspricht daher 0°.
V1 = Position Volant 1. FF entspricht nicht vorhanden.
V2 = Position Volant 2. FF entspricht nicht vorhanden.
PP, WW, V1, V2 wie unter "Status Zwischenstecker abfragen" beschrieben.
WMS Stick quittiert mit "{a}"
Zwischenstecker schickt Bestätigung:
{rAAAAAA70710010023F02C04DFFFF0C0DFFFF}
AAAAAA = SNR (Seriennummer) vom abgefragten Zwischenstecker in HEX.
7071 = Nachrichten Typ hier Bestätigung Fahrbefehl.
Genaue Zusammensetzung habe ich hier noch nicht analysiert. Am Ende scheinen zwei Position enthalten zu sein (2 x PPWWV1V2, C04DFFFF0C0DFFFF).
Nachdem der Handsender die Ursache anzeigen kann warum ein Fahrbefehl nicht ausgeführt wird wird dies auch noch enthalten sein.