fix(hassio): Perpetual connecting (#75)

* fix(service_sse): Fixed connecting state not updating.

* fix(shortcut*): Changed shortcuts to use the clean URL.

* chore(plugin): Bumped version to 2.0.2
This commit is contained in:
Artur
2026-07-21 17:06:00 -04:00
committed by GitHub
parent 6f41f03887
commit 32ab23c7cc
6 changed files with 41 additions and 9 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
id = "pozzoo/hassio"
name = "Home Assistant"
version = "2.0.1"
version = "2.0.2"
plugin_api = 4
author = "Pozzoo"
license = "MIT"
+12
View File
@@ -39,6 +39,7 @@ local retryCount = 0
local maxRetriesNotified = false
local suspended = false
local connectionRequestInFlight = false
local connectingSince = nil
local function getCleanToken()
if type(haToken) ~= "string" then return "" end
@@ -214,8 +215,10 @@ end
local function fetchInitialStates()
if not isConfigured() or suspended or connectionRequestInFlight then return end
connectionRequestInFlight = true
connectingSince = os.clock()
local launched = haRequest("/api/states", "GET", nil, function(res)
connectionRequestInFlight = false
connectingSince = nil
if not res.body or res.body == "" then
noctalia.log("Empty response body from /api/states")
@@ -287,6 +290,7 @@ local function fetchInitialStates()
if not launched then
connectionRequestInFlight = false
connectingSince = nil
status = "disconnected"
noctalia.state.set("connection_status", status)
syncUpdateInterval()
@@ -396,6 +400,14 @@ function update()
return
end
if status == "connecting" and connectingSince and (os.clock() - connectingSince) > 15 then
connectionRequestInFlight = false
connectingSince = nil
status = "disconnected"
noctalia.state.set("connection_status", status)
syncUpdateInterval()
end
if status == "disconnected" then
retryCount = retryCount + 1
if retryCount >= MAX_RECONNECT_RETRIES then
+7 -2
View File
@@ -14,6 +14,11 @@ local pendingTimerSeq = 0
local PENDING_TIMEOUT_SECONDS = 8
local render
local function getCleanUrl()
if type(haUrl) ~= "string" then return "" end
return (haUrl:gsub("/$", ""))
end
local function getCleanToken()
if type(haToken) ~= "string" then return "" end
return haToken:gsub("^%s+", ""):gsub("%s+$", "")
@@ -116,7 +121,7 @@ function onClick()
local entity = getEntity()
local cleanToken = getCleanToken()
if not entity or not haUrl or haUrl == "" or cleanToken == "" then return end
if not entity or getCleanUrl() == "" or cleanToken == "" then return end
local eid = entity.entity_id
if pendingToggle[eid] then return end
@@ -128,7 +133,7 @@ function onClick()
local encoded = noctalia.json.encode({ entity_id = eid })
noctalia.http({
url = haUrl .. "/api/services/" .. entity.domain .. "/toggle",
url = getCleanUrl() .. "/api/services/" .. entity.domain .. "/toggle",
method = "POST",
headers = {
"Authorization: Bearer " .. cleanToken,
+7 -2
View File
@@ -14,6 +14,11 @@ local pendingTimerSeq = 0
local PENDING_TIMEOUT_SECONDS = 8
local render
local function getCleanUrl()
if type(haUrl) ~= "string" then return "" end
return (haUrl:gsub("/$", ""))
end
local function getCleanToken()
if type(haToken) ~= "string" then return "" end
return haToken:gsub("^%s+", ""):gsub("%s+$", "")
@@ -116,7 +121,7 @@ function onClick()
local entity = getEntity()
local cleanToken = getCleanToken()
if not entity or not haUrl or haUrl == "" or cleanToken == "" then return end
if not entity or getCleanUrl() == "" or cleanToken == "" then return end
local eid = entity.entity_id
if pendingToggle[eid] then return end
@@ -128,7 +133,7 @@ function onClick()
local encoded = noctalia.json.encode({ entity_id = eid })
noctalia.http({
url = haUrl .. "/api/services/" .. entity.domain .. "/toggle",
url = getCleanUrl() .. "/api/services/" .. entity.domain .. "/toggle",
method = "POST",
headers = {
"Authorization: Bearer " .. cleanToken,
+7 -2
View File
@@ -14,6 +14,11 @@ local pendingTimerSeq = 0
local PENDING_TIMEOUT_SECONDS = 8
local render
local function getCleanUrl()
if type(haUrl) ~= "string" then return "" end
return (haUrl:gsub("/$", ""))
end
local function getCleanToken()
if type(haToken) ~= "string" then return "" end
return haToken:gsub("^%s+", ""):gsub("%s+$", "")
@@ -116,7 +121,7 @@ function onClick()
local entity = getEntity()
local cleanToken = getCleanToken()
if not entity or not haUrl or haUrl == "" or cleanToken == "" then return end
if not entity or getCleanUrl() == "" or cleanToken == "" then return end
local eid = entity.entity_id
if pendingToggle[eid] then return end
@@ -128,7 +133,7 @@ function onClick()
local encoded = noctalia.json.encode({ entity_id = eid })
noctalia.http({
url = haUrl .. "/api/services/" .. entity.domain .. "/toggle",
url = getCleanUrl() .. "/api/services/" .. entity.domain .. "/toggle",
method = "POST",
headers = {
"Authorization: Bearer " .. cleanToken,
+7 -2
View File
@@ -14,6 +14,11 @@ local pendingTimerSeq = 0
local PENDING_TIMEOUT_SECONDS = 8
local render
local function getCleanUrl()
if type(haUrl) ~= "string" then return "" end
return (haUrl:gsub("/$", ""))
end
local function getCleanToken()
if type(haToken) ~= "string" then return "" end
return haToken:gsub("^%s+", ""):gsub("%s+$", "")
@@ -116,7 +121,7 @@ function onClick()
local entity = getEntity()
local cleanToken = getCleanToken()
if not entity or not haUrl or haUrl == "" or cleanToken == "" then return end
if not entity or getCleanUrl() == "" or cleanToken == "" then return end
local eid = entity.entity_id
if pendingToggle[eid] then return end
@@ -128,7 +133,7 @@ function onClick()
local encoded = noctalia.json.encode({ entity_id = eid })
noctalia.http({
url = haUrl .. "/api/services/" .. entity.domain .. "/toggle",
url = getCleanUrl() .. "/api/services/" .. entity.domain .. "/toggle",
method = "POST",
headers = {
"Authorization: Bearer " .. cleanToken,