From ad6b0e0422378d5cd9d2918e06b178a3de38058f Mon Sep 17 00:00:00 2001 From: trypton Date: Mon, 24 Nov 2025 09:55:05 +0100 Subject: [PATCH] Modificado el nodo matricula con las nuevas condiciones para la bascula autonoma. El nuevo nodo lo llamamos matricula-2 --- bascula_autonoma_1.json | 78 ++++++++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 20 deletions(-) diff --git a/bascula_autonoma_1.json b/bascula_autonoma_1.json index 2377724..648605f 100644 --- a/bascula_autonoma_1.json +++ b/bascula_autonoma_1.json @@ -611,7 +611,9 @@ "efa47b4b532c3c95", "f5343bf87806ece4", "4ab4a211f9ce33d9", - "41b9eef871e59dd2" + "41b9eef871e59dd2", + "b31db528b0be605a", + "185e340354acf892" ], "x": 994, "y": 919, @@ -3530,7 +3532,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 anuncion 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 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 //******************************** 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 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 flow.set(\"matricula_autorizada\", false) // matricula autorizada\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\")) {\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 flow.set(\"lista_flag\", false)\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 anuncion 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 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 //******************************** 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 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, @@ -3561,7 +3563,7 @@ "z": "953e8740401d175c", "g": "646bdfb9988a1708", "name": "Envio de mensajes", - "func": "// Este nodo realiza todos los envios de mensajes a los diferentes destinos: websocket, pantalla, relay\n\nif ((msg.id_topic == \"rfid\" || msg.id_topic == \"QR\") && flow.get(\"totem_master\")) { // si el mensaje proviene del lector de ID\n\n if (flow.get(\"RFID_ok_flag\") || flow.get(\"QR_ok_flag\")) {\n flow.set(\"window_id_m4\", flow.get(\"id_leido\"));\n flow.set(\"window_men_m3\", \"\");\n //flow.set(\"QR_ok_flag\", false)\n //flow.set(\"RFID_ok_flag\", false)\n if (flow.get(\"peso_bajo_flag\")) {\n // para el caso cuando queremos enviar tarjetas para asignar usuario en la base de datos\n //flow.set(\"window_id_m4\", flow.get(\"id_tarjeta\"));\n msg = {};\n setTimeout(function () {\n //node.warn(\"erase window\")\n //flow.set(\"QR_ok_flag\", false)\n //flow.set(\"RFID_ok_flag\", false)\n flow.set(\"window_id_m4\", \"\");\n // ================================== configura mensaje para las ventanas de la pantalla ===========================\n var msg_display = { \"id_m1\": \"\", \"id_m2\": \"\", \"id_m3\": \"\", \"id_m4\": \"\", \"men_m1\": \"\", \"men_m2\": \"\", \"men_m3\": \"\", \"peso\": \"\" };\n msg_display.id_m1 = flow.get(\"id_titulo_matricula\");\n msg_display.id_m2 = flow.get(\"matricula\");\n msg_display.id_m3 = flow.get(\"id_titulo_id\");\n msg_display.id_m4 = flow.get(\"window_id_m4\");\n\n msg_display.men_m1 = flow.get(\"window_men_m1\");\n msg_display.men_m2 = flow.get(\"window_men_m2\");\n msg_display.men_m3 = flow.get(\"window_men_m3\");\n\n msg_display.peso = flow.get(\"peso\");\n //asignamos el valor real del color del semaforo, este valor se define en el archivo de configuración\n if (flow.get(\"semaforo\") == \"green\") {\n msg_display.semaforo = flow.get(\"semaforo_green_color\")\n }\n else {\n msg_display.semaforo = flow.get(\"semaforo_red_color\")\n }\n\n\n // ==================================================================================================================\n node.send([msg_display, null, null, null])\n }, 3000)\n }\n\n\n }\n else {\n if (flow.get(\"vehiculo_presente_flag\")) {\n flow.set(\"window_id_m4\", flow.get(\"id_no_leido\"));\n }\n else {\n\n }\n\n\n }\n}\n//============================================== Chequea si Fin de Pesada y Saca Mensaje ===========================================\nif (flow.get(\"fin_pesada_flag\") && flow.get(\"totem_master\")) {\n setTimeout(() => {\n node.send([null, null, null, { payload: \"fin_pesada\" }]) // salida de audio de FIN DE PESADA <----\n }, 500);\n flow.set(\"fin_pesada_flag\", false) // evitamos que en esta pesada vuelva a entrar aqui nuevamente\n flow.set(\"semaforo\", \"green\")\n // sacar comando para barrera si esta se encuentra habilitada\n node.send([null, { payload: 1 }, null, null])\n if (flow.get(\"barrera_habilitada\")) {\n setTimeout(function () {\n node.send([null, { payload: 0 }, null, null])\n }, flow.get(\"relay2_pulse\"));\n }\n //flow.set(\"peso_estable_flag\", false)\n flow.set(\"botonsalida\", false)\n //coloca los mensajes para mostrar en pantalla \n flow.set(\"window_men_m1\", flow.get(\"men_pesaje_listo\"));\n flow.set(\"window_men_m2\", flow.get(\"men_salida\"));\n flow.set(\"window_men_m3\", \"\");\n}\n//===================================================================================================================== \n\n\n// ================================== configura mensaje para las ventanas de la pantalla ===========================\nvar msg_display = { \"id_m1\": \"\", \"id_m2\": \"\", \"id_m3\": \"\", \"id_m4\": \"\", \"men_m1\": \"\", \"men_m2\": \"\", \"men_m3\": \"\", \"peso\": \"\" };\nmsg_display.id_m1 = flow.get(\"id_titulo_matricula\");\nmsg_display.id_m2 = flow.get(\"matricula\");\nmsg_display.id_m3 = flow.get(\"id_titulo_id\");\nmsg_display.id_m4 = flow.get(\"window_id_m4\");\n\nmsg_display.men_m1 = flow.get(\"window_men_m1\");\nmsg_display.men_m2 = flow.get(\"window_men_m2\");\nmsg_display.men_m3 = flow.get(\"window_men_m3\");\n\nmsg_display.peso = flow.get(\"peso\");\n//asignamos el valor real del color del semaforo, este valor se define en el archivo de configuración\nmsg_display.semaforo = flow.get(\"semaforo\");\nif (flow.get(\"semaforo\") == \"green\") {\n msg_display.semaforo = flow.get(\"semaforo_green_color\")\n}\nelse {\n msg_display.semaforo = flow.get(\"semaforo_red_color\")\n}\nmsg_display.titulo_matricula_color = flow.get(\"titulo_matricula_color\") // color del texto del titulo de Matricula y del ID. Definido en el archivo de configuracion\nmsg_display.valor_matricula_color = flow.get(\"valor_matricula_color\") // color del texto del valor de la Matricula y del ID. Definido en el archivo de configuracion\nmsg_display.men_m1_color = \"#cc0000\" // color del mensaje de \"peso estable\" en la ventana W2\nmsg_display.men_m2_color = \"#6B3C01\" // color del mensaje de \"puede mover el vehiculo\" en la ventana W2\nmsg_display.men_m3_color = \"#386B01\" // color del mensaje de \"acerque tarjeta de ID\" en la ventana W2\n\n//============================Procesamiento botones en pantalla ======================================================\nif (flow.get(\"totem_master\")) {\n if (flow.get(\"startmenu_flag\")) { // check si tenemos que poner boton de solicitud de primer menu\n if (flow.get(\"button\") != undefined) {\n msg_display.button = flow.get(\"button\")\n }\n else {\n msg_display.button = \"button1\"\n }\n if (flow.get(\"button1\") != undefined) {\n msg_display.button1 = flow.get(\"button1\")\n }\n else {\n msg_display.button1 = \"COMPLETAR INFO.\"\n }\n if (flow.get(\"button2\") != undefined) {\n msg_display.button2 = flow.get(\"button2\")\n }\n else {\n msg_display.button2 = \"OK.\"\n }\n if (flow.get(\"men_linea1\") != undefined) {\n msg_display.men_m1 = flow.get(\"men_linea1\")\n }\n else {\n msg_display.men_m1 = \"Haga CLICK ABAJO\"\n }\n if (flow.get(\"men_linea2\") != undefined) {\n msg_display.men_m2 = flow.get(\"men_linea2\")\n }\n else {\n msg_display.men_m2 = \"\"\n }\n\n msg_display.men_m1_color = flow.get(\"men_linea1_color\")\n msg_display.men_m2_color = flow.get(\"men_linea2_color\")\n //flow.set(\"startmenu_flag\", false) // boton de solicitud de primer menu ejecutado\n // Este flag \"startmenu_flag\" debe ser puesto a false luego de haber sacado el menu o pasado la tarjeta\n // ya que si se pone a false antes de tocar el boton y viene otro valor de peso el boton desaparece de la pantalla\n }\n else {\n msg_display.button = \"message\"\n }\n // ==================================================================================================================\n\n //------------------------------ BOTON de VALIDACION ----------------------------------------------------------------\n if (flow.get(\"botonsalida\")) { // check si tenemos que poner boton de validacion a la salida. Si movimiento final siempre lo ponemos\n\n msg_display.button = \"button3\" // hace display de un boton de validacion\n\n // ------------ chequea si tenemos color del background del boton de validacion ---------------\n if (flow.get(\"botonsalida_color\") != undefined) {\n msg_display.botonvalidacion_background = flow.get(\"botonsalida_color\")\n }\n else {\n msg_display.botonvalidacion_background = flow.get(\"botonsalida_color_def\")\n }\n\n // ------------ chequea si tenemos color del texto del boton de validacion -----------------\n if (flow.get(\"botonsalida_txt_color\") != undefined) {\n msg_display.botonvalidacion_foreground = flow.get(\"botonsalida_txt_color\")\n }\n else {\n msg_display.botonvalidacion_foreground = flow.get(\"botonsalida_txt_color_def\")\n }\n\n // ------------ chequea si tenemos texto del boton de validacion -----------------\n if (flow.get(\"botonsalida_txt\") != undefined) {\n msg_display.button3 = flow.get(\"botonsalida_txt\")\n }\n else {\n msg_display.button3 = flow.get(\"botonsalida_txt_def\")\n }\n\n // ------------ chequea si tenemos texto del mensaje antes del boton de validacion ----------------- \n if (flow.get(\"botonsalida_mensaje1\") != undefined) {\n msg_display.men_m1 = flow.get(\"botonsalida_mensaje1\")\n }\n else {\n msg_display.men_m1 = flow.get(\"botonsalida_mensaje1_def\")\n }\n\n\n }\n\n}\n\n// ==================================================================================================================\nnode.send([msg_display, null, null, null])\n\n// ****************gestion del relay del semaforo****************\nif (flow.get(\"semaforo\") == \"green\") {\n node.send([null, null, { \"payload\": 1 }, null]);\n}\nelse {\n node.send([null, null, { \"payload\": 0 }, null]);\n}\n//*****************************************************************\n\nreturn;", + "func": "// Este nodo realiza todos los envios de mensajes a los diferentes destinos: websocket, pantalla, relay\n\nif ((msg.id_topic == \"rfid\" || msg.id_topic == \"QR\") && flow.get(\"totem_master\")) { // si el mensaje proviene del lector de ID\n\n if (flow.get(\"RFID_ok_flag\") || flow.get(\"QR_ok_flag\")) {\n if(flow.get(\"QR_verificado\") || flow.get(\"RFID_verificado)\")){\n flow.set(\"window_id_m4\", flow.get(\"id_leido\"));\n flow.set(\"window_men_m3\", \"\")\n }\n //flow.set(\"QR_ok_flag\", false)\n //flow.set(\"RFID_ok_flag\", false)\n if (flow.get(\"peso_bajo_flag\")) {\n // para el caso cuando queremos enviar tarjetas para asignar usuario en la base de datos\n //flow.set(\"window_id_m4\", flow.get(\"id_tarjeta\"));\n msg = {};\n setTimeout(function () {\n //node.warn(\"erase window\")\n //flow.set(\"QR_ok_flag\", false)\n //flow.set(\"RFID_ok_flag\", false)\n flow.set(\"window_id_m4\", \"\");\n // ================================== configura mensaje para las ventanas de la pantalla ===========================\n var msg_display = { \"id_m1\": \"\", \"id_m2\": \"\", \"id_m3\": \"\", \"id_m4\": \"\", \"men_m1\": \"\", \"men_m2\": \"\", \"men_m3\": \"\", \"peso\": \"\" };\n msg_display.id_m1 = flow.get(\"id_titulo_matricula\");\n msg_display.id_m2 = flow.get(\"matricula\");\n msg_display.id_m3 = flow.get(\"id_titulo_id\");\n msg_display.id_m4 = flow.get(\"window_id_m4\");\n\n msg_display.men_m1 = flow.get(\"window_men_m1\");\n msg_display.men_m2 = flow.get(\"window_men_m2\");\n msg_display.men_m3 = flow.get(\"window_men_m3\");\n\n msg_display.peso = flow.get(\"peso\");\n //asignamos el valor real del color del semaforo, este valor se define en el archivo de configuración\n if (flow.get(\"semaforo\") == \"green\") {\n msg_display.semaforo = flow.get(\"semaforo_green_color\")\n }\n else {\n msg_display.semaforo = flow.get(\"semaforo_red_color\")\n }\n\n\n // ==================================================================================================================\n node.send([msg_display, null, null, null])\n }, 3000)\n }\n\n\n }\n else {\n if (flow.get(\"vehiculo_presente_flag\")) {\n flow.set(\"window_id_m4\", flow.get(\"id_no_leido\"));\n }\n else {\n\n }\n\n\n }\n}\n//============================================== Chequea si Fin de Pesada y Saca Mensaje ===========================================\nif (flow.get(\"fin_pesada_flag\") && flow.get(\"totem_master\")) {\n setTimeout(() => {\n node.send([null, null, null, { payload: \"fin_pesada\" }]) // salida de audio de FIN DE PESADA <----\n }, 500);\n flow.set(\"fin_pesada_flag\", false) // evitamos que en esta pesada vuelva a entrar aqui nuevamente\n flow.set(\"semaforo\", \"green\")\n // sacar comando para barrera si esta se encuentra habilitada\n node.send([null, { payload: 1 }, null, null])\n if (flow.get(\"barrera_habilitada\")) {\n setTimeout(function () {\n node.send([null, { payload: 0 }, null, null])\n }, flow.get(\"relay2_pulse\"));\n }\n //flow.set(\"peso_estable_flag\", false)\n flow.set(\"botonsalida\", false)\n //coloca los mensajes para mostrar en pantalla \n flow.set(\"window_men_m1\", flow.get(\"men_pesaje_listo\"));\n flow.set(\"window_men_m2\", flow.get(\"men_salida\"));\n flow.set(\"window_men_m3\", \"\");\n}\n//===================================================================================================================== \n\n\n// ================================== configura mensaje para las ventanas de la pantalla ===========================\nvar msg_display = { \"id_m1\": \"\", \"id_m2\": \"\", \"id_m3\": \"\", \"id_m4\": \"\", \"men_m1\": \"\", \"men_m2\": \"\", \"men_m3\": \"\", \"peso\": \"\" };\nmsg_display.id_m1 = flow.get(\"id_titulo_matricula\");\nmsg_display.id_m2 = flow.get(\"matricula\");\nmsg_display.id_m3 = flow.get(\"id_titulo_id\");\nmsg_display.id_m4 = flow.get(\"window_id_m4\");\n\nmsg_display.men_m1 = flow.get(\"window_men_m1\");\nmsg_display.men_m2 = flow.get(\"window_men_m2\");\nmsg_display.men_m3 = flow.get(\"window_men_m3\");\n\nmsg_display.peso = flow.get(\"peso\");\n//asignamos el valor real del color del semaforo, este valor se define en el archivo de configuración\nmsg_display.semaforo = flow.get(\"semaforo\");\nif (flow.get(\"semaforo\") == \"green\") {\n msg_display.semaforo = flow.get(\"semaforo_green_color\")\n}\nelse {\n msg_display.semaforo = flow.get(\"semaforo_red_color\")\n}\nmsg_display.titulo_matricula_color = flow.get(\"titulo_matricula_color\") // color del texto del titulo de Matricula y del ID. Definido en el archivo de configuracion\nmsg_display.valor_matricula_color = flow.get(\"valor_matricula_color\") // color del texto del valor de la Matricula y del ID. Definido en el archivo de configuracion\nmsg_display.men_m1_color = \"#cc0000\" // color del mensaje de \"peso estable\" en la ventana W2\nmsg_display.men_m2_color = \"#6B3C01\" // color del mensaje de \"puede mover el vehiculo\" en la ventana W2\nmsg_display.men_m3_color = \"#386B01\" // color del mensaje de \"acerque tarjeta de ID\" en la ventana W2\n\n//============================Procesamiento botones en pantalla ======================================================\nif (flow.get(\"totem_master\")) {\n if (flow.get(\"startmenu_flag\")) { // check si tenemos que poner boton de solicitud de primer menu\n if (flow.get(\"button\") != undefined) {\n msg_display.button = flow.get(\"button\")\n }\n else {\n msg_display.button = \"button1\"\n }\n if (flow.get(\"button1\") != undefined) {\n msg_display.button1 = flow.get(\"button1\")\n }\n else {\n msg_display.button1 = \"COMPLETAR INFO.\"\n }\n if (flow.get(\"button2\") != undefined) {\n msg_display.button2 = flow.get(\"button2\")\n }\n else {\n msg_display.button2 = \"OK.\"\n }\n if (flow.get(\"men_linea1\") != undefined) {\n msg_display.men_m1 = flow.get(\"men_linea1\")\n }\n else {\n msg_display.men_m1 = \"Haga CLICK ABAJO\"\n }\n if (flow.get(\"men_linea2\") != undefined) {\n msg_display.men_m2 = flow.get(\"men_linea2\")\n }\n else {\n msg_display.men_m2 = \"\"\n }\n\n msg_display.men_m1_color = flow.get(\"men_linea1_color\")\n msg_display.men_m2_color = flow.get(\"men_linea2_color\")\n //flow.set(\"startmenu_flag\", false) // boton de solicitud de primer menu ejecutado\n // Este flag \"startmenu_flag\" debe ser puesto a false luego de haber sacado el menu o pasado la tarjeta\n // ya que si se pone a false antes de tocar el boton y viene otro valor de peso el boton desaparece de la pantalla\n }\n else {\n msg_display.button = \"message\"\n }\n // ==================================================================================================================\n\n //------------------------------ BOTON de VALIDACION ----------------------------------------------------------------\n if (flow.get(\"botonsalida\")) { // check si tenemos que poner boton de validacion a la salida. Si movimiento final siempre lo ponemos\n\n msg_display.button = \"button3\" // hace display de un boton de validacion\n\n // ------------ chequea si tenemos color del background del boton de validacion ---------------\n if (flow.get(\"botonsalida_color\") != undefined) {\n msg_display.botonvalidacion_background = flow.get(\"botonsalida_color\")\n }\n else {\n msg_display.botonvalidacion_background = flow.get(\"botonsalida_color_def\")\n }\n\n // ------------ chequea si tenemos color del texto del boton de validacion -----------------\n if (flow.get(\"botonsalida_txt_color\") != undefined) {\n msg_display.botonvalidacion_foreground = flow.get(\"botonsalida_txt_color\")\n }\n else {\n msg_display.botonvalidacion_foreground = flow.get(\"botonsalida_txt_color_def\")\n }\n\n // ------------ chequea si tenemos texto del boton de validacion -----------------\n if (flow.get(\"botonsalida_txt\") != undefined) {\n msg_display.button3 = flow.get(\"botonsalida_txt\")\n }\n else {\n msg_display.button3 = flow.get(\"botonsalida_txt_def\")\n }\n\n // ------------ chequea si tenemos texto del mensaje antes del boton de validacion ----------------- \n if (flow.get(\"botonsalida_mensaje1\") != undefined) {\n msg_display.men_m1 = flow.get(\"botonsalida_mensaje1\")\n }\n else {\n msg_display.men_m1 = flow.get(\"botonsalida_mensaje1_def\")\n }\n\n\n }\n\n}\n\n// ==================================================================================================================\nnode.send([msg_display, null, null, null])\n\n// ****************gestion del relay del semaforo****************\nif (flow.get(\"semaforo\") == \"green\") {\n node.send([null, null, { \"payload\": 1 }, null]);\n}\nelse {\n node.send([null, null, { \"payload\": 0 }, null]);\n}\n//*****************************************************************\n\nreturn;", "outputs": 4, "timeout": "", "noerr": 0, @@ -3606,7 +3608,8 @@ "e8d66667ae2598db", "22fabd2601b01d02", "55be72af5b5206e5", - "5d188f7a3a6eaa62" + "5d188f7a3a6eaa62", + "185e340354acf892" ], "x": 705, "y": 1120, @@ -4177,7 +4180,7 @@ "z": "953e8740401d175c", "g": "646bdfb9988a1708", "name": "Peso", - "func": "let peso = flow.get(\"peso\") || 0;\nconst peso_minimo = flow.get(\"peso_minimo\");\nlet peso_estable = flow.get(\"peso_estable\");\nlet semaforo = flow.get(\"semaforo\");\n\nif (peso < peso_minimo) {\n // evento de bascula OFF para cuando el totem no dispone de sensor remoto\n /* eliminamos este trigger para el evento de la bascula\n if (peso < (peso_minimo * 0.8) && flow.get(\"peso_trigger_ON\")) {// consideramos una histeresis\n flow.set(\"peso_trigger_ON\", false) // marcamos que el trigger ON esta en FALSE para proxima activacion de la bascula\n node.send([null, null, null, { payload: 1, topic: \"peso_OFF\" }, null, null, null, null])\n }\n */\n //============================================ AQUI SE HACE EL REGISTRO DEL MOVIMIENTO EN BD ===============================\n if(!flow.get(\"peso_bajo_flag\")){ // Se cumple solo una vez al vaciar la bascula\n /* if (flow.get(\"movimiento_registrado_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && (flow.get(\"tipo_movimiento\") != \"nodefinido\")){ \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 //**************************************************************************************************************************\n\n node.send([null, null, null, { payload: 1, topic: \"peso_OFF\" }, null, null, null, msg_mov]) // envio del registro a BD y a la API y envio de evento bascula OFF\n\n flow.set(\"registro\", \"\") // inicializamos el registro para evitar cualquier posible duplicado en bd\n\n }\n */\n flow.set(\"matricula_image\", \"\") // inicializamos imagen del vehiculo\n flow.set(\"plate_sent\", false)\n flow.set(\"matricula_revisada\", false)\n flow.set(\"matricula_autorizada\", false)\n flow.set(\"last_firma\", \"\") // inicializamos imagen de la firma\n flow.set(\"identificacion_pendiente\", false) // estas cuatro lineas son relativas a la identificacion especial para cuando no se puede leer la matricula\n flow.set(\"identificacion_esp_aplicada\", false) // indica que la matricula no fue bien leida y se aplico el parametro de identificacion especial\n flow.set(\"QR_revisado\", false)\n flow.set(\"RFID_revisado\", false)\n flow.set(\"QR_verificado\", false)\n flow.set(\"RFID_verificado\", false)\n flow.set(\"peso_bajo_flag\", true)\n flow.set(\"matricula_leida_flag\", false)\n flow.set(\"matricula_formato_flag\", false)\n flow.set(\"snapshot_rq_flag\", false)\n flow.set(\"lista_array\", [])\n flow.set(\"menu0\", [])\n flow.set(\"menu1\", [])\n flow.set(\"menu2\", [])\n flow.set(\"menu_seleccionado_flag\", false)// indicador de que el usuario termino la seleccion en el menu y se envio\n flow.set(\"id_seleccionado\", \"no recibido\")\n flow.set(\"startmenu_flag\", false) // reset del flag que permite mostrar el boton (\"completar informacion\") de acceso al menu de materiales\n flow.set(\"editor_matricula_ok\", false) // se activa cuando el usuario hace clik en OK para ir a editar la matricula\n flow.set(\"badplate_llamado\", false) // se activa cuando se saca por primera vez la notificacion para EDITRA MATRICULA en la siguiente pantalla\n flow.set(\"nota_modifique_matricula_done\", false) // nota al usuario cuando hay que modificar matricula no registrada\n flow.set(\"nota_vuelva_intentar_done\", false) // nota al usuario despues de corregir la matricula en caso de error\n flow.set(\"nota_avise_basculista_done\", false) // nota al usuario de aviso al basculista\n flow.set(\"nota_resumen_mostrada\", false) // indica que la nota de resumen luego de presentar identificacion ya se mostro (nodo QR / RFID)\n flow.set(\"totem_master\", false) // flag para NO declarar peso estable si lo encontramos en false (ver nodo \"detector rx\") y para no enviar movimientos a Base de datos ni a servidor\n flow.set(\"matricula\", \"Sin Matricula\")\n flow.set(\"nombre_imagen\", \"sin-nombre-de-imagen\")\n flow.set(\"badplate\", false)\n flow.set(\"semaforoabierto\", true) // flag para gestion del semaforo desde websocket\n //Atributos del vehiculo, leidos de la BD al momento de revisar si la matricula existe en BD\n flow.set(\"pma\", 0)\n flow.set(\"tara\", 0)\n flow.set(\"tipo_movimiento\", \"nodefinido\")\n flow.set(\"register\", {})\n flow.set(\"movimiento_enviado\", false)\n \n if (flow.get(\"switch_2_Totem_page\")) { //En caso que este flag haya sido habilitado en configuracion \n //eliminamos cualquier posible ventana de notificacion que haya quedado abierta y cambiamos a la ventana principal de Totem en caso de haber quedado otra ventana abierta\n \n node.send([null, null, null, null, null, { payload: \"\" }, { \"payload\": { \"tab\": \"Totem\" } }, null]);\n }\n else {\n //eliminamos cualquier posible ventana de notificacion que haya quedado abierta\n node.send([null, null, null, null, null, { payload: \"\" }, null, null]);\n }\n }\n //==========================================================================================================================\n flow.set(\"peso_estable_flag\", false)\n flow.set(\"peso_estable_audio_flag\", true)\n flow.set(\"peso_estable\", 0)\n flow.set(\"fin_pesada_flag\", false)\n //flow.set(\"totem_master\", false) // flag para NO declarar peso estable si lo encontramos en false (ver nodo \"detector rx\") y para no enviar movimientos a Base de datos ni a servidor\n if (flow.get(\"totem_qty\") == 1) { flow.set(\"totem_master\", true) } // en el caso de un solo totem. Este dispositivo siempre sera el master\n flow.set(\"firma_activa\", false)\n flow.set(\"QR_ok_flag\", false);\n flow.set(\"RFID_ok_flag\", false);\n flow.set(\"last_QR\", \"-\")\n flow.set(\"last_RFID\", \"-\")\n flow.set(\"botonsalida\", false)\n flow.set(\"vehiculo_en_posicion\", false)\n flow.set(\"salida_valida_flag\", false)\n flow.set(\"distance_flag_SET\", false)\n flow.set(\"aviso_pma_hecho\", false) // reset del flag indicador de PMA\n //flow.set(\"matricula_leida_flag\", false)\n //flow.set(\"matricula_formato_flag\", false)\n flow.set(\"matricula_ok_flag\", false)\n flow.set(\"matricula_editada_flag\", false)\n //flow.set(\"matricula\", \"Sin Matricula\")\n //flow.set(\"snapshot_rq_flag\", false)\n //flow.set(\"nombre_imagen\", \"sin-nombre-de-imagen\")\n //flow.set(\"badplate\", false)\n flow.set(\"firma_ok_flag\", false)\n flow.set(\"movimiento_registrado_flag\", false)\n if (flow.get((\"semaforoabierto\"))){ // si el semaforo ha sido manipulado desde websocket entonces no lo tocamos\n flow.set(\"semaforo\", \"green\")\n }\n flow.set(\"window_men_m1\", \"\"); // borra posibles mensajes en pantalla \n flow.set(\"window_men_m2\", \"\"); \n flow.set(\"window_men_m3\", \"\");\n flow.set(\"window_id_m4\", \"\");\n flow.set(\"window_id_m2\", \"\");\n \n \n}\nelse {// ************************ peso > pmin *****************************************\n if (flow.get(\"peso_bajo_flag\")) {\n flow.set(\"peso_min_time\", new Date().getTime()) // marca momento en que se detecta peso > peso min\n //node.warn(\"peso_min_time = \" + flow.get(\"peso_min_time\"))\n flow.set(\"horaentrada\", new Date(flow.get(\"peso_min_time\")).toLocaleString()) // Convierte a formato legible\n // evento de bascula ON para cuando hay un solo Totem en la bascula (sin sensor remoto)\n /*\n if (flow.get(\"peso_trigger_ON\") == false) {\n flow.set(\"peso_trigger_ON\", true) // \n node.send([null, null, null, { payload: 1, topic: \"peso_ON\" }, null, null, null, null])\n }\n */\n node.send([null, null, null, { payload: 1, topic: \"peso_ON\" }, null, null, null, null]) // sacamos evento de bascula ON cuando no hay sensor remoto\n //flow.set(\"matricula_leida_flag\", false)\n //flow.set(\"matricula_formato_flag\", false)\n flow.set(\"matricula_ok_flag\", false)\n flow.set(\"badplate\", false) // inicializamos flag en caso que haya sido enviado cuando peso < pmin \n flow.set(\"vehiculo_presente_flag\", true);\n flow.set(\"ID_enviado\", false) // activamos flag para envio de un unico RFID / QR con peso > pmin\n flow.set(\"esperando_id\", true)\n flow.set(\"peso_bajo_flag\", false);\n\n flow.set(\"semaforo\", \"red\")\n node.send([{ payload: 1 }, null, null, null, null, null, null, null]) // generamos un nuevo UUID\n setTimeout(function () {\n let new_register = {\n uuid: flow.get(\"new_uuid\"),\n horaentrada: flow.get(\"horaentrada\"),\n vial: flow.get(\"numero_vial\"),\n totem: flow.get(\"totem_id\"),\n sincro: false,\n modo: flow.get(\"modo_totem\"),\n identificacion_esp: flow.get(\"identificacion_esp\"),\n firmaobligatoria: flow.get(\"firma_obligatoria\"),\n id_seleccionado: \"no recibido\",\n nombre_firma: \"No Habilitada\",\n QR: \"-\",\n RFID: \"-\",\n matricula: \"Sin Matricula\",\n nombre_imagen: \"Sin Matricula\",\n sentido: \"No conocido\"\n }\n flow.set(\"register\", new_register)\n }, 1000)\n\n if (flow.get(\"switch_2_Totem_page\")) { // si ha sido habilitado cambiamos a la ventana principal de Totem en caso de haber quedado otra ventana abierta\n node.send([null, null, null, null, null, null, { \"payload\": { \"tab\": \"Totem\" } }, null]);\n }\n \n if ((flow.get(\"modo_totem\") == \"C\" || flow.get(\"modo_totem\") == \"D\" ) && !flow.get(\"supervisor\")){\n if(flow.get(\"botonsalida_activo\")){\n flow.set(\"botonsalida\", true)\n }\n }\n }\n if (flow.get(\"peso_estable_flag\")) {\n flow.set(\"peso\", flow.get(\"peso_estable\"));\n } \n\n \n //-------------------------------procesamiento de la lista de materiales-----------------------------------------------------\n //if (flow.get(\"lista_flag\") && flow.get(\"supervisor\")) {\n if (flow.get(\"lista_flag\")) {\n flow.set(\"lista_flag\", false) // evita otra entrada a esta secuencia para esta misma lista\n var lista = flow.get(\"lista_array\") // lista con todos los materiales y niveles juntos\n const lista_size = flow.get(\"lista_array\").length\n let j = 0; let k = 0; let i = 0; let maxlevel = 0;\n for (i = 0; i < lista_size; i++) { // calculamos el nivel maximo que tiene esta lista de menu\n if (parseInt(lista[i].nivel) > maxlevel) {\n maxlevel = parseInt(lista[i].nivel)\n }\n }\n flow.set(\"maxlevel\", maxlevel + 1) // guardamos el maximo nivel de menu identificado en la lista\n flow.set(\"selections\", \"\") //inicializamos con ninguna seleccion\n if (flow.get(\"menu_inicio\")) {\n flow.set(\"startmenu_flag\", true)\n }\n\n }\n\n //----------------------------------- FIN Lista de Materiales -----------------------------------------------------------------------\n}\n\nreturn ([null, null, null, null, msg, null, null, null]);\n", + "func": "let peso = flow.get(\"peso\") || 0;\nconst peso_minimo = flow.get(\"peso_minimo\");\nlet peso_estable = flow.get(\"peso_estable\");\nlet semaforo = flow.get(\"semaforo\");\n\nif (peso < peso_minimo) {\n // evento de bascula OFF para cuando el totem no dispone de sensor remoto\n /* eliminamos este trigger para el evento de la bascula\n if (peso < (peso_minimo * 0.8) && flow.get(\"peso_trigger_ON\")) {// consideramos una histeresis\n flow.set(\"peso_trigger_ON\", false) // marcamos que el trigger ON esta en FALSE para proxima activacion de la bascula\n node.send([null, null, null, { payload: 1, topic: \"peso_OFF\" }, null, null, null, null])\n }\n */\n //============================================ AQUI SE HACE EL REGISTRO DEL MOVIMIENTO EN BD ===============================\n if(!flow.get(\"peso_bajo_flag\")){ // Se cumple solo una vez al vaciar la bascula\n /* if (flow.get(\"movimiento_registrado_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && (flow.get(\"tipo_movimiento\") != \"nodefinido\")){ \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 //**************************************************************************************************************************\n\n node.send([null, null, null, { payload: 1, topic: \"peso_OFF\" }, null, null, null, msg_mov]) // envio del registro a BD y a la API y envio de evento bascula OFF\n\n flow.set(\"registro\", \"\") // inicializamos el registro para evitar cualquier posible duplicado en bd\n\n }\n */\n flow.set(\"matricula_image\", \"\") // inicializamos imagen del vehiculo\n flow.set(\"plate_sent\", false)\n flow.set(\"matricula_revisada\", false)\n flow.set(\"matricula_autorizada\", false)\n flow.set(\"last_firma\", \"\") // inicializamos imagen de la firma\n flow.set(\"identificacion_pendiente\", false) // estas cuatro lineas son relativas a la identificacion especial para cuando no se puede leer la matricula\n flow.set(\"identificacion_esp_aplicada\", false) // indica que la matricula no fue bien leida y se aplico el parametro de identificacion especial\n flow.set(\"QR_revisado\", false)\n flow.set(\"RFID_revisado\", false)\n flow.set(\"QR_verificado\", false)\n flow.set(\"RFID_verificado\", false)\n flow.set(\"peso_bajo_flag\", true)\n flow.set(\"matricula_leida_flag\", false)\n flow.set(\"matricula_formato_flag\", false)\n flow.set(\"snapshot_rq_flag\", false)\n flow.set(\"lista_array\", [])\n flow.set(\"menu0\", [])\n flow.set(\"menu1\", [])\n flow.set(\"menu2\", [])\n flow.set(\"menu_seleccionado_flag\", false)// indicador de que el usuario termino la seleccion en el menu y se envio\n flow.set(\"id_seleccionado\", \"no recibido\")\n flow.set(\"startmenu_flag\", false) // reset del flag que permite mostrar el boton (\"completar informacion\") de acceso al menu de materiales\n flow.set(\"editor_matricula_ok\", false) // se activa cuando el usuario hace clik en OK para ir a editar la matricula\n flow.set(\"badplate_llamado\", false) // se activa cuando se saca por primera vez la notificacion para EDITRA MATRICULA en la siguiente pantalla\n flow.set(\"nota_modifique_matricula_done\", false) // nota al usuario cuando hay que modificar matricula no registrada\n flow.set(\"nota_vuelva_intentar_done\", false) // nota al usuario despues de corregir la matricula en caso de error\n flow.set(\"nota_avise_basculista_done\", false) // nota al usuario de aviso al basculista\n flow.set(\"nota_resumen_mostrada\", false) // indica que la nota de resumen luego de presentar identificacion ya se mostro (nodo QR / RFID)\n flow.set(\"totem_master\", false) // flag para NO declarar peso estable si lo encontramos en false (ver nodo \"detector rx\") y para no enviar movimientos a Base de datos ni a servidor\n flow.set(\"matricula\", \"Sin Matricula\")\n flow.set(\"nombre_imagen\", \"sin-nombre-de-imagen\")\n flow.set(\"badplate\", false)\n flow.set(\"semaforoabierto\", true) // flag para gestion del semaforo desde websocket\n //Atributos del vehiculo, leidos de la BD al momento de revisar si la matricula existe en BD\n flow.set(\"pma\", 0)\n flow.set(\"tara\", 0)\n flow.set(\"tipo_movimiento\", \"nodefinido\")\n flow.set(\"register\", {})\n flow.set(\"movimiento_enviado\", false)\n flow.set(\"matriculacheck_solicitada\", false) // flag utilizado para no repetir el envio de la revision de matricula en el nodo Matricula\n \n if (flow.get(\"switch_2_Totem_page\")) { //En caso que este flag haya sido habilitado en configuracion \n //eliminamos cualquier posible ventana de notificacion que haya quedado abierta y cambiamos a la ventana principal de Totem en caso de haber quedado otra ventana abierta\n \n node.send([null, null, null, null, null, { payload: \"\" }, { \"payload\": { \"tab\": \"Totem\" } }, null]);\n }\n else {\n //eliminamos cualquier posible ventana de notificacion que haya quedado abierta\n node.send([null, null, null, null, null, { payload: \"\" }, null, null]);\n }\n }\n //==========================================================================================================================\n flow.set(\"peso_estable_flag\", false)\n flow.set(\"peso_estable_audio_flag\", true)\n flow.set(\"peso_estable\", 0)\n flow.set(\"fin_pesada_flag\", false)\n //flow.set(\"totem_master\", false) // flag para NO declarar peso estable si lo encontramos en false (ver nodo \"detector rx\") y para no enviar movimientos a Base de datos ni a servidor\n if (flow.get(\"totem_qty\") == 1) { flow.set(\"totem_master\", true) } // en el caso de un solo totem. Este dispositivo siempre sera el master\n flow.set(\"firma_activa\", false)\n flow.set(\"QR_ok_flag\", false);\n flow.set(\"RFID_ok_flag\", false);\n flow.set(\"last_QR\", \"-\")\n flow.set(\"last_RFID\", \"-\")\n flow.set(\"botonsalida\", false)\n flow.set(\"vehiculo_en_posicion\", false)\n flow.set(\"salida_valida_flag\", false)\n flow.set(\"distance_flag_SET\", false)\n flow.set(\"aviso_pma_hecho\", false) // reset del flag indicador de PMA\n //flow.set(\"matricula_leida_flag\", false)\n //flow.set(\"matricula_formato_flag\", false)\n flow.set(\"matricula_ok_flag\", false)\n flow.set(\"matricula_editada_flag\", false)\n //flow.set(\"matricula\", \"Sin Matricula\")\n //flow.set(\"snapshot_rq_flag\", false)\n //flow.set(\"nombre_imagen\", \"sin-nombre-de-imagen\")\n //flow.set(\"badplate\", false)\n flow.set(\"firma_ok_flag\", false)\n flow.set(\"movimiento_registrado_flag\", false)\n if (flow.get((\"semaforoabierto\"))){ // si el semaforo ha sido manipulado desde websocket entonces no lo tocamos\n flow.set(\"semaforo\", \"green\")\n }\n flow.set(\"window_men_m1\", \"\"); // borra posibles mensajes en pantalla \n flow.set(\"window_men_m2\", \"\"); \n flow.set(\"window_men_m3\", \"\");\n flow.set(\"window_id_m4\", \"\");\n flow.set(\"window_id_m2\", \"\");\n \n \n}\nelse {// ************************ peso > pmin *****************************************\n if (flow.get(\"peso_bajo_flag\")) {\n flow.set(\"peso_min_time\", new Date().getTime()) // marca momento en que se detecta peso > peso min\n //node.warn(\"peso_min_time = \" + flow.get(\"peso_min_time\"))\n flow.set(\"horaentrada\", new Date(flow.get(\"peso_min_time\")).toLocaleString()) // Convierte a formato legible\n // evento de bascula ON para cuando hay un solo Totem en la bascula (sin sensor remoto)\n /*\n if (flow.get(\"peso_trigger_ON\") == false) {\n flow.set(\"peso_trigger_ON\", true) // \n node.send([null, null, null, { payload: 1, topic: \"peso_ON\" }, null, null, null, null])\n }\n */\n node.send([null, null, null, { payload: 1, topic: \"peso_ON\" }, null, null, null, null]) // sacamos evento de bascula ON cuando no hay sensor remoto\n //flow.set(\"matricula_leida_flag\", false)\n //flow.set(\"matricula_formato_flag\", false)\n flow.set(\"matricula_ok_flag\", false)\n flow.set(\"badplate\", false) // inicializamos flag en caso que haya sido enviado cuando peso < pmin \n flow.set(\"vehiculo_presente_flag\", true);\n flow.set(\"ID_enviado\", false) // activamos flag para envio de un unico RFID / QR con peso > pmin\n flow.set(\"esperando_id\", true)\n flow.set(\"peso_bajo_flag\", false);\n\n flow.set(\"semaforo\", \"red\")\n node.send([{ payload: 1 }, null, null, null, null, null, null, null]) // generamos un nuevo UUID\n setTimeout(function () {\n let new_register = {\n uuid: flow.get(\"new_uuid\"),\n horaentrada: flow.get(\"horaentrada\"),\n vial: flow.get(\"numero_vial\"),\n totem: flow.get(\"totem_id\"),\n sincro: false,\n modo: flow.get(\"modo_totem\"),\n firmaobligatoria: flow.get(\"firma_obligatoria\"),\n id_seleccionado: \"no recibido\",\n nombre_firma: \"No Habilitada\",\n QR: \"-\",\n RFID: \"-\",\n matricula: \"Sin Matricula\",\n nombre_imagen: \"Sin Matricula\",\n sentido: \"No conocido\"\n }\n flow.set(\"register\", new_register)\n }, 1000)\n\n if (flow.get(\"switch_2_Totem_page\")) { // si ha sido habilitado cambiamos a la ventana principal de Totem en caso de haber quedado otra ventana abierta\n node.send([null, null, null, null, null, null, { \"payload\": { \"tab\": \"Totem\" } }, null]);\n }\n \n if ((flow.get(\"modo_totem\") == \"C\" || flow.get(\"modo_totem\") == \"D\" ) && !flow.get(\"supervisor\")){\n if(flow.get(\"botonsalida_activo\")){\n flow.set(\"botonsalida\", true)\n }\n }\n }\n if (flow.get(\"peso_estable_flag\")) {\n flow.set(\"peso\", flow.get(\"peso_estable\"));\n } \n\n \n //-------------------------------procesamiento de la lista de materiales-----------------------------------------------------\n //if (flow.get(\"lista_flag\") && flow.get(\"supervisor\")) {\n if (flow.get(\"lista_flag\")) {\n flow.set(\"lista_flag\", false) // evita otra entrada a esta secuencia para esta misma lista\n var lista = flow.get(\"lista_array\") // lista con todos los materiales y niveles juntos\n const lista_size = flow.get(\"lista_array\").length\n let j = 0; let k = 0; let i = 0; let maxlevel = 0;\n for (i = 0; i < lista_size; i++) { // calculamos el nivel maximo que tiene esta lista de menu\n if (parseInt(lista[i].nivel) > maxlevel) {\n maxlevel = parseInt(lista[i].nivel)\n }\n }\n flow.set(\"maxlevel\", maxlevel + 1) // guardamos el maximo nivel de menu identificado en la lista\n flow.set(\"selections\", \"\") //inicializamos con ninguna seleccion\n if (flow.get(\"menu_inicio\")) {\n flow.set(\"startmenu_flag\", true)\n }\n\n }\n\n //----------------------------------- FIN Lista de Materiales -----------------------------------------------------------------------\n}\n\nreturn ([null, null, null, null, msg, null, null, null]);\n", "outputs": 7, "timeout": 0, "noerr": 0, @@ -4217,7 +4220,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 // 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 let boton_ok = !boton_obligatorio || boton_flag;\n let firma_ok = !firma_obligatoria || firma_flag;\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 }\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 //node.warn(\"todos obligatorios = \" + todos_obligatorios_ok)\n //node.warn(\"seleccion = \" + seleccion_ok + \" matricula = \" + matricula_ok + \" detector = \" + detector_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 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 = 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_ok_flag\") || flow.get(\"RFID_ok_flag\") || flow.get(\"salida_valida_flag\") || flow.get(\"peso_estable_flag\")) {\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)\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 let boton_ok = !boton_obligatorio || boton_flag;\n let firma_ok = !firma_obligatoria || firma_flag;\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 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 = 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])", "outputs": 4, "timeout": 0, "noerr": 0, @@ -4439,7 +4442,7 @@ "z": "953e8740401d175c", "g": "9328043d4e9512a9", "name": "estable", - "func": "//****************************************Chequeo de Peso Estable ********************************************\n// El peso estable es el peso leido en cualquier de los siguientes momentos:\n// 1. Al Recibir un QR o RFID\n// 2. Cuando el Detector de presencia en el Totem es ON (distance_flag_SET)\n// 3. Cuando se activa el Boton de Validacion (salida_valida_flag true)\n// 4. Cuando el usuario envia la seleccion del menu en caso de que este habilitado (menu_seleccionado_flag)\n// 5. Cuando el usuario acepta el editor de matricula\n\nif (((flow.get(\"distance_flag_SET\") || flow.get(\"QR_ok_flag\") || flow.get(\"RFID_ok_flag\") || flow.get(\"salida_valida_flag\") || flow.get(\"vehiculo_en_posicion\")) || flow.get(\"editor_matricula_ok\")) && !flow.get(\"peso_bajo_flag\") && !flow.get(\"peso_estable_flag\") && flow.get(\"totem_master\") && !flow.get(\"supervisor\") ) {//aseguramos se hace una sola vez durante la pesada\n flow.set(\"peso_estable\", flow.get(\"peso\"))\n node.warn(\"peso = \" + flow.get(\"peso_estable\") + \" pma = \" + flow.get(\"pma\") + \"pma - peso = \" + (flow.get(\"pma\") - flow.get(\"peso_estable\")))\n // chequeamos si el peso del vehiculo es inferior al Peso Maximo Autorizado (PMA)\n if (!flow.get(\"peso_estable_flag\")) { // solo emitimos audio y mensaje una sola vez durante la misma pesada\n flow.set(\"peso_estable_flag\", true)\n node.send([{ payload: \"peso_estable\" }, null]) // activa audio de peso estable\n flow.set(\"window_men_m1\", flow.get(\"men_peso_estable\")); //se envia mensaje de Peso estable en pantalla\n }\n if ((flow.get(\"pma\") > 0 && (flow.get(\"pma\") - flow.get(\"peso_estable\")) >= 0)) {\n // tenemos que sacar aviso respecto al peso maximo y detener el proceso\n node.warn(\"sacamos aviso\" + \" aviso_pma_hecho = \" + flow.get(\"aviso_pma_hecho\"))\n if (!flow.get(\"aviso_pma_hecho\")) {\n node.send([null, null, { payload: \"

