Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(protocol): support atlantic odyssee heatpumps #69

Draft
wants to merge 10 commits into
base: main
Choose a base branch
from
2 changes: 1 addition & 1 deletion AquaMQTT/include/Version.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace aquamqtt
{
constexpr char VERSION[] = "v1.6.0";
constexpr char VERSION[] = "v1.7.0";
}
6 changes: 5 additions & 1 deletion AquaMQTT/include/buffer/FrameBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
class FrameBuffer
{
public:
explicit FrameBuffer(bool handle194, bool handle193, bool handle67, bool handle74);
explicit FrameBuffer(bool handle194, bool handle193, bool handle67, bool handle74, bool handle217);

~FrameBuffer() = default;

Expand Down Expand Up @@ -40,11 +40,15 @@ class FrameBuffer
bool mHandle193;
bool mHandle67;
bool mHandle74;
bool mHandle217;

uint64_t mDroppedCount;
uint64_t mCRCFailCount;
uint64_t mUnhandledCount;
uint64_t mHandledCount;

uint8_t mPreviousFrameId;
unsigned long mLastValidFrameTimestamp;
};

#endif // AQUAMQTT_FRAMEBUFFER_H
12 changes: 6 additions & 6 deletions AquaMQTT/include/config/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ constexpr char ntpServer[] = "pool.ntp.org";
/**
* Enable HomeAssistant MQTT Discovery Mode
*/
constexpr bool ENABLE_HOMEASSISTANT_DISCOVERY_MODE = true;
constexpr bool ENABLE_HOMEASSISTANT_DISCOVERY_MODE = false;

/**
* Homeassistant MQTT Discovery Prefix
Expand All @@ -49,7 +49,7 @@ constexpr char haDiscoveryPrefix[] = "homeassistant/";
/**
* The OperationMode which is used for AquaMqtt. Refer to EOperationMode
*/
constexpr EOperationMode OPERATION_MODE = EOperationMode::MITM;
constexpr EOperationMode OPERATION_MODE = EOperationMode::LISTENER;

/**
* Choose if the time and date values sent to the main controller should override the ones sent by the hmi controller.
Expand All @@ -59,23 +59,23 @@ constexpr bool OVERRIDE_TIME_AND_DATE_IN_MITM = true;
/**
* Choose to publish raw messages represented as hex-string on debug mqtt topics
*/
constexpr bool DEBUG_RAW_SERIAL_MESSAGES = false;
constexpr bool DEBUG_RAW_SERIAL_MESSAGES = true;

/**
* Choose to publish message statistics from the serial interfaces, if everything
* works as it should you may disable this. If set to true, this will provide the
* topics "msgHandled, msgUnhandled, msgCRCNOK and msgSent" topics for each serial
* channel (hmi/main or listener),
*/
constexpr bool MQTT_PUBLISH_SERIAL_STATISTICS = false;
constexpr bool MQTT_PUBLISH_SERIAL_STATISTICS = true;

/**
* Choose to publish time and date used by the heatpump. This is mainly for debugging
* if the time and date override from AquaMQTT works as expected. You may want to
* enable this, if you are customizing the NTP timezone or server or even trying to
* use the RTC module from the AquaMQTT board.
*/
constexpr bool MQTT_PUBLISH_HEATPUMP_TIME_AND_DATE = false;
constexpr bool MQTT_PUBLISH_HEATPUMP_TIME_AND_DATE = true;

/**
* Change the time interval where all known attributes are re-published to the MQTT broker.
Expand All @@ -92,7 +92,7 @@ constexpr uint16_t MQTT_STATS_UPDATE_MS = 5000;
* Note: Filters are only applied within the MQTT channel, the communication between HMI and Controller
* are still using raw temperature values and is not altered.
*/
constexpr bool MQTT_FILTER_TEMPERATURE_NOISE = true;
constexpr bool MQTT_FILTER_TEMPERATURE_NOISE = false;

