From 881fa56075c8bde6d93c2279068059c75173e25e Mon Sep 17 00:00:00 2001 From: Olivier Zalmanski <88216225+OlivierZal@users.noreply.github.com> Date: Mon, 2 Dec 2024 02:08:36 +0100 Subject: [PATCH] improve --- app.mts | 18 +++++++++++------- lib/get-zones.mts | 21 ++++++--------------- settings/index.mts | 2 +- types/common.mts | 22 +++++++++++++++------- widgets/charts/api.mts | 6 ++++-- 5 files changed, 37 insertions(+), 32 deletions(-) diff --git a/app.mts b/app.mts index 718cbad5..46c97c00 100644 --- a/app.mts +++ b/app.mts @@ -38,7 +38,7 @@ import { thermostatMode, vertical, } from './json-files.mts' -import { getDevices, getZones } from './lib/get-zones.mts' +import { getZones } from './lib/get-zones.mts' import { fanSpeedValues, zoneModel, @@ -447,16 +447,20 @@ export default class MELCloudApp extends Homey.App { this.homey.dashboards .getWidget('ata-group-setting') .registerSettingAutocompleteListener('default_zone', (query) => - getZones({ type: DeviceType.Ata }).filter(({ name }) => - name.toLowerCase().includes(query.toLowerCase()), - ), + getZones({ type: DeviceType.Ata }) + .filter(({ model }) => model !== 'devices') + .filter(({ name }) => + name.toLowerCase().includes(query.toLowerCase()), + ), ) this.homey.dashboards .getWidget('charts') .registerSettingAutocompleteListener('default_zone', (query) => - getDevices().filter(({ name }) => - name.toLowerCase().includes(query.toLowerCase()), - ), + getZones() + .filter(({ model }) => model === 'devices') + .filter(({ name }) => + name.toLowerCase().includes(query.toLowerCase()), + ), ) } diff --git a/lib/get-zones.mts b/lib/get-zones.mts index 8305903c..feff0df2 100644 --- a/lib/get-zones.mts +++ b/lib/get-zones.mts @@ -12,6 +12,7 @@ import type { BuildingZone, DeviceZone, FloorZone, + Zone, } from '../types/common.mts' const LEVEL_1 = 1 @@ -55,6 +56,7 @@ const filterAndMapDevices = ( .map(({ area, floor, id, name }) => ({ id: `devices_${String(id)}`, level: getDeviceLevel({ area, floor }), + model: 'devices' as const, name, })) .toSorted(compareNames) @@ -69,6 +71,7 @@ const filterAndMapAreas = ( devices: filterAndMapDevices(devices, { type }), id: `areas_${String(id)}`, level: floor ? LEVEL_2 : LEVEL_1, + model: 'areas' as const, name, })) .toSorted(compareNames) @@ -87,6 +90,7 @@ const filterAndMapFloors = ( ), id: `floors_${String(id)}`, level: 1, + model: 'floors' as const, name, })) .toSorted(compareNames) @@ -110,15 +114,12 @@ export const getBuildings = ({ floors: filterAndMapFloors(floors, { type }), id: `buildings_${String(id)}`, level: 0, + model: 'buildings' as const, name, })) .toSorted(compareNames) -export const getZones = ({ type }: { type?: DeviceType } = {}): ( - | AreaZone - | BuildingZone - | FloorZone -)[] => +export const getZones = ({ type }: { type?: DeviceType } = {}): Zone[] => getBuildings({ type }) .flatMap(({ areas, devices, floors, ...building }) => [ building, @@ -138,13 +139,3 @@ export const getZones = ({ type }: { type?: DeviceType } = {}): ( ) ?? []), ]) .toSorted(compareNames) - -export const getDevices = ({ - type, -}: { type?: DeviceType } = {}): DeviceZone[] => - (type === undefined ? - DeviceModel.getAll() - : DeviceModel.getAll().filter(({ type: deviceType }) => deviceType === type) - ) - .map(({ id, name }) => ({ id: `devices_${String(id)}`, level: 0, name })) - .toSorted(compareNames) diff --git a/settings/index.mts b/settings/index.mts index fd7df171..47c12d52 100644 --- a/settings/index.mts +++ b/settings/index.mts @@ -924,7 +924,7 @@ const generateZones = async (zones: Zone[]): Promise => const { id, level, name } = zone createOptionElement(zoneElement, { id, - label: `${'···'.repeat(level)} ${name}`, + label: `${'··'.repeat(level)} ${name}`, }) if ('devices' in zone && zone.devices) { await generateZones(zone.devices) diff --git a/types/common.mts b/types/common.mts index e8d18e35..565078bf 100644 --- a/types/common.mts +++ b/types/common.mts @@ -173,11 +173,20 @@ export const fanSpeedValues = [ createVeryObject(slow), ] as const -export interface AreaZone extends DeviceZone { +export interface AreaZone extends Omit { + readonly model: 'areas' readonly devices?: DeviceZone[] } -export interface BuildingZone extends FloorZone { +export interface BaseZone { + readonly id: string + readonly level: number + readonly model: 'areas' | 'buildings' | 'devices' | 'floors' + readonly name: string +} + +export interface BuildingZone extends Omit { + readonly model: 'buildings' readonly floors?: FloorZone[] } @@ -196,10 +205,8 @@ export interface DeviceDetails { readonly name: string } -export interface DeviceZone { - readonly id: string - readonly level: number - readonly name: string +export interface DeviceZone extends BaseZone { + readonly model: 'devices' } export interface DriverCapabilitiesOptions { @@ -222,7 +229,8 @@ export interface DriverSetting { readonly values?: readonly { readonly id: string; readonly label: string }[] } -export interface FloorZone extends AreaZone { +export interface FloorZone extends Omit { + readonly model: 'floors' readonly areas?: AreaZone[] } diff --git a/widgets/charts/api.mts b/widgets/charts/api.mts index 4fe29fed..071c30ce 100644 --- a/widgets/charts/api.mts +++ b/widgets/charts/api.mts @@ -1,4 +1,4 @@ -import { getDevices } from '../../lib/get-zones.mts' +import { getZones } from '../../lib/get-zones.mts' import type { ReportChartLineOptions } from '@olivierzal/melcloud-api' import type { Homey } from 'homey/lib/Homey' @@ -7,7 +7,9 @@ import type { DaysQuery, DeviceZone } from '../../types/common.mts' const api = { getDevices(): DeviceZone[] { - return getDevices() + return getZones().filter( + (zone): zone is DeviceZone => zone.model === 'devices', + ) }, getLanguage({ homey }: { homey: Homey }): string { return homey.i18n.getLanguage()