Skip to content

Commit 10a9f43

Browse files
1 parent ef70ea9 commit 10a9f43

File tree

8 files changed

+250
-0
lines changed

8 files changed

+250
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.github.hapjava.accessories;
2+
3+
import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
4+
import io.github.hapjava.characteristics.impl.filtermaintenance.FilterChangeIndicationEnum;
5+
import io.github.hapjava.services.Service;
6+
import io.github.hapjava.services.impl.FilterMaintenanceService;
7+
import java.util.Collection;
8+
import java.util.Collections;
9+
import java.util.concurrent.CompletableFuture;
10+
11+
/**
12+
* A Filter maintenance with mandatory characteristics.
13+
*
14+
* <p>The HomeKit app doesn't support a seperate FilterMaintenance, but as a linked service to
15+
* AirPurifier.
16+
*
17+
* @see AirPurifierAccessory#getFilterMaintenanceAccessory()
18+
*/
19+
public interface FilterMaintenanceAccessory extends HomekitAccessory {
20+
21+
/**
22+
* The filter change indictaion. It's either yes or no.
23+
*
24+
* @return FilterChangeIndicationEnum
25+
*/
26+
CompletableFuture<FilterChangeIndicationEnum> getFilterChangeIndication();
27+
28+
/**
29+
* Subscribes to changes in the filter change indication.
30+
*
31+
* @param callback the function to call when the state changes.
32+
*/
33+
void subscribeFilterChangeIndication(HomekitCharacteristicChangeCallback callback);
34+
35+
/** Unsubscribes from changes in the filter change indication. */
36+
void unsubscribeFilterChangeIndication();
37+
38+
@Override
39+
default Collection<Service> getServices() {
40+
return Collections.singleton(new FilterMaintenanceService(this));
41+
}
42+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.github.hapjava.accessories.optionalcharacteristic;
2+
3+
import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
4+
import java.util.concurrent.CompletableFuture;
5+
6+
/** Accessory with filter level characteristics */
7+
public interface AccessoryWithFilterLifeLevel {
8+
9+
/**
10+
* what's the filter life level, percentage wise
11+
*
12+
* @return filter life level
13+
*/
14+
CompletableFuture<Double> getFilterLifeLevel();
15+
16+
/**
17+
* Subscribes to changes in the filter life level.
18+
*
19+
* @param callback the function to call when the level changes.
20+
*/
21+
void subscribeFilterLifeLevel(HomekitCharacteristicChangeCallback callback);
22+
23+
/** Unsubscribes from changes in the current filter life level. */
24+
void unsubscribeFilterLifeLevel();
25+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.github.hapjava.accessories.optionalcharacteristic;
2+
3+
import java.util.concurrent.CompletableFuture;
4+
5+
/** Accessory with filter reset characteristics */
6+
public interface AccessoryWithResetFilterIndication {
7+
8+
/**
9+
* Request to reset the filter level
10+
*
11+
* @param indication always 1, by HomeKit protocol. (to be ignored)
12+
*/
13+
CompletableFuture<Void> resetFilterIndication(Integer indication) throws Exception;
14+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.github.hapjava.characteristics.impl.filtermaintenance;
2+
3+
import io.github.hapjava.characteristics.EventableCharacteristic;
4+
import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
5+
import io.github.hapjava.characteristics.impl.base.EnumCharacteristic;
6+
import java.util.Optional;
7+
import java.util.concurrent.CompletableFuture;
8+
import java.util.function.Consumer;
9+
import java.util.function.Supplier;
10+
11+
public class FilterChangeIndicationCharacteristic
12+
extends EnumCharacteristic<FilterChangeIndicationEnum> implements EventableCharacteristic {
13+
14+
public FilterChangeIndicationCharacteristic(
15+
Supplier<CompletableFuture<FilterChangeIndicationEnum>> getter,
16+
Consumer<HomekitCharacteristicChangeCallback> subscriber,
17+
Runnable unsubscriber) {
18+
super(
19+
"000000AC-0000-1000-8000-0026BB765291",
20+
"filter change indication",
21+
FilterChangeIndicationEnum.values(),
22+
Optional.of(getter),
23+
Optional.empty(),
24+
Optional.of(subscriber),
25+
Optional.of(unsubscriber));
26+
}
27+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.github.hapjava.characteristics.impl.filtermaintenance;
2+
3+
import io.github.hapjava.characteristics.CharacteristicEnum;
4+
import java.util.Arrays;
5+
import java.util.Map;
6+
import java.util.stream.Collectors;
7+
8+
public enum FilterChangeIndicationEnum implements CharacteristicEnum {
9+
NO_CHANGE_NEEDED(0),
10+
CHANGE_NEEDED(1);
11+
12+
private static final Map<Integer, FilterChangeIndicationEnum> reverse;
13+
14+
static {
15+
reverse =
16+
Arrays.stream(FilterChangeIndicationEnum.values())
17+
.collect(Collectors.toMap(FilterChangeIndicationEnum::getCode, t -> t));
18+
}
19+
20+
public static FilterChangeIndicationEnum fromCode(Integer code) {
21+
return reverse.get(code);
22+
}
23+
24+
private final int code;
25+
26+
FilterChangeIndicationEnum(int code) {
27+
this.code = code;
28+
}
29+
30+
@Override
31+
public int getCode() {
32+
return code;
33+
}
34+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.github.hapjava.characteristics.impl.filtermaintenance;
2+
3+
import io.github.hapjava.characteristics.EventableCharacteristic;
4+
import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
5+
import io.github.hapjava.characteristics.impl.base.FloatCharacteristic;
6+
import java.util.Optional;
7+
import java.util.concurrent.CompletableFuture;
8+
import java.util.function.Consumer;
9+
import java.util.function.Supplier;
10+
11+
public class FilterLifeLevelCharacteristic extends FloatCharacteristic
12+
implements EventableCharacteristic {
13+
14+
public FilterLifeLevelCharacteristic(
15+
Supplier<CompletableFuture<Double>> getter,
16+
Consumer<HomekitCharacteristicChangeCallback> subscriber,
17+
Runnable unsubscriber) {
18+
super(
19+
"000000AB-0000-1000-8000-0026BB765291",
20+
"Filter Life Level",
21+
0,
22+
100,
23+
1,
24+
"%",
25+
Optional.of(getter),
26+
Optional.empty(),
27+
Optional.of(subscriber),
28+
Optional.of(unsubscriber));
29+
}
30+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.github.hapjava.characteristics.impl.filtermaintenance;
2+
3+
import io.github.hapjava.characteristics.ExceptionalConsumer;
4+
import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic;
5+
import java.util.Optional;
6+
7+
public class ResetFilterIndicationCharacteristic extends IntegerCharacteristic {
8+
9+
public ResetFilterIndicationCharacteristic(ExceptionalConsumer<Integer> setter) {
10+
super(
11+
"000000AD-0000-1000-8000-0026BB765291",
12+
"Reset Filter Indication",
13+
1,
14+
1,
15+
null,
16+
Optional.empty(),
17+
Optional.of(setter),
18+
Optional.empty(),
19+
Optional.empty());
20+
}
21+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package io.github.hapjava.services.impl;
2+
3+
import io.github.hapjava.accessories.FilterMaintenanceAccessory;
4+
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithFilterLifeLevel;
5+
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName;
6+
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithResetFilterIndication;
7+
import io.github.hapjava.characteristics.impl.common.NameCharacteristic;
8+
import io.github.hapjava.characteristics.impl.filtermaintenance.FilterChangeIndicationCharacteristic;
9+
import io.github.hapjava.characteristics.impl.filtermaintenance.FilterLifeLevelCharacteristic;
10+
import io.github.hapjava.characteristics.impl.filtermaintenance.ResetFilterIndicationCharacteristic;
11+
12+
/** This service describes a filter maintenance. */
13+
public class FilterMaintenanceService extends AbstractServiceImpl {
14+
15+
public FilterMaintenanceService(FilterChangeIndicationCharacteristic filerChange) {
16+
super("000000BA-0000-1000-8000-0026BB765291");
17+
addCharacteristic(filerChange);
18+
}
19+
20+
public FilterMaintenanceService(FilterMaintenanceAccessory accessory) {
21+
this(
22+
new FilterChangeIndicationCharacteristic(
23+
accessory::getFilterChangeIndication,
24+
accessory::subscribeFilterChangeIndication,
25+
accessory::unsubscribeFilterChangeIndication));
26+
27+
if (accessory instanceof AccessoryWithName) {
28+
addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName));
29+
}
30+
31+
if (accessory instanceof AccessoryWithFilterLifeLevel) {
32+
addOptionalCharacteristic(
33+
new FilterLifeLevelCharacteristic(
34+
((AccessoryWithFilterLifeLevel) accessory)::getFilterLifeLevel,
35+
((AccessoryWithFilterLifeLevel) accessory)::subscribeFilterLifeLevel,
36+
((AccessoryWithFilterLifeLevel) accessory)::unsubscribeFilterLifeLevel));
37+
}
38+
39+
if (accessory instanceof AccessoryWithResetFilterIndication) {
40+
addOptionalCharacteristic(
41+
new ResetFilterIndicationCharacteristic(
42+
((AccessoryWithResetFilterIndication) accessory)::resetFilterIndication));
43+
}
44+
}
45+
46+
public void addOptionalCharacteristic(NameCharacteristic name) {
47+
addCharacteristic(name);
48+
}
49+
50+
public void addOptionalCharacteristic(FilterLifeLevelCharacteristic filterLifeLevel) {
51+
addCharacteristic(filterLifeLevel);
52+
}
53+
54+
public void addOptionalCharacteristic(ResetFilterIndicationCharacteristic resetFilterIndication) {
55+
addCharacteristic(resetFilterIndication);
56+
}
57+
}

0 commit comments

Comments
 (0)