Package: habmapslib
habmapslibLibrería para el uso dehabmapsGitHubPypiQuick Start1.- Instalamos el cliente de habmaps conOpción 1pip3installhabmapslib# para el upgrade pip3 install --upgrade habmapslibOpción 2, instalación manualgitclonehttps://github.com/alpeza/habmapsgateway.gitcdhabmapsgateway/habmapslib
sudopython3setup.pyinstall2.- Envíamos información a la plataformafromhabmapslibimportMapTracker,HabMapsMessageimporttimemt=MapTracker.MapTracker(id="default-station-id",#Nombre de la estación basemqtt_url="localhost",#DNS o IP del servidor MQTTmqtt_port=1883,#Puerto del servidor MQTTuser='habmaps',#Credenciales de acceso al broker MQTTpassword='root')mt.startAlive()#Iniciamos la señal de alive que se enviará cada n minutoswhileTrue: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 habHabPosition=[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 basetime.sleep(5)LoggingLa configuración de los logs se realiza a través de variables de entornoexportHABLIB_LOGLEVEL=DEBUG#INFO,ERRORexportHABLIB_FORMAT="[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s"exportHABLIB_LOGFILE="/tmp/hablibclient.log"Error Handlingrc=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]))ifrc['isOK']:print("El mensaje se ha enviado correctamente ... ")else:print("Ha existido algun error en la transmision ...")print(rc['reason'])CLI FileParserLa librería también se puede emplear a modo dedaemonque va leyendo
de un fichero y transmitiéndolo a habmaps.python3-mhabmapslib.cli--help1.- Configuramos el programa:python3-mhabmapslib.cli--genconffile>miConfig.yaml#Editamos la configuraciónnanomiConfig.yaml2.- Lanzamos el programapython3-mhabmapslib.cli--conffilemiConfig.yamlConfiguración del CLI FileParserLa 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:1883user:"habmaps"password:"root"alive:60frame:# 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 habformat:"$time|AlturaGPS|$pos|VelocidadHorizontalGPS|Temperatura|Presion|AlturaBarometrica|$id|"# Fichero donde se van insertando las trazas de LoRafile:"/Users/tests/ArchLab/habmapsgateway/demotraces/out.log"# Cada cuantos segundos se mira el fichero de enviorefresh:1Nos resultarán de mayor interés las siguientes secciones:Appender GPSSe 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 campogpsappender.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 campogpsappender.file.2.- Sobre esta última línea aplicará el filtro que se le haya indicado mediante la expresión
regular definida engpsappender.regexselect.3.- Losgruposque salgan de esta expresión regular los mapeará según defina el orden de la listagpsappender.mapping.
En este caso el grupo 1 se corresponderá con el campoheightmientras que el grupo 3 conlon.Podemos validar la expresión regular enregex101. 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 modo1129,42.3074,2.2111,<altura>,<latitud>,<longitud>Trama de la sondaEl programa tratará de realizar un envío a mqtt por cada línea nueva que detecte en el ficheroframe.file.
Este interpretará y mapeará  la línea a json según se le especifique enframe.format. Cada campo vendrá separado por el caracter|.Existen campos de mapeo reservados:$time: Se interpreta como eltimestampde la sonda especificado en formaHHMMSS.$pos: Se interpreta como la posición gps de la sonda expresada comolat,lon.$id: Se interpreta como elidde 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 FileParserCLI FileParser controla y actúa del siguiente modo frente a los errores.Errores de ficheros1.- Sino existen los ficheros especificadosen 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 existeCLI File Parsercreará 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 enframe.fileCLI File Parserlanzarí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 unscriptsimilar al siguiente:exportHABLIB_LOGLEVEL=INFO#INFO,ERRORexportHABLIB_FORMAT="[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s"exportHABLIB_FORMAT="%(levelname)s - %(message)s"# <-- Para local, con menos verboseexportHABLIB_LOGFILE="/tmp/hablibclient.log"# Trap para salir del bucle mediante cntrl+c en local.trapctrl_cINTfunctionctrl_c(){echo"Manual exited PID: "$$exit0}while[true];dopython3-mhabmapslib.cli--conffileconfig.yamldone3.- Si no es capaz de parsear el fichero de trazas GPS notificará el error
y seteará la posición del gateway alat:0, lon:0continuando con la transmisión
de trazas.Errores de conexión.Si el clientemqttno es capaz de establecer la conexión con el servidor
el mensajese descartaráy volverá a intentarlo con la siguiente
traza que le llegue.