FSK mit dem SIGNALDuino

Begonnen von Ralf9, 22 Dezember 2019, 17:30:36

Vorheriges Thema - Nächstes Thema

Ralf9

#60
Die LaCrosse Nachrichten beginnen mit 9.

Hier ist das Message Format und die CRC beschrieben
https://github.com/heliflieger/a-culfw/blob/master/culfw/clib/lacrosse.c

Dies ist das LaCrosse Modul: 36_LaCrosse.pm

Hier wird die Wandlung ins LaCrosse Format beschrieben: 36_Jeelink.pm

Wenn wir dann für jedes Protokoll eine neue Protokoll Id nehmen, können dort die notwendigen Info eingetragen werden.
Z.B:
"100" => ## Lacrosse
{
name          => 'Lacrosse',
id            => '100',
DataRate      => '17257.69',
Sync          => 'd42d ',
format        => '2-FSK',
match         => '^9.*',   # fuer eine regexp Pruefung am Anfang vor dem method Aufruf
clientmodule  => 'LaCrosse',
method        => \&main::SIGNALduino_LaCrosse,
}


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

Ralf9

Im Datenblatt des cc1101 steht unter "Data FIFO" folgendes:
The number of bytes in the RX FIFO and TX FIFO can be read from the status registers RXBYTES.NUM_RXBYTES and TXBYTES.NUM_TXBYTES respectively.
If a received data byte is written to the RX FIFO at the exact same time as the last byte in the RX FIFO is read over the SPI interface,
the RX FIFO pointer is not properly updated and the last read byte will be duplicated.
To avoid this problem, the RX FIFO should never be emptied before the last byte of the packet is received.

For packet lengths less than 64 bytes it is recommended to wait until the complete packet has been received before reading it out of the RX FIFO.
If the packet length is larger than 64 bytes, the MCU must determine how many bytes can be read from the RX FIFO (RXBYTES.NUM_RXBYTES-1).
The following software routine can be used:

1.)  Read  RXBYTES.NUM_RXBYTES
repeatedly at a rate specified to be at least
twice that of which RF bytes are received
until the same value is returned twice;
store value in n.

2.) If n < # of bytes remaining in packet, read n-1 bytes from the RX FIFO.

3.) Repeat steps 1 and 2 until n = # of bytes remaining in packet.

4.)   Read the remaining bytes from the RX FIFO.


Weiß jemand wie dies "The following software routine can be used:" zu verstehen ist?
Es müsste doch ausreichen "RXBYTES.NUM_RXBYTES-1" Bytes aus dem FIFO auszulesen.

Das dürfte dann auch bedeuten, wenn zum Analisieren von unbekannten Protokollen kein sync verwendet wird, daß dann jeweils nur "RXBYTES.NUM_RXBYTES-1" Bytes aus dem FIFO ausgelesen werden dürfen.

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

Ralf9

Ich habe es jetzt bei mir im Signalduino Modul soweit eingebaut, daß die Daten im Log ausgegeben werden.
"100" => # Lacrosse
{
name            => 'Lacrosse',
id              => '100',
knownFreqs      => '868.3',
datarate        => '17257.69',
sync            => '2DD4',
modulation      => '2-FSK',
match           => '^9.*',   # fuer eine regexp Pruefung am Anfang vor dem method Aufruf
clientmodule    => 'LaCrosse',
method        => \&main::SIGNALduino_LaCrosse,
}



2020.01.04 20:50:35.650 4 : sduinoRXB/msg READ: MN;D=9FE64331ECAAAA0000BFEE54;
2020.01.04 20:50:35.650 4 : sduinoRXB: Found 2-FSK Protocol id 100 -> Lacrosse
2020.01.04 20:50:35.650 4 : sduinoRXB LaCrosse: ID=100, addr=63 temp=24.3, hum=49 bat=0 batInserted=128

2020.01.04 20:54:08.105 4 : sduinoRXB/msg READ: MN;D=926646B1BDAAAA0000CF5F7F;
2020.01.04 20:54:08.105 4 : sduinoRXB: Found 2-FSK Protocol id 100 -> Lacrosse
2020.01.04 20:54:08.105 4 : sduinoRXB LaCrosse: ID=100, addr=9 temp=24.6, hum=49 bat=128 batInserted=128

