Since last year Ovum delivers their heat pumps with a new controller and firmware solution called Mira. Unlike with older models, there has been no way to transfer data to or from the heat pump via an interface. This changed with the latest Mira firmware updates, which introduced official support for Modbus TCP (or Modbus RTU, if you really want it).
To use the Modbus interface, you must first enable it in the network settings on the control display. A login code is also displayed there, which you must write to Register 101 (FC16,
s32, big-endian) before reading or sending values.
However, if you set the login code to 1, the login requirement is disabled.
Caveat: The manufacturer itself states that data is transmitted unencrypted via the Modbus protocol and recommends operating the heat pump
exclusively within a segregated network segment or securing access via a VPN tunnel.
No login code is used in the following (meaning it is set to 1 on the device),
ovum.things
Bridge modbus:tcp:ovumHSM [ host="192.168.1.2", port=502, id=110 ] {
// Login is currently disabled (UI login code = 1). If reactivated later:
// Write-only feature, no poller required—the login/registration data is NOT persistent in Flash
// (no P_-prefix), so it can be rewritten each time there is a reconnect.
//Thing data hsmLoginWrite [ writeStart="101", writeValueType="int32", writeType="holding" ]
Bridge poller hwBlock [ start=55001, length=10, refresh=10000, type="holding" ] {
// ATTENTION: P_INT parameter (Flash!) - read-only, do not write cyclically
Thing data hwSoll "Hot Water Storage Target" @ "Utility Room" [
readStart="55001",
readValueType="int16",
readTransform="default"
]
Thing data hwDesiredTemp "Hot Water Storage Target active" @ "Utility Room" [
readStart="55004",
readValueType="float32",
readTransform="default" ]
Thing data hwActualTempO "Hot Water Storage Temperature Top" @ "Utility Room" [
readStart="55007",
readValueType="float32",
readTransform="default" ]
Thing data wwActualTempU "Hot Water Storage Temperature Bottom" @ "Utility Room" [
readStart="55009",
readValueType="float32",
readTransform="default" ]
}
Bridge poller hcBlock [ start=56048, length=9, refresh=10000, type="holding" ] {
Thing data outdoorTemp "Outside temperature" @ "Utility Room" [
readStart="56048",
readValueType="float32",
readTransform="default" ]
Thing data hc1DesiredTemp "Heating Circuit 1 Supply Temperature Target" @ "Utility Room" [
readStart="56053",
readValueType="float32",
readTransform="default" ]
Thing data hc1ActualValue "Heating Circuit 1 Supply Temperature Current" @ "Utility Room" [
readStart="56055",
readValueType="float32",
readTransform="default" ]
}
}
Bridge modbus:tcp:ovumWPM1 [ host="192.168.1.2", port=502, id=111 ] {
// See above: separate login tab for each unit ID (110 and 111 are separate,
// according to the documentation)
// Chapter 6 - Each device maintains its own local login registry.
//Thing data wpm1LoginWrite [ writeStart="101", writeValueType="int32", writeType="holding" ]
Bridge poller wpmBlock [ start=56021, length=9, refresh=10000, type="holding" ] {
Thing data wpmElectricalPower "Electrical power" @ "Utility Room" [
readStart="56021",
readValueType="float32",
readTransform="default" ]
Thing data wpmThermalPower "Thermal power" @ "Utility Room" [
readStart="56023",
readValueType="float32",
readTransform="default" ]
Thing data wpmStatus "Status" @ "Utility Room" [
readStart="56025",
readValueType="int16",
readTransform="default" ]
Thing data wpmCondenserIn "Condenser Inlet" @ "Utility Room" [
readStart="56026",
readValueType="float32",
readTransform="default" ]
Thing data wpmCondenserOut "Condenser Outlet" @ "Utility Room" [
readStart="56028",
readValueType="float32",
readTransform="default" ]
}
}
ovum.items
Number:Temperature OvumHotWaterTempTop "Hot Water Top [%.1f °C]" <temperature> (HeatpumpHotWater) { channel="modbus:data:ovumHSM:hwBlock:hwActualTempO:number" }
Number:Temperature OvumHotWaterTempBottom "Hot Water Bottom [%.1f °C]" <temperature> (HeatpumpHotWater) { channel="modbus:data:ovumHSM:hwBlock:hwActualTempU:number" }
Number:Temperature OvumHotWaterTargetTemp "Hot Water Target [%.1f °C]" <temperature> (HeatpumpHotWater) { channel="modbus:data:ovumHSM:hwBlock:hwDesiredTemp:number" }
Number:Temperature OvumOutdoorTempCurrent "Outside Temperature [%.1f °C]" <temperature> (HeatpumpGeneral) { channel="modbus:data:ovumHSM:hcBlock:outdoorTemp:number" }
Number:Temperature OvumHeatingCircuit1TargetTemp "Heating Circuit 1 Target [%.1f °C]" <temperature> (HeatpumpHeatingCircuit1) { channel="modbus:data:ovumHSM:hcBlock:hc1DesiredTemp:number" }
Number:Temperature OvumHeatingCircuit1ActualTemp "Heating Circuit 1 Current [%.1f °C]" <temperature> (HeatpumpHeatingCircuit1) { channel="modbus:data:ovumHSM:hcBlock:hc1ActualValue:number" }
Number:Power OvumInputPower "Electrical Power [%.3f kW]" <energy> (HeatpumpGeneral) { channel="modbus:data:ovumWPM1:wpmBlock:wpmElectricalPower:number" }
Number:Power OvumCondenserPower "Heating Power [%.3f kW]" <energy> (HeatpumpGeneral) { channel="modbus:data:ovumWPM1:wpmBlock:wpmThermalPower:number" }
Number OvumStatus "Heat Pump Status [MAP(ovum_status.map):%s]" <text> (HeatpumpGeneral) { channel="modbus:data:ovumWPM1:wpmBlock:wpmStatus:number" }
Number:Temperature OvumCondenserInTemp "Condenser Inlet [%.1f °C]" <temperature> (HeatpumpGeneral) { channel="modbus:data:ovumWPM1:wpmBlock:wpmCondenserIn:number" }
Number:Temperature OvumCondenserOutTemp "Condenser Outlet [%.1f °C]" <temperature> (HeatpumpGeneral) { channel="modbus:data:ovumWPM1:wpmBlock:wpmCondenserOut:number" }
ovum_status.map
0=FAULT
1=Inverter Offline
3=Blocking Time
4=Oil Preheating
5=Ready
6=Start
7=Hot Water
8=Heating
9=Cooling
10=Defrost
11=Manual De-icing
12=Stop
13=Below Operating Limit
14=Inverter Reset Process