Add mock admin tools

This commit is contained in:
Adrian Jagielak 2025-07-22 00:51:14 +02:00
parent ba1be7766c
commit 5d687f90e6
No known key found for this signature in database
GPG Key ID: 0818CF7AF6C62BFB
3 changed files with 59 additions and 1 deletions

View File

@ -1,6 +1,6 @@
# https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config # https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config
name: Futurehome name: Futurehome
version: "0.0.12" version: "0.0.13"
slug: futurehome slug: futurehome
description: Local Futurehome Smarthub integration description: Local Futurehome Smarthub integration
url: "https://github.com/adrianjagielak/home-assistant-futurehome" url: "https://github.com/adrianjagielak/home-assistant-futurehome"

55
futurehome/src/admin.ts Normal file
View File

@ -0,0 +1,55 @@
import { MqttClient } from "mqtt";
import { v4 as uuid } from "uuid";
export function exposeSmarthubTools(
ha: MqttClient,
fimp: MqttClient,
hubAddr = "pt:j1/mt:cmd/rt:app/rn:zb/ad:1"
) {
const base = "homeassistant/switch/fh_zb_pairing";
const device = {
identifiers: ["futurehome_hub"],
name: "Futurehome Hub",
model: "Smarthub",
};
ha.publish(
`${base}/config`,
JSON.stringify({
name: "Zigbee Pairing",
uniq_id: "fh_zb_pairing",
cmd_t: `${base}/set`,
stat_t: `${base}/state`,
device,
}),
{ retain: true }
);
// // keep last known state locally
// let pairingOn = false;
ha.subscribe(`${base}/set`);
ha.on("message", (topic, payload) => {
if (topic !== `${base}/set`) return;
const turnOn = payload.toString() === "ON";
// // optimistic update so the UI flips instantly
// pairingOn = turnOn;
ha.publish(`${base}/state`, turnOn ? "ON" : "OFF", { retain: true });
// placeholder FIMP message adjust to real API if different
fimp.publish(
hubAddr,
JSON.stringify({
type: "cmd.pairing_mode.set",
service: "zigbee",
uid: uuid(),
val_t: "str",
val: turnOn ? "start" : "stop",
}),
{ qos: 1 }
);
});
// (optional) listen for hub-side confirmation and correct state here
}

View File

@ -1,6 +1,7 @@
import { v4 as uuid } from "uuid"; import { v4 as uuid } from "uuid";
import { connectHub, connectHA } from "./client"; import { connectHub, connectHA } from "./client";
import { publishDiscovery } from "./discovery"; import { publishDiscovery } from "./discovery";
import { exposeSmarthubTools } from "./admin";
(async () => { (async () => {
const hubIp = process.env.FH_HUB_IP || ""; const hubIp = process.env.FH_HUB_IP || "";
@ -30,6 +31,8 @@ import { publishDiscovery } from "./discovery";
const fimp = await connectHub({ hubIp, username: hubUsername, password: hubPassword }); const fimp = await connectHub({ hubIp, username: hubUsername, password: hubPassword });
console.log("Connected to Futurehome hub"); console.log("Connected to Futurehome hub");
exposeSmarthubTools(ha, fimp);
// -- subscribe to FIMP events ----------------------------------------- // -- subscribe to FIMP events -----------------------------------------
fimp.subscribe("#"); fimp.subscribe("#");
fimp.on("message", (topic, buf) => { fimp.on("message", (topic, buf) => {