homebridge-tsvesync 1.0.67 → 1.0.70

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 (36) hide show
  1. package/.clinerules +145 -0
  2. package/CHANGELOG.md +49 -27
  3. package/config.schema.json +91 -150
  4. package/dist/accessories/air-purifier.accessory.d.ts +9 -0
  5. package/dist/accessories/air-purifier.accessory.d.ts.map +1 -1
  6. package/dist/accessories/air-purifier.accessory.js +189 -50
  7. package/dist/accessories/air-purifier.accessory.js.map +1 -1
  8. package/dist/accessories/base.accessory.d.ts +3 -0
  9. package/dist/accessories/base.accessory.d.ts.map +1 -1
  10. package/dist/accessories/base.accessory.js +69 -5
  11. package/dist/accessories/base.accessory.js.map +1 -1
  12. package/dist/accessories/humidifier.accessory.d.ts +39 -1
  13. package/dist/accessories/humidifier.accessory.d.ts.map +1 -1
  14. package/dist/accessories/humidifier.accessory.js +731 -95
  15. package/dist/accessories/humidifier.accessory.js.map +1 -1
  16. package/dist/platform.d.ts.map +1 -1
  17. package/dist/platform.js +27 -10
  18. package/dist/platform.js.map +1 -1
  19. package/dist/types/device.types.d.ts +5 -0
  20. package/dist/types/device.types.d.ts.map +1 -1
  21. package/dist/utils/api-proxy.d.ts +7 -1
  22. package/dist/utils/api-proxy.d.ts.map +1 -1
  23. package/dist/utils/api-proxy.js +84 -5
  24. package/dist/utils/api-proxy.js.map +1 -1
  25. package/dist/utils/quota-manager.d.ts +67 -0
  26. package/dist/utils/quota-manager.d.ts.map +1 -0
  27. package/dist/utils/quota-manager.js +154 -0
  28. package/dist/utils/quota-manager.js.map +1 -0
  29. package/package.json +2 -2
  30. package/src/accessories/air-purifier.accessory.ts +209 -40
  31. package/src/accessories/base.accessory.ts +70 -3
  32. package/src/accessories/humidifier.accessory.ts +914 -93
  33. package/src/platform.ts +33 -14
  34. package/src/types/device.types.ts +6 -1
  35. package/src/utils/api-proxy.ts +121 -8
  36. package/src/utils/quota-manager.ts +175 -0
