HomeMatic mit RFM69

Begonnen von ulli, 14 Februar 2016, 11:24:00

Vorheriges Thema - Nächstes Thema

ulli

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 :)

Jared

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

ulli

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}
  };

sash.sc

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 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

DeepCore

Hallo Ulli,

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

Zitat von: ulli am 21 November 2016, 21:24:22

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

ulli

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)