Erschließung von LTE Cat M1 und NB1 mit dem Pycom FiPy

Updated documentation for LR6.0.0.0

A link to a historic version of a document at Pycom might give some clues

The latest Cat-M1 firmware is the following:

UE5.0.0.0d
LR5.1.1.0-36417

And this is the latest NB-IoT firmware:

UE6.0.0.0
LR6.0.0.0-37781

Sequans Monarch SQN3330 » Firmware upgrade @ Jul 19, 2018


There’s also a snippet how the modem maybe had to be initialized when operating in NB1 mode.

However, this documentation is from 2018 so it might well be outdated.

Hier wird beschrieben, wie man die Modem-Firmware über die SD-Karte aktualisieren kann und so wie betrachtet könnte das auch zur Laufzeit funktionieren. Trotzdem Miau – will man eigentlich nicht unbedingt so machen – oder doch!?

Auf jeden Fall ist es nach dem aktuellen Stand vermutlich noch nicht so einfach möglich (oder wird es niemals sein) wie die Betriebsart einer WiFi-Schnitte von STA auf AP oder umgekehrt umzustellen.

Die Anzahl der Alternativen ist sehr überschaubar, und jede hat jeweils ihre eigenen obstacles:

  • FOTA: geht hier sowieso nicht, nicht weiter nachdenken.

  • wenn Du erst den Provider / die Weltgregion / Funkbetriebsart einstellen mußt, damit das an Deinem Standort geht, kannst Du auch 2019 noch per XMODEM sogar 4G-Modems per USB oder per CDC ACM-Serieller flashen.

1 Like

JFYI: I ordered this week some FiPys from dutch distributor Antratek: All boards are v1.2 as printed on the board (although the label on each plastic box states incorecctly “v1.0”!).

1 Like

Exzellent. Wenn hier mal wieder eine Bestellung von jenen 1nce-Karten anläuft, von denen man sich neulich am Späti erzählte, wäre es spitze, wenn Ihr mich mit zwei Stück mitversorgen könntet. Gracias!

Doch nun endlich: Erfolgreiche Verbindung von FiPy mit EiNCE-SIM im LTE NB-IoT-Band

Auf den Schultern von den Giganten hier stehend und insb. dank jüngster Unterrichtungen durch Herrn Prof. Dr. @Andreas kann ich eine kleine Erfolgsmeldung aus dem Erdgeschoss eines berliner Mietshauses verbuchen:

  • Das FiPy-Board ist mit v1.2 gelabeled gekauft, aufs frischeste, Firmware v1.18.2.r6, geupdated.
  • Als Antenne wird eine “800-960/1710-2170MHz 2dBi”-, Gehäuse-interne Antenne verwendet, 20cm Kabel direkt auf U.FL (aka IPEX/IPAX). Empfangswert “CSQ” = 20-30.
  • Die Firmware des LTE-Modems auf NB-IoT-Betrieb gemäß dieser ganz genau zu befolgenden Anleitung geflashed. (Man muss sich auch zwischendrin einen Forums-Account anlegen, um ein dort hinterlegtes, hochgeheimes Passwort für die Modem-Firmware zu erfahren.)
  • Eine EiNCE-SIM-Karte eingelegt, die sonst nicht bedaddelt wurde (außer vorher testweise ins Mobiltelefon eingelegt, um zu gucken, ob das SIM ne PIN erfragt: Nö, ist nicht der Fall).
  • Das Ersteinbuchen ging auch relativ schnell (keine 1-2 Minuten), nicht die befürchteten 10 Minuten.
  • Nen erneuter Connect nach nem Reboot scheint unterschiedlich <1s aber auch vielleicht auch mal 10-20s zu brauchen. Müsste-man-mal™ tracken und weiter studieren.
  • Ein Reconnect findet nach nem “Reset-Button-Reboot” sehr schnell statt, nach nem “Kaltstart” braucht es seine ~5-15s.
  • Folgende Codezeilen sind ins main.py geklöppelt, das dem LTE-Modem erst ein paar Infos entlockt, dann den Connect macht und am Ende regelmäßig nen MQTT-Submit macht (und ein bisschen mit den LEDs spielt). Zwischendrin wir noch ne Temperatur gemessen.
  • Es geht doch auch ins Internet! DNS offenbar nicht (hackable?). Der Traffic fällt ausm Amazon-AWS raus, echt nen show-stopper, wenn da auch die übrigige Netz & VPN-Infrastruktur drüber läuft. “Netzwerk to the Cloud”, sagten sie auch neulich am Späti.
  • Es gibt wohl nur IPv4 (hinter nem NAT), kein IPv6. Also insofern kein echtes Internet.
  • Latenzen hab ich bis zu 7 Sekunden gesehen. Wildes rumgepinge vermittelt den Eindruck, als würde das Netz alle 5-10 Sekunden den Clients ne Chance für nen paar Datenverkehre geben: Wenn dreimal nacheinander jeweils vier Pings an unterschiedeliche Ziele kommen, jittern die vier Pings zu einander recht wenig, aber die drei Reihen (a vier Pings) zu einander erheblich: mal 1.5s, mal 5s, mal 3s.
  • Ab und an fehlt auch mal nen Paket. Wir sollten mal die Zuverlässigkeit “messen” und überlegen ob nen UDP-Submit oder “MQTT-QoS 0” noch tragbar wären.

