JazekerXX schreef op dinsdag 28 juli 2026 @ 01:47:
[...]
## 3. CUBE Integratie
De CUBE stuurt **geen** losse eigen communicatieberichten over de lijn, maar beïnvloedt de **statusbytes** binnen het bestaande verkeer:
* **Zonder CUBE:** Byte 10/11 in de berichten is `0x00`.
* **Met CUBE aangesloten:** Byte 10/11 verandert naar `0x40` om de aanwezigheid van de gekoelde/bruismodule aan te kondigen.
I don't know how it would proof that. This is not how Cube is detected. This also changes without cube. The cube is discovered via another way. I made a
capture during which the system was idle and at around 3.5 seconds I unplugged cube from the reservoir and at around 7.5 seconds I plugged it back in. This shows clearly that a cube attached to the system results in double the data between the faucet and reservoir. Also only one packet changes.
FF 0A F5 41 04 7F xx 00 00 CS
in this packet the xx byte changes according to the cube being plugged in or not.
7F for Cube available
75 for Cube unavailable
CS is the checksum.
More on that later. Remember this as 10 byte packet.
3. Bus Reset / Heartbeat (Boiler): ~10ms na het kraanbericht (of bij stilte) stuurt de boiler een 5-byte frame (`XX 05 FA 10 CS`). Dit fungeert als heartbeat (met teller) én als reset-signaal om de luisterbuffers van alle apparaten op de lijn schoon te vegen bij ruis/collisions.
Remember this as a 5 byte packet. This is not only there for heart beat etc. it is used for initialization. It gets still sent after initialization but I dont know why.
I did inspect the packets myself and made many many more captures last evening and I got this by now:
Frame structure
[address] [length] [length XOR FF] [command] [payload...] [XOR checksum]
Byte 0 Address or device identifier
Byte 1 Total frame length
Byte 2 Byte 1 XOR 0xFF
Byte 3 Command/message type
Bytes... Payload
Last XOR checksum
Checksum
byte0 XOR byte1 XOR ... XOR checksum = 0xFF
--> checksum = 0xFF ^ byte0 ^ byte1 ^ ... ^ previousByte;
5 Byte packets
XX 05 FA CC CS
XX changes but what it indicates is unknown. It's first (after power on) 0x01 but after some time starts incrementing from sometimes 0x20 and sometimes 0x30
05 & FA are constant
CC is the command
CS checksum
These are also used to initialize communication between the reservoir and faucet. (Your code expected 0x01 0x11 packets which will not be sent until this initialization is done. I will say more about it later)
Initialization
To initialize the reservoir sends: 5 byte packet with XX = 0x01 and CC = 0x10
The flex faucet answers: 01 0A F5 10 01 11 05 00 03 07
The reservoir sends: 5 byte packet with XX = 0x01 and CC = 0x40
The faucet sends: 01 0C F3 40 01 11 04 57 70 00 00 72
Afterwards the reservoir sends the FF 0A F5 41 04 7F 7F 00 00 BA packet which contains cube information. Then normal communication with 0x01 0x11 starts.
10 byte packets
FF 0A F5 41 04 7F XX 00 00 CS
These contain the information about a cube being connected.
XX = 7F Cube connected
XX = 75 Cube disconnected
CS checksum
17 byte packets
01 11 EE 42 ... checksum
These are the packets sent by the reservoir after a faucet was initialized.
01 11 EE 42 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 CS
Byte 0 Address / device identifier? It's mostly 0x01
Byte 1 Frame length
Byte 2 Frame length XOR FF
Byte 3 command
Byte 4 alternating between 0x00 and 0x01. Maybe for timing or heartbeat? Every time the reservoir sends this is changed from 0x00 to 0x01 or vice versa. (So if the reservoir sends 5 packets this would go 0x00 to 0x01 to 0x00 to 0x01 to 0x00...)
Byte 5 unknown mostly 0x00
Byte 6 unknown mostly 0x08
Byte 7 reservoir heating / boiling water activated status bitfield
Byte 8 cube water status bitfield
Byte 9 unknown mostly 0x00
Byte 10 unknown mostly 0x00
Byte 11 same as 7 but switches with some delay (maybe to signal the valves successfully opened?)
Byte 12 same as 8 but again with some delay (maybe to signal valve state?)
Byte 13 unknown mostly 0x00
Byte 14 unknown mostly 0x00
Byte 15 unknown mostly 0x00
Byte 16 checksum
Byte 7 / 11
0x40 Idle (reservoir holds hot water)
0x42 (0x40 + 0x02) reservoir heating
0x60 (0x40 + 0x20) dispensing boiling water
Byte 8 / 12
0x00 idle
0x02 dispensing cooled non sparkling water
0x08 dispensing cooled sparkling water
16 byte packets
01 10 EF 42 ... checksum
These are the packets from the faucet.
01 10 EF 42 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 CS
Byte 0 Address / device identifier? mostly 0x01
Byte 1 Frame length
Byte 2 Frame length XOR FF
Byte 3 command (maybe the value of the command it's responding to?)
Byte 4 unknown mostly 0x00
Byte 5 unknown mostly 0x00
Byte 6 Boiling water request bitfield
Byte 7 cube water request bitfield
Byte 8 unknown mostly 0x00
Byte 9 unknown mostly 0x00
Byte 10 maybe a reaction to the reservoirs heating / heated up state?
Byte 11 unknown mostly 0x00
Byte 12 unknown mostly 0x00
Byte 13 unknown mostly 0x00
Byte 14 unknown mostly 0x00
Byte 15 checksum
Byte 6
0x00 idle
0x20 boiling water selected / dispensing
Byte 7
0x00 idle
0x02 cooled non sparkling water selected / dispensing
0x08 sparkling water selected / dispensing
Byte 10
0x40 maybe reservoir ready (heated up)
0x42 maybe reservoir heating
Now to the code you sent...
Well simply put it did not work. But not only because initialization was missing but also because SoftwareSerial does apparently not work for half-duplex UART. After changing it a bit to use a half duplex software serial library, (
https://github.com/akira215/HalfDuplexSerial-for-Arduino/tree/master) I gave it another try. This time it did not work because the reservoir sent no 17 byte packets (with 0x01 0x11), which is not surprising since we have no initialization. So I just plugged in the flex faucet to do the initialization for me. And well, now we had data and your code worked, but when I requested any water it was toggling like crazy since the faucet send another signal... But it did activate each one (boiling / sparkling / non sparkling) exactly as wanted! So we are on the right path.
I did not try to implement the initialization yet but will do that in the next hours and post here if I am successful. I scrapped my plan of using the Arduino to interact with the faucet to validate our findings, since I think we have enough evidence that we are onto something.