Skip to content
Merged
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
5 changes: 5 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
* `server` package consists classes to run HomeKit server and handle communication
* 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.

## New and improved

* Valid values are supported for enum characteristics instead of min and max values
* Supported valid states for Thermostat, SecuritySystem and HeaterCooler [#108]

# HAP-Java 1.1.5

## Fixes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,24 @@ public interface HeaterCoolerAccessory extends HomekitAccessory {
/** Unsubscribes from changes in the current temperature. */
void unsubscribeCurrentTemperature();

/**
* Valid values for current state.
*
* @return array of valid current states
*/
default CurrentHeaterCoolerStateEnum[] getCurrentHeaterCoolerStateValidValues() {
return CurrentHeaterCoolerStateEnum.values();
}

/**
* Valid values for target state.
*
* @return array of valid target states
*/
default TargetHeaterCoolerStateEnum[] getTargetHeaterCoolerStateValidValues() {
return TargetHeaterCoolerStateEnum.values();
}

@Override
default Collection<Service> getServices() {
return Collections.singleton(new HeaterCoolerService(this));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,24 @@ public interface SecuritySystemAccessory extends HomekitAccessory {
*/
void unsubscribeTargetSecuritySystemState();

/**
* Valid values for current state.
*
* @return array of valid current states.
*/
default CurrentSecuritySystemStateEnum[] getCurrentSecuritySystemStateValidValues() {
return CurrentSecuritySystemStateEnum.values();
}

/**
* Valid values for target state.
*
* @return array of valid targe states.
*/
default TargetSecuritySystemStateEnum[] getTargetSecuritySystemStateValidValues() {
return TargetSecuritySystemStateEnum.values();
}

@Override
default Collection<Service> getServices() {
return Collections.singleton(new SecuritySystemService(this));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,24 @@ default double getMinStepTargetTemperature() {
/** Unsubscribes from changes in the target temperature. */
void unsubscribeTargetTemperature();

/**
* Valid values for current state.
*
* @return array of valid current states.
*/
default CurrentHeatingCoolingStateEnum[] getCurrentHeatingCoolingStateValidValues() {
return CurrentHeatingCoolingStateEnum.values();
}

/**
* Valid values for target state.
*
* @return array of valid targe states.
*/
default TargetHeatingCoolingStateEnum[] getTargetHeatingCoolingStateValidValues() {
return TargetHeatingCoolingStateEnum.values();
}

@Override
default Collection<Service> getServices() {
return Collections.singleton(new ThermostatService(this));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public AccessoryFlagsCharacteristic(
super(
"000000A6-0000-1000-8000-0026BB765291",
"accessory flags",
1,
AccessoryFlagsEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public CurrentAirPurifierCharacteristic(
super(
"000000A9-0000-1000-8000-0026BB765291",
"current air purifier state",
2,
CurrentAirPurifierStateEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,10 @@ public TargetAirPurifierStateCharacteristic(
super(
"000000A8-0000-1000-8000-0026BB765291",
"Air purifier state",
1,
TargetAirPurifierStateEnum.values(),
Optional.of(getter),
Optional.of(setter),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

@Override
protected void setValue(Integer value) throws Exception {
if (!setter.isPresent()) {
return;
}
setter.get().accept(TargetAirPurifierStateEnum.fromCode(value));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public AirQualityCharacteristic(
super(
"00000095-0000-1000-8000-0026BB765291",
"air quality",
5,
AirQualityEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
import io.github.hapjava.characteristics.CharacteristicEnum;
import io.github.hapjava.characteristics.ExceptionalConsumer;
import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
import java.util.Arrays;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.function.Supplier;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonNumber;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
Expand All @@ -22,7 +25,7 @@
public abstract class EnumCharacteristic<T extends CharacteristicEnum>
extends BaseCharacteristic<Integer> {

private final int maxValue;
private final T[] validValues;
Optional<Supplier<CompletableFuture<T>>> getter;
protected Optional<ExceptionalConsumer<T>> setter;

Expand All @@ -32,7 +35,7 @@ public abstract class EnumCharacteristic<T extends CharacteristicEnum>
* @param type a string containing a UUID that indicates the type of characteristic. Apple defines
* a set of these, however implementors can create their own as well.
* @param description a description of the characteristic to be passed to the consuming device.
* @param maxValue the number of enum items.
* @param validValues an array of valid values for enum.
* @param getter getter to retrieve the value
* @param setter setter to set value
* @param subscriber subscriber to subscribe to changes
Expand All @@ -41,25 +44,29 @@ public abstract class EnumCharacteristic<T extends CharacteristicEnum>
public EnumCharacteristic(
String type,
String description,
int maxValue,
T[] validValues,
Optional<Supplier<CompletableFuture<T>>> getter,
Optional<ExceptionalConsumer<T>> setter,
Optional<Consumer<HomekitCharacteristicChangeCallback>> subscriber,
Optional<Runnable> unsubscriber) {
super(
type, "int", description, getter.isPresent(), setter.isPresent(), subscriber, unsubscriber);
this.maxValue = maxValue;
this.getter = getter;
this.setter = setter;
this.validValues = validValues;
}

/** {@inheritDoc} */
@Override
protected CompletableFuture<JsonObjectBuilder> makeBuilder(int iid) {
JsonArrayBuilder validValuesBuilder = Json.createArrayBuilder();
if (validValues != null && validValues.length != 0) {
Arrays.stream(validValues).forEach((T value) -> validValuesBuilder.add(value.getCode()));
}
return super.makeBuilder(iid)
.thenApply(
builder -> {
return builder.add("minValue", 0).add("maxValue", maxValue).add("minStep", 1);
return builder.add("valid-values", validValuesBuilder);
});
}

Expand Down Expand Up @@ -91,12 +98,24 @@ protected void setValue(Integer value) throws Exception {
return;
}

// TODO implement setter here?
// check if value is in valid values
if (validValues != null && value != null) {
for (T valid : validValues) {
if (valid.getCode() == value) {
setter.get().accept(valid);
return;
}
}
}
}

/** {@inheritDoc} */
@Override
protected Integer getDefault() {
// as default return first item from valid values
if (validValues != null && validValues.length > 0) {
return validValues[0].getCode();
}
return 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public ChargingStateCharacteristic(
super(
"0000008F-0000-1000-8000-0026BB765291",
"Charging state",
2,
ChargingStateEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public StatusLowBatteryCharacteristic(
super(
"00000079-0000-1000-8000-0026BB765291",
"Status Low Battery",
1,
StatusLowBatteryEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public CarbonDioxideDetectedCharacteristic(
super(
"00000092-0000-1000-8000-0026BB765291",
"Carbon Dioxide Detected",
1,
CarbonDioxideDetectedEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public CarbonMonoxideDetectedCharacteristic(
super(
"00000069-0000-1000-8000-0026BB765291",
"Carbon Monoxide Detected",
1,
CarbonMonoxideDetectedEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,10 @@ public ActiveCharacteristic(
super(
"000000B0-0000-1000-8000-0026BB765291",
"Active",
1,
ActiveEnum.values(),
Optional.of(getter),
Optional.of(setter),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

@Override
protected void setValue(Integer value) throws Exception {
if (setter.isPresent()) setter.get().accept(ActiveEnum.fromCode(value));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public InUseCharacteristic(
super(
"000000D2-0000-1000-8000-0026BB765291",
"In Use",
1,
InUseEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,10 @@ public IsConfiguredCharacteristic(
super(
"000000D6-0000-1000-8000-0026BB765291",
"Is Configured",
1,
IsConfiguredEnum.values(),
Optional.of(getter),
Optional.of(setter),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

@Override
protected void setValue(Integer value) throws Exception {
if (setter.isPresent()) setter.get().accept(IsConfiguredEnum.fromCode(value));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public ProgramModeCharacteristic(
super(
"000000D1-0000-1000-8000-0026BB765291",
"Program Mode",
2,
ProgramModeEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public ProgrammableSwitchEventCharacteristic(
super(
"00000073-0000-1000-8000-0026BB765291",
"Switch Event",
2,
ProgrammableSwitchEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public ServiceLabelNamespaceCharacteristic(
super(
"000000CD-0000-1000-8000-0026BB765291",
"service label namespace",
1,
ServiceLabelNamespaceEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.empty(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public StatusFaultCharacteristic(
super(
"00000077-0000-1000-8000-0026BB765291",
"Status Fault",
1,
StatusFaultEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public StatusTamperedCharacteristic(
super(
"0000007A-0000-1000-8000-0026BB765291",
"Status Tampered",
1,
StatusTamperedEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public ContactSensorStateCharacteristic(
super(
"0000006A-0000-1000-8000-0026BB765291",
"Contact Sensor",
1,
ContactStateEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public CurrentFanStateCharacteristic(
super(
"000000AF-0000-1000-8000-0026BB765291",
"Current Fan State",
2,
CurrentFanStateEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,10 @@ public LockPhysicalControlsCharacteristic(
super(
"000000A7-0000-1000-8000-0026BB765291",
"Physical Locks",
1,
LockPhysicalControlsEnum.values(),
Optional.of(getter),
Optional.of(setter),
Optional.of(subscriber),
Optional.of(unsubscriber));
}

@Override
protected void setValue(Integer value) throws Exception {
if (!setter.isPresent()) {
return;
}
setter.get().accept(LockPhysicalControlsEnum.fromCode(value));
}
}
Loading