:warning: Veraltet, bitte unter autonome-zelle / fipy-nbiot-rtd · GitLab weiterverfolgen

##!/usr/bin/env python
# fipy-nbiot-rtd v0.0.1, https://git.cicer.de/autonome-zelle/fipy-nbiot-rtd
# Connecting a Pt100-thermometer via an MAX31865 Adafruit-board at an PyCom FiPy via Narrow-Band-IoT-LTE to a MQTT-Server.
#
# by The Hiveeyes Project, https://hiveeyes.org/
# based on Software by Pycom Limited (2019, GPLv3)
#
# Known issues:
# - way too many
#
# Legend: Initial discussion for creating this thing
# https://community.hiveeyes.org/t/erschliessung-von-lte-cat-m1-und-nb1-mit-dem-pycom-fipy/
#
# This software is licensed under the GNU GPL version 3 or any
# later version, with permitted additional terms. For more information
# see the Pycom Licence v1.0 document supplied with this file, or
# available at https://www.pycom.io/opensource/licensing

print("[system] Hello world.")

import machine
from machine import RTC
import time
import pycom
from lopy_max31865 import MAX31865
import network
from network import LTE
#import sqnsupgrade
#import uping
from mqtt import MQTTClient

# rtd: instance
print("[Pt100] instance.")
rtd = MAX31865()

# lte: instance
print("[LTE] instance.")
lte = LTE()

# rtc: instance
print("[RTC] instance.")
rtc = RTC()
rtc.ntp_sync("192.53.103.108")

# LTE: get infos from Modem
#lte.send_at_cmd('AT!="RRC:setDbgPerm full"')
#print(lte.send_at_cmd('AT!="RRC:showcaps"'))
#print(lte.send_at_cmd('AT!="showver"'))
#sqnsupgrade.info()

# LTE: init()
try:
  lte.init()
except:
  print("[LTE] try() (except). will reset.")
  machine.reset()

# LTE: attach()
try:
  lte.attach(band=8, apn="iot.1nce.net")
  while not lte.isattached():
    time.sleep(1)
    print('[LTE] Attaching...')
    lte.send_at_cmd("AT+CFUN=1")
    print(lte.send_at_cmd("AT+CSQ"))
except:
  print("[LTE] attach() (except). Will reset.")
  machine.reset()

# LTE: connect()
try:
  lte.connect()
  while not lte.isconnected():
    time.sleep(1)
  print('[LTE] connecting...')
except:
  print("[LTE] connect() (except). will reset.")
  machine.reset()

