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
3 changes: 3 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# HAP-Java 2.0.10
* Add constructors with custom min/max to the tilt angle characteristics [#162](https://github.com/hap-java/HAP-Java/issues/162)

# HAP-Java 2.0.9
* Fix Set Duration and Remaining Duration characteristics to advertise format `uint32` instead of `int` [#202](https://github.com/hap-java/HAP-Java/issues/202)
* Stop logging the SRP shared secret, derived key and M5 message data during pairing at DEBUG level
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,31 @@
/** This characteristic describe current tilt angle (between -90 and 90) */
public class CurrentTiltAngleCharacteristic extends IntegerCharacteristic
implements EventableCharacteristic {
public static final int DEFAULT_MIN_VALUE = -90;
public static final int DEFAULT_MAX_VALUE = 90;

public CurrentTiltAngleCharacteristic(
int minValue,
int maxValue,
Supplier<CompletableFuture<Integer>> getter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
super(
"000000C1-0000-1000-8000-0026BB765291",
"current tilt angle",
-90,
90,
minValue,
maxValue,
"arcdegrees",
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

public CurrentTiltAngleCharacteristic(
Supplier<CompletableFuture<Integer>> getter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, subscriber, unsubscriber);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,33 @@
/** This characteristic describes the target angle of slats. */
public class TargetTiltAngleCharacteristic extends IntegerCharacteristic
implements EventableCharacteristic {
public static final int DEFAULT_MIN_VALUE = -90;
public static final int DEFAULT_MAX_VALUE = 90;

public TargetTiltAngleCharacteristic(
int minValue,
int maxValue,
Supplier<CompletableFuture<Integer>> getter,
ExceptionalConsumer<Integer> setter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
super(
"000000C2-0000-1000-8000-0026BB765291",
"target tilt angle",
-90,
90,
minValue,
maxValue,
"arcdegrees",
Optional.of(getter),
Optional.of(setter),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

public TargetTiltAngleCharacteristic(
Supplier<CompletableFuture<Integer>> getter,
ExceptionalConsumer<Integer> setter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, setter, subscriber, unsubscriber);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,31 @@
/** This characteristic describes the current angle of horizontal slats. */
public class CurrentHorizontalTiltAngleCharacteristic extends IntegerCharacteristic
implements EventableCharacteristic {
public static final int DEFAULT_MIN_VALUE = -90;
public static final int DEFAULT_MAX_VALUE = 90;

public CurrentHorizontalTiltAngleCharacteristic(
int minValue,
int maxValue,
Supplier<CompletableFuture<Integer>> getter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
super(
"0000006C-0000-1000-8000-0026BB765291",
"current horizontal tilt angle",
-90,
90,
minValue,
maxValue,
"arcdegrees",
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

public CurrentHorizontalTiltAngleCharacteristic(
Supplier<CompletableFuture<Integer>> getter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, subscriber, unsubscriber);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,31 @@
/** This characteristic describes the current angle of vertical slats for accessory. */
public class CurrentVerticalTiltAngleCharacteristic extends IntegerCharacteristic
implements EventableCharacteristic {
public static final int DEFAULT_MIN_VALUE = -90;
public static final int DEFAULT_MAX_VALUE = 90;

public CurrentVerticalTiltAngleCharacteristic(
int minValue,
int maxValue,
Supplier<CompletableFuture<Integer>> getter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
super(
"0000006E-0000-1000-8000-0026BB765291",
"current vertical tilt angle",
-90,
90,
minValue,
maxValue,
"arcdegrees",
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

public CurrentVerticalTiltAngleCharacteristic(
Supplier<CompletableFuture<Integer>> getter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, subscriber, unsubscriber);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,33 @@
/** This characteristic describes the target angle of horizontal slats for accessories. */
public class TargetHorizontalTiltAngleCharacteristic extends IntegerCharacteristic
implements EventableCharacteristic {
public static final int DEFAULT_MIN_VALUE = -90;
public static final int DEFAULT_MAX_VALUE = 90;

public TargetHorizontalTiltAngleCharacteristic(
int minValue,
int maxValue,
Supplier<CompletableFuture<Integer>> getter,
ExceptionalConsumer<Integer> setter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
super(
"0000007B-0000-1000-8000-0026BB765291",
"target horizontal tilt angle",
-90,
90,
minValue,
maxValue,
"arcdegrees",
Optional.of(getter),
Optional.of(setter),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

public TargetHorizontalTiltAngleCharacteristic(
Supplier<CompletableFuture<Integer>> getter,
ExceptionalConsumer<Integer> setter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, setter, subscriber, unsubscriber);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,33 @@
/** This characteristic describes the target angle of vertical slats. */
public class TargetVerticalTiltAngleCharacteristic extends IntegerCharacteristic
implements EventableCharacteristic {
public static final int DEFAULT_MIN_VALUE = -90;
public static final int DEFAULT_MAX_VALUE = 90;

public TargetVerticalTiltAngleCharacteristic(
int minValue,
int maxValue,
Supplier<CompletableFuture<Integer>> getter,
ExceptionalConsumer<Integer> setter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
super(
"0000007D-0000-1000-8000-0026BB765291",
"target vertical tilt angle",
-90,
90,
minValue,
maxValue,
"arcdegrees",
Optional.of(getter),
Optional.of(setter),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

public TargetVerticalTiltAngleCharacteristic(
Supplier<CompletableFuture<Integer>> getter,
ExceptionalConsumer<Integer> setter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, setter, subscriber, unsubscriber);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package io.github.hapjava.characteristics.impl;

import static org.assertj.core.api.Assertions.assertThat;

import io.github.hapjava.characteristics.Characteristic;
import io.github.hapjava.characteristics.impl.slat.CurrentTiltAngleCharacteristic;
import io.github.hapjava.characteristics.impl.slat.TargetTiltAngleCharacteristic;
import io.github.hapjava.characteristics.impl.windowcovering.CurrentHorizontalTiltAngleCharacteristic;
import io.github.hapjava.characteristics.impl.windowcovering.CurrentVerticalTiltAngleCharacteristic;
import io.github.hapjava.characteristics.impl.windowcovering.TargetHorizontalTiltAngleCharacteristic;
import io.github.hapjava.characteristics.impl.windowcovering.TargetVerticalTiltAngleCharacteristic;
import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import javax.json.JsonObject;
import org.junit.Test;

/** Custom tilt angle ranges, see https://github.com/hap-java/HAP-Java/issues/162 */
public class CustomTiltAngleRangeTest {

@Test
public void defaultConstructorsKeepTheirSerializedOutput() {
// Serialized output captured before custom ranges were added.
for (Case c :
Arrays.asList(
Case.of(
new CurrentTiltAngleCharacteristic(
() -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
"{\"iid\":7,\"type\":\"C1\",\"perms\":[\"pr\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"),
Case.of(
new TargetTiltAngleCharacteristic(
() -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}),
"{\"iid\":7,\"type\":\"C2\",\"perms\":[\"pr\",\"pw\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"),
Case.of(
new CurrentHorizontalTiltAngleCharacteristic(
() -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
"{\"iid\":7,\"type\":\"6C\",\"perms\":[\"pr\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"),
Case.of(
new TargetHorizontalTiltAngleCharacteristic(
() -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}),
"{\"iid\":7,\"type\":\"7B\",\"perms\":[\"pr\",\"pw\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"),
Case.of(
new CurrentVerticalTiltAngleCharacteristic(
() -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
"{\"iid\":7,\"type\":\"6E\",\"perms\":[\"pr\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"),
Case.of(
new TargetVerticalTiltAngleCharacteristic(
() -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}),
"{\"iid\":7,\"type\":\"7D\",\"perms\":[\"pr\",\"pw\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"))) {
assertThat(c.characteristic.toJson(7).join().toString())
.as(c.characteristic.getClass().getSimpleName())
.isEqualTo(c.expected);
}
}

@Test
public void customRangeIsAdvertised() {
for (Characteristic c :
Arrays.<Characteristic>asList(
new CurrentTiltAngleCharacteristic(
0, 90, () -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
new TargetTiltAngleCharacteristic(
0, 90, () -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}),
new CurrentHorizontalTiltAngleCharacteristic(
0, 90, () -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
new TargetHorizontalTiltAngleCharacteristic(
0, 90, () -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}),
new CurrentVerticalTiltAngleCharacteristic(
0, 90, () -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
new TargetVerticalTiltAngleCharacteristic(
0, 90, () -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}))) {
JsonObject json = c.toJson(7).join();
String name = c.getClass().getSimpleName();
assertThat(json.getInt("minValue")).as(name).isEqualTo(0);
assertThat(json.getInt("maxValue")).as(name).isEqualTo(90);
assertThat(json.getInt("minStep")).as(name).isEqualTo(1);
}
}

private static class Case {
final Characteristic characteristic;
final String expected;

private Case(Characteristic characteristic, String expected) {
this.characteristic = characteristic;
this.expected = expected;
}

static Case of(Characteristic characteristic, String expected) {
return new Case(characteristic, expected);
}
}
}