diff --git a/futurehome/src/fimp/fimp.ts b/futurehome/src/fimp/fimp.ts index 3f207d5..cfe271d 100644 --- a/futurehome/src/fimp/fimp.ts +++ b/futurehome/src/fimp/fimp.ts @@ -17,10 +17,12 @@ export type FimpResponse = { type?: string | null; uid?: any; val?: any; - val_t?: string; + val_t?: FimpValueType; ver?: any; }; +type FimpValueType = 'string' | 'int' | 'float' | 'bool' | 'null' | 'str_array' | 'int_array' | 'float_array' | 'str_map' | 'int_map' | 'float_map' | 'bool_map' | 'object' | 'bin'; + export async function sendFimpMsg({ address, service, @@ -33,7 +35,7 @@ export async function sendFimpMsg({ service: string; cmd: string; val: unknown; - val_t: string; + val_t: FimpValueType; timeoutMs?: number; }): Promise { const uid = uuidv4(); @@ -121,13 +123,14 @@ export async function sendFimpMsg({ // } const hasValidType = msg.type != null && msg.type.startsWith('evt.'); - const msgParts = msg.type?.split('.') ?? []; - const cmdParts = cmd.split('.'); - const hasThreeParts = msgParts.length === 3 && cmdParts.length === 3; - const middlePartMatches = msgParts[1] === cmdParts[1]; - const endsWithLastPart = cmd.endsWith(msgParts.at(-1)!); + const reqCmdParts = cmd.split('.'); + const resCmdParts = msg.type?.split('.') ?? []; + const hasThreeParts = resCmdParts.length === 3 && reqCmdParts.length === 3; + const middlePartMatches = resCmdParts[1] === reqCmdParts[1]; + const endsWithLastPart = cmd.endsWith(resCmdParts.at(-1)!); + const reqEndsWithSetAndResEndsWithReport = reqCmdParts[2] === 'set' && resCmdParts[2] === 'report' const sameService = msg.serv === service; - if (hasValidType && hasThreeParts && middlePartMatches && endsWithLastPart && sameService) { + if (hasValidType && hasThreeParts && middlePartMatches && (endsWithLastPart || reqEndsWithSetAndResEndsWithReport) && sameService) { log.debug(`Received FIMP response for message ${uid} (matched using event name).`); clearTimeout(timeout); diff --git a/futurehome/src/fimp/vinculum_pd7_device.ts b/futurehome/src/fimp/vinculum_pd7_device.ts index 90936cb..98e72ef 100644 --- a/futurehome/src/fimp/vinculum_pd7_device.ts +++ b/futurehome/src/fimp/vinculum_pd7_device.ts @@ -6,7 +6,9 @@ export type VinculumPd7Device = { id: number, services?: any, type?: { + // User-defined device type (e.g. "sensor", "chargepoint", or "light") type?: string | null, + // User-defined device subtype (e.g. "presence" or "car_charger") subtype?: string | null, } | null, }; diff --git a/futurehome/src/ha/globals.ts b/futurehome/src/ha/globals.ts index 59cc3d8..605c046 100644 --- a/futurehome/src/ha/globals.ts +++ b/futurehome/src/ha/globals.ts @@ -1,7 +1,14 @@ import { MqttClient } from "mqtt/*"; +import { CommandHandlers } from "./publish_device"; export let ha: MqttClient | undefined = undefined; export function setHa(client: MqttClient) { ha = client; } + +export let haCommandHandlers: CommandHandlers | undefined = undefined; + +export function setHaCommandHandlers(handlers: CommandHandlers) { + haCommandHandlers = handlers; +} diff --git a/futurehome/src/ha/publish_device.ts b/futurehome/src/ha/publish_device.ts index 3d14a98..6601ddb 100644 --- a/futurehome/src/ha/publish_device.ts +++ b/futurehome/src/ha/publish_device.ts @@ -44,7 +44,7 @@ import { sensor_watflow__components } from "../services/sensor_watflow"; import { sensor_watpressure__components } from "../services/sensor_watpressure"; import { sensor_wattemp__components } from "../services/sensor_wattemp"; import { sensor_weight__components } from "../services/sensor_weight"; -import { ha } from "./globals"; +import { ha, setHaCommandHandlers } from "./globals"; type HaDeviceConfig = { // device @@ -85,7 +85,7 @@ type SensorComponent = { // platform p: 'sensor'; device_class?: string; - unit_of_measurement?: string; + unit_of_measurement: string; value_template: string; } @@ -101,10 +101,32 @@ type SwitchComponent = { unique_id: string; // platform p: 'switch'; + command_topic: string; + optimistic: boolean; + value_template: string; } +// todo button reference +// "cmps": { +// "bla1": { +// "p": "device_automation", +// "automation_type": "trigger", +// "payload": "short_press", +// "topic": "foobar/triggers/button1", +// "type": "button_short_press", +// "subtype": "button_1" +// }, +// }, + +export type ServiceComponentsCreationResult = { + components: { [key: string]: HaComponent }; + commandHandlers?: CommandHandlers; +} + +export type CommandHandlers = { [topic: string]: (payload: string) => Promise } + const serviceHandlers: { - [name: string]: (vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService) => { [key: string]: HaComponent } + [name: string]: (topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService) => ServiceComponentsCreationResult } = { battery: battery__components, out_bin_switch: out_bin_switch__components, @@ -151,59 +173,32 @@ const serviceHandlers: { sensor_weight: sensor_weight__components, }; -export function haPublishDevice(parameters: { hubId: string, vinculumDeviceData: VinculumPd7Device, deviceInclusionReport: InclusionReport }) { +export function haPublishDevice(parameters: { hubId: string, vinculumDeviceData: VinculumPd7Device, deviceInclusionReport: InclusionReport }): { commandHandlers: CommandHandlers } { if (!parameters.deviceInclusionReport.services) { - return; + return { commandHandlers: {} }; } - let cmps: { [key: string]: HaComponent } = {}; + const components: { [key: string]: HaComponent } = {}; + const handlers: CommandHandlers = {}; + + // e.g. "homeassistant/device/futurehome_123456_1" + const topicPrefix = `homeassistant/device/futurehome_${parameters.hubId}_${parameters.deviceInclusionReport.address}`; for (const svc of parameters.deviceInclusionReport.services) { if (!svc.name) { continue; } const handler = serviceHandlers[svc.name]; if (handler) { - const result = handler(parameters.vinculumDeviceData, svc); - for (const key in result) { - cmps[key] = result[key]; - } + const result = handler(topicPrefix, parameters.vinculumDeviceData, svc); + Object.assign(components, result.components); + Object.assign(handlers, result.commandHandlers); } else { log.error(`No handler for service: ${svc.name}`); } } - // "cmps": { - // "some_unique_component_id1": { - // "p": "sensor", - // "device_class":"temperature", - // "unit_of_measurement":"°C", - // "value_template":"{{ value_json.temperature }}", - // "unique_id":"temp01ae_t" - // }, - // "some_unique_id2": { - // "p": "sensor", - // "device_class":"humidity", - // "unit_of_measurement":"%", - // "value_template":"{{ value_json.humidity }}", - // "unique_id":"temp01ae_h" - // }, - // "bla1": { - // "p": "device_automation", - // "automation_type": "trigger", - // "payload": "short_press", - // "topic": "foobar/triggers/button1", - // "type": "button_short_press", - // "subtype": "button_1" - // }, - // "bla2": { - // "p": "sensor", - // "state_topic": "foobar/sensor/sensor1", - // "unique_id": "bla_sensor001" - // } - // }, - - const configTopic = `homeassistant/device/futurehome_${parameters.hubId}_${parameters.deviceInclusionReport.address}/config` - const stateTopic = `homeassistant/device/futurehome_${parameters.hubId}_${parameters.deviceInclusionReport.address}/state` - const availabilityTopic = `homeassistant/device/futurehome_${parameters.hubId}_${parameters.deviceInclusionReport.address}/availability` + const configTopic = `${topicPrefix}/config` + const stateTopic = `${topicPrefix}/state` + const availabilityTopic = `${topicPrefix}/availability` const config: HaDeviceConfig = { dev: { ids: parameters.deviceInclusionReport.address, @@ -221,12 +216,14 @@ export function haPublishDevice(parameters: { hubId: string, vinculumDeviceData: name: 'futurehome', url: 'https://github.com/adrianjagielak/home-assistant-futurehome', }, - cmps: cmps, + cmps: components, stat_t: stateTopic, avty_t: availabilityTopic, qos: 2, }; - log.debug(`Publishing HA device "${configTopic}"`) + log.debug(`Publishing HA device "${configTopic}"`); ha?.publish(configTopic, JSON.stringify(config), { retain: true, qos: 2 }); + + return { commandHandlers: handlers }; } \ No newline at end of file diff --git a/futurehome/src/index.ts b/futurehome/src/index.ts index eb6d08c..6fb6cb6 100644 --- a/futurehome/src/index.ts +++ b/futurehome/src/index.ts @@ -4,8 +4,8 @@ import { log } from "./logger"; import { FimpResponse, sendFimpMsg, setFimp } from "./fimp/fimp"; import { getInclusionReport } from "./fimp/inclusion_report"; import { adapterAddressFromServiceAddress, adapterServiceFromServiceAddress } from "./fimp/helpers"; -import { setHa } from "./ha/globals"; -import { haPublishDevice } from "./ha/publish_device"; +import { haCommandHandlers, setHa, setHaCommandHandlers } from "./ha/globals"; +import { CommandHandlers, haPublishDevice } from "./ha/publish_device"; import { haUpdateState, haUpdateStateSensorReport } from "./ha/update_state"; import { VinculumPd7Device } from "./fimp/vinculum_pd7_device"; import { haUpdateAvailability } from "./ha/update_availability"; @@ -82,6 +82,7 @@ import { haUpdateAvailability } from "./ha/update_availability"; } } + const commandHandlers: CommandHandlers = {}; for (const device of devices.val.param.device) { const vinculumDeviceData: VinculumPd7Device = device const deviceId = vinculumDeviceData.id.toString() @@ -100,8 +101,10 @@ import { haUpdateAvailability } from "./ha/update_availability"; // Set initial availability haUpdateAvailability({ hubId, deviceAvailability: { address: deviceId, status: 'UP' } }); } - haPublishDevice({ hubId, vinculumDeviceData, deviceInclusionReport }) + const result = haPublishDevice({ hubId, vinculumDeviceData, deviceInclusionReport }); + Object.assign(commandHandlers, result.commandHandlers); } + setHaCommandHandlers(commandHandlers); // todo // exposeSmarthubTools(); @@ -120,30 +123,16 @@ import { haUpdateAvailability } from "./ha/update_availability"; } break; } - case 'evt.sensor.report': { - haUpdateStateSensorReport({ topic, value: msg.val, attrName: 'sensor' }) - break; - } - case 'evt.presence.report': { - if (!(msg.serv === 'sensor_presence')) { return; } - haUpdateStateSensorReport({ topic, value: msg.val, attrName: 'presence' }) - break; - } - case 'evt.open.report': { - if (!(msg.serv === 'sensor_contact')) { return; } - haUpdateStateSensorReport({ topic, value: msg.val, attrName: 'open' }) - break; - } - case 'evt.lvl.report': { - if (!(msg.serv === 'battery')) { return; } - haUpdateStateSensorReport({ topic, value: msg.val, attrName: 'lvl' }) - break; - } - case 'evt.alarm.report': { - if (!(msg.serv === 'battery')) { return; } - haUpdateStateSensorReport({ topic, value: msg.val, attrName: 'alarm' }) - break; - } + case 'evt.sensor.report': + case 'evt.presence.report': + case 'evt.open.report': + case 'evt.lvl.report': + case 'evt.alarm.report': + case 'evt.binary.report': + { + haUpdateStateSensorReport({ topic, value: msg.val, attrName: msg.type.split('.')[1] }) + break; + } case 'evt.network.all_nodes_report': { const devicesAvailability = msg.val; if (!devicesAvailability) { return; } @@ -166,4 +155,15 @@ import { haUpdateAvailability } from "./ha/update_availability"; val: { cmd: "get", component: null, param: { components: ['state'] } }, val_t: 'object', }); + + ha.on('message', (topic, buf) => { + // Handle Home Assistant command messages + const handler = haCommandHandlers?.[topic]; + if (handler) { + log.debug(`Handling Home Assistant command topic: ${topic}, payload: ${buf.toString()}`); + handler(buf.toString()).catch((e) => { + log.warn(`Failed executing handler for topic: ${topic}, payload: ${buf.toString()}`, e); + }); + } + }) })(); diff --git a/futurehome/src/services/battery.ts b/futurehome/src/services/battery.ts index ebc0387..4ed1ad8 100644 --- a/futurehome/src/services/battery.ts +++ b/futurehome/src/services/battery.ts @@ -1,29 +1,33 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function battery__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function battery__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } if (svc.props?.sup_events?.includes('low_battery')) { return { - [svc.address]: { - unique_id: svc.address, - p: 'binary_sensor', - device_class: 'battery', - value_template: `{{ (value_json['${svc.address}'].alarm.status == 'activ') | iif('ON', 'OFF') }}`, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'binary_sensor', + device_class: 'battery', + value_template: `{{ (value_json['${svc.address}'].alarm.status == 'activ') | iif('ON', 'OFF') }}`, + }, }, }; } else { return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'battery', - unit_of_measurement: svc.props?.sup_units?.[0] ?? '%', - value_template: `{{ value_json['${svc.address}'].lvl }}`, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: 'battery', + unit_of_measurement: svc.props?.sup_units?.[0] ?? '%', + value_template: `{{ value_json['${svc.address}'].lvl }}`, + }, }, - } + }; }; } diff --git a/futurehome/src/services/out_bin_switch.ts b/futurehome/src/services/out_bin_switch.ts index f3bbfd2..11b24f3 100644 --- a/futurehome/src/services/out_bin_switch.ts +++ b/futurehome/src/services/out_bin_switch.ts @@ -1,16 +1,31 @@ +import { sendFimpMsg } from "../fimp/fimp"; import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function out_bin_switch__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function out_bin_switch__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } return { - // [svc.address]: { - // p: "sensor", - // device_class: "temperature", - // unit_of_measurement: "°C", - // value_template: `{{ value_json['${svc.address}'].sensor }}`, - // }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'switch', + command_topic: `${topicPrefix}${svc.address}/command`, + optimistic: false,//todo + value_template: `{{ (value_json['${svc.address}'].binary) | iif('ON', 'OFF') }}`, + }, + }, + commandHandlers: { + [`${topicPrefix}${svc.address}/command`]: async (payload: string) => { + await sendFimpMsg({ + address: svc.address!, + service: 'out_bin_switch', + cmd: 'cmd.binary.set', + val: payload === 'ON', + val_t: 'bool', + }); + }, + } }; } diff --git a/futurehome/src/services/out_lvl_switch.ts b/futurehome/src/services/out_lvl_switch.ts index 3acebda..19723dc 100644 --- a/futurehome/src/services/out_lvl_switch.ts +++ b/futurehome/src/services/out_lvl_switch.ts @@ -1,16 +1,17 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function out_lvl_switch__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function out_lvl_switch__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return {components: {}}; } return { + components: { // [svc.address]: { - // p: "sensor", - // device_class: "temperature", + // p: 'sensor', + // device_class: 'temperature", // unit_of_measurement: "°C", // value_template: `{{ value_json['${svc.address}'].sensor }}`, // }, - }; + },}; } diff --git a/futurehome/src/services/sensor_accelx.ts b/futurehome/src/services/sensor_accelx.ts index 0ea41b5..954c3e6 100644 --- a/futurehome/src/services/sensor_accelx.ts +++ b/futurehome/src/services/sensor_accelx.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_accelx__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_accelx__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'm/s2'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'm/s2', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_accely.ts b/futurehome/src/services/sensor_accely.ts index d8c95d2..c6424de 100644 --- a/futurehome/src/services/sensor_accely.ts +++ b/futurehome/src/services/sensor_accely.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_accely__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_accely__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'm/s2'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'm/s2', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_accelz.ts b/futurehome/src/services/sensor_accelz.ts index 96c2e64..8f8505b 100644 --- a/futurehome/src/services/sensor_accelz.ts +++ b/futurehome/src/services/sensor_accelz.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_accelz__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_accelz__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'm/s2'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'm/s2', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_airflow.ts b/futurehome/src/services/sensor_airflow.ts index f7c762e..9d43e48 100644 --- a/futurehome/src/services/sensor_airflow.ts +++ b/futurehome/src/services/sensor_airflow.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_airflow__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_airflow__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'm3/h'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'm3/h', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_airq.ts b/futurehome/src/services/sensor_airq.ts index df1e46c..5c29031 100644 --- a/futurehome/src/services/sensor_airq.ts +++ b/futurehome/src/services/sensor_airq.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_airq__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_airq__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'aqi'; + const unit = svc.props?.sup_units?.[0] ?? 'pm25'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'aqi', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'pm25', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_anglepos.ts b/futurehome/src/services/sensor_anglepos.ts index a64e915..8276b0a 100644 --- a/futurehome/src/services/sensor_anglepos.ts +++ b/futurehome/src/services/sensor_anglepos.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_anglepos__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_anglepos__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? '%'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? '%', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_atmo.ts b/futurehome/src/services/sensor_atmo.ts index 6050bfc..53ca32f 100644 --- a/futurehome/src/services/sensor_atmo.ts +++ b/futurehome/src/services/sensor_atmo.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_atmo__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_atmo__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'atmospheric_pressure'; + const unit = svc.props?.sup_units?.[0] ?? 'kPa'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'atmospheric_pressure', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'kPa', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_baro.ts b/futurehome/src/services/sensor_baro.ts index 085efbe..d6ed5f6 100644 --- a/futurehome/src/services/sensor_baro.ts +++ b/futurehome/src/services/sensor_baro.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_baro__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_baro__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'atmospheric_pressure'; + const unit = svc.props?.sup_units?.[0] ?? 'kPa'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'atmospheric_pressure', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'kPa', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_co.ts b/futurehome/src/services/sensor_co.ts index 086548b..566346a 100644 --- a/futurehome/src/services/sensor_co.ts +++ b/futurehome/src/services/sensor_co.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_co__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_co__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'carbon_monoxide'; + const unit = svc.props?.sup_units?.[0] ?? 'mol/m3'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'carbon_monoxide', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'mol/m3', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_co2.ts b/futurehome/src/services/sensor_co2.ts index 6b3f95a..ac2e452 100644 --- a/futurehome/src/services/sensor_co2.ts +++ b/futurehome/src/services/sensor_co2.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_co2__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_co2__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'carbon_dioxide'; + const unit = svc.props?.sup_units?.[0] ?? 'ppm'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'carbon_dioxide', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'ppm', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_contact.ts b/futurehome/src/services/sensor_contact.ts index 59eb0e6..4a6f9e0 100644 --- a/futurehome/src/services/sensor_contact.ts +++ b/futurehome/src/services/sensor_contact.ts @@ -1,16 +1,20 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_contact__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_contact__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'opening' return { - [svc.address]: { - unique_id: svc.address, - p: 'binary_sensor', - device_class: 'opening', - value_template: `{{ value_json['${svc.address}'].open | iif('ON', 'OFF') }}`, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'binary_sensor', + device_class: device_class, + value_template: `{{ value_json['${svc.address}'].open | iif('ON', 'OFF') }}`, + }, }, }; } diff --git a/futurehome/src/services/sensor_current.ts b/futurehome/src/services/sensor_current.ts index a4756e8..c07dbe5 100644 --- a/futurehome/src/services/sensor_current.ts +++ b/futurehome/src/services/sensor_current.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_current__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_current__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'current'; + const unit = svc.props?.sup_units?.[0] ?? 'A'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'current', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'A', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_dew.ts b/futurehome/src/services/sensor_dew.ts index b137d40..e2aec4f 100644 --- a/futurehome/src/services/sensor_dew.ts +++ b/futurehome/src/services/sensor_dew.ts @@ -1,21 +1,24 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_dew__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_dew__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + const device_class = 'temperature' let unit = svc.props?.sup_units?.[0] ?? "°C"; if (unit === 'C') unit = '°C'; if (unit === 'F') unit = '°F'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'temperature', - unit_of_measurement: unit, - value_template: `{{ value_json['${svc.address}'].sensor }}`, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, }, }; } diff --git a/futurehome/src/services/sensor_direct.ts b/futurehome/src/services/sensor_direct.ts index f9b0505..54d0c8f 100644 --- a/futurehome/src/services/sensor_direct.ts +++ b/futurehome/src/services/sensor_direct.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_direct__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_direct__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'wind_direction'; + const unit = svc.props?.sup_units?.[0] ?? '°'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'wind_direction', - unit_of_measurement: svc.props?.sup_units?.[0] ?? '°', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_distance.ts b/futurehome/src/services/sensor_distance.ts index cd5d474..aacd21a 100644 --- a/futurehome/src/services/sensor_distance.ts +++ b/futurehome/src/services/sensor_distance.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_distance__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_distance__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'distance'; + const unit = svc.props?.sup_units?.[0] ?? 'm'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'distance', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'm', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_elresist.ts b/futurehome/src/services/sensor_elresist.ts index accd3ad..300f220 100644 --- a/futurehome/src/services/sensor_elresist.ts +++ b/futurehome/src/services/sensor_elresist.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_elresist__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_elresist__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'ohm/m'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'Ω·m', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_freq.ts b/futurehome/src/services/sensor_freq.ts index 7a6ab2f..20d338e 100644 --- a/futurehome/src/services/sensor_freq.ts +++ b/futurehome/src/services/sensor_freq.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_freq__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_freq__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'frequency'; + const unit = svc.props?.sup_units?.[0] ?? 'Hz'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'frequency', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'Hz', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_gp.ts b/futurehome/src/services/sensor_gp.ts index 8b9f2a3..ce3b951 100644 --- a/futurehome/src/services/sensor_gp.ts +++ b/futurehome/src/services/sensor_gp.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_gp__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_gp__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? '%'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? '%', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_gust.ts b/futurehome/src/services/sensor_gust.ts index 5fc2c63..b8fca8a 100644 --- a/futurehome/src/services/sensor_gust.ts +++ b/futurehome/src/services/sensor_gust.ts @@ -1,19 +1,23 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_gust__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_gust__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } - let unit = svc.props?.sup_units?.[0] ?? "km/h"; - if (unit === 'kph') unit = 'km/h'; + const device_class = undefined; + let unit = svc.props?.sup_units?.[0] ?? 'km/h'; + if (unit === 'kph') unit = 'km/h' return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: unit, - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_humid.ts b/futurehome/src/services/sensor_humid.ts index 310218f..de870ef 100644 --- a/futurehome/src/services/sensor_humid.ts +++ b/futurehome/src/services/sensor_humid.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_humid__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_humid__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'humidity'; + const unit = svc.props?.sup_units?.[0] ?? '%'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'humidity', - unit_of_measurement: svc.props?.sup_units?.[0] ?? '%', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_lumin.ts b/futurehome/src/services/sensor_lumin.ts index 5aee28b..0385eb9 100644 --- a/futurehome/src/services/sensor_lumin.ts +++ b/futurehome/src/services/sensor_lumin.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_lumin__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_lumin__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'illuminance'; + const unit = svc.props?.sup_units?.[0] ?? 'Lux'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'illuminance', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'Lux', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_moist.ts b/futurehome/src/services/sensor_moist.ts index 6bbf14f..4d6be7f 100644 --- a/futurehome/src/services/sensor_moist.ts +++ b/futurehome/src/services/sensor_moist.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_moist__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_moist__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'moisture'; + const unit = svc.props?.sup_units?.[0] ?? '%'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'moisture', - unit_of_measurement: svc.props?.sup_units?.[0] ?? '%', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_noise.ts b/futurehome/src/services/sensor_noise.ts index 71864a2..fdf52ef 100644 --- a/futurehome/src/services/sensor_noise.ts +++ b/futurehome/src/services/sensor_noise.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_noise__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_noise__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'sound_pressure'; + const unit = svc.props?.sup_units?.[0] ?? 'dB'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'sound_pressure', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'dB', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_power.ts b/futurehome/src/services/sensor_power.ts index edc1f58..bb94184 100644 --- a/futurehome/src/services/sensor_power.ts +++ b/futurehome/src/services/sensor_power.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_power__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_power__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'power'; + const unit = svc.props?.sup_units?.[0] ?? 'W'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'power', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'W', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_presence.ts b/futurehome/src/services/sensor_presence.ts index 32830d1..ca6b092 100644 --- a/futurehome/src/services/sensor_presence.ts +++ b/futurehome/src/services/sensor_presence.ts @@ -1,16 +1,20 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_presence__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_presence__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'occupancy' return { - [svc.address]: { - unique_id: svc.address, - p: 'binary_sensor', - device_class: 'occupancy', - value_template: `{{ value_json['${svc.address}'].presence | iif('ON', 'OFF') }}`, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'binary_sensor', + device_class: device_class, + value_template: `{{ value_json['${svc.address}'].presence | iif('ON', 'OFF') }}`, + }, }, }; } diff --git a/futurehome/src/services/sensor_rain.ts b/futurehome/src/services/sensor_rain.ts index e37d696..44a1af1 100644 --- a/futurehome/src/services/sensor_rain.ts +++ b/futurehome/src/services/sensor_rain.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_rain__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_rain__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'precipitation_intensity'; + const unit = svc.props?.sup_units?.[0] ?? 'mm/h'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'precipitation_intensity', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'mm/h', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_rotation.ts b/futurehome/src/services/sensor_rotation.ts index 6568cce..496ead0 100644 --- a/futurehome/src/services/sensor_rotation.ts +++ b/futurehome/src/services/sensor_rotation.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_rotation__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_rotation__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'rpm'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'rpm', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_seismicint.ts b/futurehome/src/services/sensor_seismicint.ts index c366c59..876ab8a 100644 --- a/futurehome/src/services/sensor_seismicint.ts +++ b/futurehome/src/services/sensor_seismicint.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_seismicint__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_seismicint__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'EMCRO'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'EMCRO', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_seismicmag.ts b/futurehome/src/services/sensor_seismicmag.ts index ec0e571..a9a1762 100644 --- a/futurehome/src/services/sensor_seismicmag.ts +++ b/futurehome/src/services/sensor_seismicmag.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_seismicmag__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_seismicmag__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'MB'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'MB', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_solarrad.ts b/futurehome/src/services/sensor_solarrad.ts index bb5372c..77a9ba5 100644 --- a/futurehome/src/services/sensor_solarrad.ts +++ b/futurehome/src/services/sensor_solarrad.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_solarrad__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_solarrad__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'W/m2'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'w/m2', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_tank.ts b/futurehome/src/services/sensor_tank.ts index 0be5cef..56a94aa 100644 --- a/futurehome/src/services/sensor_tank.ts +++ b/futurehome/src/services/sensor_tank.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_tank__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_tank__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'volume_storage'; + const unit = svc.props?.sup_units?.[0] ?? 'l'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'volume_storage', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'l', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_temp.ts b/futurehome/src/services/sensor_temp.ts index 45fa257..f77e928 100644 --- a/futurehome/src/services/sensor_temp.ts +++ b/futurehome/src/services/sensor_temp.ts @@ -1,21 +1,24 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_temp__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_temp__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + const device_class = 'temperature' let unit = svc.props?.sup_units?.[0] ?? "°C"; if (unit === 'C') unit = '°C'; if (unit === 'F') unit = '°F'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'temperature', - unit_of_measurement: unit, - value_template: `{{ value_json['${svc.address}'].sensor }}`, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, }, }; } diff --git a/futurehome/src/services/sensor_tidelvl.ts b/futurehome/src/services/sensor_tidelvl.ts index a1aaca2..7c55081 100644 --- a/futurehome/src/services/sensor_tidelvl.ts +++ b/futurehome/src/services/sensor_tidelvl.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_tidelvl__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_tidelvl__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'm'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'm', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_uv.ts b/futurehome/src/services/sensor_uv.ts index af3e466..9cb02c8 100644 --- a/futurehome/src/services/sensor_uv.ts +++ b/futurehome/src/services/sensor_uv.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_uv__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_uv__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'index'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'index', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_veloc.ts b/futurehome/src/services/sensor_veloc.ts index cfd00de..6929c69 100644 --- a/futurehome/src/services/sensor_veloc.ts +++ b/futurehome/src/services/sensor_veloc.ts @@ -1,16 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_veloc__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_veloc__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = undefined; + const unit = svc.props?.sup_units?.[0] ?? 'm/2'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'm/s', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_voltage.ts b/futurehome/src/services/sensor_voltage.ts index 77b5c77..661b830 100644 --- a/futurehome/src/services/sensor_voltage.ts +++ b/futurehome/src/services/sensor_voltage.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_voltage__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_voltage__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'voltage'; + const unit = svc.props?.sup_units?.[0] ?? 'V'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'voltage', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'V', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_watflow.ts b/futurehome/src/services/sensor_watflow.ts index f9b1762..0620366 100644 --- a/futurehome/src/services/sensor_watflow.ts +++ b/futurehome/src/services/sensor_watflow.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_watflow__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_watflow__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'volume_flow_rate'; + const unit = svc.props?.sup_units?.[0] ?? 'l/h'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'volume_flow_rate', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'l/h', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_watpressure.ts b/futurehome/src/services/sensor_watpressure.ts index a0197be..fa76a56 100644 --- a/futurehome/src/services/sensor_watpressure.ts +++ b/futurehome/src/services/sensor_watpressure.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_watpressure__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_watpressure__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'pressure'; + const unit = svc.props?.sup_units?.[0] ?? 'kPa'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'pressure', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'kPa', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_wattemp.ts b/futurehome/src/services/sensor_wattemp.ts index 6e16130..40e1b2b 100644 --- a/futurehome/src/services/sensor_wattemp.ts +++ b/futurehome/src/services/sensor_wattemp.ts @@ -1,21 +1,24 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_wattemp__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_wattemp__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + const device_class = 'temperature'; let unit = svc.props?.sup_units?.[0] ?? "°C"; if (unit === 'C') unit = '°C'; if (unit === 'F') unit = '°F'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'temperature', - unit_of_measurement: unit, - value_template: `{{ value_json['${svc.address}'].sensor }}`, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, }, }; } diff --git a/futurehome/src/services/sensor_weight.ts b/futurehome/src/services/sensor_weight.ts index 753eedd..f4693bd 100644 --- a/futurehome/src/services/sensor_weight.ts +++ b/futurehome/src/services/sensor_weight.ts @@ -1,17 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_weight__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_weight__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } + + const device_class = 'weight'; + const unit = svc.props?.sup_units?.[0] ?? 'kg'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'weight', - unit_of_measurement: svc.props?.sup_units?.[0] ?? 'kg', - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; } diff --git a/futurehome/src/services/sensor_wind.ts b/futurehome/src/services/sensor_wind.ts index 1d1c20d..59efbaa 100644 --- a/futurehome/src/services/sensor_wind.ts +++ b/futurehome/src/services/sensor_wind.ts @@ -1,20 +1,22 @@ import { InclusionReportService } from "../fimp/inclusion_report"; import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; -import { HaComponent } from "../ha/publish_device"; +import { ServiceComponentsCreationResult } from "../ha/publish_device"; -export function sensor_wind__components(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: HaComponent } { - if (!svc.address) { return {}; } +export function sensor_wind__components(topicPrefix: string, vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): ServiceComponentsCreationResult { + if (!svc.address) { return { components: {} }; } - let unit = svc.props?.sup_units?.[0] ?? "km/h"; - if (unit === 'kph') unit = 'km/h'; + const device_class = 'wind_speed'; + const unit = svc.props?.sup_units?.[0] ?? 'km/h'; return { - [svc.address]: { - unique_id: svc.address, - p: 'sensor', - device_class: 'wind_speed', - unit_of_measurement: unit, - value_template: `{{ value_json['${svc.address}'].sensor }}`, - }, + components: { + [svc.address]: { + unique_id: svc.address, + p: 'sensor', + device_class: device_class, + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + }, + } }; }