zigbee-herdsman-converters
Version:
Collection of device converters to be used with zigbee-herdsman
184 lines • 8.59 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.develcoModernExtend = void 0;
const zigbee_herdsman_1 = require("zigbee-herdsman");
const exposes_1 = require("./exposes");
const modernExtend_1 = require("./modernExtend");
const manufacturerOptions = { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DEVELCO };
exports.develcoModernExtend = {
addCustomClusterManuSpecificDevelcoGenBasic: () => (0, modernExtend_1.deviceAddCustomCluster)("genBasic", {
ID: 0x0000,
attributes: {
develcoPrimarySwVersion: { ID: 0x8000, type: zigbee_herdsman_1.Zcl.DataType.OCTET_STR, manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DEVELCO },
develcoPrimaryHwVersion: { ID: 0x8020, type: zigbee_herdsman_1.Zcl.DataType.OCTET_STR, manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DEVELCO },
develcoLedControl: { ID: 0x8100, type: zigbee_herdsman_1.Zcl.DataType.BITMAP8, manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DEVELCO },
},
commands: {},
commandsResponse: {},
}),
addCustomClusterManuSpecificDevelcoAirQuality: () => (0, modernExtend_1.deviceAddCustomCluster)("manuSpecificDevelcoAirQuality", {
ID: 0xfc03,
manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DEVELCO,
attributes: {
measuredValue: { ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
minMeasuredValue: { ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
maxMeasuredValue: { ID: 0x0002, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
resolution: { ID: 0x0003, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
},
commands: {},
commandsResponse: {},
}),
readGenBasicPrimaryVersions: () => {
/*
* Develco (and there B2C brand Frient) do not use swBuildId
* The versions are stored in develcoPrimarySwVersion and develcoPrimaryHwVersion, we read them during configure.
*/
const configure = [
async (device, coordinatorEndpoint, definition) => {
for (const ep of device.endpoints) {
if (ep.supportsInputCluster("genBasic")) {
try {
const data = await ep.read("genBasic", ["develcoPrimarySwVersion", "develcoPrimaryHwVersion"], manufacturerOptions);
if (data.develcoPrimarySwVersion !== undefined) {
device.softwareBuildID = data.develcoPrimarySwVersion.join(".");
}
if (data.develcoPrimaryHwVersion !== undefined) {
device.hardwareVersion = data.develcoPrimaryHwVersion.join(".");
}
device.save();
}
catch {
/* catch timeouts of sleeping devices */
}
break;
}
}
},
];
return { configure, isModernExtend: true };
},
voc: (args) => (0, modernExtend_1.numeric)({
name: "voc",
cluster: "manuSpecificDevelcoAirQuality",
attribute: "measuredValue",
reporting: { min: "1_MINUTE", max: "1_HOUR", change: 10 },
description: "Measured VOC value",
// from Sensirion_Gas_Sensors_SGP3x_TVOC_Concept.pdf
// "The mean molar mass of this mixture is 110 g/mol and hence,
// 1 ppb TVOC corresponds to 4.5 μg/m3."
scale: (value, type) => {
if (type === "from") {
return value * 4.5;
}
return value;
},
unit: "µg/m³",
access: "STATE_GET",
...args,
}),
airQuality: () => {
// NOTE: do not setup reporting, this is handled by the voc() modernExtend
const clusterName = "manuSpecificDevelcoAirQuality";
const attributeName = "measuredValue";
const propertyName = "air_quality";
const access = exposes_1.access.STATE;
const expose = exposes_1.presets
.enum("air_quality", access, ["excellent", "good", "moderate", "poor", "unhealthy", "out_of_range", "unknown"])
.withDescription("Measured air quality");
const fromZigbee = [
{
cluster: clusterName,
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
if (msg.data[attributeName] !== undefined) {
const vocPpb = Number.parseFloat(msg.data[attributeName]);
// from aqszb-110-technical-manual-air-quality-sensor-04-08-20.pdf page 6, section 2.2 voc
// this contains a ppb to level mapping table.
// biome-ignore lint/suspicious/noImplicitAnyLet: ignored using `--suppress`
let airQuality;
if (vocPpb <= 65) {
airQuality = "excellent";
}
else if (vocPpb <= 220) {
airQuality = "good";
}
else if (vocPpb <= 660) {
airQuality = "moderate";
}
else if (vocPpb <= 2200) {
airQuality = "poor";
}
else if (vocPpb <= 5500) {
airQuality = "unhealthy";
}
else if (vocPpb > 5500) {
airQuality = "out_of_range";
}
else {
airQuality = "unknown";
}
return { [propertyName]: airQuality };
}
},
},
];
return { exposes: [expose], fromZigbee, isModernExtend: true };
},
batteryLowAA: () => {
/*
* Per the technical documentation for AQSZB-110:
* To detect low battery the system can monitor the "BatteryVoltage" by setting up a reporting interval of every 12 hour.
* When a voltage of 2.5V is measured the battery should be replaced.
* Low batt LED indication–RED LED will blink twice every 60 second.
*
* Similar notes found in other 2x AA powered Develco devices like HMSZB-110 and MOSZB-140
*/
const clusterName = "genPowerCfg";
const attributeName = "BatteryVoltage";
const propertyName = "battery_low";
const expose = exposes_1.presets.battery_low();
const fromZigbee = [
{
cluster: clusterName,
type: ["attributeReport", "readResponse"],
convert: (model, msg, publish, options, meta) => {
if (msg.data[attributeName] !== undefined && msg.data[attributeName] < 255) {
const voltage = Number.parseInt(msg.data[attributeName]);
return { [propertyName]: voltage <= 25 };
}
},
},
];
return { exposes: [expose], fromZigbee, isModernExtend: true };
},
temperature: (args) => (0, modernExtend_1.temperature)({
valueIgnore: [0xffff, -0x8000],
...args,
}),
deviceTemperature: (args) => (0, modernExtend_1.deviceTemperature)({
reporting: { min: "5_MINUTES", max: "1_HOUR", change: 2 }, // Device temperature reports with 2 degree change
valueIgnore: [0xffff, -0x8000],
...args,
}),
currentSummation: (args) => (0, modernExtend_1.numeric)({
name: "current_summation",
cluster: "seMetering",
attribute: "develcoCurrentSummation",
description: "Current summation value sent to the display. e.g. 570 = 0,570 kWh",
access: "SET",
valueMin: 0,
valueMax: 268435455,
...args,
}),
pulseConfiguration: (args) => (0, modernExtend_1.numeric)({
name: "pulse_configuration",
cluster: "seMetering",
attribute: "develcoPulseConfiguration",
description: "Pulses per kwh. Default 1000 imp/kWh. Range 0 to 65535",
access: "ALL",
valueMin: 0,
valueMax: 65535,
...args,
}),
};
//# sourceMappingURL=develco.js.map
;