LÖSUNG:Dekodieren Temperatur Feuchte T/H sensor von PEARL NC7427(NC7415) 433MHz

Begonnen von maxtox, 25 September 2016, 19:37:33

Vorheriges Thema - Nächstes Thema

rmax

OK, dann hier mal wie ich denke, daß es auch (und effizienter) funktionieren müßte, wenn ich Deinen Code (vor allem ReadingsVal() und das drum herum) richtig verstanden habe:


crc {
  my $s = (ReadingsVal($name,'state',''));
  my @a = split(/\s+/,$s);
  my $s = $a[1];
  my $bits = ($s>>10);
  my $CRC = ($s>>6) & 0b1111;
  my UL1=1<<35;
  my $crc = 0;
  my $i = 0;
 
  for ($i = 0; $i < 36; $i++) {
    $crc <<= 1;
    if ($bits & $UL1) {$crc |= 1};
    if ($crc & 0b0010) {$crc ^= 0b0011};
    $bits <<= 1;
  }
  return ($crc & 0b1111);
}


Es könnte sein, daß bei der Zuweisung von $s noch zusätzlich was passieren muß, damit die Daten in $s dann tatsächlich als binärer Integerwert vorliegen.

Um $bits zu setzen schiebe ich den Datenblock um 12 Bits nach rechts, CRC und Nullbytes am Ende fallen damit raus. Maskieren muß ich an der Stelle nichts, denn es bleiben ja nur die 36 Bits, die ich sehen will.

Um die empfangenen CRC-Bits zu bekommen, schiebe ich die Padding-Bits raus und maskiere die dann letzten vier Bits. Das dient hier aber nur der Illustration, denn der Wert wird in der Routine ja nicht weiter verwendet.

Das gesetzte Bit in UL1 habe ich entsprechend der Datenlänge auf die Position 35 reduziert und auch die Schleife läuft nur noch 36 Mal durch.

Ich kann das allerdings nicht testen, weil ich FHEM selber (noch) nicht einsetze.

FHEm2005

Das sieht ja richtig gut aus! Aber leider funktioniert die Prüfung noch nicht einwandfrei. Ich mach mich morgen (Do) oder am Freitag mal auf die Suche, wo der Hase begraben liegt.
Verstanden habe ich die neuen Zeilen, also beste Voraussetzungen den Fehler zu finden.

Gruß
Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

FHEm2005

Ich habe mal versucht etwas zu finden:my $s = $a[1];
Danach habe ich in $s den hex-Wert = 2E609580CBC0 oder binär = (00)1011100110000010010101100000001100101111000000. Hier fehlen bereits zwei Nullen vorneweg. Das liegt aber am Umrechnen, da werden die führenden Nullen nicht angezeigt.

Danach: my $bits = ($s>>10);Jetzt sind in $bits alles Einsen ( 111111111111111111111111111111111111111111111111111111) und die Stellenanzahl ist von 46 auf 54 angestiegen. Das lässt vermuten, dass die beiden ersten Stellen doch da waren und weil sie 0 waren, bei meiner Umrechnung nicht berücksichtigt wurden. Sind die Einsen eine Folge von Überlauf? Das shiften >> hat nochmal 8 Stellen hinzugefügt.

Keine Ahnung wieso. Ich bin kurz davor aufzugeben.

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

rmax

Keine Panik, das kriegen wir schon hin. :)

Das Problem war, daß die Daten in $a[1] noch als String aus Hex-Ziffern vorliegen, wir brauchen sie in $s aber für die Bitschieberei als numerischen Wert, was hex() für uns erledigt. Außerdem fehlte noch ein $ bei der Deklaration von UL1 und ich hatte in der Schleife noch einen Fehler.

Deshalb hier nochmal die komplette Routine:


crc {
  my $s = (ReadingsVal($name,'state',''));
  my @a = split(/\s+/,$s);
  my $s = hex($a[1]);
  my $bits = ($s>>10);
  my $CRC = ($s>>6) & 0b1111;
  my $UL1 = 1<<35;
  my $crc = 0;
  my $i = 0;

  for ($i = 0; $i < 36; $i++) {
    $crc <<= 1;
    if ($bits & $UL1) {$crc |= 1};
    if ($crc & 0b10000) {$crc ^= 0b0011};
    $bits <<= 1;
  }
  return ($crc & 0b1111);
}


Wenn ich da jetzt mangels der restlichen Infrastruktur an Stelle von $a[1] manuell den Hex-String aus Deinem letzten Post einsetze und es damit durchlaufen lasse, bekomme ich den erwarteten CRC-Wert. Mit weiteren Telegrammen habe ich es noch nicht getestet.

FHEm2005

Das sieht jetzt sehr gut aus. Beide CRC-WErte (mitgeliefert und berechnet) stimmen jetzt seit Telegrammen mehreren überein. Ich schreibe sie jetzt mal eine Zeit in ein FileLog und melde mich am Wochenende wieder.

Gruß Ebrhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

FHEm2005

Hallo rmax,
ich kann das Ergebnis schon vorzeitig bekanntgeben: Ein grßes Lob für den Programmierer!! Ich habe im Log keinen Fehler gefunden. In der Anlage habe ich die WErte der letzten Stunden aufgelistet. Zum Inhalt: Zuerst ist die ID des Thermosensensors zu finden, danach das komplette Telegramm, und am Schluss die zwei CRC-Werte (erster Wert: mitgeliefert, zweiter Wert berechnet). Der   gesamte Bereich von 0-15 erscheint im Listing.

Das wird für Jürgen eine gute Grundlage werden, diesen CRC-Check in die 14_CUL_TCM97001 einzubauen. Danke für Deine Hilfe.

Viele Grüße
Eberhard

PS: my $bits = ($s>>10);
  my $CRC = ($s>>6) & 0b1111;
  my $UL1 = 1<<35;
Diese Schreibweise wäre genaugenommen falsch, da Perl vor und hinter den logischen Operatoren Leerzeichen haben will.
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

juergs

Hallo Eberhard + rmax,

bin wieder aus dem Urlaub zurück und arbeite mich nach dem "RESET" erst wieder in das Thema ein.
Wie ich sehen konnte, seid Ihr schon sehr weit gekommen  :)
Mein Respekt dafür!

ZitatDas wird für Jürgen eine gute Grundlage werden, diesen CRC-Check in die 14_CUL_TCM97001 einzubauen
Da bin ich leider der falsche Adressat um das in ein Perlmodul von FHEM einzubauen.
Bei mir sträubt sich leider innerlich alles, um in Perl zu programmieren ...  will aber keine unnötige Diskussion darüber losbrechen ...  ;)

Was mein Ziel war, ist eine Art Zwischeninterface zu programmieren um dieses Protokoll in ein schon von FHEM bearbeitbares wie z.B. "CUL_TX" umzusetzen.

@Eberhard,
Du könntest evtl. mein Einstieg erleichtern, wenn Du Deine Vorgehensweise in ein kurzes Gesamtbild (Code) zusammensetzen könntest.
Das würde mir sehr weiterhelfen, sonst muss ich doch alles aus den Thread-Puzzleteilen zusammensetzen.

Ich muss mir die Hardware + SW leider nach einer  leidigen Win10-Neuinstallation erst wieder zusammenbauen.
Ich schaue mal was ich aus den Git-Repositories wieder verwenden kann und melde mich wieder.

Grüße,
Jürgen

FHEm2005

Hallo Jürgen,
da war ich  (mal wieder) auf dem falschen Dampfer. Ich dachte Du würdest das Modul anpassen können. Wäre es nicht einfacher und eleganter, wenn ich den "Erbauer" des Moduls 14_CUL_TCM97001 anspreche, dass er den neuen Sensor in das Modul einpflegt?

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

RaspiLED

Hi,
Und das wäre laut
version
"14_CUL_TCM97001.pm     12994 2017-01-07 07:49:53Z bjoernh"

@bjoernh: Hi Björn liest Du hier schon mit?

Gruß Arnd


Raspi2 mit FHEM, CUL, Signalduino, MySensors, HomeBridge, Presence, Bravia, ...
Raspberry Pi mit FHEM, CUL, Signalduino, MySensors, HomeBridge, Presence, WifiLight2, Bravia, ...

juergs

Hallo Eberhard,

es spricht ja nichts dagegen zweigleisig zu fahren, primär FHEM, klar.
Bei meiner Infrastruktur ist es leider so, dass die Platzierung der Sender nur
einen mäßigen Empfang ermöglichen.

Die Sensoren sind außerdem sehr gesprächig, will meinen sie senden alle 20 Sek. für 2..3 Sekunden
ihr Telegramm mit 5 Wiederholungen.
Schon bei Verwendung von zwei solcher Sensoren kann es HF-mäßig eng werden und der CRC ist für einen
Einwandfreien Empfang durchaus erforderlich. Je näher sie am CUL positioniert sind desto mehr "buttern" sie
Telegramme von anderen Sensoren zu.

@RaspiLED
danke für die Info des Maintainers: björnh.
Hoffe Björn liest mit und nimmt sich dem Thema an.

Grüße,
Jürgen

FHEm2005

Ich habe mal versucht meine Kenntnisse in eine 14_CUL_TCM97001.pm einzubauen. Fehlermeldungen bekomme ich zwar keine mehr, aber einiges läuft schräge. Die bisherigen Nicht-NC-Sensoren werden tadellos gelesen. Ich habe mit den NC7415 noch Probleme. Es wird zwar ein Unknown-Device angezeigt mit dem gesamten richtigen Telegramm, aber Readings werden keine erzeugt.

Dieses habe ich als CRC-Check hinzugefügt:
################################################
#
#    CRC-Check for Pearl NC7415(7427)
#

sub checkCRC_NC7415
{
my $msg = shift;
my @a = split("", $msg);
        my $dataBin = hex($msg);
my $bin = undef;

# Erzeugung der Binärzahl, über die die Prüfsumme berechnet werden soll
# nämlich Bit0 bis Bit36
my $data = ($dataBin >> 10); 

# Berechnung der mitgelieferten CRC-Sequenz
my $CRCCHECKVAL = ($dataBin >> 6) & 0b1111 ;

my $UL1 = 1 << 35;
my $CRC = 0;
my $i = 0;

#Berechnung der CRC-Zahl
for ($i = 0; $i < 36; $i++)
{
$CRC <<= 1;
if ($data & $UL1) {$CRC |= 1};
if ($CRC & 0b10000) {$CRC ^= 0b0011};
$data <<= 1;
}
$CRC &= 0b111;
#Vergleich der mitgelieferten CRC-Zahl ($CRCCHECKVAL) mit der berechneten CRC-Zahl ($CRC)
if ($CRC == $CRCCHECKVAL)
{
      return TRUE;
}
return FALSE;
}
 
 
sub checkValues
{
my $temp = shift;
my $humidy = shift;
if (!defined($humidy))
{
$humidy = 50;
}
if ($temp <= 60 && $temp >= -30 && $humidy >= 0 && $humidy <= 100)
{
return TRUE;
}
return FALSE;
}
[/b]


Ich weiß nicht, wie ich mir bestimmte Werte zur Fehlereingrenzung anzeigen lassen kann. Gibt des da eine Möglichkeit entweder den gewünschten Wert auf die Konsole oder in das Log zu schreiben?

Hier die Aufbereitung der Daten, wie sie in der 14_CUL_TCM97001.pm eingefügt wurden:
     #######################################################################################
#   Hinzugefuegt von Fhem2005
#   Aufbereitung der Daten von NC 7415 (7427)
#######################################################################################

if (checkCRC_NC7415($msg) == TRUE && ($readedModel eq "NC7415" || $readedModel eq "Type1" || $readedModel eq "Unknown")
|| checkCRC_Type1($msg) == TRUE && ($readedModel eq "Type1" || $readedModel eq "GT_WT_02" || $readedModel eq "Unknown"))
{

     
 
$temp  = (hex($a[3].$a[4])& 0x3C) >> 2;
$temp += ((hex($a[4].$a[5])& 0x3C) >> 2) * 16;
$temp += ((hex($a[5].$a[6])& 0x3C) >> 2) * 256;
$temp = (($temp-900)/10 - 32)*5/9;
$temp = int(10 * $temp + 0.5) / 10; 
 
$humidity = (hex($a[6].$a[7])& 0x3C) >> 2;
$humidity += ((hex($a[7].$a[8])& 0x3C) >> 2) * 16;

if ($humidity > 100)
{
# HH - Workaround
$humidity = 100;
}
elsif ($humidity < 20)
{
# LL - Workaround
$humidity = 20;
}

if (checkValues($temp, $humidity))
{
$channel = (hex($a[3]) & 0xC) >> 2;
$batbit  = (hex($a[2]) & 0x3);
$mode    = (hex($a[2]) & 0x4) >> 2;
if (checkCRC_NC7415($msg) == TRUE)
{
$model="NC7415";
}
else
{
$model="Type1";
}
  if ($deviceCode ne $idType1)  # new naming convention
{
if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/))))
{
Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model";
}
else
{
$deviceCode="CUL_TCM97001_" . $model . "_" . $channel;
}
}     
     
$def = $modules{CUL_TCM97001}{defptr}{$deviceCode};
if($def)
{
$name = $def->{NAME};
}         
if(!$def)
{
Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it";
return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode";
}
$hashumidity = TRUE;
$hasbatcheck = TRUE; 
$haschannel = TRUE;   
$hasmode = TRUE;
$packageOK = TRUE;
       
$readedModel=$model;
}
else
{
$name = "Unknown";
}
}


Soweit der aktuelle Stand bei mir. Wenn ich es schaffe Zwischenwerte auslesen zu können, könnte ich wenigsten den CRC-Check überprüfen, ob dort TRUE oder FALSE zurückgegeben wird.

Die gesamte modifizierte Datei ist als Anlage beigefügt. In der pdf-Datei, sind die Passagen markiert, die gegenüber dem Original verändert wurden.

Gruß Eberhard

Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

juergs


FHEm2005

Hallo Jürgen,

das ist nicht, dass was ich wollte. Der Links erläutert, wie ein Event geloggt werden kann. Ich möchte aber innerhalb des Pearl-Programmes bestimmte Werte aus der Progranmmierung (z.B. $CRC) in das Log schreiben oder auf die Konsole ausgeben.

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

juergs

hallo Eberhard,

ja, schade.

Ich würde es so handhaben, ohne die FHEM-Möglichkeiten zu kennen:
https://www.perl.com/pub/2002/09/11/log4perl.html
Lässt sich einfach installieren, konfigurieren und anwenden ...

Jürgen

FHEm2005

Hallo Jürgen,

geht ganz einfach:

Log3 $name, 4, "CUL_TCM97001 $name $id3 ($msg) length: $l";

So eine ähnlich ezeile einfach in das Scropt einfügen und schon erscheint die Meldung im Log-File.
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM