homebridge-viessmann-vicare 2.0.2 → 2.0.4
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.
- package/README.md +13 -1
- package/SETUP-GUIDE.md +1 -1
- package/dist/auth-manager.d.ts +28 -0
- package/dist/auth-manager.d.ts.map +1 -1
- package/dist/auth-manager.js +59 -9
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -263,7 +263,7 @@ npm install -g homebridge-viessmann-vicare
|
|
|
263
263
|
"maxDelay": 300000,
|
|
264
264
|
"maxConsecutiveErrors": 5,
|
|
265
265
|
"deviceUpdateDelay": 1000,
|
|
266
|
-
"userAgent": "homebridge-viessmann-vicare/2.0.
|
|
266
|
+
"userAgent": "homebridge-viessmann-vicare/2.0.4"
|
|
267
267
|
},
|
|
268
268
|
"debug": false
|
|
269
269
|
}
|
|
@@ -841,6 +841,18 @@ For issues and questions:
|
|
|
841
841
|
|
|
842
842
|
## 📈 Changelog
|
|
843
843
|
|
|
844
|
+
### [2.0.4] - 2025-10-06
|
|
845
|
+
**Added**
|
|
846
|
+
- ✨ `logEnvDiagnostics()` for better detection of graphical environment (X11, Wayland, systemd, headless).
|
|
847
|
+
- ✨ New fallback page `/login` for authentication via another device on the same LAN.
|
|
848
|
+
- ✨ Auto-authentication now supported even in headless environments (Raspberry Pi, systemd, Docker).
|
|
849
|
+
**Changed**
|
|
850
|
+
- ✨ Default `authMethod` is now `"auto"` in all examples and documentation.
|
|
851
|
+
- ✨ Improved resilience in `openBrowser()` on Linux with fallback to `xdg-open`, `gio`, and `xdg-desktop-portal`.
|
|
852
|
+
**Fixed**
|
|
853
|
+
- 🐛 Timeout and fallback flow now properly logged when auto-auth fails.
|
|
854
|
+
- 🐛 Documentation and setup guide reflect the new authentication behavior.
|
|
855
|
+
|
|
844
856
|
### v2.0.0
|
|
845
857
|
- ✨ **Major Release**: Complete rewrite with advanced features
|
|
846
858
|
- ✨ **Complete Localization Support**: Custom names for all accessories in any language
|
package/SETUP-GUIDE.md
CHANGED
package/dist/auth-manager.d.ts
CHANGED
|
@@ -45,6 +45,33 @@ export declare class AuthManager {
|
|
|
45
45
|
private clearStoredTokens;
|
|
46
46
|
private scheduleTokenRefresh;
|
|
47
47
|
authenticate(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
private shouldUseManualAuth(): boolean {
|
|
50
|
+
if (this.config.authMethod === 'manual') {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Check if we're in a headless environment
|
|
55
|
+
if (!process.env.DISPLAY && process.platform === 'linux') {
|
|
56
|
+
this.log.debug('🖥️ Detected headless Linux environment, using manual auth');
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Check if we're in Docker
|
|
61
|
+
if (process.env.DOCKER || process.env.CONTAINER) {
|
|
62
|
+
this.log.debug('🐳 Detected container environment, using manual auth');
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Check if we're running as a service (systemd)
|
|
67
|
+
if (process.env.SYSTEMD_EXEC_PID || process.env.INVOCATION_ID) {
|
|
68
|
+
this.log.debug('⚙️ Detected systemd service environment, using manual auth');
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
**/
|
|
48
75
|
private shouldUseManualAuth;
|
|
49
76
|
private performAutoAuth;
|
|
50
77
|
private handleManualAuth;
|
|
@@ -102,6 +129,7 @@ export declare class AuthManager {
|
|
|
102
129
|
scope?: string;
|
|
103
130
|
issuedAt?: Date;
|
|
104
131
|
};
|
|
132
|
+
private logEnvDiagnostics;
|
|
105
133
|
cleanup(): void;
|
|
106
134
|
}
|
|
107
135
|
//# sourceMappingURL=auth-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../src/auth-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,aAAa,EAAiB,MAAM,OAAO,CAAC;AAOrD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAkBD,qBAAa,WAAW;IAuBpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAzBzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuD;IAC/E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAG1C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAW;IAEpD,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,WAAW,CAAC,CAAiB;IACrC,OAAO,CAAC,iBAAiB,CAAC,CAAiB;gBAGxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,aAAa,EACzB,MAAM,EAAE,MAAM;IAajC,OAAO,CAAC,yBAAyB;IAiCjC,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,gBAAgB;IA0CxB,OAAO,CAAC,UAAU;IAkDlB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,oBAAoB;IAgCf,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../src/auth-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/auth-manager.js
CHANGED
|
@@ -275,6 +275,7 @@ class AuthManager {
|
|
|
275
275
|
}
|
|
276
276
|
async authenticate() {
|
|
277
277
|
try {
|
|
278
|
+
this.logEnvDiagnostics();
|
|
278
279
|
if (this.isTokenValid()) {
|
|
279
280
|
this.log.debug('✅ Using existing valid token');
|
|
280
281
|
return;
|
|
@@ -292,11 +293,24 @@ class AuthManager {
|
|
|
292
293
|
}
|
|
293
294
|
// Determine authentication method
|
|
294
295
|
const authMethod = this.config.authMethod || 'auto';
|
|
296
|
+
/**
|
|
295
297
|
if (authMethod === 'manual' || this.shouldUseManualAuth()) {
|
|
298
|
+
await this.handleManualAuth();
|
|
299
|
+
} else {
|
|
300
|
+
await this.performAutoAuth();
|
|
301
|
+
}
|
|
302
|
+
**/
|
|
303
|
+
if (authMethod === 'manual') {
|
|
296
304
|
await this.handleManualAuth();
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
// Prova sempre l'auto-auth; se fallisce, fallback a manual
|
|
308
|
+
try {
|
|
309
|
+
await this.performAutoAuth(); // avvia server di callback + openBrowser()
|
|
297
310
|
}
|
|
298
|
-
|
|
299
|
-
|
|
311
|
+
catch (e) {
|
|
312
|
+
this.log.warn('⚠️ Auto auth failed, falling back to manual:', e instanceof Error ? e.message : String(e));
|
|
313
|
+
await this.handleManualAuth();
|
|
300
314
|
}
|
|
301
315
|
}
|
|
302
316
|
catch (error) {
|
|
@@ -304,25 +318,48 @@ class AuthManager {
|
|
|
304
318
|
throw error;
|
|
305
319
|
}
|
|
306
320
|
}
|
|
307
|
-
|
|
321
|
+
/**
|
|
322
|
+
private shouldUseManualAuth(): boolean {
|
|
308
323
|
if (this.config.authMethod === 'manual') {
|
|
309
|
-
|
|
324
|
+
return true;
|
|
310
325
|
}
|
|
326
|
+
|
|
311
327
|
// Check if we're in a headless environment
|
|
312
328
|
if (!process.env.DISPLAY && process.platform === 'linux') {
|
|
313
|
-
|
|
314
|
-
|
|
329
|
+
this.log.debug('🖥️ Detected headless Linux environment, using manual auth');
|
|
330
|
+
return true;
|
|
315
331
|
}
|
|
332
|
+
|
|
316
333
|
// Check if we're in Docker
|
|
317
334
|
if (process.env.DOCKER || process.env.CONTAINER) {
|
|
318
|
-
|
|
319
|
-
|
|
335
|
+
this.log.debug('🐳 Detected container environment, using manual auth');
|
|
336
|
+
return true;
|
|
320
337
|
}
|
|
338
|
+
|
|
321
339
|
// Check if we're running as a service (systemd)
|
|
322
340
|
if (process.env.SYSTEMD_EXEC_PID || process.env.INVOCATION_ID) {
|
|
323
|
-
|
|
341
|
+
this.log.debug('⚙️ Detected systemd service environment, using manual auth');
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
**/
|
|
348
|
+
shouldUseManualAuth() {
|
|
349
|
+
// Rispetta la scelta esplicita dell’utente
|
|
350
|
+
if (this.config.authMethod === 'manual') {
|
|
351
|
+
this.log.debug('🔧 Auth method explicitly set to "manual" in config.');
|
|
324
352
|
return true;
|
|
325
353
|
}
|
|
354
|
+
// Diagnostica non-bloccante: non forziamo più il manual in headless/systemd/container
|
|
355
|
+
const isHeadlessLinux = (process.platform === 'linux' && !process.env.DISPLAY);
|
|
356
|
+
const isContainer = !!(process.env.DOCKER || process.env.CONTAINER);
|
|
357
|
+
const isSystemd = !!(process.env.SYSTEMD_EXEC_PID || process.env.INVOCATION_ID);
|
|
358
|
+
if (isHeadlessLinux || isContainer || isSystemd) {
|
|
359
|
+
this.log.debug(`ℹ️ Environment detected (headlessLinux=${isHeadlessLinux}, container=${isContainer}, systemd=${isSystemd}) — ` +
|
|
360
|
+
'proceeding with AUTO auth first; will fallback to MANUAL if AUTO fails.');
|
|
361
|
+
}
|
|
362
|
+
// Di default tentiamo sempre AUTO
|
|
326
363
|
return false;
|
|
327
364
|
}
|
|
328
365
|
async performAutoAuth() {
|
|
@@ -717,6 +754,19 @@ class AuthManager {
|
|
|
717
754
|
issuedAt: this.tokenIssuedAt ? new Date(this.tokenIssuedAt) : undefined
|
|
718
755
|
};
|
|
719
756
|
}
|
|
757
|
+
logEnvDiagnostics() {
|
|
758
|
+
const env = process.env;
|
|
759
|
+
this.log.warn([
|
|
760
|
+
'🧪 ENV DIAGNOSTICS',
|
|
761
|
+
`platform=${process.platform}`,
|
|
762
|
+
`DISPLAY=${env.DISPLAY ?? '(unset)'}`,
|
|
763
|
+
`WAYLAND_DISPLAY=${env.WAYLAND_DISPLAY ?? '(unset)'}`,
|
|
764
|
+
`XDG_RUNTIME_DIR=${env.XDG_RUNTIME_DIR ?? '(unset)'}`,
|
|
765
|
+
`DBUS_SESSION_BUS_ADDRESS=${env.DBUS_SESSION_BUS_ADDRESS ? '(set)' : '(unset)'}`,
|
|
766
|
+
`SYSTEMD_EXEC_PID=${env.SYSTEMD_EXEC_PID ? '(set)' : '(unset)'}`,
|
|
767
|
+
`INVOCATION_ID=${env.INVOCATION_ID ? '(set)' : '(unset)'}`
|
|
768
|
+
].join(' | '));
|
|
769
|
+
}
|
|
720
770
|
cleanup() {
|
|
721
771
|
if (this.tokenRefreshTimer) {
|
|
722
772
|
clearTimeout(this.tokenRefreshTimer);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-viessmann-vicare",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"description": "Complete Homebridge plugin for Viessmann ViCare heating systems with full control capabilities, advanced rate limiting protection, and intelligent cache management",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -58,4 +58,4 @@
|
|
|
58
58
|
"type": "individual",
|
|
59
59
|
"url": "https://github.com/sponsors/diegoweb100"
|
|
60
60
|
}
|
|
61
|
-
}
|
|
61
|
+
}
|