Compile and use executable to control heatpump through HA

Im really interested in how you are parsing the JSON. Could you share how?
I would like to read JSON data and display select or just all the data. Im interested in logging the temp in/out and see how different settings affect energy efficiency.

Thanks for the command. I used this o finalise the integration vi a node red.
Here is my flow (obviously replace serial and password in the exec nodes) and change to the topics required in the MQTT nodes:

[{"id":"47c7710d.fd42b","type":"tab","label":"Alsavo cleaned","disabled":false,"info":""},{"id":"a3be262d.b51778","type":"exec","z":"47c7710d.fd42b","command":"/config/AlsavoCtrl/AlsavoCtrl -s serial -l password","addpay":"","append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":430,"y":40,"wires":[["dde5c9d3.fe3c28"],[],[]]},{"id":"719a032c.54b22c","type":"inject","z":"47c7710d.fd42b","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"20","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":40,"wires":[["a3be262d.b51778"]]},{"id":"99214296.70fbf","type":"mqtt out","z":"47c7710d.fd42b","name":"MQTT publish","topic":"","qos":"0","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"f67759cd.ad1498","x":760,"y":260,"wires":[]},{"id":"e19e946d.5e6238","type":"split","z":"47c7710d.fd42b","name":"","splt":",","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"key","x":430,"y":260,"wires":[["9427e377.325e5"]]},{"id":"9427e377.325e5","type":"change","z":"47c7710d.fd42b","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"\"sh/outdoor/climate/sh_pool_heatpump/\" & key","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":570,"y":260,"wires":[["99214296.70fbf"]]},{"id":"4f074a76.2d07d4","type":"json","z":"47c7710d.fd42b","name":"","property":"payload","action":"obj","pretty":false,"x":290,"y":260,"wires":[["e19e946d.5e6238"]]},{"id":"7b0c8940.dd8ef8","type":"change","z":"47c7710d.fd42b","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/16=\"type\":\"status\", \"index\":16, \"value\"","fromt":"str","to":"\"Status/WaterInTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/17=\"type\":\"status\", \"index\":17, \"value\"","fromt":"str","to":"\"Status/WaterOutTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/18=\"type\":\"status\", \"index\":18, \"value\"","fromt":"str","to":"\"Status/AmbientTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/19=\"type\":\"status\", \"index\":19, \"value\"","fromt":"str","to":"\"Status/ColdPipeTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/20=\"type\":\"status\", \"index\":20, \"value\"","fromt":"str","to":"\"Status/HeatingPipeTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/21=\"type\":\"status\", \"index\":21, \"value\"","fromt":"str","to":"\"Status/IPMTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/22=\"type\":\"status\", \"index\":22, \"value\"","fromt":"str","to":"\"Status/FanSpeed\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/23=\"type\":\"status\", \"index\":23, \"value\"","fromt":"str","to":"\"Status/ExhaustTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/24=\"type\":\"status\", \"index\":24, \"value\"","fromt":"str","to":"\"Status/CompressorInputTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/25=\"type\":\"status\", \"index\":25, \"value\"","fromt":"str","to":"\"Status/ElectronicExhaustValveOpening\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/26=\"type\":\"status\", \"index\":26, \"value\"","fromt":"str","to":"\"Status/CompressorCurrent\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/27=\"type\":\"status\", \"index\":27, \"value\"","fromt":"str","to":"\"Status/CompressorFrequency\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/33=\"type\":\"status\", \"index\":33, \"value\"","fromt":"str","to":"\"Status/CompressorSpeedSetting\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/34=\"type\":\"status\", \"index\":34, \"value\"","fromt":"str","to":"\"Status/FrequencyLimitCode\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/48=\"type\":\"status\", \"index\":48, \"value\"","fromt":"str","to":"\"Status/AlarmCode1\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/49=\"type\":\"status\", \"index\":49, \"value\"","fromt":"str","to":"\"Status/AlarmCode2\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/50=\"type\":\"status\", \"index\":50, \"value\"","fromt":"str","to":"\"Status/AlarmCode3\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/51=\"type\":\"status\", \"index\":51, \"value\"","fromt":"str","to":"\"Status/AlarmCode4\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/52=\"type\":\"status\", \"index\":52, \"value\"","fromt":"str","to":"\"Status/SystemStatusCode\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/53=\"type\":\"status\", \"index\":53, \"value\"","fromt":"str","to":"\"Status/SystemRunningCode\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/54=\"type\":\"status\", \"index\":54, \"value\"","fromt":"str","to":"\"Status/DeviceStatusCode\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/55=\"type\":\"status\", \"index\":55, \"value\"","fromt":"str","to":"\"Status/HeatingMaxTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/56=\"type\":\"status\", \"index\":56, \"value\"","fromt":"str","to":"\"Status/CoolingMinTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/64=\"type\":\"status\", \"index\":64, \"value\"","fromt":"str","to":"\"Status/DeviceType\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/65=\"type\":\"status\", \"index\":65, \"value\"","fromt":"str","to":"\"Status/MainBoardHWREv\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/66=\"type\":\"status\", \"index\":66, \"value\"","fromt":"str","to":"\"Status/MainBoardSWREv\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/67=\"type\":\"status\", \"index\":67, \"value\"","fromt":"str","to":"\"Status/ManualHWCode\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/status/68=\"type\":\"status\", \"index\":68, \"value\"","fromt":"str","to":"\"Status/ManualHWCode\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/1=\"type\":\"config\", \"index\":1, \"value\"","fromt":"str","to":"\"Config/HeatingModeTargetTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/2=\"type\":\"config\", \"index\":2, \"value\"","fromt":"str","to":"\"Config/CoolingModeTargetTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/3=\"type\":\"config\", \"index\":3, \"value\"","fromt":"str","to":"\"Config/AutoModeTargetTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/4=\"type\":\"config\", \"index\":4, \"value\"","fromt":"str","to":"\"Config/SystemConfigBitmask1\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/5=\"type\":\"config\", \"index\":5, \"value\"","fromt":"str","to":"\"Config/SystemConfigBitmask2\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/11=\"type\":\"config\", \"index\":11, \"value\"","fromt":"str","to":"\"Config/WaterTempCalibration\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/6=\"type\":\"config\", \"index\":6, \"value\"","fromt":"str","to":"\"Config/ManualFrequencySetting\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/7=\"type\":\"config\", \"index\":7, \"value\"","fromt":"str","to":"\"Config/ManualEEVSetting\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/8=\"type\":\"config\", \"index\":8, \"value\"","fromt":"str","to":"\"Config/ManualFanSetting\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/9=\"type\":\"config\", \"index\":9, \"value\"","fromt":"str","to":"\"Config/DefrostInTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/10=\"type\":\"config\", \"index\":10, \"value\"","fromt":"str","to":"\"Config/DefrostOutTemp\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/11=\"type\":\"config\", \"index\":11, \"value\"","fromt":"str","to":"\"Config/WaterTempCal\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/12=\"type\":\"config\", \"index\":12, \"value\"","fromt":"str","to":"\"Config/DefrostInTime\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/13=\"type\":\"config\", \"index\":13, \"value\"","fromt":"str","to":"\"Config/DefrostOutTime\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/14=\"type\":\"config\", \"index\":14, \"value\"","fromt":"str","to":"\"Config/HotOver\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/15=\"type\":\"config\", \"index\":15, \"value\"","fromt":"str","to":"\"Config/ColdOver\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/16=\"type\":\"config\", \"index\":16, \"value\"","fromt":"str","to":"\"Config/PowerMode\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/17=\"type\":\"config\", \"index\":17, \"value\"","fromt":"str","to":"\"Config/Unknown\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/32=\"type\":\"config\", \"index\":32, \"value\"","fromt":"str","to":"\"Config/CurrentTime\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/33=\"type\":\"config\", \"index\":33, \"value\"","fromt":"str","to":"\"Config/TimerOnTime\"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"/home/alsavo/config/34=\"type\":\"config\", \"index\":34, \"value\"","fromt":"str","to":"\"Config/TimeOffTime\"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":390,"y":160,"wires":[["43a183cb.4d7eac"]]},{"id":"dde5c9d3.fe3c28","type":"change","z":"47c7710d.fd42b","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"}","fromt":"str","to":"","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"{","fromt":"str","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":180,"y":160,"wires":[["7b0c8940.dd8ef8"]]},{"id":"43a183cb.4d7eac","type":"function","z":"47c7710d.fd42b","name":"","func":"\nmsg.payload = msg.payload.replace(/\\n/g,\",\");\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":160,"wires":[["30597f5d.0a9b6"]]},{"id":"30597f5d.0a9b6","type":"change","z":"47c7710d.fd42b","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"\"Status/WaterInTemp","fromt":"str","to":"{\"Status/WaterInTemp","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"TimeOffTime\":0,","fromt":"str","to":"TimeOffTime\":0}","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":740,"y":160,"wires":[["4f074a76.2d07d4"]]},{"id":"d80fd958.162888","type":"mqtt in","z":"47c7710d.fd42b","name":"","topic":"sh/outdoor/climate/sh_pool_heatpump/cmnd/tempset","qos":"0","datatype":"auto","broker":"f67759cd.ad1498","nl":false,"rap":true,"rh":0,"x":210,"y":380,"wires":[["2c892eed.971742","ccdb777c.99c658","551e8ef7.370ea"]]},{"id":"82e70ad5.e0ca78","type":"exec","z":"47c7710d.fd42b","command":"/config/AlsavoCtrl/AlsavoCtrl -s serial -l password 1 ","addpay":"payload","append":"","useSpawn":"false","timer":"2","oldrc":false,"name":"Temperature Set in Heating Mode","x":860,"y":380,"wires":[[],[],[]]},{"id":"2c892eed.971742","type":"function","z":"47c7710d.fd42b","name":"","func":"\nmsg.payload = msg.payload * 10 ; return msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":380,"wires":[["82e70ad5.e0ca78"]]},{"id":"9ae1f50.772a708","type":"exec","z":"47c7710d.fd42b","command":"/config/AlsavoCtrl/AlsavoCtrl -s serial -l password 2","addpay":"payload","append":"","useSpawn":"false","timer":"2","oldrc":false,"name":"Temperature Set in Cooling Mode","x":860,"y":440,"wires":[[],[],[]]},{"id":"27f69006.7b6fd","type":"exec","z":"47c7710d.fd42b","command":"/config/AlsavoCtrl/AlsavoCtrl -s serial -l passwrord 3 ","addpay":"payload","append":"","useSpawn":"false","timer":"2","oldrc":false,"name":"Temperature Set in Auto Mode","x":850,"y":520,"wires":[[],[],[]]},{"id":"551e8ef7.370ea","type":"function","z":"47c7710d.fd42b","name":"","func":"\nmsg.payload = msg.payload * 10 ; return msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":520,"wires":[["536c7f0f.7fe66"]]},{"id":"ccdb777c.99c658","type":"function","z":"47c7710d.fd42b","name":"","func":"\nmsg.payload = msg.payload * 10 ; return msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":440,"wires":[["18decb03.1e1de5"]]},{"id":"18decb03.1e1de5","type":"delay","z":"47c7710d.fd42b","name":"","pauseType":"delay","timeout":"3","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":640,"y":440,"wires":[["9ae1f50.772a708"]]},{"id":"536c7f0f.7fe66","type":"delay","z":"47c7710d.fd42b","name":"","pauseType":"delay","timeout":"6","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":640,"y":520,"wires":[["27f69006.7b6fd"]]},{"id":"e3997950.7437a8","type":"mqtt in","z":"47c7710d.fd42b","name":"","topic":"sh/outdoor/climate/sh_pool_heatpump/cmnd/modeset","qos":"0","datatype":"auto","broker":"f67759cd.ad1498","nl":false,"rap":true,"rh":0,"x":240,"y":660,"wires":[["525c4dcd.31e944"]]},{"id":"4093b7e1.8d4038","type":"mqtt in","z":"47c7710d.fd42b","name":"","topic":"sh/outdoor/climate/sh_pool_heatpump/cmnd/powerset","qos":"0","datatype":"auto","broker":"f67759cd.ad1498","nl":false,"rap":true,"rh":0,"x":240,"y":600,"wires":[["6b8d82d9.53a08c"]]},{"id":"4741a1c9.4f3c3","type":"debug","z":"47c7710d.fd42b","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":930,"y":200,"wires":[]},{"id":"6b8d82d9.53a08c","type":"exec","z":"47c7710d.fd42b","command":"/config/AlsavoCtrl/AlsavoCtrl -s serial -l password 4 ","addpay":"payload","append":"","useSpawn":"false","timer":"2","oldrc":false,"name":"Power State Set","x":800,"y":600,"wires":[[],[],[]]},{"id":"df93b7e6.df7158","type":"exec","z":"47c7710d.fd42b","command":"/config/AlsavoCtrl/AlsavoCtrl -s serial -l password 4 ","addpay":"payload","append":"","useSpawn":"false","timer":"2","oldrc":false,"name":"Mode State Set","x":800,"y":660,"wires":[[],[],[]]},{"id":"525c4dcd.31e944","type":"change","z":"47c7710d.fd42b","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"auto","fromt":"str","to":"51","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"cool","fromt":"str","to":"52","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"heat","fromt":"str","to":"53","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"5","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":660,"wires":[["df93b7e6.df7158"]]},{"id":"f67759cd.ad1498","type":"mqtt-broker","name":"MQTTBROKER","broker":"192.168.0.111","port":"1883","clientid":"","usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"Online","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"Offline","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"Disconnected","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]

It is essentientially a lot of dirty change and functions to turn the payload into a publishable Java Script Object.
Then I set up 3 mqtt sensors in configuration.yaml and also a climate entity:

climate:
  - platform: mqtt
    name: "pool_heatpump"
    qos: 2
    payload_on: "53"
    payload_off: "5"
    send_if_off: true
    power_command_topic: "sh/outdoor/climate/sh_pool_heatpump/cmnd/powerset"
    modes:
      - heat
      - cool
      - auto
      - "off"
    mode_state_topic: "sh/outdoor/climate/sh_pool_heatpump/Config/SystemConfigBitmask1"
    mode_state_template: >-
      {% set modes = { '20':'off', '53':'heat',  '52':'cool', '54':'auto'} %}
      {{ modes[value] if value in modes.keys() else 'auto' }}
    mode_command_topic: "sh/outdoor/climate/sh_pool_heatpump/cmnd/modeset"
    current_temperature_topic: "sh/outdoor/climate/sh_pool_heatpump/Status/WaterInTemp"
    min_temp: 10
    max_temp: 40
    precision: 0.1
    temperature_state_topic: "sh/outdoor/climate/sh_pool_heatpump/Config/HeatingModeTargetTemp"
    temperature_state_template: >-
      {{ value | float | multiply(0.1) | round(1) }}
    temperature_command_topic: "sh/outdoor/climate/sh_pool_heatpump/cmnd/tempset"
    retain: true
sensor:
  - platform: mqtt
    name: "Pool Heatpump Water In Temp"
    state_topic: "sh/outdoor/climate/sh_pool_heatpump/Status/WaterInTemp"
    unit_of_measurement: "°C"
    value_template: >-
      {{ value | round(1) }}
    device_class: temperature
  - platform: mqtt
    name: "Pool Heatpump Water Out Temp"
    state_topic: "sh/outdoor/climate/sh_pool_heatpump/Status/WaterOutTemp"
    unit_of_measurement: "°C"
    value_template: >-
      {{ value | round(1) }}
    device_class: temperature
  - platform: mqtt
    name: "Pool Heatpump Water Ambient Temp"
    state_topic: "sh/outdoor/climate/sh_pool_heatpump/Status/AmbientTemp"
    unit_of_measurement: "°C"
    value_template: >-
      {{ value | round(1) }}
    device_class: temperature

In MQTT explorer it looks like that:

And in HA i display the temperatures and the climate thermostat:

The only missing aspect is that there is no topic published which returns the state of the heatpump. So it is possible to set Auto/Cool/Heat, but it cannot read the state under “mode_state_topic” which should be read thourgh Bitmask 1, but I do not understand the logic behind that published value.

3 Likes

That is so cool. Thanks a lot!!

