diff --git a/modules/hcc-http-gae/src/test/java/net/sf/dz3r/view/http/gae/v3/ZoneRendererTest.java b/modules/hcc-http-gae/src/test/java/net/sf/dz3r/view/http/gae/v3/ZoneRendererTest.java index 11f22a72c..362da2f9e 100644 --- a/modules/hcc-http-gae/src/test/java/net/sf/dz3r/view/http/gae/v3/ZoneRendererTest.java +++ b/modules/hcc-http-gae/src/test/java/net/sf/dz3r/view/http/gae/v3/ZoneRendererTest.java @@ -38,7 +38,7 @@ void setModes() { void deviation() { // Abbreviated constructor - sets enabled = true, voting = true - var settingsActual = new ZoneSettings(25); + var settingsActual = new ZoneSettings(25.0); // Full constructor - explicit values var settingsPeriod = new ZoneSettings( diff --git a/modules/hcc-model/src/main/java/net/sf/dz3r/model/Thermostat.java b/modules/hcc-model/src/main/java/net/sf/dz3r/model/Thermostat.java index a893de966..7c61f1345 100644 --- a/modules/hcc-model/src/main/java/net/sf/dz3r/model/Thermostat.java +++ b/modules/hcc-model/src/main/java/net/sf/dz3r/model/Thermostat.java @@ -70,7 +70,7 @@ public class Thermostat implements Addressable { * Create a thermostat with a default 10C..40C setpoint range and specified setpoint and PID values. * */ - public Thermostat(String name, double setpoint, double p, double i, double d, double limit) { + public Thermostat(String name, Double setpoint, double p, double i, double d, double limit) { this(Clock.systemUTC(), name, new Range<>(10d, 40d), setpoint, p, i, d, limit); } @@ -86,7 +86,7 @@ public Thermostat(String name, double setpoint, double p, double i, double d, do * @param d PID controller derivative weight. * @param limit PID controller saturation limit. */ - public Thermostat(Clock clock, String name, Range setpointRange, double setpoint, double p, double i, double d, double limit) { + public Thermostat(Clock clock, String name, Range setpointRange, Double setpoint, double p, double i, double d, double limit) { this.clock = HCCObjects.requireNonNull(clock, "clock can't be null"); this.name = name; @@ -110,9 +110,9 @@ private void configurationChanged() { // VT: FIXME: Recalculate everything, issue new control signal } - public void setSetpoint(double setpoint) { + public void setSetpoint(Double setpoint) { - if (!setpointRange.contains(setpoint)) { + if (setpoint != null && !setpointRange.contains(setpoint)) { throw new IllegalArgumentException(setpoint + " is outside of " + setpointRange.min + ".." + setpointRange.max); } @@ -123,7 +123,7 @@ public void setSetpoint(double setpoint) { configurationChanged(); } - public double getSetpoint() { + public Double getSetpoint() { return controller.getSetpoint(); } diff --git a/modules/hcc-model/src/main/java/net/sf/dz3r/model/ZoneSettings.java b/modules/hcc-model/src/main/java/net/sf/dz3r/model/ZoneSettings.java index b49828670..b46f0d6b2 100644 --- a/modules/hcc-model/src/main/java/net/sf/dz3r/model/ZoneSettings.java +++ b/modules/hcc-model/src/main/java/net/sf/dz3r/model/ZoneSettings.java @@ -42,7 +42,7 @@ public class ZoneSettings { * * @param setpoint Setpoint to set. */ - public ZoneSettings(double setpoint) { + public ZoneSettings(Double setpoint) { this(true, setpoint, true, false, 0, null); } diff --git a/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/BalancingDamperControllerTest.java b/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/BalancingDamperControllerTest.java index ba8025faf..50f6a1d9a 100644 --- a/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/BalancingDamperControllerTest.java +++ b/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/BalancingDamperControllerTest.java @@ -47,8 +47,8 @@ void testSingleZone() { assertThatIllegalStateException() .isThrownBy(() -> { - var zoneSettings = new ZoneSettings(20); - var z1 = new Zone(new Thermostat("Z1", 20, 1, 0, 0, 1), zoneSettings); + var zoneSettings = new ZoneSettings(20.0); + var z1 = new Zone(new Thermostat("Z1", 20.0, 1, 0, 0, 1), zoneSettings); var d1 = new NullDamper("d1"); @@ -66,9 +66,9 @@ void testBoundaries1() { assertThatCode(() -> { - var zoneSettings = new ZoneSettings(20); - var z1 = new Zone(new Thermostat("Z1", 20, 1, 0, 0, 1), zoneSettings); - var z2 = new Zone(new Thermostat("Z2", 20, 1, 0, 0, 1), zoneSettings); + var zoneSettings = new ZoneSettings(20.0); + var z1 = new Zone(new Thermostat("Z1", 20.0, 1, 0, 0, 1), zoneSettings); + var z2 = new Zone(new Thermostat("Z2", 20.0, 1, 0, 0, 1), zoneSettings); var d1 = new NullDamper("d1"); var d2 = new NullDamper("d2"); @@ -127,9 +127,9 @@ void testBoundaries2() { assertThatCode(() -> { - var zoneSettings = new ZoneSettings(20); - var z1 = new Zone(new Thermostat("Z1", 20, 1, 0, 0, 1), zoneSettings); - var z2 = new Zone(new Thermostat("Z2", 20, 1, 0, 0, 1), zoneSettings); + var zoneSettings = new ZoneSettings(20.0); + var z1 = new Zone(new Thermostat("Z1", 20.0, 1, 0, 0, 1), zoneSettings); + var z2 = new Zone(new Thermostat("Z2", 20.0, 1, 0, 0, 1), zoneSettings); var d1 = new NullDamper("d1"); var d2 = new NullDamper("d2"); @@ -181,9 +181,9 @@ void testNaN() { assertThatCode(() -> { - var zoneSettings = new ZoneSettings(20); - var z1 = new Zone(new Thermostat("Z1", 20, 1, 0, 0, 1), zoneSettings); - var z2 = new Zone(new Thermostat("Z2", 20, 1, 0, 0, 1), zoneSettings); + var zoneSettings = new ZoneSettings(20.0); + var z1 = new Zone(new Thermostat("Z1", 20.0, 1, 0, 0, 1), zoneSettings); + var z2 = new Zone(new Thermostat("Z2", 20.0, 1, 0, 0, 1), zoneSettings); var d1 = new NullDamper("d1"); var d2 = new NullDamper("d2"); diff --git a/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/SimpleDamperControllerTest.java b/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/SimpleDamperControllerTest.java index d3ecd186c..9c51170ff 100644 --- a/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/SimpleDamperControllerTest.java +++ b/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/SimpleDamperControllerTest.java @@ -47,8 +47,8 @@ void testSingleZone() { assertThatIllegalStateException() .isThrownBy(() -> { - var zoneSettings = new ZoneSettings(20); - var z1 = new Zone(new Thermostat("Z1", 20, 1, 0, 0, 1), zoneSettings); + var zoneSettings = new ZoneSettings(20.0); + var z1 = new Zone(new Thermostat("Z1", 20.0, 1, 0, 0, 1), zoneSettings); var d1 = new NullDamper("d1"); @@ -66,9 +66,9 @@ void testBoundaries1() { assertThatCode(() -> { - var zoneSettings = new ZoneSettings(20); - var z1 = new Zone(new Thermostat("Z1", 20, 1, 0, 0, 1), zoneSettings); - var z2 = new Zone(new Thermostat("Z2", 20, 1, 0, 0, 1), zoneSettings); + var zoneSettings = new ZoneSettings(20.0); + var z1 = new Zone(new Thermostat("Z1", 20.0, 1, 0, 0, 1), zoneSettings); + var z2 = new Zone(new Thermostat("Z2", 20.0, 1, 0, 0, 1), zoneSettings); var d1 = new NullDamper("d1"); var d2 = new NullDamper("d2"); @@ -126,9 +126,9 @@ void testBoundaries2() { assertThatCode(() -> { - var zoneSettings = new ZoneSettings(20); - var z1 = new Zone(new Thermostat("Z1", 20, 1, 0, 0, 1), zoneSettings); - var z2 = new Zone(new Thermostat("Z2", 20, 1, 0, 0, 1), zoneSettings); + var zoneSettings = new ZoneSettings(20.0); + var z1 = new Zone(new Thermostat("Z1", 20.0, 1, 0, 0, 1), zoneSettings); + var z2 = new Zone(new Thermostat("Z2", 20.0, 1, 0, 0, 1), zoneSettings); var d1 = new NullDamper("d1"); var d2 = new NullDamper("d2"); @@ -180,9 +180,9 @@ void testNaN() { assertThatCode(() -> { - var zoneSettings = new ZoneSettings(20); - var z1 = new Zone(new Thermostat("Z1", 20, 1, 0, 0, 1), zoneSettings); - var z2 = new Zone(new Thermostat("Z2", 20, 1, 0, 0, 1), zoneSettings); + var zoneSettings = new ZoneSettings(20.0); + var z1 = new Zone(new Thermostat("Z1", 20.0, 1, 0, 0, 1), zoneSettings); + var z2 = new Zone(new Thermostat("Z2", 20.0, 1, 0, 0, 1), zoneSettings); var d1 = new NullDamper("d1"); var d2 = new NullDamper("d2"); diff --git a/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/THTest.java b/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/THTest.java index 95acf0a0c..a86979476 100644 --- a/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/THTest.java +++ b/modules/hcc-model/src/test/java/net/sf/dz3r/device/actuator/damper/THTest.java @@ -183,7 +183,7 @@ private void testSync(String marker, Class c assertThat(switchWestDamper.getState().block()).isTrue(); assertThat(switchWestBoosterFan.getState().block()).isTrue(); - var zoneSettings = new ZoneSettings(20); + var zoneSettings = new ZoneSettings(20.0); // For a good measure, let's advance the timestamp between signals timestamp += 50 + rg.nextInt(100); diff --git a/modules/hcc-model/src/test/java/net/sf/dz3r/model/ThermostatTest.java b/modules/hcc-model/src/test/java/net/sf/dz3r/model/ThermostatTest.java index ad09aa985..9d3eb2b77 100644 --- a/modules/hcc-model/src/test/java/net/sf/dz3r/model/ThermostatTest.java +++ b/modules/hcc-model/src/test/java/net/sf/dz3r/model/ThermostatTest.java @@ -138,6 +138,17 @@ void signalTotalFailure() { } } + /** + * Make sure that the thermostat can be created with a {@code null} setpoint. + */ + @Test + void nullSetpointOnInstantiation() { + + var ts = new Thermostat("ts", null, 1.0, 0, 0, 0); + + logger.info("null setpoint: {}", ts.getSetpoint()); + } + private void assertOK(Signal, Void> s) { assertThat(s.getValue().setpoint).isEqualTo(20.0); @@ -179,7 +190,7 @@ void setpointChangeEmitsSignal() { .create(this::connectSetpoint) .map(v -> new Signal(Instant.now(), v)); - var ts = new Thermostat("ts", 20, 1, 0, 0, 1.1); + var ts = new Thermostat("ts", 20.0, 1, 0, 0, 1.1); var accumulator = new ArrayList, Void>>(); var out = ts diff --git a/modules/hcc-model/src/test/java/net/sf/dz3r/model/ZoneControllerTest.java b/modules/hcc-model/src/test/java/net/sf/dz3r/model/ZoneControllerTest.java index bcf3b4d92..39646af2d 100644 --- a/modules/hcc-model/src/test/java/net/sf/dz3r/model/ZoneControllerTest.java +++ b/modules/hcc-model/src/test/java/net/sf/dz3r/model/ZoneControllerTest.java @@ -76,7 +76,7 @@ void testOneThermostat() { var sequence = Flux .fromIterable(source) .map(e -> new Signal(Instant.now().plus(offset.getAndIncrement(), ChronoUnit.SECONDS), e)); - var ts = new Thermostat("ts", 20, 1, 0, 0, 1); + var ts = new Thermostat("ts", 20.0, 1, 0, 0, 1); var stage1 = ts.compute(sequence); @@ -131,7 +131,7 @@ void testOneZone() throws Exception { .fromIterable(source) .map(e -> new Signal(Instant.now().plus(offset.getAndIncrement(), ChronoUnit.SECONDS), e)); - var ts = new Thermostat("ts", 20, 1, 0, 0, 1); + var ts = new Thermostat("ts", 20.0, 1, 0, 0, 1); var z = new Zone(ts, new ZoneSettings(ts.getSetpoint())); var zc = new ZoneController(Set.of(z)); @@ -162,10 +162,10 @@ void testOneZone() throws Exception { @Test void testColdStartNotCalling() throws Exception { - var ts1 = new Thermostat("ts20", 20, 1, 0, 0, 1); + var ts1 = new Thermostat("ts20", 20.0, 1, 0, 0, 1); var z1 = new Zone(ts1, new ZoneSettings(ts1.getSetpoint())); - var ts2 = new Thermostat("ts25", 25, 1, 0, 0, 1); + var ts2 = new Thermostat("ts25", 25.0, 1, 0, 0, 1); var z2 = new Zone(ts2, new ZoneSettings(ts2.getSetpoint())); var zc = new ZoneController(Set.of(z1, z2)); @@ -198,10 +198,10 @@ void testColdStartNotCalling() throws Exception { @Test void testColdStartCalling() throws Exception { - var ts1 = new Thermostat("ts20", 20, 1, 0, 0, 1); + var ts1 = new Thermostat("ts20", 20.0, 1, 0, 0, 1); var z1 = new Zone(ts1, new ZoneSettings(ts1.getSetpoint())); - var ts2 = new Thermostat("ts25", 25, 1, 0, 0, 1); + var ts2 = new Thermostat("ts25", 25.0, 1, 0, 0, 1); var z2 = new Zone(ts2, new ZoneSettings(ts2.getSetpoint())); var zc = new ZoneController(Set.of(z1, z2)); @@ -374,7 +374,7 @@ void disabled() throws Exception { @Test void errorSignalSingleZone() throws Exception { - var ts = new Thermostat("ts", 20, 1, 0, 0, 1); + var ts = new Thermostat("ts", 20.0, 1, 0, 0, 1); var z = new Zone(ts, new ZoneSettings(ts.getSetpoint())); var zc = new ZoneController(Set.of(z)); @@ -406,10 +406,10 @@ void errorSignalSingleZone() throws Exception { @Test void errorSignalOneInMultiZone() throws Exception { - var ts1 = new Thermostat("ts20", 20, 1, 0, 0, 1); + var ts1 = new Thermostat("ts20", 20.0, 1, 0, 0, 1); var z1 = new Zone(ts1, new ZoneSettings(ts1.getSetpoint())); - var ts2 = new Thermostat("ts25", 25, 1, 0, 0, 1); + var ts2 = new Thermostat("ts25", 25.0, 1, 0, 0, 1); var z2 = new Zone(ts2, new ZoneSettings(ts2.getSetpoint())); var zc = new ZoneController(Set.of(z1, z2)); @@ -452,10 +452,10 @@ void errorSignalOneInMultiZone() throws Exception { @Test void alienZone() throws Exception { - var ts1 = new Thermostat("ours", 20, 1, 0, 0, 1); + var ts1 = new Thermostat("ours", 20.0, 1, 0, 0, 1); var z1 = new Zone(ts1, new ZoneSettings(ts1.getSetpoint())); - var ts2 = new Thermostat("alien", 25, 1, 0, 0, 1); + var ts2 = new Thermostat("alien", 25.0, 1, 0, 0, 1); var z2 = new Zone(ts2, new ZoneSettings(ts2.getSetpoint())); // Note, no z2 diff --git a/modules/hcc-model/src/test/java/net/sf/dz3r/model/ZoneSettingsTest.java b/modules/hcc-model/src/test/java/net/sf/dz3r/model/ZoneSettingsTest.java index 08103f4af..37f05af7d 100644 --- a/modules/hcc-model/src/test/java/net/sf/dz3r/model/ZoneSettingsTest.java +++ b/modules/hcc-model/src/test/java/net/sf/dz3r/model/ZoneSettingsTest.java @@ -28,8 +28,8 @@ private static Stream settingsProvider() { return Stream.of( new Source( - new ZoneSettings(25), - new ZoneSettings(25), + new ZoneSettings(25.0), + new ZoneSettings(25.0), true ), new Source(