Skip to content

Instantly share code, notes, and snippets.

@faust93
Last active February 20, 2024 20:35
Show Gist options
  • Save faust93/7c99b63768f3fb376ee129d155752b6d to your computer and use it in GitHub Desktop.
Save faust93/7c99b63768f3fb376ee129d155752b6d to your computer and use it in GitHub Desktop.
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}
@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