Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New device template for SODA Circle S8 window handle _TZE200_j7sgd8po #7565

Closed
clumsy-stefan opened this issue May 27, 2024 · 38 comments
Closed

Comments

@clumsy-stefan
Copy link

clumsy-stefan commented May 27, 2024

Below a new template for the SODA Circle S8 Professional window handle, probably this is of use for someone.

I have the agreement from the supplier/manufacturer (SODA GmbH) to publish it here and have it included in the z2m project!

Just save it as TZE200_j7sgd8po.js in your data directory and include it in your configuration.yaml.

If someone want's to include it in the standard distribution, feel free, unfortunately I don't succeed in making a successful PR (as I don't understand how to include the special functions in the standard library).

Regards

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 tuya = require('zigbee-herdsman-converters/lib/tuya');
const e = exposes.presets;
const ea = exposes.access;
//const extend = require('zigbee-herdsman-converters/lib/extend');
const legacy = require('zigbee-herdsman-converters/lib/legacy');
const utils = require('zigbee-herdsman-converters/lib/utils');
const { Buffer } = require('node:buffer');
/*
const fzLocal = {
        TZE200_j7sgd8po: {
        cluster: 'manuSpecificTuya',
        type: ['commandDataResponse', 'commandDataReport'],
        convert: (model, msg, publish, options, meta) => {
                const splitToAttributes = (limit) => {
                const result = {};
                const len = limit.length;
                let i = 0;
                while (i < len) {
                        const key = limit.readUInt8(i);
                        result[key] = [limit.readUInt8(i + 1), limit.readUInt16BE(i + 2)];
                        i += 4;
                }
                return result;
                };
                const lookup = { 0: 'OFF', 1: 'ON' };

                for (const dpValue of msg.data.dpValues) {
                        const value = legacy.getDataValue(dpValue);
                        const dp = dpValue.dp;
//                      meta.logger.info(`DP: ${dp} -- VALUE = ${value}`);
                        switch (dp) {
                                case 16: return {
                                        state: value ? 'ON' : 'OFF',
                                        trip: 'clear',
                                }
                                case 11: return {
                                        prepay: value ? 'ON' : 'OFF',
                                }
                                case 12: {
//                                      meta.logger.info(`DP: ${dp} -- VALUE = ${value}`);
                                        return {
//                                              clear_energy: value ? 'reset' : 'clear',
                                                clear_energy: 'clear',
                                        }
                                }
                                case 102: {
                                        meta.logger.info(`DP: ${dp} -- VALUE = ${value}`);
                                }
                        }
                }
          },
    },
};
*/

const tzLocal = {
    TZE200_j7sgd8po: {
        key: ['vacation', 'keysound', 'handlesound', 'calibrate'],
        convertSet: async (entity, key, value, meta) => {
                const onOffLookup = { 'ON': 1, 'OFF': 0 };
//              meta.logger.info(`Key: ${key} -- VALUE = ${value}`);
                switch (key) {
                case 'vacation': {
                        var state = [];
                        state[0] = utils.getFromLookup(value, onOffLookup);
                        await tuya.sendDataPointRaw(entity, 107, state);
                        return { state: { vacation: value } };
                }
                case 'keysound': {
                        var state = [];
                        state[0] = utils.getFromLookup(value, onOffLookup);
                        await tuya.sendDataPointRaw(entity, 111, state);
                        return { state: { keysound: value } };
                }
                case 'handlesound': {
                        var state = [];
                        state[0] = utils.getFromLookup(value, onOffLookup);
                        await tuya.sendDataPointRaw(entity, 114, state);
                        return { state: { handlesound: value } };
                }
                case 'calibrate': {
                        var state = [];
//                      state[0] = utils.getFromLookup(value, onOffLookup);
//                      state[0] = value;
                        await tuya.sendDataPointRaw(entity, 120, state);
                        return;
                }
                default: // Unknown key
                        meta.logger.warn(`Unhandled key ${key}`);
                }
        },
    },
};

const definition = {
        fingerprint: tuya.fingerprint('TS0601', ['_TZE200_j7sgd8po']),
        model: 'TS0601',
        vendor: 'TuYa',
        description: 'SODA S8 premium window handle',
        extend: [],
        // fromZigbee: [tuya.fz.datapoints, fzLocal.TZE200_j7sgd8po],
        toZigbee: [tuya.tz.datapoints, tzLocal.TZE200_j7sgd8po],
        fromZigbee: [tuya.fz.datapoints],
        configure: tuya.configureMagicPacket,
        exposes: [
                  e.battery(), e.battery_low(),
                  e.binary('vacation', ea.STATE_SET, 'ON', 'OFF').withDescription('Vacation mode'),
                  e.enum('alarm', ea.STATE, ['ALARM', 'idle']).withDescription('Alarm'),
                  e.binary('alarm_switch', ea.STATE_SET, 'ON', 'OFF').withDescription('Alarm enable'),
                  e.binary('handlesound', ea.STATE_SET, 'ON', 'OFF').withDescription('Handle closed sound'),
                  e.enum('opening_mode', ea.STATE, ['closed', 'tilted']).withDescription('Window tilt'),
                  e.temperature(), e.humidity(),
                  e.binary('keysound', ea.STATE_SET, 'ON', 'OFF')
                                .withDescription('Key beep sound'),
                  e.enum('sensitivity', ea.STATE_SET, ['off', 'low', 'medium', 'high', 'max'])
                                .withDescription('Sensitivity of the alarm sensor'),
                  e.enum('position', ea.STATE, ['up', 'right', 'down', 'left']),
                  e.enum('button_left', ea.STATE, ['released', 'pressed']),
                  e.enum('button_right', ea.STATE, ['released', 'pressed']),
                  e.numeric('duration', ea.STATE_SET).withValueMin(0).withValueMax(300).withValueStep(1)
                                .withUnit('sec').withDescription('Duration of the alarm')
                                .withPreset('default', 180, 'Default value'),
                  e.numeric('update_frequency', ea.STATE_SET).withUnit('min').withDescription('Update frequency')
                                .withValueMin(0)
                                .withValueMax(700)
                                .withPreset('default', 20, 'Default value'),
                  e.enum('calibrate', ea.STATE_SET, ['calibrate']),
//                e.enum('calibrate', ea.STATE_SET, [0,1,2]),
                ],
        meta: {
                tuyaDatapoints: [
                [3, 'battery', tuya.valueConverter.raw],
                [8, 'temperature', tuya.valueConverter.divideBy10],
                [101, 'humidity', tuya.valueConverter.raw],
                [102, 'alarm', tuya.valueConverterBasic.lookup({ 'idle': tuya.enum(0), 'ALARM': tuya.enum(1) })],
                [103, 'opening_mode', tuya.valueConverterBasic.lookup({ 'closed': tuya.enum(0), 'tilted': tuya.enum(1) })],
                [104, 'position', tuya.valueConverterBasic.lookup({ 'left': tuya.enum(4), 'up': tuya.enum(1), 'down': tuya.enum(2), 'right': tuya.enum(3), })],
                [105, 'button_left', tuya.valueConverterBasic.lookup({ 'released': tuya.enum(0), 'pressed': tuya.enum(1)})],
                [106, 'button_right', tuya.valueConverterBasic.lookup({ 'released': tuya.enum(0), 'pressed': tuya.enum(1)})],
                [107, 'vacation', tuya.valueConverterBasic.lookup({ 'OFF': tuya.enum(0), 'ON': tuya.enum(1)})],
                [108, 'sensitivity', tuya.valueConverterBasic.lookup({ 'off': tuya.enum(0), 'low': tuya.enum(1), 'medium': tuya.enum(2), 'high': tuya.enum(3), 'max': tuya.enum(4), })],
                [109, 'alarm_switch', tuya.valueConverterBasic.lookup({ 'OFF': tuya.enum(0), 'ON': tuya.enum(1)})],
                [110, 'update_frequency', tuya.valueConverter.raw],
                [111, 'keysound', tuya.valueConverterBasic.lookup({ 'OFF': tuya.enum(0), 'ON': tuya.enum(1)})],
                [112, 'battery_low', tuya.valueConverterBasic.lookup({ 'ON': tuya.enum(0), 'OFF': tuya.enum(1)})],
                [113, 'duration', tuya.valueConverter.raw],
                [114, 'handlesound', tuya.valueConverterBasic.lookup({ 'OFF': tuya.enum(0), 'ON': tuya.enum(1)})],
//                [120, 'calibrate', tuya.valueConverterBasic.lookup({ '0': tuya.enum(0), '1': tuya.enum(1), '2': tuya.enum(2)})],
                [120, null, tuya.valueConverter.raw],

                ],
        },
};

module.exports = definition;
/*

{
  "3": "Battery Level",
  "8": "Temperature",
  "101": "Humidity",
  "102": "Alarm",
  "103": "Tilt Position",
  "104": "Handle Position",
  "105": "Button Left",
  "106": "Button Right",
  "107": "Vacation Mode",
  "108": "Alarm Sensitivity",
  "109": "Alarm Sound",
  "110": "Update Interval",
  "111": "Button Beep Sound",
  "112": "Low Battery Click",
  "113": "Alarm Duration",
  "114": "Handle Closed Click",
  "120": "Calibration"
}

*/
@Koenkk
Copy link
Owner

Koenkk commented Jun 2, 2024

In order to get this integrated, we have to get rid of tzLocal.TZE200_j7sgd8po. Could you check what works with the following external definition?

@clumsy-stefan
Copy link
Author

clumsy-stefan commented Jun 2, 2024

I'm happy to help, what how/what should I check? How do I integrate this "ext.js"? It looks the same as my .js just without the tz/fz part...
Should I jsut include this one instead of my TZE200_j7sgd8po.js?

I'm really sorry but I still don't understand how the whoel ts/nodejs stuff works...

EDIT:
just answered it myself, I need to use these ext.js inistead of the ones I made, true?

Sorry, I hope I'm getting more into it...

@clumsy-stefan
Copy link
Author

clumsy-stefan commented Jun 2, 2024

In order to get this integrated, we have to get rid of tzLocal.TZE200_j7sgd8po. Could you check what works with the following external definition?

Ok, just tested your definition. Basically everything seems to work except "calibration" where it throws a "no datapoint defined for calibrate".

And two minor syntax errors (some wrong "}" or so)...

does that help?

EDIT:
Sorry again, I was too quick..

According to the documentation calibration can be one of "clear" or "execute", so I amended your .js file with these values in the exposes as well as the datapoints section, now all seems to work!

Ammended version:

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 tuya = require('zigbee-herdsman-converters/lib/tuya');
const e = exposes.presets;
const ea = exposes.access;
const legacy = require('zigbee-herdsman-converters/lib/legacy');
const utils = require('zigbee-herdsman-converters/lib/utils');
const { Buffer } = require('node:buffer');


const tzLocal = {
        datapoints: {
                ...tuya.tz.datapoints,
                key: [...tuya.tz.datapoints.key, "vacation", "keysound", "handlesound", "calibrate"],
    },
};

const definition = {
        fingerprint: tuya.fingerprint('TS0601', ['_TZE200_j7sgd8po']),
        model: 'TS0601',
        vendor: 'TuYa',
        description: 'SODA S8 premium window handle',
        extend: [],
        toZigbee: [tzLocal.datapoints],
        fromZigbee: [tuya.fz.datapoints],
        configure: tuya.configureMagicPacket,
        exposes: [
                  e.battery(), e.battery_low(),
                  e.binary('vacation', ea.STATE_SET, 'ON', 'OFF').withDescription('Vacation mode'),
                  e.enum('alarm', ea.STATE, ['ALARM', 'idle']).withDescription('Alarm'),
                  e.binary('alarm_switch', ea.STATE_SET, 'ON', 'OFF').withDescription('Alarm enable'),
                  e.binary('handlesound', ea.STATE_SET, 'ON', 'OFF').withDescription('Handle closed sound'),
                  e.enum('opening_mode', ea.STATE, ['closed', 'tilted']).withDescription('Window tilt'),
                  e.temperature(), e.humidity(),
                  e.binary('keysound', ea.STATE_SET, 'ON', 'OFF')
                                .withDescription('Key beep sound'),
                  e.enum('sensitivity', ea.STATE_SET, ['off', 'low', 'medium', 'high', 'max'])
                                .withDescription('Sensitivity of the alarm sensor'),
                  e.enum('position', ea.STATE, ['up', 'right', 'down', 'left']),
                  e.enum('button_left', ea.STATE, ['released', 'pressed']),
                  e.enum('button_right', ea.STATE, ['released', 'pressed']),
                  e.numeric('duration', ea.STATE_SET).withValueMin(0).withValueMax(300).withValueStep(1)
                                .withUnit('sec').withDescription('Duration of the alarm')
                                .withPreset('default', 180, 'Default value'),
                  e.numeric('update_frequency', ea.STATE_SET).withUnit('min').withDescription('Update frequency')
                                .withValueMin(0)
                                .withValueMax(700)
                                .withPreset('default', 20, 'Default value'),
                  e.enum('calibrate', ea.STATE_SET, ['clear','execute']),
                ],
        meta: {
                tuyaDatapoints: [
                [3, 'battery', tuya.valueConverter.raw],
                [8, 'temperature', tuya.valueConverter.divideBy10],
                [101, 'humidity', tuya.valueConverter.raw],
                [102, 'alarm', tuya.valueConverterBasic.lookup({ 'idle': tuya.enum(0), 'ALARM': tuya.enum(1) })],
                [103, 'opening_mode', tuya.valueConverterBasic.lookup({ 'closed': tuya.enum(0), 'tilted': tuya.enum(1) })],
                [104, 'position', tuya.valueConverterBasic.lookup({ 'left': tuya.enum(4), 'up': tuya.enum(1), 'down': tuya.enum(2), 'right': tuya.enum(3), })],
                [105, 'button_left', tuya.valueConverterBasic.lookup({ 'released': tuya.enum(0), 'pressed': tuya.enum(1)})],
                [106, 'button_right', tuya.valueConverterBasic.lookup({ 'released': tuya.enum(0), 'pressed': tuya.enum(1)})],
                [107, 'vacation', tuya.valueConverterBasic.lookup({ 'OFF': tuya.enum(0), 'ON': tuya.enum(1)})],
                [108, 'sensitivity', tuya.valueConverterBasic.lookup({ 'off': tuya.enum(0), 'low': tuya.enum(1), 'medium': tuya.enum(2), 'high': tuya.enum(3), 'max': tuya.enum(4), })],
                [109, 'alarm_switch', tuya.valueConverterBasic.lookup({ 'OFF': tuya.enum(0), 'ON': tuya.enum(1)})],
                [110, 'update_frequency', tuya.valueConverter.raw],
                [111, 'keysound', tuya.valueConverterBasic.lookup({ 'OFF': tuya.enum(0), 'ON': tuya.enum(1)})],
                [112, 'battery_low', tuya.valueConverterBasic.lookup({ 'ON': tuya.enum(0), 'OFF': tuya.enum(1)})],
                [113, 'duration', tuya.valueConverter.raw],
                [114, 'handlesound', tuya.valueConverterBasic.lookup({ 'OFF': tuya.enum(0), 'ON': tuya.enum(1)})],
                [120, 'calibrate', tuya.valueConverterBasic.lookup({ 'clear': tuya.enum(0), 'execute': tuya.enum(1)})],
                ],
        },
};

module.exports = definition;
/*

{
  "3": "Battery Level",
  "8": "Temperature",
  "101": "Humidity",
  "102": "Alarm",
  "103": "Tilt Position",
  "104": "Handle Position",
  "105": "Button Left",
  "106": "Button Right",
  "107": "Vacation Mode",
  "108": "Alarm Sensitivity",
  "109": "Alarm Sound",
  "110": "Update Interval",
  "111": "Button Beep Sound",
  "112": "Low Battery Click",
  "113": "Alarm Duration",
  "114": "Handle Closed Click",
  "120": "Calibration"
}

*/

@Koenkk
Copy link
Owner

Koenkk commented Jun 2, 2024

Great, yes it's a replacement for your own converter. Just to confirm, everything works now and I can integrate it? (with the code from: #7565 (comment))?

@clumsy-stefan
Copy link
Author

clumsy-stefan commented Jun 2, 2024

As far as I could test, yes!

I removed the three commented lines as it was for testing, so from my point of view you could integrate it!

Thanks a lot for your help!!

Koenkk added a commit that referenced this issue Jun 3, 2024
@Koenkk
Copy link
Owner

Koenkk commented Jun 3, 2024

Thanks, added!

Could you also submit a picture for the docs? This can be done by clicking here.

Make sure that:

  • The filename is MODEL.png (update model accordingly)
  • The size is 512x512
  • The background is transparent (use e.g. Adobe remove background)

@clumsy-stefan
Copy link
Author

I asked the manufacturer if he can provide an original image of the handle, if not I'll make one as requested. But it seems I won't be able to upload it here:
image

No write access...

thanks again for your help!

@clumsy-stefan
Copy link
Author

I'll attach it here... Prob. you can use it...

soda_doppel

@Koenkk
Copy link
Owner

Koenkk commented Jun 4, 2024

Does it work when clicking Add file -> Create new file here?

@clumsy-stefan
Copy link
Author

clumsy-stefan commented Jun 4, 2024

Yeah it seems to work. But the model reportet is just "TS0601" which I think already exists, that's quite generic... SO I think the code need to be amended to show something more uniqe?

EDIT: and I can't upload. To create a new file I guess I would need to frok the repo and propose a change / make a PR...
also you need to change the "model:" line in the code to something like "TS0601_SODA_S8" to make it unique, I can't change that either, as it's in your change...

@Koenkk
Copy link
Owner

Koenkk commented Jun 5, 2024

I see, will add the picture with the next release!

@clumsy-stefan
Copy link
Author

Thanks, I saw it's integrated since yesterday.

Would it be possible to change the Vendor reference from TuYa to SODA GmBh.? Also, can I somehow extend the Description to make a reference to the homepage of the product, as it's a quite rare one and hard to find...

regards
STefan

@Koenkk
Copy link
Owner

Koenkk commented Jul 2, 2024

  • Changed the vendor to SODA
  • You can add a link to the docs (scroll down click on "help to make...")

@clumsy-stefan
Copy link
Author

clumsy-stefan commented Jul 2, 2024

Thx a lot!!

PR for documentation done...

@clumsy-stefan
Copy link
Author

PS: not sure, but after changing vendor/model you probably need to rename the device image/png?

@Koenkk
Copy link
Owner

Koenkk commented Jul 6, 2024

That will be done with the next z2m release

@theimo1221
Copy link
Contributor

Hello team,
Im not sure if this device is working as intended with zigbee2mqtt or if the device I received is broken.
After pairing the device no values do update and the device is in like an interview loop:

  1. Device get's interviewed
  2. Device get's configured
  3. Device leaves network
  4. Step 1-3 are repeatetd

Personally I doubt it being an issue with my zigbee network as it is fairly big with devices from plenty of manufacturer:
image

Thanks and best regards

Thiemo

@theimo1221
Copy link
Contributor

Today a second device arrived having the same issue.
I talked to SODA directly and they said all devices are tested before being shipped thus highly reducing the propability of 2 broken devices.

@clumsy-stefan They asked me to contact you as well, as it seems you've got it working fine with zigbee2mqtt. Which coordinator are you using?
Mine is a sonoff running this version:
image

After interview is done, rotating the handle doesn't result in any message to zigbee2mqtt

Thanks and best regards

Thiemo

@clumsy-stefan
Copy link
Author

Hi
I have 5 of these handles installed since a few months. All of them are working without issues. I had a issue in the beginning, that the device could not connect at all to the network after the first time, but they changed that in the firmware and since then they are working rock solid.

I run version:
image

Does resetting and rebinding work?

Can you try what happens if you trigger the alarm (i.e. shaking the handle while it's closed) and see if it starts to send events?

Do you have the chance to test it with another coordinator?

I also have a fairly big network
image

@theimo1221
Copy link
Contributor

theimo1221 commented Oct 10, 2024

Thanks for the fast response, I did reset the devices but that didn't work either.
I'm not sure with which FW-Version these devices are flashed:
image

Do I have to get a Tuya Gateway to update them in order to connect them to zigbee2mqtt?

EDIT: I ordered a Tuya Gateway arriving this saturday to test and hopefully update those handles, will report saturday :-)

@clumsy-stefan
Copy link
Author

You can't update them yourself. it was the tuya firmware that had a flaw which they captured in their firmware. I assume they ship all handles with the correct FW now. I have handles from three different (production) batches.

image

As writen, you could also try to force an alarm, this somehow triggered in the very first versions I had the start of sending messages, however, in the newer versions, this was not needed anymore..

@theimo1221
Copy link
Contributor

Thanks for the hints, I got one working now:
image

The other one still resists my charm...

@theimo1221
Copy link
Contributor

@clumsy-stefan I did receive another one, but that one doesn't update values as well.... But as I talked to Soda directly this device definetly has the latest FW so that shouldn't be the issue...

As I have the same issue with another Tuya device that might be the problem: Koenkk/zigbee2mqtt#24314

@clumsy-stefan
Copy link
Author

That issue sounds like it could be related to your problem. However I've never faced that...

@stefanhintermayr
Copy link

Does anyone of you have the same problem that when you turn the door handle, it feels like both buttons are triggered? The manufacturer claims that this is a software problem, that the entities are being evaluated incorrectly. In the current case, when I turn the window handle, my shutters go up and down because they are placed on the buttons.

@clumsy-stefan
Copy link
Author

Never had this issue until now on any of the 5 handles...

@stefanhintermayr
Copy link

That's really strange, I have the feeling that something isn't right. Every time I operate the door handle, it seems like all the values ​​change. Even the humidity sometimes jumps into double figures. Can someone please help me? How can I tell if the device is defective?https://github.com/user-attachments/assets/5c4462c3-be54-47d3-8068-7ad90029299a

@57234rs59
Copy link

Hi this is SODA as we understand checking 2 different videos of this device Based on the videos, you can see that everything works exactly as it should and as we understood.

When the handle is turned, the current value of the sensors is determined at that moment. You can see that the button state "released," meaning not pressed, is sent. Later in the video, you can observe that only the buttons are pressed. At that point, "pressed" is sent when the button is pressed. Shortly after that, "released" is sent, meaning the button is released. Therefore, if you want to respond only to a button press, you must set the event to "pressed."

Why the button states are temporarily set to "NULL" in Home Assistant is a peculiarity of Zigbee2MQTT. The handle only sends "pressed" and "released." Zigbee2MQTT apparently sets the button state to "NULL" automatically after a short time. This implementation is fundamentally questionable because every time the handle is turned, there is a change in the button state, which can lead to the described issues for the customer. It always switches from "NULL" to "released" and back again.

As mentioned, these "NULL" values do not come from the handle; Zigbee2MQTT sets them automatically. This should be improved, and the automatic "NULL" should be removed.

The "jumping" of humidity values is also completely within the range of 1% to 5%. These values are also re-measured when the handle is turned, and due to the sensitivity of the sensors, corresponding fluctuations occur. If the handle is held in hand, the fluctuations can be even greater.

@57234rs59
Copy link

I hope this helps

@stefanhintermayr
Copy link

Maybe I'm making a mistake in my thinking and would appreciate some help. Yes, up to now I've only triggered an automation when the button's status changed. But I don't understand how I react to just one event.

@clumsy-stefan
Copy link
Author

As I don't use Home Assistant I can't really help here. It seems (to me) that Z2M handles it correctly, but probably HA timeouts the Values when there is no update in a certain time and changes it tu NULL... Which would indeed be a questionable behaviour, as especially for battery powered devices only "needed" changes should be sent, even if there is a longer time inbetween.

@stefanhintermayr
Copy link

So to me it looks like the door handle always sends all values ​​or overwrites Z2M with NULL, because just turning the door handle, which definitely doesn't change the value of the button, sometimes results in NULL.

@marazmarci
Copy link
Contributor

FYI I have plans for ordering one and if nobody else fixes the Z2M code in the meantime, I can work on it a bit during my christmas free time 🙂

@adischerrer
Copy link

Hi all,
even though this thread is already closed, I'd like to contribute my findings in a Home Assistant w. Zigbee2MQTT setup.
Just bought one device for testing and integration worked well. But similar to @stefanhintermayr I have some strange behavior:
There is a lot of (unnecessary) traffic while the door handle is "idle". I set the "update_frequency" to 1 (minute). Indeed, every 1 minute I see a message containing the button states "released" but there are a lot of messages in between containing "null" values for the buttons.
mqtt-traffic-while-idle

@marazmarci
Copy link
Contributor

marazmarci commented Dec 9, 2024

FYI I have plans for ordering one and if nobody else fixes the Z2M code in the meantime, I can work on it a bit during my christmas free time 🙂

Oh no, I just wanted to order the window handle now, but it seems to be out of stock on Amazon 😢 In this case I'm not sure I will be able to test and fix the Z2M integration this year.

@57234rs59, do you know when it will be available again?

@57234rs59
Copy link

Good morning, we did not expect to have sold such a large quantity in such a short time. Many people ordered 1 or 2 pieces and then reordered up to 25 pieces by email. We are in re-production and this will take about 10-12 weeks - sorry about this.[ ](@marazmarci I have a reserved sample for you - please contact us at [email protected]. Best wishes, Samuel

@JoachimGru
Copy link

Good morning,

I've create the TZE200_j7sgd8po.js. But how include it in the configuration.yaml. Already aks Google but find no solution.

Joachim

@clumsy-stefan
Copy link
Author

Why would you want to replace the existing integration? It works flawless with a pure z2m environment, just HA seems to have issues...

What did you change in your version?

As I wrote the original (currently in z2m integrated) template I'm happy to test your version in my environment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants