UNPKG

@project-chip/matter.js

Version:
1,049 lines (981 loc) 39.8 kB
/** * @license * Copyright 2022-2025 Matter.js Authors * SPDX-License-Identifier: Apache-2.0 */ import * as MatterClusters from "#clusters"; import { ClusterId, DeviceTypeId } from "#types"; import { capitalize } from "@matter/general"; import { MatterModel } from "@matter/model"; /** * General device classification categories. */ export enum DeviceClasses { /** Node device type. */ Node = "Node", /** * Utility device type. * A Utility device type supports configuration and settings. */ Utility = "Utility", /** * Application device type. * Application devices types are typically the most datatype endpoints on a node and in the network. */ App = "App", /** * Simple device type. * A Simple device type supports local control that is persistent, independent, and unsupervised. */ Simple = "Simple", /** * Dynamic device type. * A Dynamic device type supports intelligent and supervisory services, such as commissioning, * monitoring, trend analysis, scheduling and central management. A dynamic device type is an * application device type. */ Dynamic = "Dynamic", /** There exists a client application cluster on the endpoint. */ Client = "Client", /** There exists a server application cluster on the endpoint. */ Server = "Server", /** The device type is composed of 2 or more device types. */ Composed = "Composed", /** Composed device type that is composed of 2 or more endpoints with the same device type. */ Multiple = "Multiple", /** The endpoint is an Initiator for Zigbee EZ-Mode Finding & Binding. */ "EZInitiator" = "EZ-Initiator", /** The endpoint is a Target for Zigbee EZ-Mode Finding & Binding. */ "EZTarget" = "EZ-Target", /** * The endpoint represents a Bridged Device, for which information about the state of * its power source is available to the Bridge */ BridgedPowerSourceInfo = "BridgedPowerSourceInfo", } export interface DeviceTypeDefinition { name: string; code: DeviceTypeId; deviceClass: DeviceClasses; superSet?: string; revision: number; requiredServerClusters: ClusterId[]; optionalServerClusters: ClusterId[]; requiredClientClusters: ClusterId[]; optionalClientClusters: ClusterId[]; unknown: boolean; } export const DeviceTypeDefinition = ({ name, code, deviceClass, superSet, revision, requiredServerClusters = [], optionalServerClusters = [], requiredClientClusters = [], optionalClientClusters = [], unknown = false, }: { name: string; code: number; deviceClass: DeviceClasses; superSet?: string; revision: number; requiredServerClusters?: ClusterId[]; optionalServerClusters?: ClusterId[]; requiredClientClusters?: ClusterId[]; optionalClientClusters?: ClusterId[]; unknown?: boolean; }): DeviceTypeDefinition => ({ name, code: DeviceTypeId(code), deviceClass, superSet, revision, requiredServerClusters, optionalServerClusters, requiredClientClusters, optionalClientClusters, unknown, }); /** * @deprecated These definitions will not be updated beyond Matter 1.1, please instead use definitions in ../endpoint. */ export const DeviceTypes: { [key: string]: DeviceTypeDefinition } = { // Utility Device Types // A Utility device type supports configuration and settings. /** * This represents a Root Node for devices. * @see {@link MatterSpecification.v10.Device} § 2.1 */ ROOT: DeviceTypeDefinition({ name: "MA-rootdevice", code: 0x0016, deviceClass: DeviceClasses.Node, revision: 1, requiredServerClusters: [ MatterClusters.BasicInformationCluster.id, MatterClusters.AccessControlCluster.id, MatterClusters.GroupKeyManagementCluster.id, MatterClusters.GeneralCommissioningCluster.id, MatterClusters.AdministratorCommissioningCluster.id, MatterClusters.OperationalCredentialsCluster.id, MatterClusters.GeneralDiagnosticsCluster.id, ], optionalServerClusters: [ MatterClusters.PowerSourceConfigurationCluster.id, MatterClusters.TimeSynchronizationCluster.id, MatterClusters.NetworkCommissioningCluster.id, // mandatory if !CustomNetworkConfig MatterClusters.LocalizationConfigurationCluster.id, // mandatory if LanguageLocale MatterClusters.TimeFormatLocalizationCluster.id, // mandatory if TimeLocale MatterClusters.UnitLocalizationCluster.id, // mandatory if UnitLocale MatterClusters.DiagnosticLogsCluster.id, MatterClusters.SoftwareDiagnosticsCluster.id, MatterClusters.EthernetNetworkDiagnosticsCluster.id, // optional if Ethernet MatterClusters.WiFiNetworkDiagnosticsCluster.id, // optional if WiFi MatterClusters.ThreadNetworkDiagnosticsCluster.id, // optional if Thread ], }), /** * This represents a Power Source Node for devices. * @see {@link MatterSpecification.v10.Device} § 2.2 */ POWER_SOURCE: DeviceTypeDefinition({ name: "MA-powersource", code: 0x011, deviceClass: DeviceClasses.Node, // ??? revision: 1, requiredServerClusters: [ MatterClusters.PowerSourceCluster.id, // any cluster features allowed ], }), /** * An OTA Requestor is a device that is capable of receiving an OTA software * update. * @see {@link MatterSpecification.v10.Device} § 2.3 */ OTA_REQUESTOR: DeviceTypeDefinition({ name: "MA-otarequestor", code: 0x012, deviceClass: DeviceClasses.Node, // ??? revision: 1, requiredServerClusters: [ //OtaSoftwareUpdateRequestorCluster.id ], requiredClientClusters: [ //OtaSoftwareUpdateProviderCluster.id ], }), /** * An OTA Provider is a node that is capable of providing an OTA software * update to other nodes on the same fabric. * @see {@link MatterSpecification.v10.Device} § 2.4 */ OTA_PROVIDER: DeviceTypeDefinition({ name: "MA-otaprovider", code: 0x0014, deviceClass: DeviceClasses.Node, // ??? revision: 1, requiredServerClusters: [ //OtaSoftwareUpdateProviderCluster.id ], optionalClientClusters: [ //OtaSoftwareUpdateRequestorCluster.id ], }), /** * This represents a Aggregator Node. * @see {@link MatterSpecification.v10.Device} § 2.5 */ AGGREGATOR: DeviceTypeDefinition({ name: "MA-aggregator", code: 0x000e, deviceClass: DeviceClasses.Utility, revision: 1, optionalServerClusters: [MatterClusters.ActionsCluster.id, MatterClusters.IdentifyCluster.id], }), /** * This represents a Bridged Node to identify a bridged device without Power Source information. * @see {@link MatterSpecification.v10.Device} § 2.6 */ BRIDGED_NODE: DeviceTypeDefinition({ name: "MA-bridgednode", code: 0x0013, deviceClass: DeviceClasses.Simple, revision: 1, requiredServerClusters: [MatterClusters.BridgedDeviceBasicInformationCluster.id], }), /** * This represents a Bridged Node to identify a bridged device with Power Source information. * @see {@link MatterSpecification.v10.Device} § 2.6 */ BRIDGED_DEVICE_WITH_POWERSOURCE_INFO: DeviceTypeDefinition({ name: "MA-bridgeddevice", code: 0x0013, deviceClass: DeviceClasses.BridgedPowerSourceInfo, revision: 1, requiredServerClusters: [ MatterClusters.BridgedDeviceBasicInformationCluster.id, MatterClusters.PowerSourceConfigurationCluster.id, MatterClusters.PowerSourceCluster.id, // any cluster features allowed ], }), /* Application Device Types */ /* Application devices types are typically the most datatype endpoints on a node and in the network. */ /* ------------------------- Lighting ------------------------------- */ /** * The On/Off Light is a lighting device that is capable of being switched * on or off by means of a bound controller device such as anOn/Off Light * Switch or a Dimmer Switch. In addition, an on/off light is also capable * of being switched by means of a bound occupancy sensor. * @see {@link MatterSpecification.v10.Device} § 4.1 */ ON_OFF_LIGHT: DeviceTypeDefinition({ name: "MA-onofflight", code: 0x0100, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.OnOffCluster.id, ], optionalServerClusters: [MatterClusters.LevelControlCluster.id], optionalClientClusters: [MatterClusters.OccupancySensingCluster.id], }), /** * A Dimmable Light is a lighting device that is capable of being switched * on or off and the intensity of its light adjusted by means of a bound * controller device such as a Dimmer Switch or a Color Dimmer Switch. * In addition, a Dimmable Light device is also capable of being switched * by means of a bound occupancy sensor or other device(s). * @see {@link MatterSpecification.v10.Device} § 4.2 */ DIMMABLE_LIGHT: DeviceTypeDefinition({ name: "MA-dimmablelight", code: 0x0101, deviceClass: DeviceClasses.Simple, superSet: "ON_OFF_LIGHT", revision: 2, requiredServerClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.OnOffCluster.id, MatterClusters.LevelControlCluster.id, ], optionalClientClusters: [MatterClusters.OccupancySensingCluster.id], }), /** * A Color Temperature Light is a lighting device that is capable of being * switched on or off, the intensity of its light adjusted, and its * color temperature adjusted by means of a bound controller device such * as a Color Dimmer Switch. * @see {@link MatterSpecification.v10.Device} § 4.3 */ COLOR_TEMPERATURE_LIGHT: DeviceTypeDefinition({ name: "MA-colortemperaturelight", code: 0x010c, deviceClass: DeviceClasses.Simple, superSet: "DIMMABLE_LIGHT", revision: 2, requiredServerClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.OnOffCluster.id, MatterClusters.LevelControlCluster.id, MatterClusters.ColorControlCluster.id, ], }), /** * An Extended Color Light is a lighting device that is capable of being * switched on or off, the intensity of its light adjusted, and its color * adjusted by means of a bound controller device such as a Color Dimmer * Switch or Control Bridge. The device supports adjustment of color by * means of hue/saturation, enhanced hue, color looping, XY coordinates, * and color temperature. In addition, the extended color light is also * capable of being switched by means of a bound occupancy sensor. * @see {@link MatterSpecification.v10.Device} § 4.4 */ EXTENDED_COLOR_LIGHT: DeviceTypeDefinition({ name: "MA-extendedcolorlight", code: 0x010d, deviceClass: DeviceClasses.Simple, superSet: "COLOR_TEMPERATURE_LIGHT", revision: 2, requiredServerClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.OnOffCluster.id, MatterClusters.LevelControlCluster.id, MatterClusters.ColorControlCluster.id, ], }), /* ------------ Smart Plugs/outlets and other actuators ----------------- */ /** * An On/Off Plug-in Unit is a device that is capable of being switched on * or off by means of a bound controller device such as an On/Off Light * Switch or a Dimmer Switch. The On/Off Plug-in Unit is typically used * to control a conventional non-communicating light by switching its mains * connection. Other appliances can be controlled this way as well. * @see {@link MatterSpecification.v10.Device} § 5.1 */ ON_OFF_PLUGIN_UNIT: DeviceTypeDefinition({ name: "MA-onoffpluginunit", code: 0x010a, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.OnOffCluster.id, ], optionalServerClusters: [MatterClusters.LevelControlCluster.id], }), /** * A Dimmable Plug-In Unit is a device that is capable of being switched on * or off and have its level adjusted by means of a bound controller device * such as a Dimmer Switch or a Color Dimmer Switch. The Dimmable Plug-in * Unit is typically used to control a conventional non-communicating light * through its mains connection using phase cutting. * @see {@link MatterSpecification.v10.Device} § 5.2 */ DIMMABLE_PLUGIN_UNIT: DeviceTypeDefinition({ name: "MA-dimmablepluginunit", code: 0x010b, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.OnOffCluster.id, MatterClusters.LevelControlCluster.id, ], }), /** * A Pump device is a pump that may have variable speed. It may have * optional built-in sensors and a regulation mechanism. It is typically * used for pumping fluids like water. * @see {@link MatterSpecification.v10.Device} § 5.3 */ PUMP: DeviceTypeDefinition({ name: "MA-pump", code: 0x0303, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [ MatterClusters.OnOffCluster.id, MatterClusters.PumpConfigurationAndControlCluster.id, MatterClusters.IdentifyCluster.id, ], optionalServerClusters: [ MatterClusters.LevelControlCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.TemperatureMeasurementCluster.id, MatterClusters.PressureMeasurementCluster.id, MatterClusters.FlowMeasurementCluster.id, ], optionalClientClusters: [ MatterClusters.TemperatureMeasurementCluster.id, MatterClusters.PressureMeasurementCluster.id, MatterClusters.FlowMeasurementCluster.id, MatterClusters.OccupancySensingCluster.id, ], }), /* ---------------- Switches and Controls ----------------------- */ /** * An On/Off Light Switch is a controller device that, when bound to a * lighting device such as an On/Off Light, is capable of being used to * switch the device on or off. * @see {@link MatterSpecification.v10.Device} § 6.1 */ ON_OFF_LIGHT_SWITCH: DeviceTypeDefinition({ name: "MA-onofflightswitch", code: 0x0103, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id], requiredClientClusters: [MatterClusters.IdentifyCluster.id, MatterClusters.OnOffCluster.id], optionalClientClusters: [MatterClusters.GroupsCluster.id], }), /** * A Dimmer Switch is a controller device that, when bound to a lighting * device such as a Dimmable Light, is capable of being used to switch the * device on or off and adjust the intensity of the light being emitted. * @see {@link MatterSpecification.v10.Device} § 6.2 */ DIMMER_SWITCH: DeviceTypeDefinition({ name: "MA-dimmerswitch", code: 0x0104, deviceClass: DeviceClasses.Simple, superSet: "ON_OFF_LIGHT_SWITCH", revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id], requiredClientClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.OnOffCluster.id, MatterClusters.LevelControlCluster.id, ], optionalClientClusters: [MatterClusters.GroupsCluster.id], }), /** * A Color Dimmer Switch is a controller device that, when bound to a * lighting device such as an Extended Color Light, is capable of being * used to adjust the color of the light being emitted. * @see {@link MatterSpecification.v10.Device} § 6.3 */ COLOR_DIMMER_SWITCH: DeviceTypeDefinition({ name: "MA-colordimmerswitch", code: 0x0105, deviceClass: DeviceClasses.Simple, superSet: "DIMMER_SWITCH", revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id], requiredClientClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.OnOffCluster.id, MatterClusters.LevelControlCluster.id, MatterClusters.ColorControlCluster.id, ], optionalClientClusters: [MatterClusters.GroupsCluster.id], }), /** * A Control Bridge is a controller device that, when bound to a lighting * device such as an Extended Color Light, is capable of being used to * switch the device on or off, adjust the intensity of the light being * emitted and adjust the color of the light being emitted. In addition, a * Control Bridge device is capable of being used for setting scenes. * @see {@link MatterSpecification.v10.Device} § 6.4 */ CONTROL_BRIDGE: DeviceTypeDefinition({ name: "MA-controlbridge", code: 0x0840, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id], requiredClientClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.OnOffCluster.id, MatterClusters.LevelControlCluster.id, MatterClusters.ColorControlCluster.id, ], optionalClientClusters: [ MatterClusters.IlluminanceMeasurementCluster.id, MatterClusters.OccupancySensingCluster.id, ], }), /** * A Pump Controller device is capable of configuring and controlling a * Pump device. * @see {@link MatterSpecification.v10.Device} § 6.5 */ PUMP_CONTROLLER: DeviceTypeDefinition({ name: "MA-pumpcontroller", code: 0x0304, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id], requiredClientClusters: [ MatterClusters.BindingCluster.id, MatterClusters.OnOffCluster.id, MatterClusters.PumpConfigurationAndControlCluster.id, ], optionalClientClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.LevelControlCluster.id, MatterClusters.TemperatureMeasurementCluster.id, MatterClusters.PressureMeasurementCluster.id, MatterClusters.FlowMeasurementCluster.id, ], }), /** * This defines conformance for the Generic Switch device type. * @see {@link MatterSpecification.v10.Device} § 6.6 */ GENERIC_SWITCH: DeviceTypeDefinition({ name: "MA-genericswitch", code: 0x000f, deviceClass: DeviceClasses.Simple, revision: 1, requiredServerClusters: [MatterClusters.IdentifyCluster.id, MatterClusters.SwitchCluster.id], optionalServerClusters: [MatterClusters.FixedLabelCluster.id], }), /* ---------------------------- Sensors --------------------------- */ /** * This defines conformance to the Contact Sensor device type. * @see {@link MatterSpecification.v10.Device} § 7.1 */ CONTACT_SENSOR: DeviceTypeDefinition({ name: "MA-contactsensor", code: 0x0015, deviceClass: DeviceClasses.Simple, revision: 1, requiredServerClusters: [MatterClusters.IdentifyCluster.id, MatterClusters.BooleanStateCluster.id], }), /** * A Light Sensor device is a measurement and sensing device that is capable * of measuring and reporting the intensity of light (illuminance) to which * the sensor is being subjected. * @see {@link MatterSpecification.v10.Device} § 7.2 */ LIGHT_SENSOR: DeviceTypeDefinition({ name: "MA-lightsensor", code: 0x0106, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id, MatterClusters.IlluminanceMeasurementCluster.id], optionalClientClusters: [MatterClusters.GroupsCluster.id], }), /** * An Occupancy Sensor is a measurement and sensing device that is capable * of measuring and reporting the occupancy state in a designated area. * @see {@link MatterSpecification.v10.Device} § 7.3 */ OCCUPANCY_SENSOR: DeviceTypeDefinition({ name: "MA-occupancysensor", code: 0x0107, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id, MatterClusters.OccupancySensingCluster.id], optionalClientClusters: [MatterClusters.GroupsCluster.id], }), /** * A Temperature Sensor device reports measurements of temperature. * @see {@link MatterSpecification.v10.Device} § 7.4 */ TEMPERATURE_SENSOR: DeviceTypeDefinition({ name: "MA-tempsensor", code: 0x0302, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.TemperatureMeasurementCluster.id, MatterClusters.IdentifyCluster.id], }), /** * A Pressure Sensor device measures and reports the pressure of a fluid. * @see {@link MatterSpecification.v10.Device} § 7.5 */ PRESSURE_SENSOR: DeviceTypeDefinition({ name: "MA-pressuresensor", code: 0x0305, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.PressureMeasurementCluster.id, MatterClusters.IdentifyCluster.id], }), /** * A Flow Sensor device measures and reports the flow rate of a fluid. * @see {@link MatterSpecification.v10.Device} § 7.6 */ FLOW_SENSOR: DeviceTypeDefinition({ name: "MA-flowsensor", code: 0x0306, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.FlowMeasurementCluster.id, MatterClusters.IdentifyCluster.id], }), /** * A humidity sensor (in most cases a Relative humidity sensor) reports humidity measurements. * @see {@link MatterSpecification.v10.Device} § 7.7 */ HUMIDITY_SENSOR: DeviceTypeDefinition({ name: "MA-humiditysensor", code: 0x0307, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.RelativeHumidityMeasurementCluster.id, ], }), /** * An On/Off Sensor is a measurement and sensing device that, when bound to * a lighting device such as a Dimmable Light, is capable of being used to * switch the device on or off. * @see {@link MatterSpecification.v10.Device} § 7.8 */ ON_OFF_SENSOR: DeviceTypeDefinition({ name: "MA-onoffsensor", code: 0x0850, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id], requiredClientClusters: [MatterClusters.IdentifyCluster.id, MatterClusters.OnOffCluster.id], optionalClientClusters: [ MatterClusters.GroupsCluster.id, MatterClusters.LevelControlCluster.id, MatterClusters.ColorControlCluster.id, ], }), /* ---------------------------- Closures --------------------------- */ /** * A Door Lock is a device used to secure a door. It is possible to actuate * a door lock either by means of a manual or a remote method. * @see {@link MatterSpecification.v10.Device} § 8.1 */ DOOR_LOCK: DeviceTypeDefinition({ name: "MA-doorlock", code: 0x000a, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id, MatterClusters.DoorLockCluster.id], optionalServerClusters: [ //MatterClusters.PollControlCluster.id, //0x20 Not existing in Specs 1.1 ], optionalClientClusters: [MatterClusters.TimeSynchronizationCluster.id], }), /** * A Door Lock Controller is a device capable of controlling a door lock. * @see {@link MatterSpecification.v10.Device} § 8.2 */ DOOR_LOCK_CONTROLLER: DeviceTypeDefinition({ name: "MA-doorlockcontroller", code: 0x000b, deviceClass: DeviceClasses.Simple, revision: 2, optionalServerClusters: [ MatterClusters.IdentifyCluster.id, // Optional if EZ-Target MatterClusters.TimeSynchronizationCluster.id, ], requiredClientClusters: [MatterClusters.DoorLockCluster.id], optionalClientClusters: [ MatterClusters.IdentifyCluster.id, // Optional if EZ-Initiator MatterClusters.GroupsCluster.id, // Required if Zigbee ], }), /** * This defines conformance to the Window Covering device type. * @see {@link MatterSpecification.v10.Device} § 8.3 */ WINDOW_COVERING: DeviceTypeDefinition({ name: "MA-windowcovering", code: 0x0202, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id, MatterClusters.WindowCoveringCluster.id], optionalServerClusters: [ MatterClusters.GroupsCluster.id, // Required when Awake, else optional ], }), /** * A Window Covering Controller is a device that controls an automatic * window covering. * @see {@link MatterSpecification.v10.Device} § 8.4 */ WINDOW_COVERING_CONTROLLER: DeviceTypeDefinition({ name: "MA-windowcoveringcontroller", code: 0x0203, deviceClass: DeviceClasses.Simple, revision: 2, optionalServerClusters: [MatterClusters.IdentifyCluster.id], requiredClientClusters: [MatterClusters.WindowCoveringCluster.id], optionalClientClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, // Required when Awake, else optional ], }), /* ---------------------------- HVAC --------------------------- */ /** * A Heating/Cooling Unit is a device capable of heating or cooling a space * in a house. It is not mandatory to provide both functionalities (for * example, the device may just heat but not cool). It may be an indoor air * handler. * @see {@link MatterSpecification.v10.Device} § 9.1 */ HEATING_COOLING_UNIT: DeviceTypeDefinition({ name: "MA-heatcool", code: 0x0300, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.OnOffCluster.id, ], optionalServerClusters: [MatterClusters.LevelControlCluster.id, MatterClusters.FanControlCluster.id], requiredClientClusters: [MatterClusters.ThermostatCluster.id], }), /** * A Thermostat device is capable of having either built-in or separate * sensors for temperature, humidity or occupancy. It allows the desired * temperature to be set either remotely or locally. The thermostat is * capable of sending heating and/or cooling requirement notifications to a * heating/cooling unit (for example, an indoor air handler) or is * capable of including a mechanism to control a heating or cooling unit * directly. * @see {@link MatterSpecification.v10.Device} § 9.2 */ THERMOSTAT: DeviceTypeDefinition({ name: "MA-thermostat", code: 0x0301, deviceClass: DeviceClasses.Simple, revision: 2, requiredServerClusters: [MatterClusters.IdentifyCluster.id, MatterClusters.ThermostatCluster.id], optionalServerClusters: [ MatterClusters.GroupsCluster.id, // Required when Awake MatterClusters.ThermostatUserInterfaceConfigurationCluster.id, MatterClusters.TimeSynchronizationCluster.id, ], optionalClientClusters: [ MatterClusters.RelativeHumidityMeasurementCluster.id, MatterClusters.TimeSynchronizationCluster.id, MatterClusters.FanControlCluster.id, MatterClusters.TemperatureMeasurementCluster.id, MatterClusters.OccupancySensingCluster.id, ], }), /** * This defines conformance to the Fan device type. * @see {@link MatterSpecification.v10.Device} § 9.3 */ FAN: DeviceTypeDefinition({ name: "MA-fan", code: 0x002b, deviceClass: DeviceClasses.Simple, revision: 1, requiredServerClusters: [ MatterClusters.IdentifyCluster.id, MatterClusters.GroupsCluster.id, MatterClusters.FanControlCluster.id, ], }), /* ---------------------------- Media --------------------------- */ /** * A Video Player (either Basic or Casting) represents a device that is able * to play media to a physical output or to a display screen which is part * of the device. * A Basic Video Player has playback controls (play, pause, etc.) and keypad * remote controls (up, down, number input), but is not able to launch * content and is not a content app platform (the Casting Video Player * device type is used for these functions). * @see {@link MatterSpecification.v10.Device} § 10.2 */ BASIC_VIDEO_PLAYER: DeviceTypeDefinition({ name: "MA-basic-videoplayer", code: 0x0028, deviceClass: DeviceClasses.Simple, revision: 1, requiredServerClusters: [ MatterClusters.OnOffCluster.id, MatterClusters.MediaPlaybackCluster.id, MatterClusters.KeypadInputCluster.id, ], optionalServerClusters: [ MatterClusters.WakeOnLanCluster.id, MatterClusters.ChannelCluster.id, MatterClusters.TargetNavigatorCluster.id, MatterClusters.MediaInputCluster.id, // Required if PhysicalInputs MatterClusters.LowPowerCluster.id, MatterClusters.AudioOutputCluster.id, ], }), /** * A Casting Video Player has basic controls for playback (play, pause, * etc.) and keypad input (up, down, number input), and is able to launch * content. * @see {@link MatterSpecification.v10.Device} § 10.3 */ CASTING_VIDEO_PLAYER: DeviceTypeDefinition({ name: "MA-casting-videoplayer", code: 0x0023, deviceClass: DeviceClasses.Simple, revision: 1, requiredServerClusters: [ MatterClusters.OnOffCluster.id, MatterClusters.MediaPlaybackCluster.id, MatterClusters.KeypadInputCluster.id, MatterClusters.ContentLauncherCluster.id, ], optionalServerClusters: [ MatterClusters.WakeOnLanCluster.id, MatterClusters.ChannelCluster.id, MatterClusters.TargetNavigatorCluster.id, MatterClusters.MediaInputCluster.id, // Required if PhysicalInputs MatterClusters.LowPowerCluster.id, MatterClusters.AudioOutputCluster.id, MatterClusters.ApplicationLauncherCluster.id, // Required if ContentAppPlatform MatterClusters.AccountLoginCluster.id, ], }), /** * This feature controls the speaker volume of the device. * @see {@link MatterSpecification.v10.Device} § 10.4 */ SPEAKER: DeviceTypeDefinition({ name: "MA-speaker", code: 0x0022, deviceClass: DeviceClasses.Simple, revision: 1, requiredServerClusters: [MatterClusters.OnOffCluster.id, MatterClusters.LevelControlCluster.id], }), /** * A Content App is usually an application built by a Content Provider. A * Casting Video Player with a Content App Platform is able to launch * Content Apps and represent these apps as separate endpoints. * @see {@link MatterSpecification.v10.Device} § 10.5 */ CONTENT_APP: DeviceTypeDefinition({ name: "MA-contentapp", code: 0x0024, deviceClass: DeviceClasses.Simple, revision: 1, requiredServerClusters: [ MatterClusters.KeypadInputCluster.id, MatterClusters.ApplicationLauncherCluster.id, MatterClusters.ApplicationBasicCluster.id, ], optionalServerClusters: [ MatterClusters.ChannelCluster.id, MatterClusters.TargetNavigatorCluster.id, MatterClusters.MediaPlaybackCluster.id, MatterClusters.ContentLauncherCluster.id, MatterClusters.AccountLoginCluster.id, ], }), /** * A Casting Video Client is a client that can launch content on a Casting * Video Player, for example, a Smart Speaker or a Content Provider phone * app. * @see {@link MatterSpecification.v10.Device} § 10.6 */ CASTING_VIDEO_CLIENT: DeviceTypeDefinition({ name: "MA-casting-videoclient", code: 0x0029, deviceClass: DeviceClasses.Simple, revision: 1, requiredClientClusters: [ MatterClusters.OnOffCluster.id, MatterClusters.KeypadInputCluster.id, MatterClusters.ContentLauncherCluster.id, MatterClusters.ApplicationBasicCluster.id, ], optionalClientClusters: [ MatterClusters.LevelControlCluster.id, MatterClusters.WakeOnLanCluster.id, MatterClusters.ChannelCluster.id, MatterClusters.TargetNavigatorCluster.id, MatterClusters.MediaPlaybackCluster.id, MatterClusters.MediaInputCluster.id, MatterClusters.LowPowerCluster.id, MatterClusters.AudioOutputCluster.id, MatterClusters.ApplicationLauncherCluster.id, MatterClusters.AccountLoginCluster.id, ], }), /** * A Video Remote Control is a client that can control a Video Player, for * example, a traditional universal remote control. * @see {@link MatterSpecification.v10.Device} § 10.7 */ VIDEO_REMOTE_CONTROL: DeviceTypeDefinition({ name: "MA-video-remotecontrol", code: 0x002a, deviceClass: DeviceClasses.Simple, revision: 1, requiredClientClusters: [ MatterClusters.OnOffCluster.id, MatterClusters.MediaPlaybackCluster.id, MatterClusters.KeypadInputCluster.id, ], optionalClientClusters: [ MatterClusters.LevelControlCluster.id, MatterClusters.WakeOnLanCluster.id, MatterClusters.ChannelCluster.id, MatterClusters.TargetNavigatorCluster.id, MatterClusters.MediaInputCluster.id, MatterClusters.LowPowerCluster.id, MatterClusters.ContentLauncherCluster.id, MatterClusters.AudioOutputCluster.id, MatterClusters.ApplicationLauncherCluster.id, MatterClusters.AccountLoginCluster.id, ], }), /* ---------------------------- Generic --------------------------- */ /** * This defines conformance to the Mode device type. * @see {@link MatterSpecification.v10.Device} § 11.1 */ MODE_SELECT: DeviceTypeDefinition({ name: "MA-modeselect", code: 0x0027, deviceClass: DeviceClasses.Simple, revision: 1, requiredServerClusters: [MatterClusters.ModeSelectCluster.id], }), }; /** Cache of all device types dynamically generated from model. */ const DynamicDeviceType: { [key: string]: DeviceTypeDefinition } = {}; export const UnknownDeviceType = (code: number, revision: number) => DeviceTypeDefinition({ code, name: `Unknown Device Type ${code}`, deviceClass: DeviceClasses.Simple, revision, unknown: true, }); /** @deprecated */ export function getDeviceTypeDefinitionByCode(code: number): DeviceTypeDefinition | undefined { for (const key in DeviceTypes) { if (DeviceTypes[key].code === code) { return DeviceTypes[key]; } } return undefined; } export function getDeviceTypeDefinitionFromModelByCode(code: number): DeviceTypeDefinition | undefined { if (DynamicDeviceType[code] !== undefined) { return DynamicDeviceType[code]; } const device = MatterModel.standard.deviceTypes.find(d => d.id === code); if (device === undefined) { return undefined; } const deviceDetails = { name: `MA-${device.name.toLowerCase()}`, revision: 0, code: device.id, deviceClass: capitalize(device.classification) as DeviceClasses, superSet: device.type ?.replace(/([A-Z])/g, "_$1") .substring(1) .toUpperCase(), requiredServerClusters: new Array<ClusterId>(), optionalServerClusters: new Array<ClusterId>(), requiredClientClusters: new Array<ClusterId>(), optionalClientClusters: new Array<ClusterId>(), }; device.requirements.forEach(req => { if (req.id === undefined) { return; } if (req.name === "Descriptor") { const deviceTypeList = req.requirements.find(r => r.element === "attribute" && r.name === "DeviceTypeList"); if (deviceTypeList) { deviceDetails.revision = deviceTypeList.default[0].revision; } } else if (req.element === "serverCluster") { if (req.isMandatory) { deviceDetails.requiredServerClusters.push(ClusterId(req.id)); } else { deviceDetails.optionalServerClusters.push(ClusterId(req.id)); } } else if (req.element === "clientCluster") { if (req.isMandatory) { deviceDetails.requiredClientClusters.push(ClusterId(req.id)); } else { deviceDetails.optionalClientClusters.push(ClusterId(req.id)); } } }); if ( deviceDetails.revision === 0 || (deviceDetails.requiredClientClusters.length === 0 && deviceDetails.requiredServerClusters.length === 0 && deviceDetails.optionalClientClusters.length === 0 && deviceDetails.optionalServerClusters.length === 0) ) { return undefined; } DynamicDeviceType[code] = DeviceTypeDefinition(deviceDetails); return DynamicDeviceType[code]; }