[Edge] Zigbee attribute handler powerConfiguration batteryPercentageRemaining not initializing

I’m trying to read the battery percentage of my device and it will not register the attribute handler on initialization.

I’m using the following code to register the powerConfiguration, also tried the onOff attribute and that one is working.

zigbee_handlers = {
    attr = {
        [clusters.PowerConfiguration.ID] = {
            [clusters.PowerConfiguration.attributes.BatteryPercentageRemaining.ID] = commands.BatteryPercentageRemaining

Logging shows that it’s not picking up the powerConfiguration

    ZclClusterCommandHandler: cluster: Level, command: Move
    ZclClusterCommandHandler: cluster: Level, command: MoveWithOnOff
    ZclClusterCommandHandler: cluster: Scenes, command: 0x08
    ZclClusterCommandHandler: cluster: Scenes, command: 0x07
    ZclClusterCommandHandler: cluster: OnOff, command: On
    ZclClusterCommandHandler: cluster: OnOff, command: Off

I don’t know if it’s because you haven’t assigned the attribute handler to a function.
Should be?

[clusters.PowerConfiguration.ID] = {
            [clusters.PowerConfiguration.attributes.BatteryPercentageRemaining.ID] = commands_BatteryPercentageRemaining

I’m using a class where I write all my commands, so that is why you see.


function commands.batteryPercentageRemaining(_, device, command, args)
    ...some code...
1 Like

Yes, that’s right, I also use it in some drivers

But I think that the value of the attribute is going to be sent in the zb_rx message (value.value ) and not in the command.
I always get the value of the attribute for the handler according to the defaults handler:

function battery_defaults.battery_perc_attr_handler(driver, device, value, zb_rx)
      capabilities.battery.battery(math.floor(value.value / 2.0 + 0.5))

I use function xxxxx(_, device, command) to handle capabilities commands, on-off commands for example

1 Like

I got it working, it’s the amount of arguments given to the function.

This was what I had, and the args in this case is a argument to much.

function commands.batteryPercentageRemaining(_, device, command, args)
    ...some code...

This is what I have now

function commands.batteryPercentageRemaining(_, device, attribute)