Home Easy HE844A + HE800S interpretieren

Begonnen von bjoernh, 17 April 2015, 18:52:53

Vorheriges Thema - Nächstes Thema

bjoernh

Zitat von: KölnSolar am 23 April 2016, 08:42:25
@Sascha: bevor Du Dich weiter verrennst: Björn wollte nur zum Ausdruck bringen, dass  Deine Links auf HE aber eben nicht auf HE800 verweisen !
Markus
Danke :)

sash.sc

Ok. War ein Versuch wert.

Gesendet von meinem SM-T560 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

rastagandalf

Moin,

vielleicht hilft es jemandem:
Ich habe bei der namhaften "Erstmal zu..."-Warenkette den Intertek 51010-Gurtwickler (Baugleich zu ELRO HE501EU, kostet aber nur 35 €) erstanden.
Mit der a-culfw (danke an Björn für die Erweiterung!) anstelle der normalen culfw ging das Einlernen der Codes in FHEM dann auch ohne Probleme. Allerdings hat der Gurtwickler nach wie vor nur auf die Fernbedienung, nicht aber auf FHEM reagiert.
Hier sei als kleiner Trick verraten, dass es bei mir erst ging, als ich einfach den Anlernen-Modus des Gurtwicklers nochmal aktiviert und dann aber mit FHEM statt der Fernbedienung (!) gefunkt habe. Nun kann ich mit FB und FHEM den Rolladen steuern.

Kann sich das jemand erklären? Jedenfalls funktioniert es jetzt...der Erfolg (oder eine gesunde Portion Cargo-Cult-Programming) geben der Methode ja irgendwie Recht...

mveltrup

Hallo,
ich habe meine HE Türkontakte sozusagen per Hand eingebunden. Schaut jetzt so aus:
Im event Monitor stand:

2016-05-13 21:12:25 CUL CUL_0 UNKNOWNCODE ihc78f66b5cb56ae0000
2016-05-13 21:12:26 CUL CUL_0 UNKNOWNCODE ihc78f66b5cb572e000b

Nur die fett geschriebenen Codes sind interssant, also:

define kontakt dummy
attr kontakt webCmd On:Off
define he1_on notify CUL_0:UNKNOWNCODE\sihc78f66b5cb56.* set kontakt on
define he1_off notify CUL_0:UNKNOWNCODE\sihc78f66b5cb57.* set kontakt off

Irgendwann hat autocreate dann wieder ein IT device angelegt, deshalb hab ich im autocreate die beiden codes in die ignoreddevices eingetragen.

attr autocreate ignoreTypes Revolt.*|CUL_0:UNKNOWNCODE\sihc78f66b5cb56.*|CUL_0:UNKNOWNCODE\sihc78f66b5cb57.*


Vielleicht hilft das ja jemandem.

Fuchks

#64
In dem Projekt HE853-Remote ist die Verschlüsselung enthalten.

Dort ist auch der Protokoll-Rahmen angegeben:
Clock = 320us
Preamble: 1 Hi, 15 lo
0: 1 Hi, 3 lo
1: 3 lo, 1 Hi
Databits: 28 = 7 Nibbel


Habe den betreffenden Part zur Evaluierung umgeschrieben und einiges an Kommentaren hinzugefügt.
Der Code steht auch online und kann live ausprobiert werden.
Wäre toll, wenn das HE800-Protokoll dann in die CUL-FW einfließen würde   :D

Code-Update am 15.10. 18:37 (Dimming implementiert & aufgeräumt):
// Example program for encoding HE800 series messages
#include <iostream>
#include <string>

int main()
{
    uint16_t txID = 0x9ac0; //unique transmitter-ID [0]1..65535 (0 valid?, 65535 or lower limit?)
    uint8_t cmd; //0=OFF 1=ON, 2=10%dim..9=80%dim (no 90%dim!)
    uint8_t rcd; //rolling-code 0-3 (differentiate new message from repeated message)
    uint8_t rxID; //receiver-ID [0]1..15, 0=Broadcast 1-15 (HE844A button# 1-4 & MASTER=0, HE850 UNIT# 1-15, HE853 = 1)

uint8_t key[17] = {9, 6, 3, 8, 10, 0, 2, 12, 4, 14, 7, 5, 1, 15, 11, 13, 9}; //Cryptokey table

uint8_t mn[7]; //message separated in nibbles
uint32_t msg; //encrypted message

    for (uint8_t i_cmd = 0; i_cmd < 2; i_cmd++){
        cmd = i_cmd;
        for (uint8_t i_rxID = 0; i_rxID < 16; i_rxID++){
            rxID = i_rxID;
            std::cout << "\n";
            for (uint8_t i_rcd = 0; i_rcd < 4; i_rcd++){
                rcd = i_rcd;

            mn[0] = rxID; // mn[0] = iiiib i=receiver-ID
            mn[1] = (rcd << 2) & 15; // 2 lowest bits of rolling-code
            if (cmd > 0) { // ON or OFF
            mn[1] |= 2;
            } // mn[1] = rrs0b r=rolling-code, s=ON/OFF, 0=const 0?
            mn[2] = txID & 15; // mn[2..5] = ttttb t=txID in nibbles -> 4x ttttb
            mn[3] = (txID >> 4) & 15;
            mn[4] = (txID >> 8) & 15;
            mn[5] = (txID >> 12) & 15;
            if (cmd >= 2 && cmd <= 9) { // mn[6] = dpppb d = dim ON/OFF, p=%dim/10 - 1
            mn[6] = cmd - 2; // dim: 0=10%..7=80%
            mn[6] |= 8; // dim: ON
            } else {
            mn[6] = 0; // dim: OFF
            }

//XOR encryption 2 rounds
for (uint8_t r=0; r<=1; r++){ //2 encryption rounds
mn[0] = key[ mn[0]-r+1]; //encrypt first nibble
for (uint8_t i=1; i<=5 ; i++){ //encrypt 4 nibbles
mn[i] = key[(mn[i] ^ mn[i-1])-r+1]; //crypted with predecessor & key
}
}

mn[6] = mn[6] ^ 9; // no  encryption

            msg = (mn[6] << 0x18) | (mn[5] << 0x14) | //copy the encrypted nibbles in output buffer
                   (mn[4] << 0x10) | (mn[3] << 0x0c) |
                   (mn[2] << 0x08) | (mn[1] << 0x04) | mn[0];
            msg = (msg >> 2) | ((msg & 3) << 0x1a); //shift 2 bits right & copy lowest 2 bits of cbuf[0] in msg bit 27/28

                //Output for reference
                std::cout << std::hex << std::uppercase << (~msg << 4) << " Receiver-ID: " << (uint16_t) rxID << " OFF/ON/DIM: " << (uint16_t) cmd << " Rolling-code: " << (uint16_t) rcd << " Transmitter-ID: " << (uint16_t) txID << "\n"; //encrypted message bitwise inverted
                //std::cout << (uint16_t) ~(cbuf[2] | ( cbuf[3] << 0x04) | (cbuf[4] << 0x8) | (cbuf[5] << 0x10)) << "\n"; //encrypted txID bitwise inverted
                //std::cout << txID;
            }
        }
    }

}

Fuchks

Hab die ID des Beispielsenders mittlerweile erraten und habe eine Ausgabe aller Codes getestet und unter die empfangenen geschrieben, die Verschlüsselung passt (mit ein paar Anpassungen des original-Projekts -> Code siehe voriges Post) 8) :
Fehlt nur noch das Dimming und der Decoder, wer hat Lust?  :P

