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

Dass es die Möglichkeit gibt, dass unsere Module übers RMA müssen, wenn wir das LTE-Modem nutzen wollen, ist schon eine zeitlang bekannt. @tonke hat glaube ich auch schon einmal versucht, das RMA-Verfahren einzuleiten, ich kenne jedoch nicht den aktuellen Stand.

Vielleicht können wir das genauer prüfen und möglichst früh mit den verbleibenden Modulen das RMA-Verfahren einleiten, falls nötig.

Recap

Introduction

There are discussions about whether the FiPy modules in our hands already support Band 8, which is assumed to be required for attaching to the Telekom network through iot.1nce.net in Germany.

Details

After the discussion at Important update regarding LTE modem updates | Pycom user forum dropped off in October 2018, @robert-hh reported success around March 2019, which we already cited above, see also Erschließung von LTE Cat M1 und NB1 mit dem Pycom FiPy - #32 by Andreas.

More details

When inspecting some modules on my desktop, it appears they are running the most recent CATM1-39529 firmware for the Sequans Modem to support CAT-M1.

If you want to switch to NB1 or upgrade to more recent firmware versions, Introduction will be the right place to follow.

DIY

We will outline some AT commands picked up from the Pycom Forum to enable you checking details with your modem. We are currently running

Pycom MicroPython 1.20.0.rc11 [v1.9.4-0a38f88] on 2019-05-14; FiPy with ESP32

First, check into a REPL.

$ make repl

Then, execute some Python commands.

Check modem capabilities

from network import LTE
lte = LTE()
lte.send_at_cmd('AT!="RRC:setDbgPerm full"')
print(lte.send_at_cmd('AT!="RRC:showcaps"'))

Output

== CAPS ====================================

  . access stratum: R13
  . catM          : 1
  . nb-IoT        : 0

-- EUTRA bands --
  . supported     : 28/20/13/12/8/5/4/3
  . board         : 3/4/5/8/12/13/20/28

So, this module well supports band 8, as lte.attach(band=8, apn="iot.1nce.net") also invokes without croaking. Otherwise, you might receive things like

>>> lte.attach(band=8, apn="iot.1nce.net")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: band 8 not supported

Check modem firmware version I

print(lte.send_at_cmd('AT!="showver"'))

Output

SYSTEM VERSION
==============
  FIRMWARE VERSION
    Bootloader0* : 5.1.1.0 [39529]
    Bootloader1  : NA
    Bootloader2  : NA
    NV Info      : 1.1,0,0
    Software     : 5.1.1.0 [39529] by robot-soft at 2018-09-28 16:07:40
    UE           : 5.0.0.0d
  COMPONENTS
    ZSP0         : 1.0.99-13616
    ZSP1         : 1.0.99-12355

OK

Check modem firmware version I

Also, this is the information presented by sqnsupgrade:

>>> import sqnsupgrade
>>> sqnsupgrade.info()

Output

<<< 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: {redacted}

This output means that the modem is effectively running firmware CATM1-39529, which seems to be the most recent one for CAT-M1 as of 2019-07-17, see also Introduction.

Conclusion

Band 8 seems to be supported by the current configuration of the specific devices on my desktop, at least for CAT-M1. If CAT-NB1 would be the way to follow, we should revisit this.

2 Likes

@robert-hh and also others confirm everything should work with the newest board and the newest firmware.

But also, the hardware thing still holds true:

For me, it is actually reading “FiPy V1.2” – so all should be good if all FiPys around us come from the same batch already.

Please also be aware that

1 Like

Some more commands…

from network import LTE
lte = LTE()
lte.send_at_cmd('AT!="RRC:setDbgPerm full"')

Modem info

# Display DL SYNCHRO STATISTICS and SYSTEM FSM information
print(lte.send_at_cmd('AT!="showphy"'))
print(lte.send_at_cmd('AT!="fsm"'))

LTE driver appears to be stopped? | Pycom user forum

AT-based help

# Display list of supported AT commands
print(lte.send_at_cmd('AT+CLAC'))

# Display list of all Sequans specific commands
print(lte.send_at_cmd('AT!="help"'))

# How to use the AT-based help
print(lte.send_at_cmd('AT!="help help"'))

Important update regarding LTE modem updates | Pycom user forum

Examples

Some example commands at your service.

# Display network configuration
print(lte.send_at_cmd('AT!="ifconfig"'))

# Print network connections
print(lte.send_at_cmd('AT!="netstat"'))

# Show the system time
print(lte.send_at_cmd('AT!="showTime"'))

# Show the system logs
print(lte.send_at_cmd('AT!="showLogs"'))
print(lte.send_at_cmd('AT!="getLogs"'))
print(lte.send_at_cmd('AT!="printLogs"'))

# Print cpu information
print(lte.send_at_cmd('AT!="cpuinfo"'))

# Display memory status
print(lte.send_at_cmd('AT!="mem"'))

# Dump eCos tasks
print(lte.send_at_cmd('AT!="infoAllTask"'))

# List contents of directories in a tree-like format
print(lte.send_at_cmd('AT!="tree"'))

# Display current state
print(lte.send_at_cmd('AT!="state"'))

# Request to power on
print(lte.send_at_cmd('AT!="powerOn"'))

# Request to power off
print(lte.send_at_cmd('AT!="powerOff"'))

UCI options

>>> print(lte.send_at_cmd('AT!="help"'))

    UCI   show                   Show UCI options
    UCI   get                    Get UCI option
    UCI   set                    Set UCI option
    UCI   delete                 Delete UCI option

# Show UCI options
print(lte.send_at_cmd('AT!="UCI::show"'))

# Show value of specific UCI option
print(lte.send_at_cmd('AT!="UCI::get sqnsms.generic.moSmsType"'))

Moar

print(lte.send_at_cmd('AT!="CBE::showVersion"'))
print(lte.send_at_cmd('AT!="RRC::showCaps"'))
print(lte.send_at_cmd('AT!="L1P::getDebug"'))

External resources

1 Like

Habe erwartet, dass man per einfachen Software-Switch von CAT-M1 zu CAT-NB1 wechseln kann, @Ron sagte aber auch was von Modem-Firmwareupdate, weiß nicht, ob das immer sein muss, wenn man von CAT-M1 zu CAT-NB1 wechselt oder anders herum oder nur weil man in DE ein update für andere Kanäle braucht.

Bisher hatten @tonke und ich es so verstanden, dass man die Modem-Firmware je nach Betriebsart wechseln muss und dachten, das wäre bereits ins kollektive Bewusstsein übergegangen. Die drüben bei Erschließung von LTE Cat M1 und NB1 mit dem Pycom FiPy aufgeschnappten capabilities lassen auf entsprechendes schließen:

== CAPS ====================================

  . access stratum: R13
  . catM          : 1
  . nb-IoT        : 0

Im Pycom-Forum bei FiPy, NB-IoT, 1nce/ Telekom.de germany: fails, no band 8 support? | Pycom user forum finden sich allerdings Dumps von anderen, die zeigen, dass u.U. beide Varianten gleichzeitig unterstützt werden könnten. Who knows?

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

We just asked for clarification about dual-mode modem support at Connection to NB-IOT issues. How to get logs | Pycom user forum.

@robert-hh promptly answered our question. Thanks again!

Hm… stellt sich erst recht die Frage, wie andere dann im pycom-Forum dies hinbekommen haben:

Gedanken

Genau. Vielleicht haben die Entwickler bei Sequans die entsprechende auf eCos basierende Software-Implementierung aufgemöbelt und darin nun doch beide Modi zeitgleich ermöglicht. Wäre diese These an der Grenze zwischen Theorie und Praxis grundsätzlich denkbar?

Wir sollten diesem Ratschlag vermutlich folgen, die CATM1-39529 Firmware hinter uns lassen und die NB1-41019 Firmware aufspielen – v.a. vor dem Hintergrund, dass NB1 ohnehin schon zugänglicher zu sein scheint als M1. Vielleicht sehen wir dann mehr.

Vermutung: Vielleicht galt die Trennung nur für den Prototypen der Firmware Monarch LR-5.1.1.0. Mittlerweile scheint die Reisegruppe bei Monarch LR-6.0.0.0 angekommen zu sein – vielleicht aber auch nur in Form der Pycom-Kohorte als Betatester ;].

Direct download

https://software.pycom.io/downloads/sequans.html

Sequans CAT-M1 firmware

Sequans NB-IoT firmware


image

German is easy! – “Die Sonne scheint zu scheinen.”
Bananenprinzip – Wikipedia

1 Like

Updated documentation for LR6.0.0.0

Die Community scheint ebenfalls auf eine neue AT-command Referenz zu warten.

https://forum.pycom.io/topic/3736/documentation-of-monarch-platform

AT+CFUN fun

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!!