@switchbot/homebridge-switchbot 4.3.2-beta.9 → 4.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/.github/copilot-instructions.md +328 -0
  2. package/.github/scripts/npm-version-script-esm-auto.js +207 -0
  3. package/.github/workflows/beta-release.yml +8 -12
  4. package/.github/workflows/release.yml +54 -22
  5. package/CHANGELOG.md +11 -1
  6. package/README.md +13 -10
  7. package/config.schema.json +248 -5
  8. package/coverage/base.css +224 -0
  9. package/coverage/block-navigation.js +87 -0
  10. package/coverage/clover.xml +15847 -0
  11. package/coverage/coverage-final.json +42 -0
  12. package/coverage/docs/assets/dmt/dmt-component-data.js.html +85 -0
  13. package/coverage/docs/assets/dmt/dmt-components.js.html +286 -0
  14. package/coverage/docs/assets/dmt/index.html +131 -0
  15. package/coverage/docs/assets/hierarchy.js.html +85 -0
  16. package/coverage/docs/assets/icons.js.html +136 -0
  17. package/coverage/docs/assets/index.html +146 -0
  18. package/coverage/docs/assets/main.js.html +265 -0
  19. package/coverage/favicon.png +0 -0
  20. package/coverage/index.html +191 -0
  21. package/coverage/prettify.css +1 -0
  22. package/coverage/prettify.js +2 -0
  23. package/coverage/sort-arrow-sprite.png +0 -0
  24. package/coverage/sorter.js +196 -0
  25. package/coverage/src/device/blindtilt.ts.html +3238 -0
  26. package/coverage/src/device/bot.ts.html +2803 -0
  27. package/coverage/src/device/ceilinglight.ts.html +2338 -0
  28. package/coverage/src/device/colorbulb.ts.html +2824 -0
  29. package/coverage/src/device/contact.ts.html +1465 -0
  30. package/coverage/src/device/curtain.ts.html +2869 -0
  31. package/coverage/src/device/device.ts.html +2500 -0
  32. package/coverage/src/device/fan.ts.html +2242 -0
  33. package/coverage/src/device/hub.ts.html +1408 -0
  34. package/coverage/src/device/humidifier.ts.html +2116 -0
  35. package/coverage/src/device/index.html +416 -0
  36. package/coverage/src/device/iosensor.ts.html +1375 -0
  37. package/coverage/src/device/lightstrip.ts.html +2617 -0
  38. package/coverage/src/device/lock.ts.html +1963 -0
  39. package/coverage/src/device/meter.ts.html +1372 -0
  40. package/coverage/src/device/meterplus.ts.html +1384 -0
  41. package/coverage/src/device/meterpro.ts.html +1618 -0
  42. package/coverage/src/device/motion.ts.html +1264 -0
  43. package/coverage/src/device/plug.ts.html +1372 -0
  44. package/coverage/src/device/relayswitch.ts.html +2284 -0
  45. package/coverage/src/device/robotvacuumcleaner.ts.html +1810 -0
  46. package/coverage/src/device/waterdetector.ts.html +1294 -0
  47. package/coverage/src/homebridge-ui/index.html +116 -0
  48. package/coverage/src/homebridge-ui/server.ts.html +229 -0
  49. package/coverage/src/index.html +161 -0
  50. package/coverage/src/index.ts.html +124 -0
  51. package/coverage/src/irdevice/airconditioner.ts.html +1687 -0
  52. package/coverage/src/irdevice/airpurifier.ts.html +844 -0
  53. package/coverage/src/irdevice/camera.ts.html +475 -0
  54. package/coverage/src/irdevice/fan.ts.html +766 -0
  55. package/coverage/src/irdevice/index.html +251 -0
  56. package/coverage/src/irdevice/irdevice.ts.html +1117 -0
  57. package/coverage/src/irdevice/light.ts.html +826 -0
  58. package/coverage/src/irdevice/other.ts.html +2458 -0
  59. package/coverage/src/irdevice/tv.ts.html +1222 -0
  60. package/coverage/src/irdevice/vacuumcleaner.ts.html +466 -0
  61. package/coverage/src/irdevice/waterheater.ts.html +469 -0
  62. package/coverage/src/platform.ts.html +8776 -0
  63. package/coverage/src/settings.ts.html +934 -0
  64. package/coverage/src/utils.ts.html +2092 -0
  65. package/dist/device/blindtilt.d.ts.map +1 -1
  66. package/dist/device/blindtilt.js +12 -4
  67. package/dist/device/blindtilt.js.map +1 -1
  68. package/dist/device/bot.d.ts.map +1 -1
  69. package/dist/device/bot.js +12 -4
  70. package/dist/device/bot.js.map +1 -1
  71. package/dist/device/ceilinglight.d.ts.map +1 -1
  72. package/dist/device/ceilinglight.js +18 -7
  73. package/dist/device/ceilinglight.js.map +1 -1
  74. package/dist/device/colorbulb.d.ts.map +1 -1
  75. package/dist/device/colorbulb.js +18 -7
  76. package/dist/device/colorbulb.js.map +1 -1
  77. package/dist/device/contact.d.ts.map +1 -1
  78. package/dist/device/contact.js +6 -2
  79. package/dist/device/contact.js.map +1 -1
  80. package/dist/device/curtain.d.ts.map +1 -1
  81. package/dist/device/curtain.js +12 -4
  82. package/dist/device/curtain.js.map +1 -1
  83. package/dist/device/device.d.ts +5 -7
  84. package/dist/device/device.d.ts.map +1 -1
  85. package/dist/device/device.js +11 -5
  86. package/dist/device/device.js.map +1 -1
  87. package/dist/device/fan.d.ts.map +1 -1
  88. package/dist/device/fan.js +16 -6
  89. package/dist/device/fan.js.map +1 -1
  90. package/dist/device/hub.d.ts +2 -2
  91. package/dist/device/hub.d.ts.map +1 -1
  92. package/dist/device/hub.js +8 -3
  93. package/dist/device/hub.js.map +1 -1
  94. package/dist/device/humidifier.d.ts.map +1 -1
  95. package/dist/device/humidifier.js +16 -6
  96. package/dist/device/humidifier.js.map +1 -1
  97. package/dist/device/iosensor.d.ts.map +1 -1
  98. package/dist/device/iosensor.js +6 -2
  99. package/dist/device/iosensor.js.map +1 -1
  100. package/dist/device/lightstrip.d.ts.map +1 -1
  101. package/dist/device/lightstrip.js +16 -6
  102. package/dist/device/lightstrip.js.map +1 -1
  103. package/dist/device/lock.d.ts.map +1 -1
  104. package/dist/device/lock.js +12 -4
  105. package/dist/device/lock.js.map +1 -1
  106. package/dist/device/meter.d.ts.map +1 -1
  107. package/dist/device/meter.js +6 -2
  108. package/dist/device/meter.js.map +1 -1
  109. package/dist/device/meterplus.d.ts.map +1 -1
  110. package/dist/device/meterplus.js +6 -2
  111. package/dist/device/meterplus.js.map +1 -1
  112. package/dist/device/meterpro.d.ts.map +1 -1
  113. package/dist/device/meterpro.js +7 -4
  114. package/dist/device/meterpro.js.map +1 -1
  115. package/dist/device/motion.d.ts.map +1 -1
  116. package/dist/device/motion.js +6 -2
  117. package/dist/device/motion.js.map +1 -1
  118. package/dist/device/plug.d.ts.map +1 -1
  119. package/dist/device/plug.js +12 -4
  120. package/dist/device/plug.js.map +1 -1
  121. package/dist/device/presence.d.ts +42 -0
  122. package/dist/device/presence.d.ts.map +1 -0
  123. package/dist/device/presence.js +349 -0
  124. package/dist/device/presence.js.map +1 -0
  125. package/dist/device/relayswitch.d.ts.map +1 -1
  126. package/dist/device/relayswitch.js +12 -4
  127. package/dist/device/relayswitch.js.map +1 -1
  128. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  129. package/dist/device/robotvacuumcleaner.js +14 -5
  130. package/dist/device/robotvacuumcleaner.js.map +1 -1
  131. package/dist/device/waterdetector.d.ts.map +1 -1
  132. package/dist/device/waterdetector.js +6 -2
  133. package/dist/device/waterdetector.js.map +1 -1
  134. package/dist/homebridge-ui/public/index.html +1 -1
  135. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  136. package/dist/irdevice/airconditioner.js +2 -1
  137. package/dist/irdevice/airconditioner.js.map +1 -1
  138. package/dist/irdevice/airpurifier.d.ts +1 -1
  139. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  140. package/dist/irdevice/airpurifier.js +6 -5
  141. package/dist/irdevice/airpurifier.js.map +1 -1
  142. package/dist/irdevice/camera.d.ts.map +1 -1
  143. package/dist/irdevice/camera.js +2 -1
  144. package/dist/irdevice/camera.js.map +1 -1
  145. package/dist/irdevice/fan.d.ts.map +1 -1
  146. package/dist/irdevice/fan.js +2 -1
  147. package/dist/irdevice/fan.js.map +1 -1
  148. package/dist/irdevice/irdevice.d.ts +2 -6
  149. package/dist/irdevice/irdevice.d.ts.map +1 -1
  150. package/dist/irdevice/irdevice.js.map +1 -1
  151. package/dist/irdevice/light.d.ts.map +1 -1
  152. package/dist/irdevice/light.js +2 -1
  153. package/dist/irdevice/light.js.map +1 -1
  154. package/dist/irdevice/other.d.ts.map +1 -1
  155. package/dist/irdevice/other.js +2 -1
  156. package/dist/irdevice/other.js.map +1 -1
  157. package/dist/irdevice/tv.d.ts.map +1 -1
  158. package/dist/irdevice/tv.js +2 -1
  159. package/dist/irdevice/tv.js.map +1 -1
  160. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  161. package/dist/irdevice/vacuumcleaner.js +2 -1
  162. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  163. package/dist/irdevice/waterheater.d.ts.map +1 -1
  164. package/dist/irdevice/waterheater.js +2 -1
  165. package/dist/irdevice/waterheater.js.map +1 -1
  166. package/dist/platform.d.ts +2 -2
  167. package/dist/platform.d.ts.map +1 -1
  168. package/dist/platform.js +77 -78
  169. package/dist/platform.js.map +1 -1
  170. package/dist/settings.d.ts +6 -0
  171. package/dist/settings.d.ts.map +1 -1
  172. package/dist/settings.js +1 -0
  173. package/dist/settings.js.map +1 -1
  174. package/docs/index.html +20 -11
  175. package/docs/variables/default.html +1 -1
  176. package/eslint.config.js +0 -1
  177. package/package.json +9 -10
  178. package/src/device/blindtilt.ts +10 -4
  179. package/src/device/bot.ts +10 -4
  180. package/src/device/ceilinglight.ts +16 -7
  181. package/src/device/colorbulb.ts +16 -7
  182. package/src/device/contact.ts +5 -2
  183. package/src/device/curtain.ts +12 -6
  184. package/src/device/device.ts +14 -8
  185. package/src/device/fan.ts +14 -6
  186. package/src/device/hub.ts +10 -6
  187. package/src/device/humidifier.ts +14 -6
  188. package/src/device/iosensor.ts +5 -2
  189. package/src/device/lightstrip.ts +14 -6
  190. package/src/device/lock.ts +10 -4
  191. package/src/device/meter.ts +6 -3
  192. package/src/device/meterplus.ts +5 -2
  193. package/src/device/meterpro.ts +7 -5
  194. package/src/device/motion.ts +5 -2
  195. package/src/device/plug.ts +10 -4
  196. package/src/device/presence.ts +393 -0
  197. package/src/device/relayswitch.ts +10 -4
  198. package/src/device/robotvacuumcleaner.ts +12 -5
  199. package/src/device/waterdetector.ts +5 -2
  200. package/src/homebridge-ui/public/index.html +1 -1
  201. package/src/irdevice/airconditioner.ts +2 -1
  202. package/src/irdevice/airpurifier.ts +6 -5
  203. package/src/irdevice/camera.ts +2 -1
  204. package/src/irdevice/fan.ts +2 -1
  205. package/src/irdevice/irdevice.ts +2 -2
  206. package/src/irdevice/light.ts +2 -1
  207. package/src/irdevice/other.ts +2 -1
  208. package/src/irdevice/tv.ts +2 -1
  209. package/src/irdevice/vacuumcleaner.ts +2 -1
  210. package/src/irdevice/waterheater.ts +2 -1
  211. package/src/platform.ts +80 -88
  212. package/src/settings.ts +7 -0
  213. package/.github/npm-version-script-esm.js +0 -97
  214. package/.github/workflows/build.yml +0 -18
  215. package/.github/workflows/changerelease.yml +0 -11
  216. package/.github/workflows/labeler.yml +0 -16
  217. package/.github/workflows/release-drafter.yml +0 -14
  218. package/dist/device/airpurifier.d.ts +0 -54
  219. package/dist/device/airpurifier.d.ts.map +0 -1
  220. package/dist/device/airpurifier.js +0 -527
  221. package/dist/device/airpurifier.js.map +0 -1
  222. package/src/device/airpurifier.ts +0 -563
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. This project uses [Semantic Versioning](https://semver.org/)
4
4
 
5
+ ## [4.3.2](https://github.com/OpenWonderLabs/homebridge-switchbot/releases/tag/v4.3.2) (2025-12-17)
6
+
7
+ ## What's Changed
8
+ * Add Presence Sensor Support by @Donavan Becker in https://github.com/OpenWonderLabs/homebridge-switchbot/commit/169d0b2
9
+ * Add proper SwitchBot Hub 3 support with latest node-switchbot dependency by @Copilot in https://github.com/OpenWonderLabs/homebridge-switchbot/pull/1264
10
+ * Fix error logging by @Dave Nicolson in https://github.com/OpenWonderLabs/homebridge-switchbot/pull/1266
11
+ * Add comprehensive GitHub Copilot instructions for homebridge-switchbot development by @Copilot in https://github.com/OpenWonderLabs/homebridge-switchbot/pull/1262
12
+
13
+ **Full Changelog**: https://github.com/OpenWonderLabs/homebridge-switchbot/compare/v4.3.1...v4.3.2
14
+
5
15
  ## [4.3.1](https://github.com/OpenWonderLabs/homebridge-switchbot/releases/tag/v4.3.1) (2025-03-04)
6
16
 
7
17
  # *No New Releases During Lent*
@@ -94,7 +104,7 @@ All notable changes to this project will be documented in this file. This projec
94
104
  ## [4.1.0](https://github.com/OpenWonderLabs/homebridge-switchbot/releases/tag/v4.1.0) (2024-10-21)
95
105
 
96
106
  ### What's Changed
97
- - Add `MeterPro` deviceType Support
107
+ - Add `Meter Pro` deviceType Support
98
108
  - Fix `node-switchbot` noble issue.
99
109
  - Housekeeping and updated dependencies.
100
110
 
package/README.md CHANGED
@@ -94,7 +94,7 @@
94
94
  - [SwitchBot Indoor/Outdoor Thermo-Hygrometer](https://www.switch-bot.com/products/switchbot-indoor-outdoor-thermo-hygrometer)
95
95
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
96
96
  - If using OpenAPI:
97
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
97
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
98
98
  - Enable Cloud Services for Device on SwitchBot App
99
99
  - If using Bluetooth Low Energy (BLE) only:
100
100
  - Must supply `deviceId` & `deviceName` to Device Config
@@ -102,7 +102,7 @@
102
102
  - [SwitchBot Motion Sensor](https://www.switch-bot.com/products/motion-sensor)
103
103
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
104
104
  - If using OpenAPI:
105
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
105
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
106
106
  - Enable Cloud Services for Device on SwitchBot App
107
107
  - If using Bluetooth Low Energy (BLE) only:
108
108
  - Must supply `deviceId` & `deviceName` to Device Config
@@ -110,7 +110,7 @@
110
110
  - [SwitchBot Contact Sensor](https://www.switch-bot.com/products/contact-sensor)
111
111
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
112
112
  - If using OpenAPI:
113
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
113
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
114
114
  - Enable Cloud Services for Device on SwitchBot App
115
115
  - If using Bluetooth Low Energy (BLE) only:
116
116
  - Must supply `deviceId` & `deviceName` to Device Config
@@ -119,7 +119,7 @@
119
119
  - [SwitchBot Curtain 3](https://www.switch-bot.com/products/switchbot-curtain-3)
120
120
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
121
121
  - If using OpenAPI:
122
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
122
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
123
123
  - Enable Cloud Services for Device on SwitchBot App
124
124
  - If using Bluetooth Low Energy (BLE) only:
125
125
  - Must supply `deviceId` & `deviceName` to Device Config
@@ -127,7 +127,7 @@
127
127
  - [SwitchBot Blind Tilt](https://us.switch-bot.com/products/switchbot-blind-tilt)
128
128
  - Supports OpenAPI & partial Bluetooth Low Energy (BLE) Connections
129
129
  - If using OpenAPI:
130
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
130
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
131
131
  - Enable Cloud Services for Device on SwitchBot App
132
132
  - [SwitchBot Bulb](https://www.switch-bot.com/products/switchbot-color-bulb)
133
133
  - [SwitchBot Ceiling Light](https://www.switchbot.jp/collections/all/products/switchbot-ceiling-light)
@@ -135,13 +135,13 @@
135
135
  - [SwitchBot Light Strip](https://www.switch-bot.com/products/switchbot-light-strip)
136
136
  - Supports OpenAPI & partial Bluetooth Low Energy (BLE) Connections
137
137
  - If using OpenAPI:
138
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
138
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
139
139
  - Enable Cloud Services for Device on SwitchBot App
140
140
  - [SwitchBot Lock](https://us.switch-bot.com/products/switchbot-lock)
141
141
  - [SwitchBot Lock Pro](https://www.switchbot.jp/products/switchbot-lock-pro)
142
142
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
143
143
  - If using OpenAPI:
144
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
144
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
145
145
  - Enable Cloud Services for Device on SwitchBot App
146
146
  - US: [SwitchBot Mini Robot Vacuum K10+](https://www.switch-bot.com/products/switchbot-mini-robot-vacuum-k10)
147
147
  - US: [SwitchBot Floor Cleaning Robot S10](https://www.switch-bot.com/products/switchbot-floor-cleaning-robot-s10)
@@ -153,12 +153,12 @@
153
153
  - [SwitchBot Plug Mini (JP)](https://www.switchbot.jp/products/switchbot-plug-mini)
154
154
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
155
155
  - If using OpenAPI:
156
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
156
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
157
157
  - Enable Cloud Services for Device on SwitchBot App
158
158
  - [SwitchBot Bot](https://www.switch-bot.com/products/switchbot-bot)
159
159
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
160
160
  - If using OpenAPI:
161
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
161
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
162
162
  - Enable Cloud Services for Device on SwitchBot App
163
163
  - You must set your Bot's Device ID for either Press Mode or Switch Mode in Plugin Config (SwitchBot Device Settings > Bot Settings)
164
164
  - Press Mode - Turns on then instantly turn it off
@@ -171,6 +171,9 @@
171
171
  - [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2)
172
172
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
173
173
  - Enables Humidity, Temperature, and Light Sensor
174
+ - [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3)
175
+ - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
176
+ - Enables Humidity, Temperature, and Light Sensor
174
177
  - [SwitchBot Battery Circulator Fan](https://us.switch-bot.com/products/switchbot-battery-circulator-fan)
175
178
  - Supports OpenAPI Connection Only
176
179
  - [SwitchBot Water Leak Detector](https://us.switch-bot.com/products/switchbot-water-leak-detector)
@@ -178,7 +181,7 @@
178
181
 
179
182
  ## Supported IR Devices
180
183
 
181
- ### _(All IR Devices require [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) or [Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini))_
184
+ ### _(All IR Devices require [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3), or [Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini))_
182
185
 
183
186
  - TV
184
187
  - Allows for On/Off and Volume Controls
@@ -246,6 +246,12 @@
246
246
  "Motion Sensor"
247
247
  ]
248
248
  },
249
+ {
250
+ "title": "Presence Sensor",
251
+ "enum": [
252
+ "Presence Sensor"
253
+ ]
254
+ },
249
255
  {
250
256
  "title": "Plug",
251
257
  "enum": [
@@ -606,7 +612,7 @@
606
612
  "title": "Hide Light Sensor",
607
613
  "type": "boolean",
608
614
  "condition": {
609
- "functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && (model.options.devices[arrayIndices].configDeviceType === 'Hub 2' || model.options.devices[arrayIndices].configDeviceType === 'Contact Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Motion Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Blind Tilt' || model.options.devices[arrayIndices].configDeviceType === 'Curtain' || model.options.devices[arrayIndices].configDeviceType === 'Curtain3' || model.options.devices[arrayIndices].configDeviceType === 'WoRollerShade' || model.options.devices[arrayIndices].configDeviceType === 'Roller Shade') && model.options.devices[arrayIndices].deviceId);"
615
+ "functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && (model.options.devices[arrayIndices].configDeviceType === 'Hub 2' || model.options.devices[arrayIndices].configDeviceType === 'Contact Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Motion Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Presence Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Blind Tilt' || model.options.devices[arrayIndices].configDeviceType === 'Curtain' || model.options.devices[arrayIndices].configDeviceType === 'Curtain3' || model.options.devices[arrayIndices].configDeviceType === 'WoRollerShade' || model.options.devices[arrayIndices].configDeviceType === 'Roller Shade') && model.options.devices[arrayIndices].deviceId);"
610
616
  }
611
617
  },
612
618
  "hide_motionsensor": {
@@ -700,7 +706,7 @@
700
706
  "type": "number",
701
707
  "placeholder": "1",
702
708
  "condition": {
703
- "functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && (model.options.devices[arrayIndices].configDeviceType === 'Hub 2' || model.options.devices[arrayIndices].configDeviceType === 'Contact Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Motion Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Blind Tilt' || model.options.devices[arrayIndices].configDeviceType === 'Curtain' || model.options.devices[arrayIndices].configDeviceType === 'Curtain3' || model.options.devices[arrayIndices].configDeviceType === 'WoRollerShade' || model.options.devices[arrayIndices].configDeviceType === 'Roller Shade') && model.options.devices[arrayIndices].deviceId && !model.options.devices[arrayIndices].hide_lightsensor);"
709
+ "functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && (model.options.devices[arrayIndices].configDeviceType === 'Hub 2' || model.options.devices[arrayIndices].configDeviceType === 'Contact Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Motion Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Presence Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Blind Tilt' || model.options.devices[arrayIndices].configDeviceType === 'Curtain' || model.options.devices[arrayIndices].configDeviceType === 'Curtain3' || model.options.devices[arrayIndices].configDeviceType === 'WoRollerShade' || model.options.devices[arrayIndices].configDeviceType === 'Roller Shade') && model.options.devices[arrayIndices].deviceId && !model.options.devices[arrayIndices].hide_lightsensor);"
704
710
  }
705
711
  },
706
712
  "set_maxlux": {
@@ -708,7 +714,7 @@
708
714
  "type": "number",
709
715
  "placeholder": "6001",
710
716
  "condition": {
711
- "functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && (model.options.devices[arrayIndices].configDeviceType === 'Hub 2' || model.options.devices[arrayIndices].configDeviceType === 'Contact Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Motion Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Blind Tilt' || model.options.devices[arrayIndices].configDeviceType === 'Curtain' || model.options.devices[arrayIndices].configDeviceType === 'Curtain3' || model.options.devices[arrayIndices].configDeviceType === 'WoRollerShade' || model.options.devices[arrayIndices].configDeviceType === 'Roller Shade') && model.options.devices[arrayIndices].deviceId && !model.options.devices[arrayIndices].hide_lightsensor);"
717
+ "functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && (model.options.devices[arrayIndices].configDeviceType === 'Hub 2' || model.options.devices[arrayIndices].configDeviceType === 'Contact Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Motion Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Presence Sensor' || model.options.devices[arrayIndices].configDeviceType === 'Blind Tilt' || model.options.devices[arrayIndices].configDeviceType === 'Curtain' || model.options.devices[arrayIndices].configDeviceType === 'Curtain3' || model.options.devices[arrayIndices].configDeviceType === 'WoRollerShade' || model.options.devices[arrayIndices].configDeviceType === 'Roller Shade') && model.options.devices[arrayIndices].deviceId && !model.options.devices[arrayIndices].hide_lightsensor);"
712
718
  }
713
719
  },
714
720
  "setOpenMode": {
@@ -838,7 +844,7 @@
838
844
  "logging": {
839
845
  "title": "Device Logging Override Setting",
840
846
  "type": "string",
841
- "default": "",
847
+ "default": "standard",
842
848
  "condition": {
843
849
  "functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].deviceId && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].configDeviceType);"
844
850
  },
@@ -3940,6 +3946,215 @@
3940
3946
  }
3941
3947
  }
3942
3948
  },
3949
+ "Presence Sensor": {
3950
+ "type": "object",
3951
+ "properties": {
3952
+ "hide_device": {
3953
+ "title": "Hide All Presence Sensors",
3954
+ "type": "boolean",
3955
+ "description": "If true, device will be removed or hidden from HomeKit."
3956
+ },
3957
+ "hide_lightsensor": {
3958
+ "title": "Hide Light Sensor",
3959
+ "type": "boolean",
3960
+ "condition": {
3961
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Motion Sensor'].hide_device);"
3962
+ }
3963
+ },
3964
+ "set_minlux": {
3965
+ "title": "Set Min Lux",
3966
+ "type": "number",
3967
+ "placeholder": "1",
3968
+ "condition": {
3969
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Motion Sensor'].hide_device);"
3970
+ }
3971
+ },
3972
+ "set_maxlux": {
3973
+ "title": "Set Max Lux",
3974
+ "type": "number",
3975
+ "placeholder": "6001",
3976
+ "condition": {
3977
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Motion Sensor'].hide_device);"
3978
+ }
3979
+ },
3980
+ "connectionType": {
3981
+ "title": "Connection Type",
3982
+ "type": "string",
3983
+ "description": "Bluetooth (BLE) API is only available on certain Device Types, see the Wiki for more information.",
3984
+ "condition": {
3985
+ "functionBody": "return (model.options && model.options.deviceConfig && model.options.deviceConfig['Water Detector'] && !model.options.deviceConfig['Water Detector'].hide_device);"
3986
+ },
3987
+ "oneOf": [
3988
+ {
3989
+ "title": "BLE",
3990
+ "enum": [
3991
+ "BLE"
3992
+ ]
3993
+ },
3994
+ {
3995
+ "title": "BLE/OpenAPI",
3996
+ "enum": [
3997
+ "BLE/OpenAPI"
3998
+ ]
3999
+ },
4000
+ {
4001
+ "title": "Disable",
4002
+ "enum": [
4003
+ "Disabled"
4004
+ ]
4005
+ },
4006
+ {
4007
+ "title": "OpenAPI",
4008
+ "enum": [
4009
+ "OpenAPI"
4010
+ ]
4011
+ }
4012
+ ]
4013
+ },
4014
+ "disablePlatformBLE": {
4015
+ "title": "Disable Platform BLE",
4016
+ "type": "boolean",
4017
+ "condition": {
4018
+ "functionBody": "return (model.options && model.options.deviceConfig && model.options.deviceConfig['Motion Sensor'] && !model.options.deviceConfig['Motion Sensor'].hide_device && model.options.deviceConfig['Motion Sensor'].connectionType !== 'Disabled');"
4019
+ }
4020
+ },
4021
+ "scanDuration": {
4022
+ "title": "Scan Duration (Default is 1 Second) for BLE",
4023
+ "type": "number",
4024
+ "placeholder": 1,
4025
+ "condition": {
4026
+ "functionBody": "return (model.options && model.options.deviceConfig && model.options.deviceConfig['Water Detector'] && !model.options.deviceConfig['Water Detector'].hide_device && (model.options.deviceConfig['Water Detector'].connectionType === 'BLE' || model.options.deviceConfig['Water Detector'].connectionType === 'BLE/OpenAPI'));"
4027
+ }
4028
+ },
4029
+ "webhook": {
4030
+ "title": "Enable Webhook for all Presence Sensors",
4031
+ "type": "boolean",
4032
+ "condition": {
4033
+ "functionBody": "return (model.options && model.options.deviceConfig && model.options.deviceConfig['Water Detector'] && !model.options.deviceConfig['Water Detector'].hide_device && (model.options.deviceConfig['Water Detector'].connectionType === 'OpenAPI' || model.options.deviceConfig['Water Detector'].connectionType === 'BLE/OpenAPI'));"
4034
+ }
4035
+ },
4036
+ "external": {
4037
+ "title": "External Accessory",
4038
+ "type": "boolean",
4039
+ "condition": {
4040
+ "functionBody": "return (model.options && model.options.deviceConfig && model.options.deviceConfig['Water Detector'] && !model.options.deviceConfig['Water Detector'].hide_device);"
4041
+ }
4042
+ },
4043
+ "maxRetry": {
4044
+ "title": "Max Retries for BLE",
4045
+ "type": "number",
4046
+ "placeholder": "5",
4047
+ "condition": {
4048
+ "functionBody": "return (model.options && model.options.deviceConfig && model.options.deviceConfig['Water Detector'] && !model.options.deviceConfig['Water Detector'].hide_device && (model.options.deviceConfig['Water Detector'].connectionType === 'BLE' || model.options.deviceConfig['Water Detector'].connectionType === 'BLE/OpenAPI'));"
4049
+ }
4050
+ },
4051
+ "maxRetries": {
4052
+ "title": "Device Max Retries for OpenAPI",
4053
+ "type": "number",
4054
+ "placeholder": 5,
4055
+ "condition": {
4056
+ "functionBody": "return (model.options && model.options.deviceConfig && model.options.deviceConfig['Water Detector'] && !model.options.deviceConfig['Water Detector'].hide_device && (model.options.deviceConfig['Water Detector'].connectionType === 'OpenAPI' || model.options.deviceConfig['Water Detector'].connectionType === 'BLE/OpenAPI'));"
4057
+ }
4058
+ },
4059
+ "delayBetweenRetries": {
4060
+ "title": "Device Delay Between Retries for OpenAPI (In Seconds)",
4061
+ "type": "number",
4062
+ "placeholder": 3,
4063
+ "condition": {
4064
+ "functionBody": "return (model.options && model.options.deviceConfig && model.options.deviceConfig['Water Detector'] && !model.options.deviceConfig['Water Detector'].hide_device && (model.options.deviceConfig['Water Detector'].connectionType === 'OpenAPI' || model.options.deviceConfig['Water Detector'].connectionType === 'BLE/OpenAPI'));"
4065
+ }
4066
+ },
4067
+ "disableCaching": {
4068
+ "title": "Disable Caching",
4069
+ "type": "boolean",
4070
+ "condition": {
4071
+ "functionBody": "return (model.options && model.options.deviceConfig && model.options.deviceConfig['Water Detector'] && !model.options.deviceConfig['Water Detector'].hide_device);"
4072
+ }
4073
+ },
4074
+ "offline": {
4075
+ "title": "Offline as Off",
4076
+ "type": "boolean",
4077
+ "condition": {
4078
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Water Detector'].hide_device);"
4079
+ }
4080
+ },
4081
+ "history": {
4082
+ "title": "EVE History",
4083
+ "type": "boolean",
4084
+ "condition": {
4085
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Water Detector'].hide_device);"
4086
+ }
4087
+ },
4088
+ "firmware": {
4089
+ "title": "Firmware Override",
4090
+ "type": "string",
4091
+ "placeholder": "1.2.8",
4092
+ "condition": {
4093
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Water Detector'].hide_device);"
4094
+ }
4095
+ },
4096
+ "logging": {
4097
+ "title": "Logging by Device Type",
4098
+ "type": "string",
4099
+ "default": "",
4100
+ "condition": {
4101
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Water Detector'].hide_device);"
4102
+ },
4103
+ "oneOf": [
4104
+ {
4105
+ "title": "Debug Logging",
4106
+ "enum": [
4107
+ "debug"
4108
+ ]
4109
+ },
4110
+ {
4111
+ "title": "Default Logging",
4112
+ "enum": [
4113
+ ""
4114
+ ]
4115
+ },
4116
+ {
4117
+ "title": "No Logging",
4118
+ "enum": [
4119
+ "none"
4120
+ ]
4121
+ },
4122
+ {
4123
+ "title": "Standard Logging",
4124
+ "enum": [
4125
+ "standard"
4126
+ ]
4127
+ }
4128
+ ]
4129
+ },
4130
+ "refreshRate": {
4131
+ "title": "Device Refresh Rate",
4132
+ "type": "number",
4133
+ "placeholder": 5,
4134
+ "condition": {
4135
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Water Detector'].hide_device);"
4136
+ }
4137
+ },
4138
+ "updateRate": {
4139
+ "title": "Update Rate",
4140
+ "type": "number",
4141
+ "minimum": 1,
4142
+ "placeholder": 5,
4143
+ "description": "Indicates the number of seconds before refreshing status while updating progress.",
4144
+ "condition": {
4145
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Water Detector'].hide_device);"
4146
+ }
4147
+ },
4148
+ "pushRate": {
4149
+ "title": "Device Push Rate",
4150
+ "type": "number",
4151
+ "placeholder": 360,
4152
+ "condition": {
4153
+ "functionBody": "return (model.options && model.options.deviceConfig && !model.options.deviceConfig['Water Detector'].hide_device);"
4154
+ }
4155
+ }
4156
+ }
4157
+ },
3943
4158
  "Contact Sensor": {
3944
4159
  "type": "object",
3945
4160
  "properties": {
@@ -9358,7 +9573,7 @@
9358
9573
  {
9359
9574
  "title": "Meter Pro",
9360
9575
  "enum": [
9361
- "MeterPro"
9576
+ "Meter Pro"
9362
9577
  ]
9363
9578
  },
9364
9579
  {
@@ -13566,6 +13781,34 @@
13566
13781
  "options.deviceConfig['Motion Sensor'].pushRate"
13567
13782
  ]
13568
13783
  },
13784
+ {
13785
+ "type": "fieldset",
13786
+ "title": "Presence Sensor Settings",
13787
+ "expandable": true,
13788
+ "expanded": false,
13789
+ "items": [
13790
+ "options.deviceConfig['Presence Sensor'].hide_device",
13791
+ "options.deviceConfig['Presence Sensor'].hide_lightsensor",
13792
+ "options.deviceConfig['Presence Sensor'].set_minlux",
13793
+ "options.deviceConfig['Presence Sensor'].set_maxlux",
13794
+ "options.deviceConfig['Presence Sensor'].connectionType",
13795
+ "options.deviceConfig['Presence Sensor'].disablePlatformBLE",
13796
+ "options.deviceConfig['Presence Sensor'].scanDuration",
13797
+ "options.deviceConfig['Presence Sensor'].webhook",
13798
+ "options.deviceConfig['Presence Sensor'].external",
13799
+ "options.deviceConfig['Presence Sensor'].maxRetry",
13800
+ "options.deviceConfig['Presence Sensor'].maxRetries",
13801
+ "options.deviceConfig['Presence Sensor'].delayBetweenRetries",
13802
+ "options.deviceConfig['Presence Sensor'].disableCaching",
13803
+ "options.deviceConfig['Presence Sensor'].offline",
13804
+ "options.deviceConfig['Presence Sensor'].history",
13805
+ "options.deviceConfig['Presence Sensor'].firmware",
13806
+ "options.deviceConfig['Presence Sensor'].logging",
13807
+ "options.deviceConfig['Presence Sensor'].refreshRate",
13808
+ "options.deviceConfig['Presence Sensor'].updateRate",
13809
+ "options.deviceConfig['Presence Sensor'].pushRate"
13810
+ ]
13811
+ },
13569
13812
  {
13570
13813
  "type": "fieldset",
13571
13814
  "title": "Contact Sensor Settings",
@@ -0,0 +1,224 @@
1
+ body, html {
2
+ margin:0; padding: 0;
3
+ height: 100%;
4
+ }
5
+ body {
6
+ font-family: Helvetica Neue, Helvetica, Arial;
7
+ font-size: 14px;
8
+ color:#333;
9
+ }
10
+ .small { font-size: 12px; }
11
+ *, *:after, *:before {
12
+ -webkit-box-sizing:border-box;
13
+ -moz-box-sizing:border-box;
14
+ box-sizing:border-box;
15
+ }
16
+ h1 { font-size: 20px; margin: 0;}
17
+ h2 { font-size: 14px; }
18
+ pre {
19
+ font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
+ margin: 0;
21
+ padding: 0;
22
+ -moz-tab-size: 2;
23
+ -o-tab-size: 2;
24
+ tab-size: 2;
25
+ }
26
+ a { color:#0074D9; text-decoration:none; }
27
+ a:hover { text-decoration:underline; }
28
+ .strong { font-weight: bold; }
29
+ .space-top1 { padding: 10px 0 0 0; }
30
+ .pad2y { padding: 20px 0; }
31
+ .pad1y { padding: 10px 0; }
32
+ .pad2x { padding: 0 20px; }
33
+ .pad2 { padding: 20px; }
34
+ .pad1 { padding: 10px; }
35
+ .space-left2 { padding-left:55px; }
36
+ .space-right2 { padding-right:20px; }
37
+ .center { text-align:center; }
38
+ .clearfix { display:block; }
39
+ .clearfix:after {
40
+ content:'';
41
+ display:block;
42
+ height:0;
43
+ clear:both;
44
+ visibility:hidden;
45
+ }
46
+ .fl { float: left; }
47
+ @media only screen and (max-width:640px) {
48
+ .col3 { width:100%; max-width:100%; }
49
+ .hide-mobile { display:none!important; }
50
+ }
51
+
52
+ .quiet {
53
+ color: #7f7f7f;
54
+ color: rgba(0,0,0,0.5);
55
+ }
56
+ .quiet a { opacity: 0.7; }
57
+
58
+ .fraction {
59
+ font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
+ font-size: 10px;
61
+ color: #555;
62
+ background: #E8E8E8;
63
+ padding: 4px 5px;
64
+ border-radius: 3px;
65
+ vertical-align: middle;
66
+ }
67
+
68
+ div.path a:link, div.path a:visited { color: #333; }
69
+ table.coverage {
70
+ border-collapse: collapse;
71
+ margin: 10px 0 0 0;
72
+ padding: 0;
73
+ }
74
+
75
+ table.coverage td {
76
+ margin: 0;
77
+ padding: 0;
78
+ vertical-align: top;
79
+ }
80
+ table.coverage td.line-count {
81
+ text-align: right;
82
+ padding: 0 5px 0 20px;
83
+ }
84
+ table.coverage td.line-coverage {
85
+ text-align: right;
86
+ padding-right: 10px;
87
+ min-width:20px;
88
+ }
89
+
90
+ table.coverage td span.cline-any {
91
+ display: inline-block;
92
+ padding: 0 5px;
93
+ width: 100%;
94
+ }
95
+ .missing-if-branch {
96
+ display: inline-block;
97
+ margin-right: 5px;
98
+ border-radius: 3px;
99
+ position: relative;
100
+ padding: 0 4px;
101
+ background: #333;
102
+ color: yellow;
103
+ }
104
+
105
+ .skip-if-branch {
106
+ display: none;
107
+ margin-right: 10px;
108
+ position: relative;
109
+ padding: 0 4px;
110
+ background: #ccc;
111
+ color: white;
112
+ }
113
+ .missing-if-branch .typ, .skip-if-branch .typ {
114
+ color: inherit !important;
115
+ }
116
+ .coverage-summary {
117
+ border-collapse: collapse;
118
+ width: 100%;
119
+ }
120
+ .coverage-summary tr { border-bottom: 1px solid #bbb; }
121
+ .keyline-all { border: 1px solid #ddd; }
122
+ .coverage-summary td, .coverage-summary th { padding: 10px; }
123
+ .coverage-summary tbody { border: 1px solid #bbb; }
124
+ .coverage-summary td { border-right: 1px solid #bbb; }
125
+ .coverage-summary td:last-child { border-right: none; }
126
+ .coverage-summary th {
127
+ text-align: left;
128
+ font-weight: normal;
129
+ white-space: nowrap;
130
+ }
131
+ .coverage-summary th.file { border-right: none !important; }
132
+ .coverage-summary th.pct { }
133
+ .coverage-summary th.pic,
134
+ .coverage-summary th.abs,
135
+ .coverage-summary td.pct,
136
+ .coverage-summary td.abs { text-align: right; }
137
+ .coverage-summary td.file { white-space: nowrap; }
138
+ .coverage-summary td.pic { min-width: 120px !important; }
139
+ .coverage-summary tfoot td { }
140
+
141
+ .coverage-summary .sorter {
142
+ height: 10px;
143
+ width: 7px;
144
+ display: inline-block;
145
+ margin-left: 0.5em;
146
+ background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
+ }
148
+ .coverage-summary .sorted .sorter {
149
+ background-position: 0 -20px;
150
+ }
151
+ .coverage-summary .sorted-desc .sorter {
152
+ background-position: 0 -10px;
153
+ }
154
+ .status-line { height: 10px; }
155
+ /* yellow */
156
+ .cbranch-no { background: yellow !important; color: #111; }
157
+ /* dark red */
158
+ .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
159
+ .low .chart { border:1px solid #C21F39 }
160
+ .highlighted,
161
+ .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
162
+ background: #C21F39 !important;
163
+ }
164
+ /* medium red */
165
+ .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
166
+ /* light red */
167
+ .low, .cline-no { background:#FCE1E5 }
168
+ /* light green */
169
+ .high, .cline-yes { background:rgb(230,245,208) }
170
+ /* medium green */
171
+ .cstat-yes { background:rgb(161,215,106) }
172
+ /* dark green */
173
+ .status-line.high, .high .cover-fill { background:rgb(77,146,33) }
174
+ .high .chart { border:1px solid rgb(77,146,33) }
175
+ /* dark yellow (gold) */
176
+ .status-line.medium, .medium .cover-fill { background: #f9cd0b; }
177
+ .medium .chart { border:1px solid #f9cd0b; }
178
+ /* light yellow */
179
+ .medium { background: #fff4c2; }
180
+
181
+ .cstat-skip { background: #ddd; color: #111; }
182
+ .fstat-skip { background: #ddd; color: #111 !important; }
183
+ .cbranch-skip { background: #ddd !important; color: #111; }
184
+
185
+ span.cline-neutral { background: #eaeaea; }
186
+
187
+ .coverage-summary td.empty {
188
+ opacity: .5;
189
+ padding-top: 4px;
190
+ padding-bottom: 4px;
191
+ line-height: 1;
192
+ color: #888;
193
+ }
194
+
195
+ .cover-fill, .cover-empty {
196
+ display:inline-block;
197
+ height: 12px;
198
+ }
199
+ .chart {
200
+ line-height: 0;
201
+ }
202
+ .cover-empty {
203
+ background: white;
204
+ }
205
+ .cover-full {
206
+ border-right: none !important;
207
+ }
208
+ pre.prettyprint {
209
+ border: none !important;
210
+ padding: 0 !important;
211
+ margin: 0 !important;
212
+ }
213
+ .com { color: #999 !important; }
214
+ .ignore-none { color: #999; font-weight: normal; }
215
+
216
+ .wrapper {
217
+ min-height: 100%;
218
+ height: auto !important;
219
+ height: 100%;
220
+ margin: 0 auto -48px;
221
+ }
222
+ .footer, .push {
223
+ height: 48px;
224
+ }