Toon/Boxx smart thermostats

It’s the same hardware platform I’m told. Toon is a smart thermostat in the Netherlands, Boxx is the same smart thermostat for Belgium. Very much looking forward to a home/away/sleep automation. Now it’s manually stuff from the app or the touch panel. Also being able to turn it on from some automation in hassio when leaving work would be awesome.

There’s an existing Toon component, but doesn’t seem to work anymore (using an old api I think) and since I’m from Belgium, I’m looking forward to Boxx off course. If you guys ask it politely, maybe they’ll do something. Right now not much development going on with boxx apparently. They spoke about GA integration, but that can take more than a year before they come up with something.

Toon has an api. Boxx not I’m afraid.

Toon: https://www.eneco.nl/energieproducten/toon-thermostaat/
Toon api:: https://developer.toon.eu/user/register
Boxx: https://www.engie-electrabel.be/nl/boxx

Are there any updates to this topic?

I’m having the exact same question.

Hi,

I have been trying to solve this for my OpenHAB (sorry, I don’t use HA, but ended up here searching for something useful on boxx) - but I couldn’t find an easy way. The hard way I followed is as below:
-take an Android device, anything with Android 6.0 or above (for now anyway, God knows when will they require higher Android version for the boxx app). It can be an old phone of yours, but then you might run into the issue of screen lock/timeout, which is not easy to overcome.
Ideally it’s a TV-box, you can get one from Amazon for 30 euros.
-uninstall all kinds of crap you don’t need… the less stuff runs, the better
-install the boxx android app and log in
-install Tasker and Autoapps/AutoInput(this will allow you to make “screen inputs”, like the human user was there)
-I have created a Tasker routine, which so far runs every 5 minutes, checks for the values on the screen and transmits them via MQTT(via an additional MQTT app on Android - you can do HTTP POSTs and other stuff as well, for me this was the easiest), to be picked up by OpenHAB (Set Temperature, Room Temperature, Electricity consumption, Gas consumption, Solar charge, Solar energy produced). Of course whatever’s on the main screen is rather easily readable.
-Then I have the mentioned MQTT app monitoring certain channels (ie. BoxxHomeMode, BoxxAwayMode) - when a message arrives to the channel it gets interpreted by Tasker and if there’s a valid content, tasker will launch a task - which will open the Boxx app, and emulate a human click on the appropriate field, then re-read the screen and if the value (SetTemp) has changed then it’s happy. :slight_smile:
I’m just working on the temperature settings, I can already set it up or down by clicking on the + or - on the home screen, but I can’t say set it to 23 C whatever it is right now. I’ll need some time to do that still.
In about 99% of the time it works flawlessly as long as you’re happy with 5 minute updates or updates on request. I wouldn’t go further than that, because I’m afraid they’d take away this possibility too.

Caveats:
-Tasker typically handles these values/buttons with the field ID, which is always relative. Alternatively you can get it to handle it by screen position (x,y), but that can get even more nasty at times.
-when they update the Boxx app, sometimes the fields get displaced by one or two lines. This typically means that Tasker can’t read the line, so returns null. I have managed to solve this for the read items, but since I don’t use the actual control bit too much, I’m not sure how much that is affected.
-when they have notifications displayed or stuff like that it can happen too

If anyone wants to go down this way, let me know and I can post the Tasker routines - you can just import them to your Tasker and adapt the MQTT server/topics to your liking.

I’ve been trying to connect to Boxx locally, but there isn’t much I could do with the open connection - besides it closes itself after a while too.

Hi @Jagohu

I’m very interested in the tasker routines to do this, so sharing is very appreciated, thanks!!!

The Genie Boxx by Electrabel is actually supported by the Toon integration, since 0.112.0

However, it had a bug with boxx, which is fixed in the upcoming 0.113

Marking this FR as resolved

That’s cool. I didn’t know Boxx was supported. I tried immediately because I really want to do some automations with my thermostat.

But got this error:

# Developer hint:

The requested redirect_uri does not match any of the whitelisted redirect_uris on the Toon developer page.

