From 9aa77d559a2e7a5d4ed48b410503612041a732bb Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 15 Mar 2020 23:48:38 +0100 Subject: [PATCH 01/23] major refactoring to support optional attributes --- pom.xml | 6 +- .../hapjava/accessories/BatteryAccessory.java | 58 ++++++- .../accessories/BatteryStatusAccessory.java | 31 ---- .../{impl => }/accessories/Bridge.java | 4 +- ...java => CarbonDioxideSensorAccessory.java} | 40 ++--- ...ava => CarbonMonoxideSensorAccessory.java} | 25 ++- ...ensor.java => ContactSensorAccessory.java} | 25 ++- .../hapjava/accessories/DoorAccessory.java | 82 +++++++++ .../io/github/hapjava/accessories/Fan.java | 99 ----------- .../hapjava/accessories/FanAccessory.java | 48 ++++++ ...or.java => GarageDoorOpenerAccessory.java} | 18 +- .../{ => accessories}/HomekitAccessory.java | 27 ++- ...nsor.java => HumiditySensorAccessory.java} | 17 +- ...akSensor.java => LeakSensorAccessory.java} | 24 +-- ...tSensor.java => LightSensorAccessory.java} | 19 +-- ...Lightbulb.java => LightbulbAccessory.java} | 17 +- .../hapjava/accessories/LockMechanism.java | 44 ----- .../accessories/LockMechanismAccessory.java | 64 +++++++ .../accessories/LockableLockMechanism.java | 38 ----- ...Sensor.java => MotionSensorAccessory.java} | 21 ++- ...sor.java => OccupancySensorAccessory.java} | 24 +-- .../{Outlet.java => OutletAccessory.java} | 17 +- ...stem.java => SecuritySystemAccessory.java} | 39 ++--- ...eSensor.java => SmokeSensorAccessory.java} | 25 ++- .../{Switch.java => SwitchAccessory.java} | 17 +- .../accessories/TemperatureSensor.java | 83 --------- .../TemperatureSensorAccessory.java | 38 +++++ .../hapjava/accessories/Thermostat.java | 13 -- .../accessories/ThermostatAccessory.java | 138 +++++++++++++++ .../{Valve.java => ValveAccessory.java} | 31 ++-- .../hapjava/accessories/WindowAccessory.java | 82 +++++++++ .../hapjava/accessories/WindowCovering.java | 16 -- ...ring.java => WindowCoveringAccessory.java} | 15 +- .../AccessoryWithBrightness.java} | 8 +- .../AccessoryWithCarbonDioxideLevel.java | 46 +++++ .../AccessoryWithCarbonMonoxideLevel.java | 46 +++++ .../AccessoryWithColor.java} | 9 +- ...essoryWithCoolingThresholdTemprature.java} | 6 +- .../AccessoryWithDuration.java} | 28 +--- .../AccessoryWithFanState.java | 158 ++++++++++++++++++ .../AccessoryWithHardwareRevision.java | 18 ++ ...essoryWithHearingThresholdTemprature.java} | 6 +- .../AccessoryWithHoldPosition.java} | 5 +- .../AccessoryWithHorizontalTilting.java} | 8 +- .../AccessoryWithObstructionDetection.java} | 9 +- .../AccessoryWithRemainingDuration.java | 30 ++++ .../AccessoryWithVerticalTilting.java} | 13 +- .../CarbonDioxideDetectedState.java | 32 ---- .../CarbonMonoxideDetectedState.java | 32 ---- .../accessories/properties/ContactState.java | 32 ---- .../CurrentSecuritySystemState.java | 48 ------ .../accessories/properties/DoorState.java | 33 ---- .../properties/LockMechanismState.java | 40 ----- .../properties/RotationDirection.java | 32 ---- .../properties/SecuritySystemAlarmType.java | 41 ----- .../properties/SmokeDetectedState.java | 32 ---- .../properties/TargetSecuritySystemState.java | 45 ----- .../properties/TemperatureUnit.java | 37 ---- .../properties/ThermostatMode.java | 39 ----- .../accessories/properties/ValveType.java | 38 ----- .../WindowCoveringPositionState.java | 39 ----- .../accessories/properties/package-info.java | 2 - .../thermostat/BasicThermostat.java | 88 ---------- .../BooleanCharacteristic.java | 42 ----- .../characteristics/CharacteristicEnum.java | 5 + .../EventableCharacteristic.java | 2 - .../ExceptionalConsumer.java | 2 +- .../HomekitCharacteristicChangeCallback.java | 4 +- .../WriteOnlyBooleanCharacteristic.java | 33 ---- .../FirmwareRevisionCharacteristic.java | 19 +++ .../HardwareRevisionCharacteristic.java | 19 +++ .../IdentifyCharacteristic.java | 19 +++ .../ManufacturerCharacteristic.java | 22 +++ .../ModelCharacteristic.java | 22 +++ .../NameCharacteristic.java | 19 +++ .../SerialNumberCharacteristic.java | 22 +++ .../{ => impl/base}/BaseCharacteristic.java | 60 +++++-- .../impl/base/BooleanCharacteristic.java | 73 ++++++++ .../{ => impl/base}/EnumCharacteristic.java | 44 ++++- .../{ => impl/base}/FloatCharacteristic.java | 51 ++++-- .../base}/IntegerCharacteristic.java | 39 ++++- .../base}/StaticStringCharacteristic.java | 24 ++- .../battery/BatteryLevelCharacteristic.java | 30 ++++ .../battery/ChargingStateCharacteristic.java | 26 +++ .../impl/battery/ChargingStateEnum.java | 36 ++++ .../StatusLowBatteryCharacteristic.java | 30 ++++ .../impl/battery/StatusLowBatteryEnum.java | 35 ++++ .../CarbonDioxideDetectedCharacteristic.java | 31 ++++ .../CarbonDioxideDetectedEnum.java | 35 ++++ .../CarbonDioxideLevelCharacteristic.java | 31 ++++ .../CarbonDioxidePeakLevelCharacteristic.java | 32 ++++ .../CarbonMonoxideDetectedCharacteristic.java | 31 ++++ .../CarbonMonoxideDetectedEnum.java | 35 ++++ .../CarbonMonoxideLevelCharacteristic.java | 29 ++++ ...CarbonMonoxidePeakLevelCharacteristic.java | 32 ++++ .../impl/common/ActiveCharacteristic.java | 33 ++++ .../impl/common/ActiveEnum.java | 34 ++++ .../impl/common/InUseCharacteristic.java | 28 ++++ .../impl/common/InUseEnum.java | 34 ++++ .../common/IsConfiguredCharacteristic.java | 37 ++++ .../impl/common/IsConfiguredEnum.java | 35 ++++ .../ObstructionDetectedCharacteristic.java | 27 +++ .../impl/common/OnCharacteristic.java | 27 +++ .../ServiceLabelIndexCharacteristic.java | 28 ++++ .../ServiceLabelNamespaceCharacteristic.java | 26 +++ .../common/ServiceLabelNamespaceEnum.java | 37 ++++ .../common/StatusActiveCharacteristic.java | 27 +++ .../common/StatusFaultCharacteristic.java | 30 ++++ .../impl/common/StatusFaultEnum.java | 35 ++++ .../common/StatusTamperedCharacteristic.java | 30 ++++ .../impl/common/StatusTamperedEnum.java | 35 ++++ .../ContactSensorStateCharacteristic.java | 31 ++++ .../impl/contactsensor/ContactStateEnum.java | 37 ++++ .../fan/CurrentFanStateCharacteristic.java | 28 ++++ .../impl/fan/CurrentFanStateEnum.java | 35 ++++ .../LockPhysicalControlsCharacteristic.java | 41 +++++ .../impl/fan/LockPhysicalControlsEnum.java | 35 ++++ .../fan/RotationDirectionCharacteristic.java | 38 +++++ .../impl/fan/RotationDirectionEnum.java | 35 ++++ .../impl/fan/RotationSpeedCharacteristic.java | 32 ++++ .../impl/fan/SwingModeCharacteristic.java | 38 +++++ .../impl/fan/SwingModeEnum.java | 35 ++++ .../fan/TargetFanStateCharacteristic.java | 38 +++++ .../impl/fan/TargetFanStateEnum.java | 35 ++++ .../CurrentDoorStateCharacteristic.java | 28 ++++ .../impl/garagedoor/CurrentDoorStateEnum.java | 42 +++++ .../TargetDoorStateCharacteristic.java | 38 +++++ .../impl/garagedoor/TargetDoorStateEnum.java | 35 ++++ ...CurrentRelativeHumidityCharacteristic.java | 32 ++++ .../TargetRelativeHumidityCharacteristic.java | 34 ++++ .../LeakDetectedStateCharacteristic.java | 31 ++++ .../leaksensor/LeakDetectedStateEnum.java | 35 ++++ .../lightbulb/BrightnessCharacteristic.java | 36 ++++ .../ColorTemperatureCharacteristic.java | 36 ++++ .../impl/lightbulb/HueCharacteristic.java | 30 ++++ .../lightbulb/SaturationCharacteristic.java | 33 ++++ ...urrentAmbientLightLevelCharacteristic.java | 32 ++++ .../lock/LockCurrentStateCharacteristic.java | 26 +++ .../impl/lock/LockCurrentStateEnum.java | 37 ++++ .../lock/LockTargetStateCharacteristic.java | 36 ++++ .../impl/lock/LockTargetStateEnum.java | 35 ++++ .../MotionDetectedCharacteristic.java | 25 +++ .../OccupancyDetectedCharacteristic.java | 26 +++ .../OccupancyDetectedEnum.java | 35 ++++ .../outlet/OutletInUseCharacteristic.java | 28 ++++ ...rentSecuritySystemStateCharacteristic.java | 27 +++ .../CurrentSecuritySystemStateEnum.java | 52 ++++++ ...SecuritySystemAlarmTypeCharacteristic.java | 30 ++++ .../SecuritySystemAlarmTypeEnum.java | 45 +++++ ...rgetSecuritySystemStateCharacteristic.java | 37 ++++ .../TargetSecuritySystemStateEnum.java | 50 ++++++ .../SmokeDetectedCharacteristic.java | 29 ++++ .../smokesensor/SmokeDetectedStateEnum.java | 34 ++++ ...ingThresholdTemperatureCharacteristic.java | 35 ++++ ...rentHeatingCoolingStateCharacteristic.java | 30 ++++ .../CurrentHeatingCoolingStateEnum.java | 37 ++++ .../CurrentTemperatureCharacteristic.java | 29 ++++ ...ingThresholdTemperatureCharacteristic.java | 35 ++++ ...rgetHeatingCoolingStateCharacteristic.java | 40 +++++ .../TargetHeatingCoolingStateEnum.java | 43 +++++ .../TargetTemperatureCharacteristic.java | 35 ++++ .../TemperatureDisplayUnitCharacteristic.java | 40 +++++ .../TemperatureDisplayUnitEnum.java | 41 +++++ .../RemainingDurationCharacteristic.java | 38 +++++ .../impl/valve/SetDurationCharacteristic.java | 36 ++++ .../impl/valve/ValveTypeCharacteristic.java | 26 +++ .../impl/valve/ValveTypeEnum.java | 42 +++++ ...rentHorizontalTiltAngleCharacteristic.java | 36 ++++ .../CurrentPositionCharacteristic.java | 36 ++++ ...urrentVerticalTiltAngleCharacteristic.java | 36 ++++ .../HoldPositionCharacteristic.java | 23 +++ .../PositionStateCharacteristic.java | 29 ++++ .../windowcovering/PositionStateEnum.java | 39 +++++ ...rgetHorizontalTiltAngleCharacteristic.java | 35 ++++ .../TargetPositionCharacteristic.java | 38 +++++ ...TargetVerticalTiltAngleCharacteristic.java | 35 ++++ .../io/github/hapjava/impl/HomekitBridge.java | 51 ------ .../CarbonDioxideDetectedCharacteristic.java | 41 ----- .../CarbonDioxideLevelCharacteristic.java | 54 ------ .../CarbonMonoxideDetectedCharacteristic.java | 41 ----- .../common/ActiveCharacteristic.java | 49 ------ .../common/BatteryLevelCharacteristic.java | 50 ------ .../common/InUseCharacteristic.java | 45 ----- .../LowBatteryStatusCharacteristic.java | 46 ----- .../impl/characteristics/common/Name.java | 10 -- .../ObstructionDetectedCharacteristic.java | 46 ----- .../common/PowerStateCharacteristic.java | 50 ------ .../RemainingDurationCharacteristic.java | 53 ------ .../ContactSensorStateCharacteristic.java | 39 ----- .../fan/RotationDirectionCharacteristic.java | 39 ----- .../fan/RotationSpeedCharacteristic.java | 38 ----- .../CurrentDoorStateCharacteristic.java | 38 ----- .../garage/TargetDoorStateCharacteristic.java | 39 ----- ...CurrentRelativeHumidityCharacteristic.java | 46 ----- .../characteristics/information/Identify.java | 23 --- .../information/Manufacturer.java | 14 -- .../characteristics/information/Model.java | 11 -- .../information/SerialNumber.java | 14 -- .../LeakDetectedStateCharacteristic.java | 38 ----- .../AmbientLightLevelCharacteristic.java | 46 ----- .../lightbulb/BrightnessCharacteristic.java | 45 ----- .../lightbulb/HueCharacteristic.java | 45 ----- .../lightbulb/SaturationCharacteristic.java | 46 ----- ...rrentLockMechanismStateCharacteristic.java | 38 ----- ...argetLockMechanismStateCharacteristic.java | 39 ----- .../MotionDetectedStateCharacteristic.java | 38 ----- .../OccupancyDetectedStateCharacteristic.java | 38 ----- .../outlet/OutletInUseCharacteristic.java | 38 ----- ...rentSecuritySystemStateCharacteristic.java | 41 ----- ...SecuritySystemAlarmTypeCharacteristic.java | 39 ----- ...rgetSecuritySystemStateCharacteristic.java | 41 ----- .../SmokeDetectedCharacteristic.java | 39 ----- ...tractHeatingCoolingModeCharacteristic.java | 29 ---- .../AbstractTemperatureCharacteristic.java | 22 --- ...ingThresholdTemperatureCharacteristic.java | 39 ----- ...rrentHeatingCoolingModeCharacteristic.java | 37 ---- .../CurrentTemperatureCharacteristic.java | 35 ---- ...ingThresholdTemperatureCharacteristic.java | 39 ----- ...argetHeatingCoolingModeCharacteristic.java | 37 ---- .../TargetTemperatureCharacteristic.java | 35 ---- .../TemperatureUnitsCharacteristic.java | 40 ----- .../valve/SetDurationCharacteristic.java | 37 ---- .../valve/ValveTypeCharacteristic.java | 37 ---- ...rentHorizontalTiltAngleCharacteristic.java | 45 ----- .../CurrentPositionCharacteristic.java | 38 ----- ...urrentVerticalTiltAngleCharacteristic.java | 45 ----- .../HoldPositionCharacteristic.java | 26 --- .../PositionStateCharacteristic.java | 38 ----- ...rgetHorizontalTiltAngleCharacteristic.java | 45 ----- .../TargetPositionCharacteristic.java | 38 ----- ...TargetVerticalTiltAngleCharacteristic.java | 45 ----- .../io/github/hapjava/impl/pairing/Stage.java | 7 - .../impl/services/AbstractServiceImpl.java | 89 ---------- .../services/AccessoryInformationService.java | 23 --- .../services/CarbonDioxideSensorService.java | 18 -- .../services/CarbonMonoxideSensorService.java | 17 -- .../impl/services/ContactSensorService.java | 16 -- .../hapjava/impl/services/FanService.java | 25 --- .../impl/services/GarageDoorService.java | 24 --- .../impl/services/HumiditySensorService.java | 16 -- .../impl/services/LeakSensorService.java | 16 -- .../impl/services/LightSensorService.java | 16 -- .../impl/services/LightbulbService.java | 35 ---- .../impl/services/LockMechanismService.java | 22 --- .../impl/services/MotionSensorService.java | 16 -- .../impl/services/OccupancySensorService.java | 16 -- .../hapjava/impl/services/OutletService.java | 23 --- .../impl/services/SecuritySystemService.java | 20 --- .../impl/services/SmokeSensorService.java | 16 -- .../hapjava/impl/services/SwitchService.java | 21 --- .../services/TemperatureSensorService.java | 16 -- .../impl/services/ThermostatService.java | 30 ---- .../hapjava/impl/services/ValveService.java | 40 ----- .../impl/services/WindowCoveringService.java | 59 ------- .../java/io/github/hapjava/package-info.java | 5 - .../hapjava/{ => server}/HomekitAuthInfo.java | 3 +- .../{impl => server}/HomekitWebHandler.java | 4 +- .../hapjava/server/impl/HomekitBridge.java | 67 ++++++++ .../{ => server}/impl/HomekitRegistry.java | 10 +- .../{ => server/impl}/HomekitRoot.java | 23 +-- .../{ => server/impl}/HomekitServer.java | 24 ++- .../HomekitStandaloneAccessoryServer.java | 11 +- .../{ => server}/impl/HomekitUtils.java | 2 +- .../impl/connections/ConnectionImpl.java | 18 +- .../HomekitClientConnectionFactoryImpl.java | 14 +- .../impl/connections/HttpSession.java | 32 ++-- .../LengthPrefixedByteArrayProcessor.java | 2 +- .../impl/connections/PendingNotification.java | 2 +- .../impl/connections/SubscriptionManager.java | 8 +- .../impl/crypto/ChachaDecoder.java | 2 +- .../impl/crypto/ChachaEncoder.java | 2 +- .../{ => server}/impl/crypto/EdsaSigner.java | 2 +- .../impl/crypto/EdsaVerifier.java | 2 +- .../impl/crypto/PolyKeyCreator.java | 2 +- .../impl/http/HomekitClientConnection.java | 2 +- .../http/HomekitClientConnectionFactory.java | 2 +- .../{ => server}/impl/http/HttpMethod.java | 2 +- .../{ => server}/impl/http/HttpRequest.java | 2 +- .../{ => server}/impl/http/HttpResponse.java | 2 +- .../impl/http/impl/AccessoryHandler.java | 8 +- .../impl/http/impl/BinaryHandler.java | 4 +- .../http/impl/DefaultHttpRequestImpl.java | 6 +- .../http/impl/FullRequestHttpRequestImpl.java | 2 +- .../impl/http/impl/HomekitHttpServer.java | 6 +- .../impl/HttpResponseEncoderAggregate.java | 2 +- .../impl/http/impl/LoggingHandler.java | 2 +- .../http/impl/NettyHomekitHttpService.java | 4 +- .../impl/http/impl/NettyResponseUtil.java | 4 +- .../impl/http/impl/ServerInitializer.java | 4 +- .../impl/jmdns/JmdnsHomekitAdvertiser.java | 2 +- .../impl/json/AccessoryController.java | 10 +- .../impl/json/CharacteristicsController.java | 14 +- .../impl/json/EventController.java | 6 +- .../{ => server}/impl/json/EventResponse.java | 2 +- .../impl/json/HapJsonNoContentResponse.java | 2 +- .../impl/json/HapJsonResponse.java | 4 +- .../{ => server}/impl/pairing/ByteUtils.java | 2 +- .../pairing/ClientEvidenceRoutineImpl.java | 2 +- .../impl/pairing/FinalPairHandler.java | 19 ++- .../impl/pairing/HomekitSRP6Routines.java | 2 +- .../pairing/HomekitSRP6ServerSession.java | 2 +- .../impl/pairing/MessageType.java | 2 +- .../impl/pairing/PairSetupRequest.java | 4 +- .../impl/pairing/PairVerificationManager.java | 27 +-- .../impl/pairing/PairVerificationRequest.java | 4 +- .../impl/pairing/PairingManager.java | 14 +- .../impl/pairing/PairingResponse.java | 4 +- .../impl/pairing/PairingUpdateController.java | 12 +- .../pairing/ServerEvidenceRoutineImpl.java | 2 +- .../{ => server}/impl/pairing/SrpHandler.java | 14 +- .../hapjava/server/impl/pairing/Stage.java | 7 + .../impl/pairing/TypeLengthValueUtils.java | 2 +- .../impl/pairing/UpgradeResponse.java | 2 +- .../impl/responses/ConflictResponse.java | 4 +- .../InternalServerErrorResponse.java | 4 +- .../impl/responses/NotFoundResponse.java | 4 +- .../impl/responses/OkResponse.java | 4 +- .../impl/responses/UnauthorizedResponse.java | 4 +- .../hapjava/{ => services}/Service.java | 2 +- .../services/impl/AbstractServiceImpl.java | 37 ++++ .../impl/AccessoryInformationService.java | 56 +++++++ .../hapjava/services/impl/BatteryService.java | 36 ++++ .../impl/CarbonDioxideSensorService.java | 66 ++++++++ .../impl/CarbonMonoxideSensorService.java | 52 ++++++ .../services/impl/ContactSensorService.java | 41 +++++ .../hapjava/services/impl/DoorService.java | 46 +++++ .../hapjava/services/impl/FanService.java | 53 ++++++ .../impl/GarageDoorOpenerService.java | 50 ++++++ .../services/impl/HumiditySensorService.java | 42 +++++ .../services/impl/LeakSensorService.java | 41 +++++ .../services/impl/LightSensorService.java | 46 +++++ .../services/impl/LightbulbService.java | 47 ++++++ .../services/impl/LockMechanismService.java | 38 +++++ .../services/impl/MotionSensorService.java | 46 +++++ .../services/impl/OccupancySensorService.java | 46 +++++ .../hapjava/services/impl/OutletService.java | 31 ++++ .../services/impl/SecuritySystemService.java | 50 ++++++ .../services/impl/SmokeSensorService.java | 46 +++++ .../hapjava/services/impl/SwitchService.java | 27 +++ .../impl/TemperatureSensorService.java | 47 ++++++ .../services/impl/ThermostatService.java | 78 +++++++++ .../hapjava/services/impl/ValveService.java | 62 +++++++ .../services/impl/WindowCoveringService.java | 80 +++++++++ .../hapjava/services/impl/WindowService.java | 53 ++++++ .../{ => server/impl}/HomekitRootTest.java | 10 +- 345 files changed, 6100 insertions(+), 4241 deletions(-) delete mode 100644 src/main/java/io/github/hapjava/accessories/BatteryStatusAccessory.java rename src/main/java/io/github/hapjava/{impl => }/accessories/Bridge.java (52%) rename src/main/java/io/github/hapjava/accessories/{CarbonDioxideSensor.java => CarbonDioxideSensorAccessory.java} (50%) rename src/main/java/io/github/hapjava/accessories/{CarbonMonoxideSensor.java => CarbonMonoxideSensorAccessory.java} (68%) rename src/main/java/io/github/hapjava/accessories/{ContactSensor.java => ContactSensorAccessory.java} (73%) create mode 100644 src/main/java/io/github/hapjava/accessories/DoorAccessory.java delete mode 100644 src/main/java/io/github/hapjava/accessories/Fan.java create mode 100644 src/main/java/io/github/hapjava/accessories/FanAccessory.java rename src/main/java/io/github/hapjava/accessories/{GarageDoor.java => GarageDoorOpenerAccessory.java} (73%) rename src/main/java/io/github/hapjava/{ => accessories}/HomekitAccessory.java (70%) rename src/main/java/io/github/hapjava/accessories/{HumiditySensor.java => HumiditySensorAccessory.java} (78%) rename src/main/java/io/github/hapjava/accessories/{LeakSensor.java => LeakSensorAccessory.java} (69%) rename src/main/java/io/github/hapjava/accessories/{LightSensor.java => LightSensorAccessory.java} (78%) rename src/main/java/io/github/hapjava/accessories/{Lightbulb.java => LightbulbAccessory.java} (83%) delete mode 100644 src/main/java/io/github/hapjava/accessories/LockMechanism.java create mode 100644 src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java delete mode 100644 src/main/java/io/github/hapjava/accessories/LockableLockMechanism.java rename src/main/java/io/github/hapjava/accessories/{MotionSensor.java => MotionSensorAccessory.java} (77%) rename src/main/java/io/github/hapjava/accessories/{OccupancySensor.java => OccupancySensorAccessory.java} (68%) rename src/main/java/io/github/hapjava/accessories/{Outlet.java => OutletAccessory.java} (88%) rename src/main/java/io/github/hapjava/accessories/{SecuritySystem.java => SecuritySystemAccessory.java} (59%) rename src/main/java/io/github/hapjava/accessories/{SmokeSensor.java => SmokeSensorAccessory.java} (69%) rename src/main/java/io/github/hapjava/accessories/{Switch.java => SwitchAccessory.java} (82%) delete mode 100644 src/main/java/io/github/hapjava/accessories/TemperatureSensor.java create mode 100644 src/main/java/io/github/hapjava/accessories/TemperatureSensorAccessory.java delete mode 100644 src/main/java/io/github/hapjava/accessories/Thermostat.java create mode 100644 src/main/java/io/github/hapjava/accessories/ThermostatAccessory.java rename src/main/java/io/github/hapjava/accessories/{Valve.java => ValveAccessory.java} (78%) create mode 100644 src/main/java/io/github/hapjava/accessories/WindowAccessory.java delete mode 100644 src/main/java/io/github/hapjava/accessories/WindowCovering.java rename src/main/java/io/github/hapjava/accessories/{BasicWindowCovering.java => WindowCoveringAccessory.java} (81%) rename src/main/java/io/github/hapjava/accessories/{DimmableLightbulb.java => optionalcharacteristic/AccessoryWithBrightness.java} (81%) create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonDioxideLevel.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonMonoxideLevel.java rename src/main/java/io/github/hapjava/accessories/{ColorfulLightbulb.java => optionalcharacteristic/AccessoryWithColor.java} (85%) rename src/main/java/io/github/hapjava/accessories/{thermostat/CoolingThermostat.java => optionalcharacteristic/AccessoryWithCoolingThresholdTemprature.java} (82%) rename src/main/java/io/github/hapjava/accessories/{ValveWithTimer.java => optionalcharacteristic/AccessoryWithDuration.java} (55%) create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHardwareRevision.java rename src/main/java/io/github/hapjava/accessories/{thermostat/HeatingThermostat.java => optionalcharacteristic/AccessoryWithHearingThresholdTemprature.java} (82%) rename src/main/java/io/github/hapjava/accessories/{HoldPositionWindowCovering.java => optionalcharacteristic/AccessoryWithHoldPosition.java} (71%) rename src/main/java/io/github/hapjava/accessories/{HorizontalTiltingWindowCovering.java => optionalcharacteristic/AccessoryWithHorizontalTilting.java} (86%) rename src/main/java/io/github/hapjava/accessories/{ObstructionDetectedWindowCovering.java => optionalcharacteristic/AccessoryWithObstructionDetection.java} (66%) create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRemainingDuration.java rename src/main/java/io/github/hapjava/accessories/{VerticalTiltingWindowCovering.java => optionalcharacteristic/AccessoryWithVerticalTilting.java} (83%) delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/CarbonDioxideDetectedState.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/CarbonMonoxideDetectedState.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/ContactState.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/CurrentSecuritySystemState.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/DoorState.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/LockMechanismState.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/RotationDirection.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/SecuritySystemAlarmType.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/SmokeDetectedState.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/TargetSecuritySystemState.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/TemperatureUnit.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/ThermostatMode.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/ValveType.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/WindowCoveringPositionState.java delete mode 100644 src/main/java/io/github/hapjava/accessories/properties/package-info.java delete mode 100644 src/main/java/io/github/hapjava/accessories/thermostat/BasicThermostat.java delete mode 100644 src/main/java/io/github/hapjava/characteristics/BooleanCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/CharacteristicEnum.java rename src/main/java/io/github/hapjava/{impl => characteristics}/ExceptionalConsumer.java (65%) rename src/main/java/io/github/hapjava/{ => characteristics}/HomekitCharacteristicChangeCallback.java (86%) delete mode 100644 src/main/java/io/github/hapjava/characteristics/WriteOnlyBooleanCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/FirmwareRevisionCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/HardwareRevisionCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/NameCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java rename src/main/java/io/github/hapjava/characteristics/{ => impl/base}/BaseCharacteristic.java (80%) create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java rename src/main/java/io/github/hapjava/characteristics/{ => impl/base}/EnumCharacteristic.java (56%) rename src/main/java/io/github/hapjava/characteristics/{ => impl/base}/FloatCharacteristic.java (74%) rename src/main/java/io/github/hapjava/characteristics/{ => impl/base}/IntegerCharacteristic.java (56%) rename src/main/java/io/github/hapjava/characteristics/{ => impl/base}/StaticStringCharacteristic.java (62%) create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/battery/BatteryLevelCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideLevelCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ActiveEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/InUseEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/OnCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelIndexCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/RotationSpeedCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/lightbulb/BrightnessCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/lightbulb/HueCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/lightbulb/SaturationCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/motionsensor/MotionDetectedCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/valve/RemainingDurationCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/valve/SetDurationCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentPositionCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetPositionCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/HomekitBridge.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/carbonmonoxide/CarbonMonoxideDetectedCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/common/ActiveCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/common/BatteryLevelCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/common/InUseCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/common/LowBatteryStatusCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/common/Name.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/common/ObstructionDetectedCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/common/PowerStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/common/RemainingDurationCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/contactsensor/ContactSensorStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/fan/RotationDirectionCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/fan/RotationSpeedCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/garage/CurrentDoorStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/garage/TargetDoorStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/humiditysensor/CurrentRelativeHumidityCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/information/Identify.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/information/Manufacturer.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/information/Model.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/information/SerialNumber.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/leaksensor/LeakDetectedStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/light/AmbientLightLevelCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/lightbulb/BrightnessCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/lightbulb/HueCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/lightbulb/SaturationCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/lock/mechanism/CurrentLockMechanismStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/lock/mechanism/TargetLockMechanismStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/motionsensor/MotionDetectedStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/occupancysensor/OccupancyDetectedStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/outlet/OutletInUseCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/securitysystem/CurrentSecuritySystemStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/securitysystem/SecuritySystemAlarmTypeCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/securitysystem/TargetSecuritySystemStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/smokesensor/SmokeDetectedCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/thermostat/AbstractHeatingCoolingModeCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/thermostat/AbstractTemperatureCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/thermostat/CoolingThresholdTemperatureCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/thermostat/CurrentHeatingCoolingModeCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/thermostat/CurrentTemperatureCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/thermostat/HeatingThresholdTemperatureCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/thermostat/TargetHeatingCoolingModeCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/thermostat/TargetTemperatureCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/thermostat/TemperatureUnitsCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/valve/SetDurationCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/valve/ValveTypeCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentPositionCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentVerticalTiltAngleCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/windowcovering/HoldPositionCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/windowcovering/PositionStateCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetHorizontalTiltAngleCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetPositionCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetVerticalTiltAngleCharacteristic.java delete mode 100644 src/main/java/io/github/hapjava/impl/pairing/Stage.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/AbstractServiceImpl.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/AccessoryInformationService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/CarbonMonoxideSensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/ContactSensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/FanService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/GarageDoorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/HumiditySensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/LeakSensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/LightSensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/LightbulbService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/LockMechanismService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/MotionSensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/OccupancySensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/OutletService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/SecuritySystemService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/SmokeSensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/SwitchService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/TemperatureSensorService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/ThermostatService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/ValveService.java delete mode 100644 src/main/java/io/github/hapjava/impl/services/WindowCoveringService.java delete mode 100644 src/main/java/io/github/hapjava/package-info.java rename src/main/java/io/github/hapjava/{ => server}/HomekitAuthInfo.java (97%) rename src/main/java/io/github/hapjava/{impl => server}/HomekitWebHandler.java (67%) create mode 100644 src/main/java/io/github/hapjava/server/impl/HomekitBridge.java rename src/main/java/io/github/hapjava/{ => server}/impl/HomekitRegistry.java (92%) rename src/main/java/io/github/hapjava/{ => server/impl}/HomekitRoot.java (89%) rename src/main/java/io/github/hapjava/{ => server/impl}/HomekitServer.java (88%) rename src/main/java/io/github/hapjava/{ => server/impl}/HomekitStandaloneAccessoryServer.java (67%) rename src/main/java/io/github/hapjava/{ => server}/impl/HomekitUtils.java (98%) rename src/main/java/io/github/hapjava/{ => server}/impl/connections/ConnectionImpl.java (88%) rename src/main/java/io/github/hapjava/{ => server}/impl/connections/HomekitClientConnectionFactoryImpl.java (67%) rename src/main/java/io/github/hapjava/{ => server}/impl/connections/HttpSession.java (84%) rename src/main/java/io/github/hapjava/{ => server}/impl/connections/LengthPrefixedByteArrayProcessor.java (98%) rename src/main/java/io/github/hapjava/{ => server}/impl/connections/PendingNotification.java (87%) rename src/main/java/io/github/hapjava/{ => server}/impl/connections/SubscriptionManager.java (95%) rename src/main/java/io/github/hapjava/{ => server}/impl/crypto/ChachaDecoder.java (97%) rename src/main/java/io/github/hapjava/{ => server}/impl/crypto/ChachaEncoder.java (97%) rename src/main/java/io/github/hapjava/{ => server}/impl/crypto/EdsaSigner.java (96%) rename src/main/java/io/github/hapjava/{ => server}/impl/crypto/EdsaVerifier.java (95%) rename src/main/java/io/github/hapjava/{ => server}/impl/crypto/PolyKeyCreator.java (96%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/HomekitClientConnection.java (87%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/HomekitClientConnectionFactory.java (80%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/HttpMethod.java (52%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/HttpRequest.java (69%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/HttpResponse.java (91%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/AccessoryHandler.java (93%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/BinaryHandler.java (94%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/DefaultHttpRequestImpl.java (85%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/FullRequestHttpRequestImpl.java (90%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/HomekitHttpServer.java (85%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/HttpResponseEncoderAggregate.java (92%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/LoggingHandler.java (97%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/NettyHomekitHttpService.java (96%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/NettyResponseUtil.java (92%) rename src/main/java/io/github/hapjava/{ => server}/impl/http/impl/ServerInitializer.java (92%) rename src/main/java/io/github/hapjava/{ => server}/impl/jmdns/JmdnsHomekitAdvertiser.java (98%) rename src/main/java/io/github/hapjava/{ => server}/impl/json/AccessoryController.java (93%) rename src/main/java/io/github/hapjava/{ => server}/impl/json/CharacteristicsController.java (90%) rename src/main/java/io/github/hapjava/{ => server}/impl/json/EventController.java (91%) rename src/main/java/io/github/hapjava/{ => server}/impl/json/EventResponse.java (82%) rename src/main/java/io/github/hapjava/{ => server}/impl/json/HapJsonNoContentResponse.java (81%) rename src/main/java/io/github/hapjava/{ => server}/impl/json/HapJsonResponse.java (84%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/ByteUtils.java (95%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/ClientEvidenceRoutineImpl.java (97%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/FinalPairHandler.java (85%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/HomekitSRP6Routines.java (97%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/HomekitSRP6ServerSession.java (99%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/MessageType.java (87%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/PairSetupRequest.java (94%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/PairVerificationManager.java (84%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/PairVerificationRequest.java (92%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/PairingManager.java (83%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/PairingResponse.java (84%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/PairingUpdateController.java (77%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/ServerEvidenceRoutineImpl.java (95%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/SrpHandler.java (89%) create mode 100644 src/main/java/io/github/hapjava/server/impl/pairing/Stage.java rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/TypeLengthValueUtils.java (98%) rename src/main/java/io/github/hapjava/{ => server}/impl/pairing/UpgradeResponse.java (91%) rename src/main/java/io/github/hapjava/{ => server}/impl/responses/ConflictResponse.java (54%) rename src/main/java/io/github/hapjava/{ => server}/impl/responses/InternalServerErrorResponse.java (82%) rename src/main/java/io/github/hapjava/{ => server}/impl/responses/NotFoundResponse.java (54%) rename src/main/java/io/github/hapjava/{ => server}/impl/responses/OkResponse.java (75%) rename src/main/java/io/github/hapjava/{ => server}/impl/responses/UnauthorizedResponse.java (54%) rename src/main/java/io/github/hapjava/{ => services}/Service.java (96%) create mode 100644 src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java create mode 100644 src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/BatteryService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/ContactSensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/DoorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/FanService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/LeakSensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/LightSensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/LightbulbService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/LockMechanismService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/MotionSensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/OutletService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/SwitchService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/ThermostatService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/ValveService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/WindowService.java rename src/test/java/io/github/hapjava/{ => server/impl}/HomekitRootTest.java (89%) diff --git a/pom.xml b/pom.xml index d5709647c..bc523c756 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ hap hap-java Homekit Accessory Protocol for Java - 1.2.0-snapshot + 2.0.0-snapshot jar https://github.com/hap-java/HAP-Java @@ -165,7 +165,7 @@ maven-javadoc-plugin 3.0.1 - io.github.hapjava.impl + io.github.hapjava.server.impl @@ -272,7 +272,7 @@ maven-javadoc-plugin 3.0.1 - io.github.hapjava.impl + io.github.hapjava.server.impl diff --git a/src/main/java/io/github/hapjava/accessories/BatteryAccessory.java b/src/main/java/io/github/hapjava/accessories/BatteryAccessory.java index 88c424a32..d3724bc50 100644 --- a/src/main/java/io/github/hapjava/accessories/BatteryAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/BatteryAccessory.java @@ -1,30 +1,74 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.battery.ChargingStateEnum; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.BatteryService; +import java.util.Collection; +import java.util.Collections; import java.util.concurrent.CompletableFuture; /** - * Do not use. Devices that have battery levels should implement LowBatteryStatusAccessory. + * Devices with battery . * * @author Gaston Dombiak */ -@Deprecated -public interface BatteryAccessory { +public interface BatteryAccessory extends HomekitAccessory { /** * Retrieves the battery level of the accessory. * * @return a future that will contain the accessory's battery state */ - CompletableFuture getBatteryLevelState(); + CompletableFuture getBatteryLevel(); + + /** + * Queries if the device battery level is low; returning a value of true will cause a low-battery + * status to appear in Home for the device. + * + * @return a future that will contain the accessory's low battery state + */ + CompletableFuture getLowBatteryState(); + + /** + * Retriece the battery charging state. + * + * @return a future that will contain the battery charging state + */ + CompletableFuture getChargingState(); /** * Subscribes to changes in the battery level. * * @param callback the function to call when battery level changes. */ - void subscribeBatteryLevelState(HomekitCharacteristicChangeCallback callback); + void subscribeBatteryLevel(HomekitCharacteristicChangeCallback callback); + /** + * Subscribes to changes in the battery level. + * + * @param callback the function to call when low battery state changes. + */ + void subscribeLowBatteryState(HomekitCharacteristicChangeCallback callback); + + /** + * Subscribes to changes in the battery level. + * + * @param callback the function to call when low battery state changes. + */ + void subscribeBatteryChargingState(HomekitCharacteristicChangeCallback callback); /** Unsubscribes from changes in the battery level. */ - void unsubscribeBatteryLevelState(); + void unsubscribeBatteryLevel(); + + /** Unsubscribes from changes in the low battery state. */ + void unsubscribeLowBatteryState(); + + /** Unsubscribes from changes in the low battery state. */ + void unsubscribeBatteryChargingState(); + + @Override + default Collection getServices() { + return Collections.singleton(new BatteryService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/BatteryStatusAccessory.java b/src/main/java/io/github/hapjava/accessories/BatteryStatusAccessory.java deleted file mode 100644 index b8c6ba201..000000000 --- a/src/main/java/io/github/hapjava/accessories/BatteryStatusAccessory.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.github.hapjava.accessories; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import java.util.concurrent.CompletableFuture; - -/** - * An accessory that runs on batteries. Accessories that run on batteries are able to report battery - * level. - * - * @author Tim Harper - */ -public interface BatteryStatusAccessory { - - /** - * Queries if the device battery level is low; returning a value of true will cause a low-battery - * status to appear in Home for the device. - * - * @return a future that will contain the accessory's low battery state - */ - CompletableFuture getLowBatteryState(); - - /** - * Subscribes to changes in the battery level. - * - * @param callback the function to call when low battery state changes. - */ - void subscribeLowBatteryState(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the low battery state. */ - void unsubscribeLowBatteryState(); -} diff --git a/src/main/java/io/github/hapjava/impl/accessories/Bridge.java b/src/main/java/io/github/hapjava/accessories/Bridge.java similarity index 52% rename from src/main/java/io/github/hapjava/impl/accessories/Bridge.java rename to src/main/java/io/github/hapjava/accessories/Bridge.java index 024693823..2c71c09df 100644 --- a/src/main/java/io/github/hapjava/impl/accessories/Bridge.java +++ b/src/main/java/io/github/hapjava/accessories/Bridge.java @@ -1,6 +1,4 @@ -package io.github.hapjava.impl.accessories; - -import io.github.hapjava.HomekitAccessory; +package io.github.hapjava.accessories; public interface Bridge extends HomekitAccessory { diff --git a/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java b/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensorAccessory.java similarity index 50% rename from src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java rename to src/main/java/io/github/hapjava/accessories/CarbonDioxideSensorAccessory.java index 27c332471..0bd56c4ee 100644 --- a/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java +++ b/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensorAccessory.java @@ -1,10 +1,9 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.accessories.properties.CarbonDioxideDetectedState; -import io.github.hapjava.impl.services.CarbonDioxideSensorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.carbondioxidesensor.CarbonDioxideDetectedEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.CarbonDioxideSensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -13,23 +12,18 @@ * A carbon dioxide sensor reports whether carbon dioxide has been detected or not. * *

Carbon dioxide sensors that run on batteries will need to implement this interface and also - * implement {@link BatteryStatusAccessory}. + * implement {@link BatteryAccessory}. * * @author Eugen Freiter */ -public interface CarbonDioxideSensor extends HomekitAccessory { +public interface CarbonDioxideSensorAccessory extends HomekitAccessory { /** * Retrieves the state of the sensor that indicates if carbon dioxide has been detected. * * @return a future that will contain the carbon dioxide sensor's state */ - CompletableFuture getCarbonDioxideDetectedState(); - - @Override - default Collection getServices() { - return Collections.singleton(new CarbonDioxideSensorService(this)); - } + CompletableFuture getCarbonDioxideDetectedState(); /** * Subscribes to changes in the carbon dioxide's state. @@ -38,23 +32,11 @@ default Collection getServices() { */ void subscribeCarbonDioxideDetectedState(HomekitCharacteristicChangeCallback callback); - /** - * Retrieves the carbon dioxide level - * - * @return a future that will contain the carbon dioxide level as a value between 0 and 100000 - */ - CompletableFuture getCarbonDioxideLevel(); - /** Unsubscribes from changes in the carbon dioxide's state. */ void unsubscribeCarbonDioxideDetectedState(); - /** - * Subscribes to changes in the carbon dioxide level. - * - * @param callback the function to call when the state changes. - */ - void subscribeCarbonDioxideLevel(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the carbon dioxide level. */ - void unsubscribeCarbonDioxideLevel(); + @Override + default Collection getServices() { + return Collections.singleton(new CarbonDioxideSensorService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensor.java b/src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensorAccessory.java similarity index 68% rename from src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensor.java rename to src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensorAccessory.java index fd9ed9fef..9bb23f727 100644 --- a/src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensor.java +++ b/src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensorAccessory.java @@ -1,10 +1,9 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.accessories.properties.CarbonMonoxideDetectedState; -import io.github.hapjava.impl.services.CarbonMonoxideSensorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.carbonmonoxidesensor.CarbonMonoxideDetectedEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.CarbonMonoxideSensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -13,23 +12,18 @@ * A carbon monoxide sensor reports whether carbon monoxide has been detected or not. * *

Carbon monoxide sensors that run on batteries will need to implement this interface and also - * implement {@link BatteryStatusAccessory}. + * implement {@link BatteryAccessory}. * * @author Gaston Dombiak */ -public interface CarbonMonoxideSensor extends HomekitAccessory { +public interface CarbonMonoxideSensorAccessory extends HomekitAccessory { /** * Retrieves the state of the sensor that indicates if carbon monoxide has been detected. * * @return a future that will contain the carbon monoxide sensor's state */ - CompletableFuture getCarbonMonoxideDetectedState(); - - @Override - default Collection getServices() { - return Collections.singleton(new CarbonMonoxideSensorService(this)); - } + CompletableFuture getCarbonMonoxideDetectedState(); /** * Subscribes to changes in the carbon monoxide's state. @@ -40,4 +34,9 @@ default Collection getServices() { /** Unsubscribes from changes in the carbon monoxide's state. */ void unsubscribeCarbonMonoxideDetectedState(); + + @Override + default Collection getServices() { + return Collections.singleton(new CarbonMonoxideSensorService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/ContactSensor.java b/src/main/java/io/github/hapjava/accessories/ContactSensorAccessory.java similarity index 73% rename from src/main/java/io/github/hapjava/accessories/ContactSensor.java rename to src/main/java/io/github/hapjava/accessories/ContactSensorAccessory.java index af85760db..61db18768 100644 --- a/src/main/java/io/github/hapjava/accessories/ContactSensor.java +++ b/src/main/java/io/github/hapjava/accessories/ContactSensorAccessory.java @@ -1,10 +1,9 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.accessories.properties.ContactState; -import io.github.hapjava.impl.services.ContactSensorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.contactsensor.ContactStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.ContactSensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -14,11 +13,11 @@ * window/door sensors. When contact is detected it means that the door/window is closed. * *

Contact sensors that run on batteries will need to implement this interface and also implement - * {@link BatteryStatusAccessory}. + * {@link BatteryAccessory}. * * @author Gaston Dombiak */ -public interface ContactSensor extends HomekitAccessory { +public interface ContactSensorAccessory extends HomekitAccessory { /** * Retrieves the state of the contact. This is whether the contact is detected or not. Detected @@ -26,12 +25,7 @@ public interface ContactSensor extends HomekitAccessory { * * @return a future that will contain the contact's state */ - CompletableFuture getCurrentState(); - - @Override - default Collection getServices() { - return Collections.singleton(new ContactSensorService(this)); - } + CompletableFuture getCurrentState(); /** * Subscribes to changes in the contact state. @@ -42,4 +36,9 @@ default Collection getServices() { /** Unsubscribes from changes in the contact state. */ void unsubscribeContactState(); + + @Override + default Collection getServices() { + return Collections.singleton(new ContactSensorService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/DoorAccessory.java b/src/main/java/io/github/hapjava/accessories/DoorAccessory.java new file mode 100644 index 000000000..dbd7b3b7e --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/DoorAccessory.java @@ -0,0 +1,82 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.windowcovering.PositionStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.DoorService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * A door with status + * + * @author Eugen Freiter + */ +public interface DoorAccessory extends HomekitAccessory { + + /** + * Retrieves the position state of the door + * + * @return a future which will contain the door's position state + */ + CompletableFuture getPositionState(); + + /** + * Retrieves the current position of the door + * + * @return a future which will contain the door's current position + */ + CompletableFuture getCurrentPosition(); + + /** + * Retrieves the target position of the door + * + * @return a future which will contain the door's target position + */ + CompletableFuture getTargetPosition(); + + /** + * Sets the targeted state of the door. + * + * @param position the targeted position + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setTargetPosition(Integer position) throws Exception; + + /** + * Subscribes to changes in the door's position state + * + * @param callback the function to call when the state changes + */ + void subscribePositionState(HomekitCharacteristicChangeCallback callback); + + /** + * Subscribes to changes in the door's current position + * + * @param callback the function to call when the current position changes + */ + void subscribeCurrentPosition(HomekitCharacteristicChangeCallback callback); + + /** + * Subscribes to changes in the door's target position + * + * @param callback the function to call when the target position changes + */ + void subscribeTargetPosition(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the door's state */ + void unsubscribePositionState(); + + /** Unsubscribes from changes in the door's current position */ + void unsubscribeCurrentPosition(); + + /** Unsubscribes from changes in the door's target position */ + void unsubscribeTargetPosition(); + + @Override + default Collection getServices() { + return Collections.singleton(new DoorService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/Fan.java b/src/main/java/io/github/hapjava/accessories/Fan.java deleted file mode 100644 index 9d5ac4276..000000000 --- a/src/main/java/io/github/hapjava/accessories/Fan.java +++ /dev/null @@ -1,99 +0,0 @@ -package io.github.hapjava.accessories; - -import io.github.hapjava.*; -import io.github.hapjava.accessories.properties.RotationDirection; -import io.github.hapjava.impl.services.FanService; -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.CompletableFuture; - -/** - * A fan, with power and rotational characteristics. - * - * @author Andy Lintner - */ -public interface Fan extends HomekitAccessory { - - /** - * Retrieves the current binary state of the fan's power. - * - * @return a future that will contain the binary state - */ - CompletableFuture getFanPower(); - - /** - * Retrieves the current rotation direction of the fan. - * - * @return a future that will contain the direction - */ - CompletableFuture getRotationDirection(); - - /** - * Retrieves the current speed of the fan's rotation - * - * @return a future that will contain the speed, expressed as an integer between 0 and 100. - */ - CompletableFuture getRotationSpeed(); - - /** - * Sets the binary state of the fan's power - * - * @param state the binary state to set - * @return a future that completes when the change is made - * @throws Exception when the change cannot be made - */ - CompletableFuture setFanPower(boolean state) throws Exception; - - /** - * Sets the rotation direction of the fan - * - * @param direction the direction to set - * @return a future that completes when the change is made - * @throws Exception when the change cannot be made - */ - CompletableFuture setRotationDirection(RotationDirection direction) throws Exception; - - /** - * Sets the speed of the fan's rotation - * - * @param speed the speed to set, expressed as an integer between 0 and 100. - * @return a future that completes when the change is made - * @throws Exception when the change cannot be made - */ - CompletableFuture setRotationSpeed(Integer speed) throws Exception; - - @Override - default Collection getServices() { - return Collections.singleton(new FanService(this)); - } - - /** - * Subscribes to changes in the binary state of the fan's power. - * - * @param callback the function to call when the state changes. - */ - void subscribeFanPower(HomekitCharacteristicChangeCallback callback); - - /** - * Subscribes to changes in the rotation direction of the fan. - * - * @param callback the function to call when the direction changes. - */ - void subscribeRotationDirection(HomekitCharacteristicChangeCallback callback); - - /** - * Subscribes to changes in the rotation speed of the fan. - * - * @param callback the function to call when the speed changes. - */ - void subscribeRotationSpeed(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the binary state of the fan's power. */ - void unsubscribeFanPower(); - - /** Unsubscribes from changes in the rotation direction of the fan. */ - void unsubscribeRotationDirection(); - - /** Unsubscribes from changes in the fan's rotation speed. */ - void unsubscribeRotationSpeed(); -} diff --git a/src/main/java/io/github/hapjava/accessories/FanAccessory.java b/src/main/java/io/github/hapjava/accessories/FanAccessory.java new file mode 100644 index 000000000..5b1bb3ac6 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/FanAccessory.java @@ -0,0 +1,48 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithFanState; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.FanService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * A fan with basic characteristics. User {@link AccessoryWithFanState} for Fan with more + * characteristics. + * + * @author Andy Lintner + */ +public interface FanAccessory extends HomekitAccessory { + /** + * Mandatory: Retrieves the current active state of the fan'. + * + * @return a future that will contain the binary state + */ + CompletableFuture isActive(); + + /** + * Sets the active state of the fan + * + * @param state the binary state to set + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setActive(boolean state) throws Exception; + + /** + * Subscribes to changes in the active state of the fan. + * + * @param callback the function to call when the direction changes. + */ + void subscribeActive(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the active state of the fan. */ + void unsubscribeActive(); + + @Override + default Collection getServices() { + return Collections.singleton(new FanService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/GarageDoor.java b/src/main/java/io/github/hapjava/accessories/GarageDoorOpenerAccessory.java similarity index 73% rename from src/main/java/io/github/hapjava/accessories/GarageDoor.java rename to src/main/java/io/github/hapjava/accessories/GarageDoorOpenerAccessory.java index d94c1d071..f012d4ca6 100644 --- a/src/main/java/io/github/hapjava/accessories/GarageDoor.java +++ b/src/main/java/io/github/hapjava/accessories/GarageDoorOpenerAccessory.java @@ -1,8 +1,10 @@ package io.github.hapjava.accessories; -import io.github.hapjava.*; -import io.github.hapjava.accessories.properties.DoorState; -import io.github.hapjava.impl.services.GarageDoorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.garagedoor.CurrentDoorStateEnum; +import io.github.hapjava.characteristics.impl.garagedoor.TargetDoorStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.GarageDoorOpenerService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -12,21 +14,21 @@ * * @author Andy Lintner */ -public interface GarageDoor extends HomekitAccessory { +public interface GarageDoorOpenerAccessory extends HomekitAccessory { /** * Retrieves the current state of the door * * @return a future which will contain the door's state */ - CompletableFuture getCurrentDoorState(); + CompletableFuture getCurrentDoorState(); /** * Retrieves the targeted state of the door * * @return a future which will contain the door's targeted state */ - CompletableFuture getTargetDoorState(); + CompletableFuture getTargetDoorState(); /** * Retrieves an indicator of an obstruction detected by the door @@ -42,7 +44,7 @@ public interface GarageDoor extends HomekitAccessory { * @return a future that completes when the change is made * @throws Exception when the change cannot be made */ - CompletableFuture setTargetDoorState(DoorState state) throws Exception; + CompletableFuture setTargetDoorState(TargetDoorStateEnum state) throws Exception; /** * Subscribes to changes in the door's state @@ -76,6 +78,6 @@ public interface GarageDoor extends HomekitAccessory { @Override default Collection getServices() { - return Collections.singleton(new GarageDoorService(this)); + return Collections.singleton(new GarageDoorOpenerService(this)); } } diff --git a/src/main/java/io/github/hapjava/HomekitAccessory.java b/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java similarity index 70% rename from src/main/java/io/github/hapjava/HomekitAccessory.java rename to src/main/java/io/github/hapjava/accessories/HomekitAccessory.java index beb08eac3..adb56a150 100644 --- a/src/main/java/io/github/hapjava/HomekitAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java @@ -1,6 +1,10 @@ -package io.github.hapjava; +package io.github.hapjava.accessories; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.AccessoryInformationService; import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; /** * Base interface for all Homekit Accessories. You can implement this interface directly, but most @@ -21,11 +25,11 @@ public interface HomekitAccessory { int getId(); /** - * Returns a label to display in iOS. + * Returns a name to display in iOS. * * @return the label. */ - String getLabel(); + CompletableFuture getName(); /** * Performs an operation that can be used to identify the accessory. This action can be performed @@ -38,21 +42,28 @@ public interface HomekitAccessory { * * @return the serial number, or null. */ - String getSerialNumber(); + CompletableFuture getSerialNumber(); /** * Returns a model name to display in iOS. * * @return the model name, or null. */ - String getModel(); + CompletableFuture getModel(); /** * Returns a manufacturer to display in iOS. * * @return the manufacturer, or null. */ - String getManufacturer(); + CompletableFuture getManufacturer(); + + /** + * Returns a firmware revision to display in iOS. + * + * @return the firmware revision, or null. + */ + CompletableFuture getFirmwareRevision(); /** * The collection of Services this accessory supports. Services are the primary way to interact @@ -65,5 +76,7 @@ public interface HomekitAccessory { * * @return the collection of services. */ - Collection getServices(); + default Collection getServices() { + return Collections.singleton(new AccessoryInformationService(this)); + }; } diff --git a/src/main/java/io/github/hapjava/accessories/HumiditySensor.java b/src/main/java/io/github/hapjava/accessories/HumiditySensorAccessory.java similarity index 78% rename from src/main/java/io/github/hapjava/accessories/HumiditySensor.java rename to src/main/java/io/github/hapjava/accessories/HumiditySensorAccessory.java index dd7335635..07c24be58 100644 --- a/src/main/java/io/github/hapjava/accessories/HumiditySensor.java +++ b/src/main/java/io/github/hapjava/accessories/HumiditySensorAccessory.java @@ -1,7 +1,8 @@ package io.github.hapjava.accessories; -import io.github.hapjava.*; -import io.github.hapjava.impl.services.HumiditySensorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.HumiditySensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -11,7 +12,7 @@ * * @author Andy Lintner */ -public interface HumiditySensor extends HomekitAccessory { +public interface HumiditySensorAccessory extends HomekitAccessory { /** * Retrieves the current relative humidity. @@ -20,11 +21,6 @@ public interface HumiditySensor extends HomekitAccessory { */ CompletableFuture getCurrentRelativeHumidity(); - @Override - default Collection getServices() { - return Collections.singleton(new HumiditySensorService(this)); - } - /** * Subscribes to changes in the current relative humidity. * @@ -34,4 +30,9 @@ default Collection getServices() { /** Unsubscribes from changes in the current relative humidity. */ void unsubscribeCurrentRelativeHumidity(); + + @Override + default Collection getServices() { + return Collections.singleton(new HumiditySensorService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/LeakSensor.java b/src/main/java/io/github/hapjava/accessories/LeakSensorAccessory.java similarity index 69% rename from src/main/java/io/github/hapjava/accessories/LeakSensor.java rename to src/main/java/io/github/hapjava/accessories/LeakSensorAccessory.java index aad2266e9..04049d8d2 100644 --- a/src/main/java/io/github/hapjava/accessories/LeakSensor.java +++ b/src/main/java/io/github/hapjava/accessories/LeakSensorAccessory.java @@ -1,9 +1,9 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.impl.services.LeakSensorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.leaksensor.LeakDetectedStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.LeakSensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -12,23 +12,18 @@ * A leak sensor that reports whether a leak has been detected. * *

Leak sensors that run on batteries will need to implement this interface and also implement - * {@link BatteryStatusAccessory}. + * {@link BatteryAccessory}. * * @author Tim Harper */ -public interface LeakSensor extends HomekitAccessory { +public interface LeakSensorAccessory extends HomekitAccessory { /** * Retrieves the state of the leak sensor. If true then leak has been detected. * * @return a future that will contain the leak sensor's state */ - CompletableFuture getLeakDetected(); - - @Override - default Collection getServices() { - return Collections.singleton(new LeakSensorService(this)); - } + CompletableFuture getLeakDetected(); /** * Subscribes to changes in the leak sensor. @@ -39,4 +34,9 @@ default Collection getServices() { /** Unsubscribes from changes in the leak sensor. */ void unsubscribeLeakDetected(); + + @Override + default Collection getServices() { + return Collections.singleton(new LeakSensorService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/LightSensor.java b/src/main/java/io/github/hapjava/accessories/LightSensorAccessory.java similarity index 78% rename from src/main/java/io/github/hapjava/accessories/LightSensor.java rename to src/main/java/io/github/hapjava/accessories/LightSensorAccessory.java index 12b2e05d3..bcdab09c4 100644 --- a/src/main/java/io/github/hapjava/accessories/LightSensor.java +++ b/src/main/java/io/github/hapjava/accessories/LightSensorAccessory.java @@ -1,9 +1,8 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.impl.services.LightSensorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.LightSensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -13,7 +12,7 @@ * * @author Gaston Dombiak */ -public interface LightSensor extends HomekitAccessory { +public interface LightSensorAccessory extends HomekitAccessory { /** * Retrieves the current ambient light level. @@ -22,11 +21,6 @@ public interface LightSensor extends HomekitAccessory { */ CompletableFuture getCurrentAmbientLightLevel(); - @Override - default Collection getServices() { - return Collections.singleton(new LightSensorService(this)); - } - /** * Subscribes to changes in the current ambient light level. * @@ -36,4 +30,9 @@ default Collection getServices() { /** Unsubscribes from changes in the current ambient light level. */ void unsubscribeCurrentAmbientLightLevel(); + + @Override + default Collection getServices() { + return Collections.singleton(new LightSensorService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/Lightbulb.java b/src/main/java/io/github/hapjava/accessories/LightbulbAccessory.java similarity index 83% rename from src/main/java/io/github/hapjava/accessories/Lightbulb.java rename to src/main/java/io/github/hapjava/accessories/LightbulbAccessory.java index c39b659eb..8a6caaed8 100644 --- a/src/main/java/io/github/hapjava/accessories/Lightbulb.java +++ b/src/main/java/io/github/hapjava/accessories/LightbulbAccessory.java @@ -1,7 +1,8 @@ package io.github.hapjava.accessories; -import io.github.hapjava.*; -import io.github.hapjava.impl.services.LightbulbService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.LightbulbService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -11,7 +12,7 @@ * * @author Andy Lintner */ -public interface Lightbulb extends HomekitAccessory { +public interface LightbulbAccessory extends HomekitAccessory { /** * Retrieves the current binary state of the light. @@ -29,11 +30,6 @@ public interface Lightbulb extends HomekitAccessory { */ CompletableFuture setLightbulbPowerState(boolean powerState) throws Exception; - @Override - default Collection getServices() { - return Collections.singleton(new LightbulbService(this)); - } - /** * Subscribes to changes in the binary state of the light. * @@ -43,4 +39,9 @@ default Collection getServices() { /** Unsubscribes from changes in the binary state of the light. */ void unsubscribeLightbulbPowerState(); + + @Override + default Collection getServices() { + return Collections.singleton(new LightbulbService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/LockMechanism.java b/src/main/java/io/github/hapjava/accessories/LockMechanism.java deleted file mode 100644 index f1eb051e7..000000000 --- a/src/main/java/io/github/hapjava/accessories/LockMechanism.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.github.hapjava.accessories; - -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.accessories.properties.LockMechanismState; -import io.github.hapjava.impl.services.LockMechanismService; -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.CompletableFuture; - -/** - * A lock capable of exposing its binary locked state. For a lock that can be locked/unlocked, use - * {@link LockableLockMechanism}. - * - *

Locks that run on batteries will need to implement this interface and also implement {@link - * BatteryStatusAccessory}. - * - * @author Andy Lintner - */ -public interface LockMechanism extends HomekitAccessory { - - /** - * Retrieves the current binary state of the lock. - * - * @return a future that will contain the binary state. - */ - CompletableFuture getCurrentMechanismState(); - - /** - * Subscribes to changes in the binary state of the lock. - * - * @param callback the function to call when the state changes. - */ - void subscribeCurrentMechanismState(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the binary state of the lock. */ - void unsubscribeCurrentMechanismState(); - - @Override - default Collection getServices() { - return Collections.singleton(new LockMechanismService(this)); - } -} diff --git a/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java b/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java new file mode 100644 index 000000000..d38838558 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java @@ -0,0 +1,64 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.lock.LockCurrentStateEnum; +import io.github.hapjava.characteristics.impl.lock.LockTargetStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.LockMechanismService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * Lock mechanism + * + * @author Eugen Freiter + */ +public interface LockMechanismAccessory extends HomekitAccessory { + + /** + * Retrieves the lock current state. + * + * @return a future that will contain the lock current state . + */ + CompletableFuture getLockCurrentState(); + + /** + * Retrieves the lock trget state. + * + * @return a future that will contain the lock target state . + */ + CompletableFuture getLockTargetState(); + + /** + * set lock target state the lock trget state. + * + * @param state lock target state + */ + CompletableFuture setLockTargetState(LockTargetStateEnum state); + + /** + * Subscribes to changes in the lock current state. + * + * @param callback the function to call when the state changes. + */ + void subscribeLockCurrentState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in lock current state. */ + void unsubscribeLockCurrentState(); + + /** + * Subscribes to changes in the lock target state. + * + * @param callback the function to call when the state changes. + */ + void subscribeLockTargetState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in lock target state. */ + void unsubscribeLockTargetState(); + + @Override + default Collection getServices() { + return Collections.singleton(new LockMechanismService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/LockableLockMechanism.java b/src/main/java/io/github/hapjava/accessories/LockableLockMechanism.java deleted file mode 100644 index 474c8abd6..000000000 --- a/src/main/java/io/github/hapjava/accessories/LockableLockMechanism.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.accessories; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.properties.LockMechanismState; -import java.util.concurrent.CompletableFuture; - -/** - * Extends {@link LockMechanism} with the ability to lock and unlock the mechanism. - * - * @author Andy Lintner - */ -public interface LockableLockMechanism extends LockMechanism { - - /** - * Sets the binary state of the lock mechanism. - * - * @param state true for a locked mechanism, false for unlocked. - * @throws Exception when the change cannot be made. - */ - void setTargetMechanismState(LockMechanismState state) throws Exception; - - /** - * Retrieves the pending, but not yet completed, state of the lock mechanism. - * - * @return the binary state - */ - CompletableFuture getTargetMechanismState(); - - /** - * Subscribes to changes in the pending, but not yet completed, binary state. - * - * @param callback the function to call when the state changes. - */ - void subscribeTargetMechanismState(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the pending, but not yet completed, binary state. */ - void unsubscribeTargetMechanismState(); -} diff --git a/src/main/java/io/github/hapjava/accessories/MotionSensor.java b/src/main/java/io/github/hapjava/accessories/MotionSensorAccessory.java similarity index 77% rename from src/main/java/io/github/hapjava/accessories/MotionSensor.java rename to src/main/java/io/github/hapjava/accessories/MotionSensorAccessory.java index dc424625b..b8fdedab8 100644 --- a/src/main/java/io/github/hapjava/accessories/MotionSensor.java +++ b/src/main/java/io/github/hapjava/accessories/MotionSensorAccessory.java @@ -1,9 +1,8 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.impl.services.MotionSensorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.MotionSensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -12,11 +11,11 @@ * A motion sensor that reports whether motion has been detected. * *

Motion sensors that run on batteries will need to implement this interface and also implement - * {@link BatteryStatusAccessory}. + * {@link BatteryAccessory}. * * @author Gaston Dombiak */ -public interface MotionSensor extends HomekitAccessory { +public interface MotionSensorAccessory extends HomekitAccessory { /** * Retrieves the state of the motion sensor. If true then motion has been detected. @@ -25,11 +24,6 @@ public interface MotionSensor extends HomekitAccessory { */ CompletableFuture getMotionDetected(); - @Override - default Collection getServices() { - return Collections.singleton(new MotionSensorService(this)); - } - /** * Subscribes to changes in the motion sensor. * @@ -39,4 +33,9 @@ default Collection getServices() { /** Unsubscribes from changes in the motion sensor. */ void unsubscribeMotionDetected(); + + @Override + default Collection getServices() { + return Collections.singleton(new MotionSensorService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/OccupancySensor.java b/src/main/java/io/github/hapjava/accessories/OccupancySensorAccessory.java similarity index 68% rename from src/main/java/io/github/hapjava/accessories/OccupancySensor.java rename to src/main/java/io/github/hapjava/accessories/OccupancySensorAccessory.java index 0148a6f9f..df2f59709 100644 --- a/src/main/java/io/github/hapjava/accessories/OccupancySensor.java +++ b/src/main/java/io/github/hapjava/accessories/OccupancySensorAccessory.java @@ -1,9 +1,9 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.impl.services.OccupancySensorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.occupancysensor.OccupancyDetectedEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.OccupancySensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -12,22 +12,17 @@ * An occupancy sensor that reports whether occupancy has been detected. * *

Occupancy sensors that run on batteries will need to implement this interface and also - * implement {@link BatteryStatusAccessory}. + * implement {@link BatteryAccessory}. * * @author Tim Harper */ -public interface OccupancySensor extends HomekitAccessory { +public interface OccupancySensorAccessory extends HomekitAccessory { /** * Retrieves the state of the occupancy sensor. If true then occupancy has been detected. * * @return a future that will contain the occupancy sensor's state */ - CompletableFuture getOccupancyDetected(); - - @Override - default Collection getServices() { - return Collections.singleton(new OccupancySensorService(this)); - } + CompletableFuture getOccupancyDetected(); /** * Subscribes to changes in the occupancy sensor. @@ -38,4 +33,9 @@ default Collection getServices() { /** Unsubscribes from changes in the occupancy sensor. */ void unsubscribeOccupancyDetected(); + + @Override + default Collection getServices() { + return Collections.singleton(new OccupancySensorService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/Outlet.java b/src/main/java/io/github/hapjava/accessories/OutletAccessory.java similarity index 88% rename from src/main/java/io/github/hapjava/accessories/Outlet.java rename to src/main/java/io/github/hapjava/accessories/OutletAccessory.java index 4578bfea4..213f673b7 100644 --- a/src/main/java/io/github/hapjava/accessories/Outlet.java +++ b/src/main/java/io/github/hapjava/accessories/OutletAccessory.java @@ -1,7 +1,8 @@ package io.github.hapjava.accessories; -import io.github.hapjava.*; -import io.github.hapjava.impl.services.OutletService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.OutletService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -11,12 +12,7 @@ * * @author Andy Lintner */ -public interface Outlet extends HomekitAccessory { - - @Override - default Collection getServices() { - return Collections.singleton(new OutletService(this)); - } +public interface OutletAccessory extends HomekitAccessory { /** * Retrieves the current binary state of the outlet's power. @@ -60,4 +56,9 @@ default Collection getServices() { /** Unsubscribes from changes in the binary state indicating whether hte outlet is in use. */ void unsubscribeOutletInUse(); + + @Override + default Collection getServices() { + return Collections.singleton(new OutletService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/SecuritySystem.java b/src/main/java/io/github/hapjava/accessories/SecuritySystemAccessory.java similarity index 59% rename from src/main/java/io/github/hapjava/accessories/SecuritySystem.java rename to src/main/java/io/github/hapjava/accessories/SecuritySystemAccessory.java index fcf1d1f6f..93f59fa1b 100644 --- a/src/main/java/io/github/hapjava/accessories/SecuritySystem.java +++ b/src/main/java/io/github/hapjava/accessories/SecuritySystemAccessory.java @@ -1,12 +1,10 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.accessories.properties.CurrentSecuritySystemState; -import io.github.hapjava.accessories.properties.SecuritySystemAlarmType; -import io.github.hapjava.accessories.properties.TargetSecuritySystemState; -import io.github.hapjava.impl.services.SecuritySystemService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.securitysystem.CurrentSecuritySystemStateEnum; +import io.github.hapjava.characteristics.impl.securitysystem.TargetSecuritySystemStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.SecuritySystemService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -14,11 +12,11 @@ /** * A security system that can be armed so that when a contact sensor is opened or a motion sensor * detects movement, then a siren could be fired off. There are different modes for arming the - * system. See {@link TargetSecuritySystemState} for more information. + * system. See {@link TargetSecuritySystemStateEnum} for more information. * * @author Gaston Dombiak */ -public interface SecuritySystem extends HomekitAccessory { +public interface SecuritySystemAccessory extends HomekitAccessory { /** * Retrieves the current state of the security system. The state describes if the system is armed @@ -26,7 +24,7 @@ public interface SecuritySystem extends HomekitAccessory { * * @return current state of the security system. */ - CompletableFuture getCurrentSecuritySystemState(); + CompletableFuture getCurrentSecuritySystemState(); /** * Subscribes to changes to the state of the security system. @@ -45,14 +43,14 @@ public interface SecuritySystem extends HomekitAccessory { * @param state target state of the security system. * @throws Exception when the change cannot be made. */ - void setTargetSecuritySystemState(TargetSecuritySystemState state) throws Exception; + void setTargetSecuritySystemState(TargetSecuritySystemStateEnum state) throws Exception; /** * Retrieves the pending, but not yet completed, state of the security system. * * @return target state of the security system. */ - CompletableFuture getTargetSecuritySystemState(); + CompletableFuture getTargetSecuritySystemState(); /** * Subscribes to changes in the pending, but not yet completed, state of the security system. @@ -66,23 +64,6 @@ public interface SecuritySystem extends HomekitAccessory { */ void unsubscribeTargetSecuritySystemState(); - /** - * Retrieves the alarm type of the security system. - * - * @return alarm type of the security system. - */ - CompletableFuture getAlarmTypeState(); - - /** - * Subscribes to changes to the alarm type of the security system. - * - * @param callback the function to call when the alarm type changes. - */ - void subscribeAlarmTypeState(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the alarm type of the security system. */ - void unsubscribeAlarmTypeState(); - @Override default Collection getServices() { return Collections.singleton(new SecuritySystemService(this)); diff --git a/src/main/java/io/github/hapjava/accessories/SmokeSensor.java b/src/main/java/io/github/hapjava/accessories/SmokeSensorAccessory.java similarity index 69% rename from src/main/java/io/github/hapjava/accessories/SmokeSensor.java rename to src/main/java/io/github/hapjava/accessories/SmokeSensorAccessory.java index 68f43d1a7..ca1945351 100644 --- a/src/main/java/io/github/hapjava/accessories/SmokeSensor.java +++ b/src/main/java/io/github/hapjava/accessories/SmokeSensorAccessory.java @@ -1,10 +1,9 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.accessories.properties.SmokeDetectedState; -import io.github.hapjava.impl.services.SmokeSensorService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.smokesensor.SmokeDetectedStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.SmokeSensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -13,23 +12,18 @@ * A smoke sensor reports whether smoke has been detected or not. * *

Smoke sensors that run on batteries will need to implement this interface and also implement - * {@link BatteryStatusAccessory}. + * {@link BatteryAccessory}. * * @author Gaston Dombiak */ -public interface SmokeSensor extends HomekitAccessory { +public interface SmokeSensorAccessory extends HomekitAccessory { /** * Retrieves the state of the smoke sensor. This is whether smoke has been detected or not. * * @return a future that will contain the smoke sensor's state */ - CompletableFuture getSmokeDetectedState(); - - @Override - default Collection getServices() { - return Collections.singleton(new SmokeSensorService(this)); - } + CompletableFuture getSmokeDetectedState(); /** * Subscribes to changes in the smoke sensor's state. @@ -40,4 +34,9 @@ default Collection getServices() { /** Unsubscribes from changes in the smoke sensor's state. */ void unsubscribeSmokeDetectedState(); + + @Override + default Collection getServices() { + return Collections.singleton(new SmokeSensorService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/Switch.java b/src/main/java/io/github/hapjava/accessories/SwitchAccessory.java similarity index 82% rename from src/main/java/io/github/hapjava/accessories/Switch.java rename to src/main/java/io/github/hapjava/accessories/SwitchAccessory.java index 682d758c2..aae442f90 100644 --- a/src/main/java/io/github/hapjava/accessories/Switch.java +++ b/src/main/java/io/github/hapjava/accessories/SwitchAccessory.java @@ -1,7 +1,8 @@ package io.github.hapjava.accessories; -import io.github.hapjava.*; -import io.github.hapjava.impl.services.SwitchService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.SwitchService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -11,7 +12,7 @@ * * @author Andy Lintner */ -public interface Switch extends HomekitAccessory { +public interface SwitchAccessory extends HomekitAccessory { /** * Retrieves the current binary state of the switch. @@ -29,11 +30,6 @@ public interface Switch extends HomekitAccessory { */ CompletableFuture setSwitchState(boolean state) throws Exception; - @Override - default Collection getServices() { - return Collections.singleton(new SwitchService(this)); - } - /** * Subscribes to changes in the binary state of the switch. * @@ -43,4 +39,9 @@ default Collection getServices() { /** Unsubscribes from changes in the binary state of the switch. */ void unsubscribeSwitchState(); + + @Override + default Collection getServices() { + return Collections.singleton(new SwitchService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/TemperatureSensor.java b/src/main/java/io/github/hapjava/accessories/TemperatureSensor.java deleted file mode 100644 index a53b40a00..000000000 --- a/src/main/java/io/github/hapjava/accessories/TemperatureSensor.java +++ /dev/null @@ -1,83 +0,0 @@ -package io.github.hapjava.accessories; - -import io.github.hapjava.*; -import io.github.hapjava.accessories.properties.TemperatureUnit; -import io.github.hapjava.impl.services.TemperatureSensorService; -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.CompletableFuture; - -/** - * A temperature sensor that reports the current temperature - * - * @author Andy Lintner - */ -public interface TemperatureSensor extends HomekitAccessory { - - /** - * Retrieves the current temperature, in celsius degrees. - * - * @return a future that will contain the temperature. - */ - CompletableFuture getCurrentTemperature(); - - @Override - default Collection getServices() { - return Collections.singleton(new TemperatureSensorService(this)); - } - - /** - * Subscribes to changes in the current temperature. - * - * @param callback the function to call when the state changes. - */ - void subscribeCurrentTemperature(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the current temperature. */ - void unsubscribeCurrentTemperature(); - - /** - * Retrieves the minimum temperature, in celsius degrees, the thermostat can be set to. - * - * @return the minimum temperature. - */ - double getMinimumTemperature(); - - /** - * Retrieves the maximum temperature, in celsius degrees, the thermostat can be set to. - * - * @return the maximum temperature. - */ - double getMaximumTemperature(); - - /** - * Retrieves the temperature unit of the thermostat. The impact of this is unclear, as the actual - * temperature is always communicated in celsius degrees, and the iOS device uses the user's - * locale to determine the unit to convert to. - * - * @return the temperature unit of the thermostat. - */ - default TemperatureUnit getTemperatureUnit() { - return TemperatureUnit.CELSIUS; - } - - /** - * set default temperature unit of the thermostat. this is the unit thermostat use to display - * temprature. the homekit interface uses celsius. - * - * @param unit the temperature unit of the thermostat. - */ - default void setTemperatureUnit(TemperatureUnit unit) { - // override depending on the thermostat if required. - } - - /** - * subscribe to unit changes. - * - * @param callback callback - */ - default void subscribeTemperatureUnit(final HomekitCharacteristicChangeCallback callback) {} - - /** unsubscribe from unit changes. */ - default void unsubscribeTemperatureUnit() {} -} diff --git a/src/main/java/io/github/hapjava/accessories/TemperatureSensorAccessory.java b/src/main/java/io/github/hapjava/accessories/TemperatureSensorAccessory.java new file mode 100644 index 000000000..f2941f957 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/TemperatureSensorAccessory.java @@ -0,0 +1,38 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.TemperatureSensorService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * A temperature sensor that reports the current temperature + * + * @author Andy Lintner + */ +public interface TemperatureSensorAccessory extends HomekitAccessory { + + /** + * Retrieves the current temperature, in celsius degrees. + * + * @return a future that will contain the temperature. + */ + CompletableFuture getCurrentTemperature(); + + /** + * Subscribes to changes in the current temperature. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentTemperature(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the current temperature. */ + void unsubscribeCurrentTemperature(); + + @Override + default Collection getServices() { + return Collections.singleton(new TemperatureSensorService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/Thermostat.java b/src/main/java/io/github/hapjava/accessories/Thermostat.java deleted file mode 100644 index 54b1ca625..000000000 --- a/src/main/java/io/github/hapjava/accessories/Thermostat.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.github.hapjava.accessories; - -import io.github.hapjava.accessories.thermostat.*; - -/** - * A thermostat with heating and cooling controls. - * - * @author Andy Lintner - * @deprecated Use {@link BasicThermostat}, {@link HeatingThermostat}, and {@link CoolingThermostat} - * instead - */ -@Deprecated -public interface Thermostat extends BasicThermostat, HeatingThermostat, CoolingThermostat {} diff --git a/src/main/java/io/github/hapjava/accessories/ThermostatAccessory.java b/src/main/java/io/github/hapjava/accessories/ThermostatAccessory.java new file mode 100644 index 000000000..43bca6926 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/ThermostatAccessory.java @@ -0,0 +1,138 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.thermostat.CurrentHeatingCoolingStateEnum; +import io.github.hapjava.characteristics.impl.thermostat.TargetHeatingCoolingStateEnum; +import io.github.hapjava.characteristics.impl.thermostat.TemperatureDisplayUnitEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.ThermostatService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * A thermostat with heating and cooling controls. + * + * @author Andy Lintner + */ +public interface ThermostatAccessory extends HomekitAccessory { + + /** + * Retrieves the current temperature, in celsius degrees. + * + * @return a future that will contain the temperature. + */ + CompletableFuture getCurrentTemperature(); + + /** + * Retrieves the target temperature, in celsius degrees. + * + * @return a future that will contain the target temperature. + */ + CompletableFuture getTargetTemperature(); + + /** + * Sets the target temperature. + * + * @param value the target temperature, in celsius degrees. + * @throws Exception when the temperature cannot be changed. + */ + void setTargetTemperature(Double value) throws Exception; + + /** + * Retrieves the current {@link CurrentHeatingCoolingStateEnum} of the thermostat. + * + * @return a future that will contain the mode. + */ + CompletableFuture getCurrentState(); + + /** + * Sets the {@link TargetHeatingCoolingStateEnum} of the thermostat. + * + * @param mode The {@link TargetHeatingCoolingStateEnum} to set. + * @throws Exception when the change cannot be made. + */ + void setTargetState(TargetHeatingCoolingStateEnum mode) throws Exception; + + /** + * Retrieves the pending, but not yet complete, {@link TargetHeatingCoolingStateEnum} of the + * thermostat. + * + * @return a future that will contain the target mode. + */ + CompletableFuture getTargetState(); + + /** + * Retrieves the temperture display units, e.g. C or F. + * + * @return a future that will contain the temperature unit. + */ + CompletableFuture getTemperatureDisplayUnit(); + + /** + * Sets the temperature unit. + * + * @param value the temperature display unit. + * @throws Exception when the temperature cannot be changed. + */ + void setTemperatureDisplayUnit(TemperatureDisplayUnitEnum value) throws Exception; + + /** + * Subscribes to changes in the pending, but not yet complete, {@link + * TargetHeatingCoolingStateEnum} of the thermostat. + * + * @param callback the function to call when the state changes. + */ + void subscribeTargetState(HomekitCharacteristicChangeCallback callback); + + /** + * Subscribes to changes in the target temperature. + * + * @param callback the function to call when the state changes. + */ + void subscribeTargetTemperature(HomekitCharacteristicChangeCallback callback); + + /** + * Subscribes to changes in the temperature display unit. + * + * @param callback the function to call when the uni changes. + */ + void subscribeTemperatureDisplayUnit(HomekitCharacteristicChangeCallback callback); + + /** + * Subscribes to changes in the current temperature. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentTemperature(HomekitCharacteristicChangeCallback callback); + + /** + * Subscribes to changes in the {@link CurrentHeatingCoolingStateEnum} of the thermostat. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the mode of the thermostat. */ + void unsubscribeCurrentState(); + + /** + * Unsubscribes from changes in the pending, but not yet complete, {@link + * TargetHeatingCoolingStateEnum} of the thermostat. + */ + void unsubscribeTargetState(); + + /** Unsubscribes from changes in the current temperature. */ + void unsubscribeCurrentTemperature(); + + /** Unsubscribes from changes in temperature display unit */ + void unsubscribeTemperatureDisplayUnit(); + + /** Unsubscribes from changes in the target temperature. */ + void unsubscribeTargetTemperature(); + + @Override + default Collection getServices() { + return Collections.singleton(new ThermostatService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/Valve.java b/src/main/java/io/github/hapjava/accessories/ValveAccessory.java similarity index 78% rename from src/main/java/io/github/hapjava/accessories/Valve.java rename to src/main/java/io/github/hapjava/accessories/ValveAccessory.java index 8a62f0772..a99613b3b 100644 --- a/src/main/java/io/github/hapjava/accessories/Valve.java +++ b/src/main/java/io/github/hapjava/accessories/ValveAccessory.java @@ -1,10 +1,11 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.accessories.properties.ValveType; -import io.github.hapjava.impl.services.ValveService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.common.ActiveEnum; +import io.github.hapjava.characteristics.impl.common.InUseEnum; +import io.github.hapjava.characteristics.impl.valve.ValveTypeEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.ValveService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -14,12 +15,7 @@ * * @author Tim Harper */ -public interface Valve extends HomekitAccessory { - - @Override - default Collection getServices() { - return Collections.singleton(new ValveService(this)); - } +public interface ValveAccessory extends HomekitAccessory { /** * Retrieves the current active state of the valve; Active could mean the valve is open (but not @@ -30,7 +26,7 @@ default Collection getServices() { * * @return a future that will contain the binary state */ - CompletableFuture getValveActive(); + CompletableFuture getValveActive(); /** * Sets the valve active state @@ -39,7 +35,7 @@ default Collection getServices() { * @return a future that completes when the change is made * @throws Exception when the change cannot be made */ - CompletableFuture setValveActive(boolean active) throws Exception; + CompletableFuture setValveActive(ActiveEnum active) throws Exception; /** * Subscribes to changes in the active state of the valve. @@ -59,7 +55,7 @@ default Collection getServices() { * * @return a future that will contain the binary state */ - CompletableFuture getValveInUse(); + CompletableFuture getValveInUse(); /** * Subscribes to changes in the inUse state of the valve. @@ -78,7 +74,7 @@ default Collection getServices() { * * @return a future that will contain the binary state */ - CompletableFuture getValveType(); + CompletableFuture getValveType(); /** * Subscribes to changes in the valveType state of the valve. @@ -89,4 +85,9 @@ default Collection getServices() { /** Unsubscribes from changes in the valveType state light. */ void unsubscribeValveType(); + + @Override + default Collection getServices() { + return Collections.singleton(new ValveService(this)); + } } diff --git a/src/main/java/io/github/hapjava/accessories/WindowAccessory.java b/src/main/java/io/github/hapjava/accessories/WindowAccessory.java new file mode 100644 index 000000000..f5a7559b3 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/WindowAccessory.java @@ -0,0 +1,82 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.windowcovering.PositionStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.WindowService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * A Window with status of a door + * + * @author Eugen Freiter + */ +public interface WindowAccessory extends HomekitAccessory { + + /** + * Retrieves the position state of the door + * + * @return a future which will contain the door's position state + */ + CompletableFuture getPositionState(); + + /** + * Retrieves the current position of the door + * + * @return a future which will contain the door's current position + */ + CompletableFuture getCurrentPosition(); + + /** + * Retrieves the target position of the door + * + * @return a future which will contain the door's target position + */ + CompletableFuture getTargetPosition(); + + /** + * Sets the targeted state of the door. + * + * @param position the targeted position + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setTargetPosition(Integer position) throws Exception; + + /** + * Subscribes to changes in the door's position state + * + * @param callback the function to call when the state changes + */ + void subscribePositionState(HomekitCharacteristicChangeCallback callback); + + /** + * Subscribes to changes in the door's current position + * + * @param callback the function to call when the current position changes + */ + void subscribeCurrentPosition(HomekitCharacteristicChangeCallback callback); + + /** + * Subscribes to changes in the door's target position + * + * @param callback the function to call when the target position changes + */ + void subscribeTargetPosition(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the door's state */ + void unsubscribePositionState(); + + /** Unsubscribes from changes in the door's current position */ + void unsubscribeCurrentPosition(); + + /** Unsubscribes from changes in the door's target position */ + void unsubscribeTargetPosition(); + + @Override + default Collection getServices() { + return Collections.singleton(new WindowService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/WindowCovering.java b/src/main/java/io/github/hapjava/accessories/WindowCovering.java deleted file mode 100644 index afabbf097..000000000 --- a/src/main/java/io/github/hapjava/accessories/WindowCovering.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.hapjava.accessories; - -/** - * A window covering, like blinds, which can be remotely controlled. - * - * @author Andy Lintner - * @deprecated In 1.2.x, this interface will become replaced with BasicWindowCovering. Update your - * code to use that interface for now, and include the HoldPositionWindowCovering and - * ObstructionDetectedWindowCovering interfaces respectively - */ -@Deprecated -public interface WindowCovering - extends BasicWindowCovering, HoldPositionWindowCovering, ObstructionDetectedWindowCovering { - /* - * TODO - 1.2.x: Replace this interface with BasicWindowCovering */ -} diff --git a/src/main/java/io/github/hapjava/accessories/BasicWindowCovering.java b/src/main/java/io/github/hapjava/accessories/WindowCoveringAccessory.java similarity index 81% rename from src/main/java/io/github/hapjava/accessories/BasicWindowCovering.java rename to src/main/java/io/github/hapjava/accessories/WindowCoveringAccessory.java index 7d58b2b2d..1b618d66f 100644 --- a/src/main/java/io/github/hapjava/accessories/BasicWindowCovering.java +++ b/src/main/java/io/github/hapjava/accessories/WindowCoveringAccessory.java @@ -1,16 +1,15 @@ package io.github.hapjava.accessories; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.Service; -import io.github.hapjava.accessories.properties.WindowCoveringPositionState; -import io.github.hapjava.impl.services.WindowCoveringService; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.windowcovering.PositionStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.WindowCoveringService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; -public interface BasicWindowCovering extends HomekitAccessory { - +/** A window covering, like blinds, which can be remotely controlled. */ +public interface WindowCoveringAccessory extends HomekitAccessory { /** * Retrieves the current position * @@ -30,7 +29,7 @@ public interface BasicWindowCovering extends HomekitAccessory { * * @return a future that will contain the current state */ - CompletableFuture getPositionState(); + CompletableFuture getPositionState(); /** * Sets the target position diff --git a/src/main/java/io/github/hapjava/accessories/DimmableLightbulb.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithBrightness.java similarity index 81% rename from src/main/java/io/github/hapjava/accessories/DimmableLightbulb.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithBrightness.java index 2eea5abdb..4fa4557c2 100644 --- a/src/main/java/io/github/hapjava/accessories/DimmableLightbulb.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithBrightness.java @@ -1,14 +1,14 @@ -package io.github.hapjava.accessories; +package io.github.hapjava.accessories.optionalcharacteristic; -import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; /** - * Extends {@link Lightbulb} with brightness values. + * Accessory with brightness values. * * @author Andy Lintner */ -public interface DimmableLightbulb extends Lightbulb { +public interface AccessoryWithBrightness { /** * Retrieves the current brightness of the light diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonDioxideLevel.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonDioxideLevel.java new file mode 100644 index 000000000..16260bda2 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonDioxideLevel.java @@ -0,0 +1,46 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with carbon dioxide level and peak level characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithCarbonDioxideLevel { + + /** + * Retrieves the carbon dioxide peak level + * + * @return a future that will contain the carbon dioxide level as a value between 0 and 100000 + */ + CompletableFuture getCarbonDioxidePeakLevel(); + + /** + * Retrieves the carbon dioxide level + * + * @return a future that will contain the carbon dioxide level as a value between 0 and 100000 + */ + CompletableFuture getCarbonDioxideLevel(); + + /** + * Subscribes to changes in the carbon dioxide level. + * + * @param callback the function to call when the state changes. + */ + void subscribeCarbonDioxideLevel(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the carbon dioxide level. */ + void unsubscribeCarbonDioxideLevel(); + + /** + * Subscribes to changes in the carbon dioxide level. + * + * @param callback the function to call when the state changes. + */ + void subscribeCarbonDioxidePeakLevel(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the carbon dioxide level. */ + void unsubscribeCarbonDioxidePeakLevel(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonMonoxideLevel.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonMonoxideLevel.java new file mode 100644 index 000000000..befb4d5ac --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonMonoxideLevel.java @@ -0,0 +1,46 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with carbon dioxide level and peak level characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithCarbonMonoxideLevel { + + /** + * Retrieves the carbon monoxide peak level + * + * @return a future that will contain the carbon monoxide level as a value between 0 and 100000 + */ + CompletableFuture getCarbonMonoxidePeakLevel(); + + /** + * Retrieves the carbon monoxide level + * + * @return a future that will contain the carbon monoxide level as a value between 0 and 100000 + */ + CompletableFuture getCarbonMonoxideLevel(); + + /** + * Subscribes to changes in the carbon monoxide level. + * + * @param callback the function to call when the state changes. + */ + void subscribeCarbonMonoxideLevel(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the carbon monoxide level. */ + void unsubscribeCarbonMonoxideLevel(); + + /** + * Subscribes to changes in the carbon monoxide level. + * + * @param callback the function to call when the state changes. + */ + void subscribeCarbonMonoxidePeakLevel(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the carbon monoxide level. */ + void unsubscribeCarbonMonoxidePeakLevel(); +} diff --git a/src/main/java/io/github/hapjava/accessories/ColorfulLightbulb.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColor.java similarity index 85% rename from src/main/java/io/github/hapjava/accessories/ColorfulLightbulb.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColor.java index 32ed8d294..e8f2dd66a 100644 --- a/src/main/java/io/github/hapjava/accessories/ColorfulLightbulb.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColor.java @@ -1,15 +1,14 @@ -package io.github.hapjava.accessories; +package io.github.hapjava.accessories.optionalcharacteristic; -import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; /** - * Extends {@link Lightbulb} with color settings. This will usually be implemented along with {@link - * DimmableLightbulb}, but not necessarily so. + * Accessory with Color * * @author Andy Lintner */ -public interface ColorfulLightbulb extends Lightbulb { +public interface AccessoryWithColor { /** * Retrieves the current hue of the light. diff --git a/src/main/java/io/github/hapjava/accessories/thermostat/CoolingThermostat.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemprature.java similarity index 82% rename from src/main/java/io/github/hapjava/accessories/thermostat/CoolingThermostat.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemprature.java index 3229146b5..170c921d9 100644 --- a/src/main/java/io/github/hapjava/accessories/thermostat/CoolingThermostat.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemprature.java @@ -1,9 +1,9 @@ -package io.github.hapjava.accessories.thermostat; +package io.github.hapjava.accessories.optionalcharacteristic; -import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -public interface CoolingThermostat extends BasicThermostat { +public interface AccessoryWithCoolingThresholdTemprature { /** * Retrieves the temperature above which the thermostat should begin cooling. diff --git a/src/main/java/io/github/hapjava/accessories/ValveWithTimer.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java similarity index 55% rename from src/main/java/io/github/hapjava/accessories/ValveWithTimer.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java index 5ed2ee048..bf8da5f44 100644 --- a/src/main/java/io/github/hapjava/accessories/ValveWithTimer.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java @@ -1,32 +1,14 @@ -package io.github.hapjava.accessories; +package io.github.hapjava.accessories.optionalcharacteristic; -import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; /** - * Extends {@link Valve} with timer values. + * Accessory with duration characteristic. * - * @author Tim Harper + * @author Eugen Freiter */ -public interface ValveWithTimer extends Valve { - - /** - * Retrieves the current duration for which the valve will run - * - * @return a future with the value - */ - CompletableFuture getRemainingDuration(); - - /** - * Subscribes to changes in the duration; note it is not necessary to emit a change every second, - * homekit infers the countdown progress clientside. - * - * @param callback the function when the existing duration has been replaced with a new one. - */ - void subscribeRemainingDuration(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes */ - void unsubscribeRemainingDuration(); +public interface AccessoryWithDuration { /** * Retrieves the current set duration for which the valve will be scheduled to run; this is diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java new file mode 100644 index 000000000..2c0488d26 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java @@ -0,0 +1,158 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.fan.CurrentFanStateEnum; +import io.github.hapjava.characteristics.impl.fan.LockPhysicalControlsEnum; +import io.github.hapjava.characteristics.impl.fan.RotationDirectionEnum; +import io.github.hapjava.characteristics.impl.fan.SwingModeEnum; +import io.github.hapjava.characteristics.impl.fan.TargetFanStateEnum; +import java.util.concurrent.CompletableFuture; + +/** + * A fan, with power and rotational characteristics. + * + * @author Andy Lintner + */ +public interface AccessoryWithFanState { + + /** + * OPTIONAL: Retrieves the current state of the fan (INACTIVE, IDLE, BLOWING AIR). + * + * @return a future that will contain the state + */ + CompletableFuture getCurrentFanState(); + + /** + * OPTIONAL: Retrieves the target state of the fan (MANUAL, AUTO). + * + * @return a future that will contain the state + */ + CompletableFuture getTargetFanState(); + + /** + * OPTIONAL: Set the target state of the fan (MANUAL, AUTO). + * + * @param targetState target state + */ + CompletableFuture setTargetFanState(TargetFanStateEnum targetState); + + /** + * OPTIONAL: Retrieves the swing mode of the fan. + * + * @return a future that will contain the swing mode + */ + CompletableFuture getSwingMode(); + + /** + * OPTIONAL: Set the swing mode of the fan (DISABLED, ENABLED). + * + * @param swingMode swing mode + */ + CompletableFuture setSwingMode(SwingModeEnum swingMode); + + /** + * OPTIONAL: Retrieves the lock controls of the fan. + * + * @return a future that will contain the lock controls + */ + CompletableFuture getLockControls(); + + /** + * OPTIONAL: Set the lock controls of the fan (DISABLED, ENABLED). + * + * @param lockControls lock controls mode + */ + CompletableFuture setLockControls(LockPhysicalControlsEnum lockControls); + + /** + * OPTIONAL: Retrieves the current rotation direction of the fan. + * + * @return a future that will contain the direction + */ + CompletableFuture getRotationDirection(); + + /** + * OPTIONAL: Retrieves the current speed of the fan's rotation + * + * @return a future that will contain the speed, expressed as an integer between 0 and 100. + */ + CompletableFuture getRotationSpeed(); + + /** + * OPTIONAL: Sets the rotation direction of the fan + * + * @param direction the direction to set + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setRotationDirection(RotationDirectionEnum direction) throws Exception; + + /** + * OPTIONAL: Sets the speed of the fan's rotation + * + * @param speed the speed to set, expressed as an integer between 0 and 100. + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setRotationSpeed(Integer speed) throws Exception; + + /** + * OPTIONAL: Subscribes to changes in the rotation direction of the fan. + * + * @param callback the function to call when the direction changes. + */ + void subscribeRotationDirection(HomekitCharacteristicChangeCallback callback); + + /** + * OPTIONAL: Subscribes to changes in the current fan state. + * + * @param callback the function to call when the direction changes. + */ + void subscribeCurrentFanState(HomekitCharacteristicChangeCallback callback); + + /** + * OPTIONAL: Subscribes to changes in the target fan state. + * + * @param callback the function to call when the direction changes. + */ + void subscribeTargetFanState(HomekitCharacteristicChangeCallback callback); + + /** + * OPTIONAL: Subscribes to changes in the rotation speed of the fan. + * + * @param callback the function to call when the speed changes. + */ + void subscribeRotationSpeed(HomekitCharacteristicChangeCallback callback); + + /** + * OPTIONAL: Subscribes to changes in the swing mode of the fan. + * + * @param callback the function to call when the swing mode changes. + */ + void subscribeSwingMode(HomekitCharacteristicChangeCallback callback); + + /** + * OPTIONAL: Subscribes to changes in the lock controls of the fan. + * + * @param callback the function to call when the lock controls changes. + */ + void subscribeLockControls(HomekitCharacteristicChangeCallback callback); + + /** OPTIONAL: Unsubscribes from changes in the rotation direction of the fan. */ + void unsubscribeRotationDirection(); + + /** OPTIONAL: Unsubscribes from changes in the fan's rotation speed. */ + void unsubscribeRotationSpeed(); + + /** OPTIONAL: Unsubscribes from changes in the current state of the fan. */ + void unsubscribeCurrentFanState(); + + /** OPTIONAL: Unsubscribes from changes in the target state of the fan. */ + void unsubscribeTargetFanState(); + + /** OPTIONAL: Unsubscribes from changes in the swing mode of the fan. */ + void unsubscribeSwingMode(); + + /** OPTIONAL: Unsubscribes from changes in the lock controls of the fan. */ + void unsubscribeLockControls(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHardwareRevision.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHardwareRevision.java new file mode 100644 index 000000000..6f1259ef4 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHardwareRevision.java @@ -0,0 +1,18 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with name . + * + * @author Eugen Freiter + */ +public interface AccessoryWithHardwareRevision { + + /** + * Returns a hardware revision to display in iOS. + * + * @return the hardware revision, or null. + */ + CompletableFuture getHardwareRevision(); +} diff --git a/src/main/java/io/github/hapjava/accessories/thermostat/HeatingThermostat.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHearingThresholdTemprature.java similarity index 82% rename from src/main/java/io/github/hapjava/accessories/thermostat/HeatingThermostat.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHearingThresholdTemprature.java index 5a672adb9..af18baca3 100644 --- a/src/main/java/io/github/hapjava/accessories/thermostat/HeatingThermostat.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHearingThresholdTemprature.java @@ -1,9 +1,9 @@ -package io.github.hapjava.accessories.thermostat; +package io.github.hapjava.accessories.optionalcharacteristic; -import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -public interface HeatingThermostat extends BasicThermostat { +public interface AccessoryWithHearingThresholdTemprature { /** * Retrieves the temperature below which the thermostat should begin heating. diff --git a/src/main/java/io/github/hapjava/accessories/HoldPositionWindowCovering.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHoldPosition.java similarity index 71% rename from src/main/java/io/github/hapjava/accessories/HoldPositionWindowCovering.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHoldPosition.java index f5cfe0c80..b1d0d65fa 100644 --- a/src/main/java/io/github/hapjava/accessories/HoldPositionWindowCovering.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHoldPosition.java @@ -1,8 +1,9 @@ -package io.github.hapjava.accessories; +package io.github.hapjava.accessories.optionalcharacteristic; import java.util.concurrent.CompletableFuture; -public interface HoldPositionWindowCovering { +/** Accessory with hold position */ +public interface AccessoryWithHoldPosition { /** * Sets the hold position state diff --git a/src/main/java/io/github/hapjava/accessories/HorizontalTiltingWindowCovering.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHorizontalTilting.java similarity index 86% rename from src/main/java/io/github/hapjava/accessories/HorizontalTiltingWindowCovering.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHorizontalTilting.java index 623291f02..58556c9d0 100644 --- a/src/main/java/io/github/hapjava/accessories/HorizontalTiltingWindowCovering.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHorizontalTilting.java @@ -1,14 +1,14 @@ -package io.github.hapjava.accessories; +package io.github.hapjava.accessories.optionalcharacteristic; -import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; /** - * Extends WindowCovering with the ability to control horizontal tilt angles + * Accessory with horizontal tilting characteristic. * * @author Andy Lintner */ -public interface HorizontalTiltingWindowCovering extends WindowCovering { +public interface AccessoryWithHorizontalTilting { /** * Retrieves the current horizontal tilt angle diff --git a/src/main/java/io/github/hapjava/accessories/ObstructionDetectedWindowCovering.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithObstructionDetection.java similarity index 66% rename from src/main/java/io/github/hapjava/accessories/ObstructionDetectedWindowCovering.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithObstructionDetection.java index 6dea4ec63..859379cd0 100644 --- a/src/main/java/io/github/hapjava/accessories/ObstructionDetectedWindowCovering.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithObstructionDetection.java @@ -1,12 +1,13 @@ -package io.github.hapjava.accessories; +package io.github.hapjava.accessories.optionalcharacteristic; -import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -public interface ObstructionDetectedWindowCovering { +/** Accessory with hold position */ +public interface AccessoryWithObstructionDetection { /** - * Retrieves an indication that the window covering is obstructed from moving + * Retrieves an indication obstructed is detected * * @return a future that will contain a boolean indicating whether an obstruction is present */ diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRemainingDuration.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRemainingDuration.java new file mode 100644 index 000000000..d5071bbe6 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRemainingDuration.java @@ -0,0 +1,30 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with remaining duration characteristic. + * + * @author Tim Harper + */ +public interface AccessoryWithRemainingDuration { + + /** + * Retrieves the current duration for which the valve will run + * + * @return a future with the value + */ + CompletableFuture getRemainingDuration(); + + /** + * Subscribes to changes in the duration; note it is not necessary to emit a change every second, + * homekit infers the countdown progress clientside. + * + * @param callback the function when the existing duration has been replaced with a new one. + */ + void subscribeRemainingDuration(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeRemainingDuration(); +} diff --git a/src/main/java/io/github/hapjava/accessories/VerticalTiltingWindowCovering.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVerticalTilting.java similarity index 83% rename from src/main/java/io/github/hapjava/accessories/VerticalTiltingWindowCovering.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVerticalTilting.java index e85a7e9c0..3e849e5bb 100644 --- a/src/main/java/io/github/hapjava/accessories/VerticalTiltingWindowCovering.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVerticalTilting.java @@ -1,15 +1,10 @@ -package io.github.hapjava.accessories; +package io.github.hapjava.accessories.optionalcharacteristic; -import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Extends WindowCovering with the ability to control vertical tilt angles - * - * @author Andy Lintner - */ -public interface VerticalTiltingWindowCovering extends WindowCovering { - +/** Accessory with vertical tilting characteristic. */ +public interface AccessoryWithVerticalTilting { /** * Retrieves the current vertical tilt angle * diff --git a/src/main/java/io/github/hapjava/accessories/properties/CarbonDioxideDetectedState.java b/src/main/java/io/github/hapjava/accessories/properties/CarbonDioxideDetectedState.java deleted file mode 100644 index 66dabf5b6..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/CarbonDioxideDetectedState.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -public enum CarbonDioxideDetectedState { - NORMAL(0), - ABNORMAL(1); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(CarbonDioxideDetectedState.values()) - .collect(Collectors.toMap(CarbonDioxideDetectedState::getCode, t -> t)); - } - - public static CarbonDioxideDetectedState fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - CarbonDioxideDetectedState(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/CarbonMonoxideDetectedState.java b/src/main/java/io/github/hapjava/accessories/properties/CarbonMonoxideDetectedState.java deleted file mode 100644 index 3a713094d..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/CarbonMonoxideDetectedState.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -public enum CarbonMonoxideDetectedState { - NORMAL(0), - ABNORMAL(1); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(CarbonMonoxideDetectedState.values()) - .collect(Collectors.toMap(CarbonMonoxideDetectedState::getCode, t -> t)); - } - - public static CarbonMonoxideDetectedState fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - CarbonMonoxideDetectedState(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/ContactState.java b/src/main/java/io/github/hapjava/accessories/properties/ContactState.java deleted file mode 100644 index 958e0b689..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/ContactState.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -public enum ContactState { - DETECTED(0), - NOT_DETECTED(1); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(ContactState.values()) - .collect(Collectors.toMap(ContactState::getCode, t -> t)); - } - - public static ContactState fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - ContactState(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/CurrentSecuritySystemState.java b/src/main/java/io/github/hapjava/accessories/properties/CurrentSecuritySystemState.java deleted file mode 100644 index f444a38cc..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/CurrentSecuritySystemState.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import io.github.hapjava.accessories.SecuritySystem; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * The current state of a {@link SecuritySystem}. Unlike {@link TargetSecuritySystemState}, this - * enum includes a triggered state. - * - * @author Gaston Dombiak - */ -public enum CurrentSecuritySystemState { - - /** The home is occupied and residents are active. */ - STAY_ARM(0), - /** The home is unoccupied. */ - AWAY_ARM(1), - /** The home is occupied and residents are sleeping. */ - NIGHT_ARM(2), - /** The security system is disarmed. */ - DISARMED(3), - /** The security system is triggered. */ - TRIGGERED(4); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(CurrentSecuritySystemState.values()) - .collect(Collectors.toMap(CurrentSecuritySystemState::getCode, t -> t)); - } - - public static CurrentSecuritySystemState fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - CurrentSecuritySystemState(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/DoorState.java b/src/main/java/io/github/hapjava/accessories/properties/DoorState.java deleted file mode 100644 index c47bc4ccf..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/DoorState.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -public enum DoorState { - OPEN(0), - CLOSED(1), - OPENING(2), - CLOSING(3), - STOPPED(4); - - private static final Map reverse; - - static { - reverse = Arrays.stream(DoorState.values()).collect(Collectors.toMap(t -> t.getCode(), t -> t)); - } - - public static DoorState fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - private DoorState(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/LockMechanismState.java b/src/main/java/io/github/hapjava/accessories/properties/LockMechanismState.java deleted file mode 100644 index 7dceff8c7..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/LockMechanismState.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import io.github.hapjava.accessories.LockMechanism; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * The state of a {@link LockMechanism}. - * - * @author Andy Lintner - */ -public enum LockMechanismState { - UNSECURED(0), - SECURED(1), - JAMMED(2), - UNKNOWN(3); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(LockMechanismState.values()) - .collect(Collectors.toMap(t -> t.getCode(), t -> t)); - } - - public static LockMechanismState fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - private LockMechanismState(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/RotationDirection.java b/src/main/java/io/github/hapjava/accessories/properties/RotationDirection.java deleted file mode 100644 index 96ee54749..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/RotationDirection.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -public enum RotationDirection { - CLOCKWISE(0), - COUNTER_CLOCKWISE(1); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(RotationDirection.values()) - .collect(Collectors.toMap(t -> t.getCode(), t -> t)); - } - - public static RotationDirection fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - private RotationDirection(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/SecuritySystemAlarmType.java b/src/main/java/io/github/hapjava/accessories/properties/SecuritySystemAlarmType.java deleted file mode 100644 index d8a96de63..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/SecuritySystemAlarmType.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import io.github.hapjava.accessories.SecuritySystem; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * Type of alarm of a {@link SecuritySystem}. - * - * @author Gaston Dombiak - */ -public enum SecuritySystemAlarmType { - - /** Alarm conditions are cleared */ - NO_ALARM(0), - /** Alarm type is not known */ - UNKNOWN(1); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(SecuritySystemAlarmType.values()) - .collect(Collectors.toMap(SecuritySystemAlarmType::getCode, t -> t)); - } - - public static SecuritySystemAlarmType fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - SecuritySystemAlarmType(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/SmokeDetectedState.java b/src/main/java/io/github/hapjava/accessories/properties/SmokeDetectedState.java deleted file mode 100644 index a7f71a30a..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/SmokeDetectedState.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -public enum SmokeDetectedState { - NOT_DETECTED(0), - DETECTED(1); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(SmokeDetectedState.values()) - .collect(Collectors.toMap(SmokeDetectedState::getCode, t -> t)); - } - - public static SmokeDetectedState fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - SmokeDetectedState(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/TargetSecuritySystemState.java b/src/main/java/io/github/hapjava/accessories/properties/TargetSecuritySystemState.java deleted file mode 100644 index a08a2987b..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/TargetSecuritySystemState.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import io.github.hapjava.accessories.SecuritySystem; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * The target state of a {@link SecuritySystem}. - * - * @author Gaston Dombiak - */ -public enum TargetSecuritySystemState { - - /** Arm the system when the home is occupied and residents are active. */ - STAY_ARM(0), - /** Arm the system when the home is unoccupied. */ - AWAY_ARM(1), - /** Arm the system when the home is occupied and residents are sleeping. */ - NIGHT_ARM(2), - /** Disarm the system. */ - DISARM(3); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(TargetSecuritySystemState.values()) - .collect(Collectors.toMap(TargetSecuritySystemState::getCode, t -> t)); - } - - public static TargetSecuritySystemState fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - TargetSecuritySystemState(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/TemperatureUnit.java b/src/main/java/io/github/hapjava/accessories/properties/TemperatureUnit.java deleted file mode 100644 index 228366cec..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/TemperatureUnit.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import io.github.hapjava.accessories.TemperatureSensor; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * The temperature unit used by a {@link TemperatureSensor}. - * - * @author Andy Lintner - */ -public enum TemperatureUnit { - CELSIUS(0), - FAHRENHEIT(1); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(TemperatureUnit.values()).collect(Collectors.toMap(t -> t.getCode(), t -> t)); - } - - static TemperatureUnit fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - private TemperatureUnit(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/ThermostatMode.java b/src/main/java/io/github/hapjava/accessories/properties/ThermostatMode.java deleted file mode 100644 index 4eb586584..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/ThermostatMode.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import io.github.hapjava.accessories.thermostat.BasicThermostat; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * The mode used by a {@link BasicThermostat} - * - * @author Andy Lintner - */ -public enum ThermostatMode { - OFF(0), - HEAT(1), - COOL(2), - AUTO(3); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(ThermostatMode.values()).collect(Collectors.toMap(t -> t.getCode(), t -> t)); - } - - public static ThermostatMode fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - private ThermostatMode(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/ValveType.java b/src/main/java/io/github/hapjava/accessories/properties/ValveType.java deleted file mode 100644 index 95f564869..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/ValveType.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import io.github.hapjava.accessories.Valve; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * The mode used by a {@link Valve} - * - * @author Tim Harper - */ -public enum ValveType { - GENERIC(0), - IRRIGATION(1), - SHOWER(2), - WATER_FAUCET(3); - - private static final Map reverse; - - static { - reverse = Arrays.stream(ValveType.values()).collect(Collectors.toMap(t -> t.getCode(), t -> t)); - } - - public static ValveType fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - private ValveType(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/WindowCoveringPositionState.java b/src/main/java/io/github/hapjava/accessories/properties/WindowCoveringPositionState.java deleted file mode 100644 index 1686fd2fb..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/WindowCoveringPositionState.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.accessories.properties; - -import io.github.hapjava.accessories.WindowCovering; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * The position state used by a {@link WindowCovering} - * - * @author Andy Lintner - */ -public enum WindowCoveringPositionState { - DECREASING(0), - INCREASING(1), - STOPPED(2); - - private static final Map reverse; - - static { - reverse = - Arrays.stream(WindowCoveringPositionState.values()) - .collect(Collectors.toMap(t -> t.getCode(), t -> t)); - } - - public static WindowCoveringPositionState fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - private WindowCoveringPositionState(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/accessories/properties/package-info.java b/src/main/java/io/github/hapjava/accessories/properties/package-info.java deleted file mode 100644 index f2827b56b..000000000 --- a/src/main/java/io/github/hapjava/accessories/properties/package-info.java +++ /dev/null @@ -1,2 +0,0 @@ -/** Contains properties used by {@link io.github.hapjava.accessories}. */ -package io.github.hapjava.accessories.properties; diff --git a/src/main/java/io/github/hapjava/accessories/thermostat/BasicThermostat.java b/src/main/java/io/github/hapjava/accessories/thermostat/BasicThermostat.java deleted file mode 100644 index 8747ab01a..000000000 --- a/src/main/java/io/github/hapjava/accessories/thermostat/BasicThermostat.java +++ /dev/null @@ -1,88 +0,0 @@ -package io.github.hapjava.accessories.thermostat; - -import io.github.hapjava.*; -import io.github.hapjava.accessories.TemperatureSensor; -import io.github.hapjava.accessories.properties.ThermostatMode; -import io.github.hapjava.impl.services.ThermostatService; -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.CompletableFuture; - -public interface BasicThermostat extends HomekitAccessory, TemperatureSensor { - - /** - * Retrieves the current {@link ThermostatMode} of the thermostat. - * - * @return a future that will contain the mode. - */ - CompletableFuture getCurrentMode(); - - /** - * Subscribes to changes in the {@link ThermostatMode} of the thermostat. - * - * @param callback the function to call when the state changes. - */ - void subscribeCurrentMode(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the mode of the thermostat. */ - void unsubscribeCurrentMode(); - - /** - * Sets the {@link ThermostatMode} of the thermostat. - * - * @param mode The {@link ThermostatMode} to set. - * @throws Exception when the change cannot be made. - */ - void setTargetMode(ThermostatMode mode) throws Exception; - - /** - * Retrieves the pending, but not yet complete, {@link ThermostatMode} of the thermostat. - * - * @return a future that will contain the target mode. - */ - CompletableFuture getTargetMode(); - - /** - * Subscribes to changes in the pending, but not yet complete, {@link ThermostatMode} of the - * thermostat. - * - * @param callback the function to call when the state changes. - */ - void subscribeTargetMode(HomekitCharacteristicChangeCallback callback); - - /** - * Unsubscribes from changes in the pending, but not yet complete, {@link ThermostatMode} of the - * thermostat. - */ - void unsubscribeTargetMode(); - - /** - * Retrieves the target temperature, in celsius degrees. - * - * @return a future that will contain the target temperature. - */ - CompletableFuture getTargetTemperature(); - - /** - * Sets the target temperature. - * - * @param value the target temperature, in celsius degrees. - * @throws Exception when the temperature cannot be changed. - */ - void setTargetTemperature(Double value) throws Exception; - - /** - * Subscribes to changes in the target temperature. - * - * @param callback the function to call when the state changes. - */ - void subscribeTargetTemperature(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the target temperature. */ - void unsubscribeTargetTemperature(); - - @Override - default Collection getServices() { - return Collections.singleton(new ThermostatService(this)); - } -} diff --git a/src/main/java/io/github/hapjava/characteristics/BooleanCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/BooleanCharacteristic.java deleted file mode 100644 index f5f064bfb..000000000 --- a/src/main/java/io/github/hapjava/characteristics/BooleanCharacteristic.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.github.hapjava.characteristics; - -import javax.json.JsonNumber; -import javax.json.JsonValue; -import javax.json.JsonValue.ValueType; - -/** - * Characteristic that exposes a Boolean value. - * - * @author Andy Lintner - */ -public abstract class BooleanCharacteristic extends BaseCharacteristic { - - /** - * Default constructor - * - * @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 isWritable indicates whether the value can be changed. - * @param isReadable indicates whether the value can be retrieved. - * @param description a description of the characteristic to be passed to the consuming device. - */ - public BooleanCharacteristic( - String type, boolean isWritable, boolean isReadable, String description) { - super(type, "bool", isWritable, isReadable, description); - } - - /** {@inheritDoc} */ - @Override - protected Boolean convert(JsonValue jsonValue) { - if (jsonValue.getValueType().equals(ValueType.NUMBER)) { - return ((JsonNumber) jsonValue).intValue() > 0; - } - return jsonValue.equals(JsonValue.TRUE); - } - - /** {@inheritDoc} */ - @Override - protected Boolean getDefault() { - return false; - } -} diff --git a/src/main/java/io/github/hapjava/characteristics/CharacteristicEnum.java b/src/main/java/io/github/hapjava/characteristics/CharacteristicEnum.java new file mode 100644 index 000000000..bc8dbc9c2 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/CharacteristicEnum.java @@ -0,0 +1,5 @@ +package io.github.hapjava.characteristics; + +public interface CharacteristicEnum { + int getCode(); +} diff --git a/src/main/java/io/github/hapjava/characteristics/EventableCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/EventableCharacteristic.java index ddb5c5558..1da8f228b 100644 --- a/src/main/java/io/github/hapjava/characteristics/EventableCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/EventableCharacteristic.java @@ -1,7 +1,5 @@ package io.github.hapjava.characteristics; -import io.github.hapjava.HomekitCharacteristicChangeCallback; - /** * A characteristic that can be listened to by the connected iOS device. * diff --git a/src/main/java/io/github/hapjava/impl/ExceptionalConsumer.java b/src/main/java/io/github/hapjava/characteristics/ExceptionalConsumer.java similarity index 65% rename from src/main/java/io/github/hapjava/impl/ExceptionalConsumer.java rename to src/main/java/io/github/hapjava/characteristics/ExceptionalConsumer.java index 84ab5fd0c..653d73c5f 100644 --- a/src/main/java/io/github/hapjava/impl/ExceptionalConsumer.java +++ b/src/main/java/io/github/hapjava/characteristics/ExceptionalConsumer.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl; +package io.github.hapjava.characteristics; public interface ExceptionalConsumer { void accept(T t) throws Exception; diff --git a/src/main/java/io/github/hapjava/HomekitCharacteristicChangeCallback.java b/src/main/java/io/github/hapjava/characteristics/HomekitCharacteristicChangeCallback.java similarity index 86% rename from src/main/java/io/github/hapjava/HomekitCharacteristicChangeCallback.java rename to src/main/java/io/github/hapjava/characteristics/HomekitCharacteristicChangeCallback.java index 6008b9d04..e2d5bc5f2 100644 --- a/src/main/java/io/github/hapjava/HomekitCharacteristicChangeCallback.java +++ b/src/main/java/io/github/hapjava/characteristics/HomekitCharacteristicChangeCallback.java @@ -1,6 +1,4 @@ -package io.github.hapjava; - -import io.github.hapjava.characteristics.EventableCharacteristic; +package io.github.hapjava.characteristics; /** * A callback interface for notifying subscribers that a characteristic value has changed. diff --git a/src/main/java/io/github/hapjava/characteristics/WriteOnlyBooleanCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/WriteOnlyBooleanCharacteristic.java deleted file mode 100644 index d055a0872..000000000 --- a/src/main/java/io/github/hapjava/characteristics/WriteOnlyBooleanCharacteristic.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.github.hapjava.characteristics; - -import java.util.concurrent.CompletableFuture; -import javax.json.JsonObjectBuilder; - -/** - * A characteristic that provides a boolean that can only be written to, not read. - * - * @author Andy Lintner - */ -public abstract class WriteOnlyBooleanCharacteristic extends BooleanCharacteristic { - - /** - * Default constructor - * - * @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. - */ - public WriteOnlyBooleanCharacteristic(String type, String description) { - super(type, true, false, description); - } - - @Override - protected final CompletableFuture getValue() { - return CompletableFuture.completedFuture(false); - } - - @Override - protected final void setJsonValue(JsonObjectBuilder builder, Boolean value) { - // Do nothing - non-readable characteristics cannot have a value key set - } -} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/FirmwareRevisionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/FirmwareRevisionCharacteristic.java new file mode 100644 index 000000000..542cb805b --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/FirmwareRevisionCharacteristic.java @@ -0,0 +1,19 @@ +package io.github.hapjava.characteristics.impl.accessoryinformation; + +import io.github.hapjava.characteristics.impl.base.StaticStringCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** This characteristic describes a firmware revision string */ +public class FirmwareRevisionCharacteristic extends StaticStringCharacteristic { + + public FirmwareRevisionCharacteristic(Supplier> getter) { + super( + "00000052-0000-1000-8000-0026BB765291", + "firmware revision", + Optional.of(getter), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/HardwareRevisionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/HardwareRevisionCharacteristic.java new file mode 100644 index 000000000..91fa21335 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/HardwareRevisionCharacteristic.java @@ -0,0 +1,19 @@ +package io.github.hapjava.characteristics.impl.accessoryinformation; + +import io.github.hapjava.characteristics.impl.base.StaticStringCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** This characteristic describes a hardware revision string x[.y[.z]] (e.g. ”100.1.1”) */ +public class HardwareRevisionCharacteristic extends StaticStringCharacteristic { + + public HardwareRevisionCharacteristic(Supplier> getter) { + super( + "00000053-0000-1000-8000-0026BB765291", + "hardware revision", + Optional.of(getter), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java new file mode 100644 index 000000000..49e3e1fa2 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java @@ -0,0 +1,19 @@ +package io.github.hapjava.characteristics.impl.accessoryinformation; + +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import java.util.Optional; + +/** This characteristic enables accessory to run its identify routine. */ +public class IdentifyCharacteristic extends BooleanCharacteristic { + + public IdentifyCharacteristic(ExceptionalConsumer setter) { + super( + "00000014-0000-1000-8000-0026BB765291", + "identifies the accessory via a physical action on the accessory", + Optional.empty(), + Optional.of(setter), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java new file mode 100644 index 000000000..0610b3b9b --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java @@ -0,0 +1,22 @@ +package io.github.hapjava.characteristics.impl.accessoryinformation; + +import io.github.hapjava.characteristics.impl.base.StaticStringCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** + * This characteristic contains the name of the company whose brand will appear on the accessory, + * e.g., ”Acme”. + */ +public class ManufacturerCharacteristic extends StaticStringCharacteristic { + + public ManufacturerCharacteristic(Supplier> getter) { + super( + "00000020-0000-1000-8000-0026BB765291", + "ame of the manufacturer", + Optional.of(getter), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java new file mode 100644 index 000000000..d448fd984 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java @@ -0,0 +1,22 @@ +package io.github.hapjava.characteristics.impl.accessoryinformation; + +import io.github.hapjava.characteristics.impl.base.StaticStringCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** + * This characteristic contains the manufacturer-specific model of the accessory, e.g. ”A1234”. The + * minimum length of this characteristic must be 1. + */ +public class ModelCharacteristic extends StaticStringCharacteristic { + + public ModelCharacteristic(Supplier> getter) { + super( + "00000021-0000-1000-8000-0026BB765291", + "name of the model", + Optional.of(getter), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/NameCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/NameCharacteristic.java new file mode 100644 index 000000000..ddafc57ab --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/NameCharacteristic.java @@ -0,0 +1,19 @@ +package io.github.hapjava.characteristics.impl.accessoryinformation; + +import io.github.hapjava.characteristics.impl.base.StaticStringCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** This characteristic describes a name and must not be a null value. */ +public class NameCharacteristic extends StaticStringCharacteristic { + + public NameCharacteristic(Supplier> getter) { + super( + "00000023-0000-1000-8000-0026BB765291", + "name of the accessory", + Optional.of(getter), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java new file mode 100644 index 000000000..596c2be77 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java @@ -0,0 +1,22 @@ +package io.github.hapjava.characteristics.impl.accessoryinformation; + +import io.github.hapjava.characteristics.impl.base.StaticStringCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** + * This characteristic contains the manufacturer-specific serial number of the accessory, e.g. + * ”1A2B3C4D5E6F”. The length must be greater than 1. + */ +public class SerialNumberCharacteristic extends StaticStringCharacteristic { + + public SerialNumberCharacteristic(Supplier> getter) { + super( + "00000030-0000-1000-8000-0026BB765291", + "serial number of the accessory", + Optional.of(getter), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/BaseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java similarity index 80% rename from src/main/java/io/github/hapjava/characteristics/BaseCharacteristic.java rename to src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java index f345c9d8b..5260a19a4 100644 --- a/src/main/java/io/github/hapjava/characteristics/BaseCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java @@ -1,9 +1,11 @@ -package io.github.hapjava.characteristics; +package io.github.hapjava.characteristics.impl.base; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; import javax.json.Json; import javax.json.JsonArrayBuilder; import javax.json.JsonObject; @@ -11,23 +13,27 @@ import javax.json.JsonValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.github.hapjava.characteristics.Characteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; /** * Base class for implementing {@link Characteristic}. * * @author Andy Lintner */ -public abstract class BaseCharacteristic implements Characteristic { +public abstract class BaseCharacteristic implements Characteristic, EventableCharacteristic { private final Logger logger = LoggerFactory.getLogger(BaseCharacteristic.class); private final String type; private final String shortType; private final String format; - private final boolean isWritable; - private final boolean isReadable; - private final boolean isEventable; private final String description; + private final boolean isReadable; + private final boolean isWritable; + private final Optional> subscriber; + private final Optional unsubscriber; /** * Default constructor @@ -39,9 +45,17 @@ public abstract class BaseCharacteristic implements Characteristic { * @param isWritable indicates whether the value can be changed. * @param isReadable indicates whether the value can be retrieved. * @param description a description of the characteristic to be passed to the consuming device. + * @param subscriber subscribes to changes + * @param unsubscriber unsubscribes to changes */ public BaseCharacteristic( - String type, String format, boolean isWritable, boolean isReadable, String description) { + String type, + String format, + String description, + boolean isReadable, + boolean isWritable, + Optional> subscriber, + Optional unsubscriber) { if (type == null || format == null || description == null) { throw new NullPointerException(); } @@ -49,10 +63,11 @@ public BaseCharacteristic( this.type = type; this.shortType = this.type.replaceAll("^0*([0-9a-fA-F]+)-0000-1000-8000-0026BB765291$", "$1"); this.format = format; - this.isWritable = isWritable; - this.isReadable = isReadable; - this.isEventable = this instanceof EventableCharacteristic; this.description = description; + this.isReadable = isReadable; + this.isWritable = isWritable; + this.subscriber = subscriber; + this.unsubscriber = unsubscriber; } @Override @@ -71,8 +86,7 @@ protected CompletableFuture makeBuilder(int instanceId) { CompletableFuture futureValue = getValue(); if (futureValue == null) { - logger.error("Could not retrieve value " + this.getClass().getName()); - return null; + futureValue = CompletableFuture.completedFuture(getDefault()); } return futureValue @@ -84,13 +98,13 @@ protected CompletableFuture makeBuilder(int instanceId) { .thenApply( value -> { JsonArrayBuilder perms = Json.createArrayBuilder(); - if (isWritable) { - perms.add("pw"); - } if (isReadable) { perms.add("pr"); } - if (isEventable) { + if (isWritable) { + perms.add("pw"); + } + if (subscriber.isPresent()) { perms.add("ev"); } JsonObjectBuilder builder = @@ -101,7 +115,7 @@ protected CompletableFuture makeBuilder(int instanceId) { .add("format", format) .add("ev", false) .add("description", description); - setJsonValue(builder, value); + if (isReadable) setJsonValue(builder, value); return builder; }); } @@ -110,7 +124,7 @@ protected CompletableFuture makeBuilder(int instanceId) { @Override public final void setValue(JsonValue jsonValue) { try { - this.setValue(convert(jsonValue)); + setValue(convert(jsonValue)); } catch (Exception e) { logger.error("Error while setting JSON value", e); } @@ -127,6 +141,18 @@ public void supplyValue(JsonObjectBuilder builder) { } } + /** {@inheritDoc} */ + @Override + public void subscribe(HomekitCharacteristicChangeCallback callback) { + subscriber.get().accept(callback); + } + + /** {@inheritDoc} */ + @Override + public void unsubscribe() { + unsubscriber.get().run(); + } + /** * Converts from the JSON value to a Java object of the type T * diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java new file mode 100644 index 000000000..29d3b0bd9 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java @@ -0,0 +1,73 @@ +package io.github.hapjava.characteristics.impl.base; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; +import javax.json.JsonNumber; +import javax.json.JsonValue; +import javax.json.JsonValue.ValueType; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; + +/** + * Characteristic that exposes a Boolean value. + * + * @author Andy Lintner + */ +public abstract class BooleanCharacteristic extends BaseCharacteristic { + + private final Optional>> getter; + private final Optional> setter; + + /** + * Default constructor + * + * @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. + */ + public BooleanCharacteristic( + String type, + String description, + Optional>> getter, + Optional> setter, + Optional> subscriber, + Optional unsubscriber) { + super( + type, + "bool", + description, + getter.isPresent(), + setter.isPresent(), + subscriber, + unsubscriber); + this.getter = getter; + this.setter = setter; + } + + /** {@inheritDoc} */ + @Override + protected Boolean convert(JsonValue jsonValue) { + if (jsonValue.getValueType().equals(ValueType.NUMBER)) { + return ((JsonNumber) jsonValue).intValue() > 0; + } + return jsonValue.equals(JsonValue.TRUE); + } + + @Override + protected CompletableFuture getValue() { + return getter.isPresent() ? getter.map(booleanGetter -> booleanGetter.get()).get() : null; + } + + @Override + protected void setValue(Boolean value) throws Exception { + if (setter.isPresent()) setter.get().accept(value); + } + + /** {@inheritDoc} */ + @Override + protected Boolean getDefault() { + return false; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/EnumCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java similarity index 56% rename from src/main/java/io/github/hapjava/characteristics/EnumCharacteristic.java rename to src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java index 84000fbb2..000d53d14 100644 --- a/src/main/java/io/github/hapjava/characteristics/EnumCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java @@ -1,10 +1,17 @@ -package io.github.hapjava.characteristics; +package io.github.hapjava.characteristics.impl.base; +import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; import javax.json.JsonNumber; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; +import io.github.hapjava.characteristics.CharacteristicEnum; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.BaseCharacteristic; /** * Characteristic that exposes an Enum value. Enums are represented as an Integer value in the @@ -13,23 +20,31 @@ * * @author Andy Lintner */ -public abstract class EnumCharacteristic extends BaseCharacteristic { +public abstract class EnumCharacteristic + extends BaseCharacteristic { private final int maxValue; + Optional>> getter; + protected Optional> setter; /** * Default constructor * * @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 isWritable indicates whether the value can be changed. - * @param isReadable indicates whether the value can be retrieved. * @param description a description of the characteristic to be passed to the consuming device. * @param maxValue the number of enum items. */ public EnumCharacteristic( - String type, boolean isWritable, boolean isReadable, String description, int maxValue) { - super(type, "int", isWritable, isReadable, description); + String type, + String description, + int maxValue, + Optional>> getter, + Optional> setter, + Optional> subscriber, + Optional unsubscriber) { + super( + type, "int", description, getter.isPresent(), setter.isPresent(), subscriber, unsubscriber); this.maxValue = maxValue; } @@ -57,6 +72,23 @@ protected Integer convert(JsonValue jsonValue) { } } + @Override + protected CompletableFuture getValue() { + if (!getter.isPresent()) { + return null; + } + return getter.get().get().thenApply(T::getCode); + } + + @Override + protected void setValue(Integer value) throws Exception { + if (!setter.isPresent()) { + return; + } + + // TODO implement setter here? + } + /** {@inheritDoc} */ @Override protected Integer getDefault() { diff --git a/src/main/java/io/github/hapjava/characteristics/FloatCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java similarity index 74% rename from src/main/java/io/github/hapjava/characteristics/FloatCharacteristic.java rename to src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java index b3e086cfc..c50e46ba7 100644 --- a/src/main/java/io/github/hapjava/characteristics/FloatCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java @@ -1,11 +1,16 @@ -package io.github.hapjava.characteristics; +package io.github.hapjava.characteristics.impl.base; +import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; import javax.json.JsonNumber; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; /** * A characteristic that provides a Float value type. @@ -20,14 +25,14 @@ public abstract class FloatCharacteristic extends BaseCharacteristic { private final double maxValue; private final double minStep; private final String unit; + private final Optional>> getter; + private final Optional> setter; /** * Default constructor * * @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 isWritable indicates whether the value can be changed. - * @param isReadable indicates whether the value can be retrieved. * @param description a description of the characteristic to be passed to the consuming device. * @param minValue the minimum supported value. * @param maxValue the maximum supported value @@ -36,18 +41,29 @@ public abstract class FloatCharacteristic extends BaseCharacteristic { */ public FloatCharacteristic( String type, - boolean isWritable, - boolean isReadable, String description, double minValue, double maxValue, double minStep, - String unit) { - super(type, "float", isWritable, isReadable, description); + String unit, + Optional>> getter, + Optional> setter, + Optional> subscriber, + Optional unsubscriber) { + super( + type, + "float", + description, + getter.isPresent(), + setter.isPresent(), + subscriber, + unsubscriber); this.minValue = minValue; this.maxValue = maxValue; - this.minStep = minStep; this.unit = unit; + this.getter = getter; + this.setter = setter; + this.minStep = minStep; } /** {@inheritDoc} */ @@ -75,8 +91,13 @@ protected Double convert(JsonValue jsonValue) { */ @Override protected final CompletableFuture getValue() { + if (!getter.isPresent()) { + return null; + } double rounder = 1 / this.minStep; - return getDoubleValue() + return getter + .get() + .get() .thenApply(d -> d == null ? null : Math.round(d * rounder) / rounder) .thenApply( d -> { @@ -103,16 +124,14 @@ protected final CompletableFuture getValue() { }); } + @Override + protected void setValue(Double value) throws Exception { + setter.get().accept(value); + } + /** {@inheritDoc} */ @Override protected Double getDefault() { return minValue; } - - /** - * Supplies the value of this characteristic as a double. - * - * @return a future that will contain the value. - */ - protected abstract CompletableFuture getDoubleValue(); } diff --git a/src/main/java/io/github/hapjava/characteristics/IntegerCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java similarity index 56% rename from src/main/java/io/github/hapjava/characteristics/IntegerCharacteristic.java rename to src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java index f83000a79..ecaa60475 100644 --- a/src/main/java/io/github/hapjava/characteristics/IntegerCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java @@ -1,9 +1,15 @@ -package io.github.hapjava.characteristics; +package io.github.hapjava.characteristics.impl.base; +import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; import javax.json.JsonNumber; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.BaseCharacteristic; /** * A characteristic that provides an Integer data type. @@ -15,31 +21,40 @@ public abstract class IntegerCharacteristic extends BaseCharacteristic private final int minValue; private final int maxValue; private final String unit; + private final Optional>> getter; + private final Optional> setter; /** * Default constructor * * @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 isWritable indicates whether the value can be changed. - * @param isReadable indicates whether the value can be retrieved. * @param description a description of the characteristic to be passed to the consuming device. * @param minValue the minimum supported value. * @param maxValue the maximum supported value * @param unit a description of the unit this characteristic supports. + * @param getter getter for value + * @param setter setter for value + * @param subscriber subscribers to changes + * @param unsubscriber unsubscribers to changes */ public IntegerCharacteristic( String type, - boolean isWritable, - boolean isReadable, String description, int minValue, int maxValue, - String unit) { - super(type, "int", isWritable, isReadable, description); + String unit, + Optional>> getter, + Optional> setter, + Optional> subscriber, + Optional unsubscriber) { + super( + type, "int", description, getter.isPresent(), setter.isPresent(), subscriber, unsubscriber); this.minValue = minValue; this.maxValue = maxValue; this.unit = unit; + this.getter = getter; + this.setter = setter; } /** {@inheritDoc} */ @@ -56,6 +71,16 @@ protected CompletableFuture makeBuilder(int iid) { }); } + @Override + protected CompletableFuture getValue() { + return getter.map(integerGetter -> integerGetter.get()).get(); + } + + @Override + protected void setValue(Integer value) throws Exception { + setter.get().accept(value); + } + /** {@inheritDoc} */ @Override protected Integer getDefault() { diff --git a/src/main/java/io/github/hapjava/characteristics/StaticStringCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java similarity index 62% rename from src/main/java/io/github/hapjava/characteristics/StaticStringCharacteristic.java rename to src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java index 0665d8359..fc73b6192 100644 --- a/src/main/java/io/github/hapjava/characteristics/StaticStringCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java @@ -1,9 +1,14 @@ -package io.github.hapjava.characteristics; +package io.github.hapjava.characteristics.impl.base; +import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; import javax.json.JsonObjectBuilder; import javax.json.JsonString; import javax.json.JsonValue; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.BaseCharacteristic; /** * A characteristic that provides an immutable String value. @@ -14,19 +19,22 @@ public class StaticStringCharacteristic extends BaseCharacteristic { private static final int MAX_LEN = 255; - private final String value; - + private final Optional>> getter; /** * Default constructor * * @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 value the value of the static string. */ - public StaticStringCharacteristic(String type, String description, String value) { - super(type, "string", false, true, description); - this.value = value; + public StaticStringCharacteristic( + String type, + String description, + Optional>> getter, + Optional> subscriber, + Optional unsubscriber) { + super(type, "string", description, getter.isPresent(), false, subscriber, unsubscriber); + this.getter = getter; } /** {@inheritDoc} */ @@ -50,7 +58,7 @@ public void setValue(String value) throws Exception { /** {@inheritDoc} */ @Override protected CompletableFuture getValue() { - return CompletableFuture.completedFuture(value).thenApply(s -> s != null ? s : "Unavailable"); + return getter.map(stringGetter -> stringGetter.get()).get(); } /** {@inheritDoc} */ diff --git a/src/main/java/io/github/hapjava/characteristics/impl/battery/BatteryLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/battery/BatteryLevelCharacteristic.java new file mode 100644 index 000000000..0fa56ff40 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/battery/BatteryLevelCharacteristic.java @@ -0,0 +1,30 @@ +package io.github.hapjava.characteristics.impl.battery; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the current level of the battery. */ +public class BatteryLevelCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public BatteryLevelCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000068-0000-1000-8000-0026BB765291", + "battery level", + 0, + 100, + "%", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java new file mode 100644 index 000000000..1005fbcf9 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java @@ -0,0 +1,26 @@ +package io.github.hapjava.characteristics.impl.battery; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the charging state of a battery or an accessory. */ +public class ChargingStateCharacteristic extends EnumCharacteristic { + + public ChargingStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000008F-0000-1000-8000-0026BB765291", + "Charging state", + 2, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateEnum.java new file mode 100644 index 000000000..d790ff2f7 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateEnum.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.battery; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Not Charging” 1 ”Charging” 2 ”Not Chargeable” */ +public enum ChargingStateEnum implements CharacteristicEnum { + NOT_CHARGING(0), + CHARGING(1), + NOT_CHARABLE(2); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(ChargingStateEnum.values()) + .collect(Collectors.toMap(ChargingStateEnum::getCode, t -> t)); + } + + public static ChargingStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + ChargingStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java new file mode 100644 index 000000000..24f706662 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java @@ -0,0 +1,30 @@ +package io.github.hapjava.characteristics.impl.battery; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes an accessoryʼs battery status. A status of 1 indicates that the + * battery level of the accessory is low. Value should return to 0 when the battery charges to a + * level thats above the low threshold. + */ +public class StatusLowBatteryCharacteristic extends EnumCharacteristic { + + public StatusLowBatteryCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000079-0000-1000-8000-0026BB765291", + "Status Low Battery", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryEnum.java new file mode 100644 index 000000000..92981247d --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.battery; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Battery level is normal” 1 ”Battery level is low” */ +public enum StatusLowBatteryEnum implements CharacteristicEnum { + NORMAL(0), + LOW(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(StatusLowBatteryEnum.values()) + .collect(Collectors.toMap(StatusLowBatteryEnum::getCode, t -> t)); + } + + public static StatusLowBatteryEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + StatusLowBatteryEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java new file mode 100644 index 000000000..8d84898bb --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java @@ -0,0 +1,31 @@ +package io.github.hapjava.characteristics.impl.carbondioxidesensor; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic indicates if a sensor detects abnormal levels of Carbon Dioxide. Value should + * revert to 0 after the Carbon Dioxide levels drop to normal levels. + */ +public class CarbonDioxideDetectedCharacteristic + extends EnumCharacteristic implements EventableCharacteristic { + + public CarbonDioxideDetectedCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000092-0000-1000-8000-0026BB765291", + "Carbon Dioxide Detected", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedEnum.java new file mode 100644 index 000000000..a6fe144b0 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.carbondioxidesensor; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Carbon Dioxide levels are normal” 1 ”Carbon Dioxide levels are abnormal” */ +public enum CarbonDioxideDetectedEnum implements CharacteristicEnum { + NORMAL(0), + ABNORMAL(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CarbonDioxideDetectedEnum.values()) + .collect(Collectors.toMap(CarbonDioxideDetectedEnum::getCode, t -> t)); + } + + public static CarbonDioxideDetectedEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CarbonDioxideDetectedEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideLevelCharacteristic.java new file mode 100644 index 000000000..9b3ca5447 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideLevelCharacteristic.java @@ -0,0 +1,31 @@ +package io.github.hapjava.characteristics.impl.carbondioxidesensor; + +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic indicates the detected level of Carbon Dioxide in parts per million (ppm). + */ +public class CarbonDioxideLevelCharacteristic extends FloatCharacteristic { + + public CarbonDioxideLevelCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000093-0000-1000-8000-0026BB765291", + "Carbon Dioxide Level", + 0, + 100000, + 1, + "ppm", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java new file mode 100644 index 000000000..5a9201fc2 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java @@ -0,0 +1,32 @@ +package io.github.hapjava.characteristics.impl.carbondioxidesensor; + +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic indicates the highest detected level (ppm) of carbon dioxide detected by a + * sensor. + */ +public class CarbonDioxidePeakLevelCharacteristic extends FloatCharacteristic { + + public CarbonDioxidePeakLevelCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000094-0000-1000-8000-0026BB765291", + "Carbon Dioxide Level", + 0, + 100000, + 1, + "ppm", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java new file mode 100644 index 000000000..ddca27549 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java @@ -0,0 +1,31 @@ +package io.github.hapjava.characteristics.impl.carbonmonoxidesensor; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic indicates if a sensor detects abnormal levels of Carbon Monoxide. Value + * should revert to 0 after the Carbon Monoxide levels drop to normal levels + */ +public class CarbonMonoxideDetectedCharacteristic + extends EnumCharacteristic implements EventableCharacteristic { + + public CarbonMonoxideDetectedCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000069-0000-1000-8000-0026BB765291", + "Carbon Monoxide Detected", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedEnum.java new file mode 100644 index 000000000..2d1adf7f0 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.carbonmonoxidesensor; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Carbon Monoxide levels are normal” 1 ”Carbon Monoxide levels are abnormal” */ +public enum CarbonMonoxideDetectedEnum implements CharacteristicEnum { + NORMAL(0), + ABNORMAL(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CarbonMonoxideDetectedEnum.values()) + .collect(Collectors.toMap(CarbonMonoxideDetectedEnum::getCode, t -> t)); + } + + public static CarbonMonoxideDetectedEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CarbonMonoxideDetectedEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java new file mode 100644 index 000000000..175cb497e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java @@ -0,0 +1,29 @@ +package io.github.hapjava.characteristics.impl.carbonmonoxidesensor; + +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic indicates the Carbon Monoxide levels detected in parts per million (ppm). */ +public class CarbonMonoxideLevelCharacteristic extends FloatCharacteristic { + + public CarbonMonoxideLevelCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000090-0000-1000-8000-0026BB765291", + "Carbon Monoxide Level", + 0, + 100, + 1, + "ppm", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java new file mode 100644 index 000000000..744e53858 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java @@ -0,0 +1,32 @@ +package io.github.hapjava.characteristics.impl.carbonmonoxidesensor; + +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic indicates the highest detected level (ppm) of Carbon Monoxide detected by a + * sensor. + */ +public class CarbonMonoxidePeakLevelCharacteristic extends FloatCharacteristic { + + public CarbonMonoxidePeakLevelCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000091-0000-1000-8000-0026BB765291", + "Carbon Monoxide Peak Level", + 0, + 100000, + 1, + "ppm", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java new file mode 100644 index 000000000..741c6f5b1 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java @@ -0,0 +1,33 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** The Active characteristic indicates whether the service is currently active. */ +public class ActiveCharacteristic extends EnumCharacteristic { + + public ActiveCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000B0-0000-1000-8000-0026BB765291", + "Active", + 1, + 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)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveEnum.java new file mode 100644 index 000000000..7fd0318c4 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveEnum.java @@ -0,0 +1,34 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Inactive” 1 ”Active” 2-255 ”Reserved” */ +public enum ActiveEnum implements CharacteristicEnum { + INACTIVE(0), + ACTIVE(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(ActiveEnum.values()).collect(Collectors.toMap(ActiveEnum::getCode, t -> t)); + } + + public static ActiveEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + ActiveEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java new file mode 100644 index 000000000..e8acb12c5 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java @@ -0,0 +1,28 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes if the service is in use. The service must be Active before the + * value of this characteristic can be set to in use. + */ +public class InUseCharacteristic extends EnumCharacteristic { + public InUseCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000D2-0000-1000-8000-0026BB765291", + "In Use", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/InUseEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/common/InUseEnum.java new file mode 100644 index 000000000..0b368b128 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/InUseEnum.java @@ -0,0 +1,34 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Not in use” 1 ”In use” 2-255 ”Reserved” */ +public enum InUseEnum implements CharacteristicEnum { + NOT_IN_USE(0), + IN_USE(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(InUseEnum.values()).collect(Collectors.toMap(InUseEnum::getCode, t -> t)); + } + + public static InUseEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + InUseEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java new file mode 100644 index 000000000..f9a0539ee --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java @@ -0,0 +1,37 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes if the service is configured for use. For example, all of the + * valves in an irrigation system may not be configured depending on physical wire connection. If + * the accessory supports updating through HAP, then it must also advertise Paired Write in the + * permissions. + */ +public class IsConfiguredCharacteristic extends EnumCharacteristic { + public IsConfiguredCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000D6-0000-1000-8000-0026BB765291", + "Is Configured", + 1, + 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)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredEnum.java new file mode 100644 index 000000000..1d20f6b3b --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Not Configured” 1 ”Configured” 2-255 ”Reserved” */ +public enum IsConfiguredEnum implements CharacteristicEnum { + NOT_CONFIGURED(0), + CONFIGURED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(IsConfiguredEnum.values()) + .collect(Collectors.toMap(IsConfiguredEnum::getCode, t -> t)); + } + + public static IsConfiguredEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + IsConfiguredEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java new file mode 100644 index 000000000..7de444190 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java @@ -0,0 +1,27 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the current state of an obstruction sensor, such as one that is + * used in a garage door. If the state is true then there is an obstruction detected. + */ +public class ObstructionDetectedCharacteristic extends BooleanCharacteristic { + public ObstructionDetectedCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000024-0000-1000-8000-0026BB765291", + "Current state of an obstruction sensor", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/OnCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/OnCharacteristic.java new file mode 100644 index 000000000..21f0999f9 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/OnCharacteristic.java @@ -0,0 +1,27 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic represents the states for “on” and “off”. */ +public class OnCharacteristic extends BooleanCharacteristic { + + public OnCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000025-0000-1000-8000-0026BB765291", + "On / Off state", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelIndexCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelIndexCharacteristic.java new file mode 100644 index 000000000..c5fa2c05b --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelIndexCharacteristic.java @@ -0,0 +1,28 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** + * This characteristic should be used identify the index of the label that maps to "Service Label + * Namespace” used by the accessory. + */ +public class ServiceLabelIndexCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public ServiceLabelIndexCharacteristic(Supplier> getter) { + super( + "000000CB-0000-1000-8000-0026BB765291", + "service label index", + 0, + 100, + "%", + Optional.of(getter), + Optional.empty(), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceCharacteristic.java new file mode 100644 index 000000000..d7444e9a2 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceCharacteristic.java @@ -0,0 +1,26 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** + * This characteristic describes the naming schema for an accessory. For example, this + * characteristic can be used to describe the type of labels used to identify individual services of + * an accessory. + */ +public class ServiceLabelNamespaceCharacteristic + extends EnumCharacteristic { + public ServiceLabelNamespaceCharacteristic( + Supplier> getter) { + super( + "000000CD-0000-1000-8000-0026BB765291", + "service label namespace", + 1, + Optional.of(getter), + Optional.empty(), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceEnum.java new file mode 100644 index 000000000..0523a276a --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceEnum.java @@ -0,0 +1,37 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 0 ”Dots. For e.g ”.” ”..” ”...” ”....”” 1 ”Arabic numerals. For e.g. 0,1,2,3” 2-255 ”Reserved” + */ +public enum ServiceLabelNamespaceEnum implements CharacteristicEnum { + DOTS(0), + ARABIC_NUMERALS(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(ServiceLabelNamespaceEnum.values()) + .collect(Collectors.toMap(ServiceLabelNamespaceEnum::getCode, t -> t)); + } + + public static ServiceLabelNamespaceEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + ServiceLabelNamespaceEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java new file mode 100644 index 000000000..d46a994d0 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java @@ -0,0 +1,27 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes an accessoryʼs current working status. A value of true indicates + * that the accessory is active and is functioning without any errors. + */ +public class StatusActiveCharacteristic extends BooleanCharacteristic { + public StatusActiveCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000075-0000-1000-8000-0026BB765291", + "Accessory active and functioning", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java new file mode 100644 index 000000000..d972b76a3 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java @@ -0,0 +1,30 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes an accessory which has a fault. A non-zero value indicates that the + * accessory has experienced a fault that may be interfering with its intended functionality. A + * value of 0 indicates that there is no fault. + */ +public class StatusFaultCharacteristic extends EnumCharacteristic { + + public StatusFaultCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000077-0000-1000-8000-0026BB765291", + "Status Fault", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultEnum.java new file mode 100644 index 000000000..4fd866847 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”No Fault” 1 ”General Fault” */ +public enum StatusFaultEnum implements CharacteristicEnum { + NO_FAULT(0), + GENERAL_FAULT(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(StatusFaultEnum.values()) + .collect(Collectors.toMap(StatusFaultEnum::getCode, t -> t)); + } + + public static StatusFaultEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + StatusFaultEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java new file mode 100644 index 000000000..52a1c3f99 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java @@ -0,0 +1,30 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes an accessory which has been tampered with. A status of 1 indicates + * that the accessory has been tampered with. Value should return to 0 when the accessory has been + * reset to a non-tampered state. + */ +public class StatusTamperedCharacteristic extends EnumCharacteristic { + + public StatusTamperedCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000007A-0000-1000-8000-0026BB765291", + "Status Tampered", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedEnum.java new file mode 100644 index 000000000..2d725c132 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Accessory is not tampered” 1 ”Accessory is tampered with” */ +public enum StatusTamperedEnum implements CharacteristicEnum { + NOT_TAMPERED(0), + TAMPERED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(StatusTamperedEnum.values()) + .collect(Collectors.toMap(StatusTamperedEnum::getCode, t -> t)); + } + + public static StatusTamperedEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + StatusTamperedEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java new file mode 100644 index 000000000..81a2ea8f4 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java @@ -0,0 +1,31 @@ +package io.github.hapjava.characteristics.impl.contactsensor; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the state of a door/window contact sensor. A value of 0 indicates + * that the contact is detected. A value of 1 indicates that the contact is not detected. + */ +public class ContactSensorStateCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public ContactSensorStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000006A-0000-1000-8000-0026BB765291", + "Contact Sensor State", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactStateEnum.java new file mode 100644 index 000000000..275ed9734 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactStateEnum.java @@ -0,0 +1,37 @@ +package io.github.hapjava.characteristics.impl.contactsensor; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/* + * 0 ”Contact is detected” + * 1 ”Contact is not detected” + */ +public enum ContactStateEnum implements CharacteristicEnum { + DETECTED(0), + NOT_DETECTED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(ContactStateEnum.values()) + .collect(Collectors.toMap(ContactStateEnum::getCode, t -> t)); + } + + public static ContactStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + ContactStateEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java new file mode 100644 index 000000000..bd0aa8a44 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java @@ -0,0 +1,28 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the current state of the fan. */ +public class CurrentFanStateCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public CurrentFanStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000AF-0000-1000-8000-0026BB765291", + "Current Fan State", + 2, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateEnum.java new file mode 100644 index 000000000..674924e9a --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +public enum CurrentFanStateEnum implements CharacteristicEnum { + INACTIVE(0), + IDLE(1), + BLOWING_AIR(2); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CurrentFanStateEnum.values()) + .collect(Collectors.toMap(CurrentFanStateEnum::getCode, t -> t)); + } + + public static CurrentFanStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CurrentFanStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java new file mode 100644 index 000000000..5d1f7a29d --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java @@ -0,0 +1,41 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes a way to lock a set of physical controls on an accessory (eg. child + * lock). + */ +public class LockPhysicalControlsCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public LockPhysicalControlsCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000A7-0000-1000-8000-0026BB765291", + "Lock Physical Locks", + 1, + 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)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsEnum.java new file mode 100644 index 000000000..87503ed96 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Control lock disabled” 1 ”Control lock enabled” */ +public enum LockPhysicalControlsEnum implements CharacteristicEnum { + CONTROL_LOCK_DISABLED(0), + CONTROL_LOCK_ENABLED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(LockPhysicalControlsEnum.values()) + .collect(Collectors.toMap(LockPhysicalControlsEnum::getCode, t -> t)); + } + + public static LockPhysicalControlsEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + LockPhysicalControlsEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionCharacteristic.java new file mode 100644 index 000000000..ce689c1dd --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionCharacteristic.java @@ -0,0 +1,38 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the direction of rotation of a fan. */ +public class RotationDirectionCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public RotationDirectionCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000028-0000-1000-8000-0026BB765291", + "Rotation direction", + 1, + 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(RotationDirectionEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionEnum.java new file mode 100644 index 000000000..20651fd1c --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Clockwise” 1 ”Counter-clockwise” 2-255 ”Reserved” */ +public enum RotationDirectionEnum implements CharacteristicEnum { + CLOCKWISE(0), + COUNTER_CLOCKWISE(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(RotationDirectionEnum.values()) + .collect(Collectors.toMap(RotationDirectionEnum::getCode, t -> t)); + } + + public static RotationDirectionEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + RotationDirectionEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationSpeedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationSpeedCharacteristic.java new file mode 100644 index 000000000..27c715530 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationSpeedCharacteristic.java @@ -0,0 +1,32 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the rotation speed of a fan. */ +public class RotationSpeedCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public RotationSpeedCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000029-0000-1000-8000-0026BB765291", + "Rotation Speed", + 0, + 100, + "%", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeCharacteristic.java new file mode 100644 index 000000000..c1bd55bda --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeCharacteristic.java @@ -0,0 +1,38 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes if swing mode is enabled. */ +public class SwingModeCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public SwingModeCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000B6-0000-1000-8000-0026BB765291", + "Swing Mode", + 1, + 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(SwingModeEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeEnum.java new file mode 100644 index 000000000..928bafd27 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Swing disabled” 1 ”Swing enabled” */ +public enum SwingModeEnum implements CharacteristicEnum { + SWING_DISABLED(0), + SWING_ENABLED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(SwingModeEnum.values()) + .collect(Collectors.toMap(SwingModeEnum::getCode, t -> t)); + } + + public static SwingModeEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + SwingModeEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateCharacteristic.java new file mode 100644 index 000000000..057c95b7a --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateCharacteristic.java @@ -0,0 +1,38 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the target state of the fan. */ +public class TargetFanStateCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public TargetFanStateCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000BF-0000-1000-8000-0026BB765291", + "Target Fan State", + 1, + 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(TargetFanStateEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateEnum.java new file mode 100644 index 000000000..600f07401 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.fan; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Manual” 1 ”Auto” */ +public enum TargetFanStateEnum implements CharacteristicEnum { + MANUAL(0), + AUTO(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(TargetFanStateEnum.values()) + .collect(Collectors.toMap(TargetFanStateEnum::getCode, t -> t)); + } + + public static TargetFanStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + TargetFanStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateCharacteristic.java new file mode 100644 index 000000000..77a9e9d91 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateCharacteristic.java @@ -0,0 +1,28 @@ +package io.github.hapjava.characteristics.impl.garagedoor; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the current state of a door. */ +public class CurrentDoorStateCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public CurrentDoorStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000000E-0000-1000-8000-0026BB765291", + "Current Door State", + 4, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateEnum.java new file mode 100644 index 000000000..145046a7e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateEnum.java @@ -0,0 +1,42 @@ +package io.github.hapjava.characteristics.impl.garagedoor; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 0 ”Open. The door is fully open.” 1 ”Closed. The door is fully closed.” 2 ”Opening. The door is + * actively opening.” 3 ”Closing. The door is actively closing.” 4 ”Stopped. The door is not moving, + * and it is not fully open nor fully closed.” 5-255 ”Reserved” + */ +public enum CurrentDoorStateEnum implements CharacteristicEnum { + OPEN(0), + CLOSED(1), + OPENING(2), + CLOSING(3), + SOPPED(4); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CurrentDoorStateEnum.values()) + .collect(Collectors.toMap(CurrentDoorStateEnum::getCode, t -> t)); + } + + public static CurrentDoorStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CurrentDoorStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateCharacteristic.java new file mode 100644 index 000000000..c3d5735db --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateCharacteristic.java @@ -0,0 +1,38 @@ +package io.github.hapjava.characteristics.impl.garagedoor; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the target state of a door. */ +public class TargetDoorStateCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public TargetDoorStateCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000032-0000-1000-8000-0026BB765291", + "Target Door State", + 1, + 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(TargetDoorStateEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateEnum.java new file mode 100644 index 000000000..ca282fdc3 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.garagedoor; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Open” 1 ”Closed” 2-255 ”Reserved” */ +public enum TargetDoorStateEnum implements CharacteristicEnum { + OPEN(0), + CLOSED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(TargetDoorStateEnum.values()) + .collect(Collectors.toMap(TargetDoorStateEnum::getCode, t -> t)); + } + + public static TargetDoorStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + TargetDoorStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java new file mode 100644 index 000000000..95b56d831 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java @@ -0,0 +1,32 @@ +package io.github.hapjava.characteristics.impl.humiditysensor; + +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the current relative humidity of the accessoryʼs environment. The + * value is expressed as a percentage (%). + */ +public class CurrentRelativeHumidityCharacteristic extends FloatCharacteristic { + + public CurrentRelativeHumidityCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000010-0000-1000-8000-0026BB765291", + "Current Relative Humidity", + 0, + 100, + 1, + "%", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java new file mode 100644 index 000000000..d9c7bec52 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java @@ -0,0 +1,34 @@ +package io.github.hapjava.characteristics.impl.humiditysensor; + +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the target relative humidity that the accessory is actively + * attempting to reach. The value is expressed as a percentage (%). + */ +public class TargetRelativeHumidityCharacteristic extends FloatCharacteristic { + + public TargetRelativeHumidityCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000034-0000-1000-8000-0026BB765291", + "Target Relative Humidity", + 0, + 100, + 1, + "%", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java new file mode 100644 index 000000000..72237a537 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java @@ -0,0 +1,31 @@ +package io.github.hapjava.characteristics.impl.leaksensor; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic indicates if a sensor detected a leak (e.g. water leak, gas leak). A value of + * 1 indicates that a leak is detected. Value should return to 0 when leak stops. + */ +public class LeakDetectedStateCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public LeakDetectedStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000070-0000-1000-8000-0026BB765291", + "Leak Detected State", + 3, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateEnum.java new file mode 100644 index 000000000..1708230c8 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.leaksensor; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Leak is not detected” 1 ”Leak is detected” */ +public enum LeakDetectedStateEnum implements CharacteristicEnum { + LEAK_NOT_DETECTED(0), + LEAK_DETECTED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(LeakDetectedStateEnum.values()) + .collect(Collectors.toMap(LeakDetectedStateEnum::getCode, t -> t)); + } + + public static LeakDetectedStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + LeakDetectedStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/BrightnessCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/BrightnessCharacteristic.java new file mode 100644 index 000000000..d47be8cde --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/BrightnessCharacteristic.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.lightbulb; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes a perceived level of brightness, e.g. for lighting, and can be used + * for backlights or color. The value is expressed as a percentage (%) of the maximum level of + * supported brightness. + */ +public class BrightnessCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public BrightnessCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000008-0000-1000-8000-0026BB765291", + "level of brightness", + 0, + 100, + "%", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java new file mode 100644 index 000000000..722782140 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.lightbulb; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes color temperature which is represented in reciprocal megaKelvin + * (MK-1) or mirek scale. (M = 1,000,000 / K where M is the desired mirek value and K is temperature + * in Kelvin) + */ +public class ColorTemperatureCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public ColorTemperatureCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000CE-0000-1000-8000-0026BB765291", + "color temperature", + 50, + 400, + "K", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/HueCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/HueCharacteristic.java new file mode 100644 index 000000000..8d8823529 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/HueCharacteristic.java @@ -0,0 +1,30 @@ +package io.github.hapjava.characteristics.impl.lightbulb; + +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes hue or color. */ +public class HueCharacteristic extends FloatCharacteristic { + public HueCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000013-0000-1000-8000-0026BB765291", + "hue or color", + 0, + 360, + 1, + "arcdegrees", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/SaturationCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/SaturationCharacteristic.java new file mode 100644 index 000000000..8a07caca5 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/SaturationCharacteristic.java @@ -0,0 +1,33 @@ +package io.github.hapjava.characteristics.impl.lightbulb; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes color saturation. */ +public class SaturationCharacteristic extends FloatCharacteristic + implements EventableCharacteristic { + + public SaturationCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000002F-0000-1000-8000-0026BB765291", + "color saturation", + 0, + 100, + 1, + "%", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java new file mode 100644 index 000000000..d2dd850cc --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java @@ -0,0 +1,32 @@ +package io.github.hapjava.characteristics.impl.lightsensor; + +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic indicates the current light level. The value is expressed in Lux units + * (lumens/m2) + */ +public class CurrentAmbientLightLevelCharacteristic extends FloatCharacteristic { + + public CurrentAmbientLightLevelCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000006B-0000-1000-8000-0026BB765291", + "ambient light level", + 0.0001, + 100000, + 0.0001, + "lux", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateCharacteristic.java new file mode 100644 index 000000000..df2f27592 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateCharacteristic.java @@ -0,0 +1,26 @@ +package io.github.hapjava.characteristics.impl.lock; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** The current state of the physical security mechanism (e.g. deadbolt). */ +public class LockCurrentStateCharacteristic extends EnumCharacteristic { + + public LockCurrentStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000001D-0000-1000-8000-0026BB765291", + "Current Lock State", + 3, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateEnum.java new file mode 100644 index 000000000..66eb23afe --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateEnum.java @@ -0,0 +1,37 @@ +package io.github.hapjava.characteristics.impl.lock; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Unsecured” 1 ”Secured” 2 ”Jammed” 3 ”Unknown” 4-255 ”Reserved” */ +public enum LockCurrentStateEnum implements CharacteristicEnum { + UNSECURED(0), + SECURED(1), + JAMMED(2), + UNKNOWN(3); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(LockCurrentStateEnum.values()) + .collect(Collectors.toMap(LockCurrentStateEnum::getCode, t -> t)); + } + + public static LockCurrentStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + LockCurrentStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateCharacteristic.java new file mode 100644 index 000000000..4c7821dc6 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateCharacteristic.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.lock; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** The target state of the physical security mechanism (e.g. deadbolt). */ +public class LockTargetStateCharacteristic extends EnumCharacteristic { + + public LockTargetStateCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000001E-0000-1000-8000-0026BB765291", + "Target Lock State", + 1, + 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(LockTargetStateEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateEnum.java new file mode 100644 index 000000000..d5aa0d536 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.lock; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Unsecured” 1 ”Secured” 4-255 ”Reserved” */ +public enum LockTargetStateEnum implements CharacteristicEnum { + UNSECURED(0), + SECURED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(LockTargetStateEnum.values()) + .collect(Collectors.toMap(LockTargetStateEnum::getCode, t -> t)); + } + + public static LockTargetStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + LockTargetStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/motionsensor/MotionDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/motionsensor/MotionDetectedCharacteristic.java new file mode 100644 index 000000000..239e004de --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/motionsensor/MotionDetectedCharacteristic.java @@ -0,0 +1,25 @@ +package io.github.hapjava.characteristics.impl.motionsensor; + +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic indicates if motion (e.g. a person moving) was detected. */ +public class MotionDetectedCharacteristic extends BooleanCharacteristic { + + public MotionDetectedCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000022-0000-1000-8000-0026BB765291", + "Motion detection", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedCharacteristic.java new file mode 100644 index 000000000..995cbcf21 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedCharacteristic.java @@ -0,0 +1,26 @@ +package io.github.hapjava.characteristics.impl.occupancysensor; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic indicates if occupancy was detected (e.g. a person present). */ +public class OccupancyDetectedCharacteristic extends EnumCharacteristic { + + public OccupancyDetectedCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000071-0000-1000-8000-0026BB765291", + "Occupancy Detected", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedEnum.java new file mode 100644 index 000000000..688fa9d24 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.occupancysensor; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Occupancy is not detected” 1 ”Occupancy is detected” */ +public enum OccupancyDetectedEnum implements CharacteristicEnum { + NOT_DETECTED(0), + DETECTED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(OccupancyDetectedEnum.values()) + .collect(Collectors.toMap(OccupancyDetectedEnum::getCode, t -> t)); + } + + public static OccupancyDetectedEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + OccupancyDetectedEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java new file mode 100644 index 000000000..7158f4b96 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java @@ -0,0 +1,28 @@ +package io.github.hapjava.characteristics.impl.outlet; + +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes if the power outlet has an appliance e.g., a floor lamp, physically + * plugged in. This characteristic is set to True even if the plugged-in appliance is off. + */ +public class OutletInUseCharacteristic extends BooleanCharacteristic { + + public OutletInUseCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000026-0000-1000-8000-0026BB765291", + "Outlet in Use", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateCharacteristic.java new file mode 100644 index 000000000..0324a5554 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateCharacteristic.java @@ -0,0 +1,27 @@ +package io.github.hapjava.characteristics.impl.securitysystem; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the state of a security system */ +public class CurrentSecuritySystemStateCharacteristic + extends EnumCharacteristic { + + public CurrentSecuritySystemStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000066-0000-1000-8000-0026BB765291", + "Current Security System State", + 4, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateEnum.java new file mode 100644 index 000000000..90a66cf7e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateEnum.java @@ -0,0 +1,52 @@ +package io.github.hapjava.characteristics.impl.securitysystem; + +import io.github.hapjava.accessories.SecuritySystemAccessory; +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * The current state of a {@link SecuritySystemAccessory}. Unlike {@link + * TargetSecuritySystemStateEnum}, this enum includes a triggered state. 0 ”Stay Arm. The home is + * occupied and the residents are active. e.g. morning or evenings” 1 ”Away Arm. The home is + * unoccupied” 2 ”Night Arm. The home is occupied and the residents are sleeping” 3 ”Disarmed” 4 + * ”Alarm Triggered” 5-255 ”Reserved” + * + * @author Gaston Dombiak + */ +public enum CurrentSecuritySystemStateEnum implements CharacteristicEnum { + + /** The home is occupied and residents are active. */ + STAY_ARM(0), + /** The home is unoccupied. */ + AWAY_ARM(1), + /** The home is occupied and residents are sleeping. */ + NIGHT_ARM(2), + /** The security system is disarmed. */ + DISARMED(3), + /** The security system is triggered. */ + TRIGGERED(4); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CurrentSecuritySystemStateEnum.values()) + .collect(Collectors.toMap(CurrentSecuritySystemStateEnum::getCode, t -> t)); + } + + public static CurrentSecuritySystemStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CurrentSecuritySystemStateEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java new file mode 100644 index 000000000..2c92b9eec --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java @@ -0,0 +1,30 @@ +package io.github.hapjava.characteristics.impl.securitysystem; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the type of alarm triggered by a security system. A value of 1 + * indicates an ʼunknownʼ cause. Value should revert to 0 when the alarm conditions are cleared. + */ +public class SecuritySystemAlarmTypeCharacteristic + extends EnumCharacteristic { + + public SecuritySystemAlarmTypeCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000008E-0000-1000-8000-0026BB765291", + "Alert Type", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeEnum.java new file mode 100644 index 000000000..00bc0f24e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeEnum.java @@ -0,0 +1,45 @@ +package io.github.hapjava.characteristics.impl.securitysystem; + +import io.github.hapjava.accessories.SecuritySystemAccessory; +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Type of alarm of a {@link SecuritySystemAccessory}. + * + *

This characteristic describes the type of alarm triggered by a security system. A value of 1 + * indicates an ʼunknownʼ cause. Value should revert to 0 when the alarm conditions are cleared. + * + * @author Gaston Dombiak + */ +public enum SecuritySystemAlarmTypeEnum implements CharacteristicEnum { + + /** Alarm conditions are cleared */ + NO_ALARM(0), + /** Alarm type is not known */ + UNKNOWN(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(SecuritySystemAlarmTypeEnum.values()) + .collect(Collectors.toMap(SecuritySystemAlarmTypeEnum::getCode, t -> t)); + } + + public static SecuritySystemAlarmTypeEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + SecuritySystemAlarmTypeEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateCharacteristic.java new file mode 100644 index 000000000..849ffa80a --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateCharacteristic.java @@ -0,0 +1,37 @@ +package io.github.hapjava.characteristics.impl.securitysystem; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the target state of the security system. */ +public class TargetSecuritySystemStateCharacteristic + extends EnumCharacteristic { + + public TargetSecuritySystemStateCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000067-0000-1000-8000-0026BB765291", + "Target Security System State", + 3, + 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(TargetSecuritySystemStateEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateEnum.java new file mode 100644 index 000000000..81b0adc22 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateEnum.java @@ -0,0 +1,50 @@ +package io.github.hapjava.characteristics.impl.securitysystem; + +import io.github.hapjava.accessories.SecuritySystemAccessory; +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * The target state of a {@link SecuritySystemAccessory}. + * + *

0 ”Stay Arm. The home is occupied and the residents are active. e.g. morning or evenings” 1 + * ”Away Arm. The home is unoccupied” 2 ”Night Arm. The home is occupied and the residents are + * sleeping” 3 ”Disarm” 4-255 ”Reserved” + * + * @author Gaston Dombiak + */ +public enum TargetSecuritySystemStateEnum implements CharacteristicEnum { + + /** Arm the system when the home is occupied and residents are active. */ + STAY_ARM(0), + /** Arm the system when the home is unoccupied. */ + AWAY_ARM(1), + /** Arm the system when the home is occupied and residents are sleeping. */ + NIGHT_ARM(2), + /** Disarm the system. */ + DISARM(3); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(TargetSecuritySystemStateEnum.values()) + .collect(Collectors.toMap(TargetSecuritySystemStateEnum::getCode, t -> t)); + } + + public static TargetSecuritySystemStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + TargetSecuritySystemStateEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java new file mode 100644 index 000000000..55d415c49 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java @@ -0,0 +1,29 @@ +package io.github.hapjava.characteristics.impl.smokesensor; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic indicates if a sensor detects abnormal levels of smoke. A value of 1 + * indicates that smoke levels are abnormal. Value should return to 0 when smoke levels are normal. + */ +public class SmokeDetectedCharacteristic extends EnumCharacteristic { + + public SmokeDetectedCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000076-0000-1000-8000-0026BB765291", + "Smoke Detected", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedStateEnum.java new file mode 100644 index 000000000..c6e3b6d5d --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedStateEnum.java @@ -0,0 +1,34 @@ +package io.github.hapjava.characteristics.impl.smokesensor; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Smoke is not detected” 1 ”Smoke is detected” */ +public enum SmokeDetectedStateEnum implements CharacteristicEnum { + NOT_DETECTED(0), + DETECTED(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(SmokeDetectedStateEnum.values()) + .collect(Collectors.toMap(SmokeDetectedStateEnum::getCode, t -> t)); + } + + public static SmokeDetectedStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + SmokeDetectedStateEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java new file mode 100644 index 000000000..93f4e17fe --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the cooling threshold in Celsius for accessories that support + * simultaneous heating and cooling. The value of this characteristic represents the maximum + * temperature that must be reached before cooling is turned on. + */ +public class CoolingThresholdTemperatureCharacteristic extends FloatCharacteristic { + + public CoolingThresholdTemperatureCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000000D-0000-1000-8000-0026BB765291", + "cooling threshold", + 10, + 35, + 0.1, + "C", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java new file mode 100644 index 000000000..e58f42105 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java @@ -0,0 +1,30 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the current mode of an accessory that supports cooling or heating + * its environment, e.g. a thermostat is ”heating” a room to 75 degrees Fahrenheit. + */ +public class CurrentHeatingCoolingStateCharacteristic + extends EnumCharacteristic { + + public CurrentHeatingCoolingStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000000F-0000-1000-8000-0026BB765291", + "Current heating cooling mode", + 2, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateEnum.java new file mode 100644 index 000000000..9f2c01f85 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateEnum.java @@ -0,0 +1,37 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 0 ”Off.” 1 ”Heat. The Heater is currently on.” 2 ”Cool. Cooler is currently on.” 3-255 ”Reserved” + */ +public enum CurrentHeatingCoolingStateEnum implements CharacteristicEnum { + OFF(0), + HEAT(1), + COOL(2); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CurrentHeatingCoolingStateEnum.values()) + .collect(Collectors.toMap(CurrentHeatingCoolingStateEnum::getCode, t -> t)); + } + + public static CurrentHeatingCoolingStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CurrentHeatingCoolingStateEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java new file mode 100644 index 000000000..f80d760fc --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java @@ -0,0 +1,29 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** characteristic describes the current temperature of the environment in Celsius */ +public class CurrentTemperatureCharacteristic extends FloatCharacteristic { + + public CurrentTemperatureCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000011-0000-1000-8000-0026BB765291", + "current temperature", + 0, + 100, + 0.1, + "C", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java new file mode 100644 index 000000000..0693b737c --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the heating threshold in Celsius for accessories that support + * simultaneous heating and cooling. The value of this characteristic represents the minimum + * temperature that must be reached before heating is turned on. + */ +public class HeatingThresholdTemperatureCharacteristic extends FloatCharacteristic { + + public HeatingThresholdTemperatureCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000012-0000-1000-8000-0026BB765291", + "heating threshold", + 0, + 25, + 0.1, + "C", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java new file mode 100644 index 000000000..93bdd4e2e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java @@ -0,0 +1,40 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the target mode of an accessory that supports heating/cooling, e.g. + * a thermostat. + */ +public class TargetHeatingCoolingStateCharacteristic + extends EnumCharacteristic { + + public TargetHeatingCoolingStateCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000033-0000-1000-8000-0026BB765291", + "Target heating cooling mode", + 3, + 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(TargetHeatingCoolingStateEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateEnum.java new file mode 100644 index 000000000..62f2a3d81 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateEnum.java @@ -0,0 +1,43 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 0 ”Off” 1 ”Heat. If the current temperature is below the target temperature then turn on + * heating.” 2 ”Cool. If the current temperature is above the target temperature then turn on + * cooling.” 3 ”Auto. Turn on heating or cooling to maintain temperature within the heating and + * cooling threshold of the target temperature.” 4-255 ”Reserved” + * + * @author Andy Lintner + */ +public enum TargetHeatingCoolingStateEnum implements CharacteristicEnum { + OFF(0), + HEAT(1), + COOL(2), + AUTO(3); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(TargetHeatingCoolingStateEnum.values()) + .collect(Collectors.toMap(t -> t.getCode(), t -> t)); + } + + public static TargetHeatingCoolingStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + private TargetHeatingCoolingStateEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java new file mode 100644 index 000000000..9e2e504dd --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the target temperature in Celsius that the accessory is actively + * attempting to reach. For example, a thermostat cooling a room to 75 degrees Fahrenheit would set + * the target temperature value to 23.9 degrees Celsius. + */ +public class TargetTemperatureCharacteristic extends FloatCharacteristic { + + public TargetTemperatureCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000035-0000-1000-8000-0026BB765291", + "target temperature", + 10, + 38, + 0.1, + "C", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitCharacteristic.java new file mode 100644 index 000000000..0492ce51b --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitCharacteristic.java @@ -0,0 +1,40 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes units of temperature used for presentation purposes (e.g. the units + * of temperature displayed on the screen). + */ +public class TemperatureDisplayUnitCharacteristic + extends EnumCharacteristic { + + public TemperatureDisplayUnitCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000036-0000-1000-8000-0026BB765291", + "Temperature units", + 1, + 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(TemperatureDisplayUnitEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitEnum.java new file mode 100644 index 000000000..8440f5de9 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitEnum.java @@ -0,0 +1,41 @@ +package io.github.hapjava.characteristics.impl.thermostat; + +import io.github.hapjava.accessories.TemperatureSensorAccessory; +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * The temperature unit used by a {@link TemperatureSensorAccessory}. + * + *

0 ”Celsius” 1 ”Fahrenheit” 2-255 ”Reserved” + * + * @author Andy Lintner + */ +public enum TemperatureDisplayUnitEnum implements CharacteristicEnum { + CELSIUS(0), + FAHRENHEIT(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(TemperatureDisplayUnitEnum.values()) + .collect(Collectors.toMap(t -> t.getCode(), t -> t)); + } + + static TemperatureDisplayUnitEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + private TemperatureDisplayUnitEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/valve/RemainingDurationCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/valve/RemainingDurationCharacteristic.java new file mode 100644 index 000000000..5f16e396a --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/valve/RemainingDurationCharacteristic.java @@ -0,0 +1,38 @@ +package io.github.hapjava.characteristics.impl.valve; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the remaining duration on the accessory. Notifications on this + * characteristic must only be used if the remaining duration increases/decreases from the + * accessoryʼs usual countdown of remaining duration and when the duration reaches 0. e.g. It must + * not send notifications when the remaining duration is ticking down from 100,99,98... if 100 was + * the initial Set duration. However, if the remaining duration changes to 95 from 92 (increase) or + * 85 from 92 (decrease which is not part of the usual duration countdown), it must send a + * notification. This duration is defined in seconds. + */ +public class RemainingDurationCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public RemainingDurationCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000D4-0000-1000-8000-0026BB765291", + "remaining duration", + 0, + 3600, + "s", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/valve/SetDurationCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/valve/SetDurationCharacteristic.java new file mode 100644 index 000000000..22be62b64 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/valve/SetDurationCharacteristic.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.valve; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the set duration. For a Valve” this duration defines how long a + * valve should be set to ʼIn Useʼ. Once the valve is ʼIn Useʼ, any changes to this characteristic + * take affect in the next operation when the Valve is Active. This duration is defined in seconds. + */ +public class SetDurationCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public SetDurationCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000D3-0000-1000-8000-0026BB765291", + "set duration", + 0, + 3600, + "s", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeCharacteristic.java new file mode 100644 index 000000000..b3a55278c --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeCharacteristic.java @@ -0,0 +1,26 @@ +package io.github.hapjava.characteristics.impl.valve; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** This characteristic describes the type of valve. */ +public class ValveTypeCharacteristic extends EnumCharacteristic { + + public ValveTypeCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000D5-0000-1000-8000-0026BB765291", + "Valve type", + 3, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeEnum.java new file mode 100644 index 000000000..d18d923e2 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeEnum.java @@ -0,0 +1,42 @@ +package io.github.hapjava.characteristics.impl.valve; + +import io.github.hapjava.accessories.ValveAccessory; +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * The mode used by a {@link ValveAccessory} + * + *

0 ”Generic valve” 1 ”Irrigation” 2 ”Shower head” 3 ”Water faucet” 4-255 ”Reserved” + * + * @author Tim Harper + */ +public enum ValveTypeEnum implements CharacteristicEnum { + GENERIC(0), + IRRIGATION(1), + SHOWER(2), + WATER_FAUCET(3); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(ValveTypeEnum.values()).collect(Collectors.toMap(t -> t.getCode(), t -> t)); + } + + public static ValveTypeEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + private ValveTypeEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java new file mode 100644 index 000000000..8295d1db9 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.windowcovering; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the current angle of horizontal slats for accessories such as + * windows, fans, portable heater/coolers etc. This characteristic takes values between -90 and 90. + * A value of 0 indicates that the slats are rotated to a fully open position. A value of -90 + * indicates that the slats are rotated all the way in a direction where the user-facing edge is + * higher than the window-facing edge. + */ +public class CurrentHorizontalTiltAngleCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public CurrentHorizontalTiltAngleCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000006C-0000-1000-8000-0026BB765291", + "current horizontal tilt angel", + -90, + 90, + "arcdegrees", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentPositionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentPositionCharacteristic.java new file mode 100644 index 000000000..aaf19ec2e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentPositionCharacteristic.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.windowcovering; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the current position of accessories. This characteristic can be + * used with doors, windows, awnings or window coverings. For windows and doors, a value of 0 + * indicates that a window (or door) is fully closed while a value of 100 indicates a fully open + * position. For blinds/shades/awnings, a value of 0 indicates a position that permits the least + * light and a value of 100 indicates a position that allows most light. + */ +public class CurrentPositionCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public CurrentPositionCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000006D-0000-1000-8000-0026BB765291", + "current position", + 0, + 100, + "%", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java new file mode 100644 index 000000000..7504b4302 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.windowcovering; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the current angle of vertical slats for accessories such as + * windows, fans, portable heater/coolers etc. This characteristic takes values between -90 and 90. + * A value of 0 indicates that the slats are rotated to be fully open. A value of -90 indicates that + * the slats are rotated all the way in a direction where the user-facing edge is to the left of the + * window-facing edge. + */ +public class CurrentVerticalTiltAngleCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public CurrentVerticalTiltAngleCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000006E-0000-1000-8000-0026BB765291", + "current vertical tilt angel", + -90, + 90, + "arcdegrees", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java new file mode 100644 index 000000000..4d9892c73 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java @@ -0,0 +1,23 @@ +package io.github.hapjava.characteristics.impl.windowcovering; + +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import java.util.Optional; + +/** + * This characteristic causes the service such as door or window covering to stop at its current + * position. A value of 1 must hold the state of the accessory. For e.g, the window must stop moving + * when this characteristic is written a value of 1. A value of 0 should be ignored. + */ +public class HoldPositionCharacteristic extends BooleanCharacteristic { + + public HoldPositionCharacteristic(ExceptionalConsumer setter) { + super( + "0000006F-0000-1000-8000-0026BB765291", + "Hold Position", + Optional.empty(), + Optional.of(setter), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java new file mode 100644 index 000000000..163ff8a2e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java @@ -0,0 +1,29 @@ +package io.github.hapjava.characteristics.impl.windowcovering; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the state of the position of accessories. This characteristic can + * be used with doors, windows, awnings or window coverings for presentation purposes. + */ +public class PositionStateCharacteristic extends EnumCharacteristic { + + public PositionStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000072-0000-1000-8000-0026BB765291", + "Position state", + 2, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateEnum.java new file mode 100644 index 000000000..b82b56a27 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateEnum.java @@ -0,0 +1,39 @@ +package io.github.hapjava.characteristics.impl.windowcovering; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 0 ”Going to the minimum value specified in metadata” 1 ”Going to the maximum value specified in + * metadata” 2 ”Stopped” 3-255 ”Reserved” + */ +public enum PositionStateEnum implements CharacteristicEnum { + DECREASING(0), + INCREASING(1), + STOPPED(2); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(PositionStateEnum.values()) + .collect(Collectors.toMap(PositionStateEnum::getCode, t -> t)); + } + + public static PositionStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + PositionStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java new file mode 100644 index 000000000..34e425b3e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.windowcovering; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the target angle of horizontal slats for accessories such as + * windows, fans, portable heater/coolers etc. + */ +public class TargetHorizontalTiltAngleCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public TargetHorizontalTiltAngleCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000B2-0000-1000-8000-0026BB765291", + "target horizontal tilt angel", + -90, + 90, + "arcdegrees", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetPositionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetPositionCharacteristic.java new file mode 100644 index 000000000..02b3125a6 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetPositionCharacteristic.java @@ -0,0 +1,38 @@ +package io.github.hapjava.characteristics.impl.windowcovering; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the target position of accessories. This characteristic can be used + * with doors, windows, awnings or window coverings. For windows and doors, a value of 0 indicates + * that a window (or door) is fully closed while a value of 100 indicates a fully open position. For + * blinds/shades/awnings, a value of 0 indicates a position that permits the least light and a value + * of 100 indicates a position that allows most light. + */ +public class TargetPositionCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public TargetPositionCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000007C-0000-1000-8000-0026BB765291", + "target position", + 0, + 100, + "%", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java new file mode 100644 index 000000000..a3edbcad3 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.windowcovering; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the target angle of vertical slats for accessories such as windows, + * fans, portable heater/coolers etc. + */ +public class TargetVerticalTiltAngleCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public TargetVerticalTiltAngleCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000007D-0000-1000-8000-0026BB765291", + "target vertical tilt angel", + -90, + 90, + "arcdegrees", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/impl/HomekitBridge.java b/src/main/java/io/github/hapjava/impl/HomekitBridge.java deleted file mode 100644 index acce783ce..000000000 --- a/src/main/java/io/github/hapjava/impl/HomekitBridge.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.github.hapjava.impl; - -import io.github.hapjava.Service; -import io.github.hapjava.impl.accessories.Bridge; -import java.util.Collection; -import java.util.Collections; - -public class HomekitBridge implements Bridge { - - private final String label; - private final String serialNumber; - private final String model; - private final String manufacturer; - - public HomekitBridge(String label, String serialNumber, String model, String manufacturer) { - this.label = label; - this.serialNumber = serialNumber; - this.model = model; - this.manufacturer = manufacturer; - } - - @Override - public String getLabel() { - return label; - } - - @Override - public String getSerialNumber() { - return serialNumber; - } - - @Override - public String getModel() { - return model; - } - - @Override - public String getManufacturer() { - return manufacturer; - } - - @Override - public Collection getServices() { - return Collections.emptyList(); - } - - @Override - public int getId() { - return 1; - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java deleted file mode 100644 index 5ce03856a..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.github.hapjava.impl.characteristics.carbondioxide; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.CarbonDioxideSensor; -import io.github.hapjava.accessories.properties.CarbonDioxideDetectedState; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CarbonDioxideDetectedCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final CarbonDioxideSensor carbonDioxideSensor; - - public CarbonDioxideDetectedCharacteristic(CarbonDioxideSensor carbonDioxideSensor) { - super("00000092-0000-1000-8000-0026BB765291", false, true, "Carbon Dioxide Detected", 1); - this.carbonDioxideSensor = carbonDioxideSensor; - } - - @Override - protected CompletableFuture getValue() { - return carbonDioxideSensor - .getCarbonDioxideDetectedState() - .thenApply(CarbonDioxideDetectedState::getCode); - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - carbonDioxideSensor.subscribeCarbonDioxideDetectedState(callback); - } - - @Override - public void unsubscribe() { - carbonDioxideSensor.unsubscribeCarbonDioxideDetectedState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java deleted file mode 100644 index f6f6ecc9e..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.github.hapjava.impl.characteristics.carbondioxide; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.CarbonDioxideSensor; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.FloatCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CarbonDioxideLevelCharacteristic extends FloatCharacteristic - implements EventableCharacteristic { - - private final CarbonDioxideSensor sensor; - - public CarbonDioxideLevelCharacteristic(CarbonDioxideSensor sensor) { - super( - "00000093-0000-1000-8000-0026BB765291", - false, - true, - "Carbon Dioxide level", - 0, - 100000, - 0.1, - "%"); - this.sensor = sensor; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - sensor.subscribeCarbonDioxideLevel(callback); - } - - @Override - public void unsubscribe() { - sensor.unsubscribeCarbonDioxideLevel(); - } - - @Override - protected void setValue(Double value) throws Exception { - // Read Only - } - - @Override - protected CompletableFuture getDoubleValue() { - return sensor.getCarbonDioxideLevel(); - } - - @Override - public String toString() { - return "CarbonDioxideLevelCharacteristic{" - + "sensor level =" - + sensor.getCarbonDioxideLevel() - + '}'; - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/carbonmonoxide/CarbonMonoxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/carbonmonoxide/CarbonMonoxideDetectedCharacteristic.java deleted file mode 100644 index cf38cc837..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/carbonmonoxide/CarbonMonoxideDetectedCharacteristic.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.github.hapjava.impl.characteristics.carbonmonoxide; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.CarbonMonoxideSensor; -import io.github.hapjava.accessories.properties.CarbonMonoxideDetectedState; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CarbonMonoxideDetectedCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final CarbonMonoxideSensor carbonMonoxideSensor; - - public CarbonMonoxideDetectedCharacteristic(CarbonMonoxideSensor carbonMonoxideSensor) { - super("00000069-0000-1000-8000-0026BB765291", false, true, "Carbon Monoxide Detected", 1); - this.carbonMonoxideSensor = carbonMonoxideSensor; - } - - @Override - protected CompletableFuture getValue() { - return carbonMonoxideSensor - .getCarbonMonoxideDetectedState() - .thenApply(CarbonMonoxideDetectedState::getCode); - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - carbonMonoxideSensor.subscribeCarbonMonoxideDetectedState(callback); - } - - @Override - public void unsubscribe() { - carbonMonoxideSensor.unsubscribeCarbonMonoxideDetectedState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/common/ActiveCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/common/ActiveCharacteristic.java deleted file mode 100644 index bdb0f9866..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/common/ActiveCharacteristic.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.github.hapjava.impl.characteristics.common; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.impl.ExceptionalConsumer; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class ActiveCharacteristic extends BooleanCharacteristic implements EventableCharacteristic { - - private final Supplier> getter; - private final ExceptionalConsumer setter; - private final Consumer subscriber; - private final Runnable unsubscriber; - - public ActiveCharacteristic( - Supplier> getter, - ExceptionalConsumer setter, - Consumer subscriber, - Runnable unsubscriber) { - super("000000B0-0000-1000-8000-0026BB765291", true, true, "Active"); - this.getter = getter; - this.setter = setter; - this.subscriber = subscriber; - this.unsubscriber = unsubscriber; - } - - @Override - protected CompletableFuture getValue() { - return getter.get(); - } - - @Override - protected void setValue(Boolean value) throws Exception { - setter.accept(value); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - subscriber.accept(callback); - } - - @Override - public void unsubscribe() { - unsubscriber.run(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/common/BatteryLevelCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/common/BatteryLevelCharacteristic.java deleted file mode 100644 index d3afac86a..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/common/BatteryLevelCharacteristic.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.github.hapjava.impl.characteristics.common; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Supplier; - -/** - * This characteristic is used by a stand-alone BatteryService, which describes a stand-alone - * battery device, not the battery status of a battery operated device such as a motion sensor. - */ -public class BatteryLevelCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final Supplier> getter; - private final Consumer subscriber; - private final Runnable unsubscriber; - - public BatteryLevelCharacteristic( - Supplier> getter, - Consumer subscriber, - Runnable unsubscriber) { - super("00000068-0000-1000-8000-0026BB765291", false, true, "Battery Level", 0, 100, "%"); - this.getter = getter; - this.subscriber = subscriber; - this.unsubscriber = unsubscriber; - } - - @Override - protected CompletableFuture getValue() { - return getter.get(); - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - subscriber.accept(callback); - } - - @Override - public void unsubscribe() { - unsubscriber.run(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/common/InUseCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/common/InUseCharacteristic.java deleted file mode 100644 index b58b2eea3..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/common/InUseCharacteristic.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.hapjava.impl.characteristics.common; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class InUseCharacteristic extends BooleanCharacteristic implements EventableCharacteristic { - - private final Supplier> getter; - private final Consumer subscriber; - private final Runnable unsubscriber; - - public InUseCharacteristic( - Supplier> getter, - Consumer subscriber, - Runnable unsubscriber) { - super("000000D2-0000-1000-8000-0026BB765291", false, true, "InUse"); - this.getter = getter; - this.subscriber = subscriber; - this.unsubscriber = unsubscriber; - } - - @Override - protected CompletableFuture getValue() { - return getter.get(); - } - - @Override - protected void setValue(Boolean value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - subscriber.accept(callback); - } - - @Override - public void unsubscribe() { - unsubscriber.run(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/common/LowBatteryStatusCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/common/LowBatteryStatusCharacteristic.java deleted file mode 100644 index 28869e3cd..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/common/LowBatteryStatusCharacteristic.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.github.hapjava.impl.characteristics.common; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class LowBatteryStatusCharacteristic extends BooleanCharacteristic - implements EventableCharacteristic { - - private final Supplier> getter; - private final Consumer subscriber; - private final Runnable unsubscriber; - - public LowBatteryStatusCharacteristic( - Supplier> getter, - Consumer subscriber, - Runnable unsubscriber) { - super("00000079-0000-1000-8000-0026BB765291", false, true, "Status Low Battery"); - this.getter = getter; - this.subscriber = subscriber; - this.unsubscriber = unsubscriber; - } - - @Override - protected CompletableFuture getValue() { - return getter.get(); - } - - @Override - protected void setValue(Boolean value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - subscriber.accept(callback); - } - - @Override - public void unsubscribe() { - unsubscriber.run(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/common/Name.java b/src/main/java/io/github/hapjava/impl/characteristics/common/Name.java deleted file mode 100644 index 35bebcacc..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/common/Name.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.github.hapjava.impl.characteristics.common; - -import io.github.hapjava.characteristics.StaticStringCharacteristic; - -public class Name extends StaticStringCharacteristic { - - public Name(String label) { - super("00000023-0000-1000-8000-0026BB765291", "Name of the accessory", label); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/common/ObstructionDetectedCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/common/ObstructionDetectedCharacteristic.java deleted file mode 100644 index e4d242a8e..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/common/ObstructionDetectedCharacteristic.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.github.hapjava.impl.characteristics.common; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class ObstructionDetectedCharacteristic extends BooleanCharacteristic - implements EventableCharacteristic { - - private final Supplier> getter; - private final Consumer subscriber; - private final Runnable unsubscriber; - - public ObstructionDetectedCharacteristic( - Supplier> getter, - Consumer subscriber, - Runnable unsubscriber) { - super("00000024-0000-1000-8000-0026BB765291", false, true, "An obstruction has been detected"); - this.getter = getter; - this.subscriber = subscriber; - this.unsubscriber = unsubscriber; - } - - @Override - protected void setValue(Boolean value) throws Exception { - // Read Only - } - - @Override - protected CompletableFuture getValue() { - return getter.get(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - subscriber.accept(callback); - } - - @Override - public void unsubscribe() { - unsubscriber.run(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/common/PowerStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/common/PowerStateCharacteristic.java deleted file mode 100644 index 0b045247c..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/common/PowerStateCharacteristic.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.github.hapjava.impl.characteristics.common; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.impl.ExceptionalConsumer; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class PowerStateCharacteristic extends BooleanCharacteristic - implements EventableCharacteristic { - - private final Supplier> getter; - private final ExceptionalConsumer setter; - private final Consumer subscriber; - private final Runnable unsubscriber; - - public PowerStateCharacteristic( - Supplier> getter, - ExceptionalConsumer setter, - Consumer subscriber, - Runnable unsubscriber) { - super("00000025-0000-1000-8000-0026BB765291", true, true, "Turn on and off"); - this.getter = getter; - this.setter = setter; - this.subscriber = subscriber; - this.unsubscriber = unsubscriber; - } - - @Override - public void setValue(Boolean value) throws Exception { - setter.accept(value); - } - - @Override - protected CompletableFuture getValue() { - return getter.get(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - subscriber.accept(callback); - } - - @Override - public void unsubscribe() { - unsubscriber.run(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/common/RemainingDurationCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/common/RemainingDurationCharacteristic.java deleted file mode 100644 index b5d9f3e4f..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/common/RemainingDurationCharacteristic.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.github.hapjava.impl.characteristics.common; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class RemainingDurationCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final Supplier> getter; - private final Consumer subscriber; - private final Runnable unsubscriber; - - public RemainingDurationCharacteristic( - Supplier> getter, - Consumer subscriber, - Runnable unsubscriber) { - super( - "000000D4-0000-1000-8000-0026BB765291", - false, - true, - "Remaining Duration", - 0, - 3600, - "seconds"); - this.getter = getter; - this.subscriber = subscriber; - this.unsubscriber = unsubscriber; - } - - @Override - protected CompletableFuture getValue() { - return getter.get(); - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - subscriber.accept(callback); - } - - @Override - public void unsubscribe() { - unsubscriber.run(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/contactsensor/ContactSensorStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/contactsensor/ContactSensorStateCharacteristic.java deleted file mode 100644 index e246fa5e7..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/contactsensor/ContactSensorStateCharacteristic.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.impl.characteristics.contactsensor; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.ContactSensor; -import io.github.hapjava.accessories.properties.ContactState; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class ContactSensorStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final ContactSensor contactSensor; - - public ContactSensorStateCharacteristic(ContactSensor contactSensor) { - super("0000006A-0000-1000-8000-0026BB765291", false, true, "Contact State", 1); - this.contactSensor = contactSensor; - } - - @Override - protected CompletableFuture getValue() { - return contactSensor.getCurrentState().thenApply(ContactState::getCode); - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - contactSensor.subscribeContactState(callback); - } - - @Override - public void unsubscribe() { - contactSensor.unsubscribeContactState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/fan/RotationDirectionCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/fan/RotationDirectionCharacteristic.java deleted file mode 100644 index b545f8210..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/fan/RotationDirectionCharacteristic.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.impl.characteristics.fan; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.Fan; -import io.github.hapjava.accessories.properties.RotationDirection; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class RotationDirectionCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final Fan fan; - - public RotationDirectionCharacteristic(Fan fan) { - super("00000028-0000-1000-8000-0026BB765291", true, true, "Rotation Direction", 1); - this.fan = fan; - } - - @Override - protected void setValue(Integer value) throws Exception { - fan.setRotationDirection(RotationDirection.fromCode(value)); - } - - @Override - protected CompletableFuture getValue() { - return fan.getRotationDirection().thenApply(s -> s.getCode()); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - fan.subscribeRotationDirection(callback); - } - - @Override - public void unsubscribe() { - fan.unsubscribeRotationDirection(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/fan/RotationSpeedCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/fan/RotationSpeedCharacteristic.java deleted file mode 100644 index 43c905802..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/fan/RotationSpeedCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.fan; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.Fan; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class RotationSpeedCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final Fan fan; - - public RotationSpeedCharacteristic(Fan fan) { - super("00000029-0000-1000-8000-0026BB765291", true, true, "Rotation speed", 0, 100, "%"); - this.fan = fan; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - fan.subscribeRotationSpeed(callback); - } - - @Override - public void unsubscribe() { - fan.unsubscribeRotationSpeed(); - } - - @Override - protected void setValue(Integer value) throws Exception { - fan.setRotationSpeed(value); - } - - @Override - protected CompletableFuture getValue() { - return fan.getRotationSpeed(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/garage/CurrentDoorStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/garage/CurrentDoorStateCharacteristic.java deleted file mode 100644 index 7d6944b96..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/garage/CurrentDoorStateCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.garage; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.GarageDoor; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CurrentDoorStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final GarageDoor door; - - public CurrentDoorStateCharacteristic(GarageDoor door) { - super("0000000E-0000-1000-8000-0026BB765291", false, true, "Current Door State", 4); - this.door = door; - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - protected CompletableFuture getValue() { - return door.getCurrentDoorState().thenApply(s -> s.getCode()); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - door.subscribeCurrentDoorState(callback); - } - - @Override - public void unsubscribe() { - door.unsubscribeCurrentDoorState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/garage/TargetDoorStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/garage/TargetDoorStateCharacteristic.java deleted file mode 100644 index 20e8c30a5..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/garage/TargetDoorStateCharacteristic.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.impl.characteristics.garage; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.GarageDoor; -import io.github.hapjava.accessories.properties.DoorState; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class TargetDoorStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final GarageDoor door; - - public TargetDoorStateCharacteristic(GarageDoor door) { - super("00000032-0000-1000-8000-0026BB765291", true, true, "Target Door State", 1); - this.door = door; - } - - @Override - protected void setValue(Integer value) throws Exception { - door.setTargetDoorState(DoorState.fromCode(value)); - } - - @Override - protected CompletableFuture getValue() { - return door.getTargetDoorState().thenApply(s -> s.getCode()); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - door.subscribeTargetDoorState(callback); - } - - @Override - public void unsubscribe() { - door.unsubscribeTargetDoorState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/humiditysensor/CurrentRelativeHumidityCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/humiditysensor/CurrentRelativeHumidityCharacteristic.java deleted file mode 100644 index 5dda83acf..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/humiditysensor/CurrentRelativeHumidityCharacteristic.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.github.hapjava.impl.characteristics.humiditysensor; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.HumiditySensor; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.FloatCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CurrentRelativeHumidityCharacteristic extends FloatCharacteristic - implements EventableCharacteristic { - - private final HumiditySensor sensor; - - public CurrentRelativeHumidityCharacteristic(HumiditySensor sensor) { - super( - "00000010-0000-1000-8000-0026BB765291", - false, - true, - "Current relative humidity", - 0, - 100, - 0.1, - "%"); - this.sensor = sensor; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - sensor.subscribeCurrentRelativeHumidity(callback); - } - - @Override - public void unsubscribe() { - sensor.unsubscribeCurrentRelativeHumidity(); - } - - @Override - protected void setValue(Double value) throws Exception { - // Read Only - } - - @Override - protected CompletableFuture getDoubleValue() { - return sensor.getCurrentRelativeHumidity(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/information/Identify.java b/src/main/java/io/github/hapjava/impl/characteristics/information/Identify.java deleted file mode 100644 index 097cda764..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/information/Identify.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.github.hapjava.impl.characteristics.information; - -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.characteristics.WriteOnlyBooleanCharacteristic; - -public class Identify extends WriteOnlyBooleanCharacteristic { - - private HomekitAccessory accessory; - - public Identify(HomekitAccessory accessory) throws Exception { - super( - "00000014-0000-1000-8000-0026BB765291", - "Identifies the accessory via a physical action on the accessory"); - this.accessory = accessory; - } - - @Override - public void setValue(Boolean value) throws Exception { - if (value) { - accessory.identify(); - } - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/information/Manufacturer.java b/src/main/java/io/github/hapjava/impl/characteristics/information/Manufacturer.java deleted file mode 100644 index 8a43fce08..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/information/Manufacturer.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.github.hapjava.impl.characteristics.information; - -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.characteristics.StaticStringCharacteristic; - -public class Manufacturer extends StaticStringCharacteristic { - - public Manufacturer(HomekitAccessory accessory) throws Exception { - super( - "00000020-0000-1000-8000-0026BB765291", - "The name of the manufacturer", - accessory.getManufacturer()); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/information/Model.java b/src/main/java/io/github/hapjava/impl/characteristics/information/Model.java deleted file mode 100644 index aa4235900..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/information/Model.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.github.hapjava.impl.characteristics.information; - -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.characteristics.StaticStringCharacteristic; - -public class Model extends StaticStringCharacteristic { - - public Model(HomekitAccessory accessory) throws Exception { - super("00000021-0000-1000-8000-0026BB765291", "The name of the model", accessory.getModel()); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/information/SerialNumber.java b/src/main/java/io/github/hapjava/impl/characteristics/information/SerialNumber.java deleted file mode 100644 index a4f90564b..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/information/SerialNumber.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.github.hapjava.impl.characteristics.information; - -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.characteristics.StaticStringCharacteristic; - -public class SerialNumber extends StaticStringCharacteristic { - - public SerialNumber(HomekitAccessory accessory) throws Exception { - super( - "00000030-0000-1000-8000-0026BB765291", - "The serial number of the accessory", - accessory.getSerialNumber()); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/leaksensor/LeakDetectedStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/leaksensor/LeakDetectedStateCharacteristic.java deleted file mode 100644 index ba29c1dbc..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/leaksensor/LeakDetectedStateCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.leaksensor; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.LeakSensor; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class LeakDetectedStateCharacteristic extends BooleanCharacteristic - implements EventableCharacteristic { - - private final LeakSensor leakSensor; - - public LeakDetectedStateCharacteristic(LeakSensor leakSensor) { - super("00000070-0000-1000-8000-0026BB765291", false, true, "Leak Detected"); - this.leakSensor = leakSensor; - } - - @Override - protected CompletableFuture getValue() { - return leakSensor.getLeakDetected(); - } - - @Override - protected void setValue(Boolean value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - leakSensor.subscribeLeakDetected(callback); - } - - @Override - public void unsubscribe() { - leakSensor.unsubscribeLeakDetected(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/light/AmbientLightLevelCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/light/AmbientLightLevelCharacteristic.java deleted file mode 100644 index b280ceb05..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/light/AmbientLightLevelCharacteristic.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.github.hapjava.impl.characteristics.light; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.LightSensor; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.FloatCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class AmbientLightLevelCharacteristic extends FloatCharacteristic - implements EventableCharacteristic { - - private final LightSensor lightSensor; - - public AmbientLightLevelCharacteristic(LightSensor lightSensor) { - super( - "0000006B-0000-1000-8000-0026BB765291", - false, - true, - "Current ambient light level", - 0.0001, - 100000, - 0.0001, - "lux"); - this.lightSensor = lightSensor; - } - - @Override - protected void setValue(Double value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - lightSensor.subscribeCurrentAmbientLightLevel(callback); - } - - @Override - public void unsubscribe() { - lightSensor.unsubscribeCurrentAmbientLightLevel(); - } - - @Override - protected CompletableFuture getDoubleValue() { - return lightSensor.getCurrentAmbientLightLevel(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/lightbulb/BrightnessCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/lightbulb/BrightnessCharacteristic.java deleted file mode 100644 index 7dc85c619..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/lightbulb/BrightnessCharacteristic.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.hapjava.impl.characteristics.lightbulb; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.DimmableLightbulb; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class BrightnessCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final DimmableLightbulb lightbulb; - - public BrightnessCharacteristic(DimmableLightbulb lightbulb) { - super( - "00000008-0000-1000-8000-0026BB765291", - true, - true, - "Adjust brightness of the light", - 0, - 100, - "%"); - this.lightbulb = lightbulb; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - lightbulb.subscribeBrightness(callback); - } - - @Override - public void unsubscribe() { - lightbulb.unsubscribeBrightness(); - } - - @Override - protected void setValue(Integer value) throws Exception { - lightbulb.setBrightness(value); - } - - @Override - protected CompletableFuture getValue() { - return lightbulb.getBrightness(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/lightbulb/HueCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/lightbulb/HueCharacteristic.java deleted file mode 100644 index ea9df9457..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/lightbulb/HueCharacteristic.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.hapjava.impl.characteristics.lightbulb; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.ColorfulLightbulb; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.FloatCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class HueCharacteristic extends FloatCharacteristic implements EventableCharacteristic { - - private final ColorfulLightbulb lightbulb; - - public HueCharacteristic(ColorfulLightbulb lightbulb) { - super( - "00000013-0000-1000-8000-0026BB765291", - true, - true, - "Adjust hue of the light", - 0, - 360, - 1, - "arcdegrees"); - this.lightbulb = lightbulb; - } - - @Override - protected void setValue(Double value) throws Exception { - lightbulb.setHue(value); - } - - @Override - protected CompletableFuture getDoubleValue() { - return lightbulb.getHue(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - lightbulb.subscribeHue(callback); - } - - @Override - public void unsubscribe() { - lightbulb.unsubscribeHue(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/lightbulb/SaturationCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/lightbulb/SaturationCharacteristic.java deleted file mode 100644 index ca48a31f0..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/lightbulb/SaturationCharacteristic.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.github.hapjava.impl.characteristics.lightbulb; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.ColorfulLightbulb; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.FloatCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class SaturationCharacteristic extends FloatCharacteristic - implements EventableCharacteristic { - - private final ColorfulLightbulb lightbulb; - - public SaturationCharacteristic(ColorfulLightbulb lightbulb) { - super( - "0000002F-0000-1000-8000-0026BB765291", - true, - true, - "Adjust saturation of the light", - 0, - 100, - 1, - "%"); - this.lightbulb = lightbulb; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - lightbulb.subscribeSaturation(callback); - } - - @Override - public void unsubscribe() { - lightbulb.unsubscribeSaturation(); - } - - @Override - protected void setValue(Double value) throws Exception { - lightbulb.setSaturation(value); - } - - @Override - protected CompletableFuture getDoubleValue() { - return lightbulb.getSaturation(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/lock/mechanism/CurrentLockMechanismStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/lock/mechanism/CurrentLockMechanismStateCharacteristic.java deleted file mode 100644 index 1182c43e9..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/lock/mechanism/CurrentLockMechanismStateCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.lock.mechanism; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.LockMechanism; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CurrentLockMechanismStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final LockMechanism lock; - - public CurrentLockMechanismStateCharacteristic(LockMechanism lock) { - super("0000001D-0000-1000-8000-0026BB765291", false, true, "Current lock state", 3); - this.lock = lock; - } - - @Override - protected void setValue(Integer value) throws Exception { - // Not writable - } - - @Override - protected CompletableFuture getValue() { - return lock.getCurrentMechanismState().thenApply(s -> s.getCode()); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - lock.subscribeCurrentMechanismState(callback); - } - - @Override - public void unsubscribe() { - lock.unsubscribeCurrentMechanismState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/lock/mechanism/TargetLockMechanismStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/lock/mechanism/TargetLockMechanismStateCharacteristic.java deleted file mode 100644 index e351c4c0b..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/lock/mechanism/TargetLockMechanismStateCharacteristic.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.impl.characteristics.lock.mechanism; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.LockableLockMechanism; -import io.github.hapjava.accessories.properties.LockMechanismState; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class TargetLockMechanismStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final LockableLockMechanism lock; - - public TargetLockMechanismStateCharacteristic(LockableLockMechanism lock) { - super("0000001E-0000-1000-8000-0026BB765291", true, true, "Current lock state", 3); - this.lock = lock; - } - - @Override - protected void setValue(Integer value) throws Exception { - lock.setTargetMechanismState(LockMechanismState.fromCode(value)); - } - - @Override - protected CompletableFuture getValue() { - return lock.getTargetMechanismState().thenApply(s -> s.getCode()); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - lock.subscribeTargetMechanismState(callback); - } - - @Override - public void unsubscribe() { - lock.unsubscribeTargetMechanismState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/motionsensor/MotionDetectedStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/motionsensor/MotionDetectedStateCharacteristic.java deleted file mode 100644 index 1c451fe32..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/motionsensor/MotionDetectedStateCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.motionsensor; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.MotionSensor; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class MotionDetectedStateCharacteristic extends BooleanCharacteristic - implements EventableCharacteristic { - - private final MotionSensor motionSensor; - - public MotionDetectedStateCharacteristic(MotionSensor motionSensor) { - super("00000022-0000-1000-8000-0026BB765291", false, true, "Motion Detected"); - this.motionSensor = motionSensor; - } - - @Override - protected CompletableFuture getValue() { - return motionSensor.getMotionDetected(); - } - - @Override - protected void setValue(Boolean value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - motionSensor.subscribeMotionDetected(callback); - } - - @Override - public void unsubscribe() { - motionSensor.unsubscribeMotionDetected(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/occupancysensor/OccupancyDetectedStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/occupancysensor/OccupancyDetectedStateCharacteristic.java deleted file mode 100644 index 813101039..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/occupancysensor/OccupancyDetectedStateCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.occupancysensor; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.OccupancySensor; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class OccupancyDetectedStateCharacteristic extends BooleanCharacteristic - implements EventableCharacteristic { - - private final OccupancySensor occupancySensor; - - public OccupancyDetectedStateCharacteristic(OccupancySensor occupancySensor) { - super("00000071-0000-1000-8000-0026BB765291", false, true, "Occupancy Detected"); - this.occupancySensor = occupancySensor; - } - - @Override - protected CompletableFuture getValue() { - return occupancySensor.getOccupancyDetected(); - } - - @Override - protected void setValue(Boolean value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - occupancySensor.subscribeOccupancyDetected(callback); - } - - @Override - public void unsubscribe() { - occupancySensor.unsubscribeOccupancyDetected(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/outlet/OutletInUseCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/outlet/OutletInUseCharacteristic.java deleted file mode 100644 index 98bd2108b..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/outlet/OutletInUseCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.outlet; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.Outlet; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class OutletInUseCharacteristic extends BooleanCharacteristic - implements EventableCharacteristic { - - private final Outlet outlet; - - public OutletInUseCharacteristic(Outlet outlet) { - super("00000026-0000-1000-8000-0026BB765291", false, true, "The outlet is in use"); - this.outlet = outlet; - } - - @Override - protected void setValue(Boolean value) throws Exception { - // Read Only - } - - @Override - protected CompletableFuture getValue() { - return outlet.getOutletInUse(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - outlet.subscribeOutletInUse(callback); - } - - @Override - public void unsubscribe() { - outlet.unsubscribeOutletInUse(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/securitysystem/CurrentSecuritySystemStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/securitysystem/CurrentSecuritySystemStateCharacteristic.java deleted file mode 100644 index 0d0b1b23e..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/securitysystem/CurrentSecuritySystemStateCharacteristic.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.github.hapjava.impl.characteristics.securitysystem; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.SecuritySystem; -import io.github.hapjava.accessories.properties.CurrentSecuritySystemState; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CurrentSecuritySystemStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final SecuritySystem securitySystem; - - public CurrentSecuritySystemStateCharacteristic(SecuritySystem securitySystem) { - super("00000066-0000-1000-8000-0026BB765291", false, true, "Current security system state", 4); - this.securitySystem = securitySystem; - } - - @Override - protected CompletableFuture getValue() { - return securitySystem - .getCurrentSecuritySystemState() - .thenApply(CurrentSecuritySystemState::getCode); - } - - @Override - protected void setValue(Integer value) throws Exception { - // Not writable - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - securitySystem.subscribeCurrentSecuritySystemState(callback); - } - - @Override - public void unsubscribe() { - securitySystem.unsubscribeCurrentSecuritySystemState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/securitysystem/SecuritySystemAlarmTypeCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/securitysystem/SecuritySystemAlarmTypeCharacteristic.java deleted file mode 100644 index 772943ba9..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/securitysystem/SecuritySystemAlarmTypeCharacteristic.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.impl.characteristics.securitysystem; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.SecuritySystem; -import io.github.hapjava.accessories.properties.SecuritySystemAlarmType; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class SecuritySystemAlarmTypeCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final SecuritySystem securitySystem; - - public SecuritySystemAlarmTypeCharacteristic(SecuritySystem securitySystem) { - super("0000008E-0000-1000-8000-0026BB765291", false, true, "Security system alarm type", 1); - this.securitySystem = securitySystem; - } - - @Override - protected CompletableFuture getValue() { - return securitySystem.getAlarmTypeState().thenApply(SecuritySystemAlarmType::getCode); - } - - @Override - protected void setValue(Integer value) throws Exception { - // Not writable - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - securitySystem.subscribeAlarmTypeState(callback); - } - - @Override - public void unsubscribe() { - securitySystem.unsubscribeAlarmTypeState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/securitysystem/TargetSecuritySystemStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/securitysystem/TargetSecuritySystemStateCharacteristic.java deleted file mode 100644 index 7357b43cd..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/securitysystem/TargetSecuritySystemStateCharacteristic.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.github.hapjava.impl.characteristics.securitysystem; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.SecuritySystem; -import io.github.hapjava.accessories.properties.TargetSecuritySystemState; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class TargetSecuritySystemStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final SecuritySystem securitySystem; - - public TargetSecuritySystemStateCharacteristic(SecuritySystem securitySystem) { - super("00000067-0000-1000-8000-0026BB765291", true, true, "Target security system state", 3); - this.securitySystem = securitySystem; - } - - @Override - protected CompletableFuture getValue() { - return securitySystem - .getTargetSecuritySystemState() - .thenApply(TargetSecuritySystemState::getCode); - } - - @Override - protected void setValue(Integer value) throws Exception { - securitySystem.setTargetSecuritySystemState(TargetSecuritySystemState.fromCode(value)); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - securitySystem.subscribeTargetSecuritySystemState(callback); - } - - @Override - public void unsubscribe() { - securitySystem.unsubscribeTargetSecuritySystemState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/smokesensor/SmokeDetectedCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/smokesensor/SmokeDetectedCharacteristic.java deleted file mode 100644 index e9823292d..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/smokesensor/SmokeDetectedCharacteristic.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.impl.characteristics.smokesensor; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.SmokeSensor; -import io.github.hapjava.accessories.properties.SmokeDetectedState; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class SmokeDetectedCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final SmokeSensor smokeSensor; - - public SmokeDetectedCharacteristic(SmokeSensor smokeSensor) { - super("00000076-0000-1000-8000-0026BB765291", false, true, "Smoke Detected", 1); - this.smokeSensor = smokeSensor; - } - - @Override - protected CompletableFuture getValue() { - return smokeSensor.getSmokeDetectedState().thenApply(SmokeDetectedState::getCode); - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - smokeSensor.subscribeSmokeDetectedState(callback); - } - - @Override - public void unsubscribe() { - smokeSensor.unsubscribeSmokeDetectedState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/AbstractHeatingCoolingModeCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/thermostat/AbstractHeatingCoolingModeCharacteristic.java deleted file mode 100644 index e28ffddbe..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/AbstractHeatingCoolingModeCharacteristic.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.github.hapjava.impl.characteristics.thermostat; - -import io.github.hapjava.accessories.properties.ThermostatMode; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -abstract class AbstractHeatingCoolingModeCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - public AbstractHeatingCoolingModeCharacteristic( - String type, boolean isWritable, String description) { - super(type, isWritable, true, description, 3); - } - - @Override - protected final void setValue(Integer value) throws Exception { - setModeValue(ThermostatMode.fromCode(value)); - } - - @Override - protected final CompletableFuture getValue() { - return getModeValue().thenApply(t -> t.getCode()); - } - - protected abstract void setModeValue(ThermostatMode mode) throws Exception; - - protected abstract CompletableFuture getModeValue(); -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/AbstractTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/thermostat/AbstractTemperatureCharacteristic.java deleted file mode 100644 index 5f1dc7f1c..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/AbstractTemperatureCharacteristic.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.github.hapjava.impl.characteristics.thermostat; - -import io.github.hapjava.accessories.TemperatureSensor; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.FloatCharacteristic; - -public abstract class AbstractTemperatureCharacteristic extends FloatCharacteristic - implements EventableCharacteristic { - - public AbstractTemperatureCharacteristic( - String type, boolean isWritable, String description, TemperatureSensor sensor) { - super( - type, - isWritable, - true, - description, - sensor.getMinimumTemperature(), - sensor.getMaximumTemperature(), - 0.1, - "celsius"); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/CoolingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/thermostat/CoolingThresholdTemperatureCharacteristic.java deleted file mode 100644 index 0b2d1b4f8..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/CoolingThresholdTemperatureCharacteristic.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.impl.characteristics.thermostat; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.thermostat.CoolingThermostat; -import java.util.concurrent.CompletableFuture; - -public class CoolingThresholdTemperatureCharacteristic extends AbstractTemperatureCharacteristic { - - private final CoolingThermostat thermostat; - - public CoolingThresholdTemperatureCharacteristic(CoolingThermostat thermostat) { - super( - "0000000D-0000-1000-8000-0026BB765291", - true, - "Temperature above which cooling will be active", - thermostat); - this.thermostat = thermostat; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - thermostat.subscribeCoolingThresholdTemperature(callback); - } - - @Override - public void unsubscribe() { - thermostat.unsubscribeCoolingThresholdTemperature(); - } - - @Override - protected CompletableFuture getDoubleValue() { - return thermostat.getCoolingThresholdTemperature(); - } - - @Override - protected void setValue(Double value) throws Exception { - thermostat.setCoolingThresholdTemperature(value); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/CurrentHeatingCoolingModeCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/thermostat/CurrentHeatingCoolingModeCharacteristic.java deleted file mode 100644 index 26c4ac987..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/CurrentHeatingCoolingModeCharacteristic.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.hapjava.impl.characteristics.thermostat; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.properties.ThermostatMode; -import io.github.hapjava.accessories.thermostat.BasicThermostat; -import java.util.concurrent.CompletableFuture; - -public class CurrentHeatingCoolingModeCharacteristic - extends AbstractHeatingCoolingModeCharacteristic { - - private final BasicThermostat thermostat; - - public CurrentHeatingCoolingModeCharacteristic(BasicThermostat thermostat) { - super("0000000F-0000-1000-8000-0026BB765291", false, "Current Mode"); - this.thermostat = thermostat; - } - - @Override - protected void setModeValue(ThermostatMode mode) throws Exception { - // Not writable - } - - @Override - protected CompletableFuture getModeValue() { - return thermostat.getCurrentMode(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - thermostat.subscribeCurrentMode(callback); - } - - @Override - public void unsubscribe() { - thermostat.unsubscribeCurrentMode(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/CurrentTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/thermostat/CurrentTemperatureCharacteristic.java deleted file mode 100644 index 7745c56cc..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/CurrentTemperatureCharacteristic.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.github.hapjava.impl.characteristics.thermostat; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.TemperatureSensor; -import java.util.concurrent.CompletableFuture; - -public class CurrentTemperatureCharacteristic extends AbstractTemperatureCharacteristic { - - private final TemperatureSensor sensor; - - public CurrentTemperatureCharacteristic(TemperatureSensor thermostat) { - super("00000011-0000-1000-8000-0026BB765291", false, "Current Temperature", thermostat); - this.sensor = thermostat; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - sensor.subscribeCurrentTemperature(callback); - } - - @Override - public void unsubscribe() { - sensor.unsubscribeCurrentTemperature(); - } - - @Override - protected CompletableFuture getDoubleValue() { - return sensor.getCurrentTemperature(); - } - - @Override - protected void setValue(Double value) throws Exception { - // Not writable - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/HeatingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/thermostat/HeatingThresholdTemperatureCharacteristic.java deleted file mode 100644 index dba7af9a2..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/HeatingThresholdTemperatureCharacteristic.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.hapjava.impl.characteristics.thermostat; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.thermostat.HeatingThermostat; -import java.util.concurrent.CompletableFuture; - -public class HeatingThresholdTemperatureCharacteristic extends AbstractTemperatureCharacteristic { - - private final HeatingThermostat thermostat; - - public HeatingThresholdTemperatureCharacteristic(HeatingThermostat thermostat) { - super( - "00000012-0000-1000-8000-0026BB765291", - true, - "Temperature below which heating will be active", - thermostat); - this.thermostat = thermostat; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - thermostat.subscribeHeatingThresholdTemperature(callback); - } - - @Override - public void unsubscribe() { - thermostat.unsubscribeHeatingThresholdTemperature(); - } - - @Override - protected CompletableFuture getDoubleValue() { - return thermostat.getHeatingThresholdTemperature(); - } - - @Override - protected void setValue(Double value) throws Exception { - thermostat.setHeatingThresholdTemperature(value); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/TargetHeatingCoolingModeCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/thermostat/TargetHeatingCoolingModeCharacteristic.java deleted file mode 100644 index 238af49ab..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/TargetHeatingCoolingModeCharacteristic.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.hapjava.impl.characteristics.thermostat; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.properties.ThermostatMode; -import io.github.hapjava.accessories.thermostat.BasicThermostat; -import java.util.concurrent.CompletableFuture; - -public class TargetHeatingCoolingModeCharacteristic - extends AbstractHeatingCoolingModeCharacteristic { - - private final BasicThermostat thermostat; - - public TargetHeatingCoolingModeCharacteristic(BasicThermostat thermostat) { - super("00000033-0000-1000-8000-0026BB765291", true, "Target Mode"); - this.thermostat = thermostat; - } - - @Override - protected void setModeValue(ThermostatMode mode) throws Exception { - thermostat.setTargetMode(mode); - } - - @Override - protected CompletableFuture getModeValue() { - return thermostat.getTargetMode(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - thermostat.subscribeTargetMode(callback); - } - - @Override - public void unsubscribe() { - thermostat.unsubscribeTargetMode(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/TargetTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/thermostat/TargetTemperatureCharacteristic.java deleted file mode 100644 index 1c7f9274e..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/TargetTemperatureCharacteristic.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.github.hapjava.impl.characteristics.thermostat; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.thermostat.BasicThermostat; -import java.util.concurrent.CompletableFuture; - -public class TargetTemperatureCharacteristic extends AbstractTemperatureCharacteristic { - - private final BasicThermostat thermostat; - - public TargetTemperatureCharacteristic(BasicThermostat thermostat) { - super("00000035-0000-1000-8000-0026BB765291", true, "Target Temperature", thermostat); - this.thermostat = thermostat; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - thermostat.subscribeTargetTemperature(callback); - } - - @Override - public void unsubscribe() { - thermostat.unsubscribeTargetTemperature(); - } - - @Override - protected CompletableFuture getDoubleValue() { - return thermostat.getTargetTemperature(); - } - - @Override - protected void setValue(Double value) throws Exception { - thermostat.setTargetTemperature(value); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/TemperatureUnitsCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/thermostat/TemperatureUnitsCharacteristic.java deleted file mode 100644 index a24a5fc74..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/thermostat/TemperatureUnitsCharacteristic.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.github.hapjava.impl.characteristics.thermostat; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.properties.TemperatureUnit; -import io.github.hapjava.accessories.thermostat.BasicThermostat; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class TemperatureUnitsCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final BasicThermostat thermostat; - - public TemperatureUnitsCharacteristic(BasicThermostat thermostat) { - super("00000036-0000-1000-8000-0026BB765291", true, true, "The temperature unit", 1); - this.thermostat = thermostat; - } - - @Override - protected void setValue(Integer value) throws Exception { - thermostat.setTemperatureUnit( - value == 1 ? TemperatureUnit.FAHRENHEIT : TemperatureUnit.CELSIUS); - } - - @Override - protected CompletableFuture getValue() { - return CompletableFuture.completedFuture(thermostat.getTemperatureUnit().getCode()); - } - - @Override - public void subscribe(final HomekitCharacteristicChangeCallback callback) { - thermostat.subscribeTemperatureUnit(callback); - } - - @Override - public void unsubscribe() { - thermostat.unsubscribeTemperatureUnit(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/valve/SetDurationCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/valve/SetDurationCharacteristic.java deleted file mode 100644 index 75feae8c2..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/valve/SetDurationCharacteristic.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.hapjava.impl.characteristics.valve; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.ValveWithTimer; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class SetDurationCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - private final ValveWithTimer valve; - - public SetDurationCharacteristic(ValveWithTimer valve) { - super("000000D3-0000-1000-8000-0026BB765291", true, true, "Set Duration", 0, 3600, "seconds"); - this.valve = valve; - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - valve.subscribeSetDuration(callback); - } - - @Override - public void unsubscribe() { - valve.unsubscribeSetDuration(); - } - - @Override - protected void setValue(Integer value) throws Exception { - valve.setSetDuration(value); - } - - @Override - protected CompletableFuture getValue() { - return valve.getSetDuration(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/valve/ValveTypeCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/valve/ValveTypeCharacteristic.java deleted file mode 100644 index 3fe6b0aeb..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/valve/ValveTypeCharacteristic.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.hapjava.impl.characteristics.valve; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.Valve; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class ValveTypeCharacteristic extends EnumCharacteristic implements EventableCharacteristic { - - private final Valve valve; - - public ValveTypeCharacteristic(Valve valve) { - super("000000D5-0000-1000-8000-0026BB765291", false, true, "Valve Type", 3); - this.valve = valve; - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read only - } - - @Override - protected CompletableFuture getValue() { - return valve.getValveType().thenApply(v -> v.getCode()); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - valve.subscribeValveType(callback); - } - - @Override - public void unsubscribe() { - valve.unsubscribeValveType(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java deleted file mode 100644 index d4b57acb0..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.hapjava.impl.characteristics.windowcovering; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.HorizontalTiltingWindowCovering; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CurrentHorizontalTiltAngleCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final HorizontalTiltingWindowCovering windowCovering; - - public CurrentHorizontalTiltAngleCharacteristic(HorizontalTiltingWindowCovering windowCovering) { - super( - "0000006C-0000-1000-8000-0026BB765291", - false, - true, - "The current horizontal tilt angle", - -90, - 90, - "Arc Degree"); - this.windowCovering = windowCovering; - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - protected CompletableFuture getValue() { - return windowCovering.getCurrentHorizontalTiltAngle(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - windowCovering.subscribeCurrentHorizontalTiltAngle(callback); - } - - @Override - public void unsubscribe() { - windowCovering.unsubscribeCurrentHorizontalTiltAngle(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentPositionCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentPositionCharacteristic.java deleted file mode 100644 index 22fbfd171..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentPositionCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.windowcovering; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.BasicWindowCovering; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CurrentPositionCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final BasicWindowCovering windowCovering; - - public CurrentPositionCharacteristic(BasicWindowCovering windowCovering) { - super("0000006D-0000-1000-8000-0026BB765291", false, true, "The current position", 0, 100, "%"); - this.windowCovering = windowCovering; - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - protected CompletableFuture getValue() { - return windowCovering.getCurrentPosition(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - windowCovering.subscribeCurrentPosition(callback); - } - - @Override - public void unsubscribe() { - windowCovering.unsubscribeCurrentPosition(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentVerticalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentVerticalTiltAngleCharacteristic.java deleted file mode 100644 index 371e5939b..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/CurrentVerticalTiltAngleCharacteristic.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.hapjava.impl.characteristics.windowcovering; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.VerticalTiltingWindowCovering; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class CurrentVerticalTiltAngleCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final VerticalTiltingWindowCovering windowCovering; - - public CurrentVerticalTiltAngleCharacteristic(VerticalTiltingWindowCovering windowCovering) { - super( - "0000006E-0000-1000-8000-0026BB765291", - false, - true, - "The current vertical tilt angle", - -90, - 90, - "Arc Degree"); - this.windowCovering = windowCovering; - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read Only - } - - @Override - protected CompletableFuture getValue() { - return windowCovering.getCurrentVerticalTiltAngle(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - windowCovering.subscribeCurrentVerticalTiltAngle(callback); - } - - @Override - public void unsubscribe() { - windowCovering.unsubscribeCurrentVerticalTiltAngle(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/HoldPositionCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/HoldPositionCharacteristic.java deleted file mode 100644 index 09edf8b11..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/HoldPositionCharacteristic.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.github.hapjava.impl.characteristics.windowcovering; - -import io.github.hapjava.accessories.HoldPositionWindowCovering; -import io.github.hapjava.characteristics.BooleanCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class HoldPositionCharacteristic extends BooleanCharacteristic { - - private final HoldPositionWindowCovering windowCovering; - - public HoldPositionCharacteristic(HoldPositionWindowCovering windowCovering) { - super("0000006F-0000-1000-8000-0026BB765291", true, false, "Whether or not to hold position"); - this.windowCovering = windowCovering; - } - - @Override - protected void setValue(Boolean value) throws Exception { - this.windowCovering.setHoldPosition(value); - } - - @Override - protected CompletableFuture getValue() { - // Write only - return CompletableFuture.completedFuture(null); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/PositionStateCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/PositionStateCharacteristic.java deleted file mode 100644 index 80e87ad01..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/PositionStateCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.windowcovering; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.BasicWindowCovering; -import io.github.hapjava.characteristics.EnumCharacteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class PositionStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { - - private final BasicWindowCovering windowCovering; - - public PositionStateCharacteristic(BasicWindowCovering windowCovering) { - super("00000072-0000-1000-8000-0026BB765291", false, true, "The position state", 2); - this.windowCovering = windowCovering; - } - - @Override - protected void setValue(Integer value) throws Exception { - // Read only - } - - @Override - protected CompletableFuture getValue() { - return windowCovering.getPositionState().thenApply(v -> v.getCode()); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - windowCovering.subscribePositionState(callback); - } - - @Override - public void unsubscribe() { - windowCovering.unsubscribePositionState(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetHorizontalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetHorizontalTiltAngleCharacteristic.java deleted file mode 100644 index 835ec6449..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetHorizontalTiltAngleCharacteristic.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.hapjava.impl.characteristics.windowcovering; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.HorizontalTiltingWindowCovering; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class TargetHorizontalTiltAngleCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final HorizontalTiltingWindowCovering windowCovering; - - public TargetHorizontalTiltAngleCharacteristic(HorizontalTiltingWindowCovering windowCovering) { - super( - "0000007B-0000-1000-8000-0026BB765291", - true, - true, - "The target horizontal tilt angle", - -90, - 90, - "Arc Degree"); - this.windowCovering = windowCovering; - } - - @Override - protected void setValue(Integer value) throws Exception { - windowCovering.setTargetHorizontalTiltAngle(value); - } - - @Override - protected CompletableFuture getValue() { - return windowCovering.getTargetHorizontalTiltAngle(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - windowCovering.subscribeTargetHorizontalTiltAngle(callback); - } - - @Override - public void unsubscribe() { - windowCovering.unsubscribeTargetHorizontalTiltAngle(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetPositionCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetPositionCharacteristic.java deleted file mode 100644 index 0db8fe6df..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetPositionCharacteristic.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.hapjava.impl.characteristics.windowcovering; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.BasicWindowCovering; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class TargetPositionCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final BasicWindowCovering windowCovering; - - public TargetPositionCharacteristic(BasicWindowCovering windowCovering) { - super("0000007C-0000-1000-8000-0026BB765291", true, true, "The target position", 0, 100, "%"); - this.windowCovering = windowCovering; - } - - @Override - protected void setValue(Integer value) throws Exception { - windowCovering.setTargetPosition(value); - } - - @Override - protected CompletableFuture getValue() { - return windowCovering.getTargetPosition(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - windowCovering.subscribeTargetPosition(callback); - } - - @Override - public void unsubscribe() { - windowCovering.unsubscribeTargetPosition(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetVerticalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetVerticalTiltAngleCharacteristic.java deleted file mode 100644 index 20472689e..000000000 --- a/src/main/java/io/github/hapjava/impl/characteristics/windowcovering/TargetVerticalTiltAngleCharacteristic.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.hapjava.impl.characteristics.windowcovering; - -import io.github.hapjava.HomekitCharacteristicChangeCallback; -import io.github.hapjava.accessories.VerticalTiltingWindowCovering; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.IntegerCharacteristic; -import java.util.concurrent.CompletableFuture; - -public class TargetVerticalTiltAngleCharacteristic extends IntegerCharacteristic - implements EventableCharacteristic { - - private final VerticalTiltingWindowCovering windowCovering; - - public TargetVerticalTiltAngleCharacteristic(VerticalTiltingWindowCovering windowCovering) { - super( - "0000007D-0000-1000-8000-0026BB765291", - true, - true, - "The target vertical tilt angle", - -90, - 90, - "Arc Degree"); - this.windowCovering = windowCovering; - } - - @Override - protected void setValue(Integer value) throws Exception { - windowCovering.setTargetVerticalTiltAngle(value); - } - - @Override - protected CompletableFuture getValue() { - return windowCovering.getTargetVerticalTiltAngle(); - } - - @Override - public void subscribe(HomekitCharacteristicChangeCallback callback) { - windowCovering.subscribeTargetVerticalTiltAngle(callback); - } - - @Override - public void unsubscribe() { - windowCovering.unsubscribeTargetVerticalTiltAngle(); - } -} diff --git a/src/main/java/io/github/hapjava/impl/pairing/Stage.java b/src/main/java/io/github/hapjava/impl/pairing/Stage.java deleted file mode 100644 index 1d5d3ef7d..000000000 --- a/src/main/java/io/github/hapjava/impl/pairing/Stage.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.github.hapjava.impl.pairing; - -public enum Stage { - ONE, - TWO, - THREE -} diff --git a/src/main/java/io/github/hapjava/impl/services/AbstractServiceImpl.java b/src/main/java/io/github/hapjava/impl/services/AbstractServiceImpl.java deleted file mode 100644 index 6898a5a0d..000000000 --- a/src/main/java/io/github/hapjava/impl/services/AbstractServiceImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.Service; -import io.github.hapjava.accessories.BatteryAccessory; -import io.github.hapjava.accessories.BatteryStatusAccessory; -import io.github.hapjava.characteristics.Characteristic; -import io.github.hapjava.impl.characteristics.common.BatteryLevelCharacteristic; -import io.github.hapjava.impl.characteristics.common.LowBatteryStatusCharacteristic; -import io.github.hapjava.impl.characteristics.common.Name; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -abstract class AbstractServiceImpl implements Service { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final String type; - private final List characteristics = new LinkedList<>(); - - /** - * This constructor has been deprecated and replaced with {@link #AbstractServiceImpl(String, - * HomekitAccessory, String)}. Usages of this constructor will need to manually configure {@link - * Name} characteristic and {@link BatteryLevelCharacteristic} if needed. - * - * @param type unique UUID of the service. This information can be obtained from HomeKit Accessory - * Simulator. - */ - @Deprecated - public AbstractServiceImpl(String type) { - this(type, null, null); - } - - /** - * Creates a new instance of this class with the specified UUID and {@link HomekitAccessory}. - * Download and install HomeKit Accessory Simulator to discover the corresponding UUID for - * the specific service. - * - *

The new service will automatically add {@link Name} characteristic. If the accessory is - * battery operated then it must implement {@link BatteryAccessory} and {@link - * BatteryLevelCharacteristic} will be added too. - * - * @param type unique UUID of the service. This information can be obtained from HomeKit Accessory - * Simulator. - * @param accessory HomeKit accessory exposed as a service. - * @param serviceName name of the service. This information is usually the name of the accessory. - */ - public AbstractServiceImpl(String type, HomekitAccessory accessory, String serviceName) { - this.type = type; - - if (accessory != null) { - // Add name characteristic - addCharacteristic(new Name(serviceName)); - - // If battery operated accessory then add BatteryLevelCharacteristic - if (accessory instanceof BatteryAccessory) { - logger.warn( - "Accessory {} implements BatteryAccessory, which was incorrectly used to advertise battery state and is not recognized by HomeKit. " - + "Battery-powered devices should report their battery status using LowBatteryStatusAccessory", - accessory.getClass()); - } - - // If battery operated accessory then add LowBatteryStatusAccessory - if (accessory instanceof BatteryStatusAccessory) { - BatteryStatusAccessory batteryStatusAccessory = (BatteryStatusAccessory) accessory; - addCharacteristic( - new LowBatteryStatusCharacteristic( - batteryStatusAccessory::getLowBatteryState, - batteryStatusAccessory::subscribeLowBatteryState, - batteryStatusAccessory::unsubscribeLowBatteryState)); - } - } - } - - @Override - public List getCharacteristics() { - return Collections.unmodifiableList(characteristics); - } - - @Override - public String getType() { - return type; - } - - protected void addCharacteristic(Characteristic characteristic) { - this.characteristics.add(characteristic); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/AccessoryInformationService.java b/src/main/java/io/github/hapjava/impl/services/AccessoryInformationService.java deleted file mode 100644 index eb464b4d0..000000000 --- a/src/main/java/io/github/hapjava/impl/services/AccessoryInformationService.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.impl.characteristics.information.Identify; -import io.github.hapjava.impl.characteristics.information.Manufacturer; -import io.github.hapjava.impl.characteristics.information.Model; -import io.github.hapjava.impl.characteristics.information.SerialNumber; - -public class AccessoryInformationService extends AbstractServiceImpl { - - public AccessoryInformationService(HomekitAccessory accessory) throws Exception { - this(accessory, accessory.getLabel()); - } - - public AccessoryInformationService(HomekitAccessory accessory, String serviceName) - throws Exception { - super("0000003E-0000-1000-8000-0026BB765291", accessory, serviceName); - addCharacteristic(new Manufacturer(accessory)); - addCharacteristic(new Model(accessory)); - addCharacteristic(new SerialNumber(accessory)); - addCharacteristic(new Identify(accessory)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java b/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java deleted file mode 100644 index f00f04996..000000000 --- a/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.CarbonDioxideSensor; -import io.github.hapjava.impl.characteristics.carbondioxide.CarbonDioxideDetectedCharacteristic; -import io.github.hapjava.impl.characteristics.carbondioxide.CarbonDioxideLevelCharacteristic; - -public class CarbonDioxideSensorService extends AbstractServiceImpl { - - public CarbonDioxideSensorService(CarbonDioxideSensor carbonDioxideSensor) { - this(carbonDioxideSensor, carbonDioxideSensor.getLabel()); - } - - public CarbonDioxideSensorService(CarbonDioxideSensor carbonDioxideSensor, String serviceName) { - super("00000097-0000-1000-8000-0026BB765291", carbonDioxideSensor, serviceName); - addCharacteristic(new CarbonDioxideDetectedCharacteristic(carbonDioxideSensor)); - addCharacteristic(new CarbonDioxideLevelCharacteristic(carbonDioxideSensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/CarbonMonoxideSensorService.java b/src/main/java/io/github/hapjava/impl/services/CarbonMonoxideSensorService.java deleted file mode 100644 index 0225ab0e4..000000000 --- a/src/main/java/io/github/hapjava/impl/services/CarbonMonoxideSensorService.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.CarbonMonoxideSensor; -import io.github.hapjava.impl.characteristics.carbonmonoxide.CarbonMonoxideDetectedCharacteristic; - -public class CarbonMonoxideSensorService extends AbstractServiceImpl { - - public CarbonMonoxideSensorService(CarbonMonoxideSensor carbonMonoxideSensor) { - this(carbonMonoxideSensor, carbonMonoxideSensor.getLabel()); - } - - public CarbonMonoxideSensorService( - CarbonMonoxideSensor carbonMonoxideSensor, String serviceName) { - super("0000007F-0000-1000-8000-0026BB765291", carbonMonoxideSensor, serviceName); - addCharacteristic(new CarbonMonoxideDetectedCharacteristic(carbonMonoxideSensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/ContactSensorService.java b/src/main/java/io/github/hapjava/impl/services/ContactSensorService.java deleted file mode 100644 index b4df03fc2..000000000 --- a/src/main/java/io/github/hapjava/impl/services/ContactSensorService.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.ContactSensor; -import io.github.hapjava.impl.characteristics.contactsensor.ContactSensorStateCharacteristic; - -public class ContactSensorService extends AbstractServiceImpl { - - public ContactSensorService(ContactSensor contactSensor) { - this(contactSensor, contactSensor.getLabel()); - } - - public ContactSensorService(ContactSensor contactSensor, String serviceName) { - super("00000080-0000-1000-8000-0026BB765291", contactSensor, serviceName); - addCharacteristic(new ContactSensorStateCharacteristic(contactSensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/FanService.java b/src/main/java/io/github/hapjava/impl/services/FanService.java deleted file mode 100644 index 86bbb701c..000000000 --- a/src/main/java/io/github/hapjava/impl/services/FanService.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.Fan; -import io.github.hapjava.impl.characteristics.common.PowerStateCharacteristic; -import io.github.hapjava.impl.characteristics.fan.RotationDirectionCharacteristic; -import io.github.hapjava.impl.characteristics.fan.RotationSpeedCharacteristic; - -public class FanService extends AbstractServiceImpl { - - public FanService(Fan fan) { - this(fan, fan.getLabel()); - } - - public FanService(Fan fan, String serviceName) { - super("00000040-0000-1000-8000-0026BB765291", fan, serviceName); - addCharacteristic( - new PowerStateCharacteristic( - () -> fan.getFanPower(), - v -> fan.setFanPower(v), - c -> fan.subscribeFanPower(c), - () -> fan.unsubscribeFanPower())); - addCharacteristic(new RotationDirectionCharacteristic(fan)); - addCharacteristic(new RotationSpeedCharacteristic(fan)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/GarageDoorService.java b/src/main/java/io/github/hapjava/impl/services/GarageDoorService.java deleted file mode 100644 index 1296a9b7d..000000000 --- a/src/main/java/io/github/hapjava/impl/services/GarageDoorService.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.GarageDoor; -import io.github.hapjava.impl.characteristics.common.ObstructionDetectedCharacteristic; -import io.github.hapjava.impl.characteristics.garage.CurrentDoorStateCharacteristic; -import io.github.hapjava.impl.characteristics.garage.TargetDoorStateCharacteristic; - -public class GarageDoorService extends AbstractServiceImpl { - - public GarageDoorService(GarageDoor door) { - this(door, door.getLabel()); - } - - public GarageDoorService(GarageDoor door, String serviceName) { - super("00000041-0000-1000-8000-0026BB765291", door, serviceName); - addCharacteristic(new CurrentDoorStateCharacteristic(door)); - addCharacteristic(new TargetDoorStateCharacteristic(door)); - addCharacteristic( - new ObstructionDetectedCharacteristic( - () -> door.getObstructionDetected(), - c -> door.subscribeObstructionDetected(c), - () -> door.unsubscribeObstructionDetected())); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/HumiditySensorService.java b/src/main/java/io/github/hapjava/impl/services/HumiditySensorService.java deleted file mode 100644 index 99b1c716f..000000000 --- a/src/main/java/io/github/hapjava/impl/services/HumiditySensorService.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.HumiditySensor; -import io.github.hapjava.impl.characteristics.humiditysensor.CurrentRelativeHumidityCharacteristic; - -public class HumiditySensorService extends AbstractServiceImpl { - - public HumiditySensorService(HumiditySensor sensor) { - this(sensor, sensor.getLabel()); - } - - public HumiditySensorService(HumiditySensor sensor, String serviceName) { - super("00000082-0000-1000-8000-0026BB765291", sensor, serviceName); - addCharacteristic(new CurrentRelativeHumidityCharacteristic(sensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/LeakSensorService.java b/src/main/java/io/github/hapjava/impl/services/LeakSensorService.java deleted file mode 100644 index 89eab8bf6..000000000 --- a/src/main/java/io/github/hapjava/impl/services/LeakSensorService.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.LeakSensor; -import io.github.hapjava.impl.characteristics.leaksensor.LeakDetectedStateCharacteristic; - -public class LeakSensorService extends AbstractServiceImpl { - - public LeakSensorService(LeakSensor leakSensor) { - this(leakSensor, leakSensor.getLabel()); - } - - public LeakSensorService(LeakSensor leakSensor, String serviceName) { - super("00000083-0000-1000-8000-0026BB765291", leakSensor, serviceName); - addCharacteristic(new LeakDetectedStateCharacteristic(leakSensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/LightSensorService.java b/src/main/java/io/github/hapjava/impl/services/LightSensorService.java deleted file mode 100644 index 3b41e4d9b..000000000 --- a/src/main/java/io/github/hapjava/impl/services/LightSensorService.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.LightSensor; -import io.github.hapjava.impl.characteristics.light.AmbientLightLevelCharacteristic; - -public class LightSensorService extends AbstractServiceImpl { - - public LightSensorService(LightSensor lightSensor) { - this(lightSensor, lightSensor.getLabel()); - } - - public LightSensorService(LightSensor lightSensor, String serviceName) { - super("00000084-0000-1000-8000-0026BB765291", lightSensor, serviceName); - addCharacteristic(new AmbientLightLevelCharacteristic(lightSensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/LightbulbService.java b/src/main/java/io/github/hapjava/impl/services/LightbulbService.java deleted file mode 100644 index a3b55a141..000000000 --- a/src/main/java/io/github/hapjava/impl/services/LightbulbService.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.ColorfulLightbulb; -import io.github.hapjava.accessories.DimmableLightbulb; -import io.github.hapjava.accessories.Lightbulb; -import io.github.hapjava.impl.characteristics.common.PowerStateCharacteristic; -import io.github.hapjava.impl.characteristics.lightbulb.BrightnessCharacteristic; -import io.github.hapjava.impl.characteristics.lightbulb.HueCharacteristic; -import io.github.hapjava.impl.characteristics.lightbulb.SaturationCharacteristic; - -public class LightbulbService extends AbstractServiceImpl { - - public LightbulbService(Lightbulb lightbulb) { - this(lightbulb, lightbulb.getLabel()); - } - - public LightbulbService(Lightbulb lightbulb, String serviceName) { - super("00000043-0000-1000-8000-0026BB765291", lightbulb, serviceName); - addCharacteristic( - new PowerStateCharacteristic( - () -> lightbulb.getLightbulbPowerState(), - v -> lightbulb.setLightbulbPowerState(v), - c -> lightbulb.subscribeLightbulbPowerState(c), - () -> lightbulb.unsubscribeLightbulbPowerState())); - - if (lightbulb instanceof DimmableLightbulb) { - addCharacteristic(new BrightnessCharacteristic((DimmableLightbulb) lightbulb)); - } - - if (lightbulb instanceof ColorfulLightbulb) { - addCharacteristic(new HueCharacteristic((ColorfulLightbulb) lightbulb)); - addCharacteristic(new SaturationCharacteristic((ColorfulLightbulb) lightbulb)); - } - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/LockMechanismService.java b/src/main/java/io/github/hapjava/impl/services/LockMechanismService.java deleted file mode 100644 index a0b1346f4..000000000 --- a/src/main/java/io/github/hapjava/impl/services/LockMechanismService.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.LockMechanism; -import io.github.hapjava.accessories.LockableLockMechanism; -import io.github.hapjava.impl.characteristics.lock.mechanism.CurrentLockMechanismStateCharacteristic; -import io.github.hapjava.impl.characteristics.lock.mechanism.TargetLockMechanismStateCharacteristic; - -public class LockMechanismService extends AbstractServiceImpl { - - public LockMechanismService(LockMechanism lock) { - this(lock, lock.getLabel()); - } - - public LockMechanismService(LockMechanism lock, String serviceName) { - super("00000045-0000-1000-8000-0026BB765291", lock, serviceName); - addCharacteristic(new CurrentLockMechanismStateCharacteristic(lock)); - - if (lock instanceof LockableLockMechanism) { - addCharacteristic(new TargetLockMechanismStateCharacteristic((LockableLockMechanism) lock)); - } - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/MotionSensorService.java b/src/main/java/io/github/hapjava/impl/services/MotionSensorService.java deleted file mode 100644 index 354650973..000000000 --- a/src/main/java/io/github/hapjava/impl/services/MotionSensorService.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.MotionSensor; -import io.github.hapjava.impl.characteristics.motionsensor.MotionDetectedStateCharacteristic; - -public class MotionSensorService extends AbstractServiceImpl { - - public MotionSensorService(MotionSensor motionSensor) { - this(motionSensor, motionSensor.getLabel()); - } - - public MotionSensorService(MotionSensor motionSensor, String serviceName) { - super("00000085-0000-1000-8000-0026BB765291", motionSensor, serviceName); - addCharacteristic(new MotionDetectedStateCharacteristic(motionSensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/OccupancySensorService.java b/src/main/java/io/github/hapjava/impl/services/OccupancySensorService.java deleted file mode 100644 index 35965a9d2..000000000 --- a/src/main/java/io/github/hapjava/impl/services/OccupancySensorService.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.OccupancySensor; -import io.github.hapjava.impl.characteristics.occupancysensor.OccupancyDetectedStateCharacteristic; - -public class OccupancySensorService extends AbstractServiceImpl { - - public OccupancySensorService(OccupancySensor occupancySensor) { - this(occupancySensor, occupancySensor.getLabel()); - } - - public OccupancySensorService(OccupancySensor occupancySensor, String serviceName) { - super("00000086-0000-1000-8000-0026BB765291", occupancySensor, serviceName); - addCharacteristic(new OccupancyDetectedStateCharacteristic(occupancySensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/OutletService.java b/src/main/java/io/github/hapjava/impl/services/OutletService.java deleted file mode 100644 index 3d03a7331..000000000 --- a/src/main/java/io/github/hapjava/impl/services/OutletService.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.Outlet; -import io.github.hapjava.impl.characteristics.common.PowerStateCharacteristic; -import io.github.hapjava.impl.characteristics.outlet.OutletInUseCharacteristic; - -public class OutletService extends AbstractServiceImpl { - - public OutletService(Outlet outlet) { - this(outlet, outlet.getLabel()); - } - - public OutletService(Outlet outlet, String serviceName) { - super("00000047-0000-1000-8000-0026BB765291", outlet, serviceName); - addCharacteristic( - new PowerStateCharacteristic( - () -> outlet.getPowerState(), - v -> outlet.setPowerState(v), - c -> outlet.subscribePowerState(c), - () -> outlet.unsubscribePowerState())); - addCharacteristic(new OutletInUseCharacteristic(outlet)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/SecuritySystemService.java b/src/main/java/io/github/hapjava/impl/services/SecuritySystemService.java deleted file mode 100644 index 855f027e7..000000000 --- a/src/main/java/io/github/hapjava/impl/services/SecuritySystemService.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.SecuritySystem; -import io.github.hapjava.impl.characteristics.securitysystem.CurrentSecuritySystemStateCharacteristic; -import io.github.hapjava.impl.characteristics.securitysystem.SecuritySystemAlarmTypeCharacteristic; -import io.github.hapjava.impl.characteristics.securitysystem.TargetSecuritySystemStateCharacteristic; - -public class SecuritySystemService extends AbstractServiceImpl { - - public SecuritySystemService(SecuritySystem securitySystem) { - this(securitySystem, securitySystem.getLabel()); - } - - public SecuritySystemService(SecuritySystem securitySystem, String serviceName) { - super("0000007E-0000-1000-8000-0026BB765291", securitySystem, serviceName); - addCharacteristic(new CurrentSecuritySystemStateCharacteristic(securitySystem)); - addCharacteristic(new TargetSecuritySystemStateCharacteristic(securitySystem)); - addCharacteristic(new SecuritySystemAlarmTypeCharacteristic(securitySystem)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/SmokeSensorService.java b/src/main/java/io/github/hapjava/impl/services/SmokeSensorService.java deleted file mode 100644 index ad846c8b8..000000000 --- a/src/main/java/io/github/hapjava/impl/services/SmokeSensorService.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.SmokeSensor; -import io.github.hapjava.impl.characteristics.smokesensor.SmokeDetectedCharacteristic; - -public class SmokeSensorService extends AbstractServiceImpl { - - public SmokeSensorService(SmokeSensor smokeSensor) { - this(smokeSensor, smokeSensor.getLabel()); - } - - public SmokeSensorService(SmokeSensor smokeSensor, String serviceName) { - super("00000087-0000-1000-8000-0026BB765291", smokeSensor, serviceName); - addCharacteristic(new SmokeDetectedCharacteristic(smokeSensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/SwitchService.java b/src/main/java/io/github/hapjava/impl/services/SwitchService.java deleted file mode 100644 index a297a2cec..000000000 --- a/src/main/java/io/github/hapjava/impl/services/SwitchService.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.Switch; -import io.github.hapjava.impl.characteristics.common.PowerStateCharacteristic; - -public class SwitchService extends AbstractServiceImpl { - - public SwitchService(Switch switchAccessory) { - this(switchAccessory, switchAccessory.getLabel()); - } - - public SwitchService(Switch switchAccessory, String serviceName) { - super("00000049-0000-1000-8000-0026BB765291", switchAccessory, serviceName); - addCharacteristic( - new PowerStateCharacteristic( - () -> switchAccessory.getSwitchState(), - v -> switchAccessory.setSwitchState(v), - c -> switchAccessory.subscribeSwitchState(c), - () -> switchAccessory.unsubscribeSwitchState())); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/TemperatureSensorService.java b/src/main/java/io/github/hapjava/impl/services/TemperatureSensorService.java deleted file mode 100644 index 5a59513aa..000000000 --- a/src/main/java/io/github/hapjava/impl/services/TemperatureSensorService.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.TemperatureSensor; -import io.github.hapjava.impl.characteristics.thermostat.CurrentTemperatureCharacteristic; - -public class TemperatureSensorService extends AbstractServiceImpl { - - public TemperatureSensorService(TemperatureSensor sensor) { - this(sensor, sensor.getLabel()); - } - - public TemperatureSensorService(TemperatureSensor sensor, String serviceName) { - super("0000008A-0000-1000-8000-0026BB765291", sensor, serviceName); - addCharacteristic(new CurrentTemperatureCharacteristic(sensor)); - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/ThermostatService.java b/src/main/java/io/github/hapjava/impl/services/ThermostatService.java deleted file mode 100644 index e679680ae..000000000 --- a/src/main/java/io/github/hapjava/impl/services/ThermostatService.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.thermostat.BasicThermostat; -import io.github.hapjava.accessories.thermostat.CoolingThermostat; -import io.github.hapjava.accessories.thermostat.HeatingThermostat; -import io.github.hapjava.impl.characteristics.thermostat.*; - -public class ThermostatService extends AbstractServiceImpl { - - public ThermostatService(BasicThermostat thermostat) { - this(thermostat, thermostat.getLabel()); - } - - public ThermostatService(BasicThermostat thermostat, String serviceName) { - super("0000004A-0000-1000-8000-0026BB765291", thermostat, serviceName); - addCharacteristic(new CurrentHeatingCoolingModeCharacteristic(thermostat)); - addCharacteristic(new CurrentTemperatureCharacteristic(thermostat)); - addCharacteristic(new TargetHeatingCoolingModeCharacteristic(thermostat)); - addCharacteristic(new TargetTemperatureCharacteristic(thermostat)); - addCharacteristic(new TemperatureUnitsCharacteristic(thermostat)); - if (thermostat instanceof HeatingThermostat) { - addCharacteristic( - new HeatingThresholdTemperatureCharacteristic((HeatingThermostat) thermostat)); - } - if (thermostat instanceof CoolingThermostat) { - addCharacteristic( - new CoolingThresholdTemperatureCharacteristic((CoolingThermostat) thermostat)); - } - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/ValveService.java b/src/main/java/io/github/hapjava/impl/services/ValveService.java deleted file mode 100644 index c1c14ff88..000000000 --- a/src/main/java/io/github/hapjava/impl/services/ValveService.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.Valve; -import io.github.hapjava.accessories.ValveWithTimer; -import io.github.hapjava.impl.characteristics.common.ActiveCharacteristic; -import io.github.hapjava.impl.characteristics.common.InUseCharacteristic; -import io.github.hapjava.impl.characteristics.common.RemainingDurationCharacteristic; -import io.github.hapjava.impl.characteristics.valve.SetDurationCharacteristic; -import io.github.hapjava.impl.characteristics.valve.ValveTypeCharacteristic; - -public class ValveService extends AbstractServiceImpl { - - public ValveService(Valve valve) { - this(valve, valve.getLabel()); - } - - public ValveService(Valve valve, String serviceName) { - super("000000D0-0000-1000-8000-0026BB765291", valve, serviceName); - addCharacteristic( - new ActiveCharacteristic( - valve::getValveActive, - a -> valve.setValveActive(a), - valve::subscribeValveActive, - valve::unsubscribeValveActive)); - addCharacteristic(new ValveTypeCharacteristic(valve)); - addCharacteristic( - new InUseCharacteristic( - valve::getValveInUse, valve::subscribeValveInUse, valve::unsubscribeValveInUse)); - - if (valve instanceof ValveWithTimer) { - ValveWithTimer vwt = (ValveWithTimer) valve; - addCharacteristic(new SetDurationCharacteristic(vwt)); - addCharacteristic( - new RemainingDurationCharacteristic( - vwt::getRemainingDuration, - vwt::subscribeRemainingDuration, - vwt::unsubscribeRemainingDuration)); - } - } -} diff --git a/src/main/java/io/github/hapjava/impl/services/WindowCoveringService.java b/src/main/java/io/github/hapjava/impl/services/WindowCoveringService.java deleted file mode 100644 index 001863da1..000000000 --- a/src/main/java/io/github/hapjava/impl/services/WindowCoveringService.java +++ /dev/null @@ -1,59 +0,0 @@ -package io.github.hapjava.impl.services; - -import io.github.hapjava.accessories.BasicWindowCovering; -import io.github.hapjava.accessories.HoldPositionWindowCovering; -import io.github.hapjava.accessories.HorizontalTiltingWindowCovering; -import io.github.hapjava.accessories.ObstructionDetectedWindowCovering; -import io.github.hapjava.accessories.VerticalTiltingWindowCovering; -import io.github.hapjava.impl.characteristics.common.ObstructionDetectedCharacteristic; -import io.github.hapjava.impl.characteristics.windowcovering.CurrentHorizontalTiltAngleCharacteristic; -import io.github.hapjava.impl.characteristics.windowcovering.CurrentPositionCharacteristic; -import io.github.hapjava.impl.characteristics.windowcovering.CurrentVerticalTiltAngleCharacteristic; -import io.github.hapjava.impl.characteristics.windowcovering.HoldPositionCharacteristic; -import io.github.hapjava.impl.characteristics.windowcovering.PositionStateCharacteristic; -import io.github.hapjava.impl.characteristics.windowcovering.TargetHorizontalTiltAngleCharacteristic; -import io.github.hapjava.impl.characteristics.windowcovering.TargetPositionCharacteristic; -import io.github.hapjava.impl.characteristics.windowcovering.TargetVerticalTiltAngleCharacteristic; - -public class WindowCoveringService extends AbstractServiceImpl { - - public WindowCoveringService(BasicWindowCovering windowCovering) { - this(windowCovering, windowCovering.getLabel()); - } - - public WindowCoveringService(BasicWindowCovering windowCovering, String serviceName) { - super("0000008C-0000-1000-8000-0026BB765291", windowCovering, serviceName); - addCharacteristic(new CurrentPositionCharacteristic(windowCovering)); - addCharacteristic(new PositionStateCharacteristic(windowCovering)); - addCharacteristic(new TargetPositionCharacteristic(windowCovering)); - - if (windowCovering instanceof HorizontalTiltingWindowCovering) { - addCharacteristic( - new CurrentHorizontalTiltAngleCharacteristic( - (HorizontalTiltingWindowCovering) windowCovering)); - addCharacteristic( - new TargetHorizontalTiltAngleCharacteristic( - (HorizontalTiltingWindowCovering) windowCovering)); - } - if (windowCovering instanceof VerticalTiltingWindowCovering) { - addCharacteristic( - new CurrentVerticalTiltAngleCharacteristic( - (VerticalTiltingWindowCovering) windowCovering)); - addCharacteristic( - new TargetVerticalTiltAngleCharacteristic( - (VerticalTiltingWindowCovering) windowCovering)); - } - if (windowCovering instanceof HoldPositionWindowCovering) { - HoldPositionWindowCovering hpwc = (HoldPositionWindowCovering) windowCovering; - addCharacteristic(new HoldPositionCharacteristic(hpwc)); - } - if (windowCovering instanceof ObstructionDetectedWindowCovering) { - ObstructionDetectedWindowCovering wc = (ObstructionDetectedWindowCovering) windowCovering; - addCharacteristic( - new ObstructionDetectedCharacteristic( - () -> wc.getObstructionDetected(), - c -> wc.subscribeObstructionDetected(c), - () -> wc.unsubscribeObstructionDetected())); - } - } -} diff --git a/src/main/java/io/github/hapjava/package-info.java b/src/main/java/io/github/hapjava/package-info.java deleted file mode 100644 index b4b98ad13..000000000 --- a/src/main/java/io/github/hapjava/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Base package for implementing the Homekit Accessory Protocol. Start with {@link - * io.github.hapjava.HomekitServer}. - */ -package io.github.hapjava; diff --git a/src/main/java/io/github/hapjava/HomekitAuthInfo.java b/src/main/java/io/github/hapjava/server/HomekitAuthInfo.java similarity index 97% rename from src/main/java/io/github/hapjava/HomekitAuthInfo.java rename to src/main/java/io/github/hapjava/server/HomekitAuthInfo.java index 3326c8bae..9eeae8fe5 100644 --- a/src/main/java/io/github/hapjava/HomekitAuthInfo.java +++ b/src/main/java/io/github/hapjava/server/HomekitAuthInfo.java @@ -1,5 +1,6 @@ -package io.github.hapjava; +package io.github.hapjava.server; +import io.github.hapjava.server.impl.HomekitServer; import java.math.BigInteger; /** diff --git a/src/main/java/io/github/hapjava/impl/HomekitWebHandler.java b/src/main/java/io/github/hapjava/server/HomekitWebHandler.java similarity index 67% rename from src/main/java/io/github/hapjava/impl/HomekitWebHandler.java rename to src/main/java/io/github/hapjava/server/HomekitWebHandler.java index 5c7693a29..d66a843c4 100644 --- a/src/main/java/io/github/hapjava/impl/HomekitWebHandler.java +++ b/src/main/java/io/github/hapjava/server/HomekitWebHandler.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl; +package io.github.hapjava.server; -import io.github.hapjava.impl.http.HomekitClientConnectionFactory; +import io.github.hapjava.server.impl.http.HomekitClientConnectionFactory; import java.util.concurrent.CompletableFuture; public interface HomekitWebHandler { diff --git a/src/main/java/io/github/hapjava/server/impl/HomekitBridge.java b/src/main/java/io/github/hapjava/server/impl/HomekitBridge.java new file mode 100644 index 000000000..11efb0d37 --- /dev/null +++ b/src/main/java/io/github/hapjava/server/impl/HomekitBridge.java @@ -0,0 +1,67 @@ +package io.github.hapjava.server.impl; + +import io.github.hapjava.accessories.Bridge; +import io.github.hapjava.services.Service; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +public class HomekitBridge implements Bridge { + + private final String label; + private final String serialNumber; + private final String model; + private final String manufacturer; + private final String firmwareRevision; + private final String hardwareRevision; + + public HomekitBridge( + String label, + String serialNumber, + String model, + String manufacturer, + String firmwareRevision, + String hardwareRevision) { + this.label = label; + this.serialNumber = serialNumber; + this.model = model; + this.manufacturer = manufacturer; + this.firmwareRevision = firmwareRevision; + this.hardwareRevision = hardwareRevision; + } + + @Override + public CompletableFuture getName() { + return CompletableFuture.completedFuture(label); + } + + @Override + public CompletableFuture getSerialNumber() { + return CompletableFuture.completedFuture(serialNumber); + } + + @Override + public CompletableFuture getModel() { + return CompletableFuture.completedFuture(model); + } + + @Override + public CompletableFuture getManufacturer() { + return CompletableFuture.completedFuture(manufacturer); + } + + @Override + public CompletableFuture getFirmwareRevision() { + return CompletableFuture.completedFuture(firmwareRevision); + } + + @Override + public Collection getServices() { + return Collections.emptyList(); + } + + @Override + public int getId() { + return 1; + } +} diff --git a/src/main/java/io/github/hapjava/impl/HomekitRegistry.java b/src/main/java/io/github/hapjava/server/impl/HomekitRegistry.java similarity index 92% rename from src/main/java/io/github/hapjava/impl/HomekitRegistry.java rename to src/main/java/io/github/hapjava/server/impl/HomekitRegistry.java index e3107d44e..8c7b3d0cd 100644 --- a/src/main/java/io/github/hapjava/impl/HomekitRegistry.java +++ b/src/main/java/io/github/hapjava/server/impl/HomekitRegistry.java @@ -1,9 +1,9 @@ -package io.github.hapjava.impl; +package io.github.hapjava.server.impl; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.Service; +import io.github.hapjava.accessories.HomekitAccessory; import io.github.hapjava.characteristics.Characteristic; -import io.github.hapjava.impl.services.AccessoryInformationService; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.AccessoryInformationService; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; @@ -37,7 +37,7 @@ public synchronized void reset() { newServices.add(new AccessoryInformationService(accessory)); newServices.addAll(accessory.getServices()); } catch (Exception e) { - logger.error("Could not instantiate services for accessory " + accessory.getLabel(), e); + logger.error("Could not instantiate services for accessory " + accessory.getName(), e); services.put(accessory, Collections.emptyList()); continue; } diff --git a/src/main/java/io/github/hapjava/HomekitRoot.java b/src/main/java/io/github/hapjava/server/impl/HomekitRoot.java similarity index 89% rename from src/main/java/io/github/hapjava/HomekitRoot.java rename to src/main/java/io/github/hapjava/server/impl/HomekitRoot.java index 29ed0113c..bc7a2686f 100644 --- a/src/main/java/io/github/hapjava/HomekitRoot.java +++ b/src/main/java/io/github/hapjava/server/impl/HomekitRoot.java @@ -1,11 +1,12 @@ -package io.github.hapjava; +package io.github.hapjava.server.impl; -import io.github.hapjava.impl.HomekitRegistry; -import io.github.hapjava.impl.HomekitWebHandler; -import io.github.hapjava.impl.accessories.Bridge; -import io.github.hapjava.impl.connections.HomekitClientConnectionFactoryImpl; -import io.github.hapjava.impl.connections.SubscriptionManager; -import io.github.hapjava.impl.jmdns.JmdnsHomekitAdvertiser; +import io.github.hapjava.accessories.Bridge; +import io.github.hapjava.accessories.HomekitAccessory; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.HomekitWebHandler; +import io.github.hapjava.server.impl.connections.HomekitClientConnectionFactoryImpl; +import io.github.hapjava.server.impl.connections.SubscriptionManager; +import io.github.hapjava.server.impl.jmdns.JmdnsHomekitAdvertiser; import java.io.IOException; import java.net.InetAddress; import org.slf4j.Logger; @@ -15,8 +16,8 @@ * Provides advertising and handling for Homekit accessories. This class handles the advertising of * Homekit accessories and contains one or more accessories. When implementing a bridge accessory, * you will interact with this class directly. Instantiate it via {@link - * HomekitServer#createBridge(HomekitAuthInfo, String, String, String, String)}. For single - * accessories, this is composed by {@link HomekitStandaloneAccessoryServer}. + * HomekitServer#createBridge(HomekitAuthInfo, String, String, String, String, String, String)}. For + * single accessories, this is composed by {@link HomekitStandaloneAccessoryServer}. * * @author Andy Lintner */ @@ -76,7 +77,7 @@ public void addAccessory(HomekitAccessory accessory) { */ void addAccessorySkipRangeCheck(HomekitAccessory accessory) { this.registry.add(accessory); - logger.info("Added accessory " + accessory.getLabel()); + logger.info("Added accessory " + accessory.getName()); if (started) { registry.reset(); webHandler.resetConnections(); @@ -92,7 +93,7 @@ void addAccessorySkipRangeCheck(HomekitAccessory accessory) { */ public void removeAccessory(HomekitAccessory accessory) { this.registry.remove(accessory); - logger.info("Removed accessory " + accessory.getLabel()); + logger.info("Removed accessory " + accessory.getName()); if (started) { registry.reset(); webHandler.resetConnections(); diff --git a/src/main/java/io/github/hapjava/HomekitServer.java b/src/main/java/io/github/hapjava/server/impl/HomekitServer.java similarity index 88% rename from src/main/java/io/github/hapjava/HomekitServer.java rename to src/main/java/io/github/hapjava/server/impl/HomekitServer.java index 96b64fbdc..ea57f8da4 100644 --- a/src/main/java/io/github/hapjava/HomekitServer.java +++ b/src/main/java/io/github/hapjava/server/impl/HomekitServer.java @@ -1,18 +1,19 @@ -package io.github.hapjava; +package io.github.hapjava.server.impl; -import io.github.hapjava.impl.HomekitBridge; -import io.github.hapjava.impl.HomekitUtils; -import io.github.hapjava.impl.http.impl.HomekitHttpServer; +import io.github.hapjava.accessories.HomekitAccessory; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.impl.http.impl.HomekitHttpServer; import java.io.IOException; import java.math.BigInteger; import java.net.InetAddress; import java.security.InvalidAlgorithmParameterException; +import java.util.concurrent.ExecutionException; /** * The main entry point for hap-java. Creating an instance of this class will listen for Homekit * connections on the supplied port. Only a single root accessory can be added for each unique * instance and port, however, that accessory may be a {@link #createBridge(HomekitAuthInfo, String, - * String, String, String) bridge accessory} containing child accessories. + * String, String, String, String, String) bridge accessory} containing child accessories. * *

The {@link HomekitAuthInfo HomekitAuthInfo} argument when creating accessories should be an * implementation supplied by your application. Several of the values needed for your implementation @@ -81,7 +82,8 @@ public void stop() { * @throws IOException when mDNS cannot connect to the network */ public HomekitStandaloneAccessoryServer createStandaloneAccessory( - HomekitAuthInfo authInfo, HomekitAccessory accessory) throws IOException { + HomekitAuthInfo authInfo, HomekitAccessory accessory) + throws IOException, ExecutionException, InterruptedException { return new HomekitStandaloneAccessoryServer(accessory, http, localAddress, authInfo); } @@ -97,6 +99,8 @@ public HomekitStandaloneAccessoryServer createStandaloneAccessory( * purposes. * @param model model of the bridge. This is also exposed to iOS for unknown purposes. * @param serialNumber serial number of the bridge. Also exposed. Purposes also unknown. + * @param firmwareRevision firmware revision of the bridge. + * @param hardwareRevision hardware revision of the brigde. * @return the bridge, from which you can {@link HomekitRoot#addAccessory add accessories} and * then {@link HomekitRoot#start start} handling requests. * @throws IOException when mDNS cannot connect to the network @@ -106,10 +110,14 @@ public HomekitRoot createBridge( String label, String manufacturer, String model, - String serialNumber) + String serialNumber, + String firmwareRevision, + String hardwareRevision) throws IOException { HomekitRoot root = new HomekitRoot(label, http, localAddress, authInfo); - root.addAccessory(new HomekitBridge(label, serialNumber, model, manufacturer)); + root.addAccessory( + new HomekitBridge( + label, serialNumber, model, manufacturer, firmwareRevision, hardwareRevision)); return root; } diff --git a/src/main/java/io/github/hapjava/HomekitStandaloneAccessoryServer.java b/src/main/java/io/github/hapjava/server/impl/HomekitStandaloneAccessoryServer.java similarity index 67% rename from src/main/java/io/github/hapjava/HomekitStandaloneAccessoryServer.java rename to src/main/java/io/github/hapjava/server/impl/HomekitStandaloneAccessoryServer.java index 6df6fb603..9ab4530ea 100644 --- a/src/main/java/io/github/hapjava/HomekitStandaloneAccessoryServer.java +++ b/src/main/java/io/github/hapjava/server/impl/HomekitStandaloneAccessoryServer.java @@ -1,9 +1,12 @@ -package io.github.hapjava; +package io.github.hapjava.server.impl; -import io.github.hapjava.impl.HomekitWebHandler; +import io.github.hapjava.accessories.HomekitAccessory; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.HomekitWebHandler; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.concurrent.ExecutionException; /** * A server for exposing standalone Homekit accessory (as opposed to a Bridge accessory which @@ -22,8 +25,8 @@ public class HomekitStandaloneAccessoryServer { HomekitWebHandler webHandler, InetAddress localhost, HomekitAuthInfo authInfo) - throws UnknownHostException, IOException { - root = new HomekitRoot(accessory.getLabel(), webHandler, localhost, authInfo); + throws UnknownHostException, IOException, ExecutionException, InterruptedException { + root = new HomekitRoot(accessory.getName().get(), webHandler, localhost, authInfo); root.addAccessory(accessory); } diff --git a/src/main/java/io/github/hapjava/impl/HomekitUtils.java b/src/main/java/io/github/hapjava/server/impl/HomekitUtils.java similarity index 98% rename from src/main/java/io/github/hapjava/impl/HomekitUtils.java rename to src/main/java/io/github/hapjava/server/impl/HomekitUtils.java index 614515993..9b5b2b8ee 100644 --- a/src/main/java/io/github/hapjava/impl/HomekitUtils.java +++ b/src/main/java/io/github/hapjava/server/impl/HomekitUtils.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl; +package io.github.hapjava.server.impl; import com.nimbusds.srp6.SRP6Routines; import java.math.BigInteger; diff --git a/src/main/java/io/github/hapjava/impl/connections/ConnectionImpl.java b/src/main/java/io/github/hapjava/server/impl/connections/ConnectionImpl.java similarity index 88% rename from src/main/java/io/github/hapjava/impl/connections/ConnectionImpl.java rename to src/main/java/io/github/hapjava/server/impl/connections/ConnectionImpl.java index 8751a9652..c1853855d 100644 --- a/src/main/java/io/github/hapjava/impl/connections/ConnectionImpl.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/ConnectionImpl.java @@ -1,12 +1,14 @@ -package io.github.hapjava.impl.connections; +package io.github.hapjava.server.impl.connections; -import io.github.hapjava.HomekitAuthInfo; -import io.github.hapjava.impl.HomekitRegistry; -import io.github.hapjava.impl.crypto.ChachaDecoder; -import io.github.hapjava.impl.crypto.ChachaEncoder; -import io.github.hapjava.impl.http.*; -import io.github.hapjava.impl.jmdns.JmdnsHomekitAdvertiser; -import io.github.hapjava.impl.pairing.UpgradeResponse; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.impl.HomekitRegistry; +import io.github.hapjava.server.impl.crypto.ChachaDecoder; +import io.github.hapjava.server.impl.crypto.ChachaEncoder; +import io.github.hapjava.server.impl.http.HomekitClientConnection; +import io.github.hapjava.server.impl.http.HttpRequest; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.jmdns.JmdnsHomekitAdvertiser; +import io.github.hapjava.server.impl.pairing.UpgradeResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; diff --git a/src/main/java/io/github/hapjava/impl/connections/HomekitClientConnectionFactoryImpl.java b/src/main/java/io/github/hapjava/server/impl/connections/HomekitClientConnectionFactoryImpl.java similarity index 67% rename from src/main/java/io/github/hapjava/impl/connections/HomekitClientConnectionFactoryImpl.java rename to src/main/java/io/github/hapjava/server/impl/connections/HomekitClientConnectionFactoryImpl.java index b4b304b1a..9c8ad9fc0 100644 --- a/src/main/java/io/github/hapjava/impl/connections/HomekitClientConnectionFactoryImpl.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/HomekitClientConnectionFactoryImpl.java @@ -1,11 +1,11 @@ -package io.github.hapjava.impl.connections; +package io.github.hapjava.server.impl.connections; -import io.github.hapjava.HomekitAuthInfo; -import io.github.hapjava.impl.HomekitRegistry; -import io.github.hapjava.impl.http.HomekitClientConnection; -import io.github.hapjava.impl.http.HomekitClientConnectionFactory; -import io.github.hapjava.impl.http.HttpResponse; -import io.github.hapjava.impl.jmdns.JmdnsHomekitAdvertiser; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.impl.HomekitRegistry; +import io.github.hapjava.server.impl.http.HomekitClientConnection; +import io.github.hapjava.server.impl.http.HomekitClientConnectionFactory; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.jmdns.JmdnsHomekitAdvertiser; import java.util.function.Consumer; public class HomekitClientConnectionFactoryImpl implements HomekitClientConnectionFactory { diff --git a/src/main/java/io/github/hapjava/impl/connections/HttpSession.java b/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java similarity index 84% rename from src/main/java/io/github/hapjava/impl/connections/HttpSession.java rename to src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java index 4a7efe7d9..3d7d8c817 100644 --- a/src/main/java/io/github/hapjava/impl/connections/HttpSession.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java @@ -1,19 +1,19 @@ -package io.github.hapjava.impl.connections; - -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.HomekitAuthInfo; -import io.github.hapjava.impl.HomekitRegistry; -import io.github.hapjava.impl.http.HomekitClientConnection; -import io.github.hapjava.impl.http.HttpRequest; -import io.github.hapjava.impl.http.HttpResponse; -import io.github.hapjava.impl.jmdns.JmdnsHomekitAdvertiser; -import io.github.hapjava.impl.json.AccessoryController; -import io.github.hapjava.impl.json.CharacteristicsController; -import io.github.hapjava.impl.pairing.PairVerificationManager; -import io.github.hapjava.impl.pairing.PairingManager; -import io.github.hapjava.impl.pairing.PairingUpdateController; -import io.github.hapjava.impl.responses.InternalServerErrorResponse; -import io.github.hapjava.impl.responses.NotFoundResponse; +package io.github.hapjava.server.impl.connections; + +import io.github.hapjava.accessories.HomekitAccessory; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.impl.HomekitRegistry; +import io.github.hapjava.server.impl.http.HomekitClientConnection; +import io.github.hapjava.server.impl.http.HttpRequest; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.jmdns.JmdnsHomekitAdvertiser; +import io.github.hapjava.server.impl.json.AccessoryController; +import io.github.hapjava.server.impl.json.CharacteristicsController; +import io.github.hapjava.server.impl.pairing.PairVerificationManager; +import io.github.hapjava.server.impl.pairing.PairingManager; +import io.github.hapjava.server.impl.pairing.PairingUpdateController; +import io.github.hapjava.server.impl.responses.InternalServerErrorResponse; +import io.github.hapjava.server.impl.responses.NotFoundResponse; import java.io.IOException; import java.net.InetAddress; import org.slf4j.Logger; diff --git a/src/main/java/io/github/hapjava/impl/connections/LengthPrefixedByteArrayProcessor.java b/src/main/java/io/github/hapjava/server/impl/connections/LengthPrefixedByteArrayProcessor.java similarity index 98% rename from src/main/java/io/github/hapjava/impl/connections/LengthPrefixedByteArrayProcessor.java rename to src/main/java/io/github/hapjava/server/impl/connections/LengthPrefixedByteArrayProcessor.java index d84194685..124acbb51 100644 --- a/src/main/java/io/github/hapjava/impl/connections/LengthPrefixedByteArrayProcessor.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/LengthPrefixedByteArrayProcessor.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.connections; +package io.github.hapjava.server.impl.connections; import java.io.ByteArrayOutputStream; import java.util.Collection; diff --git a/src/main/java/io/github/hapjava/impl/connections/PendingNotification.java b/src/main/java/io/github/hapjava/server/impl/connections/PendingNotification.java similarity index 87% rename from src/main/java/io/github/hapjava/impl/connections/PendingNotification.java rename to src/main/java/io/github/hapjava/server/impl/connections/PendingNotification.java index 8cd65a4b9..ea9c69305 100644 --- a/src/main/java/io/github/hapjava/impl/connections/PendingNotification.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/PendingNotification.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.connections; +package io.github.hapjava.server.impl.connections; import io.github.hapjava.characteristics.EventableCharacteristic; diff --git a/src/main/java/io/github/hapjava/impl/connections/SubscriptionManager.java b/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java similarity index 95% rename from src/main/java/io/github/hapjava/impl/connections/SubscriptionManager.java rename to src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java index 2a2fc693d..5a26a41b4 100644 --- a/src/main/java/io/github/hapjava/impl/connections/SubscriptionManager.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java @@ -1,9 +1,9 @@ -package io.github.hapjava.impl.connections; +package io.github.hapjava.server.impl.connections; import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.impl.http.HomekitClientConnection; -import io.github.hapjava.impl.http.HttpResponse; -import io.github.hapjava.impl.json.EventController; +import io.github.hapjava.server.impl.http.HomekitClientConnection; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.json.EventController; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; diff --git a/src/main/java/io/github/hapjava/impl/crypto/ChachaDecoder.java b/src/main/java/io/github/hapjava/server/impl/crypto/ChachaDecoder.java similarity index 97% rename from src/main/java/io/github/hapjava/impl/crypto/ChachaDecoder.java rename to src/main/java/io/github/hapjava/server/impl/crypto/ChachaDecoder.java index 73a09b945..4c74a469d 100644 --- a/src/main/java/io/github/hapjava/impl/crypto/ChachaDecoder.java +++ b/src/main/java/io/github/hapjava/server/impl/crypto/ChachaDecoder.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.crypto; +package io.github.hapjava.server.impl.crypto; import java.io.IOException; import org.bouncycastle.crypto.engines.ChaChaEngine; diff --git a/src/main/java/io/github/hapjava/impl/crypto/ChachaEncoder.java b/src/main/java/io/github/hapjava/server/impl/crypto/ChachaEncoder.java similarity index 97% rename from src/main/java/io/github/hapjava/impl/crypto/ChachaEncoder.java rename to src/main/java/io/github/hapjava/server/impl/crypto/ChachaEncoder.java index aab841877..3304e7d9a 100644 --- a/src/main/java/io/github/hapjava/impl/crypto/ChachaEncoder.java +++ b/src/main/java/io/github/hapjava/server/impl/crypto/ChachaEncoder.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.crypto; +package io.github.hapjava.server.impl.crypto; import java.io.IOException; import org.bouncycastle.crypto.engines.ChaChaEngine; diff --git a/src/main/java/io/github/hapjava/impl/crypto/EdsaSigner.java b/src/main/java/io/github/hapjava/server/impl/crypto/EdsaSigner.java similarity index 96% rename from src/main/java/io/github/hapjava/impl/crypto/EdsaSigner.java rename to src/main/java/io/github/hapjava/server/impl/crypto/EdsaSigner.java index 3c522438b..a1985d186 100644 --- a/src/main/java/io/github/hapjava/impl/crypto/EdsaSigner.java +++ b/src/main/java/io/github/hapjava/server/impl/crypto/EdsaSigner.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.crypto; +package io.github.hapjava.server.impl.crypto; import java.security.InvalidKeyException; import java.security.MessageDigest; diff --git a/src/main/java/io/github/hapjava/impl/crypto/EdsaVerifier.java b/src/main/java/io/github/hapjava/server/impl/crypto/EdsaVerifier.java similarity index 95% rename from src/main/java/io/github/hapjava/impl/crypto/EdsaVerifier.java rename to src/main/java/io/github/hapjava/server/impl/crypto/EdsaVerifier.java index 4ed210a3a..e5ca8e90a 100644 --- a/src/main/java/io/github/hapjava/impl/crypto/EdsaVerifier.java +++ b/src/main/java/io/github/hapjava/server/impl/crypto/EdsaVerifier.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.crypto; +package io.github.hapjava.server.impl.crypto; import java.security.MessageDigest; import java.security.PublicKey; diff --git a/src/main/java/io/github/hapjava/impl/crypto/PolyKeyCreator.java b/src/main/java/io/github/hapjava/server/impl/crypto/PolyKeyCreator.java similarity index 96% rename from src/main/java/io/github/hapjava/impl/crypto/PolyKeyCreator.java rename to src/main/java/io/github/hapjava/server/impl/crypto/PolyKeyCreator.java index 9d314aa5c..ed66342c8 100644 --- a/src/main/java/io/github/hapjava/impl/crypto/PolyKeyCreator.java +++ b/src/main/java/io/github/hapjava/server/impl/crypto/PolyKeyCreator.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.crypto; +package io.github.hapjava.server.impl.crypto; import org.bouncycastle.crypto.macs.Poly1305; import org.bouncycastle.crypto.params.KeyParameter; diff --git a/src/main/java/io/github/hapjava/impl/http/HomekitClientConnection.java b/src/main/java/io/github/hapjava/server/impl/http/HomekitClientConnection.java similarity index 87% rename from src/main/java/io/github/hapjava/impl/http/HomekitClientConnection.java rename to src/main/java/io/github/hapjava/server/impl/http/HomekitClientConnection.java index b91cad70b..58ef23c6e 100644 --- a/src/main/java/io/github/hapjava/impl/http/HomekitClientConnection.java +++ b/src/main/java/io/github/hapjava/server/impl/http/HomekitClientConnection.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.http; +package io.github.hapjava.server.impl.http; import java.io.IOException; diff --git a/src/main/java/io/github/hapjava/impl/http/HomekitClientConnectionFactory.java b/src/main/java/io/github/hapjava/server/impl/http/HomekitClientConnectionFactory.java similarity index 80% rename from src/main/java/io/github/hapjava/impl/http/HomekitClientConnectionFactory.java rename to src/main/java/io/github/hapjava/server/impl/http/HomekitClientConnectionFactory.java index 435d592a6..18c814306 100644 --- a/src/main/java/io/github/hapjava/impl/http/HomekitClientConnectionFactory.java +++ b/src/main/java/io/github/hapjava/server/impl/http/HomekitClientConnectionFactory.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.http; +package io.github.hapjava.server.impl.http; import java.util.function.Consumer; diff --git a/src/main/java/io/github/hapjava/impl/http/HttpMethod.java b/src/main/java/io/github/hapjava/server/impl/http/HttpMethod.java similarity index 52% rename from src/main/java/io/github/hapjava/impl/http/HttpMethod.java rename to src/main/java/io/github/hapjava/server/impl/http/HttpMethod.java index 014bf024a..f4844b667 100644 --- a/src/main/java/io/github/hapjava/impl/http/HttpMethod.java +++ b/src/main/java/io/github/hapjava/server/impl/http/HttpMethod.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.http; +package io.github.hapjava.server.impl.http; public enum HttpMethod { GET, diff --git a/src/main/java/io/github/hapjava/impl/http/HttpRequest.java b/src/main/java/io/github/hapjava/server/impl/http/HttpRequest.java similarity index 69% rename from src/main/java/io/github/hapjava/impl/http/HttpRequest.java rename to src/main/java/io/github/hapjava/server/impl/http/HttpRequest.java index 088050ad9..9921af341 100644 --- a/src/main/java/io/github/hapjava/impl/http/HttpRequest.java +++ b/src/main/java/io/github/hapjava/server/impl/http/HttpRequest.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.http; +package io.github.hapjava.server.impl.http; public interface HttpRequest { diff --git a/src/main/java/io/github/hapjava/impl/http/HttpResponse.java b/src/main/java/io/github/hapjava/server/impl/http/HttpResponse.java similarity index 91% rename from src/main/java/io/github/hapjava/impl/http/HttpResponse.java rename to src/main/java/io/github/hapjava/server/impl/http/HttpResponse.java index 205ff5e56..4871dba99 100644 --- a/src/main/java/io/github/hapjava/impl/http/HttpResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/http/HttpResponse.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.http; +package io.github.hapjava.server.impl.http; import java.nio.ByteBuffer; import java.util.Collections; diff --git a/src/main/java/io/github/hapjava/impl/http/impl/AccessoryHandler.java b/src/main/java/io/github/hapjava/server/impl/http/impl/AccessoryHandler.java similarity index 93% rename from src/main/java/io/github/hapjava/impl/http/impl/AccessoryHandler.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/AccessoryHandler.java index 20d4246ac..35ac055cf 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/AccessoryHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/AccessoryHandler.java @@ -1,8 +1,8 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; -import io.github.hapjava.impl.http.HomekitClientConnection; -import io.github.hapjava.impl.http.HomekitClientConnectionFactory; -import io.github.hapjava.impl.http.HttpResponse; +import io.github.hapjava.server.impl.http.HomekitClientConnection; +import io.github.hapjava.server.impl.http.HomekitClientConnectionFactory; +import io.github.hapjava.server.impl.http.HttpResponse; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; diff --git a/src/main/java/io/github/hapjava/impl/http/impl/BinaryHandler.java b/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java similarity index 94% rename from src/main/java/io/github/hapjava/impl/http/impl/BinaryHandler.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java index cb5335ee0..5a2337707 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/BinaryHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; -import io.github.hapjava.impl.http.HomekitClientConnection; +import io.github.hapjava.server.impl.http.HomekitClientConnection; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; diff --git a/src/main/java/io/github/hapjava/impl/http/impl/DefaultHttpRequestImpl.java b/src/main/java/io/github/hapjava/server/impl/http/impl/DefaultHttpRequestImpl.java similarity index 85% rename from src/main/java/io/github/hapjava/impl/http/impl/DefaultHttpRequestImpl.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/DefaultHttpRequestImpl.java index 1fe33c48f..48a3ceb35 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/DefaultHttpRequestImpl.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/DefaultHttpRequestImpl.java @@ -1,7 +1,7 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; -import io.github.hapjava.impl.http.HttpMethod; -import io.github.hapjava.impl.http.HttpRequest; +import io.github.hapjava.server.impl.http.HttpMethod; +import io.github.hapjava.server.impl.http.HttpRequest; class DefaultHttpRequestImpl implements HttpRequest { diff --git a/src/main/java/io/github/hapjava/impl/http/impl/FullRequestHttpRequestImpl.java b/src/main/java/io/github/hapjava/server/impl/http/impl/FullRequestHttpRequestImpl.java similarity index 90% rename from src/main/java/io/github/hapjava/impl/http/impl/FullRequestHttpRequestImpl.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/FullRequestHttpRequestImpl.java index ee82d15f4..088ec9832 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/FullRequestHttpRequestImpl.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/FullRequestHttpRequestImpl.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; import io.netty.handler.codec.http.FullHttpRequest; diff --git a/src/main/java/io/github/hapjava/impl/http/impl/HomekitHttpServer.java b/src/main/java/io/github/hapjava/server/impl/http/impl/HomekitHttpServer.java similarity index 85% rename from src/main/java/io/github/hapjava/impl/http/impl/HomekitHttpServer.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/HomekitHttpServer.java index 3a8773132..085d632cf 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/HomekitHttpServer.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/HomekitHttpServer.java @@ -1,7 +1,7 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; -import io.github.hapjava.impl.HomekitWebHandler; -import io.github.hapjava.impl.http.HomekitClientConnectionFactory; +import io.github.hapjava.server.HomekitWebHandler; +import io.github.hapjava.server.impl.http.HomekitClientConnectionFactory; import java.net.InetAddress; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/io/github/hapjava/impl/http/impl/HttpResponseEncoderAggregate.java b/src/main/java/io/github/hapjava/server/impl/http/impl/HttpResponseEncoderAggregate.java similarity index 92% rename from src/main/java/io/github/hapjava/impl/http/impl/HttpResponseEncoderAggregate.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/HttpResponseEncoderAggregate.java index 23ac740fa..96aee2fe7 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/HttpResponseEncoderAggregate.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/HttpResponseEncoderAggregate.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; diff --git a/src/main/java/io/github/hapjava/impl/http/impl/LoggingHandler.java b/src/main/java/io/github/hapjava/server/impl/http/impl/LoggingHandler.java similarity index 97% rename from src/main/java/io/github/hapjava/impl/http/impl/LoggingHandler.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/LoggingHandler.java index 1bae4fa9f..5b8e52368 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/LoggingHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/LoggingHandler.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; import io.netty.buffer.ByteBuf; import io.netty.channel.*; diff --git a/src/main/java/io/github/hapjava/impl/http/impl/NettyHomekitHttpService.java b/src/main/java/io/github/hapjava/server/impl/http/impl/NettyHomekitHttpService.java similarity index 96% rename from src/main/java/io/github/hapjava/impl/http/impl/NettyHomekitHttpService.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/NettyHomekitHttpService.java index 2bc427d54..329b803dc 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/NettyHomekitHttpService.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/NettyHomekitHttpService.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; -import io.github.hapjava.impl.http.HomekitClientConnectionFactory; +import io.github.hapjava.server.impl.http.HomekitClientConnectionFactory; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.group.ChannelGroup; diff --git a/src/main/java/io/github/hapjava/impl/http/impl/NettyResponseUtil.java b/src/main/java/io/github/hapjava/server/impl/http/impl/NettyResponseUtil.java similarity index 92% rename from src/main/java/io/github/hapjava/impl/http/impl/NettyResponseUtil.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/NettyResponseUtil.java index c9b141771..fba52eef5 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/NettyResponseUtil.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/NettyResponseUtil.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; -import io.github.hapjava.impl.http.HttpResponse; +import io.github.hapjava.server.impl.http.HttpResponse; import io.netty.buffer.Unpooled; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpResponse; diff --git a/src/main/java/io/github/hapjava/impl/http/impl/ServerInitializer.java b/src/main/java/io/github/hapjava/server/impl/http/impl/ServerInitializer.java similarity index 92% rename from src/main/java/io/github/hapjava/impl/http/impl/ServerInitializer.java rename to src/main/java/io/github/hapjava/server/impl/http/impl/ServerInitializer.java index ed447a1af..3c914ffe7 100644 --- a/src/main/java/io/github/hapjava/impl/http/impl/ServerInitializer.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/ServerInitializer.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.http.impl; +package io.github.hapjava.server.impl.http.impl; -import io.github.hapjava.impl.http.HomekitClientConnectionFactory; +import io.github.hapjava.server.impl.http.HomekitClientConnectionFactory; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.group.ChannelGroup; diff --git a/src/main/java/io/github/hapjava/impl/jmdns/JmdnsHomekitAdvertiser.java b/src/main/java/io/github/hapjava/server/impl/jmdns/JmdnsHomekitAdvertiser.java similarity index 98% rename from src/main/java/io/github/hapjava/impl/jmdns/JmdnsHomekitAdvertiser.java rename to src/main/java/io/github/hapjava/server/impl/jmdns/JmdnsHomekitAdvertiser.java index 062536708..8ba452906 100644 --- a/src/main/java/io/github/hapjava/impl/jmdns/JmdnsHomekitAdvertiser.java +++ b/src/main/java/io/github/hapjava/server/impl/jmdns/JmdnsHomekitAdvertiser.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.jmdns; +package io.github.hapjava.server.impl.jmdns; import java.io.IOException; import java.net.InetAddress; diff --git a/src/main/java/io/github/hapjava/impl/json/AccessoryController.java b/src/main/java/io/github/hapjava/server/impl/json/AccessoryController.java similarity index 93% rename from src/main/java/io/github/hapjava/impl/json/AccessoryController.java rename to src/main/java/io/github/hapjava/server/impl/json/AccessoryController.java index 66c46bdcf..fb53c6315 100644 --- a/src/main/java/io/github/hapjava/impl/json/AccessoryController.java +++ b/src/main/java/io/github/hapjava/server/impl/json/AccessoryController.java @@ -1,10 +1,10 @@ -package io.github.hapjava.impl.json; +package io.github.hapjava.server.impl.json; -import io.github.hapjava.HomekitAccessory; -import io.github.hapjava.Service; +import io.github.hapjava.accessories.HomekitAccessory; import io.github.hapjava.characteristics.Characteristic; -import io.github.hapjava.impl.HomekitRegistry; -import io.github.hapjava.impl.http.HttpResponse; +import io.github.hapjava.server.impl.HomekitRegistry; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.services.Service; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/io/github/hapjava/impl/json/CharacteristicsController.java b/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java similarity index 90% rename from src/main/java/io/github/hapjava/impl/json/CharacteristicsController.java rename to src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java index 8a85956e7..484a4ea30 100644 --- a/src/main/java/io/github/hapjava/impl/json/CharacteristicsController.java +++ b/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java @@ -1,13 +1,13 @@ -package io.github.hapjava.impl.json; +package io.github.hapjava.server.impl.json; import io.github.hapjava.characteristics.Characteristic; import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.impl.HomekitRegistry; -import io.github.hapjava.impl.connections.SubscriptionManager; -import io.github.hapjava.impl.http.HomekitClientConnection; -import io.github.hapjava.impl.http.HttpRequest; -import io.github.hapjava.impl.http.HttpResponse; -import io.github.hapjava.impl.responses.NotFoundResponse; +import io.github.hapjava.server.impl.HomekitRegistry; +import io.github.hapjava.server.impl.connections.SubscriptionManager; +import io.github.hapjava.server.impl.http.HomekitClientConnection; +import io.github.hapjava.server.impl.http.HttpRequest; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.responses.NotFoundResponse; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Map; diff --git a/src/main/java/io/github/hapjava/impl/json/EventController.java b/src/main/java/io/github/hapjava/server/impl/json/EventController.java similarity index 91% rename from src/main/java/io/github/hapjava/impl/json/EventController.java rename to src/main/java/io/github/hapjava/server/impl/json/EventController.java index 9322f2507..80be265ae 100644 --- a/src/main/java/io/github/hapjava/impl/json/EventController.java +++ b/src/main/java/io/github/hapjava/server/impl/json/EventController.java @@ -1,8 +1,8 @@ -package io.github.hapjava.impl.json; +package io.github.hapjava.server.impl.json; import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.impl.connections.PendingNotification; -import io.github.hapjava.impl.http.HttpResponse; +import io.github.hapjava.server.impl.connections.PendingNotification; +import io.github.hapjava.server.impl.http.HttpResponse; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import javax.json.Json; diff --git a/src/main/java/io/github/hapjava/impl/json/EventResponse.java b/src/main/java/io/github/hapjava/server/impl/json/EventResponse.java similarity index 82% rename from src/main/java/io/github/hapjava/impl/json/EventResponse.java rename to src/main/java/io/github/hapjava/server/impl/json/EventResponse.java index faa4478b3..113582c5b 100644 --- a/src/main/java/io/github/hapjava/impl/json/EventResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/json/EventResponse.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.json; +package io.github.hapjava.server.impl.json; public class EventResponse extends HapJsonResponse { diff --git a/src/main/java/io/github/hapjava/impl/json/HapJsonNoContentResponse.java b/src/main/java/io/github/hapjava/server/impl/json/HapJsonNoContentResponse.java similarity index 81% rename from src/main/java/io/github/hapjava/impl/json/HapJsonNoContentResponse.java rename to src/main/java/io/github/hapjava/server/impl/json/HapJsonNoContentResponse.java index fbb5066bb..be01ebbe3 100644 --- a/src/main/java/io/github/hapjava/impl/json/HapJsonNoContentResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/json/HapJsonNoContentResponse.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.json; +package io.github.hapjava.server.impl.json; class HapJsonNoContentResponse extends HapJsonResponse { diff --git a/src/main/java/io/github/hapjava/impl/json/HapJsonResponse.java b/src/main/java/io/github/hapjava/server/impl/json/HapJsonResponse.java similarity index 84% rename from src/main/java/io/github/hapjava/impl/json/HapJsonResponse.java rename to src/main/java/io/github/hapjava/server/impl/json/HapJsonResponse.java index 1696a7f0a..dbbe7cada 100644 --- a/src/main/java/io/github/hapjava/impl/json/HapJsonResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/json/HapJsonResponse.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.json; +package io.github.hapjava.server.impl.json; -import io.github.hapjava.impl.responses.OkResponse; +import io.github.hapjava.server.impl.responses.OkResponse; import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/io/github/hapjava/impl/pairing/ByteUtils.java b/src/main/java/io/github/hapjava/server/impl/pairing/ByteUtils.java similarity index 95% rename from src/main/java/io/github/hapjava/impl/pairing/ByteUtils.java rename to src/main/java/io/github/hapjava/server/impl/pairing/ByteUtils.java index 8f903811b..6516e2e29 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/ByteUtils.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/ByteUtils.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; import java.io.IOException; import java.io.InputStream; diff --git a/src/main/java/io/github/hapjava/impl/pairing/ClientEvidenceRoutineImpl.java b/src/main/java/io/github/hapjava/server/impl/pairing/ClientEvidenceRoutineImpl.java similarity index 97% rename from src/main/java/io/github/hapjava/impl/pairing/ClientEvidenceRoutineImpl.java rename to src/main/java/io/github/hapjava/server/impl/pairing/ClientEvidenceRoutineImpl.java index db464b8fb..16c514707 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/ClientEvidenceRoutineImpl.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/ClientEvidenceRoutineImpl.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; import com.nimbusds.srp6.*; import java.math.BigInteger; diff --git a/src/main/java/io/github/hapjava/impl/pairing/FinalPairHandler.java b/src/main/java/io/github/hapjava/server/impl/pairing/FinalPairHandler.java similarity index 85% rename from src/main/java/io/github/hapjava/impl/pairing/FinalPairHandler.java rename to src/main/java/io/github/hapjava/server/impl/pairing/FinalPairHandler.java index 29b8b88a3..e5d9e371c 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/FinalPairHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/FinalPairHandler.java @@ -1,11 +1,14 @@ -package io.github.hapjava.impl.pairing; - -import io.github.hapjava.HomekitAuthInfo; -import io.github.hapjava.impl.crypto.*; -import io.github.hapjava.impl.http.HttpResponse; -import io.github.hapjava.impl.pairing.PairSetupRequest.Stage3Request; -import io.github.hapjava.impl.pairing.TypeLengthValueUtils.DecodeResult; -import io.github.hapjava.impl.pairing.TypeLengthValueUtils.Encoder; +package io.github.hapjava.server.impl.pairing; + +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.impl.crypto.ChachaDecoder; +import io.github.hapjava.server.impl.crypto.ChachaEncoder; +import io.github.hapjava.server.impl.crypto.EdsaSigner; +import io.github.hapjava.server.impl.crypto.EdsaVerifier; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.pairing.PairSetupRequest.Stage3Request; +import io.github.hapjava.server.impl.pairing.TypeLengthValueUtils.DecodeResult; +import io.github.hapjava.server.impl.pairing.TypeLengthValueUtils.Encoder; import java.nio.charset.StandardCharsets; import org.bouncycastle.crypto.digests.SHA512Digest; import org.bouncycastle.crypto.generators.HKDFBytesGenerator; diff --git a/src/main/java/io/github/hapjava/impl/pairing/HomekitSRP6Routines.java b/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6Routines.java similarity index 97% rename from src/main/java/io/github/hapjava/impl/pairing/HomekitSRP6Routines.java rename to src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6Routines.java index d21adfe8b..5e44117f3 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/HomekitSRP6Routines.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6Routines.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; import java.math.BigInteger; import java.security.SecureRandom; diff --git a/src/main/java/io/github/hapjava/impl/pairing/HomekitSRP6ServerSession.java b/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6ServerSession.java similarity index 99% rename from src/main/java/io/github/hapjava/impl/pairing/HomekitSRP6ServerSession.java rename to src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6ServerSession.java index a459a5c54..0ec311048 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/HomekitSRP6ServerSession.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6ServerSession.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; import com.nimbusds.srp6.SRP6ClientEvidenceContext; import com.nimbusds.srp6.SRP6CryptoParams; diff --git a/src/main/java/io/github/hapjava/impl/pairing/MessageType.java b/src/main/java/io/github/hapjava/server/impl/pairing/MessageType.java similarity index 87% rename from src/main/java/io/github/hapjava/impl/pairing/MessageType.java rename to src/main/java/io/github/hapjava/server/impl/pairing/MessageType.java index 2750264a3..ffdd0ba33 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/MessageType.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/MessageType.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; public enum MessageType { METHOD(0), diff --git a/src/main/java/io/github/hapjava/impl/pairing/PairSetupRequest.java b/src/main/java/io/github/hapjava/server/impl/pairing/PairSetupRequest.java similarity index 94% rename from src/main/java/io/github/hapjava/impl/pairing/PairSetupRequest.java rename to src/main/java/io/github/hapjava/server/impl/pairing/PairSetupRequest.java index a7d7a0445..bd0da4c81 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/PairSetupRequest.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/PairSetupRequest.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; -import io.github.hapjava.impl.pairing.TypeLengthValueUtils.DecodeResult; +import io.github.hapjava.server.impl.pairing.TypeLengthValueUtils.DecodeResult; import java.math.BigInteger; abstract class PairSetupRequest { diff --git a/src/main/java/io/github/hapjava/impl/pairing/PairVerificationManager.java b/src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationManager.java similarity index 84% rename from src/main/java/io/github/hapjava/impl/pairing/PairVerificationManager.java rename to src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationManager.java index 4c5546745..6630c82e8 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/PairVerificationManager.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationManager.java @@ -1,17 +1,20 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; import djb.Curve25519; -import io.github.hapjava.HomekitAuthInfo; -import io.github.hapjava.impl.HomekitRegistry; -import io.github.hapjava.impl.crypto.*; -import io.github.hapjava.impl.http.HttpRequest; -import io.github.hapjava.impl.http.HttpResponse; -import io.github.hapjava.impl.pairing.PairVerificationRequest.Stage1Request; -import io.github.hapjava.impl.pairing.PairVerificationRequest.Stage2Request; -import io.github.hapjava.impl.pairing.TypeLengthValueUtils.DecodeResult; -import io.github.hapjava.impl.pairing.TypeLengthValueUtils.Encoder; -import io.github.hapjava.impl.responses.NotFoundResponse; -import io.github.hapjava.impl.responses.OkResponse; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.impl.HomekitRegistry; +import io.github.hapjava.server.impl.crypto.ChachaDecoder; +import io.github.hapjava.server.impl.crypto.ChachaEncoder; +import io.github.hapjava.server.impl.crypto.EdsaSigner; +import io.github.hapjava.server.impl.crypto.EdsaVerifier; +import io.github.hapjava.server.impl.http.HttpRequest; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.pairing.PairVerificationRequest.Stage1Request; +import io.github.hapjava.server.impl.pairing.PairVerificationRequest.Stage2Request; +import io.github.hapjava.server.impl.pairing.TypeLengthValueUtils.DecodeResult; +import io.github.hapjava.server.impl.pairing.TypeLengthValueUtils.Encoder; +import io.github.hapjava.server.impl.responses.NotFoundResponse; +import io.github.hapjava.server.impl.responses.OkResponse; import java.nio.charset.StandardCharsets; import java.security.SecureRandom; import org.bouncycastle.crypto.digests.SHA512Digest; diff --git a/src/main/java/io/github/hapjava/impl/pairing/PairVerificationRequest.java b/src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationRequest.java similarity index 92% rename from src/main/java/io/github/hapjava/impl/pairing/PairVerificationRequest.java rename to src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationRequest.java index 1d4f8db4b..3bb6627d9 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/PairVerificationRequest.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationRequest.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; -import io.github.hapjava.impl.pairing.TypeLengthValueUtils.DecodeResult; +import io.github.hapjava.server.impl.pairing.TypeLengthValueUtils.DecodeResult; abstract class PairVerificationRequest { diff --git a/src/main/java/io/github/hapjava/impl/pairing/PairingManager.java b/src/main/java/io/github/hapjava/server/impl/pairing/PairingManager.java similarity index 83% rename from src/main/java/io/github/hapjava/impl/pairing/PairingManager.java rename to src/main/java/io/github/hapjava/server/impl/pairing/PairingManager.java index 934181309..d4265a587 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/PairingManager.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/PairingManager.java @@ -1,11 +1,11 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; -import io.github.hapjava.HomekitAuthInfo; -import io.github.hapjava.impl.HomekitRegistry; -import io.github.hapjava.impl.http.HttpRequest; -import io.github.hapjava.impl.http.HttpResponse; -import io.github.hapjava.impl.responses.NotFoundResponse; -import io.github.hapjava.impl.responses.UnauthorizedResponse; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.impl.HomekitRegistry; +import io.github.hapjava.server.impl.http.HttpRequest; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.responses.NotFoundResponse; +import io.github.hapjava.server.impl.responses.UnauthorizedResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/github/hapjava/impl/pairing/PairingResponse.java b/src/main/java/io/github/hapjava/server/impl/pairing/PairingResponse.java similarity index 84% rename from src/main/java/io/github/hapjava/impl/pairing/PairingResponse.java rename to src/main/java/io/github/hapjava/server/impl/pairing/PairingResponse.java index 1291f66ee..af678a86c 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/PairingResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/PairingResponse.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; -import io.github.hapjava.impl.responses.OkResponse; +import io.github.hapjava.server.impl.responses.OkResponse; import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/io/github/hapjava/impl/pairing/PairingUpdateController.java b/src/main/java/io/github/hapjava/server/impl/pairing/PairingUpdateController.java similarity index 77% rename from src/main/java/io/github/hapjava/impl/pairing/PairingUpdateController.java rename to src/main/java/io/github/hapjava/server/impl/pairing/PairingUpdateController.java index 6eabd6992..3d52fe907 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/PairingUpdateController.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/PairingUpdateController.java @@ -1,10 +1,10 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; -import io.github.hapjava.HomekitAuthInfo; -import io.github.hapjava.impl.http.HttpRequest; -import io.github.hapjava.impl.http.HttpResponse; -import io.github.hapjava.impl.jmdns.JmdnsHomekitAdvertiser; -import io.github.hapjava.impl.pairing.TypeLengthValueUtils.DecodeResult; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.impl.http.HttpRequest; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.jmdns.JmdnsHomekitAdvertiser; +import io.github.hapjava.server.impl.pairing.TypeLengthValueUtils.DecodeResult; import java.io.IOException; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/io/github/hapjava/impl/pairing/ServerEvidenceRoutineImpl.java b/src/main/java/io/github/hapjava/server/impl/pairing/ServerEvidenceRoutineImpl.java similarity index 95% rename from src/main/java/io/github/hapjava/impl/pairing/ServerEvidenceRoutineImpl.java rename to src/main/java/io/github/hapjava/server/impl/pairing/ServerEvidenceRoutineImpl.java index ca61f8ed4..7cf7b3164 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/ServerEvidenceRoutineImpl.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/ServerEvidenceRoutineImpl.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; import com.nimbusds.srp6.SRP6CryptoParams; import com.nimbusds.srp6.SRP6ServerEvidenceContext; diff --git a/src/main/java/io/github/hapjava/impl/pairing/SrpHandler.java b/src/main/java/io/github/hapjava/server/impl/pairing/SrpHandler.java similarity index 89% rename from src/main/java/io/github/hapjava/impl/pairing/SrpHandler.java rename to src/main/java/io/github/hapjava/server/impl/pairing/SrpHandler.java index 0e70f6f86..2743ea4f1 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/SrpHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/SrpHandler.java @@ -1,12 +1,12 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; import com.nimbusds.srp6.*; -import io.github.hapjava.impl.http.HttpResponse; -import io.github.hapjava.impl.pairing.HomekitSRP6ServerSession.State; -import io.github.hapjava.impl.pairing.PairSetupRequest.Stage2Request; -import io.github.hapjava.impl.pairing.TypeLengthValueUtils.Encoder; -import io.github.hapjava.impl.responses.ConflictResponse; -import io.github.hapjava.impl.responses.NotFoundResponse; +import io.github.hapjava.server.impl.http.HttpResponse; +import io.github.hapjava.server.impl.pairing.HomekitSRP6ServerSession.State; +import io.github.hapjava.server.impl.pairing.PairSetupRequest.Stage2Request; +import io.github.hapjava.server.impl.pairing.TypeLengthValueUtils.Encoder; +import io.github.hapjava.server.impl.responses.ConflictResponse; +import io.github.hapjava.server.impl.responses.NotFoundResponse; import java.math.BigInteger; import java.security.MessageDigest; import java.util.Arrays; diff --git a/src/main/java/io/github/hapjava/server/impl/pairing/Stage.java b/src/main/java/io/github/hapjava/server/impl/pairing/Stage.java new file mode 100644 index 000000000..19bac9a14 --- /dev/null +++ b/src/main/java/io/github/hapjava/server/impl/pairing/Stage.java @@ -0,0 +1,7 @@ +package io.github.hapjava.server.impl.pairing; + +public enum Stage { + ONE, + TWO, + THREE +} diff --git a/src/main/java/io/github/hapjava/impl/pairing/TypeLengthValueUtils.java b/src/main/java/io/github/hapjava/server/impl/pairing/TypeLengthValueUtils.java similarity index 98% rename from src/main/java/io/github/hapjava/impl/pairing/TypeLengthValueUtils.java rename to src/main/java/io/github/hapjava/server/impl/pairing/TypeLengthValueUtils.java index 2f03d0a0b..396829d34 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/TypeLengthValueUtils.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/TypeLengthValueUtils.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/src/main/java/io/github/hapjava/impl/pairing/UpgradeResponse.java b/src/main/java/io/github/hapjava/server/impl/pairing/UpgradeResponse.java similarity index 91% rename from src/main/java/io/github/hapjava/impl/pairing/UpgradeResponse.java rename to src/main/java/io/github/hapjava/server/impl/pairing/UpgradeResponse.java index 9d4003729..87168aed1 100644 --- a/src/main/java/io/github/hapjava/impl/pairing/UpgradeResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/UpgradeResponse.java @@ -1,4 +1,4 @@ -package io.github.hapjava.impl.pairing; +package io.github.hapjava.server.impl.pairing; import java.nio.ByteBuffer; diff --git a/src/main/java/io/github/hapjava/impl/responses/ConflictResponse.java b/src/main/java/io/github/hapjava/server/impl/responses/ConflictResponse.java similarity index 54% rename from src/main/java/io/github/hapjava/impl/responses/ConflictResponse.java rename to src/main/java/io/github/hapjava/server/impl/responses/ConflictResponse.java index 203b1a676..017fee857 100644 --- a/src/main/java/io/github/hapjava/impl/responses/ConflictResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/responses/ConflictResponse.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.responses; +package io.github.hapjava.server.impl.responses; -import io.github.hapjava.impl.http.HttpResponse; +import io.github.hapjava.server.impl.http.HttpResponse; public class ConflictResponse implements HttpResponse { diff --git a/src/main/java/io/github/hapjava/impl/responses/InternalServerErrorResponse.java b/src/main/java/io/github/hapjava/server/impl/responses/InternalServerErrorResponse.java similarity index 82% rename from src/main/java/io/github/hapjava/impl/responses/InternalServerErrorResponse.java rename to src/main/java/io/github/hapjava/server/impl/responses/InternalServerErrorResponse.java index 66fe5ec14..6be78e75a 100644 --- a/src/main/java/io/github/hapjava/impl/responses/InternalServerErrorResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/responses/InternalServerErrorResponse.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.responses; +package io.github.hapjava.server.impl.responses; -import io.github.hapjava.impl.http.HttpResponse; +import io.github.hapjava.server.impl.http.HttpResponse; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/io/github/hapjava/impl/responses/NotFoundResponse.java b/src/main/java/io/github/hapjava/server/impl/responses/NotFoundResponse.java similarity index 54% rename from src/main/java/io/github/hapjava/impl/responses/NotFoundResponse.java rename to src/main/java/io/github/hapjava/server/impl/responses/NotFoundResponse.java index 18ab53d74..aca74ad9d 100644 --- a/src/main/java/io/github/hapjava/impl/responses/NotFoundResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/responses/NotFoundResponse.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.responses; +package io.github.hapjava.server.impl.responses; -import io.github.hapjava.impl.http.HttpResponse; +import io.github.hapjava.server.impl.http.HttpResponse; public class NotFoundResponse implements HttpResponse { diff --git a/src/main/java/io/github/hapjava/impl/responses/OkResponse.java b/src/main/java/io/github/hapjava/server/impl/responses/OkResponse.java similarity index 75% rename from src/main/java/io/github/hapjava/impl/responses/OkResponse.java rename to src/main/java/io/github/hapjava/server/impl/responses/OkResponse.java index a48e5cee8..b2e62fe76 100644 --- a/src/main/java/io/github/hapjava/impl/responses/OkResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/responses/OkResponse.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.responses; +package io.github.hapjava.server.impl.responses; -import io.github.hapjava.impl.http.HttpResponse; +import io.github.hapjava.server.impl.http.HttpResponse; import java.nio.ByteBuffer; public class OkResponse implements HttpResponse { diff --git a/src/main/java/io/github/hapjava/impl/responses/UnauthorizedResponse.java b/src/main/java/io/github/hapjava/server/impl/responses/UnauthorizedResponse.java similarity index 54% rename from src/main/java/io/github/hapjava/impl/responses/UnauthorizedResponse.java rename to src/main/java/io/github/hapjava/server/impl/responses/UnauthorizedResponse.java index 19656ee8d..c40a03f08 100644 --- a/src/main/java/io/github/hapjava/impl/responses/UnauthorizedResponse.java +++ b/src/main/java/io/github/hapjava/server/impl/responses/UnauthorizedResponse.java @@ -1,6 +1,6 @@ -package io.github.hapjava.impl.responses; +package io.github.hapjava.server.impl.responses; -import io.github.hapjava.impl.http.HttpResponse; +import io.github.hapjava.server.impl.http.HttpResponse; public class UnauthorizedResponse implements HttpResponse { diff --git a/src/main/java/io/github/hapjava/Service.java b/src/main/java/io/github/hapjava/services/Service.java similarity index 96% rename from src/main/java/io/github/hapjava/Service.java rename to src/main/java/io/github/hapjava/services/Service.java index 45be2a1c6..c4ab23a82 100644 --- a/src/main/java/io/github/hapjava/Service.java +++ b/src/main/java/io/github/hapjava/services/Service.java @@ -1,4 +1,4 @@ -package io.github.hapjava; +package io.github.hapjava.services; import io.github.hapjava.characteristics.Characteristic; import java.util.List; diff --git a/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java b/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java new file mode 100644 index 000000000..76a00030d --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java @@ -0,0 +1,37 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.characteristics.Characteristic; +import io.github.hapjava.services.Service; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +abstract class AbstractServiceImpl implements Service { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final String type; + private final List characteristics = new LinkedList<>(); + + /** + * @param type unique UUID of the service. This information can be obtained from HomeKit Accessory + * Simulator. + */ + public AbstractServiceImpl(String type) { + this.type = type; + } + + @Override + public List getCharacteristics() { + return Collections.unmodifiableList(characteristics); + } + + @Override + public String getType() { + return type; + } + + protected void addCharacteristic(Characteristic characteristic) { + this.characteristics.add(characteristic); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java b/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java new file mode 100644 index 000000000..d5e71cd5c --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java @@ -0,0 +1,56 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.HomekitAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHardwareRevision; +import io.github.hapjava.characteristics.impl.accessoryinformation.FirmwareRevisionCharacteristic; +import io.github.hapjava.characteristics.impl.accessoryinformation.HardwareRevisionCharacteristic; +import io.github.hapjava.characteristics.impl.accessoryinformation.IdentifyCharacteristic; +import io.github.hapjava.characteristics.impl.accessoryinformation.ManufacturerCharacteristic; +import io.github.hapjava.characteristics.impl.accessoryinformation.ModelCharacteristic; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.accessoryinformation.SerialNumberCharacteristic; + +/** Every accessory must expose a single instance of the Accessory Information service. */ +public class AccessoryInformationService extends AbstractServiceImpl { + + public AccessoryInformationService( + IdentifyCharacteristic identify, + ManufacturerCharacteristic manufacturer, + ModelCharacteristic model, + NameCharacteristic name, + SerialNumberCharacteristic serialNumber, + FirmwareRevisionCharacteristic firmwareRevision) { + super("0000003E-0000-1000-8000-0026BB765291"); + addCharacteristic(identify); + addCharacteristic(manufacturer); + addCharacteristic(model); + addCharacteristic(name); + addCharacteristic(serialNumber); + addCharacteristic(firmwareRevision); + } + + public AccessoryInformationService(HomekitAccessory accessory) { + this( + new IdentifyCharacteristic( + value -> { + if (value) { + accessory.identify(); + } + }), + new ManufacturerCharacteristic(accessory::getManufacturer), + new ModelCharacteristic(accessory::getModel), + new NameCharacteristic(accessory::getName), + new SerialNumberCharacteristic(accessory::getSerialNumber), + new FirmwareRevisionCharacteristic(accessory::getFirmwareRevision)); + + if (accessory instanceof AccessoryWithHardwareRevision) { + addOptionalCharacteristic( + new HardwareRevisionCharacteristic( + ((AccessoryWithHardwareRevision) accessory)::getHardwareRevision)); + } + } + + public void addOptionalCharacteristic(HardwareRevisionCharacteristic hardwareRevision) { + addCharacteristic(hardwareRevision); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/BatteryService.java b/src/main/java/io/github/hapjava/services/impl/BatteryService.java new file mode 100644 index 000000000..312853058 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/BatteryService.java @@ -0,0 +1,36 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.BatteryAccessory; +import io.github.hapjava.characteristics.impl.battery.BatteryLevelCharacteristic; +import io.github.hapjava.characteristics.impl.battery.ChargingStateCharacteristic; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; + +/** This service describes a battery service. */ +public class BatteryService extends AbstractServiceImpl { + + public BatteryService( + BatteryLevelCharacteristic batteryLevelCharacteristic, + ChargingStateCharacteristic chargingStateCharacteristic, + StatusLowBatteryCharacteristic statusLowBatteryCharacteristic) { + super("00000096-0000-1000-8000-0026BB765291"); + addCharacteristic(batteryLevelCharacteristic); + addCharacteristic(chargingStateCharacteristic); + addCharacteristic(statusLowBatteryCharacteristic); + } + + public BatteryService(BatteryAccessory batteryAccessory) { + this( + new BatteryLevelCharacteristic( + batteryAccessory::getBatteryLevel, + batteryAccessory::subscribeBatteryLevel, + batteryAccessory::unsubscribeBatteryLevel), + new ChargingStateCharacteristic( + batteryAccessory::getChargingState, + batteryAccessory::subscribeBatteryChargingState, + batteryAccessory::unsubscribeBatteryChargingState), + new StatusLowBatteryCharacteristic( + batteryAccessory::getLowBatteryState, + batteryAccessory::subscribeLowBatteryState, + batteryAccessory::unsubscribeLowBatteryState)); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java b/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java new file mode 100644 index 000000000..f0ef2823f --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java @@ -0,0 +1,66 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.CarbonDioxideSensorAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCarbonDioxideLevel; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.carbondioxidesensor.CarbonDioxideDetectedCharacteristic; +import io.github.hapjava.characteristics.impl.carbondioxidesensor.CarbonDioxideLevelCharacteristic; +import io.github.hapjava.characteristics.impl.carbondioxidesensor.CarbonDioxidePeakLevelCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; + +/** This service describes a carbon dioxide sensor. */ +public class CarbonDioxideSensorService extends AbstractServiceImpl { + + public CarbonDioxideSensorService(CarbonDioxideDetectedCharacteristic carbonDioxideDetected) { + super("00000097-0000-1000-8000-0026BB765291"); + addCharacteristic(carbonDioxideDetected); + } + + public CarbonDioxideSensorService(CarbonDioxideSensorAccessory accessory) { + this( + new CarbonDioxideDetectedCharacteristic( + accessory::getCarbonDioxideDetectedState, + accessory::subscribeCarbonDioxideDetectedState, + accessory::unsubscribeCarbonDioxideDetectedState)); + + if (accessory instanceof AccessoryWithCarbonDioxideLevel) { + addOptionalCharacteristic( + new CarbonDioxideLevelCharacteristic( + ((AccessoryWithCarbonDioxideLevel) accessory)::getCarbonDioxideLevel, + ((AccessoryWithCarbonDioxideLevel) accessory)::subscribeCarbonDioxideLevel, + ((AccessoryWithCarbonDioxideLevel) accessory)::unsubscribeCarbonDioxideLevel)); + addOptionalCharacteristic( + new CarbonDioxidePeakLevelCharacteristic( + ((AccessoryWithCarbonDioxideLevel) accessory)::getCarbonDioxidePeakLevel, + ((AccessoryWithCarbonDioxideLevel) accessory)::subscribeCarbonDioxidePeakLevel, + ((AccessoryWithCarbonDioxideLevel) accessory)::unsubscribeCarbonDioxidePeakLevel)); + } + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } + + public void addOptionalCharacteristic(CarbonDioxideLevelCharacteristic carbonMonoxideLevel) { + addCharacteristic(carbonMonoxideLevel); + } + + public void addOptionalCharacteristic( + CarbonDioxidePeakLevelCharacteristic carbonDioxidePeakLevel) { + addCharacteristic(carbonDioxidePeakLevel); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java b/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java new file mode 100644 index 000000000..1df903b4d --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java @@ -0,0 +1,52 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.CarbonMonoxideSensorAccessory; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.carbonmonoxidesensor.CarbonMonoxideDetectedCharacteristic; +import io.github.hapjava.characteristics.impl.carbonmonoxidesensor.CarbonMonoxideLevelCharacteristic; +import io.github.hapjava.characteristics.impl.carbonmonoxidesensor.CarbonMonoxidePeakLevelCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; + +/** This service describes a carbon monoxide sensor. */ +public class CarbonMonoxideSensorService extends AbstractServiceImpl { + + public CarbonMonoxideSensorService(CarbonMonoxideDetectedCharacteristic carbonMonoxideDetected) { + super("0000007F-0000-1000-8000-0026BB765291"); + addCharacteristic(carbonMonoxideDetected); + } + + public CarbonMonoxideSensorService(CarbonMonoxideSensorAccessory carbonMonoxideSensor) { + this( + new CarbonMonoxideDetectedCharacteristic( + carbonMonoxideSensor::getCarbonMonoxideDetectedState, + carbonMonoxideSensor::subscribeCarbonMonoxideDetectedState, + carbonMonoxideSensor::unsubscribeCarbonMonoxideDetectedState)); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } + + public void addOptionalCharacteristic(CarbonMonoxideLevelCharacteristic carbonMonoxideLevel) { + addCharacteristic(carbonMonoxideLevel); + } + + public void addOptionalCharacteristic( + CarbonMonoxidePeakLevelCharacteristic carbonMonoxidePeakLevel) { + addCharacteristic(carbonMonoxidePeakLevel); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java b/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java new file mode 100644 index 000000000..47bcbfbcf --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java @@ -0,0 +1,41 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.ContactSensorAccessory; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; +import io.github.hapjava.characteristics.impl.contactsensor.ContactSensorStateCharacteristic; + +/** This service describes a Contact Sensor. */ +public class ContactSensorService extends AbstractServiceImpl { + + public ContactSensorService(ContactSensorStateCharacteristic contactSensorState) { + super("00000080-0000-1000-8000-0026BB765291"); + addCharacteristic(contactSensorState); + } + + public ContactSensorService(ContactSensorAccessory contactSensor) { + this( + new ContactSensorStateCharacteristic( + contactSensor::getCurrentState, + contactSensor::subscribeContactState, + contactSensor::unsubscribeContactState)); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/DoorService.java b/src/main/java/io/github/hapjava/services/impl/DoorService.java new file mode 100644 index 000000000..8dcb224a6 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/DoorService.java @@ -0,0 +1,46 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.DoorAccessory; +import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.CurrentPositionCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.HoldPositionCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.PositionStateCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.TargetPositionCharacteristic; + +/** This service describes a motorized door. */ +public class DoorService extends AbstractServiceImpl { + + public DoorService( + CurrentPositionCharacteristic currentPositionCharacteristic, + TargetPositionCharacteristic targetPositionCharacteristic, + PositionStateCharacteristic positionStateCharacteristic) { + super("00000081-0000-1000-8000-0026BB765291"); + addCharacteristic(currentPositionCharacteristic); + addCharacteristic(targetPositionCharacteristic); + addCharacteristic(positionStateCharacteristic); + } + + public DoorService(DoorAccessory door) { + this( + new CurrentPositionCharacteristic( + door::getCurrentPosition, + door::subscribeCurrentPosition, + door::unsubscribeCurrentPosition), + new TargetPositionCharacteristic( + door::getTargetPosition, + door::setTargetPosition, + door::subscribeTargetPosition, + door::unsubscribeTargetPosition), + new PositionStateCharacteristic( + door::getPositionState, door::subscribePositionState, door::unsubscribePositionState)); + } + + public void addOptionalCharacteristic(HoldPositionCharacteristic holdPositionCharacteristic) { + addCharacteristic(holdPositionCharacteristic); + } + + public void addOptionalCharacteristic( + ObstructionDetectedCharacteristic obstructionDetectedCharacteristic) { + addCharacteristic(obstructionDetectedCharacteristic); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/FanService.java b/src/main/java/io/github/hapjava/services/impl/FanService.java new file mode 100644 index 000000000..4fc8d8660 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/FanService.java @@ -0,0 +1,53 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.FanAccessory; +import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.ActiveEnum; +import io.github.hapjava.characteristics.impl.fan.CurrentFanStateCharacteristic; +import io.github.hapjava.characteristics.impl.fan.LockPhysicalControlsCharacteristic; +import io.github.hapjava.characteristics.impl.fan.RotationDirectionCharacteristic; +import io.github.hapjava.characteristics.impl.fan.RotationSpeedCharacteristic; +import io.github.hapjava.characteristics.impl.fan.SwingModeCharacteristic; +import io.github.hapjava.characteristics.impl.fan.TargetFanStateCharacteristic; + +/** This service describes a fan. */ +public class FanService extends AbstractServiceImpl { + + public FanService(ActiveCharacteristic active) { + super("000000B7-0000-1000-8000-0026BB765291"); + addCharacteristic(active); + } + + public FanService(FanAccessory fan) { + this( + new ActiveCharacteristic( + () -> fan.isActive().thenApply(s -> s ? ActiveEnum.ACTIVE : ActiveEnum.INACTIVE), + (v) -> fan.setActive(v == ActiveEnum.ACTIVE), + fan::subscribeActive, + fan::unsubscribeActive)); + } + + public void addOptionalCharacteristic(CurrentFanStateCharacteristic state) { + addCharacteristic(state); + } + + public void addOptionalCharacteristic(TargetFanStateCharacteristic state) { + addCharacteristic(state); + } + + public void addOptionalCharacteristic(RotationDirectionCharacteristic direction) { + addCharacteristic(direction); + } + + public void addOptionalCharacteristic(RotationSpeedCharacteristic speed) { + addCharacteristic(speed); + } + + public void addOptionalCharacteristic(SwingModeCharacteristic mode) { + addCharacteristic(mode); + } + + public void addOptionalCharacteristic(LockPhysicalControlsCharacteristic lock) { + addCharacteristic(lock); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java b/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java new file mode 100644 index 000000000..329494a27 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java @@ -0,0 +1,50 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.GarageDoorOpenerAccessory; +import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; +import io.github.hapjava.characteristics.impl.garagedoor.CurrentDoorStateCharacteristic; +import io.github.hapjava.characteristics.impl.garagedoor.TargetDoorStateCharacteristic; +import io.github.hapjava.characteristics.impl.lock.LockCurrentStateCharacteristic; +import io.github.hapjava.characteristics.impl.lock.LockTargetStateCharacteristic; + +/** + * This service describes a garage door opener that controls a single door. If a garage has more + * than one door, then each door should have its own Garage Door Opener Service. + */ +public class GarageDoorOpenerService extends AbstractServiceImpl { + + public GarageDoorOpenerService( + CurrentDoorStateCharacteristic currentState, + TargetDoorStateCharacteristic targetState, + ObstructionDetectedCharacteristic obstruction) { + super("00000041-0000-1000-8000-0026BB765291"); + addCharacteristic(currentState); + addCharacteristic(targetState); + addCharacteristic(obstruction); + } + + public GarageDoorOpenerService(GarageDoorOpenerAccessory door) { + this( + new CurrentDoorStateCharacteristic( + door::getCurrentDoorState, + door::subscribeCurrentDoorState, + door::unsubscribeCurrentDoorState), + new TargetDoorStateCharacteristic( + door::getTargetDoorState, + door::setTargetDoorState, + door::subscribeTargetDoorState, + door::unsubscribeTargetDoorState), + new ObstructionDetectedCharacteristic( + door::getObstructionDetected, + door::subscribeObstructionDetected, + door::unsubscribeObstructionDetected)); + } + + public void addOptionalCharacteristic(LockCurrentStateCharacteristic lockState) { + addCharacteristic(lockState); + } + + public void addOptionalCharacteristic(LockTargetStateCharacteristic lockState) { + addCharacteristic(lockState); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java b/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java new file mode 100644 index 000000000..1e0de26a8 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java @@ -0,0 +1,42 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.HumiditySensorAccessory; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; +import io.github.hapjava.characteristics.impl.humiditysensor.CurrentRelativeHumidityCharacteristic; + +/** This service describes a humidity sensor. */ +public class HumiditySensorService extends AbstractServiceImpl { + + public HumiditySensorService( + CurrentRelativeHumidityCharacteristic currentRelativeHumidityCharacteristic) { + super("00000082-0000-1000-8000-0026BB765291"); + addCharacteristic(currentRelativeHumidityCharacteristic); + } + + public HumiditySensorService(HumiditySensorAccessory sensor) { + this( + new CurrentRelativeHumidityCharacteristic( + sensor::getCurrentRelativeHumidity, + sensor::subscribeCurrentRelativeHumidity, + sensor::unsubscribeCurrentRelativeHumidity)); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java b/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java new file mode 100644 index 000000000..be95d5e61 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java @@ -0,0 +1,41 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.LeakSensorAccessory; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; +import io.github.hapjava.characteristics.impl.leaksensor.LeakDetectedStateCharacteristic; + +/** This service describes a leak sensor. */ +public class LeakSensorService extends AbstractServiceImpl { + + public LeakSensorService(LeakDetectedStateCharacteristic leakDetectedState) { + super("00000083-0000-1000-8000-0026BB765291"); + addCharacteristic(leakDetectedState); + } + + public LeakSensorService(LeakSensorAccessory leakSensor) { + this( + new LeakDetectedStateCharacteristic( + leakSensor::getLeakDetected, + leakSensor::subscribeLeakDetected, + leakSensor::unsubscribeLeakDetected)); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/LightSensorService.java b/src/main/java/io/github/hapjava/services/impl/LightSensorService.java new file mode 100644 index 000000000..04e0a8e9d --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/LightSensorService.java @@ -0,0 +1,46 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.LightSensorAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; +import io.github.hapjava.characteristics.impl.lightsensor.CurrentAmbientLightLevelCharacteristic; + +/** This service describes a light sensor. */ +public class LightSensorService extends AbstractServiceImpl { + + public LightSensorService(CurrentAmbientLightLevelCharacteristic lightLevel) { + super("00000084-0000-1000-8000-0026BB765291"); + addCharacteristic(lightLevel); + } + + public LightSensorService(LightSensorAccessory lightSensor) { + this( + new CurrentAmbientLightLevelCharacteristic( + lightSensor::getCurrentAmbientLightLevel, + lightSensor::subscribeCurrentAmbientLightLevel, + lightSensor::unsubscribeCurrentAmbientLightLevel)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/LightbulbService.java b/src/main/java/io/github/hapjava/services/impl/LightbulbService.java new file mode 100644 index 000000000..d2394826a --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/LightbulbService.java @@ -0,0 +1,47 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.LightbulbAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.OnCharacteristic; +import io.github.hapjava.characteristics.impl.lightbulb.BrightnessCharacteristic; +import io.github.hapjava.characteristics.impl.lightbulb.ColorTemperatureCharacteristic; +import io.github.hapjava.characteristics.impl.lightbulb.HueCharacteristic; +import io.github.hapjava.characteristics.impl.lightbulb.SaturationCharacteristic; + +/** This service describes a light bulb. */ +public class LightbulbService extends AbstractServiceImpl { + + public LightbulbService(OnCharacteristic onState) { + super("00000043-0000-1000-8000-0026BB765291"); + addCharacteristic(onState); + } + + public LightbulbService(LightbulbAccessory lightbulb) { + this( + new OnCharacteristic( + lightbulb::getLightbulbPowerState, + lightbulb::setLightbulbPowerState, + lightbulb::subscribeLightbulbPowerState, + lightbulb::unsubscribeLightbulbPowerState)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(HueCharacteristic hue) { + addCharacteristic(hue); + } + + public void addOptionalCharacteristic(BrightnessCharacteristic brightness) { + addCharacteristic(brightness); + } + + public void addOptionalCharacteristic(SaturationCharacteristic saturation) { + addCharacteristic(saturation); + } + + public void addOptionalCharacteristic(ColorTemperatureCharacteristic color) { + addCharacteristic(color); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java b/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java new file mode 100644 index 000000000..c319b7192 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java @@ -0,0 +1,38 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.LockMechanismAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.lock.LockCurrentStateCharacteristic; +import io.github.hapjava.characteristics.impl.lock.LockTargetStateCharacteristic; + +/** + * The HomeKit Lock Mechanism Service is designed to expose and control the physical lock mechanism + * on a device. + */ +public class LockMechanismService extends AbstractServiceImpl { + + public LockMechanismService( + LockCurrentStateCharacteristic lockCurrentState, + LockTargetStateCharacteristic lockTargetState) { + super("00000045-0000-1000-8000-0026BB765291"); + addCharacteristic(lockCurrentState); + addCharacteristic(lockTargetState); + } + + public LockMechanismService(LockMechanismAccessory lockMechanism) { + this( + new LockCurrentStateCharacteristic( + lockMechanism::getLockCurrentState, + lockMechanism::subscribeLockCurrentState, + lockMechanism::unsubscribeLockCurrentState), + new LockTargetStateCharacteristic( + lockMechanism::getLockTargetState, + lockMechanism::setLockTargetState, + lockMechanism::subscribeLockTargetState, + lockMechanism::unsubscribeLockTargetState)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java b/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java new file mode 100644 index 000000000..5d5cd5460 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java @@ -0,0 +1,46 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.MotionSensorAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; +import io.github.hapjava.characteristics.impl.motionsensor.MotionDetectedCharacteristic; + +/** This service describes a motion sensor. */ +public class MotionSensorService extends AbstractServiceImpl { + + public MotionSensorService(MotionDetectedCharacteristic motionDetectedCharacteristic) { + super("00000085-0000-1000-8000-0026BB765291"); + addCharacteristic(motionDetectedCharacteristic); + } + + public MotionSensorService(MotionSensorAccessory motionSensor) { + this( + new MotionDetectedCharacteristic( + motionSensor::getMotionDetected, + motionSensor::subscribeMotionDetected, + motionSensor::unsubscribeMotionDetected)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java b/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java new file mode 100644 index 000000000..22b832edc --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java @@ -0,0 +1,46 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.OccupancySensorAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; +import io.github.hapjava.characteristics.impl.occupancysensor.OccupancyDetectedCharacteristic; + +/** This service describes an occupancy sensor. */ +public class OccupancySensorService extends AbstractServiceImpl { + + public OccupancySensorService(OccupancyDetectedCharacteristic occupancyDetectedCharacteristic) { + super("00000086-0000-1000-8000-0026BB765291"); + addCharacteristic(occupancyDetectedCharacteristic); + } + + public OccupancySensorService(OccupancySensorAccessory occupancySensor) { + this( + new OccupancyDetectedCharacteristic( + occupancySensor::getOccupancyDetected, + occupancySensor::subscribeOccupancyDetected, + occupancySensor::unsubscribeOccupancyDetected)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/OutletService.java b/src/main/java/io/github/hapjava/services/impl/OutletService.java new file mode 100644 index 000000000..9367d8c84 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/OutletService.java @@ -0,0 +1,31 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.OutletAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.OnCharacteristic; +import io.github.hapjava.characteristics.impl.outlet.OutletInUseCharacteristic; + +/** This service describes a power outlet. */ +public class OutletService extends AbstractServiceImpl { + + public OutletService(OnCharacteristic onState, OutletInUseCharacteristic outletInUse) { + super("00000047-0000-1000-8000-0026BB765291"); + addCharacteristic(onState); + addCharacteristic(outletInUse); + } + + public OutletService(OutletAccessory outlet) { + this( + new OnCharacteristic( + outlet::getPowerState, + outlet::setPowerState, + outlet::subscribePowerState, + outlet::unsubscribePowerState), + new OutletInUseCharacteristic( + outlet::getOutletInUse, outlet::subscribeOutletInUse, outlet::unsubscribeOutletInUse)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java b/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java new file mode 100644 index 000000000..ed1e1cb05 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java @@ -0,0 +1,50 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.SecuritySystemAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; +import io.github.hapjava.characteristics.impl.securitysystem.CurrentSecuritySystemStateCharacteristic; +import io.github.hapjava.characteristics.impl.securitysystem.SecuritySystemAlarmTypeCharacteristic; +import io.github.hapjava.characteristics.impl.securitysystem.TargetSecuritySystemStateCharacteristic; + +/** This service describes a security system service. */ +public class SecuritySystemService extends AbstractServiceImpl { + + public SecuritySystemService( + CurrentSecuritySystemStateCharacteristic currentState, + TargetSecuritySystemStateCharacteristic targetState) { + super("0000007E-0000-1000-8000-0026BB765291"); + addCharacteristic(currentState); + addCharacteristic(targetState); + } + + public SecuritySystemService(SecuritySystemAccessory securitySystem) { + this( + new CurrentSecuritySystemStateCharacteristic( + securitySystem::getCurrentSecuritySystemState, + securitySystem::subscribeCurrentSecuritySystemState, + securitySystem::unsubscribeCurrentSecuritySystemState), + new TargetSecuritySystemStateCharacteristic( + securitySystem::getTargetSecuritySystemState, + securitySystem::setTargetSecuritySystemState, + securitySystem::subscribeTargetSecuritySystemState, + securitySystem::unsubscribeTargetSecuritySystemState)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(SecuritySystemAlarmTypeCharacteristic alermType) { + addCharacteristic(alermType); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java b/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java new file mode 100644 index 000000000..fef1daf54 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java @@ -0,0 +1,46 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.SmokeSensorAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; +import io.github.hapjava.characteristics.impl.smokesensor.SmokeDetectedCharacteristic; + +/** This service describes a Smoke detector Sensor. */ +public class SmokeSensorService extends AbstractServiceImpl { + + public SmokeSensorService(SmokeDetectedCharacteristic smokeDetectedCharacteristic) { + super("00000087-0000-1000-8000-0026BB765291"); + addCharacteristic(smokeDetectedCharacteristic); + } + + public SmokeSensorService(SmokeSensorAccessory smokeSensor) { + this( + new SmokeDetectedCharacteristic( + smokeSensor::getSmokeDetectedState, + smokeSensor::subscribeSmokeDetectedState, + smokeSensor::unsubscribeSmokeDetectedState)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/SwitchService.java b/src/main/java/io/github/hapjava/services/impl/SwitchService.java new file mode 100644 index 000000000..a50f5d49e --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/SwitchService.java @@ -0,0 +1,27 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.SwitchAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.OnCharacteristic; + +/** This service describes a binary switch. */ +public class SwitchService extends AbstractServiceImpl { + + public SwitchService(OnCharacteristic onState) { + super("00000049-0000-1000-8000-0026BB765291"); + addCharacteristic(onState); + } + + public SwitchService(SwitchAccessory accessory) { + this( + new OnCharacteristic( + accessory::getSwitchState, + accessory::setSwitchState, + accessory::subscribeSwitchState, + accessory::unsubscribeSwitchState)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java b/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java new file mode 100644 index 000000000..6aef2e4ed --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java @@ -0,0 +1,47 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.TemperatureSensorAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.CurrentTemperatureCharacteristic; + +/** This service describes a Temperature Sensor. */ +public class TemperatureSensorService extends AbstractServiceImpl { + + public TemperatureSensorService( + CurrentTemperatureCharacteristic currentTemperatureCharacteristic) { + super("0000008A-0000-1000-8000-0026BB765291"); + addCharacteristic(currentTemperatureCharacteristic); + } + + public TemperatureSensorService(TemperatureSensorAccessory temperatureSensor) { + this( + new CurrentTemperatureCharacteristic( + temperatureSensor::getCurrentTemperature, + temperatureSensor::subscribeCurrentTemperature, + temperatureSensor::unsubscribeCurrentTemperature)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/ThermostatService.java b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java new file mode 100644 index 000000000..d82975a51 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java @@ -0,0 +1,78 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.ThermostatAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.humiditysensor.CurrentRelativeHumidityCharacteristic; +import io.github.hapjava.characteristics.impl.humiditysensor.TargetRelativeHumidityCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.CoolingThresholdTemperatureCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.CurrentHeatingCoolingStateCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.CurrentTemperatureCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.HeatingThresholdTemperatureCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.TargetHeatingCoolingStateCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.TargetTemperatureCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.TemperatureDisplayUnitCharacteristic; + +/** This service describes a thermostat. */ +public class ThermostatService extends AbstractServiceImpl { + + public ThermostatService( + CurrentHeatingCoolingStateCharacteristic currentHeatingCoolingStateCharacteristic, + TargetHeatingCoolingStateCharacteristic targetHeatingCoolingStateCharacteristic, + CurrentTemperatureCharacteristic currentTemperatureCharacteristic, + TargetTemperatureCharacteristic targetTemperatureCharacteristic, + TemperatureDisplayUnitCharacteristic temperatureUnitsCharacteristic) { + super("0000004A-0000-1000-8000-0026BB765291"); + addCharacteristic(currentHeatingCoolingStateCharacteristic); + addCharacteristic(targetHeatingCoolingStateCharacteristic); + addCharacteristic(currentTemperatureCharacteristic); + addCharacteristic(targetTemperatureCharacteristic); + addCharacteristic(temperatureUnitsCharacteristic); + } + + public ThermostatService(ThermostatAccessory thermostat) { + this( + new CurrentHeatingCoolingStateCharacteristic( + thermostat::getCurrentState, + thermostat::subscribeCurrentState, + thermostat::unsubscribeCurrentState), + new TargetHeatingCoolingStateCharacteristic( + thermostat::getTargetState, + thermostat::setTargetState, + thermostat::subscribeTargetState, + thermostat::unsubscribeTargetState), + new CurrentTemperatureCharacteristic( + thermostat::getCurrentTemperature, + thermostat::subscribeCurrentTemperature, + thermostat::unsubscribeCurrentTemperature), + new TargetTemperatureCharacteristic( + thermostat::getTargetTemperature, + thermostat::setTargetTemperature, + thermostat::subscribeTargetTemperature, + thermostat::unsubscribeTargetTemperature), + new TemperatureDisplayUnitCharacteristic( + thermostat::getTemperatureDisplayUnit, + thermostat::setTemperatureDisplayUnit, + thermostat::subscribeTemperatureDisplayUnit, + thermostat::unsubscribeTemperatureDisplayUnit)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(CoolingThresholdTemperatureCharacteristic threshold) { + addCharacteristic(threshold); + } + + public void addOptionalCharacteristic(HeatingThresholdTemperatureCharacteristic threshold) { + addCharacteristic(threshold); + } + + public void addOptionalCharacteristic(CurrentRelativeHumidityCharacteristic humidity) { + addCharacteristic(humidity); + } + + public void addOptionalCharacteristic(TargetRelativeHumidityCharacteristic humidity) { + addCharacteristic(humidity); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/ValveService.java b/src/main/java/io/github/hapjava/services/impl/ValveService.java new file mode 100644 index 000000000..3b906261b --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/ValveService.java @@ -0,0 +1,62 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.ValveAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.InUseCharacteristic; +import io.github.hapjava.characteristics.impl.common.IsConfiguredCharacteristic; +import io.github.hapjava.characteristics.impl.common.ServiceLabelIndexCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.valve.SetDurationCharacteristic; +import io.github.hapjava.characteristics.impl.valve.ValveTypeCharacteristic; + +/** + * This service describes accessories like irrigation valves or water outlets. A valve is set to In + * Use when there are fluid flowing through the valve. + */ +public class ValveService extends AbstractServiceImpl { + + public ValveService( + ActiveCharacteristic activeCharacteristic, + InUseCharacteristic inUseCharacteristic, + ValveTypeCharacteristic valveTypeCharacteristic) { + super("000000D0-0000-1000-8000-0026BB765291"); + addCharacteristic(activeCharacteristic); + addCharacteristic(inUseCharacteristic); + addCharacteristic(valveTypeCharacteristic); + } + + public ValveService(ValveAccessory valve) { + this( + new ActiveCharacteristic( + valve::getValveActive, + valve::setValveActive, + valve::subscribeValveActive, + valve::unsubscribeValveActive), + new InUseCharacteristic( + valve::getValveInUse, valve::subscribeValveInUse, valve::unsubscribeValveInUse), + new ValveTypeCharacteristic( + valve::getValveType, valve::subscribeValveType, valve::unsubscribeValveType)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(SetDurationCharacteristic setDurationCharacteristic) { + addCharacteristic(setDurationCharacteristic); + } + + public void addOptionalCharacteristic(IsConfiguredCharacteristic isConfiguredCharacteristic) { + addCharacteristic(isConfiguredCharacteristic); + } + + public void addOptionalCharacteristic( + ServiceLabelIndexCharacteristic serviceLabelIndexCharacteristic) { + addCharacteristic(serviceLabelIndexCharacteristic); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFaultCharacteristic) { + addCharacteristic(statusFaultCharacteristic); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java b/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java new file mode 100644 index 000000000..2adfd8ab6 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java @@ -0,0 +1,80 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.WindowCoveringAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.CurrentHorizontalTiltAngleCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.CurrentPositionCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.CurrentVerticalTiltAngleCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.HoldPositionCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.PositionStateCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.TargetHorizontalTiltAngleCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.TargetPositionCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.TargetVerticalTiltAngleCharacteristic; + +/** + * This service describes motorized window coverings or shades - examples include shutters, blinds, + * awnings etc. + */ +public class WindowCoveringService extends AbstractServiceImpl { + + public WindowCoveringService( + TargetPositionCharacteristic targetPositionCharacteristic, + CurrentPositionCharacteristic currentPositionCharacteristic, + PositionStateCharacteristic positionStateCharacteristic) { + super("0000008C-0000-1000-8000-0026BB765291"); + addCharacteristic(targetPositionCharacteristic); + addCharacteristic(currentPositionCharacteristic); + addCharacteristic(positionStateCharacteristic); + } + + public WindowCoveringService(WindowCoveringAccessory windowCovering) { + this( + new TargetPositionCharacteristic( + windowCovering::getTargetPosition, + windowCovering::setTargetPosition, + windowCovering::subscribeTargetPosition, + windowCovering::unsubscribeTargetPosition), + new CurrentPositionCharacteristic( + windowCovering::getCurrentPosition, + windowCovering::subscribeCurrentPosition, + windowCovering::unsubscribeCurrentPosition), + new PositionStateCharacteristic( + windowCovering::getPositionState, + windowCovering::subscribePositionState, + windowCovering::unsubscribePositionState)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(HoldPositionCharacteristic holdPositionCharacteristic) { + addCharacteristic(holdPositionCharacteristic); + } + + public void addOptionalCharacteristic( + CurrentHorizontalTiltAngleCharacteristic currentHorizontalTiltAngleCharacteristic) { + addCharacteristic(currentHorizontalTiltAngleCharacteristic); + } + + public void addOptionalCharacteristic( + TargetHorizontalTiltAngleCharacteristic targetHorizontalTiltAngleCharacteristic) { + addCharacteristic(targetHorizontalTiltAngleCharacteristic); + } + + public void addOptionalCharacteristic( + CurrentVerticalTiltAngleCharacteristic currentVerticalTiltAngleCharacteristic) { + addCharacteristic(currentVerticalTiltAngleCharacteristic); + } + + public void addOptionalCharacteristic( + TargetVerticalTiltAngleCharacteristic targetVerticalTiltAngleCharacteristic) { + addCharacteristic(targetVerticalTiltAngleCharacteristic); + } + + public void addOptionalCharacteristic( + ObstructionDetectedCharacteristic obstructionDetectedCharacteristic) { + addCharacteristic(obstructionDetectedCharacteristic); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/WindowService.java b/src/main/java/io/github/hapjava/services/impl/WindowService.java new file mode 100644 index 000000000..2255afbd5 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/WindowService.java @@ -0,0 +1,53 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.WindowAccessory; +import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.CurrentPositionCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.HoldPositionCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.PositionStateCharacteristic; +import io.github.hapjava.characteristics.impl.windowcovering.TargetPositionCharacteristic; + +/** This service describes a motorized window. */ +public class WindowService extends AbstractServiceImpl { + + public WindowService( + CurrentPositionCharacteristic currentPositionCharacteristic, + TargetPositionCharacteristic targetPositionCharacteristic, + PositionStateCharacteristic positionStateCharacteristic) { + super("0000008B-0000-1000-8000-0026BB765291"); + addCharacteristic(currentPositionCharacteristic); + addCharacteristic(targetPositionCharacteristic); + addCharacteristic(positionStateCharacteristic); + } + + public WindowService(WindowAccessory window) { + this( + new CurrentPositionCharacteristic( + window::getCurrentPosition, + window::subscribeCurrentPosition, + window::unsubscribeCurrentPosition), + new TargetPositionCharacteristic( + window::getTargetPosition, + window::setTargetPosition, + window::subscribeTargetPosition, + window::unsubscribeTargetPosition), + new PositionStateCharacteristic( + window::getPositionState, + window::subscribePositionState, + window::unsubscribePositionState)); + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(HoldPositionCharacteristic holdPositionCharacteristic) { + addCharacteristic(holdPositionCharacteristic); + } + + public void addOptionalCharacteristic( + ObstructionDetectedCharacteristic obstructionDetectedCharacteristic) { + addCharacteristic(obstructionDetectedCharacteristic); + } +} diff --git a/src/test/java/io/github/hapjava/HomekitRootTest.java b/src/test/java/io/github/hapjava/server/impl/HomekitRootTest.java similarity index 89% rename from src/test/java/io/github/hapjava/HomekitRootTest.java rename to src/test/java/io/github/hapjava/server/impl/HomekitRootTest.java index 33eb51b10..aa9969a93 100644 --- a/src/test/java/io/github/hapjava/HomekitRootTest.java +++ b/src/test/java/io/github/hapjava/server/impl/HomekitRootTest.java @@ -1,4 +1,4 @@ -package io.github.hapjava; +package io.github.hapjava.server.impl; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; @@ -7,9 +7,11 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import io.github.hapjava.impl.HomekitWebHandler; -import io.github.hapjava.impl.http.HomekitClientConnectionFactory; -import io.github.hapjava.impl.jmdns.JmdnsHomekitAdvertiser; +import io.github.hapjava.accessories.HomekitAccessory; +import io.github.hapjava.server.HomekitAuthInfo; +import io.github.hapjava.server.HomekitWebHandler; +import io.github.hapjava.server.impl.http.HomekitClientConnectionFactory; +import io.github.hapjava.server.impl.jmdns.JmdnsHomekitAdvertiser; import java.util.concurrent.CompletableFuture; import org.junit.Assert; import org.junit.Before; From 68f09a78a10273e553078fa34ce87187b6814e20 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Mon, 16 Mar 2020 00:56:37 +0100 Subject: [PATCH 02/23] add name, active and fault interfaces --- .../accessories/LockMechanismAccessory.java | 1 + .../AccessoryWithDuration.java | 14 ++---- .../AccessoryWithFanState.java | 45 +++++++++-------- .../AccessoryWithName.java | 18 +++++++ .../AccessoryWithRemainingDuration.java | 6 +-- .../AccessoryWithStatusActive.java | 30 ++++++++++++ .../AccessoryWithStatusFault.java | 34 +++++++++++++ .../IdentifyCharacteristic.java | 2 +- .../impl/base/BaseCharacteristic.java | 6 +-- .../impl/base/BooleanCharacteristic.java | 8 +++- .../impl/base/EnumCharacteristic.java | 11 +++-- .../impl/base/FloatCharacteristic.java | 8 +++- .../impl/base/IntegerCharacteristic.java | 5 +- .../impl/base/StaticStringCharacteristic.java | 6 ++- .../battery/ChargingStateCharacteristic.java | 2 +- .../StatusLowBatteryCharacteristic.java | 2 +- .../CarbonDioxideDetectedCharacteristic.java | 2 +- .../CarbonDioxideLevelCharacteristic.java | 2 +- .../CarbonDioxidePeakLevelCharacteristic.java | 2 +- .../CarbonMonoxideDetectedCharacteristic.java | 2 +- .../CarbonMonoxideLevelCharacteristic.java | 2 +- ...CarbonMonoxidePeakLevelCharacteristic.java | 2 +- .../impl/common/ActiveCharacteristic.java | 2 +- .../impl/common/InUseCharacteristic.java | 2 +- .../common/IsConfiguredCharacteristic.java | 2 +- .../NameCharacteristic.java | 2 +- .../ObstructionDetectedCharacteristic.java | 2 +- .../impl/common/OnCharacteristic.java | 2 +- .../common/StatusActiveCharacteristic.java | 2 +- .../common/StatusFaultCharacteristic.java | 2 +- .../common/StatusTamperedCharacteristic.java | 2 +- .../ContactSensorStateCharacteristic.java | 2 +- .../fan/CurrentFanStateCharacteristic.java | 2 +- .../LockPhysicalControlsCharacteristic.java | 2 +- .../fan/RotationDirectionCharacteristic.java | 2 +- .../impl/fan/SwingModeCharacteristic.java | 2 +- .../fan/TargetFanStateCharacteristic.java | 2 +- .../CurrentDoorStateCharacteristic.java | 2 +- .../TargetDoorStateCharacteristic.java | 2 +- ...CurrentRelativeHumidityCharacteristic.java | 2 +- .../TargetRelativeHumidityCharacteristic.java | 2 +- .../LeakDetectedStateCharacteristic.java | 2 +- .../impl/lightbulb/HueCharacteristic.java | 2 +- .../lightbulb/SaturationCharacteristic.java | 2 +- ...urrentAmbientLightLevelCharacteristic.java | 2 +- .../lock/LockCurrentStateCharacteristic.java | 2 +- .../lock/LockTargetStateCharacteristic.java | 2 +- .../MotionDetectedCharacteristic.java | 2 +- .../OccupancyDetectedCharacteristic.java | 2 +- .../outlet/OutletInUseCharacteristic.java | 2 +- ...rentSecuritySystemStateCharacteristic.java | 2 +- ...SecuritySystemAlarmTypeCharacteristic.java | 2 +- ...rgetSecuritySystemStateCharacteristic.java | 2 +- .../SmokeDetectedCharacteristic.java | 2 +- ...ingThresholdTemperatureCharacteristic.java | 2 +- ...rentHeatingCoolingStateCharacteristic.java | 2 +- .../CurrentTemperatureCharacteristic.java | 2 +- ...ingThresholdTemperatureCharacteristic.java | 2 +- ...rgetHeatingCoolingStateCharacteristic.java | 2 +- .../TargetTemperatureCharacteristic.java | 2 +- .../TemperatureDisplayUnitCharacteristic.java | 2 +- .../impl/valve/ValveTypeCharacteristic.java | 2 +- .../HoldPositionCharacteristic.java | 2 +- .../PositionStateCharacteristic.java | 2 +- .../services/impl/AbstractServiceImpl.java | 2 +- .../impl/AccessoryInformationService.java | 2 +- .../hapjava/services/impl/BatteryService.java | 29 +++++++---- .../impl/CarbonDioxideSensorService.java | 26 ++++++++++ .../impl/CarbonMonoxideSensorService.java | 48 +++++++++++++++++-- .../services/impl/ContactSensorService.java | 34 +++++++++++-- .../hapjava/services/impl/DoorService.java | 37 ++++++++++---- .../hapjava/services/impl/FanService.java | 19 ++++++-- .../impl/GarageDoorOpenerService.java | 31 +++++++----- .../services/impl/HumiditySensorService.java | 34 +++++++++++-- .../services/impl/LeakSensorService.java | 34 +++++++++++-- .../services/impl/LightSensorService.java | 31 ++++++++++-- .../services/impl/LightbulbService.java | 16 ++++--- .../services/impl/LockMechanismService.java | 22 +++++---- .../services/impl/MotionSensorService.java | 30 ++++++++++-- .../services/impl/OccupancySensorService.java | 30 ++++++++++-- .../hapjava/services/impl/OutletService.java | 20 +++++--- .../services/impl/SecuritySystemService.java | 30 ++++++++---- .../services/impl/SmokeSensorService.java | 30 ++++++++++-- .../hapjava/services/impl/SwitchService.java | 6 ++- .../impl/TemperatureSensorService.java | 30 ++++++++++-- .../services/impl/ThermostatService.java | 44 +++++++++-------- .../hapjava/services/impl/ValveService.java | 32 +++++++++---- .../services/impl/WindowCoveringService.java | 36 +++++++++----- .../hapjava/services/impl/WindowService.java | 36 +++++++++----- 89 files changed, 721 insertions(+), 262 deletions(-) create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithName.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusActive.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusFault.java rename src/main/java/io/github/hapjava/characteristics/impl/{accessoryinformation => common}/NameCharacteristic.java (89%) diff --git a/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java b/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java index d38838558..30d2e460f 100644 --- a/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java @@ -34,6 +34,7 @@ public interface LockMechanismAccessory extends HomekitAccessory { * set lock target state the lock trget state. * * @param state lock target state + * @return a future that completes when the change is made */ CompletableFuture setLockTargetState(LockTargetStateEnum state); diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java index bf8da5f44..7304dc3e0 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java @@ -11,28 +11,24 @@ public interface AccessoryWithDuration { /** - * Retrieves the current set duration for which the valve will be scheduled to run; this is - * usually used as the duration to use when the valve is set to active. + * Retrieves the current set duration; * * @return a future with the value */ CompletableFuture getSetDuration(); /** - * Sets the duration for which the valve will be scheduled to run; this is usually used as the - * duration to use when the valve is set to active. + * Sets the duration for which the service should run. * - *

If the valve is currently running, then Homekit assumes that changing this value affects the - * current remaining duration. - * - * @return a future with the value + * @param value duration in seconds + * @return a future that completes when the change is made */ CompletableFuture setSetDuration(int value); /** * Subscribes to changes in the set duration * - * @param callback the function when the value has changed + * @param callback the function when the duration has changed */ void subscribeSetDuration(HomekitCharacteristicChangeCallback callback); diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java index 2c0488d26..548ee34e5 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java @@ -16,37 +16,39 @@ public interface AccessoryWithFanState { /** - * OPTIONAL: Retrieves the current state of the fan (INACTIVE, IDLE, BLOWING AIR). + * Retrieves the current state of the fan (INACTIVE, IDLE, BLOWING AIR). * * @return a future that will contain the state */ CompletableFuture getCurrentFanState(); /** - * OPTIONAL: Retrieves the target state of the fan (MANUAL, AUTO). + * Retrieves the target state of the fan (MANUAL, AUTO). * * @return a future that will contain the state */ CompletableFuture getTargetFanState(); /** - * OPTIONAL: Set the target state of the fan (MANUAL, AUTO). + * Set the target state of the fan (MANUAL, AUTO). * * @param targetState target state + * @return a future that completes when the change is made */ CompletableFuture setTargetFanState(TargetFanStateEnum targetState); /** - * OPTIONAL: Retrieves the swing mode of the fan. + * Retrieves the swing mode of the fan. * * @return a future that will contain the swing mode */ CompletableFuture getSwingMode(); /** - * OPTIONAL: Set the swing mode of the fan (DISABLED, ENABLED). + * Set the swing mode of the fan (DISABLED, ENABLED). * * @param swingMode swing mode + * @return a future that completes when the change is made */ CompletableFuture setSwingMode(SwingModeEnum swingMode); @@ -58,28 +60,29 @@ public interface AccessoryWithFanState { CompletableFuture getLockControls(); /** - * OPTIONAL: Set the lock controls of the fan (DISABLED, ENABLED). + * Set the lock controls of the fan (DISABLED, ENABLED). * * @param lockControls lock controls mode + * @return a future that completes when the change is made */ CompletableFuture setLockControls(LockPhysicalControlsEnum lockControls); /** - * OPTIONAL: Retrieves the current rotation direction of the fan. + * Retrieves the current rotation direction of the fan. * * @return a future that will contain the direction */ CompletableFuture getRotationDirection(); /** - * OPTIONAL: Retrieves the current speed of the fan's rotation + * Retrieves the current speed of the fan's rotation * * @return a future that will contain the speed, expressed as an integer between 0 and 100. */ CompletableFuture getRotationSpeed(); /** - * OPTIONAL: Sets the rotation direction of the fan + * Sets the rotation direction of the fan * * @param direction the direction to set * @return a future that completes when the change is made @@ -97,62 +100,62 @@ public interface AccessoryWithFanState { CompletableFuture setRotationSpeed(Integer speed) throws Exception; /** - * OPTIONAL: Subscribes to changes in the rotation direction of the fan. + * Subscribes to changes in the rotation direction of the fan. * * @param callback the function to call when the direction changes. */ void subscribeRotationDirection(HomekitCharacteristicChangeCallback callback); /** - * OPTIONAL: Subscribes to changes in the current fan state. + * Subscribes to changes in the current fan state. * * @param callback the function to call when the direction changes. */ void subscribeCurrentFanState(HomekitCharacteristicChangeCallback callback); /** - * OPTIONAL: Subscribes to changes in the target fan state. + * Subscribes to changes in the target fan state. * * @param callback the function to call when the direction changes. */ void subscribeTargetFanState(HomekitCharacteristicChangeCallback callback); /** - * OPTIONAL: Subscribes to changes in the rotation speed of the fan. + * Subscribes to changes in the rotation speed of the fan. * * @param callback the function to call when the speed changes. */ void subscribeRotationSpeed(HomekitCharacteristicChangeCallback callback); /** - * OPTIONAL: Subscribes to changes in the swing mode of the fan. + * Subscribes to changes in the swing mode of the fan. * * @param callback the function to call when the swing mode changes. */ void subscribeSwingMode(HomekitCharacteristicChangeCallback callback); /** - * OPTIONAL: Subscribes to changes in the lock controls of the fan. + * Subscribes to changes in the lock controls of the fan. * * @param callback the function to call when the lock controls changes. */ void subscribeLockControls(HomekitCharacteristicChangeCallback callback); - /** OPTIONAL: Unsubscribes from changes in the rotation direction of the fan. */ + /** Unsubscribes from changes in the rotation direction of the fan. */ void unsubscribeRotationDirection(); - /** OPTIONAL: Unsubscribes from changes in the fan's rotation speed. */ + /** Unsubscribes from changes in the fan's rotation speed. */ void unsubscribeRotationSpeed(); - /** OPTIONAL: Unsubscribes from changes in the current state of the fan. */ + /** Unsubscribes from changes in the current state of the fan. */ void unsubscribeCurrentFanState(); - /** OPTIONAL: Unsubscribes from changes in the target state of the fan. */ + /** Unsubscribes from changes in the target state of the fan. */ void unsubscribeTargetFanState(); - /** OPTIONAL: Unsubscribes from changes in the swing mode of the fan. */ + /** Unsubscribes from changes in the swing mode of the fan. */ void unsubscribeSwingMode(); - /** OPTIONAL: Unsubscribes from changes in the lock controls of the fan. */ + /** Unsubscribes from changes in the lock controls of the fan. */ void unsubscribeLockControls(); } diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithName.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithName.java new file mode 100644 index 000000000..4d6a22cbb --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithName.java @@ -0,0 +1,18 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with name. + * + * @author Eugen Freiter + */ +public interface AccessoryWithName { + + /** + * Retrieves the name of service. + * + * @return a future with the name + */ + CompletableFuture getName(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRemainingDuration.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRemainingDuration.java index d5071bbe6..b949b413e 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRemainingDuration.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRemainingDuration.java @@ -11,15 +11,15 @@ public interface AccessoryWithRemainingDuration { /** - * Retrieves the current duration for which the valve will run + * Retrieves the remaining duration * - * @return a future with the value + * @return a future with the duration in seconds */ CompletableFuture getRemainingDuration(); /** * Subscribes to changes in the duration; note it is not necessary to emit a change every second, - * homekit infers the countdown progress clientside. + * homekit infers the countdown progress client side. * * @param callback the function when the existing duration has been replaced with a new one. */ diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusActive.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusActive.java new file mode 100644 index 000000000..7fb9aa5f3 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusActive.java @@ -0,0 +1,30 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with status active. + * + * @author Eugen Freiter + */ +public interface AccessoryWithStatusActive { + + /** + * Retrieves the status active. A value of true indicates that the accessory is active and is + * functioning without any errors. + * + * @return a future with the value + */ + CompletableFuture getStatusActive(); + + /** + * Subscribes to changes in status active. + * + * @param callback the function when the status active changes + */ + void subscribeStatusActive(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeStatusActive(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusFault.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusFault.java new file mode 100644 index 000000000..ad2351a26 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusFault.java @@ -0,0 +1,34 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.common.StatusFaultEnum; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with characteristic that describes an accessory which has a fault. A non-zero value + * indicates that the accessory has experienced a fault that may be interfering with its intended + * functionality. A value of 0 indicates that there is no fault. + * + * @author Eugen Freiter + */ +public interface AccessoryWithStatusFault { + + /** + * Retrieves the status fault. A non-zero value indicates that the accessory has experienced a + * fault that may be interfering with its intended functionality. A value of 0 indicates that + * there is no fault. + * + * @return a future with the value + */ + CompletableFuture getStatusFault(); + + /** + * Subscribes to changes in status fault. + * + * @param callback the function when the status fault changes + */ + void subscribeStatusFault(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeStatusFault(); +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java index 49e3e1fa2..cacb34b71 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.accessoryinformation; -import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import java.util.Optional; /** This characteristic enables accessory to run its identify routine. */ diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java index 5260a19a4..6a3390d46 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java @@ -1,5 +1,8 @@ package io.github.hapjava.characteristics.impl.base; +import io.github.hapjava.characteristics.Characteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Optional; @@ -13,9 +16,6 @@ import javax.json.JsonValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.github.hapjava.characteristics.Characteristic; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; /** * Base class for implementing {@link Characteristic}. diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java index 29d3b0bd9..83d7f765a 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java @@ -1,5 +1,7 @@ package io.github.hapjava.characteristics.impl.base; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -7,8 +9,6 @@ import javax.json.JsonNumber; import javax.json.JsonValue; import javax.json.JsonValue.ValueType; -import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; /** * Characteristic that exposes a Boolean value. @@ -26,6 +26,10 @@ public abstract class BooleanCharacteristic extends BaseCharacteristic * @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 getter getter to retrieve the value + * @param setter setter to set value + * @param subscriber subscriber to subscribe to changes + * @param unsubscriber unsubscriber to unsubscribe from chnages */ public BooleanCharacteristic( String type, diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java index 000d53d14..93f4770de 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java @@ -1,5 +1,8 @@ package io.github.hapjava.characteristics.impl.base; +import io.github.hapjava.characteristics.CharacteristicEnum; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -8,10 +11,6 @@ import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; -import io.github.hapjava.characteristics.CharacteristicEnum; -import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.impl.base.BaseCharacteristic; /** * Characteristic that exposes an Enum value. Enums are represented as an Integer value in the @@ -34,6 +33,10 @@ public abstract class EnumCharacteristic * 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 getter getter to retrieve the value + * @param setter setter to set value + * @param subscriber subscriber to subscribe to changes + * @param unsubscriber unsubscriber to unsubscribe from chnages */ public EnumCharacteristic( String type, diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java index c50e46ba7..e15da4fde 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java @@ -1,5 +1,7 @@ package io.github.hapjava.characteristics.impl.base; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -9,8 +11,6 @@ import javax.json.JsonValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; /** * A characteristic that provides a Float value type. @@ -38,6 +38,10 @@ public abstract class FloatCharacteristic extends BaseCharacteristic { * @param maxValue the maximum supported value * @param minStep the smallest supported step. Values will be rounded to a multiple of this. * @param unit a description of the unit this characteristic supports. + * @param getter getter to retrieve the value + * @param setter setter to set value + * @param subscriber subscriber to subscribe to changes + * @param unsubscriber unsubscriber to unsubscribe from chnages */ public FloatCharacteristic( String type, diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java index ecaa60475..e7a6d480b 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java @@ -1,5 +1,7 @@ package io.github.hapjava.characteristics.impl.base; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -7,9 +9,6 @@ import javax.json.JsonNumber; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; -import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.impl.base.BaseCharacteristic; /** * A characteristic that provides an Integer data type. diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java index fc73b6192..d5de2f9ce 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java @@ -1,5 +1,6 @@ package io.github.hapjava.characteristics.impl.base; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -7,8 +8,6 @@ import javax.json.JsonObjectBuilder; import javax.json.JsonString; import javax.json.JsonValue; -import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.impl.base.BaseCharacteristic; /** * A characteristic that provides an immutable String value. @@ -26,6 +25,9 @@ public class StaticStringCharacteristic extends BaseCharacteristic { * @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 getter getter to retrieve the value + * @param subscriber subscriber to subscribe to changes + * @param unsubscriber unsubscriber to unsubscribe from chnages */ public StaticStringCharacteristic( String type, diff --git a/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java index 1005fbcf9..c6f54e029 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.battery; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java index 24f706662..300e69dfa 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.battery; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java index 8d84898bb..27b15edd3 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.carbondioxidesensor; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideLevelCharacteristic.java index 9b3ca5447..7d1d8d440 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideLevelCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.carbondioxidesensor; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java index 5a9201fc2..da5905fb2 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.carbondioxidesensor; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java index ddca27549..09397f864 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.carbonmonoxidesensor; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java index 175cb497e..b151842c4 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.carbonmonoxidesensor; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java index 744e53858..118f2e597 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.carbonmonoxidesensor; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java index 741c6f5b1..269bd8615 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.common; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java index e8acb12c5..543c8cf7c 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.common; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java index f9a0539ee..dd192333f 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.common; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/NameCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/NameCharacteristic.java similarity index 89% rename from src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/NameCharacteristic.java rename to src/main/java/io/github/hapjava/characteristics/impl/common/NameCharacteristic.java index ddafc57ab..e565fb0c5 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/NameCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/NameCharacteristic.java @@ -1,4 +1,4 @@ -package io.github.hapjava.characteristics.impl.accessoryinformation; +package io.github.hapjava.characteristics.impl.common; import io.github.hapjava.characteristics.impl.base.StaticStringCharacteristic; import java.util.Optional; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java index 7de444190..6f152ae9c 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.common; -import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/OnCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/OnCharacteristic.java index 21f0999f9..99da018b8 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/OnCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/OnCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.common; -import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java index d46a994d0..aa3590124 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.common; -import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java index d972b76a3..51175f22e 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.common; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java index 52a1c3f99..dda3f8af7 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.common; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java index 81a2ea8f4..e3a252665 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.contactsensor; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java index bd0aa8a44..fb1eb52ef 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.fan; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java index 5d1f7a29d..7d97213ef 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java @@ -1,9 +1,9 @@ package io.github.hapjava.characteristics.impl.fan; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.EventableCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionCharacteristic.java index ce689c1dd..1a2ed8d1d 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/RotationDirectionCharacteristic.java @@ -1,9 +1,9 @@ package io.github.hapjava.characteristics.impl.fan; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.EventableCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeCharacteristic.java index c1bd55bda..821a4a487 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/SwingModeCharacteristic.java @@ -1,9 +1,9 @@ package io.github.hapjava.characteristics.impl.fan; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.EventableCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateCharacteristic.java index 057c95b7a..e91b09732 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/TargetFanStateCharacteristic.java @@ -1,9 +1,9 @@ package io.github.hapjava.characteristics.impl.fan; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.EventableCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateCharacteristic.java index 77a9e9d91..9743c0a2a 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.garagedoor; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateCharacteristic.java index c3d5735db..3e6080eae 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/TargetDoorStateCharacteristic.java @@ -1,9 +1,9 @@ package io.github.hapjava.characteristics.impl.garagedoor; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.EventableCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java index 95b56d831..e404e4152 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.humiditysensor; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java index d9c7bec52..ae7b539db 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.humiditysensor; import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java index 72237a537..f4e1287be 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.leaksensor; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/HueCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/HueCharacteristic.java index 8d8823529..7a00816bc 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/HueCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/HueCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.lightbulb; import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/SaturationCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/SaturationCharacteristic.java index 8a07caca5..90694ef98 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/SaturationCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/SaturationCharacteristic.java @@ -2,8 +2,8 @@ import io.github.hapjava.characteristics.EventableCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java index d2dd850cc..d3736db84 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.lightsensor; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateCharacteristic.java index df2f27592..ad674779b 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockCurrentStateCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.lock; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateCharacteristic.java index 4c7821dc6..f2efc26e0 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/lock/LockTargetStateCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.lock; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/motionsensor/MotionDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/motionsensor/MotionDetectedCharacteristic.java index 239e004de..4be591bec 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/motionsensor/MotionDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/motionsensor/MotionDetectedCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.motionsensor; -import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedCharacteristic.java index 995cbcf21..97c7c70f5 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/occupancysensor/OccupancyDetectedCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.occupancysensor; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java index 7158f4b96..6f5cfdfcd 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.outlet; -import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateCharacteristic.java index 0324a5554..779ab51c4 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/CurrentSecuritySystemStateCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.securitysystem; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java index 2c92b9eec..a73155d1b 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.securitysystem; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateCharacteristic.java index 849ffa80a..5284d4f6e 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/TargetSecuritySystemStateCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.securitysystem; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java index 55d415c49..5a33fea6d 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.smokesensor; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java index 93f4e17fe..2a23edc95 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.thermostat; import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java index e58f42105..bf0c56637 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.thermostat; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java index f80d760fc..96ea27735 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.thermostat; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java index 0693b737c..fb61aeeb7 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.thermostat; import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java index 93bdd4e2e..5f74c1543 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.thermostat; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java index 9e2e504dd..580e3f9f5 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.thermostat; import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.impl.base.FloatCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitCharacteristic.java index 0492ce51b..43d3d8c5d 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitCharacteristic.java @@ -1,8 +1,8 @@ package io.github.hapjava.characteristics.impl.thermostat; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeCharacteristic.java index b3a55278c..4c25ce867 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/valve/ValveTypeCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.valve; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java index 4d9892c73..e9c768867 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.windowcovering; -import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import java.util.Optional; /** diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java index 163ff8a2e..6f4427cfb 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java @@ -1,7 +1,7 @@ package io.github.hapjava.characteristics.impl.windowcovering; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; 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; diff --git a/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java b/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java index 76a00030d..e0f47b56b 100644 --- a/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java +++ b/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java @@ -31,7 +31,7 @@ public String getType() { return type; } - protected void addCharacteristic(Characteristic characteristic) { + public void addCharacteristic(Characteristic characteristic) { this.characteristics.add(characteristic); } } diff --git a/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java b/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java index d5e71cd5c..127bb0179 100644 --- a/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java +++ b/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java @@ -7,8 +7,8 @@ import io.github.hapjava.characteristics.impl.accessoryinformation.IdentifyCharacteristic; import io.github.hapjava.characteristics.impl.accessoryinformation.ManufacturerCharacteristic; import io.github.hapjava.characteristics.impl.accessoryinformation.ModelCharacteristic; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; import io.github.hapjava.characteristics.impl.accessoryinformation.SerialNumberCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; /** Every accessory must expose a single instance of the Accessory Information service. */ public class AccessoryInformationService extends AbstractServiceImpl { diff --git a/src/main/java/io/github/hapjava/services/impl/BatteryService.java b/src/main/java/io/github/hapjava/services/impl/BatteryService.java index 312853058..46259a6e8 100644 --- a/src/main/java/io/github/hapjava/services/impl/BatteryService.java +++ b/src/main/java/io/github/hapjava/services/impl/BatteryService.java @@ -1,9 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.BatteryAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.characteristics.impl.battery.BatteryLevelCharacteristic; import io.github.hapjava.characteristics.impl.battery.ChargingStateCharacteristic; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; /** This service describes a battery service. */ public class BatteryService extends AbstractServiceImpl { @@ -18,19 +20,26 @@ public BatteryService( addCharacteristic(statusLowBatteryCharacteristic); } - public BatteryService(BatteryAccessory batteryAccessory) { + public BatteryService(BatteryAccessory accessory) { this( new BatteryLevelCharacteristic( - batteryAccessory::getBatteryLevel, - batteryAccessory::subscribeBatteryLevel, - batteryAccessory::unsubscribeBatteryLevel), + accessory::getBatteryLevel, + accessory::subscribeBatteryLevel, + accessory::unsubscribeBatteryLevel), new ChargingStateCharacteristic( - batteryAccessory::getChargingState, - batteryAccessory::subscribeBatteryChargingState, - batteryAccessory::unsubscribeBatteryChargingState), + accessory::getChargingState, + accessory::subscribeBatteryChargingState, + accessory::unsubscribeBatteryChargingState), new StatusLowBatteryCharacteristic( - batteryAccessory::getLowBatteryState, - batteryAccessory::subscribeLowBatteryState, - batteryAccessory::unsubscribeLowBatteryState)); + accessory::getLowBatteryState, + accessory::subscribeLowBatteryState, + accessory::unsubscribeLowBatteryState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); } } diff --git a/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java b/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java index f0ef2823f..bcd009dfd 100644 --- a/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java @@ -2,10 +2,14 @@ import io.github.hapjava.accessories.CarbonDioxideSensorAccessory; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCarbonDioxideLevel; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.carbondioxidesensor.CarbonDioxideDetectedCharacteristic; import io.github.hapjava.characteristics.impl.carbondioxidesensor.CarbonDioxideLevelCharacteristic; import io.github.hapjava.characteristics.impl.carbondioxidesensor.CarbonDioxidePeakLevelCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -37,6 +41,28 @@ public CarbonDioxideSensorService(CarbonDioxideSensorAccessory accessory) { ((AccessoryWithCarbonDioxideLevel) accessory)::subscribeCarbonDioxidePeakLevel, ((AccessoryWithCarbonDioxideLevel) accessory)::unsubscribeCarbonDioxidePeakLevel)); } + + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); } public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { diff --git a/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java b/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java index 1df903b4d..86c6d7b7d 100644 --- a/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java @@ -1,10 +1,15 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.CarbonMonoxideSensorAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCarbonMonoxideLevel; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.carbonmonoxidesensor.CarbonMonoxideDetectedCharacteristic; import io.github.hapjava.characteristics.impl.carbonmonoxidesensor.CarbonMonoxideLevelCharacteristic; import io.github.hapjava.characteristics.impl.carbonmonoxidesensor.CarbonMonoxidePeakLevelCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -17,12 +22,47 @@ public CarbonMonoxideSensorService(CarbonMonoxideDetectedCharacteristic carbonMo addCharacteristic(carbonMonoxideDetected); } - public CarbonMonoxideSensorService(CarbonMonoxideSensorAccessory carbonMonoxideSensor) { + public CarbonMonoxideSensorService(CarbonMonoxideSensorAccessory accessory) { this( new CarbonMonoxideDetectedCharacteristic( - carbonMonoxideSensor::getCarbonMonoxideDetectedState, - carbonMonoxideSensor::subscribeCarbonMonoxideDetectedState, - carbonMonoxideSensor::unsubscribeCarbonMonoxideDetectedState)); + accessory::getCarbonMonoxideDetectedState, + accessory::subscribeCarbonMonoxideDetectedState, + accessory::unsubscribeCarbonMonoxideDetectedState)); + + if (accessory instanceof AccessoryWithCarbonMonoxideLevel) { + addOptionalCharacteristic( + new CarbonMonoxideLevelCharacteristic( + ((AccessoryWithCarbonMonoxideLevel) accessory)::getCarbonMonoxideLevel, + ((AccessoryWithCarbonMonoxideLevel) accessory)::subscribeCarbonMonoxideLevel, + ((AccessoryWithCarbonMonoxideLevel) accessory)::unsubscribeCarbonMonoxideLevel)); + addOptionalCharacteristic( + new CarbonMonoxidePeakLevelCharacteristic( + ((AccessoryWithCarbonMonoxideLevel) accessory)::getCarbonMonoxidePeakLevel, + ((AccessoryWithCarbonMonoxideLevel) accessory)::subscribeCarbonMonoxidePeakLevel, + ((AccessoryWithCarbonMonoxideLevel) accessory)::unsubscribeCarbonMonoxidePeakLevel)); + } + + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); } public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { diff --git a/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java b/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java index 47bcbfbcf..aa300955f 100644 --- a/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java @@ -1,7 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.ContactSensorAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -15,12 +19,34 @@ public ContactSensorService(ContactSensorStateCharacteristic contactSensorState) addCharacteristic(contactSensorState); } - public ContactSensorService(ContactSensorAccessory contactSensor) { + public ContactSensorService(ContactSensorAccessory accessory) { this( new ContactSensorStateCharacteristic( - contactSensor::getCurrentState, - contactSensor::subscribeContactState, - contactSensor::unsubscribeContactState)); + accessory::getCurrentState, + accessory::subscribeContactState, + accessory::unsubscribeContactState)); + + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); } public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { diff --git a/src/main/java/io/github/hapjava/services/impl/DoorService.java b/src/main/java/io/github/hapjava/services/impl/DoorService.java index 8dcb224a6..62a191c8c 100644 --- a/src/main/java/io/github/hapjava/services/impl/DoorService.java +++ b/src/main/java/io/github/hapjava/services/impl/DoorService.java @@ -1,6 +1,9 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.DoorAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithObstructionDetection; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; import io.github.hapjava.characteristics.impl.windowcovering.CurrentPositionCharacteristic; import io.github.hapjava.characteristics.impl.windowcovering.HoldPositionCharacteristic; @@ -20,19 +23,35 @@ public DoorService( addCharacteristic(positionStateCharacteristic); } - public DoorService(DoorAccessory door) { + public DoorService(DoorAccessory accessory) { this( new CurrentPositionCharacteristic( - door::getCurrentPosition, - door::subscribeCurrentPosition, - door::unsubscribeCurrentPosition), + accessory::getCurrentPosition, + accessory::subscribeCurrentPosition, + accessory::unsubscribeCurrentPosition), new TargetPositionCharacteristic( - door::getTargetPosition, - door::setTargetPosition, - door::subscribeTargetPosition, - door::unsubscribeTargetPosition), + accessory::getTargetPosition, + accessory::setTargetPosition, + accessory::subscribeTargetPosition, + accessory::unsubscribeTargetPosition), new PositionStateCharacteristic( - door::getPositionState, door::subscribePositionState, door::unsubscribePositionState)); + accessory::getPositionState, + accessory::subscribePositionState, + accessory::unsubscribePositionState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithObstructionDetection) { + addOptionalCharacteristic( + new ObstructionDetectedCharacteristic( + ((AccessoryWithObstructionDetection) accessory)::getObstructionDetected, + ((AccessoryWithObstructionDetection) accessory)::subscribeObstructionDetected, + ((AccessoryWithObstructionDetection) accessory)::unsubscribeObstructionDetected)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); } public void addOptionalCharacteristic(HoldPositionCharacteristic holdPositionCharacteristic) { diff --git a/src/main/java/io/github/hapjava/services/impl/FanService.java b/src/main/java/io/github/hapjava/services/impl/FanService.java index 4fc8d8660..a09c5b61f 100644 --- a/src/main/java/io/github/hapjava/services/impl/FanService.java +++ b/src/main/java/io/github/hapjava/services/impl/FanService.java @@ -1,8 +1,10 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.FanAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.ActiveEnum; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.fan.CurrentFanStateCharacteristic; import io.github.hapjava.characteristics.impl.fan.LockPhysicalControlsCharacteristic; import io.github.hapjava.characteristics.impl.fan.RotationDirectionCharacteristic; @@ -18,13 +20,20 @@ public FanService(ActiveCharacteristic active) { addCharacteristic(active); } - public FanService(FanAccessory fan) { + public FanService(FanAccessory accessory) { this( new ActiveCharacteristic( - () -> fan.isActive().thenApply(s -> s ? ActiveEnum.ACTIVE : ActiveEnum.INACTIVE), - (v) -> fan.setActive(v == ActiveEnum.ACTIVE), - fan::subscribeActive, - fan::unsubscribeActive)); + () -> accessory.isActive().thenApply(s -> s ? ActiveEnum.ACTIVE : ActiveEnum.INACTIVE), + (v) -> accessory.setActive(v == ActiveEnum.ACTIVE), + accessory::subscribeActive, + accessory::unsubscribeActive)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); } public void addOptionalCharacteristic(CurrentFanStateCharacteristic state) { diff --git a/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java b/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java index 329494a27..c1c7346f5 100644 --- a/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java +++ b/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java @@ -1,6 +1,8 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.GarageDoorOpenerAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; import io.github.hapjava.characteristics.impl.garagedoor.CurrentDoorStateCharacteristic; import io.github.hapjava.characteristics.impl.garagedoor.TargetDoorStateCharacteristic; @@ -23,21 +25,28 @@ public GarageDoorOpenerService( addCharacteristic(obstruction); } - public GarageDoorOpenerService(GarageDoorOpenerAccessory door) { + public GarageDoorOpenerService(GarageDoorOpenerAccessory accessory) { this( new CurrentDoorStateCharacteristic( - door::getCurrentDoorState, - door::subscribeCurrentDoorState, - door::unsubscribeCurrentDoorState), + accessory::getCurrentDoorState, + accessory::subscribeCurrentDoorState, + accessory::unsubscribeCurrentDoorState), new TargetDoorStateCharacteristic( - door::getTargetDoorState, - door::setTargetDoorState, - door::subscribeTargetDoorState, - door::unsubscribeTargetDoorState), + accessory::getTargetDoorState, + accessory::setTargetDoorState, + accessory::subscribeTargetDoorState, + accessory::unsubscribeTargetDoorState), new ObstructionDetectedCharacteristic( - door::getObstructionDetected, - door::subscribeObstructionDetected, - door::unsubscribeObstructionDetected)); + accessory::getObstructionDetected, + accessory::subscribeObstructionDetected, + accessory::unsubscribeObstructionDetected)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); } public void addOptionalCharacteristic(LockCurrentStateCharacteristic lockState) { diff --git a/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java b/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java index 1e0de26a8..b5a21a76e 100644 --- a/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java @@ -1,7 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.HumiditySensorAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -16,12 +20,34 @@ public HumiditySensorService( addCharacteristic(currentRelativeHumidityCharacteristic); } - public HumiditySensorService(HumiditySensorAccessory sensor) { + public HumiditySensorService(HumiditySensorAccessory accessory) { this( new CurrentRelativeHumidityCharacteristic( - sensor::getCurrentRelativeHumidity, - sensor::subscribeCurrentRelativeHumidity, - sensor::unsubscribeCurrentRelativeHumidity)); + accessory::getCurrentRelativeHumidity, + accessory::subscribeCurrentRelativeHumidity, + accessory::unsubscribeCurrentRelativeHumidity)); + + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); } public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { diff --git a/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java b/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java index be95d5e61..e0a493ed0 100644 --- a/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java @@ -1,7 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.LeakSensorAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -15,12 +19,34 @@ public LeakSensorService(LeakDetectedStateCharacteristic leakDetectedState) { addCharacteristic(leakDetectedState); } - public LeakSensorService(LeakSensorAccessory leakSensor) { + public LeakSensorService(LeakSensorAccessory accessory) { this( new LeakDetectedStateCharacteristic( - leakSensor::getLeakDetected, - leakSensor::subscribeLeakDetected, - leakSensor::unsubscribeLeakDetected)); + accessory::getLeakDetected, + accessory::subscribeLeakDetected, + accessory::unsubscribeLeakDetected)); + + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); } public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { diff --git a/src/main/java/io/github/hapjava/services/impl/LightSensorService.java b/src/main/java/io/github/hapjava/services/impl/LightSensorService.java index 04e0a8e9d..07a15a0fc 100644 --- a/src/main/java/io/github/hapjava/services/impl/LightSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/LightSensorService.java @@ -1,8 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.LightSensorAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -16,12 +19,30 @@ public LightSensorService(CurrentAmbientLightLevelCharacteristic lightLevel) { addCharacteristic(lightLevel); } - public LightSensorService(LightSensorAccessory lightSensor) { + public LightSensorService(LightSensorAccessory accessory) { this( new CurrentAmbientLightLevelCharacteristic( - lightSensor::getCurrentAmbientLightLevel, - lightSensor::subscribeCurrentAmbientLightLevel, - lightSensor::unsubscribeCurrentAmbientLightLevel)); + accessory::getCurrentAmbientLightLevel, + accessory::subscribeCurrentAmbientLightLevel, + accessory::unsubscribeCurrentAmbientLightLevel)); + + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/LightbulbService.java b/src/main/java/io/github/hapjava/services/impl/LightbulbService.java index d2394826a..eff2c2b47 100644 --- a/src/main/java/io/github/hapjava/services/impl/LightbulbService.java +++ b/src/main/java/io/github/hapjava/services/impl/LightbulbService.java @@ -1,7 +1,8 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.LightbulbAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.OnCharacteristic; import io.github.hapjava.characteristics.impl.lightbulb.BrightnessCharacteristic; import io.github.hapjava.characteristics.impl.lightbulb.ColorTemperatureCharacteristic; @@ -16,13 +17,16 @@ public LightbulbService(OnCharacteristic onState) { addCharacteristic(onState); } - public LightbulbService(LightbulbAccessory lightbulb) { + public LightbulbService(LightbulbAccessory accessory) { this( new OnCharacteristic( - lightbulb::getLightbulbPowerState, - lightbulb::setLightbulbPowerState, - lightbulb::subscribeLightbulbPowerState, - lightbulb::unsubscribeLightbulbPowerState)); + accessory::getLightbulbPowerState, + accessory::setLightbulbPowerState, + accessory::subscribeLightbulbPowerState, + accessory::unsubscribeLightbulbPowerState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java b/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java index c319b7192..c82f107c8 100644 --- a/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java +++ b/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java @@ -1,7 +1,8 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.LockMechanismAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.lock.LockCurrentStateCharacteristic; import io.github.hapjava.characteristics.impl.lock.LockTargetStateCharacteristic; @@ -19,17 +20,20 @@ public LockMechanismService( addCharacteristic(lockTargetState); } - public LockMechanismService(LockMechanismAccessory lockMechanism) { + public LockMechanismService(LockMechanismAccessory accessory) { this( new LockCurrentStateCharacteristic( - lockMechanism::getLockCurrentState, - lockMechanism::subscribeLockCurrentState, - lockMechanism::unsubscribeLockCurrentState), + accessory::getLockCurrentState, + accessory::subscribeLockCurrentState, + accessory::unsubscribeLockCurrentState), new LockTargetStateCharacteristic( - lockMechanism::getLockTargetState, - lockMechanism::setLockTargetState, - lockMechanism::subscribeLockTargetState, - lockMechanism::unsubscribeLockTargetState)); + accessory::getLockTargetState, + accessory::setLockTargetState, + accessory::subscribeLockTargetState, + accessory::unsubscribeLockTargetState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java b/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java index 5d5cd5460..7b4216f32 100644 --- a/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java @@ -1,8 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.MotionSensorAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -16,12 +19,29 @@ public MotionSensorService(MotionDetectedCharacteristic motionDetectedCharacteri addCharacteristic(motionDetectedCharacteristic); } - public MotionSensorService(MotionSensorAccessory motionSensor) { + public MotionSensorService(MotionSensorAccessory accessory) { this( new MotionDetectedCharacteristic( - motionSensor::getMotionDetected, - motionSensor::subscribeMotionDetected, - motionSensor::unsubscribeMotionDetected)); + accessory::getMotionDetected, + accessory::subscribeMotionDetected, + accessory::unsubscribeMotionDetected)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java b/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java index 22b832edc..7a6ff235a 100644 --- a/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java @@ -1,8 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.OccupancySensorAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -16,12 +19,29 @@ public OccupancySensorService(OccupancyDetectedCharacteristic occupancyDetectedC addCharacteristic(occupancyDetectedCharacteristic); } - public OccupancySensorService(OccupancySensorAccessory occupancySensor) { + public OccupancySensorService(OccupancySensorAccessory accessory) { this( new OccupancyDetectedCharacteristic( - occupancySensor::getOccupancyDetected, - occupancySensor::subscribeOccupancyDetected, - occupancySensor::unsubscribeOccupancyDetected)); + accessory::getOccupancyDetected, + accessory::subscribeOccupancyDetected, + accessory::unsubscribeOccupancyDetected)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/OutletService.java b/src/main/java/io/github/hapjava/services/impl/OutletService.java index 9367d8c84..780024f1f 100644 --- a/src/main/java/io/github/hapjava/services/impl/OutletService.java +++ b/src/main/java/io/github/hapjava/services/impl/OutletService.java @@ -1,7 +1,8 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.OutletAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.OnCharacteristic; import io.github.hapjava.characteristics.impl.outlet.OutletInUseCharacteristic; @@ -14,15 +15,20 @@ public OutletService(OnCharacteristic onState, OutletInUseCharacteristic outletI addCharacteristic(outletInUse); } - public OutletService(OutletAccessory outlet) { + public OutletService(OutletAccessory accessory) { this( new OnCharacteristic( - outlet::getPowerState, - outlet::setPowerState, - outlet::subscribePowerState, - outlet::unsubscribePowerState), + accessory::getPowerState, + accessory::setPowerState, + accessory::subscribePowerState, + accessory::unsubscribePowerState), new OutletInUseCharacteristic( - outlet::getOutletInUse, outlet::subscribeOutletInUse, outlet::unsubscribeOutletInUse)); + accessory::getOutletInUse, + accessory::subscribeOutletInUse, + accessory::unsubscribeOutletInUse)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java b/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java index ed1e1cb05..a4f1de059 100644 --- a/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java +++ b/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java @@ -1,7 +1,9 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.SecuritySystemAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; import io.github.hapjava.characteristics.impl.securitysystem.CurrentSecuritySystemStateCharacteristic; @@ -19,17 +21,27 @@ public SecuritySystemService( addCharacteristic(targetState); } - public SecuritySystemService(SecuritySystemAccessory securitySystem) { + public SecuritySystemService(SecuritySystemAccessory accessory) { this( new CurrentSecuritySystemStateCharacteristic( - securitySystem::getCurrentSecuritySystemState, - securitySystem::subscribeCurrentSecuritySystemState, - securitySystem::unsubscribeCurrentSecuritySystemState), + accessory::getCurrentSecuritySystemState, + accessory::subscribeCurrentSecuritySystemState, + accessory::unsubscribeCurrentSecuritySystemState), new TargetSecuritySystemStateCharacteristic( - securitySystem::getTargetSecuritySystemState, - securitySystem::setTargetSecuritySystemState, - securitySystem::subscribeTargetSecuritySystemState, - securitySystem::unsubscribeTargetSecuritySystemState)); + accessory::getTargetSecuritySystemState, + accessory::setTargetSecuritySystemState, + accessory::subscribeTargetSecuritySystemState, + accessory::unsubscribeTargetSecuritySystemState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java b/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java index fef1daf54..df361f9cd 100644 --- a/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java @@ -1,8 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.SmokeSensorAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -16,12 +19,29 @@ public SmokeSensorService(SmokeDetectedCharacteristic smokeDetectedCharacteristi addCharacteristic(smokeDetectedCharacteristic); } - public SmokeSensorService(SmokeSensorAccessory smokeSensor) { + public SmokeSensorService(SmokeSensorAccessory accessory) { this( new SmokeDetectedCharacteristic( - smokeSensor::getSmokeDetectedState, - smokeSensor::subscribeSmokeDetectedState, - smokeSensor::unsubscribeSmokeDetectedState)); + accessory::getSmokeDetectedState, + accessory::subscribeSmokeDetectedState, + accessory::unsubscribeSmokeDetectedState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/SwitchService.java b/src/main/java/io/github/hapjava/services/impl/SwitchService.java index a50f5d49e..65a8f2124 100644 --- a/src/main/java/io/github/hapjava/services/impl/SwitchService.java +++ b/src/main/java/io/github/hapjava/services/impl/SwitchService.java @@ -1,7 +1,8 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.SwitchAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.OnCharacteristic; /** This service describes a binary switch. */ @@ -19,6 +20,9 @@ public SwitchService(SwitchAccessory accessory) { accessory::setSwitchState, accessory::subscribeSwitchState, accessory::unsubscribeSwitchState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java b/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java index 6aef2e4ed..d1c6f2e62 100644 --- a/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java @@ -1,8 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.TemperatureSensorAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -17,12 +20,29 @@ public TemperatureSensorService( addCharacteristic(currentTemperatureCharacteristic); } - public TemperatureSensorService(TemperatureSensorAccessory temperatureSensor) { + public TemperatureSensorService(TemperatureSensorAccessory accessory) { this( new CurrentTemperatureCharacteristic( - temperatureSensor::getCurrentTemperature, - temperatureSensor::subscribeCurrentTemperature, - temperatureSensor::unsubscribeCurrentTemperature)); + accessory::getCurrentTemperature, + accessory::subscribeCurrentTemperature, + accessory::unsubscribeCurrentTemperature)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/ThermostatService.java b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java index d82975a51..75b01e3a2 100644 --- a/src/main/java/io/github/hapjava/services/impl/ThermostatService.java +++ b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java @@ -1,7 +1,8 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.ThermostatAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.humiditysensor.CurrentRelativeHumidityCharacteristic; import io.github.hapjava.characteristics.impl.humiditysensor.TargetRelativeHumidityCharacteristic; import io.github.hapjava.characteristics.impl.thermostat.CoolingThresholdTemperatureCharacteristic; @@ -29,31 +30,34 @@ public ThermostatService( addCharacteristic(temperatureUnitsCharacteristic); } - public ThermostatService(ThermostatAccessory thermostat) { + public ThermostatService(ThermostatAccessory accessory) { this( new CurrentHeatingCoolingStateCharacteristic( - thermostat::getCurrentState, - thermostat::subscribeCurrentState, - thermostat::unsubscribeCurrentState), + accessory::getCurrentState, + accessory::subscribeCurrentState, + accessory::unsubscribeCurrentState), new TargetHeatingCoolingStateCharacteristic( - thermostat::getTargetState, - thermostat::setTargetState, - thermostat::subscribeTargetState, - thermostat::unsubscribeTargetState), + accessory::getTargetState, + accessory::setTargetState, + accessory::subscribeTargetState, + accessory::unsubscribeTargetState), new CurrentTemperatureCharacteristic( - thermostat::getCurrentTemperature, - thermostat::subscribeCurrentTemperature, - thermostat::unsubscribeCurrentTemperature), + accessory::getCurrentTemperature, + accessory::subscribeCurrentTemperature, + accessory::unsubscribeCurrentTemperature), new TargetTemperatureCharacteristic( - thermostat::getTargetTemperature, - thermostat::setTargetTemperature, - thermostat::subscribeTargetTemperature, - thermostat::unsubscribeTargetTemperature), + accessory::getTargetTemperature, + accessory::setTargetTemperature, + accessory::subscribeTargetTemperature, + accessory::unsubscribeTargetTemperature), new TemperatureDisplayUnitCharacteristic( - thermostat::getTemperatureDisplayUnit, - thermostat::setTemperatureDisplayUnit, - thermostat::subscribeTemperatureDisplayUnit, - thermostat::unsubscribeTemperatureDisplayUnit)); + accessory::getTemperatureDisplayUnit, + accessory::setTemperatureDisplayUnit, + accessory::subscribeTemperatureDisplayUnit, + accessory::unsubscribeTemperatureDisplayUnit)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/ValveService.java b/src/main/java/io/github/hapjava/services/impl/ValveService.java index 3b906261b..88270fc13 100644 --- a/src/main/java/io/github/hapjava/services/impl/ValveService.java +++ b/src/main/java/io/github/hapjava/services/impl/ValveService.java @@ -1,10 +1,12 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.ValveAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.InUseCharacteristic; import io.github.hapjava.characteristics.impl.common.IsConfiguredCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.ServiceLabelIndexCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.valve.SetDurationCharacteristic; @@ -26,17 +28,31 @@ public ValveService( addCharacteristic(valveTypeCharacteristic); } - public ValveService(ValveAccessory valve) { + public ValveService(ValveAccessory accessory) { this( new ActiveCharacteristic( - valve::getValveActive, - valve::setValveActive, - valve::subscribeValveActive, - valve::unsubscribeValveActive), + accessory::getValveActive, + accessory::setValveActive, + accessory::subscribeValveActive, + accessory::unsubscribeValveActive), new InUseCharacteristic( - valve::getValveInUse, valve::subscribeValveInUse, valve::unsubscribeValveInUse), + accessory::getValveInUse, + accessory::subscribeValveInUse, + accessory::unsubscribeValveInUse), new ValveTypeCharacteristic( - valve::getValveType, valve::subscribeValveType, valve::unsubscribeValveType)); + accessory::getValveType, + accessory::subscribeValveType, + accessory::unsubscribeValveType)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java b/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java index 2adfd8ab6..bffaa3b53 100644 --- a/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java +++ b/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java @@ -1,7 +1,9 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.WindowCoveringAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithObstructionDetection; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; import io.github.hapjava.characteristics.impl.windowcovering.CurrentHorizontalTiltAngleCharacteristic; import io.github.hapjava.characteristics.impl.windowcovering.CurrentPositionCharacteristic; @@ -28,21 +30,31 @@ public WindowCoveringService( addCharacteristic(positionStateCharacteristic); } - public WindowCoveringService(WindowCoveringAccessory windowCovering) { + public WindowCoveringService(WindowCoveringAccessory accessory) { this( new TargetPositionCharacteristic( - windowCovering::getTargetPosition, - windowCovering::setTargetPosition, - windowCovering::subscribeTargetPosition, - windowCovering::unsubscribeTargetPosition), + accessory::getTargetPosition, + accessory::setTargetPosition, + accessory::subscribeTargetPosition, + accessory::unsubscribeTargetPosition), new CurrentPositionCharacteristic( - windowCovering::getCurrentPosition, - windowCovering::subscribeCurrentPosition, - windowCovering::unsubscribeCurrentPosition), + accessory::getCurrentPosition, + accessory::subscribeCurrentPosition, + accessory::unsubscribeCurrentPosition), new PositionStateCharacteristic( - windowCovering::getPositionState, - windowCovering::subscribePositionState, - windowCovering::unsubscribePositionState)); + accessory::getPositionState, + accessory::subscribePositionState, + accessory::unsubscribePositionState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithObstructionDetection) { + addOptionalCharacteristic( + new ObstructionDetectedCharacteristic( + ((AccessoryWithObstructionDetection) accessory)::getObstructionDetected, + ((AccessoryWithObstructionDetection) accessory)::subscribeObstructionDetected, + ((AccessoryWithObstructionDetection) accessory)::unsubscribeObstructionDetected)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/WindowService.java b/src/main/java/io/github/hapjava/services/impl/WindowService.java index 2255afbd5..b984f536c 100644 --- a/src/main/java/io/github/hapjava/services/impl/WindowService.java +++ b/src/main/java/io/github/hapjava/services/impl/WindowService.java @@ -1,7 +1,9 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.WindowAccessory; -import io.github.hapjava.characteristics.impl.accessoryinformation.NameCharacteristic; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithObstructionDetection; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; import io.github.hapjava.characteristics.impl.windowcovering.CurrentPositionCharacteristic; import io.github.hapjava.characteristics.impl.windowcovering.HoldPositionCharacteristic; @@ -21,21 +23,31 @@ public WindowService( addCharacteristic(positionStateCharacteristic); } - public WindowService(WindowAccessory window) { + public WindowService(WindowAccessory accessory) { this( new CurrentPositionCharacteristic( - window::getCurrentPosition, - window::subscribeCurrentPosition, - window::unsubscribeCurrentPosition), + accessory::getCurrentPosition, + accessory::subscribeCurrentPosition, + accessory::unsubscribeCurrentPosition), new TargetPositionCharacteristic( - window::getTargetPosition, - window::setTargetPosition, - window::subscribeTargetPosition, - window::unsubscribeTargetPosition), + accessory::getTargetPosition, + accessory::setTargetPosition, + accessory::subscribeTargetPosition, + accessory::unsubscribeTargetPosition), new PositionStateCharacteristic( - window::getPositionState, - window::subscribePositionState, - window::unsubscribePositionState)); + accessory::getPositionState, + accessory::subscribePositionState, + accessory::unsubscribePositionState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithObstructionDetection) { + addOptionalCharacteristic( + new ObstructionDetectedCharacteristic( + ((AccessoryWithObstructionDetection) accessory)::getObstructionDetected, + ((AccessoryWithObstructionDetection) accessory)::subscribeObstructionDetected, + ((AccessoryWithObstructionDetection) accessory)::unsubscribeObstructionDetected)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { From fc078d1c86a930eb8cd99947bf5e62e01328c7e4 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Mon, 16 Mar 2020 13:55:46 +0100 Subject: [PATCH 03/23] make service characteristics complete --- .../AccessoryWithAccessoryFlags.java | 30 +++++ .../AccessoryWithColorTemperature.java | 38 +++++++ ...ssoryWithCoolingThresholdTemperature.java} | 7 +- ...AccessoryWithCurrentHorizontalTilting.java | 29 +++++ .../AccessoryWithCurrentRelativeHumidity.java | 25 +++++ .../AccessoryWithCurrentVerticalTilting.java | 24 ++++ .../AccessoryWithFanState.java | 105 ------------------ ...essoryWithHeatingThresholdTemprature.java} | 2 +- .../AccessoryWithIsConfigured.java | 40 +++++++ .../AccessoryWithLockCurrentState.java | 30 +++++ .../AccessoryWithLockTargetState.java | 39 +++++++ .../AccessoryWithPhysicalControlsLock.java | 38 +++++++ .../AccessoryWithRotationDirection.java | 39 +++++++ .../AccessoryWithRotationSpeed.java | 38 +++++++ .../AccessoryWithSecurityAlarmType.java | 32 ++++++ .../AccessoryWithServiceLabelIndex.java | 19 ++++ .../AccessoryWithStatusLowBattery.java | 33 ++++++ .../AccessoryWithStatusTampered.java | 33 ++++++ .../AccessoryWithSwingMode.java | 38 +++++++ ...AccessoryWithTargetHorizontalTilting.java} | 21 +--- .../AccessoryWithTargetRelativeHumidity.java | 33 ++++++ .../AccessoryWithTargetVerticalTilting.java | 34 ++++++ .../AccessoryFlagsCharacteristic.java | 26 +++++ .../AccessoryFlagsEnum.java | 35 ++++++ ...SecuritySystemAlarmTypeCharacteristic.java | 4 +- .../impl/AccessoryInformationService.java | 13 +++ .../impl/CarbonDioxideSensorService.java | 16 +++ .../impl/CarbonMonoxideSensorService.java | 16 +++ .../services/impl/ContactSensorService.java | 16 +++ .../hapjava/services/impl/DoorService.java | 5 + .../hapjava/services/impl/FanService.java | 51 +++++++++ .../impl/GarageDoorOpenerService.java | 17 +++ .../services/impl/HumiditySensorService.java | 16 +++ .../services/impl/LeakSensorService.java | 16 +++ .../services/impl/LightSensorService.java | 22 +++- .../services/impl/LightbulbService.java | 33 ++++++ .../services/impl/MotionSensorService.java | 16 +++ .../services/impl/OccupancySensorService.java | 16 +++ .../services/impl/SecuritySystemService.java | 20 +++- .../services/impl/SmokeSensorService.java | 16 +++ .../impl/TemperatureSensorService.java | 16 +++ .../services/impl/ThermostatService.java | 35 ++++++ .../hapjava/services/impl/ValveService.java | 46 +++++++- .../services/impl/WindowCoveringService.java | 56 +++++++++- .../hapjava/services/impl/WindowService.java | 6 + 45 files changed, 1098 insertions(+), 142 deletions(-) create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithAccessoryFlags.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColorTemperature.java rename src/main/java/io/github/hapjava/accessories/optionalcharacteristic/{AccessoryWithCoolingThresholdTemprature.java => AccessoryWithCoolingThresholdTemperature.java} (88%) create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentHorizontalTilting.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentRelativeHumidity.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentVerticalTilting.java rename src/main/java/io/github/hapjava/accessories/optionalcharacteristic/{AccessoryWithHearingThresholdTemprature.java => AccessoryWithHeatingThresholdTemprature.java} (94%) create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithIsConfigured.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockCurrentState.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockTargetState.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPhysicalControlsLock.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationDirection.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationSpeed.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSecurityAlarmType.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithServiceLabelIndex.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusLowBattery.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusTampered.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSwingMode.java rename src/main/java/io/github/hapjava/accessories/optionalcharacteristic/{AccessoryWithHorizontalTilting.java => AccessoryWithTargetHorizontalTilting.java} (62%) create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetRelativeHumidity.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetVerticalTilting.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsEnum.java diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithAccessoryFlags.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithAccessoryFlags.java new file mode 100644 index 000000000..05634a3e8 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithAccessoryFlags.java @@ -0,0 +1,30 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.accessoryinformation.AccessoryFlagsEnum; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with accessory flags, which indicates that additional setup is required + * + * @author Eugen Freiter + */ +public interface AccessoryWithAccessoryFlags { + + /** + * When set indicates accessory requires additional setup. + * + * @return a future that will contain the accessory flags + */ + CompletableFuture getAccessoryFlags(); + + /** + * Subscribes to changes in accessory flags + * + * @param callback the function to call when the accessory flags changes. + */ + void subscribeAccessoryFlags(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the accessory flags . */ + void unsubscribeAccessoryFlags(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColorTemperature.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColorTemperature.java new file mode 100644 index 000000000..c6bde73da --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColorTemperature.java @@ -0,0 +1,38 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with color temperature. + * + * @author Eugen Freiter + */ +public interface AccessoryWithColorTemperature { + + /** + * Retrieves the color temperature + * + * @return a future that will contain the brightness, expressed as an integer between 0 and 100. + */ + CompletableFuture getColorTemperature(); + + /** + * Sets the color temperature + * + * @param value the brightness, on a scale of 0 to 100, to set + * @return a future that completes when the brightness is changed + * @throws Exception when the brightness cannot be set + */ + CompletableFuture setColorTemperature(Integer value) throws Exception; + + /** + * Subscribes to changes in color temperature. + * + * @param callback the function to call when the color temperature changes. + */ + void subscribeColorTemperature(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the color temperature. */ + void unsubscribeColorTemperature(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemprature.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java similarity index 88% rename from src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemprature.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java index 170c921d9..6e529bd53 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemprature.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java @@ -3,7 +3,12 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -public interface AccessoryWithCoolingThresholdTemprature { +/** + * Accessory with cooling threshold temperature. + * + * @author Eugen Freiter + */ +public interface AccessoryWithCoolingThresholdTemperature { /** * Retrieves the temperature above which the thermostat should begin cooling. diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentHorizontalTilting.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentHorizontalTilting.java new file mode 100644 index 000000000..b5ce298bf --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentHorizontalTilting.java @@ -0,0 +1,29 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with current horizontal tilting characteristic. + * + * @author Andy Lintner + */ +public interface AccessoryWithCurrentHorizontalTilting { + + /** + * Retrieves the current horizontal tilt angle + * + * @return a future that will contain the position as a value between -90 and 90 + */ + CompletableFuture getCurrentHorizontalTiltAngle(); + + /** + * Subscribes to changes in the current horizontal tilt angle. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentHorizontalTiltAngle(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the current horizontal tilt angle */ + void unsubscribeCurrentHorizontalTiltAngle(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentRelativeHumidity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentRelativeHumidity.java new file mode 100644 index 000000000..562e42649 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentRelativeHumidity.java @@ -0,0 +1,25 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** accessory with current relative humidity. */ +public interface AccessoryWithCurrentRelativeHumidity { + + /** + * Retrieves the current relative humidity. + * + * @return a future that will contain the current relative humidity. + */ + CompletableFuture getCurrentRelativeHumidity(); + + /** + * Subscribes to changes in current relative humidity. + * + * @param callback the function to call when the current relative humidity changes. + */ + void subscribeCurrentRelativeHumidity(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the current relative humidity. */ + void unsubscribeCurrentRelativeHumidity(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentVerticalTilting.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentVerticalTilting.java new file mode 100644 index 000000000..3b996c925 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentVerticalTilting.java @@ -0,0 +1,24 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** Accessory with current vertical tilting characteristic. */ +public interface AccessoryWithCurrentVerticalTilting { + /** + * Retrieves the current vertical tilt angle + * + * @return a future that will contain the position as a value between -90 and 90 + */ + CompletableFuture getCurrentVerticalTiltAngle(); + + /** + * Subscribes to changes in the current vertical tilt angle. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentVerticalTiltAngle(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the current vertical tilt angle */ + void unsubscribeCurrentVerticalTiltAngle(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java index 548ee34e5..e2359f85c 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java @@ -2,9 +2,6 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import io.github.hapjava.characteristics.impl.fan.CurrentFanStateEnum; -import io.github.hapjava.characteristics.impl.fan.LockPhysicalControlsEnum; -import io.github.hapjava.characteristics.impl.fan.RotationDirectionEnum; -import io.github.hapjava.characteristics.impl.fan.SwingModeEnum; import io.github.hapjava.characteristics.impl.fan.TargetFanStateEnum; import java.util.concurrent.CompletableFuture; @@ -37,75 +34,6 @@ public interface AccessoryWithFanState { */ CompletableFuture setTargetFanState(TargetFanStateEnum targetState); - /** - * Retrieves the swing mode of the fan. - * - * @return a future that will contain the swing mode - */ - CompletableFuture getSwingMode(); - - /** - * Set the swing mode of the fan (DISABLED, ENABLED). - * - * @param swingMode swing mode - * @return a future that completes when the change is made - */ - CompletableFuture setSwingMode(SwingModeEnum swingMode); - - /** - * OPTIONAL: Retrieves the lock controls of the fan. - * - * @return a future that will contain the lock controls - */ - CompletableFuture getLockControls(); - - /** - * Set the lock controls of the fan (DISABLED, ENABLED). - * - * @param lockControls lock controls mode - * @return a future that completes when the change is made - */ - CompletableFuture setLockControls(LockPhysicalControlsEnum lockControls); - - /** - * Retrieves the current rotation direction of the fan. - * - * @return a future that will contain the direction - */ - CompletableFuture getRotationDirection(); - - /** - * Retrieves the current speed of the fan's rotation - * - * @return a future that will contain the speed, expressed as an integer between 0 and 100. - */ - CompletableFuture getRotationSpeed(); - - /** - * Sets the rotation direction of the fan - * - * @param direction the direction to set - * @return a future that completes when the change is made - * @throws Exception when the change cannot be made - */ - CompletableFuture setRotationDirection(RotationDirectionEnum direction) throws Exception; - - /** - * OPTIONAL: Sets the speed of the fan's rotation - * - * @param speed the speed to set, expressed as an integer between 0 and 100. - * @return a future that completes when the change is made - * @throws Exception when the change cannot be made - */ - CompletableFuture setRotationSpeed(Integer speed) throws Exception; - - /** - * Subscribes to changes in the rotation direction of the fan. - * - * @param callback the function to call when the direction changes. - */ - void subscribeRotationDirection(HomekitCharacteristicChangeCallback callback); - /** * Subscribes to changes in the current fan state. * @@ -120,42 +48,9 @@ public interface AccessoryWithFanState { */ void subscribeTargetFanState(HomekitCharacteristicChangeCallback callback); - /** - * Subscribes to changes in the rotation speed of the fan. - * - * @param callback the function to call when the speed changes. - */ - void subscribeRotationSpeed(HomekitCharacteristicChangeCallback callback); - - /** - * Subscribes to changes in the swing mode of the fan. - * - * @param callback the function to call when the swing mode changes. - */ - void subscribeSwingMode(HomekitCharacteristicChangeCallback callback); - - /** - * Subscribes to changes in the lock controls of the fan. - * - * @param callback the function to call when the lock controls changes. - */ - void subscribeLockControls(HomekitCharacteristicChangeCallback callback); - - /** Unsubscribes from changes in the rotation direction of the fan. */ - void unsubscribeRotationDirection(); - - /** Unsubscribes from changes in the fan's rotation speed. */ - void unsubscribeRotationSpeed(); - /** Unsubscribes from changes in the current state of the fan. */ void unsubscribeCurrentFanState(); /** Unsubscribes from changes in the target state of the fan. */ void unsubscribeTargetFanState(); - - /** Unsubscribes from changes in the swing mode of the fan. */ - void unsubscribeSwingMode(); - - /** Unsubscribes from changes in the lock controls of the fan. */ - void unsubscribeLockControls(); } diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHearingThresholdTemprature.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHeatingThresholdTemprature.java similarity index 94% rename from src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHearingThresholdTemprature.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHeatingThresholdTemprature.java index af18baca3..536a18075 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHearingThresholdTemprature.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHeatingThresholdTemprature.java @@ -3,7 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -public interface AccessoryWithHearingThresholdTemprature { +public interface AccessoryWithHeatingThresholdTemprature { /** * Retrieves the temperature below which the thermostat should begin heating. diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithIsConfigured.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithIsConfigured.java new file mode 100644 index 000000000..b80f1ad65 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithIsConfigured.java @@ -0,0 +1,40 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.common.IsConfiguredEnum; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with isConfigured characteristics. This characteristic describes if the service is + * configured for use. For example, all of the valves in an irrigation system may not be configured + * depending on physical wire connection. + * + * @author Eugen Freiter + */ +public interface AccessoryWithIsConfigured { + + /** + * isConfigured state + * + * @return a future that will contain the isConfigured state + */ + CompletableFuture getIsConfigured(); + + /** + * Set the isConfigured (NOT_CONFIGURED, CONFIGURED). + * + * @param isConfigured isConfigured state + * @return a future that completes when the change is made + */ + CompletableFuture setIsConfigured(IsConfiguredEnum isConfigured); + + /** + * Subscribes to changes in isConfigured state + * + * @param callback the function to call when the isConfigured state changes. + */ + void subscribeIsConfigured(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the isConfigured state. */ + void unsubscribeIsConfigured(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockCurrentState.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockCurrentState.java new file mode 100644 index 000000000..2a63b64f5 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockCurrentState.java @@ -0,0 +1,30 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.lock.LockCurrentStateEnum; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with current lock state. + * + * @author Eugen Freiter + */ +public interface AccessoryWithLockCurrentState { + + /** + * Retrieves the lock states. The current state of the physical security mechanism (e.g. deadbolt) + * + * @return a future with the value + */ + CompletableFuture getLockCurrentState(); + + /** + * Subscribes to changes in lock current state. + * + * @param callback the function when the lock current state changes + */ + void subscribeLockCurrentState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeLockCurrentState(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockTargetState.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockTargetState.java new file mode 100644 index 000000000..b35ca0542 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockTargetState.java @@ -0,0 +1,39 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.lock.LockTargetStateEnum; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with lock target state. + * + * @author Eugen Freiter + */ +public interface AccessoryWithLockTargetState { + + /** + * Retrieves the lock states. The target state of the physical security mechanism (e.g. deadbolt) + * + * @return a future with the value + */ + CompletableFuture getLockTargetState(); + + /** + * Sets the lock target state + * + * @param state the target state to set + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setLockTargetState(LockTargetStateEnum state) throws Exception; + + /** + * Subscribes to changes in lock target state. + * + * @param callback the function when the lock target state changes + */ + void subscribeLockTargetState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeLockTargetState(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPhysicalControlsLock.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPhysicalControlsLock.java new file mode 100644 index 000000000..903abe229 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPhysicalControlsLock.java @@ -0,0 +1,38 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.fan.LockPhysicalControlsEnum; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with physical controls which can be locked, e.g. child lock + * + * @author Eugen Freiter + */ +public interface AccessoryWithPhysicalControlsLock { + + /** + * OPTIONAL: Retrieves the lock controls. + * + * @return a future that will contain the lock controls + */ + CompletableFuture getLockControls(); + + /** + * Set the lock controls (DISABLED, ENABLED). + * + * @param lockControls lock controls mode + * @return a future that completes when the change is made + */ + CompletableFuture setLockControls(LockPhysicalControlsEnum lockControls); + + /** + * Subscribes to changes in the lock controls. + * + * @param callback the function to call when the lock controls changes. + */ + void subscribeLockControls(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the lock controls. */ + void unsubscribeLockControls(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationDirection.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationDirection.java new file mode 100644 index 000000000..8c77e0ba8 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationDirection.java @@ -0,0 +1,39 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.fan.RotationDirectionEnum; +import java.util.concurrent.CompletableFuture; + +/** + * accessoory with rotation direction characteristics. + * + * @author Eugen Freiter + */ +public interface AccessoryWithRotationDirection { + + /** + * Retrieves the current rotation direction. + * + * @return a future that will contain the direction + */ + CompletableFuture getRotationDirection(); + + /** + * Sets the rotation direction + * + * @param direction the direction to set + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setRotationDirection(RotationDirectionEnum direction) throws Exception; + + /** + * Subscribes to changes in the rotation direction. + * + * @param callback the function to call when the direction changes. + */ + void subscribeRotationDirection(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the rotation direction. */ + void unsubscribeRotationDirection(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationSpeed.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationSpeed.java new file mode 100644 index 000000000..fcc27f32f --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationSpeed.java @@ -0,0 +1,38 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * accessory with rotation speed characteristics. + * + * @author Eugen Freiter + */ +public interface AccessoryWithRotationSpeed { + + /** + * Retrieves the current speed of the rotation + * + * @return a future that will contain the speed, expressed as an integer between 0 and 100. + */ + CompletableFuture getRotationSpeed(); + + /** + * Sets the speed of the rotation + * + * @param speed the speed to set, expressed as an integer between 0 and 100. + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setRotationSpeed(Integer speed) throws Exception; + + /** + * Subscribes to changes in the rotation speed. + * + * @param callback the function to call when the speed changes. + */ + void subscribeRotationSpeed(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the rotation speed. */ + void unsubscribeRotationSpeed(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSecurityAlarmType.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSecurityAlarmType.java new file mode 100644 index 000000000..ca707f8df --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSecurityAlarmType.java @@ -0,0 +1,32 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.securitysystem.SecuritySystemAlarmTypeEnum; +import java.util.concurrent.CompletableFuture; + +/** + * This characteristic describes the type of alarm triggered by a security system. A value of 1 + * indicates an ʼunknownʼ cause. Value should revert to 0 when the alarm conditions are cleared. + * + * @author Eugen Freiter + */ +public interface AccessoryWithSecurityAlarmType { + + /** + * A value of 1 indicates an ʼunknownʼ cause. Value should revert to 0 when the alarm conditions + * are cleared. + * + * @return a future with the value + */ + CompletableFuture getSecurityAlarmType(); + + /** + * Subscribes to changes in status alarm type + * + * @param callback the function when the alarm type changes + */ + void subscribeSecurityAlarmType(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeSecurityAlarmType(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithServiceLabelIndex.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithServiceLabelIndex.java new file mode 100644 index 000000000..b350654c2 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithServiceLabelIndex.java @@ -0,0 +1,19 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with service label index. This characteristic should be used identify the index of the + * label that maps to ”Service Label Namespace” used by the accessory. + * + * @author Eugen Freiter + */ +public interface AccessoryWithServiceLabelIndex { + + /** + * Retrieves the service label index. + * + * @return a future with the service label index + */ + CompletableFuture getServiceLabelIndex(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusLowBattery.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusLowBattery.java new file mode 100644 index 000000000..964d016ab --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusLowBattery.java @@ -0,0 +1,33 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryEnum; +import java.util.concurrent.CompletableFuture; + +/** + * This characteristic describes an accessoryʼs battery status. A status of 1 indicates that the + * battery level of the accessory is low. Value should return to 0 when the battery charges to a + * level thats above the low threshold. + * + * @author Eugen Freiter + */ +public interface AccessoryWithStatusLowBattery { + + /** + * A status of 1 indicates that the battery level of the accessory is low. Value should return to + * 0 when the battery charges to a level thats above the low threshold. + * + * @return a future with the value + */ + CompletableFuture getStatusLowBattery(); + + /** + * Subscribes to changes in status low battery. + * + * @param callback the function when the status low batter changes + */ + void subscribeStatusLowBattery(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeStatusLowBattery(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusTampered.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusTampered.java new file mode 100644 index 000000000..5637cb7ee --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusTampered.java @@ -0,0 +1,33 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.common.StatusTamperedEnum; +import java.util.concurrent.CompletableFuture; + +/** + * This characteristic describes an accessory which has been tampered with. A status of 1 indicates + * that the accessory has been tampered with. Value should return to 0 when the accessory has been + * reset to a non-tampered state, + * + * @author Eugen Freiter + */ +public interface AccessoryWithStatusTampered { + + /** + * Retrieves the status tampered. A status of 1 indicates that the accessory has been tampered + * with. Value should return to 0 when the accessory has been reset to a non-tampered state, + * + * @return a future with the value + */ + CompletableFuture getStatusTampered(); + + /** + * Subscribes to changes in status tampered. + * + * @param callback the function when the status tampered changes + */ + void subscribeStatusTampered(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeStatusTampered(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSwingMode.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSwingMode.java new file mode 100644 index 000000000..92b11058f --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSwingMode.java @@ -0,0 +1,38 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.fan.SwingModeEnum; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with Swing Mode characteristics. + * + * @author Eugen Freiter + */ +public interface AccessoryWithSwingMode { + + /** + * Retrieves the swing mode. + * + * @return a future that will contain the swing mode + */ + CompletableFuture getSwingMode(); + + /** + * Set the swing mode (DISABLED, ENABLED). + * + * @param swingMode swing mode + * @return a future that completes when the change is made + */ + CompletableFuture setSwingMode(SwingModeEnum swingMode); + + /** + * Subscribes to changes in the swing mode. + * + * @param callback the function to call when the swing mode changes. + */ + void subscribeSwingMode(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the swing mode. */ + void unsubscribeSwingMode(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHorizontalTilting.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetHorizontalTilting.java similarity index 62% rename from src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHorizontalTilting.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetHorizontalTilting.java index 58556c9d0..cc154520d 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHorizontalTilting.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetHorizontalTilting.java @@ -4,18 +4,11 @@ import java.util.concurrent.CompletableFuture; /** - * Accessory with horizontal tilting characteristic. + * Accessory with target horizontal tilting characteristic. * * @author Andy Lintner */ -public interface AccessoryWithHorizontalTilting { - - /** - * Retrieves the current horizontal tilt angle - * - * @return a future that will contain the position as a value between -90 and 90 - */ - CompletableFuture getCurrentHorizontalTiltAngle(); +public interface AccessoryWithTargetHorizontalTilting { /** * Retrieves the target horizontal tilt angle @@ -33,13 +26,6 @@ public interface AccessoryWithHorizontalTilting { */ CompletableFuture setTargetHorizontalTiltAngle(int angle) throws Exception; - /** - * Subscribes to changes in the current horizontal tilt angle. - * - * @param callback the function to call when the state changes. - */ - void subscribeCurrentHorizontalTiltAngle(HomekitCharacteristicChangeCallback callback); - /** * Subscribes to changes in the target horizontal tilt angle. * @@ -47,9 +33,6 @@ public interface AccessoryWithHorizontalTilting { */ void subscribeTargetHorizontalTiltAngle(HomekitCharacteristicChangeCallback callback); - /** Unsubscribes from changes in the current horizontal tilt angle */ - void unsubscribeCurrentHorizontalTiltAngle(); - /** Unsubscribes from changes in the target horizontal tilt angle */ void unsubscribeTargetHorizontalTiltAngle(); } diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetRelativeHumidity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetRelativeHumidity.java new file mode 100644 index 000000000..23ac5fd97 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetRelativeHumidity.java @@ -0,0 +1,33 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** accessory with target relative humidity. */ +public interface AccessoryWithTargetRelativeHumidity { + + /** + * Retrieves the target relative humidity. + * + * @return a future that will contain the target relative humidity. + */ + CompletableFuture getTargetRelativeHumidity(); + + /** + * Sets the target relative humidity. + * + * @param value the target relative humidity. + * @throws Exception when the target relative humidity cannot be changed. + */ + void setTargetRelativeHumidity(Double value) throws Exception; + + /** + * Subscribes to changes in the target relative humidity. + * + * @param callback the function to call when the target relative humidity changes. + */ + void subscribeTargetRelativeHumidity(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the target relative humidity. */ + void unsubscribeTargetRelativeHumidity(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetVerticalTilting.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetVerticalTilting.java new file mode 100644 index 000000000..e87607204 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetVerticalTilting.java @@ -0,0 +1,34 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** Accessory with target vertical tilting characteristic. */ +public interface AccessoryWithTargetVerticalTilting { + + /** + * Retrieves the target vertical tilt angle + * + * @return a future that will contain the target position as a value between -90 and 90 + */ + CompletableFuture getTargetVerticalTiltAngle(); + + /** + * Sets the target position + * + * @param angle the target angle to set, as a value between -90 and 90 + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setTargetVerticalTiltAngle(int angle) throws Exception; + + /** + * Subscribes to changes in the target vertical tilt angle. + * + * @param callback the function to call when the state changes. + */ + void subscribeTargetVerticalTiltAngle(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the target vertical tilt angle */ + void unsubscribeTargetVerticalTiltAngle(); +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsCharacteristic.java new file mode 100644 index 000000000..3dece74b7 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsCharacteristic.java @@ -0,0 +1,26 @@ +package io.github.hapjava.characteristics.impl.accessoryinformation; + +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; + +/** When set indicates accessory requires additional setup. */ +public class AccessoryFlagsCharacteristic extends EnumCharacteristic { + + public AccessoryFlagsCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000A6-0000-1000-8000-0026BB765291", + "accessory flags", + 1, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsEnum.java new file mode 100644 index 000000000..a849383e8 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.accessoryinformation; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0x0001 (bit0) ”Requires additional setup” 0x0002 - 0xFFFF ”Reserved” */ +public enum AccessoryFlagsEnum implements CharacteristicEnum { + NO_FLAGS(0), + REQUIRES_ADDITIONAL_SETUP(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(AccessoryFlagsEnum.values()) + .collect(Collectors.toMap(AccessoryFlagsEnum::getCode, t -> t)); + } + + public static AccessoryFlagsEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + AccessoryFlagsEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java index a73155d1b..b5b2b04a7 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java @@ -12,10 +12,10 @@ * indicates an ʼunknownʼ cause. Value should revert to 0 when the alarm conditions are cleared. */ public class SecuritySystemAlarmTypeCharacteristic - extends EnumCharacteristic { + extends EnumCharacteristic { public SecuritySystemAlarmTypeCharacteristic( - Supplier> getter, + Supplier> getter, Consumer subscriber, Runnable unsubscriber) { super( diff --git a/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java b/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java index 127bb0179..2746118bf 100644 --- a/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java +++ b/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java @@ -1,7 +1,9 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.HomekitAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithAccessoryFlags; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHardwareRevision; +import io.github.hapjava.characteristics.impl.accessoryinformation.AccessoryFlagsCharacteristic; import io.github.hapjava.characteristics.impl.accessoryinformation.FirmwareRevisionCharacteristic; import io.github.hapjava.characteristics.impl.accessoryinformation.HardwareRevisionCharacteristic; import io.github.hapjava.characteristics.impl.accessoryinformation.IdentifyCharacteristic; @@ -48,9 +50,20 @@ public AccessoryInformationService(HomekitAccessory accessory) { new HardwareRevisionCharacteristic( ((AccessoryWithHardwareRevision) accessory)::getHardwareRevision)); } + if (accessory instanceof AccessoryWithAccessoryFlags) { + addOptionalCharacteristic( + new AccessoryFlagsCharacteristic( + ((AccessoryWithAccessoryFlags) accessory)::getAccessoryFlags, + ((AccessoryWithAccessoryFlags) accessory)::subscribeAccessoryFlags, + ((AccessoryWithAccessoryFlags) accessory)::unsubscribeAccessoryFlags)); + } } public void addOptionalCharacteristic(HardwareRevisionCharacteristic hardwareRevision) { addCharacteristic(hardwareRevision); } + + public void addOptionalCharacteristic(AccessoryFlagsCharacteristic accessoryFlagsCharacteristic) { + addCharacteristic(accessoryFlagsCharacteristic); + } } diff --git a/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java b/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java index bcd009dfd..eaf4e44d6 100644 --- a/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/CarbonDioxideSensorService.java @@ -5,6 +5,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.carbondioxidesensor.CarbonDioxideDetectedCharacteristic; import io.github.hapjava.characteristics.impl.carbondioxidesensor.CarbonDioxideLevelCharacteristic; @@ -59,6 +61,20 @@ public CarbonDioxideSensorService(CarbonDioxideSensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java b/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java index 86c6d7b7d..11b66c5c4 100644 --- a/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/CarbonMonoxideSensorService.java @@ -5,6 +5,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.carbonmonoxidesensor.CarbonMonoxideDetectedCharacteristic; import io.github.hapjava.characteristics.impl.carbonmonoxidesensor.CarbonMonoxideLevelCharacteristic; @@ -59,6 +61,20 @@ public CarbonMonoxideSensorService(CarbonMonoxideSensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java b/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java index aa300955f..675553697 100644 --- a/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/ContactSensorService.java @@ -4,6 +4,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; @@ -43,6 +45,20 @@ public ContactSensorService(ContactSensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/DoorService.java b/src/main/java/io/github/hapjava/services/impl/DoorService.java index 62a191c8c..c4c3b40b3 100644 --- a/src/main/java/io/github/hapjava/services/impl/DoorService.java +++ b/src/main/java/io/github/hapjava/services/impl/DoorService.java @@ -1,6 +1,7 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.DoorAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHoldPosition; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithObstructionDetection; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; @@ -41,6 +42,10 @@ public DoorService(DoorAccessory accessory) { if (accessory instanceof AccessoryWithName) { addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); } + if (accessory instanceof AccessoryWithHoldPosition) { + addOptionalCharacteristic( + new HoldPositionCharacteristic(((AccessoryWithHoldPosition) accessory)::setHoldPosition)); + } if (accessory instanceof AccessoryWithObstructionDetection) { addOptionalCharacteristic( new ObstructionDetectedCharacteristic( diff --git a/src/main/java/io/github/hapjava/services/impl/FanService.java b/src/main/java/io/github/hapjava/services/impl/FanService.java index a09c5b61f..24d2bc052 100644 --- a/src/main/java/io/github/hapjava/services/impl/FanService.java +++ b/src/main/java/io/github/hapjava/services/impl/FanService.java @@ -1,7 +1,12 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.FanAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithFanState; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithPhysicalControlsLock; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithRotationDirection; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithRotationSpeed; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithSwingMode; import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.ActiveEnum; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; @@ -30,6 +35,52 @@ public FanService(FanAccessory accessory) { if (accessory instanceof AccessoryWithName) { addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); } + + if (accessory instanceof AccessoryWithFanState) { + addOptionalCharacteristic( + new CurrentFanStateCharacteristic( + ((AccessoryWithFanState) accessory)::getCurrentFanState, + ((AccessoryWithFanState) accessory)::subscribeCurrentFanState, + ((AccessoryWithFanState) accessory)::unsubscribeCurrentFanState)); + addOptionalCharacteristic( + new TargetFanStateCharacteristic( + ((AccessoryWithFanState) accessory)::getTargetFanState, + ((AccessoryWithFanState) accessory)::setTargetFanState, + ((AccessoryWithFanState) accessory)::subscribeTargetFanState, + ((AccessoryWithFanState) accessory)::unsubscribeTargetFanState)); + } + if (accessory instanceof AccessoryWithRotationDirection) { + addOptionalCharacteristic( + new RotationDirectionCharacteristic( + ((AccessoryWithRotationDirection) accessory)::getRotationDirection, + ((AccessoryWithRotationDirection) accessory)::setRotationDirection, + ((AccessoryWithRotationDirection) accessory)::subscribeRotationDirection, + ((AccessoryWithRotationDirection) accessory)::unsubscribeRotationDirection)); + } + if (accessory instanceof AccessoryWithRotationSpeed) { + addOptionalCharacteristic( + new RotationSpeedCharacteristic( + ((AccessoryWithRotationSpeed) accessory)::getRotationSpeed, + ((AccessoryWithRotationSpeed) accessory)::setRotationSpeed, + ((AccessoryWithRotationSpeed) accessory)::subscribeRotationSpeed, + ((AccessoryWithRotationSpeed) accessory)::unsubscribeRotationSpeed)); + } + if (accessory instanceof AccessoryWithSwingMode) { + addOptionalCharacteristic( + new SwingModeCharacteristic( + ((AccessoryWithSwingMode) accessory)::getSwingMode, + ((AccessoryWithSwingMode) accessory)::setSwingMode, + ((AccessoryWithSwingMode) accessory)::subscribeSwingMode, + ((AccessoryWithSwingMode) accessory)::unsubscribeSwingMode)); + } + if (accessory instanceof AccessoryWithPhysicalControlsLock) { + addOptionalCharacteristic( + new LockPhysicalControlsCharacteristic( + ((AccessoryWithPhysicalControlsLock) accessory)::getLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::setLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::subscribeLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::unsubscribeLockControls)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java b/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java index c1c7346f5..86078ee05 100644 --- a/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java +++ b/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java @@ -1,6 +1,8 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.GarageDoorOpenerAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithLockCurrentState; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithLockTargetState; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; @@ -43,6 +45,21 @@ public GarageDoorOpenerService(GarageDoorOpenerAccessory accessory) { if (accessory instanceof AccessoryWithName) { addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); } + if (accessory instanceof AccessoryWithLockCurrentState) { + addOptionalCharacteristic( + new LockCurrentStateCharacteristic( + ((AccessoryWithLockCurrentState) accessory)::getLockCurrentState, + ((AccessoryWithLockCurrentState) accessory)::subscribeLockCurrentState, + ((AccessoryWithLockCurrentState) accessory)::unsubscribeLockCurrentState)); + } + if (accessory instanceof AccessoryWithLockTargetState) { + addOptionalCharacteristic( + new LockTargetStateCharacteristic( + ((AccessoryWithLockTargetState) accessory)::getLockTargetState, + ((AccessoryWithLockTargetState) accessory)::setLockTargetState, + ((AccessoryWithLockTargetState) accessory)::subscribeLockTargetState, + ((AccessoryWithLockTargetState) accessory)::unsubscribeLockTargetState)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java b/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java index b5a21a76e..4153510a3 100644 --- a/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/HumiditySensorService.java @@ -4,6 +4,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; @@ -44,6 +46,20 @@ public HumiditySensorService(HumiditySensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java b/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java index e0a493ed0..b8470371a 100644 --- a/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/LeakSensorService.java @@ -4,6 +4,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; @@ -43,6 +45,20 @@ public LeakSensorService(LeakSensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/LightSensorService.java b/src/main/java/io/github/hapjava/services/impl/LightSensorService.java index 07a15a0fc..b40b4a43e 100644 --- a/src/main/java/io/github/hapjava/services/impl/LightSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/LightSensorService.java @@ -4,6 +4,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; @@ -26,6 +28,9 @@ public LightSensorService(LightSensorAccessory accessory) { accessory::subscribeCurrentAmbientLightLevel, accessory::unsubscribeCurrentAmbientLightLevel)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } if (accessory instanceof AccessoryWithStatusActive) { addOptionalCharacteristic( new StatusActiveCharacteristic( @@ -33,9 +38,6 @@ public LightSensorService(LightSensorAccessory accessory) { ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); } - if (accessory instanceof AccessoryWithName) { - addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); - } if (accessory instanceof AccessoryWithStatusFault) { addOptionalCharacteristic( new StatusFaultCharacteristic( @@ -43,6 +45,20 @@ public LightSensorService(LightSensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/LightbulbService.java b/src/main/java/io/github/hapjava/services/impl/LightbulbService.java index eff2c2b47..387a2b092 100644 --- a/src/main/java/io/github/hapjava/services/impl/LightbulbService.java +++ b/src/main/java/io/github/hapjava/services/impl/LightbulbService.java @@ -1,6 +1,9 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.LightbulbAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithBrightness; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithColor; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithColorTemperature; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.OnCharacteristic; @@ -27,6 +30,36 @@ public LightbulbService(LightbulbAccessory accessory) { if (accessory instanceof AccessoryWithName) { addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); } + if (accessory instanceof AccessoryWithColor) { + addOptionalCharacteristic( + new HueCharacteristic( + ((AccessoryWithColor) accessory)::getHue, + ((AccessoryWithColor) accessory)::setHue, + ((AccessoryWithColor) accessory)::subscribeHue, + ((AccessoryWithColor) accessory)::unsubscribeHue)); + addOptionalCharacteristic( + new SaturationCharacteristic( + ((AccessoryWithColor) accessory)::getSaturation, + ((AccessoryWithColor) accessory)::setSaturation, + ((AccessoryWithColor) accessory)::subscribeSaturation, + ((AccessoryWithColor) accessory)::unsubscribeSaturation)); + } + if (accessory instanceof AccessoryWithBrightness) { + addOptionalCharacteristic( + new BrightnessCharacteristic( + ((AccessoryWithBrightness) accessory)::getBrightness, + ((AccessoryWithBrightness) accessory)::setBrightness, + ((AccessoryWithBrightness) accessory)::subscribeBrightness, + ((AccessoryWithBrightness) accessory)::unsubscribeBrightness)); + } + if (accessory instanceof AccessoryWithColorTemperature) { + addOptionalCharacteristic( + new ColorTemperatureCharacteristic( + ((AccessoryWithColorTemperature) accessory)::getColorTemperature, + ((AccessoryWithColorTemperature) accessory)::setColorTemperature, + ((AccessoryWithColorTemperature) accessory)::subscribeColorTemperature, + ((AccessoryWithColorTemperature) accessory)::unsubscribeColorTemperature)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java b/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java index 7b4216f32..388448b35 100644 --- a/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/MotionSensorService.java @@ -4,6 +4,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; @@ -42,6 +44,20 @@ public MotionSensorService(MotionSensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java b/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java index 7a6ff235a..12771e60e 100644 --- a/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/OccupancySensorService.java @@ -4,6 +4,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; @@ -42,6 +44,20 @@ public OccupancySensorService(OccupancySensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java b/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java index a4f1de059..f4cf60e00 100644 --- a/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java +++ b/src/main/java/io/github/hapjava/services/impl/SecuritySystemService.java @@ -2,7 +2,9 @@ import io.github.hapjava.accessories.SecuritySystemAccessory; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithSecurityAlarmType; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; @@ -42,14 +44,28 @@ public SecuritySystemService(SecuritySystemAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithSecurityAlarmType) { + addOptionalCharacteristic( + new SecuritySystemAlarmTypeCharacteristic( + ((AccessoryWithSecurityAlarmType) accessory)::getSecurityAlarmType, + ((AccessoryWithSecurityAlarmType) accessory)::subscribeSecurityAlarmType, + ((AccessoryWithSecurityAlarmType) accessory)::unsubscribeSecurityAlarmType)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { addCharacteristic(name); } - public void addOptionalCharacteristic(SecuritySystemAlarmTypeCharacteristic alermType) { - addCharacteristic(alermType); + public void addOptionalCharacteristic(SecuritySystemAlarmTypeCharacteristic alarmType) { + addCharacteristic(alarmType); } public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { diff --git a/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java b/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java index df361f9cd..b6bf2f8d6 100644 --- a/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/SmokeSensorService.java @@ -4,6 +4,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; @@ -42,6 +44,20 @@ public SmokeSensorService(SmokeSensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java b/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java index d1c6f2e62..5fbb5a4ab 100644 --- a/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java @@ -4,6 +4,8 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; @@ -43,6 +45,20 @@ public TemperatureSensorService(TemperatureSensorAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/ThermostatService.java b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java index 75b01e3a2..ad575125a 100644 --- a/src/main/java/io/github/hapjava/services/impl/ThermostatService.java +++ b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java @@ -1,7 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.ThermostatAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCoolingThresholdTemperature; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCurrentRelativeHumidity; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHeatingThresholdTemprature; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithTargetRelativeHumidity; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.humiditysensor.CurrentRelativeHumidityCharacteristic; import io.github.hapjava.characteristics.impl.humiditysensor.TargetRelativeHumidityCharacteristic; @@ -58,6 +62,37 @@ public ThermostatService(ThermostatAccessory accessory) { if (accessory instanceof AccessoryWithName) { addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); } + if (accessory instanceof AccessoryWithCoolingThresholdTemperature) { + new CoolingThresholdTemperatureCharacteristic( + ((AccessoryWithCoolingThresholdTemperature) accessory)::getCoolingThresholdTemperature, + ((AccessoryWithCoolingThresholdTemperature) accessory)::setCoolingThresholdTemperature, + ((AccessoryWithCoolingThresholdTemperature) accessory) + ::subscribeCoolingThresholdTemperature, + ((AccessoryWithCoolingThresholdTemperature) accessory) + ::unsubscribeCoolingThresholdTemperature); + } + if (accessory instanceof AccessoryWithHeatingThresholdTemprature) { + new HeatingThresholdTemperatureCharacteristic( + ((AccessoryWithHeatingThresholdTemprature) accessory)::getHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemprature) accessory)::setHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemprature) accessory) + ::subscribeHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemprature) accessory) + ::unsubscribeHeatingThresholdTemperature); + } + if (accessory instanceof AccessoryWithCurrentRelativeHumidity) { + new CurrentRelativeHumidityCharacteristic( + ((AccessoryWithCurrentRelativeHumidity) accessory)::getCurrentRelativeHumidity, + ((AccessoryWithCurrentRelativeHumidity) accessory)::subscribeCurrentRelativeHumidity, + ((AccessoryWithCurrentRelativeHumidity) accessory)::unsubscribeCurrentRelativeHumidity); + } + if (accessory instanceof AccessoryWithTargetRelativeHumidity) { + new TargetRelativeHumidityCharacteristic( + ((AccessoryWithTargetRelativeHumidity) accessory)::getTargetRelativeHumidity, + ((AccessoryWithTargetRelativeHumidity) accessory)::setTargetRelativeHumidity, + ((AccessoryWithTargetRelativeHumidity) accessory)::subscribeTargetRelativeHumidity, + ((AccessoryWithTargetRelativeHumidity) accessory)::unsubscribeTargetRelativeHumidity); + } } public void addOptionalCharacteristic(NameCharacteristic name) { diff --git a/src/main/java/io/github/hapjava/services/impl/ValveService.java b/src/main/java/io/github/hapjava/services/impl/ValveService.java index 88270fc13..ae8d5b1c4 100644 --- a/src/main/java/io/github/hapjava/services/impl/ValveService.java +++ b/src/main/java/io/github/hapjava/services/impl/ValveService.java @@ -1,7 +1,11 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.ValveAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithDuration; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithIsConfigured; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithRemainingDuration; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithServiceLabelIndex; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; import io.github.hapjava.characteristics.impl.common.InUseCharacteristic; @@ -9,6 +13,7 @@ import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.ServiceLabelIndexCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.valve.RemainingDurationCharacteristic; import io.github.hapjava.characteristics.impl.valve.SetDurationCharacteristic; import io.github.hapjava.characteristics.impl.valve.ValveTypeCharacteristic; @@ -53,16 +58,53 @@ public ValveService(ValveAccessory accessory) { ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); } + if (accessory instanceof AccessoryWithDuration) { + addOptionalCharacteristic( + new SetDurationCharacteristic( + ((AccessoryWithDuration) accessory)::getSetDuration, + ((AccessoryWithDuration) accessory)::setSetDuration, + ((AccessoryWithDuration) accessory)::subscribeSetDuration, + ((AccessoryWithDuration) accessory)::unsubscribeSetDuration)); + } + if (accessory instanceof AccessoryWithRemainingDuration) { + addOptionalCharacteristic( + new RemainingDurationCharacteristic( + ((AccessoryWithRemainingDuration) accessory)::getRemainingDuration, + ((AccessoryWithRemainingDuration) accessory)::subscribeRemainingDuration, + ((AccessoryWithRemainingDuration) accessory)::unsubscribeRemainingDuration)); + } + if (accessory instanceof AccessoryWithIsConfigured) { + addOptionalCharacteristic( + new IsConfiguredCharacteristic( + ((AccessoryWithIsConfigured) accessory)::getIsConfigured, + ((AccessoryWithIsConfigured) accessory)::setIsConfigured, + ((AccessoryWithIsConfigured) accessory)::subscribeIsConfigured, + ((AccessoryWithIsConfigured) accessory)::unsubscribeIsConfigured)); + } + if (accessory instanceof AccessoryWithServiceLabelIndex) { + addOptionalCharacteristic( + new ServiceLabelIndexCharacteristic( + ((AccessoryWithServiceLabelIndex) accessory)::getServiceLabelIndex)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { addCharacteristic(name); } + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFaultCharacteristic) { + addCharacteristic(statusFaultCharacteristic); + } + public void addOptionalCharacteristic(SetDurationCharacteristic setDurationCharacteristic) { addCharacteristic(setDurationCharacteristic); } + public void addOptionalCharacteristic( + RemainingDurationCharacteristic remainingDurationCharacteristic) { + addCharacteristic(remainingDurationCharacteristic); + } + public void addOptionalCharacteristic(IsConfiguredCharacteristic isConfiguredCharacteristic) { addCharacteristic(isConfiguredCharacteristic); } @@ -71,8 +113,4 @@ public void addOptionalCharacteristic( ServiceLabelIndexCharacteristic serviceLabelIndexCharacteristic) { addCharacteristic(serviceLabelIndexCharacteristic); } - - public void addOptionalCharacteristic(StatusFaultCharacteristic statusFaultCharacteristic) { - addCharacteristic(statusFaultCharacteristic); - } } diff --git a/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java b/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java index bffaa3b53..173751333 100644 --- a/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java +++ b/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java @@ -1,8 +1,13 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.WindowCoveringAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCurrentHorizontalTilting; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCurrentVerticalTilting; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHoldPosition; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithObstructionDetection; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithTargetHorizontalTilting; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithTargetVerticalTilting; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.ObstructionDetectedCharacteristic; import io.github.hapjava.characteristics.impl.windowcovering.CurrentHorizontalTiltAngleCharacteristic; @@ -48,6 +53,11 @@ public WindowCoveringService(WindowCoveringAccessory accessory) { if (accessory instanceof AccessoryWithName) { addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); } + if (accessory instanceof AccessoryWithHoldPosition) { + addOptionalCharacteristic( + new HoldPositionCharacteristic(((AccessoryWithHoldPosition) accessory)::setHoldPosition)); + } + if (accessory instanceof AccessoryWithObstructionDetection) { addOptionalCharacteristic( new ObstructionDetectedCharacteristic( @@ -55,6 +65,42 @@ public WindowCoveringService(WindowCoveringAccessory accessory) { ((AccessoryWithObstructionDetection) accessory)::subscribeObstructionDetected, ((AccessoryWithObstructionDetection) accessory)::unsubscribeObstructionDetected)); } + if (accessory instanceof AccessoryWithCurrentHorizontalTilting) { + addOptionalCharacteristic( + new CurrentHorizontalTiltAngleCharacteristic( + ((AccessoryWithCurrentHorizontalTilting) accessory)::getCurrentHorizontalTiltAngle, + ((AccessoryWithCurrentHorizontalTilting) accessory) + ::subscribeCurrentHorizontalTiltAngle, + ((AccessoryWithCurrentHorizontalTilting) accessory) + ::unsubscribeCurrentHorizontalTiltAngle)); + } + if (accessory instanceof AccessoryWithTargetHorizontalTilting) { + addOptionalCharacteristic( + new TargetHorizontalTiltAngleCharacteristic( + ((AccessoryWithTargetHorizontalTilting) accessory)::getTargetHorizontalTiltAngle, + ((AccessoryWithTargetHorizontalTilting) accessory)::setTargetHorizontalTiltAngle, + ((AccessoryWithTargetHorizontalTilting) accessory) + ::subscribeTargetHorizontalTiltAngle, + ((AccessoryWithTargetHorizontalTilting) accessory) + ::unsubscribeTargetHorizontalTiltAngle)); + } + if (accessory instanceof AccessoryWithCurrentVerticalTilting) { + addOptionalCharacteristic( + new CurrentVerticalTiltAngleCharacteristic( + ((AccessoryWithCurrentVerticalTilting) accessory)::getCurrentVerticalTiltAngle, + ((AccessoryWithCurrentVerticalTilting) accessory)::subscribeCurrentVerticalTiltAngle, + ((AccessoryWithCurrentVerticalTilting) accessory) + ::unsubscribeCurrentVerticalTiltAngle)); + } + if (accessory instanceof AccessoryWithTargetVerticalTilting) { + addOptionalCharacteristic( + new TargetVerticalTiltAngleCharacteristic( + ((AccessoryWithTargetVerticalTilting) accessory)::getTargetVerticalTiltAngle, + ((AccessoryWithTargetVerticalTilting) accessory)::setTargetVerticalTiltAngle, + ((AccessoryWithTargetVerticalTilting) accessory)::subscribeTargetVerticalTiltAngle, + ((AccessoryWithTargetVerticalTilting) accessory) + ::unsubscribeTargetVerticalTiltAngle)); + } } public void addOptionalCharacteristic(NameCharacteristic name) { @@ -65,6 +111,11 @@ public void addOptionalCharacteristic(HoldPositionCharacteristic holdPositionCha addCharacteristic(holdPositionCharacteristic); } + public void addOptionalCharacteristic( + ObstructionDetectedCharacteristic obstructionDetectedCharacteristic) { + addCharacteristic(obstructionDetectedCharacteristic); + } + public void addOptionalCharacteristic( CurrentHorizontalTiltAngleCharacteristic currentHorizontalTiltAngleCharacteristic) { addCharacteristic(currentHorizontalTiltAngleCharacteristic); @@ -84,9 +135,4 @@ public void addOptionalCharacteristic( TargetVerticalTiltAngleCharacteristic targetVerticalTiltAngleCharacteristic) { addCharacteristic(targetVerticalTiltAngleCharacteristic); } - - public void addOptionalCharacteristic( - ObstructionDetectedCharacteristic obstructionDetectedCharacteristic) { - addCharacteristic(obstructionDetectedCharacteristic); - } } diff --git a/src/main/java/io/github/hapjava/services/impl/WindowService.java b/src/main/java/io/github/hapjava/services/impl/WindowService.java index b984f536c..e7f2e775d 100644 --- a/src/main/java/io/github/hapjava/services/impl/WindowService.java +++ b/src/main/java/io/github/hapjava/services/impl/WindowService.java @@ -1,6 +1,7 @@ package io.github.hapjava.services.impl; import io.github.hapjava.accessories.WindowAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHoldPosition; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithObstructionDetection; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; @@ -41,6 +42,11 @@ public WindowService(WindowAccessory accessory) { if (accessory instanceof AccessoryWithName) { addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); } + if (accessory instanceof AccessoryWithHoldPosition) { + addOptionalCharacteristic( + new HoldPositionCharacteristic(((AccessoryWithHoldPosition) accessory)::setHoldPosition)); + } + if (accessory instanceof AccessoryWithObstructionDetection) { addOptionalCharacteristic( new ObstructionDetectedCharacteristic( From 428ea3de14aef1981014d876ae2cf0cc713f55d7 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Mon, 16 Mar 2020 23:52:28 +0100 Subject: [PATCH 04/23] update CHANGES.md and README.md --- CHANGES.md | 10 ++++++++++ README.md | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 143958172..aae6d6c50 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,13 @@ +# HAP-Java 2.0.0 +* major refactoring to support optional characteristics +* structure and names are adapted to HAP spec structure and naming. +* structure is following + * `accessory` package include basis accessory as the listed in HAP spec, plus interfaces for optional characteristics. clients should extend the accessory classes. e.g. `WindowCoveringAccessory` or `AccessoryWithBrightness` + * `characteristics` package consists of all characteristics, optional and mandatory. e.g. `TargetHorizontalTiltAngleCharacteristic`. The naming is done in accordance to HAP spec. + * `services` package consists of services, which grouping characteristics. e.g. `WindowCoveringService` defines mandatory and optional characteristics for a window covering service as it is defined in HAP spec. + * `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. + # HAP-Java 1.1.5 ## Fixes diff --git a/README.md b/README.md index 2d3a5ba53..4a2d3f319 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Include HAP-Java in your project using maven: io.github.hap-java hap - 1.2.0-SNAPSHOT + 2.0.0-SNAPSHOT ``` From 9c91d828145740bdde2429c4d7874a5b01909a20 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Tue, 17 Mar 2020 23:52:57 +0100 Subject: [PATCH 05/23] Apply J-N-K patches for Openhab. update dependencies to be aligned with OH --- pom.xml | 52 +++++++++++++++---- .../server/impl/http/impl/LoggingHandler.java | 40 ++++++++------ 2 files changed, 65 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index bc523c756..b8c2cbac4 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,9 @@ UTF-8 - + 4.1.42.Final + + @@ -56,8 +58,44 @@ io.netty - netty-all - 4.0.32.Final + netty-common + ${netty.version} + + + + io.netty + netty-buffer + ${netty.version} + + + + io.netty + netty-transport + ${netty.version} + + + + io.netty + netty-handler + ${netty.version} + + + + io.netty + netty-codec + ${netty.version} + + + + io.netty + netty-codec-http + ${netty.version} + + + + io.netty + netty-resolver + ${netty.version} @@ -102,12 +140,6 @@ 3.4.1 - - commons-io - commons-io - 2.4 - - junit junit @@ -178,7 +210,7 @@ maven-assembly-plugin - 3.1.0 + 3.1.1 deploy/distribution.xml diff --git a/src/main/java/io/github/hapjava/server/impl/http/impl/LoggingHandler.java b/src/main/java/io/github/hapjava/server/impl/http/impl/LoggingHandler.java index 5b8e52368..5b271dc24 100644 --- a/src/main/java/io/github/hapjava/server/impl/http/impl/LoggingHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/LoggingHandler.java @@ -2,16 +2,14 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.*; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import org.apache.commons.io.HexDump; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LoggingHandler extends ChannelDuplexHandler { - private static final Logger logger = LoggerFactory.getLogger(NettyHomekitHttpService.class); + private static final Logger logger = LoggerFactory.getLogger(LoggingHandler.class); + private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { @@ -32,19 +30,27 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) private void logBytes(String type, ByteBuf buf, ChannelHandlerContext ctx) throws IOException { if (buf.readableBytes() > 0) { - try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) { - byte[] bytes = new byte[buf.readableBytes()]; - buf.getBytes(0, bytes, 0, bytes.length); - HexDump.dump(bytes, 0, stream, 0); - stream.flush(); - logger.trace( - String.format( - "%s %s [%s]:%n%s%n", - type, - buf, - ctx.channel().remoteAddress().toString(), - stream.toString(StandardCharsets.UTF_8.name()))); - } + byte[] bytes = new byte[buf.readableBytes()]; + buf.getBytes(0, bytes, 0, bytes.length); + logger.trace( + String.format( + "%s %s [%s]:%n%s%n", + type, buf, ctx.channel().remoteAddress().toString(), bytesToHex(bytes))); } } + + /* + This method is licensed under CC-BY-SA and published on Stackoverflow + https://stackoverflow.com/questions/9655181/how-to-convert-a-byte-array-to-a-hex-string-in-java + from the answer by Melquiades https://stackoverflow.com/users/2964945/melquiades + */ + private String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + for (int j = 0; j < bytes.length; j++) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = HEX_ARRAY[v >>> 4]; + hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; + } + return new String(hexChars); + } } From ad9ab2c71253667d8385fa6d692609f6077937ae Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Tue, 31 Mar 2020 18:31:34 +0200 Subject: [PATCH 06/23] fix some typos in the characteristics descriptions --- .../io/github/hapjava/accessories/HomekitAccessory.java | 9 +++++++++ .../accessoryinformation/IdentifyCharacteristic.java | 2 +- .../accessoryinformation/ManufacturerCharacteristic.java | 2 +- .../impl/accessoryinformation/ModelCharacteristic.java | 2 +- .../accessoryinformation/SerialNumberCharacteristic.java | 2 +- .../characteristics/impl/base/EnumCharacteristic.java | 2 ++ .../CurrentHorizontalTiltAngleCharacteristic.java | 2 +- .../CurrentVerticalTiltAngleCharacteristic.java | 2 +- .../TargetHorizontalTiltAngleCharacteristic.java | 2 +- .../TargetVerticalTiltAngleCharacteristic.java | 2 +- 10 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java b/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java index adb56a150..3bbde9538 100644 --- a/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java @@ -79,4 +79,13 @@ public interface HomekitAccessory { default Collection getServices() { return Collections.singleton(new AccessoryInformationService(this)); }; + + /** + * default implementation which is sufficient if accessory has only one services + * + * @return primary service + */ + default Service getPrimaryService() { + return getServices().iterator().next(); + }; } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java index cacb34b71..8936ba77d 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/IdentifyCharacteristic.java @@ -10,7 +10,7 @@ public class IdentifyCharacteristic extends BooleanCharacteristic { public IdentifyCharacteristic(ExceptionalConsumer setter) { super( "00000014-0000-1000-8000-0026BB765291", - "identifies the accessory via a physical action on the accessory", + "identifies the accessory", Optional.empty(), Optional.of(setter), Optional.empty(), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java index 0610b3b9b..0aa4e2189 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java @@ -14,7 +14,7 @@ public class ManufacturerCharacteristic extends StaticStringCharacteristic { public ManufacturerCharacteristic(Supplier> getter) { super( "00000020-0000-1000-8000-0026BB765291", - "ame of the manufacturer", + "manufacturer", Optional.of(getter), Optional.empty(), Optional.empty()); diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java index d448fd984..ce87e62e3 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java @@ -14,7 +14,7 @@ public class ModelCharacteristic extends StaticStringCharacteristic { public ModelCharacteristic(Supplier> getter) { super( "00000021-0000-1000-8000-0026BB765291", - "name of the model", + "model", Optional.of(getter), Optional.empty(), Optional.empty()); diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java index 596c2be77..018d35ca5 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java @@ -14,7 +14,7 @@ public class SerialNumberCharacteristic extends StaticStringCharacteristic { public SerialNumberCharacteristic(Supplier> getter) { super( "00000030-0000-1000-8000-0026BB765291", - "serial number of the accessory", + "serial number", Optional.of(getter), Optional.empty(), Optional.empty()); diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java index 93f4770de..395d8ed53 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java @@ -49,6 +49,8 @@ public EnumCharacteristic( super( type, "int", description, getter.isPresent(), setter.isPresent(), subscriber, unsubscriber); this.maxValue = maxValue; + this.getter = getter; + this.setter = setter; } /** {@inheritDoc} */ diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java index 8295d1db9..37583d00e 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java @@ -24,7 +24,7 @@ public CurrentHorizontalTiltAngleCharacteristic( Runnable unsubscriber) { super( "0000006C-0000-1000-8000-0026BB765291", - "current horizontal tilt angel", + "current horizontal tilt angle", -90, 90, "arcdegrees", diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java index 7504b4302..590712958 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java @@ -24,7 +24,7 @@ public CurrentVerticalTiltAngleCharacteristic( Runnable unsubscriber) { super( "0000006E-0000-1000-8000-0026BB765291", - "current vertical tilt angel", + "current vertical tilt angle", -90, 90, "arcdegrees", diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java index 34e425b3e..a12a1da80 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java @@ -23,7 +23,7 @@ public TargetHorizontalTiltAngleCharacteristic( Runnable unsubscriber) { super( "000000B2-0000-1000-8000-0026BB765291", - "target horizontal tilt angel", + "target horizontal tilt angle", -90, 90, "arcdegrees", diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java index a3edbcad3..adfb8a554 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java @@ -23,7 +23,7 @@ public TargetVerticalTiltAngleCharacteristic( Runnable unsubscriber) { super( "0000007D-0000-1000-8000-0026BB765291", - "target vertical tilt angel", + "target vertical tilt angle", -90, 90, "arcdegrees", From 3cfad1d015bd2e19da19bb0bf16cf5095396d1f1 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 26 Apr 2020 13:23:29 +0200 Subject: [PATCH 07/23] fix for javadoc bug --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b8c2cbac4..bd88630bc 100644 --- a/pom.xml +++ b/pom.xml @@ -195,9 +195,10 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.0.1 + 3.2.0 io.github.hapjava.server.impl + 8 From 4b8ba89b5e46923790fed3e530ca5de697ed06b8 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 26 Apr 2020 13:24:51 +0200 Subject: [PATCH 08/23] fix potential NPE. adapt log level Signed-off-by: Eugen Freiter --- .../server/impl/connections/SubscriptionManager.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java b/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java index 5a26a41b4..7f3cbbab0 100644 --- a/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java @@ -97,7 +97,7 @@ public synchronized void batchUpdate() { public synchronized void completeUpdateBatch() { if (--this.nestedBatches == 0 && !pendingNotifications.isEmpty()) { - LOGGER.info("Publishing batched changes"); + LOGGER.debug("Publishing batched changes"); for (ConcurrentMap.Entry> entry : pendingNotifications.entrySet()) { try { @@ -112,10 +112,12 @@ public synchronized void completeUpdateBatch() { } public synchronized void publish(int accessoryId, int iid, EventableCharacteristic changed) { + final Set subscribers = subscriptions.get(changed); + if ((subscribers == null) || (subscribers.isEmpty())) return; // no subscribers if (nestedBatches != 0) { - LOGGER.info("Batching change for " + accessoryId); + LOGGER.debug("Batching change for " + accessoryId); PendingNotification notification = new PendingNotification(accessoryId, iid, changed); - for (HomekitClientConnection connection : subscriptions.get(changed)) { + for (HomekitClientConnection connection : subscribers) { if (!pendingNotifications.containsKey(connection)) { pendingNotifications.put(connection, new ArrayList()); } @@ -126,8 +128,8 @@ public synchronized void publish(int accessoryId, int iid, EventableCharacterist try { HttpResponse message = new EventController().getMessage(accessoryId, iid, changed); - LOGGER.info("Publishing change for " + accessoryId); - for (HomekitClientConnection connection : subscriptions.get(changed)) { + LOGGER.debug("Publishing change for " + accessoryId); + for (HomekitClientConnection connection : subscribers) { connection.outOfBand(message); } } catch (Exception e) { From 5f404f803939cae5d725c34141868e4d807e1db4 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 26 Apr 2020 21:00:12 +0200 Subject: [PATCH 09/23] fix typo and add some logging Signed-off-by: Eugen Freiter --- .../server/impl/connections/SubscriptionManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java b/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java index 7f3cbbab0..0c1b2dd47 100644 --- a/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java @@ -104,7 +104,7 @@ public synchronized void completeUpdateBatch() { HttpResponse message = new EventController().getMessage(entry.getValue()); entry.getKey().outOfBand(message); } catch (Exception e) { - LOGGER.error("Faled to create new event message", e); + LOGGER.error("Failed to create new event message", e); } } pendingNotifications.clear(); @@ -113,7 +113,10 @@ public synchronized void completeUpdateBatch() { public synchronized void publish(int accessoryId, int iid, EventableCharacteristic changed) { final Set subscribers = subscriptions.get(changed); - if ((subscribers == null) || (subscribers.isEmpty())) return; // no subscribers + if ((subscribers == null) || (subscribers.isEmpty())) { + LOGGER.debug("No subscribers to characteristic {} at accessory {} ", changed, accessoryId); + return; // no subscribers + } if (nestedBatches != 0) { LOGGER.debug("Batching change for " + accessoryId); PendingNotification notification = new PendingNotification(accessoryId, iid, changed); From c640cdb4add213f40446ca7a25e195bb6d029fff Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Wed, 29 Apr 2020 12:58:21 +0200 Subject: [PATCH 10/23] Add Doorbell, Microphone, Slat, Speaker, StatelessProgrammableSwitch accessories Signed-off-by: Eugen Freiter --- .../accessories/DoorbellAccessory.java | 40 +++++++++ .../accessories/MicrophoneAccessory.java | 47 +++++++++++ .../hapjava/accessories/SlatAccessory.java | 47 +++++++++++ .../hapjava/accessories/SpeakerAccessory.java | 47 +++++++++++ .../StatelessProgrammableSwitchAccessory.java | 40 +++++++++ .../hapjava/accessories/ValveAccessory.java | 4 +- .../AccessoryWithCurrentTilting.java | 29 +++++++ .../AccessoryWithTargetTilting.java | 38 +++++++++ .../AccessoryWithVolume.java | 38 +++++++++ .../impl/audio/MuteCharacteristic.java | 27 +++++++ .../characteristics/impl/audio/MuteEnum.java | 33 ++++++++ .../impl/audio/VolumeCharacteristic.java | 37 +++++++++ .../impl/common/ProgrammableSwitchEnum.java | 36 +++++++++ ...ProgrammableSwitchEventCharacteristic.java | 35 ++++++++ .../slat/CurrentSlatStateCharacteristic.java | 26 ++++++ .../impl/slat/CurrentSlatStateEnum.java | 36 +++++++++ .../slat/CurrentTiltAngleCharacteristic.java | 34 ++++++++ .../impl/slat/SlatTypeCharacteristic.java | 25 ++++++ .../impl/slat/SlatTypeEnum.java | 35 ++++++++ .../slat/TargetTiltAngleCharacteristic.java | 35 ++++++++ .../services/impl/DoorbellService.java | 63 +++++++++++++++ .../services/impl/MicrophoneService.java | 49 +++++++++++ .../hapjava/services/impl/SlatService.java | 81 +++++++++++++++++++ .../hapjava/services/impl/SpeakerService.java | 46 +++++++++++ .../StatelessProgrammableSwitchService.java | 46 +++++++++++ 25 files changed, 971 insertions(+), 3 deletions(-) create mode 100644 src/main/java/io/github/hapjava/accessories/DoorbellAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/MicrophoneAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/SlatAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/SpeakerAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/StatelessProgrammableSwitchAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentTilting.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetTilting.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVolume.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/audio/MuteEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/audio/VolumeCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEventCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentSlatStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentSlatStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentTiltAngleCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/slat/TargetTiltAngleCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/services/impl/DoorbellService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/MicrophoneService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/SlatService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/SpeakerService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/StatelessProgrammableSwitchService.java diff --git a/src/main/java/io/github/hapjava/accessories/DoorbellAccessory.java b/src/main/java/io/github/hapjava/accessories/DoorbellAccessory.java new file mode 100644 index 000000000..6bcdeb17a --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/DoorbellAccessory.java @@ -0,0 +1,40 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.common.ProgrammableSwitchEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.DoorbellService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * The Doorbell accessory describes a doorbell. + * + * @author Eugen Freiter + */ +public interface DoorbellAccessory extends HomekitAccessory { + + /** + * Retrieves the last states of the doorbell. Bluetooth device should return the last event, the + * IP device should always return null + * + * @return state of the door bell event + */ + CompletableFuture getSwitchEvent(); + + /** + * Subscribes to changes in doorbell switch event, i.e. pressing on the door bell button. + * + * @param callback the function to call when the state changes. + */ + void subscribeSwitchEvent(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in doorbell switch event. */ + void unsubscribeSwitchEvent(); + + @Override + default Collection getServices() { + return Collections.singleton(new DoorbellService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/MicrophoneAccessory.java b/src/main/java/io/github/hapjava/accessories/MicrophoneAccessory.java new file mode 100644 index 000000000..480f1b067 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/MicrophoneAccessory.java @@ -0,0 +1,47 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.MicrophoneService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * Microphone accessory. + * + * @author Eugen Freiter + */ +public interface MicrophoneAccessory extends HomekitAccessory { + + /** + * Retrieves mute status. + * + * @return true if accessory is muted + */ + CompletableFuture isMuted(); + + /** + * Sets the mute status + * + * @param mute true if accessory should be muted + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setMute(boolean mute) throws Exception; + + /** + * Subscribes to changes in mute state. + * + * @param callback the function to call when the state changes. + */ + void subscribeMuteState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the mute state. */ + void unsubscribeMuteState(); + + @Override + default Collection getServices() { + return Collections.singleton(new MicrophoneService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/SlatAccessory.java b/src/main/java/io/github/hapjava/accessories/SlatAccessory.java new file mode 100644 index 000000000..89266a400 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/SlatAccessory.java @@ -0,0 +1,47 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.slat.CurrentSlatStateEnum; +import io.github.hapjava.characteristics.impl.slat.SlatTypeEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.SlatService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * A slat which tilts on a vertical or a horizontal axis. + * + * @author Eugen Freiter + */ +public interface SlatAccessory extends HomekitAccessory { + + /** + * Retrieves the current state of the slat + * + * @return a future that will contain the state + */ + CompletableFuture getSlatState(); + + /** + * Subscribes to changes in the state of the slat. + * + * @param callback the function to call when the state changes. + */ + void subscribeSlatState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the state of the slat. */ + void unsubscribeSlatState(); + + /** + * Retrieves the slat type. + * + * @return a future that will slat type. + */ + CompletableFuture getSlatType(); + + @Override + default Collection getServices() { + return Collections.singleton(new SlatService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/SpeakerAccessory.java b/src/main/java/io/github/hapjava/accessories/SpeakerAccessory.java new file mode 100644 index 000000000..f0c44e228 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/SpeakerAccessory.java @@ -0,0 +1,47 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.SpeakerService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * Speaker accessory. + * + * @author Eugen Freiter + */ +public interface SpeakerAccessory extends HomekitAccessory { + + /** + * Retrieves mute status. + * + * @return true if accessory is muted + */ + CompletableFuture isMuted(); + + /** + * Sets the mute status + * + * @param mute true if accessory should be muted + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setMute(boolean mute) throws Exception; + + /** + * Subscribes to changes in mute state. + * + * @param callback the function to call when the state changes. + */ + void subscribeMuteState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the mute state. */ + void unsubscribeMuteState(); + + @Override + default Collection getServices() { + return Collections.singleton(new SpeakerService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/StatelessProgrammableSwitchAccessory.java b/src/main/java/io/github/hapjava/accessories/StatelessProgrammableSwitchAccessory.java new file mode 100644 index 000000000..fa36713bd --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/StatelessProgrammableSwitchAccessory.java @@ -0,0 +1,40 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.common.ProgrammableSwitchEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.StatelessProgrammableSwitchService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * The Stateless Programmable Switch accessory describes a stateless programmable switch.. + * + * @author Eugen Freiter + */ +public interface StatelessProgrammableSwitchAccessory extends HomekitAccessory { + + /** + * Retrieves the last states of the switch. Bluetooth device should return the last event, the IP + * device should always return null + * + * @return state of the switch event + */ + CompletableFuture getSwitchEvent(); + + /** + * Subscribes to changes in switch event, i.e. pressing on the button. + * + * @param callback the function to call when the state changes. + */ + void subscribeSwitchEvent(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in switch event. */ + void unsubscribeSwitchEvent(); + + @Override + default Collection getServices() { + return Collections.singleton(new StatelessProgrammableSwitchService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/ValveAccessory.java b/src/main/java/io/github/hapjava/accessories/ValveAccessory.java index a99613b3b..4348e163a 100644 --- a/src/main/java/io/github/hapjava/accessories/ValveAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/ValveAccessory.java @@ -70,9 +70,7 @@ public interface ValveAccessory extends HomekitAccessory { /** * Retrieves the valve type. * - *

To communicate water is flowing through a valve, inUse should be used. - * - * @return a future that will contain the binary state + * @return a future that will contain the valve type. */ CompletableFuture getValveType(); diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentTilting.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentTilting.java new file mode 100644 index 000000000..c8b3125ec --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentTilting.java @@ -0,0 +1,29 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with current tilting characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithCurrentTilting { + + /** + * Retrieves the current tilt angle + * + * @return a future that will contain the position as a value between -90 and 90 + */ + CompletableFuture getCurrentTiltAngle(); + + /** + * Subscribes to changes in the current tilt angle. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentTiltAngle(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the current tilt angle */ + void unsubscribeCurrentTiltAngle(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetTilting.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetTilting.java new file mode 100644 index 000000000..76cebc4e3 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetTilting.java @@ -0,0 +1,38 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with target tilting characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithTargetTilting { + + /** + * Retrieves the target tilt angle + * + * @return a future that will contain the target position as a value between -90 and 90 + */ + CompletableFuture getTargetTiltAngle(); + + /** + * Sets the target tilt angle + * + * @param angle the target angle to set, as a value between -90 and 90 + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setTargetTiltAngle(int angle) throws Exception; + + /** + * Subscribes to changes in the target tilt angle. + * + * @param callback the function to call when the state changes. + */ + void subscribeTargetTiltAngle(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the target tilt angle */ + void unsubscribeTargetTiltAngle(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVolume.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVolume.java new file mode 100644 index 000000000..693751fc4 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVolume.java @@ -0,0 +1,38 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with volume values. + * + * @author Eugen Freiter + */ +public interface AccessoryWithVolume { + + /** + * Retrieves the current volume + * + * @return a future that will contain the volume, expressed as an integer between 0 and 100. + */ + CompletableFuture getVolume(); + + /** + * Sets the current volume + * + * @param value the volume, on a scale of 0 to 100, to set + * @return a future that completes when the volume is changed + * @throws Exception when the volume cannot be set + */ + CompletableFuture setVolume(Integer value) throws Exception; + + /** + * Subscribes to changes in the volume. + * + * @param callback the function to call when the state changes. + */ + void subscribeVolume(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the volume. */ + void unsubscribeVolume(); +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java new file mode 100644 index 000000000..bdfe65f1b --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java @@ -0,0 +1,27 @@ +package io.github.hapjava.characteristics.impl.audio; + +import io.github.hapjava.characteristics.ExceptionalConsumer; +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; + +/** A Mute characteristic allows the control of audio input or output accessory respectively. */ +public class MuteCharacteristic extends EnumCharacteristic { + public MuteCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "0000011A-0000-1000-8000-0026BB765291", + "Mute", + 1, + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteEnum.java new file mode 100644 index 000000000..a06f1407a --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteEnum.java @@ -0,0 +1,33 @@ +package io.github.hapjava.characteristics.impl.audio; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Mute is Off / Audio is On” 1 ”Mute is On / There is no Audio” */ +public enum MuteEnum implements CharacteristicEnum { + OFF(0), + ON(1); + + private static final Map reverse; + + static { + reverse = Arrays.stream(MuteEnum.values()).collect(Collectors.toMap(MuteEnum::getCode, t -> t)); + } + + public static MuteEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + MuteEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/audio/VolumeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/audio/VolumeCharacteristic.java new file mode 100644 index 000000000..9358f4d0c --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/audio/VolumeCharacteristic.java @@ -0,0 +1,37 @@ +package io.github.hapjava.characteristics.impl.audio; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * A Volume characteristic allows the control of input or output volume of an audio input or output + * accessory respectively. The value of this characteristic indicates the percentage of the maximum + * volume supported by the service. + * + * @author Eugen Freiter + */ +public class VolumeCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { + + public VolumeCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000119-0000-1000-8000-0026BB765291", + "volume", + 0, + 100, + "percentage", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEnum.java new file mode 100644 index 000000000..12f600f92 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEnum.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Single Press” 1 ”Double Press” 2 ”Long Press” 3-255 ”Reserved” */ +public enum ProgrammableSwitchEnum implements CharacteristicEnum { + SINGLE_PRESS(0), + DOUBLE_PRESS(1), + LONG_PRESS(3); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(ProgrammableSwitchEnum.values()) + .collect(Collectors.toMap(ProgrammableSwitchEnum::getCode, t -> t)); + } + + public static ProgrammableSwitchEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + ProgrammableSwitchEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEventCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEventCharacteristic.java new file mode 100644 index 000000000..cce06ab07 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEventCharacteristic.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.common; + +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; + +/** + * This characteristic describes an event generated by a programmable switch. Reading this + * characteristic must return the last event triggered for BLE. For IP accessories, the accessory + * must set the value of Paired Read to null(i.e. ”value” : null) in the attribute database. A read + * of this characteristic must always return a null value for IP accessories. The value must only be + * reported in the events (”ev”) property.. + * + * @author Eugen Freiter + */ +public class ProgrammableSwitchEventCharacteristic + extends EnumCharacteristic { + + public ProgrammableSwitchEventCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000073-0000-1000-8000-0026BB765291", + "Switch Event", + 2, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentSlatStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentSlatStateCharacteristic.java new file mode 100644 index 000000000..32e897d8b --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentSlatStateCharacteristic.java @@ -0,0 +1,26 @@ +package io.github.hapjava.characteristics.impl.slat; + +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; + +/** This characteristic describes the current state of the slats. */ +public class CurrentSlatStateCharacteristic extends EnumCharacteristic { + + public CurrentSlatStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000AA-0000-1000-8000-0026BB765291", + "current slat state", + 2, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentSlatStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentSlatStateEnum.java new file mode 100644 index 000000000..a94fd4d8e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentSlatStateEnum.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.slat; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Fixed” 1 ”Jammed” 2 ”Swinging” */ +public enum CurrentSlatStateEnum implements CharacteristicEnum { + FIXED(0), + JAMMED(1), + SWINGING(2); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CurrentSlatStateEnum.values()) + .collect(Collectors.toMap(CurrentSlatStateEnum::getCode, t -> t)); + } + + public static CurrentSlatStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CurrentSlatStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentTiltAngleCharacteristic.java new file mode 100644 index 000000000..13dbf93c3 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentTiltAngleCharacteristic.java @@ -0,0 +1,34 @@ +package io.github.hapjava.characteristics.impl.slat; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * etc. This characteristic takes values between -90 and 90. A value of 0 indicates that the slats + * are rotated to be fully open. At value 0 the user-facing edge and the window-facing edge are + * perpendicular to the window. + */ +public class CurrentTiltAngleCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public CurrentTiltAngleCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000C1-0000-1000-8000-0026BB765291", + "current tilt angle", + -90, + 90, + "arcdegrees", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeCharacteristic.java new file mode 100644 index 000000000..b995406a6 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeCharacteristic.java @@ -0,0 +1,25 @@ +package io.github.hapjava.characteristics.impl.slat; + +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** + * TThis characteristic describes the type of the slats. If the slats can tilt on a horizontal axis, + * the value of this characteristic must be set to Horizontal. If the slats can tilt on a vertical + * axis, the value of this characteristic must be set to Vertical. + */ +public class SlatTypeCharacteristic extends EnumCharacteristic { + + public SlatTypeCharacteristic(Supplier> getter) { + super( + "000000C0-0000-1000-8000-0026BB765291", + "slat type", + 1, + Optional.of(getter), + Optional.empty(), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeEnum.java new file mode 100644 index 000000000..2634b0ef5 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeEnum.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.slat; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Horizontal” 1 ”Vertical” */ +public enum SlatTypeEnum implements CharacteristicEnum { + HORIZONTAL(0), + VERTICAL(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(SlatTypeEnum.values()) + .collect(Collectors.toMap(SlatTypeEnum::getCode, t -> t)); + } + + public static SlatTypeEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + SlatTypeEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/slat/TargetTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/slat/TargetTiltAngleCharacteristic.java new file mode 100644 index 000000000..40b5e7566 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/slat/TargetTiltAngleCharacteristic.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.slat; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.IntegerCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This characteristic describes the target angle of slats for accessories such as windows, fans, + * portable heater/coolers etc. + */ +public class TargetTiltAngleCharacteristic extends IntegerCharacteristic + implements EventableCharacteristic { + + public TargetTiltAngleCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000C2-0000-1000-8000-0026BB765291", + "target tilt angle", + -90, + 90, + "arcdegrees", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/DoorbellService.java b/src/main/java/io/github/hapjava/services/impl/DoorbellService.java new file mode 100644 index 000000000..9e0591ba7 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/DoorbellService.java @@ -0,0 +1,63 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.DoorbellAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithBrightness; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithVolume; +import io.github.hapjava.characteristics.impl.audio.VolumeCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.ProgrammableSwitchEventCharacteristic; +import io.github.hapjava.characteristics.impl.lightbulb.BrightnessCharacteristic; + +/** + * The Doorbell service describes a doorbell and is the primary service of the Video Doorbell + * Profile. + * + * @author Eugen Freiter + */ +public class DoorbellService extends AbstractServiceImpl { + + public DoorbellService(ProgrammableSwitchEventCharacteristic switchEvent) { + super("00000121-0000-1000-8000-0026BB765291"); + addCharacteristic(switchEvent); + } + + public DoorbellService(DoorbellAccessory accessory) { + this( + new ProgrammableSwitchEventCharacteristic( + accessory::getSwitchEvent, + accessory::subscribeSwitchEvent, + accessory::unsubscribeSwitchEvent)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithBrightness) { + addOptionalCharacteristic( + new BrightnessCharacteristic( + ((AccessoryWithBrightness) accessory)::getBrightness, + ((AccessoryWithBrightness) accessory)::setBrightness, + ((AccessoryWithBrightness) accessory)::subscribeBrightness, + ((AccessoryWithBrightness) accessory)::unsubscribeBrightness)); + } + if (accessory instanceof AccessoryWithVolume) { + addOptionalCharacteristic( + new VolumeCharacteristic( + ((AccessoryWithVolume) accessory)::getVolume, + ((AccessoryWithVolume) accessory)::setVolume, + ((AccessoryWithVolume) accessory)::subscribeVolume, + ((AccessoryWithVolume) accessory)::unsubscribeVolume)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(BrightnessCharacteristic brightness) { + addCharacteristic(brightness); + } + + public void addOptionalCharacteristic(VolumeCharacteristic volume) { + addCharacteristic(volume); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/MicrophoneService.java b/src/main/java/io/github/hapjava/services/impl/MicrophoneService.java new file mode 100644 index 000000000..741af556f --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/MicrophoneService.java @@ -0,0 +1,49 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.MicrophoneAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithVolume; +import io.github.hapjava.characteristics.impl.audio.MuteCharacteristic; +import io.github.hapjava.characteristics.impl.audio.MuteEnum; +import io.github.hapjava.characteristics.impl.audio.VolumeCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; + +/** + * A Microphone service is used to control the sourcing of the input audio – primarily through a + * microphone. + */ +public class MicrophoneService extends AbstractServiceImpl { + + public MicrophoneService(MuteCharacteristic muteCharacteristic) { + super("00000112-0000-1000-8000-0026BB765291"); + addCharacteristic(muteCharacteristic); + } + + public MicrophoneService(MicrophoneAccessory accessory) { + this( + new MuteCharacteristic( + () -> accessory.isMuted().thenApply(s -> s ? MuteEnum.ON : MuteEnum.OFF), + (v) -> accessory.setMute(v == MuteEnum.ON), + accessory::subscribeMuteState, + accessory::unsubscribeMuteState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithVolume) { + addOptionalCharacteristic( + new VolumeCharacteristic( + ((AccessoryWithVolume) accessory)::getVolume, + ((AccessoryWithVolume) accessory)::setVolume, + ((AccessoryWithVolume) accessory)::subscribeVolume, + ((AccessoryWithVolume) accessory)::unsubscribeVolume)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(VolumeCharacteristic volume) { + addCharacteristic(volume); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/SlatService.java b/src/main/java/io/github/hapjava/services/impl/SlatService.java new file mode 100644 index 000000000..486029d00 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/SlatService.java @@ -0,0 +1,81 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.SlatAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCurrentTilting; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithSwingMode; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithTargetTilting; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; +import io.github.hapjava.characteristics.impl.fan.SwingModeCharacteristic; +import io.github.hapjava.characteristics.impl.slat.CurrentSlatStateCharacteristic; +import io.github.hapjava.characteristics.impl.slat.CurrentTiltAngleCharacteristic; +import io.github.hapjava.characteristics.impl.slat.SlatTypeCharacteristic; +import io.github.hapjava.characteristics.impl.slat.TargetTiltAngleCharacteristic; + +/** + * This service describes a slat which tilts on a vertical or a horizontal axis. ”Current Tilt + * Angle” and ”Target Tilt Angle”may be included in this service if the user can set the slats to a + * particular tilt angle. + */ +public class SlatService extends AbstractServiceImpl { + + public SlatService( + CurrentSlatStateCharacteristic state, SlatTypeCharacteristic slatTypeCharacteristic) { + super("000000B9-0000-1000-8000-0026BB765291"); + addCharacteristic(state); + addCharacteristic(slatTypeCharacteristic); + } + + public SlatService(SlatAccessory accessory) { + this( + new CurrentSlatStateCharacteristic( + accessory::getSlatState, + accessory::subscribeSlatState, + accessory::unsubscribeSlatState), + new SlatTypeCharacteristic(accessory::getSlatType)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithSwingMode) { + addOptionalCharacteristic( + new SwingModeCharacteristic( + ((AccessoryWithSwingMode) accessory)::getSwingMode, + ((AccessoryWithSwingMode) accessory)::setSwingMode, + ((AccessoryWithSwingMode) accessory)::subscribeSwingMode, + ((AccessoryWithSwingMode) accessory)::unsubscribeSwingMode)); + } + if (accessory instanceof AccessoryWithCurrentTilting) { + addOptionalCharacteristic( + new CurrentTiltAngleCharacteristic( + ((AccessoryWithCurrentTilting) accessory)::getCurrentTiltAngle, + ((AccessoryWithCurrentTilting) accessory)::subscribeCurrentTiltAngle, + ((AccessoryWithCurrentTilting) accessory)::unsubscribeCurrentTiltAngle)); + } + if (accessory instanceof AccessoryWithTargetTilting) { + addOptionalCharacteristic( + new TargetTiltAngleCharacteristic( + ((AccessoryWithTargetTilting) accessory)::getTargetTiltAngle, + ((AccessoryWithTargetTilting) accessory)::setTargetTiltAngle, + ((AccessoryWithTargetTilting) accessory)::subscribeTargetTiltAngle, + ((AccessoryWithTargetTilting) accessory)::unsubscribeTargetTiltAngle)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(SwingModeCharacteristic mode) { + addCharacteristic(mode); + } + + public void addOptionalCharacteristic( + TargetTiltAngleCharacteristic targetTiltAngleCharacteristic) { + addCharacteristic(targetTiltAngleCharacteristic); + } + + public void addOptionalCharacteristic( + CurrentTiltAngleCharacteristic currentTiltAngleCharacteristic) { + addCharacteristic(currentTiltAngleCharacteristic); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/SpeakerService.java b/src/main/java/io/github/hapjava/services/impl/SpeakerService.java new file mode 100644 index 000000000..b92eb4d4b --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/SpeakerService.java @@ -0,0 +1,46 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.SpeakerAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithVolume; +import io.github.hapjava.characteristics.impl.audio.MuteCharacteristic; +import io.github.hapjava.characteristics.impl.audio.MuteEnum; +import io.github.hapjava.characteristics.impl.audio.VolumeCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; + +/** A Speaker service is to use to control the audio output settings on a speaker device. */ +public class SpeakerService extends AbstractServiceImpl { + + public SpeakerService(MuteCharacteristic muteCharacteristic) { + super("00000113-0000-1000-8000-0026BB765291"); + addCharacteristic(muteCharacteristic); + } + + public SpeakerService(SpeakerAccessory accessory) { + this( + new MuteCharacteristic( + () -> accessory.isMuted().thenApply(s -> s ? MuteEnum.ON : MuteEnum.OFF), + (v) -> accessory.setMute(v == MuteEnum.ON), + accessory::subscribeMuteState, + accessory::unsubscribeMuteState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithVolume) { + addOptionalCharacteristic( + new VolumeCharacteristic( + ((AccessoryWithVolume) accessory)::getVolume, + ((AccessoryWithVolume) accessory)::setVolume, + ((AccessoryWithVolume) accessory)::subscribeVolume, + ((AccessoryWithVolume) accessory)::unsubscribeVolume)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(VolumeCharacteristic volume) { + addCharacteristic(volume); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/StatelessProgrammableSwitchService.java b/src/main/java/io/github/hapjava/services/impl/StatelessProgrammableSwitchService.java new file mode 100644 index 000000000..d2ef1e337 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/StatelessProgrammableSwitchService.java @@ -0,0 +1,46 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.StatelessProgrammableSwitchAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithServiceLabelIndex; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.ProgrammableSwitchEventCharacteristic; +import io.github.hapjava.characteristics.impl.common.ServiceLabelIndexCharacteristic; + +/** + * This service describes a stateless programmable switch. + * + * @author Eugen Freiter + */ +public class StatelessProgrammableSwitchService extends AbstractServiceImpl { + + public StatelessProgrammableSwitchService(ProgrammableSwitchEventCharacteristic switchEvent) { + super("00000089-0000-1000-8000-0026BB765291"); + addCharacteristic(switchEvent); + } + + public StatelessProgrammableSwitchService(StatelessProgrammableSwitchAccessory accessory) { + this( + new ProgrammableSwitchEventCharacteristic( + accessory::getSwitchEvent, + accessory::subscribeSwitchEvent, + accessory::unsubscribeSwitchEvent)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithServiceLabelIndex) { + addOptionalCharacteristic( + new ServiceLabelIndexCharacteristic( + ((AccessoryWithServiceLabelIndex) accessory)::getServiceLabelIndex)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic( + ServiceLabelIndexCharacteristic serviceLabelIndexCharacteristic) { + addCharacteristic(serviceLabelIndexCharacteristic); + } +} From 8aa99f1c5f5556dac3bbfa1f28d0c063d9808326 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Wed, 29 Apr 2020 14:08:09 +0200 Subject: [PATCH 11/23] update readme Signed-off-by: Eugen Freiter --- README.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4a2d3f319..05fc09fad 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,6 @@ HAP-Java is a Java implementation of the Homekit Accessory Protocol. Using this library, you can create your own Homekit Accessory or Homekit Accessory Bridge. -Because the MFi Specification is closed to individual developers, and this implementation was made without access to that specification, it may not be complete. iOS devices do recognize and are able to interact with accessories exposed via this library however. - This library would not have been possible without [Tian Zhang](https://github.com/KhaosT) who did a lot of the hard work of figuring out how the protocol works in his NodeJS implementation. Usage @@ -19,4 +17,58 @@ Include HAP-Java in your project using maven: ``` -After that, read the [Javadoc](http://beowulfe.github.io/HAP-Java/apidocs/) and check out the [Sample](https://github.com/beowulfe/HAP-Java/tree/sample). \ No newline at end of file +After that, read the [Javadoc](http://beowulfe.github.io/HAP-Java/apidocs/) and check out the [Sample](https://github.com/beowulfe/HAP-Java/tree/sample). + +Supported HomeKit Accessories +========= + +Current implementation is based on HAP specification Release R2 (published 2019-07-26) +fully supports 29 out of 48 HomeKit accessories defined there. + +| HomeKit Accessory | Supported by Java-HAP | +|--------------------|--------------------| +| Accessory Information | :white_check_mark: yes | +| Air Purifier | :x: no | +| Air Quality Sensor | :x: no | +| Audio Stream Management | :x: no | +| Battery Service | :white_check_mark: yes | +| Camera RTP Stream Management | :x: no | +| Carbon Dioxide Sensor | :white_check_mark: yes | +| Carbon Monoxide Sensor | :white_check_mark: yes | +| Contact Sensor | :white_check_mark: yes | +| Data Stream Transport Management | :x: no | +| Door | :white_check_mark: yes | +| Doorbell | :white_check_mark: yes | +| Fan | :white_check_mark: yes | +| Faucet | :x: no | +| Filter Maintenance | :x: no | +| Garage Door Opener | :white_check_mark: yes | +| HAP Protocol Information | :x: no | +| Heater Cooler | :x: no | +| Humidifier Dehumidifier | :x: no | +| Humidity Sensor | :white_check_mark: yes | +| Irrigation System | :x: no | +| Leak Sensor | :white_check_mark: yes | +| Light Bulb | :white_check_mark: yes | +| Light Sensor | :white_check_mark: yes | +| Lock Management | :x: no | +| Lock Mechanism | :white_check_mark: yes | +| Microphone | :white_check_mark: yes | +| Motion Sensor | :white_check_mark: yes | +| Occupancy Sensor | :white_check_mark: yes | +| Outlet | :white_check_mark: yes | +| Security System | :white_check_mark: yes | +| Service Label | :x: no | +| Siri | :x: no | +| Slat | :white_check_mark: yes | +| Smoke Sensor | :white_check_mark: yes | +| Speaker | :white_check_mark: yes | +| Stateless Programmable Switch | :white_check_mark: yes | +| Switch | :white_check_mark: yes | +| Target Control | :x: no | +| Target Control Management | :x: no | +| Temperature Sensor | :white_check_mark: yes | +| Thermostat | :white_check_mark: yes | +| Valve | :white_check_mark: yes | +| Window | :white_check_mark: yes | +| Window Covering | :white_check_mark: yes | \ No newline at end of file From ee4fb0c567701e038ada8fa42f7879087cd4b372 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Wed, 29 Apr 2020 15:32:50 +0200 Subject: [PATCH 12/23] add air purifier and air quality Signed-off-by: Eugen Freiter --- README.md | 94 +++++----- .../accessories/AirPurifierAccessory.java | 90 ++++++++++ .../accessories/AirQualityAccessory.java | 39 +++++ .../accessories/LockMechanismAccessory.java | 4 +- .../AccessoryWithNitrogenDioxideDensity.java | 29 ++++ .../AccessoryWithOzoneDensity.java | 29 ++++ .../AccessoryWithPM10Density.java | 29 ++++ .../AccessoryWithPM25Density.java | 29 ++++ .../AccessoryWithSulphurDioxideDensity.java | 29 ++++ .../AccessoryWithVOCDensity.java | 29 ++++ .../CurrentAirPurifierCharacteristic.java | 27 +++ .../CurrentAirPurifierStateEnum.java | 36 ++++ .../TargetAirPurifierStateCharacteristic.java | 37 ++++ .../TargetAirPurifierStateEnum.java | 33 ++++ .../airquality/AirQualityCharacteristic.java | 26 +++ .../impl/airquality/AirQualityEnum.java | 39 +++++ .../NitrogenDioxideDensityCharacteristic.java | 29 ++++ .../OzoneDensityCharacteristic.java | 29 ++++ .../airquality/PM10DensityCharacteristic.java | 31 ++++ .../airquality/PM25DensityCharacteristic.java | 31 ++++ .../SulphurDioxideDensityCharacteristic.java | 29 ++++ .../airquality/VOCDensityCharacteristic.java | 29 ++++ .../services/impl/AirPurifierService.java | 89 ++++++++++ .../services/impl/AirQualityService.java | 163 ++++++++++++++++++ 24 files changed, 980 insertions(+), 49 deletions(-) create mode 100644 src/main/java/io/github/hapjava/accessories/AirPurifierAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/AirQualityAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithNitrogenDioxideDensity.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithOzoneDensity.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM10Density.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM25Density.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSulphurDioxideDensity.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVOCDensity.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airquality/NitrogenDioxideDensityCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airquality/OzoneDensityCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airquality/PM10DensityCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airquality/PM25DensityCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airquality/SulphurDioxideDensityCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/airquality/VOCDensityCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/services/impl/AirPurifierService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/AirQualityService.java diff --git a/README.md b/README.md index 05fc09fad..8f516a4ac 100644 --- a/README.md +++ b/README.md @@ -22,53 +22,53 @@ After that, read the [Javadoc](http://beowulfe.github.io/HAP-Java/apidocs/) and Supported HomeKit Accessories ========= -Current implementation is based on HAP specification Release R2 (published 2019-07-26) -fully supports 29 out of 48 HomeKit accessories defined there. +Current implementation is based on HAP specification Release R2 (published 2019-07-26) and +fully supports 31 out of 48 HomeKit accessories defined there. | HomeKit Accessory | Supported by Java-HAP | |--------------------|--------------------| -| Accessory Information | :white_check_mark: yes | -| Air Purifier | :x: no | -| Air Quality Sensor | :x: no | -| Audio Stream Management | :x: no | -| Battery Service | :white_check_mark: yes | -| Camera RTP Stream Management | :x: no | -| Carbon Dioxide Sensor | :white_check_mark: yes | -| Carbon Monoxide Sensor | :white_check_mark: yes | -| Contact Sensor | :white_check_mark: yes | -| Data Stream Transport Management | :x: no | -| Door | :white_check_mark: yes | -| Doorbell | :white_check_mark: yes | -| Fan | :white_check_mark: yes | -| Faucet | :x: no | -| Filter Maintenance | :x: no | -| Garage Door Opener | :white_check_mark: yes | -| HAP Protocol Information | :x: no | -| Heater Cooler | :x: no | -| Humidifier Dehumidifier | :x: no | -| Humidity Sensor | :white_check_mark: yes | -| Irrigation System | :x: no | -| Leak Sensor | :white_check_mark: yes | -| Light Bulb | :white_check_mark: yes | -| Light Sensor | :white_check_mark: yes | -| Lock Management | :x: no | -| Lock Mechanism | :white_check_mark: yes | -| Microphone | :white_check_mark: yes | -| Motion Sensor | :white_check_mark: yes | -| Occupancy Sensor | :white_check_mark: yes | -| Outlet | :white_check_mark: yes | -| Security System | :white_check_mark: yes | -| Service Label | :x: no | -| Siri | :x: no | -| Slat | :white_check_mark: yes | -| Smoke Sensor | :white_check_mark: yes | -| Speaker | :white_check_mark: yes | -| Stateless Programmable Switch | :white_check_mark: yes | -| Switch | :white_check_mark: yes | -| Target Control | :x: no | -| Target Control Management | :x: no | -| Temperature Sensor | :white_check_mark: yes | -| Thermostat | :white_check_mark: yes | -| Valve | :white_check_mark: yes | -| Window | :white_check_mark: yes | -| Window Covering | :white_check_mark: yes | \ No newline at end of file +| Accessory Information | :white_check_mark: | +| Air Purifier | :white_check_mark: | +| Air Quality Sensor | :white_check_mark: | +| Audio Stream Management | :x: | +| Battery Service | :white_check_mark: | +| Camera RTP Stream Management | :x: | +| Carbon Dioxide Sensor | :white_check_mark: | +| Carbon Monoxide Sensor | :white_check_mark: | +| Contact Sensor | :white_check_mark: | +| Data Stream Transport Management | :x: | +| Door | :white_check_mark: | +| Doorbell | :white_check_mark: | +| Fan | :white_check_mark: | +| Faucet | :x: | +| Filter Maintenance | :x: | +| Garage Door Opener | :white_check_mark: | +| HAP Protocol Information | :x: | +| Heater Cooler | :x: | +| Humidifier Dehumidifier | :x: | +| Humidity Sensor | :white_check_mark: | +| Irrigation System | :x: | +| Leak Sensor | :white_check_mark: | +| Light Bulb | :white_check_mark: | +| Light Sensor | :white_check_mark: | +| Lock Management | :x: | +| Lock Mechanism | :white_check_mark: | +| Microphone | :white_check_mark: | +| Motion Sensor | :white_check_mark: | +| Occupancy Sensor | :white_check_mark: | +| Outlet | :white_check_mark: | +| Security System | :white_check_mark: | +| Service Label | :x: | +| Siri | :x: | +| Slat | :white_check_mark: | +| Smoke Sensor | :white_check_mark: | +| Speaker | :white_check_mark: | +| Stateless Programmable Switch | :white_check_mark: | +| Switch | :white_check_mark: | +| Target Control | :x: | +| Target Control Management | :x: | +| Temperature Sensor | :white_check_mark: | +| Thermostat | :white_check_mark: | +| Valve | :white_check_mark: | +| Window | :white_check_mark: | +| Window Covering | :white_check_mark: | \ No newline at end of file diff --git a/src/main/java/io/github/hapjava/accessories/AirPurifierAccessory.java b/src/main/java/io/github/hapjava/accessories/AirPurifierAccessory.java new file mode 100644 index 000000000..a96db6e33 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/AirPurifierAccessory.java @@ -0,0 +1,90 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.airpurifier.CurrentAirPurifierStateEnum; +import io.github.hapjava.characteristics.impl.airpurifier.TargetAirPurifierStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.AirPurifierService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * An air purifier. + * + * @author Eugen Freiter + */ +public interface AirPurifierAccessory extends HomekitAccessory { + /** + * Mandatory: Retrieves the current active state of the fan'. + * + * @return a future that will contain the binary state + */ + CompletableFuture isActive(); + + /** + * Sets the active state of the fan + * + * @param state the binary state to set + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setActive(boolean state) throws Exception; + + /** + * Subscribes to changes in the active state of the fan. + * + * @param callback the function to call when the direction changes. + */ + void subscribeActive(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the active state of the fan. */ + void unsubscribeActive(); + + /** + * Retrieves the current state of the air purifier + * + * @return a future that will contain the state + */ + CompletableFuture getCurrentState(); + + /** + * Subscribes to changes in the state of the air purifier. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the state of the air purifier. */ + void unsubscribeCurrentState(); + + /** + * Retrieves the air purifier target state. + * + * @return a future that will contain the air purifier target state . + */ + CompletableFuture getTargetState(); + + /** + * set target state the air purifier target state. + * + * @param state air purifier target state + * @return a future that completes when the change is made + */ + CompletableFuture setTargetState(TargetAirPurifierStateEnum state); + + /** + * Subscribes to changes in the target state of the air purifier. + * + * @param callback the function to call when the target state changes. + */ + void subscribeTargetState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the target state of the air purifier. */ + void unsubscribeTargetState(); + + @Override + default Collection getServices() { + return Collections.singleton(new AirPurifierService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/AirQualityAccessory.java b/src/main/java/io/github/hapjava/accessories/AirQualityAccessory.java new file mode 100644 index 000000000..fca769272 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/AirQualityAccessory.java @@ -0,0 +1,39 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.airquality.AirQualityEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.AirQualityService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * An air quality accessory which can include several sensors. + * + * @author Eugen Freiter + */ +public interface AirQualityAccessory extends HomekitAccessory { + + /** + * Retrieves the state of the air quality + * + * @return a future that will contain the state + */ + CompletableFuture getAirQuality(); + + /** + * Subscribes to changes in the air quality + * + * @param callback the function to call when the air quality changes. + */ + void subscribeAirQuality(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the air quality. */ + void unsubscribeAirQuality(); + + @Override + default Collection getServices() { + return Collections.singleton(new AirQualityService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java b/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java index 30d2e460f..fb3dcf9aa 100644 --- a/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java @@ -24,14 +24,14 @@ public interface LockMechanismAccessory extends HomekitAccessory { CompletableFuture getLockCurrentState(); /** - * Retrieves the lock trget state. + * Retrieves the lock target state. * * @return a future that will contain the lock target state . */ CompletableFuture getLockTargetState(); /** - * set lock target state the lock trget state. + * set lock target state the lock target state. * * @param state lock target state * @return a future that completes when the change is made diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithNitrogenDioxideDensity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithNitrogenDioxideDensity.java new file mode 100644 index 000000000..f90969d2d --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithNitrogenDioxideDensity.java @@ -0,0 +1,29 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with nitrogen dioxide density characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithNitrogenDioxideDensity { + + /** + * Retrieves the nitrogen dioxide density. + * + * @return a future with the nitrogen dioxide density + */ + CompletableFuture getNitrogenDioxideDensity(); + + /** + * Subscribes to changes in nitrogen dioxide density. + * + * @param callback the function when nitrogen dioxide density changes + */ + void subscribeNitrogenDioxideDensity(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeNitrogenDioxideDensity(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithOzoneDensity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithOzoneDensity.java new file mode 100644 index 000000000..149547b27 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithOzoneDensity.java @@ -0,0 +1,29 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with Ozone Density characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithOzoneDensity { + + /** + * Retrieves the ozone density. + * + * @return a future with the ozone density + */ + CompletableFuture getOzoneDensity(); + + /** + * Subscribes to changes in ozone density. + * + * @param callback the function when ozone density changes + */ + void subscribeOzoneDensity(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeOzoneDensity(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM10Density.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM10Density.java new file mode 100644 index 000000000..380251371 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM10Density.java @@ -0,0 +1,29 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with PM10 Density characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithPM10Density { + + /** + * Retrieves the PM10 density. + * + * @return a future with the PM10 density + */ + CompletableFuture getPM10Density(); + + /** + * Subscribes to changes in PM10 density. + * + * @param callback the function when PM10 density changes + */ + void subscribePM10Density(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribePM10Density(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM25Density.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM25Density.java new file mode 100644 index 000000000..1203e0bfc --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM25Density.java @@ -0,0 +1,29 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with PM25 Density characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithPM25Density { + + /** + * Retrieves the PM25 density. + * + * @return a future with the PM25 density + */ + CompletableFuture getPM25Density(); + + /** + * Subscribes to changes in PM25 density. + * + * @param callback the function when PM25 density changes + */ + void subscribePM25Density(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribePM25Density(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSulphurDioxideDensity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSulphurDioxideDensity.java new file mode 100644 index 000000000..7d9473bfd --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSulphurDioxideDensity.java @@ -0,0 +1,29 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with sulphur dioxide density characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithSulphurDioxideDensity { + + /** + * Retrieves the sulphur dioxide density. + * + * @return a future with the sulphur dioxide density + */ + CompletableFuture getSulphurDioxideDensity(); + + /** + * Subscribes to changes in sulphur dioxide density. + * + * @param callback the function when sulphur dioxide density changes + */ + void subscribeSulphurDioxideDensity(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeSulphurDioxideDensity(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVOCDensity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVOCDensity.java new file mode 100644 index 000000000..fde95da7a --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVOCDensity.java @@ -0,0 +1,29 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with VOC Density characteristic. + * + * @author Eugen Freiter + */ +public interface AccessoryWithVOCDensity { + + /** + * Retrieves the VOC density. + * + * @return a future with the VOC density + */ + CompletableFuture getVOCDensity(); + + /** + * Subscribes to changes in VOC density. + * + * @param callback the function when VOC density changes + */ + void subscribeVOCDensity(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes */ + void unsubscribeVOCDensity(); +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierCharacteristic.java new file mode 100644 index 000000000..b6d4cf393 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierCharacteristic.java @@ -0,0 +1,27 @@ +package io.github.hapjava.characteristics.impl.airpurifier; + +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; + +/** This characteristic describes the current state of the air purifier. */ +public class CurrentAirPurifierCharacteristic + extends EnumCharacteristic { + + public CurrentAirPurifierCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000A9-0000-1000-8000-0026BB765291", + "current air purifier state", + 2, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierStateEnum.java new file mode 100644 index 000000000..ce4d8cc0d --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierStateEnum.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.airpurifier; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Inactive” 1 ”Idle” 2 ”Purifying Air” */ +public enum CurrentAirPurifierStateEnum implements CharacteristicEnum { + INACTIVE(0), + IDLE(1), + PURIFYING_AIR(2); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CurrentAirPurifierStateEnum.values()) + .collect(Collectors.toMap(CurrentAirPurifierStateEnum::getCode, t -> t)); + } + + public static CurrentAirPurifierStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CurrentAirPurifierStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateCharacteristic.java new file mode 100644 index 000000000..680c933bc --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateCharacteristic.java @@ -0,0 +1,37 @@ +package io.github.hapjava.characteristics.impl.airpurifier; + +import io.github.hapjava.characteristics.ExceptionalConsumer; +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; + +/** This characteristic describes the target state of the air purifier. */ +public class TargetAirPurifierStateCharacteristic + extends EnumCharacteristic { + + public TargetAirPurifierStateCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000A8-0000-1000-8000-0026BB765291", + "Air purifier state", + 1, + 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)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateEnum.java new file mode 100644 index 000000000..a20a73e9f --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateEnum.java @@ -0,0 +1,33 @@ +package io.github.hapjava.characteristics.impl.airpurifier; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Manual” 1 ”Auto” */ +public enum TargetAirPurifierStateEnum implements CharacteristicEnum { + MANUAL(0), + AUTO(1); + private static final Map reverse; + + static { + reverse = + Arrays.stream(TargetAirPurifierStateEnum.values()) + .collect(Collectors.toMap(t -> t.getCode(), t -> t)); + } + + public static TargetAirPurifierStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + private TargetAirPurifierStateEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityCharacteristic.java new file mode 100644 index 000000000..b701e7346 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityCharacteristic.java @@ -0,0 +1,26 @@ +package io.github.hapjava.characteristics.impl.airquality; + +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; + +/** This characteristic describes the subject assessment of air quality by an accessory. */ +public class AirQualityCharacteristic extends EnumCharacteristic { + + public AirQualityCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "00000095-0000-1000-8000-0026BB765291", + "air quality", + 5, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityEnum.java new file mode 100644 index 000000000..c688065af --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityEnum.java @@ -0,0 +1,39 @@ +package io.github.hapjava.characteristics.impl.airquality; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Unknown” 1 ”Excellent” 2 ”Good” 3 ”Fair” 4 ”Inferior” 5 ”Poor” */ +public enum AirQualityEnum implements CharacteristicEnum { + UNKNOWN(0), + EXCELLENT(1), + GOOD(0), + FAIR(1), + INFERIOR(1), + POOR(5); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(AirQualityEnum.values()) + .collect(Collectors.toMap(AirQualityEnum::getCode, t -> t)); + } + + public static AirQualityEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + AirQualityEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/NitrogenDioxideDensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/NitrogenDioxideDensityCharacteristic.java new file mode 100644 index 000000000..657fa7fbf --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/NitrogenDioxideDensityCharacteristic.java @@ -0,0 +1,29 @@ +package io.github.hapjava.characteristics.impl.airquality; + +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; + +/** This characteristic indicates the current NO2 density in micrograms/m3. */ +public class NitrogenDioxideDensityCharacteristic extends FloatCharacteristic { + + public NitrogenDioxideDensityCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000C4-0000-1000-8000-0026BB765291", + "nitrogen dioxide density", + 0, + 1000, + 1, + "micrograms", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/OzoneDensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/OzoneDensityCharacteristic.java new file mode 100644 index 000000000..fd8372708 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/OzoneDensityCharacteristic.java @@ -0,0 +1,29 @@ +package io.github.hapjava.characteristics.impl.airquality; + +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; + +/** This characteristic indicates the current ozone density in micrograms/m3. */ +public class OzoneDensityCharacteristic extends FloatCharacteristic { + + public OzoneDensityCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000C3-0000-1000-8000-0026BB765291", + "ozone density", + 0, + 1000, + 1, + "micrograms", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM10DensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM10DensityCharacteristic.java new file mode 100644 index 000000000..0ff36d0e2 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM10DensityCharacteristic.java @@ -0,0 +1,31 @@ +package io.github.hapjava.characteristics.impl.airquality; + +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; + +/** + * This characteristic indicates the current PM10 micrometer particulate density in micrograms/m3. + */ +public class PM10DensityCharacteristic extends FloatCharacteristic { + + public PM10DensityCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000C7-0000-1000-8000-0026BB765291", + "PM10 density", + 0, + 1000, + 1, + "micrograms", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM25DensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM25DensityCharacteristic.java new file mode 100644 index 000000000..fc5c1d181 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM25DensityCharacteristic.java @@ -0,0 +1,31 @@ +package io.github.hapjava.characteristics.impl.airquality; + +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; + +/** + * This characteristic indicates the current PM2.5 micrometer particulate density in micrograms/m3. + */ +public class PM25DensityCharacteristic extends FloatCharacteristic { + + public PM25DensityCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000C6-0000-1000-8000-0026BB765291", + "PM2.5 density", + 0, + 1000, + 1, + "micrograms", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/SulphurDioxideDensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/SulphurDioxideDensityCharacteristic.java new file mode 100644 index 000000000..0c46dbb99 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/SulphurDioxideDensityCharacteristic.java @@ -0,0 +1,29 @@ +package io.github.hapjava.characteristics.impl.airquality; + +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; + +/** This characteristic indicates the current SO2 density in micrograms/m3. */ +public class SulphurDioxideDensityCharacteristic extends FloatCharacteristic { + + public SulphurDioxideDensityCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000C5-0000-1000-8000-0026BB765291", + "sulphur dioxide density", + 0, + 1000, + 1, + "micrograms", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/VOCDensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/VOCDensityCharacteristic.java new file mode 100644 index 000000000..7e92ed82a --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/VOCDensityCharacteristic.java @@ -0,0 +1,29 @@ +package io.github.hapjava.characteristics.impl.airquality; + +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; + +/** This characteristic indicates the current volatile organic compound density in micrograms/m3. */ +public class VOCDensityCharacteristic extends FloatCharacteristic { + + public VOCDensityCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000C8-0000-1000-8000-0026BB765291", + "VOC density", + 0, + 1000, + 1, + "micrograms", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/AirPurifierService.java b/src/main/java/io/github/hapjava/services/impl/AirPurifierService.java new file mode 100644 index 000000000..2346cdfc9 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/AirPurifierService.java @@ -0,0 +1,89 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.AirPurifierAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithPhysicalControlsLock; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithSwingMode; +import io.github.hapjava.characteristics.impl.airpurifier.CurrentAirPurifierCharacteristic; +import io.github.hapjava.characteristics.impl.airpurifier.TargetAirPurifierStateCharacteristic; +import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.ActiveEnum; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; +import io.github.hapjava.characteristics.impl.fan.LockPhysicalControlsCharacteristic; +import io.github.hapjava.characteristics.impl.fan.RotationSpeedCharacteristic; +import io.github.hapjava.characteristics.impl.fan.SwingModeCharacteristic; + +/** This service describes an air purifier. */ +public class AirPurifierService extends AbstractServiceImpl { + + public AirPurifierService( + ActiveCharacteristic active, + CurrentAirPurifierCharacteristic currentState, + TargetAirPurifierStateCharacteristic targetState) { + super("000000BB-0000-1000-8000-0026BB765291"); + addCharacteristic(active); + addCharacteristic(currentState); + addCharacteristic(targetState); + } + + public AirPurifierService(AirPurifierAccessory accessory) { + this( + new ActiveCharacteristic( + () -> accessory.isActive().thenApply(s -> s ? ActiveEnum.ACTIVE : ActiveEnum.INACTIVE), + (v) -> accessory.setActive(v == ActiveEnum.ACTIVE), + accessory::subscribeActive, + accessory::unsubscribeActive), + new CurrentAirPurifierCharacteristic( + accessory::getCurrentState, + accessory::subscribeCurrentState, + accessory::unsubscribeCurrentState), + new TargetAirPurifierStateCharacteristic( + accessory::getTargetState, + accessory::setTargetState, + accessory::subscribeCurrentState, + accessory::unsubscribeCurrentState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithSwingMode) { + addOptionalCharacteristic( + new SwingModeCharacteristic( + ((AccessoryWithSwingMode) accessory)::getSwingMode, + ((AccessoryWithSwingMode) accessory)::setSwingMode, + ((AccessoryWithSwingMode) accessory)::subscribeSwingMode, + ((AccessoryWithSwingMode) accessory)::unsubscribeSwingMode)); + } + if (accessory instanceof AccessoryWithSwingMode) { + addOptionalCharacteristic( + new SwingModeCharacteristic( + ((AccessoryWithSwingMode) accessory)::getSwingMode, + ((AccessoryWithSwingMode) accessory)::setSwingMode, + ((AccessoryWithSwingMode) accessory)::subscribeSwingMode, + ((AccessoryWithSwingMode) accessory)::unsubscribeSwingMode)); + } + if (accessory instanceof AccessoryWithPhysicalControlsLock) { + addOptionalCharacteristic( + new LockPhysicalControlsCharacteristic( + ((AccessoryWithPhysicalControlsLock) accessory)::getLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::setLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::subscribeLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::unsubscribeLockControls)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(SwingModeCharacteristic mode) { + addCharacteristic(mode); + } + + public void addOptionalCharacteristic(RotationSpeedCharacteristic speed) { + addCharacteristic(speed); + } + + public void addOptionalCharacteristic(LockPhysicalControlsCharacteristic lock) { + addCharacteristic(lock); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/AirQualityService.java b/src/main/java/io/github/hapjava/services/impl/AirQualityService.java new file mode 100644 index 000000000..cf4a79952 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/AirQualityService.java @@ -0,0 +1,163 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.AirQualityAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithNitrogenDioxideDensity; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithOzoneDensity; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithPM10Density; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithPM25Density; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusActive; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusLowBattery; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusTampered; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithSulphurDioxideDensity; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithVOCDensity; +import io.github.hapjava.characteristics.impl.airquality.AirQualityCharacteristic; +import io.github.hapjava.characteristics.impl.airquality.NitrogenDioxideDensityCharacteristic; +import io.github.hapjava.characteristics.impl.airquality.OzoneDensityCharacteristic; +import io.github.hapjava.characteristics.impl.airquality.PM10DensityCharacteristic; +import io.github.hapjava.characteristics.impl.airquality.PM25DensityCharacteristic; +import io.github.hapjava.characteristics.impl.airquality.SulphurDioxideDensityCharacteristic; +import io.github.hapjava.characteristics.impl.airquality.VOCDensityCharacteristic; +import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; + +/** This characteristic describes the subject assessment of air quality by an accessory. */ +public class AirQualityService extends AbstractServiceImpl { + + public AirQualityService(AirQualityCharacteristic airQuality) { + super("00000096-0000-1000-8000-0026BB765291"); + addCharacteristic(airQuality); + } + + public AirQualityService(AirQualityAccessory accessory) { + this( + new AirQualityCharacteristic( + accessory::getAirQuality, + accessory::subscribeAirQuality, + accessory::unsubscribeAirQuality)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + + if (accessory instanceof AccessoryWithOzoneDensity) { + addOptionalCharacteristic( + new OzoneDensityCharacteristic( + ((AccessoryWithOzoneDensity) accessory)::getOzoneDensity, + ((AccessoryWithOzoneDensity) accessory)::subscribeOzoneDensity, + ((AccessoryWithOzoneDensity) accessory)::unsubscribeOzoneDensity)); + } + if (accessory instanceof AccessoryWithNitrogenDioxideDensity) { + addOptionalCharacteristic( + new NitrogenDioxideDensityCharacteristic( + ((AccessoryWithNitrogenDioxideDensity) accessory)::getNitrogenDioxideDensity, + ((AccessoryWithNitrogenDioxideDensity) accessory)::subscribeNitrogenDioxideDensity, + ((AccessoryWithNitrogenDioxideDensity) accessory) + ::unsubscribeNitrogenDioxideDensity)); + } + + if (accessory instanceof AccessoryWithSulphurDioxideDensity) { + addOptionalCharacteristic( + new SulphurDioxideDensityCharacteristic( + ((AccessoryWithSulphurDioxideDensity) accessory)::getSulphurDioxideDensity, + ((AccessoryWithSulphurDioxideDensity) accessory)::subscribeSulphurDioxideDensity, + ((AccessoryWithSulphurDioxideDensity) accessory)::unsubscribeSulphurDioxideDensity)); + } + if (accessory instanceof AccessoryWithPM25Density) { + addOptionalCharacteristic( + new PM25DensityCharacteristic( + ((AccessoryWithPM25Density) accessory)::getPM25Density, + ((AccessoryWithPM25Density) accessory)::subscribePM25Density, + ((AccessoryWithPM25Density) accessory)::unsubscribePM25Density)); + } + if (accessory instanceof AccessoryWithPM10Density) { + addOptionalCharacteristic( + new PM10DensityCharacteristic( + ((AccessoryWithPM10Density) accessory)::getPM10Density, + ((AccessoryWithPM10Density) accessory)::subscribePM10Density, + ((AccessoryWithPM10Density) accessory)::unsubscribePM10Density)); + } + if (accessory instanceof AccessoryWithVOCDensity) { + addOptionalCharacteristic( + new VOCDensityCharacteristic( + ((AccessoryWithVOCDensity) accessory)::getVOCDensity, + ((AccessoryWithVOCDensity) accessory)::subscribeVOCDensity, + ((AccessoryWithVOCDensity) accessory)::unsubscribeVOCDensity)); + } + if (accessory instanceof AccessoryWithStatusActive) { + addOptionalCharacteristic( + new StatusActiveCharacteristic( + ((AccessoryWithStatusActive) accessory)::getStatusActive, + ((AccessoryWithStatusActive) accessory)::subscribeStatusActive, + ((AccessoryWithStatusActive) accessory)::unsubscribeStatusActive)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } + if (accessory instanceof AccessoryWithStatusTampered) { + addOptionalCharacteristic( + new StatusTamperedCharacteristic( + ((AccessoryWithStatusTampered) accessory)::getStatusTampered, + ((AccessoryWithStatusTampered) accessory)::subscribeStatusTampered, + ((AccessoryWithStatusTampered) accessory)::unsubscribeStatusTampered)); + } + if (accessory instanceof AccessoryWithStatusLowBattery) { + addOptionalCharacteristic( + new StatusLowBatteryCharacteristic( + ((AccessoryWithStatusLowBattery) accessory)::getStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::subscribeStatusLowBattery, + ((AccessoryWithStatusLowBattery) accessory)::unsubscribeStatusLowBattery)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(OzoneDensityCharacteristic ozoneDensity) { + addCharacteristic(ozoneDensity); + } + + public void addOptionalCharacteristic(NitrogenDioxideDensityCharacteristic nitrogenDensity) { + addCharacteristic(nitrogenDensity); + } + + public void addOptionalCharacteristic(SulphurDioxideDensityCharacteristic sulphuhrDensity) { + addCharacteristic(sulphuhrDensity); + } + + public void addOptionalCharacteristic(PM25DensityCharacteristic pm25Density) { + addCharacteristic(pm25Density); + } + + public void addOptionalCharacteristic(PM10DensityCharacteristic pm10Density) { + addCharacteristic(pm10Density); + } + + public void addOptionalCharacteristic(VOCDensityCharacteristic vocDensity) { + addCharacteristic(vocDensity); + } + + public void addOptionalCharacteristic(StatusActiveCharacteristic statusActive) { + addCharacteristic(statusActive); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + + public void addOptionalCharacteristic(StatusTamperedCharacteristic statusTampered) { + addCharacteristic(statusTampered); + } + + public void addOptionalCharacteristic(StatusLowBatteryCharacteristic statusLowBattery) { + addCharacteristic(statusLowBattery); + } +} From 110a3590f3fdb43e5d878284003fe63b3a59fc35 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 3 May 2020 12:37:55 +0200 Subject: [PATCH 13/23] reduce log leve. align more with OH guidance on logging Signed-off-by: Eugen Freiter --- .../hapjava/accessories/HomekitAccessory.java | 4 ++-- .../characteristics/Characteristic.java | 4 ++-- .../impl/base/BaseCharacteristic.java | 8 +++---- .../impl/base/EnumCharacteristic.java | 2 +- .../hapjava/characteristics/package-info.java | 2 +- .../hapjava/server/HomekitAuthInfo.java | 2 +- .../hapjava/server/impl/HomekitRegistry.java | 2 +- .../hapjava/server/impl/HomekitRoot.java | 18 +++++++------- .../hapjava/server/impl/HomekitServer.java | 6 ++--- .../HomekitStandaloneAccessoryServer.java | 2 +- .../impl/connections/ConnectionImpl.java | 2 +- .../server/impl/connections/HttpSession.java | 12 +++++----- .../impl/connections/SubscriptionManager.java | 24 +++++++++---------- .../impl/http/impl/AccessoryHandler.java | 8 +++---- .../server/impl/http/impl/BinaryHandler.java | 6 ++--- .../http/impl/NettyHomekitHttpService.java | 4 ++-- .../impl/jmdns/JmdnsHomekitAdvertiser.java | 10 ++++---- .../impl/json/CharacteristicsController.java | 2 +- .../impl/pairing/HomekitSRP6Routines.java | 2 +- .../pairing/HomekitSRP6ServerSession.java | 2 +- .../impl/pairing/PairVerificationManager.java | 4 ++-- .../server/impl/pairing/PairingManager.java | 10 ++++---- .../server/impl/pairing/SrpHandler.java | 4 ++-- .../io/github/hapjava/services/Service.java | 2 +- 24 files changed, 71 insertions(+), 71 deletions(-) diff --git a/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java b/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java index 3bbde9538..f61fd223d 100644 --- a/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/HomekitAccessory.java @@ -7,7 +7,7 @@ import java.util.concurrent.CompletableFuture; /** - * Base interface for all Homekit Accessories. You can implement this interface directly, but most + * Base interface for all HomeKit Accessories. You can implement this interface directly, but most * users will prefer to use the more full featured interfaces in {@link * io.github.hapjava.accessories} which include a default implementation of {@link #getServices()}. * @@ -67,7 +67,7 @@ public interface HomekitAccessory { /** * The collection of Services this accessory supports. Services are the primary way to interact - * with the accessory via Homekit. Besides the Services offered here, the accessory will + * with the accessory via HomeKit. Besides the Services offered here, the accessory will * automatically include the required information service. * *

This method will only be useful if you're implementing your own accessory type. For the diff --git a/src/main/java/io/github/hapjava/characteristics/Characteristic.java b/src/main/java/io/github/hapjava/characteristics/Characteristic.java index ec85f8d65..f73bf345b 100644 --- a/src/main/java/io/github/hapjava/characteristics/Characteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/Characteristic.java @@ -8,7 +8,7 @@ /** * Interface for the characteristics provided by a Service. * - *

Characteristics are the lowest level building block of the Homekit Accessory Protocol. They + *

Characteristics are the lowest level building block of the HomeKit Accessory Protocol. They * define variables that can be retrieved or set by the remote client. Most consumers of this * library will be better served by using one of the characteristic classes in {@link * io.github.hapjava.characteristics} when creating custom accessory types (the standard accessories @@ -28,7 +28,7 @@ public interface Characteristic { void supplyValue(JsonObjectBuilder characteristicBuilder); /** - * Creates the JSON representation of the characteristic, in accordance with the Homekit Accessory + * Creates the JSON representation of the characteristic, in accordance with the HomeKit Accessory * Protocol. * * @param iid The instance ID of the characteristic to be included in the serialization. diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java index 6a3390d46..73ce32df4 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java @@ -77,7 +77,7 @@ public final CompletableFuture toJson(int iid) { } /** - * Creates the JSON serialized form of the accessory for use over the Homekit Accessory Protocol. + * Creates the JSON serialized form of the accessory for use over the HomeKit Accessory Protocol. * * @param instanceId the static id of the accessory. * @return a future that will complete with the JSON builder for the object. @@ -92,7 +92,7 @@ protected CompletableFuture makeBuilder(int instanceId) { return futureValue .exceptionally( t -> { - logger.error("Could not retrieve value " + this.getClass().getName(), t); + logger.warn("Could not retrieve value " + this.getClass().getName(), t); return null; }) .thenApply( @@ -126,7 +126,7 @@ public final void setValue(JsonValue jsonValue) { try { setValue(convert(jsonValue)); } catch (Exception e) { - logger.error("Error while setting JSON value", e); + logger.warn("Error while setting JSON value", e); } } @@ -136,7 +136,7 @@ public void supplyValue(JsonObjectBuilder builder) { try { setJsonValue(builder, getValue().get()); } catch (InterruptedException | ExecutionException e) { - logger.error("Error retrieving value", e); + logger.warn("Error retrieving value", e); setJsonValue(builder, getDefault()); } } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java index 395d8ed53..52eb1ccf9 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java @@ -14,7 +14,7 @@ /** * Characteristic that exposes an Enum value. Enums are represented as an Integer value in the - * Homekit protocol, and classes extending this one must handle the static mapping to an Integer + * HomeKit protocol, and classes extending this one must handle the static mapping to an Integer * value. * * @author Andy Lintner diff --git a/src/main/java/io/github/hapjava/characteristics/package-info.java b/src/main/java/io/github/hapjava/characteristics/package-info.java index a0bbf1a3f..955ab73a7 100644 --- a/src/main/java/io/github/hapjava/characteristics/package-info.java +++ b/src/main/java/io/github/hapjava/characteristics/package-info.java @@ -1,4 +1,4 @@ /** - * Contains the basic characteristic types that can be supplied over the Homekit Accessory Protocol. + * Contains the basic characteristic types that can be supplied over the HomeKit Accessory Protocol. */ package io.github.hapjava.characteristics; diff --git a/src/main/java/io/github/hapjava/server/HomekitAuthInfo.java b/src/main/java/io/github/hapjava/server/HomekitAuthInfo.java index 9eeae8fe5..a62b4e416 100644 --- a/src/main/java/io/github/hapjava/server/HomekitAuthInfo.java +++ b/src/main/java/io/github/hapjava/server/HomekitAuthInfo.java @@ -22,7 +22,7 @@ public interface HomekitAuthInfo { String getPin(); /** - * A unique MAC address to be advertised with the Homekit information. This does not have to be + * A unique MAC address to be advertised with the HomeKit information. This does not have to be * the MAC address of the network interface. You can generate this using {@link * HomekitServer#generateMac()}. * diff --git a/src/main/java/io/github/hapjava/server/impl/HomekitRegistry.java b/src/main/java/io/github/hapjava/server/impl/HomekitRegistry.java index 8c7b3d0cd..f655c1879 100644 --- a/src/main/java/io/github/hapjava/server/impl/HomekitRegistry.java +++ b/src/main/java/io/github/hapjava/server/impl/HomekitRegistry.java @@ -37,7 +37,7 @@ public synchronized void reset() { newServices.add(new AccessoryInformationService(accessory)); newServices.addAll(accessory.getServices()); } catch (Exception e) { - logger.error("Could not instantiate services for accessory " + accessory.getName(), e); + logger.warn("Could not instantiate services for accessory " + accessory.getName(), e); services.put(accessory, Collections.emptyList()); continue; } diff --git a/src/main/java/io/github/hapjava/server/impl/HomekitRoot.java b/src/main/java/io/github/hapjava/server/impl/HomekitRoot.java index bc7a2686f..c9bb97a8d 100644 --- a/src/main/java/io/github/hapjava/server/impl/HomekitRoot.java +++ b/src/main/java/io/github/hapjava/server/impl/HomekitRoot.java @@ -13,8 +13,8 @@ import org.slf4j.LoggerFactory; /** - * Provides advertising and handling for Homekit accessories. This class handles the advertising of - * Homekit accessories and contains one or more accessories. When implementing a bridge accessory, + * Provides advertising and handling for HomeKit accessories. This class handles the advertising of + * HomeKit accessories and contains one or more accessories. When implementing a bridge accessory, * you will interact with this class directly. Instantiate it via {@link * HomekitServer#createBridge(HomekitAuthInfo, String, String, String, String, String, String)}. For * single accessories, this is composed by {@link HomekitStandaloneAccessoryServer}. @@ -54,7 +54,7 @@ public class HomekitRoot { } /** - * Add an accessory to be handled and advertised by this root. Any existing Homekit connections + * Add an accessory to be handled and advertised by this root. Any existing HomeKit connections * will be terminated to allow the clients to reconnect and see the updated accessory list. When * using this for a bridge, the ID of the accessory must be greater than 1, as that ID is reserved * for the Bridge itself. @@ -77,7 +77,7 @@ public void addAccessory(HomekitAccessory accessory) { */ void addAccessorySkipRangeCheck(HomekitAccessory accessory) { this.registry.add(accessory); - logger.info("Added accessory " + accessory.getName()); + logger.trace("Added accessory " + accessory.getName()); if (started) { registry.reset(); webHandler.resetConnections(); @@ -85,7 +85,7 @@ void addAccessorySkipRangeCheck(HomekitAccessory accessory) { } /** - * Removes an accessory from being handled or advertised by this root. Any existing Homekit + * Removes an accessory from being handled or advertised by this root. Any existing HomeKit * connections will be terminated to allow the clients to reconnect and see the updated accessory * list. * @@ -93,7 +93,7 @@ void addAccessorySkipRangeCheck(HomekitAccessory accessory) { */ public void removeAccessory(HomekitAccessory accessory) { this.registry.remove(accessory); - logger.info("Removed accessory " + accessory.getName()); + logger.trace("Removed accessory " + accessory.getName()); if (started) { registry.reset(); webHandler.resetConnections(); @@ -101,9 +101,9 @@ public void removeAccessory(HomekitAccessory accessory) { } /** - * Starts advertising and handling the previously added Homekit accessories. You should try to + * Starts advertising and handling the previously added HomeKit accessories. You should try to * call this after you have used the {@link #addAccessory(HomekitAccessory)} method to add all the - * initial accessories you plan on advertising, as any later additions will cause the Homekit + * initial accessories you plan on advertising, as any later additions will cause the HomeKit * clients to reconnect. */ public void start() { @@ -123,7 +123,7 @@ public void start() { }); } - /** Stops advertising and handling the Homekit accessories. */ + /** Stops advertising and handling the HomeKit accessories. */ public void stop() { advertiser.stop(); webHandler.stop(); diff --git a/src/main/java/io/github/hapjava/server/impl/HomekitServer.java b/src/main/java/io/github/hapjava/server/impl/HomekitServer.java index ea57f8da4..f323fa60b 100644 --- a/src/main/java/io/github/hapjava/server/impl/HomekitServer.java +++ b/src/main/java/io/github/hapjava/server/impl/HomekitServer.java @@ -10,7 +10,7 @@ import java.util.concurrent.ExecutionException; /** - * The main entry point for hap-java. Creating an instance of this class will listen for Homekit + * The main entry point for hap-java. Creating an instance of this class will listen for HomeKit * connections on the supplied port. Only a single root accessory can be added for each unique * instance and port, however, that accessory may be a {@link #createBridge(HomekitAuthInfo, String, * String, String, String, String, String) bridge accessory} containing child accessories. @@ -19,7 +19,7 @@ * implementation supplied by your application. Several of the values needed for your implementation * are provided by this class, specifically {@link #generateKey() generateKey}, {@link * #generateMac() generateMac}, and {@link #generateSalt()}. It is important that you provide these - * same values on each start of your application or Homekit will fail to recognize your device as + * same values on each start of your application or HomeKit will fail to recognize your device as * being the same. * * @author Andy Lintner @@ -160,7 +160,7 @@ public static String generateMac() { /** * Generates a value to supply in {@link HomekitAuthInfo#getPin() HomekitAuthInfo.getPin()}. This - * is used as the Pin a user enters into their Homekit device in order to confirm pairing. + * is used as the Pin a user enters into their HomeKit device in order to confirm pairing. * * @return the generated Pin */ diff --git a/src/main/java/io/github/hapjava/server/impl/HomekitStandaloneAccessoryServer.java b/src/main/java/io/github/hapjava/server/impl/HomekitStandaloneAccessoryServer.java index 9ab4530ea..e9b09145b 100644 --- a/src/main/java/io/github/hapjava/server/impl/HomekitStandaloneAccessoryServer.java +++ b/src/main/java/io/github/hapjava/server/impl/HomekitStandaloneAccessoryServer.java @@ -9,7 +9,7 @@ import java.util.concurrent.ExecutionException; /** - * A server for exposing standalone Homekit accessory (as opposed to a Bridge accessory which + * A server for exposing standalone HomeKit accessory (as opposed to a Bridge accessory which * contains multiple accessories). Each standalone accessory will have its own pairing information, * port, and pin. Instantiate this class via {@link * HomekitServer#createStandaloneAccessory(HomekitAuthInfo, HomekitAccessory)}. diff --git a/src/main/java/io/github/hapjava/server/impl/connections/ConnectionImpl.java b/src/main/java/io/github/hapjava/server/impl/connections/ConnectionImpl.java index c1853855d..ab2ff4444 100644 --- a/src/main/java/io/github/hapjava/server/impl/connections/ConnectionImpl.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/ConnectionImpl.java @@ -59,7 +59,7 @@ private HttpResponse doHandleRequest(HttpRequest request) throws IOException { readKey = ((UpgradeResponse) response).getReadKey().array(); writeKey = ((UpgradeResponse) response).getWriteKey().array(); } - LOGGER.info(response.getStatusCode() + " " + request.getUri()); + LOGGER.trace(response.getStatusCode() + " " + request.getUri()); return response; } diff --git a/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java b/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java index 3d7d8c817..ce567b3de 100644 --- a/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java @@ -59,7 +59,7 @@ public HttpResponse handleRequest(HttpRequest request) throws IOException { if (registry.isAllowUnauthenticatedRequests()) { return handleAuthenticatedRequest(request); } else { - logger.info("Unrecognized request for " + request.getUri()); + logger.warn("Unrecognized request for " + request.getUri()); return new NotFoundResponse(); } } @@ -79,7 +79,7 @@ public HttpResponse handleAuthenticatedRequest(HttpRequest request) throws IOExc return getCharacteristicsController().put(request, connection); default: - logger.info("Unrecognized method for " + request.getUri()); + logger.warn("Unrecognized method for " + request.getUri()); return new NotFoundResponse(); } @@ -90,11 +90,11 @@ public HttpResponse handleAuthenticatedRequest(HttpRequest request) throws IOExc if (request.getUri().startsWith("/characteristics?")) { return getCharacteristicsController().get(request); } - logger.info("Unrecognized request for " + request.getUri()); + logger.warn("Unrecognized request for " + request.getUri()); return new NotFoundResponse(); } } catch (Exception e) { - logger.error("Could not handle request", e); + logger.warn("Could not handle request", e); return new InternalServerErrorResponse(e); } } @@ -110,7 +110,7 @@ private HttpResponse handlePairSetup(HttpRequest request) { try { return pairingManager.handle(request); } catch (Exception e) { - logger.error("Exception encountered during pairing", e); + logger.warn("Exception encountered during pairing", e); return new InternalServerErrorResponse(e); } } @@ -126,7 +126,7 @@ private HttpResponse handlePairVerify(HttpRequest request) { try { return pairVerificationManager.handle(request); } catch (Exception e) { - logger.error("Excepton encountered while verifying pairing", e); + logger.warn("Excepton encountered while verifying pairing", e); return new InternalServerErrorResponse(e); } } diff --git a/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java b/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java index 0c1b2dd47..25f68526c 100644 --- a/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/SubscriptionManager.java @@ -46,7 +46,7 @@ public synchronized void addSubscription( reverse.putIfAbsent(connection, newSet()); } reverse.get(connection).add(characteristic); - LOGGER.info( + LOGGER.trace( "Added subscription to " + characteristic.getClass() + " for " + connection.hashCode()); } } @@ -65,7 +65,7 @@ public synchronized void removeSubscription( if (reverse != null) { reverse.remove(characteristic); } - LOGGER.info( + LOGGER.trace( "Removed subscription to " + characteristic.getClass() + " for " + connection.hashCode()); } @@ -78,13 +78,13 @@ public synchronized void removeConnection(HomekitClientConnection connection) { subscriptions.get(characteristic); characteristicSubscriptions.remove(connection); if (characteristicSubscriptions.isEmpty()) { - LOGGER.debug("Unsubscribing from characteristic as all subscriptions are closed"); + LOGGER.trace("Unsubscribing from characteristic as all subscriptions are closed"); characteristic.unsubscribe(); subscriptions.remove(characteristic); } } } - LOGGER.debug("Removed connection {}", connection.hashCode()); + LOGGER.trace("Removed connection {}", connection.hashCode()); } private Set newSet() { @@ -97,14 +97,14 @@ public synchronized void batchUpdate() { public synchronized void completeUpdateBatch() { if (--this.nestedBatches == 0 && !pendingNotifications.isEmpty()) { - LOGGER.debug("Publishing batched changes"); + LOGGER.trace("Publishing batched changes"); for (ConcurrentMap.Entry> entry : pendingNotifications.entrySet()) { try { HttpResponse message = new EventController().getMessage(entry.getValue()); entry.getKey().outOfBand(message); } catch (Exception e) { - LOGGER.error("Failed to create new event message", e); + LOGGER.warn("Failed to create new event message", e); } } pendingNotifications.clear(); @@ -118,7 +118,7 @@ public synchronized void publish(int accessoryId, int iid, EventableCharacterist return; // no subscribers } if (nestedBatches != 0) { - LOGGER.debug("Batching change for " + accessoryId); + LOGGER.trace("Batching change for accessory {} and characteristic {} " + accessoryId, iid); PendingNotification notification = new PendingNotification(accessoryId, iid, changed); for (HomekitClientConnection connection : subscribers) { if (!pendingNotifications.containsKey(connection)) { @@ -131,24 +131,24 @@ public synchronized void publish(int accessoryId, int iid, EventableCharacterist try { HttpResponse message = new EventController().getMessage(accessoryId, iid, changed); - LOGGER.debug("Publishing change for " + accessoryId); + LOGGER.trace("Publishing change for " + accessoryId); for (HomekitClientConnection connection : subscribers) { connection.outOfBand(message); } } catch (Exception e) { - LOGGER.error("Failed to create new event message", e); + LOGGER.warn("Failed to create new event message", e); } } /** Remove all existing subscriptions */ public void removeAll() { - LOGGER.debug("Removing {} reverse connections from subscription manager", reverse.size()); + LOGGER.trace("Removing {} reverse connections from subscription manager", reverse.size()); Iterator i = reverse.keySet().iterator(); while (i.hasNext()) { HomekitClientConnection connection = i.next(); - LOGGER.debug("Removing connection {}", connection.hashCode()); + LOGGER.trace("Removing connection {}", connection.hashCode()); removeConnection(connection); } - LOGGER.debug("Subscription sizes are {} and {}", reverse.size(), subscriptions.size()); + LOGGER.trace("Subscription sizes are {} and {}", reverse.size(), subscriptions.size()); } } diff --git a/src/main/java/io/github/hapjava/server/impl/http/impl/AccessoryHandler.java b/src/main/java/io/github/hapjava/server/impl/http/impl/AccessoryHandler.java index 35ac055cf..0e1bf1146 100644 --- a/src/main/java/io/github/hapjava/server/impl/http/impl/AccessoryHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/AccessoryHandler.java @@ -36,13 +36,13 @@ public void channelActive(ChannelHandlerContext ctx) throws Exception { } channel.writeAndFlush(NettyResponseUtil.createResponse(response)); }); - LOGGER.info("New homekit connection from " + ctx.channel().remoteAddress().toString()); + LOGGER.trace("New HomeKit connection from " + ctx.channel().remoteAddress().toString()); super.channelActive(ctx); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - LOGGER.info("Terminated homekit connection from " + ctx.channel().remoteAddress().toString()); + LOGGER.trace("Terminated HomeKit connection from " + ctx.channel().remoteAddress().toString()); super.channelInactive(ctx); } @@ -57,7 +57,7 @@ public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest req) throws } sendResponse(response, ctx); } catch (Exception e) { - LOGGER.error("Error handling homekit http request", e); + LOGGER.warn("Error handling homekit http request", e); sendResponse(HttpResponseStatus.INTERNAL_SERVER_ERROR, "Error: " + e.getMessage(), ctx); } } @@ -95,7 +95,7 @@ public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { boolean errorLevel = !(cause instanceof IOException); if (errorLevel) { - LOGGER.error("Exception caught in web handler", cause); + LOGGER.warn("Exception caught in web handler", cause); } else { LOGGER.debug("Exception caught in web handler", cause); } diff --git a/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java b/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java index 5a2337707..9bb218c17 100644 --- a/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java @@ -49,7 +49,7 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) t public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { boolean errorLevel = !(cause instanceof IOException); if (errorLevel) { - logger.error("Exception in binary handler", cause); + logger.warn("Exception in binary handler", cause); } else { logger.debug("Exception in binary handler", cause); } @@ -57,8 +57,8 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E } private void debugData(String msg, ByteBuf b, ChannelHandlerContext ctx) throws Exception { - if (logger.isDebugEnabled()) { - logger.debug( + if (logger.isTraceEnabled()) { + logger.trace( String.format( "%s [%s]:%n%s", msg, ctx.channel().remoteAddress().toString(), b.toString(StandardCharsets.UTF_8))); diff --git a/src/main/java/io/github/hapjava/server/impl/http/impl/NettyHomekitHttpService.java b/src/main/java/io/github/hapjava/server/impl/http/impl/NettyHomekitHttpService.java index 329b803dc..aad5d5a13 100644 --- a/src/main/java/io/github/hapjava/server/impl/http/impl/NettyHomekitHttpService.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/NettyHomekitHttpService.java @@ -59,7 +59,7 @@ public void operationComplete(Future future) throws Exception { future.get(); SocketAddress socketAddress = bindFuture.channel().localAddress(); if (socketAddress instanceof InetSocketAddress) { - logger.info("Bound homekit listener to " + socketAddress.toString()); + logger.trace("Bound homekit listener to " + socketAddress.toString()); portFuture.complete(((InetSocketAddress) socketAddress).getPort()); } else { throw new RuntimeException( @@ -79,7 +79,7 @@ public void shutdown() { } public void resetConnections() { - logger.info("Resetting connections"); + logger.trace("Resetting connections"); allChannels.close(); } } diff --git a/src/main/java/io/github/hapjava/server/impl/jmdns/JmdnsHomekitAdvertiser.java b/src/main/java/io/github/hapjava/server/impl/jmdns/JmdnsHomekitAdvertiser.java index 8ba452906..81c4d4fed 100644 --- a/src/main/java/io/github/hapjava/server/impl/jmdns/JmdnsHomekitAdvertiser.java +++ b/src/main/java/io/github/hapjava/server/impl/jmdns/JmdnsHomekitAdvertiser.java @@ -31,14 +31,14 @@ public JmdnsHomekitAdvertiser(InetAddress localAddress) throws UnknownHostExcept public synchronized void advertise(String label, String mac, int port, int configurationIndex) throws Exception { if (isAdvertising) { - throw new IllegalStateException("Homekit advertiser is already running"); + throw new IllegalStateException("HomeKit advertiser is already running"); } this.label = label; this.mac = mac; this.port = port; this.configurationIndex = configurationIndex; - logger.info("Advertising accessory " + label); + logger.trace("Advertising accessory " + label); registerService(); @@ -46,7 +46,7 @@ public synchronized void advertise(String label, String mac, int port, int confi .addShutdownHook( new Thread( () -> { - logger.info("Stopping advertising in response to shutdown."); + logger.trace("Stopping advertising in response to shutdown."); jmdns.unregisterAllServices(); })); isAdvertising = true; @@ -60,7 +60,7 @@ public synchronized void setDiscoverable(boolean discoverable) throws IOExceptio if (this.discoverable != discoverable) { this.discoverable = discoverable; if (isAdvertising) { - logger.info("Re-creating service due to change in discoverability to " + discoverable); + logger.trace("Re-creating service due to change in discoverability to " + discoverable); jmdns.unregisterAllServices(); registerService(); } @@ -71,7 +71,7 @@ public synchronized void setConfigurationIndex(int revision) throws IOException if (this.configurationIndex != revision) { this.configurationIndex = revision; if (isAdvertising) { - logger.info("Re-creating service due to change in configuration index to " + revision); + logger.trace("Re-creating service due to change in configuration index to " + revision); jmdns.unregisterAllServices(); registerService(); } diff --git a/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java b/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java index 484a4ea30..df5509dda 100644 --- a/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java +++ b/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java @@ -36,7 +36,7 @@ public HttpResponse get(HttpRequest request) throws Exception { for (String id : ids) { String[] parts = id.split("\\."); if (parts.length != 2) { - logger.error("Unexpected characteristics request: " + uri); + logger.warn("Unexpected characteristics request: " + uri); return new NotFoundResponse(); } int aid = Integer.parseInt(parts[0]); diff --git a/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6Routines.java b/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6Routines.java index 5e44117f3..44417a91f 100644 --- a/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6Routines.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6Routines.java @@ -5,7 +5,7 @@ /** * This class is modified from the nimbus SRP library to provide methods that are compatible with - * some pecularities of Homekit. Namely, the need for a 3072 bit private value + * some pecularities of HomeKit. Namely, the need for a 3072 bit private value * * @author Vladimir Dzhuvinov */ diff --git a/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6ServerSession.java b/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6ServerSession.java index 0ec311048..3841d9fb7 100644 --- a/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6ServerSession.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/HomekitSRP6ServerSession.java @@ -11,7 +11,7 @@ /** * This is a slightly modified version of the SRP6ServerSession class included with nimbus. The only - * change made for homekit compatability is a change to the size of the b key. Homekit pairing fails + * change made for homekit compatability is a change to the size of the b key. HomeKit pairing fails * if b is not 3072 bytes. * *

Stateful server-side Secure Remote Password (SRP-6a) authentication session. Handles the diff --git a/src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationManager.java b/src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationManager.java index 6630c82e8..d43b2d210 100644 --- a/src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationManager.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/PairVerificationManager.java @@ -56,7 +56,7 @@ public HttpResponse handle(HttpRequest rawRequest) throws Exception { } private HttpResponse stage1(Stage1Request request) throws Exception { - logger.debug("Starting pair verification for " + registry.getLabel()); + logger.trace("Starting pair verification for " + registry.getLabel()); clientPublicKey = request.getClientPublicKey(); publicKey = new byte[32]; byte[] privateKey = new byte[32]; @@ -116,7 +116,7 @@ private HttpResponse stage2(Stage2Request request) throws Exception { Encoder encoder = TypeLengthValueUtils.getEncoder(); if (new EdsaVerifier(clientLtpk).verify(material, clientSignature)) { encoder.add(MessageType.STATE, (short) 4); - logger.debug("Completed pair verification for " + registry.getLabel()); + logger.trace("Completed pair verification for " + registry.getLabel()); return new UpgradeResponse( encoder.toByteArray(), createKey("Control-Write-Encryption-Key"), diff --git a/src/main/java/io/github/hapjava/server/impl/pairing/PairingManager.java b/src/main/java/io/github/hapjava/server/impl/pairing/PairingManager.java index d4265a587..af6a6e01f 100644 --- a/src/main/java/io/github/hapjava/server/impl/pairing/PairingManager.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/PairingManager.java @@ -27,11 +27,11 @@ public HttpResponse handle(HttpRequest httpRequest) throws Exception { PairSetupRequest req = PairSetupRequest.of(httpRequest.getBody()); if (req.getStage() == Stage.ONE) { - logger.info("Starting pair for " + registry.getLabel()); + logger.trace("Starting pair for " + registry.getLabel()); srpHandler = new SrpHandler(authInfo.getPin(), authInfo.getSalt()); return srpHandler.handle(req); } else if (req.getStage() == Stage.TWO) { - logger.debug("Entering second stage of pair for " + registry.getLabel()); + logger.trace("Entering second stage of pair for " + registry.getLabel()); if (srpHandler == null) { logger.warn("Received unexpected stage 2 request for " + registry.getLabel()); return new UnauthorizedResponse(); @@ -40,12 +40,12 @@ public HttpResponse handle(HttpRequest httpRequest) throws Exception { return srpHandler.handle(req); } catch (Exception e) { srpHandler = null; // You don't get to try again - need a new key - logger.error("Exception encountered while processing pairing request", e); + logger.warn("Exception encountered while processing pairing request", e); return new UnauthorizedResponse(); } } } else if (req.getStage() == Stage.THREE) { - logger.debug("Entering third stage of pair for " + registry.getLabel()); + logger.trace("Entering third stage of pair for " + registry.getLabel()); if (srpHandler == null) { logger.warn("Received unexpected stage 3 request for " + registry.getLabel()); return new UnauthorizedResponse(); @@ -54,7 +54,7 @@ public HttpResponse handle(HttpRequest httpRequest) throws Exception { try { return handler.handle(req); } catch (Exception e) { - logger.error("Exception while finalizing pairing", e); + logger.warn("Exception while finalizing pairing", e); return new UnauthorizedResponse(); } } diff --git a/src/main/java/io/github/hapjava/server/impl/pairing/SrpHandler.java b/src/main/java/io/github/hapjava/server/impl/pairing/SrpHandler.java index 2743ea4f1..e02ccdb90 100644 --- a/src/main/java/io/github/hapjava/server/impl/pairing/SrpHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/pairing/SrpHandler.java @@ -53,7 +53,7 @@ public HttpResponse handle(PairSetupRequest request) throws Exception { private HttpResponse step1() throws Exception { if (session.getState() != State.INIT) { - logger.error("Session is not in state INIT when receiving step1"); + logger.warn("Session is not in state INIT when receiving step1"); return new ConflictResponse(); } @@ -70,7 +70,7 @@ private HttpResponse step1() throws Exception { private HttpResponse step2(Stage2Request request) throws Exception { if (session.getState() != State.STEP_1) { - logger.error("Session is not in state Stage 1 when receiving step2"); + logger.warn("Session is not in state Stage 1 when receiving step2"); return new ConflictResponse(); } BigInteger m2 = session.step2(request.getA(), request.getM1()); diff --git a/src/main/java/io/github/hapjava/services/Service.java b/src/main/java/io/github/hapjava/services/Service.java index c4ab23a82..aab8ef7e4 100644 --- a/src/main/java/io/github/hapjava/services/Service.java +++ b/src/main/java/io/github/hapjava/services/Service.java @@ -12,7 +12,7 @@ public interface Service { /** * Characteristics are the variables offered for reading, updating, and eventing by the Service - * over the Homekit protocol. + * over the HomeKit protocol. * *

It is important to maintain the order of this list and not change its contents between * invocations, or a pairing error will result. From 0db27e87349f709f4e563c79d412a99715e881c6 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Tue, 5 May 2020 11:41:31 +0200 Subject: [PATCH 14/23] add service label service and hap protocol version service. fix Mute characteristic Signed-off-by: Eugen Freiter --- README.md | 15 +++++---- .../impl/audio/MuteCharacteristic.java | 9 +++-- .../characteristics/impl/audio/MuteEnum.java | 33 ------------------- .../impl/common/VersionCharacteristic.java | 19 +++++++++++ .../server/impl/http/impl/BinaryHandler.java | 12 ------- .../impl/HAPProtocolInformationService.java | 12 +++++++ .../services/impl/MicrophoneService.java | 5 ++- .../services/impl/ServiceLabelService.java | 13 ++++++++ .../hapjava/services/impl/SpeakerService.java | 5 ++- 9 files changed, 60 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/io/github/hapjava/characteristics/impl/audio/MuteEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/VersionCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/services/impl/HAPProtocolInformationService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/ServiceLabelService.java diff --git a/README.md b/README.md index 8f516a4ac..9694fec1c 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ This library would not have been possible without [Tian Zhang](https://github.co Usage ========= Include HAP-Java in your project using maven: + ``` io.github.hap-java @@ -23,9 +24,9 @@ Supported HomeKit Accessories ========= Current implementation is based on HAP specification Release R2 (published 2019-07-26) and -fully supports 31 out of 48 HomeKit accessories defined there. +fully supports 33 out of 45 HomeKit accessory services defined there. -| HomeKit Accessory | Supported by Java-HAP | +| HomeKit Accessory & Service type | Supported by Java-HAP | |--------------------|--------------------| | Accessory Information | :white_check_mark: | | Air Purifier | :white_check_mark: | @@ -43,7 +44,7 @@ fully supports 31 out of 48 HomeKit accessories defined there. | Faucet | :x: | | Filter Maintenance | :x: | | Garage Door Opener | :white_check_mark: | -| HAP Protocol Information | :x: | +| HAP Protocol Information | :white_check_mark: | | Heater Cooler | :x: | | Humidifier Dehumidifier | :x: | | Humidity Sensor | :white_check_mark: | @@ -58,7 +59,7 @@ fully supports 31 out of 48 HomeKit accessories defined there. | Occupancy Sensor | :white_check_mark: | | Outlet | :white_check_mark: | | Security System | :white_check_mark: | -| Service Label | :x: | +| Service Label | :white_check_mark: | | Siri | :x: | | Slat | :white_check_mark: | | Smoke Sensor | :white_check_mark: | @@ -69,6 +70,6 @@ fully supports 31 out of 48 HomeKit accessories defined there. | Target Control Management | :x: | | Temperature Sensor | :white_check_mark: | | Thermostat | :white_check_mark: | -| Valve | :white_check_mark: | -| Window | :white_check_mark: | -| Window Covering | :white_check_mark: | \ No newline at end of file +| Valve | :white_check_mark: | +| Window | :white_check_mark: | +| Window Covering | :white_check_mark: | \ No newline at end of file diff --git a/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java index bdfe65f1b..f56b2aab5 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java @@ -2,23 +2,22 @@ import io.github.hapjava.characteristics.ExceptionalConsumer; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.function.Supplier; /** A Mute characteristic allows the control of audio input or output accessory respectively. */ -public class MuteCharacteristic extends EnumCharacteristic { +public class MuteCharacteristic extends BooleanCharacteristic { public MuteCharacteristic( - Supplier> getter, - ExceptionalConsumer setter, + Supplier> getter, + ExceptionalConsumer setter, Consumer subscriber, Runnable unsubscriber) { super( "0000011A-0000-1000-8000-0026BB765291", "Mute", - 1, Optional.of(getter), Optional.of(setter), Optional.of(subscriber), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteEnum.java deleted file mode 100644 index a06f1407a..000000000 --- a/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteEnum.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.github.hapjava.characteristics.impl.audio; - -import io.github.hapjava.characteristics.CharacteristicEnum; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -/** 0 ”Mute is Off / Audio is On” 1 ”Mute is On / There is no Audio” */ -public enum MuteEnum implements CharacteristicEnum { - OFF(0), - ON(1); - - private static final Map reverse; - - static { - reverse = Arrays.stream(MuteEnum.values()).collect(Collectors.toMap(MuteEnum::getCode, t -> t)); - } - - public static MuteEnum fromCode(Integer code) { - return reverse.get(code); - } - - private final int code; - - MuteEnum(int code) { - this.code = code; - } - - @Override - public int getCode() { - return code; - } -} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/VersionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/VersionCharacteristic.java new file mode 100644 index 000000000..f3964f78c --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/VersionCharacteristic.java @@ -0,0 +1,19 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.impl.base.StaticStringCharacteristic; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** This characteristic describes a name and must not be a null value. */ +public class VersionCharacteristic extends StaticStringCharacteristic { + + public VersionCharacteristic(Supplier> getter) { + super( + "00000023-0000-1000-8000-0026BB765291", + "HAP version", + Optional.of(getter), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java b/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java index 9bb218c17..6bd5892f8 100644 --- a/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java @@ -6,7 +6,6 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageCodec; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +24,6 @@ public BinaryHandler(HomekitClientConnection connection) { @Override protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception { if (started) { - debugData("Sending data", msg, ctx); byte[] b = new byte[msg.readableBytes()]; msg.readBytes(b); out.writeBytes(connection.encryptResponse(b)); @@ -40,7 +38,6 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) t in.readBytes(b); byte[] decrypted = connection.decryptRequest(b); ByteBuf outBuf = Unpooled.copiedBuffer(decrypted); - debugData("Received data", outBuf, ctx); out.add(outBuf); started = true; } @@ -55,13 +52,4 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E } super.exceptionCaught(ctx, cause); } - - private void debugData(String msg, ByteBuf b, ChannelHandlerContext ctx) throws Exception { - if (logger.isTraceEnabled()) { - logger.trace( - String.format( - "%s [%s]:%n%s", - msg, ctx.channel().remoteAddress().toString(), b.toString(StandardCharsets.UTF_8))); - } - } } diff --git a/src/main/java/io/github/hapjava/services/impl/HAPProtocolInformationService.java b/src/main/java/io/github/hapjava/services/impl/HAPProtocolInformationService.java new file mode 100644 index 000000000..8363320cf --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/HAPProtocolInformationService.java @@ -0,0 +1,12 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.characteristics.impl.common.VersionCharacteristic; + +/** This service describes label scheme. */ +public class HAPProtocolInformationService extends AbstractServiceImpl { + + public HAPProtocolInformationService(VersionCharacteristic versionCharacteristic) { + super("000000A2-0000-1000-8000-0026BB765291"); + addCharacteristic(versionCharacteristic); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/MicrophoneService.java b/src/main/java/io/github/hapjava/services/impl/MicrophoneService.java index 741af556f..3f72bd4f7 100644 --- a/src/main/java/io/github/hapjava/services/impl/MicrophoneService.java +++ b/src/main/java/io/github/hapjava/services/impl/MicrophoneService.java @@ -4,7 +4,6 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithVolume; import io.github.hapjava.characteristics.impl.audio.MuteCharacteristic; -import io.github.hapjava.characteristics.impl.audio.MuteEnum; import io.github.hapjava.characteristics.impl.audio.VolumeCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; @@ -22,8 +21,8 @@ public MicrophoneService(MuteCharacteristic muteCharacteristic) { public MicrophoneService(MicrophoneAccessory accessory) { this( new MuteCharacteristic( - () -> accessory.isMuted().thenApply(s -> s ? MuteEnum.ON : MuteEnum.OFF), - (v) -> accessory.setMute(v == MuteEnum.ON), + accessory::isMuted, + accessory::setMute, accessory::subscribeMuteState, accessory::unsubscribeMuteState)); if (accessory instanceof AccessoryWithName) { diff --git a/src/main/java/io/github/hapjava/services/impl/ServiceLabelService.java b/src/main/java/io/github/hapjava/services/impl/ServiceLabelService.java new file mode 100644 index 000000000..bee40f094 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/ServiceLabelService.java @@ -0,0 +1,13 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.characteristics.impl.common.ServiceLabelNamespaceCharacteristic; + +/** This service describes label scheme. */ +public class ServiceLabelService extends AbstractServiceImpl { + + public ServiceLabelService( + ServiceLabelNamespaceCharacteristic serviceLabelNamespaceCharacteristic) { + super("000000CC-0000-1000-8000-0026BB765291"); + addCharacteristic(serviceLabelNamespaceCharacteristic); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/SpeakerService.java b/src/main/java/io/github/hapjava/services/impl/SpeakerService.java index b92eb4d4b..0c2a073d8 100644 --- a/src/main/java/io/github/hapjava/services/impl/SpeakerService.java +++ b/src/main/java/io/github/hapjava/services/impl/SpeakerService.java @@ -4,7 +4,6 @@ import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithVolume; import io.github.hapjava.characteristics.impl.audio.MuteCharacteristic; -import io.github.hapjava.characteristics.impl.audio.MuteEnum; import io.github.hapjava.characteristics.impl.audio.VolumeCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; @@ -19,8 +18,8 @@ public SpeakerService(MuteCharacteristic muteCharacteristic) { public SpeakerService(SpeakerAccessory accessory) { this( new MuteCharacteristic( - () -> accessory.isMuted().thenApply(s -> s ? MuteEnum.ON : MuteEnum.OFF), - (v) -> accessory.setMute(v == MuteEnum.ON), + accessory::isMuted, + accessory::setMute, accessory::subscribeMuteState, accessory::unsubscribeMuteState)); if (accessory instanceof AccessoryWithName) { From f9502d236dcdc955a56ba6b472f82ab81cbb1e4f Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Thu, 7 May 2020 22:45:22 +0200 Subject: [PATCH 15/23] fix the Id for TargetHorizontalTiltAngleCharacteristic Signed-off-by: Eugen Freiter --- .../windowcovering/TargetHorizontalTiltAngleCharacteristic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java index a12a1da80..33d31d0f0 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java @@ -22,7 +22,7 @@ public TargetHorizontalTiltAngleCharacteristic( Consumer subscriber, Runnable unsubscriber) { super( - "000000B2-0000-1000-8000-0026BB765291", + "0000007B-0000-1000-8000-0026BB765291", "target horizontal tilt angle", -90, 90, From 12e3b45e7b64fcb5ff1f53767560621a5f15cacc Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Tue, 12 May 2020 12:23:49 +0200 Subject: [PATCH 16/23] add Faucet and HeaterCooler Signed-off-by: Eugen Freiter --- CHANGES.md | 8 +- README.md | 6 +- .../hapjava/accessories/FanAccessory.java | 2 +- .../hapjava/accessories/FaucetAccessory.java | 48 ++++++ .../accessories/HeaterCoolerAccessory.java | 108 +++++++++++++ .../AccessoryWithTemperatureDisplayUnits.java | 37 +++++ .../impl/airquality/AirQualityEnum.java | 6 +- ...urrentHeaterCoolerStateCharacteristic.java | 31 ++++ .../CurrentHeaterCoolerStateEnum.java | 40 +++++ ...TargetHeaterCoolerStateCharacteristic.java | 41 +++++ .../TargetHeaterCoolerStateEnum.java | 39 +++++ .../CurrentTemperatureCharacteristic.java | 2 +- .../services/impl/AirQualityService.java | 2 +- .../hapjava/services/impl/FaucetService.java | 49 ++++++ .../services/impl/HeaterCoolerService.java | 151 ++++++++++++++++++ 15 files changed, 557 insertions(+), 13 deletions(-) create mode 100644 src/main/java/io/github/hapjava/accessories/FaucetAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTemperatureDisplayUnits.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateEnum.java create mode 100644 src/main/java/io/github/hapjava/services/impl/FaucetService.java create mode 100644 src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java diff --git a/CHANGES.md b/CHANGES.md index aae6d6c50..7680cec66 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,12 +1,12 @@ # HAP-Java 2.0.0 * major refactoring to support optional characteristics -* structure and names are adapted to HAP spec structure and naming. +* structure and names adapted to HAP spec structure and naming. * structure is following * `accessory` package include basis accessory as the listed in HAP spec, plus interfaces for optional characteristics. clients should extend the accessory classes. e.g. `WindowCoveringAccessory` or `AccessoryWithBrightness` * `characteristics` package consists of all characteristics, optional and mandatory. e.g. `TargetHorizontalTiltAngleCharacteristic`. The naming is done in accordance to HAP spec. - * `services` package consists of services, which grouping characteristics. e.g. `WindowCoveringService` defines mandatory and optional characteristics for a window covering service as it is defined in HAP spec. - * `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. + * `services` package consists of services, which grouping characteristics. e.g. `WindowCoveringService` defines mandatory and optional characteristics for a window covering service as it is defined in HAP spec. + * `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. # HAP-Java 1.1.5 diff --git a/README.md b/README.md index 9694fec1c..16992be14 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Supported HomeKit Accessories ========= Current implementation is based on HAP specification Release R2 (published 2019-07-26) and -fully supports 33 out of 45 HomeKit accessory services defined there. +fully supports 35 out of 45 HomeKit accessory services defined there. | HomeKit Accessory & Service type | Supported by Java-HAP | |--------------------|--------------------| @@ -41,11 +41,11 @@ fully supports 33 out of 45 HomeKit accessory services defined there. | Door | :white_check_mark: | | Doorbell | :white_check_mark: | | Fan | :white_check_mark: | -| Faucet | :x: | +| Faucet | :white_check_mark: | | Filter Maintenance | :x: | | Garage Door Opener | :white_check_mark: | | HAP Protocol Information | :white_check_mark: | -| Heater Cooler | :x: | +| Heater Cooler | :white_check_mark: | | Humidifier Dehumidifier | :x: | | Humidity Sensor | :white_check_mark: | | Irrigation System | :x: | diff --git a/src/main/java/io/github/hapjava/accessories/FanAccessory.java b/src/main/java/io/github/hapjava/accessories/FanAccessory.java index 5b1bb3ac6..fad72fc42 100644 --- a/src/main/java/io/github/hapjava/accessories/FanAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/FanAccessory.java @@ -34,7 +34,7 @@ public interface FanAccessory extends HomekitAccessory { /** * Subscribes to changes in the active state of the fan. * - * @param callback the function to call when the direction changes. + * @param callback the function to call when the active state changes. */ void subscribeActive(HomekitCharacteristicChangeCallback callback); diff --git a/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java b/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java new file mode 100644 index 000000000..907d7bb38 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java @@ -0,0 +1,48 @@ +package io.github.hapjava.accessories; + +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithFanState; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.FanService; +import io.github.hapjava.services.impl.FaucetService; + +/** + * This service describes accessories like faucets or shower heads. + * + * @author Eugen Freiter + */ +public interface FaucetAccessory extends HomekitAccessory { + /** + * Mandatory: Retrieves the current active state of the faucet. + * + * @return a future that will contain the binary state + */ + CompletableFuture isActive(); + + /** + * Sets the active state of the faucet + * + * @param state the binary state to set + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setActive(boolean state) throws Exception; + + /** + * Subscribes to changes in the active state of the faucet. + * + * @param callback the function to call when the active state changes. + */ + void subscribeActive(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the active state of the faucet. */ + void unsubscribeActive(); + + @Override + default Collection getServices() { + return Collections.singleton(new FaucetService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java b/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java new file mode 100644 index 000000000..c8ef7a090 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java @@ -0,0 +1,108 @@ +package io.github.hapjava.accessories; + +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.heatercooler.CurrentHeaterCoolerStateEnum; +import io.github.hapjava.characteristics.impl.heatercooler.TargetHeaterCoolerStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.HeaterCoolerService; + +/** + * Heater Cooler accessory + * + * @author Eugen Freiter + */ +public interface HeaterCoolerAccessory extends HomekitAccessory { + /** + * Retrieves the current temperature, in celsius degrees. + * + * @return a future that will contain the temperature. + */ + CompletableFuture getCurrentTemperature(); + + + /** + * Mandatory: Retrieves the current active state of the fan'. + * + * @return a future that will contain the binary state + */ + CompletableFuture isActive(); + + /** + * Sets the active state of the fan + * + * @param state the binary state to set + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setActive(boolean state) throws Exception; + + /** + * Retrieves the heater /cooler current state. + * + * @return a future that will contain the heater cooler current state . + */ + CompletableFuture getCurrentHeaterCoolerState(); + + /** + * Retrieves the heater cooler target state. + * + * @return a future that will contain the heater cooler target state . + */ + CompletableFuture getTargetHeaterCoolerState(); + + /** + * set heater cooler target state the lock target state. + * + * @param state heater cooler target state + * @return a future that completes when the change is made + */ + CompletableFuture setTargetHeaterCoolerState(TargetHeaterCoolerStateEnum state); + + /** + * Subscribes to changes in the heater cooler current state. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentHeaterCoolerState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in heater cooler current state. */ + void unsubscribeCurrentHeaterCoolerState(); + + /** + * Subscribes to changes in the heater cooler target state. + * + * @param callback the function to call when the state changes. + */ + void subscribeTargetHeaterCoolerState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in heater cooler target state. */ + void unsubscribeTargetHeaterCoolerState(); + + /** + * Subscribes to changes in the active state of the heater cooler . + * + * @param callback the function to call when the active state changes. + */ + void subscribeActive(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the active state of the heater cooler . */ + void unsubscribeActive(); + + /** + * Subscribes to changes in the current temperature. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentTemperature(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the current temperature. */ + void unsubscribeCurrentTemperature(); + + @Override + default Collection getServices() { + return Collections.singleton(new HeaterCoolerService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTemperatureDisplayUnits.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTemperatureDisplayUnits.java new file mode 100644 index 000000000..495c3c8bd --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTemperatureDisplayUnits.java @@ -0,0 +1,37 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import java.util.concurrent.CompletableFuture; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.thermostat.TemperatureDisplayUnitEnum; + +/** Accessory with characteristic that describes units of temperature used for presentation purposes (e.g. the units of temperature displayed on the + screen). */ +public interface AccessoryWithTemperatureDisplayUnits { + + /** + * Retrieves temperature display units + * + * @return a future that will contain temperature display units + */ + CompletableFuture getTemperatureDisplayUnits(); + + + /** + * Sets the temperature display units + * + * @param units the target temperature display units + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setTemperatureDisplayUnits(TemperatureDisplayUnitEnum units) throws Exception; + + /** + * Subscribes to changes in the temperature display units + * + * @param callback the function to call when temperature display units changes. + */ + void subscribeTemperatureDisplayUnits(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the temperature display units */ + void unsubscribeTemperatureDisplayUnits(); +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityEnum.java index c688065af..390b51dfe 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityEnum.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityEnum.java @@ -9,9 +9,9 @@ public enum AirQualityEnum implements CharacteristicEnum { UNKNOWN(0), EXCELLENT(1), - GOOD(0), - FAIR(1), - INFERIOR(1), + GOOD(2), + FAIR(3), + INFERIOR(4), POOR(5); private static final Map reverse; diff --git a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateCharacteristic.java new file mode 100644 index 000000000..73d75cd13 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateCharacteristic.java @@ -0,0 +1,31 @@ +package io.github.hapjava.characteristics.impl.heatercooler; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; + +/** + * This characteristic describes the current state of a heater cooler. + */ +public class CurrentHeaterCoolerStateCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public CurrentHeaterCoolerStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000B1-0000-1000-8000-0026BB765291", + "current heater cooler state", + 3, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateEnum.java new file mode 100644 index 000000000..befc53284 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateEnum.java @@ -0,0 +1,40 @@ +package io.github.hapjava.characteristics.impl.heatercooler; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; +import io.github.hapjava.characteristics.CharacteristicEnum; + +/** 0 ”Inactive” + 1 ”Idle” + 2 ”Heating” + 3 ”Cooling” */ +public enum CurrentHeaterCoolerStateEnum implements CharacteristicEnum { + INACTIVE(0), + IDLE(1), + HEATING(2), + COOLING(3); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CurrentHeaterCoolerStateEnum.values()) + .collect(Collectors.toMap(CurrentHeaterCoolerStateEnum::getCode, t -> t)); + } + + public static CurrentHeaterCoolerStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CurrentHeaterCoolerStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateCharacteristic.java new file mode 100644 index 000000000..31cda96ec --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateCharacteristic.java @@ -0,0 +1,41 @@ +package io.github.hapjava.characteristics.impl.heatercooler; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.TargetHeatingCoolingStateEnum; + +/** + * This characteristic describes the target state of heater cooler. + */ +public class TargetHeaterCoolerStateCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + public TargetHeaterCoolerStateCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000B2-0000-1000-8000-0026BB765291", + "target heater cooler state", + 2, + 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(TargetHeaterCoolerStateEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateEnum.java new file mode 100644 index 000000000..80914273e --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateEnum.java @@ -0,0 +1,39 @@ +package io.github.hapjava.characteristics.impl.heatercooler; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; +import io.github.hapjava.characteristics.CharacteristicEnum; + +/** 0 AUTO - ”Heat or Cool” + 1 ”Heat” + 2 ”Cool” + */ +public enum TargetHeaterCoolerStateEnum implements CharacteristicEnum { + AUTO(0), + HEAT(1), + COOL(2); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(TargetHeaterCoolerStateEnum.values()) + .collect(Collectors.toMap(TargetHeaterCoolerStateEnum::getCode, t -> t)); + } + + public static TargetHeaterCoolerStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + TargetHeaterCoolerStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java index 96ea27735..4227ceaab 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java @@ -15,7 +15,7 @@ public CurrentTemperatureCharacteristic( Consumer subscriber, Runnable unsubscriber) { super( - "0000011-0000-1000-8000-0026BB765291", + "00000011-0000-1000-8000-0026BB765291", "current temperature", 0, 100, diff --git a/src/main/java/io/github/hapjava/services/impl/AirQualityService.java b/src/main/java/io/github/hapjava/services/impl/AirQualityService.java index cf4a79952..bc66b3270 100644 --- a/src/main/java/io/github/hapjava/services/impl/AirQualityService.java +++ b/src/main/java/io/github/hapjava/services/impl/AirQualityService.java @@ -29,7 +29,7 @@ public class AirQualityService extends AbstractServiceImpl { public AirQualityService(AirQualityCharacteristic airQuality) { - super("00000096-0000-1000-8000-0026BB765291"); + super("0000008D-0000-1000-8000-0026BB765291"); addCharacteristic(airQuality); } diff --git a/src/main/java/io/github/hapjava/services/impl/FaucetService.java b/src/main/java/io/github/hapjava/services/impl/FaucetService.java new file mode 100644 index 000000000..774d083d5 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/FaucetService.java @@ -0,0 +1,49 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.FaucetAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.ActiveEnum; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; + +/** This service describes accessories like faucets or shower heads. This service must only be included when an accessory + has either a linked {@link HeaterCoolerService} ith single linked {@link ValveService} or multiple + linked {@link ValveService} (with/without {@link HeaterCoolerService} to describe water + outlets. This service serves as a top level service for such accessories. */ + +public class FaucetService extends AbstractServiceImpl { + + public FaucetService(ActiveCharacteristic active) { + super("000000D7-0000-1000-8000-0026BB765291"); + addCharacteristic(active); + } + + public FaucetService(FaucetAccessory accessory) { + this( + new ActiveCharacteristic( + () -> accessory.isActive().thenApply(s -> s ? ActiveEnum.ACTIVE : ActiveEnum.INACTIVE), + (v) -> accessory.setActive(v == ActiveEnum.ACTIVE), + accessory::subscribeActive, + accessory::unsubscribeActive)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { + addCharacteristic(statusFault); + } + +} diff --git a/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java b/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java new file mode 100644 index 000000000..af36433a5 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java @@ -0,0 +1,151 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.HeaterCoolerAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCoolingThresholdTemperature; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHeatingThresholdTemprature; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithPhysicalControlsLock; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithRotationSpeed; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithSwingMode; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithTemperatureDisplayUnits; +import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.ActiveEnum; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; +import io.github.hapjava.characteristics.impl.fan.LockPhysicalControlsCharacteristic; +import io.github.hapjava.characteristics.impl.fan.RotationSpeedCharacteristic; +import io.github.hapjava.characteristics.impl.fan.SwingModeCharacteristic; +import io.github.hapjava.characteristics.impl.heatercooler.CurrentHeaterCoolerStateCharacteristic; +import io.github.hapjava.characteristics.impl.heatercooler.TargetHeaterCoolerStateCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.CoolingThresholdTemperatureCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.CurrentTemperatureCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.HeatingThresholdTemperatureCharacteristic; +import io.github.hapjava.characteristics.impl.thermostat.TemperatureDisplayUnitCharacteristic; + +/** + * This service can be used to describe either of the following: + * • a heater + * • a cooler + * • a heater and a cooler + * A heater/cooler accessory may have additional: + * • {@link FanService} service to describe a fan which can be independently controlled + * • {@link SlatService} service to control vents + * A heater must include {@link HeatingThresholdTemperatureCharacteristic}. A cooler must include {@link CoolingThresholdTemperatureCharacteristic}. + * A heater/cooler accessory service may include {@link RotationSpeedCharacteristic} to control fan speed if the fan cannot + * be independently controlled. + */ +public class HeaterCoolerService extends AbstractServiceImpl { + + public HeaterCoolerService( + ActiveCharacteristic activeCharacteristic, + CurrentTemperatureCharacteristic currentTemperatureCharacteristic, + CurrentHeaterCoolerStateCharacteristic currentHeaterCoolerStateCharacteristic, + TargetHeaterCoolerStateCharacteristic targetHeaterCoolerStateCharacteristic) { + super("000000BC-0000-1000-8000-0026BB765291"); + addCharacteristic(activeCharacteristic); + addCharacteristic(currentTemperatureCharacteristic); + addCharacteristic(currentHeaterCoolerStateCharacteristic); + addCharacteristic(targetHeaterCoolerStateCharacteristic); + } + + public HeaterCoolerService(HeaterCoolerAccessory accessory) { + this( + new ActiveCharacteristic( + () -> accessory.isActive().thenApply(s -> s ? ActiveEnum.ACTIVE : ActiveEnum.INACTIVE), + (v) -> accessory.setActive(v == ActiveEnum.ACTIVE), + accessory::subscribeActive, + accessory::unsubscribeActive), + new CurrentTemperatureCharacteristic( + accessory::getCurrentTemperature, + accessory::subscribeCurrentTemperature, + accessory::unsubscribeCurrentTemperature + ), + new CurrentHeaterCoolerStateCharacteristic( + accessory::getCurrentHeaterCoolerState, + accessory::subscribeCurrentHeaterCoolerState, + accessory::unsubscribeCurrentHeaterCoolerState + ), + new TargetHeaterCoolerStateCharacteristic( + accessory::getTargetHeaterCoolerState, + accessory::setTargetHeaterCoolerState, + accessory::subscribeTargetHeaterCoolerState, + accessory::unsubscribeTargetHeaterCoolerState + ) + ); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithRotationSpeed) { + addOptionalCharacteristic( + new RotationSpeedCharacteristic( + ((AccessoryWithRotationSpeed) accessory)::getRotationSpeed, + ((AccessoryWithRotationSpeed) accessory)::setRotationSpeed, + ((AccessoryWithRotationSpeed) accessory)::subscribeRotationSpeed, + ((AccessoryWithRotationSpeed) accessory)::unsubscribeRotationSpeed)); + } + if (accessory instanceof AccessoryWithSwingMode) { + addOptionalCharacteristic( + new SwingModeCharacteristic( + ((AccessoryWithSwingMode) accessory)::getSwingMode, + ((AccessoryWithSwingMode) accessory)::setSwingMode, + ((AccessoryWithSwingMode) accessory)::subscribeSwingMode, + ((AccessoryWithSwingMode) accessory)::unsubscribeSwingMode)); + } + if (accessory instanceof AccessoryWithPhysicalControlsLock) { + addOptionalCharacteristic( + new LockPhysicalControlsCharacteristic( + ((AccessoryWithPhysicalControlsLock) accessory)::getLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::setLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::subscribeLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::unsubscribeLockControls)); + } + if (accessory instanceof AccessoryWithCoolingThresholdTemperature) { + new CoolingThresholdTemperatureCharacteristic( + ((AccessoryWithCoolingThresholdTemperature) accessory)::getCoolingThresholdTemperature, + ((AccessoryWithCoolingThresholdTemperature) accessory)::setCoolingThresholdTemperature, + ((AccessoryWithCoolingThresholdTemperature) accessory) + ::subscribeCoolingThresholdTemperature, + ((AccessoryWithCoolingThresholdTemperature) accessory) + ::unsubscribeCoolingThresholdTemperature); + } + if (accessory instanceof AccessoryWithHeatingThresholdTemprature) { + new HeatingThresholdTemperatureCharacteristic( + ((AccessoryWithHeatingThresholdTemprature) accessory)::getHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemprature) accessory)::setHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemprature) accessory) + ::subscribeHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemprature) accessory) + ::unsubscribeHeatingThresholdTemperature); + } + if (accessory instanceof AccessoryWithTemperatureDisplayUnits) { + addOptionalCharacteristic( + new TemperatureDisplayUnitCharacteristic( + ((AccessoryWithTemperatureDisplayUnits) accessory)::getTemperatureDisplayUnits, + ((AccessoryWithTemperatureDisplayUnits) accessory)::setTemperatureDisplayUnits, + ((AccessoryWithTemperatureDisplayUnits) accessory)::subscribeTemperatureDisplayUnits, + ((AccessoryWithTemperatureDisplayUnits) accessory)::unsubscribeTemperatureDisplayUnits)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + public void addOptionalCharacteristic(RotationSpeedCharacteristic speed) { + addCharacteristic(speed); + } + public void addOptionalCharacteristic(SwingModeCharacteristic mode) { + addCharacteristic(mode); + } + public void addOptionalCharacteristic(LockPhysicalControlsCharacteristic lock) { + addCharacteristic(lock); + } + public void addOptionalCharacteristic(CoolingThresholdTemperatureCharacteristic threshold) { + addCharacteristic(threshold); + } + public void addOptionalCharacteristic(HeatingThresholdTemperatureCharacteristic threshold) { + addCharacteristic(threshold); + } + public void addOptionalCharacteristic(TemperatureDisplayUnitCharacteristic displayUnits) { + addCharacteristic(displayUnits); + } + +} From 8d692a1509e7e09c225a230e85cd8f52f2a0ecc7 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Tue, 12 May 2020 19:00:45 +0200 Subject: [PATCH 17/23] add humidifier dehumidifier accessory Signed-off-by: Eugen Freiter --- README.md | 10 +- .../hapjava/accessories/FaucetAccessory.java | 8 +- .../accessories/HeaterCoolerAccessory.java | 11 +- .../HumidifierDehumidifierAccessory.java | 108 +++++++++++++ ...soryWithHumidityDehumidifierThreshold.java | 37 +++++ ...essoryWithHumidityHumidifierThreshold.java | 37 +++++ .../AccessoryWithTemperatureDisplayUnits.java | 12 +- .../AccessoryWithWaterLevel.java | 29 ++++ .../impl/common/WaterLavelCharacteristic.java | 31 ++++ ...urrentHeaterCoolerStateCharacteristic.java | 15 +- .../CurrentHeaterCoolerStateEnum.java | 7 +- ...TargetHeaterCoolerStateCharacteristic.java | 17 +- .../TargetHeaterCoolerStateEnum.java | 7 +- ...difierDehumidifierStateCharacteristic.java | 29 ++++ ...urrentHumidifierDehumidifierStateEnum.java | 37 +++++ ...tyDehumidifierThresholdCharacteristic.java | 35 ++++ ...dityHumidifierThresholdCharacteristic.java | 35 ++++ ...difierDehumidifierStateCharacteristic.java | 39 +++++ ...TargetHumidifierDehumidifierStateEnum.java | 36 +++++ .../hapjava/services/impl/FaucetService.java | 14 +- .../services/impl/HeaterCoolerService.java | 37 +++-- .../impl/HumidifierDehumidifierService.java | 151 ++++++++++++++++++ 22 files changed, 667 insertions(+), 75 deletions(-) create mode 100644 src/main/java/io/github/hapjava/accessories/HumidifierDehumidifierAccessory.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityDehumidifierThreshold.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityHumidifierThreshold.java create mode 100644 src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithWaterLevel.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/WaterLavelCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/humidifier/CurrentHumidifierDehumidifierStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/humidifier/CurrentHumidifierDehumidifierStateEnum.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityDehumidifierThresholdCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityHumidifierThresholdCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/humidifier/TargetHumidifierDehumidifierStateCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/humidifier/TargetHumidifierDehumidifierStateEnum.java create mode 100644 src/main/java/io/github/hapjava/services/impl/HumidifierDehumidifierService.java diff --git a/README.md b/README.md index 16992be14..0b85001d5 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ HAP-Java ========= -HAP-Java is a Java implementation of the Homekit Accessory Protocol. +HAP-Java is a Java implementation of the HomeKit Accessory Protocol. -Using this library, you can create your own Homekit Accessory or Homekit Accessory Bridge. +Using this library, you can create your own HomeKit Accessory or HomeKit Accessory Bridge. This library would not have been possible without [Tian Zhang](https://github.com/KhaosT) who did a lot of the hard work of figuring out how the protocol works in his NodeJS implementation. @@ -18,13 +18,13 @@ Include HAP-Java in your project using maven: ``` -After that, read the [Javadoc](http://beowulfe.github.io/HAP-Java/apidocs/) and check out the [Sample](https://github.com/beowulfe/HAP-Java/tree/sample). +After that, check out the [Sample](https://github.com/hap-java/HAP-Java/tree/sample). Supported HomeKit Accessories ========= Current implementation is based on HAP specification Release R2 (published 2019-07-26) and -fully supports 35 out of 45 HomeKit accessory services defined there. +fully supports 36 out of 45 HomeKit accessory services defined there. | HomeKit Accessory & Service type | Supported by Java-HAP | |--------------------|--------------------| @@ -46,7 +46,7 @@ fully supports 35 out of 45 HomeKit accessory services defined there. | Garage Door Opener | :white_check_mark: | | HAP Protocol Information | :white_check_mark: | | Heater Cooler | :white_check_mark: | -| Humidifier Dehumidifier | :x: | +| Humidifier Dehumidifier | :white_check_mark: | | Humidity Sensor | :white_check_mark: | | Irrigation System | :x: | | Leak Sensor | :white_check_mark: | diff --git a/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java b/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java index 907d7bb38..7e09a927c 100644 --- a/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java @@ -1,13 +1,11 @@ package io.github.hapjava.accessories; -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.CompletableFuture; -import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithFanState; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import io.github.hapjava.services.Service; -import io.github.hapjava.services.impl.FanService; import io.github.hapjava.services.impl.FaucetService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; /** * This service describes accessories like faucets or shower heads. diff --git a/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java b/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java index c8ef7a090..0c43ac7fc 100644 --- a/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java @@ -1,13 +1,13 @@ package io.github.hapjava.accessories; -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.CompletableFuture; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import io.github.hapjava.characteristics.impl.heatercooler.CurrentHeaterCoolerStateEnum; import io.github.hapjava.characteristics.impl.heatercooler.TargetHeaterCoolerStateEnum; import io.github.hapjava.services.Service; import io.github.hapjava.services.impl.HeaterCoolerService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; /** * Heater Cooler accessory @@ -22,16 +22,15 @@ public interface HeaterCoolerAccessory extends HomekitAccessory { */ CompletableFuture getCurrentTemperature(); - /** - * Mandatory: Retrieves the current active state of the fan'. + * Mandatory: Retrieves the current active state of the Heater Cooler. * * @return a future that will contain the binary state */ CompletableFuture isActive(); /** - * Sets the active state of the fan + * Sets the active state of the Heater Cooler * * @param state the binary state to set * @return a future that completes when the change is made diff --git a/src/main/java/io/github/hapjava/accessories/HumidifierDehumidifierAccessory.java b/src/main/java/io/github/hapjava/accessories/HumidifierDehumidifierAccessory.java new file mode 100644 index 000000000..124cc31bf --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/HumidifierDehumidifierAccessory.java @@ -0,0 +1,108 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.humidifier.CurrentHumidifierDehumidifierStateEnum; +import io.github.hapjava.characteristics.impl.humidifier.TargetHumidifierDehumidifierStateEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.HumidifierDehumidifierService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * Humidifier/Dehumidifier accessory + * + * @author Eugen Freiter + */ +public interface HumidifierDehumidifierAccessory extends HomekitAccessory { + /** + * Retrieves the current relative humidity. + * + * @return a future that will contain the humidity as a value between 0 and 100. + */ + CompletableFuture getCurrentHumidity(); + + /** + * Mandatory: Retrieves the current active state of the humidifier/dehumidifier. + * + * @return a future that will contain the binary state + */ + CompletableFuture isActive(); + + /** + * Sets the active state of the humidifier/dehumidifier + * + * @param state the binary state to set + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setActive(boolean state) throws Exception; + + /** + * Retrieves the humidifier/dehumidifier current state. + * + * @return a future that will contain the humidifier/dehumidifier current state . + */ + CompletableFuture getCurrentHumidifierDehumidifierState(); + + /** + * Retrieves the humidifier/dehumidifier target state. + * + * @return a future that will contain the humidifier/dehumidifier target state . + */ + CompletableFuture getTargetHumidifierDehumidifierState(); + + /** + * set humidifier/dehumidifier target state the lock target state. + * + * @param state humidifier/dehumidifier target state + * @return a future that completes when the change is made + */ + CompletableFuture setTargetHumidifierDehumidifierState( + TargetHumidifierDehumidifierStateEnum state); + + /** + * Subscribes to changes in the humidifier/dehumidifier current state. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentHumidifierDehumidifierState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in humidifier/dehumidifier current state. */ + void unsubscribeCurrentHumidifierDehumidifierState(); + + /** + * Subscribes to changes in the humidifier/dehumidifier target state. + * + * @param callback the function to call when the state changes. + */ + void subscribeTargetHumidifierDehumidifierState(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in humidifier/dehumidifier target state. */ + void unsubscribeTargetHumidifierDehumidifierState(); + + /** + * Subscribes to changes in the active state of the humidifier/dehumidifier . + * + * @param callback the function to call when the active state changes. + */ + void subscribeActive(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the active state of the humidifier/dehumidifier . */ + void unsubscribeActive(); + + /** + * Subscribes to changes in the current humidity. + * + * @param callback the function to call when the state changes. + */ + void subscribeCurrentHumidity(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the current humidity. */ + void unsubscribeCurrentHumidity(); + + @Override + default Collection getServices() { + return Collections.singleton(new HumidifierDehumidifierService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityDehumidifierThreshold.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityDehumidifierThreshold.java new file mode 100644 index 000000000..90cdeb790 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityDehumidifierThreshold.java @@ -0,0 +1,37 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Dehumidifier with humidity threshold. + * + * @author Eugen Freiter + */ +public interface AccessoryWithHumidityDehumidifierThreshold { + + /** + * Retrieves the humidity threshold. + * + * @return a future that will contain the humidity threshold. + */ + CompletableFuture getHumidityThreshold(); + + /** + * Sets the humidity threshold above which the dehumidifier should be turned on. + * + * @param value the humidity threshold, in celsius degrees. + * @throws Exception when the threshold cannot be changed. + */ + void setHumidityThreshold(Double value) throws Exception; + + /** + * Subscribes to changes in the humidity threshold. + * + * @param callback the function to call when the state changes. + */ + void subscribeHumidityThreshold(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the humidity threshold. */ + void unsubscribeHumidityThreshold(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityHumidifierThreshold.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityHumidifierThreshold.java new file mode 100644 index 000000000..89158d913 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityHumidifierThreshold.java @@ -0,0 +1,37 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Humidifier with humidity threshold. + * + * @author Eugen Freiter + */ +public interface AccessoryWithHumidityHumidifierThreshold { + + /** + * Retrieves the humidity threshold. + * + * @return a future that will contain the humidity threshold. + */ + CompletableFuture getHumidityThreshold(); + + /** + * Sets the humidity threshold above which the humidifier should be turned on. + * + * @param value the humidity threshold, in celsius degrees. + * @throws Exception when the threshold cannot be changed. + */ + void setHumidityThreshold(Double value) throws Exception; + + /** + * Subscribes to changes in the humidity threshold. + * + * @param callback the function to call when the state changes. + */ + void subscribeHumidityThreshold(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the humidity threshold. */ + void unsubscribeHumidityThreshold(); +} diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTemperatureDisplayUnits.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTemperatureDisplayUnits.java index 495c3c8bd..b9407b34b 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTemperatureDisplayUnits.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTemperatureDisplayUnits.java @@ -1,11 +1,13 @@ package io.github.hapjava.accessories.optionalcharacteristic; -import java.util.concurrent.CompletableFuture; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import io.github.hapjava.characteristics.impl.thermostat.TemperatureDisplayUnitEnum; +import java.util.concurrent.CompletableFuture; -/** Accessory with characteristic that describes units of temperature used for presentation purposes (e.g. the units of temperature displayed on the - screen). */ +/** + * Accessory with characteristic that describes units of temperature used for presentation purposes + * (e.g. the units of temperature displayed on the screen). + */ public interface AccessoryWithTemperatureDisplayUnits { /** @@ -15,7 +17,6 @@ public interface AccessoryWithTemperatureDisplayUnits { */ CompletableFuture getTemperatureDisplayUnits(); - /** * Sets the temperature display units * @@ -23,7 +24,8 @@ public interface AccessoryWithTemperatureDisplayUnits { * @return a future that completes when the change is made * @throws Exception when the change cannot be made */ - CompletableFuture setTemperatureDisplayUnits(TemperatureDisplayUnitEnum units) throws Exception; + CompletableFuture setTemperatureDisplayUnits(TemperatureDisplayUnitEnum units) + throws Exception; /** * Subscribes to changes in the temperature display units diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithWaterLevel.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithWaterLevel.java new file mode 100644 index 000000000..45c296645 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithWaterLevel.java @@ -0,0 +1,29 @@ +package io.github.hapjava.accessories.optionalcharacteristic; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import java.util.concurrent.CompletableFuture; + +/** + * Accessory with water level. + * + * @author Eugen Freiter + */ +public interface AccessoryWithWaterLevel { + + /** + * Retrieves the water level in percent. + * + * @return a future that will contain the water level, expressed as an double between 0 and 100. + */ + CompletableFuture getWaterLevel(); + + /** + * Subscribes to changes in the water level. + * + * @param callback the function to call when the state changes. + */ + void subscribeWaterLevel(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the water level. */ + void unsubscribeWaterLevel(); +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/WaterLavelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/WaterLavelCharacteristic.java new file mode 100644 index 000000000..2a1b60751 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/WaterLavelCharacteristic.java @@ -0,0 +1,31 @@ +package io.github.hapjava.characteristics.impl.common; + +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; + +/** This characteristic describes the current water level. */ +public class WaterLavelCharacteristic extends FloatCharacteristic + implements EventableCharacteristic { + + public WaterLavelCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000B5-0000-1000-8000-0026BB765291", + "water level", + 0, + 100, + 1, + "%", + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateCharacteristic.java index 73d75cd13..644e2ca2a 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateCharacteristic.java @@ -1,19 +1,16 @@ package io.github.hapjava.characteristics.impl.heatercooler; +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; -import io.github.hapjava.characteristics.EventableCharacteristic; -import io.github.hapjava.characteristics.ExceptionalConsumer; -import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; -import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; -/** - * This characteristic describes the current state of a heater cooler. - */ -public class CurrentHeaterCoolerStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { +/** This characteristic describes the current state of a heater cooler. */ +public class CurrentHeaterCoolerStateCharacteristic + extends EnumCharacteristic implements EventableCharacteristic { public CurrentHeaterCoolerStateCharacteristic( Supplier> getter, diff --git a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateEnum.java index befc53284..9864acb12 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateEnum.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/CurrentHeaterCoolerStateEnum.java @@ -1,14 +1,11 @@ package io.github.hapjava.characteristics.impl.heatercooler; +import io.github.hapjava.characteristics.CharacteristicEnum; import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; -import io.github.hapjava.characteristics.CharacteristicEnum; -/** 0 ”Inactive” - 1 ”Idle” - 2 ”Heating” - 3 ”Cooling” */ +/** 0 ”Inactive” 1 ”Idle” 2 ”Heating” 3 ”Cooling” */ public enum CurrentHeaterCoolerStateEnum implements CharacteristicEnum { INACTIVE(0), IDLE(1), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateCharacteristic.java index 31cda96ec..0e360c735 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateCharacteristic.java @@ -1,20 +1,17 @@ package io.github.hapjava.characteristics.impl.heatercooler; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Supplier; import io.github.hapjava.characteristics.EventableCharacteristic; import io.github.hapjava.characteristics.ExceptionalConsumer; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import io.github.hapjava.characteristics.impl.base.EnumCharacteristic; -import io.github.hapjava.characteristics.impl.thermostat.TargetHeatingCoolingStateEnum; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Supplier; -/** - * This characteristic describes the target state of heater cooler. - */ -public class TargetHeaterCoolerStateCharacteristic extends EnumCharacteristic - implements EventableCharacteristic { +/** This characteristic describes the target state of heater cooler. */ +public class TargetHeaterCoolerStateCharacteristic + extends EnumCharacteristic implements EventableCharacteristic { public TargetHeaterCoolerStateCharacteristic( Supplier> getter, diff --git a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateEnum.java index 80914273e..a16d3cd6a 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateEnum.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/heatercooler/TargetHeaterCoolerStateEnum.java @@ -1,14 +1,11 @@ package io.github.hapjava.characteristics.impl.heatercooler; +import io.github.hapjava.characteristics.CharacteristicEnum; import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; -import io.github.hapjava.characteristics.CharacteristicEnum; -/** 0 AUTO - ”Heat or Cool” - 1 ”Heat” - 2 ”Cool” - */ +/** 0 AUTO - ”Heat or Cool” 1 ”Heat” 2 ”Cool” */ public enum TargetHeaterCoolerStateEnum implements CharacteristicEnum { AUTO(0), HEAT(1), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/CurrentHumidifierDehumidifierStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/CurrentHumidifierDehumidifierStateCharacteristic.java new file mode 100644 index 000000000..ba72a856b --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/CurrentHumidifierDehumidifierStateCharacteristic.java @@ -0,0 +1,29 @@ +package io.github.hapjava.characteristics.impl.humidifier; + +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; + +/** This characteristic describes the current state of a humidifier or/and a dehumidifier. */ +public class CurrentHumidifierDehumidifierStateCharacteristic + extends EnumCharacteristic + implements EventableCharacteristic { + + public CurrentHumidifierDehumidifierStateCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000B3-0000-1000-8000-0026BB765291", + "current humidifier state", + 3, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/CurrentHumidifierDehumidifierStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/CurrentHumidifierDehumidifierStateEnum.java new file mode 100644 index 000000000..d6ec775de --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/CurrentHumidifierDehumidifierStateEnum.java @@ -0,0 +1,37 @@ +package io.github.hapjava.characteristics.impl.humidifier; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 ”Inactive” 1 ”Idle” 2 ”Humidifying” 3 ”Dehumidifying” */ +public enum CurrentHumidifierDehumidifierStateEnum implements CharacteristicEnum { + INACTIVE(0), + IDLE(1), + HUMIDIFYING(2), + DEHUMIDIFYING(3); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CurrentHumidifierDehumidifierStateEnum.values()) + .collect(Collectors.toMap(CurrentHumidifierDehumidifierStateEnum::getCode, t -> t)); + } + + public static CurrentHumidifierDehumidifierStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CurrentHumidifierDehumidifierStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityDehumidifierThresholdCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityDehumidifierThresholdCharacteristic.java new file mode 100644 index 000000000..4375dca54 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityDehumidifierThresholdCharacteristic.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.humidifier; + +import io.github.hapjava.characteristics.ExceptionalConsumer; +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; + +/** + * This characteristic describes the relative humidity dehumidifier threshold. The value of this + * characteristic represents the ʼmaximum relative humidityʼ that must be reached before + * dehumidifier is turned on. + */ +public class HumidityDehumidifierThresholdCharacteristic extends FloatCharacteristic { + + public HumidityDehumidifierThresholdCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000C9-0000-1000-8000-0026BB765291", + "humidity threshold dehumidifier", + 0, + 100, + 1, + "%", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityHumidifierThresholdCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityHumidifierThresholdCharacteristic.java new file mode 100644 index 000000000..8a7a1abcb --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityHumidifierThresholdCharacteristic.java @@ -0,0 +1,35 @@ +package io.github.hapjava.characteristics.impl.humidifier; + +import io.github.hapjava.characteristics.ExceptionalConsumer; +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; + +/** + * This characteristic describes the relative humidity humidifier threshold. The value of this + * characteristic represents the ʼminimum relative humidityʼ that must be reached before humidifier + * is turned on. + */ +public class HumidityHumidifierThresholdCharacteristic extends FloatCharacteristic { + + public HumidityHumidifierThresholdCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000CA-0000-1000-8000-0026BB765291", + "humidity threshold humidifier", + 0, + 100, + 1, + "%", + Optional.of(getter), + Optional.of(setter), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/TargetHumidifierDehumidifierStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/TargetHumidifierDehumidifierStateCharacteristic.java new file mode 100644 index 000000000..63de111d8 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/TargetHumidifierDehumidifierStateCharacteristic.java @@ -0,0 +1,39 @@ +package io.github.hapjava.characteristics.impl.humidifier; + +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.ExceptionalConsumer; +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; + +/** This characteristic describes the target state of a humidifier or/and a dehumidifier.. */ +public class TargetHumidifierDehumidifierStateCharacteristic + extends EnumCharacteristic + implements EventableCharacteristic { + + public TargetHumidifierDehumidifierStateCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000B4-0000-1000-8000-0026BB765291", + "target humidifier state", + 2, + 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(TargetHumidifierDehumidifierStateEnum.fromCode(value)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/TargetHumidifierDehumidifierStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/TargetHumidifierDehumidifierStateEnum.java new file mode 100644 index 000000000..3d4fee0a5 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/TargetHumidifierDehumidifierStateEnum.java @@ -0,0 +1,36 @@ +package io.github.hapjava.characteristics.impl.humidifier; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** 0 - Auto - ”Humidifier or Dehumidifier” 1 ”Humidifier” 2 ”Dehumidifier” */ +public enum TargetHumidifierDehumidifierStateEnum implements CharacteristicEnum { + AUTO(0), + HUMIDIFIER(1), + DEHUMIDIFIER(2); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(TargetHumidifierDehumidifierStateEnum.values()) + .collect(Collectors.toMap(TargetHumidifierDehumidifierStateEnum::getCode, t -> t)); + } + + public static TargetHumidifierDehumidifierStateEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + TargetHumidifierDehumidifierStateEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/FaucetService.java b/src/main/java/io/github/hapjava/services/impl/FaucetService.java index 774d083d5..e641f24c7 100644 --- a/src/main/java/io/github/hapjava/services/impl/FaucetService.java +++ b/src/main/java/io/github/hapjava/services/impl/FaucetService.java @@ -8,11 +8,13 @@ import io.github.hapjava.characteristics.impl.common.NameCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; -/** This service describes accessories like faucets or shower heads. This service must only be included when an accessory - has either a linked {@link HeaterCoolerService} ith single linked {@link ValveService} or multiple - linked {@link ValveService} (with/without {@link HeaterCoolerService} to describe water - outlets. This service serves as a top level service for such accessories. */ - +/** + * This service describes accessories like faucets or shower heads. This service must only be + * included when an accessory has either a linked {@link HeaterCoolerService} ith single linked + * {@link ValveService} or multiple linked {@link ValveService} (with/without {@link + * HeaterCoolerService} to describe water outlets. This service serves as a top level service for + * such accessories. + */ public class FaucetService extends AbstractServiceImpl { public FaucetService(ActiveCharacteristic active) { @@ -42,8 +44,8 @@ public FaucetService(FaucetAccessory accessory) { public void addOptionalCharacteristic(NameCharacteristic name) { addCharacteristic(name); } + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFault) { addCharacteristic(statusFault); } - } diff --git a/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java b/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java index af36433a5..8c53c5b2b 100644 --- a/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java +++ b/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java @@ -22,16 +22,13 @@ import io.github.hapjava.characteristics.impl.thermostat.TemperatureDisplayUnitCharacteristic; /** - * This service can be used to describe either of the following: - * • a heater - * • a cooler - * • a heater and a cooler - * A heater/cooler accessory may have additional: - * • {@link FanService} service to describe a fan which can be independently controlled - * • {@link SlatService} service to control vents - * A heater must include {@link HeatingThresholdTemperatureCharacteristic}. A cooler must include {@link CoolingThresholdTemperatureCharacteristic}. - * A heater/cooler accessory service may include {@link RotationSpeedCharacteristic} to control fan speed if the fan cannot - * be independently controlled. + * This service can be used to describe either of the following: • a heater • a cooler • a heater + * and a cooler A heater/cooler accessory may have additional: • {@link FanService} service to + * describe a fan which can be independently controlled • {@link SlatService} service to control + * vents A heater must include {@link HeatingThresholdTemperatureCharacteristic}. A cooler must + * include {@link CoolingThresholdTemperatureCharacteristic}. A heater/cooler accessory service may + * include {@link RotationSpeedCharacteristic} to control fan speed if the fan cannot be + * independently controlled. */ public class HeaterCoolerService extends AbstractServiceImpl { @@ -57,20 +54,16 @@ public HeaterCoolerService(HeaterCoolerAccessory accessory) { new CurrentTemperatureCharacteristic( accessory::getCurrentTemperature, accessory::subscribeCurrentTemperature, - accessory::unsubscribeCurrentTemperature - ), + accessory::unsubscribeCurrentTemperature), new CurrentHeaterCoolerStateCharacteristic( accessory::getCurrentHeaterCoolerState, accessory::subscribeCurrentHeaterCoolerState, - accessory::unsubscribeCurrentHeaterCoolerState - ), + accessory::unsubscribeCurrentHeaterCoolerState), new TargetHeaterCoolerStateCharacteristic( accessory::getTargetHeaterCoolerState, accessory::setTargetHeaterCoolerState, accessory::subscribeTargetHeaterCoolerState, - accessory::unsubscribeTargetHeaterCoolerState - ) - ); + accessory::unsubscribeTargetHeaterCoolerState)); if (accessory instanceof AccessoryWithName) { addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); } @@ -122,30 +115,36 @@ public HeaterCoolerService(HeaterCoolerAccessory accessory) { ((AccessoryWithTemperatureDisplayUnits) accessory)::getTemperatureDisplayUnits, ((AccessoryWithTemperatureDisplayUnits) accessory)::setTemperatureDisplayUnits, ((AccessoryWithTemperatureDisplayUnits) accessory)::subscribeTemperatureDisplayUnits, - ((AccessoryWithTemperatureDisplayUnits) accessory)::unsubscribeTemperatureDisplayUnits)); + ((AccessoryWithTemperatureDisplayUnits) accessory) + ::unsubscribeTemperatureDisplayUnits)); } } public void addOptionalCharacteristic(NameCharacteristic name) { addCharacteristic(name); } + public void addOptionalCharacteristic(RotationSpeedCharacteristic speed) { addCharacteristic(speed); } + public void addOptionalCharacteristic(SwingModeCharacteristic mode) { addCharacteristic(mode); } + public void addOptionalCharacteristic(LockPhysicalControlsCharacteristic lock) { addCharacteristic(lock); } + public void addOptionalCharacteristic(CoolingThresholdTemperatureCharacteristic threshold) { addCharacteristic(threshold); } + public void addOptionalCharacteristic(HeatingThresholdTemperatureCharacteristic threshold) { addCharacteristic(threshold); } + public void addOptionalCharacteristic(TemperatureDisplayUnitCharacteristic displayUnits) { addCharacteristic(displayUnits); } - } diff --git a/src/main/java/io/github/hapjava/services/impl/HumidifierDehumidifierService.java b/src/main/java/io/github/hapjava/services/impl/HumidifierDehumidifierService.java new file mode 100644 index 000000000..600b877ea --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/HumidifierDehumidifierService.java @@ -0,0 +1,151 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.HumidifierDehumidifierAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHumidityDehumidifierThreshold; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHumidityHumidifierThreshold; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithPhysicalControlsLock; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithRotationSpeed; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithSwingMode; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithWaterLevel; +import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.ActiveEnum; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.WaterLavelCharacteristic; +import io.github.hapjava.characteristics.impl.fan.LockPhysicalControlsCharacteristic; +import io.github.hapjava.characteristics.impl.fan.RotationSpeedCharacteristic; +import io.github.hapjava.characteristics.impl.fan.SwingModeCharacteristic; +import io.github.hapjava.characteristics.impl.humidifier.CurrentHumidifierDehumidifierStateCharacteristic; +import io.github.hapjava.characteristics.impl.humidifier.HumidityDehumidifierThresholdCharacteristic; +import io.github.hapjava.characteristics.impl.humidifier.HumidityHumidifierThresholdCharacteristic; +import io.github.hapjava.characteristics.impl.humidifier.TargetHumidifierDehumidifierStateCharacteristic; +import io.github.hapjava.characteristics.impl.humiditysensor.CurrentRelativeHumidityCharacteristic; + +/** + * This service can be used to describe either of the following: • an air humidifier • an air + * dehumidifier • an air humidifier and an air dehumidifier An air humidifier/dehumidifier accessory + * may have additional: • {@link FanService} service to describe a fan which can be independently + * controlled • {@link SlatService}service to control vents A dehumidifier must include {@link + * HumidityDehumidifierThresholdCharacteristic}. A humidifier must include {@link + * HumidityHumidifierThresholdCharacteristic}. A humidifier/dehumidifier accessory service may + * include {@link RotationSpeedCharacteristic} to control fan speed if the fan cannot be + * independently controlled. + */ +public class HumidifierDehumidifierService extends AbstractServiceImpl { + + public HumidifierDehumidifierService( + ActiveCharacteristic activeCharacteristic, + CurrentRelativeHumidityCharacteristic currentRelativeHumidityCharacteristic, + CurrentHumidifierDehumidifierStateCharacteristic + currentHumidifierDehumidifierStateCharacteristic, + TargetHumidifierDehumidifierStateCharacteristic + targetHumidifierDehumidifierStateCharacteristic) { + super("000000BD-0000-1000-8000-0026BB765291"); + addCharacteristic(activeCharacteristic); + addCharacteristic(currentRelativeHumidityCharacteristic); + addCharacteristic(currentHumidifierDehumidifierStateCharacteristic); + addCharacteristic(targetHumidifierDehumidifierStateCharacteristic); + } + + public HumidifierDehumidifierService(HumidifierDehumidifierAccessory accessory) { + this( + new ActiveCharacteristic( + () -> accessory.isActive().thenApply(s -> s ? ActiveEnum.ACTIVE : ActiveEnum.INACTIVE), + (v) -> accessory.setActive(v == ActiveEnum.ACTIVE), + accessory::subscribeActive, + accessory::unsubscribeActive), + new CurrentRelativeHumidityCharacteristic( + accessory::getCurrentHumidity, + accessory::subscribeCurrentHumidity, + accessory::unsubscribeCurrentHumidity), + new CurrentHumidifierDehumidifierStateCharacteristic( + accessory::getCurrentHumidifierDehumidifierState, + accessory::subscribeCurrentHumidifierDehumidifierState, + accessory::unsubscribeCurrentHumidifierDehumidifierState), + new TargetHumidifierDehumidifierStateCharacteristic( + accessory::getTargetHumidifierDehumidifierState, + accessory::setTargetHumidifierDehumidifierState, + accessory::subscribeTargetHumidifierDehumidifierState, + accessory::unsubscribeTargetHumidifierDehumidifierState)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithRotationSpeed) { + addOptionalCharacteristic( + new RotationSpeedCharacteristic( + ((AccessoryWithRotationSpeed) accessory)::getRotationSpeed, + ((AccessoryWithRotationSpeed) accessory)::setRotationSpeed, + ((AccessoryWithRotationSpeed) accessory)::subscribeRotationSpeed, + ((AccessoryWithRotationSpeed) accessory)::unsubscribeRotationSpeed)); + } + if (accessory instanceof AccessoryWithSwingMode) { + addOptionalCharacteristic( + new SwingModeCharacteristic( + ((AccessoryWithSwingMode) accessory)::getSwingMode, + ((AccessoryWithSwingMode) accessory)::setSwingMode, + ((AccessoryWithSwingMode) accessory)::subscribeSwingMode, + ((AccessoryWithSwingMode) accessory)::unsubscribeSwingMode)); + } + if (accessory instanceof AccessoryWithPhysicalControlsLock) { + addOptionalCharacteristic( + new LockPhysicalControlsCharacteristic( + ((AccessoryWithPhysicalControlsLock) accessory)::getLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::setLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::subscribeLockControls, + ((AccessoryWithPhysicalControlsLock) accessory)::unsubscribeLockControls)); + } + if (accessory instanceof AccessoryWithHumidityDehumidifierThreshold) { + addOptionalCharacteristic( + new HumidityDehumidifierThresholdCharacteristic( + ((AccessoryWithHumidityDehumidifierThreshold) accessory)::getHumidityThreshold, + ((AccessoryWithHumidityDehumidifierThreshold) accessory)::setHumidityThreshold, + ((AccessoryWithHumidityDehumidifierThreshold) accessory)::subscribeHumidityThreshold, + ((AccessoryWithHumidityDehumidifierThreshold) accessory) + ::unsubscribeHumidityThreshold)); + } + if (accessory instanceof AccessoryWithHumidityHumidifierThreshold) { + addOptionalCharacteristic( + new HumidityHumidifierThresholdCharacteristic( + ((AccessoryWithHumidityHumidifierThreshold) accessory)::getHumidityThreshold, + ((AccessoryWithHumidityHumidifierThreshold) accessory)::setHumidityThreshold, + ((AccessoryWithHumidityHumidifierThreshold) accessory)::subscribeHumidityThreshold, + ((AccessoryWithHumidityHumidifierThreshold) accessory) + ::unsubscribeHumidityThreshold)); + } + if (accessory instanceof AccessoryWithWaterLevel) { + addOptionalCharacteristic( + new WaterLavelCharacteristic( + ((AccessoryWithWaterLevel) accessory)::getWaterLevel, + ((AccessoryWithWaterLevel) accessory)::subscribeWaterLevel, + ((AccessoryWithWaterLevel) accessory)::unsubscribeWaterLevel)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(RotationSpeedCharacteristic speed) { + addCharacteristic(speed); + } + + public void addOptionalCharacteristic(SwingModeCharacteristic mode) { + addCharacteristic(mode); + } + + public void addOptionalCharacteristic(LockPhysicalControlsCharacteristic lock) { + addCharacteristic(lock); + } + + public void addOptionalCharacteristic(HumidityDehumidifierThresholdCharacteristic threshold) { + addCharacteristic(threshold); + } + + public void addOptionalCharacteristic(HumidityHumidifierThresholdCharacteristic threshold) { + addCharacteristic(threshold); + } + + public void addOptionalCharacteristic(WaterLavelCharacteristic level) { + addCharacteristic(level); + } +} From 9e4985bc88ae0ac653195339192a7a319d6616f0 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Tue, 12 May 2020 23:10:55 +0200 Subject: [PATCH 18/23] add irrigation system, clean up javadocs Signed-off-by: Eugen Freiter --- README.md | 4 +- .../accessories/AirPurifierAccessory.java | 6 +- .../accessories/AirQualityAccessory.java | 6 +- .../io/github/hapjava/accessories/Bridge.java | 1 + .../CarbonDioxideSensorAccessory.java | 9 +- .../CarbonMonoxideSensorAccessory.java | 3 - .../accessories/ContactSensorAccessory.java | 3 - .../hapjava/accessories/DoorAccessory.java | 6 +- .../accessories/DoorbellAccessory.java | 6 +- .../hapjava/accessories/FanAccessory.java | 4 +- .../hapjava/accessories/FaucetAccessory.java | 6 +- .../GarageDoorOpenerAccessory.java | 2 +- .../accessories/HeaterCoolerAccessory.java | 6 +- .../HumidifierDehumidifierAccessory.java | 6 +- .../IrrigationSystemAccessory.java | 82 +++++++++++++++++++ .../accessories/LeakSensorAccessory.java | 3 - .../accessories/LockMechanismAccessory.java | 6 +- .../accessories/MicrophoneAccessory.java | 6 +- .../accessories/MotionSensorAccessory.java | 3 - .../accessories/OccupancySensorAccessory.java | 3 - .../hapjava/accessories/SlatAccessory.java | 6 +- .../accessories/SmokeSensorAccessory.java | 3 - .../hapjava/accessories/SpeakerAccessory.java | 6 +- .../StatelessProgrammableSwitchAccessory.java | 6 +- .../hapjava/accessories/ValveAccessory.java | 2 +- .../hapjava/accessories/WindowAccessory.java | 6 +- .../AccessoryWithAccessoryFlags.java | 6 +- .../AccessoryWithCarbonDioxideLevel.java | 6 +- .../AccessoryWithCarbonMonoxideLevel.java | 6 +- .../AccessoryWithColorTemperature.java | 6 +- ...essoryWithCoolingThresholdTemperature.java | 6 +- .../AccessoryWithCurrentTilting.java | 6 +- .../AccessoryWithDuration.java | 6 +- .../AccessoryWithFanState.java | 2 +- .../AccessoryWithHardwareRevision.java | 6 +- ...soryWithHumidityDehumidifierThreshold.java | 6 +- ...essoryWithHumidityHumidifierThreshold.java | 6 +- .../AccessoryWithIsConfigured.java | 2 - .../AccessoryWithLockCurrentState.java | 6 +- .../AccessoryWithLockTargetState.java | 6 +- .../AccessoryWithName.java | 6 +- .../AccessoryWithNitrogenDioxideDensity.java | 6 +- .../AccessoryWithOzoneDensity.java | 6 +- .../AccessoryWithPM10Density.java | 6 +- .../AccessoryWithPM25Density.java | 6 +- .../AccessoryWithPhysicalControlsLock.java | 6 +- .../AccessoryWithRotationDirection.java | 6 +- .../AccessoryWithRotationSpeed.java | 6 +- .../AccessoryWithSecurityAlarmType.java | 10 +-- .../AccessoryWithServiceLabelIndex.java | 7 +- .../AccessoryWithStatusActive.java | 6 +- .../AccessoryWithStatusFault.java | 8 +- .../AccessoryWithStatusLowBattery.java | 8 +- .../AccessoryWithStatusTampered.java | 11 +-- .../AccessoryWithSulphurDioxideDensity.java | 6 +- .../AccessoryWithSwingMode.java | 6 +- .../AccessoryWithTargetTilting.java | 6 +- .../AccessoryWithVOCDensity.java | 6 +- .../AccessoryWithVolume.java | 6 +- .../AccessoryWithWaterLevel.java | 6 +- .../AccessoryFlagsCharacteristic.java | 5 +- .../HardwareRevisionCharacteristic.java | 2 +- .../ManufacturerCharacteristic.java | 5 +- .../ModelCharacteristic.java | 5 +- .../SerialNumberCharacteristic.java | 5 +- .../CurrentAirPurifierCharacteristic.java | 5 +- .../TargetAirPurifierStateCharacteristic.java | 5 +- .../airquality/AirQualityCharacteristic.java | 4 +- .../NitrogenDioxideDensityCharacteristic.java | 2 +- .../OzoneDensityCharacteristic.java | 2 +- .../airquality/PM10DensityCharacteristic.java | 2 +- .../airquality/PM25DensityCharacteristic.java | 2 +- .../SulphurDioxideDensityCharacteristic.java | 2 +- .../airquality/VOCDensityCharacteristic.java | 5 +- .../impl/audio/MuteCharacteristic.java | 2 +- .../impl/audio/VolumeCharacteristic.java | 8 +- .../battery/ChargingStateCharacteristic.java | 5 +- .../StatusLowBatteryCharacteristic.java | 5 +- .../CarbonDioxideDetectedCharacteristic.java | 4 +- .../CarbonDioxidePeakLevelCharacteristic.java | 5 +- .../CarbonMonoxideDetectedCharacteristic.java | 4 +- .../CarbonMonoxideLevelCharacteristic.java | 2 +- ...CarbonMonoxidePeakLevelCharacteristic.java | 5 +- .../impl/common/ActiveCharacteristic.java | 5 +- .../impl/common/InUseCharacteristic.java | 4 +- .../common/IsConfiguredCharacteristic.java | 6 +- .../impl/common/NameCharacteristic.java | 2 +- .../ObstructionDetectedCharacteristic.java | 7 +- .../common/ProgramModeCharacteristic.java | 28 +++++++ .../impl/common/ProgramModeEnum.java | 39 +++++++++ ...ProgrammableSwitchEventCharacteristic.java | 10 +-- .../ServiceLabelIndexCharacteristic.java | 4 +- .../ServiceLabelNamespaceCharacteristic.java | 5 +- .../common/ServiceLabelNamespaceEnum.java | 4 +- .../common/StatusActiveCharacteristic.java | 7 +- .../common/StatusFaultCharacteristic.java | 6 +- .../common/StatusTamperedCharacteristic.java | 5 +- .../impl/common/VersionCharacteristic.java | 2 +- .../impl/common/WaterLavelCharacteristic.java | 2 +- .../ContactSensorStateCharacteristic.java | 6 +- .../fan/CurrentFanStateCharacteristic.java | 5 +- .../LockPhysicalControlsCharacteristic.java | 7 +- .../impl/garagedoor/CurrentDoorStateEnum.java | 2 +- ...tyDehumidifierThresholdCharacteristic.java | 5 +- ...dityHumidifierThresholdCharacteristic.java | 5 +- ...CurrentRelativeHumidityCharacteristic.java | 5 +- .../TargetRelativeHumidityCharacteristic.java | 5 +- .../LeakDetectedStateCharacteristic.java | 4 +- .../lightbulb/BrightnessCharacteristic.java | 5 +- .../ColorTemperatureCharacteristic.java | 6 +- ...urrentAmbientLightLevelCharacteristic.java | 5 +- .../outlet/OutletInUseCharacteristic.java | 4 +- ...SecuritySystemAlarmTypeCharacteristic.java | 4 +- .../slat/CurrentTiltAngleCharacteristic.java | 6 +- .../impl/slat/SlatTypeCharacteristic.java | 4 +- .../slat/TargetTiltAngleCharacteristic.java | 5 +- .../SmokeDetectedCharacteristic.java | 5 +- ...ingThresholdTemperatureCharacteristic.java | 4 +- ...rentHeatingCoolingStateCharacteristic.java | 1 - .../CurrentHeatingCoolingStateEnum.java | 4 +- ...ingThresholdTemperatureCharacteristic.java | 6 +- ...rgetHeatingCoolingStateCharacteristic.java | 5 +- .../TargetHeatingCoolingStateEnum.java | 6 +- .../TargetTemperatureCharacteristic.java | 3 +- .../TemperatureDisplayUnitEnum.java | 2 +- .../RemainingDurationCharacteristic.java | 10 +-- .../impl/valve/SetDurationCharacteristic.java | 6 +- ...rentHorizontalTiltAngleCharacteristic.java | 8 +- .../CurrentPositionCharacteristic.java | 8 +- ...urrentVerticalTiltAngleCharacteristic.java | 8 +- .../HoldPositionCharacteristic.java | 6 +- .../PositionStateCharacteristic.java | 5 +- .../windowcovering/PositionStateEnum.java | 2 +- ...rgetHorizontalTiltAngleCharacteristic.java | 5 +- .../TargetPositionCharacteristic.java | 8 +- ...TargetVerticalTiltAngleCharacteristic.java | 5 +- .../services/impl/AbstractServiceImpl.java | 5 +- .../impl/AccessoryInformationService.java | 2 +- .../services/impl/AirQualityService.java | 2 +- .../services/impl/DoorbellService.java | 7 +- .../hapjava/services/impl/FaucetService.java | 9 +- .../impl/GarageDoorOpenerService.java | 5 +- .../impl/HAPProtocolInformationService.java | 2 +- .../services/impl/HeaterCoolerService.java | 10 +-- .../impl/HumidifierDehumidifierService.java | 11 +-- .../impl/IrrigationSystemService.java | 71 ++++++++++++++++ .../services/impl/LockMechanismService.java | 5 +- .../hapjava/services/impl/SlatService.java | 6 +- .../hapjava/services/impl/SpeakerService.java | 2 +- .../StatelessProgrammableSwitchService.java | 6 +- .../hapjava/services/impl/ValveService.java | 5 +- .../services/impl/WindowCoveringService.java | 5 +- 152 files changed, 414 insertions(+), 566 deletions(-) create mode 100644 src/main/java/io/github/hapjava/accessories/IrrigationSystemAccessory.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ProgramModeCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/characteristics/impl/common/ProgramModeEnum.java create mode 100644 src/main/java/io/github/hapjava/services/impl/IrrigationSystemService.java diff --git a/README.md b/README.md index 0b85001d5..d27b04e8c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Supported HomeKit Accessories ========= Current implementation is based on HAP specification Release R2 (published 2019-07-26) and -fully supports 36 out of 45 HomeKit accessory services defined there. +fully supports 37 out of 45 HomeKit accessory services defined there. | HomeKit Accessory & Service type | Supported by Java-HAP | |--------------------|--------------------| @@ -48,7 +48,7 @@ fully supports 36 out of 45 HomeKit accessory services defined there. | Heater Cooler | :white_check_mark: | | Humidifier Dehumidifier | :white_check_mark: | | Humidity Sensor | :white_check_mark: | -| Irrigation System | :x: | +| Irrigation System | :white_check_mark: | | Leak Sensor | :white_check_mark: | | Light Bulb | :white_check_mark: | | Light Sensor | :white_check_mark: | diff --git a/src/main/java/io/github/hapjava/accessories/AirPurifierAccessory.java b/src/main/java/io/github/hapjava/accessories/AirPurifierAccessory.java index a96db6e33..3766f75a1 100644 --- a/src/main/java/io/github/hapjava/accessories/AirPurifierAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/AirPurifierAccessory.java @@ -9,11 +9,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * An air purifier. - * - * @author Eugen Freiter - */ +/** An air purifier. */ public interface AirPurifierAccessory extends HomekitAccessory { /** * Mandatory: Retrieves the current active state of the fan'. diff --git a/src/main/java/io/github/hapjava/accessories/AirQualityAccessory.java b/src/main/java/io/github/hapjava/accessories/AirQualityAccessory.java index fca769272..309fb486e 100644 --- a/src/main/java/io/github/hapjava/accessories/AirQualityAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/AirQualityAccessory.java @@ -8,11 +8,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * An air quality accessory which can include several sensors. - * - * @author Eugen Freiter - */ +/** An air quality accessory which can include several sensors. */ public interface AirQualityAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/Bridge.java b/src/main/java/io/github/hapjava/accessories/Bridge.java index 2c71c09df..e53c427f2 100644 --- a/src/main/java/io/github/hapjava/accessories/Bridge.java +++ b/src/main/java/io/github/hapjava/accessories/Bridge.java @@ -1,5 +1,6 @@ package io.github.hapjava.accessories; +/** HomeKit bridge service. */ public interface Bridge extends HomekitAccessory { @Override diff --git a/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensorAccessory.java b/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensorAccessory.java index 0bd56c4ee..185aedd13 100644 --- a/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensorAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensorAccessory.java @@ -8,14 +8,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * A carbon dioxide sensor reports whether carbon dioxide has been detected or not. - * - *

Carbon dioxide sensors that run on batteries will need to implement this interface and also - * implement {@link BatteryAccessory}. - * - * @author Eugen Freiter - */ +/** A carbon dioxide sensor reports carbon dioxide level. */ public interface CarbonDioxideSensorAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensorAccessory.java b/src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensorAccessory.java index 9bb23f727..93cfebbd6 100644 --- a/src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensorAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/CarbonMonoxideSensorAccessory.java @@ -11,9 +11,6 @@ /** * A carbon monoxide sensor reports whether carbon monoxide has been detected or not. * - *

Carbon monoxide sensors that run on batteries will need to implement this interface and also - * implement {@link BatteryAccessory}. - * * @author Gaston Dombiak */ public interface CarbonMonoxideSensorAccessory extends HomekitAccessory { diff --git a/src/main/java/io/github/hapjava/accessories/ContactSensorAccessory.java b/src/main/java/io/github/hapjava/accessories/ContactSensorAccessory.java index 61db18768..754f6981b 100644 --- a/src/main/java/io/github/hapjava/accessories/ContactSensorAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/ContactSensorAccessory.java @@ -12,9 +12,6 @@ * A contact sensor that reports whether contact is detected or not. Typical contact sensors are * window/door sensors. When contact is detected it means that the door/window is closed. * - *

Contact sensors that run on batteries will need to implement this interface and also implement - * {@link BatteryAccessory}. - * * @author Gaston Dombiak */ public interface ContactSensorAccessory extends HomekitAccessory { diff --git a/src/main/java/io/github/hapjava/accessories/DoorAccessory.java b/src/main/java/io/github/hapjava/accessories/DoorAccessory.java index dbd7b3b7e..1049c7686 100644 --- a/src/main/java/io/github/hapjava/accessories/DoorAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/DoorAccessory.java @@ -8,11 +8,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * A door with status - * - * @author Eugen Freiter - */ +/** A motorized door with current and target position. */ public interface DoorAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/DoorbellAccessory.java b/src/main/java/io/github/hapjava/accessories/DoorbellAccessory.java index 6bcdeb17a..d46d4a00e 100644 --- a/src/main/java/io/github/hapjava/accessories/DoorbellAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/DoorbellAccessory.java @@ -8,11 +8,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * The Doorbell accessory describes a doorbell. - * - * @author Eugen Freiter - */ +/** doorbell accessory with a switch (button push) event. */ public interface DoorbellAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/FanAccessory.java b/src/main/java/io/github/hapjava/accessories/FanAccessory.java index fad72fc42..641214e76 100644 --- a/src/main/java/io/github/hapjava/accessories/FanAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/FanAccessory.java @@ -1,6 +1,5 @@ package io.github.hapjava.accessories; -import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithFanState; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import io.github.hapjava.services.Service; import io.github.hapjava.services.impl.FanService; @@ -9,8 +8,7 @@ import java.util.concurrent.CompletableFuture; /** - * A fan with basic characteristics. User {@link AccessoryWithFanState} for Fan with more - * characteristics. + * A fan with mandatory characteristics. * * @author Andy Lintner */ diff --git a/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java b/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java index 7e09a927c..7a000fcec 100644 --- a/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/FaucetAccessory.java @@ -7,11 +7,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * This service describes accessories like faucets or shower heads. - * - * @author Eugen Freiter - */ +/** Faucets or shower heads accessory. */ public interface FaucetAccessory extends HomekitAccessory { /** * Mandatory: Retrieves the current active state of the faucet. diff --git a/src/main/java/io/github/hapjava/accessories/GarageDoorOpenerAccessory.java b/src/main/java/io/github/hapjava/accessories/GarageDoorOpenerAccessory.java index f012d4ca6..37bd8a063 100644 --- a/src/main/java/io/github/hapjava/accessories/GarageDoorOpenerAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/GarageDoorOpenerAccessory.java @@ -10,7 +10,7 @@ import java.util.concurrent.CompletableFuture; /** - * A garage door opener, with control and status of a garage door + * garage door opener accessory with control and status of a garage door * * @author Andy Lintner */ diff --git a/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java b/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java index 0c43ac7fc..d403b3839 100644 --- a/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/HeaterCoolerAccessory.java @@ -9,11 +9,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * Heater Cooler accessory - * - * @author Eugen Freiter - */ +/** Heater Cooler accessory */ public interface HeaterCoolerAccessory extends HomekitAccessory { /** * Retrieves the current temperature, in celsius degrees. diff --git a/src/main/java/io/github/hapjava/accessories/HumidifierDehumidifierAccessory.java b/src/main/java/io/github/hapjava/accessories/HumidifierDehumidifierAccessory.java index 124cc31bf..bc723ce27 100644 --- a/src/main/java/io/github/hapjava/accessories/HumidifierDehumidifierAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/HumidifierDehumidifierAccessory.java @@ -9,11 +9,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * Humidifier/Dehumidifier accessory - * - * @author Eugen Freiter - */ +/** Humidifier/Dehumidifier accessory */ public interface HumidifierDehumidifierAccessory extends HomekitAccessory { /** * Retrieves the current relative humidity. diff --git a/src/main/java/io/github/hapjava/accessories/IrrigationSystemAccessory.java b/src/main/java/io/github/hapjava/accessories/IrrigationSystemAccessory.java new file mode 100644 index 000000000..dffa2e00b --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/IrrigationSystemAccessory.java @@ -0,0 +1,82 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; +import io.github.hapjava.characteristics.impl.common.ActiveEnum; +import io.github.hapjava.characteristics.impl.common.InUseEnum; +import io.github.hapjava.characteristics.impl.common.ProgramModeEnum; +import io.github.hapjava.services.Service; +import io.github.hapjava.services.impl.IrrigationSystemService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** irrigation system accessory that controls several valves. */ +public interface IrrigationSystemAccessory extends HomekitAccessory { + + /** + * An irrigation system is set to Active when the system is enabled. When one of the valves is set + * to In Use, the irrigation system must be set to in use. + * + * @return a future that will contain the binary state + */ + CompletableFuture getActive(); + + /** + * Sets the irrigation active state + * + * @param active the binary state to set + * @return a future that completes when the change is made + * @throws Exception when the change cannot be made + */ + CompletableFuture setActive(ActiveEnum active) throws Exception; + + /** + * Retrieves the program mode status + * + * @return a future that will contain the valve type. + */ + CompletableFuture getProgramMode(); + + /** + * Retrieves the current inUse state of the irrigation; InUse means one of the valves is set to In + * Use. + * + * @return a future that will contain the binary state + */ + CompletableFuture getInUse(); + + /** + * Subscribes to changes in the inUse state. + * + * @param callback the function to call when the state changes. + */ + void subscribeInUse(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the inUse state. */ + void unsubscribeInUse(); + + /** + * Subscribes to changes in the active state of the irrigation. + * + * @param callback the function to call when the state changes. + */ + void subscribeActive(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the irrigation active state. */ + void unsubscribeActive(); + + /** + * Subscribes to changes in the program mode of the irrigation system. + * + * @param callback the function to call when the state changes. + */ + void subscribeProgramMode(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the program mode. */ + void unsubscribeProgramMode(); + + @Override + default Collection getServices() { + return Collections.singleton(new IrrigationSystemService(this)); + } +} diff --git a/src/main/java/io/github/hapjava/accessories/LeakSensorAccessory.java b/src/main/java/io/github/hapjava/accessories/LeakSensorAccessory.java index 04049d8d2..c36ce278c 100644 --- a/src/main/java/io/github/hapjava/accessories/LeakSensorAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/LeakSensorAccessory.java @@ -11,9 +11,6 @@ /** * A leak sensor that reports whether a leak has been detected. * - *

Leak sensors that run on batteries will need to implement this interface and also implement - * {@link BatteryAccessory}. - * * @author Tim Harper */ public interface LeakSensorAccessory extends HomekitAccessory { diff --git a/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java b/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java index fb3dcf9aa..f12f3e286 100644 --- a/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/LockMechanismAccessory.java @@ -9,11 +9,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * Lock mechanism - * - * @author Eugen Freiter - */ +/** Lock mechanism with current and target state. */ public interface LockMechanismAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/MicrophoneAccessory.java b/src/main/java/io/github/hapjava/accessories/MicrophoneAccessory.java index 480f1b067..f63f8b70c 100644 --- a/src/main/java/io/github/hapjava/accessories/MicrophoneAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/MicrophoneAccessory.java @@ -7,11 +7,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * Microphone accessory. - * - * @author Eugen Freiter - */ +/** Microphone accessory with mute state. */ public interface MicrophoneAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/MotionSensorAccessory.java b/src/main/java/io/github/hapjava/accessories/MotionSensorAccessory.java index b8fdedab8..e843068b1 100644 --- a/src/main/java/io/github/hapjava/accessories/MotionSensorAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/MotionSensorAccessory.java @@ -10,9 +10,6 @@ /** * A motion sensor that reports whether motion has been detected. * - *

Motion sensors that run on batteries will need to implement this interface and also implement - * {@link BatteryAccessory}. - * * @author Gaston Dombiak */ public interface MotionSensorAccessory extends HomekitAccessory { diff --git a/src/main/java/io/github/hapjava/accessories/OccupancySensorAccessory.java b/src/main/java/io/github/hapjava/accessories/OccupancySensorAccessory.java index df2f59709..5fc3cff1e 100644 --- a/src/main/java/io/github/hapjava/accessories/OccupancySensorAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/OccupancySensorAccessory.java @@ -11,9 +11,6 @@ /** * An occupancy sensor that reports whether occupancy has been detected. * - *

Occupancy sensors that run on batteries will need to implement this interface and also - * implement {@link BatteryAccessory}. - * * @author Tim Harper */ public interface OccupancySensorAccessory extends HomekitAccessory { diff --git a/src/main/java/io/github/hapjava/accessories/SlatAccessory.java b/src/main/java/io/github/hapjava/accessories/SlatAccessory.java index 89266a400..62888ab60 100644 --- a/src/main/java/io/github/hapjava/accessories/SlatAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/SlatAccessory.java @@ -9,11 +9,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * A slat which tilts on a vertical or a horizontal axis. - * - * @author Eugen Freiter - */ +/** A slat accessory which tilts on a vertical or a horizontal axis. */ public interface SlatAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/SmokeSensorAccessory.java b/src/main/java/io/github/hapjava/accessories/SmokeSensorAccessory.java index ca1945351..b6a8b1054 100644 --- a/src/main/java/io/github/hapjava/accessories/SmokeSensorAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/SmokeSensorAccessory.java @@ -11,9 +11,6 @@ /** * A smoke sensor reports whether smoke has been detected or not. * - *

Smoke sensors that run on batteries will need to implement this interface and also implement - * {@link BatteryAccessory}. - * * @author Gaston Dombiak */ public interface SmokeSensorAccessory extends HomekitAccessory { diff --git a/src/main/java/io/github/hapjava/accessories/SpeakerAccessory.java b/src/main/java/io/github/hapjava/accessories/SpeakerAccessory.java index f0c44e228..661607a30 100644 --- a/src/main/java/io/github/hapjava/accessories/SpeakerAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/SpeakerAccessory.java @@ -7,11 +7,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * Speaker accessory. - * - * @author Eugen Freiter - */ +/** Speaker accessory. */ public interface SpeakerAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/StatelessProgrammableSwitchAccessory.java b/src/main/java/io/github/hapjava/accessories/StatelessProgrammableSwitchAccessory.java index fa36713bd..354c36587 100644 --- a/src/main/java/io/github/hapjava/accessories/StatelessProgrammableSwitchAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/StatelessProgrammableSwitchAccessory.java @@ -8,11 +8,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * The Stateless Programmable Switch accessory describes a stateless programmable switch.. - * - * @author Eugen Freiter - */ +/** The Stateless Programmable Switch accessory */ public interface StatelessProgrammableSwitchAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/ValveAccessory.java b/src/main/java/io/github/hapjava/accessories/ValveAccessory.java index 4348e163a..3db17e41f 100644 --- a/src/main/java/io/github/hapjava/accessories/ValveAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/ValveAccessory.java @@ -81,7 +81,7 @@ public interface ValveAccessory extends HomekitAccessory { */ void subscribeValveType(HomekitCharacteristicChangeCallback callback); - /** Unsubscribes from changes in the valveType state light. */ + /** Unsubscribes from changes in the valveType state. */ void unsubscribeValveType(); @Override diff --git a/src/main/java/io/github/hapjava/accessories/WindowAccessory.java b/src/main/java/io/github/hapjava/accessories/WindowAccessory.java index f5a7559b3..6cc52322b 100644 --- a/src/main/java/io/github/hapjava/accessories/WindowAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/WindowAccessory.java @@ -8,11 +8,7 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -/** - * A Window with status of a door - * - * @author Eugen Freiter - */ +/** motorized window accessory. */ public interface WindowAccessory extends HomekitAccessory { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithAccessoryFlags.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithAccessoryFlags.java index 05634a3e8..27d9c2e18 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithAccessoryFlags.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithAccessoryFlags.java @@ -4,11 +4,7 @@ import io.github.hapjava.characteristics.impl.accessoryinformation.AccessoryFlagsEnum; import java.util.concurrent.CompletableFuture; -/** - * Accessory with accessory flags, which indicates that additional setup is required - * - * @author Eugen Freiter - */ +/** Accessory with accessory flags, which indicates that additional setup is required */ public interface AccessoryWithAccessoryFlags { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonDioxideLevel.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonDioxideLevel.java index 16260bda2..bd4bb3afc 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonDioxideLevel.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonDioxideLevel.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with carbon dioxide level and peak level characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with carbon dioxide level and peak level characteristic. */ public interface AccessoryWithCarbonDioxideLevel { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonMonoxideLevel.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonMonoxideLevel.java index befb4d5ac..a3946c40b 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonMonoxideLevel.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCarbonMonoxideLevel.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with carbon dioxide level and peak level characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with carbon dioxide level and peak level characteristic. */ public interface AccessoryWithCarbonMonoxideLevel { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColorTemperature.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColorTemperature.java index c6bde73da..fee36884d 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColorTemperature.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithColorTemperature.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with color temperature. - * - * @author Eugen Freiter - */ +/** Accessory with color temperature. */ public interface AccessoryWithColorTemperature { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java index 6e529bd53..b96be7b6e 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with cooling threshold temperature. - * - * @author Eugen Freiter - */ +/** Accessory with cooling threshold temperature. */ public interface AccessoryWithCoolingThresholdTemperature { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentTilting.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentTilting.java index c8b3125ec..54a558491 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentTilting.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCurrentTilting.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with current tilting characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with current tilting characteristic. */ public interface AccessoryWithCurrentTilting { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java index 7304dc3e0..e3d310dfd 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithDuration.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with duration characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with duration characteristic. */ public interface AccessoryWithDuration { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java index e2359f85c..75be61e8c 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithFanState.java @@ -6,7 +6,7 @@ import java.util.concurrent.CompletableFuture; /** - * A fan, with power and rotational characteristics. + * An accessory with current and target fan states. * * @author Andy Lintner */ diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHardwareRevision.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHardwareRevision.java index 6f1259ef4..866921817 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHardwareRevision.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHardwareRevision.java @@ -2,11 +2,7 @@ import java.util.concurrent.CompletableFuture; -/** - * Accessory with name . - * - * @author Eugen Freiter - */ +/** Accessory with hardware revision. */ public interface AccessoryWithHardwareRevision { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityDehumidifierThreshold.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityDehumidifierThreshold.java index 90cdeb790..4dff49352 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityDehumidifierThreshold.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityDehumidifierThreshold.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Dehumidifier with humidity threshold. - * - * @author Eugen Freiter - */ +/** Dehumidifier with humidity threshold. */ public interface AccessoryWithHumidityDehumidifierThreshold { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityHumidifierThreshold.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityHumidifierThreshold.java index 89158d913..f783a3039 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityHumidifierThreshold.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHumidityHumidifierThreshold.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Humidifier with humidity threshold. - * - * @author Eugen Freiter - */ +/** Humidifier with humidity threshold. */ public interface AccessoryWithHumidityHumidifierThreshold { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithIsConfigured.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithIsConfigured.java index b80f1ad65..017fdce5f 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithIsConfigured.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithIsConfigured.java @@ -8,8 +8,6 @@ * Accessory with isConfigured characteristics. This characteristic describes if the service is * configured for use. For example, all of the valves in an irrigation system may not be configured * depending on physical wire connection. - * - * @author Eugen Freiter */ public interface AccessoryWithIsConfigured { diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockCurrentState.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockCurrentState.java index 2a63b64f5..f3f9782ca 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockCurrentState.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockCurrentState.java @@ -4,11 +4,7 @@ import io.github.hapjava.characteristics.impl.lock.LockCurrentStateEnum; import java.util.concurrent.CompletableFuture; -/** - * Accessory with current lock state. - * - * @author Eugen Freiter - */ +/** Accessory with current lock state. */ public interface AccessoryWithLockCurrentState { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockTargetState.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockTargetState.java index b35ca0542..41ef0d3ed 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockTargetState.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithLockTargetState.java @@ -4,11 +4,7 @@ import io.github.hapjava.characteristics.impl.lock.LockTargetStateEnum; import java.util.concurrent.CompletableFuture; -/** - * Accessory with lock target state. - * - * @author Eugen Freiter - */ +/** Accessory with lock target state. */ public interface AccessoryWithLockTargetState { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithName.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithName.java index 4d6a22cbb..626429124 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithName.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithName.java @@ -2,11 +2,7 @@ import java.util.concurrent.CompletableFuture; -/** - * Accessory with name. - * - * @author Eugen Freiter - */ +/** Accessory with name. */ public interface AccessoryWithName { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithNitrogenDioxideDensity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithNitrogenDioxideDensity.java index f90969d2d..685edfb5c 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithNitrogenDioxideDensity.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithNitrogenDioxideDensity.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with nitrogen dioxide density characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with nitrogen dioxide density characteristic. */ public interface AccessoryWithNitrogenDioxideDensity { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithOzoneDensity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithOzoneDensity.java index 149547b27..87bb8fa74 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithOzoneDensity.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithOzoneDensity.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with Ozone Density characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with Ozone Density characteristic. */ public interface AccessoryWithOzoneDensity { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM10Density.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM10Density.java index 380251371..2bfad14ac 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM10Density.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM10Density.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with PM10 Density characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with PM10 Density characteristic. */ public interface AccessoryWithPM10Density { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM25Density.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM25Density.java index 1203e0bfc..11ad2a12e 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM25Density.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPM25Density.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with PM25 Density characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with PM25 Density characteristic. */ public interface AccessoryWithPM25Density { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPhysicalControlsLock.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPhysicalControlsLock.java index 903abe229..2e1e3cd87 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPhysicalControlsLock.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithPhysicalControlsLock.java @@ -4,11 +4,7 @@ import io.github.hapjava.characteristics.impl.fan.LockPhysicalControlsEnum; import java.util.concurrent.CompletableFuture; -/** - * Accessory with physical controls which can be locked, e.g. child lock - * - * @author Eugen Freiter - */ +/** Accessory with physical controls which can be locked, e.g. child lock */ public interface AccessoryWithPhysicalControlsLock { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationDirection.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationDirection.java index 8c77e0ba8..91acf9afa 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationDirection.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationDirection.java @@ -4,11 +4,7 @@ import io.github.hapjava.characteristics.impl.fan.RotationDirectionEnum; import java.util.concurrent.CompletableFuture; -/** - * accessoory with rotation direction characteristics. - * - * @author Eugen Freiter - */ +/** accessory with rotation direction characteristics. */ public interface AccessoryWithRotationDirection { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationSpeed.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationSpeed.java index fcc27f32f..8b00e3350 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationSpeed.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithRotationSpeed.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * accessory with rotation speed characteristics. - * - * @author Eugen Freiter - */ +/** accessory with rotation speed characteristics. */ public interface AccessoryWithRotationSpeed { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSecurityAlarmType.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSecurityAlarmType.java index ca707f8df..036fd35b3 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSecurityAlarmType.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSecurityAlarmType.java @@ -4,17 +4,11 @@ import io.github.hapjava.characteristics.impl.securitysystem.SecuritySystemAlarmTypeEnum; import java.util.concurrent.CompletableFuture; -/** - * This characteristic describes the type of alarm triggered by a security system. A value of 1 - * indicates an ʼunknownʼ cause. Value should revert to 0 when the alarm conditions are cleared. - * - * @author Eugen Freiter - */ +/** This characteristic describes the type of alarm triggered by a security system. */ public interface AccessoryWithSecurityAlarmType { /** - * A value of 1 indicates an ʼunknownʼ cause. Value should revert to 0 when the alarm conditions - * are cleared. + * return alarm type See {@link SecuritySystemAlarmTypeEnum} for possible values * * @return a future with the value */ diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithServiceLabelIndex.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithServiceLabelIndex.java index b350654c2..07cb17fc7 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithServiceLabelIndex.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithServiceLabelIndex.java @@ -2,12 +2,7 @@ import java.util.concurrent.CompletableFuture; -/** - * Accessory with service label index. This characteristic should be used identify the index of the - * label that maps to ”Service Label Namespace” used by the accessory. - * - * @author Eugen Freiter - */ +/** Accessory with service label index. T */ public interface AccessoryWithServiceLabelIndex { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusActive.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusActive.java index 7fb9aa5f3..6bd7a18b5 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusActive.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusActive.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with status active. - * - * @author Eugen Freiter - */ +/** Accessory with status active. */ public interface AccessoryWithStatusActive { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusFault.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusFault.java index ad2351a26..b6b0aebdf 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusFault.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusFault.java @@ -4,13 +4,7 @@ import io.github.hapjava.characteristics.impl.common.StatusFaultEnum; import java.util.concurrent.CompletableFuture; -/** - * Accessory with characteristic that describes an accessory which has a fault. A non-zero value - * indicates that the accessory has experienced a fault that may be interfering with its intended - * functionality. A value of 0 indicates that there is no fault. - * - * @author Eugen Freiter - */ +/** Accessory with characteristic that describes an accessory which has a fault. */ public interface AccessoryWithStatusFault { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusLowBattery.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusLowBattery.java index 964d016ab..def16df5d 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusLowBattery.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusLowBattery.java @@ -4,13 +4,7 @@ import io.github.hapjava.characteristics.impl.battery.StatusLowBatteryEnum; import java.util.concurrent.CompletableFuture; -/** - * This characteristic describes an accessoryʼs battery status. A status of 1 indicates that the - * battery level of the accessory is low. Value should return to 0 when the battery charges to a - * level thats above the low threshold. - * - * @author Eugen Freiter - */ +/** This characteristic describes an accessoryʼs battery status. */ public interface AccessoryWithStatusLowBattery { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusTampered.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusTampered.java index 5637cb7ee..fe25d2f44 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusTampered.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithStatusTampered.java @@ -4,18 +4,11 @@ import io.github.hapjava.characteristics.impl.common.StatusTamperedEnum; import java.util.concurrent.CompletableFuture; -/** - * This characteristic describes an accessory which has been tampered with. A status of 1 indicates - * that the accessory has been tampered with. Value should return to 0 when the accessory has been - * reset to a non-tampered state, - * - * @author Eugen Freiter - */ +/** This characteristic describes an accessory which has been tampered with. */ public interface AccessoryWithStatusTampered { /** - * Retrieves the status tampered. A status of 1 indicates that the accessory has been tampered - * with. Value should return to 0 when the accessory has been reset to a non-tampered state, + * Retrieves the status tampered. * * @return a future with the value */ diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSulphurDioxideDensity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSulphurDioxideDensity.java index 7d9473bfd..94fad0be4 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSulphurDioxideDensity.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSulphurDioxideDensity.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with sulphur dioxide density characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with sulphur dioxide density characteristic. */ public interface AccessoryWithSulphurDioxideDensity { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSwingMode.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSwingMode.java index 92b11058f..ae49ffee6 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSwingMode.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithSwingMode.java @@ -4,11 +4,7 @@ import io.github.hapjava.characteristics.impl.fan.SwingModeEnum; import java.util.concurrent.CompletableFuture; -/** - * Accessory with Swing Mode characteristics. - * - * @author Eugen Freiter - */ +/** Accessory with Swing Mode characteristics. */ public interface AccessoryWithSwingMode { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetTilting.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetTilting.java index 76cebc4e3..9c2bc8009 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetTilting.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithTargetTilting.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with target tilting characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with target tilting characteristic. */ public interface AccessoryWithTargetTilting { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVOCDensity.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVOCDensity.java index fde95da7a..b41cc43b7 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVOCDensity.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVOCDensity.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with VOC Density characteristic. - * - * @author Eugen Freiter - */ +/** Accessory with VOC Density characteristic. */ public interface AccessoryWithVOCDensity { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVolume.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVolume.java index 693751fc4..b6dda376f 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVolume.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithVolume.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with volume values. - * - * @author Eugen Freiter - */ +/** Accessory with volume values. */ public interface AccessoryWithVolume { /** diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithWaterLevel.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithWaterLevel.java index 45c296645..591a1b5ac 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithWaterLevel.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithWaterLevel.java @@ -3,11 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -/** - * Accessory with water level. - * - * @author Eugen Freiter - */ +/** Accessory with water level. */ public interface AccessoryWithWaterLevel { /** diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsCharacteristic.java index 3dece74b7..1e7885382 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/AccessoryFlagsCharacteristic.java @@ -7,7 +7,10 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** When set indicates accessory requires additional setup. */ +/** + * This characteristic indicates whether accessory requires additional setup. See {@link + * AccessoryFlagsEnum} for possible values. + */ public class AccessoryFlagsCharacteristic extends EnumCharacteristic { public AccessoryFlagsCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/HardwareRevisionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/HardwareRevisionCharacteristic.java index 91fa21335..f323de0d8 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/HardwareRevisionCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/HardwareRevisionCharacteristic.java @@ -5,7 +5,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -/** This characteristic describes a hardware revision string x[.y[.z]] (e.g. ”100.1.1”) */ +/** This characteristic describes a hardware revision in a form x[.y[.z]] (e.g. ”100.1.1”) */ public class HardwareRevisionCharacteristic extends StaticStringCharacteristic { public HardwareRevisionCharacteristic(Supplier> getter) { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java index 0aa4e2189..777b571c2 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ManufacturerCharacteristic.java @@ -5,10 +5,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -/** - * This characteristic contains the name of the company whose brand will appear on the accessory, - * e.g., ”Acme”. - */ +/** This characteristic contains the name of the company whose brand will appear on the accessory */ public class ManufacturerCharacteristic extends StaticStringCharacteristic { public ManufacturerCharacteristic(Supplier> getter) { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java index ce87e62e3..4df7975af 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/ModelCharacteristic.java @@ -5,10 +5,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -/** - * This characteristic contains the manufacturer-specific model of the accessory, e.g. ”A1234”. The - * minimum length of this characteristic must be 1. - */ +/** This characteristic contains the manufacturer-specific model of the accessory */ public class ModelCharacteristic extends StaticStringCharacteristic { public ModelCharacteristic(Supplier> getter) { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java index 018d35ca5..0c9860d73 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/accessoryinformation/SerialNumberCharacteristic.java @@ -5,10 +5,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -/** - * This characteristic contains the manufacturer-specific serial number of the accessory, e.g. - * ”1A2B3C4D5E6F”. The length must be greater than 1. - */ +/** This characteristic contains the manufacturer-specific serial number of the accessory. */ public class SerialNumberCharacteristic extends StaticStringCharacteristic { public SerialNumberCharacteristic(Supplier> getter) { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierCharacteristic.java index b6d4cf393..051f1b7ea 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/CurrentAirPurifierCharacteristic.java @@ -7,7 +7,10 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic describes the current state of the air purifier. */ +/** + * This characteristic describes the current state of the air purifier. See {@link + * CurrentAirPurifierStateEnum} for possible values. + */ public class CurrentAirPurifierCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateCharacteristic.java index 680c933bc..ecc762c6b 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airpurifier/TargetAirPurifierStateCharacteristic.java @@ -8,7 +8,10 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic describes the target state of the air purifier. */ +/** + * This characteristic describes the target state of the air purifier. See {@link + * TargetAirPurifierStateEnum} for possible values. + */ public class TargetAirPurifierStateCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityCharacteristic.java index b701e7346..ab9feec85 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/AirQualityCharacteristic.java @@ -7,7 +7,9 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic describes the subject assessment of air quality by an accessory. */ +/** + * This characteristic describes the air quality. See {@link AirQualityEnum} for possible values. + */ public class AirQualityCharacteristic extends EnumCharacteristic { public AirQualityCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/NitrogenDioxideDensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/NitrogenDioxideDensityCharacteristic.java index 657fa7fbf..432a85029 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airquality/NitrogenDioxideDensityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/NitrogenDioxideDensityCharacteristic.java @@ -7,7 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic indicates the current NO2 density in micrograms/m3. */ +/** This characteristic contains the current NO2 density in micrograms/m3. */ public class NitrogenDioxideDensityCharacteristic extends FloatCharacteristic { public NitrogenDioxideDensityCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/OzoneDensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/OzoneDensityCharacteristic.java index fd8372708..542dbce0b 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airquality/OzoneDensityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/OzoneDensityCharacteristic.java @@ -7,7 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic indicates the current ozone density in micrograms/m3. */ +/** This characteristic contains the current ozone density in micrograms/m3. */ public class OzoneDensityCharacteristic extends FloatCharacteristic { public OzoneDensityCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM10DensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM10DensityCharacteristic.java index 0ff36d0e2..fdb0b9b49 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM10DensityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM10DensityCharacteristic.java @@ -8,7 +8,7 @@ import java.util.function.Supplier; /** - * This characteristic indicates the current PM10 micrometer particulate density in micrograms/m3. + * This characteristic contains the current PM10 micrometer particulate density in micrograms/m3. */ public class PM10DensityCharacteristic extends FloatCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM25DensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM25DensityCharacteristic.java index fc5c1d181..c54831553 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM25DensityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/PM25DensityCharacteristic.java @@ -8,7 +8,7 @@ import java.util.function.Supplier; /** - * This characteristic indicates the current PM2.5 micrometer particulate density in micrograms/m3. + * This characteristic contains the current PM2.5 micrometer particulate density in micrograms/m3. */ public class PM25DensityCharacteristic extends FloatCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/SulphurDioxideDensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/SulphurDioxideDensityCharacteristic.java index 0c46dbb99..03f668757 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airquality/SulphurDioxideDensityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/SulphurDioxideDensityCharacteristic.java @@ -7,7 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic indicates the current SO2 density in micrograms/m3. */ +/** This characteristic contains the current SO2 density in micrograms/m3. */ public class SulphurDioxideDensityCharacteristic extends FloatCharacteristic { public SulphurDioxideDensityCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/airquality/VOCDensityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/airquality/VOCDensityCharacteristic.java index 7e92ed82a..76e062f45 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/airquality/VOCDensityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/airquality/VOCDensityCharacteristic.java @@ -7,7 +7,10 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic indicates the current volatile organic compound density in micrograms/m3. */ +/** + * This characteristic indicates the current volatile organic compound (VOC) density in + * micrograms/m3. + */ public class VOCDensityCharacteristic extends FloatCharacteristic { public VOCDensityCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java index f56b2aab5..105ca0977 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/audio/MuteCharacteristic.java @@ -8,7 +8,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** A Mute characteristic allows the control of audio input or output accessory respectively. */ +/** Mute characteristic to control audio input or output accessory. */ public class MuteCharacteristic extends BooleanCharacteristic { public MuteCharacteristic( Supplier> getter, diff --git a/src/main/java/io/github/hapjava/characteristics/impl/audio/VolumeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/audio/VolumeCharacteristic.java index 9358f4d0c..2d1caedd7 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/audio/VolumeCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/audio/VolumeCharacteristic.java @@ -9,13 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * A Volume characteristic allows the control of input or output volume of an audio input or output - * accessory respectively. The value of this characteristic indicates the percentage of the maximum - * volume supported by the service. - * - * @author Eugen Freiter - */ +/** Volume characteristic to control audio volume. */ public class VolumeCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { public VolumeCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java index c6f54e029..7f662a651 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/battery/ChargingStateCharacteristic.java @@ -7,7 +7,10 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic describes the charging state of a battery or an accessory. */ +/** + * This characteristic describes the charging state of a battery or an accessory. See {@link + * ChargingStateEnum} for possible values. + */ public class ChargingStateCharacteristic extends EnumCharacteristic { public ChargingStateCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java index 300e69dfa..8fa55bbf1 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/battery/StatusLowBatteryCharacteristic.java @@ -8,9 +8,8 @@ import java.util.function.Supplier; /** - * This characteristic describes an accessoryʼs battery status. A status of 1 indicates that the - * battery level of the accessory is low. Value should return to 0 when the battery charges to a - * level thats above the low threshold. + * This characteristic describes an accessory battery status. See {@link StatusLowBatteryEnum} for + * possible values */ public class StatusLowBatteryCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java index 27b15edd3..443d1d457 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxideDetectedCharacteristic.java @@ -9,8 +9,8 @@ import java.util.function.Supplier; /** - * This characteristic indicates if a sensor detects abnormal levels of Carbon Dioxide. Value should - * revert to 0 after the Carbon Dioxide levels drop to normal levels. + * This characteristic indicates the levels of Carbon Dioxide. See {@link CarbonDioxideDetectedEnum} + * for possible values. */ public class CarbonDioxideDetectedCharacteristic extends EnumCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java index da5905fb2..a2ad994fc 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbondioxidesensor/CarbonDioxidePeakLevelCharacteristic.java @@ -7,10 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic indicates the highest detected level (ppm) of carbon dioxide detected by a - * sensor. - */ +/** This characteristic indicates the highest detected level (ppm) of carbon dioxide. */ public class CarbonDioxidePeakLevelCharacteristic extends FloatCharacteristic { public CarbonDioxidePeakLevelCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java index 09397f864..d9aa32a22 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideDetectedCharacteristic.java @@ -9,8 +9,8 @@ import java.util.function.Supplier; /** - * This characteristic indicates if a sensor detects abnormal levels of Carbon Monoxide. Value - * should revert to 0 after the Carbon Monoxide levels drop to normal levels + * This characteristic indicates the levels of Carbon Monoxide. See {@link + * CarbonMonoxideDetectedEnum} for possible values */ public class CarbonMonoxideDetectedCharacteristic extends EnumCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java index b151842c4..554638a22 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxideLevelCharacteristic.java @@ -7,7 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic indicates the Carbon Monoxide levels detected in parts per million (ppm). */ +/** This characteristic contains the Carbon Monoxide levels in parts per million (ppm). */ public class CarbonMonoxideLevelCharacteristic extends FloatCharacteristic { public CarbonMonoxideLevelCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java index 118f2e597..3a714674a 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/carbonmonoxidesensor/CarbonMonoxidePeakLevelCharacteristic.java @@ -7,10 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic indicates the highest detected level (ppm) of Carbon Monoxide detected by a - * sensor. - */ +/** This characteristic indicates the highest detected level (ppm) of Carbon Monoxide. */ public class CarbonMonoxidePeakLevelCharacteristic extends FloatCharacteristic { public CarbonMonoxidePeakLevelCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java index 269bd8615..fdc932218 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ActiveCharacteristic.java @@ -8,7 +8,10 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** The Active characteristic indicates whether the service is currently active. */ +/** + * Active characteristic indicates whether the service is currently active. See {@link ActiveEnum} + * for possible values. + */ public class ActiveCharacteristic extends EnumCharacteristic { public ActiveCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java index 543c8cf7c..967d69f13 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/InUseCharacteristic.java @@ -8,8 +8,8 @@ import java.util.function.Supplier; /** - * This characteristic describes if the service is in use. The service must be Active before the - * value of this characteristic can be set to in use. + * This characteristic indicates whether the service is in use. See {@link InUseEnum} for possible + * values. */ public class InUseCharacteristic extends EnumCharacteristic { public InUseCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java index dd192333f..c63c032c0 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/IsConfiguredCharacteristic.java @@ -9,10 +9,8 @@ import java.util.function.Supplier; /** - * This characteristic describes if the service is configured for use. For example, all of the - * valves in an irrigation system may not be configured depending on physical wire connection. If - * the accessory supports updating through HAP, then it must also advertise Paired Write in the - * permissions. + * This characteristic describes whether the service is configured for use. See {@link + * IsConfiguredEnum} for possible values. */ public class IsConfiguredCharacteristic extends EnumCharacteristic { public IsConfiguredCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/NameCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/NameCharacteristic.java index e565fb0c5..49c3a824a 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/NameCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/NameCharacteristic.java @@ -11,7 +11,7 @@ public class NameCharacteristic extends StaticStringCharacteristic { public NameCharacteristic(Supplier> getter) { super( "00000023-0000-1000-8000-0026BB765291", - "name of the accessory", + "name", Optional.of(getter), Optional.empty(), Optional.empty()); diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java index 6f152ae9c..2644232e3 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ObstructionDetectedCharacteristic.java @@ -7,10 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the current state of an obstruction sensor, such as one that is - * used in a garage door. If the state is true then there is an obstruction detected. - */ +/** This characteristic describes the current state of an obstruction sensor. */ public class ObstructionDetectedCharacteristic extends BooleanCharacteristic { public ObstructionDetectedCharacteristic( Supplier> getter, @@ -18,7 +15,7 @@ public ObstructionDetectedCharacteristic( Runnable unsubscriber) { super( "00000024-0000-1000-8000-0026BB765291", - "Current state of an obstruction sensor", + "Obstruction", Optional.of(getter), Optional.empty(), Optional.of(subscriber), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ProgramModeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgramModeCharacteristic.java new file mode 100644 index 000000000..6504049e7 --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgramModeCharacteristic.java @@ -0,0 +1,28 @@ +package io.github.hapjava.characteristics.impl.common; + +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; + +/** + * This characteristic describes if there are programs scheduled on the accessory. See {@link + * ProgramModeEnum} for possible values. + */ +public class ProgramModeCharacteristic extends EnumCharacteristic { + public ProgramModeCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + super( + "000000D1-0000-1000-8000-0026BB765291", + "Program Mode", + 2, + Optional.of(getter), + Optional.empty(), + Optional.of(subscriber), + Optional.of(unsubscriber)); + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ProgramModeEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgramModeEnum.java new file mode 100644 index 000000000..7924f370b --- /dev/null +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgramModeEnum.java @@ -0,0 +1,39 @@ +package io.github.hapjava.characteristics.impl.common; + +import io.github.hapjava.characteristics.CharacteristicEnum; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 0 ”No Programs Scheduled” 1 ”Program Scheduled” 2 ”Program Scheduled, currently overriden to + * manual mode” + */ +public enum ProgramModeEnum implements CharacteristicEnum { + NO_SCHEDULED(0), + SCHEDULED(1), + SCHEDULED_MANUAL(2); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(ProgramModeEnum.values()) + .collect(Collectors.toMap(ProgramModeEnum::getCode, t -> t)); + } + + public static ProgramModeEnum fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + ProgramModeEnum(int code) { + this.code = code; + } + + @Override + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEventCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEventCharacteristic.java index cce06ab07..de32f0475 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEventCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ProgrammableSwitchEventCharacteristic.java @@ -8,13 +8,11 @@ import java.util.function.Supplier; /** - * This characteristic describes an event generated by a programmable switch. Reading this - * characteristic must return the last event triggered for BLE. For IP accessories, the accessory - * must set the value of Paired Read to null(i.e. ”value” : null) in the attribute database. A read - * of this characteristic must always return a null value for IP accessories. The value must only be - * reported in the events (”ev”) property.. + * This characteristic describes an event generated by a programmable switch. For BLE accessories, + * read request should return the last event. For IP accessory, read request must return "null". The + * changes are reported via events * - * @author Eugen Freiter + *

See {@link ProgrammableSwitchEnum} for possible values. */ public class ProgrammableSwitchEventCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelIndexCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelIndexCharacteristic.java index c5fa2c05b..522cb04fe 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelIndexCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelIndexCharacteristic.java @@ -7,8 +7,8 @@ import java.util.function.Supplier; /** - * This characteristic should be used identify the index of the label that maps to "Service Label - * Namespace” used by the accessory. + * This characteristic is used to identify the index of the label according to {@link + * ServiceLabelNamespaceCharacteristic} */ public class ServiceLabelIndexCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceCharacteristic.java index d7444e9a2..4d6f1e24d 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceCharacteristic.java @@ -6,9 +6,8 @@ import java.util.function.Supplier; /** - * This characteristic describes the naming schema for an accessory. For example, this - * characteristic can be used to describe the type of labels used to identify individual services of - * an accessory. + * This characteristic describes the naming schema for an accessory. See {@link + * ServiceLabelNamespaceEnum} for possible values. */ public class ServiceLabelNamespaceCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceEnum.java index 0523a276a..a9b2df513 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceEnum.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/ServiceLabelNamespaceEnum.java @@ -5,9 +5,7 @@ import java.util.Map; import java.util.stream.Collectors; -/** - * 0 ”Dots. For e.g ”.” ”..” ”...” ”....”” 1 ”Arabic numerals. For e.g. 0,1,2,3” 2-255 ”Reserved” - */ +/** 0 ”Dots. For e.g ”.” ”..” ”...” ”....”” 1 ”Arabic numerals. For e.g. 0,1,2,3” */ public enum ServiceLabelNamespaceEnum implements CharacteristicEnum { DOTS(0), ARABIC_NUMERALS(1); diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java index aa3590124..a242ae6a1 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusActiveCharacteristic.java @@ -7,10 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes an accessoryʼs current working status. A value of true indicates - * that the accessory is active and is functioning without any errors. - */ +/** This characteristic describes current working (active and functional) status of accessory. */ public class StatusActiveCharacteristic extends BooleanCharacteristic { public StatusActiveCharacteristic( Supplier> getter, @@ -18,7 +15,7 @@ public StatusActiveCharacteristic( Runnable unsubscriber) { super( "00000075-0000-1000-8000-0026BB765291", - "Accessory active and functioning", + "Active status", Optional.of(getter), Optional.empty(), Optional.of(subscriber), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java index 51175f22e..773d1c04d 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusFaultCharacteristic.java @@ -7,11 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes an accessory which has a fault. A non-zero value indicates that the - * accessory has experienced a fault that may be interfering with its intended functionality. A - * value of 0 indicates that there is no fault. - */ +/** This characteristic describes fault status. See {@link StatusFaultEnum} for possible values. */ public class StatusFaultCharacteristic extends EnumCharacteristic { public StatusFaultCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java index dda3f8af7..be0c4ae6b 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/StatusTamperedCharacteristic.java @@ -8,9 +8,8 @@ import java.util.function.Supplier; /** - * This characteristic describes an accessory which has been tampered with. A status of 1 indicates - * that the accessory has been tampered with. Value should return to 0 when the accessory has been - * reset to a non-tampered state. + * This characteristic describes tampered status. See {@link StatusTamperedEnum} for possible + * values. */ public class StatusTamperedCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/VersionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/VersionCharacteristic.java index f3964f78c..038c46c5c 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/VersionCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/VersionCharacteristic.java @@ -5,7 +5,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -/** This characteristic describes a name and must not be a null value. */ +/** This characteristic describes HAP version. */ public class VersionCharacteristic extends StaticStringCharacteristic { public VersionCharacteristic(Supplier> getter) { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/common/WaterLavelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/common/WaterLavelCharacteristic.java index 2a1b60751..dda11b087 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/common/WaterLavelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/common/WaterLavelCharacteristic.java @@ -8,7 +8,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic describes the current water level. */ +/** This characteristic describes the water level. */ public class WaterLavelCharacteristic extends FloatCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java index e3a252665..0dfb7ad9c 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/contactsensor/ContactSensorStateCharacteristic.java @@ -9,8 +9,8 @@ import java.util.function.Supplier; /** - * This characteristic describes the state of a door/window contact sensor. A value of 0 indicates - * that the contact is detected. A value of 1 indicates that the contact is not detected. + * This characteristic describes the state of a door/window contact sensor. See {@link + * ContactStateEnum} for possible values. */ public class ContactSensorStateCharacteristic extends EnumCharacteristic implements EventableCharacteristic { @@ -21,7 +21,7 @@ public ContactSensorStateCharacteristic( Runnable unsubscriber) { super( "0000006A-0000-1000-8000-0026BB765291", - "Contact Sensor State", + "Contact Sensor", 1, Optional.of(getter), Optional.empty(), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java index fb1eb52ef..ec9e5c9dd 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/CurrentFanStateCharacteristic.java @@ -8,7 +8,10 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic describes the current state of the fan. */ +/** + * This characteristic describes the current state of the fan. See {@link CurrentFanStateEnum} for + * possible values. + */ public class CurrentFanStateCharacteristic extends EnumCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java index 7d97213ef..810aa8769 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/fan/LockPhysicalControlsCharacteristic.java @@ -9,10 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes a way to lock a set of physical controls on an accessory (eg. child - * lock). - */ +/** This characteristic describes physical controls on an accessory (eg. child lock). */ public class LockPhysicalControlsCharacteristic extends EnumCharacteristic implements EventableCharacteristic { @@ -23,7 +20,7 @@ public LockPhysicalControlsCharacteristic( Runnable unsubscriber) { super( "000000A7-0000-1000-8000-0026BB765291", - "Lock Physical Locks", + "Physical Locks", 1, Optional.of(getter), Optional.of(setter), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateEnum.java index 145046a7e..9d2b145ab 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateEnum.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/garagedoor/CurrentDoorStateEnum.java @@ -8,7 +8,7 @@ /** * 0 ”Open. The door is fully open.” 1 ”Closed. The door is fully closed.” 2 ”Opening. The door is * actively opening.” 3 ”Closing. The door is actively closing.” 4 ”Stopped. The door is not moving, - * and it is not fully open nor fully closed.” 5-255 ”Reserved” + * and it is not fully open nor fully closed.” */ public enum CurrentDoorStateEnum implements CharacteristicEnum { OPEN(0), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityDehumidifierThresholdCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityDehumidifierThresholdCharacteristic.java index 4375dca54..b8a4ca569 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityDehumidifierThresholdCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityDehumidifierThresholdCharacteristic.java @@ -9,9 +9,8 @@ import java.util.function.Supplier; /** - * This characteristic describes the relative humidity dehumidifier threshold. The value of this - * characteristic represents the ʼmaximum relative humidityʼ that must be reached before - * dehumidifier is turned on. + * This characteristic describes the relative humidity dehumidifier threshold on which dehumidifier + * turns on. */ public class HumidityDehumidifierThresholdCharacteristic extends FloatCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityHumidifierThresholdCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityHumidifierThresholdCharacteristic.java index 8a7a1abcb..2ee8adbf2 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityHumidifierThresholdCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/humidifier/HumidityHumidifierThresholdCharacteristic.java @@ -9,9 +9,8 @@ import java.util.function.Supplier; /** - * This characteristic describes the relative humidity humidifier threshold. The value of this - * characteristic represents the ʼminimum relative humidityʼ that must be reached before humidifier - * is turned on. + * This characteristic describes the relative humidity humidifier threshold on which humidifier + * turns on. */ public class HumidityHumidifierThresholdCharacteristic extends FloatCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java index e404e4152..be77125b6 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/CurrentRelativeHumidityCharacteristic.java @@ -7,10 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the current relative humidity of the accessoryʼs environment. The - * value is expressed as a percentage (%). - */ +/** This characteristic describes the current relative humidity. */ public class CurrentRelativeHumidityCharacteristic extends FloatCharacteristic { public CurrentRelativeHumidityCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java index ae7b539db..ab8ad7e29 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/humiditysensor/TargetRelativeHumidityCharacteristic.java @@ -8,10 +8,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the target relative humidity that the accessory is actively - * attempting to reach. The value is expressed as a percentage (%). - */ +/** This characteristic describes the target relative humidity. */ public class TargetRelativeHumidityCharacteristic extends FloatCharacteristic { public TargetRelativeHumidityCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java index f4e1287be..ce9bc8120 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/leaksensor/LeakDetectedStateCharacteristic.java @@ -9,8 +9,8 @@ import java.util.function.Supplier; /** - * This characteristic indicates if a sensor detected a leak (e.g. water leak, gas leak). A value of - * 1 indicates that a leak is detected. Value should return to 0 when leak stops. + * This characteristic indicates if a sensor detected a leak (e.g. water leak, gas leak). See {@link + * LeakDetectedStateEnum} for possible values */ public class LeakDetectedStateCharacteristic extends EnumCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/BrightnessCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/BrightnessCharacteristic.java index d47be8cde..693e42efc 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/BrightnessCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/BrightnessCharacteristic.java @@ -10,9 +10,8 @@ import java.util.function.Supplier; /** - * This characteristic describes a perceived level of brightness, e.g. for lighting, and can be used - * for backlights or color. The value is expressed as a percentage (%) of the maximum level of - * supported brightness. + * This characteristic describes a perceived level of brightness, The value is a percentage (%) of + * the maximum level of supported brightness. */ public class BrightnessCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java index 722782140..c7779233a 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java @@ -9,11 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes color temperature which is represented in reciprocal megaKelvin - * (MK-1) or mirek scale. (M = 1,000,000 / K where M is the desired mirek value and K is temperature - * in Kelvin) - */ +/** This characteristic describes color temperature in Kelvin */ public class ColorTemperatureCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java index d3736db84..aee5e24d5 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightsensor/CurrentAmbientLightLevelCharacteristic.java @@ -7,10 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic indicates the current light level. The value is expressed in Lux units - * (lumens/m2) - */ +/** This characteristic indicates the current light level in Lux */ public class CurrentAmbientLightLevelCharacteristic extends FloatCharacteristic { public CurrentAmbientLightLevelCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java index 6f5cfdfcd..bd70f46f7 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/outlet/OutletInUseCharacteristic.java @@ -8,8 +8,8 @@ import java.util.function.Supplier; /** - * This characteristic describes if the power outlet has an appliance e.g., a floor lamp, physically - * plugged in. This characteristic is set to True even if the plugged-in appliance is off. + * This characteristic describes if the power outlet has an appliance physically plugged in. This + * characteristic is set to True even if the plugged-in appliance is off. */ public class OutletInUseCharacteristic extends BooleanCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java index b5b2b04a7..fa768f4fd 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/securitysystem/SecuritySystemAlarmTypeCharacteristic.java @@ -8,8 +8,8 @@ import java.util.function.Supplier; /** - * This characteristic describes the type of alarm triggered by a security system. A value of 1 - * indicates an ʼunknownʼ cause. Value should revert to 0 when the alarm conditions are cleared. + * This characteristic describes the type of alarm triggered by a security system. See {@link + * SecuritySystemAlarmTypeEnum} for possible values. */ public class SecuritySystemAlarmTypeCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentTiltAngleCharacteristic.java index 13dbf93c3..3a4868b2c 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/slat/CurrentTiltAngleCharacteristic.java @@ -8,11 +8,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * etc. This characteristic takes values between -90 and 90. A value of 0 indicates that the slats - * are rotated to be fully open. At value 0 the user-facing edge and the window-facing edge are - * perpendicular to the window. - */ +/** This characteristic describe current tilt angle (between -90 and 90) */ public class CurrentTiltAngleCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeCharacteristic.java index b995406a6..b65dbdf2c 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/slat/SlatTypeCharacteristic.java @@ -6,9 +6,7 @@ import java.util.function.Supplier; /** - * TThis characteristic describes the type of the slats. If the slats can tilt on a horizontal axis, - * the value of this characteristic must be set to Horizontal. If the slats can tilt on a vertical - * axis, the value of this characteristic must be set to Vertical. + * This characteristic describes the type of the slats. See {@link SlatTypeEnum} for possible values */ public class SlatTypeCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/slat/TargetTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/slat/TargetTiltAngleCharacteristic.java index 40b5e7566..2a327522d 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/slat/TargetTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/slat/TargetTiltAngleCharacteristic.java @@ -9,10 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the target angle of slats for accessories such as windows, fans, - * portable heater/coolers etc. - */ +/** This characteristic describes the target angle of slats. */ public class TargetTiltAngleCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java index 5a33fea6d..76bf58ea9 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/smokesensor/SmokeDetectedCharacteristic.java @@ -7,10 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic indicates if a sensor detects abnormal levels of smoke. A value of 1 - * indicates that smoke levels are abnormal. Value should return to 0 when smoke levels are normal. - */ +/** This characteristic indicates if a sensor detects smoke. */ public class SmokeDetectedCharacteristic extends EnumCharacteristic { public SmokeDetectedCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java index 2a23edc95..4c5d9907f 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java @@ -9,9 +9,7 @@ import java.util.function.Supplier; /** - * This characteristic describes the cooling threshold in Celsius for accessories that support - * simultaneous heating and cooling. The value of this characteristic represents the maximum - * temperature that must be reached before cooling is turned on. + * This characteristic describes the cooling threshold on which accessories turns on the cooling. */ public class CoolingThresholdTemperatureCharacteristic extends FloatCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java index bf0c56637..87cf113a9 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateCharacteristic.java @@ -9,7 +9,6 @@ /** * This characteristic describes the current mode of an accessory that supports cooling or heating - * its environment, e.g. a thermostat is ”heating” a room to 75 degrees Fahrenheit. */ public class CurrentHeatingCoolingStateCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateEnum.java index 9f2c01f85..487262975 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateEnum.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentHeatingCoolingStateEnum.java @@ -5,9 +5,7 @@ import java.util.Map; import java.util.stream.Collectors; -/** - * 0 ”Off.” 1 ”Heat. The Heater is currently on.” 2 ”Cool. Cooler is currently on.” 3-255 ”Reserved” - */ +/** 0 ”Off.” 1 ”Heat. The Heater is currently on.” 2 ”Cool. Cooler is currently on.” */ public enum CurrentHeatingCoolingStateEnum implements CharacteristicEnum { OFF(0), HEAT(1), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java index fb61aeeb7..0ffd3093f 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java @@ -8,11 +8,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the heating threshold in Celsius for accessories that support - * simultaneous heating and cooling. The value of this characteristic represents the minimum - * temperature that must be reached before heating is turned on. - */ +/** This characteristic describes the heating threshold on which heating get turned on. */ public class HeatingThresholdTemperatureCharacteristic extends FloatCharacteristic { public HeatingThresholdTemperatureCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java index 5f74c1543..6c5091451 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateCharacteristic.java @@ -8,10 +8,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the target mode of an accessory that supports heating/cooling, e.g. - * a thermostat. - */ +/** This characteristic describes the target mode of an accessory that supports heating/cooling, */ public class TargetHeatingCoolingStateCharacteristic extends EnumCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateEnum.java index 62f2a3d81..6120422e5 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateEnum.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetHeatingCoolingStateEnum.java @@ -6,10 +6,8 @@ import java.util.stream.Collectors; /** - * 0 ”Off” 1 ”Heat. If the current temperature is below the target temperature then turn on - * heating.” 2 ”Cool. If the current temperature is above the target temperature then turn on - * cooling.” 3 ”Auto. Turn on heating or cooling to maintain temperature within the heating and - * cooling threshold of the target temperature.” 4-255 ”Reserved” + * 0 ”Off” 1 ”Heat.” 2 ”Cool." 3 ”Auto. Turn on heating or cooling to maintain depending on the + * temperature” * * @author Andy Lintner */ diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java index 580e3f9f5..f96483d22 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java @@ -10,8 +10,7 @@ /** * This characteristic describes the target temperature in Celsius that the accessory is actively - * attempting to reach. For example, a thermostat cooling a room to 75 degrees Fahrenheit would set - * the target temperature value to 23.9 degrees Celsius. + * attempting to reach. */ public class TargetTemperatureCharacteristic extends FloatCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitEnum.java index 8440f5de9..dbecc60f0 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitEnum.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TemperatureDisplayUnitEnum.java @@ -9,7 +9,7 @@ /** * The temperature unit used by a {@link TemperatureSensorAccessory}. * - *

0 ”Celsius” 1 ”Fahrenheit” 2-255 ”Reserved” + *

0 ”Celsius” 1 ”Fahrenheit” * * @author Andy Lintner */ diff --git a/src/main/java/io/github/hapjava/characteristics/impl/valve/RemainingDurationCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/valve/RemainingDurationCharacteristic.java index 5f16e396a..4866be230 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/valve/RemainingDurationCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/valve/RemainingDurationCharacteristic.java @@ -9,13 +9,9 @@ import java.util.function.Supplier; /** - * This characteristic describes the remaining duration on the accessory. Notifications on this - * characteristic must only be used if the remaining duration increases/decreases from the - * accessoryʼs usual countdown of remaining duration and when the duration reaches 0. e.g. It must - * not send notifications when the remaining duration is ticking down from 100,99,98... if 100 was - * the initial Set duration. However, if the remaining duration changes to 95 from 92 (increase) or - * 85 from 92 (decrease which is not part of the usual duration countdown), it must send a - * notification. This duration is defined in seconds. + * This characteristic describes the remaining duration of the active status of an accessory, e.g. + * {@link io.github.hapjava.accessories.ValveAccessory}. This characteristic should only notify + * about changes if it defers from normal countdown. */ public class RemainingDurationCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/valve/SetDurationCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/valve/SetDurationCharacteristic.java index 22be62b64..a372d0515 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/valve/SetDurationCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/valve/SetDurationCharacteristic.java @@ -9,11 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the set duration. For a Valve” this duration defines how long a - * valve should be set to ʼIn Useʼ. Once the valve is ʼIn Useʼ, any changes to this characteristic - * take affect in the next operation when the Valve is Active. This duration is defined in seconds. - */ +/** This characteristic describes the duration, how long an accessory should be set to "InUse". */ public class SetDurationCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java index 37583d00e..1255d7eff 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java @@ -8,13 +8,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the current angle of horizontal slats for accessories such as - * windows, fans, portable heater/coolers etc. This characteristic takes values between -90 and 90. - * A value of 0 indicates that the slats are rotated to a fully open position. A value of -90 - * indicates that the slats are rotated all the way in a direction where the user-facing edge is - * higher than the window-facing edge. - */ +/** This characteristic describes the current angle of horizontal slats. */ public class CurrentHorizontalTiltAngleCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentPositionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentPositionCharacteristic.java index aaf19ec2e..d51614615 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentPositionCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentPositionCharacteristic.java @@ -8,13 +8,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the current position of accessories. This characteristic can be - * used with doors, windows, awnings or window coverings. For windows and doors, a value of 0 - * indicates that a window (or door) is fully closed while a value of 100 indicates a fully open - * position. For blinds/shades/awnings, a value of 0 indicates a position that permits the least - * light and a value of 100 indicates a position that allows most light. - */ +/** This characteristic describes the current position of accessories. */ public class CurrentPositionCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java index 590712958..c6258a2db 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java @@ -8,13 +8,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the current angle of vertical slats for accessories such as - * windows, fans, portable heater/coolers etc. This characteristic takes values between -90 and 90. - * A value of 0 indicates that the slats are rotated to be fully open. A value of -90 indicates that - * the slats are rotated all the way in a direction where the user-facing edge is to the left of the - * window-facing edge. - */ +/** This characteristic describes the current angle of vertical slats for accessory. */ public class CurrentVerticalTiltAngleCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java index e9c768867..7a6455919 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/HoldPositionCharacteristic.java @@ -4,11 +4,7 @@ import io.github.hapjava.characteristics.impl.base.BooleanCharacteristic; import java.util.Optional; -/** - * This characteristic causes the service such as door or window covering to stop at its current - * position. A value of 1 must hold the state of the accessory. For e.g, the window must stop moving - * when this characteristic is written a value of 1. A value of 0 should be ignored. - */ +/** This characteristic causes the accessories like window covering to stop at its current */ public class HoldPositionCharacteristic extends BooleanCharacteristic { public HoldPositionCharacteristic(ExceptionalConsumer setter) { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java index 6f4427cfb..73141cb24 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateCharacteristic.java @@ -7,10 +7,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the state of the position of accessories. This characteristic can - * be used with doors, windows, awnings or window coverings for presentation purposes. - */ +/** This characteristic describes the state of the position of accessories. */ public class PositionStateCharacteristic extends EnumCharacteristic { public PositionStateCharacteristic( diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateEnum.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateEnum.java index b82b56a27..86b9174c8 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateEnum.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/PositionStateEnum.java @@ -7,7 +7,7 @@ /** * 0 ”Going to the minimum value specified in metadata” 1 ”Going to the maximum value specified in - * metadata” 2 ”Stopped” 3-255 ”Reserved” + * metadata” 2 ”Stopped” */ public enum PositionStateEnum implements CharacteristicEnum { DECREASING(0), diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java index 33d31d0f0..38c075760 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java @@ -9,10 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the target angle of horizontal slats for accessories such as - * windows, fans, portable heater/coolers etc. - */ +/** This characteristic describes the target angle of horizontal slats for accessories. */ public class TargetHorizontalTiltAngleCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetPositionCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetPositionCharacteristic.java index 02b3125a6..6398a0b37 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetPositionCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetPositionCharacteristic.java @@ -9,13 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the target position of accessories. This characteristic can be used - * with doors, windows, awnings or window coverings. For windows and doors, a value of 0 indicates - * that a window (or door) is fully closed while a value of 100 indicates a fully open position. For - * blinds/shades/awnings, a value of 0 indicates a position that permits the least light and a value - * of 100 indicates a position that allows most light. - */ +/** This characteristic describes the target position of accessories like door, window, blinds. */ public class TargetPositionCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java index adfb8a554..4d7c3ad71 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java @@ -9,10 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * This characteristic describes the target angle of vertical slats for accessories such as windows, - * fans, portable heater/coolers etc. - */ +/** This characteristic describes the target angle of vertical slats. */ public class TargetVerticalTiltAngleCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { diff --git a/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java b/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java index e0f47b56b..97f99906d 100644 --- a/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java +++ b/src/main/java/io/github/hapjava/services/impl/AbstractServiceImpl.java @@ -13,10 +13,7 @@ abstract class AbstractServiceImpl implements Service { private final String type; private final List characteristics = new LinkedList<>(); - /** - * @param type unique UUID of the service. This information can be obtained from HomeKit Accessory - * Simulator. - */ + /** @param type unique UUID of the service according to HAP specification. */ public AbstractServiceImpl(String type) { this.type = type; } diff --git a/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java b/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java index 2746118bf..8aa7f3635 100644 --- a/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java +++ b/src/main/java/io/github/hapjava/services/impl/AccessoryInformationService.java @@ -12,7 +12,7 @@ import io.github.hapjava.characteristics.impl.accessoryinformation.SerialNumberCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; -/** Every accessory must expose a single instance of the Accessory Information service. */ +/** Accessory Information service. */ public class AccessoryInformationService extends AbstractServiceImpl { public AccessoryInformationService( diff --git a/src/main/java/io/github/hapjava/services/impl/AirQualityService.java b/src/main/java/io/github/hapjava/services/impl/AirQualityService.java index bc66b3270..c9ccd6d62 100644 --- a/src/main/java/io/github/hapjava/services/impl/AirQualityService.java +++ b/src/main/java/io/github/hapjava/services/impl/AirQualityService.java @@ -25,7 +25,7 @@ import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; import io.github.hapjava.characteristics.impl.common.StatusTamperedCharacteristic; -/** This characteristic describes the subject assessment of air quality by an accessory. */ +/** This service describes air quality sensor. */ public class AirQualityService extends AbstractServiceImpl { public AirQualityService(AirQualityCharacteristic airQuality) { diff --git a/src/main/java/io/github/hapjava/services/impl/DoorbellService.java b/src/main/java/io/github/hapjava/services/impl/DoorbellService.java index 9e0591ba7..fd8fc7004 100644 --- a/src/main/java/io/github/hapjava/services/impl/DoorbellService.java +++ b/src/main/java/io/github/hapjava/services/impl/DoorbellService.java @@ -9,12 +9,7 @@ import io.github.hapjava.characteristics.impl.common.ProgrammableSwitchEventCharacteristic; import io.github.hapjava.characteristics.impl.lightbulb.BrightnessCharacteristic; -/** - * The Doorbell service describes a doorbell and is the primary service of the Video Doorbell - * Profile. - * - * @author Eugen Freiter - */ +/** The Doorbell service describes a doorbell. */ public class DoorbellService extends AbstractServiceImpl { public DoorbellService(ProgrammableSwitchEventCharacteristic switchEvent) { diff --git a/src/main/java/io/github/hapjava/services/impl/FaucetService.java b/src/main/java/io/github/hapjava/services/impl/FaucetService.java index e641f24c7..1028fa9b1 100644 --- a/src/main/java/io/github/hapjava/services/impl/FaucetService.java +++ b/src/main/java/io/github/hapjava/services/impl/FaucetService.java @@ -9,11 +9,10 @@ import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; /** - * This service describes accessories like faucets or shower heads. This service must only be - * included when an accessory has either a linked {@link HeaterCoolerService} ith single linked - * {@link ValveService} or multiple linked {@link ValveService} (with/without {@link - * HeaterCoolerService} to describe water outlets. This service serves as a top level service for - * such accessories. + * This service describes accessories like faucets or shower heads and must only be included when an + * accessory has either a linked {@link HeaterCoolerService}, single linked {@link ValveService} or + * multiple linked {@link ValveService} (with/without {@link HeaterCoolerService} to describe water + * outlets. This service serves as a top level service for such accessories. */ public class FaucetService extends AbstractServiceImpl { diff --git a/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java b/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java index 86078ee05..b90a7e5ee 100644 --- a/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java +++ b/src/main/java/io/github/hapjava/services/impl/GarageDoorOpenerService.java @@ -11,10 +11,7 @@ import io.github.hapjava.characteristics.impl.lock.LockCurrentStateCharacteristic; import io.github.hapjava.characteristics.impl.lock.LockTargetStateCharacteristic; -/** - * This service describes a garage door opener that controls a single door. If a garage has more - * than one door, then each door should have its own Garage Door Opener Service. - */ +/** This service describes a garage door opener that controls a single door. */ public class GarageDoorOpenerService extends AbstractServiceImpl { public GarageDoorOpenerService( diff --git a/src/main/java/io/github/hapjava/services/impl/HAPProtocolInformationService.java b/src/main/java/io/github/hapjava/services/impl/HAPProtocolInformationService.java index 8363320cf..bc49852f5 100644 --- a/src/main/java/io/github/hapjava/services/impl/HAPProtocolInformationService.java +++ b/src/main/java/io/github/hapjava/services/impl/HAPProtocolInformationService.java @@ -2,7 +2,7 @@ import io.github.hapjava.characteristics.impl.common.VersionCharacteristic; -/** This service describes label scheme. */ +/** This service HAP version. */ public class HAPProtocolInformationService extends AbstractServiceImpl { public HAPProtocolInformationService(VersionCharacteristic versionCharacteristic) { diff --git a/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java b/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java index 8c53c5b2b..a28cec8fa 100644 --- a/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java +++ b/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java @@ -21,15 +21,7 @@ import io.github.hapjava.characteristics.impl.thermostat.HeatingThresholdTemperatureCharacteristic; import io.github.hapjava.characteristics.impl.thermostat.TemperatureDisplayUnitCharacteristic; -/** - * This service can be used to describe either of the following: • a heater • a cooler • a heater - * and a cooler A heater/cooler accessory may have additional: • {@link FanService} service to - * describe a fan which can be independently controlled • {@link SlatService} service to control - * vents A heater must include {@link HeatingThresholdTemperatureCharacteristic}. A cooler must - * include {@link CoolingThresholdTemperatureCharacteristic}. A heater/cooler accessory service may - * include {@link RotationSpeedCharacteristic} to control fan speed if the fan cannot be - * independently controlled. - */ +/** This service can be used to describe a heater and/or a cooler */ public class HeaterCoolerService extends AbstractServiceImpl { public HeaterCoolerService( diff --git a/src/main/java/io/github/hapjava/services/impl/HumidifierDehumidifierService.java b/src/main/java/io/github/hapjava/services/impl/HumidifierDehumidifierService.java index 600b877ea..be57b7eb5 100644 --- a/src/main/java/io/github/hapjava/services/impl/HumidifierDehumidifierService.java +++ b/src/main/java/io/github/hapjava/services/impl/HumidifierDehumidifierService.java @@ -21,16 +21,7 @@ import io.github.hapjava.characteristics.impl.humidifier.TargetHumidifierDehumidifierStateCharacteristic; import io.github.hapjava.characteristics.impl.humiditysensor.CurrentRelativeHumidityCharacteristic; -/** - * This service can be used to describe either of the following: • an air humidifier • an air - * dehumidifier • an air humidifier and an air dehumidifier An air humidifier/dehumidifier accessory - * may have additional: • {@link FanService} service to describe a fan which can be independently - * controlled • {@link SlatService}service to control vents A dehumidifier must include {@link - * HumidityDehumidifierThresholdCharacteristic}. A humidifier must include {@link - * HumidityHumidifierThresholdCharacteristic}. A humidifier/dehumidifier accessory service may - * include {@link RotationSpeedCharacteristic} to control fan speed if the fan cannot be - * independently controlled. - */ +/** This service can be used to describe an air humidifier or/and an air dehumidifier. */ public class HumidifierDehumidifierService extends AbstractServiceImpl { public HumidifierDehumidifierService( diff --git a/src/main/java/io/github/hapjava/services/impl/IrrigationSystemService.java b/src/main/java/io/github/hapjava/services/impl/IrrigationSystemService.java new file mode 100644 index 000000000..3501ba723 --- /dev/null +++ b/src/main/java/io/github/hapjava/services/impl/IrrigationSystemService.java @@ -0,0 +1,71 @@ +package io.github.hapjava.services.impl; + +import io.github.hapjava.accessories.IrrigationSystemAccessory; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithRemainingDuration; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithStatusFault; +import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic; +import io.github.hapjava.characteristics.impl.common.InUseCharacteristic; +import io.github.hapjava.characteristics.impl.common.NameCharacteristic; +import io.github.hapjava.characteristics.impl.common.ProgramModeCharacteristic; +import io.github.hapjava.characteristics.impl.common.StatusFaultCharacteristic; +import io.github.hapjava.characteristics.impl.valve.RemainingDurationCharacteristic; + +/** An irrigation system service */ +public class IrrigationSystemService extends AbstractServiceImpl { + + public IrrigationSystemService( + ActiveCharacteristic activeCharacteristic, + InUseCharacteristic inUseCharacteristic, + ProgramModeCharacteristic programModeCharacteristic) { + super("000000CF-0000-1000-8000-0026BB765291"); + addCharacteristic(activeCharacteristic); + addCharacteristic(inUseCharacteristic); + addCharacteristic(programModeCharacteristic); + } + + public IrrigationSystemService(IrrigationSystemAccessory accessory) { + this( + new ActiveCharacteristic( + accessory::getActive, + accessory::setActive, + accessory::subscribeActive, + accessory::unsubscribeActive), + new InUseCharacteristic( + accessory::getInUse, accessory::subscribeInUse, accessory::unsubscribeInUse), + new ProgramModeCharacteristic( + accessory::getProgramMode, + accessory::subscribeProgramMode, + accessory::unsubscribeProgramMode)); + if (accessory instanceof AccessoryWithName) { + addOptionalCharacteristic(new NameCharacteristic(((AccessoryWithName) accessory)::getName)); + } + if (accessory instanceof AccessoryWithStatusFault) { + addOptionalCharacteristic( + new StatusFaultCharacteristic( + ((AccessoryWithStatusFault) accessory)::getStatusFault, + ((AccessoryWithStatusFault) accessory)::subscribeStatusFault, + ((AccessoryWithStatusFault) accessory)::unsubscribeStatusFault)); + } + if (accessory instanceof AccessoryWithRemainingDuration) { + addOptionalCharacteristic( + new RemainingDurationCharacteristic( + ((AccessoryWithRemainingDuration) accessory)::getRemainingDuration, + ((AccessoryWithRemainingDuration) accessory)::subscribeRemainingDuration, + ((AccessoryWithRemainingDuration) accessory)::unsubscribeRemainingDuration)); + } + } + + public void addOptionalCharacteristic(NameCharacteristic name) { + addCharacteristic(name); + } + + public void addOptionalCharacteristic(StatusFaultCharacteristic statusFaultCharacteristic) { + addCharacteristic(statusFaultCharacteristic); + } + + public void addOptionalCharacteristic( + RemainingDurationCharacteristic remainingDurationCharacteristic) { + addCharacteristic(remainingDurationCharacteristic); + } +} diff --git a/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java b/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java index c82f107c8..de59ca516 100644 --- a/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java +++ b/src/main/java/io/github/hapjava/services/impl/LockMechanismService.java @@ -6,10 +6,7 @@ import io.github.hapjava.characteristics.impl.lock.LockCurrentStateCharacteristic; import io.github.hapjava.characteristics.impl.lock.LockTargetStateCharacteristic; -/** - * The HomeKit Lock Mechanism Service is designed to expose and control the physical lock mechanism - * on a device. - */ +/** The Lock Mechanism Service describes the physical lock mechanism on a device. */ public class LockMechanismService extends AbstractServiceImpl { public LockMechanismService( diff --git a/src/main/java/io/github/hapjava/services/impl/SlatService.java b/src/main/java/io/github/hapjava/services/impl/SlatService.java index 486029d00..5993983fa 100644 --- a/src/main/java/io/github/hapjava/services/impl/SlatService.java +++ b/src/main/java/io/github/hapjava/services/impl/SlatService.java @@ -12,11 +12,7 @@ import io.github.hapjava.characteristics.impl.slat.SlatTypeCharacteristic; import io.github.hapjava.characteristics.impl.slat.TargetTiltAngleCharacteristic; -/** - * This service describes a slat which tilts on a vertical or a horizontal axis. ”Current Tilt - * Angle” and ”Target Tilt Angle”may be included in this service if the user can set the slats to a - * particular tilt angle. - */ +/** This service describes a slat */ public class SlatService extends AbstractServiceImpl { public SlatService( diff --git a/src/main/java/io/github/hapjava/services/impl/SpeakerService.java b/src/main/java/io/github/hapjava/services/impl/SpeakerService.java index 0c2a073d8..8619d5a50 100644 --- a/src/main/java/io/github/hapjava/services/impl/SpeakerService.java +++ b/src/main/java/io/github/hapjava/services/impl/SpeakerService.java @@ -7,7 +7,7 @@ import io.github.hapjava.characteristics.impl.audio.VolumeCharacteristic; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; -/** A Speaker service is to use to control the audio output settings on a speaker device. */ +/** A Speaker service can be used to control the audio output settings on a speaker device. */ public class SpeakerService extends AbstractServiceImpl { public SpeakerService(MuteCharacteristic muteCharacteristic) { diff --git a/src/main/java/io/github/hapjava/services/impl/StatelessProgrammableSwitchService.java b/src/main/java/io/github/hapjava/services/impl/StatelessProgrammableSwitchService.java index d2ef1e337..bded30f47 100644 --- a/src/main/java/io/github/hapjava/services/impl/StatelessProgrammableSwitchService.java +++ b/src/main/java/io/github/hapjava/services/impl/StatelessProgrammableSwitchService.java @@ -7,11 +7,7 @@ import io.github.hapjava.characteristics.impl.common.ProgrammableSwitchEventCharacteristic; import io.github.hapjava.characteristics.impl.common.ServiceLabelIndexCharacteristic; -/** - * This service describes a stateless programmable switch. - * - * @author Eugen Freiter - */ +/** This service describes a stateless programmable switch. */ public class StatelessProgrammableSwitchService extends AbstractServiceImpl { public StatelessProgrammableSwitchService(ProgrammableSwitchEventCharacteristic switchEvent) { diff --git a/src/main/java/io/github/hapjava/services/impl/ValveService.java b/src/main/java/io/github/hapjava/services/impl/ValveService.java index ae8d5b1c4..b45c48ef4 100644 --- a/src/main/java/io/github/hapjava/services/impl/ValveService.java +++ b/src/main/java/io/github/hapjava/services/impl/ValveService.java @@ -17,10 +17,7 @@ import io.github.hapjava.characteristics.impl.valve.SetDurationCharacteristic; import io.github.hapjava.characteristics.impl.valve.ValveTypeCharacteristic; -/** - * This service describes accessories like irrigation valves or water outlets. A valve is set to In - * Use when there are fluid flowing through the valve. - */ +/** This service describes accessories valves. */ public class ValveService extends AbstractServiceImpl { public ValveService( diff --git a/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java b/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java index 173751333..fe483e4c0 100644 --- a/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java +++ b/src/main/java/io/github/hapjava/services/impl/WindowCoveringService.java @@ -19,10 +19,7 @@ import io.github.hapjava.characteristics.impl.windowcovering.TargetPositionCharacteristic; import io.github.hapjava.characteristics.impl.windowcovering.TargetVerticalTiltAngleCharacteristic; -/** - * This service describes motorized window coverings or shades - examples include shutters, blinds, - * awnings etc. - */ +/** This service describes motorized window coverings or shades */ public class WindowCoveringService extends AbstractServiceImpl { public WindowCoveringService( From 2b7e9d75e7d95bba134702a5a18d68c9cdedcdbe Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 17 May 2020 00:23:06 +0200 Subject: [PATCH 19/23] remove reference to spec Signed-off-by: Eugen Freiter --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index d27b04e8c..f67ee2fd2 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,7 @@ After that, check out the [Sample](https://github.com/hap-java/HAP-Java/tree/sam Supported HomeKit Accessories ========= -Current implementation is based on HAP specification Release R2 (published 2019-07-26) and -fully supports 37 out of 45 HomeKit accessory services defined there. +Current implementation fully supports 37 HomeKit accessory/services. | HomeKit Accessory & Service type | Supported by Java-HAP | |--------------------|--------------------| From 1372385d33c8f264056677f654492beccd230e97 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 24 May 2020 10:56:37 +0200 Subject: [PATCH 20/23] add support for custom min/max values for temperatures Signed-off-by: Eugen Freiter --- .../TemperatureSensorAccessory.java | 30 ++++++++++ .../accessories/ThermostatAccessory.java | 58 +++++++++++++++++++ .../CurrentTemperatureCharacteristic.java | 16 ++++- .../TargetTemperatureCharacteristic.java | 17 +++++- .../impl/TemperatureSensorService.java | 3 + .../services/impl/ThermostatService.java | 6 ++ 6 files changed, 124 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/github/hapjava/accessories/TemperatureSensorAccessory.java b/src/main/java/io/github/hapjava/accessories/TemperatureSensorAccessory.java index f2941f957..4f9184926 100644 --- a/src/main/java/io/github/hapjava/accessories/TemperatureSensorAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/TemperatureSensorAccessory.java @@ -21,6 +21,36 @@ public interface TemperatureSensorAccessory extends HomekitAccessory { */ CompletableFuture getCurrentTemperature(); + /** + * return the min value for current temperature. overwrite if you want to change the default + * value. + * + * @return min current temperature + */ + default double getMinCurrentTemperature() { + return 0; + } + + /** + * return the max value for current temperature. overwrite if you want to change the default + * value. + * + * @return max current temperature + */ + default double getMaxCurrentTemperature() { + return 100; + } + + /** + * return the min step value for current temperature. overwrite if you want to change the default + * value. + * + * @return min step current temperature + */ + default double getMinStepCurrentTemperature() { + return 0.1; + } + /** * Subscribes to changes in the current temperature. * diff --git a/src/main/java/io/github/hapjava/accessories/ThermostatAccessory.java b/src/main/java/io/github/hapjava/accessories/ThermostatAccessory.java index 43bca6926..f55ed7a63 100644 --- a/src/main/java/io/github/hapjava/accessories/ThermostatAccessory.java +++ b/src/main/java/io/github/hapjava/accessories/ThermostatAccessory.java @@ -24,6 +24,36 @@ public interface ThermostatAccessory extends HomekitAccessory { */ CompletableFuture getCurrentTemperature(); + /** + * return the min value for current temperature. overwrite if you want to change the default + * value. + * + * @return min current temperature + */ + default double getMinCurrentTemperature() { + return 0; + } + + /** + * return the max value for current temperature. overwrite if you want to change the default + * value. + * + * @return max current temperature + */ + default double getMaxCurrentTemperature() { + return 100; + } + + /** + * return the min step value for current temperature. overwrite if you want to change the default + * value. + * + * @return min step current temperature + */ + default double getMinStepCurrentTemperature() { + return 0.1; + } + /** * Retrieves the target temperature, in celsius degrees. * @@ -39,6 +69,34 @@ public interface ThermostatAccessory extends HomekitAccessory { */ void setTargetTemperature(Double value) throws Exception; + /** + * return the min value for target temperature. overwrite if you want to change the default value. + * + * @return min target temperature + */ + default double getMinTargetTemperature() { + return 10; + } + + /** + * return the max value for target temperature. overwrite if you want to change the default value. + * + * @return max target temperature + */ + default double getMaxTargetTemperature() { + return 38; + } + + /** + * return the min step value for target temperature. overwrite if you want to change the default + * value. + * + * @return min step target temperature + */ + default double getMinStepTargetTemperature() { + return 0.1; + } + /** * Retrieves the current {@link CurrentHeatingCoolingStateEnum} of the thermostat. * diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java index 4227ceaab..864d31d29 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java @@ -11,19 +11,29 @@ public class CurrentTemperatureCharacteristic extends FloatCharacteristic { public CurrentTemperatureCharacteristic( + double minValue, + double maxValue, + double minStep, Supplier> getter, Consumer subscriber, Runnable unsubscriber) { super( "00000011-0000-1000-8000-0026BB765291", "current temperature", - 0, - 100, - 0.1, + minValue, + maxValue, + minStep, "C", Optional.of(getter), Optional.empty(), Optional.of(subscriber), Optional.of(unsubscriber)); } + + public CurrentTemperatureCharacteristic( + Supplier> getter, + Consumer subscriber, + Runnable unsubscriber) { + this(0, 100, 0.1, getter, subscriber, unsubscriber); + } } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java index f96483d22..ff03bfbff 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java @@ -15,6 +15,9 @@ public class TargetTemperatureCharacteristic extends FloatCharacteristic { public TargetTemperatureCharacteristic( + double minValue, + double maxValue, + double minStep, Supplier> getter, ExceptionalConsumer setter, Consumer subscriber, @@ -22,13 +25,21 @@ public TargetTemperatureCharacteristic( super( "00000035-0000-1000-8000-0026BB765291", "target temperature", - 10, - 38, - 0.1, + minValue, + maxValue, + minStep, "C", Optional.of(getter), Optional.of(setter), Optional.of(subscriber), Optional.of(unsubscriber)); } + + public TargetTemperatureCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + this(10, 38, 0.1, getter, setter, subscriber, unsubscriber); + } } diff --git a/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java b/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java index 5fbb5a4ab..bef9fff60 100644 --- a/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java +++ b/src/main/java/io/github/hapjava/services/impl/TemperatureSensorService.java @@ -25,6 +25,9 @@ public TemperatureSensorService( public TemperatureSensorService(TemperatureSensorAccessory accessory) { this( new CurrentTemperatureCharacteristic( + accessory.getMinCurrentTemperature(), + accessory.getMaxCurrentTemperature(), + accessory.getMinStepCurrentTemperature(), accessory::getCurrentTemperature, accessory::subscribeCurrentTemperature, accessory::unsubscribeCurrentTemperature)); diff --git a/src/main/java/io/github/hapjava/services/impl/ThermostatService.java b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java index ad575125a..c3cc5d8f9 100644 --- a/src/main/java/io/github/hapjava/services/impl/ThermostatService.java +++ b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java @@ -46,10 +46,16 @@ public ThermostatService(ThermostatAccessory accessory) { accessory::subscribeTargetState, accessory::unsubscribeTargetState), new CurrentTemperatureCharacteristic( + accessory.getMinCurrentTemperature(), + accessory.getMaxCurrentTemperature(), + accessory.getMinStepCurrentTemperature(), accessory::getCurrentTemperature, accessory::subscribeCurrentTemperature, accessory::unsubscribeCurrentTemperature), new TargetTemperatureCharacteristic( + accessory.getMinTargetTemperature(), + accessory.getMaxTargetTemperature(), + accessory.getMinStepTargetTemperature(), accessory::getTargetTemperature, accessory::setTargetTemperature, accessory::subscribeTargetTemperature, From 7fcc492c2c1cbbfa0e28bf32dcd803d89c338513 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 24 May 2020 12:48:59 +0200 Subject: [PATCH 21/23] fix typos. add support for custom min/max values for threshold temperatures Signed-off-by: Eugen Freiter --- ...essoryWithCoolingThresholdTemperature.java | 30 +++++++++++++++++ ...ssoryWithHeatingThresholdTemperature.java} | 32 ++++++++++++++++++- ...ingThresholdTemperatureCharacteristic.java | 17 ++++++++-- ...ingThresholdTemperatureCharacteristic.java | 17 ++++++++-- .../server/impl/connections/HttpSession.java | 2 +- .../services/impl/HeaterCoolerService.java | 24 ++++++++++---- .../services/impl/ThermostatService.java | 12 +++---- 7 files changed, 114 insertions(+), 20 deletions(-) rename src/main/java/io/github/hapjava/accessories/optionalcharacteristic/{AccessoryWithHeatingThresholdTemprature.java => AccessoryWithHeatingThresholdTemperature.java} (56%) diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java index b96be7b6e..c42398a10 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithCoolingThresholdTemperature.java @@ -21,6 +21,36 @@ public interface AccessoryWithCoolingThresholdTemperature { */ void setCoolingThresholdTemperature(Double value) throws Exception; + /** + * return the min value for cooling threshold temperature. overwrite if you want to change the + * default value. + * + * @return min threshold temperature + */ + default double getMinCoolingThresholdTemperature() { + return 10; + } + + /** + * return the max value for cooling threshold temperature. overwrite if you want to change the + * default value. + * + * @return max threshold temperature + */ + default double getMaxCoolingThresholdTemperature() { + return 35; + } + + /** + * return the min step value for cooling threshold temperature. overwrite if you want to change + * the default value. + * + * @return step for threshold temperature + */ + default double getStepCoolingThresholdTemperature() { + return 0.1; + } + /** * Subscribes to changes in the cooling threshold. * diff --git a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHeatingThresholdTemprature.java b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHeatingThresholdTemperature.java similarity index 56% rename from src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHeatingThresholdTemprature.java rename to src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHeatingThresholdTemperature.java index 536a18075..02cb3f819 100644 --- a/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHeatingThresholdTemprature.java +++ b/src/main/java/io/github/hapjava/accessories/optionalcharacteristic/AccessoryWithHeatingThresholdTemperature.java @@ -3,7 +3,7 @@ import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; import java.util.concurrent.CompletableFuture; -public interface AccessoryWithHeatingThresholdTemprature { +public interface AccessoryWithHeatingThresholdTemperature { /** * Retrieves the temperature below which the thermostat should begin heating. @@ -20,6 +20,36 @@ public interface AccessoryWithHeatingThresholdTemprature { */ void setHeatingThresholdTemperature(Double value) throws Exception; + /** + * return the min value for heating threshold temperature. overwrite if you want to change the + * default value. + * + * @return min threshold temperature + */ + default double getMinHeatingThresholdTemperature() { + return 0; + } + + /** + * return the max value for heating threshold temperature. overwrite if you want to change the + * default value. + * + * @return max threshold temperature + */ + default double getMaxHeatingThresholdTemperature() { + return 25; + } + + /** + * return the min step value for heating threshold temperature. overwrite if you want to change + * the default value. + * + * @return step for threshold temperature + */ + default double getStepHeatingThresholdTemperature() { + return 0.1; + } + /** * Subscribes to changes in the heating threshold. * diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java index 4c5d9907f..68dbaccf3 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java @@ -14,6 +14,9 @@ public class CoolingThresholdTemperatureCharacteristic extends FloatCharacteristic { public CoolingThresholdTemperatureCharacteristic( + double minValue, + double maxValue, + double step, Supplier> getter, ExceptionalConsumer setter, Consumer subscriber, @@ -21,13 +24,21 @@ public CoolingThresholdTemperatureCharacteristic( super( "0000000D-0000-1000-8000-0026BB765291", "cooling threshold", - 10, - 35, - 0.1, + minValue, + maxValue, + step, "C", Optional.of(getter), Optional.of(setter), Optional.of(subscriber), Optional.of(unsubscriber)); } + + public CoolingThresholdTemperatureCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + this(10, 35, 0.1, getter, setter, subscriber, unsubscriber); + } } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java index 0ffd3093f..05e1ef647 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java @@ -12,6 +12,9 @@ public class HeatingThresholdTemperatureCharacteristic extends FloatCharacteristic { public HeatingThresholdTemperatureCharacteristic( + double minValue, + double maxValue, + double step, Supplier> getter, ExceptionalConsumer setter, Consumer subscriber, @@ -19,13 +22,21 @@ public HeatingThresholdTemperatureCharacteristic( super( "00000012-0000-1000-8000-0026BB765291", "heating threshold", - 0, - 25, - 0.1, + minValue, + maxValue, + step, "C", Optional.of(getter), Optional.of(setter), Optional.of(subscriber), Optional.of(unsubscriber)); } + + public HeatingThresholdTemperatureCharacteristic( + Supplier> getter, + ExceptionalConsumer setter, + Consumer subscriber, + Runnable unsubscriber) { + this(0, 25, 0.1, getter, setter, subscriber, unsubscriber); + } } diff --git a/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java b/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java index ce567b3de..36ac04085 100644 --- a/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java +++ b/src/main/java/io/github/hapjava/server/impl/connections/HttpSession.java @@ -126,7 +126,7 @@ private HttpResponse handlePairVerify(HttpRequest request) { try { return pairVerificationManager.handle(request); } catch (Exception e) { - logger.warn("Excepton encountered while verifying pairing", e); + logger.warn("Exception encountered while verifying pairing", e); return new InternalServerErrorResponse(e); } } diff --git a/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java b/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java index a28cec8fa..299161ed8 100644 --- a/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java +++ b/src/main/java/io/github/hapjava/services/impl/HeaterCoolerService.java @@ -2,7 +2,7 @@ import io.github.hapjava.accessories.HeaterCoolerAccessory; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCoolingThresholdTemperature; -import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHeatingThresholdTemprature; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHeatingThresholdTemperature; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithPhysicalControlsLock; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithRotationSpeed; @@ -85,6 +85,12 @@ public HeaterCoolerService(HeaterCoolerAccessory accessory) { } if (accessory instanceof AccessoryWithCoolingThresholdTemperature) { new CoolingThresholdTemperatureCharacteristic( + ((AccessoryWithCoolingThresholdTemperature) accessory) + .getMinCoolingThresholdTemperature(), + ((AccessoryWithCoolingThresholdTemperature) accessory) + .getMaxCoolingThresholdTemperature(), + ((AccessoryWithCoolingThresholdTemperature) accessory) + .getStepCoolingThresholdTemperature(), ((AccessoryWithCoolingThresholdTemperature) accessory)::getCoolingThresholdTemperature, ((AccessoryWithCoolingThresholdTemperature) accessory)::setCoolingThresholdTemperature, ((AccessoryWithCoolingThresholdTemperature) accessory) @@ -92,13 +98,19 @@ public HeaterCoolerService(HeaterCoolerAccessory accessory) { ((AccessoryWithCoolingThresholdTemperature) accessory) ::unsubscribeCoolingThresholdTemperature); } - if (accessory instanceof AccessoryWithHeatingThresholdTemprature) { + if (accessory instanceof AccessoryWithHeatingThresholdTemperature) { new HeatingThresholdTemperatureCharacteristic( - ((AccessoryWithHeatingThresholdTemprature) accessory)::getHeatingThresholdTemperature, - ((AccessoryWithHeatingThresholdTemprature) accessory)::setHeatingThresholdTemperature, - ((AccessoryWithHeatingThresholdTemprature) accessory) + ((AccessoryWithHeatingThresholdTemperature) accessory) + .getMinHeatingThresholdTemperature(), + ((AccessoryWithHeatingThresholdTemperature) accessory) + .getMaxHeatingThresholdTemperature(), + ((AccessoryWithHeatingThresholdTemperature) accessory) + .getStepHeatingThresholdTemperature(), + ((AccessoryWithHeatingThresholdTemperature) accessory)::getHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemperature) accessory)::setHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemperature) accessory) ::subscribeHeatingThresholdTemperature, - ((AccessoryWithHeatingThresholdTemprature) accessory) + ((AccessoryWithHeatingThresholdTemperature) accessory) ::unsubscribeHeatingThresholdTemperature); } if (accessory instanceof AccessoryWithTemperatureDisplayUnits) { diff --git a/src/main/java/io/github/hapjava/services/impl/ThermostatService.java b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java index c3cc5d8f9..0806bb9b3 100644 --- a/src/main/java/io/github/hapjava/services/impl/ThermostatService.java +++ b/src/main/java/io/github/hapjava/services/impl/ThermostatService.java @@ -3,7 +3,7 @@ import io.github.hapjava.accessories.ThermostatAccessory; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCoolingThresholdTemperature; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithCurrentRelativeHumidity; -import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHeatingThresholdTemprature; +import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithHeatingThresholdTemperature; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName; import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithTargetRelativeHumidity; import io.github.hapjava.characteristics.impl.common.NameCharacteristic; @@ -77,13 +77,13 @@ public ThermostatService(ThermostatAccessory accessory) { ((AccessoryWithCoolingThresholdTemperature) accessory) ::unsubscribeCoolingThresholdTemperature); } - if (accessory instanceof AccessoryWithHeatingThresholdTemprature) { + if (accessory instanceof AccessoryWithHeatingThresholdTemperature) { new HeatingThresholdTemperatureCharacteristic( - ((AccessoryWithHeatingThresholdTemprature) accessory)::getHeatingThresholdTemperature, - ((AccessoryWithHeatingThresholdTemprature) accessory)::setHeatingThresholdTemperature, - ((AccessoryWithHeatingThresholdTemprature) accessory) + ((AccessoryWithHeatingThresholdTemperature) accessory)::getHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemperature) accessory)::setHeatingThresholdTemperature, + ((AccessoryWithHeatingThresholdTemperature) accessory) ::subscribeHeatingThresholdTemperature, - ((AccessoryWithHeatingThresholdTemprature) accessory) + ((AccessoryWithHeatingThresholdTemperature) accessory) ::unsubscribeHeatingThresholdTemperature); } if (accessory instanceof AccessoryWithCurrentRelativeHumidity) { From 1720a25e1b619796638d84d66bcd39ea353c1923 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 24 May 2020 17:11:24 +0200 Subject: [PATCH 22/23] add constants for default min/max values Signed-off-by: Eugen Freiter --- .../CoolingThresholdTemperatureCharacteristic.java | 12 +++++++++++- .../thermostat/CurrentTemperatureCharacteristic.java | 5 ++++- .../HeatingThresholdTemperatureCharacteristic.java | 12 +++++++++++- .../thermostat/TargetTemperatureCharacteristic.java | 12 +++++++++++- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java index 68dbaccf3..d855f70d6 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CoolingThresholdTemperatureCharacteristic.java @@ -12,6 +12,9 @@ * This characteristic describes the cooling threshold on which accessories turns on the cooling. */ public class CoolingThresholdTemperatureCharacteristic extends FloatCharacteristic { + public static final double DEFAULT_MIN_VALUE = 10; + public static final double DEFAULT_MAX_VALUE = 35; + public static final double DEFAULT_STEP = 0.1; public CoolingThresholdTemperatureCharacteristic( double minValue, @@ -39,6 +42,13 @@ public CoolingThresholdTemperatureCharacteristic( ExceptionalConsumer setter, Consumer subscriber, Runnable unsubscriber) { - this(10, 35, 0.1, getter, setter, subscriber, unsubscriber); + this( + DEFAULT_MIN_VALUE, + DEFAULT_MAX_VALUE, + DEFAULT_STEP, + getter, + setter, + subscriber, + unsubscriber); } } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java index 864d31d29..f3c2b74ff 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/CurrentTemperatureCharacteristic.java @@ -9,6 +9,9 @@ /** characteristic describes the current temperature of the environment in Celsius */ public class CurrentTemperatureCharacteristic extends FloatCharacteristic { + public static final double DEFAULT_MIN_VALUE = 0; + public static final double DEFAULT_MAX_VALUE = 100; + public static final double DEFAULT_STEP = 0.1; public CurrentTemperatureCharacteristic( double minValue, @@ -34,6 +37,6 @@ public CurrentTemperatureCharacteristic( Supplier> getter, Consumer subscriber, Runnable unsubscriber) { - this(0, 100, 0.1, getter, subscriber, unsubscriber); + this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, DEFAULT_STEP, getter, subscriber, unsubscriber); } } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java index 05e1ef647..8d7624f8f 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/HeatingThresholdTemperatureCharacteristic.java @@ -10,6 +10,9 @@ /** This characteristic describes the heating threshold on which heating get turned on. */ public class HeatingThresholdTemperatureCharacteristic extends FloatCharacteristic { + public static final double DEFAULT_MIN_VALUE = 0; + public static final double DEFAULT_MAX_VALUE = 25; + public static final double DEFAULT_STEP = 0.1; public HeatingThresholdTemperatureCharacteristic( double minValue, @@ -37,6 +40,13 @@ public HeatingThresholdTemperatureCharacteristic( ExceptionalConsumer setter, Consumer subscriber, Runnable unsubscriber) { - this(0, 25, 0.1, getter, setter, subscriber, unsubscriber); + this( + DEFAULT_MIN_VALUE, + DEFAULT_MAX_VALUE, + DEFAULT_STEP, + getter, + setter, + subscriber, + unsubscriber); } } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java index ff03bfbff..9a329d383 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/thermostat/TargetTemperatureCharacteristic.java @@ -13,6 +13,9 @@ * attempting to reach. */ public class TargetTemperatureCharacteristic extends FloatCharacteristic { + public static final double DEFAULT_MIN_VALUE = 10; + public static final double DEFAULT_MAX_VALUE = 38; + public static final double DEFAULT_STEP = 0.1; public TargetTemperatureCharacteristic( double minValue, @@ -40,6 +43,13 @@ public TargetTemperatureCharacteristic( ExceptionalConsumer setter, Consumer subscriber, Runnable unsubscriber) { - this(10, 38, 0.1, getter, setter, subscriber, unsubscriber); + this( + DEFAULT_MIN_VALUE, + DEFAULT_MAX_VALUE, + DEFAULT_STEP, + getter, + setter, + subscriber, + unsubscriber); } } From 6d13db3cb4681d874097dd5f8237d1f2c4682e4b Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sun, 24 May 2020 23:26:23 +0200 Subject: [PATCH 23/23] put debugData back Signed-off-by: Eugen Freiter --- .../hapjava/server/impl/http/impl/BinaryHandler.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java b/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java index 6bd5892f8..4f4c80788 100644 --- a/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java +++ b/src/main/java/io/github/hapjava/server/impl/http/impl/BinaryHandler.java @@ -6,6 +6,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageCodec; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +25,7 @@ public BinaryHandler(HomekitClientConnection connection) { @Override protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception { if (started) { + debugData("Sending data", msg, ctx); byte[] b = new byte[msg.readableBytes()]; msg.readBytes(b); out.writeBytes(connection.encryptResponse(b)); @@ -38,6 +40,7 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) t in.readBytes(b); byte[] decrypted = connection.decryptRequest(b); ByteBuf outBuf = Unpooled.copiedBuffer(decrypted); + debugData("Received data", outBuf, ctx); out.add(outBuf); started = true; } @@ -52,4 +55,13 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E } super.exceptionCaught(ctx, cause); } + + private void debugData(String msg, ByteBuf b, ChannelHandlerContext ctx) throws Exception { + if (logger.isDebugEnabled()) { + logger.debug( + String.format( + "%s [%s]:%n%s", + msg, ctx.channel().remoteAddress().toString(), b.toString(StandardCharsets.UTF_8))); + } + } }