diff --git a/docs/ServiceList.md b/docs/ServiceList.md
index 52af85d..331ca7a 100644
--- a/docs/ServiceList.md
+++ b/docs/ServiceList.md
@@ -21,161 +21,167 @@ Additionally, when first starting up, HomeSpan begins by validating the device's
### Service List
-| Service | Required Characteristics | Optional Characteristics |
-| ------- | -------------------- | ------------------- |
-| AccessoryInformation| FirmwareRevision
Identity
Manufacturer
Model
Name
SerialNumber | HardwareRevision |
-| AirPurifier | Active
CurrentAirPurifierState
TargetAirPurifierState | Name
RotationSpeed
SwingMode
LockPhysicalControls |
-| AirQualitySensor | AirQuality | Name
OzoneDensity
NitrogenDioxideDensity
SulphurDioxideDensity
PM25Density
PM10Density
VOCDensity
StatusActive
StatusFault
StatusTampered
StatusLowBattery |
-| BatteryService | BatteryLevel
ChargingState
StatusLowBattery | Name |
-| CarbonDioxideSensor | CarbonDioxideDetected | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery
CarbonDioxideLevel
CarbonDioxidePeakLevel |
-| CarbonMonoxideSensor | CarbonMonoxideDetected | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery
CarbonMonoxideLevel
CarbonMonoxidePeakLevel |
-| ContactSensor | ContactSensorState | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery |
-| Door | CurrentPosition
TargetPosition
PositionState | Name
HoldPosition
ObstructionDetected |
-| Doorbell | ProgrammableSwitchEvent | Name
Volume
Brightness |
-| Fan | Active | Name
CurrentFanState
TargetFanState
RotationDirection
RotationSpeed
SwingMode
LockPhysicalControls |
-| Faucet | Active | StatusFault
Name |
-| FilterMaintenance | FilterChangeIndication | Name
FilterLifeLevel
ResetFilterIndication |
-| GarageDoorOpener | CurrentDoorState
TargetDoorState
ObstructionDetected | LockCurrentState
LockTargetState
Name |
-| HAPProtocolInformation | Version | *none* |
-| HeaterCooler | Active
CurrentTemperature
CurrentHeaterCoolerState
TargetHeaterCoolerState | Name
RotationSpeed
TemperatureDisplayUnits
SwingMode
CoolingThresholdTemperature
HeatingThresholdTemperature
LockPhysicalControls |
-| HumidifierDehumidifier | Active
CurrentRelativeHumidity
CurrentHumidifierDehumidifierState
TargetHumidifierDehumidifierState | Name
RelativeHumidityDehumidifierThreshold
RelativeHumidityHumidifierThreshold
RotationSpeed
SwingMode
WaterLevel
LockPhysicalControls |
-| HumiditySensor | CurrentRelativeHumidity | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery |
-| InputSource | Identifier | ConfiguredName
IsConfigured
CurrentVisibilityState
TargetVisibilityState |
-| IrrigationSystem | Active
ProgramMode
InUse | RemainingDuration
Name
StatusFault |
-| LeakSensor | LeakDetected | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery |
-| LightBulb | On | Brightness
Hue
Name
Saturation
ColorTemperature |
-| LightSensor | CurrentAmbientLightLevel | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery |
-| LockMechanism | LockCurrentState
LockTargetState | Name |
-| Microphone | Mute | Name
Volume |
-| MotionSensor | MotionDetected | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery |
-| OccupancySensor | OccupancyDetected | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery |
-| Outlet | On
OutletInUse | Name |
-| SecuritySystem | SecuritySystemCurrentState
SecuritySystemTargetState | Name
SecuritySystemAlarmType
StatusFault
StatusTampered |
-| ServiceLabel | ServiceLabelNamespace | *none* |
-| Slat | CurrentSlatState
SlatType | Name
SwingMode
CurrentTiltAngle
TargetTiltAngle |
-| SmokeSensor | SmokeDetected | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery |
-| Speaker | Mute | Name
Volume |
-| StatelessProgrammableSwitch | ProgrammableSwitchEvent | Name
ServiceLabelIndex |
-| Switch | On | Name |
-| Television | Active | ConfiguredName
ActiveIdentifier
RemoteKey
PowerModeSelection |
-| TemperatureSensor | CurrentTemperature | Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery |
-| Thermostat | CurrentHeatingCoolingState
TargetHeatingCoolingState
CurrentTemperature
TargetTemperature
TemperatureDisplayUnits | CoolingThresholdTemperature
CurrentRelativeHumidity
HeatingThresholdTemperature
Name
TargetRelativeHumidity |
-| Valve | Active
InUse
ValveType | SetDuration
RemainingDuration
IsConfigured
ServiceLabelIndex
StatusFault
Name |
-| Window | CurrentPosition
TargetPosition
PositionState | Name
HoldPosition
ObstructionDetected |
-| WindowCovering | CurrentPosition
TargetPosition | Name
PositionState
HoldPosition
CurrentHorizontalTiltAngle
TargetHorizontalTiltAngle
CurrentVerticalTiltAngle
TargetVerticalTiltAngle
ObstructionDetected |
-
+|Service|Required Characteristics|Optional Characteristics|
+|-|-|-|
+|AccessoryInformation|Identify|FirmwareRevision
Manufacturer
Model
Name
SerialNumber
HardwareRevision
AccessoryFlags|
+|AirPurifier|Active
CurrentAirPurifierState
TargetAirPurifierState|Name
RotationSpeed
SwingMode
LockPhysicalControls|
+|AirQualitySensor|AirQuality|Name
OzoneDensity
NitrogenDioxideDensity
SulphurDioxideDensity
PM25Density
PM10Density
VOCDensity
StatusActive
StatusFault
StatusTampered
StatusLowBattery|
+|BatteryService|BatteryLevel
ChargingState
StatusLowBattery|Name|
+|CarbonDioxideSensor|CarbonDioxideDetected|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery
CarbonDioxideLevel
CarbonDioxidePeakLevel|
+|CarbonMonoxideSensor|CarbonMonoxideDetected|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery
CarbonMonoxideLevel
CarbonMonoxidePeakLevel|
+|ContactSensor|ContactSensorState|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery|
+|Door|CurrentPosition
TargetPosition
PositionState|Name
HoldPosition
ObstructionDetected|
+|Doorbell|ProgrammableSwitchEvent|Name
Volume
Brightness|
+|Fan|Active|Name
CurrentFanState
TargetFanState
RotationDirection
RotationSpeed
SwingMode
LockPhysicalControls|
+|Faucet|Active|StatusFault
Name|
+|FilterMaintenance|FilterChangeIndication|Name
FilterLifeLevel
ResetFilterIndication|
+|GarageDoorOpener|CurrentDoorState
TargetDoorState
ObstructionDetected|LockCurrentState
LockTargetState
Name|
+|HAPProtocolInformation|Version||HeaterCooler|Active
CurrentTemperature
CurrentHeaterCoolerState
TargetHeaterCoolerState|Name
RotationSpeed
TemperatureDisplayUnits
SwingMode
CoolingThresholdTemperature
HeatingThresholdTemperature
LockPhysicalControls|
+|HumidifierDehumidifier|Active
CurrentRelativeHumidity
CurrentHumidifierDehumidifierState
TargetHumidifierDehumidifierState|Name
RelativeHumidityDehumidifierThreshold
RelativeHumidityHumidifierThreshold
RotationSpeed
SwingMode
WaterLevel
LockPhysicalControls|
+|HumiditySensor|CurrentRelativeHumidity|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery|
+|InputSource|Identifier|ConfiguredName
IsConfigured
CurrentVisibilityState
TargetVisibilityState|
+|IrrigationSystem|Active
ProgramMode
InUse|RemainingDuration
StatusFault|
+|LeakSensor|LeakDetected|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery|
+|LightBulb|On|Brightness
Hue
Name
Saturation
ColorTemperature|
+|LightSensor|CurrentAmbientLightLevel|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery|
+|LockMechanism|LockCurrentState
LockTargetState|Name|
+|Microphone|Mute|Name
Volume|
+|MotionSensor|MotionDetected|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery|
+|OccupancySensor|OccupancyDetected|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery|
+|Outlet|On
OutletInUse|Name|
+|SecuritySystem|SecuritySystemCurrentState
SecuritySystemTargetState|Name
SecuritySystemAlarmType
StatusFault
StatusTampered|
+|ServiceLabel|ServiceLabelNamespace||Slat|CurrentSlatState
SlatType|Name
SwingMode
CurrentTiltAngle
TargetTiltAngle|
+|SmokeSensor|SmokeDetected|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery|
+|Speaker|Mute|Name
Volume|
+|StatelessProgrammableSwitch|ProgrammableSwitchEvent|Name
ServiceLabelIndex|
+|Switch|On|Name|
+|Television|Active|ConfiguredName
ActiveIdentifier
RemoteKey
PowerModeSelection|
+|TelevisionSpeaker|VolumeControlType
VolumeSelector||TemperatureSensor|CurrentTemperature|Name
StatusActive
StatusFault
StatusTampered
StatusLowBattery|
+|Thermostat|CurrentHeatingCoolingState
TargetHeatingCoolingState
CurrentTemperature
TargetTemperature
TemperatureDisplayUnits|CoolingThresholdTemperature
CurrentRelativeHumidity
HeatingThresholdTemperature
Name
TargetRelativeHumidity|
+|Valve|Active
InUse
ValveType|SetDuration
RemainingDuration
IsConfigured
ServiceLabelIndex
StatusFault
Name|
+|Window|CurrentPosition
TargetPosition
PositionState|Name
HoldPosition
ObstructionDetected|
+|WindowCovering|TargetPosition
CurrentPosition
PositionState|Name
HoldPosition
CurrentHorizontalTiltAngle
TargetHorizontalTiltAngle
CurrentVerticalTiltAngle
TargetVerticalTiltAngle
ObstructionDetected|
### Characteristic Types and Defaults
-|Characteristic|Type|Default
-|---|---|---|
-|Active|uint8_t|0|
-|ActiveIdentifier|uint32_t|0|
-|AirQuality|uint8_t|0|
-|BatteryLevel|uint8_t|0|
-|Brightness|int|0|
-|CarbonMonoxideLevel|double|0|
-|CarbonMonoxidePeakLevel|double|0|
-|CarbonMonoxideDetected|uint8_t|0|
-|CarbonDioxideLevel|double|0|
-|CarbonDioxidePeakLevel|double|0|
-|CarbonDioxideDetected|uint8_t|0|
-|ChargingState|uint8_t|0|
-|CoolingThresholdTemperature|double|10|
-|ColorTemperature|uint32_t|50|
-|ConfiguredName|char \*|"unnamed"|
-|ContactSensorState|uint8_t|1|
-|CurrentAmbientLightLevel|double|1|
-|CurrentHorizontalTiltAngle|int|0|
-|CurrentAirPurifierState|uint8_t|1|
-|CurrentSlatState|uint8_t|0|
-|CurrentPosition|uint8_t|0|
-|CurrentVerticalTiltAngle|int|0|
-|CurrentHumidifierDehumidifierState|uint8_t|1|
-|CurrentDoorState|uint8_t|1|
-|CurrentFanState|uint8_t|1|
-|CurrentHeatingCoolingState|uint8_t|0|
-|CurrentHeaterCoolerState|uint8_t|1|
-|CurrentRelativeHumidity|double|0|
-|CurrentTemperature|double|0|
-|CurrentTiltAngle|int|0|
-|CurrentVisibilityState|uint8_t|0|
-|FilterLifeLevel|double|0|
-|FilterChangeIndication|uint8_t|0|
-|FirmwareRevision|char \*|"1.0.0"|
-|HardwareRevision|char \*|"1.0.0"|
-|HeatingThresholdTemperature|double|16|
-|HoldPosition|boolean|false|
-|Hue|double|0|
-|Identifier|uint32_t|0|
-|Identify|boolean|false|
-|InUse|uint8_t|0|
-|IsConfigured|uint8_t|0|
-|LeakDetected|uint8_t|0|
-|LockCurrentState|uint8_t|0|
-|LockPhysicalControls|uint8_t|0|
-|LockTargetState|uint8_t|0|
-|Manufacturer|char \*|"HomeSpan"|
-|Model|char \*|"HomeSpan-ESP32"|
-|MotionDetected|boolean|false|
-|Mute|boolean|false|
-|Name|char \*|"unnamed"|
-|NitrogenDioxideDensity|double|0|
-|ObstructionDetected|boolean|false|
-|PM25Density|double|0|
-|OccupancyDetected|uint8_t|0|
-|OutletInUse|boolean|false|
-|On|boolean|false|
-|OzoneDensity|double|0|
-|PM10Density|double|0|
-|PositionState|uint8_t|2|
-|PowerModeSelection|uint8_t|0|
-|ProgramMode|uint8_t|0|
-|ProgrammableSwitchEvent|uint8_t|0|
-|RelativeHumidityDehumidifierThreshold|double|50|
-|RelativeHumidityHumidifierThreshold|double|50|
-|RemainingDuration|uint32_t|60|
-|RemoteKey|uint8_t|0|
-|ResetFilterIndication|uint8_t|0|
-|RotationDirection|int|0|
-|RotationSpeed|double|0|
-|Saturation|double|0|
-|SecuritySystemAlarmType|uint8_t|0|
-|SecuritySystemCurrentState|uint8_t|3|
-|SecuritySystemTargetState|uint8_t|3|
-|SerialNumber|char \*|"HS-12345"|
-|ServiceLabelIndex|uint8_t|1|
-|ServiceLabelNamespace|uint8_t|1|
-|SlatType|uint8_t|0|
-|SmokeDetected|uint8_t|0|
-|StatusActive|boolean|true|
-|StatusFault|uint8_t|0|
-|StatusJammed|uint8_t|0|
-|StatusLowBattery|uint8_t|0|
-|StatusTampered|uint8_t|0|
-|SulphurDioxideDensity|double|0|
-|SwingMode|uint8_t|0|
-|TargetAirPurifierState|uint8_t|1|
-|TargetFanState|uint8_t|1|
-|TargetTiltAngle|int|0|
-|SetDuration|uint32_t|60|
-|TargetHorizontalTiltAngle|int|0|
-|TargetHumidifierDehumidifierState|uint8_t|0|
-|TargetPosition|uint8_t|0|
-|TargetDoorState|uint8_t|1|
-|TargetHeaterCoolerState|uint8_t|0|
-|TargetHeatingCoolingState|uint8_t|0|
-|TargetRelativeHumidity|double|0|
-|TargetTemperature|double|16|
-|TemperatureDisplayUnits|uint8_t|0|
-|TargetVerticalTiltAngle|int|0|
-|TargetVisibilityState|uint8_t|0|
-|ValveType|uint8_t|0|
-|Version|char \*|"1.0.0"|
-|VOCDensity|double|0|
-|Volume|uint8_t|0|
-|WaterLevel|double|0|
-
+|Characteristic|Type|Default|Range|
+|-|-|-|-|
+AccessoryFlags|uint32_t|1|[1,1]|
+Active|uint8_t|0|[0,1]|
+ActiveIdentifier|uint32_t|0|[0,255]|
+AirQuality|uint8_t|0|[0,5]|
+BatteryLevel|uint8_t|0|[0,100]|
+Brightness|int|0|[0,100]|
+CarbonMonoxideLevel|double|0|[0,100]|
+CarbonMonoxidePeakLevel|double|0|[0,100]|
+CarbonMonoxideDetected|uint8_t|0|[0,1]|
+CarbonDioxideLevel|double|0|[0,100000]|
+CarbonDioxidePeakLevel|double|0|[0,100000]|
+CarbonDioxideDetected|uint8_t|0|[0,1]|
+ChargingState|uint8_t|0|[0,2]|
+ClosedCaptions|uint8_t|0|[0,1]|
+CoolingThresholdTemperature|double|10|[10,35]|
+ColorTemperature|uint32_t|200|[140,500]|
+ContactSensorState|uint8_t|1|[0,1]|
+ConfiguredName|char \*|"unnamed"|||
+CurrentAmbientLightLevel|double|1|[0.0001,100000]|
+CurrentHorizontalTiltAngle|int|0|[-90,90]|
+CurrentAirPurifierState|uint8_t|1|[0,2]|
+CurrentSlatState|uint8_t|0|[0,2]|
+CurrentPosition|uint8_t|0|[0,100]|
+CurrentVerticalTiltAngle|int|0|[-90,90]|
+CurrentVisibilityState|uint8_t|0|[0,1]|
+CurrentHumidifierDehumidifierState|uint8_t|1|[0,3]|
+CurrentDoorState|uint8_t|1|[0,4]|
+CurrentFanState|uint8_t|1|[0,2]|
+CurrentHeatingCoolingState|uint8_t|0|[0,2]|
+CurrentHeaterCoolerState|uint8_t|1|[0,3]|
+CurrentMediaState|uint8_t|0|[0,5]|
+CurrentRelativeHumidity|double|0|[0,100]|
+CurrentTemperature|double|0|[0,100]|
+CurrentTiltAngle|int|0|[-90,90]|
+FilterLifeLevel|double|0|[0,100]|
+FilterChangeIndication|uint8_t|0|[0,1]|
+FirmwareRevision|char \*|"1.0.0"|||
+HardwareRevision|char \*|"1.0.0"|||
+HeatingThresholdTemperature|double|16|[0,25]|
+HoldPosition|boolean|false|[0,1]|
+Hue|double|0|[0,360]|
+Identify|boolean|false|[0,1]|
+Identifier|uint32_t|0|[0,255]|
+InputDeviceType|uint8_t|0|[0,6]|
+InputSourceType|uint8_t|0|[0,10]|
+InUse|uint8_t|0|[0,1]|
+IsConfigured|uint8_t|0|[0,1]|
+LeakDetected|uint8_t|0|[0,1]|
+LockCurrentState|uint8_t|0|[0,3]|
+LockPhysicalControls|uint8_t|0|[0,1]|
+LockTargetState|uint8_t|0|[0,1]|
+Manufacturer|char \*|"HomeSpan"|||
+Model|char \*|"HomeSpan-ESP32"|||
+MotionDetected|boolean|false|[0,1]|
+Mute|boolean|false|[0,1]|
+Name|char \*|"unnamed"|||
+NitrogenDioxideDensity|double|0|[0,1000]|
+ObstructionDetected|boolean|false|[0,1]|
+PM25Density|double|0|[0,1000]|
+OccupancyDetected|uint8_t|0|[0,1]|
+OutletInUse|boolean|false|[0,1]|
+On|boolean|false|[0,1]|
+OzoneDensity|double|0|[0,1000]|
+PictureMode|uint8_t|0|[0,13]|
+PM10Density|double|0|[0,1000]|
+PositionState|uint8_t|2|[0,2]|
+PowerModeSelection|uint8_t|0|[0,1]|
+ProgramMode|uint8_t|0|[0,2]|
+ProgrammableSwitchEvent|uint8_t|0|[0,2]|
+RelativeHumidityDehumidifierThreshold|double|50|[0,100]|
+RelativeHumidityHumidifierThreshold|double|50|[0,100]|
+RemainingDuration|uint32_t|60|[0,3600]|
+RemoteKey|uint8_t|0|[0,16]|
+ResetFilterIndication|uint8_t|0|[1,1]|
+RotationDirection|int|0|[0,1]|
+RotationSpeed|double|0|[0,100]|
+Saturation|double|0|[0,100]|
+SecuritySystemAlarmType|uint8_t|0|[0,1]|
+SecuritySystemCurrentState|uint8_t|3|[0,4]|
+SecuritySystemTargetState|uint8_t|3|[0,3]|
+SerialNumber|char \*|"HS-12345"|||
+ServiceLabelIndex|uint8_t|1|[1,255]|
+ServiceLabelNamespace|uint8_t|1|[0,1]|
+SlatType|uint8_t|0|[0,1]|
+SleepDiscoveryMode|uint8_t|0|[0,1]|
+SmokeDetected|uint8_t|0|[0,1]|
+StatusActive|boolean|true|[0,1]|
+StatusFault|uint8_t|0|[0,1]|
+StatusJammed|uint8_t|0|[0,1]|
+StatusLowBattery|uint8_t|0|[0,1]|
+StatusTampered|uint8_t|0|[0,1]|
+SulphurDioxideDensity|double|0|[0,1000]|
+SwingMode|uint8_t|0|[0,1]|
+TargetAirPurifierState|uint8_t|1|[0,1]|
+TargetFanState|uint8_t|1|[0,1]|
+TargetTiltAngle|int|0|[-90,90]|
+TargetHeaterCoolerState|uint8_t|0|[0,2]|
+SetDuration|uint32_t|60|[0,3600]|
+TargetHorizontalTiltAngle|int|0|[-90,90]|
+TargetHumidifierDehumidifierState|uint8_t|0|[0,2]|
+TargetPosition|uint8_t|0|[0,100]|
+TargetDoorState|uint8_t|1|[0,1]|
+TargetHeatingCoolingState|uint8_t|0|[0,3]|
+TargetMediaState|uint8_t|0|[0,2]|
+TargetRelativeHumidity|double|0|[0,100]|
+TargetTemperature|double|16|[10,38]|
+TargetVisibilityState|uint8_t|0|[0,1]|
+TemperatureDisplayUnits|uint8_t|0|[0,1]|
+TargetVerticalTiltAngle|int|0|[-90,90]|
+ValveType|uint8_t|0|[0,3]|
+Version|char \*|"1.0.0"|||
+VOCDensity|double|0|[0,1000]|
+Volume|uint8_t|0|[0,100]|
+VolumeControlType|uint8_t|0|[0,3]|
+VolumeSelector|uint8_t|0|[0,1]|
+WaterLevel|double|0|[0,100]|
### HAP Format Codes (HAP-R2 Table 6-5)
@@ -190,7 +196,7 @@ Additionally, when first starting up, HomeSpan begins by validating the device's
|FLOAT|double|
|STRING|char \*|
|TLV8|(not implemented)|
-|DATA|(not implemented)|
+|DATA|uint8_t *|
---