Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    PyBytes Firmware OTA update failed?

    Scheduled Pinned Locked Moved Firmware
    lopy
    3 Posts 2 Posters 392 Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D Offline
      dnear1
      last edited by

      I logged into Pybytes to look at my LoPy4 Signals compared to the data shown in TTN. It's connected to a WIFI network but also pushing LoRa data in US915 databand. I noticed that the signals values were all screwed up. Previously last night, everything looked good. Looking at the data values, I discovered that Signals had somehow changed from big to little-endian so a value I believe to be 3(?) was now displayed as 285,212,672 (Hex 1100 0000) all 5 signals I had were affected by this.
      I tried to go in and look at the code, but the unit said "Offline". Odd, because Signals was being updated on 5 minute intervals, as was TTN. I watched several 5 minute update intervals succeed.
      On the Settings page, I noticed it showed a Firmware Update was available. I had 1.18.1r10 loaded and it reported that 1.18.2 was available. I attempted the update. It said "updating firnware" for about 3-4 minutes, then finally reported back it failed. TTN stopped receiving frames as did Signals after this. It's 50 miles away so I probably won't get to it until maybe late tonight or tomorrow.
      I wasn't using any deep sleep routines, just time.sleep(300) at the end of my loop as I was still figuring out code issues.
      I attached my code in case someone suggests that it could be the cause of FOTA failure..

      # main.py -- put your code here!
      from network import LoRa
      import socket
      import ubinascii
      import struct
      import time
      import os
      import math
      import abpkeys
      import ustruct
      from machine import UART, I2C, Pin
      #from machine import I2C, Pin #added for si7021 rh sensor
      
      from si7021 import SI7021 #added for si7021 rh sensor
      
      uart = UART(1, 9600)                         # init with given baudrate
      uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters
      
      #initialize i2c to link to rh sensor
      i2c = I2C(0, pins=("P9","P10"))
      i2c.init(I2C.MASTER, baudrate=9600)
      sensor = SI7021(i2c=i2c)
      
      # Initialise LoRa in LORAWAN mode.
      # Please pick the region that matches where you are using the device:
      # Asia = LoRa.AS923
      # Australia = LoRa.AU915
      # Europe = LoRa.EU868
      # United States = LoRa.US915
      lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.US915)
      
      # create an ABP authentication params
      #my keys are stored in abpkeys.py then linked here so I have the same source running 
      #on multiple devices
      dev_addr=abpkeys.dev_addr
      nwk_swkey=abpkeys.nwk_swkey
      app_swkey=abpkeys.app_swkey
      #dev_addr = struct.unpack(">l", ubinascii.unhexlify('xxxxxxxx'))[0]
      #nwk_swkey = ubinascii.unhexlify('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
      #app_swkey = ubinascii.unhexlify('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
      for i in range(0, 71):
          lora.remove_channel(i)
      print('Removed default channels')
      time.sleep(1)
          
          # Set US ISM 915 channel plan for TTN US
      lora.add_channel(0, frequency=903900000, dr_min=0, dr_max=3)
      lora.add_channel(1, frequency=904100000, dr_min=0, dr_max=3)
      lora.add_channel(2, frequency=904300000, dr_min=0, dr_max=3)
      lora.add_channel(3, frequency=904500000, dr_min=0, dr_max=3)
      lora.add_channel(4, frequency=904700000, dr_min=0, dr_max=3)
      lora.add_channel(5, frequency=904900000, dr_min=0, dr_max=3)
      lora.add_channel(6, frequency=905100000, dr_min=0, dr_max=3)
      lora.add_channel(7, frequency=905300000, dr_min=0, dr_max=3)
      #channel	8:	903900000	hz	min_dr	0	max_dr	3				
      #channel	9:	904100000	hz	min_dr	0	max_dr	3				
      #channel	10:	904300000	hz	min_dr	0	max_dr	3				
      #channel	11:	904500000	hz	min_dr	0	max_dr	3				
      #channel	12:	904700000	hz	min_dr	0	max_dr	3				
      #channel	13:	904900000	hz	min_dr	0	max_dr	3				
      #channel	14:	905100000	hz	min_dr	0	max_dr	3				
      #channel	15:	905300000	hz	min_dr	0	max_dr	3				
      
      print('US channels set')
      time.sleep(1)
      
      
      print('restoring LoRa NVRAM')
      lora.nvram_restore()
      print('Joining LoRa via ABP')
      # join a network using ABP (Activation By Personalization)
      lora.join(activation=LoRa.ABP, auth=(dev_addr, nwk_swkey, app_swkey))
      
      # 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, 3)
      
      #Let's check whether the si7021 is attached and enable further code if it responds
      print('check si7021 serial')
      si7021presence=True
      temperature=-255
      print(i2c.scan())
      temperature=int(sensor.temperature())
      relativehumid=int(sensor.humidity())
      dewpoint=int(sensor.dew_point())
      print('Temp',temperature)
      print('RH%',relativehumid)
      print('Dewpoint',dewpoint)
      
      try:
          temperature=int(sensor.temperature())
          print('temperature = ',temperature)
      except NameError as msg:
          print(msg)
          si7021presence=False
      if( temperature !=-255):
          print('temperature reported = ',temperature)
      print('si7021 presence = ',si7021presence)
      #The first 5 seconds of dust data always seems irregular, so let's delay and clear the buffer
      data = uart.readall()
      time.sleep(10)
      data= uart.readall()
      time.sleep(1)# then give it another second for the next good byte to come in.
      while (1):
          readytosend=False
          print('polling Dust Sensor')
          data = uart.readall()# get everythitng from the serial buffer
          if data is not None:#make sure it'st not an empty buffer
              bytestream=data.split(b'BM')[1][0:31]# HPMA sends 32 byte packets that start with \x42\x4D ('BM')
              if len(bytestream)==30:#check tthat we actually got 30 bytes (excluding the data we split out)
                  if bytestream[0:2]==b'\x00\x1c':#HPMA packet is always 28 data bytes(excluding start header and checksum)
                      checksum=143#since split command removed the \x42\x4D, add them back to get correct checksum
                      validated=0
                      for i in range(0,28):
                          checksum+=bytestream[i]#cycle thru the data values and add them up
                      validated=int(bytestream[28])*256+int(bytestream[29])#read checksum bytes from packet and make them a 2-byte integer
                      if checksum==validated:# both values should match, else we have a corrupt packet
                          pm25=int(bytestream[4])*256+int(bytestream[5])#these two bytes represent the particulate detected that's 2.5um large
                          pm10=int(bytestream[6])*256+int(bytestream[7])#these two bytes represent the particulate detected that's 10um large
                          print('pm2.5 = ',pm25)
                          print('pm10 = ',pm10)
                          readytosend=True
                      else:
                          print('checksum failed')
                  else:
                      print('invalid packet length')
              else:
                  print('incomplete packet')
          if(si7021presence==True):
              print(i2c.scan())
              print('poll temp')
              temperature=int(sensor.temperature())
              print('poll RH')
              relativehumid=int(sensor.humidity())
              print('poll Dew')
              dewpoint=int(sensor.dew_point())
      
          if readytosend==True:
              # make the socket blocking
              # (waits for the data to be sent and for the 2 receive windows to expire)
              s.setblocking(True)
              print("Sending data!")
              # send some data
              # s.send(bytes([0x01, 0x02, 0x03]))
              #if(si7021presence==True):
              tempstruct=((ustruct.pack('>H',temperature)))
              rhstruct=((ustruct.pack('>H',relativehumid)))
              dewstruct=((ustruct.pack('>H',dewpoint)))
              s.send(bytes([bytestream[4], bytestream[5], bytestream[6],bytestream[7],tempstruct[0],tempstruct[1],rhstruct[0],rhstruct[1],dewstruct[0],dewstruct[1]]))#,relativehumid,dewpoint]))
              #else:    
              #    s.send(bytes([bytestream[4], bytestream[5], bytestream[6],bytestream[7]]))
                 
              pybytes.send_virtual_pin_value(False, 0, (bytestream[4]<<8)+bytestream[5])
              time.sleep(1)
              pybytes.send_virtual_pin_value(False, 1, (bytestream[6]<<8)+bytestream[7])
              time.sleep(1)
              pybytes.send_virtual_pin_value(False, 2, temperature)
              time.sleep(1)
              pybytes.send_virtual_pin_value(False, 3, relativehumid)
              time.sleep(1)
              pybytes.send_virtual_pin_value(False, 4, dewpoint)
              time.sleep(1)
              #pybytes.send_virtual_pin_value(False,2,100)
              #time.sleep(10)
      
          print('saving LoRa NVRAM')
          lora.nvram_save()
          # make the socket non-blocking
          # (because if there's no data received it will block forever...)
          s.setblocking(False)
          print("receiving data!")
          # get any data received (if any...)
          data = s.recv(64)
          print(data)
          print("Go to sleep 5 minutes!")
          time.sleep(300)```
      1 Reply Last reply Reply Quote 0
      • D Offline
        dnear1
        last edited by

        I was able to get it back online by unplugging and replugging power. The firmware update didn't take. I tried it a second time, and that took. But now have a bunch of corrupted signals data..

        1 Reply Last reply Reply Quote 0
        • P Offline
          Paul Thornton
          last edited by

          Hey.

          Whilst not super convinient as its 50 miles from you. If you can reclaim it and flash https://forum.pycom.io/topic/4185/new-pybytes-firmware-1-18-1-r9-experimental-lte-support manually

          Is should solve the issue with corrupted / weird data from Lora.

          1 Reply Last reply Reply Quote 0

          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

          With your input, this post could be even better 💗

          Register Login
          • 1 / 1
          • First post
            Last post

          Pycom on Twitter

          Pycom