Einbindung der kostengünstigen Funkschaltsteckdose PCA 301 mit Energiemessung

Begonnen von Emil, 13 März 2013, 11:22:35

Vorheriges Thema - Nächstes Thema

Kleiner

Hallo

also die Parameter für ein RFM12B sind bekannt, es gibt ein Mitschnitt der SPI-Schnittstelle.

Damit steht einer Implementierung auf Basis eins RFM12B nichts im Wege.
Es muss halt nur gemacht werden.

trilu

Das müsste ja schon fast mit der jeelib und einem arduino lesbar sein.
Aufbau eines Datenpakets mit der Jeelib ist

Preamble 3byte  AA AA AA
Syn 2 byte      2D GroupID
Head 2 byte     HDR LEN  - in HDR stehen so Sachen wie, von welcher ID, soll mit ACK bestätigt werden, usw...
Danach kommt der Payload
und hinten 2 byte CRC

Muss mal schauen das ich mir bei der nächsten Bestellung so ein Teil mitschicken lasse...
 

ohweh

Hi,

also ich hab hier sowohl ne PCA 301, als auch nen JeeLink rumfliegen. Mit einer "normalen" RF12demo (Teil der JeeLib) komme ich nicht weit, das habe ich gerade mal durchgeturnt. Genauer gesagt habe ich das hier versucht:

- Initialisierung "0g" (d.h. lauschen auf allen Gruppen, aka Promiscious Mode... wobei man gleichzeitig im Hinterkopf behalten muss, dass JCWs RF12-Implementierung nur mit 212 Gruppen umgehen kann, wohingegen das RFM12B technisch 250 Gruppen beherrscht)
- Für zwei Minuten alle Pakete mitgeschnitten
- In den Paketen nach einer Häufung von INT 170 (=0xAA) gesucht

Das Ergebnis ist erstmal negativ. Ich vermute mal dass die RF-Einstellungen eben nicht "JeeLib-Standard" sind, d.h. Baud-Rate und/oder Frequenz abweichen. Sieht für mich so aus, als müsste man mit einer angepassten Version von RF12demo spielen, wie's z.B. hier gemacht wurde:

http://forum.jeelabs.net/node/341.html

@Kleiner: Ich habe leider keinen Bus Pirate o.a. Logic Analyzer. Daher die Frage, enthält Dein SPI Mitschnitt auch die RF-Initialisierung? D.h. die Register-Settings für Frequenz und Baud-Rate? Ich bin immer noch Neuling auf diesem Gebiet, aber nen Versuch mit ner angepasstem RF12demo würde ich mal wagen wollen...

/Oliver


trilu

Ich benutze auch das RF12demo. Ich denke das ist schon ganz gut für diesen Zweck geeignet.

0g heisst, es wird auf allen Kanälen gelauscht.
Die drei Sync bytes sieht man aber trotz 0g nicht, die werden gefiltert.

>TX: AA AA AA 2D D4 01 04 07 F8 92 00 AA AA AA AA 71 52 AA AA AA
Wenn ich mir den String so anschaue, dann sind die ersten 3 bytes die preamble

Dann kommt der sync mit 2d d4 - 2d ist fest gesetzt, d4 ist die group id - groupID = 212
Könnte also sein das es gar keine RF12b Module sind, sondern die RF12 Module :-)

Danach kommt die Id des Sendemoduls (01) und dann das Längenbyte das definitiv nicht stimmt.
Folglich kann RF12demo keinen validierten String ausspucken, hier wird definitiv das Längenbyte gecheckt.
Bleibt also erst mal nur die Möglichkeit Raw zu loggen.

Bzgl. der Settings für das RF12 wäre es Klasse wenn Kleiner den SPI Log zur Verfügung stellen könnte.
Die Funksettings lassen sich im RF12 demo auch leicht anpassen. Gibts sogar einen Konfigurator für...
http://tools.jeelabs.org/rfm12b.html

Viele Grüße
trilu

ohweh

Hi Trilu,

ist auch mein Verständnis, dass die ersten 3 Bytes der Preambel unterdrückt werden. Aber wenn ich den Beitrag von "Kleiner" richtig interpretiere, dann kommt die Byte-Folge AA AA AA AA im Paket weiter hinten nochmal vor, und die ist anscheinend fix. Und genau danach suche ich jetzt schon ne ganze Weile...

- Mit Group 212 hab ich's schon versucht, war mir dann aber nicht sicher ob's wirklich hinhaut. Also bin ich wieder auf "0g" gewechselt. Aber Du hast schon recht, das wird definitiv ausgewertet, insofern könnte ich die "Flut" wieder einschränken.
- Den RFM12 Command Calculator hab ich heute auch schon fleissig bemüht. Denn in der Bedienungsanleitung der PCA 301 steht als Frequenz "808,40" MHz. Sofern das wirklich stimmt, enspräche das dem Setting rf12_control(0xA690). Also habe ich gleich mal den RF12demo Sketch abgewandelt...
- Seitdem spiele ich nun mit dem Data Rate Register rum. Angefangen bei 0xC605 bis weit hinauf (bis zu Transferraten von < 4 KBpS). Aber noch habe ich keinen Erfolg damit... Erfolg im Sinne von mehrfach hintereinander erscheinenden AA...

Aber wenn Du von RAW sprichst, sind wir uns denn einig dass es mit 0g und "Report bad packets" gehen müsste? Oder willst Du noch auf was anderes hinaus? Wie gesagt, bin da noch nicht soooo bewandert, versuche das noch besser zu verstehen.

Das SPI Log könnte echt Licht ins Dunkel bringen. Schliesslich könnte die angegebene Frequenz in der Beschreibung ja auch ne ca.-Angabe sein. Dann könnte ich lang herumprobieren... Mit den anderen Registern habe ich noch gar nicht rumgespielt. Wär doof wenn das nötig würden, weil sich dann auch die potentiellen Settings potenzieren.

/Oliver




trilu

Entschuldige, ich wollte dich mit dem Raw nicht verwirren.
Ich würde die Group auf 212 setzen, bei mir zu Hause gibt's viel zu viel Traffic,
als das ich mit 0g irgendwas sehen könnte :-)
Die Pakete vom PCA301 werden ziemlich sicher als defekt angezeigt, da ja das Längenbyte nicht stimmt.
Ob die CRC richtig kalkuliert wird, wird sich später zeigen. Zuerst brauchen wir mal die Pakete im RF12demo.

Mit den Settings alle Möglichkeiten durchzutesten wird nicht klappen, da sind ziemlich viele Variablen,
die sich gegenseitig beeinflussen drin. Ist ja nicht nur die Frequenz und die Baudrate - ist ja auch noch die Bandbreite,
ob bei steigender oder fallender Flanke gemessen wird, usw.

Was mir noch einfällt, vielleicht muss man das Ding auch erst mit der Basis pairen bevor es was sendet?
>Es scheint ca. alle 60s eine Anfrage der Anzeigeeinheit zu geben, mit anschließender Antwort der Steckdose/n.
>Dabei werden folgende Daten übermittelt (ins TX Register geschrieben bzw. aus dem RX FIFO ausgelesen:

Eigentlich ein Indiz das deine 2 minuten loggen sich nur lohnen wenn das Ding gepairt ist.
Und dann bekommst du auch nur einen String von der Steckdose ab....
Das ist bei 0g bestimmt wie die Stecknadel im Heuhaufen :-)))))))))

ohweh

Hey,

nee, schon gut, hast mich nicht verwirrt. Wollte nur möglichst sicher gehen, dass ich da nicht nem Riesenirrtum aufsitze und was grundlegendes mis(t)verstehe. Insofern schonmal ein fettes Danke!

Yepp, 0g ist bei mir ebenfalls ne Seuche. Mitten in der Stadt ist das ziemlich ätzend. Insofern hilft die 212 wirklich sehr, denn da kommt (fast) nix rein... Dass mit den defekten Paketen ist ebenfalls klar. Ich lasse mir alle anzeigen und suche nach den AAs (in der Hoffnung, dass die auch wirklich so übertragen werden! Und nicht doch noch ne Verschlüsselung im Spiel ist die alles brav zerwürfelt. Ich bin überfragt, ob das RFM12(b) Modul Verschlüsselung beherrscht oder nicht).

Bzgl. des Pairings: Sorry, hab ich nicht geschrieben, aber ich war schlau genug die Anzeigeeinheit mitzubestellen, d.h. die Steckdose ist gepaired. Nach jedem Wechsel der Settings habe ich brav nen Schaltvorgang durchgeführt, m.E. müsste dann auch der 05-Schalt-Befehl losgetreten werden. Zum Glück muss ich also nicht immer 60 Sekunden warten.

Tja, wegen der anderen Settings: Das habe ich zwar ein wenig befürchtet, aber insgeheim gehofft ich lande mal "eben" nen Treffer. War wohl nix... Unwissenheit eben. Danke für die Auflärung!

Was nun? Warten auf Godot, bzw. auf "Kleiner". Oder nen Bus Pirate anschaffen? Muss mal googlen, so'n Ding im Fundus zu haben kann ja eigentlich nicht schaden ;-)

Nochmals danke, hab heut einiges gelernt!

/Oliver

trilu

Buspirate gibts für 25Euro
http://www.watterott.com/de/Bus-Pirate

Allerdings befürchte ich, gehört da auch wieder Einarbeitung zu...
Bin aber auch schon am Zucken ob ich so ein Ding für den Fundus brauche :-)

Das RF12 oder RF12b kann nicht verschlüsseln, bei der JeeLabs Variante übernimmt das die Lib.
Aber mit so ein paar xor's findest du halt auch keine AA's mehr.
Wobei "Kleiner" das so nicht beschrieben hat.


Kleiner

Also ich habe die Station mitgekauft und sie geöffnet.
In der Station ist das Modul RFM12BDP verbaut.
Ich habe einen BusPirate an der Station angelötet.

Ein Protokoll mit dem SPI-Sniffer ergibt folgendes Ergebnis:

