Skip to main content

Librería para el acceso a habmaps

Project description

habmapslib

Librería para el uso de habmaps

Quick Start

1.- Instalamos el cliente de habmaps con

Opción 1

pip3 install habmapslib
# para el upgrade pip3 install --upgrade habmapslib

Opción 2, instalación manual

git clone https://github.com/alpeza/habmapsgateway.git
cd habmapsgateway/habmapslib
sudo python3 setup.py install

2.- Envíamos información a la plataforma

from habmapslib import MapTracker, HabMapsMessage
import time

mt = MapTracker.MapTracker(id="default-station-id", #Nombre de la estación base
                           mqtt_url="localhost",    #DNS o IP del servidor MQTT
                           mqtt_port=1883,          #Puerto del servidor MQTT
                           user='habmaps',          #Credenciales de acceso al broker MQTT
                           password='root')

mt.startAlive() #Iniciamos la señal de alive que se enviará cada n minutos 

while True:
    mt.sendHabMessage(HabMapsMessage.HabMapsMessage(
        TimeStamp='2021-04-02 15:33:43', #El timestamp del hab en formato string datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        HabId='Mi-Hab', #Nombre del hab que se esta monitorizando, vendrá de la traza q transmita el hab
        HabPosition=[5, 3], #Array de [ latitud, longitud]
        Signals={ #Payload de sensores clave: Nombre del sensor, valor: valor del sensor
            "miSensorUno": 122.4,
            "miSensorDos": 400.5
        },
        BasestationPosition=[5, 3])) #Array opcional de [ latitud, longitud] de posición de la estacion base
    time.sleep(5)

Logging

La configuración de los logs se realiza a través de variables de entorno

export HABLIB_LOGLEVEL=DEBUG #INFO,ERROR
export HABLIB_FORMAT="[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s"
export HABLIB_LOGFILE="/tmp/hablibclient.log"

Error Handling

    rc = mt.sendHabMessage(HabMapsMessage.HabMapsMessage(
    TimeStamp='2021-04-02 15:33:43',
    HabId='Mi-Hab',
    HabPosition=[5, 3],
    Signals={
        "miSensorUno": 122.4,
        "miSensorDos": 400.5
    },
    BasestationPosition=[5, 3]))
if rc['isOK']:
    print("El mensaje se ha enviado correctamente ... ")
else:
    print("Ha existido algun error en la transmision ...")
    print(rc['reason'])

CLI FileParser

La librería también se puede emplear a modo de daemon que va leyendo de un fichero y transmitiéndolo a habmaps.

python3 -m habmapslib.cli --help

1.- Configuramos el programa:

python3 -m habmapslib.cli --genconffile > miConfig.yaml
#Editamos la configuración
nano miConfig.yaml

2.- Lanzamos el programa

python3 -m habmapslib.cli --conffile miConfig.yaml

Configuración del CLI FileParser

La configuración se define a través de un fichero YAML.

basestation:
  id: "id-de-mi-estacion"
  appenders:
    gpsappender:
      file: '/Users/tests/ArchLab/habmapsgateway/demotraces/gps.appender'
      regexselect: '\[.*\]\|(.*)\|(.*),(.*)\|.*\|'
      mapping:
        - "height"
        - "lat"
        - "lon"
mqtt:
  url: "localhost"
  topic: "hablistener"
  port: 1883
  user: "habmaps"
  password: "root"
  alive: 60
frame:
  # Definición de la trama donde
  # $time : Es la hora expresada en HHMMSS
  # $pos : Es la posición gps del hab expresada en lat,lon
  # $id  : Es el identificador del hab
  format: "$time|AlturaGPS|$pos|VelocidadHorizontalGPS|Temperatura|Presion|AlturaBarometrica|$id|"
  # Fichero donde se van insertando las trazas de LoRa
  file: "/Users/tests/ArchLab/habmapsgateway/demotraces/out.log"
  # Cada cuantos segundos se mira el fichero de envio
  refresh: 1

Nos resultarán de mayor interés las siguientes secciones:

Appender GPS

Se trata de un fichero donde el programa espera encontrar la posición GPS de la antena.

  ...
  appenders:
    gpsappender:
      file: '/Users/tests/ArchLab/habmapsgateway/demotraces/gps.appender'
      regexselect: '\[.*\]\|(.*)\|(.*),(.*)\|.*\|'
      mapping:
        - "height"
        - "lat"
        - "lon"

En caso de no disponer de un módulo gps. Se puede dejar a blancos el campo gpsappender.file:

  ...
  gpsappender:
    file: ''
    regexselect: '\[.*\]\|(.*)\|(.*),(.*)\|.*\|'
    mapping:
      - "height"
      - "lat"
      - "lon"

El GPS appender funciona del siguiente modo:

  • 1.- Filtra la última línea del fichero indicado en el campo gpsappender.file.
  • 2.- Sobre esta última línea aplicará el filtro que se le haya indicado mediante la expresión regular definida en gpsappender.regexselect.
  • 3.- Los grupos que salgan de esta expresión regular los mapeará según defina el orden de la lista gpsappender.mapping. En este caso el grupo 1 se corresponderá con el campo height mientras que el grupo 3 con lon.

