Skip to content

Instantly share code, notes, and snippets.

@faust93
Last active February 20, 2024 20:35
Z2M external converter for Woox R7051 Siren

Zigbee2Mqtt external converter for Woox R7051 Siren

Woox R7051 Z2M converter with siren volume,brightness,duration controls exposed

r7051.js:

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 ota = require('zigbee-herdsman-converters/lib/ota');
const tuya = require('zigbee-herdsman-converters/lib/tuya');
const {} = require('zigbee-herdsman-converters/lib/tuya');
const utils = require('zigbee-herdsman-converters/lib/utils');
const globalStore = require('zigbee-herdsman-converters/lib/store');
const e = exposes.presets;
const ea = exposes.access;

const woox = {
    fz: {
        siren_brightness: {
            cluster: 'ssIasWd',
            type: ['attributeReport', 'readResponse'],
            convert: (model, msg, publish, options, meta) => {
                const result = {};
                if (msg.data.hasOwnProperty('1')) {
                    result['brightness'] = msg.data['1'];
                }
                return result;
            },
        },
        siren_duration_volume: {
            cluster: 'ssIasWd',
            type: ['attributeReport', 'readResponse'],
            convert: (model, msg, publish, options, meta) => {
                const result = {};
                if (msg.data.hasOwnProperty('maxDuration')) result['duration'] = msg.data.maxDuration;
                if (msg.data.hasOwnProperty('2')) {
                    result['volume'] = msg.data['2'];
                }
                return result;
            },
        },
    },
    tz: {
        ts0219_brightness: {
            key: ['brightness'],
            convertSet: async (entity, key, value, meta) => {
                await entity.write('ssIasWd', {0x0001: {value: value, type: 0x20}});
            },
            convertGet: async (entity, key, meta) => {
                await entity.read('ssIasWd', [0x0001]);
            },
        },
    },
};

const definition = {
    fingerprint: [{ modelID: 'TS0219', manufacturerName: '_TYZB01_ynsiasng' }],
    zigbeeModel: ['TS0219'],
    model: 'R7051',
    vendor: 'Woox',
    description: 'Smart Indoor Siren',
    fromZigbee: [fz.battery, fz.power_source, fz.ias_alarm_only_alarm_1, woox.fz.siren_brightness, woox.fz.siren_duration_volume],
    toZigbee: [tz.ts0216_alarm, woox.tz.ts0219_brightness, tz.ts0216_duration, tz.ts0216_volume],
    exposes: [e.battery(), e.battery_voltage(), e.binary('alarm', ea.STATE, true, false),
             e.binary('ac_connected', ea.STATE, true, false).withDescription('Is the device plugged in'),
             e.binary('alarm', ea.STATE_SET, true, false).withDescription('Manual start of siren'),
             e.numeric('volume', ea.ALL).withValueMin(0).withValueMax(100).withDescription('Volume of siren'),
             e.numeric('duration', ea.ALL).withValueMin(0).withValueMax(3600).withDescription('Duration of siren'),
             e.numeric('brightness', ea.ALL).withValueMin(0).withValueMax(100).withDescription('Brightness of siren')],
    meta: { disableDefaultResponse: true },
    configure: async (device, coordinatorEndpoint, logger) => {
        const endpoint = device.getEndpoint(1);
        const bindClusters = ['genPowerCfg'];
        await reporting.bind(endpoint, coordinatorEndpoint, bindClusters);
        await reporting.batteryVoltage(endpoint);
        await reporting.batteryPercentageRemaining(endpoint);
        if (device.powerSource == 'Mains (3 phase)') {
            device.powerSource = 'Mains (single phase)';
        } else if (device.powerSource == 'Emergency mains and transfer switch') {
            device.powerSource = 'Battery';
        }
    },
};

module.exports = definition;

How To

  1. Place r7051.js file inside the data folder (see external-converters for the details)
  2. Add the following lines to the configuration.yaml:
external_converters:
  - r7051.js
  1. Restart Z2M

Mqtt Payload

To trigger your siren send the following payload to the respective z2m mqtt topic, like zigbee2mqtt/woox_buzzer/set:

{"duration": 2, "brightness":50, "volume": 50, "alarm": true}
@miloumeeloo
Copy link

Can you please explain how do you use the payload in HA? I tried with both mqtt siren and switch without success.

@faust93
Copy link
Author

faust93 commented Feb 20, 2024

Can you please explain how do you use the payload in HA? I tried with both mqtt siren and switch without success.

HA script:

alias: siren_toggle
sequence:
  - service: mqtt.publish
    data:
      topic: zigbee2mqtt/woox_buzzer/set
      qos: "0"
      payload: >-
        {"duration": {{ duration }}, "brightness": {{ brightness }}, "volume":
        {{ volume }}, "alarm": {{ alarm }}}
mode: single
icon: mdi:alarm-light

To call the script:

action:
  - service: script.siren_toggle
    data:
      duration: 15
      brightness: 50
      volume: 90
      alarm: 1

@miloumeeloo
Copy link

Thanks a lot.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment