Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
  • Loading branch information
gjvanderheiden committed Dec 10, 2020
commit 10a9f43cb73c45d1fd63a1af73b72c618bddf062
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.github.hapjava.accessories;

import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
import io.github.hapjava.characteristics.impl.filtermaintenance.FilterChangeIndicationEnum;
import io.github.hapjava.services.Service;
import io.github.hapjava.services.impl.FilterMaintenanceService;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.CompletableFuture;

/**
* A Filter maintenance with mandatory characteristics.
*
* <p>The HomeKit app doesn't support a seperate FilterMaintenance, but as a linked service to
* AirPurifier.
*
* @see AirPurifierAccessory#getFilterMaintenanceAccessory()
*/
public interface FilterMaintenanceAccessory extends HomekitAccessory {

/**
* The filter change indictaion. It's either yes or no.
*
* @return FilterChangeIndicationEnum
*/
CompletableFuture<FilterChangeIndicationEnum> getFilterChangeIndication();

/**
* Subscribes to changes in the filter change indication.
*
* @param callback the function to call when the state changes.
*/
void subscribeFilterChangeIndication(HomekitCharacteristicChangeCallback callback);

/** Unsubscribes from changes in the filter change indication. */
void unsubscribeFilterChangeIndication();

@Override
default Collection<Service> getServices() {
return Collections.singleton(new FilterMaintenanceService(this));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.github.hapjava.accessories.optionalcharacteristic;

import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
import java.util.concurrent.CompletableFuture;

/** Accessory with filter level characteristics */
public interface AccessoryWithFilterLifeLevel {

/**
* what's the filter life level, percentage wise
*
* @return filter life level
*/
CompletableFuture<Double> getFilterLifeLevel();

/**
* Subscribes to changes in the filter life level.
*
* @param callback the function to call when the level changes.
*/
void subscribeFilterLifeLevel(HomekitCharacteristicChangeCallback callback);

/** Unsubscribes from changes in the current filter life level. */
void unsubscribeFilterLifeLevel();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.github.hapjava.accessories.optionalcharacteristic;

import java.util.concurrent.CompletableFuture;

/** Accessory with filter reset characteristics */
public interface AccessoryWithResetFilterIndication {

/**
* Request to reset the filter level
*
* @param indication always 1, by HomeKit protocol. (to be ignored)
*/
CompletableFuture<Void> resetFilterIndication(Integer indication) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.github.hapjava.characteristics.impl.filtermaintenance;

import io.github.hapjava.characteristics.EventableCharacteristic;
import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
import io.github.hapjava.characteristics.impl.base.EnumCharacteristic;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class FilterChangeIndicationCharacteristic
extends EnumCharacteristic<FilterChangeIndicationEnum> implements EventableCharacteristic {

public FilterChangeIndicationCharacteristic(
Supplier<CompletableFuture<FilterChangeIndicationEnum>> getter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
super(
"000000AC-0000-1000-8000-0026BB765291",
"filter change indication",
FilterChangeIndicationEnum.values(),
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Optional.of(unsubscriber));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.github.hapjava.characteristics.impl.filtermaintenance;

import io.github.hapjava.characteristics.CharacteristicEnum;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

public enum FilterChangeIndicationEnum implements CharacteristicEnum {
NO_CHANGE_NEEDED(0),
CHANGE_NEEDED(1);

private static final Map<Integer, FilterChangeIndicationEnum> reverse;

static {
reverse =
Arrays.stream(FilterChangeIndicationEnum.values())
.collect(Collectors.toMap(FilterChangeIndicationEnum::getCode, t -> t));
}

public static FilterChangeIndicationEnum fromCode(Integer code) {
return reverse.get(code);
}

private final int code;

FilterChangeIndicationEnum(int code) {
this.code = code;
}

@Override
public int getCode() {
return code;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package io.github.hapjava.characteristics.impl.filtermaintenance;

import io.github.hapjava.characteristics.EventableCharacteristic;
import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback;
import io.github.hapjava.characteristics.impl.base.FloatCharacteristic;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class FilterLifeLevelCharacteristic extends FloatCharacteristic
implements EventableCharacteristic {

public FilterLifeLevelCharacteristic(
Supplier<CompletableFuture<Double>> getter,
Consumer<HomekitCharacteristicChangeCallback> subscriber,
Runnable unsubscriber) {
super(
"000000AB-0000-1000-8000-0026BB765291",
"Filter Life Level",
0,
100,
1,
"%",
Optional.of(getter),
Optional.empty(),
Optional.of(subscriber),
Optional.of(unsubscriber));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.github.hapjava.characteristics.impl.filtermaintenance;

import io.github.hapjava.characteristics.ExceptionalConsumer;
import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic;
import java.util.Optional;

public class ResetFilterIndicationCharacteristic extends IntegerCharacteristic {

public ResetFilterIndicationCharacteristic(ExceptionalConsumer<Integer> setter) {
super(
"000000AD-0000-1000-8000-0026BB765291",
"Reset Filter Indication",
1,
1,
null,
Optional.empty(),
Optional.of(setter),
Optional.empty(),
Optional.empty());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package io.github.hapjava.services.impl;

import io.github.hapjava.accessories.FilterMaintenanceAccessory;
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithFilterLifeLevel;
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName;
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithResetFilterIndication;
import io.github.hapjava.characteristics.impl.common.NameCharacteristic;
import io.github.hapjava.characteristics.impl.filtermaintenance.FilterChangeIndicationCharacteristic;
import io.github.hapjava.characteristics.impl.filtermaintenance.FilterLifeLevelCharacteristic;
import io.github.hapjava.characteristics.impl.filtermaintenance.ResetFilterIndicationCharacteristic;

/** This service describes a filter maintenance. */
public class FilterMaintenanceService extends AbstractServiceImpl {

public FilterMaintenanceService(FilterChangeIndicationCharacteristic filerChange) {
super("000000BA-0000-1000-8000-0026BB765291");
addCharacteristic(filerChange);
}

public FilterMaintenanceService(FilterMaintenanceAccessory accessory) {
this(
new FilterChangeIndicationCharacteristic(
accessory::getFilterChangeIndication,
accessory::subscribeFilterChangeIndication,
accessory::unsubscribeFilterChangeIndication));

if (accessory instanceof AccessoryWithName) {
addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName));
}

if (accessory instanceof AccessoryWithFilterLifeLevel) {
addOptionalCharacteristic(
new FilterLifeLevelCharacteristic(
((AccessoryWithFilterLifeLevel) accessory)::getFilterLifeLevel,
((AccessoryWithFilterLifeLevel) accessory)::subscribeFilterLifeLevel,
((AccessoryWithFilterLifeLevel) accessory)::unsubscribeFilterLifeLevel));
}

if (accessory instanceof AccessoryWithResetFilterIndication) {
addOptionalCharacteristic(
new ResetFilterIndicationCharacteristic(
((AccessoryWithResetFilterIndication) accessory)::resetFilterIndication));
}
}

public void addOptionalCharacteristic(NameCharacteristic name) {
addCharacteristic(name);
}

public void addOptionalCharacteristic(FilterLifeLevelCharacteristic filterLifeLevel) {
addCharacteristic(filterLifeLevel);
}

public void addOptionalCharacteristic(ResetFilterIndicationCharacteristic resetFilterIndication) {
addCharacteristic(resetFilterIndication);
}
}