From 361aa481daf2be0bc5d1b45b7c4dc3a7e9780665 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Tue, 25 Oct 2022 17:21:13 +0200 Subject: [PATCH] reverse engineer protocol 1 value --- gateway/include/RcDecoder.h | 40 +++++++++++++++++++++++++++++++++++++ gateway/src/gateway.cpp | 12 +++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 gateway/include/RcDecoder.h diff --git a/gateway/include/RcDecoder.h b/gateway/include/RcDecoder.h new file mode 100644 index 0000000..f3b59cf --- /dev/null +++ b/gateway/include/RcDecoder.h @@ -0,0 +1,40 @@ +#define RC_STATE(value) value & 0x1 +#define RC_DEVICE(value) (value >> 1) & 0x1F +#define RC_GROUP(value) (value >> 6) & 0x1F + +namespace RcDecoder { + + struct RcSwitch { + bool state; + char group; + char device; + }; + + void decode(unsigned long value, RcSwitch decoded) { + value = value >> 2; + unsigned long res = 0; + for (int i = 0; i < 12; i++) { + res |= ((value & 1) ^ 1) << i; + value = value >> 2; + } + decoded.state = RC_STATE(res); + decoded.group = RC_GROUP(res); + switch (RC_DEVICE(res)) { + case 0b10000: + decoded.device = 1; + break; + case 0b01000: + decoded.device = 2; + break; + case 0b00100: + decoded.device = 3; + break; + case 0b00010: + decoded.device = 4; + break; + case 0b00001: + decoded.device = 5; + break; + } + } +} \ No newline at end of file diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index 876cdef..0ed9238 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -4,7 +4,7 @@ #include "Tiny.h" #include #include "Dht.h" - +#include "RcDecoder.h" #define RESET_PIN 10 #define SEND_PIN 11 @@ -95,7 +95,15 @@ void readRcSwitch(JsonDocument& jsonDoc) { } JsonObject rcSwitch = jsonDoc.createNestedObject("rcSwitch"); rcSwitch["protocol"] = mySwitch.getReceivedProtocol(); - rcSwitch["value"] = value; + if (mySwitch.getReceivedProtocol() == 1) { + RcDecoder::RcSwitch decoded; + RcDecoder::decode(value, decoded); + rcSwitch["state"] = decoded.state; + rcSwitch["group"] = decoded.group; + rcSwitch["channel"] = decoded.device; + } else { + rcSwitch["value"] = value; + } } }