New electric water heater / boiler (integrated with HA)

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?

These are the rest of the errors, maybe the most important, that are flooding the waterheater:

Logger: homeassistant.components.automation.tesy_temperature_input_automatically_changed
Source: helpers/script.py:409
Integration: Automation (documentation, issues)
First occurred: 07:38:40 (1 occurrences)
Last logged: 07:38:40

Tesy Temperature input automatically changed: Error executing script. Invalid data for call_service at pos 1: Invalid value for input_number.tesyboilermanualtempinput: 8.0 (range 14.0 - 75.0)

Logger: homeassistant.components.automation.tesy_temperature_input_automatically_changed
Source: components/automation/__init__.py:572
Integration: Automation (documentation, issues)
First occurred: 07:38:40 (1 occurrences)
Last logged: 07:38:40

Error while executing automation automation.tesy_temperature_input_automatically_changed: Invalid value for input_number.tesyboilermanualtempinput: 8.0 (range 14.0 - 75.0)

Update: I’ve changed the range to 8.0-75.0 degrees.

I am also interested in the yaml code. I have a Modeco 150L boiler which gives the IoT reply without any information but does give information with api?name=_all. Just wondering how to get the correct information from the API to actually use.

My _all gives:

"tz":"CET-1CEST,M3.5.0,M10.5.0/3",
"wsw":"0.26",
"prfl":"*******",
"extr":"******",
"id":"2004",
"hsw":"200407",
"reset":"1",
"wi":"1",
"err":"00",
"tmpT":"16",
"tmpR":"45",
"mode":"4",
"wcntr":"1",
"bst":"0",
"vac":"0",
"pwr":"1",
"ht":"0",
"tmpC":"59.7",
"PICTime":"2022-07-30 14:18:34",
"prgVac":"460201020115",
"prgP1MO":"373737373737373737373737373737373737373737373737",
"prgP1TU":"373737373737373737373737373737373737373737373737",
"prgP1WE":"373737373737373737373737373737373737373737373737",
"prgP1TH":"373737373737373737373737373737373737373737373737",
"prgP1FR":"373737373737373737373737373737373737373737373737",
"prgP1SA":"373737373737374141373737373737373737373737373737",
"prgP1SU":"373737373737373737373737373737373737373737373737",
"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.2.**",
"wSSID":"***",
"date":"2022-12-20 21:02:39",
"wtstp":"1671566559",
"wup":"3793014",
"wdBm":"-47",
"pwcalc":"0",
"pwc_t":"1080823",
"pwc_u":{"date":"2022-05-18 10:00:00",
"timestamp":"1652860800",
"utc":"1080823"},
"MAC":"************",
"api":"OK"
}

@riemers, @genivos My Apologies for the late response, had much work and I just noticed the notifications here.

Here is the yaml for the visual elements that are presented several posts above.