# MQTT: connect()
try:
  print("[MQTT] trying connect.")
  client = MQTTClient("ef3423be2", "46.4.251.67", port=1883)
  client.settimeout = 60
  client.connect()
except:
  print("[MQTT] connecterror (except). will reset.")
  machine.reset()

# LED: turn off
pycom.heartbeat(False)
while True:
    # LED: blue
    print("[LED] blue")
    # Pt100: read measurement
    print("[Pt100] trying measurement.")
    pycom.rgbled(0x0000FF)
    try:
      temp = rtd.read()
      Tpoy = str(temp)
      print("[Pt100] got measurement: {0}°C".format(temp))
    except:
      print("[Pt100] error (except). will reset.")
      machine.reset()

    # LED: red
    print("[LED] red")
    # MQTT: publish
    print("[MQTT] trying submit.")
    pycom.rgbled(0xFF0000)
    try:
      client.publish("umwelt/airrohr/research/pt100-wtf-02/data.json", "{ \"Tpoly\": " + Tpoy + " }")
      print("[MQTT] done. sent: " + "{ \"Tpoly\":" + Tpoy + " }")
    except:
      print("[MQTT] error (except). will reset.")
      machine.reset()

    # LED: green
    print("[LED] green")
    # System: idle
    pycom.rgbled(0x001100)
    time.sleep(9)

Ergebnis ist dann ungefähr das hier:

[system] Hello world.
[Pt100] instance.
[LTE] instance.
[RTC] instance.
[LTE] Attaching...

+CSQ: 99,99

OK

[LTE] Attaching...

+CSQ: 99,99

OK

[LTE] Attaching...

+CSQ: 99,99

OK

[LTE] Attaching...

+CSQ: 99,99

OK

[LTE] Attaching...

+CSQ: 99,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 20,99

OK

[LTE] Attaching...

+CSQ: 20,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 20,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 20,99

OK

[LTE] Attaching...

+CSQ: 20,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 20,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] Attaching...

+CSQ: 20,99

OK

[LTE] Attaching...

+CSQ: 19,99

OK

[LTE] connecting...
('46.4.251.67', 1883)
[LED] blue
[Pt100] trying measurement.
[Pt100] got measurement: 24.61998°C
0
[LED] red
[MQTT] trying submit ...
[MQTT] done. Sent: { "Tpoly":24.61998 }
[LED] green
[LED] blue
[Pt100] trying measurement.
[Pt100] got measurement: 24.61998°C
0

Und fürs Protokoll noch:

boot.py
#!/usr/bin/env python
#
# Copyright (c) 2019, Pycom Limited.
#
# This software is licensed under the GNU GPL version 3 or any
# later version, with permitted additional terms. For more information
# see the Pycom Licence v1.0 document supplied with this file, or
# available at https://www.pycom.io/opensource/licensing
#

from machine import UART
import machine
import os

uart = UART(0, baudrate=115200)
os.dupterm(uart)


#from network import WLAN
#wlan = WLAN(mode=WLAN.STA)


machine.main('main.py')

Fazit: Das ging dann doch jetz eigentlich-irgendwie ziemlich “by the book”, die Doku erstreckt sich auf drei Artikel:
CAT-M1 (vor allem fürs HTTPS-Beispiel)
NB-IoT (für den Connect selbst)
LTE (Referenz/Funktionsbeschreibungen)
und natürlich:
Modem Firmware Update (s. o.)

ps.: Man will mit den timeouts großzügig sein. Das testweise zwischendrin verwendete urequests für http(s)-GETs ists wohl nicht, drum hab ich da noch manuell diesen diff/pull-request reingeprepelt, der ne timeout-Angabe ermöglicht.

pps.: hab das ding grad zwischen 16 und 17h mal 35min lang gepingt, durch den beigelegten openvpn tunnel: mean von 3s. max von 29s. 2% loss.