PESO EXCEDIDO

SALGA DE LA BASCULA

\" }])\n flow.set(\"aviso_pma_hecho\", true) // hacemos el aviso una sola vez en la pesada\n }\n }\n else{\n \n }\n \n}\nelse if (flow.get(\"supervisor\") && flow.get(\"peso_estable_flag\") && flow.get(\"peso_estable_audio_flag\")){\n flow.set(\"window_men_m1\", flow.get(\"men_peso_estable\")); //se envia mensaje de Peso estable en pantalla\n flow.set(\"peso_estable_audio_flag\", false)\n node.send([{ payload: \"peso_estable\" }, null]) // activa audio de peso estable\n}\n //*************************************************************************************************************\n\nreturn ([null, msg]);", + "func": "//****************************************Chequeo de Peso Estable ********************************************\n// El peso estable es el peso leido en cualquier de los siguientes momentos:\n// 1. Al Recibir un QR o RFID\n// 2. Cuando el Detector de presencia en el Totem es ON (distance_flag_SET)\n// 3. Cuando se activa el Boton de Validacion (salida_valida_flag true)\n// 4. Cuando el usuario envia la seleccion del menu en caso de que este habilitado (menu_seleccionado_flag)\n// 5. Cuando el usuario acepta el editor de matricula\n\nif (((flow.get(\"distance_flag_SET\") || flow.get(\"QR_ok_flag\") || flow.get(\"RFID_ok_flag\") || flow.get(\"salida_valida_flag\") || flow.get(\"vehiculo_en_posicion\")) || flow.get(\"editor_matricula_ok\")) && !flow.get(\"peso_bajo_flag\") && !flow.get(\"peso_estable_flag\") && flow.get(\"totem_master\") && !flow.get(\"supervisor\") ) {//aseguramos se hace una sola vez durante la pesada\n flow.set(\"peso_estable\", flow.get(\"peso\"))\n //node.warn(\"peso = \" + flow.get(\"peso_estable\") + \" pma = \" + flow.get(\"pma\") + \"pma - peso = \" + (flow.get(\"pma\") - flow.get(\"peso_estable\")))\n // chequeamos si el peso del vehiculo es inferior al Peso Maximo Autorizado (PMA)\n if (!flow.get(\"peso_estable_flag\")) { // solo emitimos audio y mensaje una sola vez durante la misma pesada\n flow.set(\"peso_estable_flag\", true)\n node.send([{ payload: \"peso_estable\" }, null]) // activa audio de peso estable\n flow.set(\"window_men_m1\", flow.get(\"men_peso_estable\")); //se envia mensaje de Peso estable en pantalla\n }\n if ((flow.get(\"pma\") > 0 && (flow.get(\"pma\") - flow.get(\"peso_estable\")) >= 0)) {\n // tenemos que sacar aviso respecto al peso maximo y detener el proceso\n //node.warn(\"sacamos aviso\" + \" aviso_pma_hecho = \" + flow.get(\"aviso_pma_hecho\"))\n if (!flow.get(\"aviso_pma_hecho\")) {\n node.send([null, null, { payload: \"

PESO EXCEDIDO

SALGA DE LA BASCULA

\" }])\n flow.set(\"aviso_pma_hecho\", true) // hacemos el aviso una sola vez en la pesada\n }\n }\n else{\n \n }\n \n}\nelse if (flow.get(\"supervisor\") && flow.get(\"peso_estable_flag\") && flow.get(\"peso_estable_audio_flag\")){\n flow.set(\"window_men_m1\", flow.get(\"men_peso_estable\")); //se envia mensaje de Peso estable en pantalla\n flow.set(\"peso_estable_audio_flag\", false)\n node.send([{ payload: \"peso_estable\" }, null]) // activa audio de peso estable\n}\n //*************************************************************************************************************\n\nreturn ([null, msg]);", "outputs": 3, "timeout": 0, "noerr": 0, @@ -4510,7 +4513,7 @@ "z": "953e8740401d175c", "g": "9328043d4e9512a9", "name": "QR / RFID", - "func": "\n//if (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\") && !flow.get(\"supervisor\")) {\nif (!flow.get(\"nota_resumen_mostrada\") && !flow.get(\"supervisor\")) { \n // hay que chequear identificacion contra algun tipo de autenticacion \n if (flow.get(\"QR_ok_flag\")) {\n if (!flow.get(\"QR_revisado\")) {\n // Solicitamos revision del codigo QR en BD\n msg.payload.numero_vial = flow.get(\"numero_vial\")\n msg.payload.totem_id = flow.get(\"totem_id\")\n msg.payload.device = \"supervisor\"\n msg.payload.accion = \"qr/rfid\"\n msg.payload.tipo = \"qr\"\n msg.payload.id = flow.get(\"last_QR\")\n node.send([{ payload: \"\" }, null, msg]);\n \n }\n else {\n if (flow.get(\"QR_verificado\")) {\n flow.set(\"nota_resumen_mostrada\", true) // evita repeticion de la notificacion con el resumen\n flow.set(\"identificacion_pendiente\", false)\n let cliente = flow.get(\"cliente\") || \"Centro Desconocido\";\n let residuo = flow.get(\"residuo\") || \"Servicio Desconocido\";\n // Construir el mensaje en formato HTML\n //msg.payload = `

