Diferència entre revisions de la pàgina «Recursos sobre The Things Network»

De The Things Network Catalunya Wiki
Jump to navigation Jump to search
(Configurar una pasarel·la (gateway))
(Monitorització d'una passarel·la (gateway))
Línia 22: Línia 22:
  
 
=== Amb Node-RED ===
 
=== Amb Node-RED ===
 +
 +
Node-RED es un motor de fluxes especialment orientat a treballar amb IoT, que permet definir gràficament fluxes de serveis i que és compatible amb estàndards com REST, MQTT, Websocket, AMQP… a més, existeixen "nodes" de tercers que proporcionen integracions amb Twitter, Telegram, Pushover,... Està basat en NodeJS i té una interfície web. Pot executar-se en dispositus limitats com Raspberry o en allotjaments al núvol.
 +
 +
Aquest node et permet monitoritzar periòdicament les teves passarel·les i enviar una notificació a un chat de telegram quan es produeixi algun canvi d'estat.
 +
 +
https://flows.nodered.org/flow/c983777897c5b87f21a158fe5efc5e39
 +
 +
[[Fitxer:Ttn-gw-monitor-flow.png]]
  
 
=== Amb python ===
 
=== Amb python ===
 +
 +
Amb la mateixa lògica que el fluxe anterior per Node-RED també poder consultar l'estat de les nostres passarel·les amb un senzill script python:
 +
 +
config.py
 +
 +
<pre>
 +
 +
# Gateways
 +
GATEWAYS = [
 +
    {'id':'eui-0000000000000001', 'name':'ttn-gw01',      'active':True},
 +
    {'id':'eui-0000000000000002', 'name':'ttn-gw02',      'active':True},
 +
]
 +
 +
# Mail notifications
 +
MAIL_ENABLED = False
 +
MAIL_SUBJECT = 'TTN GW Down'
 +
MAIL_FROM = 'user@server.com'
 +
MAIL_TO = 'user@server.com'
 +
</pre>
 +
 +
gw-monitor.py
 +
 +
<pre>
 +
 +
import sys
 +
 +
## API stuff
 +
import requests
 +
 +
## time, timestamp & epoch stuff
 +
import time
 +
import calendar
 +
from dateutil.parser import parse as date_parse
 +
 +
## mail stuff
 +
import smtplib
 +
from email.mime.text import MIMEText
 +
from email.mime.multipart import MIMEMultipart
 +
 +
## configuration
 +
import config
 +
 +
## colored output
 +
class bcolors:
 +
    HEADER = '\033[95m'
 +
    OKBLUE = '\033[94m'
 +
    OKGREEN = '\033[92m'
 +
    WARNING = '\033[93m'
 +
    FAIL = '\033[91m'
 +
    ENDC = '\033[0m'
 +
    BOLD = '\033[1m'
 +
    UNDERLINE = '\033[4m'
 +
 +
# Maximum ping time in seconds (3 minutes)
 +
MAX_PING_TIME = 180
 +
 +
text = "\n\nSome GW is down, please take some action\n"
 +
 +
# API URLs are like http://noc.thethingsnetwork.org:8085/api/v2/gateways/eui-fcc23dfffe0f306c
 +
url = 'http://noc.thethingsnetwork.org:8085/api/v2/gateways/'
 +
 +
def send_mail(text):
 +
 +
    print("Sending email alert:")
 +
    print(text)
 +
 +
    msg = MIMEMultipart('alternative')
 +
    msg.attach(MIMEText(text, 'plain'))
 +
    msg['Subject'] = config.MAIL_SUBJECT
 +
    msg['From'] = config.MAIL_FROM
 +
    msg['To'] = config.MAIL_TO
 +
    s = smtplib.SMTP('localhost')
 +
    s.sendmail(msg['From'], msg['To'] , msg.as_string())
 +
    s.quit()
 +
 +
# iterate over list of GWs
 +
for gw in config.GATEWAYS:
 +
    if gw['active']:
 +
        urlGW = url + gw['id']
 +
        resp = requests.get(url=urlGW)
 +
 +
        # If response code is OK (200) continue
 +
        if resp.status_code == 200:
 +
            data = resp.json()
 +
            dt = date_parse( data['timestamp'] )
 +
            epoch_gw = calendar.timegm(dt.timetuple())
 +
            epoch_now = calendar.timegm(time.gmtime())
 +
            delta_epoch = epoch_now - epoch_gw
 +
 +
            if delta_epoch > MAX_PING_TIME:
 +
                print gw['name'] + " is " + bcolors.FAIL + "OFFLINE" + bcolors.ENDC + " for " + format(int(delta_epoch / 3600)) + " hours"
 +
                text = text + gw['name'] + " is " + bcolors.FAIL + "OFFLINE" + bcolors.ENDC + " for " + format(int(delta_epoch / 3600)) + " hours"
 +
                text = text + "\n"
 +
                send_alert_email = True
 +
            else:
 +
                print gw['name'] + " is " + bcolors.OKGREEN + "ONLINE" + bcolors.ENDC
 +
        else:
 +
            print gw['name'] + bcolors.WARNING + " no status" + bcolors.ENDC
 +
 +
if config.MAIL_ENABLED:
 +
    send_mail(text)
 +
 +
sys.exit()
 +
</pre>
  
 
== Configurar un node (dispositu/sensor/mota) ==
 
== Configurar un node (dispositu/sensor/mota) ==

Revisió del 23:23, 28 oct 2018

Aquesta pàgina recull recursos online interessant sobre diferents aspectes relacionats amb The Things Network.

Donar-se d'alta a TheThingsNetwork.org

Configurar una passarel·la (gateway)

The Things Gateway


NOTA: Si durant el procés d'activació la gateway es reseteja continuament comprova que el mòdul del concentrador (la placa allargada a propo de l'antena) està ben introduit al sòcol miniPCIe.

