Update demo mode fake state handling

This commit is contained in:
Adrian Jagielak 2025-07-25 16:03:41 +02:00
parent 60b116fd97
commit d68aa6adca
No known key found for this signature in database
GPG Key ID: 0818CF7AF6C62BFB
4 changed files with 25 additions and 10 deletions

View File

@ -5,6 +5,7 @@
- Added support for 'media_player' service.
- Removed demo mode 'optimistic' override causing switches to look weird.
- Updated demo mode fake state handling.
## 0.1.3 (25.07.2025)

View File

@ -164,7 +164,7 @@ address: "${address}",
service: "${service}",
uid: "${uid}",
cmd: "${cmd}",
val: "${JSON.stringify(val)}",
val: ${JSON.stringify(val)},
val_t: "${val_t}"
`);

View File

@ -273,10 +273,10 @@ export function haUpdateStateValueReport(parameters: {
attrName: string;
}) {
// Strip the FIMP envelope so we end up with "/rt:dev/…/ad:x_y"
const sensorAddr = parameters.topic.replace(/^pt:j1\/mt:evt/, '');
const addr = parameters.topic.replace(/^pt:j1\/mt:evt/, '');
for (const [stateTopic, payload] of Object.entries(haStateCache)) {
if (!payload[sensorAddr]) continue;
if (!payload[addr]) continue;
// Check if the new value has a type property
if (
@ -289,7 +289,7 @@ export function haUpdateStateValueReport(parameters: {
const { type: _, ...valueWithoutType } = parameters.value;
// Get current attribute value
const currentAttrValue = payload[sensorAddr][parameters.attrName];
const currentAttrValue = payload[addr][parameters.attrName];
if (
currentAttrValue &&
@ -297,23 +297,23 @@ export function haUpdateStateValueReport(parameters: {
!Array.isArray(currentAttrValue)
) {
// Current value is already a type map, update the specific type
payload[sensorAddr][parameters.attrName] = {
payload[addr][parameters.attrName] = {
...currentAttrValue,
[type]: valueWithoutType,
};
} else {
// Current value is not a type map, convert it to one
payload[sensorAddr][parameters.attrName] = {
payload[addr][parameters.attrName] = {
[type]: valueWithoutType,
};
}
} else {
// Handle regular value update (non-typed)
payload[sensorAddr][parameters.attrName] = parameters.value;
payload[addr][parameters.attrName] = parameters.value;
}
log.debug(
`Publishing updated sensor value for "${sensorAddr}" to "${stateTopic}"`,
`Publishing updated state value for "${addr}" to "${stateTopic}"`,
);
ha?.publish(stateTopic, JSON.stringify(payload), { retain: true, qos: 2 });

View File

@ -40,14 +40,17 @@ export class DemoFimpMqttClient implements IMqttClient {
qos: 0 | 1 | 2;
},
): void {
const responseTopic = topic.replace(/^pt:j1\/mt:cmd/, 'pt:j1/mt:evt');
setTimeout(() => {
const msg = JSON.parse(value);
const sendResponse = (response: FimpResponse) => {
response.corid = response.corid ?? msg.uid;
response.serv = response.serv ?? msg.serv;
const buffer = Buffer.from(JSON.stringify(response));
for (const handler of this.messageHandlers) {
handler(topic, buffer, { retain: false } as any);
handler(responseTopic, buffer, { retain: false } as any);
}
};
@ -78,10 +81,21 @@ export class DemoFimpMqttClient implements IMqttClient {
type: 'evt.pd7.response',
val: { param: { state: { devices: demo_data__state } } },
});
} else if (
msg.type.split('.').length === 3 &&
msg.type.split('.')[0] === 'cmd' &&
msg.type.split('.')[2] === 'set'
) {
sendResponse({
type: `evt.${msg.type.split('.')[1]}.report`,
val: msg.val,
val_t: msg.val_t,
props: msg.props,
});
} else {
sendResponse({});
}
}, 100);
}, 300);
}
on(event: 'message', handler: OnMessageCallback): void;