====== SWB Telegramm ====== Das Telegramm besteht aus sieben Byte. Beim Tastendruck //"Hoch"// und //"Runter"// wird ein Telegramm mit Byte5=0x02 geschickt. Nach etwa 300 ms kommt das Telegramm mit der Art der Betätigung. //"Stop"// und //"Automatik"// dagegen senden sofort nur das Telegramm mit der Aktion. Telegramme werden so oft wiederholt bis sie Bestätigt wurden. Jedes Telegramm wird von der Steuerung mit Aktion 0 bestätigt (Zähler invertiert). Bei einer aktuellen Steurung wird ein Klick als Stop gewertet. Ein längerer Druck als Hoch oder Runter. Mit einem Doppelklick werden zwei Feste Positionen angefahren. Doppelklick Runter ist die Position die automatisch beim Sonnenschutz angefahren wird \\ \\ ==== Aufbau ==== ^ Bit ^^^^^^^^ | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 27 | 26 | 25 | 24 | 23 | 21 | 21 | 20 | | |||||||| ^ Start (Byte 1) |||||||| | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | ^ 16-Bit Adresse (Byte 2-3) |||||||| | 215 | 214 | 213 | 212 | 211 | 210 | 29 | 28 | | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | ^ Steuerung (Byte 4) |||||||| | Zähler | ||||||| | 20 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ^ Aktion (Byte 5) |||||||| | || Schalter || Aktion |||| | 0 | 0 | 21 | 20 | 23 | 22 | 21 | 20 | ^ 16-Bit Prüfsumme (Byte 6-7) |||||||| | 215 | 214 | 213 | 212 | 211 | 210 | 29 | 28 | | 27 | 26 | 25 | 24 | 23 | 21 | 21 | 20 | \\ ==== Bedeutung ==== * ** Zähler ** (Unterscheidung zwischen Wiederholung und Bestätigung) * 1 Bit * ** Schalter ** * 0: Hoch * 1: Runter * 2: Stop * 3: Automatik * ** Aktion ** * 0: "Bestätigung" * 2: Taste gedrückt * 3: Klick * 4: Druck * 5: Doppelklick * 6: EIN * 7: AUS \\ ==== Schaltereigenschaften ==== Die Aktionen sind je nach Schalter unterschiedlich ^ Funktion ^ Typ ^ Klick ^ Druck ^ Doppelklick ^ EIN ^ AUS ^ | Hoch | Taster | X | X | X | - | - | | Runter | Taster | X | X | X | - | - | | Stop | Taster | X | - | - | - | - | | Automatik | Schalter | - | - | - | X | X | \\ ==== Prüfsumme ==== Die 16 Bit Prüfsumme wird nach "CCITT Reverse" berechnet: /* creates SWB crc16 */ unint16_t createSwbCrc(unsigned char *buffer, int size) { unint16_t crc = 0xffff; // preset CRC unint16_t CRC = 0x8408; // for reverse calculation of CRC-16-CCITT int i,j; for (i=0; i < size-2; i++){ crc = crc ^ buffer[i]; for (j=0; j<8; j++){ if((crc & 0x01) == 0){ crc = crc >> 1; } else { crc = crc >> 1; crc = crc ^ CRC; } } } return ~crc; } \\ ==== Steuerung ==== Aktuell habe ich folgende Steuerung: ^ Schalter ^ Aktion ^ Befehl ^ | Stop, Hoch, Runter | Klick | STOP | | Hoch | Druck | HOCH | | Runter | Druck | RUNTER | | Hoch | Doppelklick | POS.2 | | Runter | Doppelklick | POS.1 | | Automatik | EIN | --- | | Automatik | AUS | --- |