Skip to content

Conversation

@burmistrzak
Copy link

@burmistrzak burmistrzak commented Jan 27, 2025

This PR aims to be the most feature-complete and robust definition for the VRC720 sensoCOMFORT line of system regulators.
It's also entirely written in TypeSpec, and already prepared to take advantage of the upcoming range validation feature for numeric values.

Follow-up for #462 to keep patches manageable.

@burmistrzak
Copy link
Author

@john30 What's your policy regarding register names?
I'd prefer to simply copy what is being shown on the system regulator's screen, whenever possible. Thoughts?

@burmistrzak
Copy link
Author

@GuyHarg If all goes well, and depending on how your VRC 720 is supported, basv3 might become the less-specific basv config, with some conditions added for older devices. 🤞

@john30
Copy link
Owner

john30 commented Jan 28, 2025

@john30 What's your policy regarding register names? I'd prefer to simply copy what is being shown on the system regulator's screen, whenever possible. Thoughts?

I'd rather stick to short names for common things like heat circuit="hc", hot water circuit="hwc" etc as otherwise the names grow awfully and unnecessary long, see here https://github.com/john30/ebusd-configuration#component-type-names

and for ease of use messages revealing a single value only should carry the field name "value".

also I'd rather prevent reinvention of the same, i.e. if a message with a suitable name exists elsewhere: use it and rather later do refactoring overall (as is ongoing with the typespec conversion)

@burmistrzak
Copy link
Author

I'd rather stick to short names for common things like heat circuit="hc", hot water circuit="hwc" etc as otherwise the names grow awfully and unnecessary long, see here https://github.com/john30/ebusd-configuration#component-type-names

@john30 Roger that! I‘ll try to keep them short.

and for ease of use messages revealing a single value only should carry the field name "value".

Already the case for all my definitions. 👌

also I'd rather prevent reinvention of the same, i.e. if a message with a suitable name exists elsewhere: use it and rather later do refactoring overall (as is ongoing with the typespec conversion)

Sounds good! It’s certainly easier to refactor when naming is consistent.

Lastly, as there isn’t a good generic configuration for the BASV* range of devices, maybe we’ll use this one?

@kgeree
Copy link

kgeree commented Jan 29, 2025

hi @burmistrzak, till now i was using CTLV2 config from jonesPD's repo for my regulator, which is (i think a quite early VRC70) identified as "720" in ebusd and I though I give it a try with this basv3 config. I have to say it works almost flawlessly. :)

Few things I noticed:

  1. Can't read Errorhistory, while it shouldn't be empty. I get:
    [mqtt error] read 720 Errorhistory: ERR: end of input reached

  2. Have some small issue with PhoneNumber1-2 amd Z*Name1-2
    e.g. for phone number I have set 10 digits, in PhoneNumber1 I can see the first 6 digits of it and PhoneNumber2 unable to parse:

2025-01-29 08:54:07.847 [update error] unable to parse poll-read 720 PhoneNumber2 from 3115b52406020000007000 / 09030070003432343400: ERR: invalid position
2025-01-29 08:54:07.847 [mqtt error] decode 720 PhoneNumber2: ERR: invalid position

Similar issue for Zone names.

  1. Z*QuickVetoDuration should have a unit "hours" or "h" as currently its just a number.

  2. DewPointOffset -> Isn't it the Dewpoint only which is displayed? ...and Offset for it is set elsewhere? (I was not able to check it on the regulator as I'm remote) Makes me a bit confused together with the Hc*DewPointOffset values...

All in all I think this could be used as a baseline even for devices identified as "720", "ctlv*", "basv*"?

@burmistrzak
Copy link
Author

burmistrzak commented Jan 29, 2025

@kgeree Nice, thanks the detailed feedback!

  1. I‘ll investigate the Errorhistory – might have to remove it temporarily.
  2. Interesting… Seems indeed to be a parsing issue. There’s data in PhoneNumber2, so that’s good news.
  3. Good catch! Will be fixed.
  4. Hmm, great question! Maybe @jonesPD knows where DewPointOffset came from?