Ursprungspost dazu:
Zitat von: rizzir am 19 April 2016, 19:16:42
1 On:
D8458490 11 0110    0001 0001 0110 0001 0010    01
D81FC5D0 11 0110    0000 0111 1111 0001 0111    01
DBE24A90 11 0110    1111 1000 1001 0010 1010    01
DAE00A10 11 0110    1011 1000 0000 0010 1000    01
DBE24A90 Receiver-ID: 1 ON/OFF: 1 Rolling-code: 0 Transmitter-ID: 9AC0
DAE00A10 Receiver-ID: 1 ON/OFF: 1 Rolling-code: 1 Transmitter-ID: 9AC0
D8458490 Receiver-ID: 1 ON/OFF: 1 Rolling-code: 2 Transmitter-ID: 9AC0
D81FC5D0 Receiver-ID: 1 ON/OFF: 1 Rolling-code: 3 Transmitter-ID: 9AC0
2: On:
D8EFCBA0 11 0110    0011 1011 1111 0010 1110    10
DBA8AAE0 11 0110    1110 1010 0010 1010 1011    10
D8ACD660 11 0110    0010 1011 0011 0101 1001    10
DB8D7C60 11 0110    1110 0011 0101 1111 0001    10
D8ACD660 Receiver-ID: 2 ON/OFF: 1 Rolling-code: 0 Transmitter-ID: 9AC0
DB8D7C60 Receiver-ID: 2 ON/OFF: 1 Rolling-code: 1 Transmitter-ID: 9AC0
D8EFCBA0 Receiver-ID: 2 ON/OFF: 1 Rolling-code: 2 Transmitter-ID: 9AC0
DBA8AAE0 Receiver-ID: 2 ON/OFF: 1 Rolling-code: 3 Transmitter-ID: 9AC0
3: On
1B066260 00 0110    1100 0001 1001 1000 1001    10
1A6320E0 00 0110    1001 1000 1100 1000 0011    10
19329C60 00 0110    0100 1100 1010 0111 0001    10
1B2402E0 00 0110    1100 1001 0000 0000 1011    10
19329C60 Receiver-ID: 3 ON/OFF: 1 Rolling-code: 0 Transmitter-ID: 9AC0
1B2402E0 Receiver-ID: 3 ON/OFF: 1 Rolling-code: 1 Transmitter-ID: 9AC0
1B066260 Receiver-ID: 3 ON/OFF: 1 Rolling-code: 2 Transmitter-ID: 9AC0
1A6320E0 Receiver-ID: 3 ON/OFF: 1 Rolling-code: 3 Transmitter-ID: 9AC0
4: On
9A57DF90 10 0110    1001 0101 1111 0111 1110    01
9A932550 10 0110    1010 0100 1100 1001 0101    01
9807AE50 10 0110    0000 0001 1110 1011 1001    01
9920CBD0 10 0110    0100 1000 0011 0010 1111    01
9807AE50 Receiver-ID: 4 ON/OFF: 1 Rolling-code: 0 Transmitter-ID: 9AC0
9920CBD0 Receiver-ID: 4 ON/OFF: 1 Rolling-code: 1 Transmitter-ID: 9AC0
9A57DF90 Receiver-ID: 4 ON/OFF: 1 Rolling-code: 2 Transmitter-ID: 9AC0
9A932550 Receiver-ID: 4 ON/OFF: 1 Rolling-code: 3 Transmitter-ID: 9AC0
Master: On
5BBD7570 01 0110    1110 1111 0101 1101 0101    11
5ACDB430 01 0110    1011 0011 0110 1101 0000    11
58D73BB0 01 0110    0011 0101 1100 1110 1110    11
5AC7FF30 01 0110    1011 0001 1111 1111 1100    11
5AC7FF30 Receiver-ID: 0 ON/OFF: 1 Rolling-code: 0 Transmitter-ID: 9AC0
5BBD7570 Receiver-ID: 0 ON/OFF: 1 Rolling-code: 1 Transmitter-ID: 9AC0
5ACDB430 Receiver-ID: 0 ON/OFF: 1 Rolling-code: 2 Transmitter-ID: 9AC0
58D73BB0 Receiver-ID: 0 ON/OFF: 1 Rolling-code: 3 Transmitter-ID: 9AC0


1: Off
D92F4050 11 0110    0100 1011 1101 0000 0001    01
DA40E650 11 0110    1001 0000 0011 1001 1001    01
D82BF710 11 0110    0000 1010 1111 1101 1100    01
D9B86790 11 0110    0110 1110 0001 1001 1110    01
D82BF710 Receiver-ID: 1 ON/OFF: 0 Rolling-code: 0 Transmitter-ID: 9AC0
D9B86790 Receiver-ID: 1 ON/OFF: 0 Rolling-code: 1 Transmitter-ID: 9AC0
D92F4050 Receiver-ID: 1 ON/OFF: 0 Rolling-code: 2 Transmitter-ID: 9AC0
DA40E650 Receiver-ID: 1 ON/OFF: 0 Rolling-code: 3 Transmitter-ID: 9AC0
2: Off
DAA28B20 11 0110    1010 1000 1010 0010 1100    10
D91D7960 11 0110    0100 0111 0101 1110 0101    10
DB016220 11 0110    1100 0000 0101 1000 1000    10
DB75FAA0 11 0110    1101 1101 0111 1110 1010    10
DB016220 Receiver-ID: 2 ON/OFF: 0 Rolling-code: 0 Transmitter-ID: 9AC0
DB75FAA0 Receiver-ID: 2 ON/OFF: 0 Rolling-code: 1 Transmitter-ID: 9AC0
DAA28B20 Receiver-ID: 2 ON/OFF: 0 Rolling-code: 2 Transmitter-ID: 9AC0
D91D7960 Receiver-ID: 2 ON/OFF: 0 Rolling-code: 3 Transmitter-ID: 9AC0
3:Off
1BE59CA0 00 0110    1111 1001 0110 0111 0010    10
18C422A0 00 0110    0011 0001 0000 1000 1010    10
1826A720 00 0110    0000 1001 1010 1001 1100    10
1883FA20 00 0110    0010 0000 1111 1110 1000    10
1826A720 Receiver-ID: 3 ON/OFF: 0 Rolling-code: 0 Transmitter-ID: 9AC0
1883FA20 Receiver-ID: 3 ON/OFF: 0 Rolling-code: 1 Transmitter-ID: 9AC0
1BE59CA0 Receiver-ID: 3 ON/OFF: 0 Rolling-code: 2 Transmitter-ID: 9AC0
18C422A0 Receiver-ID: 3 ON/OFF: 0 Rolling-code: 3 Transmitter-ID: 9AC0
4: Off
9A4FE4D0 10 0110    1001 0011 1111 1001 0011    01
98F0EB50 10 0110    0011 1100 0011 1010 1101    01
9935A490 10 0110    0100 1101 0110 1001 0010    01
9A8A6C50 10 0110    1010 0010 1001 1011 0001    01
9935A490 Receiver-ID: 4 ON/OFF: 0 Rolling-code: 0 Transmitter-ID: 9AC0
9A8A6C50 Receiver-ID: 4 ON/OFF: 0 Rolling-code: 1 Transmitter-ID: 9AC0
9A4FE4D0 Receiver-ID: 4 ON/OFF: 0 Rolling-code: 2 Transmitter-ID: 9AC0
98F0EB50 Receiver-ID: 4 ON/OFF: 0 Rolling-code: 3 Transmitter-ID: 9AC0
Master Off:
59634630 01 0110    0101 1000 1101 0001 1000    11
580B74B0 01 0110    0000 0010 1101 1101 0010    11
587750F0 01 0110    0001 1101 1101 0100 0011    11
59499530 01 0110    0101 0010 0110 0101 0100    11
59499530 Receiver-ID: 0 ON/OFF: 0 Rolling-code: 0 Transmitter-ID: 9AC0
59634630 Receiver-ID: 0 ON/OFF: 0 Rolling-code: 1 Transmitter-ID: 9AC0
580B74B0 Receiver-ID: 0 ON/OFF: 0 Rolling-code: 2 Transmitter-ID: 9AC0
587750F0 Receiver-ID: 0 ON/OFF: 0 Rolling-code: 3 Transmitter-ID: 9AC0

Fuchks

#66
Dimming und Decoder sind fertig und getestet.
Die Integration in die CUL-FW kann ich leider nicht übernehmen, aber mit meiner Vorarbeit sicher nicht allzu kompliziert  ;D

Das Beispielprogramm ver- und entschlüsselt alle möglichen Nachrichten einer Sender-ID:
// Example program for en- & decrypting ELRO HE800 series messages
#include <iostream>
#include <string>

