From 2c3a1bf0c53e236acbcd15cdac61dd936cbb3427 Mon Sep 17 00:00:00 2001 From: Adrian Jagielak Date: Wed, 23 Jul 2025 00:45:21 +0200 Subject: [PATCH] Implement all sensors and low battery state --- futurehome/src/fimp/inclusion_report.ts | 4 + futurehome/src/ha/publish_device.ts | 78 ++++++++++++++++++- futurehome/src/services/battery.ts | 28 +++++-- futurehome/src/services/sensor_accelx.ts | 16 ++++ futurehome/src/services/sensor_accely.ts | 16 ++++ futurehome/src/services/sensor_accelz.ts | 16 ++++ futurehome/src/services/sensor_airflow.ts | 16 ++++ futurehome/src/services/sensor_airq.ts | 17 ++++ futurehome/src/services/sensor_anglepos.ts | 16 ++++ futurehome/src/services/sensor_atmo.ts | 17 ++++ futurehome/src/services/sensor_baro.ts | 17 ++++ futurehome/src/services/sensor_co.ts | 17 ++++ futurehome/src/services/sensor_co2.ts | 17 ++++ futurehome/src/services/sensor_contact.ts | 16 ++++ futurehome/src/services/sensor_current.ts | 17 ++++ futurehome/src/services/sensor_dew.ts | 21 +++++ futurehome/src/services/sensor_direct.ts | 17 ++++ futurehome/src/services/sensor_distance.ts | 17 ++++ futurehome/src/services/sensor_elresist.ts | 16 ++++ futurehome/src/services/sensor_freq.ts | 17 ++++ futurehome/src/services/sensor_gp.ts | 16 ++++ futurehome/src/services/sensor_gust.ts | 19 +++++ futurehome/src/services/sensor_humid.ts | 17 ++++ futurehome/src/services/sensor_lumin.ts | 17 ++++ futurehome/src/services/sensor_moist.ts | 17 ++++ futurehome/src/services/sensor_noise.ts | 17 ++++ futurehome/src/services/sensor_power.ts | 17 ++++ futurehome/src/services/sensor_presence.ts | 2 +- futurehome/src/services/sensor_rain.ts | 17 ++++ futurehome/src/services/sensor_rotation.ts | 16 ++++ futurehome/src/services/sensor_seismicint.ts | 16 ++++ futurehome/src/services/sensor_seismicmag.ts | 16 ++++ futurehome/src/services/sensor_solarrad.ts | 16 ++++ futurehome/src/services/sensor_tank.ts | 17 ++++ futurehome/src/services/sensor_temp.ts | 6 +- futurehome/src/services/sensor_tidelvl.ts | 16 ++++ futurehome/src/services/sensor_uv.ts | 16 ++++ futurehome/src/services/sensor_veloc.ts | 16 ++++ futurehome/src/services/sensor_voltage.ts | 17 ++++ futurehome/src/services/sensor_watflow.ts | 17 ++++ futurehome/src/services/sensor_watpressure.ts | 17 ++++ futurehome/src/services/sensor_wattemp.ts | 21 +++++ futurehome/src/services/sensor_weight.ts | 17 ++++ futurehome/src/services/sensor_wind.ts | 20 +++++ 44 files changed, 768 insertions(+), 11 deletions(-) create mode 100644 futurehome/src/services/sensor_accelx.ts create mode 100644 futurehome/src/services/sensor_accely.ts create mode 100644 futurehome/src/services/sensor_accelz.ts create mode 100644 futurehome/src/services/sensor_airflow.ts create mode 100644 futurehome/src/services/sensor_airq.ts create mode 100644 futurehome/src/services/sensor_anglepos.ts create mode 100644 futurehome/src/services/sensor_atmo.ts create mode 100644 futurehome/src/services/sensor_baro.ts create mode 100644 futurehome/src/services/sensor_co.ts create mode 100644 futurehome/src/services/sensor_co2.ts create mode 100644 futurehome/src/services/sensor_contact.ts create mode 100644 futurehome/src/services/sensor_current.ts create mode 100644 futurehome/src/services/sensor_dew.ts create mode 100644 futurehome/src/services/sensor_direct.ts create mode 100644 futurehome/src/services/sensor_distance.ts create mode 100644 futurehome/src/services/sensor_elresist.ts create mode 100644 futurehome/src/services/sensor_freq.ts create mode 100644 futurehome/src/services/sensor_gp.ts create mode 100644 futurehome/src/services/sensor_gust.ts create mode 100644 futurehome/src/services/sensor_humid.ts create mode 100644 futurehome/src/services/sensor_lumin.ts create mode 100644 futurehome/src/services/sensor_moist.ts create mode 100644 futurehome/src/services/sensor_noise.ts create mode 100644 futurehome/src/services/sensor_power.ts create mode 100644 futurehome/src/services/sensor_rain.ts create mode 100644 futurehome/src/services/sensor_rotation.ts create mode 100644 futurehome/src/services/sensor_seismicint.ts create mode 100644 futurehome/src/services/sensor_seismicmag.ts create mode 100644 futurehome/src/services/sensor_solarrad.ts create mode 100644 futurehome/src/services/sensor_tank.ts create mode 100644 futurehome/src/services/sensor_tidelvl.ts create mode 100644 futurehome/src/services/sensor_uv.ts create mode 100644 futurehome/src/services/sensor_veloc.ts create mode 100644 futurehome/src/services/sensor_voltage.ts create mode 100644 futurehome/src/services/sensor_watflow.ts create mode 100644 futurehome/src/services/sensor_watpressure.ts create mode 100644 futurehome/src/services/sensor_wattemp.ts create mode 100644 futurehome/src/services/sensor_weight.ts create mode 100644 futurehome/src/services/sensor_wind.ts diff --git a/futurehome/src/fimp/inclusion_report.ts b/futurehome/src/fimp/inclusion_report.ts index 3743644..02c23c4 100644 --- a/futurehome/src/fimp/inclusion_report.ts +++ b/futurehome/src/fimp/inclusion_report.ts @@ -17,6 +17,10 @@ export type InclusionReport = { export type InclusionReportService = { name?: string | null; address?: string | null; + props?: { + sup_units?: string[] | null; + sup_events?: string[] | null; + } | null }; export async function getInclusionReport(parameters: { adapterAddress: string; adapterService: string; deviceId: string }): Promise { diff --git a/futurehome/src/ha/publish_device.ts b/futurehome/src/ha/publish_device.ts index 83b87da..23f6bfd 100644 --- a/futurehome/src/ha/publish_device.ts +++ b/futurehome/src/ha/publish_device.ts @@ -4,8 +4,46 @@ import { log } from "../logger"; import { cmps_battery } from "../services/battery"; import { cmps_out_bin_switch } from "../services/out_bin_switch"; import { cmps_out_lvl_switch } from "../services/out_lvl_switch"; +import { cmps_sensor_accelx } from "../services/sensor_accelx"; +import { cmps_sensor_accely } from "../services/sensor_accely"; +import { cmps_sensor_accelz } from "../services/sensor_accelz"; +import { cmps_sensor_airflow } from "../services/sensor_airflow"; +import { cmps_sensor_airq } from "../services/sensor_airq"; +import { cmps_sensor_anglepos } from "../services/sensor_anglepos"; +import { cmps_sensor_atmo } from "../services/sensor_atmo"; +import { cmps_sensor_baro } from "../services/sensor_baro"; +import { cmps_sensor_co } from "../services/sensor_co"; +import { cmps_sensor_co2 } from "../services/sensor_co2"; +import { cmps_sensor_contact } from "../services/sensor_contact"; +import { cmps_sensor_current } from "../services/sensor_current"; +import { cmps_sensor_dew } from "../services/sensor_dew"; +import { cmps_sensor_direct } from "../services/sensor_direct"; +import { cmps_sensor_distance } from "../services/sensor_distance"; +import { cmps_sensor_elresist } from "../services/sensor_elresist"; +import { cmps_sensor_freq } from "../services/sensor_freq"; +import { cmps_sensor_gp } from "../services/sensor_gp"; +import { cmps_sensor_gust } from "../services/sensor_gust"; +import { cmps_sensor_humid } from "../services/sensor_humid"; +import { cmps_sensor_lumin } from "../services/sensor_lumin"; +import { cmps_sensor_moist } from "../services/sensor_moist"; +import { cmps_sensor_noise } from "../services/sensor_noise"; +import { cmps_sensor_power } from "../services/sensor_power"; import { cmps_sensor_presence } from "../services/sensor_presence"; +import { cmps_sensor_rain } from "../services/sensor_rain"; +import { cmps_sensor_rotation } from "../services/sensor_rotation"; +import { cmps_sensor_seismicint } from "../services/sensor_seismicint"; +import { cmps_sensor_seismicmag } from "../services/sensor_seismicmag"; +import { cmps_sensor_solarrad } from "../services/sensor_solarrad"; +import { cmps_sensor_tank } from "../services/sensor_tank"; import { cmps_sensor_temp } from "../services/sensor_temp"; +import { cmps_sensor_tidelvl } from "../services/sensor_tidelvl"; +import { cmps_sensor_uv } from "../services/sensor_uv"; +import { cmps_sensor_veloc } from "../services/sensor_veloc"; +import { cmps_sensor_voltage } from "../services/sensor_voltage"; +import { cmps_sensor_watflow } from "../services/sensor_watflow"; +import { cmps_sensor_watpressure } from "../services/sensor_watpressure"; +import { cmps_sensor_wattemp } from "../services/sensor_wattemp"; +import { cmps_sensor_weight } from "../services/sensor_weight"; import { ha } from "./globals"; type HaDeviceConfig = { @@ -45,8 +83,46 @@ const serviceHandlers: { battery: cmps_battery, out_bin_switch: cmps_out_bin_switch, out_lvl_switch: cmps_out_lvl_switch, - sensor_temp: cmps_sensor_temp, + sensor_accelx: cmps_sensor_accelx, + sensor_accely: cmps_sensor_accely, + sensor_accelz: cmps_sensor_accelz, + sensor_airflow: cmps_sensor_airflow, + sensor_airq: cmps_sensor_airq, + sensor_anglepos: cmps_sensor_anglepos, + sensor_atmo: cmps_sensor_atmo, + sensor_baro: cmps_sensor_baro, + sensor_co: cmps_sensor_co, + sensor_co2: cmps_sensor_co2, + sensor_contact: cmps_sensor_contact, + sensor_current: cmps_sensor_current, + sensor_dew: cmps_sensor_dew, + sensor_direct: cmps_sensor_direct, + sensor_distance: cmps_sensor_distance, + sensor_elresist: cmps_sensor_elresist, + sensor_freq: cmps_sensor_freq, + sensor_gp: cmps_sensor_gp, + sensor_gust: cmps_sensor_gust, + sensor_humid: cmps_sensor_humid, + sensor_lumin: cmps_sensor_lumin, + sensor_moist: cmps_sensor_moist, + sensor_noise: cmps_sensor_noise, + sensor_power: cmps_sensor_power, sensor_presence: cmps_sensor_presence, + sensor_rain: cmps_sensor_rain, + sensor_rotation: cmps_sensor_rotation, + sensor_seismicint: cmps_sensor_seismicint, + sensor_seismicmag: cmps_sensor_seismicmag, + sensor_solarrad: cmps_sensor_solarrad, + sensor_tank: cmps_sensor_tank, + sensor_temp: cmps_sensor_temp, + sensor_tidelvl: cmps_sensor_tidelvl, + sensor_uv: cmps_sensor_uv, + sensor_veloc: cmps_sensor_veloc, + sensor_voltage: cmps_sensor_voltage, + sensor_watflow: cmps_sensor_watflow, + sensor_watpressure: cmps_sensor_watpressure, + sensor_wattemp: cmps_sensor_wattemp, + sensor_weight: cmps_sensor_weight, }; export function haPublishDevice(parameters: { hubId: string, vinculumDeviceData: VinculumPd7Device, deviceInclusionReport: InclusionReport }) { diff --git a/futurehome/src/services/battery.ts b/futurehome/src/services/battery.ts index fce5ea0..43d16b5 100644 --- a/futurehome/src/services/battery.ts +++ b/futurehome/src/services/battery.ts @@ -5,13 +5,25 @@ import { CMP } from "../ha/publish_device"; export function cmps_battery(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { if (!svc.address) { return {}; } - return { - [svc.address]: { - p: "sensor", - device_class: "battery", - unit_of_measurement: "%", - value_template: `{{ value_json['${svc.address}'].lvl }}`, - unique_id: svc.address, - }, + if (svc.props?.sup_events?.includes('low_battery')) { + return { + [svc.address]: { + p: "binary_sensor", + device_class: "battery", + value_template: `{{ value_json['${svc.address}'].alarm.status == 'activ' | iif('on', 'off') }}`, + unique_id: svc.address, + }, + }; + } + else { + return { + [svc.address]: { + p: "sensor", + device_class: "battery", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "%", + value_template: `{{ value_json['${svc.address}'].lvl }}`, + unique_id: svc.address, + }, + } }; } diff --git a/futurehome/src/services/sensor_accelx.ts b/futurehome/src/services/sensor_accelx.ts new file mode 100644 index 0000000..e699213 --- /dev/null +++ b/futurehome/src/services/sensor_accelx.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_accelx(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "m/s2", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_accely.ts b/futurehome/src/services/sensor_accely.ts new file mode 100644 index 0000000..ba9dfa2 --- /dev/null +++ b/futurehome/src/services/sensor_accely.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_accely(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "m/s2", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_accelz.ts b/futurehome/src/services/sensor_accelz.ts new file mode 100644 index 0000000..397347b --- /dev/null +++ b/futurehome/src/services/sensor_accelz.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_accelz(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "m/s2", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_airflow.ts b/futurehome/src/services/sensor_airflow.ts new file mode 100644 index 0000000..6e43a93 --- /dev/null +++ b/futurehome/src/services/sensor_airflow.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_airflow(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "m3/h", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_airq.ts b/futurehome/src/services/sensor_airq.ts new file mode 100644 index 0000000..0450325 --- /dev/null +++ b/futurehome/src/services/sensor_airq.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_airq(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "aqi", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "pm25", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_anglepos.ts b/futurehome/src/services/sensor_anglepos.ts new file mode 100644 index 0000000..8043ae0 --- /dev/null +++ b/futurehome/src/services/sensor_anglepos.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_anglepos(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "%", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_atmo.ts b/futurehome/src/services/sensor_atmo.ts new file mode 100644 index 0000000..5ac9390 --- /dev/null +++ b/futurehome/src/services/sensor_atmo.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_atmo(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "atmospheric_pressure", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "kPa", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_baro.ts b/futurehome/src/services/sensor_baro.ts new file mode 100644 index 0000000..c31120b --- /dev/null +++ b/futurehome/src/services/sensor_baro.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_baro(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "atmospheric_pressure", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "kPa", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_co.ts b/futurehome/src/services/sensor_co.ts new file mode 100644 index 0000000..9c0785f --- /dev/null +++ b/futurehome/src/services/sensor_co.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_co(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [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 }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_co2.ts b/futurehome/src/services/sensor_co2.ts new file mode 100644 index 0000000..83e299f --- /dev/null +++ b/futurehome/src/services/sensor_co2.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_co2(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "carbon_dioxide", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "ppm", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_contact.ts b/futurehome/src/services/sensor_contact.ts new file mode 100644 index 0000000..5bfb8d0 --- /dev/null +++ b/futurehome/src/services/sensor_contact.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_contact(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "binary_sensor", + device_class: "opening", + value_template: `{{ value_json['${svc.address}'].open | iif('on', 'off') }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_current.ts b/futurehome/src/services/sensor_current.ts new file mode 100644 index 0000000..44e2d15 --- /dev/null +++ b/futurehome/src/services/sensor_current.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_current(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "current", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "A", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_dew.ts b/futurehome/src/services/sensor_dew.ts new file mode 100644 index 0000000..5b2d1d8 --- /dev/null +++ b/futurehome/src/services/sensor_dew.ts @@ -0,0 +1,21 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_dew(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + let unit = svc.props?.sup_units?.[0] ?? "℃"; + if (unit === 'C') unit = '℃'; + if (unit === 'F') unit = '℉'; + + return { + [svc.address]: { + p: "sensor", + device_class: "temperature", + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_direct.ts b/futurehome/src/services/sensor_direct.ts new file mode 100644 index 0000000..2ada18f --- /dev/null +++ b/futurehome/src/services/sensor_direct.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_direct(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "wind_direction", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "°", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_distance.ts b/futurehome/src/services/sensor_distance.ts new file mode 100644 index 0000000..6ef629e --- /dev/null +++ b/futurehome/src/services/sensor_distance.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_distance(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "distance", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "m", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_elresist.ts b/futurehome/src/services/sensor_elresist.ts new file mode 100644 index 0000000..6fa19e0 --- /dev/null +++ b/futurehome/src/services/sensor_elresist.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_elresist(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "Ω·m", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_freq.ts b/futurehome/src/services/sensor_freq.ts new file mode 100644 index 0000000..ed6d191 --- /dev/null +++ b/futurehome/src/services/sensor_freq.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_freq(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "frequency", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "Hz", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_gp.ts b/futurehome/src/services/sensor_gp.ts new file mode 100644 index 0000000..db741ac --- /dev/null +++ b/futurehome/src/services/sensor_gp.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_gp(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "%", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_gust.ts b/futurehome/src/services/sensor_gust.ts new file mode 100644 index 0000000..f9b2f2d --- /dev/null +++ b/futurehome/src/services/sensor_gust.ts @@ -0,0 +1,19 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_gust(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + let unit = svc.props?.sup_units?.[0] ?? "km/h"; + if (unit === 'kph') unit = 'km/h'; + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_humid.ts b/futurehome/src/services/sensor_humid.ts new file mode 100644 index 0000000..f6720cc --- /dev/null +++ b/futurehome/src/services/sensor_humid.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_humid(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "humidity", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "%", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_lumin.ts b/futurehome/src/services/sensor_lumin.ts new file mode 100644 index 0000000..3d8fca2 --- /dev/null +++ b/futurehome/src/services/sensor_lumin.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_lumin(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "illuminance", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "Lux", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_moist.ts b/futurehome/src/services/sensor_moist.ts new file mode 100644 index 0000000..21ead31 --- /dev/null +++ b/futurehome/src/services/sensor_moist.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_moist(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "moisture", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "%", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_noise.ts b/futurehome/src/services/sensor_noise.ts new file mode 100644 index 0000000..9ceb27d --- /dev/null +++ b/futurehome/src/services/sensor_noise.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_noise(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "sound_pressure", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "dB", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_power.ts b/futurehome/src/services/sensor_power.ts new file mode 100644 index 0000000..ece73ec --- /dev/null +++ b/futurehome/src/services/sensor_power.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_power(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "power", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "W", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_presence.ts b/futurehome/src/services/sensor_presence.ts index dc251cb..c1ef852 100644 --- a/futurehome/src/services/sensor_presence.ts +++ b/futurehome/src/services/sensor_presence.ts @@ -9,7 +9,7 @@ export function cmps_sensor_presence(vinculumDeviceData: VinculumPd7Device, svc: [svc.address]: { p: "binary_sensor", device_class: "presence", - value_template: `{{ value_json['${svc.address}'].presence }}`, + value_template: `{{ value_json['${svc.address}'].presence | iif('on', 'off') }}`, unique_id: svc.address, }, }; diff --git a/futurehome/src/services/sensor_rain.ts b/futurehome/src/services/sensor_rain.ts new file mode 100644 index 0000000..9ecd8bb --- /dev/null +++ b/futurehome/src/services/sensor_rain.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_rain(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [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 }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_rotation.ts b/futurehome/src/services/sensor_rotation.ts new file mode 100644 index 0000000..1025d2b --- /dev/null +++ b/futurehome/src/services/sensor_rotation.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_rotation(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "rpm", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_seismicint.ts b/futurehome/src/services/sensor_seismicint.ts new file mode 100644 index 0000000..504e783 --- /dev/null +++ b/futurehome/src/services/sensor_seismicint.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_seismicint(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "EMCRO", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_seismicmag.ts b/futurehome/src/services/sensor_seismicmag.ts new file mode 100644 index 0000000..539933d --- /dev/null +++ b/futurehome/src/services/sensor_seismicmag.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_seismicmag(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "MB", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_solarrad.ts b/futurehome/src/services/sensor_solarrad.ts new file mode 100644 index 0000000..a668efb --- /dev/null +++ b/futurehome/src/services/sensor_solarrad.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_solarrad(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "w/m2", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_tank.ts b/futurehome/src/services/sensor_tank.ts new file mode 100644 index 0000000..6200ec6 --- /dev/null +++ b/futurehome/src/services/sensor_tank.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_tank(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "volume_storage", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "l", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_temp.ts b/futurehome/src/services/sensor_temp.ts index b91647c..337f602 100644 --- a/futurehome/src/services/sensor_temp.ts +++ b/futurehome/src/services/sensor_temp.ts @@ -5,11 +5,15 @@ import { CMP } from "../ha/publish_device"; export function cmps_sensor_temp(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { if (!svc.address) { return {}; } + let unit = svc.props?.sup_units?.[0] ?? "℃"; + if (unit === 'C') unit = '℃'; + if (unit === 'F') unit = '℉'; + return { [svc.address]: { p: "sensor", device_class: "temperature", - unit_of_measurement: "°C", + unit_of_measurement: unit, value_template: `{{ value_json['${svc.address}'].sensor }}`, unique_id: svc.address, }, diff --git a/futurehome/src/services/sensor_tidelvl.ts b/futurehome/src/services/sensor_tidelvl.ts new file mode 100644 index 0000000..85314f6 --- /dev/null +++ b/futurehome/src/services/sensor_tidelvl.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_tidelvl(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "m", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_uv.ts b/futurehome/src/services/sensor_uv.ts new file mode 100644 index 0000000..4c9ec44 --- /dev/null +++ b/futurehome/src/services/sensor_uv.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_uv(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? 'index', + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_veloc.ts b/futurehome/src/services/sensor_veloc.ts new file mode 100644 index 0000000..46b5d3e --- /dev/null +++ b/futurehome/src/services/sensor_veloc.ts @@ -0,0 +1,16 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_veloc(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "m/s", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_voltage.ts b/futurehome/src/services/sensor_voltage.ts new file mode 100644 index 0000000..a9f162c --- /dev/null +++ b/futurehome/src/services/sensor_voltage.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_voltage(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "voltage", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "V", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_watflow.ts b/futurehome/src/services/sensor_watflow.ts new file mode 100644 index 0000000..e277e8a --- /dev/null +++ b/futurehome/src/services/sensor_watflow.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_watflow(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [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 }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_watpressure.ts b/futurehome/src/services/sensor_watpressure.ts new file mode 100644 index 0000000..00fc09e --- /dev/null +++ b/futurehome/src/services/sensor_watpressure.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_watpressure(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "pressure", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "kPa", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_wattemp.ts b/futurehome/src/services/sensor_wattemp.ts new file mode 100644 index 0000000..c245161 --- /dev/null +++ b/futurehome/src/services/sensor_wattemp.ts @@ -0,0 +1,21 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_wattemp(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + let unit = svc.props?.sup_units?.[0] ?? "℃"; + if (unit === 'C') unit = '℃'; + if (unit === 'F') unit = '℉'; + + return { + [svc.address]: { + p: "sensor", + device_class: "temperature", + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_weight.ts b/futurehome/src/services/sensor_weight.ts new file mode 100644 index 0000000..ef00ded --- /dev/null +++ b/futurehome/src/services/sensor_weight.ts @@ -0,0 +1,17 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_weight(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + return { + [svc.address]: { + p: "sensor", + device_class: "weigh", + unit_of_measurement: svc.props?.sup_units?.[0] ?? "kg", + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +} diff --git a/futurehome/src/services/sensor_wind.ts b/futurehome/src/services/sensor_wind.ts new file mode 100644 index 0000000..d72128b --- /dev/null +++ b/futurehome/src/services/sensor_wind.ts @@ -0,0 +1,20 @@ +import { InclusionReportService } from "../fimp/inclusion_report"; +import { VinculumPd7Device } from "../fimp/vinculum_pd7_device"; +import { CMP } from "../ha/publish_device"; + +export function cmps_sensor_wind(vinculumDeviceData: VinculumPd7Device, svc: InclusionReportService): { [key: string]: CMP } { + if (!svc.address) { return {}; } + + let unit = svc.props?.sup_units?.[0] ?? "km/h"; + if (unit === 'kph') unit = 'km/h'; + + return { + [svc.address]: { + p: "sensor", + device_class: "wind_speed", + unit_of_measurement: unit, + value_template: `{{ value_json['${svc.address}'].sensor }}`, + unique_id: svc.address, + }, + }; +}