EL CODIGO QR PRESENTADO


VIENE DE: ${nombreCentro}
TRAE: ${servicio}`;\n msg.payload = `
\n
CODIGO QR OK
\n
VIENE DE: ${cliente}
\n
TRAE: ${residuo}
\n
\n `;\n \n \n msg.topic = \"QR_verificado\";\n //flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"startmenu_flag\", false) // Permite que el boton de solicitud de primer menu, en caso de estar en pantalla, se pueda eliminar\n node.send([msg, null, null])\n \n /*\n setTimeout(function () {\n node.send([{ payload: \"\" }, null, null]);\n }, 3000)\n */\n //Eliminamos la pantalla del editor y ponemos la pantalla principal del Totem\n if (flow.get(\"editor_matricula_ok\")) {\n node.send([null, null, null, { \"payload\": { \"tab\": \"Totem\" } }]);\n\n }\n }\n else{\n //aqui va una notificacion de QR no registrado y permitimos que se lea nuevamente la tarjeta\n flow.set(\"QR_revisado\", false)\n flow.set(\"ID_enviado\", false) // permitimos envio de otro ID. Este flag se utiliza en el nodo de \"envio QR / RFID\"\n node.send([{ payload: \"

EL QR NO ESTA REGISTRADO

UTILICE OTRO QR

\" }, null, null])\n }\n }\n }\n else if (flow.get(\"RFID_ok_flag\")) {\n if (!flow.get(\"RFID_revisado\")) {\n // Solicitamos revision del codigo de la tarjeta en BD\n msg.payload.numero_vial = flow.get(\"numero_vial\")\n msg.payload.totem_id = flow.get(\"totem_id\")\n msg.payload.device = \"supervisor\"\n msg.payload.accion = \"qr/rfid\"\n msg.payload.tipo = \"rfid\"\n msg.payload.id = flow.get(\"last_RFID\")\n node.send([{ payload: \"\" }, null, msg]);\n \n }\n else{\n if (flow.get(\"RFID_verificado\") && !flow.get(\"nota_resumen_mostrada\")) {\n flow.set(\"nota_resumen_mostrada\", true) //evita repeticion de la notificacion con el resumen\n flow.set(\"identificacion_pendiente\", false)\n let cliente = flow.get(\"cliente\") || \"Centro Desconocido\";\n let residuo = flow.get(\"residuo\") || \"Servicio Desconocido\";\n // Construir la notificacion en formato HTML\n //msg.payload = `

TARJETA OK

VIENE DE: ${nombreCentro}

TRAE: ${servicio}

`;\n msg.payload = `
\n
Tarjeta OK
\n
VIENE DE: ${cliente}
\n
TRAE: ${residuo}
\n
\n `;\n msg.topic = \"RFID_verificado\";\n //flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"startmenu_flag\", false) // Permite que el boton de solicitud de primer menu, en caso de estar en pantalla, se pueda eliminar\n node.send([msg, null, null])\n //node.warn(\"notificacion\")\n /*\n setTimeout(function () {\n node.send([{ payload: \"\" }, null, null]);\n }, 3000)\n */\n //Eliminamos la pantalla del editor y ponemos la pantalla principal del Totem\n if (flow.get(\"editor_matricula_ok\")) {\n node.send([null, null, null, { \"payload\": { \"tab\": \"Totem\" } }]);\n\n }\n }\n else{\n //aqui va una notificacion de tarjeta no registrada y permitimos que se lea nuevamente la tarjeta\n flow.set(\"RFID_revisado\", false)\n flow.set(\"ID_enviado\", false) // permitimos envio de otro ID\n node.send([{ payload: \"

LA TARJETA NO ESTA REGISTRADA

UTILICE OTRA TARJETA

\" }, null, null])\n }\n }\n }\n \n}\n/*\nif (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\") && !flow.get(\"supervisor\")){\n // hay que chequear identificacion contra algun tipo de autenticacion \n if(flow.get(\"QR_ok_flag\") && flow.get(\"last_QR\") == \"myQR is 12345678\"){\n flow.set(\"QR_verificado\", true)\n node.send({ payload: \"\" });\n }\n else if( flow.get(\"RFID_ok_flag\") && flow.get(\"last_RFID\") == 12345678){\n flow.set(\"RFID_verificado\", true)\n node.send({ payload: \"\" });\n }\n}\n*/\nelse if(flow.get(\"supervisor\")){\n msg = {}\n if(msg.id_topic == \"QR\" && flow.get(\"QR_ok_flag\")){\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), RFID: flow.get(\"last_QR\")}\n node.send([null, msg, null])\n }\n else if(msg.id_topic == \"rfid\" && flow.get(\"RFID_ok_flag\")){\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), RFID: flow.get(\"last_RFID\")}\n node.send([null, msg, null])\n }\n}\nreturn", + "func": "\n//if (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\") && !flow.get(\"supervisor\")) {\nif (!flow.get(\"nota_resumen_mostrada\") && !flow.get(\"supervisor\")) { \n // hay que chequear identificacion contra algun tipo de autenticacion \n if (flow.get(\"QR_ok_flag\")) {\n if (!flow.get(\"QR_revisado\")) {\n // Solicitamos revision del codigo QR en BD\n msg.payload.numero_vial = flow.get(\"numero_vial\")\n msg.payload.totem_id = flow.get(\"totem_id\")\n msg.payload.device = \"supervisor\"\n msg.payload.accion = \"qr/rfid\"\n msg.payload.tipo = \"qr\"\n msg.payload.id = flow.get(\"last_QR\")\n node.send([{ payload: \"\" }, null, msg]);\n \n }\n else {\n if (flow.get(\"QR_verificado\")) {\n flow.set(\"nota_resumen_mostrada\", true) // evita repeticion de la notificacion con el resumen\n flow.set(\"identificacion_pendiente\", false)\n let cliente = flow.get(\"cliente\") || \"Centro Desconocido\";\n let residuo = flow.get(\"residuo\") || \"Servicio Desconocido\";\n let matricula = flow.get(\"matricula\") || \"Sin Matricula\";\n // Construir el mensaje en formato HTML\n //msg.payload = `

EL CODIGO QR PRESENTADO


VIENE DE: ${nombreCentro}
TRAE: ${servicio}`;\n msg.payload = `
\n
CODIGO QR OK
\n
VIENE DE: ${cliente}
\n
TRAE: ${residuo}
\n
Matricula: ${matricula}
\n
\n `;\n \n \n msg.topic = \"QR_verificado\";\n //flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"startmenu_flag\", false) // Permite que el boton de solicitud de primer menu, en caso de estar en pantalla, se pueda eliminar\n node.send([msg, null, null])\n \n /*\n setTimeout(function () {\n node.send([{ payload: \"\" }, null, null]);\n }, 3000)\n */\n //Eliminamos la pantalla del editor y ponemos la pantalla principal del Totem\n if (flow.get(\"editor_matricula_ok\")) {\n node.send([null, null, null, { \"payload\": { \"tab\": \"Totem\" } }]);\n\n }\n }\n else{\n //aqui va una notificacion de QR no registrado y permitimos que se lea nuevamente la tarjeta\n flow.set(\"QR_revisado\", false)\n flow.set(\"ID_enviado\", false) // permitimos envio de otro ID. Este flag se utiliza en el nodo de \"envio QR / RFID\"\n node.send([{ payload: \"

EL QR NO ESTA REGISTRADO

UTILICE OTRO QR

\" }, null, null])\n }\n }\n }\n else if (flow.get(\"RFID_ok_flag\")) {\n if (!flow.get(\"RFID_revisado\")) {\n // Solicitamos revision del codigo de la tarjeta en BD\n msg.payload.numero_vial = flow.get(\"numero_vial\")\n msg.payload.totem_id = flow.get(\"totem_id\")\n msg.payload.device = \"supervisor\"\n msg.payload.accion = \"qr/rfid\"\n msg.payload.tipo = \"rfid\"\n msg.payload.id = flow.get(\"last_RFID\")\n node.send([{ payload: \"\" }, null, msg]);\n \n }\n else{\n if (flow.get(\"RFID_verificado\") && !flow.get(\"nota_resumen_mostrada\")) {\n flow.set(\"nota_resumen_mostrada\", true) //evita repeticion de la notificacion con el resumen\n flow.set(\"identificacion_pendiente\", false)\n let cliente = flow.get(\"cliente\") || \"Centro Desconocido\";\n let residuo = flow.get(\"residuo\") || \"Servicio Desconocido\";\n // Construir la notificacion en formato HTML\n //msg.payload = `

TARJETA OK

VIENE DE: ${nombreCentro}

TRAE: ${servicio}