Podemos validar la expresión regular en regex101. La expresión regular del ejemplo se corresponde con la trama [2021-03-28 18:49:02][INFO]|1129|42.3074,2.2111|0.1187|

Podemos emplear otras expresiones regulares, por ejemplo, esta esperaría encontrar (.*),(.*),(.*) la información del siguiente modo 1129,42.3074,2.2111, <altura>,<latitud>,<longitud>

Trama de la sonda

El programa tratará de realizar un envío a mqtt por cada línea nueva que detecte en el fichero frame.file. Este interpretará y mapeará la línea a json según se le especifique en frame.format. Cada campo vendrá separado por el caracter |.

Existen campos de mapeo reservados:

  • $time: Se interpreta como el timestamp de la sonda especificado en forma HHMMSS.
  • $pos : Se interpreta como la posición gps de la sonda expresada como lat,lon.
  • $id: Se interpreta como el id de la sonda.
...
frame:
  format: "$time|AlturaGPS|$pos|VelocidadHorizontalGPS|Temperatura|Presion|AlturaBarometrica|$id|"
  file: "/Users/tests/ArchLab/habmapsgateway/demotraces/out.log"

El resto de campos se interpretarán como valores de sensor.

Un ejemplo de trama de sonda para este formato es el siguiente:

185359|1127|4.3074,2.2111|0.1717|22.64|900.5943|983|HABCAT2|

Ejecución del del CLI FileParser

CLI FileParser controla y actúa del siguiente modo frente a los errores.

Errores de ficheros

1.- Si no existen los ficheros especificados en la configuración en el arranque el programa se esperará hasta que existan. Si se ha especificado un fichero de parseo gps pero este no existe CLI File Parser creará uno en blanco y continuará seteando la posición GPS del gateway a 0.

2.- Si durante la ejecución se borrase el fichero de trazas especificado en frame.file CLI File Parser lanzaría una excepción y el programa fallaría por lo que si queremos que se relance automáticamente y se quede esperando hasta que exista el fichero debemos de lanzar el programa mediante un script similar al siguiente:

export HABLIB_LOGLEVEL=INFO #INFO,ERROR
export HABLIB_FORMAT="[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s"
export HABLIB_FORMAT="%(levelname)s - %(message)s" # <-- Para local, con menos verbose
export HABLIB_LOGFILE="/tmp/hablibclient.log"

# Trap para salir del bucle mediante cntrl+c en local.
trap ctrl_c INT
function ctrl_c() {
  echo "Manual exited PID: "$$
  exit 0
}

while [ true ]; do
    python3 -m habmapslib.cli --conffile config.yaml
done

3.- Si no es capaz de parsear el fichero de trazas GPS notificará el error y seteará la posición del gateway a lat:0, lon:0 continuando con la transmisión de trazas.

Errores de conexión.

Si el cliente mqtt no es capaz de establecer la conexión con el servidor el mensaje se descartará y volverá a intentarlo con la siguiente traza que le llegue.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

habmapslib-2.0.1.tar.gz (13.8 kB view details)

Uploaded Source

Built Distributions

habmapslib-2.0.1-py3.9.egg (28.3 kB view details)

Uploaded Source

habmapslib-2.0.1-py3-none-any.whl (14.8 kB view details)

Uploaded Python 3

File details

Details for the file habmapslib-2.0.1.tar.gz.

File metadata

  • Download URL: habmapslib-2.0.1.tar.gz
  • Upload date:
  • Size: 13.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/6.0.0 pkginfo/1.7.0 requests/2.28.2 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.16

File hashes

Hashes for habmapslib-2.0.1.tar.gz
Algorithm Hash digest
SHA256 e9d941c9f73607a48e2d8f6f6e542e23aadeee361bad49a241753f8bba34de43
MD5 99c59a72a4b9a15343d7f4015e2e1433
BLAKE2b-256 5a8ac629a003ebb6a175f9c3ec6b2a9ee546c0991fe83a0ba9c36a21c1ffb59f

See more details on using hashes here.

File details

Details for the file habmapslib-2.0.1-py3.9.egg.

File metadata

  • Download URL: habmapslib-2.0.1-py3.9.egg
  • Upload date:
  • Size: 28.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/6.0.0 pkginfo/1.7.0 requests/2.28.2 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.16

File hashes

Hashes for habmapslib-2.0.1-py3.9.egg
Algorithm Hash digest
SHA256 66db00bb6a22352376c55516a66354b32ed75c067acc6936dcca814865e2838c
MD5 5e02fd82f7b0c234d22af8a283c2b65d
BLAKE2b-256 f1dc8a61d6dcc9183916350275bb0c8856cad012adadda9853f966c2ba548f82

See more details on using hashes here.

File details

Details for the file habmapslib-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: habmapslib-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 14.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/6.0.0 pkginfo/1.7.0 requests/2.28.2 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.16

File hashes

Hashes for habmapslib-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cd18e1c3a40c382ba912b37be9efd744f7ac92f72c99df30de1d26ce95a2ce3e
MD5 fd858d83679111220a9ab4f094574628
BLAKE2b-256 99e801a0bd3a47510be374db65383b42de4dd5237729d80379fcae0010fa7478

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page