As these system regulators have a lot in common, I can certainly see that happening. 😊

Edit: Did you properly clone my fork and checkout the testing branch? I can't really explain what's going on with No. 2 otherwise...

Edit 2: Various fixes are now available in testing. FYI, you might have to delete the MQTT device from HASS.

@burmistrzak
Copy link
Author

burmistrzak commented Jan 29, 2025

@john30 Do we already have an option to specify min/max/step values for registers?
And if so, do these bounds get passed along via MQTT to HASS?

Edit: I guess this answers my first question? 👀
But not so much the second. The idea would be to prevent HASS from setting invalid values.
Also, does ebusd validate incoming data based on the TypeSpec?

Edit 2: It appears that min/max/step values specified in TypeSpec, are not yet actively used?

Edit 3: Just saw that support for range is currently in development. Great! I‘ve already added min/max/step to my configuration where appropriate, and was then able to generate CSVs with withMinMax=true set. 💪

@burmistrzak
Copy link
Author

@kgeree Were you able to checkout the testing branch? It includes the latest HMU, VWZIO, and VRC 720 configs.

@jonesPD
Copy link

jonesPD commented Jan 30, 2025

  1. Have some small issue with PhoneNumber1-2 amd Z*Name1-2
    e.g. for phone number I have set 10 digits, in PhoneNumber1 I can see the first 6 digits of it and PhoneNumber2 unable to parse:
2025-01-29 08:54:07.847 [update error] unable to parse poll-read 720 PhoneNumber2 from 3115b52406020000007000 / 09030070003432343400: ERR: invalid position
2025-01-29 08:54:07.847 [mqtt error] decode 720 PhoneNumber2: ERR: invalid position

Afaik each register can only a limited set of characters, so two registers are needed for the whole number. However, if you don't program a long enough number in the regulator, you can't read the second register because it is empty. Have you checked this scenario?

  1. DewPointOffset -> Isn't it the Dewpoint only which is displayed? ...and Offset for it is set elsewhere? (I was not able to check it on the regulator as I'm remote) Makes me a bit confused together with the Hc*DewPointOffset values...

You can set a dew point offset for each heating circuit per the definition in the VRC720 manual: the minimum supply flow temperature in cooling mode is determined by the calculated dew point + this offset

@kgeree
Copy link

kgeree commented Jan 30, 2025

@kgeree Were you able to checkout the testing branch? It includes the latest HMU, VWZIO, and VRC 720 configs.

not yet...will try later. However looking at the vwzio, I think I have some more values..not sure if you can utilize something, they're all working for me (its a CSV that still needs the tempate files...)
76.vwzio.hw5103.csv