`;\n msg.payload = `
\n
Tarjeta OK
\n
VIENE DE: ${cliente}
\n
TRAE: ${residuo}
\n
\n `;\n msg.topic = \"RFID_verificado\";\n //flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"startmenu_flag\", false) // Permite que el boton de solicitud de primer menu, en caso de estar en pantalla, se pueda eliminar\n node.send([msg, null, null])\n //node.warn(\"notificacion\")\n /*\n setTimeout(function () {\n node.send([{ payload: \"\" }, null, null]);\n }, 3000)\n */\n //Eliminamos la pantalla del editor y ponemos la pantalla principal del Totem\n if (flow.get(\"editor_matricula_ok\")) {\n node.send([null, null, null, { \"payload\": { \"tab\": \"Totem\" } }]);\n\n }\n }\n else{\n //aqui va una notificacion de tarjeta no registrada y permitimos que se lea nuevamente la tarjeta\n flow.set(\"RFID_revisado\", false)\n flow.set(\"ID_enviado\", false) // permitimos envio de otro ID\n node.send([{ payload: \"

LA TARJETA NO ESTA REGISTRADA

UTILICE OTRA TARJETA

\" }, null, null])\n }\n }\n }\n \n}\n/*\nif (flow.get(\"identificacion_esp\") && flow.get(\"identificacion_pendiente\") && !flow.get(\"supervisor\")){\n // hay que chequear identificacion contra algun tipo de autenticacion \n if(flow.get(\"QR_ok_flag\") && flow.get(\"last_QR\") == \"myQR is 12345678\"){\n flow.set(\"QR_verificado\", true)\n node.send({ payload: \"\" });\n }\n else if( flow.get(\"RFID_ok_flag\") && flow.get(\"last_RFID\") == 12345678){\n flow.set(\"RFID_verificado\", true)\n node.send({ payload: \"\" });\n }\n}\n*/\nelse if(flow.get(\"supervisor\")){\n msg = {}\n if(msg.id_topic == \"QR\" && flow.get(\"QR_ok_flag\")){\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), RFID: flow.get(\"last_QR\")}\n node.send([null, msg, null])\n }\n else if(msg.id_topic == \"rfid\" && flow.get(\"RFID_ok_flag\")){\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), RFID: flow.get(\"last_RFID\")}\n node.send([null, msg, null])\n }\n}\nreturn", "outputs": 4, "timeout": 0, "noerr": 0, @@ -4558,7 +4561,7 @@ "links": [ "0df0c819dae1658d" ], - "x": 1235, + "x": 1245, "y": 1260, "wires": [] }, @@ -4646,7 +4649,7 @@ "type": "inject", "z": "953e8740401d175c", "g": "05cb4985c3c68ae8", - "name": "No reg. valid plate", + "name": "invalid plate", "props": [ { "p": "payload" @@ -4661,9 +4664,9 @@ "once": false, "onceDelay": 0.1, "topic": "", - "payload": "{\"Picture\":{\"CutoutPic\":{\"Content\":\"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAgAGADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8/I7ixmYJHdQOzEABZVJP61Zu9OWxuprW4dYriHIliYEGIgkEN6Hj9a+0tM+BXwr1vVYrG6+E8FlHPuDXC3U6hRg8gAj9DXxY99Na+GdTRLiUJbvPFHJJ9/arsFLepwBz7V6dGjzo5ZT5THbXtIQlTdgEccRsf6U5dX0l13Le...\",\"PicName\":\"0751LWL-20240508183537-plate.jpg\"},\"NormalPic\":{\"Content\":\"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgHBgYHDQ8MCQcGCQsUHCwcHQsIBQgKDBogIzA9MRwkHxkMBxQSHi4cNDgyNCgnHRMaIDc0PC4fKSIsJzM0OTL//gf+ARAA7gAAAAAAAAAAAAAAAAEAAAAwNzUxTFdMAAAAAAAAAAAAAAAAAAIAAAACAAAAMjAyNC0wNS0wOCAxODozNTozNwBGAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFN1ciBhIE5vcnRlAAAAAAAAAAAAPeoHAHwFAACwAgAAWQAAABgAAABhbm9ueW1pdHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iT/474gcAAggAAAAAAAAAAAAAMTAuMTQ4LjExLjcxAAAAAAAAAAAAAwAARgAAAEYAAAA5QjAzRkU3UEFKMDAwMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAA5ShRYWYCAAAAAv8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQIBAAAAAFkIFBQxAAAAAAAAAAAAAAAAANoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFU1AAvwAAAAAAAAAAAAAAAABVbmtub3duAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...\",\"PicName\":\"0751LWL-20240508183537.jpg\"},\"Plate\":{\"BoundingBox\":[1404,688,1493,712],\"Channel\":0,\"IsExist\":true,\"PlateColor\":\"White\",\"PlateNumber\":\"2222FPG\",\"PlateType\":\"\",\"UploadNum\":129},\"SnapInfo\":{\"AccurateTime\":\"2024-05-08 18:35:37.614\",\"AllowUser\":false,\"AllowUserEndTime\":\"\",\"DSTTune\":0,\"DefenceCode\":\"kieYKmmsy4M6QyAm\",\"DeviceID\":\"CAMARA_SALIDA\",\"InCarPeopleNum\":0,\"LanNo\":1,\"OpenStrobe\":false,\"SnapTime\":\"2024-05-08 18:35:37\",\"TimeZone\":1},\"Vehicle\":{\"VehicleSeries\":\"Otro\",\"VehicleSign\":\"GMC\"}}}", + "payload": "{\"Picture\":{\"CutoutPic\":{\"Content\":\"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAgAGADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8/I7ixmYJHdQOzEABZVJP61Zu9OWxuprW4dYriHIliYEGIgkEN6Hj9a+0tM+BXwr1vVYrG6+E8FlHPuDXC3U6hRg8gAj9DXxY99Na+GdTRLiUJbvPFHJJ9/arsFLepwBz7V6dGjzo5ZT5THbXtIQlTdgEccRsf6U5dX0l13Le...\",\"PicName\":\"0751LWL-20240508183537-plate.jpg\"},\"NormalPic\":{\"Content\":\"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgHBgYHDQ8MCQcGCQsUHCwcHQsIBQgKDBogIzA9MRwkHxkMBxQSHi4cNDgyNCgnHRMaIDc0PC4fKSIsJzM0OTL//gf+ARAA7gAAAAAAAAAAAAAAAAEAAAAwNzUxTFdMAAAAAAAAAAAAAAAAAAIAAAACAAAAMjAyNC0wNS0wOCAxODozNTozNwBGAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFN1ciBhIE5vcnRlAAAAAAAAAAAAPeoHAHwFAACwAgAAWQAAABgAAABhbm9ueW1pdHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iT/474gcAAggAAAAAAAAAAAAAMTAuMTQ4LjExLjcxAAAAAAAAAAAAAwAARgAAAEYAAAA5QjAzRkU3UEFKMDAwMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAA5ShRYWYCAAAAAv8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQIBAAAAAFkIFBQxAAAAAAAAAAAAAAAAANoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFU1AAvwAAAAAAAAAAAAAAAABVbmtub3duAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...\",\"PicName\":\"0751LWL-20240508183537.jpg\"},\"Plate\":{\"BoundingBox\":[1404,688,1493,712],\"Channel\":0,\"IsExist\":true,\"PlateColor\":\"White\",\"PlateNumber\":\"222FPG\",\"PlateType\":\"\",\"UploadNum\":129},\"SnapInfo\":{\"AccurateTime\":\"2024-05-08 18:35:37.614\",\"AllowUser\":false,\"AllowUserEndTime\":\"\",\"DSTTune\":0,\"DefenceCode\":\"kieYKmmsy4M6QyAm\",\"DeviceID\":\"CAMARA_SALIDA\",\"InCarPeopleNum\":0,\"LanNo\":1,\"OpenStrobe\":false,\"SnapTime\":\"2024-05-08 18:35:37\",\"TimeZone\":1},\"Vehicle\":{\"VehicleSeries\":\"Otro\",\"VehicleSign\":\"GMC\"}}}", "payloadType": "json", - "x": 2450, + "x": 2430, "y": 1360, "wires": [ [ @@ -5049,7 +5052,7 @@ "type": "inject", "z": "953e8740401d175c", "g": "05cb4985c3c68ae8", - "name": "Invalid plate 0236MWK", + "name": "valid plate 0236MWK", "props": [ { "p": "payload" @@ -6048,7 +6051,7 @@ "z": "953e8740401d175c", "g": "595fb0f89af85c42", "name": "config edit", - "func": "const config = JSON.parse(msg.payload);\nmsg ={}; // clear msg object\nlet read;\nlet config_general = []\nlet config_tiempos = []\nlet config_mensajes = []\nlet config_sensor = []\nlet config_camara = []\nlet config_conex = []\nlet config_tipos = []\n\nconfig.general = toObject(config.general);\nconfig.camara = toObject(config.camara);\nconfig.conexion = toObject(config.conexion);\nconfig.sensores = toObject(config.sensores);\nconfig.mensajes = toObject(config.mensajes);\nconfig.tiempos = toObject(config.tiempos);\n\nconst tiposOriginales = config.tipos || {};\n\n\n// Aseguramos que cada tipo esté como array vacío si no tiene nada\nfor (let i = 1; i <= 6; i++) {\n if (!Array.isArray(tiposOriginales[i])) {\n tiposOriginales[i] = [];\n }\n}\nflow.set(\"tiposDatosGlobal\", tiposOriginales);\n\nconfig.tipos = tiposOriginales;\n\n\n\n//**************************** Parametros de Validacion OBLIGATORIOS para PESADA FINALIZADA ***************************************\n// Estos parametros pueden ser: QR / RFID / Boton Validacion / Detector Vehiculo \n//*********************************************************************************************************************************\n/*read = config.QR_obligatorio;\nconfig_general.push({ \"parametro\": \"QR_obligatorio\", \"valor\": read })\nflow.set(\"QR_obligatorio\", read);\nread = config.RFID_obligatorio;\nconfig_general.push({ \"parametro\": \"RFID_obligatorio\", \"valor\": read })\nflow.set(\"RFID_obligatorio\", read);\n\nread = config.general.funcion_totem;\nconfig_general.push({ \"parametro\": \"funcion_totem\", \"valor\": read })\nflow.set(\"funcion_totem\", read);\n\nread = config.general.identificacion_esp;\nconfig_general.push({ \"parametro\": \"identificacion_esp\", \"valor\": read })\nflow.set(\"identificacion_esp\", read);\n\nread = config.tiempos.timer1;\nconfig_tiempos.push({ \"parametro\": \"timer1\", \"valor\": read })\nflow.set(\"timer1\", read);\n\n*/\n\nread = config.general.Tipo_Configuracion;\nconfig_general.push({ \"parametro\": \"Tipo_Configuracion\", \"valor\": read })\nflow.set(\"Tipo_Configuracion\", read);\n\nread = config.general.ID_obligatorio;\nconfig_general.push({ \"parametro\": \"ID_obligatorio\", \"valor\": read })\nflow.set(\"ID_obligatorio\", read);\n\nread = config.general.detector_obligatorio;\nconfig_general.push({ \"parametro\": \"detector_obligatorio\", \"valor\": read })\nflow.set(\"detector_obligatorio\", read);\n\nread = config.general.boton_obligatorio;\nconfig_general.push({ \"parametro\": \"boton_obligatorio\", \"valor\": read })\nflow.set(\"boton_obligatorio\", read);\nread = config.general.firma_obligatoria;\nconfig_general.push({ \"parametro\": \"firma_obligatoria\", \"valor\": read })\nflow.set(\"firma_obligatoria\", read);\nread = config.general.matricula_obligatoria;\nconfig_general.push({ \"parametro\": \"matricula_obligatoria\", \"valor\": read })\nflow.set(\"matricula_obligatoria\", read);\n\n\n\n//==================================================================================================================================\nread = config.general.edicion_matricula;\nconfig_general.push({ \"parametro\": \"edicion_matricula\", \"valor\": read })\nflow.set(\"edicion_matricula\", read); // Habilita la edicion de matricula\n\nread = config.general.botonsalida_activo;\nconfig_general.push({ \"parametro\": \"botonsalida_activo\", \"valor\": read })\nflow.set(\"botonsalida_activo\", read); // Permite poner boton de salida\n\nread = config.general.menu_activo;\nconfig_general.push({ \"parametro\": \"menu_activo\", \"valor\": read })\nflow.set(\"menu_activo\", read); // Permite poner los menus de contratacion\n\n/*\nread = config.general.firma_habilitada;\nconfig_general.push({ \"parametro\": \"firma_habilitada\", \"valor\": read })\nflow.set(\"firma_habilitada\", read); // Habilita la edicion de firma\n*/\n\nread = config.general.barrera_habilitada;\nconfig_general.push({ \"parametro\": \"barrera_habilitada\", \"valor\": read })\nflow.set(\"barrera_habilitada\", read); // Habilita el uso de barrera\n\nread = config.general.switch_2_Totem_page;\nflow.set(\"switch_2_Totem_page\", read); // si igual a true cambia a pagina principal del totem siempre que se active la bascula\n// Con esto aseguramos que si queda abierta una ventana de configuracion se pueda quitar automaticamente\nconfig_general.push({ \"parametro\": \"switch_2_Totem_page\", \"valor\": read })\n\n//flow.set(\"peso\", read); // crea variable para recibir peso del supervisor\n\nread = parseInt(config.general.peso_minimo); // peso minimo para utilizado para indicar cuando hay vehiculo en la balanza o no\nconfig_general.push({ \"parametro\": \"peso_minimo\", \"valor\": read })\nflow.set(\"peso_minimo\", read);\n\nread = config.general.formatoPais; // peso minimo para utilizado para indicar cuando hay vehiculo en la balanza o no\nconfig_general.push({ \"parametro\": \"formatoPais\", \"valor\": read })\nflow.set(\"formatoPais\", read);\n\n//------------------- TOTEM MASTER tiempo de confirmacion -------------------------------------\nread = config.tiempos.confirm_master_time;\nconfig_tiempos.push({ \"parametro\": \"confirm_master_time\", \"valor\": read })\nflow.set(\"confirm_master_time\", read);\n//---------------------------------------------------------------------------------------------\n\n\nread = config.general.audio_level;\nconfig_general.push({ \"parametro\": \"audio_level\", \"valor\": read })\nflow.set(\"audio_level\", read);\n//-------------------------------------------------------\nread = config.general.mante_code_RFID; //codigo RFID para pasar a pantalla de mantenimiento\nconfig_general.push({ \"parametro\": \"mante_code_RFID\", \"valor\": read })\nflow.set(\"mante_code_RFID\", read)\nread = config.general.mante_code_QR; //codigo QR para pasar a pantalla de mantenimiento\nconfig_general.push({ \"parametro\": \"mante_code_QR\", \"valor\": read })\nflow.set(\"mante_code_QR\", read)\n\n//------------------------------- MENSAJES -------------------------\nread = config.tiempos.tiempo_mensaje;\nconfig_tiempos.push({ \"parametro\": \"tiempo_mensaje\", \"valor\": read })\nflow.set(\"tiempo_mensaje\", read);\n\nread = config.tiempos.relay2_pulse // duración del pulso generado en el relay 2 al terminar el pesaje para abrir barrera\nconfig_tiempos.push({ \"parametro\": \"relay2_pulse\", \"valor\": read })\nflow.set(\"relay2_pulse\", read);\n\nread = config.mensajes.mensaje2 // no se usa\nconfig_mensajes.push({ \"parametro\": \"mensaje2\", \"valor\": read })\nflow.set(\"mensaje2\", read);\nread = config.mensajes.mensaje1 // no se usa\nconfig_mensajes.push({ \"parametro\": \"mensaje1\", \"valor\": read })\nflow.set(\"mensaje1\", read);\nread = config.general.init_screen\nconfig_general.push({ \"parametro\": \"init_screen\", \"valor\": read })\nflow.set(\"init_screen\", read);\n\n\n\n//-------------------------------------------------------\nread = config.general.totem_serial // seriall asignado a este dispositivo\nconfig_general.push({ \"parametro\": \"totem_serial\", \"valor\": read })\nflow.set(\"totem_serial\", read);\n\n//---------------------------------------- Parametros por defecto del boton de salida para VALIDACION -----------------------------------------------------------\nread = config.mensajes.botonsalida_txt_def\nconfig_mensajes.push({ \"parametro\": \"botonsalida_txt_def\", \"valor\": read })\nflow.set(\"botonsalida_txt_def\", read)\nread = config.general.botonsalida_color_def\nconfig_general.push({ \"parametro\": \"botonsalida_color_def\", \"valor\": read })\nflow.set(\"botonsalida_color_def\", read)\nread = config.general.botonsalida_txt_color_def\nconfig_general.push({ \"parametro\": \"botonsalida_txt_color_def\", \"valor\": read })\nflow.set(\"botonsalida_txt_color_def\", read)\nread = config.mensajes.botonsalida_mensaje1\nconfig_mensajes.push({ \"parametro\": \"botonsalida_mensaje1\", \"valor\": read })\nflow.set(\"botonsalida_mensaje1\", read)\nread = config.mensajes.botonsalida_mensaje1_def\nconfig_mensajes.push({ \"parametro\": \"botonsalida_mensaje1_def\", \"valor\": read })\nflow.set(\"botonsalida_mensaje1_def\", read)\n\n//----------------------------------------- Textos Predefinidos -------------------------------------------------------------------------\nread = config.mensajes.men_pesaje_listo;\nconfig_mensajes.push({ \"parametro\": \"men_pesaje_listo\", \"valor\": read })\nflow.set(\"men_pesaje_listo\", read);\nread = config.mensajes.men_peso_estable;\nconfig_mensajes.push({ \"parametro\": \"men_peso_estable\", \"valor\": read })\nflow.set(\"men_peso_estable\", read);\nread = config.mensajes.men_identificacion;\nconfig_mensajes.push({ \"parametro\": \"men_identificacion\", \"valor\": read })\nflow.set(\"men_identificacion\", read);\nread = config.mensajes.men_salida;\nconfig_mensajes.push({ \"parametro\": \"men_salida\", \"valor\": read })\nflow.set(\"men_salida\", read);\nread = config.mensajes.id_titulo_matricula;\nconfig_mensajes.push({ \"parametro\": \"id_titulo_matricula\", \"valor\": read })\nflow.set(\"id_titulo_matricula\", read);\nread = config.mensajes.id_titulo_id;\nconfig_mensajes.push({ \"parametro\": \"id_titulo_id\", \"valor\": read })\nflow.set(\"id_titulo_id\", read);\nread = config.mensajes.id_leido;\nconfig_mensajes.push({ \"parametro\": \"id_leido\", \"valor\": read })\nflow.set(\"id_leido\", read);\nread = config.mensajes.id_no_leido;\nconfig_mensajes.push({ \"parametro\": \"id_no_leido\", \"valor\": read })\nflow.set(\"id_no_leido\", read);\n\n//===================================================CONEXION / CAMARA / SENSOR =====================================================\n//====================================================================================================================================\n\n\nread = config.conexion.modo_totem;\nconfig_conex.push({ \"parametro\": \"modo_totem\", \"valor\": read })\nflow.set(\"modo_totem\", read); // Modo de funcionamiento del totem\n\n\n//-----------------------------Gestion de IP fija / IP DHCP------------------------------------------------------\nvar ipdevice_flag = false // variables temporales para saber si hay cambios en las ip\nvar iprouter_flag = false\nread = config.conexion.ipdevice // direccion IP del dispositivo\nconfig_conex.push({ \"parametro\": \"ipdevice\", \"valor\": read })\nif (flow.get(\"ipdevice\") != read) {\n flow.set(\"ipdevice\", read);\n ipdevice_flag = true;\n}\nread = config.conexion.iprouter // direccion IP del router\nconfig_conex.push({ \"parametro\": \"iprouter\", \"valor\": read })\nif (flow.get(\"iprouter\") != read) {\n flow.set(\"iprouter\", read);\n iprouter_flag = true;\n}\nread = config.conexion.dhcp_flag // flag del DHCP\nconfig_conex.push({ \"parametro\": \"dhcp_flag\", \"valor\": read })\nif (flow.get(\"dhcp_flag\") != read) {\n flow.set(\"dhcp_flag\", read); // el dhcp_flag ha cambiado\n if (flow.get(\"dhcp_flag\")) {\n node.send([null, { payload: \". /home/trypton/scripts/enable_dhcp.sh\" }])\n }\n else {\n node.send([null, { payload: \". /home/trypton/scripts/enable_ipstatic.sh \" + flow.get(\"ipdevice\") + \"/24 \" + flow.get(\"iprouter\") }])\n }\n}\nelse { // el dhcp_flag no ha cambiado\n if (!flow.get(\"dhcp_flag\")) {\n if (ipdevice_flag || iprouter_flag) {\n node.send([null, { payload: \". /home/trypton/scripts/enable_ipstatic.sh \" + flow.get(\"ipdevice\") + \"/24 \" + flow.get(\"iprouter\") }])\n }\n }\n else {\n node.send([null, { payload: \". /home/trypton/scripts/enable_dhcp.sh\" }])\n }\n}\nflow.set(\"dhcpname_on\", \"IP Fija\") // texto que sale en el boton de la pantalla de mantenimiento\nflow.set(\"dhcpname_off\", \"DHCP\")\n//-----------------------------------Websocket IP--------------------------------------------------------------------------------------\nread = config.conexion.websocket_puerto // direccion IP del websocket del supervisor\nconfig_conex.push({ \"parametro\": \"websocket_puerto\", \"valor\": read })\nflow.set(\"websocket_puerto\", read);\nread = config.conexion.websocket_url\nconfig_conex.push({ \"parametro\": \"websocket_url\", \"valor\": read })\nif (flow.get(\"websocket_url\") != read) {\n flow.set(\"websocket_url\", read);\n node.send([{ payload: read + \" servidor.com\" }, null])\n}\n//----------------------------------- ENVIO DE MOVIMIENTOS --------------------------------------------------------------------------------------\nread = config.conexion.movimientosxmqtt;\nconfig_conex.push({ \"parametro\": \"movimientosxmqtt\", \"valor\": read })\nflow.set(\"movimientosxmqtt\", read); // Modo de envio de movimientos\n\nread = config.conexion.movimientosxapi;\nconfig_conex.push({ \"parametro\": \"movimientosxapi\", \"valor\": read })\nflow.set(\"movimientosxapi\", read); // Modo de envio de movimientos\n\n//----------------------------------- DEFINICION DEL BROKER DE MQTT --------------------------------------------------------------------------------------\n/*\nread = config.conexion.broker_url;\nconfig_conex.push({ \"parametro\": \"broker_url\", \"valor\": read })\nflow.set(\"broker_url\", read); // direccion del broker\n\nread = config.conexion.broker_port;\nconfig_conex.push({ \"parametro\": \"broker_port\", \"valor\": read })\nflow.set(\"broker_port\", read); // puerto del broker\n\nread = config.conexion.broker_username;\nconfig_conex.push({ \"parametro\": \"broker_username\", \"valor\": read })\nflow.set(\"broker_username\", read); // username del broker\n\nread = config.conexion.broker_pass;\nconfig_conex.push({ \"parametro\": \"broker_pass\", \"valor\": read })\nflow.set(\"broker_pass\", read); // password del broker\n*/\n//-------------------------------------------------- URL de la API de URBASER(Trypton) ------------------------------------------------------------------------------\nread = config.conexion.url_API;\nconfig_conex.push({ \"parametro\": \"url_API\", \"valor\": read })\nflow.set(\"url_API\", read); // Modo de funcionamiento del totem\n\nflow.set(\"semaforo\", \"green\")\n\n//------------------------------------Lector de QR / RF----------------------------------------------------------\nread = config.sensores.tipo_de_lector\nconfig_sensor.push({ \"parametro\": \"tipo_de_lector\", \"valor\": read })\nflow.set(\"tipo_de_lector\", read); //tipo de lector QR / RF\nread = config.sensores.rfid_invertido\nconfig_sensor.push({ \"parametro\": \"rfid_invertido\", \"valor\": read })\nflow.set(\"rfid_invertido\", read);\nflow.set(\"lector_activo\", true) // activamos el lector\nflow.set(\"ID_enviado\", false) // variable para controlar un solo envio de RFID / QR\n\n//-------------------------------------sensor de distancia-------------------------------------------------------\nread = config.sensores.sensor_distancia_local\nconfig_sensor.push({ \"parametro\": \"sensor_distancia_local\", \"valor\": read })\nflow.set(\"sensor_distancia_local\", read);\nread = config.sensores.sensor_distancia_remoto\nconfig_sensor.push({ \"parametro\": \"sensor_distancia_remoto\", \"valor\": read })\nflow.set(\"sensor_distancia_remoto\", read);\nflow.set(\"distance_flag_remote\", false)\nread = config.sensores.distance_min\nconfig_sensor.push({ \"parametro\": \"distance_min\", \"valor\": read })\nflow.set(\"distance_min\", read);\nread = config.sensores.min_cnt_in_ok\nconfig_sensor.push({ \"parametro\": \"min_cnt_in_ok\", \"valor\": read })\nflow.set(\"min_cnt_in_ok\", read);\nread = config.sensores.min_cnt_out_ok\nconfig_sensor.push({ \"parametro\": \"min_cnt_out_ok\", \"valor\": read })\nflow.set(\"min_cnt_out_ok\", read);\nflow.set(\"dist_in_counter\", 0);\nflow.set(\"dist_out_counter\", 0);\n\n//---------------------------------------Totems y Camara------------------------------------------------------------------------------\nread = config.conexion.totem_qty\nconfig_conex.push({ \"parametro\": \"totem_qty\", \"valor\": read })\nflow.set(\"totem_qty\", read);\nread = config.conexion.totem_id_remoto\nconfig_conex.push({ \"parametro\": \"totem_id_remoto\", \"valor\": read })\nflow.set(\"totem_id_remoto\", read);\nread = config.conexion.totem_id\nconfig_conex.push({ \"parametro\": \"totem_id\", \"valor\": read })\nflow.set(\"totem_id\", read);\nread = config.conexion.numero_vial;\nconfig_conex.push({ \"parametro\": \"numero_vial\", \"valor\": read })\nflow.set(\"numero_vial\", read);\nread = config.conexion.ip_totem_pareja\nconfig_conex.push({ \"parametro\": \"ip_totem_pareja\", \"valor\": read })\nflow.set(\"ip_totem_pareja\", read);\nread = config.camara.camara_matricula\nconfig_camara.push({ \"parametro\": \"camara_matricula\", \"valor\": read })\nflow.set(\"camara_matricula\", read);\nread = config.camara.camaraID\nconfig_camara.push({ \"parametro\": \"camaraID\", \"valor\": read })\nflow.set(\"camaraID\", read);\nread = config.camara.camara_IP\nconfig_camara.push({ \"parametro\": \"camara_IP\", \"valor\": read })\nflow.set(\"camara_IP\", read);\n\n\n//---------------------------------------Lectura de Matricula-----------------------------------------------------------------------\nread = config.tiempos.time_max_2_bascula\nconfig_tiempos.push({ \"parametro\": \"time_max_2_bascula\", \"valor\": read })\nflow.set(\"time_max_2_bascula\", read);\nread = config.tiempos.wait_time_to_send_plate\nconfig_tiempos.push({ \"parametro\": \"wait_time_to_send_plate\", \"valor\": read })\nflow.set(\"wait_time_to_send_plate\", read);\nread = config.tiempos.max_wait_time_to_send_plate\nconfig_tiempos.push({ \"parametro\": \"max_wait_time_to_send_plate\", \"valor\": read })\nflow.set(\"max_wait_time_to_send_plate\", read);\nread = config.tiempos.max_time_bascula_sensor\nconfig_tiempos.push({ \"parametro\": \"max_time_bascula_sensor\", \"valor\": read })\nflow.set(\"max_time_bascula_sensor\", read);\nread = config.tiempos.time_to_snapshot\nconfig_tiempos.push({ \"parametro\": \"time_to_snapshot\", \"valor\": read })\nflow.set(\"time_to_snapshot\", read);\nflow.set(\"plate_sent\", false);\nflow.set(\"anpr0_flag\", false);\n\n//----------------------------------------Flags evento bascula---------------------------------------------------------------------------------------------\nflow.set(\"peso_trigger_OFF\", true);\nflow.set(\"peso_trigger_ON\", false);\n\n//-------------------------------------------------------------------------------------------------------------------------------------\n\nread = config.conexion.supervisor\nconfig_conex.push({ \"parametro\": \"supervisor\", \"valor\": read })\nflow.set(\"supervisor\", read);\n\n//---------------------------------------- Flags edicion de matricula ---------------------------------------------------------------------------------------------\nflow.set(\"badplate\", false) // inicializa flag de solicitu de modificación de matricula\nflow.set(\"prechar\", \"*\") // inicializa variable con caracter de prefijo para el $watch del nodo display de edicion de matricula\n\nflow.set(\"config_general\", config_general)\nflow.set(\"config_tiempos\", config_tiempos)\nflow.set(\"config_mensajes\", config_mensajes)\nflow.set(\"config_conex\", config_conex)\nflow.set(\"config_camara\", config_camara)\nflow.set(\"config_sensor\", config_sensor)\n\nflow.set(\"tiposDatosGlobal\", tiposOriginales) // Pasamos los datos de cada tipo a una variable de flow\n//notese que estos datos son leidos del archivo, sin hacerles transformacion a objeto.\n\n// Vamos a ver si tenemos que aplicar algun tipo de configuracion particular\nconst tipo = parseInt(config.general.Tipo_Configuracion, 10); // asegura que el numero es integer\n\nif (tipo > 0 && tipo <= 6) {\n const tipoDatos = config.tipos[tipo] || [];\n\n tipoDatos.forEach(item => {\n let valor = item.valor;\n\n if (valor === \"true\") valor = true;\n if (valor === \"false\") valor = false;\n\n flow.set(item.parametro, valor); // sobre escribimos el valor configurado con la configuracion que este definida en el tipo.\n });\n}\n\nreturn;\n\n\n//*********************************************************** FUNCIONES **************************************************/\nfunction toObject(array) {\n const obj = {};\n array.forEach(el => {\n obj[el.parametro] = el.valor;\n });\n return obj;\n}\n", + "func": "const config = JSON.parse(msg.payload);\nmsg ={}; // clear msg object\nlet read;\nlet config_general = []\nlet config_tiempos = []\nlet config_mensajes = []\nlet config_sensor = []\nlet config_camara = []\nlet config_conex = []\nlet config_tipos = []\n\nconfig.general = toObject(config.general);\nconfig.camara = toObject(config.camara);\nconfig.conexion = toObject(config.conexion);\nconfig.sensores = toObject(config.sensores);\nconfig.mensajes = toObject(config.mensajes);\nconfig.tiempos = toObject(config.tiempos);\n\nconst tiposOriginales = config.tipos || {};\n\n\n// Aseguramos que cada tipo esté como array vacío si no tiene nada\nfor (let i = 1; i <= 6; i++) {\n if (!Array.isArray(tiposOriginales[i])) {\n tiposOriginales[i] = [];\n }\n}\nflow.set(\"tiposDatosGlobal\", tiposOriginales);\n\nconfig.tipos = tiposOriginales;\n\n\n\n//**************************** Parametros de Validacion OBLIGATORIOS para PESADA FINALIZADA ***************************************\n// Estos parametros pueden ser: QR / RFID / Boton Validacion / Detector Vehiculo \n//*********************************************************************************************************************************\n/*read = config.QR_obligatorio;\nconfig_general.push({ \"parametro\": \"QR_obligatorio\", \"valor\": read })\nflow.set(\"QR_obligatorio\", read);\nread = config.RFID_obligatorio;\nconfig_general.push({ \"parametro\": \"RFID_obligatorio\", \"valor\": read })\nflow.set(\"RFID_obligatorio\", read);\n\nread = config.general.funcion_totem;\nconfig_general.push({ \"parametro\": \"funcion_totem\", \"valor\": read })\nflow.set(\"funcion_totem\", read);\n\nread = config.general.identificacion_esp;\nconfig_general.push({ \"parametro\": \"identificacion_esp\", \"valor\": read })\nflow.set(\"identificacion_esp\", read);\n\nread = config.tiempos.timer1;\nconfig_tiempos.push({ \"parametro\": \"timer1\", \"valor\": read })\nflow.set(\"timer1\", read);\n\n*/\n\nread = config.general.Tipo_Configuracion;\nconfig_general.push({ \"parametro\": \"Tipo_Configuracion\", \"valor\": read })\nflow.set(\"Tipo_Configuracion\", read);\n\nread = config.general.ID_obligatorio;\nconfig_general.push({ \"parametro\": \"ID_obligatorio\", \"valor\": read })\nflow.set(\"ID_obligatorio\", read);\n\nread = config.general.salida_ID_obligatorio;\nconfig_general.push({ \"parametro\": \"salida_ID_obligatorio\", \"valor\": read })\nflow.set(\"salida_ID_obligatorio\", read);\n\nread = config.general.detector_obligatorio;\nconfig_general.push({ \"parametro\": \"detector_obligatorio\", \"valor\": read })\nflow.set(\"detector_obligatorio\", read);\n\nread = config.general.boton_obligatorio;\nconfig_general.push({ \"parametro\": \"boton_obligatorio\", \"valor\": read })\nflow.set(\"boton_obligatorio\", read);\nread = config.general.firma_obligatoria;\nconfig_general.push({ \"parametro\": \"firma_obligatoria\", \"valor\": read })\nflow.set(\"firma_obligatoria\", read);\nread = config.general.matricula_obligatoria;\nconfig_general.push({ \"parametro\": \"matricula_obligatoria\", \"valor\": read })\nflow.set(\"matricula_obligatoria\", read);\n\n\n\n//==================================================================================================================================\nread = config.general.edicion_matricula;\nconfig_general.push({ \"parametro\": \"edicion_matricula\", \"valor\": read })\nflow.set(\"edicion_matricula\", read); // Habilita la edicion de matricula\n\nread = config.general.botonsalida_activo;\nconfig_general.push({ \"parametro\": \"botonsalida_activo\", \"valor\": read })\nflow.set(\"botonsalida_activo\", read); // Permite poner boton de salida\n\nread = config.general.menu_activo;\nconfig_general.push({ \"parametro\": \"menu_activo\", \"valor\": read })\nflow.set(\"menu_activo\", read); // Permite poner los menus de contratacion\n\n/*\nread = config.general.firma_habilitada;\nconfig_general.push({ \"parametro\": \"firma_habilitada\", \"valor\": read })\nflow.set(\"firma_habilitada\", read); // Habilita la edicion de firma\n*/\n\nread = config.general.barrera_habilitada;\nconfig_general.push({ \"parametro\": \"barrera_habilitada\", \"valor\": read })\nflow.set(\"barrera_habilitada\", read); // Habilita el uso de barrera\n\nread = config.general.switch_2_Totem_page;\nflow.set(\"switch_2_Totem_page\", read); // si igual a true cambia a pagina principal del totem siempre que se active la bascula\n// Con esto aseguramos que si queda abierta una ventana de configuracion se pueda quitar automaticamente\nconfig_general.push({ \"parametro\": \"switch_2_Totem_page\", \"valor\": read })\n\n//flow.set(\"peso\", read); // crea variable para recibir peso del supervisor\n\nread = parseInt(config.general.peso_minimo); // peso minimo para utilizado para indicar cuando hay vehiculo en la balanza o no\nconfig_general.push({ \"parametro\": \"peso_minimo\", \"valor\": read })\nflow.set(\"peso_minimo\", read);\n\nread = config.general.formatoPais; // peso minimo para utilizado para indicar cuando hay vehiculo en la balanza o no\nconfig_general.push({ \"parametro\": \"formatoPais\", \"valor\": read })\nflow.set(\"formatoPais\", read);\n\n//------------------- TOTEM MASTER tiempo de confirmacion -------------------------------------\nread = config.tiempos.confirm_master_time;\nconfig_tiempos.push({ \"parametro\": \"confirm_master_time\", \"valor\": read })\nflow.set(\"confirm_master_time\", read);\n//---------------------------------------------------------------------------------------------\n\n\nread = config.general.audio_level;\nconfig_general.push({ \"parametro\": \"audio_level\", \"valor\": read })\nflow.set(\"audio_level\", read);\n//-------------------------------------------------------\nread = config.general.mante_code_RFID; //codigo RFID para pasar a pantalla de mantenimiento\nconfig_general.push({ \"parametro\": \"mante_code_RFID\", \"valor\": read })\nflow.set(\"mante_code_RFID\", read)\nread = config.general.mante_code_QR; //codigo QR para pasar a pantalla de mantenimiento\nconfig_general.push({ \"parametro\": \"mante_code_QR\", \"valor\": read })\nflow.set(\"mante_code_QR\", read)\n\n//------------------------------- MENSAJES -------------------------\nread = config.tiempos.tiempo_mensaje;\nconfig_tiempos.push({ \"parametro\": \"tiempo_mensaje\", \"valor\": read })\nflow.set(\"tiempo_mensaje\", read);\n\nread = config.tiempos.relay2_pulse // duración del pulso generado en el relay 2 al terminar el pesaje para abrir barrera\nconfig_tiempos.push({ \"parametro\": \"relay2_pulse\", \"valor\": read })\nflow.set(\"relay2_pulse\", read);\n\nread = config.mensajes.mensaje2 // no se usa\nconfig_mensajes.push({ \"parametro\": \"mensaje2\", \"valor\": read })\nflow.set(\"mensaje2\", read);\nread = config.mensajes.mensaje1 // no se usa\nconfig_mensajes.push({ \"parametro\": \"mensaje1\", \"valor\": read })\nflow.set(\"mensaje1\", read);\nread = config.general.init_screen\nconfig_general.push({ \"parametro\": \"init_screen\", \"valor\": read })\nflow.set(\"init_screen\", read);\n\n\n\n//-------------------------------------------------------\nread = config.general.totem_serial // seriall asignado a este dispositivo\nconfig_general.push({ \"parametro\": \"totem_serial\", \"valor\": read })\nflow.set(\"totem_serial\", read);\n\n//---------------------------------------- Parametros por defecto del boton de salida para VALIDACION -----------------------------------------------------------\nread = config.mensajes.botonsalida_txt_def\nconfig_mensajes.push({ \"parametro\": \"botonsalida_txt_def\", \"valor\": read })\nflow.set(\"botonsalida_txt_def\", read)\nread = config.general.botonsalida_color_def\nconfig_general.push({ \"parametro\": \"botonsalida_color_def\", \"valor\": read })\nflow.set(\"botonsalida_color_def\", read)\nread = config.general.botonsalida_txt_color_def\nconfig_general.push({ \"parametro\": \"botonsalida_txt_color_def\", \"valor\": read })\nflow.set(\"botonsalida_txt_color_def\", read)\nread = config.mensajes.botonsalida_mensaje1\nconfig_mensajes.push({ \"parametro\": \"botonsalida_mensaje1\", \"valor\": read })\nflow.set(\"botonsalida_mensaje1\", read)\nread = config.mensajes.botonsalida_mensaje1_def\nconfig_mensajes.push({ \"parametro\": \"botonsalida_mensaje1_def\", \"valor\": read })\nflow.set(\"botonsalida_mensaje1_def\", read)\n\n//----------------------------------------- Textos Predefinidos -------------------------------------------------------------------------\nread = config.mensajes.men_pesaje_listo;\nconfig_mensajes.push({ \"parametro\": \"men_pesaje_listo\", \"valor\": read })\nflow.set(\"men_pesaje_listo\", read);\nread = config.mensajes.men_peso_estable;\nconfig_mensajes.push({ \"parametro\": \"men_peso_estable\", \"valor\": read })\nflow.set(\"men_peso_estable\", read);\nread = config.mensajes.men_identificacion;\nconfig_mensajes.push({ \"parametro\": \"men_identificacion\", \"valor\": read })\nflow.set(\"men_identificacion\", read);\nread = config.mensajes.men_salida;\nconfig_mensajes.push({ \"parametro\": \"men_salida\", \"valor\": read })\nflow.set(\"men_salida\", read);\nread = config.mensajes.id_titulo_matricula;\nconfig_mensajes.push({ \"parametro\": \"id_titulo_matricula\", \"valor\": read })\nflow.set(\"id_titulo_matricula\", read);\nread = config.mensajes.id_titulo_id;\nconfig_mensajes.push({ \"parametro\": \"id_titulo_id\", \"valor\": read })\nflow.set(\"id_titulo_id\", read);\nread = config.mensajes.id_leido;\nconfig_mensajes.push({ \"parametro\": \"id_leido\", \"valor\": read })\nflow.set(\"id_leido\", read);\nread = config.mensajes.id_no_leido;\nconfig_mensajes.push({ \"parametro\": \"id_no_leido\", \"valor\": read })\nflow.set(\"id_no_leido\", read);\n\n//===================================================CONEXION / CAMARA / SENSOR =====================================================\n//====================================================================================================================================\n\n\nread = config.conexion.modo_totem;\nconfig_conex.push({ \"parametro\": \"modo_totem\", \"valor\": read })\nflow.set(\"modo_totem\", read); // Modo de funcionamiento del totem\n\n\n//-----------------------------Gestion de IP fija / IP DHCP------------------------------------------------------\nvar ipdevice_flag = false // variables temporales para saber si hay cambios en las ip\nvar iprouter_flag = false\nread = config.conexion.ipdevice // direccion IP del dispositivo\nconfig_conex.push({ \"parametro\": \"ipdevice\", \"valor\": read })\nif (flow.get(\"ipdevice\") != read) {\n flow.set(\"ipdevice\", read);\n ipdevice_flag = true;\n}\nread = config.conexion.iprouter // direccion IP del router\nconfig_conex.push({ \"parametro\": \"iprouter\", \"valor\": read })\nif (flow.get(\"iprouter\") != read) {\n flow.set(\"iprouter\", read);\n iprouter_flag = true;\n}\nread = config.conexion.dhcp_flag // flag del DHCP\nconfig_conex.push({ \"parametro\": \"dhcp_flag\", \"valor\": read })\nif (flow.get(\"dhcp_flag\") != read) {\n flow.set(\"dhcp_flag\", read); // el dhcp_flag ha cambiado\n if (flow.get(\"dhcp_flag\")) {\n node.send([null, { payload: \". /home/trypton/scripts/enable_dhcp.sh\" }])\n }\n else {\n node.send([null, { payload: \". /home/trypton/scripts/enable_ipstatic.sh \" + flow.get(\"ipdevice\") + \"/24 \" + flow.get(\"iprouter\") }])\n }\n}\nelse { // el dhcp_flag no ha cambiado\n if (!flow.get(\"dhcp_flag\")) {\n if (ipdevice_flag || iprouter_flag) {\n node.send([null, { payload: \". /home/trypton/scripts/enable_ipstatic.sh \" + flow.get(\"ipdevice\") + \"/24 \" + flow.get(\"iprouter\") }])\n }\n }\n else {\n node.send([null, { payload: \". /home/trypton/scripts/enable_dhcp.sh\" }])\n }\n}\nflow.set(\"dhcpname_on\", \"IP Fija\") // texto que sale en el boton de la pantalla de mantenimiento\nflow.set(\"dhcpname_off\", \"DHCP\")\n//-----------------------------------Websocket IP--------------------------------------------------------------------------------------\nread = config.conexion.websocket_puerto // direccion IP del websocket del supervisor\nconfig_conex.push({ \"parametro\": \"websocket_puerto\", \"valor\": read })\nflow.set(\"websocket_puerto\", read);\nread = config.conexion.websocket_url\nconfig_conex.push({ \"parametro\": \"websocket_url\", \"valor\": read })\nif (flow.get(\"websocket_url\") != read) {\n flow.set(\"websocket_url\", read);\n node.send([{ payload: read + \" servidor.com\" }, null])\n}\n//----------------------------------- ENVIO DE MOVIMIENTOS --------------------------------------------------------------------------------------\nread = config.conexion.movimientosxmqtt;\nconfig_conex.push({ \"parametro\": \"movimientosxmqtt\", \"valor\": read })\nflow.set(\"movimientosxmqtt\", read); // Modo de envio de movimientos\n\nread = config.conexion.movimientosxapi;\nconfig_conex.push({ \"parametro\": \"movimientosxapi\", \"valor\": read })\nflow.set(\"movimientosxapi\", read); // Modo de envio de movimientos\n\n//----------------------------------- DEFINICION DEL BROKER DE MQTT --------------------------------------------------------------------------------------\n/*\nread = config.conexion.broker_url;\nconfig_conex.push({ \"parametro\": \"broker_url\", \"valor\": read })\nflow.set(\"broker_url\", read); // direccion del broker\n\nread = config.conexion.broker_port;\nconfig_conex.push({ \"parametro\": \"broker_port\", \"valor\": read })\nflow.set(\"broker_port\", read); // puerto del broker\n\nread = config.conexion.broker_username;\nconfig_conex.push({ \"parametro\": \"broker_username\", \"valor\": read })\nflow.set(\"broker_username\", read); // username del broker\n\nread = config.conexion.broker_pass;\nconfig_conex.push({ \"parametro\": \"broker_pass\", \"valor\": read })\nflow.set(\"broker_pass\", read); // password del broker\n*/\n/*\n//-------------------------------------------------- URL de la API de URBASER(Trypton) ------------------------------------------------------------------------------\nread = config.conexion.url_API;\nconfig_conex.push({ \"parametro\": \"url_API\", \"valor\": read })\nflow.set(\"url_API\", read); // Modo de funcionamiento del totem\n*/\nflow.set(\"semaforo\", \"green\")\n\n//------------------------------------Lector de QR / RF----------------------------------------------------------\nread = config.sensores.tipo_de_lector\nconfig_sensor.push({ \"parametro\": \"tipo_de_lector\", \"valor\": read })\nflow.set(\"tipo_de_lector\", read); //tipo de lector QR / RF\nread = config.sensores.rfid_invertido\nconfig_sensor.push({ \"parametro\": \"rfid_invertido\", \"valor\": read })\nflow.set(\"rfid_invertido\", read);\nflow.set(\"lector_activo\", true) // activamos el lector\nflow.set(\"ID_enviado\", false) // variable para controlar un solo envio de RFID / QR\n\n//-------------------------------------sensor de distancia-------------------------------------------------------\nread = config.sensores.sensor_distancia_local\nconfig_sensor.push({ \"parametro\": \"sensor_distancia_local\", \"valor\": read })\nflow.set(\"sensor_distancia_local\", read);\nread = config.sensores.sensor_distancia_remoto\nconfig_sensor.push({ \"parametro\": \"sensor_distancia_remoto\", \"valor\": read })\nflow.set(\"sensor_distancia_remoto\", read);\nflow.set(\"distance_flag_remote\", false)\nread = config.sensores.distance_min\nconfig_sensor.push({ \"parametro\": \"distance_min\", \"valor\": read })\nflow.set(\"distance_min\", read);\nread = config.sensores.min_cnt_in_ok\nconfig_sensor.push({ \"parametro\": \"min_cnt_in_ok\", \"valor\": read })\nflow.set(\"min_cnt_in_ok\", read);\nread = config.sensores.min_cnt_out_ok\nconfig_sensor.push({ \"parametro\": \"min_cnt_out_ok\", \"valor\": read })\nflow.set(\"min_cnt_out_ok\", read);\nflow.set(\"dist_in_counter\", 0);\nflow.set(\"dist_out_counter\", 0);\n\n//---------------------------------------Totems y Camara------------------------------------------------------------------------------\nread = config.conexion.totem_qty\nconfig_conex.push({ \"parametro\": \"totem_qty\", \"valor\": read })\nflow.set(\"totem_qty\", read);\nread = config.conexion.totem_id_remoto\nconfig_conex.push({ \"parametro\": \"totem_id_remoto\", \"valor\": read })\nflow.set(\"totem_id_remoto\", read);\nread = config.conexion.totem_id\nconfig_conex.push({ \"parametro\": \"totem_id\", \"valor\": read })\nflow.set(\"totem_id\", read);\nread = config.conexion.numero_vial;\nconfig_conex.push({ \"parametro\": \"numero_vial\", \"valor\": read })\nflow.set(\"numero_vial\", read);\nread = config.conexion.ip_totem_pareja\nconfig_conex.push({ \"parametro\": \"ip_totem_pareja\", \"valor\": read })\nflow.set(\"ip_totem_pareja\", read);\nread = config.camara.camara_matricula\nconfig_camara.push({ \"parametro\": \"camara_matricula\", \"valor\": read })\nflow.set(\"camara_matricula\", read);\nread = config.camara.camaraID\nconfig_camara.push({ \"parametro\": \"camaraID\", \"valor\": read })\nflow.set(\"camaraID\", read);\nread = config.camara.camara_IP\nconfig_camara.push({ \"parametro\": \"camara_IP\", \"valor\": read })\nflow.set(\"camara_IP\", read);\n\n\n//---------------------------------------Lectura de Matricula-----------------------------------------------------------------------\nread = config.tiempos.time_max_2_bascula\nconfig_tiempos.push({ \"parametro\": \"time_max_2_bascula\", \"valor\": read })\nflow.set(\"time_max_2_bascula\", read);\nread = config.tiempos.wait_time_to_send_plate\nconfig_tiempos.push({ \"parametro\": \"wait_time_to_send_plate\", \"valor\": read })\nflow.set(\"wait_time_to_send_plate\", read);\nread = config.tiempos.max_wait_time_to_send_plate\nconfig_tiempos.push({ \"parametro\": \"max_wait_time_to_send_plate\", \"valor\": read })\nflow.set(\"max_wait_time_to_send_plate\", read);\nread = config.tiempos.max_time_bascula_sensor\nconfig_tiempos.push({ \"parametro\": \"max_time_bascula_sensor\", \"valor\": read })\nflow.set(\"max_time_bascula_sensor\", read);\nread = config.tiempos.time_to_snapshot\nconfig_tiempos.push({ \"parametro\": \"time_to_snapshot\", \"valor\": read })\nflow.set(\"time_to_snapshot\", read);\nflow.set(\"plate_sent\", false);\nflow.set(\"anpr0_flag\", false);\n\n//----------------------------------------Flags evento bascula---------------------------------------------------------------------------------------------\nflow.set(\"peso_trigger_OFF\", true);\nflow.set(\"peso_trigger_ON\", false);\n\n//-------------------------------------------------------------------------------------------------------------------------------------\n\nread = config.conexion.supervisor\nconfig_conex.push({ \"parametro\": \"supervisor\", \"valor\": read })\nflow.set(\"supervisor\", read);\n\n//---------------------------------------- Flags edicion de matricula ---------------------------------------------------------------------------------------------\nflow.set(\"badplate\", false) // inicializa flag de solicitu de modificación de matricula\nflow.set(\"prechar\", \"*\") // inicializa variable con caracter de prefijo para el $watch del nodo display de edicion de matricula\n\nflow.set(\"config_general\", config_general)\nflow.set(\"config_tiempos\", config_tiempos)\nflow.set(\"config_mensajes\", config_mensajes)\nflow.set(\"config_conex\", config_conex)\nflow.set(\"config_camara\", config_camara)\nflow.set(\"config_sensor\", config_sensor)\n\nflow.set(\"tiposDatosGlobal\", tiposOriginales) // Pasamos los datos de cada tipo a una variable de flow\n//notese que estos datos son leidos del archivo, sin hacerles transformacion a objeto.\n\n// Vamos a ver si tenemos que aplicar algun tipo de configuracion particular\nconst tipo = parseInt(config.general.Tipo_Configuracion, 10); // asegura que el numero es integer\n\nif (tipo > 0 && tipo <= 6) {\n const tipoDatos = config.tipos[tipo] || [];\n\n tipoDatos.forEach(item => {\n let valor = item.valor;\n\n if (valor === \"true\") valor = true;\n if (valor === \"false\") valor = false;\n\n flow.set(item.parametro, valor); // sobre escribimos el valor configurado con la configuracion que este definida en el tipo.\n });\n}\n\nreturn;\n\n\n//*********************************************************** FUNCIONES **************************************************/\nfunction toObject(array) {\n const obj = {};\n array.forEach(el => {\n obj[el.parametro] = el.valor;\n });\n return obj;\n}\n", "outputs": 2, "timeout": 0, "noerr": 0, @@ -6189,7 +6192,7 @@ "type": "comment", "z": "953e8740401d175c", "name": "Version 1.0 de bascula autonoma", - "info": "Para 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 se toma la matricula leida de la BD\n\nversion 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": "El 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\nversion 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": 1290, "y": 800, "wires": [] @@ -6210,8 +6213,8 @@ "className": "", "topic": "", "name": "aviso PMA", - "x": 1290, - "y": 1180, + "x": 1310, + "y": 1160, "wires": [ [] ] @@ -6617,7 +6620,7 @@ "z": "953e8740401d175c", "g": "9328043d4e9512a9", "name": "matricula-2", - "func": "// DEFINICION DE ALGUNOS FLAGS UTILIZADOS EN EL NODO\n//matricula_leida_flag: Si es igual a true, indica que hemos recibido matrícula de la camara.La matrícula puede ser valida o no.Sólo indica recepción de objeto de camara\n//peso_bajo_flag: Si es igual a true, indica que el ESTADO del peso esta por debajo del peso minimo.\n//Sirve para tomar unas acciones una sola vez cuándo se detecta peso > pmin(el flag esta en true en ese momento) y luego el flag pasa a false es decir el ESTADO ahora es peso por encima del minimo.\n//matricula_revisada: Si true, indica que la matrícula ha sido revisada en la Base de Datos\n//matricula_autorizada: Si true, indica que la matrícula ha sido encontrada en la base de datos y esta autorizada es decir dispone de un contrato por lo tanto el usuario va a recibir un menu en pantalla.\n//matricula_ok_flag : Si igual a true indica que el proceso de lectura de matrícula (camara o edicion en pantalla) ha sido completado satisfactoriamente y el sistema puede seguir adelante.\n//matricula_formato_flag: Si es igual a true indica que la matrícula recibida de la camara tiene el formato adecuado o que el conductor ha introducido en la pantalla una matrícula correcta en formato.\n//edicion_matricula: Si true, indica que el usuario puede utilizar el editor de matrícula en caso de error de lectura, para colocar la matrícula correcta.\n//editor_matricula_ok: Si true, indica que el usuario ha aceptado abrir el editor de matrículas.\n\n\n//====================================== Chequea validez de Matricula ========================================\nlet repetir_matricula = false // variable para gestionar repeticion de la edicion de matricula en caso de error en la introduccion\nif (flow.get(\"matricula_leida_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && !flow.get(\"peso_bajo_flag\")) { // Primero verifica si se ha leido y si esta aun en proceso\n if (flow.get(\"matricula_formato_flag\")) {// Verifica si la matricula recibida o editada esta en formato\n flow.set(\"matricula_ok_flag\", true) // matricula conforme en formato para seguir adelante con el proceso\n \n if(flow.get(\"menu_activo\")){// chequea si el totem debe estar pendiente de las matriculas y los contratos\n //================================================== MENU ACTIVO ================================================================================\n if (flow.get(\"matricula_revisada\")){//chequea si ya se ha revisado la existencia de la matricula en BD\n if (flow.get(\"matricula_autorizada\")){// Revisa si la matricula esta autorizada en BD\n flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n if (flow.get(\"tipo_movimiento\") == \"final\" && flow.get(\"botonsalida\") == false) {\n //node.warn(\"activado boton de salida\")\n flow.set(\"botonsalida\", true)\n }\n }\n else{\n \n // SIN edicion de matricula y SIN identificacion especial\n if (!flow.get(\"edicion_matricula\") && !flow.get(\"nota_avise_basculista_done\")){ \n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

AVISE AL BASCULISTA

\" }, null])\n flow.set(\"nota_avise_basculista_done\", true)\n }\n\n // Matricula editada anteriormente\n else if (flow.get(\"editor_matricula_ok\") && !flow.get(\"nota_vuelva_intentar_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

VUELVA A INTENTARLO

\" }, null])\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n flow.set(\"badplate_llamado\", false)\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n\n // Edicion de Matricula\n else if (flow.get(\"edicion_matricula\") && !flow.get(\"nota_modifique_matricula_done\")){\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

MODIFIQUE MATRICULA

\" }, null])\n flow.set(\"nota_modifique_matricula_done\", true)\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n /*\n //CON identificacion especial\n else if (flow.get(\"identificacion_esp\")) {\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n \n if (((flow.get(\"QR_revisado\") && flow.get(\"QR_verificado\")) || (flow.get(\"QR_revisado\") && flow.get(\"QR_verificado\"))) && flow.get(\"matricula_autorizada\")){\n\n }\n */\n }\n }\n else{// como aun no se ha revisado en BD entonces enviamos solicitud al Supervisor\n let matricula = flow.get(\"matricula\")\n //msg.topic = `SELECT v.Matricula, v.Autorizado FROM Vehiculos v WHERE v.Matricula = ('${matricula}')`;\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\") ,device: \"supervisor\", accion:\"check\", matricula: matricula }\n \n node.send([null, null, msg]) \n }\n }\n //============================================================= MENU NO ACTIVO ======================================================================================\n else {// MATRICULA en formato, SIN MENU ACTIVO\n //node.warn(\"sin menu, matricula ok\")\n //flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n //flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"))\n node.send([null, { payload: \"

MATRICULA OK

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n \n //Guardamos la imagen del vehiculo en un archivo. Lo hacemos aqui y no al recibir la imagen por si hubo una edicion de la matricula\n //en ese caso el nombre de la imagen fue regenerado con la nueva matricula\n flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n let msg_plate = { payload: flow.get(\"matricula_image\"), filename: flow.get(\"path_images\") + flow.get(\"nombre_imagen\") }\n node.send([msg_plate, null])\n\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n }\n }\n //=============================== MATRICULA FUERA DE FORMATO =====================================\n else {\n // CON Edicion de Matricula\n if (flow.get(\"edicion_matricula\")) { \n if (!flow.get(\"editor_matricula_ok\")) {// Si la edicion ha sido habilitada y aun no hemos sacado el editor de matricula entonces sacamos la ventana de edicion\n flow.set(\"badplate\", true)\n //flow.set(\"badplate_llamado\", false) // permite sacar nuevamente la notificacion para editar matricula\n }\n\n //Caso donde el usuario no hace edicion sino que presenta identificacion\n if(flow.get(\"RFID_revisado\") || flow.get(\"QR_revisado\")){\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n //flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n }\n\n }\n\n // SIN Edicion de Matricula\n else if (!flow.get(\"edicion_matricula\")) { // si edicion de matricula no esta habilitada solicitamos que el vehiculo entre de nuevo en la bascula\n //completamos datos del registro para registrar el movimiento al momento que el peso < pmin\n\n // SIN Identificacion Especial\n if (!flow.get(\"identificacion_esp\")) {\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 = 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\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n //sacamos notificacion en pantalla para volver a entrar en bascula\n node.send([null, { payload: \"

MATRICULA ERRONEA

VUELVA A ENTRAR EN LA BASCULA

\" }, null])\n }\n\n // CON Identificacion Especial y QR o RFID revisado (autorizado)\n //else if (flow.get(\"RFID_revisado\") || flow.get(\"QR_revisado\")) {//caso donde identificacion_esp es verdadero\n else{\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n }\n }\n}\n\n//------------------------------------------ Edicion de Matricula ------------------------------------------------------\nif (flow.get(\"badplate\") && !flow.get(\"badplate_llamado\")) { // se ejecuta si no se ha llamado antes\n flow.set(\"badplate_llamado\", true) // Marcamos que hemos sacado la notificacion \n let matricula = flow.get(\"matricula\")\n if (matricula == \"NOT FOUND\" || matricula == \"\"){ // evitamos escribir NOT FOUND en la pantalla de edicion de matricula\n matricula = \"\"\n }\n const matricula_array = matricula.split('')\n const matricula_final = new Array(8) // Tamaño maximo de la matricula\n for (let i = 0; i < matricula_array.length; i++) {\n matricula_final[i] = matricula_array[i];\n }\n flow.set(\"matricula_array\", matricula_final)\n //node.warn(\"matricula_revisada = \" + flow.get(\"matricula_revisada\") + \" matricula = \" + matricula)\n if(repetir_matricula != true){\n node.send([null, {payload:\"

MATRICULA ERRONEA

MODIFIQUE EN LA SIGUIENTE PANTALLA

\", matricula:matricula_final, size:matricula_final.length}])\n }\n else\n setTimeout(() => {\n node.send([null, { payload: \"

MODIFIQUE MATRICULA

EN LA SIGUIENTE PANTALLA

\", matricula: matricula_final, size: matricula_final.length }])\n }, 3000); \n}\n//-------------------------------------------------------------------------------------------------------------------------\n //=============================================================================================================\nreturn;", + "func": "// DEFINICION DE ALGUNOS FLAGS UTILIZADOS EN EL NODO\n//matricula_leida_flag: Si es igual a true, indica que hemos recibido matrícula de la camara.La matrícula puede ser valida o no.Sólo indica recepción de objeto de camara\n//peso_bajo_flag: Si es igual a true, indica que el ESTADO del peso esta por debajo del peso minimo.\n//Sirve para tomar unas acciones una sola vez cuándo se detecta peso > pmin(el flag esta en true en ese momento) y luego el flag pasa a false es decir el ESTADO ahora es peso por encima del minimo.\n//matricula_revisada: Si true, indica que la matrícula ha sido revisada en la Base de Datos\n//matricula_autorizada: Si true, indica que la matrícula ha sido encontrada en la base de datos y esta autorizada es decir dispone de un contrato por lo tanto el usuario va a recibir un menu en pantalla.\n//matricula_ok_flag : Si igual a true indica que el proceso de lectura de matrícula (camara o edicion en pantalla) ha sido completado satisfactoriamente y el sistema puede seguir adelante.\n//matricula_formato_flag: Si es igual a true indica que la matrícula recibida de la camara tiene el formato adecuado o que el conductor ha introducido en la pantalla una matrícula correcta en formato.\n//edicion_matricula: Si true, indica que el usuario puede utilizar el editor de matrícula en caso de error de lectura, para colocar la matrícula correcta.\n//editor_matricula_ok: Si true, indica que el usuario ha aceptado abrir el editor de matrículas.\n\n\n//====================================== Chequea validez de Matricula ========================================\nlet repetir_matricula = false // variable para gestionar repeticion de la edicion de matricula en caso de error en la introduccion\nif (flow.get(\"matricula_leida_flag\") && !flow.get(\"supervisor\") && flow.get(\"totem_master\") && !flow.get(\"peso_bajo_flag\")) { // Primero verifica si se ha leido y si esta aun en proceso\n if (flow.get(\"matricula_formato_flag\")) {// Verifica si la matricula recibida o editada esta en formato\n flow.set(\"matricula_ok_flag\", true) // matricula conforme en formato para seguir adelante con el proceso\n if (flow.get(\"matricula_revisada\")) {//chequea si ya se ha revisado la existencia de la matricula en BD\n if (flow.get(\"matricula_autorizada\")) {// Revisa si la matricula esta autorizada en BD\n flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n if (flow.get(\"tipo_movimiento\") == \"final\" && flow.get(\"botonsalida\") == false) {\n //node.warn(\"activado boton de salida\")\n flow.set(\"botonsalida\", true)\n }\n else if (flow.get(\"tipo_movimiento\") == \"inicial\" && !flow.get(\"menu_activo\")) {\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\")); \n }\n }\n else {\n\n // SIN edicion de matricula\n if (!flow.get(\"edicion_matricula\") && !flow.get(\"nota_avise_basculista_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

AVISE AL BASCULISTA

\" }, null])\n flow.set(\"nota_avise_basculista_done\", true)\n }\n\n // Matricula editada anteriormente\n else if (flow.get(\"editor_matricula_ok\") && !flow.get(\"nota_vuelva_intentar_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

VUELVA A INTENTARLO

\" }, null])\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n flow.set(\"badplate_llamado\", false)\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n\n // Edicion de Matricula\n else if (flow.get(\"edicion_matricula\") && !flow.get(\"nota_modifique_matricula_done\")) {\n node.send([null, { payload: \"

MATRICULA NO REGISTRADA

MODIFIQUE MATRICULA

\" }, null])\n flow.set(\"nota_modifique_matricula_done\", true)\n flow.set(\"nota_vuelva_intentar_done\", true)\n flow.set(\"badplate\", true) // para poder volver a sacar anuncio de matricula mala y editor de matricula\n repetir_matricula = true // para poder hacer un delay antes de sacar anuncio de editor\n }\n /*\n //CON identificacion especial\n else if (flow.get(\"identificacion_esp\")) {\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n \n if (((flow.get(\"QR_revisado\") && flow.get(\"QR_verificado\")) || (flow.get(\"QR_revisado\") && flow.get(\"QR_verificado\"))) && flow.get(\"matricula_autorizada\")){\n\n }\n */\n }\n }\n else {// como aun no se ha revisado en BD entonces enviamos solicitud al Supervisor\n if(!flow.get(\"matriculacheck_solicitada\")){\n let matricula = flow.get(\"matricula\")\n //msg.topic = `SELECT v.Matricula, v.Autorizado FROM Vehiculos v WHERE v.Matricula = ('${matricula}')`;\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), device: \"supervisor\", accion: \"check\", matricula: matricula }\n node.send([null, null, msg])\n flow.set(\"matriculacheck_solicitada\", true) // marca que se solicito revision de matricula\n setTimeout(function () { // timer para revisar si recibimos respuesta de BD\n if(!flow.get(\"matricula_revisada\")){ // Si matricula no ha sido revisada se vuelve a activar el chequeo de la matricula\n flow.set(\"matriculacheck_solicitada\", false)\n node.send([{payload:1}, null, null])\n }\n }, 5000)\n \n }\n }\n \n /*\n \n if(flow.get(\"menu_activo\")){// chequea si el totem debe estar pendiente de las matriculas y los contratos\n //================================================== MENU ACTIVO ================================================================================\n \n }\n //============================================================= MENU NO ACTIVO ======================================================================================\n else {// MATRICULA en formato, SIN MENU ACTIVO\n //node.warn(\"sin menu, matricula ok\")\n \n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n flow.set(\"window_men_m3\", flow.get(\"men_identificacion\"))\n //node.send([null, { payload: \"

MATRICULA OK

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n let matricula = flow.get(\"matricula\")\n msg.payload = { numero_vial: flow.get(\"numero_vial\"), totem_id: flow.get(\"totem_id\"), device: \"supervisor\", accion: \"check\", matricula: matricula }\n node.send([null, null, msg]) \n //Guardamos la imagen del vehiculo en un archivo. Lo hacemos aqui y no al recibir la imagen por si hubo una edicion de la matricula\n //en ese caso el nombre de la imagen fue regenerado con la nueva matricula\n //flow.set(\"matricula_leida_flag\", false) // proceso de matricula ya finalizado, evita entrar aqui otra vez\n let msg_plate = { payload: flow.get(\"matricula_image\"), filename: flow.get(\"path_images\") + flow.get(\"nombre_imagen\") }\n node.send([msg_plate, null])\n\n }\n */\n }\n //=============================== MATRICULA FUERA DE FORMATO =====================================\n else {\n // CON Edicion de Matricula\n if (flow.get(\"edicion_matricula\")) { \n if (!flow.get(\"editor_matricula_ok\")) {// Si la edicion ha sido habilitada y aun no hemos sacado el editor de matricula entonces sacamos la ventana de edicion\n flow.set(\"badplate\", true)\n //flow.set(\"badplate_llamado\", false) // permite sacar nuevamente la notificacion para editar matricula\n }\n\n //Caso donde el usuario no hace edicion sino que presenta identificacion\n if(flow.get(\"RFID_revisado\") || flow.get(\"QR_revisado\")){\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n //flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n }\n\n }\n\n // SIN Edicion de Matricula\n else if (!flow.get(\"edicion_matricula\")) { // si edicion de matricula no esta habilitada solicitamos que el vehiculo entre de nuevo en la bascula\n //completamos datos del registro para registrar el movimiento al momento que el peso < pmin\n \n //node.send([null, { payload: \"

MATRICULA ERRONEA

VUELVA A ENTRAR EN LA BASCULA O PRESENTE UNA IDENTIFICACION

\" }, null])\n let matricula = flow.get(\"matricula\")\n node.send([\n null,\n {\n payload:\n \"
\" +\n \"

MATRICULA ERRONEA

\" +\n \"

Matrícula: \" + matricula + \"

\" +\n \"

VUELVA A ENTRAR EN LA BASCULA O PRESENTE UNA IDENTIFICACION

\" +\n \"
\"\n },\n null\n ]);\n\n\n\n\n\n\n//Tengo que analizar el caso cuando no hay editor de matricula . Hay que salir de la bascula o presentar un ID para verificar la matricula asociada\n// **************************************************************************************\n\n\n/* PARTE ANTERIOR *******************************************************************\n\n // SIN Identificacion Especial\n if (!flow.get(\"identificacion_esp\")) {\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 = 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\n flow.set(\"register\", new_register)\n flow.set(\"movimiento_registrado_flag\", true)\n //sacamos notificacion en pantalla para volver a entrar en bascula\n node.send([null, { payload: \"

MATRICULA ERRONEA

VUELVA A ENTRAR EN LA BASCULA

\" }, null])\n }\n\n // CON Identificacion Especial y QR o RFID revisado (autorizado)\n //else if (flow.get(\"RFID_revisado\") || flow.get(\"QR_revisado\")) {//caso donde identificacion_esp es verdadero\n else{\n flow.set(\"matricula_leida_flag\", false) // marcamos como si la matricula se hubiera leido ya que aplicamos identificacion especial\n flow.set(\"identificacion_esp_aplicada\", true)\n flow.set(\"matricula_ok_flag\", true) // marcamos como matricula conforme para seguir adelante con el proceso\n flow.set(\"identificacion_pendiente\", true) // pendiente de presentar identificacion\n if (flow.get(\"botonsalida_activo\")) {\n flow.set(\"botonsalida\", true)\n }\n node.send([null, { payload: \"

MATRICULA ERRONEA

DEBE PRESENTAR UN QR O TARJETA VALIDA

\" }, null])\n }\n\n************************************************************************************/\n\n }\n }\n}\n\n//------------------------------------------ Edicion de Matricula ------------------------------------------------------\nif (flow.get(\"badplate\") && !flow.get(\"badplate_llamado\")) { // se ejecuta si no se ha llamado antes\n flow.set(\"badplate_llamado\", true) // Marcamos que hemos sacado la notificacion \n let matricula = flow.get(\"matricula\")\n if (matricula == \"NOT FOUND\" || matricula == \"\"){ // evitamos escribir NOT FOUND en la pantalla de edicion de matricula\n matricula = \"\"\n }\n const matricula_array = matricula.split('')\n const matricula_final = new Array(8) // Tamaño maximo de la matricula\n for (let i = 0; i < matricula_array.length; i++) {\n matricula_final[i] = matricula_array[i];\n }\n flow.set(\"matricula_array\", matricula_final)\n //node.warn(\"matricula_revisada = \" + flow.get(\"matricula_revisada\") + \" matricula = \" + matricula)\n if(repetir_matricula != true){\n node.send([null, {payload:\"

MATRICULA ERRONEA

MODIFIQUE EN LA SIGUIENTE PANTALLA

\", matricula:matricula_final, size:matricula_final.length}])\n }\n else\n setTimeout(() => {\n node.send([null, { payload: \"

MODIFIQUE MATRICULA

EN LA SIGUIENTE PANTALLA

\", matricula: matricula_final, size: matricula_final.length }])\n }, 3000); \n}\n//-------------------------------------------------------------------------------------------------------------------------\n //=============================================================================================================\nreturn;", "outputs": 3, "timeout": 0, "noerr": 0, @@ -6627,12 +6630,15 @@ "x": 1090, "y": 1200, "wires": [ - [], + [ + "185e340354acf892" + ], [ "944c9f4b068e0946" ], [ - "5a4bb45aef7a1433" + "5a4bb45aef7a1433", + "b31db528b0be605a" ] ] }, @@ -6719,5 +6725,37 @@ "x": 4120, "y": 1540, "wires": [] + }, + { + "id": "b31db528b0be605a", + "type": "debug", + "z": "953e8740401d175c", + "g": "9328043d4e9512a9", + "name": "debug 20", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 1340, + "y": 1260, + "wires": [] + }, + { + "id": "185e340354acf892", + "type": "link out", + "z": "953e8740401d175c", + "g": "9328043d4e9512a9", + "name": "recheck matricula", + "mode": "link", + "links": [ + "e0b4dd6107f95f28" + ], + "x": 1205, + "y": 1180, + "wires": [] } ] \ No newline at end of file