unbekanntes Funkprotokoll Eberle Instat 868-r1

Begonnen von DerD, 23 Dezember 2021, 17:20:41

Vorheriges Thema - Nächstes Thema

elektron-bbs

Mich machte schon in deiner ersten Nachricht stutzig, das da so viele Nullen in Folge, dann Einsen und wieder Nullen die Präambel sein sollen. Bei 2-FSK ist als Präambel eigentlich ein mehrmaliger Bitwechsel üblich, wie z.B. 0xAAAAAAAA.

Dann schreibst du etwas später:

ZitatHier noch in SD-Notation:
P0=-4250;P1=2560;P2=-2570;P3=736;P4=-1080;P5=-378;P6=358;P7=-746 D=01234356567356565676565653565656765656565373565

Das deutet auf eine sehr niedrige Datenrate hin. Diese großen Puls-/Pausezeiten kenne ich eigentlich eher bei ASK/OOK.
Intel(R) Atom(TM) CPU N270 mit 2 SIGNALduino nanoCC1101 + ESPEasy 2x serial server SIGNALduino nanoCC1101, Raspberry Pi 2 mit 2 CUL Stackable CC1101, Raspberry Pi 3 mit SIGNALduino radino + nano328 + 2 x SIGNAL-ESP CC1101 + LaCrosseGateway

DerD

Ja, das war ein Protokoll mit neuer Softwarerevision. Ich habe zwischenzeitlich auch welche mit alter Softwarerev, aber da ist der Frequenzshift deutlich kleiner, und damit bekomme ich über URH die Signale fast nicht mehr aus dem Rauschen heraus. Das mag aber an meinen nicht ganz optimierten Parametern oder auch dem SDR liegen.

Aber ich stimme dir voll zu, diese Art an Protokoll entspricht nicht dem, was man für FM erwartet, speziell der eigentlich fehlende Synchronisationszyklus. Hat mich am Anfang auch stark verwirrt. Ist es aber mit Sicherheit. Das ist ja das schöne am SDR, dass man es mit eigenen Augen sehen kann. Übrigens auch der kleinere Frequenzshift, die beiden "Hörner" liegen da ziemlich nahe beieinander.

Die "000" oder -1080 ist aber in beiden Fällen der Übergang zum eigentlichen Datenpaket. Ich glaube, was davor kommt ist dem Empfänger relativ egal. Und für die paar Bit braucht es ja auch keine hohe Datenrate. Zwischenzeitlich hatte ich auch schon die Vermutung, das Protokoll ist, eventuell sogar bewusst, unnötig verkompliziert worden ohne aber richtige Verschlüsselung zu nutzen.

Hardwaretechnisch wird das ganze Protokoll übrigens komplett vom Controller erzeugt, also inkl. Manchestercodierung und Präambel. Der Sender ist ein TDK/TDA5100, also Steinzeittechnik gegenüber einem CC1101.
Gruß,
Dieter

DerD

Aktualisierter Zwischenstand: ich habe mir bisher vergeblich an der Methode zur Prüfsumme die Zähne ausgebissen. Es ist ein XOr und doch nicht. Irgeneine Komplikation ist noch einprogrammiert die ich nicht durchschaue. Nur falls noch jemand reinschaut und eine Idee hat. Ansonsten packe ich bei Gelegenheit die ausgelesenen Werte von 10 IDs zusammen, und man kann halt die Sensornummer nicht frei wählen sondern nur aus der gegebenen Anzahl wählen.
Ich hätte nicht gedacht, dass man 3 Hexzahlen so kompliziert verrechnen kann.

Die folgende Tabelle enthält Codes aus dem Lernmodus. Das fixiert einen Teil der Werte, und nur die ersten 3 variieren. Es geht "nur" darum die Methode zu bestimmen wie das letzte Nibble (Prüfsumme) gebildet wird. XOr passt nur bei den Werten des ersten Blocks. Wäre überglücklich zu Hinweisen bei den anderen.


000C54
002C56
004C50
006C52
008C5C
00AC5E
00CC58
00EC5A

050C5E
052C5D
054C58
056C5A
058C54
05AC56
05CC53
05EC50

0A0C5E
0A2C5D
0A4C58
0A6C5A
0A8C53
0AAC51
0ACC57
0AEC55
Gruß,
Dieter

Ralf9

FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

DerD

Hallo Ralf,
Ja, habe mit Reveng einiges rumprobiert, aber auch CRC bringt nicht mehr Ergebnisse als XOr.


./reveng -w 4 -s 000C54 0013AA 002C56 0033A8 004C50
width=4  poly=0x5  init=0xc  refin=false  refout=false  xorout=0x0  check=0x8  residue=0x0  name=(none)
width=4  poly=0xb  init=0x2  refin=false  refout=false  xorout=0x0  check=0xf  residue=0x0  name=(none)



/reveng -w 4 -s 050C5E 052C5D 054C58
./reveng: warning: you have only given 3 samples
./reveng: warning: to reduce false positives, give 4 or more samples
width=4  poly=0x3  init=0xd  refin=true  refout=true  xorout=0x0  check=0x9  residue=0x0  name=(none)

./reveng -w 4 -s 050C5E 052C5D 054C58 056C5A
./reveng: no models found


Was ich so gar nicht verstehe, die Prüfsummer von 000C54 nach 002C56 ändert sich um 2, ebenso bei vielen anderen. Nicht immer 2, aber eigentlich immer gerade.
Von 050C5E nach 052C5D ändert sie sich aber nur um 1. Eigentlich kann das doch gar nicht sein.
Gruß,
Dieter

Ralf9

Hast Du auch schon mal versucht ob es bei der Prüfsumme weiterhilft, wenn Du die Hexdaten invertierst?

Hast Du wegen dem Protokoll des "Eberle Typ Instat 868-r1" und der Prüfsumme auch schon woanders gefragt?
z.B.
https://stackoverflow.com
https://www.mikrocontroller.net

evtl findet sich dort jemand der es auch schon mit dem Protokoll versucht hat
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

DerD

Invertieren? Also "0" => "F" etc? Habe ich mal gemacht, um festzustellen dass es bei XOR exakt das gleiche Ergebnis bringt. was eigntlich logisch ist.
Ein Reversen der Bits innerhalb eines Nibbles habe ich nicht gemacht. Da aber "05xxx" das gleiche Ergebnis bringt wie "0Axxx" macht ja keinen Sinn.

Ja klar, Anfragen gibt es in MC, Stockoverflow/ReverseEngineering und auch in github/RTL_433. Bisher alles ohne Erfolg. Möglicherweise meldet sich im Laufe der Jahre da mal jemand :)
Gruß,
Dieter

DerD

Ich glaube, ich habe das Rätsel geknackt. Problem war nicht der Prüfcode, sondern schon die Decodierung. Meine ursprüngliche Annahme mit Manchestercode war nur teilweise richtig, da "differentieller Manchester" verwendet wird. Daraus erklären sich dann auch die Muster, die keinen richtigen Sinn ergaben und auch die Codes vereinfachen sich.
Das ganze in URH als eigenen Decoder zusammengebastelt erhalte ich nun konsistente Ergebnisse.

Herausgefunden habe ich es tatsächlich nur deshalb, weil an Sendern mit Display die SenderID bzw. Raumnummer manuell einstellbar und inkrementierbar ist. Danach war der Rest ganz einfach.


868MHz, 2-FSK Modulation, low frequency "0", high frequency "1"
immer als 3-fache Wiederholung

Rohdaten: 82 Bit

xxxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
00000000000011111110000000 11 000101010101010101010101010101010101010101010101010101
|<-- Preamble         -->| | ?? ||<- data                                        ->|

Decodierung: differential Manchester
eigentlicher Datensatz beginnt nach "000", "01" und "10" in erweiterten Präambel erzeugen zusätzlichen Overhead


DeCodiert: 30 Bit