Altres gateways

Monitorització d'una passarel·la (gateway)

Amb Node-RED

Node-RED es un motor de fluxes especialment orientat a treballar amb IoT, que permet definir gràficament fluxes de serveis i que és compatible amb estàndards com REST, MQTT, Websocket, AMQP… a més, existeixen "nodes" de tercers que proporcionen integracions amb Twitter, Telegram, Pushover,... Està basat en NodeJS i té una interfície web. Pot executar-se en dispositus limitats com Raspberry o en allotjaments al núvol.

Aquest node et permet monitoritzar periòdicament les teves passarel·les i enviar una notificació a un chat de telegram quan es produeixi algun canvi d'estat.

https://flows.nodered.org/flow/c983777897c5b87f21a158fe5efc5e39

Ttn-gw-monitor-flow.png

Amb python

Amb la mateixa lògica que el fluxe anterior per Node-RED també poder consultar l'estat de les nostres passarel·les amb un senzill script python:

config.py


# Gateways
GATEWAYS = [
    {'id':'eui-0000000000000001', 'name':'ttn-gw01',       'active':True},
    {'id':'eui-0000000000000002', 'name':'ttn-gw02',       'active':True},
]

# Mail notifications
MAIL_ENABLED = False
MAIL_SUBJECT = 'TTN GW Down'
MAIL_FROM = 'user@server.com'
MAIL_TO = 'user@server.com'

gw-monitor.py


import sys

## API stuff
import requests

## time, timestamp & epoch stuff
import time
import calendar
from dateutil.parser import parse as date_parse

## mail stuff
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

## configuration
import config

## colored output
class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

# Maximum ping time in seconds (3 minutes)
MAX_PING_TIME = 180

text = "\n\nSome GW is down, please take some action\n"

# API URLs are like http://noc.thethingsnetwork.org:8085/api/v2/gateways/eui-fcc23dfffe0f306c
url = 'http://noc.thethingsnetwork.org:8085/api/v2/gateways/'

def send_mail(text):

    print("Sending email alert:")
    print(text)

    msg = MIMEMultipart('alternative')
    msg.attach(MIMEText(text, 'plain'))
    msg['Subject'] = config.MAIL_SUBJECT
    msg['From'] = config.MAIL_FROM
    msg['To'] = config.MAIL_TO
    s = smtplib.SMTP('localhost')
    s.sendmail(msg['From'], msg['To'] , msg.as_string())
    s.quit()

# iterate over list of GWs
for gw in config.GATEWAYS:
    if gw['active']:
        urlGW = url + gw['id']
        resp = requests.get(url=urlGW)

        # If response code is OK (200) continue
        if resp.status_code == 200:
            data = resp.json()
            dt = date_parse( data['timestamp'] )
            epoch_gw = calendar.timegm(dt.timetuple())
            epoch_now = calendar.timegm(time.gmtime())
            delta_epoch = epoch_now - epoch_gw

            if delta_epoch > MAX_PING_TIME:
                print gw['name'] + " is " + bcolors.FAIL + "OFFLINE" + bcolors.ENDC + " for " + format(int(delta_epoch / 3600)) + " hours"
                text = text + gw['name'] + " is " + bcolors.FAIL + "OFFLINE" + bcolors.ENDC + " for " + format(int(delta_epoch / 3600)) + " hours"
                text = text + "\n"
                send_alert_email = True
            else:
                print gw['name'] + " is " + bcolors.OKGREEN + "ONLINE" + bcolors.ENDC
        else:
            print gw['name'] + bcolors.WARNING + " no status" + bcolors.ENDC

if config.MAIL_ENABLED:
    send_mail(text)

sys.exit()

Configurar un node (dispositu/sensor/mota)

Modes d'activació

Les comunicacions a TTN estan encriptades amb dues claus: la clau de xarxa (network session key o NWKSKEY) i la clau d'aplicació (application session key o APPSKEY). El node ha de conèixer aquestes dues claus per poder enviar un missatge fins a lpalicatiu final. Aquestes dues claus les pot saber d'avantmà (per que les codifiquem en el nostre programa) o les pot obtenir d'un procés de negociació amb el backend.

Si les sap d'avantmà el node fa servir un sistema d'activació anomenat ABP (Activation By Personalisation). És la forma més senzilla de connectar un node a la xarxa i també la més ràpida perquè no hi ha una comunicaciuó prèvia per negociar res. També, per tant, és la millor opció per estalviar energia. Per contra, en no haver comunicació prèvia, tampoc hi ha cap seguretat d'estar en una zona de cobertura sense fer ACKs. També, en cas que el codi o el node es perdin o es robin caldria reprogramar tota la resta de nodes de la mateixa aplicació per assegurar que ningú s'introdueix a la xarxa.

En el sistema OTAA (Over The Air Activation), el primer que fa el node és negociar amb el backend unes claus per la sessió. El node ha d'estar registrat prèviament al backend per que aquest validi que aquest té dret a connectar-se a la xarxa i li proporcioni unes claus exclusives per ell. És un sistema més complex i requereix d'un temps inicial per establir la comunicació, per contra és més segur ja que en cas de pèrdua només cal donar de baixa el node al backend.

Integracions

Persistir les dades a The Things Network

Obtenir les dades via MQTT

Integració amb Node-RED

Integració amb IFTTT