This class provides a LoRaWAN 1.0.2 compliant driver for the LoRa network processor in the LoPy, LoPy4 and FiPy.
Please ensure that there is an antenna connected to your device before sending/receiving LoRa messages as improper use (e.g. without an antenna), may damage the device.
For various complete LoRa examples, check here.
Create and configure a LoRa object. See init for params of configuration.
lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868)
This method is used to set the LoRa subsystem configuration and to specific raw LoRa or LoRaWAN.
The arguments are:
mode
LoRa.LORA
LoRa.LORAWAN
region
LoRa.AS923
LoRa.AU915
LoRa.EU868
LoRa.US915
LoRa.CN470
LoRa.IN865
If no region is provided, it will default to the setting provided in the CONFIG partition, set by the Firmware Updater tool.
frequency
tx_power
bandwidth
LoRa.BW_125KHZ
LoRa.BW_250KHZ
LoRa.BW_500KHZ
sf
preamble
coding_rate
LoRa.CODING_4_5
LoRa.CODING_4_6
LoRa.CODING_4_7
LoRa.CODING_4_8
power_mode
LoRa.ALWAYS_ON
LoRa.TX_ONLY
LoRa.SLEEP
tx_iq
rx_iq
adr
public
tx_retries
device_class
LoRa.CLASS_A
LoRa.CLASS_C
In LoRa.LORAWAN mode, only adr, public, tx_retries and device_class are used. All the other params will be ignored as they are handled by the LoRaWAN stack directly. On the other hand, in LoRa.LORA mode from those 4 arguments, only the public one is important in order to program the sync word. In LoRa.LORA mode adr, tx_retries and device_class are ignored since they are only relevant to the LoRaWAN stack.
Join a LoRaWAN network. Internally the stack will automatically retry every 15 seconds until a Join Accept message is received. The parameters are:
activation
LoRa.OTAA
LoRa.ABP
auth
(dev_eui, app_eui, app_key)
dev_eui
(dev_addr, nwk_swkey, app_swkey)
timeout
lora.has_joined()
dr
Get or set the frequency in raw LoRa mode (LoRa.LORA). The allowed range is region-specific.
Get or set the bandwidth in raw LoRa mode (LoRa.LORA). Bandwidth can be either: (depending on the region setting)
Get or set the coding rate in raw LoRa mode (LoRa.LORA). The allowed values are: (depending on the region setting)
Get or set the number of preamble symbols in raw LoRa mode (LoRa.LORA).
Get or set the spreading factor value in raw LoRa mode (LoRa.LORA). The minimum value is 7 and the maximum is 12:
Get or set the power mode in raw LoRa mode (LoRa.LORA). The accepted values are:
Return a named tuple with useful information from the last received LoRa or LoRaWAN packet. The named tuple has the following form:
(rx_timestamp, rssi, snr, sftx, sfrx, tx_trials, tx_power, tx_time_on_air, tx_counter, tx_frequency)
Where:
rx_timestamp
rssi
snr
sfrx
sftx
tx_trials
tx_time_on_air
tx_counter
tx_frequency
Note that the tuple will only contain the respective information after receiving and/or sending LoRa packets.
Returns True if a LoRaWAN network has been joined. False otherwise.
True
False
Add a LoRaWAN channel on the specified index. If there’s already a channel with that index it will be replaced with the new one. By default, the regulated LoRaWAN channels are assigned according to the region settings.
index
dr_min
dr_max
Example:
lora.add_channel(index=0, frequency=868000000, dr_min=5, dr_max=6)
Removes the channel from the specified index. On EU868, the channels 0 to 2 cannot be removed, they can only be replaced by other channels using the lora.add_channel method. A way to remove all channels except for one is to add the same channel, 3 times on indexes 0, 1 and 2.
lora.add_channel
Returns a byte object with the 8-Byte MAC address of the LoRa radio.
Specify a callback handler for the LoRa radio. The trigger types are
trigger
LoRa.RX_PACKET_EVENT
LoRa.TX_PACKET_EVENT
ack
LoRa.TX_FAILED_EVENT
An example of how this callback functions can be seen the in method lora.events().
lora.events()
This method is used to check for radio activity on the current LoRa channel, and if the rssi of the measured activity is lower than the rssi_threshold given, the return value will be True, otherwise False. Example:
rssi_threshold
lora.ischannel_free(-100)
Set the battery level value that will be sent when the LoRaWAN MAC command that retrieves the battery level is received. This command is sent by the network and handled automatically by the LoRaWAN stack. The values should be according to the LoRaWAN specification:
0
1..254
255
lora.set_battery_level(127) # 50% battery
This method returns a value with bits sets (if any) indicating the events that have triggered the callback. Please note that by calling this function the internal events registry is cleared automatically, therefore calling it immediately for a second time will most likely return a value of 0.
def lora_cb(lora): events = lora.events() if events & LoRa.RX_PACKET_EVENT: print('Lora packet received') if events & LoRa.TX_PACKET_EVENT: print('Lora packet sent') lora.callback(trigger=(LoRa.RX_PACKET_EVENT | LoRa.TX_PACKET_EVENT), handler=lora_cb)
Save the LoRaWAN state (joined status, network keys, packet counters, etc) in non-volatile memory in order to be able to restore the state when coming out of deepsleep or a power cycle.
Restore the LoRaWAN state (joined status, network keys, packet counters, etc) from non-volatile memory. State must have been previously stored with a call to nvram_save before entering deepsleep. This is useful to be able to send a LoRaWAN message immediately after coming out of deepsleep without having to join the network again. This can only be used if the current region matches the one saved. Note that the nvram will be cleared after using this method.
nvram_save
Remove the LoRaWAN state (joined status, network keys, packet counters, etc) from non-volatile memory.
See the tutorials for an example on how to use nvram
Enable the Mesh network. Only after Mesh enabling the lora.cli() and socket can be used.
lora.cli()
socket
Send OpenThread CLI commands, the list is here. The output is multiline string, having as line-endings the \r\n.
\r\n
print(lora.cli("ipaddr")) fdde:ad00:beef:0:0:ff:fe00:fc00 fdde:ad00:beef:0:0:ff:fe00:e800 fdde:ad00:beef:0:e1f0:783c:1e8f:c763 fe80:0:0:0:2c97:cb65:3219:c86
LoRa raw sockets are created in the following way:
import socket s = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
And they must be created after initializing the LoRa network card.
LoRa-Mesh socket is created, if the Mesh was enabled before (lora.mesh() was called).
lora.mesh()
The LoRa-Mesh socket supports only the following socket methods: close() , bind(), sendto(), and recvfrom().
close()
bind()
sendto()
recvfrom()
LoraWAN sockets are created in the following way:
import socket s = socket.socket(socket.AF_LORA, socket.SOCK_RAW) s.setsockopt(socket.SOL_LORA, socket.SO_DR, 0) #where 0 represents the datarate used DR_0
Data rate table (also applies to the socket setting)
For Join requests in OTAA, EU868 uses DR_0 to DR_5, this is handled in the firmware by default.
DR_0
DR_5
For EU868, AS923 and IN865, the TX rates are used for RX as well. US915 and AU915 use different RX rates. Note that the RX settings are all handled in the firmware.
The default receive window is 1 second.
For more information about LoRaWAN specifications, you can check this document by the LoRa Allience: https://lora-alliance.org/lorawan-for-developers
LoRa.timeout