From 7505355340d92e6ecea0a309a16fd37226322b21 Mon Sep 17 00:00:00 2001 From: trypton Date: Sun, 21 Dec 2025 19:19:17 +0100 Subject: [PATCH] **Version 1.12** Se corrigio el nodo peso estable para procesar correctamente el valor de Peso Maximo Admitido y sacar un mensaje que no se pueda borrar hasta que el vehiculo abandone la bascula. Se agrego un nodo para mantener el aviso de salir de la bascula en caso de PMA, si el usuario pulsa OK. Corregido en el nodo "check JSON content" la recepcion de la matricula asociada a una tarjeta. Hemos activado los flags correspondientes para que el nodo "matricula 2" pueda hacer el chequeo de la matricula respecto a si esta o no en transito. En el nodo "Analisis del modo de operacion" hemos puesto una condicion para no mostrar el boton de salida cuando el usuario utiliza una tarjerta valida. --- bascula_autonoma_1.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bascula_autonoma_1.json b/bascula_autonoma_1.json index 47a8c00..6b3b9bf 100644 --- a/bascula_autonoma_1.json +++ b/bascula_autonoma_1.json @@ -3533,7 +3533,7 @@ "z": "953e8740401d175c", "g": "646bdfb9988a1708", "name": "Check JSON content", - "func": "if ((msg.payload.totem_id == flow.get(\"totem_id\") || msg.payload.totem_id == \"*\") && msg.payload.numero_vial == flow.get(\"numero_vial\")) { // verifica que los datos son para este totem\n//if (msg.payload.numero_vial == flow.get(\"numero_vial\")) { // verifica que los datos son para este vial \n //guarda los elementos JSON recibidos del supervisor\n /*\n if (msg.payload.hasOwnProperty(\"numero_vial\")){\n flow.set(\"numero_vial\", msg.payload.numero_vial);\n }\n */\n if (msg.payload.hasOwnProperty(\"peso\")){\n flow.set(\"peso\", msg.payload.peso);\n \n }\n if (flow.get(\"supervisor\")) {\n if (msg.payload.hasOwnProperty(\"peso_estable\")) {\n flow.set(\"peso_estable\", msg.payload.peso_estable);\n }\n if (msg.payload.hasOwnProperty(\"peso_estable_flag\")) {\n flow.set(\"peso_estable_flag\", msg.payload.peso_estable_flag);\n }\n if (msg.payload.hasOwnProperty(\"fin_pesada_flag\")) {\n flow.set(\"fin_pesada_flag\", msg.payload.fin_pesada_flag);\n }\n if (msg.payload.hasOwnProperty(\"firma_cmd_flag\")) {\n flow.set(\"firma_cmd_flag\", msg.payload.firma_cmd_flag);\n flow.set(\"firma_flag\", true);\n }\n if (msg.payload.hasOwnProperty(\"remover_firma\")) {\n flow.set(\"remover_firma\", msg.payload.remover_firma);\n }\n if (msg.payload.hasOwnProperty(\"id_leido\")) {\n flow.set(\"id_leido\", msg.payload.id_leido);\n }\n if (msg.payload.hasOwnProperty(\"id_no_leido\")) {\n flow.set(\"id_no_leido\", msg.payload.id_no_leido);\n }\n if (msg.payload.hasOwnProperty(\"id_tarjeta\")) {\n flow.set(\"id_tarjeta\", msg.payload.id_tarjeta);\n }\n if (msg.payload.hasOwnProperty(\"matricula\")) {\n flow.set(\"matricula\", msg.payload.matricula);\n }\n \n }\n //****************************** RESPUESTA DE LA REVISION DE LA MATRICULA EN BD *******************************************\n if (msg.payload.hasOwnProperty(\"registrada\")) {\n //node.warn(\"por aqui paso\")\n flow.set(\"matricula_revisada\", true);\n flow.set(\"matricula_autorizada\", msg.payload.registrada)\n if(msg.payload.registrada){ // la matricula esta registrada y por lo tanto autorizada\n //node.warn(\"pma = \" + msg.payload.pma + \" tara = \" + msg.payload.tara)\n flow.set(\"pma\", msg.payload.pma)\n flow.set(\"tara\", msg.payload.tara)\n flow.set(\"entransito\", msg.payload.transito)\n flow.set(\"tipo_movimiento\", msg.payload.transito ? \"final\" : \"inicial\");// Si esta en transito = final en caso contrario = inicial\n if (msg.payload.aviso_identificacion){ // si la matricula existe una sola vez en Matriculas_Identificadores y la descripcion tiene coma, hay que sacar anuncio de identificacion\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\")); \n }\n if (!flow.get(\"entransito\")){\n \n }\n }\n }\n \n //******************************** RESPUESTA DE REVISION DEL CODIGO DE LA TARJETA RFID EN BD *****************************\n if (msg.payload.hasOwnProperty(\"rfid_revisado\")) {\n flow.set(\"RFID_revisado\", msg.payload.rfid_revisado);\n flow.set(\"RFID_verificado\", msg.payload.rfid_verificado);\n //*************Si la tarjeta existe recuperamos los datos asociados ***************************\n if(msg.payload.rfid_verificado){\n flow.set(\"cliente\", msg.payload.cliente)\n flow.set(\"residuo\", msg.payload.residuo)\n // Para el caso de RFID recibimos la matricula asociada a la tarjeta\n flow.set(\"matricula\", msg.payload.matricula)\n if (flow.get(\"matricula\")) {\n flow.set(\"matricula_autorizada\", true) // matricula esta autorizada en BD\n }\n \n }\n }\n\n //******************************** RESPUESTA DE REVISION DEL CODIGO QR EN BD *****************************\n if (msg.payload.hasOwnProperty(\"qr_revisado\")) {\n flow.set(\"QR_revisado\", msg.payload.qr_revisado);\n flow.set(\"QR_verificado\", msg.payload.qr_verificado);\n //*************Si el codigo QR existe recuperamos los datos asociados ***************************\n if(msg.payload.qr_verificado){\n flow.set(\"cliente\", msg.payload.cliente)\n flow.set(\"residuo\", msg.payload.residuo)\n\n /* Este codigo era para verificar la matricula pero ahora el QR no esta asociado a matricula\n if (flow.get(\"matricula\") == msg.payload.matricula){ // si la matricula coincide con la leida damos por finalizado el chequeo de matricula\n flow.set(\"matricula_formato_flag\", true) // indica matricula esta en formato\n flow.set(\"matricula_ok_flag\", true)\n flow.set(\"matricula_revisada\", true) //se ha revisado la existencia de la matricula en BD\n flow.set(\"matricula_autorizada\", true) // matricula autorizada\n \n }\n else{\n // Si la matricula es diferente tomamos como matricula la recibida de la BD\n // Ahora tenemos que confirmar si esa matricula esta en transito para saber el tipo de movimiento que vamos agestionar en esta pesada\n //por lo tanto ponemos los flags para que pueda volver a buscar la matricula en BD.\n flow.set(\"matricula_revisada\", false) // Se pone en false para volver a revisar la matricula correcta\n //node.warn(\"matricula leida = \" + flow.get(\"matricula\") + \" ; matricula del qr = \" + msg.payload.matricula)\n flow.set(\"matricula_autorizada\", false) // matricula autorizada\n flow.set(\"matriculacheck_solicitada\", false) // para poder volver a consultar una matricula\n flow.set(\"matricula_formato_flag\", true) // indica matricula esta en formato\n flow.set(\"matricula_ok_flag\", true) // aseguramos que la matricula puede ser buscada en la base de datos en el nodo matricula\n flow.set(\"matricula_leida_flag\", true) // aseguramos que la matricula puede ser buscada en la base de datos en el nodo matricula\n flow.set(\"matricula\", msg.payload.matricula) // guardamos la matricula correcta\n }\n */\n }\n }\n\n //--------------------- Recepcion de la lista de materiales para el menu -------------------------\n\n if (msg.payload.hasOwnProperty(\"lista\") && msg.payload.hasOwnProperty(\"encabezado_lista\") && flow.get(\"menu_activo\")) {\n flow.set(\"lista_flag\", true)\n flow.set(\"encabezado_lista\", msg.payload.encabezado_lista)\n flow.set(\"lista_array\", msg.payload.lista)\n flow.set(\"menu_inicio\", msg.payload.menu_inicio)\n }\n else {\n \n flow.set(\"lista_flag\", false)\n \n }\n //---------------------- FIN de Recepcion de la lista de materiales para el menu ----------------------\n\n //---------------------- BOTONES EN LA PANTALLA -------------------------------------------------------\n if (msg.payload.hasOwnProperty(\"button\")) {\n flow.set(\"button\", msg.payload.button);\n }\n if (msg.payload.hasOwnProperty(\"button1\")) {\n flow.set(\"button1\", msg.payload.button1);\n }\n if (msg.payload.hasOwnProperty(\"button2\")) {\n flow.set(\"button2\", msg.payload.button2);\n }\n //************** APAGADO / ENCENDIDO DE LA PANTALLA ******************************** \n if (msg.payload.hasOwnProperty(\"screenOn_flag\")){\n flow.set(\"screenOn_flag\", msg.payload.screenOn_flag);\n if(msg.payload.screenOn_flag){\n \n node.send([null, {\"payload\":\"sudo echo 0 > /sys/class/backlight/rpi_backlight/bl_power\"}]);\n //node.send([null, {\"payload\":\"xset -display :0 dpms force on\"}]);\n }\n else{\n node.send([null, {\"payload\":\"sudo echo 1 > /sys/class/backlight/rpi_backlight/bl_power\"}]);\n //node.send([null, {\"payload\":\"xset -display :0 dpms force off\"}]);\n }\n }\n // **********************************************************\n if (msg.payload.hasOwnProperty(\"modo_totem\")){ // chequea si cambiamos el modo de trabajo del totem\n flow.set(\"modo_totem\", msg.payload.modo_totem);\n }\n if (msg.payload.hasOwnProperty(\"uso_detector_ok\")){ \n flow.set(\"uso_detector_ok\", msg.payload.uso_detector_ok);\n }\n \n \n if (msg.payload.hasOwnProperty(\"badplate\")){ // chequea si tenemos que pedir corrección de matricula\n flow.set(\"badplate\", msg.payload.badplate);\n }\n \n //------------------------ Hacer display de un BOTON de VALIDACION a la salida ------------------------\n/* \n if (msg.payload.hasOwnProperty(\"botonsalida\")){ // chequea si tenemos que pedir boton de salida en pantalla\n flow.set(\"botonsalida\", msg.payload.botonsalida);\n if (msg.payload.hasOwnProperty(\"botonsalida_txt\")){\n flow.set(\"botonsalida_txt\", msg.payload.botonsalida_txt);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_color\")){\n flow.set(\"botonsalida_color\", msg.payload.botonsalida_color);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_txt_color\")){\n flow.set(\"botonsalida_txt_color\", msg.payload.botonsalida_txt_color);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_mensaje1\")){\n flow.set(\"botonsalida_mensaje1\", msg.payload.botonsalida_mensaje1);\n }\n }\n*/\n //*********************************** RESET REMOTO *****************************************************\n if (msg.payload.hasOwnProperty(\"reboot_flag\")){ // comando para resetear el dispositivo desde el supervisor\n \n if(msg.payload.reboot_flag){ \n node.send([null, {payload:\"sudo shutdown -r now\"}]);\n }\n \n }\n //===================== deteccion de comando para iniciar la configuración ===========================================================\n if (msg.payload.hasOwnProperty(\"init_config\")) {\n if (msg.payload.init_config == true){\n node.send([null, null, {payload: 1}])\n }\n }\n \n //===================== deteccion de comando para gestionar semaforo ===========================================================\n if (msg.payload.hasOwnProperty(\"semaforoabierto\")) {\n if (msg.payload.semaforoabierto == true) {\n flow.set(\"semaforo\", \"green\")\n flow.set(\"semaforoabierto\", true) \n }\n else{\n flow.set(\"semaforo\", \"red\")\n flow.set(\"semaforoabierto\", false) \n }\n }\n \n //===================== deteccion de comando para abrir barrera ===========================================================\n if (msg.payload.hasOwnProperty(\"abrirbarrera\")) {\n if (msg.payload.abrirbarrera == true) {\n node.send([ null, null, null, { payload: 0 }])\n setTimeout(function () {\n node.send([null, null, null, { payload: 1 }])\n }, flow.get(\"relay2_pulse\"));\n }\n \n }\n //=====================================================================================================================================\n \n \n \n \n \nmsg = {payload: 1};\nreturn msg\n}\nelse{\n\n return // en caso de no ser el mensaje para este dispositivo no enviamos mensaje al proximo nodo, de esa manera no habra ninguna respuesta de este dispositivo\n}\n\n", + "func": "if ((msg.payload.totem_id == flow.get(\"totem_id\") || msg.payload.totem_id == \"*\") && msg.payload.numero_vial == flow.get(\"numero_vial\")) { // verifica que los datos son para este totem\n//if (msg.payload.numero_vial == flow.get(\"numero_vial\")) { // verifica que los datos son para este vial \n //guarda los elementos JSON recibidos del supervisor\n /*\n if (msg.payload.hasOwnProperty(\"numero_vial\")){\n flow.set(\"numero_vial\", msg.payload.numero_vial);\n }\n */\n if (msg.payload.hasOwnProperty(\"peso\")){\n flow.set(\"peso\", msg.payload.peso);\n \n }\n if (flow.get(\"supervisor\")) {\n if (msg.payload.hasOwnProperty(\"peso_estable\")) {\n flow.set(\"peso_estable\", msg.payload.peso_estable);\n }\n if (msg.payload.hasOwnProperty(\"peso_estable_flag\")) {\n flow.set(\"peso_estable_flag\", msg.payload.peso_estable_flag);\n }\n if (msg.payload.hasOwnProperty(\"fin_pesada_flag\")) {\n flow.set(\"fin_pesada_flag\", msg.payload.fin_pesada_flag);\n }\n if (msg.payload.hasOwnProperty(\"firma_cmd_flag\")) {\n flow.set(\"firma_cmd_flag\", msg.payload.firma_cmd_flag);\n flow.set(\"firma_flag\", true);\n }\n if (msg.payload.hasOwnProperty(\"remover_firma\")) {\n flow.set(\"remover_firma\", msg.payload.remover_firma);\n }\n if (msg.payload.hasOwnProperty(\"id_leido\")) {\n flow.set(\"id_leido\", msg.payload.id_leido);\n }\n if (msg.payload.hasOwnProperty(\"id_no_leido\")) {\n flow.set(\"id_no_leido\", msg.payload.id_no_leido);\n }\n if (msg.payload.hasOwnProperty(\"id_tarjeta\")) {\n flow.set(\"id_tarjeta\", msg.payload.id_tarjeta);\n }\n if (msg.payload.hasOwnProperty(\"matricula\")) {\n flow.set(\"matricula\", msg.payload.matricula);\n }\n \n }\n //****************************** RESPUESTA DE LA REVISION DE LA MATRICULA EN BD *******************************************\n if (msg.payload.hasOwnProperty(\"registrada\")) {\n //node.warn(\"por aqui paso\")\n flow.set(\"matricula_revisada\", true);\n flow.set(\"matricula_autorizada\", msg.payload.registrada)\n if(msg.payload.registrada){ // la matricula esta registrada y por lo tanto autorizada\n //node.warn(\"pma = \" + msg.payload.pma + \" tara = \" + msg.payload.tara)\n flow.set(\"pma\", msg.payload.pma)\n flow.set(\"tara\", msg.payload.tara)\n flow.set(\"entransito\", msg.payload.transito)\n flow.set(\"tipo_movimiento\", msg.payload.transito ? \"final\" : \"inicial\");// Si esta en transito = final en caso contrario = inicial\n if (msg.payload.aviso_identificacion){ // si la matricula existe una sola vez en Matriculas_Identificadores y la descripcion tiene coma, hay que sacar anuncio de identificacion\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\")); \n }\n if (!flow.get(\"entransito\")){\n \n }\n }\n }\n \n //******************************** RESPUESTA DE REVISION DEL CODIGO DE LA TARJETA RFID EN BD *****************************\n if (msg.payload.hasOwnProperty(\"rfid_revisado\")) {\n flow.set(\"RFID_revisado\", msg.payload.rfid_revisado);\n flow.set(\"RFID_verificado\", msg.payload.rfid_verificado);\n //*************Si la tarjeta existe recuperamos los datos asociados ***************************\n if(msg.payload.rfid_verificado){\n flow.set(\"cliente\", msg.payload.cliente)\n flow.set(\"residuo\", msg.payload.residuo)\n // Para el caso de RFID recibimos la matricula asociada a la tarjeta\n flow.set(\"matricula\", msg.payload.matricula)// Toda tarjeta debe tener una matricula asociada en BD. Leemos y guardamos dicha matricula recibida\n if (flow.get(\"matricula\")) {\n //armamos los flags para que el nodo matricula 2 pueda solicitar a BD la verificacion de esta matricula, si esta en transito o si no lo esta\n flow.set(\"matricula_leida_flag\", true)\n flow.set(\"matricula_formato_flag\", true)\n flow.set(\"matricula_ok_flag\", true)\n flow.set(\"matricula_revisada\", false)\n flow.set(\"matriculacheck_solicitada\", false)\n }\n \n }\n }\n\n //******************************** RESPUESTA DE REVISION DEL CODIGO QR EN BD *****************************\n if (msg.payload.hasOwnProperty(\"qr_revisado\")) {\n flow.set(\"QR_revisado\", msg.payload.qr_revisado);\n flow.set(\"QR_verificado\", msg.payload.qr_verificado);\n //*************Si el codigo QR existe recuperamos los datos asociados ***************************\n if(msg.payload.qr_verificado){\n flow.set(\"cliente\", msg.payload.cliente)\n flow.set(\"residuo\", msg.payload.residuo)\n\n /* Este codigo era para verificar la matricula pero ahora el QR no esta asociado a matricula\n if (flow.get(\"matricula\") == msg.payload.matricula){ // si la matricula coincide con la leida damos por finalizado el chequeo de matricula\n flow.set(\"matricula_formato_flag\", true) // indica matricula esta en formato\n flow.set(\"matricula_ok_flag\", true)\n flow.set(\"matricula_revisada\", true) //se ha revisado la existencia de la matricula en BD\n flow.set(\"matricula_autorizada\", true) // matricula autorizada\n \n }\n else{\n // Si la matricula es diferente tomamos como matricula la recibida de la BD\n // Ahora tenemos que confirmar si esa matricula esta en transito para saber el tipo de movimiento que vamos agestionar en esta pesada\n //por lo tanto ponemos los flags para que pueda volver a buscar la matricula en BD.\n flow.set(\"matricula_revisada\", false) // Se pone en false para volver a revisar la matricula correcta\n //node.warn(\"matricula leida = \" + flow.get(\"matricula\") + \" ; matricula del qr = \" + msg.payload.matricula)\n flow.set(\"matricula_autorizada\", false) // matricula autorizada\n flow.set(\"matriculacheck_solicitada\", false) // para poder volver a consultar una matricula\n flow.set(\"matricula_formato_flag\", true) // indica matricula esta en formato\n flow.set(\"matricula_ok_flag\", true) // aseguramos que la matricula puede ser buscada en la base de datos en el nodo matricula\n flow.set(\"matricula_leida_flag\", true) // aseguramos que la matricula puede ser buscada en la base de datos en el nodo matricula\n flow.set(\"matricula\", msg.payload.matricula) // guardamos la matricula correcta\n }\n */\n }\n }\n\n //--------------------- Recepcion de la lista de materiales para el menu -------------------------\n\n if (msg.payload.hasOwnProperty(\"lista\") && msg.payload.hasOwnProperty(\"encabezado_lista\") && flow.get(\"menu_activo\")) {\n flow.set(\"lista_flag\", true)\n flow.set(\"encabezado_lista\", msg.payload.encabezado_lista)\n flow.set(\"lista_array\", msg.payload.lista)\n flow.set(\"menu_inicio\", msg.payload.menu_inicio)\n }\n else {\n \n flow.set(\"lista_flag\", false)\n \n }\n //---------------------- FIN de Recepcion de la lista de materiales para el menu ----------------------\n\n //---------------------- BOTONES EN LA PANTALLA -------------------------------------------------------\n if (msg.payload.hasOwnProperty(\"button\")) {\n flow.set(\"button\", msg.payload.button);\n }\n if (msg.payload.hasOwnProperty(\"button1\")) {\n flow.set(\"button1\", msg.payload.button1);\n }\n if (msg.payload.hasOwnProperty(\"button2\")) {\n flow.set(\"button2\", msg.payload.button2);\n }\n //************** APAGADO / ENCENDIDO DE LA PANTALLA ******************************** \n if (msg.payload.hasOwnProperty(\"screenOn_flag\")){\n flow.set(\"screenOn_flag\", msg.payload.screenOn_flag);\n if(msg.payload.screenOn_flag){\n \n node.send([null, {\"payload\":\"sudo echo 0 > /sys/class/backlight/rpi_backlight/bl_power\"}]);\n //node.send([null, {\"payload\":\"xset -display :0 dpms force on\"}]);\n }\n else{\n node.send([null, {\"payload\":\"sudo echo 1 > /sys/class/backlight/rpi_backlight/bl_power\"}]);\n //node.send([null, {\"payload\":\"xset -display :0 dpms force off\"}]);\n }\n }\n // **********************************************************\n if (msg.payload.hasOwnProperty(\"modo_totem\")){ // chequea si cambiamos el modo de trabajo del totem\n flow.set(\"modo_totem\", msg.payload.modo_totem);\n }\n if (msg.payload.hasOwnProperty(\"uso_detector_ok\")){ \n flow.set(\"uso_detector_ok\", msg.payload.uso_detector_ok);\n }\n \n \n if (msg.payload.hasOwnProperty(\"badplate\")){ // chequea si tenemos que pedir corrección de matricula\n flow.set(\"badplate\", msg.payload.badplate);\n }\n \n //------------------------ Hacer display de un BOTON de VALIDACION a la salida ------------------------\n/* \n if (msg.payload.hasOwnProperty(\"botonsalida\")){ // chequea si tenemos que pedir boton de salida en pantalla\n flow.set(\"botonsalida\", msg.payload.botonsalida);\n if (msg.payload.hasOwnProperty(\"botonsalida_txt\")){\n flow.set(\"botonsalida_txt\", msg.payload.botonsalida_txt);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_color\")){\n flow.set(\"botonsalida_color\", msg.payload.botonsalida_color);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_txt_color\")){\n flow.set(\"botonsalida_txt_color\", msg.payload.botonsalida_txt_color);\n }\n if (msg.payload.hasOwnProperty(\"botonsalida_mensaje1\")){\n flow.set(\"botonsalida_mensaje1\", msg.payload.botonsalida_mensaje1);\n }\n }\n*/\n //*********************************** RESET REMOTO *****************************************************\n if (msg.payload.hasOwnProperty(\"reboot_flag\")){ // comando para resetear el dispositivo desde el supervisor\n \n if(msg.payload.reboot_flag){ \n node.send([null, {payload:\"sudo shutdown -r now\"}]);\n }\n \n }\n //===================== deteccion de comando para iniciar la configuración ===========================================================\n if (msg.payload.hasOwnProperty(\"init_config\")) {\n if (msg.payload.init_config == true){\n node.send([null, null, {payload: 1}])\n }\n }\n \n //===================== deteccion de comando para gestionar semaforo ===========================================================\n if (msg.payload.hasOwnProperty(\"semaforoabierto\")) {\n if (msg.payload.semaforoabierto == true) {\n flow.set(\"semaforo\", \"green\")\n flow.set(\"semaforoabierto\", true) \n }\n else{\n flow.set(\"semaforo\", \"red\")\n flow.set(\"semaforoabierto\", false) \n }\n }\n \n //===================== deteccion de comando para abrir barrera ===========================================================\n if (msg.payload.hasOwnProperty(\"abrirbarrera\")) {\n if (msg.payload.abrirbarrera == true) {\n node.send([ null, null, null, { payload: 0 }])\n setTimeout(function () {\n node.send([null, null, null, { payload: 1 }])\n }, flow.get(\"relay2_pulse\"));\n }\n \n }\n //=====================================================================================================================================\n \n \n \n \n \nmsg = {payload: 1};\nreturn msg\n}\nelse{\n\n return // en caso de no ser el mensaje para este dispositivo no enviamos mensaje al proximo nodo, de esa manera no habra ninguna respuesta de este dispositivo\n}\n\n", "outputs": 4, "timeout": "", "noerr": 0, @@ -4222,7 +4222,7 @@ "z": "953e8740401d175c", "g": "646bdfb9988a1708", "name": "Analisis del modo de Operacion", - "func": "//***************************** Selecciona Modo de Operacion **************************************************\nif (!flow.get(\"supervisor\")) {\n if (flow.get(\"peso_estable_flag\")) { //El peso estable se obtiene cuando el vehiculo esta frente al Totem (QR / RFID o sino Detector Local ON)\n\n if (flow.get(\"firma_obligatoria\") && !flow.get(\"firma_ok_flag\") && !flow.get(\"supervisor\") && (!flow.get(\"menu_activo\") || (flow.get(\"menu_activo\") && flow.get(\"menu_seleccionado_flag\")))) { //chequea si tenemos que solicitar firma\n /*El if anterior se cumple si:\n - firma_obligatoria es true y firma_ok_flag es false y si supervisor es false y ademas si menu_activo es false o bien menu_activo es true y menu_seleccionado_flag es true (osea se ha seleccionado el menu)\n Con esto aseguramos que la firma la sacamos una vez que el usuario ha hecho la seleccion del menu (en caso de existir) y no antes.\n */\n // hemos cambiado \"firma_habilitada\" por \"firma_obligatoria\" porque finalmente parece que con un solo parametro es suficiente\n flow.set(\"firma_flag\", true)\n setTimeout(() => {\n node.send([{ \"payload\": { \"tab\": \"Firma\" } }, { payload: \"firma\" }, null, null])\n }, 500);\n\n }\n\n //=============================================================================================================================================\n //====================================================== MODO DE OPERACION ====================================================================\n //=============================================================================================================================================\n let modo = flow.get(\"modo_totem\")\n // -----------------------------------------------------COMUN PARA TODOS LOS MODOS ------------------------------------------------------------\n //let QR_flag = flow.get(\"QR_ok_flag\") || false;\n //let RFID_flag = flow.get(\"RFID_ok_flag\") || false;\n let detector_flag = (flow.get(\"distance_flag_SET\") && (flow.get(\"sentido\") == \"entrada\") && flow.get(\"sensor_distancia_local\")) || false;\n let boton_flag = flow.get(\"salida_valida_flag\") || false;\n let matricula_flag = flow.get(\"matricula_ok_flag\") || false;\n let register_flag = flow.get(\"movimiento_registrado_flag\");\n let firma_flag = flow.get(\"firma_ok_flag\")\n let menu_activo = flow.get(\"menu_activo\") // el menu activo se configura en el archivo de configuracion\n let menu_selected = flow.get(\"menu_seleccionado_flag\") // este flag se activa cuando el conductor selecciona el residuo del menu y lo envia (en caso de menu_activo = true)\n let ID_verificado = flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\")\n \n // Reglas de obligatoriedad configurables en archivo de configuracion\n //let QR_obligatorio = flow.get(\"QR_obligatorio\") || false;\n //let RFID_obligatorio = flow.get(\"RFID_obligatorio\") || false;\n let ID_obligatorio = flow.get(\"ID_obligatorio\")\n let detector_obligatorio = flow.get(\"detector_obligatorio\") || false; // este es el detector de presencia de vehiculo frente al totem\n let boton_obligatorio = flow.get(\"boton_obligatorio\") || false; // Este corresponde al boton de la pantalla de Validacion en caso de estar habilitado\n let firma_obligatoria = flow.get(\"firma_obligatoria\") || false;\n //let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || false\n let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || true // siempre es obligatoria\n // Evaluación de cumplimiento de Flags actuales y Flags obligatorios\n //let QR_ok = !QR_obligatorio || QR_flag;\n //let RFID_ok = !RFID_obligatorio || RFID_flag;\n let ID_ok = !ID_obligatorio || ID_verificado\n let detector_ok = !detector_obligatorio || detector_flag;\n if (flow.get(\"tipo_movimiento\") == \"inicial\") { boton_flag = true } // en movimiento inicial no tiene sentido el boton\n let boton_ok = !boton_obligatorio || boton_flag;\n let firma_ok = !firma_obligatoria || firma_flag;\n //**************************************************** Excepcion para Trajeta RFID **************************************************\n //****************************************************No es necesario tener la matricula del Vehiculo *******************************\n if(flow.get(\"RFID_verificado\")) {matricula_flag = true}\n \n let matricula_ok = !matricula_obligatoria || matricula_flag\n let seleccion_ok\n if(flow.get(\"tipo_movimiento\") == \"inicial\"){\n seleccion_ok = !menu_activo || menu_selected || ID_verificado // Si el menu esta activo el ID_verificado permite saltar la seleccion del residuo\n }\n else if(flow.get(\"tipo_movimiento\") == \"final\"){\n //seleccion_ok = !menu_activo || menu_selected || ID_verificado || boton_flag\n seleccion_ok = true\n ID_ok = !flow.get(\"salida_ID_obligatorio\") || ID_verificado\n }\n /*\n if (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\")) {\n QR_ok = !QR_obligatorio && flow.get(\"QR_verificado\")\n RFID_ok = !RFID_obligatorio && flow.get(\"RFID_verificado\")\n }\n */\n let todos_obligatorios_ok;\n\n switch (modo) {\n\n case \"A\": //************************************** MODO A [ Matricula - QR / RFID - sensor local - boton de salida ]***************************************************** */\n // aqui revisamos si se recibio matricula y un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - un QR o una tarjeta RFID\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // - la seleccion del menu\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO qye se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = ID_ok && detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok && matricula_ok;\n \n node.warn(\"todos obligatorios = \" + todos_obligatorios_ok)\n node.warn(\"ID_ok = \" + ID_ok + \" ; detector_ok = \" + detector_ok + \" ; register_flag = \" + register_flag + \" ; seleccion = \" + seleccion_ok + \" ; matricula = \" + matricula_ok + \" ; boton = \" + boton_ok )\n \n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n //Agregamos al registro los nuevos datos recogidos\n //node.warn(\"matricula ok\")\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n /*\n if (flow.get(\"identificacion_esp_aplicada\")) {\n new_register.matricula = \"Sin Matricula\"\n new_register.nombre_imagen = \"Sin Matricula\"\n }\n */\n if (flow.get(\"tipo_movimiento\") == \"inicial\"){\n new_register.qr = flow.get(\"last_QR\")\n }\n else if (flow.get(\"tipo_movimiento\") == \"final\"){\n new_register.qrsalida = flow.get(\"last_QR\")\n }\n \n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = flow.get(\"nombre_firma\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")){\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n if (!flow.get(\"movimiento_enviado\")){\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n }\n //------------------------------------------------------------------------------------------------------------------------------------------\n //node.warn(\"revisando QR / RFID flags\")\n //if (flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\") || flow.get(\"salida_valida_flag\") || flow.get(\"peso_estable_flag\")) {\n if (flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\")) {\n flow.set(\"window_men_m3\", \"\");\n }\n else {\n //node.warn(\"sacamos mensaje de identificacion\")\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"));\n }//-----------------------------------------------------------------------------------------------------------------------------------------\n break;\n\n case \"B\": //************************************** MODO B [ Matricula - sensor local - boton de salida ] *****************************************************\n // aqui revisamos si se recibio matricula y un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO qye se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok && matricula_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n new_register.qr = \"Sin Lector de QR\"\n new_register.rfid = \"Sin Lector de RFID\"\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n break;\n case \"C\": //************************************** MODO C [ QR / RFID - sensor local - boton de salida ]*****************************************************\n // aqui revisamos si se recibio un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - un QR o una tarjeta RFID\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin por primera vez\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO que se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = ID_ok && detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = \"Sin Camara\"\n new_register.matriculaeditada = false\n new_register.nombre_imagen = \"Sin Camara\"\n new_register.qr = flow.get(\"last_QR\")\n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n //------------------------------------------------------------------------------------------------------------------------------------------\n if (flow.get(\"QR_ok_flag\") || flow.get(\"RFID_ok_flag\")) {\n flow.set(\"window_men_m3\", \"\");\n }\n else {\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"));\n }//-----------------------------------------------------------------------------------------------------------------------------------------\n\n break;\n case \"D\": //************************************** MODO D [boton de salida ]*****************************************************\n // aqui revisamos si se recibio el boton de validacion que indica que el conductor esta frente al totem\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el vehiculo abandone la bascula es decir cuando peso < pmin\n boton_flag = flow.get(\"salida_valida_flag\") || false;\n\n boton_obligatorio = seleccion_ok && (flow.get(\"boton_obligatorio\") || false); // Este corresponde al boton de la pantalla de Validacion en caso de estar habilitado\n register_flag = flow.get(\"movimiento_registrado_flag\")\n\n // Evaluación de cumplimiento de Flags actuales y Flags obligatorios\n\n boton_ok = !boton_obligatorio || boton_flag;\n\n todos_obligatorios_ok = boton_ok && !register_flag && firma_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = \"Sin Camara\"\n new_register.matriculaeditada = false\n new_register.nombre_imagen = \"Sin Camara\"\n new_register.qr = \"Sin Lector de QR\"\n new_register.rfid = \"Sin Lector de RFID\"\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n\n break;\n\n }// termina el codigo del SWITCH CASE\n //*************************************************** PREPARACION Y ENVIO DEL MOVIMIENTO *******************************************************\n if (flow.get(\"movimiento_registrado_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && (flow.get(\"tipo_movimiento\") != \"nodefinido\")&& !flow.get(\"movimiento_enviado\")) {\n let date = new Date();\n let timestamp = parseInt(date.getTime() / 1000);\n flow.set(\"horasalida\", new Date(date.getTime()).toLocaleString()) // Convierte a formato legible\n\n let new_register = flow.get(\"register\")\n new_register.horasalida = flow.get(\"horasalida\")\n new_register.pesoestable = flow.get(\"peso_estable\")\n new_register.timestamp = timestamp\n //hay que revisar imagen, QR y RFID ya que no en todos los casos estan presentes\n\n let obj = new_register;\n delete obj.sincro\n new_register = obj\n new_register.imagen = flow.get(\"matricula_image\")\n if (flow.get(\"firma_obligatoria\")) { // cambiamos \"firma_habilitada\" por \"firma_obligatoria\"\n new_register.firma = flow.get(\"last_firma\")\n }\n\n //let msg_plate = { payload: flow.get(\"matricula_image\"), filename: flow.get(\"path_images\") + flow.get(\"nombre_imagen\") } // guardamos archivo con imagen en disco local\n\n //flow.set(\"register2API\", new_register) // guardamos el objeto json completo con imagen de matricula e imagen de firma \n\n flow.set(\"movimiento_registrado_flag\", false) // evitamos que podamos entrar en este espacio hasta nuevo registro\n\n // *********************** preparamos json con movimiento para enviar al supervisor local de la bascula *****************\n let msg_mov = { payload: {} }\n new_register.tara = flow.get(\"tara\")\n new_register.destareautomatico = flow.get(\"destareautomatico\")\n msg_mov.payload.device = \"supervisor\"\n msg_mov.payload.totem_id = flow.get(\"totem_id\")\n msg_mov.payload.accion = \"movimiento\"\n //msg_mov.payload.tipo = flow.get(\"modelo\") // entrada / salida\n msg_mov.payload.tipomovimiento = flow.get(\"tipo_movimiento\")\n //msg_mov.payload.urlapi = flow.get(\"url_API\")\n msg_mov.payload.movimiento = new_register // enviamos el registro del movimiento con las imagenes de matricula y de firma\n flow.set(\"movimiento_enviado\", true)\n flow.set(\"new_register\", {}) // inicializamos el registro para evitar cualquier posible duplicado en bd\n node.send([null, null, msg_mov, null])\n }\n\n }\n}\nreturn ([null, null, null, msg])", + "func": "//***************************** Selecciona Modo de Operacion **************************************************\nif (!flow.get(\"supervisor\")) {\n if (flow.get(\"peso_estable_flag\")) { //El peso estable se obtiene cuando el vehiculo esta frente al Totem (QR / RFID o sino Detector Local ON o bien pulsar un boton que aparezca en pantalla)\n\n if (flow.get(\"firma_obligatoria\") && !flow.get(\"firma_ok_flag\") && !flow.get(\"supervisor\") && (!flow.get(\"menu_activo\") || (flow.get(\"menu_activo\") && flow.get(\"menu_seleccionado_flag\")))) { //chequea si tenemos que solicitar firma\n /*\n El if anterior se cumple si:\n - firma_obligatoria es true y firma_ok_flag es false y si supervisor es false y ademas si menu_activo es false o bien menu_activo es true y menu_seleccionado_flag es true (osea se ha seleccionado el menu)\n Con esto aseguramos que la firma la sacamos una vez que el usuario ha hecho la seleccion del menu (en caso de existir) y no antes.\n */\n // hemos cambiado \"firma_habilitada\" por \"firma_obligatoria\" porque finalmente con un solo parametro es suficiente\n flow.set(\"firma_flag\", true)\n setTimeout(() => {\n node.send([{ \"payload\": { \"tab\": \"Firma\" } }, { payload: \"firma\" }, null, null])\n }, 500);\n\n }\n\n //=============================================================================================================================================\n //====================================================== MODO DE OPERACION ====================================================================\n //=============================================================================================================================================\n let modo = flow.get(\"modo_totem\")\n // -----------------------------------------------------COMUN PARA TODOS LOS MODOS ------------------------------------------------------------\n let detector_flag = (flow.get(\"distance_flag_SET\") && (flow.get(\"sentido\") == \"entrada\") && flow.get(\"sensor_distancia_local\")) || false;\n let boton_flag = flow.get(\"salida_valida_flag\") || false;\n let matricula_flag = flow.get(\"matricula_ok_flag\") || false;\n let register_flag = flow.get(\"movimiento_registrado_flag\");\n let firma_flag = flow.get(\"firma_ok_flag\")\n let menu_activo = flow.get(\"menu_activo\") // el menu activo se configura en el archivo de configuracion\n let menu_selected = flow.get(\"menu_seleccionado_flag\") // este flag se activa cuando el conductor selecciona el residuo del menu y lo envia (en caso de menu_activo = true)\n let ID_verificado = flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\")\n \n // Reglas de obligatoriedad configurables en archivo de configuracion\n\n let ID_obligatorio = flow.get(\"ID_obligatorio\")\n let detector_obligatorio = flow.get(\"detector_obligatorio\") || false; // este es el detector de presencia de vehiculo frente al totem\n let boton_obligatorio = flow.get(\"boton_obligatorio\") || false; // Este corresponde al boton de la pantalla de Validacion en caso de estar habilitado\n let firma_obligatoria = flow.get(\"firma_obligatoria\") || false;\n //let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || false\n let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || true // siempre es obligatoria\n \n // Evaluación de cumplimiento de Flags actuales y Flags obligatorios\n \n let ID_ok = !ID_obligatorio || ID_verificado\n let detector_ok = !detector_obligatorio || detector_flag;\n if (flow.get(\"tipo_movimiento\") == \"inicial\") { boton_flag = true } // en movimiento inicial no tiene sentido el boton\n let boton_ok = !boton_obligatorio || boton_flag;\n let firma_ok = !firma_obligatoria || firma_flag;\n //**************************************************** Excepcion para Trajeta RFID **************************************************\n //****************************************************No es necesario tener la matricula del Vehiculo *******************************\n if(flow.get(\"RFID_verificado\")) {matricula_flag = true}\n \n let matricula_ok = !matricula_obligatoria || matricula_flag\n let seleccion_ok\n if(flow.get(\"tipo_movimiento\") == \"inicial\"){\n seleccion_ok = !menu_activo || menu_selected || ID_verificado // Si el menu esta activo, el ID_verificado permite saltar la seleccion del residuo\n }\n else if(flow.get(\"tipo_movimiento\") == \"final\"){\n //seleccion_ok = !menu_activo || menu_selected || ID_verificado || boton_flag\n seleccion_ok = true\n ID_ok = !flow.get(\"salida_ID_obligatorio\") || ID_verificado\n }\n \n let todos_obligatorios_ok;\n\n switch (modo) {\n\n case \"A\": //************************************** MODO A [ Matricula - QR / RFID - sensor local - boton de salida ]***************************************************** */\n // aqui revisamos si se recibio matricula y un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - un QR o una tarjeta RFID\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // - la seleccion del menu\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que se active el semaforo en verde\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO (presente en la configuracion ) que se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = ID_ok && detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok && matricula_ok;\n \n node.warn(\"todos obligatorios = \" + todos_obligatorios_ok)\n node.warn(\"ID_ok = \" + ID_ok + \" ; detector_ok = \" + detector_ok + \" ; register_flag = \" + register_flag + \" ; seleccion = \" + seleccion_ok + \" ; matricula = \" + matricula_ok + \" ; boton = \" + boton_ok )\n \n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n //Agregamos al registro los nuevos datos recogidos\n //node.warn(\"matricula ok\")\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n \n if (flow.get(\"tipo_movimiento\") == \"inicial\"){\n new_register.qr = flow.get(\"last_QR\")\n }\n else if (flow.get(\"tipo_movimiento\") == \"final\"){\n new_register.qrsalida = flow.get(\"last_QR\")\n }\n \n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = flow.get(\"nombre_firma\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")){\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n if (!flow.get(\"movimiento_enviado\")){\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n }\n //------------------------------------------------------------------------------------------------------------------------------------------\n //node.warn(\"revisando QR / RFID flags\")\n \n if (flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\") || !flow.get(\"ID_obligatorio\")) {\n flow.set(\"window_men_m3\", \"\");\n }\n else {\n //node.warn(\"sacamos mensaje de identificacion\")\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\")); // solicitamos por pantalla una identificación de tipo QR o RFID\n }//-----------------------------------------------------------------------------------------------------------------------------------------\n break;\n\n case \"B\": //************************************** MODO B [ Matricula - sensor local - boton de salida ] *****************************************************\n // aqui revisamos si se recibio matricula y un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes elementos:\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento se actibve el semaforo en verde.\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO que se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok && matricula_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = flow.get(\"matricula\")\n new_register.matriculaeditada = flow.get(\"matricula_editada_flag\")\n new_register.nombre_imagen = flow.get(\"nombre_imagen\")\n new_register.qr = \"Sin Lector de QR\"\n new_register.rfid = \"Sin Lector de RFID\"\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n break;\n case \"C\": //************************************** MODO C [ QR / RFID - sensor local - boton de salida ]*****************************************************\n // aqui revisamos si se recibio un evento que indique que el conductor esta frente al totem\n // puede ser alguno de los siguientes eslementos:\n // - un QR o una tarjeta RFID\n // - el boton de activacion de salida que ponemos en pantalla en caso de estar habilitado para ello en el archivo de configuración\n // - el sensor local de presencia de vehiculo\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que se active el semaforo en verde.\n // Adidionalmente se revisa si existe algun parametro OBLIGATORIO que se deba recibir antes de dar por finalizada la pesada. \n // Un evento obligatorio podria ser La tarjeta RFID o el QR o pulsar el boton de Validacion\n\n todos_obligatorios_ok = ID_ok && detector_ok && boton_ok && seleccion_ok && !register_flag && firma_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = \"Sin Camara\"\n new_register.matriculaeditada = false\n new_register.nombre_imagen = \"Sin Camara\"\n new_register.qr = flow.get(\"last_QR\")\n new_register.rfid = flow.get(\"last_RFID\")\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n //------------------------------------------------------------------------------------------------------------------------------------------\n if (flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado\") || !flow.get(\"ID_obligatorio\")) {\n flow.set(\"window_men_m3\", \"\");\n }\n else {\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"));\n }//-----------------------------------------------------------------------------------------------------------------------------------------\n\n break;\n case \"D\": //************************************** MODO D [boton de salida ]*****************************************************\n // aqui revisamos si se recibio el boton de validacion que indica que el conductor esta frente al totem\n // El flag movimiento_registrado_flag se revisa para asegurar que se registra una sola vez al cumplir las condiciones\n // El registro queda en memoria, este se pasa a BD solamente al momento que el semaforo se active en verde.\n boton_flag = flow.get(\"salida_valida_flag\") || false;\n\n boton_obligatorio = seleccion_ok && (flow.get(\"boton_obligatorio\") || false); // Este corresponde al boton de la pantalla de Validacion en caso de estar habilitado\n register_flag = flow.get(\"movimiento_registrado_flag\")\n\n // Evaluación de cumplimiento de Flags actuales y Flags obligatorios\n\n boton_ok = !boton_obligatorio || boton_flag;\n\n todos_obligatorios_ok = boton_ok && !register_flag && firma_ok;\n if (todos_obligatorios_ok) { // Cerramos el registro con los parametros hasta ahora recogidos\n\n //Agregamos al registro los nuevos datos recogidos\n let new_register = flow.get(\"register\")\n new_register.matricula = \"Sin Camara\"\n new_register.matriculaeditada = false\n new_register.nombre_imagen = \"Sin Camara\"\n new_register.qr = \"Sin Lector de QR\"\n new_register.rfid = \"Sin Lector de RFID\"\n new_register.sentido = flow.get(\"sentido\")\n new_register.botonvalidacion = flow.get(\"salida_valida_flag\")\n if (flow.get(\"firma_obligatoria\") && flow.get(\"firma_ok_flag\")) {\n new_register.nombre_firma = \"firma-\" + flow.get(\"nombre_imagen\")\n new_register.firmaobligatoria = true\n }\n else {\n new_register.nombre_firma = \"No Habilitada\"\n new_register.firmaobligatoria = false\n }\n if (flow.get(\"menu_activo\")) {\n new_register.id_seleccionado = flow.get(\"id_seleccionado\")\n }\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n flow.set(\"fin_pesada_flag\", true)\n }\n\n break;\n\n }// termina el codigo del SWITCH CASE\n //*************************************************** PREPARACION Y ENVIO DEL MOVIMIENTO *******************************************************\n if (flow.get(\"movimiento_registrado_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && (flow.get(\"tipo_movimiento\") != \"nodefinido\")&& !flow.get(\"movimiento_enviado\")) {\n let date = new Date();\n let timestamp = parseInt(date.getTime() / 1000);\n flow.set(\"horasalida\", new Date(date.getTime()).toLocaleString()) // Convierte a formato legible\n\n let new_register = flow.get(\"register\")\n new_register.horasalida = flow.get(\"horasalida\")\n new_register.pesoestable = flow.get(\"peso_estable\")\n new_register.timestamp = timestamp\n //hay que revisar imagen, QR y RFID ya que no en todos los casos estan presentes\n\n let obj = new_register;\n delete obj.sincro\n new_register = obj\n new_register.imagen = flow.get(\"matricula_image\")\n if (flow.get(\"firma_obligatoria\")) { // cambiamos \"firma_habilitada\" por \"firma_obligatoria\"\n new_register.firma = flow.get(\"last_firma\")\n }\n\n flow.set(\"movimiento_registrado_flag\", false) // evitamos que podamos entrar en este espacio hasta nuevo registro\n\n // *********************** preparamos json con movimiento para enviar al supervisor local de la bascula *****************\n let msg_mov = { payload: {} }\n new_register.tara = flow.get(\"tara\")\n new_register.destareautomatico = flow.get(\"destareautomatico\")\n msg_mov.payload.device = \"supervisor\"\n msg_mov.payload.totem_id = flow.get(\"totem_id\")\n msg_mov.payload.accion = \"movimiento\"\n //msg_mov.payload.tipo = flow.get(\"modelo\") // entrada / salida\n msg_mov.payload.tipomovimiento = flow.get(\"tipo_movimiento\")\n //msg_mov.payload.urlapi = flow.get(\"url_API\")\n msg_mov.payload.movimiento = new_register // enviamos el registro del movimiento con las imagenes de matricula y de firma\n flow.set(\"movimiento_enviado\", true)\n flow.set(\"new_register\", {}) // inicializamos el registro para evitar cualquier posible duplicado en bd\n node.send([null, null, msg_mov, null])\n }\n\n }\n}\nreturn ([null, null, null, msg])", "outputs": 4, "timeout": 0, "noerr": 0, @@ -5228,7 +5228,7 @@ "once": false, "onceDelay": 0.1, "topic": "", - "payload": "123456789", + "payload": "763cdffa", "payloadType": "str", "x": 2450, "y": 2020, @@ -6171,7 +6171,7 @@ "type": "comment", "z": "953e8740401d175c", "name": "Version 1.12 de bascula autonoma", - "info": "**Version 1.12** Se corrigio el nodo peso estable para procesar correctamente el valor de Peso Maximo Admitido y sacar un mensaje que no se pueda borrar\nhasta que el vehiculo abandone la bascula. Se agrego un nodo para mantener el aviso de salir de la bascula en caso de PMA, si el usuario pulsa OK.\n\n**Version 1.11**Se puso una condicion (peso en bascula > pmin) en el nodo \"enviar matricula\" para enviar matricula al nodo de analisis. Esto evita que se este\nenviando matricula si se recibe sin que haya vehiculo en bascula. Esto no evita que se reciban matriculas automaticas antes de entrar el vehiculo en la bascula.\nEstas ultimas fotos se conservan en memoria hasta que el vehiculo entre en la bascula y pueden ser utilizadas como foto principal en caso de fallo en la solicitud.\nHemos eliminado en la linea 156 del nodo matricula2 la condicion de \"qr_revisado\" para eximirlo de disponer de matricula debido a que ahora el codigo qr puede estar asociado a varias matriculas.\ny por lo tanto sera necesario disponer de una matricula a pesar de tener el codigo de autorizacio (solo indica residuo).\nHemos inicializado la matricula [flow.set(\"matricula\", \"Sin Matricula\")] tambien en el momento en que el peso supera a pmin por primera vez (es decir entrando en la bascula).\nSe agrego en la salida de la edicion de matricula [flow.set(\"matriculacheck_solicitada\", false)] para permitir que se busque nuevamente la matricula en BD.\n\n**Version 1.1** Hemos agregado excepcion de obligacion de tener que disponer de matricula para el caso de presentar una tarjeta RFID. Anteriormente se habia puesto en el nodo de \"Analisis\ndel modo de operacion\" (*let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || true // siempre es obligatoria*) una linea para obligar a tener siempre matricula,\nindependiente de lo que este configurado en el archivo de configuracion. Ahora esa linea sigue funcionando pero en el caso de la tarjeta se permite que no haya matricula ya que esta identificacion \ncontiene la matricula unica. Ver linea 53 en el nodo mencionado anteriormente. No es el caso de los QR los cuales puede haber el mismo GUUID asociados a diferentes matriculas.\n\nSe han agregado nos nuevos campos a la tabla movimierntos_cerrados en el supervisor estos campos son \"qr_salida\" y \"rfid_salida\". La presencia de estos \ndos campos es para disponer de la identificaciob utilizada en salida en caso de hacerlo. Para ello en el nodo \"Analisis del modo de Operacion\" se evalua \nsi estamos en el movimiento inicial o final para ver cual campo es el que tenemos que rellenar. Est se hace el la linea nº 100\nSe ha moviso la inicializacion flow.set(\"distance_flag_SET\", false) al momento donde la bascula pasa de peso < pmin por primera vez. \nAntes se inicializaba cada vez que el peso que llegaba era menor que pmin. Esto podia ocasionar un error ya que el nodo detector perdia el control\nde este flag al ser inicializado cada vez que el peso < pmin.\n\nEl nodo \"matricula 2\" sustituye al nodo matricula anterior. Este nuevo contiene todas las modificaciones necesarias para adaptarse a los \nnuevos requerimientos de la bascula automatica\n\nPara que el QR pueda entrar en la planta es necesario que la matricula este disponible.\nEn caso de que la matricula leida sea diferente a la matricula obtenida en la BD luego de enviar el QR se toma la matricula leida de la BD\n\n**version 1.0.** Este codigo de Bascula Autonoma sale a partir del Totem Autonomo. Todo el codigo relativo a la gestion de BAse de Datos se traslada al RPI Supervisor\nEn este RPi solo queda lo relativo a la gestion de sensores, camaras, lectores de Identioficacion, semaforo, barrera y la pantalla para que el usuario \npueda interactuar con el sistema como por ejemplo hacer seleccion del residuo a traves de un menu de seleccion.\n\nEn esta version se ha introducido el termino PMA(Peso Maximo Autorizado. Este es un valor que el Totem recibe cuando el Supervisor le envia la autorizacion\nde la matricula junto con la tara- El Totem revisa el peso estable del vehiculo con el PMA recibidoy en caso de ser superior se envia un aviso en la pantalla\nindicandole al conductor que debe retroceder ya que supera el peso admitido.\n\nOtra función que contiene esta version es el chequeo de la Tara. Si el valor recibido de la Tara es superior a cero entonces el movimiento inicial recinbido por el supervisor \nes enviado como movimiento cerrado al Servidor.Realmente para el Totem es transparente. La gestion de la Tara en efecto la hace el Supervisor una vez que recibe\nel movimiento inicial que envia el Totem.", + "info": "**Version 1.12** Se corrigio el nodo peso estable para procesar correctamente el valor de Peso Maximo Admitido y sacar un mensaje que no se pueda borrar\nhasta que el vehiculo abandone la bascula. Se agrego un nodo para mantener el aviso de salir de la bascula en caso de PMA, si el usuario pulsa OK.\nCorregido en el nodo \"check JSON content\" la recepcion de la matricula asociada a una tarjeta. Hemos activado los flags correspondientes para que el nodo \n\"matricula 2\" pueda hacer el chequeo de la matricula respecto a si esta o no en transito. \nEn el nodo \"Analisis del modo de operacion\" hemos puesto una condicion para no mostrar el boton de salida cuando el usuario utiliza una tarjerta valida.\n\n**Version 1.11**Se puso una condicion (peso en bascula > pmin) en el nodo \"enviar matricula\" para enviar matricula al nodo de analisis. Esto evita que se este\nenviando matricula si se recibe sin que haya vehiculo en bascula. Esto no evita que se reciban matriculas automaticas antes de entrar el vehiculo en la bascula.\nEstas ultimas fotos se conservan en memoria hasta que el vehiculo entre en la bascula y pueden ser utilizadas como foto principal en caso de fallo en la solicitud.\nHemos eliminado en la linea 156 del nodo matricula2 la condicion de \"qr_revisado\" para eximirlo de disponer de matricula debido a que ahora el codigo qr puede estar asociado a varias matriculas.\ny por lo tanto sera necesario disponer de una matricula a pesar de tener el codigo de autorizacio (solo indica residuo).\nHemos inicializado la matricula [flow.set(\"matricula\", \"Sin Matricula\")] tambien en el momento en que el peso supera a pmin por primera vez (es decir entrando en la bascula).\nSe agrego en la salida de la edicion de matricula [flow.set(\"matriculacheck_solicitada\", false)] para permitir que se busque nuevamente la matricula en BD.\n\n**Version 1.1** Hemos agregado excepcion de obligacion de tener que disponer de matricula para el caso de presentar una tarjeta RFID. Anteriormente se habia puesto en el nodo de \"Analisis\ndel modo de operacion\" (*let matricula_obligatoria = flow.get(\"matricula_obligatoria\") || true // siempre es obligatoria*) una linea para obligar a tener siempre matricula,\nindependiente de lo que este configurado en el archivo de configuracion. Ahora esa linea sigue funcionando pero en el caso de la tarjeta se permite que no haya matricula ya que esta identificacion \ncontiene la matricula unica. Ver linea 53 en el nodo mencionado anteriormente. No es el caso de los QR los cuales puede haber el mismo GUUID asociados a diferentes matriculas.\n\nSe han agregado nos nuevos campos a la tabla movimierntos_cerrados en el supervisor estos campos son \"qr_salida\" y \"rfid_salida\". La presencia de estos \ndos campos es para disponer de la identificaciob utilizada en salida en caso de hacerlo. Para ello en el nodo \"Analisis del modo de Operacion\" se evalua \nsi estamos en el movimiento inicial o final para ver cual campo es el que tenemos que rellenar. Est se hace el la linea nº 100\nSe ha moviso la inicializacion flow.set(\"distance_flag_SET\", false) al momento donde la bascula pasa de peso < pmin por primera vez. \nAntes se inicializaba cada vez que el peso que llegaba era menor que pmin. Esto podia ocasionar un error ya que el nodo detector perdia el control\nde este flag al ser inicializado cada vez que el peso < pmin.\n\nEl nodo \"matricula 2\" sustituye al nodo matricula anterior. Este nuevo contiene todas las modificaciones necesarias para adaptarse a los \nnuevos requerimientos de la bascula automatica\n\nPara que el QR pueda entrar en la planta es necesario que la matricula este disponible.\nEn caso de que la matricula leida sea diferente a la matricula obtenida en la BD luego de enviar el QR se toma la matricula leida de la BD\n\n**version 1.0.** Este codigo de Bascula Autonoma sale a partir del Totem Autonomo. Todo el codigo relativo a la gestion de BAse de Datos se traslada al RPI Supervisor\nEn este RPi solo queda lo relativo a la gestion de sensores, camaras, lectores de Identioficacion, semaforo, barrera y la pantalla para que el usuario \npueda interactuar con el sistema como por ejemplo hacer seleccion del residuo a traves de un menu de seleccion.\n\nEn esta version se ha introducido el termino PMA(Peso Maximo Autorizado. Este es un valor que el Totem recibe cuando el Supervisor le envia la autorizacion\nde la matricula junto con la tara- El Totem revisa el peso estable del vehiculo con el PMA recibidoy en caso de ser superior se envia un aviso en la pantalla\nindicandole al conductor que debe retroceder ya que supera el peso admitido.\n\nOtra función que contiene esta version es el chequeo de la Tara. Si el valor recibido de la Tara es superior a cero entonces el movimiento inicial recinbido por el supervisor \nes enviado como movimiento cerrado al Servidor.Realmente para el Totem es transparente. La gestion de la Tara en efecto la hace el Supervisor una vez que recibe\nel movimiento inicial que envia el Totem.", "x": 1300, "y": 800, "wires": []