Skip to content

Commit

Permalink
Add SmokeCO2Alarm Controller device type
Browse files Browse the repository at this point in the history
  • Loading branch information
Apollon77 committed Jan 23, 2025
1 parent 3bc3186 commit 88c9919
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 2 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ With the ioBroker Matter Adapter it is possible to map the following use cases:
-->

## Changelog
### __WORK IN PROGRESS__
* (@Apollon77) Added SmokeCO2Alarm -> FireAlarm to Controller device types

### 0.4.1 (2025-01-22)
* (@bluefox) Optimized UI
* (@Apollon77) Improved handling for Power Source cluster on root endpoint
Expand Down
4 changes: 2 additions & 2 deletions src-admin/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions src/lib/devices/FireAlarm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,11 @@ export class FireAlarm extends GenericDevice {
}
return this.#getValueState.value;
}

updateValue(value: boolean): Promise<void> {
if (!this.#getValueState) {
throw new Error('Value state not found');
}
return this.#getValueState.updateValue(value);
}
}
59 changes: 59 additions & 0 deletions src/matter/to-iobroker/SmokeCoAlarmToIoBroker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import ChannelDetector from '@iobroker/type-detector';
import { SmokeCoAlarm } from '@matter/main/clusters';
import type { Endpoint, PairedNode } from '@project-chip/matter.js/device';
import { PropertyType } from '../../lib/devices/DeviceStateObject';
import type { DetectedDevice, DeviceOptions } from '../../lib/devices/GenericDevice';
import { GenericDeviceToIoBroker } from './GenericDeviceToIoBroker';
import { FireAlarm } from '../../lib';

export class SmokeCoAlarmToIoBroker extends GenericDeviceToIoBroker {
readonly #ioBrokerDevice: FireAlarm;

constructor(
node: PairedNode,
endpoint: Endpoint,
rootEndpoint: Endpoint,
adapter: ioBroker.Adapter,
endpointDeviceBaseId: string,
deviceTypeName: string,
defaultConnectionStateId: string,
defaultName: string,
) {
super(
adapter,
node,
endpoint,
rootEndpoint,
endpointDeviceBaseId,
deviceTypeName,
defaultConnectionStateId,
defaultName,
);

this.#ioBrokerDevice = new FireAlarm(
{ ...ChannelDetector.getPatterns().fireAlarm, isIoBrokerDevice: false } as DetectedDevice,
adapter,
this.enableDeviceTypeStates(),
);
const smokeAlarm = this.appEndpoint.getClusterClient(SmokeCoAlarm.Complete);
if (smokeAlarm && !smokeAlarm.supportedFeatures.smokeAlarm) {
adapter.log.info(
'Smoke alarm is not supported by device, but ioBroker does not support CO2 alarm currently.',
);
}
}

protected enableDeviceTypeStates(): DeviceOptions {
this.enableDeviceTypeStateForAttribute(PropertyType.Value, {
endpointId: this.appEndpoint.getNumber(),
clusterId: SmokeCoAlarm.Cluster.id,
attributeName: 'smokeState',
convertValue: (value: SmokeCoAlarm.AlarmState) => value !== SmokeCoAlarm.AlarmState.Normal,
});
return super.enableDeviceTypeStates();
}

get ioBrokerDevice(): FireAlarm {
return this.#ioBrokerDevice;
}
}
4 changes: 4 additions & 0 deletions src/matter/to-iobroker/ioBrokerFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { ExtendedColorLightToIoBroker } from './ExtendedColorLightToIoBroker';
import { WindowCoveringToIoBroker } from './WindowCoveringToIoBroker';
import { SpeakerToIoBroker } from './SpeakerToIoBroker';
import { ThermostatToIoBroker } from './ThermostatToIoBroker';
import { SmokeCoAlarmToIoBroker } from './SmokeCoAlarmToIoBroker';

export function identifyDeviceTypes(endpoint: Endpoint): {
utilityTypes: { deviceType: DeviceTypeModel; revision: number }[];
Expand Down Expand Up @@ -103,6 +104,9 @@ async function ioBrokerDeviceFabric(
case Devices.OnOffPlugInUnitDeviceDefinition.deviceType:
DeviceType = OnOffPlugInUnitToIoBroker;
break;
case Devices.SmokeCoAlarmDeviceDefinition.deviceType:
DeviceType = SmokeCoAlarmToIoBroker;
break;
case Devices.SpeakerDeviceDefinition.deviceType:
DeviceType = SpeakerToIoBroker;
break;
Expand Down

0 comments on commit 88c9919

Please sign in to comment.