--- 10.194.84.3 ping statistics ---
2125 packets transmitted, 2079 received, 2% packet loss, time 2140313ms
rtt min/avg/max/mdev = 263.301/1574.289/28513.890/3079.014 ms, pipe 28
4 Likes

Gracias!

… wir haben endlich Konnektivität. Halleluja.

Danke fürs durchwurschteln, @wtf – exzellent!

Wichtige Details

Namensauflösung per DNS

Ein kleiner Nachteil wurde schnell offensichtlich: Die Namensauflösung über DNS geht nicht, daher muss mit IP-Adressen gearbeitet werden, solange keine anderen Mechanismen dafür eingeführt werden.

Timeouts FTW

Vielleicht können wir das auch in das modernere pycopy-urequests reinbekommen, das wir bei requirements-mpy.txt anziehen?

Habt ihr mal geschaut was im Auslieferungszustand möglich gewesen wäre? Ist da CAT-M1 aktiviert gewesen?

Jedenfalls sehr cool, dass wir eine Konnektivität des LTE-Moduls hinbekommen haben ohne den FiPy für ein update einschicken zu müssen!!

Das war ja auch ein brandneuer FiPy 1.2. Ich denke, dass die FiPys aus der Lieferung für BOB auch bereits alle modern genug sind, daher war die RMA-Nummer für uns vermutlich/hoffentlich nur ein hypothetisches Schreckgespenst.

Korrekt, geliefert wurde es mit der LTE-Firmware fürs CAT-M1 drauf … hab leider die Versionsnummer nicht notiert. Kann ich bei Interesse beim nächsten nochmal mitschreiben.

Ja.

Nix. Bei uns gibt es noch zu wenig M1.

Interessiert keine S… ;]. Falls doch: Oben bei Erschließung von LTE Cat M1 und NB1 mit dem Pycom FiPy - #35 by Andreas notiert. 5.0.0.0something, jetzt haben wir 6.0.0.0.

Die Ausgabe der neuen Firmware bzgl.

== CAPS ====================================
  . access stratum: R13
  . catM          : 1
  . nb-IoT        : 1

finde ich weiterhin interessant.

  • Basisinformation laut Pycom Dokumentation: Man muss die Firmware je nach Einsatzzweck wechseln.
  • Hypothese: Diese Firmware unterstützt beide Varianten.
  • Gegenargument: Warum gibt es dann weiterhin beide Varianten separat zum Download?

… soll uns aber erst einmal nicht weiter kümmern, hier gibt es derzeit nur NB1.

Next steps

Jetzt heißt es, die Schwummse bei der nächsten Gelegenheit und je nach Bedarf in einen entsprechenden Adapter umzufunktionieren und in das Terkin Network Subsystem einzubauen, am besten möglichst schlau.

1 Like

Achherrje! Dit is auch noch nen beworbenes “Feature”:
1nce-wolke

So ist das wohl im 21. Jahrhundert. Und für “IoT” auch irgendwie “standesgemäß”. (IPv4-only hinter nem NAT aus ner Amazon-Wolke mit ohne DNS … laut IETF darf man sowas doch schon lange nicht mehr “Internet” nennen. Auch nen Bestandsschutz ist bei dem Laden nicht argumentierbar.) Für die Nachwelt: Können wir bittebittebitte das ganze LoRa*-Thema nicht vernachlässigen?

3 Likes

Next steps “Auch mit LoRa funken”

I hear you, gern – hat aber leider auch andere obstacles. Gefunkt haben wir schon in echt (LoRa sowie LoRaWAN), das passt dann aber thematisch besser woanders hin.

Nun etwas ausgefuchster in verschiedener Hinsicht…

Features

  • Robustheit durch Pokemon exception handling
  • Anzeige der LTE-Signalstärke
  • Anzeige von Systemzuständen über LED-Farben

Mini-Dokumentation

Ausführlichere Details ggf. oben bei Erschließung von LTE Cat M1 und NB1 mit dem Pycom FiPy - #58 by wtf.

