From 64ed7d4afab5a68b46d5acb8b9cee79b072ef808 Mon Sep 17 00:00:00 2001 From: Stefan Persson Date: Mon, 3 Jun 2013 12:08:30 +0200 Subject: [PATCH] Inital Oregon Scientific v3 support (F824) --- telldus-core/service/ProtocolOregon.cpp | 53 +++++++++++++++++++++++++ telldus-core/service/ProtocolOregon.h | 1 + 2 files changed, 54 insertions(+) diff --git a/telldus-core/service/ProtocolOregon.cpp b/telldus-core/service/ProtocolOregon.cpp index 6882019a..4fb962b5 100644 --- a/telldus-core/service/ProtocolOregon.cpp +++ b/telldus-core/service/ProtocolOregon.cpp @@ -19,6 +19,8 @@ std::string ProtocolOregon::decodeData(const ControllerMessage &dataMsg) { return decodeEA4C(data); } else if (model.compare(L"0x1A2D") == 0) { return decode1A2D(data); + } else if (model.compare(L"0xF824") == 0) { + return decodeF824(data); } return ""; @@ -125,3 +127,54 @@ std::string ProtocolOregon::decode1A2D(const std::string &data) { return retString.str(); } + +std::string ProtocolOregon::decodeF824(const std::string &data) { + + uint64_t value = TelldusCore::hexTo64l(data); + + uint8_t crcCheck = value & 0xF; //PROBABLY crc + value >>= 4; + uint8_t messageChecksum1 = value & 0xF; + value >>= 4; + uint8_t messageChecksum2 = value & 0xF; + value >>= 4; + uint8_t unknown = value & 0xF; + value >>= 4; + uint8_t hum1 = value & 0xF; + value >>= 4; + uint8_t hum2 = value & 0xF; + value >>= 4; + uint8_t neg = value & 0xF; + value >>= 4; + uint8_t temp1 = value & 0xF; + value >>= 4; + uint8_t temp2 = value & 0xF; + value >>= 4; + uint8_t temp3 = value & 0xF; + value >>= 4; + uint8_t battery = value & 0xF; //PROBABLY battery + value >>= 4; + uint8_t rollingcode = ((value >> 4) & 0xF) + (value & 0xF); + uint8_t checksum = ((value >> 4) & 0xF) + (value & 0xF); + value >>= 8; + uint8_t channel = value & 0xF; + checksum += unknown + hum1 + hum2 + neg + temp1 + temp2 + temp3 + battery + channel + 0xF + 0x8 + 0x2 + 0x4; + + if (((checksum >> 4) & 0xF) != messageChecksum1 || (checksum & 0xF) != messageChecksum2){ + //checksum error + return ""; + } + + double temperature = ((temp1 * 100) + (temp2 * 10) + temp3)/10.0; + if (neg) { + temperature = -temperature; + } + int humidity = (hum1 * 10.0) + hum2; + + std::stringstream retString; + retString << "class:sensor;protocol:oregon;model:F824;id:" << static_cast(rollingcode) + << ";temp:" << std::fixed << std::setprecision(1) << temperature + << ";humidity:" << humidity << ";"; + + return retString.str(); +} diff --git a/telldus-core/service/ProtocolOregon.h b/telldus-core/service/ProtocolOregon.h index 1da70dc1..f0c757a8 100644 --- a/telldus-core/service/ProtocolOregon.h +++ b/telldus-core/service/ProtocolOregon.h @@ -18,6 +18,7 @@ public: protected: static std::string decodeEA4C(const std::string &data); static std::string decode1A2D(const std::string &data); + static std::string decodeF824(const std::string &data); }; #endif // TELLDUS_CORE_SERVICE_PROTOCOLOREGON_H_