Make sure to allow the requested redirect_uri on your registered Toon app in the [developer pages](https://developer.toon.eu/)

Multiple redirect_uris can be used, separated by a comma.

Maybe it’s because I use the nabu casa remote ui. What’s the correct callback url in that case?

Hi 113 has arrived. So I immediately tried to install it. I still get an initial issue with the call back url, if I change that to the nabu casa url, it asks me to login to the engie site with my app credentials, when I do that, i get a 500 internal server error

I see also a lot of errors in the logs

2020-07-22 19:41:11 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 418, in start
    resp = await task
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_app.py", line 458, in _handle
    resp = await handler(request)
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_middlewares.py", line 119, in impl
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/real_ip.py", line 39, in real_ip_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 73, in ban_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 127, in auth_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 129, in handle
    result = await result
  File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 136, in get
    return await super().get(request, flow_id)
  File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 92, in get
    result = await self._flow_mgr.async_configure(flow_id)
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 153, in async_configure
    result = await self._async_handle_step(flow, cur_step["step_id"], user_input)
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 201, in _async_handle_step
    result: Dict = await getattr(flow, method)(user_input)
  File "/usr/src/homeassistant/homeassistant/helpers/config_entry_oauth2_flow.py", line 259, in async_step_creation
    token = await self.flow_impl.async_resolve_external_data(self.external_data)
  File "/usr/src/homeassistant/homeassistant/components/toon/oauth2.py", line 104, in async_resolve_external_data
    return await self._token_request(data)
  File "/usr/src/homeassistant/homeassistant/components/toon/oauth2.py", line 134, in _token_request
    resp.raise_for_status()
  File "/usr/local/lib/python3.8/site-packages/aiohttp/client_reqrep.py", line 941, in raise_for_status
    raise ClientResponseError(
aiohttp.client_exceptions.ClientResponseError: 500, message='Internal Server Error', url='https://api.toon.eu/token
2020-07-22 19:41:49 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 418, in start
    resp = await task
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_app.py", line 458, in _handle
    resp = await handler(request)
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_middlewares.py", line 119, in impl
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/real_ip.py", line 39, in real_ip_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 73, in ban_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 127, in auth_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 129, in handle
    result = await result
  File "/usr/src/homeassistant/homeassistant/helpers/config_entry_oauth2_flow.py", line 388, in get
    await hass.config_entries.flow.async_configure(
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 153, in async_configure
    result = await self._async_handle_step(flow, cur_step["step_id"], user_input)
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 201, in _async_handle_step
    result: Dict = await getattr(flow, method)(user_input)
  File "/usr/src/homeassistant/homeassistant/helpers/config_entry_oauth2_flow.py", line 259, in async_step_creation
    token = await self.flow_impl.async_resolve_external_data(self.external_data)
  File "/usr/src/homeassistant/homeassistant/components/toon/oauth2.py", line 104, in async_resolve_external_data
    return await self._token_request(data)
  File "/usr/src/homeassistant/homeassistant/components/toon/oauth2.py", line 134, in _token_request
    resp.raise_for_status()
  File "/usr/local/lib/python3.8/site-packages/aiohttp/client_reqrep.py", line 941, in raise_for_status
    raise ClientResponseError(
aiohttp.client_exceptions.ClientResponseError: 500, message='Internal Server Error', url='https://api.toon.eu/token
2020-07-22 19:42:07 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 418, in start
    resp = await task
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_app.py", line 458, in _handle
    resp = await handler(request)
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_middlewares.py", line 119, in impl
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/real_ip.py", line 39, in real_ip_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 73, in ban_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 127, in auth_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 129, in handle
    result = await result
  File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 136, in get
    return await super().get(request, flow_id)
  File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 92, in get
    result = await self._flow_mgr.async_configure(flow_id)
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 153, in async_configure
    result = await self._async_handle_step(flow, cur_step["step_id"], user_input)
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 201, in _async_handle_step
    result: Dict = await getattr(flow, method)(user_input)
  File "/usr/src/homeassistant/homeassistant/helpers/config_entry_oauth2_flow.py", line 259, in async_step_creation
    token = await self.flow_impl.async_resolve_external_data(self.external_data)
  File "/usr/src/homeassistant/homeassistant/components/toon/oauth2.py", line 104, in async_resolve_external_data
    return await self._token_request(data)
  File "/usr/src/homeassistant/homeassistant/components/toon/oauth2.py", line 134, in _token_request
    resp.raise_for_status()
  File "/usr/local/lib/python3.8/site-packages/aiohttp/client_reqrep.py", line 941, in raise_for_status
    raise ClientResponseError(
aiohttp.client_exceptions.ClientResponseError: 500, message='Internal Server Error', url='https://api.toon.eu/token
2020-07-22 19:42:13 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 418, in start
    resp = await task
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_app.py", line 458, in _handle
    resp = await handler(request)
  File "/usr/local/lib/python3.8/site-packages/aiohttp/web_middlewares.py", line 119, in impl
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/real_ip.py", line 39, in real_ip_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 73, in ban_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 127, in auth_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 129, in handle
    result = await result
  File "/usr/src/homeassistant/homeassistant/helpers/config_entry_oauth2_flow.py", line 388, in get
    await hass.config_entries.flow.async_configure(
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 153, in async_configure
    result = await self._async_handle_step(flow, cur_step["step_id"], user_input)
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 201, in _async_handle_step
    result: Dict = await getattr(flow, method)(user_input)
  File "/usr/src/homeassistant/homeassistant/helpers/config_entry_oauth2_flow.py", line 259, in async_step_creation
    token = await self.flow_impl.async_resolve_external_data(self.external_data)
  File "/usr/src/homeassistant/homeassistant/components/toon/oauth2.py", line 104, in async_resolve_external_data
    return await self._token_request(data)
  File "/usr/src/homeassistant/homeassistant/components/toon/oauth2.py", line 134, in _token_request
    resp.raise_for_status()
  File "/usr/local/lib/python3.8/site-packages/aiohttp/client_reqrep.py", line 941, in raise_for_status
    raise ClientResponseError(
aiohttp.client_exceptions.ClientResponseError: 500, message='Internal Server Error', url='https://api.toon.eu/token

nevermind, got it working, thx, this was the one thing missing in my setup

1 Like

Yep works here also now, this is so great, thanks @frenck!!

2 Likes

Hi Stefanmechelen, I am facing the same issue event after upgrading to ver 113. Could you please tell how did you fix it? what was missing in your setup? thanks a lot.

just follow the instructions, it works out of the box, didn’t change a thing, be sure to have the latest version installed, it only works in 113

Any idea what the announcement from Engie means for the integration? Will it be working or will it stop working in Home Assistant.

---- copy announcement ----

Na 9 jaar hebben we besloten om de ondersteuning van boxx vanaf 1 juli te stoppen. Dat was geen gemakkelijke beslissing, maar wel een noodzakelijke. Zoals we al eerder aankondigden, besliste onze partner in 2021 om de productie van boxx stop te zetten. We stellen vandaag jammer genoeg vast dat we daardoor ook de kwaliteit van de dienstverlening niet meer kunnen garanderen.
Wat wijzigt er voor jou op 1 juli?
Voor je verwarming? boxx blijft werken als een lokale thermostaat. Je kan je woning dus blijven verwarmen met boxx: er is geen aanpassing of vervanging nodig. Maar de verwarming vanop afstand regelen via de app? Dat is niet meer mogelijk.
Voor het opvolgen van je energieverbruik? Alle inzicht- en adviesdiensten op het boxx-scherm worden stopgezet, en je zal ook de boxx-app hiervoor niet meer kunnen gebruiken.
Voor je dienstverlening? Wij kunnen je geen hulp meer bieden bij vragen, storingen of defecten. Alle onlinediensten op het boxx-scherm worden stopgezet, en je zal ook de boxx-app niet meer kunnen gebruiken.
Voor je boxx-abonnement? Zodra je boxx-contract wordt stopgezet, hoef je het maandelijkse abonnement natuurlijk niet meer te betalen.

Heeft u een reactie ontvangen? want ik vraag me hetzelfde af. Zonder abonnement hebben we geen toegang meer tot Toon API (denk ik). Ik vraag me af of er een manier is om de boxx lokale thermostaat, de ketelmodule etc. te gebruiken zonder de Toon-webservices. Geen idee hoe data gecommuniceerd wordt tussen Boxx (Toon) en de ketelmodule.