# Grant R290 (Econet) MQTT publisher

**URL:** <https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121>\
**Category:** Heatpump\
**Created:** [19 September 2025 23:25 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121 "2025-09-19T23:25:59Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![MrW](https://community.openenergymonitor.org/letter_avatar_proxy/v4/letter/m/c4cdca/32.png) [@MrW](https://community.openenergymonitor.org/u/MrW)\
**Post date:** [19 September 2025 23:25 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/1 "2025-09-19T23:25:59Z")

</div>

In case this is useful for anyone, I’ve just knocked up a quick MQTT publisher for my Grant R290 with an Econet controller, which includes Home Assistant device detection so if you have an MQTT broker and HA knows about it, it will automatically pick it up.

 ![image](https://community.openenergymonitor.org/uploads/default/original/3X/0/c/0c66d749910409e30698795de375e807958f7c30.png)

Be warned that the Econet stats I fetch are very undocumented, I have no idea if they change with different versions so treat this as experimental, but it’s easy to get running with docker in case you fancied it!

> **[GitHub - mikewhitby/econet-mqtt-publisher: An MQTT publisher for the Grant R290 (Axen?) ASHP...](https://github.com/mikewhitby/econet-mqtt-publisher)**
>
> An MQTT publisher for the Grant R290 (Axen?) ASHP with an Econet controller

---

<div class="post-metadata">

**Author:** ![glyn.hudson](https://community.openenergymonitor.org/user_avatar/community.openenergymonitor.org/glyn.hudson/32/35003_2.png) [@glyn.hudson](https://community.openenergymonitor.org/u/glyn.hudson)\
**Post date:** [20 September 2025 12:27 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/2 "2025-09-20T12:27:28Z")

</div>

Nice work!

I’ve been using this HA integration, it grabs data from the EcoNet via local HTTP, but compared to your integration it looks like it’s missing a few metrics

> **[GitHub - jontofront/ecoNET-300-Home-Assistant-Integration: ecoNET 300 integration to HA](https://github.com/jontofront/ecoNET-300-Home-Assistant-Integration)**
>
> ecoNET 300 integration to HA

 ![Screenshot from 2025-09-20 13-25-28](https://community.openenergymonitor.org/uploads/default/original/3X/7/a/7a03f25c9106df4a8c323003e1ed060afb458928.png)

It seems that control is also possible via the Econet local HTTP interface e.g the following will set Circuit 1 to 20.5C

`http://<ECONET-LOCAL_IP>/econet/newParam?newParamName=238&newParamValue=20.5`

Or using CURL

`curl -u "admin:admin" "http://192.168.86.31/econet/newParam?newParamName=238&newParamValue=18"`

---

<div class="post-metadata">

**Author:** ![MrW](https://community.openenergymonitor.org/letter_avatar_proxy/v4/letter/m/c4cdca/32.png) [@MrW](https://community.openenergymonitor.org/u/MrW)\
**Post date:** [20 September 2025 15:57 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/3 "2025-09-20T15:57:44Z")

</div>

Oh nice one for the Control endpoint! I wonder what other values you can control. Don’t suppose you have a map for the numeric values do you?

My code is reading the “tiles” section - I have no idea how changeable this is, it looks bad to rely on, time will tell if it changes! I’ll see what other values I can extract over time. I think I got most of them

---

<div class="post-metadata">

**Author:** ![dconlon](https://community.openenergymonitor.org/user_avatar/community.openenergymonitor.org/dconlon/32/20482_2.png) [@dconlon](https://community.openenergymonitor.org/u/dconlon)\
**Post date:** [22 September 2025 07:52 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/4 "2025-09-22T07:52:52Z")

</div>

Thanks for this it looks great.

I’m about to buy a heat pump to install alongside my oil boiler. The Grant R290 was top of my shortlist but I’m struggling to get Modbus documentation for it which was my plan for programmatic control of it. It sounds like if I buy the WiFi bridge too I’ll be able to figure out some URLs for on/off and flow temp in less time than figuring out the Modbus registers.

---

<div class="post-metadata">

**Author:** ![MrW](https://community.openenergymonitor.org/letter_avatar_proxy/v4/letter/m/c4cdca/32.png) [@MrW](https://community.openenergymonitor.org/u/MrW)\
**Post date:** [22 September 2025 09:00 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/5 "2025-09-22T09:00:22Z")

</div>

> [@dconlon](#):
>
> Thanks for this it looks great.

No worries, hopefully it’s useful

> [@dconlon](#):
>
> It sounds like if I buy the WiFi bridge too I’ll be able to figure out some URLs for on/off and flow temp in less time than figuring out the Modbus registers

It seems fairly easy to do, how reliable it will be when Econet issue updates I have no clue!

I’ve extracted a list of the editable params, this is direct from the [https://www.econet24.com/service/getDeviceEditableParams](https://www.econet24.com/service/getDeviceEditableParams) response, the param numbers seem to line up with the endpoint Glyn mentioned, e.g. param num 238 sets the Circuit 1 thermostat, and also 103 lines up with the DOM when using the edit icon in the tiles interface, so this is probably all correct.

Looks like you can edit some useful things:

- Turn on/off circuit 1
- Set DHW temp
- Set room stat temp and hysterisis
- Control legionella stuff
- Set weather comp curve and shift

If this works, I’ll update the MQTT publisher so it’s more of a bridge than just a publisher and allow control, I haven’t played with MQTT before really but looks a really nice way to get stuff in to HA without using HACS etc.

| Param Number | Name | Editable | Minv | Maxv | Value | Mult | Unit |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 0 | PS | False | 0 | 0 | S023.14 | 1 | 0 |
| 101 | HDWSETTINGS | True | 0 | 0 | 7611 | 1 | 0 |
| 103 | HDWTSetPoint | True | 35 | 58 | 46 | 1 | 1 |
| 104 | HDWTSetPointDownHist | True | 5 | 18 | 10 | 1 | 1 |
| 113 | HDWLoadTime | True | 0 | 50 | 0 | 1 | 0 |
| 115 | HDWStartOneLoading | True | 0 | 0 | 0 | 1 | 0 |
| 119 | HDWusermode | True | 0 | 0 | 2 | 1 | 0 |
| 136 | HDWLegionSetPoint | True | 60 | 80 | 60 | 1 | 0 |
| 137 | HDWLegionDay | True | 0 | 6 | 1 | 1 | 0 |
| 138 | HDWLegionHour | True | 0 | 23 | 14 | 1 | 0 |
| 162 | workState2 | True | 0 | 0 | 2 | 1 | 0 |
| 236 | Circuit1WorkState | True | 0 | 3 | 1 | 1 | 0 |
| 238 | Circuit1ComfortTemp | True | 10 | 35 | 22 | 1 | 0 |
| 239 | Circuit1EcoTemp | True | 10 | 35 | 17 | 1 | 0 |
| 240 | Circuit1DownHist | True | 0 | 5 | 0.4 | 1 | 0 |
| 261 | Circuit1BaseTemp | True | 24 | 75 | 50 | 1 | 0 |
| 273 | Circuit1CurveRadiator | True | 0 | 4 | 1.2 | 1 | 0 |
| 275 | Circuit1Curveshift | True | -20 | 20 | -6 | 1 | 0 |
| 286 | Circuit2WorkState | True | 0 | 3 | 1 | 1 | 0 |
| 288 | Circuit2ComfortTemp | True | 10 | 35 | 21 | 1 | 0 |
| 289 | Circuit2EcoTemp | True | 10 | 35 | 19 | 1 | 0 |
| 290 | Circuit2DownHist | True | 0 | 5 | 1 | 1 | 0 |
| 311 | Circuit2BaseTemp | True | 24 | 75 | 40 | 1 | 0 |
| 336 | Circuit3WorkState | True | 0 | 3 | 1 | 1 | 0 |
| 338 | Circuit3ComfortTemp | True | 10 | 35 | 21 | 1 | 0 |
| 339 | Circuit3EcoTemp | True | 10 | 35 | 19 | 1 | 0 |
| 340 | Circuit3DownHist | True | 0 | 5 | 1 | 1 | 0 |
| 361 | Circuit3BaseTemp | True | 24 | 75 | 40 | 1 | 0 |
| 753 | Circuit6WorkState | True | 0 | 3 | 1 | 1 | 0 |
| 755 | Circuit6ComfortTemp | True | 10 | 35 | 21 | 1 | 0 |
| 756 | Circuit6EcoTemp | True | 10 | 35 | 19 | 1 | 0 |
| 763 | Circuit6BaseTemp | True | 24 | 75 | 40 | 1 | 0 |
| 784 | Circuit6MixerCoolBaseTemp | True | 10 | 30 | 20 | 1 | 1 |
| 789 | Circuit2MixerCoolBaseTemp | True | 10 | 30 | 20 | 1 | 1 |
| 803 | Circuit7WorkState | True | 0 | 3 | 1 | 1 | 0 |
| 805 | Circuit7ComfortTemp | True | 10 | 35 | 21 | 1 | 0 |
| 806 | Circuit7EcoTemp | True | 10 | 35 | 19 | 1 | 0 |
| 813 | Circuit7BaseTemp | True | 24 | 75 | 40 | 1 | 0 |
| 834 | Circuit7MixerCoolBaseTemp | True | 10 | 30 | 20 | 1 | 1 |
| 839 | Circuit3MixerCoolBaseTemp | True | 10 | 30 | 20 | 1 | 1 |
| 944 | Circuit4WorkState | True | 0 | 3 | 1 | 1 | 0 |
| 946 | Circuit4ComfortTemp | True | 10 | 35 | 21 | 1 | 0 |
| 947 | Circuit4EcoTemp | True | 10 | 35 | 19 | 1 | 0 |
| 969 | Circuit4BaseTemp | True | 24 | 75 | 40 | 1 | 0 |
| 990 | Circuit4MixerCoolBaseTemp | True | 10 | 30 | 20 | 1 | 1 |
| 995 | Circuit5WorkState | True | 0 | 3 | 1 | 1 | 0 |
| 997 | Circuit5ComfortTemp | True | 10 | 35 | 21 | 1 | 0 |
| 998 | Circuit5EcoTemp | True | 10 | 35 | 19 | 1 | 0 |
| 1020 | Circuit5BaseTemp | True | 24 | 75 | 40 | 1 | 0 |
| 1040 | Circuit5BaseTemp | True | 24 | 45 | 40 | 1 | 0 |
| 1041 | Circuit5MixerCoolBaseTemp | True | 10 | 30 | 20 | 1 | 1 |
| 1083 | SmartGridIncreaseForWaterHeatingCircuit4 | True | 0 | 10 | 0 | 1 | 1 |
| 1133 | AxenWorkState | True | 0 | 0 | 1 | 1 | 0 |
| 1211 | AXENREGISTER64 | False | 0 | 0 | 10 | 1 | 0 |
| 1212 | AXENREGISTER65 | False | 0 | 0 | 0 | 1 | 0 |
| 1215 | AXENREGISTER68 | False | 0 | 0 | 190 | 1 | 0 |
| 1219 | AXENREGISTER72 | False | 0 | 0 | 550 | 1 | 0 |
| 10010 | PS | True | 0 | 0 | S023.20 | 1 | 0 |
| 10413 | Korekta\_temperatury | True | 0 | 0 | 0 | 1 | 0 |

---

<div class="post-metadata">

**Author:** ![dconlon](https://community.openenergymonitor.org/user_avatar/community.openenergymonitor.org/dconlon/32/20482_2.png) [@dconlon](https://community.openenergymonitor.org/u/dconlon)\
**Post date:** [22 September 2025 09:20 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/6 "2025-09-22T09:20:34Z")

</div>

Awesome, thanks so much for your efforts - I’ll order my Aerona R290 today!

---

<div class="post-metadata">

**Author:** ![glyn.hudson](https://community.openenergymonitor.org/user_avatar/community.openenergymonitor.org/glyn.hudson/32/35003_2.png) [@glyn.hudson](https://community.openenergymonitor.org/u/glyn.hudson)\
**Post date:** [22 September 2025 16:41 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/7 "2025-09-22T16:41:29Z")

</div>

Great stuff, mine is running well: [https://heatpumpmonitor.org/system/view?id=748](https://heatpumpmonitor.org/system/view?id=748)

The inbuilt controller works very well, I’ve been impressed by the inbuilt control algorithms. I’m more interested in monitoring rather than control. But it’s nice to have options.

Once thing to note is that, like all heat pumps, the onboard monitoring is not very accurate. Ir’s currently telling me I’m getting a SCOP of 9, which is impossible! My actual SCOP so far as measured with a heat meter via the OpenEnergyMonitor L3 bundle is 5.0.

It’s great that it’s possible to interface with the econet locally via HTTP, Grant don’t support OTA updates, so I don’t think this local API will change, at least not without a manually applied update.

---

<div class="post-metadata">

**Author:** ![MrW](https://community.openenergymonitor.org/letter_avatar_proxy/v4/letter/m/c4cdca/32.png) [@MrW](https://community.openenergymonitor.org/u/MrW)\
**Post date:** [22 September 2025 18:19 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/8 "2025-09-22T18:19:14Z")

</div>

Yeh I saw yours was running well! You seem to use less electricity than mine at minimum modulation, I wonder why? Maybe your pump is not having to work as hard? I assume your electricity meter is monitoring everything including the controller? Although I presume the controller takes very little..

Out of interest Glyn, what impressed you about the control algorithms? This is my first heat pump so I’ve nothing to compare to so I’m curious as to what people think is good/bad about the unit. I’m occasionally confused as to why it is doing what it’s doing, OpenEnergyMonitor has been invaluable in trying to figure this out which is great.

Oh with the onboard monitoring, I assume the flow is calculated by the controller knowing the pump speed rather than having a flow sensor? You may know.

Yeh agreed only manual updates will change it, I’ll try and check when I update and keep a list of compatible controller versions. I suppose you don’t actually update the TP-Link box during an update, which I presume is where the HTTP server sits? So I wonder if it would ever change? No idea.

---

<div class="post-metadata">

**Author:** ![glyn.hudson](https://community.openenergymonitor.org/user_avatar/community.openenergymonitor.org/glyn.hudson/32/35003_2.png) [@glyn.hudson](https://community.openenergymonitor.org/u/glyn.hudson)\
**Post date:** [23 September 2025 16:46 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/9 "2025-09-23T16:46:45Z")

</div>

> [@MrW](#):
>
> Yeh I saw yours was running well! You seem to use less electricity than mine at minimum modulation, I wonder why? Maybe your pump is not having to work as hard? I assume your electricity meter is monitoring everything including the controller? Although I presume the controller takes very little..

Yes, I’m monitoring everything, including the controller. But it’s negligible, only a few W

> [@MrW](#):
>
> Out of interest Glyn, what impressed you about the control algorithms? This is my first heat pump so I’ve nothing to compare to so I’m curious as to what people think is good/bad about the unit. I’m occasionally confused as to why it is doing what it’s doing, OpenEnergyMonitor has been invaluable in trying to figure this out which is great.

It seems to handle cycling well i.e when the heat requirement of the house is less than the minimum modulated output of the heat pump it will need to cycle. The Grant algorithms do a good job of avoiding excess cycling. The exact cycle length will vary from system to system based on system volume and emitter area.

> [@MrW](#):
>
> Oh with the onboard monitoring, I assume the flow is calculated by the controller knowing the pump speed rather than having a flow sensor? You may know.

Yes, I think so. The Aeroa 290 does not have a flow meter, so the onboard flow measurement won’t be very accurate. I’ve got a heat meter fitted on mine which measures the flow rate accurately.

> [@MrW](#):
>
> Yeh agreed only manual updates will change it, I’ll try and check when I update and keep a list of compatible controller versions. I suppose you don’t actually update the TP-Link box during an update, which I presume is where the HTTP server sits? So I wonder if it would ever change? No idea.

I’m not sure, I doubt much will change.

If you’re interested, I wrote a post on LinkedIn about my system. I’m also in the process of editing a video of the installation:

> **[Designing and Installing the Ultimate Heat Pump for My House](https://www.linkedin.com/pulse/designing-installing-heat-pump-my-house-glyn-hudson-jt3de/)**
>
> I've just finished installing a heat pump in my new house! I've still got some lagging to do and rads to upgrade, but it's up and running heating DHW 🥳 It's been a lot of work, about three months worth of evenings and weekends, hats off to installers...

> **[Woop woop! 🎉 I've now finished fitting 10 radiators & a towel rail, my...](https://www.linkedin.com/posts/glyn-hudson-179774211_woop-woop-ive-now-finished-fitting-10-activity-7367199613793021952-4s1S?utm_source=share&utm_medium=member_desktop&rcm=ACoAADWvNu0BIfthdC_uDq4f4yX1MvsIONo5Kj8)**
>
> Woop woop! 🎉 I've now finished fitting 10 radiators & a towel rail, my space heating circuit for the home heat pump is up and running! See my previous post on installing the heat pump itself: https://lnkd.in/gyYGw8Su
> 
> 🏠 Radiators (or emitters)...

---

<div class="post-metadata">

**Author:** ![glyn.hudson](https://community.openenergymonitor.org/user_avatar/community.openenergymonitor.org/glyn.hudson/32/35003_2.png) [@glyn.hudson](https://community.openenergymonitor.org/u/glyn.hudson)\
**Post date:** [29 September 2025 21:35 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/10 "2025-09-29T21:35:22Z")

</div>

> [@dconlon](#):
>
> The Grant R290 was top of my shortlist but I’m struggling to get Modbus documentation for it which was my plan for programmatic control of it.

There’s some interesting discussion and possibly some progress on direct modbus on this thread:

> <https://github.com/Si-GCG/Unofficial-Grant-Aerona3-Home-Assistant-Integration/issues/1#issuecomment-3282186078>
>
> Do you think this will work with the Aerona 290?

---

<div class="post-metadata">

**Author:** ![dconlon](https://community.openenergymonitor.org/user_avatar/community.openenergymonitor.org/dconlon/32/20482_2.png) [@dconlon](https://community.openenergymonitor.org/u/dconlon)\
**Post date:** [30 September 2025 07:57 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/11 "2025-09-30T07:57:57Z")

</div>

Thanks, he’s also on this thread:

> <https://github.com/aerona-chofu-ashp/modbus/issues/8>
>
> I have recently had one installed and I've tried the Aerona 3 settings with no r…esults. They both use the same smart controller, so I'd hoped they would be the same.

I installed the smart controller and mains power for my R290 yesterday. I shall be having a go at the internal plumbing today. Alas I don’t think my “plant room” is going to look quite as smart as yours Glyn but hopefully it’ll be functional.

My Plan A is to use the ecoNET HTTP API as you have as it would be preferable to to have my code adding functionality/optimisation on top of the Smart Controller rather than replacing it. It would be best if the house heating wasn’t dependent on my code - just to cover off the chance of some poor plumber being called in to fix a fault should I ever pop my clogs!

The outdoor unit does have what appears to be a second modbus bus, so I shall hook up to that when I get to the outdoor unit install and perhaps see if it’s possible to have direct modbus communication without upsetting the Smart Controller on it’s bus as my Plan B.

The Smart Controller does have some support for turning on an additional heat source (oil boiler in my case) but it’s quite crude (on below a given OAT and/or during defrosts). It has no way to consider the demand in addition to OAT and given the size of my boiler I suspect it’d result in the return temperature rising over the point where the heat pump would turn off the compressor and the boiler would take all the load. I’m hoping to turn the boiler on and off to manage return temp to allow the heat pump to fulfil the demand that it can and also to consider how far indoor temp has diverged from the set-point and/or how many zones are on to determine whether the boiler is actually needed.

---

<div class="post-metadata">

**Author:** ![GSV3MiaC](https://community.openenergymonitor.org/user_avatar/community.openenergymonitor.org/gsv3miac/32/35450_2.png) [@GSV3MiaC](https://community.openenergymonitor.org/u/GSV3MiaC)\
**Post date:** [2 October 2025 12:20 UTC](https://community.openenergymonitor.org/t/grant-r290-econet-mqtt-publisher/29121/12 "2025-10-02T12:20:54Z")

</div>

Ah late to this party too. I had already decoded most of the local API stuff, also using HA, and can confirm that the values for work modes are:

> ```auto
> - name: "DHW work mode"
> unique_id: 'dhw work mode'
> value_template: "{% set s= value_json['data']['119']['value'] %} {% if s==2 %} {{'Scheduled'}} {% elif s==1 %} {{'On'}} {% elif s==0 %} {{'Off'}} {% else %} {{s}} {% endif %}"
> 
> - name: "Circuit1 work mode"
> unique_id: 'c1 work mode'
> value_template: "{% set s= value_json['data']['236']['value'] %} {% if s==3 %} {{'Scheduled'}} {% elif s==1 %} {{'Day'}} {% elif s==2 %} {{'Night'}} {% elif s==0 %} {{'Off'}} {% else %} {{s}} {% endif %}" 
> 
> And you can set those modes with HA 'rest-commands'
> 
> rest_command:
> set_dhw_temp:
> username: "admin"
> password: "admin"
> method: put
> url: "http://192.168.1.25/econet/newParam?newParamName=103&newParamValue={{value}}&_=UID"
> 
> set_dhw_hysteresis:
> username: "admin"
> password: "admin"
> method: put
> url: "http://192.168.1.25/econet/newParam?newParamName=104&newParamValue={{value}}&_=UID"
> 
> # 0 =off, 1=day, 2=night, 3=scheduled
> set_ch1_work_state:
> username: "admin"
> password: "admin"
> method: put
> url: "http://192.168.1.25/econet/newParam?newParamName=236&newParamValue={{value}}&_=UID"
> 
> ```

where 192.168.1.25 is the ip address of the econet controller on your local LAN/Wifi. Best to set a fixed one from your router, rather than letting it wander about DHCP wise. You pass in ‘value’ when you call those rest commands in HA (or you can always use fixed ones, which results in separate commands for on, off, schedule, etc).

My COP numbers are equally silly, though power used and flow temps are pretty accurate, it is flow rate which is not seemingly measured very well, though it gets reported to 0.1 cuM/hr accuracy.

Minimum electrical power at 15hz reads as 330W, which my power meters confirm, but sensible COP of say 6 get only 2kW heat output, which is less than the spec minimum (although there is no spec for 12c ambient).
