From 6ee197a3d82456cec9dd29d1504285793b0e9e0c Mon Sep 17 00:00:00 2001 From: Ingo Fischer Date: Fri, 24 Jan 2025 22:50:47 +0100 Subject: [PATCH] Updates 24.01.24 #2 (#344) --- README.md | 6 ++++++ src/lib/JsonConfigUtils.ts | 2 +- src/lib/devices/GenericDevice.ts | 14 +++++++++++++- src/matter/to-iobroker/DoorLockToIoBroker.ts | 12 +++++------- src/matter/to-iobroker/ThermostatToIoBroker.ts | 1 + src/matter/to-matter/ThermostatToMatter.ts | 2 +- 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index d794bfbc..c0fd90d0 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,12 @@ With the ioBroker Matter Adapter it is possible to map the following use cases: --> ## Changelog + +### __WORK IN PROGRESS__ +* (@Apollon77) Added OPEN state for all Door Locks to open door again +* (@Apollon77) Fixed Thermostat initialization when no AUTO mode is supported +* (@Apollon77) Enhanced Enum state display in UI + ### 0.4.3 (2025-01-24) * (@bluefox) Optimized UI * (@Apollon77) Allows to turn light on/off via the dimming level as Zigbee adapter does diff --git a/src/lib/JsonConfigUtils.ts b/src/lib/JsonConfigUtils.ts index d45f4660..b9e7db87 100644 --- a/src/lib/JsonConfigUtils.ts +++ b/src/lib/JsonConfigUtils.ts @@ -60,7 +60,7 @@ export function convertDataToJsonConfig(data: StructuredJsonFormData): JsonFormS foreign: true, label: tabItem.substring(12), addColon: true, - controlDelay: 500, + controlDelay: 1000, oid: '', // oid will be overwritten by data[key][subKey] ...data[tab][tabItem], }; diff --git a/src/lib/devices/GenericDevice.ts b/src/lib/devices/GenericDevice.ts index 4a7a774f..715fcf2d 100644 --- a/src/lib/devices/GenericDevice.ts +++ b/src/lib/devices/GenericDevice.ts @@ -663,6 +663,8 @@ export abstract class GenericDevice extends EventEmitter { return 'slider'; } return 'number'; + } else if (valueType === ValueType.Enum) { + return 'number'; } return 'input'; } @@ -674,7 +676,7 @@ export abstract class GenericDevice extends EventEmitter { keys.reverse(); } keys.forEach(property => { - const { name, unit, write, read, min, max } = this.#properties[property]; + const { valueType, name, unit, write, read, min, max } = this.#properties[property]; states[`__iobstate__${name}`] = { oid: write ?? read, unit, @@ -683,6 +685,16 @@ export abstract class GenericDevice extends EventEmitter { readOnly: !write, control: this.#determineControlType(property), }; + // Workaround until "control: select" is supported in JSONConfig + if (valueType === ValueType.Enum) { + const stateObject = this.#registeredStates.find(obj => obj.propertyType === property); + const modes = stateObject?.modes; + if (modes) { + states.__smalltext__AllowedValues = `Allowed values: ${Object.entries(modes) + .map(([key, value]) => `${key} (${value})`) + .join(', ')}`; + } + } if (includeObjectIds) { if (write !== read && write && read) { states[`__smalltext__${name}`] = `Write: ${write}, Read: ${read}`; diff --git a/src/matter/to-iobroker/DoorLockToIoBroker.ts b/src/matter/to-iobroker/DoorLockToIoBroker.ts index 74a86930..39b7b7fa 100644 --- a/src/matter/to-iobroker/DoorLockToIoBroker.ts +++ b/src/matter/to-iobroker/DoorLockToIoBroker.ts @@ -67,13 +67,11 @@ export class DoorLockToIoBroker extends GenericElectricityDataDeviceToIoBroker { attributeName: 'lockState', convertValue: value => value === DoorLock.LockState.Unlocked, }); - if (this.#unboltingSupported) { - this.enableDeviceTypeStateForAttribute(PropertyType.Open, { - changeHandler: async () => { - await this.appEndpoint.getClusterClient(DoorLock.Complete)?.unlockDoor({}); - }, - }); - } + this.enableDeviceTypeStateForAttribute(PropertyType.Open, { + changeHandler: async () => { + await this.appEndpoint.getClusterClient(DoorLock.Complete)?.unlockDoor({}); + }, + }); return super.enableDeviceTypeStates(); } diff --git a/src/matter/to-iobroker/ThermostatToIoBroker.ts b/src/matter/to-iobroker/ThermostatToIoBroker.ts index 050469eb..0ddbc6ea 100644 --- a/src/matter/to-iobroker/ThermostatToIoBroker.ts +++ b/src/matter/to-iobroker/ThermostatToIoBroker.ts @@ -122,6 +122,7 @@ export class ThermostatToIoBroker extends GenericElectricityDataDeviceToIoBroker await this.ioBrokerDevice.updateLevel(this.temperatureFromMatter(coolSetpoint)); } } + return ioMode; } }, changeHandler: async value => { diff --git a/src/matter/to-matter/ThermostatToMatter.ts b/src/matter/to-matter/ThermostatToMatter.ts index 2226c37e..286d5d4c 100644 --- a/src/matter/to-matter/ThermostatToMatter.ts +++ b/src/matter/to-matter/ThermostatToMatter.ts @@ -108,7 +108,7 @@ export class ThermostatToMatter extends GenericDeviceToMatter { : hasHeating ? MatterThermostat.ControlSequenceOfOperation.HeatingOnly : MatterThermostat.ControlSequenceOfOperation.CoolingOnly, - minSetpointDeadBand: 0, + minSetpointDeadBand: this.#supportedModes.includes(ThermostatMode.Auto) ? 0 : undefined, absMinHeatSetpointLimit: hasHeating ? this.convertTemperatureValue(7) : undefined, absMaxHeatSetpointLimit: hasHeating ? this.convertTemperatureValue(30) : undefined, absMinCoolSetpointLimit: hasCooling ? this.convertTemperatureValue(16) : undefined,