Hardware

Software

  • Firmware für Sequans Modem auf LTE Cat NB1 umstellen
  • MAX31865-Treiber von Kurt Albrecht für PT100 in den lib/-Ordner übertragen.
    Quelle: lopy_max31865.py
  • Code Quelltext beschaffen und anpassen. Es handelt sich um folgende Zeilen für die Einstellung des gewünschten Telemetrieziels.
    • client = MQTTClient("ef3423be2", "46.4.251.67", port=1883) # weather.hiveeyes.org
      Da über LTE derzeit keine DNS-Auflösung möglich ist, muss hier die IP-Adresse kodiert werden.
    • client.publish("umwelt/testdrive/basement/pt100-demo-42/data.json", payload)
      Die Adresskomponenten testdrive, basement und pt100-demo-42 können frei angepasst werden.
  • Code Quelltext als main.py in das Wurzelverzeichnis übertragen
  • SIM-Karte einlegen
  • System neustarten

Code Quelltext

:warning: Veraltet, bitte unter autonome-zelle / fipy-nbiot-rtd · GitLab weiterverfolgen

##!/usr/bin/env python
# fipy-nbiot-rtd v0.0.2, https://git.cicer.de/autonome-zelle/fipy-nbiot-rtd
# Connecting a Pt100-thermometer via an MAX31865 Adafruit-board at an PyCom FiPy via Narrow-Band-IoT-LTE to a MQTT-Server.
#
# by The Hiveeyes Project, https://hiveeyes.org/
# based on Software by Pycom Limited (2019, GPLv3)
#
# Known issues:
# - too many
#
# Legend: Initial discussion for creating this thing
# https://community.hiveeyes.org/t/erschliessung-von-lte-cat-m1-und-nb1-mit-dem-pycom-fipy/
#
# This software is licensed under the GNU GPL version 3 or any
# later version, with permitted additional terms. For more information
# see the Pycom Licence v1.0 document supplied with this file, or
# available at https://www.pycom.io/opensource/licensing

# hello world
print("[system] Initial boot. Hello world.")
import time
import pycom
print("[system] time & pycom loaded")

# LEDs: test
print("[system] testing LEDs (3x0.333s R,G,B at 0x22)")
pycom.heartbeat(False)
print("[system] LEDs: cycle 0.33s R, G, B at 22")
# LED: red
print("[system] LED: red")
pycom.rgbled(0x220000)
time.sleep(0.333)
# LED: green
print("[system] LED: green")
pycom.rgbled(0x002200)
time.sleep(0.333)
# LED: blue
print("[system] LED: blue")
pycom.rgbled(0x000022)
time.sleep(0.333)

# system: modules
print("[system] loading modules (LED: very low gray)")
pycom.rgbled(0x010101)
import machine
from machine import RTC
from micropython import const
import ure
import utime
from lopy_max31865 import MAX31865
import network
from network import LTE
#import sqnsupgrade
#import uping
from mqtt import MQTTClient
print("[system] All modules loaded. Let's wait a second.")

# system: instances
print("[system] loading instances (LED: low gray)")
pycom.rgbled(0x050505	)
# rtc: instance
rtc = RTC()
print("[RTC] instanced.")

# rtd: instance
rtd = MAX31865()
print("[Pt100] instanced.")

# lte: instance
lte = LTE()
print("[LTE] instanced.")

# LTE: get infos from Modem
#lte.send_at_cmd('AT!="RRC:setDbgPerm full"')
#print(lte.send_at_cmd('AT!="RRC:showcaps"'))
#print(lte.send_at_cmd('AT!="showver"'))
#sqnsupgrade.info()

# LTE: init
print("[LTE] initializing ... (LED light-yellow)")
pycom.rgbled(0x090900)
try:
  lte.init()
  print("[LTE] initialized.")
except:
  print("[LTE] exception. will reset.")
  machine.reset()

# LTE: attach
print('[LTE] attaching ... (LED light-yellow)')
pycom.rgbled(0x131300)
try:
  lte.attach(band=8, apn="iot.1nce.net")
  while not lte.isattached():
    time.sleep(1)

    try:
      csq_at = lte.send_at_cmd("AT+CSQ")
      csq_line_regex = ure.compile("\n")
      csq_line=csq_line_regex.split(csq_at)
      csq_string_regex = ure.compile(" ")
      csq_string=csq_string_regex.split(csq_line[1])
      csq_comma=csq_string[1]
      csq_num_regex = ure.compile(",")
      csq_num=csq_num_regex.split(csq_comma)
      csq=csq_num[0]
      print("[LTE] attaching ... (CSQ: " + csq + ")")
    except:
      csq="-999"
      print("[LTE] CSQ not recevied: " + csq)

  print('[LTE] attached.')
except:
  print("[LTE] exception. will reset.")
  machine.reset()

# LTE: connect
print('[LTE] connecting ... (LED light-yellow)')
pycom.rgbled(0x171700)
try:
  lte.connect()
  while not lte.isconnected():
    time.sleep(1)
    print('[LTE] connected.')
except:
  print("[LTE] exception. will reset.")
  machine.reset()

# NTP
print('[NTP] syncing ... (LED low orange)')
pycom.rgbled(0x272000)
try:
  rtc.ntp_sync("192.53.103.108") # ptb ntp
  print('[NTP] synced.')
except:
  print("[NTP] exception. will reset.")
  machine.reset()

# MQTT: connect()
print('[MQTT] connecting ... (LED orange)')
pycom.rgbled(0x322500)
try:
  client = MQTTClient("ef3423be2", "46.4.251.67", port=1883) # weather.hiveeyes.org
  client.settimeout = 60
  client.connect()
  print("[MQTT] connected.")
except:
  print("[MQTT] exception. will reset.")
  machine.reset()

# LTE: disconnect
print('[LTE] disconnecting ... (LED light-yellow)')
pycom.rgbled(0x050500)
try:
  lte.disconnect()
  while lte.isconnected():
    time.sleep(0.25)
    print('[LTE] disconnected.')
except:
  print("[LTE] exception. will reset.")
  machine.reset()

# main loop
print("[system] ==== starting main loop ... ====")
while True:

    print("[system] ------ main loop started ------")

    # Pt100: read measurement
    print("[Pt100] getting measurement ... (LED green)")
    pycom.rgbled(0x001000)
    try:
      temp = rtd.read()
      Tpoly = str(temp)
      print("[Pt100] got measurement Tpoly = {0}°C".format(temp))
      Tus = str(utime.ticks_us())
      Tseconds = str(utime.time())
      Ttime = Tseconds + Tus
    except:
      print("[Pt100] error (except). will reset.")
      machine.reset()

    # RTC: get time
    print("[RTC] getting time ... ")
    try:
      Tus = str(utime.ticks_us())
      Tseconds = str(utime.time())
      Ttime = Tseconds + Tus
      print("[RTC] it's now {0} seconds past 1970".format(Tseconds))
      print("[RTC] it's now {0} microseconds past 1970".format(Ttime))
    except:
      Ttime = ""
      print("[RTC] not time. setting empty.")

    # LTE: get CSQ
    print("[LTE] getting CSQ ... (LED light green)")
    pycom.rgbled(0x000500)
    try:
      csq_at = lte.send_at_cmd("AT+CSQ")
      csq_line_regex = ure.compile("\n")
      csq_line=csq_line_regex.split(csq_at)
      csq_string_regex = ure.compile(" ")
      csq_string=csq_string_regex.split(csq_line[1])
      csq_comma=csq_string[1]
      csq_num_regex = ure.compile(",")
      csq_num=csq_num_regex.split(csq_comma)
      csq=csq_num[0] + str(".99")
      print("[LTE] CSQ: " + csq)
    except:
      csq="-999.0"
      print("[LTE] CSQ not recevied: " + csq)

    # LTE: connect
    print('[LTE] connecting ... (LED yellow)')
    print("[system] LED: red")
    pycom.rgbled(0x171700)
    try:
      lte.connect()
      while not lte.isconnected():
        time.sleep(0.25)
        print('[LTE] connected.')
    except:
      print("[LTE] exception. will reset.")
      machine.reset()

    # Define telemetry payload
    payload = "{ \"Tpoly\": " + Tpoly + ", \"lte_csq\": " + str(csq) + ", \"time\": " + str(Tseconds) + " } "

    # MQTT: publish
    print("[MQTT] submitting ... (LED red)")
    pycom.rgbled(0x330000)
    try:
      client.publish("umwelt/testdrive/basement/pt100-demo-42", payload)
      print("[MQTT] done. sent: " + payload)
      time.sleep(1)
      print("[MQTT] submitted.")
    except:
      print("[MQTT] exception. will reset.")
      machine.reset()

    # LTE: disconnect
    print('[LTE] disconnecting ... (LED low yellow)')
    pycom.rgbled(0x050500)
    try:
      lte.disconnect()
      while lte.isconnected():
        time.sleep(1)
        print('[LTE] disconnected.')
    except:
      print("[LTE] exception. will reset.")
      machine.reset()

    # system: idle
    print("[system] 10s idle (LED blue)")
    # LED: green
    pycom.rgbled(0x000011)
    time.sleep(10)