type: vertical-stack
cards:
  - type: custom:mushroom-title-card
    title: ''
    alignment: center
    subtitle: Tesy Water Heater
  - type: conditional
    conditions:
      - entity: sensor.tesy_error
        state_not: '00'
    card:
      type: markdown
      content: |-
        **ERROR**
        There was an error recorder in the Tesy Rest command response.
        Please Review!
  - type: custom:mushroom-template-card
    primary: |-
      Status: {% if is_state('sensor.tesy_heating', '0') %}
      Idle
      {% else %}
      Heating
      {% endif %}
    secondary: >-
      {% if is_state('sensor.tesy_time_left_to_requested_temperature', '0') %}

      Desired Temperature Reached.

      {% else %}

      Time To Reach Desired Temperature : {{
      states('sensor.tesy_time_left_to_requested_temperature') }} Minutes.

      {% endif %}
    icon: |-
      {% if is_state('sensor.tesy_heating', '0') %}
      mdi:sleep
      {% else %}
      mdi:heat-wave
      {% endif %}
    entity: sensor.tesy_heating
    icon_color: |-
      {% if is_state('sensor.tesy_heating', '0') %}
      green
      {% else %}
      red
      {% endif %}
    tap_action:
      action: none
    hold_action:
      action: none
    double_tap_action:
      action: none
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-entity-card
        entity: switch.tesyonoff
        layout: vertical
        name: Power
        tap_action:
          action: toggle
      - type: custom:mushroom-entity-card
        entity: switch.tesyboostonoff
        layout: vertical
        name: Boost
        tap_action:
          action: toggle
  - type: custom:mushroom-title-card
    title: ''
    subtitle: Temperature
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: mdi:numeric-0
        badge_icon: mdi:shower-head
        icon_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpT', '0') %}
          green
          {% endif %}
        layout: vertical
        tap_action:
          action: call-service
          service: script.tesy_set_zero_shower
          data: {}
          target: {}
        badge_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpC', '0') %}
          amber
          {% endif %}
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: mdi:numeric-1
        badge_icon: mdi:shower-head
        icon_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpT', '1') %}
          green
          {% endif %}
        tap_action:
          action: call-service
          service: script.tesy_set_one_shower
          data: {}
          target: {}
        layout: vertical
        badge_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpC', '1') %}
          amber
          {% endif %}
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: mdi:numeric-2
        badge_icon: mdi:shower-head
        icon_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpT', '2') %}
          green
          {% endif %}
        tap_action:
          action: call-service
          service: script.tesy_set_two_shower
          data: {}
          target: {}
        layout: vertical
        badge_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpC', '2') %}
          amber
          {% endif %}
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: mdi:numeric-3
        badge_icon: mdi:shower-head
        icon_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpT', '3') %}
          green
          {% endif %}
        tap_action:
          action: call-service
          service: script.tesy_set_three_shower
          data: {}
          target: {}
        layout: vertical
        badge_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpC', '3') %}
          amber
          {% endif %}
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: mdi:numeric-4
        badge_icon: mdi:shower-head
        icon_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpT', '4') %}
          green
          {% endif %}
        tap_action:
          action: call-service
          service: script.tesy_set_four_shower
          data: {}
          target: {}
        layout: vertical
        badge_color: |-
          {% if is_state_attr('sensor.tesy_water_heater', 'tmpC', '4') %}
          amber
          {% endif %}
  - type: custom:mini-graph-card
    hours_to_show: 24
    points_per_hour: 1
    update_interval: 30
    name: Hot Water For
    line_width: 1
    smoothing: false
    tap_action: none
    animate: true
    hour24: true
    lower_bound: 0
    upper_bound: 4
    entities:
      - entity: sensor.tesy_current_temperature
        name: Current Shower Count
        color: orange
      - entity: sensor.tesy_target_temperature
        name: Target Shower Count
        color: green
    show:
      graph: line
      name: true
      legend: true
      icon: false
      labels: false
      labels_secondary: false

This is the example script, note that I am refreshing all the rest commands in it.

alias: Tesy Set Four Shower
sequence:
  - service: switch.toggle
    data: {}
    target:
      entity_id: switch.tesy_set_four_temp
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - service: rest.reload
    data: {}
mode: single
icon: mdi:shower-head

Also this is the sensor code in the config.yaml

### TESY CONFIGURATION ###
rest:
  - authentication: basic
    scan_interval: 300
    resource: http://192.168.50.45/api?name=_all
    sensor:
      - name: "Tesy Water Heater"
        icon: mdi:water-boiler
        unique_id: "TesyWaterHeater"
        value_template: "OK"
        json_attributes:
          - "prfl"
          - "tmpMX"
          - "tmpT"
          - "tmpR"
          - "tmpC"
          - "bst"
          - "pwr"
          - "err"
          - "mode"
          - "ht"
          - "cdt"

template:
  - sensor:
      - name: "Tesy Mode"
        icon: mdi:calendar
        unique_id: "TesyMode"
        state: "{{ state_attr('sensor.tesy_water_heater', 'mode') }}"
  - sensor:
      - name: "Tesy Error"
        icon: mdi:water-boiler-alert
        unique_id: "TesyError"
        state: "{{ state_attr('sensor.tesy_water_heater', 'err') }}"
  - sensor:
      - name: "Tesy Boost Status"
        icon: mdi:lightning-bolt
        unique_id: "TesyBoostStatus"
        state: "{{ state_attr('sensor.tesy_water_heater', 'bst') }}"
  - sensor:
      - name: "Tesy Power Status"
        icon: mdi:power
        unique_id: "TesyPowerStatus"
        state: "{{ state_attr('sensor.tesy_water_heater', 'pwr') }}"
  - sensor:
      - name: "Tesy Target Temperature"
        icon: mdi:shower-head
        unique_id: "TesyTargetTemperature"
        state: "{{ state_attr('sensor.tesy_water_heater', 'tmpT') }}"
        unit_of_measurement: "Shower"
  - sensor:
      - name: "Tesy Current Temperature"
        icon: mdi:shower-head
        unique_id: "TesyCurrentTemperature"
        state: "{{ state_attr('sensor.tesy_water_heater', 'tmpC') }}"
        unit_of_measurement: "Shower"
  - sensor:
      - name: "Tesy Refferent Temperature"
        icon: mdi:shower-head
        unique_id: "TesyRefferentTemperature"
        state: "{{ state_attr('sensor.tesy_water_heater', 'tmpR') }}"
        unit_of_measurement: "Shower"
  - sensor:
      - name: "Tesy Max Temperature"
        icon: mdi:shower-head
        unique_id: "TesyMaxTemperature"
        state: "{{ state_attr('sensor.tesy_water_heater', 'tmpMX') }}"
        unit_of_measurement: "Shower"
  - sensor:
      - name: "Tesy Heating"
        icon: mdi:heat-wave
        unique_id: "TesyHeating"
        state: "{{ state_attr('sensor.tesy_water_heater', 'ht') }}"
  - sensor:
      - name: "Tesy Time Left To Requested Temperature"
        icon: mdi:clock
        unique_id: "TesyTimeToRequestTemp"
        state: "{{ state_attr('sensor.tesy_water_heater', 'cdt') }}"

switch:
  - platform: command_line
    switches:
      tesyboostonoff:
        command_on: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=bst&set=1'"
        command_off: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=bst&set=0'"
        command_state: "/usr/bin/curl -sX GET 'http://192.168.50.45/api?name=_all'"
        value_template: "{{ value_json['bst'] == '1' }}"
        friendly_name: Tesy Boost Switch
        icon_template: >
          {% if value_json['bst'] == '0' %} mdi:rocket
          {% elif value_json['bst'] == '1' %} mdi:rocket-launch
          {% else %} mdi:help-circle
          {% endif %}
      tesyonoff:
        command_on: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=pwr&set=1'"
        command_off: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=pwr&set=0'"
        command_state: "/usr/bin/curl -sX GET 'http://192.168.50.45/api?name=_all'"
        value_template: "{{ value_json['pwr'] == '1' }}"
        friendly_name: Tesy Power Switch
        icon_template: >
          {% if value_json['pwr'] == "1" %} mdi:toggle-switch
          {% else %} mdi:toggle-switch-off
          {% endif %}

      tesy_set_zero_temp:
        command_on: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=0'"
        command_off: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=0'"
        friendly_name: Tesy Set Zero
        icon_template: mdi:shower-head
      tesy_set_one_temp:
        command_on: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=1'"
        command_off: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=1'"
        friendly_name: Tesy Set One
        icon_template: mdi:shower-head
      tesy_set_two_temp:
        command_on: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=2'"
        command_off: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=2'"
        friendly_name: Tesy Set Two
        icon_template: mdi:shower-head
      tesy_set_three_temp:
        command_on: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=3'"
        command_off: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=3'"
        friendly_name: Tesy Set Three
        icon_template: mdi:shower-head
      tesy_set_four_temp:
        command_on: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=4'"
        command_off: "/usr/bin/curl -X GET 'http://192.168.50.45/api?name=tmpT&set=4'"
        friendly_name: Tesy Set Four
        icon_template: mdi:shower-head

### TESY CONFIGURATION END ###

That’s basically it. It has been working like this past 2 months, I haven’t changed anything since then.

Again sorry for the delayed answer, I’ll try to be more present for further questions now.

2 Likes

We all have lives right? :slight_smile: have to fight another thing, i insulated the bottom floor so much that where the attic is the humidity is now too high and i got fungus on all woodwork on the tilted ceilings. Suppose i need some kind of automatic ventilation when the humidity is too high. Some people mentioned just make 2 holes with vents and your done (but how does that work if outside humidity is higher then inside) o well another challenge :wink: but the boiler works.

Thanks! Totally no problem in delay, I’m delayed msyelf in testing now. I have implemented this for my boiler, it seems to work fine except for some sensors. I simply don’t have them as far as I can see. Tesy Power Status and Tesy Time Left To Requested for example. Well, power status I have but somewhere in the legend it goes wrong. It shows when it’s heating but when it’s not heating it shows not boosting. Need to look into that. The other one I just don’t have as far as I can tell so I can’t see that.
I’m not using the script now, I took that out. I just want to monitor and be able to look back data for now. Just because the Tesy app has such a limited time frame.

Hi @belastingvormulier @ValeriGYordanov , I think you guys can help me out with a couple of things/findings.

  1. I used the YAML code from ‘william-sy/TesyLocal’ in the configuration, and all sensors are shown:

  1. I don’t see any update/sync options in the configuration, when is the system getting data? (I changed all IP’s to my Tesy one in my local network)

  2. I used the above Dashboard examples in a new/clean dashboard and Mushroom code, but my dashboard keeps completely empty?

views:

  • title: TestLocal
    type: custom:mini-graph-card
    hours_to_show: 1
    points_per_hour: 15
    update_interval: 30
    group_by: value
    name: TesyBoiler
    line_width: 2
    entities:
  • entity: sensor.tesyboilerwatertemp
    name: Water Temp
  • entity: sensor.tesyboilerwatertargettemp
    name: Target Temp
  • entity: sensor.tesyboilerboost
    show_state: true
    show_graph: false
    name: Boost
  • entity: sensor.tesyboilerstate
    show_state: true
    show_graph: false
    name: Boost
    show:
    graph: line
    name: true
    legend: true
    icon: false
    labels: true
    labels_secondary: true
    state_map:
  • value: READY
    label: Standby
  • value: HEATING
    label: HeatingUp
  • value: ‘0’
    label: Not boosting
  • value: ‘0’
    label: Boosting
  1. In the configuration I see references to example “Boost”, but my API output gives me “bst”. Is the API changed in the meantime?

What am I doing wrong? Hope somebody can help me! Thank you! :slight_smile:

This is my output:

[core-ssh ~]$ curl -sX GET http://192.168.1.125/api?name=_all | jq
{
“tz”: “CET-1CEST,M3.5.0,M10.5.0/3”,
“wsw”: “0.26”,
“prfl”: “[email protected]”,
“extr”: “some-sha-key-thingy”,
“id”: “2004”,
“hsw”: “200407”,
“reset”: “1”,
“wi”: “1”,
“err”: “00”,
“tmpT”: “60”,
“tmpR”: “75”,
“mode”: “0”,
“wcntr”: “1”,
“bst”: “1”,
“vac”: “0”,
“pwr”: “1”,
“ht”: “1”,
“tmpC”: “46.9”,
“PICTime”: “2000-00-00 00:09:53”,
“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.125”,
“wSSID”: “Duivenvoorde14”,
“date”: “2023-02-12 17:59:53”,
“wtstp”: “1676221193”,
“wup”: “8254”,
“wdBm”: “-50”,
“pwcalc”: “3600”,
“pwc_t”: “4994”,
“pwc_u”: {
“date”: “2023-02-12 15:45:34”,
“timestamp”: “1676213134”,
“utc”: “4994”
},
“MAC”: “349454067118”,
“api”: “OK”
}
[core-ssh ~]$

Example via mytesy.com:
Disable boost:

https://www.mytesy.com/v3/api.php?cmd=apiv2&name=bst&set=0&id=5fac6d5d65d4e773bb0ba7d92b042d365dec5bf1

Enable boost:

https://www.mytesy.com/v3/api.php?cmd=apiv2&name=bst&set=1&id=5fac6d5d65d4e773bb0ba7d92b042d365dec5bf1

Hi there @genivos ! I see we share the same api/output. How does your configuration looks like for the Tesy Modeco?
It appears that there are some different firmwares on the devices arround and the API entpoint ánd variables could be different. Thank you!
See my latest post.

Wel, I have to say; a LOT is changed since the last major HA update… pffft! But okay! I have it working now with the new API output. I have the basics now, needed a hand with a good befriended developer :slight_smile:

rest:
  - authentication: basic
    scan_interval: 5
    resource: "http://192.168.1.125/api?name=_all"
    sensor:
      - name: "Tesy Water Heater"
        icon: "mdi:water-boiler"
        unique_id: "tesy_water_heater"
        value_template: "API OK"
        json_attributes:
          - "prfl"
          - "tmpMX"
          - "tmpT"
          - "tmpR"
          - "tmpC"
          - "bst"
          - "pwc_t"
          - "err"
          - "mode"
          - "ht"
          - "cdt"
template:
  - sensor:
      - name: "Tesy Current Temperature"
        icon: mdi:thermometer
        unique_id: "TesyCurrentTemperature"
        state: "{{ state_attr('sensor.tesy_water_heater', 'tmpC') }}"
        unit_of_measurement: "℃"
      - name: "Tesy Target Temperature"
        icon: mdi:thermometer
        unique_id: "TesyTargetTemperature"
        state: "{{ state_attr('sensor.tesy_water_heater', 'tmpT') }}"
        unit_of_measurement: "℃"
switch:
  - platform: command_line
    switches:
      tesyboostonoff:
        command_on: /usr/bin/curl -X GET "http://192.168.1.125/api?name=bst&set=1"
        command_off: /usr/bin/curl -X GET "http://192.168.1.125/api?name=bst&set=0"
        command_state: /usr/bin/curl -sX GET "http://192.168.1.125/api?name=_all"
        value_template: "{{ value_json['bst'] == '1' }}"
        friendly_name: Tesy Boost Temperature
        icon_template: >
          {% if value_json['bst'] == '0' %} mdi:rocket
          {% elif value_json['bst'] == '1' %} mdi:rocket-launch
          {% else %} mdi:help-circle
          {% endif %}
      tesyonoff:
        command_on: /usr/bin/curl -X GET "http://192.168.1.125/api?name=pwr&set=1"
        command_off: /usr/bin/curl -X GET "http://192.168.1.125/api?name=pwr&set=0"
        command_state: /usr/bin/curl -sX GET "http://192.168.1.125/api?name=_all"
        value_template: "{{ value_json['pwr'] == '1' }}"
        friendly_name: Tesy Power Switch
        icon_template: >
          {% if value_json['pwr'] == "1" %} mdi:toggle-switch
          {% else %} mdi:toggle-switch-off
          {% endif %}
1 Like

Thanks @belastingvormulier. I have used your yaml and card and it works like a charm. I see with inspector (Google Chrome) that there is also https://www.mytesy.com/v3/api.php?do=get_powerdata&id=1daea6.... with energy data which produces below output and I have tried with your code to get it into HA but not successful (error cannot parse json) probably because it is an array and I have just started learning REST. Also tried https://community.home-assistant.io/t/json-attributes-how-to/282316 but could not get it to work. Can you help?

{
  "HourNow": 10,
  "2000-c8eea6151ef9": {
    "ThisYear": 2970828,
    "LastMonth": 3472169,
    "ThisMonth": 231122,
    "Yesterday": 4017,
    "Today": 0,
    "Last24h": {
      "0": 511,
      "1": 0,
      "2": 2606,
      "3": 273,
      "4": 0,
      "5": 0,
      "6": 808,
      "7": 0,
      "8": 0,
      "9": 0,
      "10": 0,
      "11": 0,
      "12": 0,
      "13": 0,
      "14": 0,
      "15": 0,
      "16": 0,
      "17": 0,
      "18": 0,
      "19": 0,
      "20": 0,
      "21": 0,
      "22": 0,
      "23": 0
    },
    "Last12M": {
      "1": 224247,
      "2": 218031,
      "3": 251844,
      "4": 222642,
      "5": 211784,
      "6": 233772,
      "7": 261471,
      "8": 280354,
      "9": 271961,
      "10": 298718,
      "11": 260402,
      "12": 231122
    }
  }
}

I already see the issue because you cannot GET this data out. It is https://www.mytesy.com/v3/api.php?do=get_powerdata hence I need to find another way to GET the data. Sorry for bothering you.

Great! glad to see you have it working.

I have no problems currently, everything still seems to work so not sure how a HA update broke things but glad you managed to fix it!

Seems like you get more data out of your boiler than I can, must be a new firmware :slight_smile:

Hi all,

First of all, thanks for the work you guys put in to this! I just got myself the Tesy boiler and I was wondering if someone could help me with doing the right things to get the boiler in Home Assistant. I’m not that great with home assistant and usually only use the GUI to get things done.

Any help would be much appreciated!

King regards Michiel

Today the Tesy ModEco Cloud 80L has been installed, which I bought for it’s B energy class … and that it should work with HA!
I installed the code snippets in the config and script yaml files. Most of the sensors are showing relevant info.

This one “Tesy Time Left To Requested Temperature” doesn’t do anything? Unknown?
Is there a different code for this model? Not cdt but something else maybe?

For the Power status, I get this:
image
Not sure what the 8422 and 8444 are supposed to reflect?
The small brown period is status 6075.

Max temperature doesn’t seem to work?

Tesy mode = 4
What is that? What are the other modes statusses?

The rest is all working!
Much appreciated!

image

Max temp is probably not super relevant but it could display 75 as that is the max temp of the boiler.

You can set it in the config:

163 input_number:
164   tesyboilermanualtempinput:
165     name: Set Tesy Manual Temp
166     min: 14
167     max: 75
168     step: 1
169     unit_of_measurement: "°C"
170     icon: mdi:temperature-celsius

Mode 4 is a “calendar” mode, you can set a schedule in the interface of the boiler.
There are 3 possible schedules you can program:

          {% elif value_json['mode'] == '2' %} mdi:calendar
          {% elif value_json['mode'] == '3' %} mdi:calendar
          {% elif value_json['mode'] == '4' %} mdi:calendar

All is in the code. Not sure what the power status is, but if you go to the local ip of your boiler you should find that number somewhere as its increasing its probably the amount of power consumed in its life.

Time left to temp. Is not something I have on my boiler, So I never programmed it in. It could be that your boiler is not supporting this value, again login to the web interface of your boiler and check

Thanks! I found more API parameters using http://192.168.yy.xx/api?name=_all

tz
wsw
prfl
extr
id
hsw
reset
wi
err
tmpT
tmpR
mode
wcntr
bst
vac
pwr
ht
tmpC
prgVac
prgP1MO
prgP1TU
prgP1WE
prgP1TH
prgP1FR
prgP1SA
prgP1SU
prgP2MO
prgP2TU
prgP2WE
prgP2TH
prgP2FR
prgP2SA
prgP2SU
prgP3MO
prgP3TU
prgP3WE
prgP3TH
prgP3FR
prgP3SA
prgP3SU
wIP
wSSID
date
wtstp
wup
wdBm
pwcalc"
pwc_t
pwc_u
MAC
api

I know a little bit more about the power numbers now, after digging deeper.


I have a sneaky suspicion, that the number is a unix time indication (in seconds)

On https://www.epochconverter.com/
you can convert this number to something readable:


I’m not sure but it must be.
No idea what it indicates though, as later on it goes back to 1 and stays at 1 for a long time.

I’m going to experiment further, with the automations!
Thanks again!

Hmm interesting, must be something to do with heat / heating up :slight_smile: But again, If you go to the “normal” website of your boiler, that number must be there somewhere either in EPOCH or in Human