int main()
{
    uint16_t txID = 0x9ac0; //unique transmitter-ID [0]1..65535 (0 valid?, 65535 or lower limit?)
    uint8_t cmd; //0=OFF 1=ON, 2=10%dim..9=80%dim (no 90%dim!)
    uint8_t rcd; //rolling-code 0-3 (differentiate new message from repeated message)
    uint8_t rxID; //receiver-ID [0]1..15, 0=Broadcast 1-15 (HE844A button# 1-4 & MASTER=0, HE850 UNIT# 1-15, HE853 = 1)

uint8_t key[17] = {9, 6, 3, 8, 10, 0, 2, 12, 4, 14, 7, 5, 1, 15, 11, 13, 9}; //cryptokey
uint8_t ikey [16] = {5, 12, 6, 2, 8, 11, 1, 10, 3, 0, 4, 14, 7, 15, 9, 13};  //invers cryptokey (exchanged index & value)

uint8_t mn[7]; //message separated in nibbles
uint32_t msg; //encrypted message

    std::string sTxID;
    std::cout << "Pls type in transmitterID 0..65535:";
    getline (std::cin, sTxID);
    txID = std::stoi( sTxID );

    for (uint8_t i_cmd = 0; i_cmd < 10; i_cmd++){
        cmd = i_cmd;
        for (uint8_t i_rxID = 0; i_rxID < 16; i_rxID++){
            rxID = i_rxID;
            std::cout << "\n";
            for (uint8_t i_rcd = 0; i_rcd < 4; i_rcd++){
                rcd = i_rcd;

//encrypt
            mn[0] = rxID; // mn[0] = iiiib i=receiver-ID
            mn[1] = (rcd << 2) & 15; // 2 lowest bits of rolling-code
            if (cmd > 0) { // ON or OFF
            mn[1] |= 2;
            } // mn[1] = rrs0b r=rolling-code, s=ON/OFF, 0=const 0?
            mn[2] = txID & 15; // mn[2..5] = ttttb t=txID in nibbles -> 4x ttttb
            mn[3] = (txID >> 4) & 15;
            mn[4] = (txID >> 8) & 15;
            mn[5] = (txID >> 12) & 15;
            if (cmd >= 2 && cmd <= 9) { // mn[6] = dpppb d = dim ON/OFF, p=%dim/10 - 1
            mn[6] = cmd - 2; // dim: 0=10%..7=80%
            mn[6] |= 8; // dim: ON
            } else {
            mn[6] = 0; // dim: OFF
            }

//XOR encryption 2 rounds
for (uint8_t r=0; r<=1; r++){ // 2 encryption rounds
mn[0] = key[ mn[0]-r+1]; // encrypt first nibble
for (uint8_t i=1; i<=5 ; i++){ // encrypt 4 nibbles
mn[i] = key[(mn[i] ^ mn[i-1])-r+1]; // crypted with predecessor & key
}
}

mn[6] = mn[6] ^ 9; // no  encryption

            msg = (mn[6] << 0x18) | (mn[5] << 0x14) | // copy the encrypted nibbles in output buffer
                   (mn[4] << 0x10) | (mn[3] << 0x0c) |
                   (mn[2] << 0x08) | (mn[1] << 0x04) | mn[0];
            msg = (msg >> 2) | ((msg & 3) << 0x1a); // shift 2 bits right & copy lowest 2 bits of cbuf[0] in msg bit 27/28

                //Output encrypted message
                std::cout << std::hex << std::uppercase << "out " << (~msg << 4) << " in  Receiver-ID: " << (uint16_t) rxID << " OFF/ON/DIM: " << (uint16_t) cmd << " Rolling-code: " << (uint16_t) rcd << " Transmitter-ID: " << (uint16_t) txID << "\n"; //encrypted message bitwise inverted
               

//decrypt
            msg = ((msg << 2) & 0x0FFFFFFF) | ((msg & 0xC000000) >> 0x1a); //shift 2 bits left & copy bit 27/28 to bit 1/2
            mn[0] =  msg & 0x0000000F;
            mn[1] = (msg & 0x000000F0) >> 0x4;
            mn[2] = (msg & 0x00000F00) >> 0x8;
            mn[3] = (msg & 0x0000F000) >> 0xc;
            mn[4] = (msg & 0x000F0000) >> 0x10;
            mn[5] = (msg & 0x00F00000) >> 0x14;
            mn[6] = (msg & 0x0F000000) >> 0x18;
               
            mn[6] = mn[6] ^ 9; // no decryption
           
//XOR decryption 2 rounds
for (uint8_t r=0; r<=1; r++){ // 2 decryption rounds
for (uint8_t i=5; i>=1 ; i--){ // decrypt 4 nibbles
mn[i] = ((ikey[mn[i]]-r) & 0x0F) ^ mn[i-1]; // decrypted with predecessor & key
}
mn[0] = (ikey[mn[0]]-r) & 0x0F; //decrypt first nibble
}
           
           
//Output decrypted message
            std::cout << std::hex << std::uppercase << "in  " << (~((msg >> 2) | (((msg & 3) << 0x1a))) << 4) << " out Receiver-ID: " << (uint16_t) mn[0] << " OFF/ON/DIM: " << (((mn[1]>>1) & 1) + (mn[6] & 0x7) + ((mn[6] & 0x8) >> 3)) << " Rolling-Code: " << (mn[1] >> 2) << " Transmitter-ID: " << (uint16_t) mn[5]  << (uint16_t) mn[4]  << (uint16_t) mn[3]  << (uint16_t) mn[2] << "\n";
            }
        }
    }

}


Update 4.12.2016: Ausgabe für OFF/ON/DIM korrigiert

Heinz1973


bjoernh

#68
Zitat von: Fuchks am 15 Oktober 2016, 20:29:39
Dimming und Decoder sind fertig und getestet.
Die Integration in die CUL-FW kann ich leider nicht übernehmen, aber mit meiner Vorarbeit sicher nicht allzu kompliziert  ;D

Das Beispielprogramm ver- und entschlüsselt alle möglichen Nachrichten einer Sender-ID:
// Example program for en- & decrypting ELRO HE800 series messages
#include <iostream>
#include <string>

int main()
{
    uint16_t txID = 0x9ac0; //unique transmitter-ID [0]1..65535 (0 valid?, 65535 or lower limit?)
    uint8_t cmd; //0=OFF 1=ON, 2=10%dim..9=80%dim (no 90%dim!)
    uint8_t rcd; //rolling-code 0-3 (differentiate new message from repeated message)
    uint8_t rxID; //receiver-ID [0]1..15, 0=Broadcast 1-15 (HE844A button# 1-4 & MASTER=0, HE850 UNIT# 1-15, HE853 = 1)

uint8_t key[17] = {9, 6, 3, 8, 10, 0, 2, 12, 4, 14, 7, 5, 1, 15, 11, 13, 9}; //cryptokey
uint8_t ikey [16] = {5, 12, 6, 2, 8, 11, 1, 10, 3, 0, 4, 14, 7, 15, 9, 13};  //invers cryptokey (exchanged index & value)

uint8_t mn[7]; //message separated in nibbles
uint32_t msg; //encrypted message

    std::string sTxID;
    std::cout << "Pls type in transmitterID 0..65535:";
    getline (std::cin, sTxID);
    txID = std::stoi( sTxID );

    for (uint8_t i_cmd = 0; i_cmd < 2; i_cmd++){
        cmd = i_cmd;
        for (uint8_t i_rxID = 0; i_rxID < 16; i_rxID++){
            rxID = i_rxID;
            std::cout << "\n";
            for (uint8_t i_rcd = 0; i_rcd < 4; i_rcd++){
                rcd = i_rcd;

//encrypt
            mn[0] = rxID; // mn[0] = iiiib i=receiver-ID
            mn[1] = (rcd << 2) & 15; // 2 lowest bits of rolling-code
            if (cmd > 0) { // ON or OFF
            mn[1] |= 2;
            } // mn[1] = rrs0b r=rolling-code, s=ON/OFF, 0=const 0?
            mn[2] = txID & 15; // mn[2..5] = ttttb t=txID in nibbles -> 4x ttttb
            mn[3] = (txID >> 4) & 15;
            mn[4] = (txID >> 8) & 15;
            mn[5] = (txID >> 12) & 15;
            if (cmd >= 2 && cmd <= 9) { // mn[6] = dpppb d = dim ON/OFF, p=%dim/10 - 1
            mn[6] = cmd - 2; // dim: 0=10%..7=80%
            mn[6] |= 8; // dim: ON
            } else {
            mn[6] = 0; // dim: OFF
            }

//XOR encryption 2 rounds
for (uint8_t r=0; r<=1; r++){ // 2 encryption rounds
mn[0] = key[ mn[0]-r+1]; // encrypt first nibble
for (uint8_t i=1; i<=5 ; i++){ // encrypt 4 nibbles
mn[i] = key[(mn[i] ^ mn[i-1])-r+1]; // crypted with predecessor & key
}
}

mn[6] = mn[6] ^ 9; // no  encryption

            msg = (mn[6] << 0x18) | (mn[5] << 0x14) | // copy the encrypted nibbles in output buffer
                   (mn[4] << 0x10) | (mn[3] << 0x0c) |
                   (mn[2] << 0x08) | (mn[1] << 0x04) | mn[0];
            msg = (msg >> 2) | ((msg & 3) << 0x1a); // shift 2 bits right & copy lowest 2 bits of cbuf[0] in msg bit 27/28

                //Output encrypted message
                std::cout << std::hex << std::uppercase << "out " << (~msg << 4) << " in  Receiver-ID: " << (uint16_t) rxID << " OFF/ON/DIM: " << (uint16_t) cmd << " Rolling-code: " << (uint16_t) rcd << " Transmitter-ID: " << (uint16_t) txID << "\n"; //encrypted message bitwise inverted
               

//decrypt
            msg = ((msg << 2) & 0x0FFFFFFF) | ((msg & 0xC000000) >> 0x1a); //shift 2 bits left & copy bit 27/28 to bit 1/2
            mn[0] =  msg & 0x0000000F;
            mn[1] = (msg & 0x000000F0) >> 0x4;
            mn[2] = (msg & 0x00000F00) >> 0x8;
            mn[3] = (msg & 0x0000F000) >> 0xc;
            mn[4] = (msg & 0x000F0000) >> 0x10;
            mn[5] = (msg & 0x00F00000) >> 0x14;
            mn[6] = (msg & 0x0F000000) >> 0x18;
               
            mn[6] = mn[6] ^ 9; // no decryption
           
//XOR decryption 2 rounds
for (uint8_t r=0; r<=1; r++){ // 2 decryption rounds
for (uint8_t i=5; i>=1 ; i--){ // decrypt 4 nibbles
mn[i] = ((ikey[mn[i]]-r) & 0x0F) ^ mn[i-1]; // decrypted with predecessor & key
}
mn[0] = (ikey[mn[0]]-r) & 0x0F; //decrypt first nibble
}
           
           
//Output decrypted message
            std::cout << std::hex << std::uppercase << "in  " << (~((msg >> 2) | (((msg & 3) << 0x1a))) << 4) << " out Receiver-ID: " << (uint16_t) mn[0] << " OFF/ON/DIM: " << (((mn[1]>>1) & 1) + (mn[6] & 0x7) + ((mn[6] & 0x8) >> 4)) << " Rolling-Code: " << (mn[1] >> 2) << " Transmitter-ID: " << (uint16_t) mn[5]  << (uint16_t) mn[4]  << (uint16_t) mn[3]  << (uint16_t) mn[2] << "\n";
            }
        }
    }

}

Ich bin gerade beim einbauen der De-/Codierung ins Fhem Modul.
Was ich aber nicht so ganz verstehe, warum beim Senden die DIM Werte 2-9 sind, beim Empfangen aber -1 gemacht wird.
Ist das ein Fehler?

So, ich hab jetzt noch ein wenig probiert. Senden und Empfangen sind bei den DIM-Werten nicht konsequent. Sprich Dim wird z.B. mode 3 (20%) gesendet, Empfangen dann aber 10% mode 2

bjoernh

Anbei ein neues Fhem 10_IT.pm Fhem Modul.

Würdet Ihr es bitte mal ausprobieren. Vor allem das Dimmen würde mich interessieren.
Die Dosen werden beim drücken einer Fernbedienung neu angelegt.
Bereites angelegte HE800 Dosen können weiterhin geschaltet werden, aber der Status wird nicht mehr durch die Fernbedienung geändert.

Die DIM Werte / Codierung muss nach überprüft werden (siehe mein vorangegangener Post)

Wenn das Modul soweit funktioniert, würde ich es in FHEM einchecken.

Fuchks

Stimmt, da hat sich in der Ausgabe des Decoders ein Fehler eingeschlichen:
Falsch: " OFF/ON/DIM: " << (((mn[1]>>1) & 1) + (mn[6] & 0x7) + ((mn[6] & 0x8) >> 4))
Korrekt: " OFF/ON/DIM: " << (((mn[1]>>1) & 1) + (mn[6] & 0x7) + ((mn[6] & 0x8) >> 3))

Das Statusbit "Dim ON/OFF" wird damit in der Ausgabe als +2 gewertet, vorher nur mit +1.
Die Ausgabe ist damit dann konsistent.
Die Beispiele habe ich aktualisiert.

Eine Anmerkung zum Parameter "cmd" im Beispiel ("mode" im it-Modul):
Darin sind drei verschiedene Parameter des Protokolls gekapselt.
1. Ein/Aus
2. Dim Ein/Aus
3. Dim-Level

Der HE853 (USB-Sender) arbeitet folgendermaßen:
Aus: Aus & Dim Aus & Dim-Level = 0
Ein: Ein & Dim Aus & Dim-Level = 0
Dim: Ein & Dim Ein & Dim-Level = 0..7

Unklar ist, ob noch andere Kombinationen funktionieren

bjoernh

#71
Top.

Anbei das angepasste Modul. Aus meiner Sicht funktioniert es so, zumindest zwischen zwei FHEM instanzen.
Hat jemand einen Dimmer zum Testen?

Ach so, eigene Dosen können ohne Fernbedienung mit folgendem Define angelegt werden:

define mySwitchName IT HE800 <Transmitter ID> <Receiver ID>

Transmitter ID: Eindeutige Transmitter-ID (1..65535)
Receiver ID: Receiver-ID 1..15, 0=Broadcast 1-15 (HE844A button# 1-4 & MASTER=0, HE850 UNIT# 1-15, HE853 = 1)

Gruß
Björn

Fuchks

Empfang inkl. Dimming funktioniert korrekt.
Da ich nicht weiß, wie man einen Dim-Wert sendet, konnte ich das nicht testen.

bjoernh

Zitat von: Fuchks am 04 Dezember 2016, 20:24:12
Empfang inkl. Dimming funktioniert korrekt.
Da ich nicht weiß, wie man einen Dim-Wert sendet, konnte ich das nicht testen.
Du musst den Type in den Attributen auf itdimmer stellen.  Danach kannst du dimmen.

Fuchks

attr model = itdimmer - steht ja auch so in der Hilfe, wenn man genau liest  ;)

Hab alles durchgetestet, das tut wie es soll!
Gute Arbeit @bjoernh!

Wo ich eh grad am Testen war, hab ich die Dim-Werte mit einem True-RMS MM gemessen:

mode/cmd U in V U in % P in % gerundet = Dim ist
Netz 233,5 100,0% 100,0% 100%
0 Aus 0 0,0% 0,0% 0%
1 Ein vorheriger Wert
2 10% 108,5 46,5% 21,6% 20%
3 20% 118,3 50,7% 25,7% 25%
4 30% 123,7 53,0% 28,1% 30%
5 40% 139,3 59,7% 35,6% 35%
6 50% 155,7 66,7% 44,5% 45%
7 60% 179,3 76,8% 59,0% 60%
8 70% 210,0 89,9% 80,9% 80%
9 80% 231,5 99,1% 98,3% 100%


-> die Dim-Werte sind also falsch und sollten noch mal angepasst werden

Damit wird die Logik der Dim Bits auch deutlicher:
Dim On/Off: 0 = last dim-level, 1 = set dim-level
Dim level: 0 = 20%, 1 = 25%, 2 = 30%, 3 = 35%, 4 = 45%, 5 = 60%, 6 = 80%, 7 = 100% (only relevant when Dim On/Off = 1)

Das Dimmen funktioniert zusätzlich auch wie bei anderen Dimmern:
Aus -> 1. Ein = letzte Dim-Stellung
1. Ein -> 2. Ein = kontinuierlicher Durchlauf aller Dim-Level
2. Ein -> 3. Ein = Dim-Level halten



PS: attr protocol: steht nicht in der Hilfe, wird das noch verwendet?