5B [5C 82 0x82(00 0x00)5C 38 0x38(00 0x00)5D ]
5B [5C C6 0xC6(FF 0xFF)5C 33 0x33(FF 0xFF)5D ]
5B [5C 94 0x94(FF 0xFF)5C C5 0xC5(FF 0xFF)5D ]
5B [5C 98 0x98(FF 0xFF)5C 20 0x20(FF 0xFF)5D ]
5B [5C C2 0xC2(FF 0xFF)5C AF 0xAF(FF 0xFF)5D ]
5B [5C C4 0xC4(FF 0xFF)5C 77 0x77(FF 0xFF)5D ]
5B [5C CC 0xCC(FF 0xFF)5C 76 0x76(FF 0xFF)5D ]
5B [5C E1 0xE1(FF 0xFF)5C 96 0x96(FF 0xFF)5D ]
5B [5C C8 0xC8(FF 0xFF)5C 0E 0x0E(FF 0xFF)5D ]
5B [5C C0 0xC0(FF 0xFF)5C C0 0xC0(FF 0xFF)5D ]
5B [5C 80 0x80(FF 0xFF)5C E8 0xE8(FF 0xFF)5D ]
5B [5C A7 0xA7(FF 0xFF)5C 08 0x08(FF 0xFF)5D ]
5B [5C CA 0xCA(FF 0xFF)5C 80 0x80(FF 0xFF)5D ]
5B [5C CA 0xCA(FF 0xFF)5C 83 0x83(FF 0xFF)5D ]
5B [5C CA 0xCA(FF 0xFF)5C 81 0x81(FF 0xFF)5D ]
5B [5C CA 0xCA(FF 0xFF)5C 83 0x83(FF 0xFF)5D ]
5B [5C 00 0x00(A1 0xA1)5C 00 0x00(3F 0x3F)5D ]
5B [5C 82 0x82(FF 0xFF)5C 28 0x28(FF 0xFF)5D ]
5B [5C 82 0x82(FF 0xFF)5C 38 0x38(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C 2D 0x2D(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C D4 0xD4(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C 02 0x02(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C 04 0x04(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C 07 0x07(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C F8 0xF8(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C 92 0x92(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C 00 0x00(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C D1 0xD1(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C 6E 0x6E(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C B8 0xB8(FF 0xFF)5C AA 0xAA(FF 0xFF)5D ]
5B [5C 82 0x82(00 0x00)5C 08 0x08(00 0x00)5D ]
5B [5C 82 0x82(00 0x00)5C 00 0x00(00 0x00)5D ]
5B [5C 82 0x82(00 0x00)5C D8 0xD8(00 0x00)5D ]
5B [5C C6 0xC6(00 0x00)5C 33 0x33(00 0x00)5D ]
5B [5C 94 0x94(00 0x00)5C C5 0xC5(00 0x00)5D ]
5B [5C 98 0x98(00 0x00)5C 20 0x20(00 0x00)5D ]
5B [5C C2 0xC2(00 0x00)5C AF 0xAF(00 0x00)5D ]
5B [5C C4 0xC4(00 0x00)5C 77 0x77(00 0x00)5D ]
5B [5C CC 0xCC(00 0x00)5C 76 0x76(00 0x00)5D ]
5B [5C E1 0xE1(00 0x00)5C 96 0x96(00 0x00)5D ]
5B [5C C8 0xC8(00 0x00)5C 0E 0x0E(00 0x00)5D ]
5B [5C C0 0xC0(00 0x00)5C C0 0xC0(00 0x00)5D ]
5B [5C 80 0x80(00 0x00)5C E8 0xE8(00 0x00)5D ]
5B [5C A7 0xA7(00 0x00)5C 08 0x08(00 0x00)5D ]
5B [5C CA 0xCA(00 0x00)5C 80 0x80(00 0x00)5D ]
5B [5C CA 0xCA(00 0x00)5C 83 0x83(00 0x00)5D ]
5B [5C CA 0xCA(00 0x00)5C 81 0x81(00 0x00)5D ]
5B [5C CA 0xCA(00 0x00)5C 83 0x83(00 0x00)5D ]
5B [5C 00 0x00(22 0x22)5C 00 0x00(3F 0x3F)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(02 0x02)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(04 0x04)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(07 0x07)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(F8 0xF8)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(92 0x92)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(01 0x01)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(01 0x01)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(91 0x91)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(00 0x00)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(20 0x20)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(B1 0xB1)5D ]
5B [5C 00 0x00(81 0x81)5C 00 0x00(FF 0xFF)5C 00 0x00(4F 0x4F)5D ]
5B [5C 82 0x82(FF 0xFF)5C 01 0x01(FF 0xFF)5D ]
5B [5C 82 0x82(00 0x00)5C 01 0x01(00 0x00)5D ]

ohweh

Hey,

boah, ich bin einfach nur begeistert hier!

@Trilu: Ja, genau von denen hab ich mir den Bus Pirate jetzt auch bestellt ;-) Einarbeitung? Klar, wird so sein. Da gehen bestimmt wieder ein paar dutzend Stunden und Nerven bei drauf. Wie das bei neuen Dingen so üblich ist. Kennste ja bestimmt... Aber irgendwie muss ich mir das jetzt geben, ich will wissen wie's geht.

@Kleiner: Super, DANKE! Ich glaub das bringt mich richtig weiter. Ich weiss aber noch nicht so richtig, wie man diesen Trace liest?!?!

- Der erste Wert ist das "Register" (gefolgt von 5C)?
- Der zweite Wert in der Zeile entspricht dem zu schreibenden Inhalt (gefolgt von 5D)?

Hab mir das jetzt mal so zusammengereimt... Und dann (das wird wiedrum Trilu freuen) folgende Werte herausgelesen (für den Anfang):

- Frequenz: 0xA708 (würde 869.000 MHz entsprechen... soviel zur Zuverlässigkeit der "Packungsbeilage")
- DataRate: 0xC633 (entspräche 6.631kbps)

RF12demo angepasst (mit Filter auf Gruppe 212), und schwupps kriege ich bei Schaltvorgängen dies hier zu sehen:

 ? 1 7 248 71 0 170
 ? 1 7 248 71 0
 ? 1 7 248 71 1 170
 ? 1 7 248 71 0 170
 ? 1 7 248 71 0
 ? 1 7 248 71 0
 ? 1 7 248 71 1 170
 ? 1 7 248 71 1

Ich versuche jetzt noch die anderen Parameter herauszupuzzlen. Aber soweit wie jetzt, war ich den ganzen Tag noch nicht. Zudem passt die "1" zu Beginn exakt zu Trilus Vorhersage.

/Oliver






trilu

Coole Sache, Gratulation!
Wenn man das mal mit den Erkenntnissen von "Kleiner" vergleicht...

> RX: 01 04 07 F8 92 00 00 00 00 00 0E 9F
> TX: AA AA AA 2D D4 01 04 07 F8 92 00 AA AA AA AA 71 52 AA AA AA

Dein String in HEX
? 1  7 248 71 0 170 = 01 07 F8 47 00 AA

entspricht ziemlich genau diesem hier:
------------------->01 xx 07 F8 47 00 AA
TX: AA AA AA 2D D4 01 04 07 F8 92 00 AA AA AA AA 71 52 AA AA AA

Das filtert die Jeelib raus: AA AA AA 2D D4
Dann kommt der Receive String: 01    07 F8 47 00 AA
Und das filtert die Jeelib wieder, weil es die nächste Preamble sein könnte: AA AA AA 71 52 AA AA AA

Ein Byte fehlt - das wäre laut Jeelib das Längenbyte - keine Ahnung ob du hier ein Übertragungsproblem hast oder Jeelib filtert.
Und die nachfolgenden AA's hält er für die Preamble des möglichen nächsten Strings

Vielleicht könntest du es mal so probieren:
0g - Alle Groups loggen, dann wird ab 4D angezeigt
0q - Nichts filtern, den String den du suchst hast du ja jetzt
31i - promiscuous mode, nimmt alle broadcast messages

Im nächsten Schritt müssen wir dann an die Jeelib ran, oder vielleicht reicht es den RF12demo sketch ein bisschen anzupacken.

Kleiner

Die Anleitung zu lesen des Log ist hier zu finden http://dangerousprototypes.com/docs/Bus_Pirate_binary_SPI_sniffer_utility#Raw_output_decoding

Das heisst:

5B [5C 82 0x82(00 0x00)5C 38 0x38(00 0x00)5D ]

5B[ = CS low (aktiv)

5C = start Daten Paar
82 0x82 MOSI Daten
00 0x00 MISO Daten

5D ] = CS high (inaktiv)

trilu

Hatte gerade noch eine Idee :-)

Schau mal in den RF12demo sketch - das ist in der main loop sowas hier:
  if (rf12_recvDone()) {
    byte n = rf12_len; <----hier wird die länge betrachtet, also wieviele bytes empfangen. lt "kleiner" ist das aber der schaltbefehl
    if (rf12_crc == 0)
      Serial.print("OK");
    else { <---- da kein valid string laufen wir hier in die else
      if (quiet) <-- quiet ist nicht gesetzt, weil ja 0q
        return;
      Serial.print(" ?");
      if (n > 20) // print at most 20 bytes if crc is wrong
        n = 20; <--- das stimmt in unserem fall nicht, weil ja lt "kleiner" 04 oder 05 kommt
    }
    if (useHex) <--- hast du nicht gesetzt
      Serial.print('X');
    if (config.group == 0) { <--- aber das hier 0g
      Serial.print(" G");
      showByte(rf12_grp);
    }
    Serial.print(' ');
    showByte(rf12_hdr); <-- hier wird von deinem string das erste byte angezeigt, also die 01
    for (byte i = 0; i < n; ++i) { <-- hier wird durch den payload gesteppt, wir erinnern uns; n=04 oder 05 - deshalb werden auch nicht mehr bytes angezeigt
      if (!useHex) <-- haste nicht
        Serial.print(' '); <-- immer schön ein blank zwischen den payload bytes
      showByte(rf12_data); <--- hier ist alles ab der 04 oder 05 drin :-)
    }
    Serial.println();


Was du mal testen kannst ist ein quick hack -    

showByte(rf12_hdr);
Serial.print(' ');
showByte(rf12_len);
for (byte i = 0; i < 10; ++i) { <-- kannst statt der 10 auch mal 15 testen.

Dann bekommst du die restlichen bytes angezeigt
Schöner einbauen können wir auch später....

ohweh

Bin noch da ;-) Kämpfe aber gerade noch mit den Register-Settings, ist ein bisschen mühselig die alle aus dem SPI-Log rauszufummeln.

@Kleiner: Danke für die Anleitung! Die schau ich mir gleich nochmal genauer an.

@Trilu: Der Empfang ist noch nicht so richtig stabil. Nach dem Reset muss ich mitunter 10x "schalten" bevor ich ein Paket empfange. Anschliessend geht's dann aber "einigermassen" gut. Sieht so aus als müssten wir an den RF12-Settings noch was schrauben... Ich unterbreche das jetzt erstmal und stricke den RF12demo Sketch so um, wie Du's gerade beschrieben hast. Mal sehen was wir da gleich zu sehen kriegen.

Jungs, ehrlich, das macht Spass hier ;-)

/Oliver

trilu

Ach ja, du musst nicht auf 0g gehen :-)
212 ist ok, weil ja mit der änderung im sketch das längenbyte geklärt ist.
Ja, macht mir auch spass!