package/.clinerules ADDED
@@ -0,0 +1,145 @@
1
+ # Cline Rules for homebridge-tsvesync
2
+
3
+ ## Project Patterns
4
+
5
+ ### Code Organization
6
+ - TypeScript files use `.ts` extension
7
+ - Test files are placed in `__tests__` directory with `.test.ts` extension
8
+ - Device-specific accessories are in `accessories/` directory with `.accessory.ts` suffix
9
+ - Type definitions are in `types/` directory
10
+ - Utility functions are in `utils/` directory
11
+
12
+ ### Naming Conventions
13
+ - Classes use PascalCase (e.g., `BaseAccessory`, `HumidifierAccessory`)
14
+ - Interfaces use PascalCase with descriptive names (e.g., `DeviceCapabilities`)
15
+ - Methods and variables use camelCase
16
+ - Constants use UPPER_SNAKE_CASE for truly constant values
17
+ - File names use kebab-case for general files, but camelCase for class files
18
+
19
+ ### Code Style
20
+ - Use 2-space indentation
21
+ - Prefer single quotes for strings
22
+ - Use semicolons at the end of statements
23
+ - Use explicit type annotations for function parameters and return types
24
+ - Use async/await for asynchronous operations
25
+ - Prefer interfaces over type aliases for object types
26
+ - Use optional chaining and nullish coalescing when appropriate
27
+
28
+ ### Error Handling
29
+ - Use try/catch blocks for API operations
30
+ - Log errors with appropriate context
31
+ - Implement retry mechanisms with exponential backoff
32
+ - Provide meaningful error messages for debugging
33
+ - Handle specific error types differently (network errors, auth errors, etc.)
34
+
35
+ ### Logging
36
+ - Use the plugin's logger instance, not console.log
37
+ - Include device context in log messages
38
+ - Use appropriate log levels (debug, info, warn, error)
39
+ - Redact sensitive information in logs
40
+ - Include operation context in log messages
41
+
42
+ ### File Editing Practices
43
+ - Always commit working code before making significant changes
44
+ - Make small, incremental changes rather than large rewrites
45
+ - Initialize all properties in constructors with default values
46
+ - Be cautious when modifying interface definitions
47
+ - Validate type casting with explicit checks
48
+ - Use version control for recovery if files become corrupted
49
+ - See memory-bank/file-editing-guidelines.md for detailed guidelines
50
+
51
+ ## Implementation Patterns
52
+
53
+ ### Device Handling
54
+ - All device accessories extend `BaseAccessory`
55
+ - Device-specific logic is implemented in subclasses
56
+ - Common functionality is in the base class
57
+ - Use composition of interfaces for device capabilities
58
+ - Map device states to HomeKit characteristics
59
+
60
+ ### API Communication
61
+ - Use the tsvesync library for API calls
62
+ - Implement rate limiting for API requests
63
+ - Handle authentication token refresh
64
+ - Use exponential backoff for failed requests
65
+ - Cache device states to reduce API calls
66
+
67
+ ### State Management
68
+ - Update device states periodically based on configuration
69
+ - Persist device state in accessory context
70
+ - Update HomeKit characteristics when device state changes
71
+ - Handle state synchronization between HomeKit and VeSync
72
+
73
+ ### Testing
74
+ - Use Jest for unit tests
75
+ - Mock external dependencies
76
+ - Test error handling paths
77
+ - Use descriptive test names
78
+ - Group related tests in describe blocks
79
+
80
+ ## Development Workflow
81
+
82
+ ### Building
83
+ - Run `npm run build` to compile TypeScript to JavaScript
84
+ - Output goes to `dist/` directory
85
+ - Clean build directory before compilation
86
+
87
+ ### Testing
88
+ - Run `npm test` to execute all tests
89
+ - Run `npm run test:watch` for development
90
+ - Run `npm run test:coverage` to check test coverage
91
+
92
+ ### Debugging
93
+ - Enable debug mode in plugin configuration
94
+ - Check Homebridge logs for detailed information
95
+ - Use VS Code debugger with appropriate launch configuration
96
+ - Test with real devices when possible
97
+
98
+ ### Deployment
99
+ - Update version in package.json
100
+ - Update CHANGELOG.md with version changes
101
+ - Run tests before publishing
102
+ - Use `npm publish` to publish to npm registry
103
+
104
+ ## User Support Patterns
105
+
106
+ ### Configuration Help
107
+ - Guide users through config.json setup
108
+ - Provide examples for different device types
109
+ - Explain exclusion options clearly
110
+ - Document all configuration parameters
111
+
112
+ ### Troubleshooting
113
+ - Ask for debug logs when helping users
114
+ - Check for common configuration issues first
115
+ - Verify device compatibility
116
+ - Check for network/connectivity issues
117
+ - Verify VeSync account credentials
118
+
119
+ ### Feature Requests
120
+ - Evaluate feasibility based on API capabilities
121
+ - Consider HomeKit limitations
122
+ - Prioritize based on user impact
123
+ - Document in GitHub issues
124
+
125
+ ## Project-Specific Notes
126
+
127
+ ### VeSync API Quirks
128
+ - Different device models have inconsistent API implementations
129
+ - Some devices require specific mode settings before other operations
130
+ - API rate limiting can be unpredictable
131
+ - Authentication tokens expire after 1 hour
132
+ - Some device features are not exposed via the API
133
+
134
+ ### HomeKit Limitations
135
+ - Limited set of predefined accessory types
136
+ - Restricted characteristic value ranges
137
+ - No custom characteristics without using HAP-NodeJS directly
138
+ - Limited support for complex device features
139
+
140
+ ### Common Issues
141
+ - Rate limiting during device discovery with many devices
142
+ - State synchronization delays during high activity
143
+ - Token refresh failures during network interruptions
144
+ - Mapping complex device modes to HomeKit characteristics
145
+ - File corruption during complex edits (see file-editing-guidelines.md)
package/CHANGELOG.md CHANGED
@@ -1,37 +1,59 @@
1
- # Change Log
1
+ # Changelog
2
+
3
+ ## 1.0.68 (2025-02-28)
4
+
5
+ ### Added
6
+ - API quota management system to prevent exceeding VeSync's daily request limits
7
+ - Configurable quota buffer percentage and priority methods in config.schema.json
8
+ - Automatic device count detection for quota calculation
9
+ - Graceful degradation when quota limits are reached
10
+ - High-priority methods that will still work even when quota is exceeded
11
+
12
+ ### Changed
13
+ - Improved error handling for API quota errors
14
+ - Limited device state sync retries to 3 attempts to avoid excessive API calls
15
+ - Enhanced logging for quota-related issues
16
+ - Updated config schema with new quota management options
2
17
 
