slsys / Gateway

Web site
https://slsys.github.io/Gateway/
246 stars 110 forks source link

add battery percentage on IKEA Tradfri on/off Switch E1743 #24

Open snakuzzo opened 4 years ago

snakuzzo commented 4 years ago

Hi all! I'm on fw 2020.05.11 I'm can control fine my IKEA button E1743 but it's not in your supported devices list All commands are ok, but I can't retreive battery percentage.

Here messages published over MQTT...

Zigbee7634/pulsante_ikea {"click":"off","linkquality":39}
Zigbee7634/pulsante_ikea {"click":"on","linkquality":94}
Zigbee7634/pulsante_ikea {"click":"brightness_up","linkquality":99}
Zigbee7634/pulsante_ikea {"click":"brightness_stop","linkquality":97}
Zigbee7634/pulsante_ikea {"click":"brightness_down","linkquality":110}
Zigbee7634/pulsante_ikea {"click":"brightness_stop","linkquality":110}

Here the device details...

image

snakuzzo commented 4 years ago

this is how battery percentage is calculated on zigbee2mqtt. Battery on E1743 button is a 2032 3V...

Here the value returned calling toPercentageCR2032(voltage) function...

https://github.com/Koenkk/zigbee-herdsman-converters/blob/master/converters/fromZigbee.js#L1176

    xiaomi_battery_3v: {
        cluster: 'genBasic',
        type: ['attributeReport', 'readResponse'],
        convert: (model, msg, publish, options, meta) => {
            let voltage = null;

            if (msg.data['65281']) {
                voltage = msg.data['65281']['1'];
            } else if (msg.data['65282']) {
                voltage = msg.data['65282']['1'].elmVal;
            }

            if (voltage) {
                return {
                    battery: toPercentageCR2032(voltage),
                    voltage: voltage, // @deprecated
                    // voltage: voltage / 1000.0,
                };
            }
        },
    }

...and here the function...

https://github.com/Koenkk/zigbee-herdsman-converters/blob/7d5fcf0c0a3d6ea900a8ae2ac8c2169befab377d/converters/fromZigbee.js#L75

const toPercentageCR2032 = (voltage) => {
    let percentage = null;

    if (voltage < 2100) {
        percentage = 0;
    } else if (voltage < 2440) {
        percentage = 6 - ((2440 - voltage) * 6) / 340;
    } else if (voltage < 2740) {
        percentage = 18 - ((2740 - voltage) * 12) / 300;
    } else if (voltage < 2900) {
        percentage = 42 - ((2900 - voltage) * 24) / 160;
    } else if (voltage < 3000) {
        percentage = 100 - ((3000 - voltage) * 58) / 100;
    } else if (voltage >= 3000) {
        percentage = 100;
    }

    return Math.round(percentage);
};

is it possible to add this or I have to calculate by myself ?

Thank you

Avenitos commented 4 years ago

Покажите лог репорта батарейки от устройства

snakuzzo commented 4 years ago

Это то, что я вижу на webgui

image

image

Это то, что я вижу в журнале, когда нажимаю кнопку

[00:17:58.648] [1] Thread Main, core: 1
[00:18:08.652] [0] Thread Main, core: 1
[00:18:17.926] [D]  -- ReceiveCmd: 0x4481 AREQ_AF_INCOMING_MSG, Len: 23, Data: 00000600514B0101002C008F123C000003012001A9390A
[00:18:17.931] [V] AREQ_AF_INCOMING_MSG GroupId: 0x0000, ClusterId: 0x0006 GEN_ON_OFF, SrcAddr: 0x4B51, SrcEn: 1, DstEn: 1, WasBr: 0x00, LinkQuality: 44, SecurityUse: 0x00, TimeStamp: 0x003C128F, TransSeqNum: 0, Len: 3, Data: 012001
[00:18:17.951] [V]   ZCL FrameControl: 0x01, Type: 01, ManuSpecific: 00, Direction: 00, DisableDefaultRsp: 00, TrSeqNum: 32, CmdId: 0x01 ON, Payload: 
[00:18:17.963] ParseZCLHeader time: 13
[00:18:17.967] [D] SetDeviceState nwkAddr: 0x4B51, linkquality = UINT8: 44
[00:18:17.978] [D] SetDeviceState nwkAddr: 0x4B51, trSeqNum = UINT8: 32
[00:18:17.985] FZ0 time: 18
[00:18:17.060] [D] SetDeviceState nwkAddr: 0x4B51, click = CHAR[]: ON
[00:18:17.065] FZ time: 6
[00:18:17.071] FZ [TRADFRI on/off switch : pulsante_ikea]: {"click":"ON","linkquality":44,"model_name":"TRADFRI on/off switch"}
[00:18:17.077] SendStates time: 7
[00:18:17.082] FromZigBeeConverter time: 114
[00:18:17.089] [MQTT] payload_length: 68
[00:18:17.089] ParseZCLPayload time: 121
[00:18:17.096] Zigbee.ProcessMessage() mem: 187708 - 175388 = 12320
[00:18:17.098] [MQTT] write_count: 68
[00:18:18.661] [5] Thread Main, core: 1
Avenitos commented 4 years ago

батарейка обычно приходит в кластере GEN_POWER_CFG

snakuzzo commented 4 years ago

Я не знаю Я знаю, что это работает с zigbee2Tasmota. Если это может помочь, это MQTT опубликовать, чтобы прочитать значение батареи сразу же после нажатия кнопки

topic: 'cmnd/sonoff-z2t/ZbRead'
payload:  '{"Device":"0xC132","Endpoint":1,"Cluster":1,"Read":[32,33]}'
Avenitos commented 4 years ago

Это ручное чтение, странно так делать для батарейного устройства.

snakuzzo commented 4 years ago

вы правы, но это устройство, вероятно, не публикуется на standard endpoints

Смотри сюда...

Zigbee2tasmota specific device configuration

snakuzzo commented 4 years ago

Прошлой ночью я обновил прошивку устройства с помощью zigbee2mqtt. Затем я заново подключил устройство к SLS GW, но результат не изменился. как вы можете видеть в моем предыдущем посте, где я поделился исходным кодом Tasmota, мое устройство отображает значение батареи в кластере GEN_CFG, а не в GEN_POWER_CFG

papperone commented 4 years ago

у нас есть информация, когда это будет исправлено? из нескольких пользователей и десятков этих кнопок IKEA только одна сообщила о батарее ОДИН РАЗ, и ни одна из них не сделала этого; в zigbee2mqtt все работает отлично, и проблема была объяснена здесь выше и должна быть исправлена в SLS ...

snakuzzo commented 4 years ago

Спасибо @papperone за ваш опыт. Как я уже говорил в предыдущих сообщениях, это происходит только на SLS. Значение напряжения правильно управляется и процент заряда батареи отображается правильно не только на zigbee2mqtt но и на tasmota

snakuzzo commented 4 years ago

Log when I press a button... no GEN_POWER_CFG cluster is sent and no battery value on MQTT Payload

169357216  -- RawReceive[1,28]: fe 17 44 81 00 00 06 00 d5 36 01 01 00 34 00 17 70 aa 00 00 03 01 59 00 d5 36 0b 7d 
169357221 [D]  -- ReceiveCmd: 0x4481 AREQ_AF_INCOMING_MSG, Len: 23, Data: 00000600D53601010034001770AA000003015900D5360B
169357230 [V] AREQ_AF_INCOMING_MSG GroupId: 0x0000, ClusterId: 0x0006 GEN_ON_OFF, SrcAddr: 0x36D5, SrcEn: 1, DstEn: 1, WasBr: 0x00, LinkQuality: 52, SecurityUse: 0x00, TimeStamp: 0x00AA7017, TransSeqNum: 0, Len: 3, Data: 015900
169357250 [V]   ZCL FrameControl: 0x01, Type: 01, ManuSpecific: 00, Direction: 00, DisableDefaultRsp: 00, TrSeqNum: 89, CmdId: 0x00 OFF, Payload: 
169357262 ParseZCLHeader time: 13
169357267 [D] SetDeviceState nwkAddr: 0x36D5, linkquality = UINT8: 52
169357271 SimpleBind_Handle prepare 0x36D5, Name: linkquality, Value: 52
169357277 SimpleBind_Handle 0 ts: 6
169357280 SimpleBind_Handle 1 ts: 9
169357285 SimpleBind_Handle 2 ts: 14
169357290 SimpleBind_Handle 2.5 ts: 17 1 1 1
169357298 [D] SetDeviceState nwkAddr: 0x36D5, trSeqNum = UINT8: 89
169357303 SimpleBind_Handle prepare 0x36D5, Name: trSeqNum, Value: 89
169357307 SimpleBind_Handle 0 ts: 4
169357310 SimpleBind_Handle 1 ts: 7
169357316 SimpleBind_Handle 2 ts: 13
169357323 SimpleBind_Handle 2.5 ts: 17 1 1 1
169357329 FZ0 time: 63
169357335 [D] SetDeviceState nwkAddr: 0x36D5, click = CHAR[]: OFF
169357339 SimpleBind_Handle prepare 0x36D5, Name: click, Value: OFF
169357343 FZ time: 10
169357349 FZ [TRADFRI on/off switch : pulsante_ikea]: {"click":"OFF","linkquality":52,"model_name":"TRADFRI on/off switch"}
snakuzzo commented 4 years ago

This is how z2m fixed battery percentage value on E1743

https://github.com/Koenkk/zigbee-herdsman-converters/commit/04474916ca1569613ae01aabc020ff6e25716de4