Screenshot

Eine beispielhafte typische Log-Ausgabe für einen ersten Eindruck.

[system] Initial boot. Hello world.
[system] time & pycom loaded
[system] testing LEDs (3x0.333s R,G,B at 0x22)
[system] LEDs: cycle 0.33s R, G, B at 22
[system] LED: red
[system] LED: green
[system] LED: blue
[system] loading modules (LED: very low gray)
[system] All modules loaded. Let's wait a second.
[system] loading instances (LED: low gray)
[RTC] instanced.
[Pt100] instanced.
[LTE] instanced.
[LTE] initializing ... (LED light-yellow)
[LTE] initialized.
[LTE] attaching ... (LED light-yellow)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attaching ... (CSQ: 24)
[LTE] attached.
[LTE] connecting ... (LED light-yellow)
[NTP] syncing ... (LED low orange)
[NTP] synced.
[MQTT] connecting ... (LED orange)
('46.4.251.67', 1883)
[MQTT] connected.
[LTE] disconnecting ... (LED light-yellow)
[system] ==== starting main loop ... ====
[system] ------ main loop started ------
[Pt100] getting measurement ... (LED green)
[Pt100] got measurement Tpoly = 25.02577°C
[RTC] getting time ... 
[RTC] it's now 1564196613 seconds past 1970
[RTC] it's now 156419661342589480 microseconds past 1970
[LTE] getting CSQ ... (LED light green)
[LTE] CSQ: 24.99
[LTE] connecting ... (LED yellow)
[system] LED: red
[MQTT] submitting ... (LED red)
[MQTT] done. sent: { "Tpoly":25.02577, "lte_csq": 24.99, "time": 1564196613 } }
[MQTT] submitted.
[LTE] disconnecting ... (LED low yellow)
[system] 10s idle (LED blue)
[system] ------ main loop started ------
[Pt100] getting measurement ... (LED green)
[Pt100] got measurement Tpoly = 24.9921°C
[RTC] getting time ... 
[RTC] it's now 1564196633 seconds past 1970
[RTC] it's now 156419663362199533 microseconds past 1970
[LTE] getting CSQ ... (LED light green)
[LTE] CSQ: 24.99
[LTE] connecting ... (LED yellow)
[system] LED: red
[MQTT] submitting ... (LED red)
[MQTT] done. sent: { "Tpoly":24.9921, "lte_csq": 24.99, "time": 1564196633 } }
[MQTT] submitted.
[LTE] disconnecting ... (LED low yellow)
[system] 10s idle (LED blue)
1 Like

