Zum Inhalt springen

CNX Software: Erste Schritte mit dem GL-S200 Thread Border Router Kit

Letzte Woche haben wir uns die Hardware des GL.iNet GL-S200 Thread Border Router Kits mit drei nRF52840 Thread Dev Boards angesehen. Inzwischen hatte ich Gelegenheit, mit dem Kit zu arbeiten. Daher berichte ich im zweiten Teil des Tests von meinen ersten Erfahrungen.

Ersteinrichtung des GL-S200

Ich verband den WAN-Port mit meinem Ethernet-Switch, der wiederum mit meinem Modemrouter verbunden war, und den LAN-Port mit meinem Laptop. So konnte ich über die Standard-IP-Adresse (192.168.8.1) auf die Weboberfläche zugreifen. Der GL-S200 verwendet dasselbe Admin Panel wie andere GL.iNet-Router, etwa der Beryl AX Router, den wir zu Beginn des Jahres getestet haben.

GL-200-Dashboard

Ein Assistent begrüßt Sie, in dem Sie die Sprache auswählen und ein neues Passwort für das Admin Panel festlegen. Anschließend erhalten Sie Zugriff auf das vertraute GL.iNet Admin Panel 4.x.x.

GL-S200 Admin Panel

Nach Abschluss des Assistenten sollte sich das System automatisch mit dem Internet verbinden und die mittlere RGB-LED am Gerät grün leuchten.

Thread-Netzwerk

Als Erstes wechseln Sie im linken Bereich zu THREAD MESH, um das Thread-Netzwerk zu aktivieren.

GL-S200 Thread-Netzwerk konfigurieren
IPv6-Adresse bei aktiviertem Thread-Netzwerk

Nach einem Klick auf Enable erhalten Sie drei IPv6-Adressen:

  • Link-Local Address – Alle Schnittstellen, die mit einer einzelnen Funkübertragung erreichbar sind

  • Local Address – Alle Schnittstellen, die außerhalb eines Thread-Netzwerks erreichbar sind (in der OpenThread-Dokumentation scheint dies Global Address zu heißen)

    Update von GL.iNet: Der Zugriff auf das globale IPv6-Internet wird von OT/OTBR noch nicht unterstützt.

    Die offizielle Antwort von OpenThread finden Sie hier: https://github.com/openthread/openthread/discussions/8794

    Die lokale Adresse ist eine OMR-Adresse (off-mesh-routable), über die Sie von der Wi-Fi-/Ethernet-Seite auf Thread-Geräte zugreifen können.

  • Mesh-Local EID – Alle Schnittstellen, die innerhalb desselben Thread-Netzwerks erreichbar sind

Wenn Sie eigene Thread-Geräte haben, können Sie zum Menü Thread Commissioning wechseln und die EUI64 Ihrer Geräte sowie den Pre-Shared Key eingeben. GL.iNet hat jedoch einen einfacheren Bereich in der Weboberfläche für die eigenen Thread Dev Boards, kurz TBD, eingerichtet.

GL Dev Board: Geräte hinzufügen

Im Bereich GL DEV BOARD->Devices können wir auf die Schaltfläche Add Devices und anschließend auf Apply klicken. Wenn wir den SW2-Schalter auf einem Board drücken, wird es automatisch zum GL-S200 Thread Border Router hinzugefügt.

Thread Dev Board: Typ A0 A1

Wir sollten den Typ A0+A1 auswählen und dem Board einen Namen geben. Das Gleiche können wir für die beiden anderen Boards wiederholen. Anschließend zeigt das Admin Panel Temperatur-, Druck-, Feuchtigkeits- und Beleuchtungsstärkewerte für alle drei Boards an.

GL-S200 Admin Panel: GL DEV BOARD Geräte und Sensoren

GL-S200-Firmware-Update

Zu diesem Zeitpunkt fiel mir ein, dass ich etwas vergessen hatte: GL.iNet teilte mir mit, dass eine neue Firmware für den GL-S200 verfügbar sei, die ich manuell einspielen sollte. Wechseln wir dafür zu „SYSTEM->Upgrade“.

GL-S200-Firmware-Upgrade

