From 6473b076d5b13855e8ebfd0671b49bfc5d75a625 Mon Sep 17 00:00:00 2001 From: legop3 Date: Fri, 21 Nov 2025 01:45:29 -0500 Subject: [PATCH] fix home assistant lights --- server/package-lock.json | 7 +++++ server/package.json | 2 +- server/src/globals/io.js | 4 +++ server/src/services/homeAssistantService.js | 30 +++++++++++++++------ 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index c132c607..1569e9cc 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "bcrypt": "^6.0.0", "express": "^4.19.2", + "home-assistant-js-websocket": "^3.1.2", "js-yaml": "^4.1.1", "morgan": "^1.10.0", "socket.io": "^4.7.5", @@ -695,6 +696,12 @@ "node": ">= 0.4" } }, + "node_modules/home-assistant-js-websocket": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/home-assistant-js-websocket/-/home-assistant-js-websocket-3.1.2.tgz", + "integrity": "sha512-HzaJtuhufBkppfXerla5cJHSP8uXzLoSRV+XPCcYlOttiKzqLQHD3sPm2T9UHTHPPppy3jRZtaA86ISfH3GK/g==", + "license": "Apache-2.0" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", diff --git a/server/package.json b/server/package.json index ffe1694d..d20d0181 100644 --- a/server/package.json +++ b/server/package.json @@ -10,7 +10,7 @@ "dependencies": { "bcrypt": "^6.0.0", "express": "^4.19.2", - "home-assistant-js-websocket": "3.1.2", + "home-assistant-js-websocket": "^3.1.2", "js-yaml": "^4.1.1", "morgan": "^1.10.0", "socket.io": "^4.7.5", diff --git a/server/src/globals/io.js b/server/src/globals/io.js index 043d6d96..12e30a4d 100644 --- a/server/src/globals/io.js +++ b/server/src/globals/io.js @@ -5,4 +5,8 @@ const io = new SocketIOServer(httpServer, { cors: { origin: '*' }, }); +// Allow more service listeners without warnings. +io.sockets.setMaxListeners(30); +io.of('/').setMaxListeners(30); + module.exports = io; diff --git a/server/src/services/homeAssistantService.js b/server/src/services/homeAssistantService.js index f9263026..4cbb76e7 100644 --- a/server/src/services/homeAssistantService.js +++ b/server/src/services/homeAssistantService.js @@ -1,11 +1,6 @@ const EventEmitter = require('events'); const WebSocket = require('ws'); -const { - createConnection, - createLongLivedTokenAuth, - subscribeEntities, - callService, -} = require('home-assistant-js-websocket'); +const { createConnection, subscribeEntities, callService, Auth } = require('home-assistant-js-websocket'); const io = require('../globals/io'); const logger = require('../globals/logger').child('homeAssistantService'); const { loadConfig } = require('../helpers/configLoader'); @@ -29,6 +24,25 @@ let connected = false; const enabled = Boolean(haConfig?.url && haConfig?.token); +function buildAuth() { + const token = haConfig?.token?.trim(); + const url = haConfig?.url?.trim(); + if (!token || !url) { + throw new Error('Home Assistant url/token missing'); + } + // Long-lived tokens last 10 years; set a far future expiry to avoid refresh attempts. + return new Auth( + { + hassUrl: url.replace(/\/+$/, ''), + access_token: token, + expires: Date.now() + 1000 * 60 * 60 * 24 * 365 * 10, + refresh_token: null, + clientId: 'multiroomba-rover', + }, + null, + ); +} + function inferType(entityId, explicitType) { if (explicitType === 'light' || explicitType === 'switch') { return explicitType; @@ -161,8 +175,8 @@ async function connect() { return; } try { - const auth = await createLongLivedTokenAuth(haConfig.url, haConfig.token); - connection = await createConnection({ auth }); + const auth = buildAuth(); + connection = await createConnection({ auth, setupRetry: 0 }); connected = true; emitStatus(); logger.info('Connected to Home Assistant');