This commit is contained in:
Gregg 2024-01-23 21:21:55 -06:00
parent 294d898de8
commit 38a060f203
3 changed files with 522 additions and 97 deletions

View File

@ -22,8 +22,423 @@ HomeSpan Services and Characteristics are implemented as C++ Classes with names
The pre-defined constant expressions for enumerated Characteristics are in namespaces that match the name of the Characteristic. For example, to set the *Air Quality* Characteristic of an *Air Quality Sensor* Service, you could use `setVal(AirQuality::GOOD)` or, equivalently, `setVal(2)`[^3] The pre-defined constant expressions for enumerated Characteristics are in namespaces that match the name of the Characteristic. For example, to set the *Air Quality* Characteristic of an *Air Quality Sensor* Service, you could use `setVal(AirQuality::GOOD)` or, equivalently, `setVal(2)`[^3]
<!-- *AUTOGENERATED* TEXT. DO NOT EDIT THIS LINE OR ANYTHING BELOW --> <!-- AUTOGENERATED_TEXT. DO NOT EDIT THIS LINE OR ANYTHING BELOW -->
## AccessoryInformation (3E)
<details><summary> Required Identification Information. For each Accessory in a HomeSpan device this <i>must</i> be included as the first Service.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>Identify (14) :small_blue_diamond:</b><ul><li> triggers an update when HomeKit wants HomeSpan to run its identification routine for an Accessory</li></ul></td><td align="center">bool</td><td align="center">PW</td><td align="center">1</td><td align="center">1</td><td><ul><li><b>RUN_ID&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>FirmwareRevision (52) </b><ul><li> must be in form x[.y[.z]] - informational only</li></ul></td><td align="center">string</td><td align="center">PR+EV</td><td align="center">-</td><td align="center">-</td><td align="center">"1.0.0"</td></tr>
<tr><td><b>Manufacturer (20) </b><ul><li> any string - informational only</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"HomeSpan"</td></tr>
<tr><td><b>Model (21) </b><ul><li> any string - informational only</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"HomeSpan-ESP32"</td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>SerialNumber (30) </b><ul><li> any string - informational only</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"HS-12345"</td></tr>
<tr><td><b>HardwareRevision (53) </b><ul><li> must be in form x[.y[.z]] - informational only</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"1.0.0"</td></tr>
</table></details>
## AirPurifier (BB)
<details><summary> Defines a basic Air Purifier with an optional fan. Optional Linked Services: <b>FilterMaintenance</b>, <b>AirQualitySensor</b>, <b>Fan</b>, and <b>Slat</b></summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>Active (B0) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ACTIVE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>CurrentAirPurifierState (A9) :small_blue_diamond:</b><ul><li> indicates current state of air purification</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b></li><li><b>IDLE&nbsp(1)&nbsp;</b>:heavy_check_mark:</li><li><b>PURIFYING&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>TargetAirPurifierState (A8) :small_blue_diamond:</b><ul><li> indicates desired state of air purifier</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>MANUAL&nbsp(0)&nbsp;</b></li><li><b>AUTO&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>RotationSpeed (29) </b><ul><li> measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>SwingMode (B6) </b><ul><li> indicates whether swing-nmode is enabled</li></ul></td><td align="center">uint8</td><td align="center">PR+EV+PW</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>SWING_DISABLED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>SWING_ENABLED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>LockPhysicalControls (A7) </b><ul><li> indicates if local control lock is enabled</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>CONTROL_LOCK_DISABLED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>CONTROL_LOCK_ENABLED&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## AirQualitySensor (8D)
<details><summary> Defines an Air Quality Sensor. </summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>AirQuality (95) :small_blue_diamond:</b><ul><li> a subjective description</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">5</td><td><ul><li><b>UNKNOWN&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>EXCELLENT&nbsp(1)&nbsp;</b></li><li><b>GOOD&nbsp(2)&nbsp;</b></li><li><b>FAIR&nbsp(3)&nbsp;</b></li><li><b>INFERIOR&nbsp(4)&nbsp;</b></li><li><b>POOR&nbsp(5)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>OzoneDensity (C3) </b><ul><li> measured in &micro;g/m<sup>3</sup></li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1000</td><td align="center">0</td></tr>
<tr><td><b>NitrogenDioxideDensity (C4) </b><ul><li> measured in &micro;g/m<sup>3</sup></li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1000</td><td align="center">0</td></tr>
<tr><td><b>SulphurDioxideDensity (C5) </b><ul><li> measured in &micro;g/m<sup>3</sup></li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1000</td><td align="center">0</td></tr>
<tr><td><b>PM25Density (C6) </b><ul><li> 2.5-micron particulate density, measured in &micro;g/m<sup>3</sup></li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1000</td><td align="center">0</td></tr>
<tr><td><b>PM10Density (C7) </b><ul><li> 10-micron particulate density, measured in &micro;g/m<sup>3</sup></li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1000</td><td align="center">0</td></tr>
<tr><td><b>VOCDensity (C8) </b><ul><li> measured in &micro;g/m<sup>3</sup></li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1000</td><td align="center">0</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## BatteryService (96)
<details><summary> Defines a standalone Battery Service.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>BatteryLevel (68) :small_blue_diamond:</b><ul><li> measured as a percentage</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">100</td></tr>
<tr><td><b>ChargingState (8F) :small_blue_diamond:</b><ul><li> indicates state of battery charging</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>NOT_CHARGING&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>CHARGING&nbsp(1)&nbsp;</b></li><li><b>NOT_CHARGEABLE&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) :small_blue_diamond:</b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
</table></details>
## CarbonDioxideSensor (97)
<details><summary> Defines a Carbon Dioxide Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CarbonDioxideDetected (92) :small_blue_diamond:</b><ul><li> indicates if abnormal level is detected</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NORMAL&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ABNORMAL&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>CarbonDioxideLevel (93) </b><ul><li> measured on parts per million (ppm)</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100000</td><td align="center">0</td></tr>
<tr><td><b>CarbonDioxidePeakLevel (94) </b><ul><li> measured in parts per million (ppm)</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100000</td><td align="center">0</td></tr>
</table></details>
## CarbonMonoxideSensor (7F)
<details><summary> Defines a Carbon Monoxide Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CarbonMonoxideDetected (69) :small_blue_diamond:</b><ul><li> indicates if abnormal level is detected</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NORMAL&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ABNORMAL&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>CarbonMonoxideLevel (90) </b><ul><li> measured in parts per million (ppm)</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>CarbonMonoxidePeakLevel (91) </b><ul><li> measured in parts per million (ppm)</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
</table></details>
## ContactSensor (80)
<details><summary> Defines a Contact Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>ContactSensorState (6A) :small_blue_diamond:</b><ul><li> indictates if contact is detected (i.e. closed)</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>DETECTED&nbsp(0)&nbsp;</b></li><li><b>NOT_DETECTED&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## Door (81)
<details><summary> Defines a motorized Door.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CurrentPosition (6D) :small_blue_diamond:</b><ul><li> current position (as a percentage) from fully closed (0) to full open (100)</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>TargetPosition (7C) :small_blue_diamond:</b><ul><li> indicates target position (as a percentage) from fully closed (0) to full open (100)</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>ObstructionDetected (24) </b><ul><li> indicates if obstruction is detected</li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_DETECTED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DETECTED&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## Doorbell (121)
<details><summary> Defines a Doorbell. Can be used on a standalone basis or in conjunction with a <b>LockMechanism</b> Service.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>ProgrammableSwitchEvent (73) :small_blue_diamond:</b><ul><li> specifies type of button press</li></ul></td><td align="center">uint8</td><td align="center">PR+EV+NV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>SINGLE_PRESS&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DOUBLE_PRESS&nbsp(1)&nbsp;</b></li><li><b>LONG_PRESS&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
</table></details>
## Fan (B7)
<details><summary> Defines a Fan. Can be used in conjunction with a <b>LightBulb</b> Service to create a Lighted Ceiling Fan.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>Active (B0) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ACTIVE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>CurrentFanState (AF) </b><ul><li> indicates current state of a fan</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b></li><li><b>IDLE&nbsp(1)&nbsp;</b>:heavy_check_mark:</li><li><b>BLOWING&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>TargetFanState (BF) </b><ul><li> indicates desired state of fan</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>MANUAL&nbsp(0)&nbsp;</b></li><li><b>AUTO&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>RotationDirection (28) </b><ul><li> indicates the rotation direction of a fan</li></ul></td><td align="center">int</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>CLOCKWISE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>COUNTERCLOCKWISE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>RotationSpeed (29) </b><ul><li> measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>SwingMode (B6) </b><ul><li> indicates whether swing-nmode is enabled</li></ul></td><td align="center">uint8</td><td align="center">PR+EV+PW</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>SWING_DISABLED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>SWING_ENABLED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>LockPhysicalControls (A7) </b><ul><li> indicates if local control lock is enabled</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>CONTROL_LOCK_DISABLED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>CONTROL_LOCK_ENABLED&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## Faucet (D7)
<details><summary> Defines the master control for a multi-Valve appliance. Linked Services: <b>Valve</b> (at least one <i>required</i>), and <b>HeaterCooler</b> (optional).</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>Active (B0) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ACTIVE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
</table></details>
## FilterMaintenance (BA)
<details><summary> Defines a Filter Maintainence check.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>FilterChangeIndication (AC) :small_blue_diamond:</b><ul><li> indicates state of filter</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_CHANGE_NEEDED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>CHANGE_NEEDED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>FilterLifeLevel (AB) </b><ul><li> measures as a percentage of remaining life</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>ResetFilterIndication (AD) </b><ul><li> triggers and update when the user chooses to reset the <b>FilterChangeIndication</b> from the Home App</li></ul></td><td align="center">uint8</td><td align="center">PW</td><td align="center">1</td><td align="center">1</td><td><ul><li><b>RESET_FILTER&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## GarageDoorOpener (41)
<details><summary> Defines a motorized Garage Door Opener.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CurrentDoorState (E) :small_blue_diamond:</b><ul><li> indicates current state of a door</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">4</td><td><ul><li><b>OPEN&nbsp(0)&nbsp;</b></li><li><b>CLOSED&nbsp(1)&nbsp;</b>:heavy_check_mark:</li><li><b>OPENING&nbsp(2)&nbsp;</b></li><li><b>CLOSING&nbsp(3)&nbsp;</b></li><li><b>STOPPED&nbsp(4)&nbsp;</b></li></ul></td></tr>
<tr><td><b>TargetDoorState (32) :small_blue_diamond:</b><ul><li> indicates desired state of door</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>OPEN&nbsp(0)&nbsp;</b></li><li><b>CLOSED&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>ObstructionDetected (24) :small_blue_diamond:</b><ul><li> indicates if obstruction is detected</li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_DETECTED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DETECTED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>LockCurrentState (1D) </b><ul><li> indicates state of a lock</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">3</td><td><ul><li><b>UNLOCKED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOCKED&nbsp(1)&nbsp;</b></li><li><b>JAMMED&nbsp(2)&nbsp;</b></li><li><b>UNKNOWN&nbsp(3)&nbsp;</b></li></ul></td></tr>
<tr><td><b>LockTargetState (1E) </b><ul><li> indicates desired state of lock</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>UNLOCK&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOCK&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>Version (37) :small_blue_diamond:</b><ul><li> unused</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"1.0.0"</td></tr>
</table></details>
## HeaterCooler (BC)
<details><summary> Defines a standalone Heater, Cooler, or combined Heater/Cooler. Can be used with a separate <b>Fan</b> Service and/or <b>Slat</b> Service to extend functionality.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>Active (B0) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ACTIVE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>CurrentTemperature (11) :small_blue_diamond:</b><ul><li> current temperature measured in Celsius</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>CurrentHeaterCoolerState (B1) :small_blue_diamond:</b><ul><li> indicates whether appliance is currently heating, cooling, idle, or off</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">3</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b></li><li><b>IDLE&nbsp(1)&nbsp;</b>:heavy_check_mark:</li><li><b>HEATING&nbsp(2)&nbsp;</b></li><li><b>COOLING&nbsp(3)&nbsp;</b></li></ul></td></tr>
<tr><td><b>TargetHeaterCoolerState (B2) :small_blue_diamond:</b><ul><li> indicates desired state of heater/cooler</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>AUTO&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>HEAT&nbsp(1)&nbsp;</b></li><li><b>COOL&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>RotationSpeed (29) </b><ul><li> measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>TemperatureDisplayUnits (36) </b><ul><li> indicates the desired units to display the temperature on the device itself (has no effect on Home App)</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>CELSIUS&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAHRENHEIT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>SwingMode (B6) </b><ul><li> indicates whether swing-nmode is enabled</li></ul></td><td align="center">uint8</td><td align="center">PR+EV+PW</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>SWING_DISABLED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>SWING_ENABLED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>CoolingThresholdTemperature (D) </b><ul><li> cooling turns on when temperature (in Celsius) rises above this threshold</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">10</td><td align="center">35</td><td align="center">10</td></tr>
<tr><td><b>HeatingThresholdTemperature (12) </b><ul><li> heating turns on when temperature (in Celsius) falls below this threshold</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">25</td><td align="center">16</td></tr>
<tr><td><b>LockPhysicalControls (A7) </b><ul><li> indicates if local control lock is enabled</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>CONTROL_LOCK_DISABLED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>CONTROL_LOCK_ENABLED&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## HumidifierDehumidifier (BD)
<details><summary> Defines a Humidifer, Dehumidifier, or combined Humidifer/Dehumidifier. Can be used with a separate <b>Fan</b> Service and/or <b>Slat</b> Service to extend functionality.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>Active (B0) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ACTIVE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>CurrentRelativeHumidity (10) :small_blue_diamond:</b><ul><li> current humidity measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>CurrentHumidifierDehumidifierState (B3) :small_blue_diamond:</b><ul><li> indicates current state of humidifier/dehumidifer</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">3</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b></li><li><b>IDLE&nbsp(1)&nbsp;</b>:heavy_check_mark:</li><li><b>HUMIDIFYING&nbsp(2)&nbsp;</b></li><li><b>DEHUMIDIFYING&nbsp(3)&nbsp;</b></li></ul></td></tr>
<tr><td><b>TargetHumidifierDehumidifierState (B4) :small_blue_diamond:</b><ul><li> indicates desired state of humidifier/dehumidifier</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>AUTO&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>HUMIDIFY&nbsp(1)&nbsp;</b></li><li><b>DEHUMIDIFY&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>RelativeHumidityDehumidifierThreshold (C9) </b><ul><li> dehumidfier turns on when humidity rises above this threshold</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">100</td><td align="center">50</td></tr>
<tr><td><b>RelativeHumidityHumidifierThreshold (CA) </b><ul><li> humidfier turns on when humidity falls below this threshold</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">100</td><td align="center">50</td></tr>
<tr><td><b>RotationSpeed (29) </b><ul><li> measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>SwingMode (B6) </b><ul><li> indicates whether swing-nmode is enabled</li></ul></td><td align="center">uint8</td><td align="center">PR+EV+PW</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>SWING_DISABLED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>SWING_ENABLED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>WaterLevel (B5) </b><ul><li> measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>LockPhysicalControls (A7) </b><ul><li> indicates if local control lock is enabled</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>CONTROL_LOCK_DISABLED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>CONTROL_LOCK_ENABLED&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## HumiditySensor (82)
<details><summary> Defines a Humidity Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CurrentRelativeHumidity (10) :small_blue_diamond:</b><ul><li> current humidity measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## InputSource (D9)
<details><summary> Defines an Input Source for a TV. Use <i>only</i> as a Linked Service for the <b>Television</b> Service.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>ConfiguredName (E3) </b><ul><li> a "configurable" Service name - any updates made from within the Home App trigger an update in HomeSpan and vice versa.</li></ul></td><td align="center">string</td><td align="center">PW+PR+EV</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>IsConfigured (D6) </b><ul><li> indicates if a predefined Service has been configured</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_CONFIGURED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>CONFIGURED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Identifier (E6) :small_blue_diamond:</b><ul><li> numerical Identifer of the <b>InputSource</b>.</li></ul></td><td align="center">uint32</td><td align="center">PR</td><td align="center">0</td><td align="center">255</td><td align="center">0</td></tr>
<tr><td><b>CurrentVisibilityState (135) </b><ul><li> current visibility of the Service, as selectable on the Settings Page of the Home App</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>VISIBLE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>NOT_VISIBLE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>TargetVisibilityState (134) </b><ul><li> indicates desired visibility of the Service, as selectable on the Settings Page of the Home App</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>VISIBLE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>NOT_VISIBLE&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## IrrigationSystem (CF)
<details><summary> Defines an Irrigation System. Linked Services: <b>Valve</b> Service (at least one <i>required</i>).</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>Active (B0) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ACTIVE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>ProgramMode (D1) :small_blue_diamond:</b><ul><li> indicates if pre-scheduled program is running</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>NONE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>SCHEDULED&nbsp(1)&nbsp;</b></li><li><b>SCHEDULE_OVERRIDEN&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>InUse (D2) :small_blue_diamond:</b><ul><li> if Service is set to active, this indictes whether it is currently in use</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_IN_USE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>IN_USE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>RemainingDuration (D4) </b><ul><li> duration (in seconds) remaining for Service to be active/on</li></ul></td><td align="center">uint32</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">3600</td><td align="center">60</td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## LeakSensor (83)
<details><summary> Defines a Leak Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>LeakDetected (70) :small_blue_diamond:</b><ul><li> indictates if a leak is detected</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_DETECTED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DETECTED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## LightBulb (43)
<details><summary> Defines any type of Light.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>On (25) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">bool</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>OFF&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ON&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Brightness (8) </b><ul><li> measured as a percentage</li></ul></td><td align="center">int</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>Hue (13) </b><ul><li> color (in degrees) from red (0) to green (120) to blue (240) and back to red (360)</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">360</td><td align="center">0</td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>Saturation (2F) </b><ul><li> color saturation, measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>ColorTemperature (CE) </b><ul><li> measured in inverse megaKelvin (= 1,000,000 / Kelvin)</li></ul></td><td align="center">uint32</td><td align="center">PR+PW+EV</td><td align="center">140</td><td align="center">500</td><td align="center">200</td></tr>
</table></details>
## LightSensor (84)
<details><summary> Defines a Light Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CurrentAmbientLightLevel (6B) :small_blue_diamond:</b><ul><li> measured in Lux (lumens/m<sup>2</sup></li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0.0001</td><td align="center">100000</td><td align="center">1</td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## LockMechanism (45)
<details><summary> Defines an electronic Lock.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>LockCurrentState (1D) :small_blue_diamond:</b><ul><li> indicates state of a lock</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">3</td><td><ul><li><b>UNLOCKED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOCKED&nbsp(1)&nbsp;</b></li><li><b>JAMMED&nbsp(2)&nbsp;</b></li><li><b>UNKNOWN&nbsp(3)&nbsp;</b></li></ul></td></tr>
<tr><td><b>LockTargetState (1E) :small_blue_diamond:</b><ul><li> indicates desired state of lock</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>UNLOCK&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOCK&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>Mute (11A) :small_blue_diamond:</b><ul><li> not used</li></ul></td><td align="center">bool</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>OFF&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ON&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>Volume (119) </b><ul><li> unused</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
</table></details>
## MotionSensor (85)
<details><summary> Defines a Motion Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>MotionDetected (22) :small_blue_diamond:</b><ul><li> indicates if motion is detected</li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_DETECTED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DETECTED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## OccupancySensor (86)
<details><summary> Defines and Occupancy Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>OccupancyDetected (71) :small_blue_diamond:</b><ul><li> indicates if occupanccy is detected</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_DETECTED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DETECTED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## Outlet (47)
<details><summary> Defines an controllable Outlet used to power any light or appliance.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>On (25) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">bool</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>OFF&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ON&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>OutletInUse (26) :small_blue_diamond:</b><ul><li> indicates if an appliance or light is plugged into the outlet, regardless of whether on or off </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_IN_USE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>IN_USE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
</table></details>
## SecuritySystem (7E)
<details><summary> Defines a Security System.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>SecuritySystemCurrentState (66) :small_blue_diamond:</b><ul><li> indicates current state of the security system </li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">4</td><td><ul><li><b>ARMED_STAY&nbsp(0)&nbsp;</b></li><li><b>ARMED_AWAY&nbsp(1)&nbsp;</b></li><li><b>ARMED_NIGHT&nbsp(2)&nbsp;</b></li><li><b>DISARMED&nbsp(3)&nbsp;</b>:heavy_check_mark:</li><li><b>ALARM_TRIGGERED&nbsp(4)&nbsp;</b></li></ul></td></tr>
<tr><td><b>SecuritySystemTargetState (67) :small_blue_diamond:</b><ul><li> indicates desired state of the security system</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">3</td><td><ul><li><b>ARM_STAY&nbsp(0)&nbsp;</b></li><li><b>ARM_AWAY&nbsp(1)&nbsp;</b></li><li><b>ARM_NIGHT&nbsp(2)&nbsp;</b></li><li><b>DISARM&nbsp(3)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>SecuritySystemAlarmType (8E) </b><ul><li> indicates whether alarm was triggered for known reason</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>KNOWN&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>UNKNOWN&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>ServiceLabelNamespace (CD) :small_blue_diamond:</b><ul><li> unused</li></ul></td><td align="center">uint8</td><td align="center">PR</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>DOTS&nbsp(0)&nbsp;</b></li><li><b>NUMERALS&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
</table></details>
## Slat (B9)
<details><summary> Defines a motorized ventilation Slat(s).</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CurrentSlatState (AA) :small_blue_diamond:</b><ul><li> indicates current state of slats</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>FIXED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>JAMMED&nbsp(1)&nbsp;</b></li><li><b>SWINGING&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>SlatType (C0) :small_blue_diamond:</b><ul><li> indicates the direction of a slat or group of slats</li></ul></td><td align="center">uint8</td><td align="center">PR</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>HORIZONTAL&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>VERTICAL&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>SwingMode (B6) </b><ul><li> indicates whether swing-nmode is enabled</li></ul></td><td align="center">uint8</td><td align="center">PR+EV+PW</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>SWING_DISABLED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>SWING_ENABLED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>CurrentTiltAngle (C1) </b><ul><li> current angle (in degrees) of slats from fully up or left (-90) to fully open (0) to fully down or right (90)</li></ul></td><td align="center">int</td><td align="center">PR+EV</td><td align="center">-90</td><td align="center">90</td><td align="center">0</td></tr>
<tr><td><b>TargetTiltAngle (C2) </b><ul><li> indicated desired angle (in degrees) of slats from fully up or left (-90) to fully open (0) to fully down or right (90) </li></ul></td><td align="center">int</td><td align="center">PW+PR+EV</td><td align="center">-90</td><td align="center">90</td><td align="center">0</td></tr>
</table></details>
## SmokeSensor (87)
<details><summary> Defines a Smoke Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>SmokeDetected (76) :small_blue_diamond:</b><ul><li> indicates if smoke is detected</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_DETECTED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DETECTED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Mute (11A) :small_blue_diamond:</b><ul><li> not used</li></ul></td><td align="center">bool</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>OFF&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ON&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>Volume (119) </b><ul><li> unused</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
</table></details>
## StatelessProgrammableSwitch (89)
<details><summary> Defines a "Stateless" Programmable Switch that can be used to trigger actions in the Home App.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>ProgrammableSwitchEvent (73) :small_blue_diamond:</b><ul><li> specifies type of button press</li></ul></td><td align="center">uint8</td><td align="center">PR+EV+NV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>SINGLE_PRESS&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DOUBLE_PRESS&nbsp(1)&nbsp;</b></li><li><b>LONG_PRESS&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>ServiceLabelIndex (CB) </b><ul><li> numerical index used to distinguish multiple copies of the same Service within an Accessory</li></ul></td><td align="center">uint8</td><td align="center">PR</td><td align="center">1</td><td align="center">255</td><td align="center">1</td></tr>
</table></details>
## Switch (49)
<details><summary> Defines a generic Switch.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>On (25) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">bool</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>OFF&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ON&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
</table></details>
## Television (D8)
<details><summary> Defines a TV. Optional Linked Services: <b>InputSource</b> and <b>TelevisionSpeaker</b>.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>Active (B0) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ACTIVE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>ConfiguredName (E3) </b><ul><li> a "configurable" Service name - any updates made from within the Home App trigger an update in HomeSpan and vice versa.</li></ul></td><td align="center">string</td><td align="center">PW+PR+EV</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>ActiveIdentifier (E7) </b><ul><li> numerical Identifier of the <b>InputSource</b> selected in the Home App.</li></ul></td><td align="center">uint32</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">255</td><td align="center">0</td></tr>
<tr><td><b>RemoteKey (E1) </b><ul><li> triggers an update when the corresponding key is pressed in the Remote Control widget on an iPhone </li></ul></td><td align="center">uint8</td><td align="center">PW</td><td align="center">4</td><td align="center">15</td><td><ul><li><b>UP&nbsp(4)&nbsp;</b></li><li><b>DOWN&nbsp(5)&nbsp;</b></li><li><b>LEFT&nbsp(6)&nbsp;</b></li><li><b>RIGHT&nbsp(7)&nbsp;</b></li><li><b>CENTER&nbsp(8)&nbsp;</b></li><li><b>BACK&nbsp(9)&nbsp;</b></li><li><b>PLAY_PAUSE&nbsp(11)&nbsp;</b></li><li><b>INFO&nbsp(15)&nbsp;</b></li></ul></td></tr>
<tr><td><b>PowerModeSelection (DF) </b><ul><li> when defined, creates a "View TV Settings" button in the Home App that triggers an update to this Characteristic when pressed </li></ul></td><td align="center">uint8</td><td align="center">PW</td><td align="center">0</td><td align="center">0</td><td><ul><li><b>VIEW_SETTINGS&nbsp(0)&nbsp;</b></li></ul></td></tr>
</table></details>
## TelevisionSpeaker (113)
<details><summary> Defines a Television Speaker that can be controlled via the Remote Control widget on an iPhone. Use <i>only</i> as a Linked Service for the <b>Television</b> Service.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>VolumeControlType (E9) :small_blue_diamond:</b><ul><li> indicates the type of volume control</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">3</td><td><ul><li><b>NONE&nbsp(0)&nbsp;</b></li><li><b>RELATIVE&nbsp(1)&nbsp;</b></li><li><b>RELATIVE_CURRENT&nbsp(2)&nbsp;</b></li><li><b>ABSOLUTE&nbsp(3)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>VolumeSelector (EA) :small_blue_diamond:</b><ul><li> triggered by presses to the iPhone's volume up/down buttons when TV is selected in the Remote Control widget</li></ul></td><td align="center">uint8</td><td align="center">PW</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>VOLUME_UP&nbsp(0)&nbsp;</b></li><li><b>VOLUME_DOWN&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## TemperatureSensor (8A)
<details><summary> Defines a Temperature Sensor.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CurrentTemperature (11) :small_blue_diamond:</b><ul><li> current temperature measured in Celsius</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>StatusActive (75) </b><ul><li> indicates whether the Service is properly functioning </li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_FUNCTIONING&nbsp(0)&nbsp;</b></li><li><b>FUNCTIONING&nbsp(1)&nbsp;</b>:heavy_check_mark:</li></ul></td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusTampered (7A) </b><ul><li> indicates whether the Service has been tampered with</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_TAMPERED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>TAMPERED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>StatusLowBattery (79) </b><ul><li> indicates state of battery</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_LOW_BATTERY&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>LOW_BATTERY&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## Thermostat (4A)
<details><summary> Defines a Thermostat used to control a furnace, air conditioner, or both.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CurrentHeatingCoolingState (F) :small_blue_diamond:</b><ul><li> indicates whether appliance is currently heating, cooling, or just idle</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">2</td><td><ul><li><b>IDLE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>HEATING&nbsp(1)&nbsp;</b></li><li><b>COOLING&nbsp(2)&nbsp;</b></li></ul></td></tr>
<tr><td><b>TargetHeatingCoolingState (33) :small_blue_diamond:</b><ul><li> indicates desired state of appliance</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">3</td><td><ul><li><b>OFF&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>HEAT&nbsp(1)&nbsp;</b></li><li><b>COOL&nbsp(2)&nbsp;</b></li><li><b>AUTO&nbsp(3)&nbsp;</b></li></ul></td></tr>
<tr><td><b>CurrentTemperature (11) :small_blue_diamond:</b><ul><li> current temperature measured in Celsius</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>TargetTemperature (35) :small_blue_diamond:</b><ul><li> indicates desired temperature measures in Celsius</li></ul></td><td align="center">float</td><td align="center">PW+PR+EV</td><td align="center">10</td><td align="center">38</td><td align="center">16</td></tr>
<tr><td><b>TemperatureDisplayUnits (36) :small_blue_diamond:</b><ul><li> indicates the desired units to display the temperature on the device itself (has no effect on Home App)</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>CELSIUS&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAHRENHEIT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>CoolingThresholdTemperature (D) </b><ul><li> cooling turns on when temperature (in Celsius) rises above this threshold</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">10</td><td align="center">35</td><td align="center">10</td></tr>
<tr><td><b>CurrentRelativeHumidity (10) </b><ul><li> current humidity measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>HeatingThresholdTemperature (12) </b><ul><li> heating turns on when temperature (in Celsius) falls below this threshold</li></ul></td><td align="center">float</td><td align="center">PR+PW+EV</td><td align="center">0</td><td align="center">25</td><td align="center">16</td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>TargetRelativeHumidity (34) </b><ul><li> indicates desired humidity measured as a percentage</li></ul></td><td align="center">float</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
</table></details>
## Valve (D0)
<details><summary> Defines an electronic Valve. Can be used standalone or as a Linked Service in conjunction with the <b>Faucet</b> and <b>IrrigationSystem</b> Services.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>Active (B0) :small_blue_diamond:</b><ul><li> indicates if the Service is active/on</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>INACTIVE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>ACTIVE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>InUse (D2) :small_blue_diamond:</b><ul><li> if Service is set to active, this indictes whether it is currently in use</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_IN_USE&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>IN_USE&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>ValveType (D5) :small_blue_diamond:</b><ul><li> indicates the type of valve</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">3</td><td><ul><li><b>GENERIC&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>IRRIGATION&nbsp(1)&nbsp;</b></li><li><b>SHOWER_HEAD&nbsp(2)&nbsp;</b></li><li><b>FAUCET&nbsp(3)&nbsp;</b></li></ul></td></tr>
<tr><td><b>SetDuration (D3) </b><ul><li> specifies the duration (in seconds) for a Service to remain on once activated</li></ul></td><td align="center">uint32</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">3600</td><td align="center">60</td></tr>
<tr><td><b>RemainingDuration (D4) </b><ul><li> duration (in seconds) remaining for Service to be active/on</li></ul></td><td align="center">uint32</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">3600</td><td align="center">60</td></tr>
<tr><td><b>IsConfigured (D6) </b><ul><li> indicates if a predefined Service has been configured</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_CONFIGURED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>CONFIGURED&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>ServiceLabelIndex (CB) </b><ul><li> numerical index used to distinguish multiple copies of the same Service within an Accessory</li></ul></td><td align="center">uint8</td><td align="center">PR</td><td align="center">1</td><td align="center">255</td><td align="center">1</td></tr>
<tr><td><b>StatusFault (77) </b><ul><li> indicates whether the Service has a fault</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NO_FAULT&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>FAULT&nbsp(1)&nbsp;</b></li></ul></td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
</table></details>
## Window (8B)
<details><summary> Defines a motorized Window.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>CurrentPosition (6D) :small_blue_diamond:</b><ul><li> current position (as a percentage) from fully closed (0) to full open (100)</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>TargetPosition (7C) :small_blue_diamond:</b><ul><li> indicates target position (as a percentage) from fully closed (0) to full open (100)</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>ObstructionDetected (24) </b><ul><li> indicates if obstruction is detected</li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_DETECTED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DETECTED&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
## WindowCovering (8C)
<details><summary> Defines a motorized Window Shade, Screen, Awning, etc.</summary><br><table>
<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>
<tr><td><b>TargetPosition (7C) :small_blue_diamond:</b><ul><li> indicates target position (as a percentage) from fully closed (0) to full open (100)</li></ul></td><td align="center">uint8</td><td align="center">PW+PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>CurrentPosition (6D) :small_blue_diamond:</b><ul><li> current position (as a percentage) from fully closed (0) to full open (100)</li></ul></td><td align="center">uint8</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">100</td><td align="center">0</td></tr>
<tr><td><b>Name (23) </b><ul><li> default name of a Service used <i>only</i> during initial pairing</li></ul></td><td align="center">string</td><td align="center">PR</td><td align="center">-</td><td align="center">-</td><td align="center">"unnamed"</td></tr>
<tr><td><b>CurrentHorizontalTiltAngle (6C) </b><ul><li> current angle (in degrees) of slats from fully up (-90) to fully open (0) to fully down (90) </li></ul></td><td align="center">int</td><td align="center">PR+EV</td><td align="center">-90</td><td align="center">90</td><td align="center">0</td></tr>
<tr><td><b>TargetHorizontalTiltAngle (7B) </b><ul><li> indicates desired angle (in degrees) of slats from fully up (-90) to fully open (0) to fully down (90)</li></ul></td><td align="center">int</td><td align="center">PW+PR+EV</td><td align="center">-90</td><td align="center">90</td><td align="center">0</td></tr>
<tr><td><b>CurrentVerticalTiltAngle (6E) </b><ul><li> current angle (in degrees) of slats from fully left (-90) to fully open (0) to fully right (90)</li></ul></td><td align="center">int</td><td align="center">PR+EV</td><td align="center">-90</td><td align="center">90</td><td align="center">0</td></tr>
<tr><td><b>TargetVerticalTiltAngle (7D) </b><ul><li> indicates desired angle (in degrees) of slats from fully left (-90) to fully open (0) to fully right (90)</li></ul></td><td align="center">int</td><td align="center">PW+PR+EV</td><td align="center">-90</td><td align="center">90</td><td align="center">0</td></tr>
<tr><td><b>ObstructionDetected (24) </b><ul><li> indicates if obstruction is detected</li></ul></td><td align="center">bool</td><td align="center">PR+EV</td><td align="center">0</td><td align="center">1</td><td><ul><li><b>NOT_DETECTED&nbsp(0)&nbsp;</b>:heavy_check_mark:</li><li><b>DETECTED&nbsp(1)&nbsp;</b></li></ul></td></tr>
</table></details>
--- ---
[↩️](../README.md) Back to the Welcome page [↩️](../README.md) Back to the Welcome page

View File

@ -1,97 +1,5 @@
#!/usr/bin/awk -f #!/bin/zsh
BEGIN {
ws="[ \t,();]+" # regexp of separators
ltws="^" ws "|" ws "$" # regexp of leading and trailing separators
nServs=0 # number of Services found
}
{
split($0,line,"//") # separate line into program and (optional) comment
gsub(ltws,"",line[1]) # strip out leading or trailing separators
gsub("[ \t]+","",line[1]) # strip out any other spaces
n=split(line[1],x,ws) # split program portion according to separators
if(x[1]=="CREATE_SERV"){
currentService=x[2]
services[nServs++]=currentService
uuid[currentService]=x[3]
desc[currentService]=line[2] # save optional comment as description of Service
nChars[currentService]=0
}
else if(x[1]=="REQ" || x[1]=="OPT"){
servChars[currentService,nChars[currentService]]=x[2]
servReq[currentService,nChars[currentService]]=(x[1]=="REQ")
nChars[currentService]++
}
else if(x[1]=="CREATE_CHAR"){
char=x[3]
default[char]=x[4]
min[char]=x[5]
max[char]=x[6]
nConstants[char]=n-6 # parse any pre-defined constants
value=0 # default starting value of constants
for(i=0;i<nConstants[char];i++){
v=split(x[i+7],y,"=") # split name of constant from (optional) value
constantName[char,i]=y[1]
if(v==2) # override value if provided
value=y[2]
constantValue[char,i]=value
if(index(perms[char],"PR") && x[4]==value)
defaultMark[char,i]=":heavy_check_mark:"
value++
}
notes[char]=line[2] # save optional comment as notes for Characteristic
}
else if(x[1]=="HAPCHAR"){
char=x[2]
uuid[char]=x[3]
perms[char]=x[4]
format[char]=tolower(x[5])
static[char]=x[6]
}
}
END {
for(i=0;i<nServs;i++){
s=services[i]
printf("## %s (%s)\n",s,uuid[s])
printf("<details><summary>%s</summary><br><table>\n",desc[s])
printf("<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>\n")
for(j=0;j<nChars[s];j++){
char=servChars[s,j]
printf("<tr>")
printf("<td><b>%s (%s) %s</b><ul><li>%s</li></ul></td>",char,uuid[char],servReq[s,j]?":small_blue_diamond:":"",notes[char])
printf("<td align=\"center\">%s</td>",format[char])
printf("<td align=\"center\">%s</td>",perms[char])
if(format[char]!="string")
printf("<td align=\"center\">%s</td><td align=\"center\">%s</td>",min[char],max[char])
else
printf("<td align=\"center\">-</td><td align=\"center\">-</td>")
if(nConstants[char]>0){
printf("<td><ul>")
for(k=0;k<nConstants[char];k++)
printf("<li><b>%s&nbsp(%d)&nbsp;</b>%s</li>",constantName[char,k],constantValue[char,k],defaultMark[char,k])
printf("</ul></td>")
} else {
printf("<td align=\"center\">%s</td>",default[char])
}
printf("</tr>\n")
}
printf("</table></details>\n\n")
}
}
grep -B 1000 "AUTOGENERATED_TEXT" ../docs/ServiceList.md > ServiceList.md
./makeServices ../src/Characteristics.h ../src/Span.h >> ServiceList.md
mv ServiceList.md ../docs/ServiceList.md

102
tools/makeServices Executable file
View File

@ -0,0 +1,102 @@
#!/usr/bin/awk -f
BEGIN {
ws="[ \t,();]+" # regexp of separators
ltws="^" ws "|" ws "$" # regexp of leading and trailing separators
nServs=0 # number of Services found
}
{
split($0,line,"//") # separate line into program and (optional) comment
gsub(ltws,"",line[1]) # strip out leading or trailing separators
gsub("[ \t]+","",line[1]) # strip out any other spaces
n=split(line[1],x,ws) # split program portion according to separators
if(x[1]=="CREATE_SERV"){
currentService=x[2]
services[nServs++]=currentService
uuid[currentService]=x[3]
desc[currentService]=line[2] # save optional comment as description of Service
nChars[currentService]=0
}
else if(x[1]=="REQ" || x[1]=="OPT"){
servChars[currentService,nChars[currentService]]=x[2]
servReq[currentService,nChars[currentService]]=(x[1]=="REQ")
nChars[currentService]++
}
else if(x[1]=="CREATE_CHAR"){
char=x[3]
default[char]=x[4]
min[char]=x[5]
max[char]=x[6]
nConstants[char]=n-6 # parse any pre-defined constants
value=0 # default starting value of constants
for(i=0;i<nConstants[char];i++){
v=split(x[i+7],y,"=") # split name of constant from (optional) value
constantName[char,i]=y[1]
if(v==2) # override value if provided
value=y[2]
constantValue[char,i]=value
if(index(perms[char],"PR") && x[4]==value)
defaultMark[char,i]=":heavy_check_mark:"
value++
}
notes[char]=line[2] # save optional comment as notes for Characteristic
}
else if(x[1]=="HAPCHAR"){
char=x[2]
uuid[char]=x[3]
perms[char]=x[4]
format[char]=tolower(x[5])
static[char]=x[6]
}
}
END {
printf("\n\n");
for(i=0;i<nServs;i++){
s=services[i]
printf("## %s (%s)\n",s,uuid[s])
printf("<details><summary>%s</summary><br><table>\n",desc[s])
printf("<tr><th>Characteristic</th><th>Format</th><th>Perms</th><th>Min</th><th>Max</th><th>Constants/Defaults</th></tr>\n")
for(j=0;j<nChars[s];j++){
char=servChars[s,j]
printf("<tr>")
printf("<td><b>%s (%s) %s</b><ul><li>%s</li></ul></td>",char,uuid[char],servReq[s,j]?":small_blue_diamond:":"",notes[char])
printf("<td align=\"center\">%s</td>",format[char])
printf("<td align=\"center\">%s</td>",perms[char])
if(format[char]!="string")
printf("<td align=\"center\">%s</td><td align=\"center\">%s</td>",min[char],max[char])
else
printf("<td align=\"center\">-</td><td align=\"center\">-</td>")
if(nConstants[char]>0){
printf("<td><ul>")
for(k=0;k<nConstants[char];k++)
printf("<li><b>%s&nbsp(%d)&nbsp;</b>%s</li>",constantName[char,k],constantValue[char,k],defaultMark[char,k])
printf("</ul></td>")
} else {
printf("<td align=\"center\">%s</td>",default[char])
}
printf("</tr>\n")
}
printf("</table></details>\n\n")
}
printf("---\n\n")
printf("[↩️](../README.md) Back to the Welcome page\n\n")
}