I tried for 6 hours today to add zigbee2mqtt support for this device (FFZB1-SM-ECO
). I successfully got it to expose tamper
, but nothing else. I could not get the device to trigger debug logs relating to a smoke alarm going off. I got the device to show a solid red LED, which the docs state indicate a message has been sent, but I saw nothing in debug logs similar to
No converter available for ...
so there was no way for me to continue troubleshooting how to write the converter.
For reference, here’s my custom converter file that worked to expose tamper:
const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
const tz = require('zigbee-herdsman-converters/converters/toZigbee');
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const reporting = require('zigbee-herdsman-converters/lib/reporting');
const extend = require('zigbee-herdsman-converters/lib/extend');
const e = exposes.presets;
const ea = exposes.access;
function postfixWithEndpointName(value, msg, definition, meta) {
// Prevent breaking change https://github.com/Koenkk/zigbee2mqtt/issues/13451
if (!meta) {
meta.logger.warn(`No meta passed to postfixWithEndpointName, update your external converter!`);
meta = { device: null };
}
if (definition.meta && definition.meta.multiEndpoint &&
(!definition.meta.multiEndpointSkip || !definition.meta.multiEndpointSkip.includes(value))) {
const endpointName = definition.hasOwnProperty('endpoint') ?
getKey(definition.endpoint(meta.device), msg.endpoint.ID) : msg.endpoint.ID;
// NOTE: endpointName can be undefined if we have a definition.endpoint and the endpoint is
// not listed.
if (endpointName) return `${value}_${endpointName}`;
}
return value;
}
const fzLocal = {
ias_audio_alarm_1: {
cluster: 'ssIasZone',
type: 'commandStatusChangeNotification',
convert: (model, msg, publish, options, meta) => {
const zoneStatus = msg.data.zonestatus;
const batteryLowProperty = postfixWithEndpointName('battery_low', msg, model, meta);
const tamperProperty = postfixWithEndpointName('tamper', msg, model, meta);
return {
[batteryLowProperty]: (zoneStatus & 1) > 0,
[tamperProperty]: (zoneStatus & 1 << 2) > 0,
};
},
},
};
const definition = {
zigbeeModel: ['FFZB1-SM-ECO'], // The model ID from: Device with modelID 'lumi.sens' is not supported.
model: 'FFZB1-SM-ECO', // Vendor model number, look on the device for a model number
vendor: 'Ecolink', // Vendor of the device (only used for documentation and startup logging)
description: 'Audio Detector: Listens for the siren tone from a UL listed smoke detector in your home and sends signal to your Zigbee HUB', // Description of the device, copy from vendor site. (only used for documentation and startup logging)
fromZigbee: [fzLocal.ias_audio_alarm_1],
toZigbee: [], // Should be empty, unless device can be controlled (e.g. lights, switches).
exposes: [e.battery_low(), e.tamper()], // Defines what this device exposes, used for e.g. Home Assistant discovery and in the frontend
};
module.exports = definition;
I did order a replacement to see if it’s a faulty device. So I’ll try again in a few days but my hopes aren’t high. FYI, I did not have a low battery to test that expose low_battery actually works either.
EDIT:
Replacement has the same issue (I can’t get it to send anything that looks like smoke alarm detection, even when the light turns solid red). It keeps sending the following request so I have reached out to Ecolink to ask for the OTA index file:
type 'commandQueryNextImageRequest', cluster 'genOta', data '{"fieldControl":0,"fileVersion":51905841,"imageType":4,"manufacturerCode":4130}' from endpoint 1 with groupID 0
EDIT 2:
Ecolink said We have no updates for the FFZB1-ECO, either OTA or otherwise.
So I’m at a loss.