111111010101010101010101010101
|    ||<- data             ->|
  /\
  ||
Overhead


Generell:30 Bit, 6Bit Overhead, 24 Bit Daten in 6 Nibbles LSB
"1000" => 1
"0100" => 2
"1100" => 3

xxxx  xxxx  xxxx  xxxx  xxxx  xxxx
0123  0123  0123  0123  0123  0123

  ||    ||    ||    ||    ||    ||
  ||    ||    ||    ||    ||    ||
  ||    ||    ||    ||    ||    ||
  ||    ||    ||    ||    ||    \/
  ||    ||    ||    ||    ||   Prüfcode 0-F
  ||    ||    ||    ||    ||
  ||    ||    ||    ||    \/
  ||    ||    ||    ||   Zähler 0-F
  ||    ||    ||    ||
  ||    ||    ||    \/
  ||    ||    ||   Actioncode 0-F
  ||    ||    \/
  ||    ||    ID2, 0-F, zufällige Änderung bei jedem Lernen
  ||    ||
  ||    \/             
  ||    ID1, 0-F, zufällige Änderung bei jedem Lernen
  ||   
  \/             
ID0, 0-F, zufällige Änderung bei jedem Lernen


Actioncodes:
A: Lernen
9: Reset
7: An
0: Aus

Zähler:
einfaches Hochzählen um "1" für jede Aktion
Ausnahme: bei Actionscode "A" bleibt Zähler konstant

Prüfcode:
Berechnung: 15 - ((Summe Nibbles 1-5) mod 15)
Validity Check: Summe Nibbles 1-6 mod 15 = 15

Lernen:
xxx81x, gesendet im 6 Sekunden Takt

Reset: Sequenz des Actioncodes
9/0/7/0/7/0/7/0/0

xxx91x
xxx02x
xxx73x
xxx04x
etc.

Gruß,
Dieter

Ralf9

Hast Du Dich schon mit der Umwandlung von normalem Manchester in Differential Manchester befasst?

Funkbus verwendet auch Differential Manchester
https://forum.fhem.de/index.php/topic,127189.msg1217330.html#msg1217330
https://github.com/merbanan/rtl_433/blob/master/src/devices/funkbus.c

Ich hab mal eine vom sduino empfangene Manchester Funkbus Nachricht von Hand in Differential Manchester umgewandelt:

0110001010110000110000001000101011101010010100111
1 durch X ersetzen
0XX000X0X0XX0000XX000000X000X0X0XXX0X0X00X0X00XXX
0 durch zo (01) ersetzen
zoXXzozozoXzoXzoXXzozozozoXXzozozozozozoXzozozoXzoXzoXXXzoXzoXzozoXzoXzozoXXX
X durch oz (10) ersetzen
zoozozzozozoozzoozzoozozzozozozoozozzozozozozozoozzozozoozzoozzoozozozzoozzoozzozoozzoozzozoozozoz
-> wandeln in Differential Manchester
zz und oo durch 0 ersetzen
z0zo0ozoz00000zo0ozozoz0zo0ozozozozoz00ozoz00000zozo00000oz0000oz0zozoz
zo und oz durch 1 ersetzen
z010110000010111010111110011000001100000100001011z


Ist recht aufwändig, geht dies auch einfacher?

Gruß Ralf

FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

DerD

Ich habe das in Calc gemacht, weil ich auch schpon Manchester hatte. Das war nicht schön, aber da muss man die Formel nur einmal zusammenbasteln und dann kopieren:

=TEIL(A2;1;1)&WENN(TEIL(A2;2;1)=TEIL(A2;1;1);"0";"1")&WENN(TEIL(A2;3;1)=TEIL(A2;2;1);"0";"1")&WENN(TEIL(A2;4;1)=TEIL(A2;3;1);"0";"1")&WENN(TEIL(A2;5;1)=TEIL(A2;4;1);"0";"1")&WENN(TEIL(A2;6;1)=TEIL(A2;5;1);"0";"1")&WENN(TEIL(A2;7;1)=TEIL(A2;6;1);"0";"1")&WENN(TEIL(A2;8;1)=TEIL(A2;7;1);"0";"1")&WENN(TEIL(A2;9;1)=TEIL(A2;8;1);"0";"1")&WENN(TEIL(A2;10;1)=TEIL(A2;9;1);"0";"1")&WENN(TEIL(A2;11;1)=TEIL(A2;10;1);"0";"1")&WENN(TEIL(A2;12;1)=TEIL(A2;11;1);"0";"1")&WENN(TEIL(A2;13;1)=TEIL(A2;12;1);"0";"1")&WENN(TEIL(A2;14;1)=TEIL(A2;13;1);"0";"1")&WENN(TEIL(A2;15;1)=TEIL(A2;14;1);"0";"1")&WENN(TEIL(A2;16;1)=TEIL(A2;15;1);"0";"1")&WENN(TEIL(A2;17;1)=TEIL(A2;16;1);"0";"1")&WENN(TEIL(A2;18;1)=TEIL(A2;17;1);"0";"1")&WENN(TEIL(A2;19;1)=TEIL(A2;18;1);"0";"1")&WENN(TEIL(A2;20;1)=TEIL(A2;19;1);"0";"1")&WENN(TEIL(A2;21;1)=TEIL(A2;20;1);"0";"1")&WENN(TEIL(A2;22;1)=TEIL(A2;21;1);"0";"1")&WENN(TEIL(A2;23;1)=TEIL(A2;22;1);"0";"1")&WENN(TEIL(A2;24;1)=TEIL(A2;22;1);"0";"1")&WENN(TEIL(A2;25;1)=TEIL(A2;24;1);"0";"1")&WENN(TEIL(A2;26;1)=TEIL(A2;25;1);"0";"1")

Da ich viele Daten nur in Manchester aber nicht mehr in Rohdaten hatte, ging es leider auch nur so.

Wenn mir das nochmal ankommt, würde ich mir aber wohl das Python-script hier dazu herannehmen https://github.com/triq-org/revdgst/blob/master/scripts/differential_manchester_decode.py.
Soweit ich mich entsinne, war meine Suche nach einem Code für Manchester=> diffManchester in Github und SE erfolglos. Das muss ja aber nicht heißen, dass ich nicht etwas dazu übersehen habe
Gruß,
Dieter

Ralf9

ZitatWenn mir das nochmal ankommt, würde ich mir aber wohl das Python-script hier dazu herannehmen https://github.com/triq-org/revdgst/blob/master/scripts/differential_manchester_decode.py.
Danke, das hilft weiter, damit wird es einfacher.

Hier ist es wahrscheinlich besser, wenn ich bei am Anfang fehlendem halben Bit ein Zeichen am Anfang entferne,
oder kann ich davon ausgehen, daß bei Differential Manchester die Rohdaten immer mit 0 anfangen?
Zitatdef differential_manchester_align(line):
    """Manchester align string by optionally prepending a half-bit."""
    hh_pos = line.find("11")
    ll_pos = line.find("00")

    if hh_pos < 0 or (ll_pos >= 0 and ll_pos < hh_pos):
        hh_pos = ll_pos

    if hh_pos % 2 == 0:
        return line
    else:
        return "0" + line
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

DerD

Zitat von: Ralf9 am 08 April 2022, 17:41:35
oder kann ich davon ausgehen, daß bei Differential Manchester die Rohdaten immer mit 0 anfangen?

Spannende Frage, die ich adhoc nicht beantworten kann. Wobei der Vorteil der differentiellen Übertragung genau darin liegt, dass Plus Minus sein kann oder umgekehrt und es damit eigentlich egal sein müsste. Gilt aber immer zur Dekodierung der Rohdaten, nicht wenn schon einfaches Manchester dekodiert wurde.

Ich habe mich mit Funkbus bisher nicht beschäftigt, für RTL_433 gibt es zumindest einen Decoder.
Gruß,
Dieter