New electric water heater / boiler (integrated with HA)

All these different firmware`s for such a simple type of device :confused:

Anyway I guess supporting one or 2 different types of url suffixes should not be too difficult in the python package… But I am almost afraid there are more than I would like to know about…

It would be worth it to download a firmware of a boiler and see if they are interchangeable on different boilers (should not be too hard) But without a disposable wifi board / boiler I dont think I want to mess with the one that is actively supplying warm water to the house :slight_smile:

I was just about to go for a new boiler, seems a tesy might be usefull. What is the lowest energy/type tesy for around 100l if you where to get one now? I see different models and such. Just want to be sure i buy something that does have local control :slight_smile:

p.s. i see some vaillant stuff too is for the control device only.

Also, i know we want it with HA, but if you get an electric heatpump (warmtepomp) you get subsidised too for it. So an 1100,- gets 500 back so eventually roughly the same price but perhaps twice as low in energy consumption. Does that way up to the cons of being able to read it out… :man_shrugging:

Extra side note, the space i will be using it some people said, why don’t you get a “doorstromer” basicly an electric c.v. if you don’t use it on a daily basis (shower for example) it might be cheaper in the end, but does require 12kw of power too. Just throwing out some ideas.

hey guys,
Great work! i have a tesy boiler as well, i was wondering, i read an integration is in the make, any idea on timing? i’m hesitant to implement the config in HA manually. My level is rather beginner :slight_smile:
If i can do anything to help (test, confirm, check info) do let me know!

greets
sam

Sam, we are beginners with respect to the HA integration, so it will definitely take some time…

Hello,

Here’s an update on my positive research. My water heater is a:

Tesy modeco 150l smart
version: 0.26

First investigation with cloud control

  • Launched a mobile hotspot on my computer
  • On my computer wireshark active with an ip.src and ip.dst filter
  • My mobile connected to computer hotspot

The tesyCloud app sends https post messages to e82.mytesy.com with json data, such as username, encrypted password, current temperature, desired temperature, power etc. A post curl command with a json file does nothing. In the http header I saw the keys E-TAG and TOKEN with a random value. This is token based authentication for probably the message broker rabbitmq :expressionless:

Second investigation with local control

  • Started the boiler in local control mode, which starts a hotspot on the boiler.
  • Mobile connected to boiler hotspot
  • Installed a (wireshark) pcap app on my mobile, to capture tcp packets between the boiler and tesyCloud app
  • tesyCloud app opened and boiler controlled with: local control device

The wireshark pcap data shows that the boiler has a local api that can be accessed directly :slight_smile:

# get all info
curl -s -X GET http://192.168.0.215/api?name=_all | jq

# get current temperature
curl -s -X GET http://192.168.0.215/api?name=_all | jq -r '.tmpC'

# set power on
curl -s -X GET "http://192.168.0.215/api?name=pwr&set=1" | jq

# set power off
curl -s -X GET "http://192.168.0.215/api?name=pwr&set=0" | jq

# set mode 4 (eco)
curl -s -X GET "http://192.168.0.215/api?name=mode&set=4" | jq

# set mode 5 (eco comfort)
curl -s -X GET "http://192.168.0.215/api?name=mode&set=5" | jq

# set mode 6 (eco night)
curl -s -X GET "http://192.168.0.215/api?name=mode&set=6" | jq

# set mode 0 (manual)
curl -s -X GET "http://192.168.0.215/api?name=mode&set=0" | jq

# set controlled temperature
curl -s -X GET "http://192.168.0.215/api?name=tmpT&set=62" | jq

# set booster on
curl -s -X GET "http://192.168.0.215/api?name=bst&set=1" | jq

# set booster off
curl -s -X GET "http://192.168.0.215/api?name=bst&set=0" | jq

hat is the lowest energy/type tesy for around 100l if you where to get one now?

The modeco ones, are the ones we are having some succes with

Also, i know we want it with HA, but if you get an electric heatpump (warmtepomp) you get subsidised too for it. So an 1100,- gets 500 back so eventually roughly the same price but perhaps twice as low in energy consumption. Does that way up to the cons of being able to read it out…

These devices are usually more expensive as in 5K or more, but some brands like a Daikin can alo be read locally that is what I do with my hybrid one. Still a water boiler saves gas as I have solar so a boiler is better :slight_smile:

Extra side note, the space i will be using it some people said, why don’t you get a “doorstromer” basicly an electric c.v. if you don’t use it on a daily basis (shower for example) it might be cheaper in the end, but does require 12kw of power too. Just throwing out some ideas.

Yes, but if you then have a sink you need a second one or a mini boiler under the sink, But up to you its a personal choice, If you are alone a doorstomer might be useful 2 or more a boiler is more efficient

Cool, can you send me these with the JSON /response that comes out of it ?

Perhaps I can then implement them into the pypi module. I already have a IP validation for the one i have here, so when that fails I could try /api instead that way the user doesnt notice / have to care about it.

Can you leave local mode on tough, or is it more a “setup” thing? or once it connected to your actual wifi will this still work ?

WIth regards to the doorstromer, to take a shower it takes too much amps. If i where to run that + washing machine it would hit more then 25A on 1 fase and would blow my fuse. So its a no go.

Modeco ones, so no one has tried a bellislimo yet? Not that you have those things lying around ofcouse :slight_smile:

Yes that is why such a device and a washing machine needs their own circuit breaker to avoid that.

Also a Tesy modeco boiler pulls 2500 watt and needs its own seperate circuit, And preferably a heavy “werkschakelaar” next to the device its really wierd they supply the boiler with a eu powerplug … It already broke one of my circuit breakers hence the extra switch next to the device I also hard wired it directly to its own circuit after so there is no more plug

making it ‘boiler - hardwire to switch - hardwire to breaker’ for the safest way or using the boiler

If only these boilers where so easy and cheap to come by!
But as its the same brand different model you could try your luck.

it seems even in the modeco range there is different firmware floating about, so even if you get a modeco there is no guarantee of local control and the firmware is impossible to get. So I would buy the model that you want and if you are lucky there is local control for it :confused:

Shame really

Yeah shame people dont advertise local control or at least just commen sense API usage. Sure we are geeks but there is still a market for it.

I do have a seperate group already with its own breaker. I have 3x25A so i am fine and i have a backup device for the car, if too much current in use, it will downscale the usage during charging of the car. Perhaps i can ask around but i doubt stores will tell about local api’s i think a “Duh?!?” would pop up.

Alright, big kudos to @jaap78 for the successful “man in the middle” and exposing the API for the boiler. It happens to be almost the same on my side. The good part was that the “_all” request is the same with my Boiler.

Since there were some questions about Tesy Bellislimo. My unit is the mentioned.
This one to be absolutely accurate : GCR 100 27 22 E31 EC

It does have some differences to the Modeco ones. Except the API which should be reached with the “/api?” prefix which we already know about.
Also I am not able to control the temperature as you guys can do. What I mean is that I do not have control over temperature in Celsius, but instead I see states that can be changed. They basically go like
0 = Freezing, 1 = 1 Shower, 2 = 2 Showers etc... Max state is 4.

Also there is some difference with the energy monitoring, which I can not get the hang of yet but will do when I have more time to investigate.

I think those are all the main differences between Bellislimo and Modeco boilers, perhaps there might be other small differences which I still don’t know.

This is the response I get after executing the “/api?name=_all” command
There are some values which I don’t know what do they represent, hopefully I’ll create some sort of legend and perhaps report it here again once I populate it further.

{"tz":"180","wsw":"0.26","prfl":"[email protected]",
"id":"2002","hsw":"200216","tmpMX":"4","reset":"1","err":"00",
"tmpT":"2","tmpR":"2","mode":"0","lck":"0","bst":"0","vac":"0",
"pwr":"1","ht":"0","psn":"0","tmpC":"3","cdt":"0","prgVac":"030C13030A16",
"parNF":"28B054003028323052484688504F9E504F******EFFFFFFFFFFFFFFFFFFFFFF",
"prgP1MO":"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFF",
"prgP1TU":"FFFEFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFCFFFFFFFFFFFF",
"prgP1WE":"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFF",
"prgP1TH":"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFBFFFF",
"prgP1FR":"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFBFF",
"prgP1SA":"FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFBFBFF",
"prgP1SU":"FFFFFFFFFFFFFFFFFDFDFDFDFDFDFDFDFBFBFBFBFBFBFBFB",
"prgP2MO":"FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP2TU":"FFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP2WE":"FFFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP2TH":"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP2FR":"FFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP2SA":"FFFFFFFFFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP2SU":"FFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP3MO":"FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP3TU":"FFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP3WE":"FFFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP3TH":"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP3FR":"FFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP3SA":"FFFFFFFFFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"prgP3SU":"FFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
"wIP":"192.168.50.45","wSSID":"VnV Home Net","date":"2022-10-13 07:35:23",
"wtstp":"1665646523","wup":"65503","wdBm":"-37",
"pwcalc":"000000000000","pwc_t":"76019;50221",
"pwc_u":{"date":"2022-10-13 07:29:21","timestamp":"1665646161","utc":"0;0"},
"MAC":"3********","api":"OK"}

Legend:

Boiler JSON Decoder
prfl: Email address which the boiler is registered to.
tmpMX: Temperature MAX
err: ERROR
tmpT: Temperature TARGET (From 0 to 4) (0 = COLD, 1 = oneshower, 2 = two showers etc.)
tmpR: Temperature ??? (Seems the same as TARGET) (From 1 to 4)
mode: Boiler Mode (From 0 to 4) (0 = Manual & Vacation(See "vac"), 1 = Program, 4 = ECO SMART)
bst: Is BOOST active (0 = NO, 1 = YES)
vac: Vacation Mode (0 = NO, 1 = YES)
pwr: Power (0 = OFF, 1 = ON)
ht: Heating (0 = NO, 1 = YES)
tmpC: Temperature CURRENT (From 0 to 4)
cdt: Time to reach Target temperature in minutes

Also this is what my Lovelace card currently looks like
Kudos to @belastingvormulier for them. I sort of copied your command_line commands as well.

If someone is interested I can provide the yaml code for the card.

Once more, thank you @jaap78 and thank you @belastingvormulier

thanks for the feedback, if i can do something to help, shoutout

Hi @Tontonsam ,

I am totally stuck in the development of an integration. The combination/requirement to use Visual Studio with the ‘HA-development’ environment blow me away. Not being a programmer overwhelmed me and make the job too difficult for me.

So what is needed is a programmer with experience in putting together the library from @belastingvormulier, into the HA environment.

Does anybody know/see how much a boiler would use on electricty if not used? Since i see messages you can turn it off (or vacation mode, but still keeps it at 60 degrees?) since i intend to not use it very often its best to turn it off unless i have visistors. (bacteria aside, i could turn it back on, flush the water. Is cheaper then keeping it warm for weeks) i read on normal usage it would consume around 1500kwh a year (difference between 50/80/higher doesn’t really make much difference it seems, minimal)

You can automate to turn the boiler to 65/75 degrees every 2 / 4 weeks you should read up on that.
But no need to really flush the 100Liters (the boiler itself does 75 once every 4 weeks? its in the manual)

All you need to do is open the tap till the water is hot and wash your hands if you touched it to check.

If you turn the boiler off it should use 0K KWHish (standby power is expected), Vacation mode might keep an eye on your bacteria counter for you the same way the eco mode does but on a lower temp (this should not be 60?)

I do not yet have the vacation mode data as I have not gone on vacation yet. I might try this somewhere soon :slight_smile:

Thanks, i’ll read up on the manual too. “doorstromers” looked like a nice solution but in order to get 8 to 9l per minute you need 18khw which means 3x25A and that would mean i can shower, but means i cannot do anything else at all in the house anymore :frowning:

Practicly speaking, i don’t need warm water unless i have visitors. So then i would turn it off, be on standby mode (presuming it consumes almost 0)

Well its nice for sure, But in Malaysia I usually shower with this:

(All their products here: Water Heater & Home Shower | High Power Pump System | Panasonic MY )

And I must say its not too bad of a shower, yes more litres per minute would be nice. But at some point a choice has to be made I guess. I am sure you can find a nice 11KWh one that would do just fine :wink:

Else a 80 liter boiler isnt bad also, small, and more power efficient. (Or perhaps 50 if you take military showers)

if you can share the yaml/curls/dashboard that would be nice.

Went ahead and got a 80l boiler to a modeco. I also don’t have the rest api but i do have the same /api?name=_all which works just fine. For reference, the output of mine:

{
  "tz": "60",
  "wsw": "0.26",
  "prfl": "X",
  "extr": "X",
  "id": "2004",
  "hsw": "200407",
  "reset": "1",
  "wi": "1",
  "err": "00",
  "tmpT": "60",
  "tmpR": "9",
  "mode": "4",
  "wcntr": "1",
  "bst": "0",
  "vac": "0",
  "pwr": "0",
  "ht": "0",
  "tmpC": "51.0",
  "PICTime": "2000-00-00 00:44:32",
  "prgVac": "460201020115",
  "prgP1MO": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP1TU": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP1WE": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP1TH": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP1FR": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP1SA": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP1SU": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP2MO": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP2TU": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP2WE": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP2TH": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP2FR": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP2SA": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP2SU": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP3MO": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP3TU": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP3WE": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP3TH": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP3FR": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP3SA": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "prgP3SU": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  "wIP": "192.168.1.65",
  "wSSID": "",
  "date": "2022-11-26 23:12:21",
  "wtstp": "1669504341",
  "wup": "16174",
  "wdBm": "-49",
  "pwcalc": "0",
  "pwc_t": "5343",
  "pwc_u": {
    "date": "2022-11-26 19:00:00",
    "timestamp": "1669489200",
    "utc": "5343"
  },
  "MAC": "X",
  "api": "OK"
}

Hi all.
Since I’m using that integration every 5 to 10 days my boiler become unresponsible, even from android app. The only way to fix things is the hard restart (power off from grind). Here are a few errors:

2022-12-15 13:59:20.991 ERROR (SyncWorker_9) [homeassistant.components.command_line] Command failed (with return code 7): /usr/bin/curl -sX GET http://192.168.8.59/status?_=1634912123253
2022-12-15 13:59:20.994 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {% if value_json['boost'] == '0' %} mdi:rocket {% elif value_json['boost'] == '1' %} mdi:rocket-launch {% else %} mdi:help-circle {% endif %})
2022-12-15 13:59:20.997 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {{ value_json['boost'] == '1' }})
2022-12-15 13:59:21.052 ERROR (SyncWorker_13) [homeassistant.components.command_line] Command failed (with return code 7): /usr/bin/curl -sX GET http://192.168.8.59/status?_=1634912123253
2022-12-15 13:59:21.055 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {% if value_json['power_sw'] == "on" %} mdi:toggle-switch {% else %} mdi:toggle-switch-off {% endif %})
2022-12-15 13:59:21.058 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {{ value_json['power_sw'] == 'on' }})
2022-12-15 13:59:21.105 ERROR (SyncWorker_1) [homeassistant.components.command_line] Command failed (with return code 7): /usr/bin/curl -sX GET http://192.168.8.59/status?_=1634912123253
2022-12-15 13:59:21.108 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {% if value_json['mode'] == '1' %} mdi:water-boiler {% elif value_json['mode'] == '2' %} mdi:calendar {% elif value_json['mode'] == '3' %} mdi:calendar {% elif value_json['mode'] == '4' %} mdi:calendar {% elif value_json['mode'] == '5' %} mdi:sprout {% elif value_json['mode'] == '6' %} mdi:sprout {% elif value_json['mode'] == '7' %} mdi:sprout {% else %} mdi:help-circle {% endif %})
2022-12-15 13:59:21.111 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {{ value_json['mode'] == '1' }})
2022-12-15 13:59:50.993 ERROR (SyncWorker_7) [homeassistant.components.command_line] Command failed (with return code 7): /usr/bin/curl -sX GET http://192.168.8.59/status?_=1634912123253
2022-12-15 13:59:50.996 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {% if value_json['boost'] == '0' %} mdi:rocket {% elif value_json['boost'] == '1' %} mdi:rocket-launch {% else %} mdi:help-circle {% endif %})
2022-12-15 13:59:50.999 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {{ value_json['boost'] == '1' }})
2022-12-15 13:59:51.043 ERROR (SyncWorker_11) [homeassistant.components.command_line] Command failed (with return code 7): /usr/bin/curl -sX GET http://192.168.8.59/status?_=1634912123253
2022-12-15 13:59:51.047 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {% if value_json['power_sw'] == "on" %} mdi:toggle-switch {% else %} mdi:toggle-switch-off {% endif %})
2022-12-15 13:59:51.050 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {{ value_json['power_sw'] == 'on' }})
2022-12-15 13:59:51.094 ERROR (SyncWorker_14) [homeassistant.components.command_line] Command failed (with return code 7): /usr/bin/curl -sX GET http://192.168.8.59/status?_=1634912123253
2022-12-15 13:59:51.097 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {% if value_json['mode'] == '1' %} mdi:water-boiler {% elif value_json['mode'] == '2' %} mdi:calendar {% elif value_json['mode'] == '3' %} mdi:calendar {% elif value_json['mode'] == '4' %} mdi:calendar {% elif value_json['mode'] == '5' %} mdi:sprout {% elif value_json['mode'] == '6' %} mdi:sprout {% elif value_json['mode'] == '7' %} mdi:sprout {% else %} mdi:help-circle {% endif %})
2022-12-15 13:59:51.104 ERROR (MainThread) [homeassistant.helpers.template] Error parsing value: 'value_json' is undefined (value: None, template: {{ value_json['mode'] == '1' }})

There is also another one, wich I can’t find right now, regarding the target temp.
Any ideas?