Skip to content

Commit be5d215

Browse files
committed
prepare(legacy_alt): prepare support of alternative legacy protocol
1 parent fe230df commit be5d215

File tree

11 files changed

+1222
-35
lines changed

11 files changed

+1222
-35
lines changed

AquaMQTT/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.pio
22
include/config/CustomConfiguration.h
33
include/config/CustomConfigurationProd.h
4-
.vscode
4+
.vscode
5+
.idea

AquaMQTT/include/config/Configuration.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ constexpr bool MQTT_PUBLISH_SERIAL_STATISTICS = false;
102102
*/
103103
constexpr bool MQTT_PUBLISH_HEATPUMP_TIME_AND_DATE = false;
104104

105+
/**
106+
* Change this to use the alternative legacy protocol.
107+
* There are heatpumps which use the legacy protocol identifiers ( id + length)
108+
* but send different payloads Currently AquaMQTT does not support auto-detecting
109+
* this special protocol type. In case you observe weird attributes and your heatpump
110+
* is using the LEGACY protocol, you may set this flag to true.
111+
*/
112+
constexpr bool PROTOCOL_USE_LEGACY_ALTERNATIVE = false;
113+
105114
/**
106115
* Change the time interval where all known attributes are re-published to the MQTT broker.
107116
*/