2020.01.04 20:56:41.257 4 : sduinoRXB/msg READ: MN;D=95A653316BAAAA00000FAD2A;
2020.01.04 20:56:41.257 4 : sduinoRXB: Found 2-FSK Protocol id 100 -> Lacrosse
2020.01.04 20:56:41.257 4 : sduinoRXB LaCrosse: ID=100, addr=22 temp=25.3, hum=49 bat=0 batInserted=128


Mir ist dabei aufgefallen, daß das new battery Bit immer gesetzt ist. Dauert dies nach einem Batteriewechsel länger (ca wie lange) bis das new battery Bit gelöscht wird?


Es fehlt noch die CRC Berechnung.
Hier ist die Arduino CRC Routine:
https://github.com/heliflieger/a-culfw/blob/master/culfw/clib/lacrosse.c

Kann mir diese Routine jemand nach Perl umschreiben?
Die Daten sind in $dmg gespeichert
z.B.
$dmsg = "926646B1BDAAAA0000CF5F7F";

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

Ralf9

Der Empfang von KoppFreeControl funktioniert bei mir jetzt auch.
Damit auch der Dispatch funktioniert musste ich im 14_CUL_WS.pm Modul den Match Eintrag ändern, sonst wurde ein CUL_WS Sensor angelegt.
von
$hash->{Match}     = "^K.....";
nach
$hash->{Match}     = "^K[A-Fa-f0-9]{5,}";


Dies ist die neue Protokoll ID
"102" => # Kopp
{
name            => 'KoppFreeControl',
id              => '102',
datarate        => '4785.5',
sync            => 'AA54',
modulation      => 'GFSK',
match           => '^0.*',   # fuer eine regexp Pruefung am Anfang vor dem method Aufruf
clientmodule    => 'Kopp',
method        => \&main::SIGNALduino_KoppFreeControl,
}


2020.01.05 01:09:54.504 4 : sduinoD/msg get raw: MN;D=07FA5E1721CC0F02FE000000000000;
2020.01.05 01:09:54.504 4 : sduinoD: Found GFSK Protocol id 102 -> KoppFreeControl
2020.01.05 01:09:54.504 4 : sduinoD KoppFreeControl: dmsg=07FA5E1721CC0F02FE000000000000 anz=8 checksum=254 ok
2020.01.05 01:09:54.504 4 : sduinoD ParseMN: ID=102 dmsg=kr07FA5E1721CC0F02
2020.01.05 01:09:54.504 4 : sduinoD Dispatch: kr07FA5E1721CC0F02, dispatch
2020.01.05 01:09:54.504 2 : KOPP_FC_Parse: name: sduinoD code: FA5E 21 Specialkey:short
2020-01-05 01:09:54.506 KOPP_FC culfsk on


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

Ralf9

ZitatEs fehlt noch die CRC Berechnung.
Hier ist die Arduino CRC Routine:
https://github.com/heliflieger/a-culfw/blob/master/culfw/clib/lacrosse.c

Kann mir diese Routine jemand nach Perl umschreiben?
Die Daten sind in $dmg gespeichert
z.B.
$dmsg = "926646B1BDAAAA0000CF5F7F";

Es wäre schön, wenn ich eine Info bekommen könnte ob mir das jemand umschreiben kann, sonst frage ich wo anders.

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

plin

Zitat von: Ralf9 am 05 Januar 2020, 11:59:03
Es wäre schön, wenn ich eine Info bekommen könnte ob mir das jemand umschreiben kann, sonst frage ich wo anders.
Gruß Ralf
sorry, Java ist nicht mein Ding. Da fehlen mir noch ca. 300 Seiten im Java für Dummies ...
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

Ralf9

Ist nicht Java, es ist c oder c++
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

plin

Zitat von: Ralf9 am 05 Januar 2020, 14:18:29
Ist nicht Java, es ist c oder c++
c++ für Dummies steht auch noch im Regal ...

Hast Du eine Formel für mich? Das könnte bei der Interpretation helfen.
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

pejonp

Zitat von: Ralf9 am 05 Januar 2020, 11:59:03
Es wäre schön, wenn ich eine Info bekommen könnte ob mir das jemand umschreiben kann, sonst frage ich wo anders.

Gruß Ralf
Hallo Ralf,

