Is starting OTAA join on SF12BW125 (EU868) LoRaWAN compliant?

I have a commercial LoRaWAN end device that supports EU868.

The device starts OTAA join on SF12BW125 while I would expect it to join on SF7BW125.

I remember a similar issue in the past with @GrumpyOldPizza’s Arduino Core for the Murata module but can’t recall if that was only in an early version and if it was later fixed or not.

I’m wondering if starting OTAA join on SF12BW125 is actually LoRaWAN compliant or that this is a bug.
I was unable to find a clear answer on the forum.

I remember that discussion. It’s probably this (assuming you’ve not already found it).

I can see benefits/problems in both approaches. Perhaps it should start in the middle :slight_smile:

I had already found that thread again but it does not give a clear answer whether the join should should start at DR5 (SF7BW125) or DR0 (SF12BW125).

LMIC starts joining at DR5 and my Heltec CubeCell which uses LoRaMac-node also starts joining at DR5. But the device I described above starts at DR0.

Starting at DR5 uses less air time which is better for the gateway and network (more time to service other nodes).
Starting at DR0 will join faster only in case joins on the highest DR’s would fail but otherwise only use much more airtime.

The LoRaWAN 1.0.3 specification (p39) says (I did not find additional join information in the LoRaWAN 1.1 Regional Parameters spec for EU868):

The join-request message can be transmitted using any data rate and following a random
frequency hopping sequence across the specified join channels. It is recommended to use a
plurality of data rates.

Which would imply that any DR in range DR0 to DR7 can be used to start (attempting) to join.
But it lacks if this should start at DR7 or DR0 or just any arbitrary DR.

LMIC starts at DR5 if that twice fails it continues its attempts with DR4 etc. up till DR0.
But the device does this in reverse.

And if it is allowed to join at an arbitrary DR then why not try DR5 first and if that fails switch try DR0 next?

If not using ADR then joining at DR0 would be really bad because it would never switch to a higher DR again, wasting air time and battery power.

Next step: see what happens if I disable ADR on the device (will it still start joining on DR0?).

What is compliant and what is the best practice and why?