My use case is different. I have hottub where I have disabled the internal electical heater and needed a way to control the heat pump. Main problem was that the heat pump overshoots the target temp by a full degree (38,5 C is nice 39,5 C feels really hot). Im communicating with the hottub through Home Assistant Gecko integration and use Node RED to send commands to the heatpump and turn off the garden light sensors when using the hottub light.

My flow looks likes this:

1 Like

Im struggling to get your flow to work.

command path, user, pass have been changed.
Mosquitto broker is set up and running and the mqqt server name has been changed in the flow.
the mqqt in out functions in the flow show ups as green and connected.

But I keep getting this error: “Unexpected end of JSON input”

Using mqqt explorer i get a lot less info that you:

The debug output from the last change image
before json looks like this:

{“Status/WaterInTemp”:38.5,“Status/WaterOutTemp”:38.1,“Status/AmbientTemp”:13.4,“Status/ColdPipeTemp”:0.0,“Status/HeatingPipeTemp”:13.6,“Status/IPMTemp”:21.0,“Status/FanSpeed”:0,“Status/ExhaustTemp”:22.6,“Status/CompressorInputTemp”:0.0,“Status/ElectronicExhaustValveOpening”:350,“Status/CompressorCurrent”:0,“Status/CompressorFrequency”:0,“Status/CompressorSpeedSetting”:6,“Status/FrequencyLimitCode”:9,“Status/AlarmCode1”:4,“Status/AlarmCode2”:0,“Status/AlarmCode3”:0,“Status/AlarmCode4”:0,“Status/SystemStatusCode”:0,“Status/SystemRunningCode”:0,“Status/DeviceStatusCode”:0,“Status/HeatingMaxTemp”:41.0,“Status/CoolingMinTemp”:6.0,“Status/DeviceType”:0,“Status/MainBoardHWREv”:8306,“Status/MainBoardSWREv”:16,“Status/ManualHWCode”:8306,“Status/ManualHWCode”:16,“Config/HeatingModeTargetTemp”:390,“Config/CoolingModeTargetTemp”:280,“Config/AutoModeTargetTemp”:390,“Config/SystemConfigBitmask1”:5,“Config/SystemConfigBitmask2”:0,“Config/ManualFrequencySetting”:50,“Config/ManualEEVSetting”:350,"Conf…

Seems like its been cut off.
Any ideas where to look to debug this?

Hi, yes the debug message is too large to fit in the default text length, a the link here you can find how to change your seetings.js file to allow more charaters in the debug window, I set it to 5000:

Then yeah you have nothing here actually sent to MQTT, it has created only the topic, which you will need to change to yours. You can see in all the fields of the string you have “Status/WaterInTemp” and those are the sub topics where it is published.

Check that there is the right amount of { and } and ".
The format of the payload should be {"topic":number,"topic2":number, ..."topicx":number} and that can be handled by the Json node.

After the Json node you should have something formatted like that:

What does the payload look like before the publish node ?

Hi,
Thanks a lot. That opened the box. The problem was here: image

your rules assumes TimeOffTime";0, and my heat pump returns 768 :slight_smile: Might be because I have once set the timer.

I had also introduced an error :roll_eyes: in the mqtt publish function and set the topic to: “sh/outdoor/climate/sh_pool_heatpump/cmnd/powerset” so all values got thrown into that topic.

It working nicely now - its a really cool system you have created.

Thanks a lot!!

2 Likes

Hi,
i add it to my HomeAssistant. I get the Respond from the Status and can set it. I use a Calculator to get the Bits
I Check the Code on my System.
Heat: 57 / 111001
Cool: 56 / 111000
Auto: 58 / 111010
Off: 25, 24, 26 / 11000, 11001, 11010
This are the Code for My Config without the Timer and Water always on.
The off Codes are for the 3 On Modes. If You have other you must Check.

{% set modes = { ‘25’:‘off’,‘24’:‘off’,‘26’:‘off’, ‘57’:‘heat’, ‘56’:‘cool’, ‘58’:‘auto’} %}

Read Bits from Right side.

Bits 0-1: Operating mode: 0 = cool, 1 = heat, 2 = Auto
0 Bit 2: Timer on enabled
1 Bit 3: Water pump running mode (see manual, 0 = heat pump controls water pump, 1 = always on)
1 Bit 4: Electronic Valve style ?
1 Bit 5: On/off
Bit 6: Debug mode (0 = auto, 1 = manual config C6, C7, C8 in effect)
Bit 7: Timer off enabled

I also add Comand 16 / 0,1,2 for Silent, Smart and Powerful.
/config/AlsavoCtrl/AlsavoCtrl -s snr -l pass 16 (0,1,2)
All works.

Thank you @Nordicfastware ! This is amazing work, and allowed me to integrate this as well.

The steps I followed:

  1. Created the binary which allowed me to send commands with the ssh shell.
  2. Set up the official Home Assistant MQTT broker add-on.
  3. Set up the Node-Red add-on, and imported the flow made by @Nordicfastware
  4. Changed the serial number, password and set up the correct address for the MQTT broker in the flows.
  5. Updated my configuration.yaml, again from the post by Nordicfastware.

@jressel01: can I ask how your configuration looks? I’m unsure what the best way is to integrate the Silent/Smart/Powerful.

i use one Helper (Input_Select) wit the option Silent, Smart and Powerful.
My Node Red Flow:


The Nodes WP_PM set the Status from the Helper.
The last on the end set the Mode

[{"id":"394cd206.e325fe","type":"change","z":"47c7710d.fd42b","name":"set topic 1","rules":[{"t":"move","p":"payload[\"Config/PowerMode\"]","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":570,"y":240,"wires":[["4741a1c9.4f3c3","edaa7acd.ea08e"]]},{"id":"edaa7acd.ea08e","type":"switch","z":"47c7710d.fd42b","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"2","vt":"num"}],"checkall":"true","repair":false,"outputs":3,"x":810,"y":260,"wires":[["9ae29b25.c6c7a"],["17dbad20.81b093"],["80ee77f6.ca7528"]]},{"id":"9ae29b25.c6c7a","type":"api-call-service","z":"47c7710d.fd42b","name":"WP_PM","server":"8553d2c8.dd7a7","version":1,"debugenabled":false,"service_domain":"input_select","service":"select_option","entityId":"input_select.wp_pm","data":"{\"option\": \"silent\"}","dataType":"jsonata","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":1060,"y":220,"wires":[[]]},{"id":"17dbad20.81b093","type":"api-call-service","z":"47c7710d.fd42b","name":"WP_PM","server":"8553d2c8.dd7a7","version":1,"debugenabled":false,"service_domain":"input_select","service":"select_option","entityId":"input_select.wp_pm","data":"{\"option\": \"smart\"}","dataType":"jsonata","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":1040,"y":260,"wires":[[]]},{"id":"80ee77f6.ca7528","type":"api-call-service","z":"47c7710d.fd42b","name":"WP_PM","server":"8553d2c8.dd7a7","version":1,"debugenabled":false,"service_domain":"input_select","service":"select_option","entityId":"input_select.wp_pm","data":"{\"option\": \"powerful\"}","dataType":"jsonata","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":1000,"y":300,"wires":[[]]},{"id":"7ebfa290.3e815c","type":"server-state-changed","z":"47c7710d.fd42b","name":"","server":"8553d2c8.dd7a7","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_select.wp_pm","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"x":210,"y":760,"wires":[["fa629b06.3e9d08"]]},{"id":"fa629b06.3e9d08","type":"change","z":"47c7710d.fd42b","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"powerful","fromt":"str","to":"2","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"smart","fromt":"str","to":"1","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"silent","fromt":"str","to":"0","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":510,"y":760,"wires":[["86e0ef2.006cc9","ea3ff3c6.015828"]]},{"id":"ea3ff3c6.015828","type":"exec","z":"47c7710d.fd42b","command":"/config/AlsavoCtrl/AlsavoCtrl -s 824500000300 -l woodstock#1 16 ","addpay":"payload","append":"","useSpawn":"false","timer":"2","oldrc":false,"name":"PowerMode State Set","x":920,"y":760,"wires":[[],[],[]]},{"id":"8553d2c8.dd7a7","type":"server","name":"Home Assistant","addon":true}]

I thought I would try this with my new Swim&Fun 1401. But where do I find the “serial” needed to run the command? The only somewhat unique number I can find on the heater, is a 21 char alphanumeric string, printed below a barcode, but that doesn’t seem to work. The Alsavo app works, but doesn’t show a serial…

Nevermind… found a different “manual” to the Alsavo app, than the one I got with the heater. This one explained where to find the serial (fyi to others: by pressing the “Alsavo Pro” logo in the top right corner)

I get some error: anyone know what to do? i dont! :slight_smile:

OK: 527 MiB in 212 packages
cmake --clean-first -DCMAKE_EXE_LINKER_FLAGS="-static -Os" .
CMake Error: Unknown argument —clean-first
Cmake Error: Runcmake —helpfor all supported options.

Same here. Any solution?

Try
cmake clean-first -DCMAKE_EXE_LINKER_FLAGS="-static -Os" .

2 Likes

Hi let say my serial nr is 824500143219 and my password is ytr773r.
Should I write like this in terminal. to connect?

./AlxavoCtrl -s 824500143219 -l ytr773r.

Can not succsed. to connect

Serial and password was jus an example. Not my real.

But thanks anyway.

Hi Niclas,
The command is not reaching your heatpump, I had the same issue.
Specify the IP address and port to make sure:

./AlsavoCtrl -s serial -l pass -a IP-adress-of-heatpump -p 1194

it should be listening on port 1194.

Hello,
Can someone explain to me in detail how to make the system work?
I don’t understand anything about how to do it.
THANKS

I have compiled the AlsavoCtrl into a Docker image that will publish some of the parameters on MQTT, so if anyone is interested you can get started rather quickly :slight_smile:

The Docker image: Docker Hub
Source code: GitHub

You’ll find some documentation on how to use the image in both Docker Hub and GitHub.

  • Peter
1 Like

Hi All and @Jerome_Arnould,

I ended up making a complete tutorial for owners of Alsavo based heatpump for full integration as a climate controlable entity in Home Assistant.
The repo is here:

https://github.com/gllmlbrt/Alsavo-HassOS

Hope you will find it useful, and comments are welcome.

Hi Guys,

Many thanks for everything you did!

Would you mind helping me with the configuration.yaml?

I used the manual created by @Nordicfastware

All the rest seems to be fine on my side, I just don’t know how to configure the configuration.yaml.

Thank you in advance!

Krzysztof