2025-07-21 22:29:32 +02:00

48 lines
1.6 KiB
TypeScript

import { MqttClient } from 'mqtt';
import { v4 as uuid } from 'uuid';
export function handleLvlSwitch(client: MqttClient, dev: any, svc: any) {
const uid = `fh_${dev.id}_${svc.name}`;
const base = `homeassistant/light/${uid}`;
client.publish(`${base}/config`, JSON.stringify({
name: dev.name,
uniq_id: uid,
cmd_t: `${base}/set`,
stat_t: `${base}/state`,
bri_cmd_t: `${base}/brightness/set`,
bri_stat_t: `${base}/brightness/state`,
schema: "template",
device: { identifiers: [dev.id.toString()], name: dev.name, model: dev.model }
}), { retain: true });
const bin = svc.attributes?.find((a: any) => a.name === 'binary')?.values?.[0]?.val;
const lvl = svc.attributes?.find((a: any) => a.name === 'lvl')?.values?.[0]?.val;
client.publish(`${base}/state`, bin ? "ON" : "OFF", { retain: true });
if (lvl !== undefined) client.publish(`${base}/brightness/state`, String(lvl), { retain: true });
client.subscribe([`${base}/set`, `${base}/brightness/set`]);
client.on('message', (topic, payload) => {
if (topic === `${base}/set`) {
const on = payload.toString() === 'ON';
client.publish(`pt:j1/mt:cmd/${svc.address}`, JSON.stringify({
type: "cmd.binary.set",
service: svc.name,
uid: uuid(),
val_t: "bool",
val: on
}), { qos: 1 });
} else if (topic === `${base}/brightness/set`) {
const value = parseInt(payload.toString(), 10);
client.publish(`pt:j1/mt:cmd/${svc.address}`, JSON.stringify({
type: "cmd.lvl.set",
service: svc.name,
uid: uuid(),
val_t: "int",
val: value
}), { qos: 1 });
}
});
}