/**
* Parametrize kalman filter for reading temperature values
Expand Down
117 changes: 117 additions & 0 deletions AquaMQTT/include/message/Factory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#ifndef MESSAGE_FACTORY_H
#define MESSAGE_FACTORY_H

#include <memory>

#include "IEnergyMessage.h"
#include "IHMIMessage.h"
#include "IMainMessage.h"
#include "MessageConstants.h"
#include "legacy/ErrorMessage.h"
#include "legacy/HMIMessage.h"
#include "legacy/MainEnergyMessage.h"
#include "legacy/MainStatusMessage.h"
#include "next/ErrorMessage.h"
#include "next/HMIMessage.h"
#include "next/MainEnergyMessage.h"
#include "next/MainStatusMessage.h"
#include "odyssee/ErrorMessage.h"
#include "odyssee/ExtraMessage.h"
#include "odyssee/HMIMessage.h"
#include "odyssee/MainEnergyMessage.h"
#include "odyssee/MainStatusMessage.h"

namespace aquamqtt::message
{
class IExtraMessage;
class IErrorMessage;

static std::unique_ptr<IHMIMessage>
createHmiMessageFromBuffer(const ProtocolVersion version, uint8_t* buffer, uint8_t* previousBuffer = nullptr)
{
std::unique_ptr<IHMIMessage> message;
if (version == message::PROTOCOL_LEGACY)
{
message = std::make_unique<legacy::HMIMessage>(buffer, previousBuffer);
}
else if (version == PROTOCOL_ODYSSEE)
{
message = std::make_unique<odyssee::HMIMessage>(buffer, previousBuffer);
}
else
{
message = std::make_unique<next::HMIMessage>(buffer, previousBuffer);
}

return std::move(message);
}

static std::unique_ptr<IMainMessage>
createMainMessageFromBuffer(const ProtocolVersion version, uint8_t* buffer, uint8_t* previousBuffer = nullptr)
{
std::unique_ptr<IMainMessage> message;
if (version == PROTOCOL_NEXT)
{
message = std::make_unique<next::MainStatusMessage>(buffer, previousBuffer);
}
else if (version == PROTOCOL_ODYSSEE)
{
message = std::make_unique<odyssee::MainStatusMessage>(buffer, previousBuffer);
}
else
{
message = std::make_unique<legacy::MainStatusMessage>(buffer, previousBuffer);
}
return std::move(message);
}

static std::unique_ptr<IEnergyMessage> createEnergyMessageFromBuffer(
const ProtocolVersion version,
uint8_t* buffer,
uint8_t* previousBuffer = nullptr)
{
std::unique_ptr<message::IEnergyMessage> message;
if (version == PROTOCOL_NEXT)
{
message = std::make_unique<next::MainEnergyMessage>(buffer, previousBuffer);
}
else if (version == PROTOCOL_ODYSSEE)
{
message = std::make_unique<odyssee::MainEnergyMessage>(buffer, previousBuffer);
}
else
{
message = std::make_unique<legacy::MainEnergyMessage>(buffer, previousBuffer);
}
return std::move(message);
}

static std::unique_ptr<IErrorMessage> createErrorMessageFromBuffer(const ProtocolVersion version, uint8_t* buffer)
{
std::unique_ptr<IErrorMessage> message;
if (version == PROTOCOL_NEXT)
{
message = std::make_unique<next::ErrorMessage>(buffer);
}
else if (version == PROTOCOL_ODYSSEE)
{
message = std::make_unique<odyssee::ErrorMessage>(buffer);
}
else
{
message = std::make_unique<legacy::ErrorMessage>(buffer);
}

return std::move(message);
}

static std::unique_ptr<IExtraMessage>
createExtraMessageFromBuffer(const ProtocolVersion version, uint8_t* buffer, uint8_t* previousBuffer = nullptr)
{
std::unique_ptr<IExtraMessage> message = std::make_unique<odyssee::ExtraMessage>(buffer, previousBuffer);
return std::move(message);
}

} // namespace aquamqtt::message

#endif // MESSAGE_FACTORY_H
30 changes: 30 additions & 0 deletions AquaMQTT/include/message/IExtraMessage.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#ifndef AQUAMQTT_IEXTRAMESSAGE_H
#define AQUAMQTT_IEXTRAMESSAGE_H

#include "MessageConstants.h"

namespace aquamqtt::message
{

enum class EXTRA_ATTR_U16
{
EXTRA_POWER_TOTAL,
EXTRA_VOLTAGE_GRID
};

class IExtraMessage
{
public:
virtual ~IExtraMessage() = default;

virtual uint8_t getLength() = 0;

virtual uint16_t getAttr(EXTRA_ATTR_U16 attr) = 0;

virtual bool hasAttr(EXTRA_ATTR_U16 attr) const = 0;

virtual bool hasChanged(EXTRA_ATTR_U16 attr) const = 0;
};
} // namespace aquamqtt::message

#endif //AQUAMQTT_IEXTRAMESSAGE_H
2 changes: 2 additions & 0 deletions AquaMQTT/include/message/IMainMessage.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ enum class MAIN_ATTR_FLOAT
EVAPORATOR_LOWER_TEMPERATURE,
COMPRESSOR_OUTLET_TEMPERATURE,
FAN_SPEED_PWM,
WATER_UPPER_TEMPERATURE,
WATER_LOWER_TEMPERATURE,
};

enum class MAIN_ATTR_BOOL
Expand Down
Loading