@ecobridge.xyz/devicemanager 3.0.2

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 (137) hide show
  1. package/.gitea/workflows/default_nottags.yaml +66 -0
  2. package/.gitea/workflows/default_tags.yaml +124 -0
  3. package/.vscode/launch.json +11 -0
  4. package/.vscode/settings.json +26 -0
  5. package/changelog.md +91 -0
  6. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  7. package/dist_ts/00_commitinfo_data.js +9 -0
  8. package/dist_ts/device/device.classes.device.d.ts +205 -0
  9. package/dist_ts/device/device.classes.device.js +344 -0
  10. package/dist_ts/devicemanager.classes.devicemanager.d.ts +210 -0
  11. package/dist_ts/devicemanager.classes.devicemanager.js +835 -0
  12. package/dist_ts/discovery/discovery.classes.homeassistant.d.ts +101 -0
  13. package/dist_ts/discovery/discovery.classes.homeassistant.js +313 -0
  14. package/dist_ts/discovery/discovery.classes.mdns.d.ts +90 -0
  15. package/dist_ts/discovery/discovery.classes.mdns.js +291 -0
  16. package/dist_ts/discovery/discovery.classes.networkscanner.d.ts +64 -0
  17. package/dist_ts/discovery/discovery.classes.networkscanner.js +535 -0
  18. package/dist_ts/discovery/discovery.classes.ssdp.d.ts +112 -0
  19. package/dist_ts/discovery/discovery.classes.ssdp.js +255 -0
  20. package/dist_ts/factories/index.d.ts +190 -0
  21. package/dist_ts/factories/index.js +350 -0
  22. package/dist_ts/features/feature.abstract.d.ts +118 -0
  23. package/dist_ts/features/feature.abstract.js +172 -0
  24. package/dist_ts/features/feature.camera.d.ts +95 -0
  25. package/dist_ts/features/feature.camera.js +162 -0
  26. package/dist_ts/features/feature.climate.d.ts +174 -0
  27. package/dist_ts/features/feature.climate.js +328 -0
  28. package/dist_ts/features/feature.cover.d.ts +121 -0
  29. package/dist_ts/features/feature.cover.js +217 -0
  30. package/dist_ts/features/feature.fan.d.ts +127 -0
  31. package/dist_ts/features/feature.fan.js +235 -0
  32. package/dist_ts/features/feature.light.d.ts +156 -0
  33. package/dist_ts/features/feature.light.js +296 -0
  34. package/dist_ts/features/feature.lock.d.ts +103 -0
  35. package/dist_ts/features/feature.lock.js +170 -0
  36. package/dist_ts/features/feature.playback.d.ts +98 -0
  37. package/dist_ts/features/feature.playback.js +191 -0
  38. package/dist_ts/features/feature.power.d.ts +79 -0
  39. package/dist_ts/features/feature.power.js +173 -0
  40. package/dist_ts/features/feature.print.d.ts +78 -0
  41. package/dist_ts/features/feature.print.js +226 -0
  42. package/dist_ts/features/feature.scan.d.ts +79 -0
  43. package/dist_ts/features/feature.scan.js +315 -0
  44. package/dist_ts/features/feature.sensor.d.ts +95 -0
  45. package/dist_ts/features/feature.sensor.js +147 -0
  46. package/dist_ts/features/feature.snmp.d.ts +88 -0
  47. package/dist_ts/features/feature.snmp.js +175 -0
  48. package/dist_ts/features/feature.switch.d.ts +75 -0
  49. package/dist_ts/features/feature.switch.js +126 -0
  50. package/dist_ts/features/feature.volume.d.ts +104 -0
  51. package/dist_ts/features/feature.volume.js +186 -0
  52. package/dist_ts/features/index.d.ts +19 -0
  53. package/dist_ts/features/index.js +23 -0
  54. package/dist_ts/helpers/helpers.iprange.d.ts +35 -0
  55. package/dist_ts/helpers/helpers.iprange.js +151 -0
  56. package/dist_ts/helpers/helpers.retry.d.ts +25 -0
  57. package/dist_ts/helpers/helpers.retry.js +69 -0
  58. package/dist_ts/index.d.ts +15 -0
  59. package/dist_ts/index.js +40 -0
  60. package/dist_ts/interfaces/feature.interfaces.d.ts +255 -0
  61. package/dist_ts/interfaces/feature.interfaces.js +6 -0
  62. package/dist_ts/interfaces/homeassistant.interfaces.d.ts +550 -0
  63. package/dist_ts/interfaces/homeassistant.interfaces.js +111 -0
  64. package/dist_ts/interfaces/index.d.ts +330 -0
  65. package/dist_ts/interfaces/index.js +16 -0
  66. package/dist_ts/interfaces/smarthome.interfaces.d.ts +282 -0
  67. package/dist_ts/interfaces/smarthome.interfaces.js +7 -0
  68. package/dist_ts/paths.d.ts +1 -0
  69. package/dist_ts/paths.js +3 -0
  70. package/dist_ts/plugins.d.ts +23 -0
  71. package/dist_ts/plugins.js +30 -0
  72. package/dist_ts/protocols/index.d.ts +12 -0
  73. package/dist_ts/protocols/index.js +21 -0
  74. package/dist_ts/protocols/protocol.escl.d.ts +58 -0
  75. package/dist_ts/protocols/protocol.escl.js +364 -0
  76. package/dist_ts/protocols/protocol.homeassistant.d.ts +248 -0
  77. package/dist_ts/protocols/protocol.homeassistant.js +611 -0
  78. package/dist_ts/protocols/protocol.ipp.d.ts +45 -0
  79. package/dist_ts/protocols/protocol.ipp.js +284 -0
  80. package/dist_ts/protocols/protocol.nut.d.ts +160 -0
  81. package/dist_ts/protocols/protocol.nut.js +364 -0
  82. package/dist_ts/protocols/protocol.sane.d.ts +104 -0
  83. package/dist_ts/protocols/protocol.sane.js +597 -0
  84. package/dist_ts/protocols/protocol.snmp.d.ts +133 -0
  85. package/dist_ts/protocols/protocol.snmp.js +333 -0
  86. package/dist_ts/protocols/protocol.upnp.d.ts +207 -0
  87. package/dist_ts/protocols/protocol.upnp.js +442 -0
  88. package/dist_ts/protocols/protocol.upssnmp.d.ts +160 -0
  89. package/dist_ts/protocols/protocol.upssnmp.js +263 -0
  90. package/npmextra.json +24 -0
  91. package/package.json +39 -0
  92. package/readme.hints.md +115 -0
  93. package/readme.md +624 -0
  94. package/test/test.ts +261 -0
  95. package/ts/00_commitinfo_data.ts +8 -0
  96. package/ts/device/device.classes.device.ts +454 -0
  97. package/ts/devicemanager.classes.devicemanager.ts +1219 -0
  98. package/ts/discovery/discovery.classes.homeassistant.ts +376 -0
  99. package/ts/discovery/discovery.classes.mdns.ts +347 -0
  100. package/ts/discovery/discovery.classes.networkscanner.ts +648 -0
  101. package/ts/discovery/discovery.classes.ssdp.ts +357 -0
  102. package/ts/factories/index.ts +696 -0
  103. package/ts/features/feature.abstract.ts +251 -0
  104. package/ts/features/feature.camera.ts +214 -0
  105. package/ts/features/feature.climate.ts +407 -0
  106. package/ts/features/feature.cover.ts +278 -0
  107. package/ts/features/feature.fan.ts +296 -0
  108. package/ts/features/feature.light.ts +369 -0
  109. package/ts/features/feature.lock.ts +223 -0
  110. package/ts/features/feature.playback.ts +246 -0
  111. package/ts/features/feature.power.ts +231 -0
  112. package/ts/features/feature.print.ts +297 -0
  113. package/ts/features/feature.scan.ts +370 -0
  114. package/ts/features/feature.sensor.ts +202 -0
  115. package/ts/features/feature.snmp.ts +235 -0
  116. package/ts/features/feature.switch.ts +170 -0
  117. package/ts/features/feature.volume.ts +256 -0
  118. package/ts/features/index.ts +25 -0
  119. package/ts/helpers/helpers.iprange.ts +172 -0
  120. package/ts/helpers/helpers.retry.ts +100 -0
  121. package/ts/index.ts +165 -0
  122. package/ts/interfaces/feature.interfaces.ts +359 -0
  123. package/ts/interfaces/homeassistant.interfaces.ts +666 -0
  124. package/ts/interfaces/index.ts +421 -0
  125. package/ts/interfaces/smarthome.interfaces.ts +421 -0
  126. package/ts/paths.ts +5 -0
  127. package/ts/plugins.ts +41 -0
  128. package/ts/protocols/index.ts +59 -0
  129. package/ts/protocols/protocol.escl.ts +439 -0
  130. package/ts/protocols/protocol.homeassistant.ts +737 -0
  131. package/ts/protocols/protocol.ipp.ts +329 -0
  132. package/ts/protocols/protocol.nut.ts +471 -0
  133. package/ts/protocols/protocol.sane.ts +694 -0
  134. package/ts/protocols/protocol.snmp.ts +439 -0
  135. package/ts/protocols/protocol.upnp.ts +627 -0
  136. package/ts/protocols/protocol.upssnmp.ts +377 -0
  137. package/tsconfig.json +12 -0
