@Keith Bryant yeah, what you're seeing is pretty classic long-range multipath behavior — wind is actually a real factor too, not just a guess. At those distances even small changes in atmospheric layering or vegetation movement can cause the signal to arrive via slightly different paths, and those paths interfere constructively or destructively with each other on a packet-by-packet basis. A 15-20 dBm swing isn't unusual once you're operating near the sensitivity floor where every dB matters.
The short answer is: don't trust raw RSSI at that range for triggering logic. What most people do is apply a moving average or an exponential smoothing filter over a window of maybe 5-10 samples before you act on it. That kills most of the noise without adding too much latency. Something like a simple EMA with a factor around 0.1-0.2 works well for slow proximity detection.
Also worth checking whether your packets have any correlation — like, are the wild swings random or do they cluster? If it's truly random sample-to-sample, that's multipath. If you see it drift in one direction for a few seconds and then snap back, that's more likely a slow fading event and you'd want a longer averaging window.
The STM32WB07 on the module gives you access to the raw RSSI per-packet so you've got everything you need to implement this on the firmware side — if you want I can sketch out a quick EMA implementation in C that slots into the connection event handler.