nvram lopy Errno 100
-
Hello Pioneers,
I am using the Lopy to send data from the pysense and a external sensor.
When I work without the lora.nvram_restore() & save() function, it works fine but the module does not connect after coming out of deepsleep.When i use the nvram function there pops up a error message: OSError:
File "main.py", line 74, in <module>
[Errno 100] ENETDOWNLine 74 is "s.send(enc)"
Does somebody know how to resolve this?
I am using a LoPy and a Pysense with the newest firmware version.
Atom 1.25.0 and Pymakr plugin 1.2.11.
On KPN LoRa network
-
Hey! Did you solve it? I am having the same problem... Can't fix it. Thanks!
-
@jcaron
as I understood your tips.
Then should it be something like this. Right?# LoRaWAN (ABP) from network import LoRa import socket import binascii import struct import time import pycom from deepsleep import DeepSleep import ujson import gc from pysense import Pysense from SI7006A20 import SI7006A20 from LTR329ALS01 import LTR329ALS01 from MPL3115A2 import MPL3115A2,ALTITUDE,PRESSURE py = Pysense() mp = MPL3115A2(py,mode=ALTITUDE) mpp = MPL3115A2(py,mode=PRESSURE) si = SI7006A20(py) lt = LTR329ALS01(py) ds = DeepSleep() gc.enable() loraSaved = pycom.nvs_get('loraSaved') if not loraSaved: # Initialize LoRa in LORAWAN mode. lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868) # create an ABP authentication params dev_addr = struct.unpack(">l", binascii.unhexlify('14 20 36 XX'.replace(' ','')))[0] nwk_swkey = binascii.unhexlify('d0 ad 96 bb 95 0c b1 72 6a a4 3f 85 2f 4a XX XX'.replace(' ','')) app_swkey = binascii.unhexlify('d5 ac 3b 1c 70 6c f8 2a 46 f2 2f eb 57 12 XX XX'.replace(' ','')) # join a network using ABP (Activation By Personalization) lora.join(activation=LoRa.ABP, auth=(dev_addr, nwk_swkey, app_swkey)) print('Joining the LoRa network') # wait until the module has joined the network while not lora.has_joined(): time.sleep(2.5) print('Not joined yet...') machine.idle() # create a LoRa socket s = socket.socket(socket.AF_LORA, socket.SOCK_RAW) # set the LoRaWAN data rate s.setsockopt(socket.SOL_LORA, socket.SO_DR, 5) # make the socket blocking s.setblocking(False) time.sleep(5) s.send('LoRa Saved') print("LoRa saved") time.sleep(5) lora.nvram_save() pycom.nvs_set('loraSaved', 1) time.sleep(5) else: lora = LoRa(mode=LoRa.LORAWAN) lora.nvram_restore() s = socket.socket(socket.AF_LORA, socket.SOCK_RAW) s.setsockopt(socket.SOL_LORA, socket.SO_DR, 5) s.setblocking(False) mqData = {} gc.collect() mqData ["m"] = {} mqData ["m"]["T"] = mp.temperature() mpp = MPL3115A2(py,mode=PRESSURE) mqData ["m"]["P"] = (mpp.pressure()/100) mqData ["m"]["H"] = si.humidity() mqData ["m"]["B"] = py.read_battery_voltage() enc = ujson.dumps(mqData) gc.collect() s.send(enc) pycom.nvs_set('loraSaved', 0) # reset for next test print('STA node sending packet ...') print(enc) print('LoRa data saved') time.sleep(5) print("Going to DeepSleep") ds.enable_pullups('P17') # can also do ds.enable_pullups(['P17', 'P18']) ds.enable_wake_on_fall('P17') # can also do ds.enable_wake_on_fall(['P17', 'P18']) ds.go_to_sleep(30*60) # go to sleep for 15 minutes # get any data received... data = s.recv(64) print(data)
I still have the errno 100 error code. This time on rule 89.
-
@jcaron did you find anything strange in my code?
-
@han As I said, move the
lora.nvram_restore()
just after creating of thelora
object, then test iflora.has_joined()
and only do the join and probably the channel stuff if it has not joined yet.
-
@jcaron
What do I have to do to make it work?If I deleted the deepsleep part it work fine, but with the deepsleep the LoPy will not join again.
-
@jcaron As far as I could see it, there is no actual communication done for ABP join. Just the device ID and the respective keys are set in the MAC layer.
Either way, nvram_save() and nvram_restore() should be used to ensure the monotonic increase of the packet counters.
-
@han not sure about ABP but for OTAA you definitely don’t join every time. You should just do nvram_restore() just after you create the lora object, and only join if has.joined() returns false.
-
@robert-hh Thanks for the tip. I will do it the next time when I have to upload a piece of code.
-
@han if you enclose your code in line with three backticks (```), the structure is maintained.
-
Hello @jcaron
This is my code.# LoRaWAN (ABP) from network import LoRa from mqtt import MQTTClient import socket import binascii import struct import time from deepsleep import DeepSleep import ujson import gc from pysense import Pysense from SI7006A20 import SI7006A20 from LTR329ALS01 import LTR329ALS01 from MPL3115A2 import MPL3115A2,ALTITUDE,PRESSURE py = Pysense() mp = MPL3115A2(py,mode=ALTITUDE) mpp = MPL3115A2(py,mode=PRESSURE) # Returns height in meters. Mode may also be set to PRESSURE, returning a value in Pascals si = SI7006A20(py) lt = LTR329ALS01(py) ds = DeepSleep() gc.enable() # Initialize LoRa in LORAWAN mode. lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868) # create an ABP authentication params dev_addr = struct.unpack(">l", binascii.unhexlify('xxxxxx'.replace(' ','')))[0] nwk_swkey = binascii.unhexlify('xxxxxxx'.replace(' ','')) app_swkey = binascii.unhexlify('xxxxxxx'.replace(' ','')) # join a network using ABP (Activation By Personalization) lora.join(activation=LoRa.ABP, auth=(dev_addr, nwk_swkey, app_swkey)) print('Joined LoRa network') # wait until the module has joined the network while not lora.has_joined(): time.sleep(2.5) print('Not joined yet...') # remove all the non-default channels for i in range(3, 16): lora.remove_channel(i) # create a LoRa socket s = socket.socket(socket.AF_LORA, socket.SOCK_RAW) # set the LoRaWAN data rate s.setsockopt(socket.SOL_LORA, socket.SO_DR, 5) lora.nvram_restore() # make the socket blocking # (waits for the data to be sent and for the 2 receive windows to expire) s.setblocking(True) time.sleep(5) for i in range (200): mqData = {} gc.collect() mqData ["data"] = {} mqData ["data"]["Temperature"] = mp.temperature() mqData ["data"]["Pressure"] = (mpp.pressure()/100) mqData ["data"]["Relative Humidity"] = si.humidity() mqData ["data"]["Battery voltage"] = py.read_battery_voltage() enc = ujson.dumps(mqData) gc.collect() s.send(enc) print('STA node sending packet ...') time.sleep(5) nvram_save() print("ready to DeepSleep") time.sleep(1) print("Going to DeepSleep") py.setup_sleep(15*60) py.go_to_sleep()
code
-
@han Can you provide the relevant parts of your code? My guess is that you don't have the nvram_save and nvram_restore calls in the right places, but it's hard to tell without code...