@@ -0,0 +1,255 @@
1
+ import * as plugins from '../plugins.js';
2
+ /**
3
+ * SSDP service types for device discovery
4
+ */
5
+ export const SSDP_SERVICE_TYPES = {
6
+ // Root device
7
+ ROOT: 'upnp:rootdevice',
8
+ // DLNA/UPnP AV
9
+ MEDIA_RENDERER: 'urn:schemas-upnp-org:device:MediaRenderer:1',
10
+ MEDIA_SERVER: 'urn:schemas-upnp-org:device:MediaServer:1',
11
+ // Sonos
12
+ SONOS_ZONE_PLAYER: 'urn:schemas-upnp-org:device:ZonePlayer:1',
13
+ // Generic
14
+ BASIC_DEVICE: 'urn:schemas-upnp-org:device:Basic:1',
15
+ INTERNET_GATEWAY: 'urn:schemas-upnp-org:device:InternetGatewayDevice:1',
16
+ };
17
+ /**
18
+ * SSDP Discovery service using node-ssdp
19
+ */
20
+ export class SsdpDiscovery extends plugins.events.EventEmitter {
21
+ client = null;
22
+ devices = new Map();
23
+ running = false;
24
+ searchInterval = null;
25
+ constructor() {
26
+ super();
27
+ }
28
+ /**
29
+ * Start SSDP discovery
30
+ */
31
+ async start(serviceTypes) {
32
+ if (this.running) {
33
+ return;
34
+ }
35
+ this.running = true;
36
+ this.client = new plugins.nodeSsdp.Client();
37
+ // Handle SSDP responses
38
+ this.client.on('response', (headers, statusCode, rinfo) => {
39
+ this.handleSsdpResponse(headers, rinfo);
40
+ });
41
+ // Search for devices
42
+ const typesToSearch = serviceTypes ?? [
43
+ SSDP_SERVICE_TYPES.ROOT,
44
+ SSDP_SERVICE_TYPES.MEDIA_RENDERER,
45
+ SSDP_SERVICE_TYPES.MEDIA_SERVER,
46
+ SSDP_SERVICE_TYPES.SONOS_ZONE_PLAYER,
47
+ ];
48
+ // Initial search
49
+ for (const st of typesToSearch) {
50
+ this.client.search(st);
51
+ }
52
+ // Periodic re-search (every 30 seconds)
53
+ this.searchInterval = setInterval(() => {
54
+ if (this.client) {
55
+ for (const st of typesToSearch) {
56
+ this.client.search(st);
57
+ }
58
+ }
59
+ }, 30000);
60
+ this.emit('started');
61
+ }
62
+ /**
63
+ * Stop SSDP discovery
64
+ */
65
+ async stop() {
66
+ if (!this.running) {
67
+ return;
68
+ }
69
+ this.running = false;
70
+ if (this.searchInterval) {
71
+ clearInterval(this.searchInterval);
72
+ this.searchInterval = null;
73
+ }
74
+ if (this.client) {
75
+ this.client.stop();
76
+ this.client = null;
77
+ }
78
+ this.emit('stopped');
79
+ }
80
+ /**
81
+ * Check if discovery is running
82
+ */
83
+ get isRunning() {
84
+ return this.running;
85
+ }
86
+ /**
87
+ * Get all discovered devices
88
+ */
89
+ getDevices() {
90
+ return Array.from(this.devices.values());
91
+ }
92
+ /**
93
+ * Get devices by service type
94
+ */
95
+ getDevicesByType(serviceType) {
96
+ return this.getDevices().filter((d) => d.serviceType === serviceType);
97
+ }
98
+ /**
99
+ * Search for a specific service type
100
+ */
101
+ search(serviceType) {
102
+ if (this.client && this.running) {
103
+ this.client.search(serviceType);
104
+ }
105
+ }
106
+ /**
107
+ * Handle SSDP response
108
+ */
109
+ handleSsdpResponse(headers, rinfo) {
110
+ const usn = headers['USN'] || headers['usn'];
111
+ const location = headers['LOCATION'] || headers['location'];
112
+ const st = headers['ST'] || headers['st'];
113
+ if (!usn || !location) {
114
+ return;
115
+ }
116
+ // Parse location URL
117
+ let address = rinfo.address;
118
+ let port = 80;
119
+ try {
120
+ const url = new URL(location);
121
+ address = url.hostname;
122
+ port = parseInt(url.port) || (url.protocol === 'https:' ? 443 : 80);
123
+ }
124
+ catch {
125
+ // Keep rinfo address
126
+ }
127
+ const device = {
128
+ usn,
129
+ serviceType: st || 'unknown',
130
+ location,
131
+ address,
132
+ port,
133
+ headers: { ...headers },
134
+ };
135
+ const isNew = !this.devices.has(usn);
136
+ this.devices.set(usn, device);
137
+ if (isNew) {
138
+ // Fetch device description
139
+ this.fetchDeviceDescription(device).then(() => {
140
+ this.emit('device:found', device);
141
+ }).catch(() => {
142
+ // Still emit even without description
143
+ this.emit('device:found', device);
144
+ });
145
+ }
146
+ else {
147
+ this.emit('device:updated', device);
148
+ }
149
+ }
150
+ /**
151
+ * Fetch and parse device description XML
152
+ */
153
+ async fetchDeviceDescription(device) {
154
+ try {
155
+ const response = await fetch(device.location, {
156
+ signal: AbortSignal.timeout(5000),
157
+ });
158
+ if (!response.ok) {
159
+ return;
160
+ }
161
+ const xml = await response.text();
162
+ device.description = this.parseDeviceDescription(xml);
163
+ }
164
+ catch {
165
+ // Ignore fetch errors
166
+ }
167
+ }
168
+ /**
169
+ * Parse UPnP device description XML
170
+ */
171
+ parseDeviceDescription(xml) {
172
+ const getTagContent = (tag, source = xml) => {
173
+ const regex = new RegExp(`<${tag}[^>]*>([^<]*)</${tag}>`, 'i');
174
+ const match = source.match(regex);
175
+ return match?.[1]?.trim() ?? '';
176
+ };
177
+ const getTagBlock = (tag, source = xml) => {
178
+ const regex = new RegExp(`<${tag}[^>]*>([\\s\\S]*?)</${tag}>`, 'i');
179
+ const match = source.match(regex);
180
+ return match?.[1] ?? '';
181
+ };
182
+ // Parse services
183
+ const services = [];
184
+ const serviceListBlock = getTagBlock('serviceList');
185
+ const serviceMatches = serviceListBlock.match(/<service>[\s\S]*?<\/service>/gi) || [];
186
+ for (const serviceXml of serviceMatches) {
187
+ services.push({
188
+ serviceType: getTagContent('serviceType', serviceXml),
189
+ serviceId: getTagContent('serviceId', serviceXml),
190
+ SCPDURL: getTagContent('SCPDURL', serviceXml),
191
+ controlURL: getTagContent('controlURL', serviceXml),
192
+ eventSubURL: getTagContent('eventSubURL', serviceXml),
193
+ });
194
+ }
195
+ // Parse icons
196
+ const icons = [];
197
+ const iconListBlock = getTagBlock('iconList');
198
+ const iconMatches = iconListBlock.match(/<icon>[\s\S]*?<\/icon>/gi) || [];
199
+ for (const iconXml of iconMatches) {
200
+ icons.push({
201
+ mimetype: getTagContent('mimetype', iconXml),
202
+ width: parseInt(getTagContent('width', iconXml)) || 0,
203
+ height: parseInt(getTagContent('height', iconXml)) || 0,
204
+ depth: parseInt(getTagContent('depth', iconXml)) || 0,
205
+ url: getTagContent('url', iconXml),
206
+ });
207
+ }
208
+ return {
209
+ deviceType: getTagContent('deviceType'),
210
+ friendlyName: getTagContent('friendlyName'),
211
+ manufacturer: getTagContent('manufacturer'),
212
+ manufacturerURL: getTagContent('manufacturerURL') || undefined,
213
+ modelDescription: getTagContent('modelDescription') || undefined,
214
+ modelName: getTagContent('modelName'),
215
+ modelNumber: getTagContent('modelNumber') || undefined,
216
+ modelURL: getTagContent('modelURL') || undefined,
217
+ serialNumber: getTagContent('serialNumber') || undefined,
218
+ UDN: getTagContent('UDN'),
219
+ services,
220
+ icons: icons.length > 0 ? icons : undefined,
221
+ };
222
+ }
223
+ /**
224
+ * Make a UPnP SOAP request
225
+ */
226
+ async soapRequest(controlUrl, serviceType, action, args = {}) {
227
+ // Build SOAP body
228
+ let argsXml = '';
229
+ for (const [key, value] of Object.entries(args)) {
230
+ argsXml += `<${key}>${value}</${key}>`;
231
+ }
232
+ const soapBody = `<?xml version="1.0" encoding="utf-8"?>
233
+ <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
234
+ <s:Body>
235
+ <u:${action} xmlns:u="${serviceType}">
236
+ ${argsXml}
237
+ </u:${action}>
238
+ </s:Body>
239
+ </s:Envelope>`;
240
+ const response = await fetch(controlUrl, {
241
+ method: 'POST',
242
+ headers: {
243
+ 'Content-Type': 'text/xml; charset=utf-8',
244
+ 'SOAPACTION': `"${serviceType}#${action}"`,
245
+ },
246
+ body: soapBody,
247
+ signal: AbortSignal.timeout(10000),
248
+ });
249
+ if (!response.ok) {
250
+ throw new Error(`SOAP request failed: ${response.status}`);
251
+ }
252
+ return response.text();
253
+ }
254
+ }
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY292ZXJ5LmNsYXNzZXMuc3NkcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2Rpc2NvdmVyeS9kaXNjb3ZlcnkuY2xhc3Nlcy5zc2RwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBRXpDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsY0FBYztJQUNkLElBQUksRUFBRSxpQkFBaUI7SUFFdkIsZUFBZTtJQUNmLGNBQWMsRUFBRSw2Q0FBNkM7SUFDN0QsWUFBWSxFQUFFLDJDQUEyQztJQUV6RCxRQUFRO0lBQ1IsaUJBQWlCLEVBQUUsMENBQTBDO0lBRTdELFVBQVU7SUFDVixZQUFZLEVBQUUscUNBQXFDO0lBQ25ELGdCQUFnQixFQUFFLHFEQUFxRDtDQUN4RSxDQUFDO0FBd0RGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWMsU0FBUSxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVk7SUFDcEQsTUFBTSxHQUF3RCxJQUFJLENBQUM7SUFDbkUsT0FBTyxHQUE2QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzlDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsY0FBYyxHQUEwQixJQUFJLENBQUM7SUFFckQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBdUI7UUFDeEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUU1Qyx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsT0FB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
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Device Factory Functions
3
+ * Create UniversalDevice instances with appropriate features
4
+ */
5
+ import { UniversalDevice } from '../device/device.classes.device.js';
6
+ import { ScanFeature } from '../features/feature.scan.js';
7
+ import { PrintFeature } from '../features/feature.print.js';
8
+ import { PlaybackFeature } from '../features/feature.playback.js';
9
+ import { VolumeFeature } from '../features/feature.volume.js';
10
+ import { PowerFeature } from '../features/feature.power.js';
11
+ import { SnmpFeature } from '../features/feature.snmp.js';
12
+ import type { TScannerProtocol, IRetryOptions } from '../interfaces/index.js';
13
+ export interface IScannerDiscoveryInfo {
14
+ id: string;
15
+ name: string;
16
+ address: string;
17
+ port: number;
18
+ protocol: TScannerProtocol | 'ipp';
19
+ txtRecords: Record<string, string>;
20
+ }
21
+ /**
22
+ * Create a scanner device (UniversalDevice with ScanFeature)
23
+ */
24
+ export declare function createScanner(info: IScannerDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
25
+ export interface IPrinterDiscoveryInfo {
26
+ id: string;
27
+ name: string;
28
+ address: string;
29
+ port: number;
30
+ txtRecords: Record<string, string>;
31
+ }
32
+ /**
33
+ * Create a printer device (UniversalDevice with PrintFeature)
34
+ */
35
+ export declare function createPrinter(info: IPrinterDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
36
+ export interface ISnmpDiscoveryInfo {
37
+ id: string;
38
+ name: string;
39
+ address: string;
40
+ port: number;
41
+ community?: string;
42
+ }
43
+ /**
44
+ * Create an SNMP device (UniversalDevice with SnmpFeature)
45
+ */
46
+ export declare function createSnmpDevice(info: ISnmpDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
47
+ export interface IUpsDiscoveryInfo {
48
+ id: string;
49
+ name: string;
50
+ address: string;
51
+ port: number;
52
+ protocol: 'nut' | 'snmp';
53
+ upsName?: string;
54
+ community?: string;
55
+ }
56
+ /**
57
+ * Create a UPS device (UniversalDevice with PowerFeature)
58
+ */
59
+ export declare function createUpsDevice(info: IUpsDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
60
+ export interface ISpeakerDiscoveryInfo {
61
+ id: string;
62
+ name: string;
63
+ address: string;
64
+ port: number;
65
+ protocol: 'sonos' | 'airplay' | 'chromecast' | 'dlna';
66
+ roomName?: string;
67
+ modelName?: string;
68
+ features?: number;
69
+ deviceId?: string;
70
+ friendlyName?: string;
71
+ }
72
+ /**
73
+ * Create a speaker device (UniversalDevice with PlaybackFeature and VolumeFeature)
74
+ */
75
+ export declare function createSpeaker(info: ISpeakerDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
76
+ export interface IDlnaRendererDiscoveryInfo {
77
+ id: string;
78
+ name: string;
79
+ address: string;
80
+ port: number;
81
+ controlUrl: string;
82
+ friendlyName: string;
83
+ modelName?: string;
84
+ manufacturer?: string;
85
+ }
86
+ /**
87
+ * Create a DLNA renderer device (UniversalDevice with PlaybackFeature)
88
+ */
89
+ export declare function createDlnaRenderer(info: IDlnaRendererDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
90
+ import { SwitchFeature } from '../features/feature.switch.js';
91
+ import { SensorFeature } from '../features/feature.sensor.js';
92
+ import { LightFeature } from '../features/feature.light.js';
93
+ import { CoverFeature } from '../features/feature.cover.js';
94
+ import { LockFeature } from '../features/feature.lock.js';
95
+ import { FanFeature } from '../features/feature.fan.js';
96
+ import { ClimateFeature } from '../features/feature.climate.js';
97
+ import { CameraFeature } from '../features/feature.camera.js';
98
+ import type { TSwitchProtocol, TSensorProtocol, TLightProtocol, TCoverProtocol, TLockProtocol, TFanProtocol, TClimateProtocol, TCameraProtocol, ISwitchProtocolClient, ISensorProtocolClient, ILightProtocolClient, ICoverProtocolClient, ILockProtocolClient, IFanProtocolClient, IClimateProtocolClient, ICameraProtocolClient, ILightCapabilities, ICoverCapabilities, IFanCapabilities, IClimateCapabilities, ICameraCapabilities, TSensorDeviceClass, TSensorStateClass, TCoverDeviceClass } from '../interfaces/smarthome.interfaces.js';
99
+ export interface ISmartSwitchDiscoveryInfo {
100
+ id: string;
101
+ name: string;
102
+ address: string;
103
+ port: number;
104
+ entityId: string;
105
+ protocol: TSwitchProtocol;
106
+ protocolClient: ISwitchProtocolClient;
107
+ deviceClass?: 'outlet' | 'switch';
108
+ }
109
+ export declare function createSmartSwitch(info: ISmartSwitchDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
110
+ export interface ISmartSensorDiscoveryInfo {
111
+ id: string;
112
+ name: string;
113
+ address: string;
114
+ port: number;
115
+ entityId: string;
116
+ protocol: TSensorProtocol;
117
+ protocolClient: ISensorProtocolClient;
118
+ deviceClass?: TSensorDeviceClass;
119
+ stateClass?: TSensorStateClass;
120
+ unit?: string;
121
+ }
122
+ export declare function createSmartSensor(info: ISmartSensorDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
123
+ export interface ISmartLightDiscoveryInfo {
124
+ id: string;
125
+ name: string;
126
+ address: string;
127
+ port: number;
128
+ entityId: string;
129
+ protocol: TLightProtocol;
130
+ protocolClient: ILightProtocolClient;
131
+ capabilities?: Partial<ILightCapabilities>;
132
+ }
133
+ export declare function createSmartLight(info: ISmartLightDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
134
+ export interface ISmartCoverDiscoveryInfo {
135
+ id: string;
136
+ name: string;
137
+ address: string;
138
+ port: number;
139
+ entityId: string;
140
+ protocol: TCoverProtocol;
141
+ protocolClient: ICoverProtocolClient;
142
+ deviceClass?: TCoverDeviceClass;
143
+ capabilities?: Partial<ICoverCapabilities>;
144
+ }
145
+ export declare function createSmartCover(info: ISmartCoverDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
146
+ export interface ISmartLockDiscoveryInfo {
147
+ id: string;
148
+ name: string;
149
+ address: string;
150
+ port: number;
151
+ entityId: string;
152
+ protocol: TLockProtocol;
153
+ protocolClient: ILockProtocolClient;
154
+ supportsOpen?: boolean;
155
+ }
156
+ export declare function createSmartLock(info: ISmartLockDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
157
+ export interface ISmartFanDiscoveryInfo {
158
+ id: string;
159
+ name: string;
160
+ address: string;
161
+ port: number;
162
+ entityId: string;
163
+ protocol: TFanProtocol;
164
+ protocolClient: IFanProtocolClient;
165
+ capabilities?: Partial<IFanCapabilities>;
166
+ }
167
+ export declare function createSmartFan(info: ISmartFanDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
168
+ export interface ISmartClimateDiscoveryInfo {
169
+ id: string;
170
+ name: string;
171
+ address: string;
172
+ port: number;
173
+ entityId: string;
174
+ protocol: TClimateProtocol;
175
+ protocolClient: IClimateProtocolClient;
176
+ capabilities?: Partial<IClimateCapabilities>;
177
+ }
178
+ export declare function createSmartClimate(info: ISmartClimateDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
179
+ export interface ISmartCameraDiscoveryInfo {
180
+ id: string;
181
+ name: string;
182
+ address: string;
183
+ port: number;
184
+ entityId: string;
185
+ protocol: TCameraProtocol;
186
+ protocolClient: ICameraProtocolClient;
187
+ capabilities?: Partial<ICameraCapabilities>;
188
+ }
189
+ export declare function createSmartCamera(info: ISmartCameraDiscoveryInfo, retryOptions?: IRetryOptions): UniversalDevice;
190
+ export { UniversalDevice, ScanFeature, PrintFeature, PlaybackFeature, VolumeFeature, PowerFeature, SnmpFeature, SwitchFeature, SensorFeature, LightFeature, CoverFeature, LockFeature, FanFeature, ClimateFeature, CameraFeature, };