RF Controller Funkverkehr
sniffen und steuern

Es gibt inzwischen massenweise günstige Produkte, die per RF Controller steuerbar sind.

Ich stelle die These auf, dass die meisten davon ihre Funkprotokolle nach dem gleichen Prinzip implementiert haben und zeige euch, wie dieses Prinzip ausschaut.

Somit könnt ihr den „RF Controller“ mit einem CUL, SIGNALduino, FHEMduino oder einem anderen Funktransmitter, der auf 433 MHz sendet, emulieren und das Gerät Smart-Home-fähig machen.

Ich habe einen super schönen (und wirklich einfach 🙄 einzubauenden) Sternenhimmel im Bad installiert, weil meine Frau gerne beim Baden in die Sterne schauen wollte…
(… und ich die „Challenge accepted“ habe …)

On topic

Steuern lässt der sich mit einem 433 MHz RF Controller, in meinem Fall einem 28-key RF Controller:

28 key RF Controller
Meine 28 key RF Controller

Natürlich musste die Steuerung des Sternenhimmels in meine Heimautomatisierung, sprich FHEM, eingebunden werden um Alexa informieren zu können, dass der Sternenhimmel nun eingeschalten werden möge.

Daher wagte ich mich in bis dahin unbekannte Telemetrie-Gefilde vor…

Benötigte Hardware

Um die Daten mit FHEM und dem CUL zu sniffen, benötigst du eine funktionierende FHEM Installation und einen CUL, der Funktransmitter und Receiver für entweder 868 MHz oder 433 MHz ist. Wenn du die China-RF-(Controller)-Geräte steuern willst, brauchst du den 433 MHz CUL.

Entweder du besorgst ihn fertig hier oder lötest ihn selbst. Ich hab mir einen gebaut, und zwar mit dem Arduino Pro Mini.

Ich will es einfach steuern ohne jede Menge Theorie!

Genau so wollte ich es eigentlich haben:

  • CUL im FHEM einrichten
  • Knopf auf der Fernbedienung drücken
  • Gerät wird automatisch per Autocreate angelegt
  • Fertig ( = ich kann das Gerät steuern)

Leider war es nicht so einfach, für dich könnte es aber eventuell (fast) so einfach werden! :mrgreen:

Mein CUL rawmsg Generator für RF Controller

Füge hier einfach eine Zeile des mittels „set CUL raw X67“ ermittelten Logs ein und klicke auf CUL-RAWMSG generieren!

Es funktioniert? Perfekt! >>
Bitte um ein kurzes Kommentar mit Link zum Gerät. 😎

Nein? Dann geht es hier weiter mit Erklärungen zu den Bedeutungen der einzelnen Komponenten einer Log-Zeile, damit du dir dein eigenes CUL raw GssNnprHHLLhhllDDDD – Kommando basteln kannst:

Sniffen

Damit FHEM die vom RF Controller gesendeten Datenpakete protokolliert, musst du den CUL in den Debug-Modus versetzen, indem du folgenden Befehl via FHEM an den CUL absetzt:

Sollten die protokollierten Werte im Event-Monitor dabei ca. so aussehen, stehen die Chancen gut, dass du den RF Controller zukünftig in einer Lade verstauen kannst, weil FHEM die Steuerung übernimmt:

Zwischendurch empfängt der CUL unvollständige Werte und dadurch entstehen Log-Einträge, die nicht ins Schema passen. Diese bitte ignorieren.

UNKNOWNCODE Log-Eintrag Analyse

Ein Dankeschön an Andreas fürs Posten des relevanten Codes für die Ausgabe des Debug-Logs im FHEM – Event Monitor. Dadurch konnte ich einige meiner Vermutungen bestätigen als auch widerlegen. Nachfolgend der letzte Stand für die Analyse der Log-Entries:

Lt. Doku bedeuten die jeweils fett markierten Werte folgendes:

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

Interne Nummer der „state machine“. Das ist eine Konstante im Code, die für die erkannte Geräte-Art steht. Hier ein Auszug einiger möglichen Werte: (kein Anspruch auf Vollständigkeit! 😉 )

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

416 Mikrosekunden (µs) für den High-Teil des Zero-Bits
1200 Mikrosekunden (µs) für den Low-Teil des Zero-Bits
1152 Mikrosekunden (µs) für den High-Teil des One-Bits
464 Mikrosekunden (µs) für den Low-Teil des One-Bits

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

400 Mikrosekunden (µs) für den High-Teil des Two-Bits
1216 Mikrosekunden (µs) für den Low-Teil des Two-Bits
Wofür genau dieses Two-Bit ist? Sag du’s mir! :mrgreen:

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

