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 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.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
@@ -967,7 +967,7 @@ When reporting issues, include:
967
967
 
968
968
  ```json
969
969
  {
970
- "plugin_version": "2.0.0",
970
+ "plugin_version": "2.0.4",
971
971
  "homebridge_version": "1.8.x",
972
972
  "node_version": "18.x.x",
973
973
  "heating_system": "Viessmann Model",
@@ -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":"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"}
1
+ {"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../src/auth-manager.ts"],"names":[],"mappings":"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"}
@@ -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
- else {
299
- await this.performAutoAuth();
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
- shouldUseManualAuth() {
321
+ /**
322
+ private shouldUseManualAuth(): boolean {
308
323
  if (this.config.authMethod === 'manual') {
309
- return true;
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
- this.log.debug('🖥️ Detected headless Linux environment, using manual auth');
314
- return true;
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
- this.log.debug('🐳 Detected container environment, using manual auth');
319
- return true;
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
- this.log.debug('⚙️ Detected systemd service environment, using manual auth');
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.2",
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
+ }