so mal auf die schnelle, aber schau mal bitte in die 14_SD_WS09.pm. Da ist diese Funktion enthalten.


  sub SD_WS09_CRCCHECK($) {
       my $rawData = shift;
       my $datacheck1 = pack( 'H*', substr($rawData,2,length($rawData)-2) );
       my $crcmein1 = Digest::CRC->new(width => 8, poly => 0x31);
       my $rr3 = $crcmein1->add($datacheck1)->hexdigest;
       $rr3 = sprintf("%d", hex($rr3));
       Log3 "SD_WS09_CRCCHECK", 4, "SD_WS09_CRCCHECK :  raw:$rawData CRC=$rr3 " ;
       return $rr3 ;
    }


Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

Ralf9

Das bedeutet dann, daß das "use Digest::CRC qw(crc);" dem Signalduino Modul zugefügt werden muß, das wollte ich eigentlich vermeiden.
Ich würde es gerne mit dieser Routine machen.
Ich verstehe nicht ganz was diese Routine macht, ist dieses Prinzip irgendwo beschrieben?
static uint8_t CalculateCRC(uint8_t *data, uint8_t len) {
  uint8_t i, j;
  uint8_t res = 0;
  for (j = 0; j < len; j++) {
    uint8_t val = data[j];
    for (i = 0; i < 8; i++) {
      uint8_t tmp = (uint8_t)((res ^ val) & 0x80);
      res <<= 1;
      if (0 != tmp) {
        res ^= 0x31;
      }
      val <<= 1;
    }
  }
  return res;
}
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

plin

Hi Ralf,

kennst Du Input/Output der Routine? Dann hilft Dir evtl. ein Abgleich mit der hier http://billauer.co.il/blog/2011/05/perl-crc32-crc-xs-module/.

Ciao, Peter
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

Ralf9

dies ist der Input:
90264430DAAAAA00000BCAB2
90264430DAAAAA00001A37A6
90264431EBAAAA00001422D5
91264632FAAAAA000032387C
91264632FAAAAA000027F65C

Ich werde es selber versuchen ob ich es hinbekomme, die c++ Routine nach Perl umzuschreiben.

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

Ralf9

damit funktioniert es, habe es in einem online Perl Compiler getestet.
my $len = 4;
my $i;
my $j;
my $tmp;
my $val;
my $res = 0;
my $dms = "90264431EBAAAA00001422D5";
my @data = ();
for ($i=0; $i<5; $i++ ) {
    push(@data,hex(substr($dms,$i*2,2)));
}
print "data=@data\n";

  for ($j = 0; $j < $len; $j++) {
    $val = $data[$j];
    for ($i = 0; $i < 8; $i++) {
      $tmp = ($res ^ $val) & 0x80;
      $res <<= 1;
      $res = $res & 0xFF;
      if ($tmp != 0) {
        $res ^= 0x31;
      }
      $val <<= 1;
    }
  }
  print "res=$res\n";


Nun fehlt im Signalduino Modul noch das
set sduino  LaCrossePairForSec <seconds_active> [ignore_battery]
Dann müsste das LaCrosse mit dem 36_LaCrosse.pm Modul funktionieren
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

Ralf9

#73
ich kann noch raw Nachrichten vom CUL in den Native Modes 1-3 gebrauchen:
Von den normalen Sensoren mit Temperatur und Feuchtigkeit und und nur einem festen Kanal, benötige ich keine, da habe ich den TX29 DTH-IT

Der Mode 1 kann eingestellt werden z.B. mit
set mycul raw Nr1

Die Nachrichten sehen ungefähr so aus, dabei ist N01 der Mode 1, N02 der Mode 2
N019366492F99AAAA0000004008

u.a. kann ich noch raw Nachrichten gebrauchen von folgenden Lacrosse Temperatursensoren

- Sensor mit 2 Kanälen: raw Nachrichten von beiden Kanälen
- Sensor mit 2 Temperaturen: raw Nachrichten von beiden Temperaturen

es sind auch u.a. folgende RAW-Nachrichten interessant
- Mode 3 - PCA 301
- WS 1600 (TX22)




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

pejonp

Hallo Ralf,

wollte Ihr die anderen Sensoren Wh24,WH25,usw. (siehe https://forum.fhem.de/index.php/topic,93280.msg859226.html#msg859226) auch einbinden. Senden alle FSK.

Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect