Electronics > Projects, Designs, and Technical Stuff

Figuring out an RS485 protocol?

<< < (7/7)

TBuyukkilic:
I made some progress, it's not an actual Modbus implementation, but they kind of did their own version.

- I can query the status, using the FF function code
- I can set the setpoint temperature by sending ID + SETTING + VALUE + CRC, however I need to send an empty or invalid value first e.g. 3B00003B0269
- I can only access other settings in the thermostat after a reset, however after registration I can nog longer access some settings, because I think the capabilities are hardcoded in the base unit

Request

--- Code: ---data: 110C1BCA FF BDB4
ID: 110C1BCA
FUNCTION: FF (get status?)
CRC: BDB4

--- End code ---

Response

--- Code: ---data: 110C1BCA 4002AB 3E0000 3F0C02 42B300 D8AA
ID: 110C1BCA
ALLOW_COOLING (3F: 0C02): True
CURRENT_TEMPRATURE (40: 02AB): 20.17
OPERATING_MODE (3E: 0000): Room Temprature
UNKNOWN5 (42: B300): B300
CRC: D8AA

--- End code ---

Response 2, not sure what triggers this

--- Code: ---data: 110C1BCA 2D7FFF 3D0000 0C0024 37019A 3803B6 3B0269 3C0048 358000 3F0402 ACEA
ALLOW_COOLING (3F: 0402): True
ECO_SET_BACK (3C: 0048): 4.0
HEATING (3D: 0000): False
SETPOINT_TEMP (3B: 0269): 16.5
SETPOINT_TEMP_MAX (38: 03B6): 35.0
SETPOINT_TEMP_MIN (37: 019A): 5.0
UNKNOWN1 (0C: 0024): 0024
UNKNOWN2 (2D: 7FFF): 7FFF
UNKNOWN4 (35: 8000): 8000
CRC: ACEA

--- End code ---



--- Code: ---3F: Allow cooling - Some fuzzy logic here, it looks like hex value -2 /1024 returns an int, 1 is true, 2 is false, and 3 seems to be true....
40: Current temperature - degrees = int(str(value), 16); return ((degrees - 320) / 1.8) / 10
3E: Operating mode - "0000": "Room Temprature", "0001":"Internal with floor max/min","0002":"Remote Outdoor", "0003":"Remote Sensor"B300
42: No idea, returns B300 at all themorstats
3C: Eco setback,  weird logic, degrees = int(str(value), 16); return degrees / 18
3D: Heating, "0000": False, "0040": True
3B: Set temperature - degrees = int(str(value), 16); return ((degrees - 320) / 1.8) / 10
37: Min temperature - degrees = int(str(value), 16); return ((degrees - 320) / 1.8) / 10
38: Max temperature - degrees = int(str(value), 16); return ((degrees - 320) / 1.8) / 10
0C: No idea, returns 0024 at all themorstats
2D: No idea, returns 7FFFF at all themorstats, but this should indicate that the data is not available, whatever 2D stands for
35: No idea, returns 8000 at all themorstats

--- End code ---

TBuyukkilic:

--- Quote from: mitokondoria on February 21, 2022, 09:20:33 am ---
--- Quote from: dimmu311 on November 15, 2020, 09:32:10 pm ---
could maybe one of you check if my theory could be bossible? Or mybe somone of you have thermostat wher you can see humidity, or something else to double check if i have found right messeg code.


--- End quote ---

Hi dimmu311,

I own a SMatrix Wave with five T146 thermostats. Such thermostats doesn't have any humidity sensor, only a configurable remote temperature sensor.
My only available settings on the unit is modifying the ECO temperature and defining this remote sensor.

I'm working on completing a sketch for a Wemos D1 mini + MAX485 behaving as a sniffer and publishing to a MQTT topic (so homeassistant displays several climate entities). Will publish it as soon as it is "fine"


Edit: I have uploaded thee sketch at https://github.com/witokondoria/homeassistant_uponor

--- End quote ---

Really nice, I want to do something similar, but also allow writing. We're getting there :)

drdds:
Hi there!
This is my first post. Despite I was registered time ago something happened with my previous account, that is no usable anymore.

It has been a long time since I discovered this thread and started planning my hardware and software (almost two years). In 2019 I sent a message to Alan (who started this thread) and after that started to plan. All your posts have been quite helpful to elaborate my software but still have a lot of doubts. Let’s start:

Hardware:

I’m using a RS485 server (http://www.hi-flying.com/hf5122) to interface with the controller (that is a SMATRIX BASE) and control my thermostats (all of, up to 6, them are T-146).
My settings are 19200 bps 8/1/N and I get consistent frames that are validated by means of the CRC (that matches the modbus one).

I created a server at port 9999 that copies any frame on the bus to the socket and allows me to send whatever frame.

Sofware:

I decided time ago to develop a service (written in Java) that will be running in a small linux server that gets the values from the RS485 port through TCP and posts them to a MQTT broker once they are processed.

Results so far… The server frame capture and processing part is almost ready (except for my doubts that are shared here) and the MQTT part is still pending (I hope not for a long time…)

Frames:

The usual frames I can capture from the system are:


--- Code: ---<-  11049E8BFF9E6D
11 04 | 9E 8B | FF | CRC 9E6D [ OK ]

->  11049E8B4003373E00003F1C02FB14
11 04 | 9E 8B | Room Temp[40]( 03:37 -> 82.3F/27.94C ) || Operating mode [3E] ( 00:00 -> ROOM_TEMPERATURE || Params1 [3F] ( 1C:02 ->  [Cold] ) || CRC FB14 [ OK ]

->  11049E8B2D7FFF3D10400C002437019A3803B63B02CC3C0048358000D8B9
11 04 | 9E 8B |  ID: 2D | Val 7FFF || Demand water[3D]( 10:40 -> YES [Cold] ) ||  ID: 0C | Val 0024 || SetPoint Temp Min [37] ( 01:9A -> 41.0F/5.0C ) || SetPoint Temp Max [38]( 03:B6 -> 95.0F/35.0C ) || SetPoint Temp[3B]( 02:CC -> 71.6F/22.0C )  ||  ID: 3C | Val 0048 ||  ID: 35 | Val 8000 || CRC D8B9 [ OK ]


--- End code ---


My analysis of the frames:

really modbus?

In principle observing the frame staring with "11 04" anyone may think it is modbus requesting registers (0x04) to station 17 (0x11), however, observing others’ posts (that were quite helpful) I discovered that changes with the system. For instance, dimmu311 reports frames staring with "10 4" that also fits into the hypothesis, but jsouto reports "10 05" that does not fit! also TBuyukkilic reports "11 0c" that also does not fit! So…. This is something proprietary.

I assumed first two bytes as SYSTEM ID (11 04)

I assumed third and fourth bytes as the STATION ID (thermostat, 9E 8B in the example).

I agree that FF may be status request as mitokondoria suggests for requests (<-)

The data in responses are sets of the sequence ID (1byte) Payload(2 byte).

So it is not modbus despite frame CRC matches.


What about the data?

I strongly relied on what TBuyukkilic provided in a previous post. Let me show my conclusions on the values and my doubts:


--- Code: ---->  11049E8B4003373E00003F1C02FB14
11 04 | 9E 8B | Room Temp[40]( 03:37 -> 82.3F/27.94C ) || Operating mode [3E] ( 00:00 -> ROOM_TEMPERATURE || Params1 [3F] ( 1C:02 ->  [Cold] ) || CRC FB14 [ OK ]

--- End code ---


* ID 0x40 (room temperature)   400337
(03:37 -> 82.3F/27.94C)
DOUBTS: No doubt at all! This is crystal clear! I have double checked it. In uponor documents they claim they convert it using (F-320)/18. I’m doing the traditional way and also matches.


* ID 0x3E (operating mode) 3E0000

--- Code: ---ROOM_TEMPERATURE(0x0000, "Room Temperature"), INTERNAL_FLOOR_SENSOR(0x0002, "Internal floor sensor"), REMOTE_OUTDOOR_SENSOR(0x0003, "Remote Outdoor sensor"), REMOTE_SENSOR(0xB300, "Remote sensor");

--- End code ---


DOUBTS: TBuyukkilic , where did you get that??!!! It is great and seems to match! Thanks a lot!


*  ID 0x3F (allow cooling??) 3F1C02
I process it this way:

--- Code: ---hot = ((currently&0xF000) == 0x0000) ? true : false;
cold = ((currently&0xF000) == 0x1000) ? true : false;

--- End code ---


DOUBTS: TBuyukkilic calls it Allow Cooling, but I noticed that 0xF000&Value=0x0000 for heating (winter) and  0xF000&Value=0x1000 for cooling (summer)… but I can’t say anything else about the rest  that would be C02 taking out the first 4 bits…


--- Code: ---->  11049E8B2D7FFF3D10400C002437019A3803B63B02CC3C0048358000D8B9
11 04 | 9E 8B |  ID: 2D | Val 7FFF || Demand water[3D]( 10:40 -> YES [Cold] ) ||  ID: 0C | Val 0024 || SetPoint Temp Min [37] ( 01:9A -> 41.0F/5.0C ) || SetPoint Temp Max [38]( 03:B6 -> 95.0F/35.0C ) || SetPoint Temp[3B]( 02:CC -> 71.6F/22.0C )  ||  ID: 3C | Val 0048 ||  ID: 35 | Val 8000 || CRC D8B9 [ OK ]

--- End code ---


*  ID 0x2D (no idea!) 2D7FFF
DOUBTS: everyone get 7FFF but no idea!

*  ID 0x3D (I named it demand)  3D1040
I processed this way:

--- Code: ---demanding = ((currently&0x00FF) == 0x0040) ? true : false;
hot = ((currently&0xFF00) == 0x0000) ? true : false;
cold = ((currently&0xFF00) == 0x1000) ? true : false;

--- End code ---


DOUBTS: So 0x0000 means actuators for this thermostat are not demanding water during heating, 0x0040 demands water (heating), 0x1000 no demand (cooling), 0x1040 demands (cooling). Do you observe the same?

* ID 0x0C (no idea) 0C0024
Always the same value!
DOUBTS: did you observed something different? Are you all using t-146 (may be the model). It may also has something to do with display configurations at thermostat?

* ID 0x38 Setpoint MIN
* ID 0x37 Setpoint MIN, as room temperature. Also documented by uponor that is maximum 35 and minimum 5. So, crystal clear!

*  ID 0x3B  (setpoint)  3B02CC
I process it as Room temperature but get always two degrees LESS that the actual setpoint (at least in cooling mode – need to check in heating mode..)
DOUBTs: do you read the exact temperature? Or you need to increase it by 2 (in Celsius)??

* ID 0x3C and ID 0x35, no idea at all.

Thanks for your time and let’s see if you can bring any light to all this!

I add some traffic for analysis:

--- Code: ---Client... started
->  110470642D7FFF3D10000C002437019A3803B63B02CD3C004835800087C5
11 04 | 70 64 |  ID: 2D | Val 7FFF || Demand water[3D]( 10:00 -> NO [Cold] ) ||  ID: 0C | Val 0024 || SetPoint Temp Min [37] ( 01:9A -> 41.0F/5.0C ) || SetPoint Temp Max [38]( 03:B6 -> 95.0F/35.0C ) || SetPoint Temp[3B]( 02:CD -> 71.7F/22.06C )  ||  ID: 3C | Val 0048 ||  ID: 35 | Val 8000 || CRC 87C5 [ OK ]
<-  11047069FFB6F8
11 04 | 70 69 | FF | CRC B6F8 [ OK ]
->  110470694002EA3E00003F1C02F162
11 04 | 70 69 | Room Temp[40]( 02:EA -> 74.6F/23.67C ) || Operating mode [3E] ( 00:00 -> ROOM_TEMPERATURE || Params1 [3F] ( 1C:02 ->  [Cold] ) || CRC F162 [ OK ]
->  110470692D7FFF3D10000C002437019A3803B63B02CD3C00483580002C53
11 04 | 70 69 |  ID: 2D | Val 7FFF || Demand water[3D]( 10:00 -> NO [Cold] ) ||  ID: 0C | Val 0024 || SetPoint Temp Min [37] ( 01:9A -> 41.0F/5.0C ) || SetPoint Temp Max [38]( 03:B6 -> 95.0F/35.0C ) || SetPoint Temp[3B]( 02:CD -> 71.7F/22.06C )  ||  ID: 3C | Val 0048 ||  ID: 35 | Val 8000 || CRC 2C53 [ OK ]
<-  11047064FFB268
11 04 | 70 64 | FF | CRC B268 [ OK ]
->  110470644002F13E00003F1C02CB99
11 04 | 70 64 | Room Temp[40]( 02:F1 -> 75.3F/24.06C ) || Operating mode [3E] ( 00:00 -> ROOM_TEMPERATURE || Params1 [3F] ( 1C:02 ->  [Cold] ) || CRC CB99 [ OK ]
->  110470642D7FFF3D10000C002437019A3803B63B02CD3C004835800087C5
11 04 | 70 64 |  ID: 2D | Val 7FFF || Demand water[3D]( 10:00 -> NO [Cold] ) ||  ID: 0C | Val 0024 || SetPoint Temp Min [37] ( 01:9A -> 41.0F/5.0C ) || SetPoint Temp Max [38]( 03:B6 -> 95.0F/35.0C ) || SetPoint Temp[3B]( 02:CD -> 71.7F/22.06C )  ||  ID: 3C | Val 0048 ||  ID: 35 | Val 8000 || CRC 87C5 [ OK ]
<-  1104708CFFFC68
11 04 | 70 8C | FF | CRC FC68 [ OK ]
->  1104708C4002EB3E00003F1C02F5E4
11 04 | 70 8C | Room Temp[40]( 02:EB -> 74.7F/23.72C ) || Operating mode [3E] ( 00:00 -> ROOM_TEMPERATURE || Params1 [3F] ( 1C:02 ->  [Cold] ) || CRC F5E4 [ OK ]
->  1104708C2D7FFF3D10000C002437019A3803B63B02CD3C00483580007FDA
11 04 | 70 8C |  ID: 2D | Val 7FFF || Demand water[3D]( 10:00 -> NO [Cold] ) ||  ID: 0C | Val 0024 || SetPoint Temp Min [37] ( 01:9A -> 41.0F/5.0C ) || SetPoint Temp Max [38]( 03:B6 -> 95.0F/35.0C ) || SetPoint Temp[3B]( 02:CD -> 71.7F/22.06C )  ||  ID: 3C | Val 0048 ||  ID: 35 | Val 8000 || CRC 7FDA [ OK ]
<-  11047124FFD268
11 04 | 71 24 | FF | CRC D268 [ OK ]
->  110471244002F73E00003F1C02ABB1
11 04 | 71 24 | Room Temp[40]( 02:F7 -> 75.9F/24.39C ) || Operating mode [3E] ( 00:00 -> ROOM_TEMPERATURE || Params1 [3F] ( 1C:02 ->  [Cold] ) || CRC ABB1 [ OK ]
->  110471242D7FFF3D10400C002437019A3803B63B02CD3C00483580003C20
11 04 | 71 24 |  ID: 2D | Val 7FFF || Demand water[3D]( 10:40 -> YES [Cold] ) ||  ID: 0C | Val 0024 || SetPoint Temp Min [37] ( 01:9A -> 41.0F/5.0C ) || SetPoint Temp Max [38]( 03:B6 -> 95.0F/35.0C ) || SetPoint Temp[3B]( 02:CD -> 71.7F/22.06C )  ||  ID: 3C | Val 0048 ||  ID: 35 | Val 8000 || CRC 3C20 [ OK ]
<-  1104706DFFB438
11 04 | 70 6D | FF | CRC B438 [ OK ]
->  1104706D4002EC3E00003F1C02D6B7
11 04 | 70 6D | Room Temp[40]( 02:EC -> 74.8F/23.78C ) || Operating mode [3E] ( 00:00 -> ROOM_TEMPERATURE || Params1 [3F] ( 1C:02 ->  [Cold] ) || CRC D6B7 [ OK ]
->  1104706D2D7FFF3D10000C002437019A3803B63B02CD3C00483580007976
11 04 | 70 6D |  ID: 2D | Val 7FFF || Demand water[3D]( 10:00 -> NO [Cold] ) ||  ID: 0C | Val 0024 || SetPoint Temp Min [37] ( 01:9A -> 41.0F/5.0C ) || SetPoint Temp Max [38]( 03:B6 -> 95.0F/35.0C ) || SetPoint Temp[3B]( 02:CD -> 71.7F/22.06C )  ||  ID: 3C | Val 0048 ||  ID: 35 | Val 8000 || CRC 7976 [ OK ]
<-  11049E8BFF9E6D
11 04 | 9E 8B | FF | CRC 9E6D [ OK ]
->  11049E8B40033A3E00003F1C0227D4
11 04 | 9E 8B | Room Temp[40]( 03:3A -> 82.6F/28.11C ) || Operating mode [3E] ( 00:00 -> ROOM_TEMPERATURE || Params1 [3F] ( 1C:02 ->  [Cold] ) || CRC 27D4 [ OK ]
->  11049E8B2D7FFF3D10400C002437019A3803B63B02CC3C0048358000D8B9
11 04 | 9E 8B |  ID: 2D | Val 7FFF || Demand water[3D]( 10:40 -> YES [Cold] ) ||  ID: 0C | Val 0024 || SetPoint Temp Min [37] ( 01:9A -> 41.0F/5.0C ) || SetPoint Temp Max [38]( 03:B6 -> 95.0F/35.0C ) || SetPoint Temp[3B]( 02:CC -> 71.6F/22.0C )  ||  ID: 3C | Val 0048 ||  ID: 35 | Val 8000 || CRC D8B9 [ OK ]

--- End code ---


drdds:
Hi there,

I have had very productive days in row and I have a prototype for this.

All the details can be found at https://github.com/ddsuc3m/uponor-floorheating
Also I opened a discussion in OpenHab https://community.openhab.org/t/control-uponor-underfloor-heating-thermostats/135969

Some things that were open:

- Eco set back is exactly as you mentioned before, so it is updated in code
- Do you have a timer (I-143) to monitor how the controller changes the thermostats?
- Can you please post your controller and thermostats models together with some traffic (I think the first two bytes are the controller model - or related)?
- Any of you has a thermostat provinding humidity? (so we can findout the humidity command that is maybe one of the unknown fields)

Thanks!

drdds:
There are new updates to the software since it crashed after few hours.
Now seems to be stable

Regards!

Navigation

[0] Message Index

[*] Previous page

There was an error while thanking
Thanking...
Go to full version