3
- # 1.0.33 (2025-01-04)
4
18
  ### Fixed
5
- - Fixed issue where devices were not being refreshed and polling too frequently
19
+ - Fixed issue with API quota errors causing plugin instability
20
+ - Improved handling of null responses from API calls due to quota limits
21
+
22
+ ## 1.0.67 (2025-01-15)
23
+
24
+ ### Added
25
+ - Support for OasisMist1000S humidifier
26
+
27
+ ### Changed
28
+ - Improved error handling for API rate limiting
29
+ - Enhanced token refresh mechanism
6
30
 
7
- # 1.0.31 (2025-01-04)
8
31
  ### Fixed
9
- - Fixed issue where login token was not being refreshed
32
+ - Fixed issue with fan speed control on certain models
33
+ - Improved logging for troubleshooting
34
+
35
+ ## 1.0.66 (2024-12-10)
36
+
37
+ ### Added
38
+ - Support for Superior6000S humidifier
39
+
40
+ ### Changed
41
+ - Improved device exclusion logic
42
+ - Enhanced error recovery for network failures
43
+ - Updated tsvesync dependency to v1.0.64
10
44
 
11
- # 1.0.27 (2025-01-02)
12
45
  ### Fixed
13
- - Fixed invalid speed setting issues for air purifiers, fans, and humidifiers
14
- - Speed 0 now properly turns off the device instead of attempting to set an invalid speed
15
- - Air purifiers and fans now correctly map HomeKit's 0-100% to device speeds 1-5
16
- - Humidifiers now correctly map HomeKit's 0-100% to device speeds 1-9
46
+ - Fixed connection stability issues
47
+
48
+ ## 1.0.65 (2024-11-05)
17
49
 
18
50
  ### Added
19
- - Added informative logging for all device control actions
20
- - Power state changes
21
- - Speed/level adjustments
22
- - Mode changes
23
- - Child lock toggles
24
- - Swing mode changes
25
- - Rotation direction changes
26
- - Target humidity adjustments
27
- - Added support for ESO15-TB dual outdoor outlets
28
- - Power state control for both outlets
29
- - Energy monitoring capabilities
30
- - Power consumption tracking
31
- - Voltage monitoring
32
- - Added support for ESWL01, ESWL03, and ESWD16 wall switches
51
+ - Support for EverestAir air purifier
33
52
 
34
53
  ### Changed
35
- - Improved error handling for device control operations
36
- - Enhanced speed control mapping for better user experience
37
- - Updated humidifier mist level terminology in logs for clarity
54
+ - Improved handling of device reconnection
55
+ - Enhanced logging for API communication
56
+ - Optimized polling frequency
57
+
58
+ ### Fixed
59
+ - Fixed issues with characteristic updates
@@ -2,7 +2,7 @@
2
2
  "pluginAlias": "TSVESyncPlatform",
3
3
  "pluginType": "platform",
4
4
  "singular": true,
5
- "headerDisplay": "Homebridge plugin for VeSync devices including Levoit air purifiers, humidifiers, and Etekcity smart outlets.",
5
+ "headerDisplay": "Homebridge plugin for VeSync devices including Levoit air purifiers humidifiers and Etekcity smart outlets.",
6
6
  "footerDisplay": "For help please visit the [GitHub repository](https://github.com/mickgiles/homebridge-tsvesync).",
7
7
  "schema": {
8
8
  "type": "object",
@@ -10,229 +10,170 @@
10
10
  "name": {
11
11
  "title": "Name",
12
12
  "type": "string",
13
- "required": true,
14
- "default": "TSVESync"
13
+ "default": "TSVESync",
14
+ "required": true
15
15
  },
16
16
  "username": {
17
- "title": "Email",
17
+ "title": "VeSync Username",
18
18
  "type": "string",
19
19
  "required": true,
20
20
  "description": "Your VeSync account email address"
21
21
  },
22
22
  "password": {
23
- "title": "Password",
23
+ "title": "VeSync Password",
24
24
  "type": "string",
25
25
  "required": true,
26
- "description": "Your VeSync account password",
27
- "typeahead": {
28
- "source": []
29
- }
26
+ "description": "Your VeSync account password"
30
27
  },
31
28
  "updateInterval": {
32
29
  "title": "Update Interval",
33
30
  "type": "integer",
34
- "minimum": 60,
35
- "maximum": 900,
36
- "default": 300,
37
- "required": false,
38
- "description": "How often to update device states (in seconds). Default is 300 seconds (5 minutes). Minimum is 60 seconds to avoid API rate limits."
31
+ "default": 30,
32
+ "minimum": 10,
33
+ "maximum": 600,
34
+ "description": "How often to update device status (in seconds)"
39
35
  },
40
36
  "debug": {
41
- "title": "Debug Logging",
37
+ "title": "Debug Mode",
42
38
  "type": "boolean",
43
- "required": false,
44
39
  "default": false,
45
- "description": "Enable debug logging for troubleshooting"
40
+ "description": "Enable debug logging"
41
+ },
42
+ "apiUrl": {
43
+ "title": "API URL",
44
+ "type": "string",
45
+ "description": "Custom VeSync API URL (advanced users only)"
46
46
  },
47
47
  "exclude": {
48
- "title": "Device Exclusions",
48
+ "title": "Exclude Devices",
49
49
  "type": "object",
50
- "required": false,
51
- "description": "Configure which devices to exclude from HomeKit",
52
50
  "properties": {
53
51
  "type": {
54
- "title": "Exclude Device Types",
52
+ "title": "Exclude by Type",
55
53
  "type": "array",
56
54
  "items": {
57
- "title": "Device Type",
58
55
  "type": "string",
59
- "enum": ["fan", "outlet", "switch", "bulb", "purifier", "humidifier"]
56
+ "enum": [
57
+ "fan",
58
+ "outlet",
59
+ "switch",
60
+ "bulb",
61
+ "humidifier",
62
+ "purifier"
63
+ ]
60
64
  },
61
65
  "uniqueItems": true,
62
- "description": "Select device types to exclude from HomeKit",
63
- "default": []
66
+ "description": "Exclude devices by type"
64
67
  },
65
68
  "model": {
66
- "title": "Exclude Device Models",
69
+ "title": "Exclude by Model",
67
70
  "type": "array",
68
71
  "items": {
69
- "title": "Device Model",
70
- "type": "string",
71
- "placeholder": "Core300S"
72
+ "type": "string"
72
73
  },
73
74
  "uniqueItems": true,
74
- "description": "Enter device models to exclude (e.g., Core300S, LV600S, ESL100)",
75
- "default": []
75
+ "description": "Exclude devices by model (e.g., 'Core300S', 'LV600S')"
76
76
  },
77
77
  "name": {
78
78
  "title": "Exclude by Name",
79
79
  "type": "array",
80
80
  "items": {
81
- "title": "Device Name",
82
- "type": "string",
83
- "placeholder": "Living Room Light"
81
+ "type": "string"
84
82
  },
85
83
  "uniqueItems": true,
86
- "description": "Enter exact device names to exclude (case-sensitive)",
87
- "default": []
84
+ "description": "Exclude devices by exact name match"
88
85
  },
89
86
  "namePattern": {
90
87
  "title": "Exclude by Name Pattern",
91
88
  "type": "array",
92
89
  "items": {
93
- "title": "Pattern",
94
- "type": "string",
95
- "placeholder": "Bedroom.*"
90
+ "type": "string"
96
91
  },
97
92
  "uniqueItems": true,
98
- "description": "Enter regex patterns to match device names for exclusion (e.g., 'Bedroom.*' to exclude all bedroom devices)",
99
- "default": []
93
+ "description": "Exclude devices by name pattern (regex)"
100
94
  },
101
95
  "id": {
102
- "title": "Exclude by Device ID",
96
+ "title": "Exclude by ID",
103
97
  "type": "array",
104
98
  "items": {
105
- "title": "Device ID",
106
- "type": "string",
107
- "placeholder": "cid123456"
99
+ "type": "string"
108
100
  },
109
101
  "uniqueItems": true,
110
- "description": "Enter device IDs (cid/uuid) to exclude",
111
- "default": []
102
+ "description": "Exclude devices by ID (cid/uuid)"
112
103
  }
113
104
  }
114
105
  },
115
106
  "retry": {
116
- "title": "API Retry Configuration",
107
+ "title": "Retry Configuration",
117
108
  "type": "object",
118
- "required": false,
119
- "description": "Configure retry behavior for API calls",
120
109
  "properties": {
121
110
  "maxRetries": {
122
111
  "title": "Maximum Retries",
123
112
  "type": "integer",
113
+ "default": 3,
124
114
  "minimum": 1,
125
115
  "maximum": 10,
126
- "default": 3,
127
- "description": "Maximum number of retry attempts for failed API calls"
116
+ "description": "Maximum number of retry attempts for failed operations"
128
117
  },
129
118
  "initialDelay": {
130
- "title": "Initial Retry Delay",
119
+ "title": "Initial Delay",
131
120
  "type": "integer",
132
- "minimum": 1000,
133
- "maximum": 10000,
134
121
  "default": 2000,
135
- "description": "Initial delay between retries in milliseconds"
122
+ "minimum": 500,
123
+ "maximum": 10000,
124
+ "description": "Initial delay before first retry (in milliseconds)"
136
125
  },
137
126
  "maxDelay": {
138
- "title": "Maximum Retry Delay",
127
+ "title": "Maximum Delay",
139
128
  "type": "integer",
140
- "minimum": 5000,
141
- "maximum": 30000,
142
129
  "default": 10000,
143
- "description": "Maximum delay between retries in milliseconds"
130
+ "minimum": 1000,
131
+ "maximum": 60000,
132
+ "description": "Maximum delay between retries (in milliseconds)"
144
133
  }
145
134
  }
146
- }
147
- }
148
- },
149
- "layout": [
150
- "name",
151
- "username",
152
- "password",
153
- "updateInterval",
154
- "debug",
155
- {
156
- "key": "exclude",
157
- "type": "section",
158
- "title": "Device Exclusions",
159
- "expandable": true,
160
- "expanded": false,
161
- "orderable": false,
162
- "items": [
163
- {
164
- "key": "exclude.type",
165
- "type": "array",
166
- "title": "Device Types to Exclude",
167
- "buttonText": "Add Device Type",
168
- "items": [
169
- {
170
- "key": "exclude.type[]",
171
- "type": "select"
172
- }
173
- ]
174
- },
175
- {
176
- "key": "exclude.model",
177
- "type": "array",
178
- "title": "Device Models to Exclude",
179
- "buttonText": "Add Device Model",
180
- "items": [
181
- {
182
- "key": "exclude.model[]",
183
- "type": "string"
184
- }
185
- ]
186
- },
187
- {
188
- "key": "exclude.name",
189
- "type": "array",
190
- "title": "Device Names to Exclude",
191
- "buttonText": "Add Device Name",
192
- "items": [
193
- {
194
- "key": "exclude.name[]",
195
- "type": "string"
196
- }
197
- ]
198
- },
199
- {
200
- "key": "exclude.namePattern",
201
- "type": "array",
202
- "title": "Name Patterns to Exclude",
203
- "buttonText": "Add Name Pattern",
204
- "items": [
205
- {
206
- "key": "exclude.namePattern[]",
207
- "type": "string"
208
- }
209
- ]
210
- },
211
- {
212
- "key": "exclude.id",
213
- "type": "array",
214
- "title": "Device IDs to Exclude",
215
- "buttonText": "Add Device ID",
216
- "items": [
217
- {
218
- "key": "exclude.id[]",
135
+ },
136
+ "quotaManagement": {
137
+ "title": "API Quota Management",
138
+ "type": "object",
139
+ "properties": {
140
+ "enabled": {
141
+ "title": "Enable Quota Management",
142
+ "type": "boolean",
143
+ "default": true,
144
+ "description": "Enable API quota management to prevent exceeding VeSync's daily limits"
145
+ },
146
+ "bufferPercentage": {
147
+ "title": "Buffer Percentage",
148
+ "type": "integer",
149
+ "default": 95,
150
+ "minimum": 50,
151
+ "maximum": 100,
152
+ "description": "Percentage of the calculated quota to use (lower values provide more safety margin)"
153
+ },
154
+ "priorityMethods": {
155
+ "title": "Priority Methods",
156
+ "type": "array",
157
+ "items": {
219
158
  "type": "string"
220
- }
221
- ]
159
+ },
160
+ "default": [
161
+ "turnOn",
162
+ "turnOff",
163
+ "setMode",
164
+ "setTargetHumidity",
165
+ "setBrightness",
166
+ "setColorTemperature",
167
+ "setColor",
168
+ "changeFanSpeed",
169
+ "setOscillation",
170
+ "setChildLock"
171
+ ],
172
+ "uniqueItems": true,
173
+ "description": "API methods that will be allowed even when quota is exceeded"
174
+ }
222
175
  }
223
- ]
224
- },
225
- {
226
- "key": "retry",
227
- "type": "section",
228
- "title": "API Retry Settings",
229
- "expandable": true,
230
- "expanded": false,
231
- "items": [
232
- "retry.maxRetries",
233
- "retry.initialDelay",
234
- "retry.maxDelay"
235
- ]
176
+ }
236
177
  }
237
- ]
238
- }
178
+ }
179
+ }
@@ -5,6 +5,7 @@ import { DeviceCapabilities, VeSyncAirPurifier } from '../types/device.types';
5
5
  export declare class AirPurifierAccessory extends BaseAccessory {
6
6
  private readonly capabilities;
7
7
  protected readonly device: VeSyncAirPurifier;
8
+ private isLVSeries;
8
9
  constructor(platform: TSVESyncPlatform, accessory: PlatformAccessory, device: VeSyncAirPurifier);
9
10
  /**
10
11
  * Set up the air purifier service
@@ -18,6 +19,14 @@ export declare class AirPurifierAccessory extends BaseAccessory {
18
19
  * Update device states based on the latest details
19
20
  */
20
21
  protected updateDeviceSpecificStates(details: any): Promise<void>;
22
+ /**
23
+ * Get target state (AUTO = 0, MANUAL = 1)
24
+ */
25
+ private getTargetState;
26
+ /**
27
+ * Set target state (AUTO = 0, MANUAL = 1)
28
+ */
29
+ private setTargetState;
21
30
  /**
22
31
  * Handle set rotation speed
23
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"air-purifier.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/air-purifier.accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAG3C,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,iBAAiB;IAO3B;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IA0B9B;;OAEG;IACH,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;IAcrD;;OAEG;cACa,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BvE;;OAEG;YACW,sBAAsB;YA0BtB,SAAS;YAIT,SAAS;YAiBT,gBAAgB;CAgB/B"}
1
+ {"version":3,"file":"air-purifier.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/air-purifier.accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AA0B9E,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAC7C,OAAO,CAAC,UAAU,CAAU;gBAG1B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,iBAAiB;IAe3B;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IAiC9B;;OAEG;IACH,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;IAcrD;;OAEG;cACa,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDvE;;OAEG;YACW,cAAc;IAK5B;;OAEG;YACW,cAAc;IAmC5B;;OAEG;YACW,sBAAsB;YAyEtB,SAAS;YAIT,SAAS;YAmBT,gBAAgB;CA6B/B"}