I may begin to understand a bit better, but maybe someone could help me by confirming my understanding:
- After ADR_ACK_LIMIT uplinks without a downlink, the node sets ADRACKReq in the next uplink.
- After a max of ADR_ACK_DELAY further uplinks, the network must send a downlink (either scheduled from the application or otherwise a dedicated ACK)
- If - and only if! - the node does not receive any downlink after ADR_ACK_DELAY uplinks, it will increase the SF by one, and repeat the ADRACKReq cycle.
This means that ADR will adjust DR down only if no downlinks at all are received in ADR_ACK_LIMIT + ADR_ACK_DELAY frames. The link margin calculated at the server and reported in LinkCheckAns does not come into this at all, it is used only to adjust DR up, using the LinkADRReq command if there is an excess margin.
If this is correct (can anyone confirm?), that raises a new question:
Is it compliant if the application code on an end-device with ADR on adjusts the DR down, as long as it adjust DR up when commanded via ADR?
I did this manually during testing and it worked fine, but I don’t know if this is compliant.