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

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

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