diff --git a/idm/idm.cpp b/idm/idm.cpp index cf3156c..26eb2b0 100644 --- a/idm/idm.cpp +++ b/idm/idm.cpp @@ -55,10 +55,32 @@ Idm::~Idm() } } +void Idm::setTargetRoomTemperature (double temperature) { + QVector registers{}; + + printf("Setting target room temperature to %g\n", temperature); + + ModbusHelpers::convertFloatToRegister(registers, temperature); + + printf("registers to be sent: %x %x\n", registers[0], registers[1]); + + m_modbusMaster->writeHoldingRegisters(Idm::ModbusUnitID, Idm::RoomTemperatureHKA, registers); + + emit targetRoomTemperatureChanged(); +} + void Idm::onReceivedHoldingRegister(int slaveAddress, int modbusRegister, const QVector &value) { Q_UNUSED(slaveAddress); + /* Introducing a delay here for testing. + * Purposely set here, so one delay works for all branches + * of the following switch statement. In fact, the delay + * is used before evaluating what was just read, which + * does not seem to make sense, but it also acts before + * the next read command is sent. */ + QThread::msleep(200); + switch (modbusRegister) { case Idm::OutsideTemperature: if (value.length() == 2) { diff --git a/idm/idm.h b/idm/idm.h index 6d8b28c..d1e0d24 100644 --- a/idm/idm.h +++ b/idm/idm.h @@ -47,6 +47,8 @@ public: /** Destructor */ ~Idm(); + void setTargetRoomTemperature (double temperature); + private: /* Note: It would be desirable to read the modbus registers * of the Idm heat pump in groups to minimize the number @@ -153,6 +155,7 @@ private: signals: void statusUpdated(IdmInfo *info); + void targetRoomTemperatureChanged(); public slots: void onModbusError(); diff --git a/idm/integrationpluginidm.cpp b/idm/integrationpluginidm.cpp index 472079c..fdcb8be 100644 --- a/idm/integrationpluginidm.cpp +++ b/idm/integrationpluginidm.cpp @@ -82,6 +82,7 @@ void IntegrationPluginIdm::postSetupThing(Thing *thing) Idm *idm = m_idmConnections.value(thing); connect(idm, &Idm::statusUpdated, this, &IntegrationPluginIdm::onStatusUpdated); + connect(idm, &Idm::targetRoomTemperatureChanged, this, &IntegrationPluginIdm::onTargetRoomTemperatureChanged); qCDebug(dcIdm()) << "Thing set up, calling update"; update(thing); @@ -105,7 +106,13 @@ void IntegrationPluginIdm::executeAction(ThingActionInfo *info) if (thing->thingClassId() == navigator2ThingClassId) { if (action.actionTypeId() == navigator2PowerActionTypeId) { - } else { + + } else if (action.actionTypeId() == navigator2TargetTemperatureStateTypeId) { + Idm *idm = m_idmConnections.value(thing); + + idm->setTargetRoomTemperature(action.param(navigator2TargetTemperatureEventTargetTemperatureParamTypeId).value().value()); + + } else { Q_ASSERT_X(false, "executeAction", QString("Unhandled action: %1").arg(action.actionTypeId().toString()).toUtf8()); } } else { @@ -160,6 +167,11 @@ void IntegrationPluginIdm::onStatusUpdated(IdmInfo *info) thing->setStateValue(navigator2ErrorStateTypeId, info->m_error); } +void IntegrationPluginIdm::onTargetRoomTemperatureChanged() +{ + +} + void IntegrationPluginIdm::onRefreshTimer() { foreach (Thing *thing, myThings().filterByThingClassId(navigator2ThingClassId)) { diff --git a/idm/integrationpluginidm.h b/idm/integrationpluginidm.h index 81de0e1..5d0cc11 100644 --- a/idm/integrationpluginidm.h +++ b/idm/integrationpluginidm.h @@ -89,6 +89,7 @@ private: private slots: void onStatusUpdated(IdmInfo *info); + void onTargetRoomTemperatureChanged(); }; #endif // INTEGRATIONPLUGINIDM_H diff --git a/idm/integrationpluginidm.json b/idm/integrationpluginidm.json index 984d7e0..6f8a2e9 100644 --- a/idm/integrationpluginidm.json +++ b/idm/integrationpluginidm.json @@ -110,7 +110,7 @@ "id": "b98fb325-100d-4eae-bf8d-97e8f7e1eb00", "name": "currentPowerConsumptionHeatPump", - "displayName": "Current power consumption heat pump", + "displayName": "Curr. power consumption", "displayNameEvent": "Current power consumption heat pump changed", "displayNameAction": "Change current power consumption het pump", "type": "double", diff --git a/modbus/modbushelpers.cpp b/modbus/modbushelpers.cpp index 96b5394..ee26a03 100644 --- a/modbus/modbushelpers.cpp +++ b/modbus/modbushelpers.cpp @@ -37,7 +37,7 @@ float ModbusHelpers::convertRegisterToFloat(const quint16 *reg) { if (reg != nullptr) { /* low-order byte is sent first, so swap order */ - quint32 tmp = 0.0; + quint32 tmp = 0; tmp |= ((quint32)(reg[1]) << 16) & 0xFFFF0000; tmp |= reg[0]; @@ -50,3 +50,12 @@ float ModbusHelpers::convertRegisterToFloat(const quint16 *reg) { return result; } +void ModbusHelpers::convertFloatToRegister(QVector ®, float value) { + quint32 tmp = 0; + + memcpy((char *)&tmp, (char *)&value, sizeof(value)); + + reg.append((quint16)(tmp)); + reg.append((quint16)((tmp & 0xFFFF0000) >> 16)); +} + diff --git a/modbus/modbushelpers.h b/modbus/modbushelpers.h index c9e7af2..acea6b8 100644 --- a/modbus/modbushelpers.h +++ b/modbus/modbushelpers.h @@ -32,10 +32,12 @@ #define MODBUSHELPERS_H #include +#include class ModbusHelpers { public: static float convertRegisterToFloat(const quint16 *reg); + static void convertFloatToRegister(QVector ®, float value); }; #endif