HMU and 720 looks good for the first sight (however I'm using ebusd in r/o mode yet) so can't speak for the write options...

@burmistrzak
Copy link
Author

However looking at the vwzio, I think I have some more values..not sure if you can utilize something, they're all working for me

@kgeree The b514 block should be considered unsafe for normal polling. That's why we're already looking into the config/diagnostics b509 block for more safe registers.

See here:

// Test menus on VWZ. EnableTest message needs to be sent before each of the read messages work.

@kgeree
Copy link

kgeree commented Jan 30, 2025

okay...I gave it a try, have the following results:
PowerConsumptionVwz - not found, I guess its the same issue like for the HMU

[update error] unable to parse poll-read vwzio PowerConsumptionVwz from 3176b5160114 / 00: ERR: invalid position
[mqtt error] decode vwzio PowerConsumptionVwz: ERR: invalid position

and I get "null" for the following:
DiagCondensorOutletTemp
DiagFlowTemp
DiagSystemPressure

(but i think vwzio shall not be discussed in this PR)

@burmistrzak
Copy link
Author

okay...I gave it a try, have the following results: PowerConsumptionVwz - not found, I guess its the same issue like for the HMU

@kgeree Yes, likely.

and I get "null" for the following: DiagCondensorOutletTemp DiagFlowTemp DiagSystemPressure

You get null, but no errors in log, right?

(but i think vwzio shall not be discussed in this PR)

Yeah, #481 is definitely a better fit. 😊
Btw. I recommend you switch to the more stable preview branch. Simply do git pull && git checkout preview

@kgeree
Copy link

kgeree commented Jan 31, 2025

You get null, but no errors in log, right?

right, null, but no errors. BTW is there a way to show "null" in HomeAssistant as well? then I'd get "Unknown" only if there is really an error on the ebus layer...

@burmistrzak
Copy link
Author

right, null, but no errors.

@kgeree Alright, that’s good news! The b509 is seemingly behaving as we have theorized.

BTW is there a way to show "null" in HomeAssistant as well? then I'd get "Unknown" only if there is really an error on the ebus layer...

There’s probably a way to do that, but it likely requires modifying the MQTT-HASSIO configuration (value template, etc.)... I‘d say that‘s something to look at when we’ve worked out all other issues. 😉

@burmistrzak
Copy link
Author

@chrizzzp There‘re new options available in the myVaillant app!
Check under Settings > Control > Energy management > Expert settings > Domestic hot water.

I already tried capturing the register for Upper correction value, but nothing seem to come up..? 🤔
Maybe it’s just adjusting the max DHW temperature?

@chrizzzp
Copy link

@burmistrzak

Check under Settings > Control > Energy management > Expert settings > Domestic hot water.

As I have only temporary 'External DHW' via VR71 (heating circuit configured as external DHW), these settings don't show up for me in the app...

@burmistrzak
Copy link
Author

As I have only temporary 'External DHW' via VR71 (heating circuit configured as external DHW), these settings don't show up for me in the app...

@chrizzzp Hmm, you mean Circuit type: DHW on the system regulator?

@burmistrzak
Copy link
Author

There‘re new options available in the myVaillant app! Check under Settings > Control > Energy management > Expert settings > Domestic hot water.

I already tried capturing the register for Upper correction value, but nothing seem to come up..? 🤔 Maybe it’s just adjusting the max DHW temperature?

@kgeree Can you help out here? 😊

@chrizzzp
Copy link

@burmistrzak

Hmm, you mean Circuit type: DHW on the system regulator?

Correct, 'external DHW' is a rather personal nomenclature to differentiate it from the regular (internal) DHW circuit. It also operates an external valve.

@kgeree
Copy link

kgeree commented Feb 17, 2025

Energy management

I simply don't even have "Energy management" under Settings -> Control. :)
app version: v2.24.3 (23137) with VR921 GW

@burmistrzak
Copy link
Author

Energy management

I simply don't even have "Energy management" under Settings -> Control. :) app version: v2.24.3 (23137) with VR921 GW

@kgeree Huh, strange. You do have the option Heating curve settings available, right?
Also, is EEBus (requires a compatible PV system) configured?

@kgeree
Copy link

kgeree commented Feb 17, 2025

Energy management

I simply don't even have "Energy management" under Settings -> Control. :) app version: v2.24.3 (23137) with VR921 GW

@kgeree Huh, strange. You do have the option Heating curve settings available, right? Also, is EEBus (requires a compatible PV system) configured?

Heat curve settings I have, which is working badly...I once tried to change heat curve for 1 circuit and it changed for all 3 :|..since that I rather not touch...
EEBus I don't have.

@burmistrzak
Copy link
Author

EEBus I don't have.

@kgeree I guess that’s the reason then.
Without some kind of energy management feature configured, it likely won’t show up.

@burmistrzak
Copy link
Author

@chrizzzp What do you think about expanding the scope of this PR?
Instead of basv3.csv, we would have 720.csv with symlinks for ctlv<N>.csv and basv<N>.csv... 👀

@chrizzzp
Copy link

@burmistrzak

I think this would make sense (if the differences between the regulators are clear).

@burmistrzak
Copy link
Author

I think this would make sense (if the differences between the regulators are clear).

@chrizzzp Yea, I‘m actually not sure if there’re any registers that don’t work with all 720 models?

@chrizzzp
Copy link

chrizzzp commented Mar 11, 2025

@burmistrzak

Presumably, the currently known registers are working on all units.

According to the manual there are a few additional settings for the 'v3' vs. the 'v2' units:

/Installer level/ Installation configuration/Installation/DHW alternative point
/Installer level/ Installation configuration/Installation/Flow temp. corr. max. value

With the latter, I'm not sure if this corresponds to HcxExcessTemp which is also available via ebus in the 'v2' units (but not in the regulator menu). Could you maybe check this with your 'v3' unit?

I'm not sure about the differences between the 'v1' and 'v2' regulators, though.

@kgeree
Copy link

kgeree commented Mar 12, 2025

@burmistrzak

Presumably, the currently known registers are working on all units.

According to the manual there are a few additional settings for the 'v3' vs. the 'v2' units:

/Installer level/ Installation configuration/Installation/DHW alternative point /Installer level/ Installation configuration/Installation/Flow temp. corr. max. value

With the latter, I'm not sure if this corresponds to HcxExcessTemp which is also available via ebus in the 'v2' units (but not in the regulator menu). Could you maybe check this with your 'v3' unit?

I'm not sure about the differences between the 'v1' and 'v2' regulators, though.

afaik all values working fine for me for the (maybe v1) regulator identified as "720".

@burmistrzak
Copy link
Author

With the latter, I'm not sure if this corresponds to HcxExcessTemp which is also available via ebus in the 'v2' units (but not in the regulator menu). Could you maybe check this with your 'v3' unit?

@chrizzzp I don’t think so.
Did a quick test with the regulator, but AFAICT nothing of interest came up on the eBus…
It‘s probably another internal value? 🤔

@burmistrzak
Copy link
Author

@chrizzzp There‘re new options available in the myVaillant app! Check under Settings > Control > Energy management > Expert settings > Domestic hot water.

I already tried capturing the register for Upper correction value, but nothing seem to come up..? 🤔 Maybe it’s just adjusting the max DHW temperature?

Update regarding this little mystery:
I was in contact with Vaillant and they‘ve confirmed that the aforementioned energy management options will only show up in the myVaillant app when EEBus is configured.
The Upper correction value is similar to the Buffer charge offset option on regulators used for SG-Ready, but specific to EEBus and only available in the app.
It seems to work exactly as advertised, increasing the max. DHW target temperature for overheating when excess PV energy is available.

@chrizzzp
Copy link

@burmistrzak

I don’t think so.
Did a quick test with the regulator, but AFAICT nothing of interest came up on the eBus…
It‘s probably another internal value

OK, could be. Did you change the value in the regulator and then checked e.g. Hc1ExcessTemp by force-reading with ebusctl? Otherwise I would not expect anything to be send over EBUS directly, apart from the fact that the current desired flow temp (of the heat generator, i.e. SetMode...) should be in incremented by the value of Hc1ExcessTemp.

@chrizzzp
Copy link

@burmistrzak

The Upper correction value is similar to the Buffer charge offset option on regulators used for SG-Ready, but specific to EEBus and only available in the app.
It seems to work exactly as advertised, increasing the max. DHW target temperature for overheating when excess PV energy is available.

Interesting, although from my current understanding the regulator itself does not speak EEBUS, only the gateway (VR921 etc.) does and translates everything to EBUS? So does using EEBUS still allow using SG-Ready or are they using the same regulator register(s)?

*r,,,,,,B524,02000000,,,IGN:4,,,
*w,,,,,,B524,02010000,,,,,,
r;w,,CylinderOffset,,,,,A200,,,calibrationv,,,

I maybe wrong (I don't have any EEBUS equipment)...

@burmistrzak
Copy link
Author

Interesting, although from my current understanding the regulator itself does not speak EEBUS, only the gateway (VR921 etc.) does and translates everything to EBUS?

@chrizzzp Correct, only the internet gateway speaks EEBus. It’s one of the most comprehensive EEBus implementations I‘ve seen so far. There’s a handy manual available, describing what functions are supported, and how they‘re mapped to eBus.

So does using EEBUS still allow using SG-Ready or are they using the same regulator register(s)?

AFAICT, you can use EEBus and SG-Ready at the same time. Similar functionality, completely different implementation.
I actually don’t know if you can see EEBus control actions on the regulator itself… 🤔

@burmistrzak
Copy link
Author

OK, could be. Did you change the value in the regulator and then checked e.g. Hc1ExcessTemp by force-reading with ebusctl? Otherwise I would not expect anything to be send over EBUS directly, apart from the fact that the current desired flow temp (of the heat generator, i.e. SetMode...) should be in incremented by the value of Hc1ExcessTemp.

@chrizzzp Yup, did that. It’s not Hc*ExcessTemp… 👀

@inherit(ri_1, wi_1)
@ext(0xe, 0)
model MaxRoomHumidity {
value: UIN;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

guess this would have to have a unit of %, right?

Copy link

@chrizzzp chrizzzp Oct 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As @burmistrzak is not active lately, I'll help out (only commenting):

Correct, unit should be %.

model wi_1 {}

/** Hwc bivalence point */
@inherit(ri_1, wi_1)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is there any use of prohibiting reading a value to a "normal" user? IMO it would be better to allow reading always (unless it is some secret) and only limit writing according to the access level

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Absolutely, "normal" users should be able to read, installers should be able to write.

@inherit(ri_1, wi_1)
@ext(0x1, 0)
model HwcBivalencePoint {
@minValue(-20) @maxValue(50) @step(1)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

step value of 1 should be omitted as this implicitly is the default anyway (depending on the data type though)

@inherit(ri_1, wi_1)
@ext(0x2, 0)
model ContinuosHeating {
@minValue(-26) @maxValue(10) @step(1)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

compared to 700.tsp the comment was omitted even though it contains valuable information. any reason for that?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, comment -26=off when the outside temperature falls below this threshold temperature the continuous heating function is started (off <=> function is disabled) should be included to inform about the -26=off setting.

@inherit(ri_1)
@ext(0x10, 0)
model TariffAuxHeater {
value: UIN;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what does this value mean? any unit/value list/limit?

Copy link

@chrizzzp chrizzzp Oct 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's the tariff for the secondary heater (Auxiliary Heater, I assume), which is compared to the tariff of the primary heater (by the so-called Hybrid Manager, which chooses the most cost-efficient heating mode for a bivalent heater).
Unit for all tariffs could be any (e.g. cents/kWh), but have to be identical for all tariff settings.
Lower limit should be 0.

@inherit(r_6)
@ext(0x14, 0)
@condition(Basv3.Hc3CircuitType.value, "1")
model Z1HeatingRoomTempTarget {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if it is a desired temp, why is it not writable at all?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is read-only as it only shows the current desired temperature which is in effect for the zone at the current time (either set by time-progam or by manual operation mode).
See here (2nd table figure): stadid#2

However, naming it Z1HeatingRoomTempTarget could be misleading. Maybe z1ActualHeatingRoomTempDesired is better.


@inherit(r_9)
@ext(0xb5, 0x55, 0xa0)
model UnknownValue_a0 {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unknown should be commented out

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree.

model HwcTimer_Config {
/** Configuration */
@maxLength(9)
value: HEX;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also long hex with unknown meaning should rather be commented out (several times)

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree.

@inherit(w_9)
@ext(0, 0)
@condition(Basv3.HwcEnabled.value, "1")
model HwcTimer_MondayWrite {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess these have to be reworked to have read+write with the same name as desired (rather a comment to myself @john30 )

/** timer amount */
@inherit(r_9)
@ext(MF, 0x55, 0xa4, 0, 1)
@condition(Basv3.Hc1CircuitType.value, "1")
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

repeated combined conditions could be written more nicely using a dedicated namespace with the conditions on that one, see e.g. 08.ehp.tsp#L524

@d3vi1
Copy link

d3vi1 commented Oct 17, 2025

At least for zones and heating circuits wouldn't a reusable pattern make more sense? We already know that the Controllers can support 5 zones and possibly more in some scenarios (ambisense) and it would certainly make the TSP files much more readable.

@base(MF, 0x55, 0xA5, 2, 0)

model HcCommon {
  HcFlowTemp           : S2    @desc("Flow temperature") ;
  HcFlowTempDesired    : S2    @desc("Desired flow temp") ;
  HcPumpStatus         : UCH   @desc("Pump status (on/off)") ;
  HcHeatCurve          : S2    @desc("Heat curve") ;
  HcMaxFlowTempDesired : S2    @desc("Max desired flow temp") ;
  HcMinFlowTempDesired : S2    @desc("Min desired flow temp") ;
 (...)
}

@inherit(HcCommon)
@ext(0x01,0x02,0x03,0x04,0x05)
model Hc { }

(...)

model ZoneCommon {
  ZRoomTemp      : S2
  ZRoomTempSet   : S2
  ZOpMode        : UCH
  (...)
}

@inherit(ZoneCommon)
@ext(0x01,0x02,0x03,0x04,0x05)
model Zone { }

john30 added a commit that referenced this pull request Oct 19, 2025
@aleek
Copy link

aleek commented Oct 26, 2025

This thread is veeeeeeery long and I'm not planning on reading it all, but, I just wanted you guys to know, that I have VRC 720/2 and I can help.

Here's my full dump:

08;Vaillant;HMU00;0308;0403;21;23;48;0010016687;0001;005179;N1
15;Vaillant;CTLV2;0514;1104;21;23;03;0020260916;0953;011657;N0
76;Vaillant;VWZ00;0308;0403

flexoTHERM exclusive 117/4
sensocomfort VRC 720/2
weather station (this VWZ00)

$ ebusctl grab result
1008b507010a / 03828202 = 119
1008b5110100 / 096c0117000008000100 = 7038
1008b5160111 / 09010506100634060a06 = 5
1076b5110101 / 09ff2db009ff5f0000ff = 42252
1076b5160111 / 00 = 5
10feb505025c00 = 7087
10feb510020601 = 1425
1008b507020900 / 02f702 = 4238
1008b50702092e / 02f702 = 2
1008b50702092f / 02dd02 = 220
1008b507020930 / 02d302 = 506
1008b507020931 / 02b002 = 492
1008b507020932 / 02c902 = 937
1008b507020933 / 02b902 = 441
1008b507020934 / 02b002 = 55
1008b507020936 / 029e02 = 129
1008b50702093c / 027502 = 52
1008b512020464 / 0101 = 559
1008b5120204ff / 0101 = 874
1008b513020528 / 0101 = 1423
1076b512030f0001 / 0732010000801603 = 14701
1076b512030f0002 / 0702020000801603 = 450
1076b512030f0201 / 07fb020000801603 = 25668
1076b512030f0202 / 07d0020000801603 = 1410
1008b516081000ffff02002132 / 0b0000ff020059337c8b934b = 25
1008b516081002ffff02002133 / 0b0201ff02002133609eae48 = 50
1008b516081003ffff02002130 / 0b0301ff0200ea30c03aeb4a = 50
1076b51009000000ffffff010000 / 0101 = 42244

@aleek
Copy link

aleek commented Oct 26, 2025

On the other hand, I'm wondering why my vrc 720 is called ctlv2 and yours basv3...

@chrizzzp
Copy link

On the other hand, I'm wondering why my vrc 720 is called ctlv2 and yours basv3...

ctlv2 is VRC720/2 (wired) basv3 is VRC720/3f (wireless). VRC720/3 (wired) is ctlv3.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants