Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
277 changes: 277 additions & 0 deletions src/vaillant/08.hmu.HW5103.tsp
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,262 @@ namespace Hmu_HW5103 {
value: energy;
}

// Settings that can be changed from the indoors controller unit

/** default *r */
@auth("install")
@base(MF, 0x1a, 0x5, 0xff)
model r_3 {
Comment thread
stgm marked this conversation as resolved.
@maxLength(3)
ign: IGN;
}

/** default *w */
@write
@auth("install")
@base(MF, 0x1a, 0x6, 0xff)
model wi_1 {
Copy link
Copy Markdown
Author

@stgm stgm May 10, 2026

Choose a reason for hiding this comment

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

Is wi the right abbreviation for write at installer level? (convention-wise)

}

/** heat curve 0.1 to 4.0 */
@inherit(r_3, wi_1)
@ext(0x35, 0x2d)
model HeatCurve {
@divisor(10)
Copy link
Copy Markdown
Author

@stgm stgm May 10, 2026

Choose a reason for hiding this comment

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

Can't provide min/max values 0.4-4.0 for the HeatCurve as the tsp compiler does not allow 0.4 for BCD values. I guess the validation does not take the divisor into account? @john30

For now I've left the range out and kept it in the description.

bcd: BCD;
}

/** summer switch-off temperature */
@inherit(r_3, wi_1)
@ext(0x35, 0x2e)
model SummerSwitchOffTemp {
@minValue(10)
@maxValue(90)
temp: temp;
}

/** bivalence point central heating */
@inherit(r_3, wi_1)
@ext(0x35, 0x2f)
model HcBivalencePoint {
@minValue(-30)
@maxValue(20)
temp: temp;
}

/** bivalence point domestic hot water */
@inherit(r_3, wi_1)
@ext(0x35, 0x30)
model HwcBivalencePoint {
@minValue(-20)
@maxValue(20)
temp: temp;
}

/** alternative point central heating */
@inherit(r_3, wi_1)
@ext(0x35, 0x31)
model HcAlternativePoint {
Comment thread
stgm marked this conversation as resolved.
@minValue(-20)
@maxValue(40)
@values(Values_alternative_point)
temp: temp;
}

/** maximum allowed flow temperature */
@inherit(r_3, wi_1)
@ext(0x35, 0x32)
model MaxFlowTemp {
@minValue(15)
@maxValue(90)
temp: temp;
}

/** minimum allowed flow temperature */
@inherit(r_3, wi_1)
@ext(0x35, 0x33)
model MinFlowTemp {
@minValue(15)
@maxValue(90)
temp: temp;
}

/** heating function enabled */
@inherit(r_3, wi_1)
@ext(0x35, 0x34)
model HcEnabled {
Copy link
Copy Markdown
Author

@stgm stgm May 11, 2026

Choose a reason for hiding this comment

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

Use of "enabled" instead of "active" - in line with
https://github.com/john30/ebusd-configuration/pull/564/changes

Same for HwcEnabled below

yesno: yesno;
}

/** domestic hot water function enabled */
@inherit(r_3, wi_1)
@ext(0x35, 0x35)
model HwcEnabled {
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

I think @chrizzzp and @burmistrzak had a discussion somewhere about Hwc vs Dhw, right? Hwc it is?

yesno: yesno;
}

/** hysteresis for cylinder charging */
@inherit(r_3, wi_1)
@ext(0x35, 0x39)
model HwcChargeHysteresis {
value: hysteresis;
}

/** normal immersion heater activation */
@inherit(r_3, wi_1)
@ext(0x33, 0x1e)
model ImmersionHeaterEnabled {
@values(Values_immersion_heater_applications)
value: UIN;
}

/** emergency immersion heater activation */
@inherit(r_3, wi_1)
@ext(0x35, 0x37)
model EmergencyModeImmersionHeaterEnabled {
// also called "limp home mode" and "Notbetrieb"
@values(Values_immersion_heater_applications)
value: UIN;
}

/** cooling target flow temperature */
@inherit(r_3, wi_1)
@ext(0x35, 0x2b)
model CoolTargetFlowTemp {
@minValue(7)
@maxValue(24)
temp: temp;
}

/** start heating at energy integral value */
@inherit(r_3, wi_1)
@ext(0x34, 0x1e)
model CompStartHeatingFrom {
@minValue(-999)
@maxValue(9)
value: integral;
}

/** start cooling at energy integral value */
@inherit(r_3, wi_1)
@ext(0x34, 0x21)
model CompStartCoolingFrom {
@minValue(0)
@maxValue(999)
value: integral;
}

/** hysteresis for heating */
@inherit(r_3, wi_1)
@ext(0x34, 0x43)
model CompHysteresisHeating {
@minValue(3)
@maxValue(15)
value: hysteresis;
}

/** hysteresis for cooling */
@inherit(r_3, wi_1)
@ext(0x35, 0x3f)
model CompHysteresisCooling {
@minValue(3)
@maxValue(15)
value: hysteresis;
}

/** maximum allowed differential pressure */
@inherit(r_3, wi_1)
@ext(0x34, 0x1f)
model MaxRemainingDeltaP {
Comment thread
stgm marked this conversation as resolved.
@minValue(200)
@maxValue(900)
@step(10)
value: pressm2;
}

/** domestic hot water charging mode */
@inherit(r_3, wi_1)
@ext(0x34, 0x44)
model HwcMode {
@values(Values_Domestic_hot_water_mod__eco_normal_balance_)
uch: UCH;
}

/** maximum block time by energy company (S21 contact) */
@inherit(r_3, wi_1)
@ext(0x34, 0x2d)
model MaximumS21BlockAllowed {
Comment thread
stgm marked this conversation as resolved.
@minValue(0)
@maxValue(9)
value: hour;
}

/** pump speed for heating */
@inherit(r_3, wi_1)
@ext(0x33, 0x16)
model BuildingCircuitPumpOutputHeating {
/** pump percentage or auto */
@values(Values_pumpperc)
@minValue(49)
Comment thread
stgm marked this conversation as resolved.
@maxValue(100)
value: percent2;
}

/** pump speed for cooling */
@inherit(r_3, wi_1)
@ext(0x33, 0x17)
model BuildingCircuitPumpOutputCooling {
/** pump percentage or auto */
@values(Values_pumpperc)
@minValue(49)
@maxValue(100)
value: percent2;
}

/** pump speed for domestic hot water */
@inherit(r_3, wi_1)
@ext(0x33, 0x18)
model BuildingCircuitPumpOutputHwc {
/** pump percentage or auto */
@values(Values_pumpperc)
@minValue(49)
@maxValue(100)
value: percent2;
}

/** minutes to wait after mains switch on */
@inherit(r_3, wi_1)
@ext(0x33, 0x19)
model BlockTimeAfterRestart {
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Took some digging, in the manual this is:

  • Reset Sperrzeit→ Sperrz. n. Einschalten der Spannungsvers.
  • Reset anti-cycl. time→ Anti-cycl. time after pow. supp. switch-on

Sperrzeit is again translated as "Anti-cycling". But focusing on "after pow. supp. switch-on" and the German description makes it pretty clear what is going on; in combination with time in minutes and not hours, this seems what it is.

@jonesPD has MainsBlocktimeMinDuration here which I think is a mistake after all. It does not seem to have anything to do with the MainsBlocktimeMaxDuration or what I now call MaximumS21BlockAllowed

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I agree. For my system the value is 0. Never tried it out.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

So this is rather a startup delay value, isn't it? Lacks experimental proove I assume.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yes and yes.

@minValue(0)
@maxValue(120)
value: minutes2;
}

/** maximum compressor speed in noise reduction mode */
@inherit(r_3, wi_1)
@ext(0x34, 0x28)
@Ebus.example("40%", "3108b51a0405ff3428", "0aff021b280028003c0001")
model NoiseReductionLevel {
@minValue(40)
@maxValue(60)
value: percent2;
}

/** number of main heat pump starts */
@inherit(r_3)
@ext(0x34, 0x30)
model HMUSystemStarts {
value: cntstarts2;
Comment thread
stgm marked this conversation as resolved.
}

/** cooling enabled */
@inherit(r_3, wi_1)
@ext(0x33, 0x1b)
model ActiveCoolingEnabled {
value: onoff;
}

// B509
/** default *r */
@base(MF, 0x9, 0x54, 0x2, 0)
Expand Down Expand Up @@ -406,4 +662,25 @@ namespace Hmu_HW5103 {
Hcmode_inc,
Errors_inc,
}

enum Values_Domestic_hot_water_mod__eco_normal_balance_ {
eco: 0,
normal: 1,
balance: 2,
}

enum Values_immersion_heater_applications {
off: 0,
heating: 1,
dhw: 2,
both: 3,
}

enum Values_pumpperc {
auto: 49,
}

enum Values_alternative_point {
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@john30 There are quite a few variables with a single off or auto value. Is there a shorter way to express this other than defining an enum? I see the value of the enums for multiple values, but for a single value it's getting a bit messy.

off: -21,
}
}
8 changes: 8 additions & 0 deletions src/vaillant/_templates.tsp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ scalar twopointanalog extends UCH;
@minValue(0) @maxValue(100) @step(0.5)
scalar percentv extends EXP;

/** percentage */
@unit("%")
scalar percent2 extends UIN;

/** date */
scalar date extends HDA3;

Expand Down Expand Up @@ -180,6 +184,10 @@ scalar calibrations extends SCH;
@minValue(-50) @maxValue(50) @step(0.5)
scalar calibrationv extends EXP;

@unit("K")
@divisor(16)
scalar hysteresis extends UIN;

@unit("°min")
scalar integral extends SIN;

Expand Down