Signalduino und Chamberlain Garagentorantrieb

Begonnen von Alder251, 10 Januar 2021, 08:48:34

Vorheriges Thema - Nächstes Thema

Alder251

Hallo,
Zum Ansteuern von Steckdosen von Brennenstuhl und einem Deckenventilator verwende ich einen Signalduino. Funktioniert auch recht gut. Nun wollte ich auch meinen Garagentorantrieb Chamberlain Liftmaster damit steuern bzw. das vorhandene Eingabetastenfeld auch für andere Funktionen nutzen. Ich besitze mehrere Handsender (3 Tasten) und zwei Tastenfelder (11 Tasten, Eingabe vierstelliger Code).

Daten Handsender und Tastenfeld:


Handsender
433.92 MHz
Model 4335E
Type 1A5478

Tastenfeld
433.92 MHz
Type 747 Series
1A5080


Die Hardware besteht aus einem WemosD1mini (ESP8266) und einem C1101.

Habe verschiedene Versionen ausgetestet und bin jetzt bei
version V 3.5.0-dev+20201207 SIGNALESP cc1101 (chip CC1101)
versionProtocols 1.26
versionmodul 3.5.1

Zu Beginn reagierte der Signalduino auf keinen Tastendruck am Handsender. Nachdem ich verschiedene Einstellungen geändert habe und dies keinen Erfolg brachte habe ich in der Firmware für den SD in der Datei signalDecoder.h in der Zeile #define minMessageLen 40 die Mindestlänge einer Nachricht auf 20 verringert. Danach liefert der SD mit den Standardeinstellungen (set raw e) jetzt für einen Tastendruck jeweils zwei verschiedene Nachrichten. Leider sind darin keine Abschnitte, die wiederholt werden. Bei verschiedenen Tastern ändert sich auch das Format jeder einzelnen Nachricht.

Daten aus dem Logfile:

Handsender Taste 1
Teil 1
MU;P0=-4333;P1=2920;P2=-1043;P3=-2059;P4=1900;P5=-2995;P6=945;D=0121342121215621342156;CP=1;R=45;

Teil 2
MU;P0=-6038;P1=945;P2=-2983;P3=-1041;P4=2915;P5=-2021;P6=1936;D=0121213421342134562156;CP=1;R=55;

Taste 3
Teil 1
MU;P0=-5850;P1=939;P2=-1060;P3=2907;P4=-3012;P5=-2018;P6=1930;D=0123412341234123564156;CP=1;R=46;

Teil 2
MU;P0=-4000;P1=2929;P2=-1037;P3=-2023;P4=1924;P5=-2986;P6=949;D=0121342121215621342156;CP=1;R=49;

Tastenfeld 1111
MU;P0=852;P1=-1828;P2=1737;P3=-950;P4=2632;P5=-2733;D=012345012505012125034;CP=0;R=75;


Um die Nachrichten besser vergleichen zu können habe ich mir auf einem zweitem Funkmodul die Daten mit sortierten Pattern ausgeben lassen (Wäre vielleicht für zukünftige Versionen des Signalduino auch keine schlechte Idee). Leider fehlt hier die erste Pause, da die bei mir immer anders ist:


Handsender
Pattern sortiert:
SP0 = -3020; SP1 = -2040; SP2 = -1048; SP3 = 932; SP4 = 1911; SP5 = 2912; SP6 = 0; SP7 = 0;

1A5478 Taste 1 (größte)
                 Nachricht                                                     Faktor von Clock
Sender 1   3 0 3 0 3 2 5 0 3 2 5 0 3 2 5 1 4 0 3 1 4     1 -3 1 -3 1 -1 3 -3 1 -1 3 -3 1 -1 3 -2 2 -3 1 -2 2
Sender 2   3 0 3 0 3 2 5 1 4 1 4 1 4 0 3 0 3 0 3 1 4     1 -3 1 -3 1 -1 3 -2 2 -2 2 -2 2 -3 1 -3 1 -3 1 -2 2

Sender 1   5 2 5 1 4 2 5 2 5 2 5 0 3 2 5 1 4 2 5 0 3     3 -1 3 -2 2 -1 3 -1 3 -1 3 -3 1 -1 3 -2 2 -1 3 -3 1
Sender 2   5 2 5 0 3 0 3 0 3 0 3 0 3 1 4 1 4 2 5 0 3     3 -1 3 -3 1 -3 1 -3 1 -3 1 -3 1 -2 1 -2 1 -1 3 -3 1

1A5478 Taste 2 (mitte)
Sender 1   3 1 4 0 3 2 5 0 3 2 5 0 3 2 5 1 4 0 3 1 4     1 -2 2 -3 1 -1 3 -3 1 -1 3 -3 1 -1 3 -2 2 -3 1 -2 2
Sender 2   3 1 4 0 3 2 5 1 4 1 4 1 4 0 3 0 3 0 3 1 4     1 -2 2 -3 1 -1 3 -2 2 -2 2 -2 2 -3 1 -3 1 -3 1 -2 2

Sender 1   5 2 5 1 4 2 5 2 5 2 5 0 3 2 5 1 4 2 5 0 3     3 -1 3 -2 2 -1 3 -1 3 -1 3 -3 1 -1 3 -2 2 -1 3 -3 1
Sender 2   5 2 5 0 3 0 3 0 3 0 3 0 3 1 4 1 4 2 5 0 3     3 -1 3 -3 1 -3 1 -3 1 -3 1 -3 1 -2 2 -2 2 -1 3 -3 1

1A5478 Taste 3 (kleinste)
Sender 1   3 2 5 0 3 2 5 0 3 2 5 0 3 2 5 1 4 0 3 1 4     1 -1 3 -3 1 -1 3 -3 1 -1 3 -3 1 -1 3 -2 2 -3 1 -2 2
Sender 2   3 2 5 0 3 2 5 1 4 1 4 1 4 0 3 0 3 0 3 1 4     1 -1 2 -3 1 -1 2 -2 1 -2 1 -2 1 -3 1 -3 1 -3 1 -2 1

Sender 1   5 2 5 1 4 2 5 2 5 2 5 0 3 2 5 1 4 2 5 0 3     3 -1 3 -2 2 -1 3 -1 3 -1 3 -3 1 -1 3 -2 2 -1 3 -3 1
Sender 2   5 2 5 0 3 0 3 0 3 0 3 0 3 1 4 1 4 2 5 0 3     3 -1 3 -3 1 -3 1 -3 1 -3 1 -3 1 -2 1 -2 1 -1 3 -3 1

Tastenfeld
1A5080 Eingabe 1111
Pattern sortiert:
SP0 = -2732; SP1 = -1846; SP2 = -954; SP3 = 832; SP4 = 1738; SP5 = 2634; SP6 = 0; SP7 = 0;

3 1 4 2 5 0 3 1 4 0 3 0 3 1 4 1 4 0 3 2 5     1 -2 2 -1 3 -3 1 -2 2 -3 1 -3 1 -2 2 -2 2 -3 1 -1 3

1A5080 Eingabe 2222
Pattern sortiert:
SP0 = -1862; SP1 = -961; SP2 = 873; SP3 = 1720; SP4 = 2620; SP5 = 0; SP6 = 0; SP7 = 0;

2 0 3 0 3 0 3 1 4 0 3 0 3 0 3 1 4 1 4 1 4     1 -2 2 -2 2 -2 2 -1 3 -2 2 -2 2 -2 2 -1 3 -1 3 -1 3

1A5080 Eingabe 3333
Pattern sortiert:
SP0 = -2743; SP1 = -1853; SP2 = -968; SP3 = 839; SP4 = 1716; SP5 = 2608; SP6 = 0; SP7 = 0;

3 1 4 1 4 0 3 0 3 2 5 2 5 0 3 1 4 1 4 2 5     1 -2 2 -2 2 -3 1 -3 1 -1 3 -1 3 -3 1 -2 2 -2 2 -1 3



In der Protokolldatei habe ich folgendes Protokoll angelegt und um die Fehlermeldung im Logfile zu verhinden, ein Modul angelegt:

"110" => ## Test für chaimberlain
        # testest
{
name => 'Chamberlain',
comment         => 'Test für Chamberlain Garagentor',
id => '110',
knownFreqs     => '',
one => [-3,1],
zero => [-1,3],
#sync => [-2,2],
#start              => [-2,2],
clockabs => 880,
format => 'twostate',#'pwm',
preamble => 'P110#',
clientmodule => 'SD_CHAMB',
modulematch => '^P110#',
length_min => '2',
length_max => '22',
#filterfunc        => 'SD_CHAMB_Filterfunc',
#remove_zero => 1,
#paddingbits   => '8',
}


Der Signalduino erkennt jetzt die Sender. Leider funktioniert das Demodulieren nicht richtig, da in einer Nachricht mehrere syncAbschnitte mit unterschiedlichem Inhalt vorkommen. Eine Verarbeitung in der Filterfunktion geht nicht (z.b ändern NRZ oder MC), da diese nicht die komplette Nachricht weitergereicht bekommt, sondern nur die schon demodulierte Bitfolge.
Meine Vermutung ist jetzt, daß der Sender nicht im ASK/OOK sendet, sondern ein anderes Modulationsverfahren verwendet. Dann würde ich eventuell auch Nachrichten mit mehr als 40 Zeichen bekommen.

Kann mir jemand weiterhelfen?

elektron-bbs

#1
Ich habe noch keinen Hinweis gefunden, welche Modulation verwendet wird.
Ein Problem ist, das in den Nachrichten drei verschiedene Pulsfolgen vorkommen:


MU;P0=-4333;P1=2920;P2=-1043;P3=-2059;P4=1900;P5=-2995;P6=945;D=
01   sync (fehlt aber bei "Tastenfeld 1111")
21342121215621342156;CP=1;R=45;
21   -1043,2920   -1,3
34   -2059,1900   -2,2
56   -2995,945    -3,1


Probiere es mal bitte mit dieser Definition:


    "110"  => ## Chamberlain remote control 4335E
              # https://forum.fhem.de/index.php/topic,117622.0.html
      {
        name            => '4335E',
        comment         => 'Chamberlain remote control',
        id              => '110',
        knownFreqs      => '443,92',
        one             => [-1,3],
        zero            => [-3,1],
        float           => [-2,2],
        clockabs        => 1000,
        format          => 'twostate',
        preamble        => 'u110#',
        # clientmodule    => 'Fernotron',
        length_min      => '10',
        length_max      => '24',
        paddingbits     => '1', # will disable padding, use this setting when using dispatchBin
        dispatchBin     => 1    # If set to 1, data will be dispatched in binary representation to other logcial modules.
        # postDemodulation => \&lib::SD_Protocols::Convbit2Arctec,
      }


Es werden dann Nachrichten in dieser Form übergeben:

DMSG: u110#1F11101F10

Diese müsstest du dann mal mit den verschiedenen Tasten und Fernbedienungen durchprobieren. Es könnte ja auch noch ein Rolling Code verwendet werden.
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

Alder251

#2
Danke! Erspart mir zu nächst die Arbeit die unnötigen Zeichen zu entfernen und die Nullen aufzufüllen.

Ich glaube nicht, daß es ein Rolling code ist, denn es werden bei einer Taste immer nur die gleichen zwei Nachrichten verschickt.

=========Handsender 1 ========================TASTE 1 ================Handsender 2 ==========
000000000001000000010000000111110000111100000000    000000000001111111111111000000000000111100000000
000111110001000100010000000111110001000000000000    000100000000000000000000111111110001000000000000

=========Handsender 1 ========================TASTE 2 ================Handsender 2 ==========
111100000001000000010000000111110000111100000000    111100000001111111111111000000000000111100000000
000111110001000100010000000111110001000000000000    000100000000000000000000111111110001000000000000

=========Handsender 1 ========================TASTE 3 ================Handsender 2 ==========
000100000001000000010000000111110000111100000000    000100000001111111111111000000000000111100000000
000111110001000100010000000111110001000000000000    000100000000000000000000111111110001000000000000


Wenn ich das jetzt richtig verstanden habe, dann muß ich die zwei Nachrichten aneinanderfügen, evtl. die "F" entfernen und Abschnitte suchen, die
- beim gleichen Modell in jeder Nachricht vorkommen
- nur bei gleichen Tasten gleich sind
-  nur beim gleichen Handsender gleich sind

Wurde das schon einmal in einem Modul verwendet, "Fernotron" find ich nicht?

elektron-bbs

#3
Du hast wahrscheinlich meinen ursprünglichen Post verwendet. Ich hatte meine Nachricht später nochmal geändert und bei der Definition die Zeile hinzugefügt:
paddingbits     => '1', # will disable padding, use this setting when using dispatchBin
Dadurch werden am Ende der Nachricht keine Nullen aufgefüllt. Bitte mal die Änderung noch übernehmen.

Ich habe aus den Bitmsg die ursprünglichen DMSG wieder hergestellt, das macht die Sache übersichtlicher :-)

     Sender 1 - Taste 1 - Sender 2
N1: 0 010101F0F           0 01FFF000F
N2: 1F11101F10            100000FF10

     Sender 1 - Taste 2 - Sender 2
N1: F 010101F0F           F 01FFF000F
N2: 1F11101F10            100000FF10

     Sender 1 - Taste 3 - Sender 2
N1: 1 010101F0F           1 01FFF000F
N2: 1F11101F10            100000FF10


Die zweite Nachricht ist jeweils komplett beim Sender identisch. Außerdem sind auch die letzten 9 Zeichen der ersten Nachricht übereinstimmend.
Bei Nachricht 1 ist jeweils das erste Zeichen zwischen Sender 1 und 2 identisch.

Es könnte also das erste Zeichen der ersten Nachricht für die Taste stehen und die restlichen der ersten und zweiten Nachricht für die Ident der Fernbedienung.
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

Alder251

Da tatsächlich nur die 21 bzw. 22 Signale empfangen werden, habe ich allerdings immer noch den Verdacht, daß hier an den Einstellungen für den C1101 geschraubt werden muß. Mehr Signale, als die in der von der Hardware an FHEM gesendeten Nachricht, gibt es nicht!

Ralf9

da der Patternspeicher nicht übergelaufen ist (standardmässig passen da 8 Pattern rein, P0 - P7), müssten es eigentlich alle Signale sein.
Wegen der Modulation und anderen Parametern kann evtl @plin weiterhelfen
https://wiki.fhem.de/wiki/Unbekannte_Funkprotokolle

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

Alder251

Hi,

dachte daran, daß mehr gesendet als eingetragen wird.....

Alder251

So, hab mal ein Ergebnis für das Tastenfeld....
Der 4-Stellige Code wird mit den Tasten 0-9 eingegeben, gesendet wird mit der Taste "Enter".

In der Nachricht kommen 3 Signale (0,1,F) vor, also ist es keine Binärzahl. Aus den Kombinationen der Signale lassen sich die Werte 0-8 nachbilden. Es ergibt sich eine 4-stellige Zahl, wobei jede Stelle die Basis 9 hat.
Aus dem demodulierten Ergebnis des Signalduino werden die Stellen 3-10 benötigt:


Empfangen        Eingabe        9^3     9^2     9^1     9^0      Dezimal
u110#0F 1F1F1F1F  1 0000 1 F 1 F 1 F 1 F 0 0 0 0 0
u110#0F 1F1F1F10  1 0001 1 F 1 F 1 F 1 0 0 0 0 1 1
u110#0F 1F1F1FF1  1 0002 1 F 1 F 1 F F 1 0 0 0 2 2
u110#0F 1F1F1FFF  1 0003 1 F 1 F 1 F F F 0 0 0 3 3
u110#0F 1F1F1FF0  1 0004 1 F 1 F 1 F F 0 0 0 0 4 4
u110#0F 1F1F1F01  1 0005 1 F 1 F 1 F 0 1 0 0 0 5 5
u110#0F 1F1F1F0F  1 0006 1 F 1 F 1 F 0 F 0 0 0 6 6
u110#0F 1F1F1F00  1 0007 1 F 1 F 1 F 0 0 0 0 0 7 7
u110#0F 1F1F1F11  1 0008 1 F 1 F 1 F 1 1 0 0 0 8 8
u110#0F 1F1F101F  1 0009 1 F 1 F 1 0 1 F 0 0 1 0 9
u110#0F 1F1F1010  1 0010 1 F 1 F 1 0 1 0 0 0 1 1 10
u110#0F 1F1F10F1  1 0011 1 F 1 F 1 0 F 1 0 0 1 2 11



In der Protocoldata habe ich das Format "tristate" gesehen. Ist damit das vorliegende Ergebnis gemeint?

Ralf9

Mir fallen 2 Gründe ein warum es als 2 Nachrichten erkannt wird.
Nach der ersten Nachricht gibt es Pulse die kleiner pulseMin=90 sind oder es gibt zwischen den beiden Nachrichten eine Pause die länger als 32000 ist.

Um rauszufinden ob es ein lange Pause gibt und wie lang sie ist gibt es mehrere Möglichkeiten.
Eine Möglichkeit wäre an der Firmware anpassungen vorzunehmen, damit auch längere Pausen erkannt werden
oder
https://wiki.fhem.de/wiki/Unbekannte_Funkprotokolle#Ansatz_3_-_Messen

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

Alder251

Stimmt!
Die Pause liegt dann zwischen 36000 und 38000. Hatte ich zum Testen schon erhöht, die eigentlichen Nachrichtenblöcken ändern sich dadurch nicht, es steht aber viel Müll dazwischen. Es gibt dann kein reproduzierbares Ergebnis.
Kleinere Signale als 90 habe ich nicht gesehen.

Vielleicht gibts dann mal in einer neuen Version die Möglichkeit die Min- und Maxgrößen über ein Attribut zu ändern!

Ralf9

Die maxpulse lässt sich nicht so einfach erhöhen, die pulse sind als int definiert, dies ist beimArduino 16 Bit (+ - 32768)
Beim ESP konntest Du es erhöhen da dort int 32 Bit sind, wahrscheinlich muss da noch einiges angepasst werden da dort an einigen Stellen int auch als 16 Bit (uint16_t) definiert ist.

Ein workaround könnte sein das maxPulse 32001 zu lassen und dann in der  cronjob und in der handleInterrupt Routine auf z.B. 45000 anstatt maxPulse zu prüfen,
und Pulse die größer als 32000 und kleiner als 45000 sind als 32000 in den FIFO zu schreiben
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

Alder251

Ich meinte eigentlich die Mindestlänge der Nachricht !

Zitat
...habe ich in der Firmware für den SD in der Datei signalDecoder.h in der Zeile #define minMessageLen 40 die Mindestlänge einer Nachricht auf 20 verringert.

So werden kürzere Nachrichten nicht verworfen.

Ralf9

Mein Workaround hilft auch nicht richtig weiter, es würde zwar nur eine Nachricht empfangen, aber im 00_Signalduino Modul wird in der Parse_MU Routine daraus wieder 2 dmsg gemacht.

Das Zusammenfügen der beiden Nachrichten muß im SD_UT Modul gemacht werden.

ZitatIch meinte eigentlich die Mindestlänge der Nachricht !
Da müsstest Du Sidey fragen ob er es in die firmware für den ESP einbaut.

Es in meiner firmware für den MapleMini einzubauen wäre kein großer Aufwand.

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

Alder251

Hätte jetzt ein Modul fertig. Falls Interesse besteht würde ich noch die Hilfe zur Funktionsbeschreibung hinzufügen. Es bleibt jedoch weiterhin das Problem mit den "zu kurzen" Nachrichten.