diff --git a/telldus-core/service/CMakeLists.txt b/telldus-core/service/CMakeLists.txt index a3e724b2..5a1e1b8a 100644 --- a/telldus-core/service/CMakeLists.txt +++ b/telldus-core/service/CMakeLists.txt @@ -34,6 +34,8 @@ SET( telldus-service_protocol_SRCS ProtocolComen.cpp ProtocolEverflourish.h ProtocolEverflourish.cpp + ProtocolFineoffset.h + ProtocolFineoffset.cpp ProtocolFuhaote.h ProtocolFuhaote.cpp ProtocolGroup.h diff --git a/telldus-core/service/Protocol.cpp b/telldus-core/service/Protocol.cpp index ebcfebb3..8b9a00c2 100644 --- a/telldus-core/service/Protocol.cpp +++ b/telldus-core/service/Protocol.cpp @@ -5,6 +5,7 @@ #include "ProtocolBrateck.h" #include "ProtocolComen.h" #include "ProtocolEverflourish.h" +#include "ProtocolFineoffset.h" #include "ProtocolFuhaote.h" #include "ProtocolGroup.h" #include "ProtocolHasta.h" @@ -195,10 +196,10 @@ std::list Protocol::getParametersForProtocol(const std::wstring &pr } else if (TelldusCore::comparei(protocolName, L"yidong")) { parameters.push_back("unit"); - + } else if (TelldusCore::comparei(protocolName, L"group")) { parameters.push_back("devices"); - + } else if (TelldusCore::comparei(protocolName, L"scene")) { parameters.push_back("devices"); } @@ -209,7 +210,7 @@ std::list Protocol::getParametersForProtocol(const std::wstring &pr std::list Protocol::decodeData(const std::string &fullData) { std::list retval; std::string decoded = ""; - + ControllerMessage dataMsg(fullData); if( TelldusCore::comparei(dataMsg.protocol(), L"arctech") ) { decoded = ProtocolNexa::decodeData(dataMsg); @@ -231,12 +232,18 @@ std::list Protocol::decodeData(const std::string &fullData) { retval.push_back(decoded); } } + else if(TelldusCore::comparei(dataMsg.protocol(), L"fineoffset") ) { + decoded = ProtocolFineoffset::decodeData(dataMsg); + if (decoded != "") { + retval.push_back(decoded); + } + } else if(TelldusCore::comparei(dataMsg.protocol(), L"x10") ) { decoded = ProtocolX10::decodeData(dataMsg); if (decoded != "") { retval.push_back(decoded); } } - + return retval; } diff --git a/telldus-core/service/ProtocolFineoffset.cpp b/telldus-core/service/ProtocolFineoffset.cpp new file mode 100644 index 00000000..4883c92b --- /dev/null +++ b/telldus-core/service/ProtocolFineoffset.cpp @@ -0,0 +1,45 @@ +#include "ProtocolFineoffset.h" +#include +#include +#include +#include + +std::string ProtocolFineoffset::decodeData(ControllerMessage &dataMsg) +{ + std::string data = dataMsg.getParameter("data"); + if (data.length() < 8) { + return ""; + } + + uint8_t checksum = strtol(data.substr(data.length()-2).c_str(), NULL, 16); + data = data.substr(0, data.length()-2); + + uint8_t humidity = strtol(data.substr(data.length()-2).c_str(), NULL, 16); + data = data.substr(0, data.length()-2); + + uint16_t value = strtol(data.substr(data.length()-3).c_str(), NULL, 16); + double temperature = (value & 0x7FF)/10.0; + + value >>= 11; + if (value & 1) { + temperature = -temperature; + } + data = data.substr(0, data.length()-3); + + uint16_t id = strtol(data.c_str(), NULL, 16) & 0xFF; + + std::stringstream retString; + retString << "class:sensor;protocol:fineoffset;id:" << id << ";model:"; + + if (humidity <= 100) { + retString << "temperaturehumidity;humidity:" << (int)humidity << ";"; + } else if (humidity == 0xFF) { + retString << "temperature;"; + } else { + return ""; + } + + retString << "temp:" << std::fixed << std::setprecision(1) << temperature << ";"; + + return retString.str(); +} diff --git a/telldus-core/service/ProtocolFineoffset.h b/telldus-core/service/ProtocolFineoffset.h new file mode 100644 index 00000000..fbae92c0 --- /dev/null +++ b/telldus-core/service/ProtocolFineoffset.h @@ -0,0 +1,13 @@ +#ifndef PROTOCOLFINEOFFSET_H +#define PROTOCOLFINEOFFSET_H + +#include "ControllerMessage.h" +#include "Protocol.h" + +class ProtocolFineoffset : public Protocol +{ +public: + static std::string decodeData(ControllerMessage &dataMsg); +}; + +#endif //PROTOCOLFINEOFFSET_H