AquaMQTT/lib/AtlanticSerialProtocol/include/message/Factory.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include "legacy/HMIMessage.h"
1212
#include "legacy/MainEnergyMessage.h"
1313
#include "legacy/MainStatusMessage.h"
14+
#include "legacy_alternative/HMIMessage.h"
15+
#include "legacy_alternative/MainStatusMessage.h"
1416
#include "next/ErrorMessage.h"
1517
#include "next/HMIMessage.h"
1618
#include "next/MainEnergyMessage.h"
@@ -34,6 +36,10 @@ static std::unique_ptr<IHMIMessage>
3436
{
3537
message = std::make_unique<legacy::HMIMessage>(buffer, previousBuffer);
3638
}
39+
if (version == PROTOCOL_LEGACY_ALTERNATIVE)
40+
{
41+
message = std::make_unique<legacyalt::HMIMessage>(buffer, previousBuffer);
42+
}
3743
else if (version == PROTOCOL_ODYSSEE)
3844
{
3945
message = std::make_unique<odyssee::HMIMessage>(buffer, previousBuffer);
@@ -58,6 +64,10 @@ static std::unique_ptr<IMainMessage>
5864
{
5965
message = std::make_unique<odyssee::MainStatusMessage>(buffer, previousBuffer);
6066
}
67+
else if (version == PROTOCOL_LEGACY_ALTERNATIVE)
68+
{
69+
message = std::make_unique<legacyalt::MainStatusMessage>(buffer, previousBuffer);
70+
}
6171
else
6272
{
6373
message = std::make_unique<legacy::MainStatusMessage>(buffer, previousBuffer);
@@ -79,6 +89,7 @@ static std::unique_ptr<IEnergyMessage> createEnergyMessageFromBuffer(
7989
{
8090
message = std::make_unique<odyssee::MainEnergyMessage>(buffer, previousBuffer);
8191
}
92+
// LEGACY + LEGACY ALTERNATIVE
8293
else
8394
{
8495
message = std::make_unique<legacy::MainEnergyMessage>(buffer, previousBuffer);
@@ -97,6 +108,7 @@ static std::unique_ptr<IErrorMessage> createErrorMessageFromBuffer(const Protoco
97108
{
98109
message = std::make_unique<odyssee::ErrorMessage>(buffer);
99110
}
111+
// LEGACY + LEGACY ALTERNATIVE
100112
else
101113
{
102114
message = std::make_unique<legacy::ErrorMessage>(buffer);

AquaMQTT/lib/AtlanticSerialProtocol/include/message/MessageConstants.h

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#ifndef AQUAMQTT_MESSAGECONSTANTS_H
22
#define AQUAMQTT_MESSAGECONSTANTS_H
33

4-
#include <cstdio>
54
#include <cstdint>
5+
#include <cstdio>
66

77
#include "mqtt/MQTTDefinitions.h"
88

@@ -21,10 +21,11 @@ enum class FrameBufferChannel
2121

2222
enum ProtocolVersion
2323
{
24-
PROTOCOL_UNKNOWN = -1,
25-
PROTOCOL_LEGACY = 0,
26-
PROTOCOL_NEXT = 1,
27-
PROTOCOL_ODYSSEE = 2
24+
PROTOCOL_UNKNOWN = -1,
25+
PROTOCOL_LEGACY = 0,
26+
PROTOCOL_NEXT = 1,
27+
PROTOCOL_ODYSSEE = 2,
28+
PROTOCOL_LEGACY_ALTERNATIVE = 3,
2829
};
2930

3031
enum ProtocolChecksum
@@ -58,7 +59,7 @@ constexpr uint8_t EXTRA_MESSAGE_IDENTIFIER = 217;
5859
constexpr uint8_t EXTRA_MESSAGE_LENGTH_ODYSSEE = 31;
5960

6061
// this will work as long as they will always differ in length
61-
static ProtocolVersion getVersionByIdentifier(uint8_t identifier, uint8_t length)
62+
static ProtocolVersion getVersionByIdentifier(uint8_t identifier, uint8_t length, bool useAlternative)
6263
{
6364
if (identifier == HMI_MESSAGE_IDENTIFIER)
6465
{
@@ -69,6 +70,10 @@ static ProtocolVersion getVersionByIdentifier(uint8_t identifier, uint8_t length
6970
case HMI_MESSAGE_LENGTH_ODYSSEE:
7071
return PROTOCOL_ODYSSEE;
7172
case HMI_MESSAGE_LENGTH_LEGACY:
73+
if (useAlternative)
74+
{
75+
return PROTOCOL_LEGACY_ALTERNATIVE;
76+
}
7277
return PROTOCOL_LEGACY;
7378
default:
7479
break;
@@ -83,6 +88,10 @@ static ProtocolVersion getVersionByIdentifier(uint8_t identifier, uint8_t length
8388
case MAIN_MESSAGE_LENGTH_ODYSSEE:
8489
return PROTOCOL_ODYSSEE;
8590
case MAIN_MESSAGE_LENGTH_LEGACY:
91+
if (useAlternative)
92+
{
93+
return PROTOCOL_LEGACY_ALTERNATIVE;
94+
}
8695
return PROTOCOL_LEGACY;
8796
default:
8897
break;
@@ -97,6 +106,10 @@ static ProtocolVersion getVersionByIdentifier(uint8_t identifier, uint8_t length
97106
case ENERGY_MESSAGE_LENGTH_ODYSSEE:
98107
return PROTOCOL_ODYSSEE;
99108
case ENERGY_MESSAGE_LENGTH_LEGACY:
109+
if (useAlternative)
110+
{
111+
return PROTOCOL_LEGACY_ALTERNATIVE;
112+
}
100113
return PROTOCOL_LEGACY;
101114
default:
102115
break;
@@ -111,6 +124,10 @@ static ProtocolVersion getVersionByIdentifier(uint8_t identifier, uint8_t length
111124
case ERROR_MESSAGE_LENGTH_ODYSSEE:
112125
return PROTOCOL_ODYSSEE;
113126
case ERROR_MESSAGE_LENGTH_LEGACY:
127+
if (useAlternative)
128+
{
129+
return PROTOCOL_LEGACY_ALTERNATIVE;
130+
}
114131
return PROTOCOL_LEGACY;
115132
default:
116133
break;
@@ -140,6 +157,7 @@ static uint8_t lengthByFrameIdAndProtocol(const uint8_t frameId, const ProtocolV
140157
case PROTOCOL_ODYSSEE:
141158
return HMI_MESSAGE_LENGTH_ODYSSEE;
142159
case PROTOCOL_LEGACY:
160+
case PROTOCOL_LEGACY_ALTERNATIVE:
143161
default:
144162
return HMI_MESSAGE_LENGTH_LEGACY;
145163
}
@@ -153,6 +171,7 @@ static uint8_t lengthByFrameIdAndProtocol(const uint8_t frameId, const ProtocolV
153171
case PROTOCOL_ODYSSEE:
154172
return MAIN_MESSAGE_LENGTH_ODYSSEE;
155173
case PROTOCOL_LEGACY:
174+
case PROTOCOL_LEGACY_ALTERNATIVE:
156175
default:
157176
return MAIN_MESSAGE_LENGTH_LEGACY;
158177
}
@@ -166,6 +185,7 @@ static uint8_t lengthByFrameIdAndProtocol(const uint8_t frameId, const ProtocolV
166185
case PROTOCOL_ODYSSEE:
167186
return ENERGY_MESSAGE_LENGTH_ODYSSEE;
168187
case PROTOCOL_LEGACY:
188+
case PROTOCOL_LEGACY_ALTERNATIVE:
169189
default:
170190
return ENERGY_MESSAGE_LENGTH_LEGACY;
171191
}
@@ -179,6 +199,7 @@ static uint8_t lengthByFrameIdAndProtocol(const uint8_t frameId, const ProtocolV
179199
case PROTOCOL_ODYSSEE:
180200
return ERROR_MESSAGE_LENGTH_ODYSSEE;
181201
case PROTOCOL_LEGACY:
202+
case PROTOCOL_LEGACY_ALTERNATIVE:
182203
default:
183204
return ERROR_MESSAGE_LENGTH_LEGACY;
184205
}
@@ -196,6 +217,8 @@ static const char* protocolVersionStr(ProtocolVersion version)
196217
{
197218
case PROTOCOL_LEGACY:
198219
return reinterpret_cast<const char*>(mqtt::ENUM_AQUAMQTT_PROTOCOL_LEGACY);
220+
case PROTOCOL_LEGACY_ALTERNATIVE:
221+
return reinterpret_cast<const char*>(mqtt::ENUM_AQUAMQTT_PROTOCOL_LEGACY_ALT);
199222
case PROTOCOL_NEXT:
200223
return reinterpret_cast<const char*>(mqtt::ENUM_AQUAMQTT_PROTOCOL_NEXT);
201224
case PROTOCOL_ODYSSEE:
@@ -248,10 +271,10 @@ static const char* operationModeStr(HMIOperationMode mode)
248271

249272
enum HMIOperationType : int
250273
{
251-
OT_UNKNOWN = -1,
274+
OT_UNKNOWN = -1,
252275
OT_OFF_PEAK_HOURS = 0,
253-
OT_ALWAYS_ON = 1,
254-
OT_TIMER = 2,
276+
OT_ALWAYS_ON = 1,
277+
OT_TIMER = 2,
255278

256279
};
257280

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#ifndef AQUAMQTT_LEGACYALTHMIMESSAGE_H
2+
#define AQUAMQTT_LEGACYALTHMIMESSAGE_H
3+
4+
#include <cstring>
5+
#include <set>
6+
7+
#include "message/IHMIMessage.h"
8+
9+
namespace aquamqtt::message::legacyalt
10+
{
11+
class HMIMessage : public IHMIMessage
12+
{
13+
public:
14+
explicit HMIMessage(uint8_t* data, const uint8_t* previous = nullptr);
15+
16+
~HMIMessage() override = default;
17+
18+
uint8_t getLength() override;
19+
20+
void setDateMonthAndYear(uint8_t month, uint16_t year) const override;
21+
22+
uint8_t getAttr(HMI_ATTR_U8 attr) override;
23+
uint16_t getAttr(HMI_ATTR_U16 attr) override;
24+
bool getAttr(HMI_ATTR_BOOL attr) override;
25+
float getAttr(HMI_ATTR_FLOAT attr) override;
26+
void getAttr(HMI_ATTR_STR attr, char* buffer) override;
27+
28+
void setAttr(HMI_ATTR_U8 attr, uint8_t value) override;
29+
void setAttr(HMI_ATTR_U16 attr, uint16_t value) override;
30+
void setAttr(HMI_ATTR_BOOL attr, bool value) override;
31+
void setAttr(HMI_ATTR_FLOAT attr, float value) override;
32+
33+
bool hasAttr(HMI_ATTR_U8 attr) const override;
34+
bool hasAttr(HMI_ATTR_U16 attr) const override;
35+
bool hasAttr(HMI_ATTR_BOOL attr) const override;
36+
bool hasAttr(HMI_ATTR_FLOAT attr) const override;
37+
bool hasAttr(HMI_ATTR_STR attr) const override;
38+
39+
bool hasChanged(HMI_ATTR_U8 attr) const override;
40+
bool hasChanged(HMI_ATTR_U16 attr) const override;
41+
bool hasChanged(HMI_ATTR_BOOL attr) const override;
42+
bool hasChanged(HMI_ATTR_FLOAT attr) const override;
43+
bool hasChanged(HMI_ATTR_STR attr) const override;
44+
45+
private:
46+
void compareWith(const uint8_t* data);
47+
48+
bool mCreatedWithoutPrevious;
49+
std::set<HMI_ATTR_U8> mHasChangedU8;
50+
std::set<HMI_ATTR_U16> mHasChangedU16;
51+
std::set<HMI_ATTR_BOOL> mHasChangedBool;
52+
std::set<HMI_ATTR_FLOAT> mHasChangedFloat;
53+
std::set<HMI_ATTR_STR> mHasChangedStr;
54+
55+
uint8_t* mData;
56+
};
57+
} // namespace aquamqtt::message::legacy
58+
59+
#endif // AQUAMQTT_LEGACYALTHMIMESSAGE_H
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#ifndef AQUAMQTT_LEGACYALTMAINSTATUSMESSAGE_H
2+
#define AQUAMQTT_LEGACYALTMAINSTATUSMESSAGE_H
3+
4+
#include <cstring>
5+
#include <memory>
6+
#include <set>
7+
8+
#include "message/IMainMessage.h"
9+
10+
namespace aquamqtt::message::legacyalt
11+
{
12+
class MainStatusMessage : public IMainMessage
13+
{
14+
public:
15+
explicit MainStatusMessage(uint8_t* data, const uint8_t* previous = nullptr);
16+
17+
~MainStatusMessage() override = default;
18+
19+
uint8_t getLength() override;
20+
21+
float getAttr(MAIN_ATTR_FLOAT attr) override;
22+
bool getAttr(MAIN_ATTR_BOOL attr) override;
23+
uint8_t getAttr(MAIN_ATTR_U8 attr) override;
24+
uint16_t getAttr(MAIN_ATTR_U16 attr) override;
25+
26+
void setAttr(MAIN_ATTR_FLOAT attr, float value) override;
27+
void setAttr(MAIN_ATTR_BOOL attr, bool value) override;
28+
void setAttr(MAIN_ATTR_U8 attr, uint8_t value) override;
29+
void setAttr(MAIN_ATTR_U16 attr, uint16_t value) override;
30+
31+
bool hasAttr(MAIN_ATTR_FLOAT attr) const override;
32+
bool hasAttr(MAIN_ATTR_BOOL attr) const override;
33+
bool hasAttr(MAIN_ATTR_U8 attr) const override;
34+
bool hasAttr(MAIN_ATTR_U16 attr) const override;
35+
36+
bool hasChanged(MAIN_ATTR_FLOAT attr) const override;
37+
bool hasChanged(MAIN_ATTR_BOOL attr) const override;
38+
bool hasChanged(MAIN_ATTR_U8 attr) const override;
39+
bool hasChanged(MAIN_ATTR_U16 attr) const override;
40+
41+
private:
42+
void compareWith(const uint8_t* data);
43+
44+
bool mCreatedWithoutPrevious;
45+
uint8_t* mData;
46+
47+
std::set<MAIN_ATTR_FLOAT> mHasChangedFloat;
48+
std::set<MAIN_ATTR_BOOL> mHasChangedBool;
49+
std::set<MAIN_ATTR_U8> mHasChangedU8;
50+
std::set<MAIN_ATTR_U16> mHasChangedU16;
51+
};
52+
53+
} // namespace aquamqtt::message::legacy
54+
55+
#endif // AQUAMQTT_LEGACYALTMAINSTATUSMESSAGE_H

AquaMQTT/lib/AtlanticSerialProtocol/include/mqtt/MQTTDefinitions.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ constexpr char ENUM_UNKNOWN[] = { "UNKNOWN" };
2020
constexpr char ENUM_AQUAMQTT_MODE_LISTENER[] = { "LISTENER" };
2121
constexpr char ENUM_AQUAMQTT_MODE_MITM[] = { "MITM" };
2222

23-
constexpr char ENUM_AQUAMQTT_PROTOCOL_LEGACY[] = { "LEGACY" };
24-
constexpr char ENUM_AQUAMQTT_PROTOCOL_NEXT[] = { "NEXT" };
25-
constexpr char ENUM_AQUAMQTT_PROTOCOL_ODYSSEE[] = { "ODYSSEE" };
23+
constexpr char ENUM_AQUAMQTT_PROTOCOL_LEGACY[] = { "LEGACY" };
24+
constexpr char ENUM_AQUAMQTT_PROTOCOL_LEGACY_ALT[] = { "LEGACY_ALT" };
25+
constexpr char ENUM_AQUAMQTT_PROTOCOL_NEXT[] = { "NEXT" };
26+
constexpr char ENUM_AQUAMQTT_PROTOCOL_ODYSSEE[] = { "ODYSSEE" };
2627

2728
constexpr char ENUM_BRAND_ATLANTIC[] = { "Atlantic" };
2829
constexpr char ENUM_BRAND_THERMOR[] = { "Thermor" };

0 commit comments

Comments
 (0)