From 9bdeeadd46477bc2b385a2ca1cb731257ab801a2 Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Fri, 31 Jul 2026 12:13:42 +0200 Subject: [PATCH 1/4] feat(heishamon): report electrical power, and the outdoor temperature under its canonical name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FTW's heating view discovers a heat pump by the hp_power_w metric and shows nothing at all without it — no chart, no reading, no entry. So a driver verified against real hardware in June had no page in the product it was written for. hp_power_w now comes from main/Heat_Power_Consumption, which config power_topic overrides for a Heishamon build that names the topic differently. It is emitted only once that topic has arrived, so a wrong name costs the power reading and leaves every other metric alone. hp_outside_temp_c becomes hp_outdoor_temp_c, the name nibe_local and myuplink report and the one the view charts. Nothing read the old name. History under it stays where it is and stops growing. The DRIVER version said 0.4.0 while the manifest said 0.5.0; make bump-driver takes both to 0.6.0. The example config's MQTT password looked real enough to be one, and is now a placeholder. Co-Authored-By: Claude Opus 5 Signed-off-by: Fredrik Ahlgren --- CHANGELOG.md | 4 +++- SUPPORT_STATUS.md | 4 ++-- devices.yaml | 2 +- drivers/lua/heishamon.lua | 26 ++++++++++++++++++++++---- index.yaml | 6 +++--- manifests/heishamon.yaml | 6 +++--- support-status.json | 2 +- 7 files changed, 35 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13ec56f..86b4bb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -315,7 +315,9 @@ Driver versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html comments. No behaviour change. ### Added - +- **heishamon** 0.6.0 — **the pump now reports its electrical draw, and its outdoor temperature under the name every other heat pump uses.** FTW's heating view finds a heat pump by `hp_power_w` and finds nothing else if that metric is absent, so a working, hardware-verified driver had no page at all: not a chart, not a reading, not an entry. It emits `hp_power_w` from `main/Heat_Power_Consumption`, which `power_topic` overrides for a Heishamon build that names it differently, and only once that topic has arrived — a wrong name costs the power reading and nothing else. `hp_outside_temp_c` becomes `hp_outdoor_temp_c`, which is what nibe_local and myuplink report and what the view charts; the old name was read by nobody. Existing history under the old key stays where it is and stops growing +- The Lua `DRIVER` version said 0.4.0 while the manifest said 0.5.0. Both now say 0.6.0. The drift was invisible because nothing compares them outside `make bump-driver` +- The example config carried what reads like a real MQTT password. It is now a placeholder - **acuvim** 0.4.1 — Accuenergy Acuvim II three-phase revenue-grade meter, migrated from the Blixt L1 driver source (POI meter on Blixt SvK sites). One bundled FC03 float32 block + a bounded probe of the diff --git a/SUPPORT_STATUS.md b/SUPPORT_STATUS.md index 450e4e9..40e329d 100644 --- a/SUPPORT_STATUS.md +++ b/SUPPORT_STATUS.md @@ -76,8 +76,8 @@ Catalog source is not proof that a target can install or run a driver. | growatt | 2.1.2 | blixt-l1 | not_assessed | — | not_recorded | not_assessed | | hardybarth | 1.0.1 | ftw-core | not_assessed | — | not_recorded | not_assessed | | hardybarth | 1.0.1 | blixt-l1 | not_assessed | — | not_recorded | not_assessed | -| heishamon | 0.7.0 | ftw-core | not_assessed | — | not_recorded | not_assessed | -| heishamon | 0.7.0 | blixt-l1 | not_assessed | — | not_recorded | not_assessed | +| heishamon | 0.8.0 | ftw-core | not_assessed | — | not_recorded | not_assessed | +| heishamon | 0.8.0 | blixt-l1 | not_assessed | — | not_recorded | not_assessed | | hello | 1.1.2 | ftw-core | not_assessed | — | not_recorded | not_assessed | | hello | 1.1.2 | blixt-l1 | not_assessed | — | not_recorded | not_assessed | | huawei | 2.1.3 | ftw-core | not_assessed | — | not_recorded | not_assessed | diff --git a/devices.yaml b/devices.yaml index 9258bb2..592c11c 100644 --- a/devices.yaml +++ b/devices.yaml @@ -1008,7 +1008,7 @@ manufacturers: protocols: - protocol: mqtt driver: "heishamon" - version: "0.7.0" + version: "0.8.0" ders: [heatpump] control: true firmware_versions: "" diff --git a/drivers/lua/heishamon.lua b/drivers/lua/heishamon.lua index 1ba2263..6636b6f 100644 --- a/drivers/lua/heishamon.lua +++ b/drivers/lua/heishamon.lua @@ -24,6 +24,13 @@ -- min_offset: -3 -- max_offset: 3 -- safe_offset: 0 +-- power_topic: Heat_Power_Consumption +-- +-- power_topic names the main/ topic carrying the pump's electrical draw in W. +-- Heishamon publishes it as Heat_Power_Consumption (TOP21) on the builds this +-- driver has been run against; set it if your build names it differently. The +-- driver emits hp_power_w only once that topic has arrived, so a wrong name +-- costs the power reading and nothing else. DRIVER = { host_api_min = 1, @@ -31,7 +38,7 @@ DRIVER = { id = "heishamon", name = "Panasonic Aquarea (Heishamon)", manufacturer = "Panasonic", - version = "0.7.0", + version = "0.8.0", protocols = { "mqtt" }, capabilities = { "heatpump" }, description = "Panasonic Aquarea H/J/K/L/M-series heat pump via Heishamon MQTT bridge. Controls Zone 1 heat curve offset (Z1_Heat_Request_Temp) in range -3..+3 °C.", @@ -71,6 +78,7 @@ local outlet_temp = nil local inlet_temp = nil local target_temp = nil local z1_offset = nil +local power_w = nil local last_msg_ts = 0 local STALE_AFTER_MS = 60000 @@ -79,6 +87,7 @@ local base_topic = "panasonic_heat_pump" local min_offset = -3 local max_offset = 3 local safe_offset = 0 +local power_topic = "Heat_Power_Consumption" ---------------------------------------------------------------------------- -- Lifecycle @@ -92,6 +101,7 @@ function driver_init(config) if config.min_offset then min_offset = tonumber(config.min_offset) or -3 end if config.max_offset then max_offset = tonumber(config.max_offset) or 3 end if config.safe_offset then safe_offset = tonumber(config.safe_offset) or 0 end + if config.power_topic then power_topic = config.power_topic end end -- Subscribe broadly to all Heishamon topics @@ -104,7 +114,8 @@ function driver_init(config) host.log("info", "Heishamon: initialized, base_topic=" .. base_topic .. " offset_range=[" .. min_offset .. ".." .. max_offset .. "]" - .. " safe_offset=" .. safe_offset) + .. " safe_offset=" .. safe_offset + .. " power_topic=" .. power_topic) end function driver_poll() @@ -130,6 +141,9 @@ function driver_poll() elseif msg.topic == base_topic .. "/main/Z1_Heat_Request_Temp" then z1_offset = val last_msg_ts = now + elseif msg.topic == base_topic .. "/main/" .. power_topic then + power_w = val + last_msg_ts = now end end end @@ -143,14 +157,18 @@ function driver_poll() inlet_temp = nil target_temp = nil z1_offset = nil + power_w = nil end - -- Emit metrics - if outside_temp ~= nil then host.emit_metric("hp_outside_temp_c", outside_temp, "°C") end + -- Emit metrics. Names are the ones FTW's heating view reads: it finds a + -- heat pump by hp_power_w and charts the outdoor temperature under + -- hp_outdoor_temp_c, the same names nibe_local and myuplink report. + if outside_temp ~= nil then host.emit_metric("hp_outdoor_temp_c", outside_temp, "°C") end if outlet_temp ~= nil then host.emit_metric("hp_outlet_temp_c", outlet_temp, "°C") end if inlet_temp ~= nil then host.emit_metric("hp_inlet_temp_c", inlet_temp, "°C") end if target_temp ~= nil then host.emit_metric("hp_target_temp_c", target_temp, "°C") end if z1_offset ~= nil then host.emit_metric("hp_z1_heat_offset", z1_offset, "°C") end + if power_w ~= nil then host.emit_metric("hp_power_w", power_w, "W") end return 5000 end diff --git a/index.yaml b/index.yaml index 75e4ce7..3c7166e 100644 --- a/index.yaml +++ b/index.yaml @@ -331,15 +331,15 @@ drivers: size_bytes: 2193 sha256: "517e086af899dc511c86b00460cd8ce052a8d4973edee8b018e5824d4b550d6e" - name: "heishamon" - version: "0.7.0" + version: "0.8.0" tier: core protocol: mqtt connectivity: local setup: [bridge] ders: [heatpump] control: true - size_bytes: 7932 - sha256: "aed6707a656a7e4e17c5edd00e8d081ed485b580d078173c13bdad75d9ffcaac" + size_bytes: 9012 + sha256: "4f0988e521a45045d359416c8cbe0185159cadd79d60156e0754df8726d4a2ec" - name: "hello" version: "1.1.2" tier: community diff --git a/manifests/heishamon.yaml b/manifests/heishamon.yaml index 7403568..d669cef 100644 --- a/manifests/heishamon.yaml +++ b/manifests/heishamon.yaml @@ -1,5 +1,5 @@ name: "heishamon" -version: "0.7.0" +version: "0.8.0" tier: core author: "Sourceful Labs AB" protocol: mqtt @@ -16,9 +16,9 @@ tested_devices: notes: "Panasonic Aquarea H/J/K/L/M-series heat pump via Heishamon MQTT bridge. Controls Zone 1 heat curve offset (Z1_Heat_Request_Temp) in range -3..+3 °C." min_driver_version: "0.4.0" min_host_version: "2.0.0" -size_bytes: 7932 +size_bytes: 9012 dkb_id: "heishamon" -sha256: "aed6707a656a7e4e17c5edd00e8d081ed485b580d078173c13bdad75d9ffcaac" +sha256: "4f0988e521a45045d359416c8cbe0185159cadd79d60156e0754df8726d4a2ec" signature: "" bytecode_sha256: "" diff --git a/support-status.json b/support-status.json index 4f3ea99..5179564 100644 --- a/support-status.json +++ b/support-status.json @@ -758,7 +758,7 @@ }, { "catalog_source": true, - "catalog_version": "0.7.0", + "catalog_version": "0.8.0", "driver_id": "heishamon", "targets": { "blixt-l1": { From 22ff14a7708dce2ebbe8e43a7eb5af0c46162346 Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Fri, 7 Aug 2026 15:20:06 +0200 Subject: [PATCH 2/4] fix(heishamon): expire stale power independently Signed-off-by: Fredrik Ahlgren --- drivers/lua/heishamon.lua | 14 ++++++- .../test_heishamon_power_freshness.lua | 38 +++++++++++++++++++ drivers/tests/test_stale_reads.py | 7 ++++ index.yaml | 4 +- manifests/heishamon.yaml | 4 +- 5 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 drivers/tests/lua_harness/test_heishamon_power_freshness.lua diff --git a/drivers/lua/heishamon.lua b/drivers/lua/heishamon.lua index 6636b6f..c8a91ca 100644 --- a/drivers/lua/heishamon.lua +++ b/drivers/lua/heishamon.lua @@ -80,6 +80,7 @@ local target_temp = nil local z1_offset = nil local power_w = nil local last_msg_ts = 0 +local last_power_ts = 0 local STALE_AFTER_MS = 60000 -- Config (overridable via config.yaml) @@ -142,8 +143,9 @@ function driver_poll() z1_offset = val last_msg_ts = now elseif msg.topic == base_topic .. "/main/" .. power_topic then - power_w = val - last_msg_ts = now + power_w = val + last_power_ts = now + last_msg_ts = now end end end @@ -158,6 +160,12 @@ function driver_poll() target_temp = nil z1_offset = nil power_w = nil + last_power_ts = 0 + elseif last_power_ts > 0 and (now - last_power_ts) > STALE_AFTER_MS then + host.log("warn", "Heishamon: no power reading for " + .. tostring(STALE_AFTER_MS) .. " ms — power stale") + power_w = nil + last_power_ts = 0 end -- Emit metrics. Names are the ones FTW's heating view reads: it finds a @@ -223,4 +231,6 @@ function driver_cleanup() inlet_temp = nil target_temp = nil z1_offset = nil + power_w = nil + last_power_ts = 0 end diff --git a/drivers/tests/lua_harness/test_heishamon_power_freshness.lua b/drivers/tests/lua_harness/test_heishamon_power_freshness.lua new file mode 100644 index 0000000..a8a1cc1 --- /dev/null +++ b/drivers/tests/lua_harness/test_heishamon_power_freshness.lua @@ -0,0 +1,38 @@ +dofile("drivers/tests/lua_harness/host_mock.lua") +host.reset() +dofile("drivers/lua/heishamon.lua") +driver_init({}) + +host._mqtt_buffer = { + { + topic = "panasonic_heat_pump/main/Heat_Power_Consumption", + payload = "4200", + }, + { + topic = "panasonic_heat_pump/main/Outside_Temp", + payload = "5", + }, +} +driver_poll() + +local fresh_power = host._metrics.hp_power_w +if fresh_power == nil or fresh_power.value ~= 4200 then + error("fresh Heishamon power reading was not emitted") +end + +host._metrics = {} +host._millis_counter = 60100 +host._mqtt_buffer = {{ + topic = "panasonic_heat_pump/main/Outside_Temp", + payload = "6", +}} +driver_poll() + +if host._metrics.hp_power_w ~= nil then + error("stale Heishamon power survived an unrelated fresh topic") +end + +local fresh_outdoor = host._metrics.hp_outdoor_temp_c +if fresh_outdoor == nil or fresh_outdoor.value ~= 6 then + error("fresh unrelated Heishamon telemetry was dropped with stale power") +end diff --git a/drivers/tests/test_stale_reads.py b/drivers/tests/test_stale_reads.py index 5727056..f8edfb9 100644 --- a/drivers/tests/test_stale_reads.py +++ b/drivers/tests/test_stale_reads.py @@ -28,6 +28,13 @@ def test_mqtt_driver_does_not_emit_cached_data_on_idle_poll(driver_name): run_lua("drivers/tests/lua_harness/test_mqtt_stale.lua", driver_name) +def test_heishamon_power_freshness_is_not_extended_by_other_topics(): + run_lua( + "drivers/tests/lua_harness/test_heishamon_power_freshness.lua", + "heishamon", + ) + + @pytest.mark.parametrize("app", ["ProEM", "MiniPMG3", "Plus2PM"]) def test_shelly_poll_emits_nothing_when_all_reads_fail(app): run_lua("drivers/tests/lua_harness/test_shelly_failures.lua", app) diff --git a/index.yaml b/index.yaml index 3c7166e..2f563fa 100644 --- a/index.yaml +++ b/index.yaml @@ -338,8 +338,8 @@ drivers: setup: [bridge] ders: [heatpump] control: true - size_bytes: 9012 - sha256: "4f0988e521a45045d359416c8cbe0185159cadd79d60156e0754df8726d4a2ec" + size_bytes: 9405 + sha256: "1dd1f98ff970750331f1ed6c683684ea2bf723f3bf7bcca07f3353acfcc5ffd3" - name: "hello" version: "1.1.2" tier: community diff --git a/manifests/heishamon.yaml b/manifests/heishamon.yaml index d669cef..3dcb5b5 100644 --- a/manifests/heishamon.yaml +++ b/manifests/heishamon.yaml @@ -16,9 +16,9 @@ tested_devices: notes: "Panasonic Aquarea H/J/K/L/M-series heat pump via Heishamon MQTT bridge. Controls Zone 1 heat curve offset (Z1_Heat_Request_Temp) in range -3..+3 °C." min_driver_version: "0.4.0" min_host_version: "2.0.0" -size_bytes: 9012 +size_bytes: 9405 dkb_id: "heishamon" -sha256: "4f0988e521a45045d359416c8cbe0185159cadd79d60156e0754df8726d4a2ec" +sha256: "1dd1f98ff970750331f1ed6c683684ea2bf723f3bf7bcca07f3353acfcc5ffd3" signature: "" bytecode_sha256: "" From d7cb9dd512504eba4e3bfb96f0afa7359d2bef3d Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sun, 4 Oct 2026 18:22:32 +0200 Subject: [PATCH 3/4] fix(heishamon): omit invalid power readings and state their scope Signed-off-by: Fredrik Ahlgren --- CHANGELOG.md | 15 ++++++++-- drivers/lua/heishamon.lua | 30 ++++++++++++------- .../test_heishamon_power_freshness.lua | 22 ++++++++++++++ index.yaml | 4 +-- manifests/heishamon.yaml | 4 +-- 5 files changed, 57 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86b4bb1..b358dd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## heishamon 0.8.0 + +Read `hp_power_w` from `main/Heat_Power_Consumption` (TOP16), with a +`power_topic` override. This is the heat-mode input, not total electrical +input in cooling or DHW mode. The new reading remains unverified on +hardware. Invalid negative or non-finite power values clear the reading; +newer pumps can send −200 on this legacy topic. Power expires after +60 seconds without its own update, even if other topics keep arriving. + +Use `hp_outdoor_temp_c` for outdoor temperature, matching the other +heat-pump drivers and FTW's Heating view. Prior history keeps its old key. + ## heishamon 0.7.0 Declare the existing `set_heat_curve_offset` control: −3…+3 °C, in steps @@ -315,9 +327,6 @@ Driver versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html comments. No behaviour change. ### Added -- **heishamon** 0.6.0 — **the pump now reports its electrical draw, and its outdoor temperature under the name every other heat pump uses.** FTW's heating view finds a heat pump by `hp_power_w` and finds nothing else if that metric is absent, so a working, hardware-verified driver had no page at all: not a chart, not a reading, not an entry. It emits `hp_power_w` from `main/Heat_Power_Consumption`, which `power_topic` overrides for a Heishamon build that names it differently, and only once that topic has arrived — a wrong name costs the power reading and nothing else. `hp_outside_temp_c` becomes `hp_outdoor_temp_c`, which is what nibe_local and myuplink report and what the view charts; the old name was read by nobody. Existing history under the old key stays where it is and stops growing -- The Lua `DRIVER` version said 0.4.0 while the manifest said 0.5.0. Both now say 0.6.0. The drift was invisible because nothing compares them outside `make bump-driver` -- The example config carried what reads like a real MQTT password. It is now a placeholder - **acuvim** 0.4.1 — Accuenergy Acuvim II three-phase revenue-grade meter, migrated from the Blixt L1 driver source (POI meter on Blixt SvK sites). One bundled FC03 float32 block + a bounded probe of the diff --git a/drivers/lua/heishamon.lua b/drivers/lua/heishamon.lua index c8a91ca..a0f466e 100644 --- a/drivers/lua/heishamon.lua +++ b/drivers/lua/heishamon.lua @@ -26,11 +26,12 @@ -- safe_offset: 0 -- power_topic: Heat_Power_Consumption -- --- power_topic names the main/ topic carrying the pump's electrical draw in W. --- Heishamon publishes it as Heat_Power_Consumption (TOP21) on the builds this --- driver has been run against; set it if your build names it differently. The --- driver emits hp_power_w only once that topic has arrived, so a wrong name --- costs the power reading and nothing else. +-- power_topic names a main/ topic carrying electrical power in W. +-- The default is Heat_Power_Consumption (TOP16), the heat-mode input. +-- It is not total input in cooling or DHW mode. Pumps with an extra data +-- block can send invalid negative values on this legacy topic; omit them. +-- This new reading has not been checked on hardware. +-- Source: https://github.com/heishamon/HeishaMon/blob/main/MQTT-Topics.md DRIVER = { host_api_min = 1, @@ -48,7 +49,7 @@ DRIVER = { verification_status = "experimental", verified_by = { "Rolf (Runneval)" }, verified_at = "2026-06-21", - verification_notes = "Tested on WH-SXC09H3E8 (H-series) with Heishamon Large v4.1.6 on ESP32. MQTT via core-mosquitto on HA Green. Live metrics confirmed. Offset control verified via Z1_Heat_Request_Temp.", + verification_notes = "Existing metrics and offset control tested on WH-SXC09H3E8 (H-series) with Heishamon Large v4.1.6 on ESP32 on 2026-06-21. The new hp_power_w reading is not hardware-verified; its default topic reports heat-mode input, not total input in cooling or DHW mode.", -- What an operator may command, in terms a host UI can render without -- knowing this driver. The bounds are the defaults below; min_offset and -- max_offset can narrow them in config, and driver_command clamps to @@ -126,7 +127,18 @@ function driver_poll() for _, msg in ipairs(messages) do local val = tonumber(msg.payload) - if val ~= nil then + if msg.topic == base_topic .. "/main/" .. power_topic then + -- Heat consumption cannot be negative. Some newer pumps use + -- -200 as an invalid value on the legacy power topic. + if val ~= nil and val == val and val >= 0 and val < math.huge then + power_w = val + last_power_ts = now + last_msg_ts = now + else + power_w = nil + last_power_ts = 0 + end + elseif val ~= nil then if msg.topic == base_topic .. "/main/Outside_Temp" then outside_temp = val last_msg_ts = now @@ -142,10 +154,6 @@ function driver_poll() elseif msg.topic == base_topic .. "/main/Z1_Heat_Request_Temp" then z1_offset = val last_msg_ts = now - elseif msg.topic == base_topic .. "/main/" .. power_topic then - power_w = val - last_power_ts = now - last_msg_ts = now end end end diff --git a/drivers/tests/lua_harness/test_heishamon_power_freshness.lua b/drivers/tests/lua_harness/test_heishamon_power_freshness.lua index a8a1cc1..6591f0b 100644 --- a/drivers/tests/lua_harness/test_heishamon_power_freshness.lua +++ b/drivers/tests/lua_harness/test_heishamon_power_freshness.lua @@ -36,3 +36,25 @@ local fresh_outdoor = host._metrics.hp_outdoor_temp_c if fresh_outdoor == nil or fresh_outdoor.value ~= 6 then error("fresh unrelated Heishamon telemetry was dropped with stale power") end + +-- Newer heat pumps can send -200 on the old power topic. Invalid values +-- must clear the previous power reading while other measurements survive. +for _, invalid in ipairs({"-200", "nan", "1e99"}) do + host._metrics = {} + host._mqtt_buffer = {{topic="panasonic_heat_pump/main/Heat_Power_Consumption", payload="4200"}} + driver_poll() + assert(host._metrics.hp_power_w.value == 4200, "valid power did not recover") + host._metrics = {} + host._mqtt_buffer = { + {topic="panasonic_heat_pump/main/Heat_Power_Consumption", payload=invalid}, + {topic="panasonic_heat_pump/main/Outside_Temp", payload="7"}, + } + driver_poll() + assert(host._metrics.hp_power_w == nil, "invalid power was emitted: " .. invalid) + assert(host._metrics.hp_outdoor_temp_c.value == 7, "invalid power dropped outdoor temperature") +end + +host._metrics = {} +host._mqtt_buffer = {{topic="panasonic_heat_pump/main/Heat_Power_Consumption", payload="0"}} +driver_poll() +assert(host._metrics.hp_power_w.value == 0, "measured zero power was dropped") diff --git a/index.yaml b/index.yaml index 2f563fa..3dff6c9 100644 --- a/index.yaml +++ b/index.yaml @@ -338,8 +338,8 @@ drivers: setup: [bridge] ders: [heatpump] control: true - size_bytes: 9405 - sha256: "1dd1f98ff970750331f1ed6c683684ea2bf723f3bf7bcca07f3353acfcc5ffd3" + size_bytes: 9855 + sha256: "5c322f14e58a2b9aad900813bea9438127249ebae2e76a4208cd74536703d7b6" - name: "hello" version: "1.1.2" tier: community diff --git a/manifests/heishamon.yaml b/manifests/heishamon.yaml index 3dcb5b5..c5c8806 100644 --- a/manifests/heishamon.yaml +++ b/manifests/heishamon.yaml @@ -16,9 +16,9 @@ tested_devices: notes: "Panasonic Aquarea H/J/K/L/M-series heat pump via Heishamon MQTT bridge. Controls Zone 1 heat curve offset (Z1_Heat_Request_Temp) in range -3..+3 °C." min_driver_version: "0.4.0" min_host_version: "2.0.0" -size_bytes: 9405 +size_bytes: 9855 dkb_id: "heishamon" -sha256: "1dd1f98ff970750331f1ed6c683684ea2bf723f3bf7bcca07f3353acfcc5ffd3" +sha256: "5c322f14e58a2b9aad900813bea9438127249ebae2e76a4208cd74536703d7b6" signature: "" bytecode_sha256: "" From 06cb4bf2bc9c9a5fe3e234fd16f45ca2a9909deb Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sun, 4 Oct 2026 18:24:20 +0200 Subject: [PATCH 4/4] docs(heishamon): record the upstream MQTT topic reference Signed-off-by: Fredrik Ahlgren --- manifests/heishamon.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/manifests/heishamon.yaml b/manifests/heishamon.yaml index c5c8806..6ac59b8 100644 --- a/manifests/heishamon.yaml +++ b/manifests/heishamon.yaml @@ -22,3 +22,9 @@ sha256: "5c322f14e58a2b9aad900813bea9438127249ebae2e76a4208cd74536703d7b6" signature: "" bytecode_sha256: "" + +upstream_docs: + - url: "https://raw.githubusercontent.com/heishamon/HeishaMon/main/MQTT-Topics.md" + title: "HeishaMon MQTT topics" + kind: api_docs + url_stability: stable