Saustark, vielen Dank! oO, jetzt werden die Programme immer länger. Die hätten schon längst in ein Repositorium… Ich leg da mal eins an, nehme damit hoffentlich ein wenig Arbeit ab und hoffe, dass es gefällt.

Ich finde, ein dedizierter PT100-Datenlogger hätte ein eigenes Repository verdient. Unabhängig davon bedienen wir uns gerne am Code für die Integration des LTE-Supports in den Supercollider.

Dass dieser ultralange Thread nun dank einer fertigen Implementierung vielleicht endlich seinen Abschluß finden kann, freut uns sehr.

1 Like

Hier noch mal im Detail und fürs Archiv das Upgrade der LTE Modem Firmware von ‘so wurde geliefert’ zu ‘latest’ beim Upgradevorgang über die SD-Karte.

>>> import sqnsupgrade
>>> sqnsupgrade.info()
<<< Welcome to the SQN3330 firmware updater [1.2.5] >>>
>>> FiPy with firmware version 1.20.0.rc11
Your modem is in application mode. Here is the current version:
UE5.0.0.0d
LR5.1.1.0-39529

IMEI: xxxxxxxxxxxx
>>> from machine import SD
>>> sd = SD()
>>> os.mount(sd, '/sd')
>>> os.listdir('/sd')
['NB1-41019.dup', 'updater.elf', 'upgdiff_33080-to-41019.dup', 'upgdiff_39529-to-41019.dup', 'upgdiff_40343-to-41019.dup', 'upgdiff_41065-to-41019.dup']
>>> sqnsupgrade.run('/sd/NB1-41019.dup', '/sd/updater.elf')
<<< Welcome to the SQN3330 firmware updater [1.2.5] >>>
>>> FiPy with firmware version 1.20.0.rc11
/sd/updater.elf is not required. Resumining normal upgrade.
Firmware file is too big to load via FFF method. Using ON_THE_FLY
Attempting AT wakeup...
Session opened: version 1, max transfer 8192 bytes
Sending 5835531 bytes: [########################################] 100%
Waiting for modem to finish the update...
<<<=== DO NOT DISCONNECT POWER ===>>>
Resetting................................
Your modem has been successfully updated.
Here is the current firmware version:

UE6.0.0.0
LR6.0.0.0-41019

IMEI: xxxxxxxxxxxxxxxxxx

Modem Firmware Update

2 Likes

Merci für den Bericht!

Danke fürs Zusammensammeln der kompletten Liste aller inkrementellen Upgrade-Dateien. Wie kriegen wir die am besten gebündelt? Könntest Du sie gschwind in einem .tar.gz-Archiv zusammenfassen?

das ist schon alles beinander.

ich habe da nur den inhalt von NB1-41019.zip von software.pycom.io
benutzt und vorher auf eine sdkarte entpackt.

1 Like

Beware of the dragons. Melde mich grad von einem kleinem Testbetrieb in der Brandenburger Pampa. Die CSQ liegt hier zw. 5 und 15, nicht mehr bei 20-30. Der initial attach braucht etwas länger.

Bugs so far detected:

  • lte.disconnect/lte.connect langt nicht für nen Zellwechsel (es gibt im NB-IoT (LTE Cat-NB1) ja wohl kein Roaming handover).
  • Der verwendete MQTT-client ignoriert seine Timeoutangabe und probiert es auch mal ewig erfolglos.
  • der lte.attach braucht auch mal gefühlte Ewigkeiten, wir sollten gucken obs hier timeouts gibt/wir welche wollen.

Aber man muss festhalten, dass sich an den beiden Standorten auch Mobiltelefone zwischen 4G, EDGE und not-connected bewegen und es dafür ganz gut scheint, wenn das NB-IoT mit obiger Software auch mal ne Nacht lang durchgelaufen ist und Werte lieferte.

3 Likes

… oder workaroundable …