Autor Thema: HomeMatic mit RFM69  (Gelesen 3700 mal)

Offline ulli

  • Sr. Member
  • ****
  • Beiträge: 558
HomeMatic mit RFM69
« am: 14 Februar 2016, 11:24:00 »
Hallo zusammen,

ich habe einige Tage investiert um HomeMatic auf dem RFM69 Modul mit Hilfe des CUL_HM.pm Modules zum Laufen zu bekommen.
Da ich es ohne die Hilfe des Forums nie hinbekommen hätte möchte ich im folgenden die Konfiguration teilen:

Das Protokoll:
   Deviation: 20 kHz
   Datarate: 10 kBaud
   Modulation: 2-FSK, kein Manchester-Codec
   RF frequency: 868.3 MHz
   Preamble: 4 bytes
   SyncWords: 0xE9 0xCA 0xE9 0xCA (4 bytes)
   PayloadLength: 30 bytes

der CC1101 verwendet DataWhitening und CRC 16 bits. Dies Unterscheiden sich aber zu den des RFM69 und müssen daher in SW realisiert werden.
Der Code ist dafür wie folgt:
// Thread HomeMatic - PN9 sequence used for data whitening by the CC110x
// initialize with key = 0xff and carry = 0b1
void xOr_PN9(uint8_t *buf, uint8_t len) {

uint8_t bit_five, bit_zero, carry_new;
uint8_t key = 0xFF; // initialize value
uint8_t carry = 1; // initialize value

  for (uint8_t i = 0; i < len; i++) {
buf[i] ^= key; //xor

// PN9 Key generation to get next Key for xOr
for(uint8_t b = 0; b < 8; b++) {
bit_five = (key & (1 << 5)) >> 5;
bit_zero = (key & (1 << 0)) >> 0;
carry_new = bit_five ^ bit_zero;
key >>= 1;
key |= (carry << 7);
carry = carry_new;
}
  }
}

// Thread HomeMatic - CRC Algorythmus used by the CC110x
// according to TI appnote DN502
uint16_t calcCRC16hm (uint8_t *data, uint8_t length) {
uint8_t i, i1, bte;
uint16_t checksum = 0xffff;

for (i=0; i < length; i++) {
bte = data[i];
for (i1=0; i1 < 8; i1++) {
if (((checksum & 0x8000) >> 8) ^ (bte & 0x80))
checksum = (checksum << 1) ^ 0x8005;
else
checksum = (checksum << 1);
bte <<= 1;
}
}
return checksum;
}

Zusätzlich gibt es ein xOr auf die Daten, welche wie folgt aus sieht
für TX:
// HomeMatic specific "crypt"
ctl = data[2];
  data[1] = (~data[1]) ^ 0x89;
  for (l = 2; l < data[0]; l++)
    data[l] = (data[l-1] + 0xdc) ^ data[l];
  data[l] = data[l] ^ ctl;

für RX:
// HomeMatic specific "crypt"
last_enc = data[1];
data[1] = (~data[1]) ^ 0x89;
for (l = 2; l < data[0]; l++) {
this_enc = data[l];
data[l] = (last_enc + 0xdc) ^ data[l];
last_enc = this_enc;
}
data[l] = data[l] ^ data[2];

Evtl. hilft es euch den Einstieg in die HomeMatic Welt schneller als ich zu bekommen :)
FHEM auf Beaglebone Black mit Debian.
1x Jeenode (433MHz): IR send/receive; Baumarkt Funksteckdosen HX2262 send/receive; LEDs
1x Jeenode (868MHz): FS20 send/receive; 2x Heizungsthermostate ETH200 comfort; 2x LaCrosse Temperatursensoren (send)/receive; Piezo Summer für akustische Rückmeldung

Jared

  • Gast
Antw:HomeMatic mit RFM69
« Antwort #1 am: 06 November 2016, 12:41:13 »
Hallo Ulli,

wärst du bereit, deine Register Settings für den RFM69 zu teilen? Versuche derzeit ebenfalls, HM mit dem Modul zu empfangen, aber so recht will es noch nicht. Bei der Recherche bin ich gerade über deinen Thread gestolpert und hoffe, den Weg etwas verkürzen zu können. :o)

Viele Grüße, Jared

Offline ulli

  • Sr. Member
  • ****
  • Beiträge: 558
Antw:HomeMatic mit RFM69
« Antwort #2 am: 21 November 2016, 21:24:22 »
Servus Jared,

entschuldige die späte Antwort, hatte nur noch nicht die Gelegenheit dazu.
Anbei meine Config für den RFM69 und dem Homematic Protocol:
  const byte RFM69_CONFIG_HomeMatic[][2] =
  {
  //* 0x00 */ Fifo
/* 0x01 */ { REG_OPMODE, RF_OPMODE_SEQUENCER_ON | RF_OPMODE_LISTEN_OFF | RF_OPMODE_STANDBY }, //Sequencer on | Standby Mode
  /* 0x02 */ { REG_DATAMODUL, RF_DATAMODUL_DATAMODE_PACKET | RF_DATAMODUL_MODULATIONTYPE_FSK | RF_DATAMODUL_MODULATIONSHAPING_00 }, //no shaping
  /* 0x03 */ { REG_BITRATEMSB, RF_BITRATEMSB_10000},
    /* 0x04 */ { REG_BITRATELSB, RF_BITRATELSB_10000},
   
    /* 0x05 */ { REG_FDEVMSB, RF_FDEVMSB_20000}, //default:5khz, (FDEV + BitRate/2 <= 500Khz) /FDEV = frequency deviation
    /* 0x06 */ { REG_FDEVLSB, RF_FDEVLSB_20000}, // rfm12 90kHz Deviation -> (90kHz + 17,24kbps/2) <= 500kHz i.O.
 
    /* 0x07 */ { REG_FRFMSB, 0xD9 }, //FRF_MSB }, //868,3 MHz
    /* 0x08 */ { REG_FRFMID, 0x13 }, //FRF_MID },
    /* 0x09 */ { REG_FRFLSB, 0x33 }, //FRF_LSB },   

/* Receiver Registers */
/* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_20 | RF_RXBW_EXP_2 }, //(BitRate < 2 * RxBw) -> (17,24kbs < 2* rfm12 166,7 kHz


/* IRQ and Pin Mapping */
/* 0x25 */ { REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01 }, //DIO0 is the only IRQ we're using
/* 0x26 */ { REG_DIOMAPPING2, RF_DIOMAPPING2_CLKOUT_OFF }, //ClockOut
/* 0x28 */ { REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN }, // Writing to this bit ensures the FIFO & status flags are reset
    /* 0x29 */ { REG_RSSITHRESH, 0xE4 /*MAX*/ }, //(97*2) rfm -91dBm //must be set to dBm = (-Sensitivity / 2) - default is 0xE4=228 so -114dBm

/* Packet Engine Registers */
/* 0x2C */ { REG_PREAMBLEMSB, RF_PREAMBLESIZE_MSB_VALUE },
/* 0x2D */ { REG_PREAMBLELSB, 3 }, // Homematic 4 Sync Words. TX already has AA in the SyncWord
/* 0x2E */ { REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_5 | RF_SYNC_TOL_0 },
/* 0x30 */ { REG_SYNCVALUE1, 0xAA },
    /* 0x30 */ { REG_SYNCVALUE2, 0xE9 }, //NETWORK ID HomeMatic 0xE9 0xCA (twice)
/* 0x30 */ { REG_SYNCVALUE3, 0xCA },
    /* 0x30 */ { REG_SYNCVALUE4, 0xE9 },
/* 0x30 */ { REG_SYNCVALUE5, 0xCA },   

    //* 0x31 - 0x36 */ possible SyncValues
    /* 0x37 */ { REG_PACKETCONFIG1, RF_PACKET1_FORMAT_FIXED | RF_PACKET1_DCFREE_OFF |
    RF_PACKET1_CRC_OFF | RF_PACKET1_CRCAUTOCLEAR_OFF |
    RF_PACKET1_ADRSFILTERING_OFF },
    /* 0x38 */ { REG_PAYLOADLENGTH, RFM69_PROTOCOL_HOMEMATIC_PAYLOADLENGTH},
  /* 0x3C */ { REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY | /*0x7F=MAX*/ RF_FIFOTHRESH_VALUE }, //TX on FIFO not empty
    /* 0x3D */ { REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_NONE | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF }, //RXRESTARTDELAY must match transmitter PA ramp-down time (bitrate dependent)
 
    /* 0x6F */ { REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA0 }, // run DAGC continuously in RX mode, recommended default for AfcLowBetaOn=0   
    {255, 0}
  };
FHEM auf Beaglebone Black mit Debian.
1x Jeenode (433MHz): IR send/receive; Baumarkt Funksteckdosen HX2262 send/receive; LEDs
1x Jeenode (868MHz): FS20 send/receive; 2x Heizungsthermostate ETH200 comfort; 2x LaCrosse Temperatursensoren (send)/receive; Piezo Summer für akustische Rückmeldung

Offline sash.sc

  • Hero Member
  • *****
  • Beiträge: 1623
Antw:HomeMatic mit RFM69
« Antwort #3 am: 17 Dezember 2016, 20:34:40 »
Hallo zusammen.

Lese ich das richtig ???
HomeMatic empfangen und sende mit nem RFM69 Modul ???

Der Code, der hier geschrieben wurde, wo muss dieser eingefügt werden? Oder ist der schon per FHEM Update verteilt worden ???

Gruß und Danke
Sascha

Raspi 2 ; LaCrosse; HomeMatic; 1x TX 29 als Lichtsensor umgebaut;
ESP8622 ;nanoCUL a-fw (433 & 868 MHz); miniCULwlan;
WLANduino 433&868 ; WlanCul

Offline DeepCore

  • New Member
  • *
  • Beiträge: 3
Antw:HomeMatic mit RFM69
« Antwort #4 am: 29 November 2018, 10:07:21 »
Hallo Ulli,

basiert Deine Config auf den Macros von LowPowerLabs' RFM69 Bibliothek?


Anbei meine Config für den RFM69 und dem Homematic Protocol:
const byte RFM69_CONFIG_HomeMatic[][2] =
{
    ...
};

Was für Werte hast Du denn in den 2 folgenden Macros?
RF_BITRATEMSB_10000
RF_BITRATELSB_10000

Offline ulli

  • Sr. Member
  • ****
  • Beiträge: 558
Antw:HomeMatic mit RFM69
« Antwort #5 am: 30 November 2018, 09:37:58 »
Hallo,

ja die Basis war glaube ich LowPowerLabs.

Die Definitionen sind folgende
#define RF_BITRATEMSB_10000   0x0C  // HomeMatic 10kbps (9993bps)
#define RF_BITRATELSB_10000   0x80 // HomeMatic 10kbps (9993bps)
FHEM auf Beaglebone Black mit Debian.
1x Jeenode (433MHz): IR send/receive; Baumarkt Funksteckdosen HX2262 send/receive; LEDs
1x Jeenode (868MHz): FS20 send/receive; 2x Heizungsthermostate ETH200 comfort; 2x LaCrosse Temperatursensoren (send)/receive; Piezo Summer für akustische Rückmeldung

 

decade-submarginal