I'm using Bitcloud 3.2.0, which I believe has this function.
In this case you need to careful - if you enable this, then you don't have to manually go to sleep, but device will wakeup (briefly) on every hardware timer interrupt (10 ms for default system timer).
There is not much else mounted on the board except this chip and the sorroundings (antena, balun, etc, what is mentioned in this chip's sheet).
I would not expect the rest to consume more than 1mA altogether.
Have you ever seen this board to go to low power mode? Can you try to run unmodified WSNDemo and see what numbers do you get?
The problem is now, that I have 3 buttons handled by an AppTimer.
Why not pin change interrupts? Your scenario looks 1:1 like WSNDemo.
It sounds for me that polling only occurs if CS_SLEEP_PERIOD expires. CS_SLEEP_PERIOD means CS_END_DEVICE_SLEEP_PERIOD in here?
There is some mix in terminology. Internally there are 3 types of wakeups:
1. Very short (a few us) every 8 seconds - this is because of limited range of the asynchronous timer and it is unavoidable. This is totally transparent to the application.
2. MCU wakeup. When external interrupts happen. This one does not wake up the radio, but the stack (parts of it) is awake. You need to manually call ZDO_WakeupReq() or ZDO_SleepReq(), depending on hoe you want to proceed. It sounds like that's exactly what you want and it is already implemented.
3. CS_SLEEP_PERIOD - the whole stack and radio wakes up and sends the poll request.
Anyway what I'd like to do is to make HAL to differentiate it's waking up source:
It already does this. Look at WSNDemo application.