Im Code steht hier „valCount“. Weiß jemand was das ist?

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

Anzahl der erkannten Zero-Sync-Bits. Wird vom CUL anscheinend falsch erkannt, in der Analyse mit dem Logic Analyzer habe ich keine Sync-Bits am Anfang der Übertragung feststellen können. Also nehme ich beim Senden mittels G-Kommando 0 als Sync-Bits-Wert.

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

Anzahl der übertragenen Bytes inkl. letztes vollständiges Byte, falls vorhanden.

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

Unvollständiges letztes übertragenes Byte: LSB-Position (7=erstes Bit) nach der kein Bit mehr übertragen wird. (7-n = Anzahl der Bits im letzten Byte)

Wird von der culfw im RF Controller Fall anscheinend falsch erkannt. Es wird lt. Logic Analyzer ein letztes High von 400 ms und dann bis zum nächsten Paket Low gesendet. (400 + 1200 = Zero-Bit)

Hier sieht man auch, dass der byteidx um das unvollständige Byte erhöht wird, wenn der bitidx nicht 7 ist:

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

400  Mikrosekunden (µs) für den High-Teil des Syncbits
12288 Mikrosekunden (µs) für den Low-Teil des Syncbits
Scheinbar wird das letzte 400µs – High und die 12 Millisekunden Pause zwischen den Kommandos als synbit gewertet.

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

Lt. Code „clockTime“. Ist bei mir immer 0 gewesen.

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

Der RSSI-Wert, welcher die Signalstärke beschreibt.

p 7 416 1200 1152 464 400 1216 24 1 3 0 400 12288 0 2B 58000D:

Das sind die übertragenen Bytes in Hex-Notation.
In meinem Fall also „58000D“.

Diese 3 Bytes werden mittels Manchester-Code kodiert übertragen. Deshalb ist das Timing für die erfolgreiche Fernbedienung eures Geräts sehr wichtig.

Wenn eure Timings also stark von den 400µs + 1200µs = 1600µs für die Übertragung eines Bits abweichen, wird der von meinem RF Controller CUL rawmsg Generator ermittelte Wert auch nicht funktionieren.

Die Timings werden von meinem RF Controller CUL rawmsg Generator automatisch berechnet.

Du kannst hier nachlesen, wie ich zu meinen Erkenntnissen gelangt bin.

Schreib mir doch ein Kommentar welches Gerät du mit welcher Transmitter-Hardware zum Laufen gebracht hast und welches nicht… 🙂

Changelog:

  • 06.12.2017
    1. Neue Erkenntnisse (beigebracht durchs Comment vom Andreas) in die Log-Analyse einfließen lassen.

Autor: David

Ich bin ein leidenschaftlicher Techniker, der gerne mit elektronischen Gadgets experimentiert. Meine Augen beginnen zu leuchten, wenn ich über smarte Systeme im Wohnbereich diskutiere, besonders seitdem ich gemeinsam mit meiner Frau ein Eigenheim geschaffen habe. Beruflich bin ich in der IT-Branche tätig.

13 Gedanken zu „RF Controller Funkverkehr
sniffen und steuern“

  1. Dieser generierte rx-Dump („p.. hi lo etc.“) scheint aus z.B. a-culfw/culfw/clib/rf_receive.c RfAnalyze_Task() zu stammen.
    (Achtung: aculfw NICHT culfw! Evt. anderes Format?)

    Somit also Decoding dort wie folgt implementiert:

    #ifndef NO_RF_DEBUG
    if(TX_REPORT & REP_BITS) {
    MULTICC_PREFIX();
    DC(‚p‘);
    DU(b->state, 2);
    DU(b->zero.hightime*16, 5);
    DU(b->zero.lowtime *16, 5);
    DU(b->one.hightime *16, 5);
    DU(b->one.lowtime *16, 5);
    DU(b->two.hightime *16, 5);
    DU(b->two.lowtime *16, 5);
    DU(b->valCount, 4);
    DU(b->sync, 3);
    DU(b->byteidx, 3);
    DU(7-b->bitidx, 2);
    #if defined(HAS_IT) || defined(HAS_TCM97001)
    DC(‚ ‚);
    DU(b->syncbit.hightime *16, 5);
    DC(‚ ‚);
    DU(b->syncbit.lowtime *16, 5);
    DC(‚ ‚);
    #endif
    DU(b->clockTime *16, 5);
    DC(‚ ‚);
    if(TX_REPORT & REP_RSSI) {
    DH2(cc1100_readReg(CC1100_RSSI));
    DC(‚ ‚);
    }
    if(b->bitidx != 7)
    b->byteidx++;

    for(uint8_t i=0; i byteidx; i++)
    DH2(b->data[i]);
    DNL();

    }
    #endif

    Somit wäre das oben „Last-Byte“ genannte wohl in Wirklichkeit two high/low, und „24“ wäre valCount.

    Talk about reverse engineering open source software 😉

    Mit diesen Infos sollte man dann eigentlich anhand der Beschreibung des üblichen CUL rawsend Command-Patterns (also GssNnprHHLLhhllDDDD : http://culfw.de/commandref.html , https://forum.fhem.de/index.php/topic,35064.msg607587.html#msg607587 ) dieses benötigte rawsend-G erstellen können.

    Und das alles müsste mit FHEM eigentlich stattdessen automatisch erstellbar sein 🙁
    (talk about usability…)
    Aber zugegebenermaßen ist die Usability von FHEM generell schon erstaunlich hoch…

    1. Hey Andreas,

      vielen Dank für die Infos und sorry, dass der Kommentar erst jetzt erscheint… war irgendwie in den SPAM gerutscht.
      Ich werde jedenfalls den Artikel (natürlich mit Credits an dich) aktualisieren.

      lg, David

  2. Hallo 🙂
    vielen Dank für den Beitrag! Leider funktioniert es nicht so wie beschrieben 🙁
    Könntest du mir sagen wo mein Fehler liegt?

    Vielen Dank!

    In meinem Log erscheinen Folgende Sachen:

    2017-11-23 19:57:54 CUL traxCUL UNKNOWNCODE p 8 560 4112 576 4096 592 2160 37 1 4 5 592 9024 0 0A 98520CE350
    2017-11-23 19:57:54 CUL traxCUL UNKNOWNCODE p 8 576 4080 576 4112 576 2160 37 1 4 5 576 9008 0 0C 98520CE350
    2017-11-23 19:57:54 CUL traxCUL UNKNOWNCODE p 8 592 4080 576 4080 592 2160 37 1 4 5 560 9024 0 0C 98520CE350
    2017-11-23 19:57:54 CUL traxCUL UNKNOWNCODE p 8 608 4080 576 4096 592 2160 37 1 4 5 576 9056 0 0A 98520CE350
    2017-11-23 19:57:55 CUL traxCUL UNKNOWNCODE p 8 576 4096 576 4096 592 2160 37 1 4 5 560 9040 0 0C 98520CE350
    2017-11-23 19:57:55 CUL traxCUL UNKNOWNCODE p 8 592 4080 576 4096 576 2048 37 1 4 5 592 9008 0 0B 98520CE350
    2017-11-23 19:57:58 CUL traxCUL UNKNOWNCODE p 8 560 4112 528 4096 560 2160 37 1 4 5 576 8992 0 00 9DE00C23B0
    2017-11-23 19:57:58 CUL traxCUL UNKNOWNCODE p 8 560 4096 544 4112 544 2160 37 1 4 5 560 8992 0 FE 9DE00C23B0
    2017-11-23 19:57:58 CUL traxCUL UNKNOWNCODE p 8 576 4080 560 4080 560 2160 37 1 4 5 560 8992 0 FF 9DE00C23B0
    2017-11-23 19:57:58 CUL traxCUL UNKNOWNCODE p 8 576 4080 544 4112 560 2144 37 1 4 5 560 9072 0 FE 9DE00C23B0
    2017-11-23 19:57:58 CUL traxCUL UNKNOWNCODE p 8 560 4064 560 4112 544 2160 37 1 4 5 560 9008 0 FE 9DE00C23B0
    2017-11-23 19:57:59 CUL traxCUL UNKNOWNCODE p 8 576 4096 528 4128 544 2064 37 1 4 5 560 8976 0 01 9DE00C23B0
    2017-11-23 19:58:02 CUL traxCUL UNKNOWNCODE p11 544 2096 576 4176 576 2176 33 1 4 1 512 9408 0 01 6F20443800
    2017-11-23 19:58:02 CUL traxCUL UNKNOWNCODE p 8 576 4096 576 4112 576 2160 37 1 4 5 576 8992 0 01 96F2044380
    2017-11-23 19:58:03 CUL traxCUL UNKNOWNCODE p 8 576 4096 560 4112 560 2192 37 1 4 5 576 9024 0 00 96F2044380
    2017-11-23 19:58:03 CUL traxCUL UNKNOWNCODE p 8 576 4112 560 4128 592 2144 37 1 4 5 576 9024 0 02 96F2044380
    2017-11-23 19:58:03 CUL traxCUL UNKNOWNCODE p 8 576 4112 576 4096 592 2160 37 1 4 5 592 9008 0 01 96F2044380
    2017-11-23 19:58:03 CUL traxCUL UNKNOWNCODE p 8 576 4096 576 4112 560 2176 37 1 4 5 576 9088 0 01 96F2044380
    2017-11-23 19:58:03 CUL traxCUL UNKNOWNCODE p 8 592 4080 576 4112 592 2032 37 1 4 5 576 8992 0 02 96F2044380
    2017-11-23 19:58:03 CUL traxCUL UNKNOWNCODE p11 128 32 208 32 192 2256 73 1 9 1 208 13952 0 D5 084040000048A0009000

      1. Vielen Dank für die schnelle Antwort 🙂
        Ich habe von diesen Geräten 3 stück gekauft. Funktionieren perfekt! Also lösen immer nur dann aus wenn man auch vorbei geht und der Preis war einfach zu verlockend. Leider wird es in FHEM mit autocreate nicht automatisch gefunden.
        Daher suche ich jetzt eine Möglichkeit diese einzubinden:

        https://www.ebay.de/itm/433-MHZ-PIR-Funk-Infrarot-Detektor-Bewegungssensor-Bewegungsmelder-Alarmanlage/263218535780?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2060353.m1438.l2649

        1. Achso, du willst, dass FHEM den Status anzeigt?
          Das funktioniert mit dieser Methode nicht, hier könnte FHEM nur einen der Bewegungsmelder emulieren (= das gleiche Funksignal absetzen, das der BM absetzt.)

          Vielleicht versuchst du den CUL in einen signalduino umzuflashen, dann soll es leichter sein unbekannte Funkprotokolle in FHEM einzubinden. Ich habe das bisher mangels Zeit noch nicht machen können, werde aber dann hier berichten. Ich würde mich über eine kurze Rückmeldung freuen, wenn du den signalduino Weg gehst…

          1. Okay, ich habe es schon befürchtet… dann werde ich einen Arduino Nano bestellen und einen RFSniffer installieren. Dann sollte ich ja das Signal rausbekommen sodass ich ein Gerät in FHEM hinzufügen kann welches mit dem Bewegungsmelder verknüpft wird?

  3. Spannende Anleitung. Danke. Leider funktioniert bei mir der Generator nicht. Ich habe folgende logs:
    2017-12-03 21:56:03 CUL myCUL433 UNKNOWNCODE p13 336 320 528 432 0 0 30 1 3 6 336 320 336 05 C9495524
    2017-12-03 21:56:03 CUL myCUL433 UNKNOWNCODE p13 368 304 528 416 0 0 30 1 3 6 368 304 368 03 C9495524
    2017-12-03 21:56:03 CUL myCUL433 UNKNOWNCODE p13 352 320 544 416 0 0 30 1 3 6 352 320 352 03 C9495524
    2017-12-03 21:56:03 CUL myCUL433 UNKNOWNCODE p13 336 352 528 432 0 0 30 1 3 6 336 352 336 07 C9495524
    2017-12-03 21:56:03 CUL myCUL433 UNKNOWNCODE p13 352 320 544 416 0 0 30 1 3 6 352 320 352 03 C9495524

    Ich versuche diesen nun in einen Befehl umzuwandeln. Mein CUL ist a-culfw V1.26.01. Hast Du einen Tipp, wie ich einen funktionsfähigen Code gemäss: CUL raw GssNnprHHLLhhllDDDD hinbekommen? Habe etwas gespielt – hat aber bis jetzt nicht funktioniert…
    Es handelt sich beim Gerät um einen Lichtschalter.
    Danke, Richard

    1. Scheinbar hat dieser Lichtschalter eine ganz andere Implementierung des Funkprotokolls. Deswegen wird auch mein Generator nicht funktionieren.
      Sieh dir mal den Thread an, den ich ganz unten verlinkt habe. Dort findest du einige Infos über die Analyse des Protokolls. Du kannst dann ja einen eigenen Thread aufmachen für deinen Lichtschalter.

  4. Vielen vielen Dank für diesen mega geilen Generator =)

    Ich habe damit meine Elektrische Beamerleinwand zum laufen bekommen.
    Einen Link habe ich leider nicht, da diese Leinwand nicht mehr vertrieben wird.

Kommentar verfassen