Skip to content

Commit 031450c

Browse files
authored
Merge pull request #115 from jvaclavovic/master
Valid values support for enum charactristics (instead of min/max values)
2 parents f2f93cc + 5e5fab8 commit 031450c

File tree

51 files changed

+204
-204
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+204
-204
lines changed

CHANGES.md

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
* `server` package consists classes to run HomeKit server and handle communication
99
* the process is following: client, e.g. openHAB bindings, extends accessory classes, e.g. `WindowCoveringAccessory` and implements all required methods. WindowCoveringAccessory is linked already to WindowCoveringService, that in turn is link to single characteristics.
1010

11+
## New and improved
12+
13+
* Valid values are supported for enum characteristics instead of min and max values
14+
* Supported valid states for Thermostat, SecuritySystem and HeaterCooler [#108]
15+
1116
# HAP-Java 1.1.5
1217

1318
## Fixes

src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java

+18
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,24 @@ public interface HeaterCoolerAccessory extends HomekitAccessory {
9696
/** Unsubscribes from changes in the current temperature. */
9797
void unsubscribeCurrentTemperature();
9898

99+
/**
100+
* Valid values for current state.
101+
*
102+
* @return array of valid current states
103+
*/
104+
default CurrentHeaterCoolerStateEnum[] getCurrentHeaterCoolerStateValidValues() {
105+
return CurrentHeaterCoolerStateEnum.values();
106+
}
107+
108+
/**
109+
* Valid values for target state.
110+
*
111+
* @return array of valid target states
112+
*/
113+
default TargetHeaterCoolerStateEnum[] getTargetHeaterCoolerStateValidValues() {
114+
return TargetHeaterCoolerStateEnum.values();
115+
}
116+
99117
@Override
100118
default Collection<Service> getServices() {
101119
return Collections.singleton(new HeaterCoolerService(this));

src/main/java/io/github/hapjava/accessories/SecuritySystemAccessory.java

+18
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,24 @@ public interface SecuritySystemAccessory extends HomekitAccessory {
6464
*/
6565
void unsubscribeTargetSecuritySystemState();
6666

67+
/**
68+
* Valid values for current state.
69+
*
70+
* @return array of valid current states.
71+
*/
72+
default CurrentSecuritySystemStateEnum[] getCurrentSecuritySystemStateValidValues() {
73+
return CurrentSecuritySystemStateEnum.values();
74+
}
75+
76+
/**
77+
* Valid values for target state.
78+
*
79+
* @return array of valid targe states.
80+
*/
81+
default TargetSecuritySystemStateEnum[] getTargetSecuritySystemStateValidValues() {
82+
return TargetSecuritySystemStateEnum.values();
83+
}
84+
6785
@Override
6886
default Collection<Service> getServices() {
6987
return Collections.singleton(new SecuritySystemService(this));

src/main/java/io/github/hapjava/accessories/ThermostatAccessory.java

+18
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,24 @@ default double getMinStepTargetTemperature() {
189189
/** Unsubscribes from changes in the target temperature. */
190190
void unsubscribeTargetTemperature();
191191

192+
/**
193+
* Valid values for current state.
194+
*
195+
* @return array of valid current states.
196+
*/
197+
default CurrentHeatingCoolingStateEnum[] getCurrentHeatingCoolingStateValidValues() {
198+
return CurrentHeatingCoolingStateEnum.values();
199+
}
200+
201+
/**
202+
* Valid values for target state.
203+
*
204+
* @return array of valid targe states.
205+
*/
206+
default TargetHeatingCoolingStateEnum[] getTargetHeatingCoolingStateValidValues() {
207+
return TargetHeatingCoolingStateEnum.values();
208+
}
209+
192210
@Override
193211
default Collection<Service> getServices() {
194212
return Collections.singleton(new ThermostatService(this));

src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public AccessoryFlagsCharacteristic(
2020
super(
2121
"000000A6-0000-1000-8000-0026BB765291",
2222
"accessory flags",
23-
1,
23+
AccessoryFlagsEnum.values(),
2424
Optional.of(getter),
2525
Optional.empty(),
2626
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public CurrentAirPurifierCharacteristic(
2121
super(
2222
"000000A9-0000-1000-8000-0026BB765291",
2323
"current air purifier state",
24-
2,
24+
CurrentAirPurifierStateEnum.values(),
2525
Optional.of(getter),
2626
Optional.empty(),
2727
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateCharacteristic.java

+1-9
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,10 @@ public TargetAirPurifierStateCharacteristic(
2323
super(
2424
"000000A8-0000-1000-8000-0026BB765291",
2525
"Air purifier state",
26-
1,
26+
TargetAirPurifierStateEnum.values(),
2727
Optional.of(getter),
2828
Optional.of(setter),
2929
Optional.of(subscriber),
3030
Optional.of(unsubscriber));
3131
}
32-
33-
@Override
34-
protected void setValue(Integer value) throws Exception {
35-
if (!setter.isPresent()) {
36-
return;
37-
}
38-
setter.get().accept(TargetAirPurifierStateEnum.fromCode(value));
39-
}
4032
}

src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public AirQualityCharacteristic(
1919
super(
2020
"00000095-0000-1000-8000-0026BB765291",
2121
"air quality",
22-
5,
22+
AirQualityEnum.values(),
2323
Optional.of(getter),
2424
Optional.empty(),
2525
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java

+25-6
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
import io.github.hapjava.characteristics.CharacteristicEnum;
44
import io.github.hapjava.characteristics.ExceptionalConsumer;
55
import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
6+
import java.util.Arrays;
67
import java.util.Optional;
78
import java.util.concurrent.CompletableFuture;
89
import java.util.function.Consumer;
910
import java.util.function.Supplier;
11+
import javax.json.Json;
12+
import javax.json.JsonArrayBuilder;
1013
import javax.json.JsonNumber;
1114
import javax.json.JsonObject;
1215
import javax.json.JsonObjectBuilder;
@@ -22,7 +25,7 @@
2225
public abstract class EnumCharacteristic<T extends CharacteristicEnum>
2326
extends BaseCharacteristic<Integer> {
2427

25-
private final int maxValue;
28+
private final T[] validValues;
2629
Optional<Supplier<CompletableFuture<T>>> getter;
2730
protected Optional<ExceptionalConsumer<T>> setter;
2831

@@ -32,7 +35,7 @@ public abstract class EnumCharacteristic<T extends CharacteristicEnum>
3235
* @param type a string containing a UUID that indicates the type of characteristic. Apple defines
3336
* a set of these, however implementors can create their own as well.
3437
* @param description a description of the characteristic to be passed to the consuming device.
35-
* @param maxValue the number of enum items.
38+
* @param validValues an array of valid values for enum.
3639
* @param getter getter to retrieve the value
3740
* @param setter setter to set value
3841
* @param subscriber subscriber to subscribe to changes
@@ -41,25 +44,29 @@ public abstract class EnumCharacteristic<T extends CharacteristicEnum>
4144
public EnumCharacteristic(
4245
String type,
4346
String description,
44-
int maxValue,
47+
T[] validValues,
4548
Optional<Supplier<CompletableFuture<T>>> getter,
4649
Optional<ExceptionalConsumer<T>> setter,
4750
Optional<Consumer<HomekitCharacteristicChangeCallback>> subscriber,
4851
Optional<Runnable> unsubscriber) {
4952
super(
5053
type, "int", description, getter.isPresent(), setter.isPresent(), subscriber, unsubscriber);
51-
this.maxValue = maxValue;
5254
this.getter = getter;
5355
this.setter = setter;
56+
this.validValues = validValues;
5457
}
5558

5659
/** {@inheritDoc} */
5760
@Override
5861
protected CompletableFuture<JsonObjectBuilder> makeBuilder(int iid) {
62+
JsonArrayBuilder validValuesBuilder = Json.createArrayBuilder();
63+
if (validValues != null && validValues.length != 0) {
64+
Arrays.stream(validValues).forEach((T value) -> validValuesBuilder.add(value.getCode()));
65+
}
5966
return super.makeBuilder(iid)
6067
.thenApply(
6168
builder -> {
62-
return builder.add("minValue", 0).add("maxValue", maxValue).add("minStep", 1);
69+
return builder.add("valid-values", validValuesBuilder);
6370
});
6471
}
6572

@@ -91,12 +98,24 @@ protected void setValue(Integer value) throws Exception {
9198
return;
9299
}
93100

94-
// TODO implement setter here?
101+
// check if value is in valid values
102+
if (validValues != null && value != null) {
103+
for (T valid : validValues) {
104+
if (valid.getCode() == value) {
105+
setter.get().accept(valid);
106+
return;
107+
}
108+
}
109+
}
95110
}
96111

97112
/** {@inheritDoc} */
98113
@Override
99114
protected Integer getDefault() {
115+
// as default return first item from valid values
116+
if (validValues != null && validValues.length > 0) {
117+
return validValues[0].getCode();
118+
}
100119
return 0;
101120
}
102121
}

src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public ChargingStateCharacteristic(
2020
super(
2121
"0000008F-0000-1000-8000-0026BB765291",
2222
"Charging state",
23-
2,
23+
ChargingStateEnum.values(),
2424
Optional.of(getter),
2525
Optional.empty(),
2626
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public StatusLowBatteryCharacteristic(
2020
super(
2121
"00000079-0000-1000-8000-0026BB765291",
2222
"Status Low Battery",
23-
1,
23+
StatusLowBatteryEnum.values(),
2424
Optional.of(getter),
2525
Optional.empty(),
2626
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public CarbonDioxideDetectedCharacteristic(
2222
super(
2323
"00000092-0000-1000-8000-0026BB765291",
2424
"Carbon Dioxide Detected",
25-
1,
25+
CarbonDioxideDetectedEnum.values(),
2626
Optional.of(getter),
2727
Optional.empty(),
2828
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public CarbonMonoxideDetectedCharacteristic(
2222
super(
2323
"00000069-0000-1000-8000-0026BB765291",
2424
"Carbon Monoxide Detected",
25-
1,
25+
CarbonMonoxideDetectedEnum.values(),
2626
Optional.of(getter),
2727
Optional.empty(),
2828
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,10 @@ public ActiveCharacteristic(
2222
super(
2323
"000000B0-0000-1000-8000-0026BB765291",
2424
"Active",
25-
1,
25+
ActiveEnum.values(),
2626
Optional.of(getter),
2727
Optional.of(setter),
2828
Optional.of(subscriber),
2929
Optional.of(unsubscriber));
3030
}
31-
32-
@Override
33-
protected void setValue(Integer value) throws Exception {
34-
if (setter.isPresent()) setter.get().accept(ActiveEnum.fromCode(value));
35-
}
3631
}

src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public InUseCharacteristic(
1919
super(
2020
"000000D2-0000-1000-8000-0026BB765291",
2121
"In Use",
22-
1,
22+
InUseEnum.values(),
2323
Optional.of(getter),
2424
Optional.empty(),
2525
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,10 @@ public IsConfiguredCharacteristic(
2121
super(
2222
"000000D6-0000-1000-8000-0026BB765291",
2323
"Is Configured",
24-
1,
24+
IsConfiguredEnum.values(),
2525
Optional.of(getter),
2626
Optional.of(setter),
2727
Optional.of(subscriber),
2828
Optional.of(unsubscriber));
2929
}
30-
31-
@Override
32-
protected void setValue(Integer value) throws Exception {
33-
if (setter.isPresent()) setter.get().accept(IsConfiguredEnum.fromCode(value));
34-
}
3530
}

src/main/java/io/github/hapjava/characteristics/impl/common/ProgramModeCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public ProgramModeCharacteristic(
1919
super(
2020
"000000D1-0000-1000-8000-0026BB765291",
2121
"Program Mode",
22-
2,
22+
ProgramModeEnum.values(),
2323
Optional.of(getter),
2424
Optional.empty(),
2525
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEventCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public ProgrammableSwitchEventCharacteristic(
2424
super(
2525
"00000073-0000-1000-8000-0026BB765291",
2626
"Switch Event",
27-
2,
27+
ProgrammableSwitchEnum.values(),
2828
Optional.of(getter),
2929
Optional.empty(),
3030
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public ServiceLabelNamespaceCharacteristic(
1616
super(
1717
"000000CD-0000-1000-8000-0026BB765291",
1818
"service label namespace",
19-
1,
19+
ServiceLabelNamespaceEnum.values(),
2020
Optional.of(getter),
2121
Optional.empty(),
2222
Optional.empty(),

src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public StatusFaultCharacteristic(
1717
super(
1818
"00000077-0000-1000-8000-0026BB765291",
1919
"Status Fault",
20-
1,
20+
StatusFaultEnum.values(),
2121
Optional.of(getter),
2222
Optional.empty(),
2323
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public StatusTamperedCharacteristic(
2020
super(
2121
"0000007A-0000-1000-8000-0026BB765291",
2222
"Status Tampered",
23-
1,
23+
StatusTamperedEnum.values(),
2424
Optional.of(getter),
2525
Optional.empty(),
2626
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public ContactSensorStateCharacteristic(
2222
super(
2323
"0000006A-0000-1000-8000-0026BB765291",
2424
"Contact Sensor",
25-
1,
25+
ContactStateEnum.values(),
2626
Optional.of(getter),
2727
Optional.empty(),
2828
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public CurrentFanStateCharacteristic(
2222
super(
2323
"000000AF-0000-1000-8000-0026BB765291",
2424
"Current Fan State",
25-
2,
25+
CurrentFanStateEnum.values(),
2626
Optional.of(getter),
2727
Optional.empty(),
2828
Optional.of(subscriber),

src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java

+1-9
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,10 @@ public LockPhysicalControlsCharacteristic(
2121
super(
2222
"000000A7-0000-1000-8000-0026BB765291",
2323
"Physical Locks",
24-
1,
24+
LockPhysicalControlsEnum.values(),
2525
Optional.of(getter),
2626
Optional.of(setter),
2727
Optional.of(subscriber),
2828
Optional.of(unsubscriber));
2929
}
30-
31-
@Override
32-
protected void setValue(Integer value) throws Exception {
33-
if (!setter.isPresent()) {
34-
return;
35-
}
36-
setter.get().accept(LockPhysicalControlsEnum.fromCode(value));
37-
}
3830
}

0 commit comments

Comments
 (0)