Ik ben in het bezit van een Fairland warmtepomp ( IPHCR45) voor mijn zwembad.
Nu zit daar ook een Modbus aansluiting op: RS485 . Omdat ik al erg veel info verzamel en geautomatiseerd heb middels Fibaro/Home Assistant kan de warmtepomp natuurlijk niet ontbreken.
Naar aanleiding van wat posts blijkt een RS485 to ETH adapter het handigst, ik heb immers UTP zat overal en ook naar de warmtepomp lag een loze UTP kabel.
Ik heb de Waveshare RS485 to ETH PoE adapter aangeschaft omdat ik geen trafo's wil en ook geen 5-12V beschikbaar heb standaard en deze nu zijn voeding ontvangt middels PoE. Verder zou hij identiek moeten zijn qua functionaliteit aan bijvoorbeeld de reguliere RS485-ETH of RS485-USB van Waveshare.
Er zijn in ieder geval al tweakers mij voorgegaan met dit type warmtepomp dus we weten dat het mogelijk is, echter krijg ik met geen mogelijkheid data uitgewisseld tussen HA/Node-RED en de Waveshare/warmtepomp.
Volgens de LED's op de Waveshare zelf heeft hij power, is er een link en vindt er data uitwisseling plaats met het aangesloten apparaat (Power/LINK/ACK branden op de Waveshare):
:strip_exif()/f/image/HCVnXv5pHmfnSXDTUQkduDlo.jpg?f=fotoalbum_medium)
Dit lijkt vooralsnog dus in orde. Als ik A/B ook wissel, dan stopt ACK met branden, zet ik ze weer terug dan is er binnen 1 seconde weer een blauwe LED ACK.
@Jazsie en @Invisible_man helpen mij al flink op weg vanuit andere topics maar omdat het probleem aanhoud en ik de andere topics niet wil vervuilen hierbij een eigen topic.
Ik probeer eerst een simpele connectiviteit verificatie voor elkaar te krijgen door 1 status uit te lezen van de pomp.
Wat volgens docu en praktijk bij bijvoorbeeld @Jazsie met eenzelfde type pomp werkt is dat we op 9600 BAUD, 8 Bits, No Parity en 1 Stop Bit zouden moeten contacten richting de warmtepomp.
De Waveshare zelf is ingesteld als TCP Server en simpel Modbus RTU over TCP:
:strip_exif()/f/image/qGek0ZwDKGZN6UGflym4MRk7.jpg?f=fotoalbum_medium)
:strip_exif()/f/image/PFLxzBEm0DMpmWKrkbsEw6xd.jpg?f=fotoalbum_medium)
/f/image/N1uKm6GQKwQ0IeH12pDB2HZQ.png?f=fotoalbum_medium)
Een telnet vanaf de HA of mijn laptop op port 502 richting de Waveshare geeft een sessie.
De TCP server "luistert" dus wel.
Ik heb geen andere RS485 modules of seriële adapters/apparaten.
Ik probeer nog even met een alternatief Modbus applicatie om te luisteren of ik iets van data voorbij zie komen.
De VirCom tool die Waveshare zelf meelevert op zijn website geeft het device met daarachter Tx/Rx bytes en die lopen op, er vindt dus wel iets van communicatie plaats mij is alleen niet duidelijk of dat mijn eigen sessie is richting de Waveshare of dat het de seriële interface is richting de warmtepomp.
Binnen Node-RED proberen we het volgende:
:fill(white):strip_exif()/f/image/9oMsv0JlcK9iIkm9ZLy1QAMx.png?f=user_large)
Unit-ID 1-16 geprobeerd maar dat eindigt allemaal in:
/f/image/lPpUHKQb0dfOHLuBDC6uFtGc.png?f=fotoalbum_medium)
Wiki van Waveshare gevolgd: https://www.waveshare.com/wiki/RS485_TO_ETH_(B)#FAQ
Specs van de warmtepomp:
/f/image/o9lSfBIftXiqaDpGtVqdOfU4.png?f=fotoalbum_medium)
De interfaces moet er dus zo uit komen te zien:
/f/image/bP0dw3ltn9kOJTXJWNH5SqHU.png?f=fotoalbum_medium)
:strip_exif()/f/image/qGek0ZwDKGZN6UGflym4MRk7.jpg?f=fotoalbum_medium)
Vanaf hier werd het mogelijk om direct een Modbus-read actie uit te voeren vanuit Node-RED of vanuit HA:
Node-RED voorbeeld flow:
modbus-read node gegevens (let op, server naam heb ik later aangepast):
:fill(white):strip_exif()/f/image/9oMsv0JlcK9iIkm9ZLy1QAMx.png?f=user_large)
modbus Node-RED client gegevens:
/f/image/iFWGLxBeneFNJ2EM3upBjgg7.png?f=fotoalbum_large)
En laat die flow maar stromen !
Mijn HA Yaml inclusief een aantal uitlees acties en de aan/uit "schrijf" actie:
Binnen HA krijg je nu een flink aantal entities erbij die ik in een apart dashboard heb gezet.
Mijn WPU is de fairland IPCHR45 en daar zijn de volgende registers van toepassing:
:strip_exif()/f/image/7zPY6HEyjAxLscDtoXjXzYZH.jpg?f=fotoalbum_large)
Met als bonus dat er een "geheime" extra stille/zuinige mode beschikbaar te maken is via de modbus:
/f/image/0xyNjGqB25vkoLxrhYVXaoV5.png?f=fotoalbum_large)
Hier een snippet uit de file waarin je kan zien dat er een 0-3 value mogelijk is maar vervolgens wordt alleen 0, 1 en 3 uitgelegd. 2 is hier het geheim.
Door op dit register 2 te schrijven zal de pomp in super silence mode springen!
Dit betekend dat de compressor terugschakelt tot 24% van zijn vermogen en dat de delta tussen inlet en outlet op een halve graad komt. Vandaag met een buitentemp in de loop van de ochtend van 15 graden was deze modes in staat om mijn 34 kuub bad met solar afdekking op zijn constante temperatuur te houden!
Mijn korte resultaten van de metingen tussen de verschillende modi:
Op "normal" gaat de compressor naar 100%. Op "Silent" gaat hij naar 80% , op "Super Silent" naar 24%
Dat is respectievelijk in mijn geval: 2300Watt, 1800Watt, 330Watt.
Wat ik gedaan heb is de setpoint even 4 graden boven de huidige inlet temp gezet.
Dan gaat hij op 100% normal mode ongeveer 1,5 graad warmer uit sturen dan hij binnen krijgt.
Op de 80% Silent mode zit daar ongeveer een graad tussen.
Op de Super Silent mode zit er een halve graad tussen.
Nu zit daar ook een Modbus aansluiting op: RS485 . Omdat ik al erg veel info verzamel en geautomatiseerd heb middels Fibaro/Home Assistant kan de warmtepomp natuurlijk niet ontbreken.
Naar aanleiding van wat posts blijkt een RS485 to ETH adapter het handigst, ik heb immers UTP zat overal en ook naar de warmtepomp lag een loze UTP kabel.
Ik heb de Waveshare RS485 to ETH PoE adapter aangeschaft omdat ik geen trafo's wil en ook geen 5-12V beschikbaar heb standaard en deze nu zijn voeding ontvangt middels PoE. Verder zou hij identiek moeten zijn qua functionaliteit aan bijvoorbeeld de reguliere RS485-ETH of RS485-USB van Waveshare.
Er zijn in ieder geval al tweakers mij voorgegaan met dit type warmtepomp dus we weten dat het mogelijk is, echter krijg ik met geen mogelijkheid data uitgewisseld tussen HA/Node-RED en de Waveshare/warmtepomp.
Volgens de LED's op de Waveshare zelf heeft hij power, is er een link en vindt er data uitwisseling plaats met het aangesloten apparaat (Power/LINK/ACK branden op de Waveshare):
:strip_exif()/f/image/HCVnXv5pHmfnSXDTUQkduDlo.jpg?f=fotoalbum_medium)
Dit lijkt vooralsnog dus in orde. Als ik A/B ook wissel, dan stopt ACK met branden, zet ik ze weer terug dan is er binnen 1 seconde weer een blauwe LED ACK.
@Jazsie en @Invisible_man helpen mij al flink op weg vanuit andere topics maar omdat het probleem aanhoud en ik de andere topics niet wil vervuilen hierbij een eigen topic.
Ik probeer eerst een simpele connectiviteit verificatie voor elkaar te krijgen door 1 status uit te lezen van de pomp.
Wat volgens docu en praktijk bij bijvoorbeeld @Jazsie met eenzelfde type pomp werkt is dat we op 9600 BAUD, 8 Bits, No Parity en 1 Stop Bit zouden moeten contacten richting de warmtepomp.
De Waveshare zelf is ingesteld als TCP Server en simpel Modbus RTU over TCP:
:strip_exif()/f/image/qGek0ZwDKGZN6UGflym4MRk7.jpg?f=fotoalbum_medium)
:strip_exif()/f/image/PFLxzBEm0DMpmWKrkbsEw6xd.jpg?f=fotoalbum_medium)
/f/image/N1uKm6GQKwQ0IeH12pDB2HZQ.png?f=fotoalbum_medium)
Een telnet vanaf de HA of mijn laptop op port 502 richting de Waveshare geeft een sessie.
De TCP server "luistert" dus wel.
Ik heb geen andere RS485 modules of seriële adapters/apparaten.
Ik probeer nog even met een alternatief Modbus applicatie om te luisteren of ik iets van data voorbij zie komen.
De VirCom tool die Waveshare zelf meelevert op zijn website geeft het device met daarachter Tx/Rx bytes en die lopen op, er vindt dus wel iets van communicatie plaats mij is alleen niet duidelijk of dat mijn eigen sessie is richting de Waveshare of dat het de seriële interface is richting de warmtepomp.
Binnen Node-RED proberen we het volgende:
:fill(white):strip_exif()/f/image/9oMsv0JlcK9iIkm9ZLy1QAMx.png?f=user_large)
Unit-ID 1-16 geprobeerd maar dat eindigt allemaal in:
/f/image/lPpUHKQb0dfOHLuBDC6uFtGc.png?f=fotoalbum_medium)
Wiki van Waveshare gevolgd: https://www.waveshare.com/wiki/RS485_TO_ETH_(B)#FAQ
Specs van de warmtepomp:
/f/image/o9lSfBIftXiqaDpGtVqdOfU4.png?f=fotoalbum_medium)
Edit: werkende situatie en uitleg
Met dank aan @xavier_82 moet de instruction time-out op 32ms gezet worden en Multi Host op YES !De interfaces moet er dus zo uit komen te zien:
/f/image/bP0dw3ltn9kOJTXJWNH5SqHU.png?f=fotoalbum_medium)
:strip_exif()/f/image/qGek0ZwDKGZN6UGflym4MRk7.jpg?f=fotoalbum_medium)
Vanaf hier werd het mogelijk om direct een Modbus-read actie uit te voeren vanuit Node-RED of vanuit HA:
Node-RED voorbeeld flow:
code:
1
| [{"id":"47aac878af8408e7","type":"function","z":"adc806f97bbc891e","name":"On/Off state","func":"var payload = msg.payload;\nmsg.description = \"Status\";\nmsg.topic = \"status\";\n\nnode.status({ fill: \"blue\", shape: \"ring\", text: msg.description + \":\" + payload });\n\nmsg.payload.status = payload;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":100,"wires":[["7ee64b1031e86e56"]]},{"id":"09406db3284879cf","type":"modbus-read","z":"adc806f97bbc891e","d":true,"name":"On/Off state","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"showWarnings":true,"unitid":"1","dataType":"Coil","adr":"0","quantity":"1","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"d2d0dc5aed5a7ca9","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":190,"y":100,"wires":[["9f511b1634141e95"],[]]},{"id":"9f511b1634141e95","type":"function","z":"adc806f97bbc891e","name":"MSG","func":"if (msg.payload[0] == 0) {\n msg.payload = \"Off\";\n}\nelse if(msg.payload[0] == 1) {\n msg.payload = \"On\";\n}\nelse {\n msg.payload = \"Unknown\";\n}\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":100,"wires":[["47aac878af8408e7"]]},{"id":"7ee64b1031e86e56","type":"mqtt out","z":"adc806f97bbc891e","name":"state","topic":"zwembad-wp/heatpump-state/","qos":"0","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"9238a86eed8ec7ac","x":790,"y":100,"wires":[]},{"id":"d2d0dc5aed5a7ca9","type":"modbus-client","name":"ZwembadHeatpump-RS485","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":true,"queueLogEnabled":false,"failureLogEnabled":true,"tcpHost":"192.168.166.29","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","serialAsciiResponseStartDelimiter":"0x3A","unit_id":"","commandDelay":"1","clientTimeout":"10000","reconnectOnTimeout":true,"reconnectTimeout":"20000","parallelUnitIdsAllowed":true,"showErrors":true,"showWarnings":true,"showLogs":true},{"id":"9238a86eed8ec7ac","type":"mqtt-broker","name":"Mosquitto","broker":"192.168.166.10","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"zwembad-wp","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"zwembad-wp","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"zwembad-wp","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}] |
modbus-read node gegevens (let op, server naam heb ik later aangepast):
:fill(white):strip_exif()/f/image/9oMsv0JlcK9iIkm9ZLy1QAMx.png?f=user_large)
modbus Node-RED client gegevens:
/f/image/iFWGLxBeneFNJ2EM3upBjgg7.png?f=fotoalbum_large)
En laat die flow maar stromen !
Mijn HA Yaml inclusief een aantal uitlees acties en de aan/uit "schrijf" actie:
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
| - name: waveshare1 type: tcp host: 192.168.166.29 port: 502 delay: 2 timeout: 5 binary_sensors: - name: "Fairland Zwembad WPU Status" unique_id: "fairland_wpu_status" address: 0 scan_interval: 10 slave: 1 sensors: - name: "Fairland Zwembad WPU Mode" unique_id: "fairland_wpu_mode" address: 1 scan_interval: 10 slave: 1 input_type: holding - name: "Fairland Zwembad WPU Compressor Percent" unique_id: "fairland_wpu_compressor_percent" address: 0 scan_interval: 10 slave: 1 input_type: input state_class: "measurement" unit_of_measurement: "%" - name: "Fairland Zwembad WPU Temp Inlet" unique_id: "fairland_wpu_water_inlet_temp" address: 3 scan_interval: 10 slave: 1 input_type: input precision: 1 offset: -30 scale: 0.5 state_class: "measurement" device_class: "temperature" unit_of_measurement: "°C" - name: "Fairland Zwembad WPU Temp Outlet" unique_id: "fairland_wpu_water_outlet_temp" address: 4 scan_interval: 10 slave: 1 input_type: input precision: 1 offset: -30 scale: 0.5 state_class: "measurement" device_class: "temperature" unit_of_measurement: "°C" - name: "Fairland Zwembad WPU Heating Temp Setpoint" unique_id: "fairland_wpu_heating_temp" address: 3 scan_interval: 10 slave: 1 input_type: holding precision: 1 offset: -30 scale: 0.5 state_class: "measurement" device_class: "temperature" unit_of_measurement: "°C" - name: "Fairland Zwembad WPU Compressor Amp " unique_id: "fairland_wpu_compressor_amp" address: 11 scan_interval: 10 slave: 1 input_type: input scale: 0.1 precision: 2 state_class: "measurement" device_class: "energy" unit_of_measurement: "A" - name: "Fairland Zwembad WPU PFC Volt " unique_id: "fairland_wpu_pfc_volt" address: 2 scan_interval: 10 slave: 1 input_type: input state_class: "measurement" device_class: "energy" unit_of_measurement: "V" - name: "Fairland Zwembad WPU Ambient Temp" unique_id: "fairland_wpu_ambient_temp" address: 5 scan_interval: 10 slave: 1 input_type: input precision: 1 offset: -30 scale: 0.5 state_class: "measurement" device_class: "temperature" unit_of_measurement: "°C" switches: - name: "Zwembad WPU Aan/Uit Schakelaar" unique_id: "Zwembad WPU Aan/Uit Schakelaar" slave: 1 address: 0 command_on: 1 command_off: 0 write_type: coil verify: input_type: coil address: 0 delay: 1 state_on: 1 state_off: 0 |
Binnen HA krijg je nu een flink aantal entities erbij die ik in een apart dashboard heb gezet.
Mijn WPU is de fairland IPCHR45 en daar zijn de volgende registers van toepassing:
:strip_exif()/f/image/7zPY6HEyjAxLscDtoXjXzYZH.jpg?f=fotoalbum_large)
Met als bonus dat er een "geheime" extra stille/zuinige mode beschikbaar te maken is via de modbus:
/f/image/0xyNjGqB25vkoLxrhYVXaoV5.png?f=fotoalbum_large)
Hier een snippet uit de file waarin je kan zien dat er een 0-3 value mogelijk is maar vervolgens wordt alleen 0, 1 en 3 uitgelegd. 2 is hier het geheim.
Door op dit register 2 te schrijven zal de pomp in super silence mode springen!
Dit betekend dat de compressor terugschakelt tot 24% van zijn vermogen en dat de delta tussen inlet en outlet op een halve graad komt. Vandaag met een buitentemp in de loop van de ochtend van 15 graden was deze modes in staat om mijn 34 kuub bad met solar afdekking op zijn constante temperatuur te houden!
Mijn korte resultaten van de metingen tussen de verschillende modi:
Op "normal" gaat de compressor naar 100%. Op "Silent" gaat hij naar 80% , op "Super Silent" naar 24%
Dat is respectievelijk in mijn geval: 2300Watt, 1800Watt, 330Watt.
Wat ik gedaan heb is de setpoint even 4 graden boven de huidige inlet temp gezet.
Dan gaat hij op 100% normal mode ongeveer 1,5 graad warmer uit sturen dan hij binnen krijgt.
Op de 80% Silent mode zit daar ongeveer een graad tussen.
Op de Super Silent mode zit er een halve graad tussen.
[ Voor 73% gewijzigd door GeeMoney op 04-05-2024 23:47 ]