Im Admin Panel wird die Firmware 4.1.3 Release 5 als aktuell angezeigt, da die neue Firmware nicht auf den OTA-Server übertragen wurde. Mir wurde jedoch ein Download-Link zu einer neueren Firmware bereitgestellt, die am 6. März 2023 kompiliert wurde.

GL-S200-Firmware-Download

Ich lud die Datei herunter, wechselte zum Bereich Local Upgrade und lud die Datei auf den GL-S200 Thread Border Router hoch.

GL-S200 Thread Border Router: lokales Firmware-Upgrade

Die Überprüfung war erfolgreich. Daher klickte ich auf Install und installierte schließlich Firmware 4.1.3 Release7 auf meinem Gerät.

GL-S200 Admin Panel: Firmware 4.1.3 Release 7

Firmware der Thread Dev Boards aktualisieren

Während ich mich mit dem Firmware-Update beschäftigte, stellte ich fest, dass auch für die Thread Dev Boards ein Firmware-Update von Version 1.1.5 auf 1.1.9 verfügbar war. Ich führte es durch, und es funktionierte problemlos.

Thread Dev Board: Firmware-Upgrade 1.1.9

Thread-Topologie

Thread basiert auf Mesh-Netzwerken. Befinden sich Knoten in Routernähe, verbinden sie sich direkt mit dem Router; bei zu großer Entfernung oder schwachem Signal können sie selbst als Router agieren. Mit allen Geräten auf meinem Schreibtisch …

Erste Schritte mit dem GL-S200 Thread Border Router

… hatte das Netzwerk erwartungsgemäß eine Stern-Topologie.

GL-S200: Sternförmige Thread-Topologie

Daher stellte ich die Boards weiter auseinander und in einer geraden Linie auf; eines platzierte ich sogar im Freien.

Thread Dev Boards drinnen und draußen

Das Board im Freien lässt sich anhand der höheren Temperatur und Beleuchtungsstärke leicht erkennen.

Thread-Signalstärke

Wenn wir im Topologiediagramm auf „Self“ klicken, sehen wir auch die Signalstärke des mit dem Thread Border Router verbundenen Knotens. Ich konnte das Thread Dev Board jedoch nie als Router einsetzen. Wir gingen sogar nach draußen, um außer Reichweite zu kommen oder zumindest ein schwächeres Signal zu erhalten, doch das Mesh-Netzwerk funktionierte nicht wie erwartet. Daher fragte ich die GL.iNet-Ingenieure. Sie antworteten, dass dafür eine Thread-Router-Firmware erforderlich sei:

Unsere Standard-TBD-Firmware ist derzeit vom Typ Thread-Endgerät und kann nicht direkt miteinander verbunden werden. Wir stellen Ihnen im Laufe des Tages die Thread-Router-Firmware und die entsprechende TBD-Flash-Anleitung bereit.

Sie schickten mir die Router-Firmware sowie das mcumgr Dienstprogramm für Linux und Windows.

nRF52 mcumgr-Dienstprogramm für Linux und Windows

Ich schloss eines der Thread Dev Boards an einen Linux-PC (Ubuntu 22.04) an:

print(“Hello World”) wird als print(“Hello World”)` angezeigt.

$ bt -l
 port |  age (sec) | device     | driver           | description
------+------------+------------+------------------+----------------------
 *  0 |       1137 | ttyUSB0    | ch341-uart       | USB Serial

Der serielle Port wird erkannt. Daher kann ich den folgenden Befehl ausführen, um den aktuellen Firmwarestatus zu überprüfen:

$ sudo ./mcumgr --conntype serial --connstring=/dev/ttyUSB0,baud=460800 image list
Error: NMP timeout
jaufranc@cnx-laptop-4:~/edev/GL-S200/TBD upgrade$ sudo ./mcumgr --conntype serial --connstring=/dev/ttyUSB0,baud=460800 image list
Images:
 image=0 slot=0
    version: 1.1.9
    bootable: true
    flags: active confirmed
    hash: 88b4725af7975e0b60915c320a82082bb2dda923b736f0e31d2c7d4d67cac3d3
 image=0 slot=1
    version: 1.1.5
    bootable: true
    flags:
    hash: 4d8548e6910e7214d8325a7d1a49a8390fb25cce983bdb0b15bfecc657f7860b
Split status: N/A (0)

Beim ersten Mal schlug es mit dem Fehler „NMP timeout“ fehl, beim zweiten Versuch funktionierte es jedoch. Wir sehen, dass sich die im Admin Panel aktualisierte Firmware 1.1.9 in Slot 0 und die frühere Firmware 1.1.5 in Slot 1 befindet. Nun kann ich versuchen, die Router-Firmware zu flashen:

$ sudo ./mcumgr --conntype serial --connstring=/dev/ttyUSB0,baud=460800 image upload GL-Thread-Dev-Board-FTD-OTA-v1.1.9.bin
 426.58 KiB / 426.58 KiB [========================] 100.00% 8.93 KiB/s 47s
Done

Überprüfen wir es erneut:

$ sudo ./mcumgr --conntype serial --connstring=/dev/ttyUSB0,baud=460800 image list
Images:
 image=0 slot=0
    version: 1.1.9
    bootable: true
    flags: active confirmed
    hash: 88b4725af7975e0b60915c320a82082bb2dda923b736f0e31d2c7d4d67cac3d3
 image=0 slot=1
    version: 1.1.9
    bootable: true
    flags:
    hash: 7dbb8a9867a000bb968099593bc1f6c2c7bb28ab458719f499364c4a77feca9f
Split status: N/A (0)
Done

Die Firmware in Slot 0 ist die aktuell ausgeführte Firmware, während die Firmware in Slot 1 die gerade geflashte Router-Version ist. Wir können wie folgt zur neuen Firmware wechseln:

sudo ./mcumgr --conntype serial --connstring=/dev/ttyUSB0,baud=460800 image test 7dbb8a9867a000bb968

Anschließend können wir das Board neu starten und sicherstellen, dass sich die neue Firmware mit dem Hash-Präfix 7dbb in Slot 0 befindet:

$ sudo ./mcumgr --conntype serial --connstring=/dev/ttyUSB0,baud=460800 image list
Images:
 image=0 slot=0
    version: 1.1.9
    bootable: true
    flags: active confirmed
    hash: 7dbb8a9867a000bb968099593bc1f6c2c7bb28ab458719f499364c4a77feca9f
 image=0 slot=1
    version: 1.1.9
    bootable: true
    flags:
    hash: 88b4725af7975e0b60915c320a82082bb2dda923b736f0e31d2c7d4d67cac3d3
Split status: N/A (0)

Nachdem wir das Board wieder zum Admin Panel hinzugefügt haben, sehen wir den Thread Leader (GL-S200), zwei Endgeräte und einen Router, also das Board, das wir gerade mit der Router-Firmware geflasht haben.

Thread-Topologie: Thread Leader, Router und Endgerät

Keines der Endgeräte ist mit dem Router auf Board 1 verbunden, da sich alle auf meinem Schreibtisch befinden und mit dem GL-S200 verbunden sind. Daher brachte ich Board 1 zusammen mit einem der Endgeräte in einen anderen Raum, 12 Meter vom GL-S200 Thread Border Router entfernt. Die Topologie änderte sich jedoch nicht. Die Verbindung scheint „klebrig“ zu sein: Ein Thread-Knoten verbindet sich nur dann mit einem anderen Router, wenn er außer Reichweite ist, nicht allein aufgrund der Signalstärke.

Als ich den GL-S200 jedoch ausschaltete und neu startete, hatten sich die beiden Endgeräte erneut mit dem Router auf Board 1 verbunden, der nun der „Thread Leader“ im Netzwerk war.

Thread Dev Board: Router-Firmware und Thread Leader

Es funktioniert also. Ich hatte jedoch nicht erwartet, dass es genau so funktioniert: Board 2 ist 10 Zentimeter vom GL-S200 Thread Border Router (self) entfernt und Board 1 12 Meter, doch Board 2 verband sich auch nach einiger Zeit nicht erneut mit dem GL-S200. Anders gesagt: Solange die Verbindung besteht, verbindet sich ein Thread-Knoten nicht mit einem anderen Router, selbst wenn dieser näher ist und ein stärkeres Signal bietet. Für die Akkulaufzeit ergibt das vermutlich Sinn.

GL-S200 Thread Border Router Mesh-Netzwerk

Daher nahm ich Board 2 (Endgerät) und Board 1 (Router) auf einen kurzen Ausflug außerhalb der Reichweite des GL-S200 mit. Dann schaltete ich zuerst Board 1 und anschließend Board 2 ein, um sicherzustellen, dass sie sich verbanden, und ging nach Hause zurück. Es funktionierte: Wie im obigen Diagramm verbindet sich Board 2 über Board 1 als Router mit dem GL-S200 „Thread Leader“.

Informationen zum GL Thread Dev Board

GL-S200: Geräteaktion

Wenn wir bei einem bestimmten Gerät auf die drei Punkte in der Spalte Action klicken, erhalten wir Zugriff auf weitere Optionen: Device Detail, View Records, Edit Device, Get Code und Reset Device.

Geräteinformationen

Thread-IoT-Knoten: Gerätedetails

Wir erhalten die EUI-64, den Namen, die IPv6-Adresse, die erweiterte MAC-Adresse (64-Bit statt der üblichen 48-Bit), die Firmwareversion und Sensordaten.

View Records

Nachdem die Boards über 24 Stunden lang gelaufen waren, rief ich das Menü „View Records“ auf, um Diagramme mit den Sensorwerten eines bestimmten Boards anzusehen.

GL-S200 GL DEV BOARD: View Records Tag

Es sieht größtenteils in Ordnung aus. Wie Sie unten links sehen, gibt es Werte um 21 Uhr, doch das Diagramm beginnt aus irgendeinem Grund erst um 23 Uhr. Das ist bei allen Boards gleich.

GL DEV BOARD: View Records Stunde

Im Stundendiagramm sieht es noch schlechter aus. Da wir auf der linken Seite immer einen Datenpunkt erhalten, scheint es sich eher um einen Anzeigefehler als um fehlende Datenpunkte zu handeln.

Codebeispiele

Der Bereich „Get Code“ ist möglicherweise der wichtigste Teil, wenn Sie Ihre eigenen Thread-Geräte mit den fünf bereitgestellten Codebeispielen überwachen und steuern möchten.

Codebeispiel für Thread-Geräte

Um die Beispiele auszuführen, müssen wir uns per SSH mit dem GL-S200 Thread Border Router verbinden. Beginnen wir mit dem Code zum Auslesen von Sensordaten.

root@GL-S200:~# /usr/bin/demo_get_sensor_data
1 dev_id=9483c44004df0679 connected=1 temperature=31.300811 humidity=43.409729 brightness=0 pressure=97.817392
2 dev_id=9483c47d79c19475 connected=1 temperature=32.742767 humidity=53.620910 brightness=0 pressure=97.814472
3 dev_id=9483c4ec736c4f68 connected=1 temperature=31.292800 humidity=42.652893 brightness=0 press

Wir können auch ein bestimmtes Gerät anhand seiner EUI-64 auswählen:

root@GL-S200:~# /usr/bin/demo_get_sensor_data 9483c44004df0679
dev_id=9483c44004df0679 connected=1 temperature=31.300811 humidity=43.409729 brightness=0 pre

Hier ist der Quellcode als Referenz:

#!/bin/sh
# Note, this file is stored in /usr/bin/demo_get_sensor_data
# Usage: demo_get_sensor_data <dev_id>
# It will print all sensor data if <dev_id> is null, and the <dev_id> is the EUI64 of the device, which saved in /etc/config/thread_devices

. /usr/share/libubox/jshn.sh

dev_id=$1
if [ -z "$dev_id" ]; then
    res=$(curl -s localhost/rpc -d '{"jsonrpc":"2.0","id":"0","method":"call","params":["","gw","get_device_list",{}]}')

    json_init
    json_load "$res"
    json_select result
    json_select device_list
    idx=1
    while json_is_a ${idx} object; do
        json_select ${idx}
        json_get_var dev_id dev_id
        json_get_var connected connected

        json_select dev_data
        json_get_var val_temp temperature
        json_get_var val_humi humidity
        json_get_var val_brightness brightness
        json_get_var val_pressure pressure
        echo "$idx dev_id=$dev_id connected=$connected temperature=$val_temp humidity=$val_humi brightness=$val_brightness pressure=$val_pressure"

        json_select ..
        json_select ..

        idx=$((idx + 1))
    done
else
    res=$(curl -s localhost/rpc -d "{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"call\",\"params\":[\"\",\"gw\",\"get_device_status\",{\"dev_id\":\"$dev_id\"}]}")

    json_init
    json_load "$res"
    json_select result
    json_get_var dev_id dev_id
    json_get_var connected connected
    json_select dev_data
    json_get_var val_temp temperature
    json_get_var val_humi humidity
    json_get_var val_brightness brightness
    json_get_var val_pressure pressure
    echo "dev_id=$dev_id connected=$connected temperature=$val_temp humidity=$val_humi brightness=$val_brightness pressure=$val_pressure"
fi

Probieren wir die anderen Beispiele aus.

ls  /usr/bin/demo*
/usr/bin/demo_control_gpio         /usr/bin/demo_sensor_trigger
/usr/bin/demo_control_led          /usr/bin/demo_user_action_trigger
/usr/bin/demo_get_sensor_data

Das zweite Beispiel steuert die zwei RGB-LEDs auf dem anhand seiner EUI-64-Geräte-ID ausgewählten Board:

root@GL-S200:~#  /usr/bin/demo_control_led 9483c44004df0679
LED OFF
LED ON
LED OFF
LED TOGGLE
Changle LED Color to Red light
Changle LED Color to Orange light
Changle LED Color to Yellow light
Changle LED Color to Green light
Changle LED Color to Blue light
Changle LED Color to Indigo light
Changle LED Color to Purple light
Changle LED Color to White light

Hier ist eine kurze Videodemonstration, die das Ergebnis zeigt.

Das GPIO-Steuerungsbeispiel setzt einige I/O-Pins für ein bestimmtes Board in den Ausgabemodus und auf niedrigen beziehungsweise hohen Pegel:

root@GL-S200:~#  /usr/bin/demo_control_gpio 9483c44004df0679
Get GPIO Status
GPIO 0.15: 0
GPIO 0.16: 0
GPIO 0.17: 0
GPIO 0.20: 0
Set GPIO 0.15/0.16/0.17/0.20 to output low level
Get GPIO Status
GPIO 0.15: 0
GPIO 0.16: 0
GPIO 0.17: 0
GPIO 0.20: 0
Set GPIO 0.15/0.16/0.17/0.20 to output high level
Get GPIO Status
GPIO 0.15: 1
GPIO 0.16: 1
GPIO 0.17: 1
GPIO 0.20: 1

Die letzten beiden Beispiele zur Steuerung der LEDs und GPIOs verwenden den Befehl coap_cli „small CoAP implementation“, um beispielsweise die LEDs auszuschalten:

coap_cli -B 2 -N -e "$ctl_cmd_led_off" -m put coap://[$addr]/cmd 1>/dev/null 2>/

Verwendung von coap_cli:

root@GL-S200:~# coap_cli
coap_cli v4.2.1 -- a small CoAP implementation
Copyright (C) 2010-2019 Olaf Bergmann <bergmann@tzi.org> and others

TLS Library: None

Usage: coap_cli [-a addr] [-b [num,]size] [-e text] [-f file] [-l loss]
		[-m method] [-o file] [-p port] [-r] [-s duration] [-t type]
		[-v num] [-A type] [-B seconds] [-K interval] [-N] [-O num,text]
		[-P addr[:port]] [-T token] [-U]
		[[-k key] [-u user]]
		[[-c certfile] [-C cafile] [-R root_cafile]] URI

	URI can be an absolute URI or a URI prefixed with scheme and host

General Options
	-a addr		The local interface address to use
	-b [num,]size	Block size to be used in GET/PUT/POST requests
	       		(value must be a multiple of 16 not larger than 1024)
	       		If num is present, the request chain will start at
	       		block num
	-e text		Include text as payload (use percent-encoding for
	       		non-ASCII characters)
	-f file		File to send with PUT/POST (use '-' for STDIN)
	-l list		Fail to send some datagrams specified by a comma
	       		separated list of numbers or number ranges
	       		(for debugging only)
	-l loss%	Randomly fail to send datagrams with the specified
	       		probability - 100% all datagrams, 0% no datagrams
	-m method	Request method (get|put|post|delete|fetch|patch|ipatch),
	       		default is 'get'
	-o file		Output received data to this file (use '-' for STDOUT)
	-p port		Listen on specified port
	-r     		Use reliable protocol (TCP or TLS)
	-s duration	Subscribe to / Observe resource for given duration
	       		in seconds
	-t type		Content format for given resource for PUT/POST
	-v num 		Verbosity level (default 3, maximum is 9). Above 7,
	       		there is increased verbosity in GnuTLS logging
	-A type		Accepted media type
	-B seconds	Break operation after waiting given seconds
	       		(default is 90)
	-K interval	send a ping after interval seconds of inactivity
	-N     		Send NON-confirmable message
	-O num,text	Add option num with contents text to request. If the
	       		text begins with 0x, then the hex text is converted to
	       		binary data
	-P addr[:port]	Use proxy (automatically adds Proxy-Uri option to
	       		request)
	-T token	Include specified token
	-U     		Never include Uri-Host or Uri-Port options
PSK Options (if supported by underlying (D)TLS library)
	-k key 		Pre-shared key for the specified user
	-u user		User identity for pre-shared key mode
PKI Options (if supported by underlying (D)TLS library)
	-c certfile	PEM file containing both CERTIFICATE and PRIVATE KEY
	       		This argument requires (D)TLS with PKI to be available
	-C cafile	PEM file containing the CA Certificate that was used to
	       		sign the certfile. This will trigger the validation of
	       		the server certificate.  If certfile is self-signed (as
	       		defined by '-c certfile'), then you need to have on the
	       		command line the same filename for both the certfile and
	       		cafile (as in '-c certfile -C certfile') to trigger
	       		validation
	-R root_cafile	PEM file containing the set of trusted root CAs that
	       		are to be used to validate the server certificate.
	       		The '-C cafile' does not have to be in this list and is
	       		'trusted' for the verification.
	       		Alternatively, this can point to a directory containing
	       		a set of CA PEM files

Examples:
	coap-client -m get coap://[::1]/
	coap-client -m get coap://[::1]/.well-known/core
	coap-client -m get coap+tcp://[::1]/.well-known/core
	coap-client -m get coaps://[::1]/.well-known/core
	coap-client -m get coaps+tcp://[::1]/.well-known/core
	coap-client -m get -T cafe coap://[::1]/time
	echo -n 1000 | coap-client -m put -T cafe coap://[::1]/time -f -

Das Action-Trigger-Beispiel meldet den Status des Drehknopfs:

root@GL-S200:~#  /usr/bin/demo_user_action_trigger 9483c44004df0679
2023/03/19 17:38:14 info (/usr/bin/demo_user_action_trigger:34) 9483c44004df0679: Press the knob.
2023/03/19 17:38:16 info (/usr/bin/demo_user_action_trigger:34) 9483c44004df0679: Press the knob.
2023/03/19 17:38:18 info (/usr/bin/demo_user_action_trigger:32) 9483c44004df0679: Turn the knob forward
2023/03/19 17:38:19 info (/usr/bin/demo_user_action_trigger:32) 9483c44004df0679: Turn the knob forward
2023/03/19 17:38:20 info (/usr/bin/demo_user_action_trigger:32) 9483c44004df0679: Turn the knob forward
2023/03/19 17:38:20 info (/usr/bin/demo_user_action_trigger:32) 9483c44004df0679: Turn the knob reverse
2023/03/19 17:38:21 info (/usr/bin/demo_user_action_trigger:32) 9483c44004df0679: Turn the knob reverse
2023/03/19 17:38:21 info (/usr/bin/demo_user_action_trigger:32) 9483c44004df0679: Turn the knob reverse
2023/03/19 17:38:23 info (/usr/bin/demo_user_action_trigger:34) 9483c44004df0679: Press the knob.
2023/03/19 17:38:25 info (/usr/bin/demo_user_action_trigger:32) 9483c44004df0679: Turn the

Der Code basiert auf der Binärdatei /usr/bin/eco [Update: Offenbar handelt es sich um das eco-lua Lua-Interpreterprojekt, siehe den Kommentarbereich]:

#!/usr/bin/env eco

-- Note, this file is stored in /usr/bin/demo_user_action_trigger, It listens for events reported when the user operates the knob.
-- Usage: demo_sensor_trigger

local ubus = require 'eco.ubus'
local sys = require 'eco.sys'
local cjson = require 'cjson'
local log = require "glog"

local OPT_TURNING_THE_KNOB = 1
local OPT_PRESS_THE_KNOB = 2

log.level(log.LOG_INFO)

sys.signal(sys.SIGINT, function()
    print('
Got SIGINT, now quit')
    eco.unloop()
end)

local con, err = ubus.connect()
if not con then
    error(err)
end

con:listen('user_active_trigger', function(ev, msg)
    local event_data = cjson.encode(msg)
    log.debug('Recievd user active trigger ' .. ev .. ' ' .. event_data)

    local trigger, operation, direction = msg.trigger, msg.operation, msg.direction
    if operation == OPT_TURNING_THE_KNOB then
        log.info(trigger .. ': Turn the knob ' .. direction)
    elseif operation == OPT_PRESS_THE_KNOB then
        log.info(trigger .. ': Press the knob.')
    else
        log.err('Unknown operation!')
    end
end)

Dasselbe gilt für das Sensor-Trigger-Beispiel, das den PIR-Sensor aller mit dem GL-S200 Thread Border Router verbundenen Thread Dev Boards überwacht:

root@GL-S200:~#  /usr/bin/demo_sensor_trigger
2023/03/19 17:47:46 info (/usr/bin/demo_sensor_trigger:31) 9483c44004df0679: Human body detected.
2023/03/19 17:47:46 info (/usr/bin/demo_sensor_trigger:31) 9483c4ec736c4f68: Human body detected.
2023/03/19 17:47:49 info (/usr/bin/demo_sensor_trigger:31) 9483c4ec736c4f68: Human body detected.
2023/03/19 17:47:52 info (/usr/bin/demo_sensor_trigger:31) 9483c44004df0679: Human body detected.
2023/03/19 17:48:15 info (/usr/bin/demo_sensor_trigger:31) 9483c47d79c19475: Human body detected.

All diese Beispiele können Ihnen den Einstieg in eigene Skripte erleichtern.

GL-S200 „Automations“

Der Bereich GL DEV BOARDS enthält außerdem einen Abschnitt „Automations“.

GL-S200 Thread Border Router: Automatisierung erstellen

Ich versuche, die RGB-LEDs auf zwei Thread Dev Boards mit dem Drehknopf auf dem verbleibenden dritten Board zu steuern.

Automatisierung: Benutzeraktion

Nachdem wir der Automatisierung einen Namen gegeben haben, können wir User Action und dann das Board auswählen, das wir als Drehknopf verwenden: „Board 2“.

Auslösendes Board
Automatisierung auslösen: Drehknopf drehen

Ich wählte „Turning the knob“ und anschließend „Device(s) Action“ aus.

Automatisierung: Geräteaktion

Da ich die beiden anderen Boards steuern möchte, wählte ich „Board 1“ und „Board 2“ aus.

Automatisierung erstellen: Aktoren

Danach ist „Change Color“ die einzige Option. Wählen wir sie also aus und klicken auf Apply.

Automatisierung: Farbe ändern

Das funktioniert jedoch nicht: Die RGB-LEDs bleiben ausgeschaltet, egal in welche Richtung ich den Knopf drehe. Schließlich stellte ich fest, dass die RGB-LEDs eingeschaltet sein müssen, bevor sich die Farben ändern lassen. Daher erstellte ich eine weitere Automatisierung, um die LEDs durch Drücken des Drehknopfs ein- und auszuschalten.

GL-S200 Automations: LED-Steuerung

Und jetzt funktioniert es.

Der Bereich Automation unterstützt auch Webhooks. Daher entschied ich mich, eine Automatisierung zu erstellen, die mich bei erkannter Bewegung in Discord benachrichtigt. Dafür erstellte ich einen Discord-Server und erhielt eine Webhook-URL (https://discord.com/api/webhooks/xxxx), indem ich der Anleitung auf Discord folgte.

CNX Software Discord-Server

Anschließend erstellte ich eine weitere Automatisierung und wählte Sensor Trigger aus …

GL-S200 Automations: Sensor Trigger

… „Human Body Detected“ (das lediglich bedeutet, dass der PIR-Bewegungssensor ausgelöst wurde)

GL-S200 Automations: Human Body Detected

… und „Webhook“.

GL-S200 Automations: Webhook

Dort fügte ich meine Webhook-URL hinzu, wählte Json aus und ergänzte etwa folgenden Inhalt:

{"content":"OMG! Somebody has just entered the bedroom!"}
GL-S200 Webhook für Discord

Abschließend klickte ich auf Apply und wiederholte den Vorgang, um Bewegungen in der Küche und im Büro zu erkennen.

GL-S200 Thread Dev Boards: Automatisierungen zur Bewegungserkennung

Nun kann ich Discord öffnen und im Haus umhergehen, um die PIR- Bewegungssensoren aller drei Boards auszulösen.

Discord-Benachrichtigungen des GL-S200 Thread Border Router

Erfolg! Der Bereich für Automatisierungen ist ziemlich gelungen, scheint jedoch nur mit GL.iNet Thread Dev Boards zu funktionieren. Ich fragte daher, ob der Quellcode geteilt würde, damit Anwender die Lösung für ihre eigenen Thread-Geräte anpassen können, erhielt auf diese konkrete Frage aber keine Antwort.

Verschiedenes

Wie andere GL.iNet-Netzwerkgeräte unterstützt der GL-S200 GoodCloud für den Fernzugriff. Der Nutzen ist jedoch begrenzt, da die Thread- und Bluetooth- Funktionen nicht unterstützt werden.

GoodCloud GL-S200

Zunächst dachte ich, die Taste Mode Switch könne zum Wechsel zwischen BLE und Thread dienen. Wie bei früheren Routern kann sie jedoch so eingestellt werden, dass sie WireGuard oder OpenVPN ein- bzw. ausschaltet.

GL-S200: Taste Mode Switch

Aus Zeitgründen habe ich die Bluetooth-Funktion nicht getestet. Ich erwarte jedoch, dass Oberfläche und Nutzung ähnlich wie bei der GL-S10 BLE-zu-MQTT-Bridge sind, die ich letztes Jahr getestet habe.

Das war eine interessante Erfahrung, und ich möchte GL.iNet dafür danken, dass das GL-S200 Thread Border Router Kit zur Evaluierung bzw. zum Beta-Test bereitgestellt wurde. Das von mir erhaltene Kit kann für $154.00 zuzüglich Versand vorbestellt werden. Falls Sie bereits eigene Thread-Knoten haben, ist der GL-S200 allein während des Vorbestellzeitraums für $79 erhältlich; danach kostet er $99.

Jean-Luc Aufranc (CNXSoft)

Jean-Luc gründete CNX Software 2010 zunächst nebenberuflich. Er kündigte anschließend seine Stelle als Manager für Softwareentwicklung und begann später im Jahr 2011, täglich hauptberuflich Nachrichten und Tests zu schreiben.

Diesen Test auf CNX Software lesen

Über GL.iNet

GL.iNet wurde 2010 gegründet und ist ein führender Anbieter innovativer Router und Netzwerklösungen. Von kompakten Reiseroutern bis hin zu hochmodernen Remote-KVMs liefert GL.iNet preisgekrönte Netzwerktechnologie, die auf Leistung und Sicherheit ausgelegt ist.

GL.iNet ermöglicht Menschen und Organisationen, sich mit Vertrauen zu vernetzen. Indem GL.iNet die Kontrolle in die Hände der Nutzer legt, unterstützt das Unternehmen Produktivität und Zusammenarbeit für ein Good Life.

Vorheriger Artikel Spitz AX unterwegs
Nächster Artikel Beheben Sie das „kaputte Internet“ Ihrer Mutter ein für alle Mal

Produkte vergleichen

{"one"=>"Wählen Sie 2 oder 3 Artikel zum Vergleichen aus", "other"=>"{{ count }} von 3 Elementen ausgewählt"}

Wählen Sie das erste zu vergleichende Element aus

Wählen Sie das zweite zu vergleichende Element aus

Wählen Sie das dritte Element zum Vergleichen aus

Vergleichen