Compare commits
No commits in common. "lm-testpanel-10-0-0-5" and "master" have entirely different histories.
lm-testpan
...
master
45 changed files with 5726 additions and 9306 deletions
5
config
5
config
|
|
@ -6,8 +6,7 @@ package#flow (Object) : { url: '/' }
|
|||
|
||||
|
||||
table.relays : line:number|tbname:string|contactor:number|profile:string
|
||||
table.nodes : node:number|tbname:string|line:number|profile:string|processed:boolean|status:boolean|time_of_last_communication:number
|
||||
table.settings : rvo_name:string|lang:string|temperature_address:string|latitude:number|longitude:number|mqtt_host:string|mqtt_clientid:string|mqtt_username:string|mqtt_port:number|maintanace_mode:boolean|projects_id:number|controller_type:string|serial_port:string|backup_on_failure:boolean|restore_from_backup:number|restore_backup_wait:number|node_status_nok_time:number|phases:number
|
||||
table.nodes : node:number|tbname:string|line:number|profile:string|processed:boolean|status:boolean
|
||||
table.settings : rvo_name:string|lang:string|temperature_adress:string|latitude:number|longitude:number|mqtt_host:string|mqtt_clientid:string|mqtt_username:string|mqtt_port:number|maintanace_mode:boolean|projects_id:number|controller_type:string|serial_port:string|backup_on_failure:boolean|restore_from_backup:number|restore_backup_wait:number
|
||||
table.pins : pin:string|type:string|line:number
|
||||
table.notifications : key:string|weight:string|sk:string|en:string
|
||||
table.status : thermometer:string|em:string|twilight_sensor:string
|
||||
|
|
|
|||
114
databases/modbus_config.js
Normal file
114
databases/modbus_config.js
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
const timeoutInterval = 150000;
|
||||
|
||||
const deviceConfig = [
|
||||
{
|
||||
device: "em340",
|
||||
deviceAddress: 1,
|
||||
stream: [
|
||||
{
|
||||
"tbAttribute": "Phase_1_voltage",
|
||||
"register": 0,
|
||||
"size": 2,
|
||||
"multiplier": 0.1
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_2_voltage",
|
||||
"register": 2,
|
||||
"size": 2,
|
||||
"multiplier": 0.1
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_3_voltage",
|
||||
"register": 4,
|
||||
"size": 2,
|
||||
"multiplier": 0.1
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_1_current",
|
||||
"register": 12,
|
||||
"size": 2,
|
||||
"multiplier": 0.001
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_2_current",
|
||||
"register": 14,
|
||||
"size": 2,
|
||||
"multiplier": 0.001
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_3_current",
|
||||
"register": 16,
|
||||
"size": 2,
|
||||
"multiplier": 0.001
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_1_power",
|
||||
"register": 18,
|
||||
"size": 2,
|
||||
"multiplier": 0.1
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_2_power",
|
||||
"register": 20,
|
||||
"size": 2,
|
||||
"multiplier": 0.1
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_3_power",
|
||||
"register": 22,
|
||||
"size": 2,
|
||||
"multiplier": 0.1
|
||||
},
|
||||
{
|
||||
"tbAttribute": "total_power",
|
||||
"register": 40,
|
||||
"size": 2,
|
||||
"multiplier": 0.1
|
||||
},
|
||||
{
|
||||
"tbAttribute": "total_energy",
|
||||
"register": 52,
|
||||
"size": 2,
|
||||
"multiplier": 0.1
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_1_pow_factor",
|
||||
"register": 46,
|
||||
"size": 1,
|
||||
"multiplier": 0.001
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_2_pow_factor",
|
||||
"register": 47,
|
||||
"size": 1,
|
||||
"multiplier": 0.001
|
||||
},
|
||||
{
|
||||
"tbAttribute": "Phase_3_pow_factor",
|
||||
"register": 48,
|
||||
"size": 1,
|
||||
"multiplier": 0.001
|
||||
},
|
||||
{
|
||||
"tbAttribute": "power_factor",
|
||||
"register": 49,
|
||||
"size": 1,
|
||||
"multiplier": 0.001
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
device: "twilight_sensor",
|
||||
deviceAddress: 2,
|
||||
stream: [
|
||||
{
|
||||
"tbAttribute": "twilight_sensor",
|
||||
"register": 60,
|
||||
"size": 2,
|
||||
"multiplier": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
module.exports = { timeoutInterval, deviceConfig };
|
||||
|
|
@ -1,8 +1,31 @@
|
|||
node:number|tbname:string|line:number|profile:string|processed:boolean|status:boolean|time_of_last_communication:number
|
||||
+|637|E6Kg9oDnLWyzPRMva7vrqy7Jxp4VG58qO2w1lZYe|3|{"intervals":[{"cct":3000,"value":10,"end_time":"20:00","start_time":"13:00"},{"cct":3000,"value":20,"end_time":"05:30","start_time":"20:00"},{"cct":3000,"value":10,"end_time":"13:00","start_time":"05:30"}],"astro_clock":false,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":-20,"dusk_astro_clock_offset":20,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|1|1|1733160546993|...........................................................................................................................................................................................................................................................
|
||||
-|640|pE5X8NQPaow6vlOZxk6gnw7q42ezGBMyWgDVjR3L|2|{"intervals":[{"cct":3000,"value":10,"end_time":"20:00","start_time":"13:00"},{"cct":3000,"value":20,"end_time":"05:30","start_time":"20:00"},{"cct":3000,"value":10,"end_time":"13:00","start_time":"05:30"}],"astro_clock":false,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":-20,"dusk_astro_clock_offset":20,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|1|1|1730588947491|.............
|
||||
+|692|2O14VBzl8aDmWdNw3A518OAGyZ5qLJoEMpj6R9ng|2|{"intervals":[{"cct":3000,"value":10,"end_time":"20:00","start_time":"13:00"},{"cct":3000,"value":20,"end_time":"05:30","start_time":"20:00"},{"cct":3000,"value":10,"end_time":"13:00","start_time":"05:30"}],"astro_clock":false,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":-20,"dusk_astro_clock_offset":20,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|1|1|1730674756237|.......
|
||||
+|698|m6EYyZoJ4gWexdjVPARNVLARDOq9wv2N5XzKGplr|1|{"intervals":[{"cct":3000,"value":0,"end_time":"19:40","start_time":"13:00"},{"cct":3000,"value":40,"end_time":"05:30","start_time":"19:40"},{"cct":3000,"value":0,"end_time":"13:00","start_time":"05:30"}],"astro_clock":true,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":0,"dusk_astro_clock_offset":0,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|1|1|1729806347930|.............
|
||||
-|638|rDbQ84xzwgdqEoPm3kbJQWk9anOZY1RXyBv2LVM6|3|{"intervals":[{"cct":3000,"value":10,"end_time":"20:00","start_time":"13:00"},{"cct":3000,"value":20,"end_time":"05:30","start_time":"20:00"},{"cct":3000,"value":10,"end_time":"13:00","start_time":"05:30"}],"astro_clock":false,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":-20,"dusk_astro_clock_offset":20,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|1|1|1730376263529|
|
||||
+|640|pE5X8NQPaow6vlOZxk6gnw7q42ezGBMyWgDVjR3L|2|{"intervals":[{"cct":3000,"value":0,"end_time":"14:00","start_time":"13:00"},{"cct":3000,"value":10,"end_time":"14:10","start_time":"14:00"},{"cct":3000,"value":0,"end_time":"13:00","start_time":"05:30"},{"cct":3000,"value":30,"end_time":"14:20","start_time":"14:10"},{"cct":3000,"value":40,"end_time":"14:30","start_time":"14:20"},{"cct":3000,"value":50,"end_time":"14:40","start_time":"14:30"},{"cct":3000,"value":10,"end_time":"05:30","start_time":"14:40"}],"astro_clock":false,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":0,"dusk_astro_clock_offset":0,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|1|0|1730674754903|.............
|
||||
+|638|rDbQ84xzwgdqEoPm3kbJQWk9anOZY1RXyBv2LVM6|3|{"intervals":[{"cct":3000,"value":0,"end_time":"14:00","start_time":"13:00"},{"cct":3000,"value":10,"end_time":"14:10","start_time":"14:00"},{"cct":3000,"value":0,"end_time":"13:00","start_time":"05:30"},{"cct":3000,"value":30,"end_time":"14:20","start_time":"14:10"},{"cct":3000,"value":40,"end_time":"14:30","start_time":"14:20"},{"cct":3000,"value":50,"end_time":"14:40","start_time":"14:30"},{"cct":3000,"value":10,"end_time":"05:30","start_time":"14:40"}],"astro_clock":false,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":0,"dusk_astro_clock_offset":0,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|1|1|1733160548434|.............
|
||||
node:number|tbname:string|line:number|profile:string|processed:boolean|status:boolean
|
||||
+|3522|RO8rjaBDy21qPQJzW7oD96ApK3xmNleVZg9Ed4Gw|1||1|1|...........
|
||||
+|4018|3JjOWdylwgNLzxVab7NEznkZ2vG64rq8PEB5QmDo|1||1|1|...........
|
||||
+|4019|Z5KyJe9nEg1QNbWlX0wWRB0oDjBLdqzR83VGv624|1||1|1|...........
|
||||
+|4154|1JMYvnx2RzKEo4aWQ7DmN5AL8yZV3m9NBePXbrdj|1||1|0|...........
|
||||
+|3907|PjLblDgRBO6WQqnxmkJ59r0Jv3ewZN4p5a89yKdY|1||1|1|...........
|
||||
+|4148|dz4ojlpP85JMgDLZWkQOoGAaKYqQexEr62GXRV1y|1||1|1|...........
|
||||
+|4153|d5xjWYMwEJon6rLlK7yBYmAqgV4DaOeNB9ZX3Gzb|1||1|1|...........
|
||||
+|3938|gRoJEyXVx4qD9er287LP1v7wBzGldaPjLWQKm3Mv|1||1|1|...........
|
||||
+|3802|K94XLav1glVRnyQ6r01BNzkme3YJwBxM5oOzdP2j|1||1|1|...........
|
||||
+|4015|d9x2V5LGYBzXp4mMRAOBDj7PloaqJwnQj6DgrNe3|1||1|0|...........
|
||||
+|3929|B5EoxeMVp4zwr8nqW0GjDpARjvD1PNamOGbLg63Z|1||1|1|...........
|
||||
+|3946|aw4eELG2DlPMdn1JW0B1DnAqQXOZRN3xB5yp8VKr|1||1|1|...........
|
||||
+|4014|ZmRwd93QL4gaezxEbAxW5971prn2XjlPvGyqJ6BO|1||1|1|...........
|
||||
+|4155|eod9aRWLVl34Gx1Dn7VoaaA2rz6qjgmpEXwQJN5Z|1||1|1|...........
|
||||
+|4149|3a5oqJN1bgnx4Ol9dk86NBAByE6jQ8mKDWMpGrLV|1||1|1|...........
|
||||
+|3642|EjgWGnXaLy9opPOz20n694086BlYM3w1deVQvbKr|1||1|1|...........
|
||||
+|3636|wvKJdZML6mXP4DzWBAXWNW7jxNloa5g23Ve9Y1ry|1||1|1|...........
|
||||
+|3991|Nzp2OoJlqn6r1ZgvdA3GWdAabBwP5G4eE3RQmyxD|1||1|1|...........
|
||||
+|3994|PLBJzmK1r3Gynd6OW0gGdM0e5wV4vx9bDEqNgYR8|1||1|1|...........
|
||||
+|3990|52dD6ZlV1QaOpRBmbAqKZgkKnGzWMLj4eJq38Pgo|1||1|1|...........
|
||||
+|3967|rDbQ84xzwgdqEoPm3kbJw3k9anOZY1RXyBv2LVM6|1||1|1|...........
|
||||
+|3977|E6Kg9oDnLWyzPRMva7vrwa7Jxp4VG58qO2w1lZYe|1||1|1|...........
|
||||
+|3757|roKgWqY95V3mXMRzyAjm8D7bLjexpJPvaGDBw826|1||1|1|...........
|
||||
+|3633|nJL5lPMwBx23YpqRe0rlKV7damXvWVbOrD4gNzy8|1||1|1|...........
|
||||
+|3744|ZmRwd93QL4gaezxEbAxW5O71prn2XjlPvGyqJ6BO|1||1|1|...........
|
||||
+|4023|eod9aRWLVl34Gx1Dn7VoaMA2rz6qjgmpEXwQJN5Z|1||1|1|...........
|
||||
+|3720|3a5oqJN1bgnx4Ol9dk86NZAByE6jQ8mKDWMpGrLV|1||1|1|...........
|
||||
+|3734|EjgWGnXaLy9opPOz20n69V086BlYM3w1deVQvbKr|1||1|1|...........
|
||||
+|3741|wvKJdZML6mXP4DzWBAXWN17jxNloa5g23Ve9Y1ry|1||1|1|...........
|
||||
+|3721|Nzp2OoJlqn6r1ZgvdA3GWKAabBwP5G4eE3RQmyxD|1||0|0|...........
|
||||
|
|
|
|||
|
|
@ -20,9 +20,9 @@ key:string|weight:string|sk:string|en:string
|
|||
+|power_supply_works_correctly|NOTICE|Napájací zdroj pracuje správne|Power supply works correctly|...............
|
||||
+|battery_level_is_low|ERROR|Batéria má nízku úroveň napätia|Battery level is low|...............
|
||||
+|battery_level_is_ok|NOTICE|Batéria má správnu úroveň napätia|Battery level is OK|...............
|
||||
+|door_opened|NOTICE|Dvere boli otvorené|Door has been opeed|...............
|
||||
+|door_closed|NOTICE|Dvere boli zatvorené|Door has been closed|...............
|
||||
+|door_opened_without_permission|WARNING|Dvere boli otvorené bez povoeania - zapnutá siréna|Door has been oed without permision - alarm is on|...............
|
||||
+|door_has_been_open|NOTICE|Dvere boli otvorené|Door has been open|...............
|
||||
+|door_has_been_closed|NOTICE|Dvere boli zatvorené|Door has been closed|...............
|
||||
+|door_has_been_open_without_permision_alarm_is_on|WARNING|Dvere boli otvorené bez povolania - zapnutá siréna|Door has been open without permision - alarm is on|...............
|
||||
+|state_of_contactor_for_line|INFORMATIONAL|Stav stýkača pre líniu č. ${line} je ${value}|State of contactor for line no. ${line} is ${value}|...............
|
||||
+|local_database_is_corrupted|CRITICAL|||...............
|
||||
+|electrometer_nok|ERROR|Elektromer neodpovedá|Electrometer is not responding|...............
|
||||
|
|
@ -35,4 +35,3 @@ key:string|weight:string|sk:string|en:string
|
|||
+|lamps_have_turned_on|NOTICE|Lampy sa zapli|Lamps have turned on|...............
|
||||
+|lamps_have_turned_off|NOTICE|Lampy sa vypli|Lamps have turned off|...............
|
||||
+|flow_restart|NOTICE|Restart flowu|Flow has been restarted|...............
|
||||
+|nodes_db_changed|NOTICE|Zmena v node databaze|Node db has changed|...............
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
pin:string|type:string|line:number
|
||||
+|1|state_of_main_switch|0|.........
|
||||
+|2|rotary_switch_state|0|.........
|
||||
+|3|rotary_switch_state|0|.........
|
||||
+|4|power_supply|0|.........
|
||||
+|5|battery|0|.........
|
||||
+|6|door_condition|0|.........
|
||||
+|8|state_of_breaker|1|.........
|
||||
+|9|state_of_breaker|2|.........
|
||||
+|10|state_of_breaker|3|.........
|
||||
+|11|state_of_contactor|1|.........
|
||||
+|12|state_of_contactor|2|.........
|
||||
+|13|state_of_contactor|3|.........
|
||||
+|16|twilight_sensor|0|.........
|
||||
*|input1_01|door_condition|0|...........
|
||||
*|input1_02|rotary_switch_state|0|...........
|
||||
*|input1_03|rotary_switch_state|0|...........
|
||||
*|intut1_04|power_supply|0|...........
|
||||
*|input1_05|state_of_main_switch|0|...........
|
||||
*|input1_06|state_of_breaker|1|...........
|
||||
*|input1_07|state_of_breaker|2|...........
|
||||
*|input1_08|state_of_breaker|3|...........
|
||||
*|relay1_02|state_of_contactor|1|...........
|
||||
*|relay1_03|state_of_contactor|2|...........
|
||||
*|relay1_04|state_of_contactor|3|...........
|
||||
*|28F46E9D0E00008B|temperature|0|...........
|
||||
*|twilight_sensor|twilight_sensor|0|...........
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
line:number|tbname:string|contactor:number|profile:string
|
||||
+|0|PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8|1||...........
|
||||
+|3|52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo|9|{"intervals":[{"value":0,"end_time":"19:30","start_time":"13:00"},{"value":1,"end_time":"05:50","start_time":"19:30"},{"value":0,"end_time":"13:00","start_time":"05:50"}],"astro_clock":true,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":0,"dusk_astro_clock_offset":0,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|...........
|
||||
-|2|gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM|9||...........
|
||||
+|1|6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq|9||...........
|
||||
+|2|gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM|9||............
|
||||
+|0|6lQGaY9RDywdVzObj0PadOkPg4NBn3exEK51LWZq|1||...........
|
||||
+|1|JzwxZXOvDj1bVrN4nkWw9Qk8qdyBl3MRKLpGPgaQ|1|{"intervals":[{"value":0,"end_time":"20:00","start_time":"13:00"},{"value":1,"end_time":"08:00","start_time":"20:00"},{"value":0,"end_time":"13:00","start_time":"08:00"}],"astro_clock":true,"dawn_lux_sensor":true,"dusk_lux_sensor":true,"dawn_lux_sensor_value":15,"dusk_lux_sensor_value":15,"dawn_astro_clock_offset":0,"dusk_astro_clock_offset":0,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|...........
|
||||
+|2|g9OxBZ5KRwNznlY6pAp6mxkWXvjdEL4eGQobMDy2|1|{"intervals":[{"value":0,"end_time":"20:00","start_time":"13:00"},{"value":1,"end_time":"08:00","start_time":"20:00"},{"value":0,"end_time":"13:00","start_time":"08:00"}],"astro_clock":true,"dawn_lux_sensor":true,"dusk_lux_sensor":true,"dawn_lux_sensor_value":15,"dusk_lux_sensor_value":15,"dawn_astro_clock_offset":0,"dusk_astro_clock_offset":0,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|...........
|
||||
+|3|OzNMgZ9n43qPbjXmy7zWMJA2DKdYvW5e6pxGRrVa|1|{"intervals":[{"value":0,"end_time":"20:00","start_time":"13:00"},{"value":1,"end_time":"08:00","start_time":"20:00"},{"value":0,"end_time":"13:00","start_time":"08:00"}],"astro_clock":true,"dawn_lux_sensor":true,"dusk_lux_sensor":true,"dawn_lux_sensor_value":15,"dusk_lux_sensor_value":15,"dawn_astro_clock_offset":0,"dusk_astro_clock_offset":0,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}|...........
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
rvo_name:string|lang:string|temperature_address:string|latitude:number|longitude:number|mqtt_host:string|mqtt_clientid:string|mqtt_username:string|mqtt_port:number|maintanace_mode:boolean|projects_id:number|controller_type:string|serial_port:string|backup_on_failure:boolean|restore_from_backup:number|restore_backup_wait:number|node_status_nok_time:number|phases:number
|
||||
+|testpanel|en|28.427B45920702|48.70826502|17.28455203|192.168.252.1|showroom_test_panel_led|E1QTFLsN4wqyVER5xBaw|1883|0|0|lm|ttymxc4|1|20|5|0.1|3|...............................................
|
||||
rvo_name:string|lang:string|temperature_adress:string|latitude:number|longitude:number|mqtt_host:string|mqtt_clientid:string|mqtt_username:string|mqtt_port:number|maintanace_mode:boolean|projects_id:number|controller_type:string|serial_port:string|backup_on_failure:boolean|restore_from_backup:number|restore_backup_wait:number
|
||||
+|rvo_senica_39_10.0.0.132|en|28.427B45920702|48.70826502|17.28455203|192.168.252.1|rvo_senica_39_10.0.0.132|qzSNuCNrLP4OL1v47YEe|1883|0|68|unipi|ttyUSB0|1|20|5|...........................................
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
thermometer:string|em:string|twilight_sensor:string
|
||||
+|NOK|OK|OK|............
|
||||
|
|
@ -1,287 +0,0 @@
|
|||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730588333765,"values":{"maintenance_mode":false}}],"id":"2501279001ax71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730588333835,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2501279002ax70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730588333840,"values":{"state_of_main_switch":"closed"}}],"id":"2501279003ax71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730588333845,"values":{"power_supply":"On"}}],"id":"2501279004ax70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730588333851,"values":{"battery":"Off"}}],"id":"2501279005ax71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730588333855,"values":{"door_condition":"closed"}}],"id":"2501279006ax70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730588333867,"values":{"status":"OK"}}],"id":"2501279007ax71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730588333873,"values":{"statecode":2}}],"id":"2501279008ax70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730588333876,"values":{"state_of_breaker":"On"}}],"id":"2501279009ax71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730588333881,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2501279010ax70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730588333885,"values":{"status":"OK"}}],"id":"2501279011ax71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730588333887,"values":{"statecode":2}}],"id":"2501279012ax70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730588333890,"values":{"state_of_breaker":"On"}}],"id":"2501279013ax71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730588333893,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2501279014ax70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730588333896,"values":{"status":"OK"}}],"id":"2501279015ax71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730588333899,"values":{"statecode":2}}],"id":"2501279016ax70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730588333901,"values":{"state_of_breaker":"On"}}],"id":"2501279017ax71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730589728172,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2501302001ny71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730589728240,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2501302002ny70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730589728246,"values":{"state_of_main_switch":"closed"}}],"id":"2501302003ny71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730589728251,"values":{"power_supply":"On"}}],"id":"2501302004ny70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730589728256,"values":{"battery":"Off"}}],"id":"2501302005ny71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730589728260,"values":{"door_condition":"closed"}}],"id":"2501302006ny70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730589728272,"values":{"status":"OK"}}],"id":"2501302007ny71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730589728278,"values":{"statecode":2}}],"id":"2501302008ny70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730589728281,"values":{"state_of_breaker":"On"}}],"id":"2501302009ny71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730589728286,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2501302010ny70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730589728290,"values":{"status":"OK"}}],"id":"2501302011ny71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730589728293,"values":{"statecode":2}}],"id":"2501302012ny70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730589728295,"values":{"state_of_breaker":"On"}}],"id":"2501302013ny71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730589728299,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2501302014ny70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730589728302,"values":{"status":"OK"}}],"id":"2501302015ny71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730589728305,"values":{"statecode":2}}],"id":"2501302016ny70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730589728307,"values":{"state_of_breaker":"On"}}],"id":"2501302017ny71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730590126776,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2501309001xk71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730590126844,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2501309002xk70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730590126850,"values":{"state_of_main_switch":"closed"}}],"id":"2501309003xk71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730590126855,"values":{"power_supply":"On"}}],"id":"2501309004xk70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730590126860,"values":{"battery":"Off"}}],"id":"2501309005xk71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730590126865,"values":{"door_condition":"closed"}}],"id":"2501309006xk70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730590126877,"values":{"status":"OK"}}],"id":"2501309007xk71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730590126883,"values":{"statecode":2}}],"id":"2501309008xk70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730590126886,"values":{"state_of_breaker":"On"}}],"id":"2501309009xk71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730590126891,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2501309010xk70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730590126895,"values":{"status":"OK"}}],"id":"2501309011xk71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730590126897,"values":{"statecode":2}}],"id":"2501309012xk70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730590126900,"values":{"state_of_breaker":"On"}}],"id":"2501309013xk71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730590126903,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2501309014xk70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730590126906,"values":{"status":"OK"}}],"id":"2501309015xk71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730590126909,"values":{"statecode":2}}],"id":"2501309016xk70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730590126911,"values":{"state_of_breaker":"On"}}],"id":"2501309017xk71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730591367948,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2501329001ua71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730591368017,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2501329002ua70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730591368022,"values":{"state_of_main_switch":"closed"}}],"id":"2501329003ua71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730591368028,"values":{"power_supply":"On"}}],"id":"2501329004ua70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730591368032,"values":{"battery":"Off"}}],"id":"2501329005ua71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730591368037,"values":{"door_condition":"closed"}}],"id":"2501329006ua70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730591368049,"values":{"status":"OK"}}],"id":"2501329007ua71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730591368055,"values":{"statecode":2}}],"id":"2501329008ua70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730591368058,"values":{"state_of_breaker":"On"}}],"id":"2501329009ua71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730592105058,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2501342001ch71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730592105130,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2501342002ch70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730592105135,"values":{"state_of_main_switch":"closed"}}],"id":"2501342003ch71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730592105140,"values":{"power_supply":"On"}}],"id":"2501342004ch70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730592105145,"values":{"battery":"Off"}}],"id":"2501342005ch71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730592105150,"values":{"door_condition":"closed"}}],"id":"2501342006ch70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730592105162,"values":{"status":"OK"}}],"id":"2501342007ch71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730592105168,"values":{"statecode":2}}],"id":"2501342008ch70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730592105171,"values":{"state_of_breaker":"On"}}],"id":"2501342009ch71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730592105176,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2501342010ch70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730592105180,"values":{"status":"OK"}}],"id":"2501342011ch71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730592105182,"values":{"statecode":2}}],"id":"2501342012ch70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730592105185,"values":{"state_of_breaker":"On"}}],"id":"2501342013ch71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730592105188,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2501342014ch70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730592105191,"values":{"status":"OK"}}],"id":"2501342015ch71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730592105194,"values":{"statecode":2}}],"id":"2501342016ch70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730592105196,"values":{"state_of_breaker":"On"}}],"id":"2501342017ch71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730592105200,"values":{"twilight_sensor":31}}],"id":"2501342018ch70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730592420656,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2501347001nd71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730663586542,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2502533001gt71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730671706506,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2502668001yg71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672433386,"values":{"_event":{"type":"informational","status":"new","source":{"func":"CMD Manager: process cmd","component":"1619515097737","component_name":"CMD Manager","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: Switching profile point applied to line no. 2 : on","message_data":""}}}],"id":"2502681003ad71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672433494,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 2 is On","message_data":""}}}],"id":"2502681004ad70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672433568,"values":{"statecode":0}}],"id":"2502681005ad71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672433588,"values":{"state_of_contactor":true }}],"id":"2502681006ad70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672433849,"values":{"_event":{"type":"informational","status":"new","source":{"func":"CMD Manager: process cmd","component":"1619515097737","component_name":"CMD Manager","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: Switching profile point applied to line no. 3 : on","message_data":""}}}],"id":"2502681007ad71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672433892,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is On","message_data":""}}}],"id":"2502681008ad70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672433908,"values":{"statecode":0}}],"id":"2502681009ad71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672433910,"values":{"state_of_contactor":true }}],"id":"2502681010ad70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672777712,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2502686001di71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672777782,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2502686002di70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672777787,"values":{"state_of_main_switch":"closed"}}],"id":"2502686003di71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672777792,"values":{"power_supply":"On"}}],"id":"2502686004di70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672777798,"values":{"battery":"Off"}}],"id":"2502686005di71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672777802,"values":{"door_condition":"closed"}}],"id":"2502686006di70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730672777814,"values":{"status":"OK"}}],"id":"2502686007di71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730672777820,"values":{"statecode":2}}],"id":"2502686008di70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730672777824,"values":{"state_of_breaker":"On"}}],"id":"2502686009di71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672777828,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2502686010di70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672777832,"values":{"status":"OK"}}],"id":"2502686011di71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672777835,"values":{"statecode":2}}],"id":"2502686012di70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672777837,"values":{"state_of_breaker":"On"}}],"id":"2502686013di71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672777841,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2502686014di70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672777844,"values":{"status":"OK"}}],"id":"2502686015di71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672777847,"values":{"statecode":2}}],"id":"2502686016di70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672777849,"values":{"state_of_breaker":"On"}}],"id":"2502686017di71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672777872,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 1 is Off","message_data":""}}}],"id":"2502686018di70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730672777883,"values":{"state_of_contactor":false}}],"id":"2502686019di71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672777888,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 2 is Off","message_data":""}}}],"id":"2502686020di70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672777895,"values":{"state_of_contactor":false}}],"id":"2502686021di71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672777899,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is Off","message_data":""}}}],"id":"2502686022di70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672777905,"values":{"state_of_contactor":false}}],"id":"2502686023di71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672922976,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2502689001nu71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672923046,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2502689002nu70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672923052,"values":{"state_of_main_switch":"closed"}}],"id":"2502689003nu71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672923057,"values":{"power_supply":"On"}}],"id":"2502689004nu70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672923062,"values":{"battery":"Off"}}],"id":"2502689005nu71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672923066,"values":{"door_condition":"closed"}}],"id":"2502689006nu70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730672923078,"values":{"status":"OK"}}],"id":"2502689007nu71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730672923084,"values":{"statecode":2}}],"id":"2502689008nu70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730672923088,"values":{"state_of_breaker":"On"}}],"id":"2502689009nu71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672923092,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2502689010nu70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672923096,"values":{"status":"OK"}}],"id":"2502689011nu71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672923099,"values":{"statecode":2}}],"id":"2502689012nu70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672923101,"values":{"state_of_breaker":"On"}}],"id":"2502689013nu71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672923105,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2502689014nu70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672923108,"values":{"status":"OK"}}],"id":"2502689015nu71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672923111,"values":{"statecode":2}}],"id":"2502689016nu70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672923113,"values":{"state_of_breaker":"On"}}],"id":"2502689017nu71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672923136,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 1 is Off","message_data":""}}}],"id":"2502689018nu70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730672923147,"values":{"state_of_contactor":false}}],"id":"2502689019nu71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672923152,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 2 is Off","message_data":""}}}],"id":"2502689020nu70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730672923159,"values":{"state_of_contactor":false}}],"id":"2502689021nu71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730672923164,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is Off","message_data":""}}}],"id":"2502689022nu70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730672923170,"values":{"state_of_contactor":false}}],"id":"2502689023nu71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730673534730,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2502699001wb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730673534807,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2502699002wb70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730673534812,"values":{"state_of_main_switch":"closed"}}],"id":"2502699003wb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730673534818,"values":{"power_supply":"On"}}],"id":"2502699004wb70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730673534823,"values":{"battery":"Off"}}],"id":"2502699005wb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730673534827,"values":{"door_condition":"closed"}}],"id":"2502699006wb70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730673534840,"values":{"status":"OK"}}],"id":"2502699007wb71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730673534846,"values":{"statecode":2}}],"id":"2502699008wb70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730673534849,"values":{"state_of_breaker":"On"}}],"id":"2502699009wb71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730673534854,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2502699010wb70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730673534857,"values":{"status":"OK"}}],"id":"2502699011wb71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730673534860,"values":{"statecode":2}}],"id":"2502699012wb70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730673534863,"values":{"state_of_breaker":"On"}}],"id":"2502699013wb71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730673534866,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2502699014wb70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730673534869,"values":{"status":"OK"}}],"id":"2502699015wb71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730673534872,"values":{"statecode":2}}],"id":"2502699016wb70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730673534875,"values":{"state_of_breaker":"On"}}],"id":"2502699017wb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730673534918,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 1 is Off","message_data":""}}}],"id":"2502699018wb70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730673534942,"values":{"state_of_contactor":false}}],"id":"2502699019wb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730673534956,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 2 is Off","message_data":""}}}],"id":"2502699020wb70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730673534963,"values":{"state_of_contactor":false}}],"id":"2502699021wb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730673534968,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is Off","message_data":""}}}],"id":"2502699022wb70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730673534974,"values":{"state_of_contactor":false}}],"id":"2502699023wb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730675467314,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2502731001jm71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730676458104,"values":{"_event":{"type":"informational","status":"new","source":{"func":"CMD Manager: process cmd","component":"1619515097737","component_name":"CMD Manager","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: Switching profile point applied to line no. 2 : off","message_data":""}}}],"id":"2502748003ji71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730676458279,"values":{"_event":{"type":"informational","status":"new","source":{"func":"CMD Manager: process cmd","component":"1619515097737","component_name":"CMD Manager","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: Switching profile point applied to line no. 3 : off","message_data":""}}}],"id":"2502748004ji70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615197,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2502783001xe71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615259,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2502783002xe70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615264,"values":{"state_of_main_switch":"closed"}}],"id":"2502783003xe71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615270,"values":{"power_supply":"On"}}],"id":"2502783004xe70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615276,"values":{"battery":"Off"}}],"id":"2502783005xe71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615281,"values":{"door_condition":"closed"}}],"id":"2502783006xe70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730678615307,"values":{"status":"OK"}}],"id":"2502783007xe71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730678615313,"values":{"statecode":2}}],"id":"2502783008xe70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730678615316,"values":{"state_of_breaker":"On"}}],"id":"2502783009xe71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730678615321,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2502783010xe70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730678615324,"values":{"status":"OK"}}],"id":"2502783011xe71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730678615327,"values":{"statecode":2}}],"id":"2502783012xe70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730678615329,"values":{"state_of_breaker":"On"}}],"id":"2502783013xe71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730678615333,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2502783014xe70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730678615336,"values":{"status":"OK"}}],"id":"2502783015xe71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730678615338,"values":{"statecode":2}}],"id":"2502783016xe70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730678615340,"values":{"state_of_breaker":"On"}}],"id":"2502783017xe71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615396,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 1 is Off","message_data":""}}}],"id":"2502783018xe70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730678615433,"values":{"state_of_contactor":false}}],"id":"2502783019xe71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615453,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 2 is Off","message_data":""}}}],"id":"2502783020xe70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730678615470,"values":{"state_of_contactor":false}}],"id":"2502783021xe71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615487,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is Off","message_data":""}}}],"id":"2502783022xe70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730678615506,"values":{"state_of_contactor":false}}],"id":"2502783023xe71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730678615510,"values":{"twilight_sensor":31}}],"id":"2502783024xe70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730757867671,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2504104001au71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759363143,"values":{"_event":{"type":"informational","status":"new","source":{"func":"CMD Manager: process cmd","component":"1619515097737","component_name":"CMD Manager","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: Switching profile point applied to line no. 3 : on","message_data":""}}}],"id":"2504129003fe71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759363792,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is On","message_data":""}}}],"id":"2504129004fe70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730759363814,"values":{"statecode":0}}],"id":"2504129005fe71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730759363817,"values":{"state_of_contactor":true }}],"id":"2504129006fe70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759583799,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2504133001fr71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759583910,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"NOK","statecode":34}}],"id":"2504133002fr70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759583920,"values":{"state_of_main_switch":"closed"}}],"id":"2504133003fr71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759583925,"values":{"power_supply":"On"}}],"id":"2504133004fr70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759583930,"values":{"battery":"Off"}}],"id":"2504133005fr71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759583947,"values":{"door_condition":"closed"}}],"id":"2504133006fr70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730759583960,"values":{"status":"OK"}}],"id":"2504133007fr71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730759583965,"values":{"statecode":2}}],"id":"2504133008fr70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1730759583968,"values":{"state_of_breaker":"On"}}],"id":"2504133009fr71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730759583974,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2504133010fr70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730759583977,"values":{"status":"OK"}}],"id":"2504133011fr71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730759583980,"values":{"statecode":2}}],"id":"2504133012fr70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1730759583982,"values":{"state_of_breaker":"On"}}],"id":"2504133013fr71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730759583986,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2504133014fr70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730759583989,"values":{"status":"OK"}}],"id":"2504133015fr71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730759583991,"values":{"statecode":2}}],"id":"2504133016fr70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730759583993,"values":{"state_of_breaker":"On"}}],"id":"2504133017fr71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759985331,"values":{"_event":{"type":"informational","status":"new","source":{"func":"CMD Manager: process cmd","component":"1619515097737","component_name":"CMD Manager","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: Switching profile point applied to line no. 3 : on","message_data":""}}}],"id":"2504140003mc71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730759985367,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is On","message_data":""}}}],"id":"2504140004mc70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730759985398,"values":{"statecode":0}}],"id":"2504140005mc71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1730759985410,"values":{"state_of_contactor":true }}],"id":"2504140006mc70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1730761965548,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2504172001np71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731876994929,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2522756001rh71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731877329335,"values":{"_event":{"type":"informational","status":"new","source":{"func":"CMD Manager: process cmd","component":"1619515097737","component_name":"CMD Manager","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: Switching profile point applied to line no. 3 : on","message_data":""}}}],"id":"2522762003cs71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731877329409,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is On","message_data":""}}}],"id":"2522762004cs70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731877329460,"values":{"statecode":0}}],"id":"2522762005cs71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731877329478,"values":{"state_of_contactor":true }}],"id":"2522762006cs70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878106215,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2522775001tb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878106280,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"OK","statecode":34}}],"id":"2522775002tb70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878106285,"values":{"state_of_main_switch":"closed"}}],"id":"2522775003tb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878106322,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 1 is Off","message_data":""}}}],"id":"2522775004tb70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731878106365,"values":{"statecode":3}}],"id":"2522775005tb71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731878106370,"values":{"state_of_contactor":false}}],"id":"2522775006tb70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878106380,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 2 is Off","message_data":""}}}],"id":"2522775007tb71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731878106387,"values":{"statecode":3}}],"id":"2522775008tb70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731878106391,"values":{"state_of_contactor":false}}],"id":"2522775009tb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878106398,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is Off","message_data":""}}}],"id":"2522775010tb70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731878106404,"values":{"statecode":3}}],"id":"2522775011tb71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731878106407,"values":{"state_of_contactor":false}}],"id":"2522775012tb70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878106413,"values":{"power_supply":"On"}}],"id":"2522775013tb71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878106417,"values":{"battery":"Off"}}],"id":"2522775014tb70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878106420,"values":{"door_condition":"closed"}}],"id":"2522775015tb71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731878106425,"values":{"status":"OK"}}],"id":"2522775016tb70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731878106428,"values":{"statecode":2}}],"id":"2522775017tb71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731878106430,"values":{"state_of_breaker":"On"}}],"id":"2522775018tb70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731878106434,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2522775019tb71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731878106436,"values":{"status":"OK"}}],"id":"2522775020tb70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731878106439,"values":{"statecode":2}}],"id":"2522775021tb71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731878106441,"values":{"state_of_breaker":"On"}}],"id":"2522775022tb70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878260010,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2522777001wk71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878260073,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"OK","statecode":34}}],"id":"2522777002wk70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878260077,"values":{"state_of_main_switch":"closed"}}],"id":"2522777003wk71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878260083,"values":{"power_supply":"On"}}],"id":"2522777004wk70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878260088,"values":{"battery":"Off"}}],"id":"2522777005wk71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878260092,"values":{"door_condition":"closed"}}],"id":"2522777006wk70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731878260104,"values":{"status":"OK"}}],"id":"2522777007wk71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731878260110,"values":{"statecode":2}}],"id":"2522777008wk70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731878260113,"values":{"state_of_breaker":"On"}}],"id":"2522777009wk71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731878386415,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2522780001uh71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731881121143,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2522825001pn71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731881121208,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"OK","statecode":34}}],"id":"2522825002pn70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731881121213,"values":{"state_of_main_switch":"closed"}}],"id":"2522825003pn71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731881121226,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 1 is Off","message_data":""}}}],"id":"2522825004pn70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731881121245,"values":{"statecode":3}}],"id":"2522825005pn71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731881121249,"values":{"state_of_contactor":false}}],"id":"2522825006pn70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731881121256,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 2 is Off","message_data":""}}}],"id":"2522825007pn71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731881121263,"values":{"statecode":3}}],"id":"2522825008pn70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731881121266,"values":{"state_of_contactor":false}}],"id":"2522825009pn71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731881121273,"values":{"_event":{"type":"informational","status":"new","source":{"func":"switchLogic","component":"1730323243484","component_name":"DIDO_Controller","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: State of contactor for line no. 3 is Off","message_data":""}}}],"id":"2522825010pn70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731881121280,"values":{"statecode":3}}],"id":"2522825011pn71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731881121282,"values":{"state_of_contactor":false}}],"id":"2522825012pn70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731881121288,"values":{"power_supply":"On"}}],"id":"2522825013pn71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731881121293,"values":{"battery":"Off"}}],"id":"2522825014pn70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731881121297,"values":{"door_condition":"closed"}}],"id":"2522825015pn71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731881121302,"values":{"status":"OK"}}],"id":"2522825016pn70b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731881121305,"values":{"statecode":2}}],"id":"2522825017pn71b"}
|
||||
-"6lQGaY9RDywdVzObj0P1vrkPg4NBn3exEK51LWZq":[{"ts":1731881121308,"values":{"state_of_breaker":"On"}}],"id":"2522825018pn70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731881121311,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM"},"message":"testpanel: Circuit breaker was turned on - line no. 2","message_data":""}}}],"id":"2522825019pn71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731881121314,"values":{"status":"OK"}}],"id":"2522825020pn70b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731881121316,"values":{"statecode":2}}],"id":"2522825021pn71b"}
|
||||
-"gP1eOZVj3Q9lv5aDEk4EVP7rdpqW8yLm2BbKzJxM":[{"ts":1731881121318,"values":{"state_of_breaker":"On"}}],"id":"2522825022pn70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731881121347,"values":{"_event":{"type":"notice","status":"new","source":{"func":"CMD Manager: onData","component":"1619515097737","component_name":"CMD Manager","edge":"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo"},"message":"testpanel: Circuit breaker was turned on - line no. 3","message_data":""}}}],"id":"2522825023pn71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731881121353,"values":{"status":"OK"}}],"id":"2522825024pn70b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731881121360,"values":{"statecode":2}}],"id":"2522825025pn71b"}
|
||||
-"52dD6ZlV1QaOpRBmbAqK8bkKnGzWMLj4eJq38Pgo":[{"ts":1731881121362,"values":{"state_of_breaker":"On"}}],"id":"2522825026pn70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731884700377,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2522885001lo71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731884700441,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"OK","statecode":34}}],"id":"2522885002lo70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731884700446,"values":{"state_of_main_switch":"closed"}}],"id":"2522885003lo71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731884700451,"values":{"power_supply":"On"}}],"id":"2522885004lo70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731884700455,"values":{"battery":"Off"}}],"id":"2522885005lo71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731884854298,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2522887001ap71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731885414928,"values":{"_event":{"type":"informational","status":"new","source":{"func":"CMD Manager: process cmd","component":"1619515097737","component_name":"CMD Manager","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: Switching profile point applied to line no. 3 : off","message_data":""}}}],"id":"2522897013ln71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731885415091,"values":{"_event":{"type":"informational","status":"new","source":{"func":"CMD Manager: process cmd","component":"1619515097737","component_name":"CMD Manager","edge":"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8"},"message":"testpanel: Switching profile point applied to line no. 3 : off","message_data":""}}}],"id":"2522897014ln70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1731885602197,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2522900001jc71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1732040930566,"values":{"edge_fw_version":"2024-10-14","maintenance_mode":false}}],"id":"2525489001lu71b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1732040930629,"values":{"electrometer_status":1,"twilight_sensor_status":1,"thermometer_status":0,"phase_1_status":1,"phase_2_status":1,"phase_3_status":1,"master_node_status":1,"status":"OK","statecode":34}}],"id":"2525489002lu70b"}
|
||||
-"PLBJzmK1r3Gynd6OW0gGYz0e5wV4vx9bDEqNgYR8":[{"ts":1732040930634,"values":{"state_of_main_switch":"closed"}}],"id":"2525489003lu71b"}
|
||||
48
flow/audit_test_panel.csv
Normal file
48
flow/audit_test_panel.csv
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
LumDimm;NODE (HEX);NODE (DEC);Line;TB name
|
||||
1;299;665;3;gbv4nzqxW0XGAPKVNk8kr25ZQ2l3O6LRBprM97ew
|
||||
2;28A;650;3;0XYElWeKBNJn1gdoMG8lYdDALkPvj4V3xra2q6mO
|
||||
3;296;662;3;gbv4nzqxW0XGAPKVNk8kW48ZQ2l3O6LRBprM97ew
|
||||
4;297;663;1;LpkVlmq4b3jMwJQxBZ8akayrXAP6o97Ke0aOYEg2
|
||||
5;29C;668;3;lekrmdvO0BQG1ZW4AV8jeZ5M39xnN2wEbRgPjXLp
|
||||
6;2B1;689;3;q0rElBPdL6kxMAjnzVDRl95emNZY7oOv2wK9gb31
|
||||
7;2AB;683;3;XKQbz3WAwY21dGa0R453rWyJm9PZOjqlvpr6Nkeo
|
||||
8;2B0;688;3;PaGbQ3wBAZWOmRvK9VDpvz5endLJYopEqlkzNMxX
|
||||
9;2B9;697;3;joqRYBVL30k9eQWOlZ5qwpD2KJpNEmA6gPxXzwaM
|
||||
10;293;659;3;Ymn9oleRxJ0vw17WzAyGwdyEBk4ObdMXj2VgpNLG
|
||||
11;294;660;3;gj7zbKV46oQ1p2e0AJ8XqZDG3YNWaRrlOEXvBxmM
|
||||
12;295;661;3;laYK7Pomn2bNZXEpedDxAqyOJkQ3WwV49gqxLrAR
|
||||
13;2A0;672;2;0XYElWeKBNJn1gdoMG8lON5ALkPvj4V3xra2q6mO
|
||||
14;2B4;692;2;l9YkRpoB2vVa0mKqEO8ZGGDjW43eXnJML6GxzbwQ
|
||||
15;2B2;690;2;wGjQobgOK0n2YqBZmVDVR3DR9ep6EXA1ka3vzlP7
|
||||
16;27C;636;2;M6ogKQW09bOXewAYvZyvJqyJrV1aRnPGE37p42Nx
|
||||
17;27B;635;2;Vq2JaWpw1OdBKmNeoj8w605XE40l3kgL76Azb9QP
|
||||
18;2B6;694;2;Jm32GR1qpwQxlZza0N5mE15AP96YbOKLogrXVW4e
|
||||
19;2B5;693;2;KjbN4q7JPZmexgdnz2yKdn5YAWwO0Q3BMX6ERLoV
|
||||
20;2B3;691;1;lekrmdvO0BQG1ZW4AV8jzq8M39xnN2wEbRgPjXLp
|
||||
21;27F;639;3;BOjEzGRZ46bnp9wa2A8z76D0JkmW1QPNdrqevXVL
|
||||
22;27E;638;3;9xgzG4Op1BrKZPmoQkDrmj8E73ndJNMjavAwX2Re
|
||||
23;27D;637;3;koW06PeGrLlBp2YJQE5Ogw5RmMaXKzj3wOAZg9n7
|
||||
24;28F;655;2;RMgnK93rkoAazbqdQ4yBYpDZ1YXGx6pmwBeVEP2O
|
||||
25;288;648;2;gaMGN4x1e9JlZz0QPRDd9Rym6dVr3OpvqKnoWBbk
|
||||
26;298;664;1;oGVzxNWP9lrjaQ7vKODQ7g51gqp62YZREmdw3XBM
|
||||
27;29F;671;3;AvVdgzYJZaPx3oMqeED4Oj8NnmKkw716bRO90jLB
|
||||
28;280;640;2;WjBL12pg63eX4N9P7zy0XYyEJKmlbkGwZMx0avQV
|
||||
29;28B;651;2;qaAOzENGrvpbe0VoK7D6Ld519PZmdg3nl24JLQMk
|
||||
30;27A;634;2;NGWamnYqlP1wbgrZQxDAWm5e2X7OVAK69koR04vL
|
||||
31;29E;670;2;dlE1VQjYrNx9gZRmb38g1YyoLBO4qaAk2M6JPnG7
|
||||
32;281;641;2;vnmG4kJxaXWNBgMQq0D7Mz5e9oZzOAlr6LdR3w2V
|
||||
33;278;632;2;LpkVlmq4b3jMwJQxBZ8aM78rXAP6o97Ke0aOYEg2
|
||||
34;29D;669;3;Y9aLW03wOZkABvKXbMyL0lyV1xdNj72r4egqGRzJ
|
||||
35;2A8;680;1;KL2jNOVpdARa9XvoeJDPga8bkmPBxqn7Ww3gzGQ1
|
||||
36;2BA;698;1;mYnBzbeGaAL62jowRv59M35Xq9QpZ0K7O1dg4xVl
|
||||
37;29B;667;1;MzXBoWbEZjO0lrpqnRyoJ4DkmVeaNAGdL9g4QKxP
|
||||
38;289;649;1;0p2rwdP7aGoOQLJNgAynJNy6xWXbmMe3nvZqlzkV
|
||||
39;290;656;1;BrQx3NGKgVMRaXYAo9y1GE8ZzkWnj1le6bdOLE20
|
||||
40;2AA;682;1;vnreBJ6PMqgz20pYEL82XQyG1jkWwdQxZVNAOlmK
|
||||
41;285;645;1;jklN4JpQAx362o9XYZDN6wDgrWw1P7GEbdBM0vRV
|
||||
42;283;643;1;oZmYXEbw9lVWRv1jLxDe9bDdgAMz4PKQnNJ6eB23
|
||||
43;282;642;1;pEonaKBOGbj9034MgJ8W3G8qXvxNWVkAPQz21R6L
|
||||
44;287;647;1;BLQal6Pn9oz1KmNgek5Yqd50vd2MAbqG3OV7Rp4j
|
||||
45;286;646;1;4agVJ9dPQkmp1R2X3EDJKxyrK6ZlNoM0n7qxBOev
|
||||
46;29A;666;1;9PpgLEnvk4WMV6RmOJybMGDaeAXzo2BQNG3K17Zw
|
||||
47;28E;654;1;Mmp93b2nvd7OoqgBeEyEZq5kjlAV1Y4ZNXwW0zLG
|
||||
|
4284
flow/cmd_manager.js
4284
flow/cmd_manager.js
File diff suppressed because it is too large
Load diff
175
flow/csv_import.js
Normal file
175
flow/csv_import.js
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
exports.id = 'csv_import';
|
||||
exports.title = 'CsvImport';
|
||||
exports.version = '1.0.0';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#2134B0';
|
||||
exports.input = 1;
|
||||
exports.output = ["red", "white"];
|
||||
exports.click = false;
|
||||
exports.author = 'Daniel Segeš';
|
||||
exports.icon = 'file-import';
|
||||
exports.options = { edge: "undefined" };
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="edge" data-jc-config="placeholder:undefined;required:true" class="m">CSV Import</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
exports.readme = `# load csv to table db`;
|
||||
|
||||
//config
|
||||
let delimiter = ";";
|
||||
let uniqueColumn = "node";
|
||||
let path = "flow/audit_test_panel.csv";
|
||||
let startFrom = 1;
|
||||
let table = "nodes";
|
||||
let mapImport = {
|
||||
2: "node",
|
||||
4: "tbname",
|
||||
3: "line"
|
||||
};
|
||||
|
||||
//10.0.0.62
|
||||
delimiter = ";";
|
||||
uniqueColumn = "node";
|
||||
path = "flow/audit_rvo14_lampy.csv";
|
||||
startFrom = 1;
|
||||
table = "nodes";
|
||||
mapImport = {
|
||||
1: "node",
|
||||
3: "tbname",
|
||||
2: "line"
|
||||
};
|
||||
|
||||
//notification
|
||||
delimiter = ";";
|
||||
uniqueColumn = undefined;
|
||||
path = "flow/notifikacie.csv";
|
||||
startFrom = 1;
|
||||
table = "notifications";
|
||||
mapImport = {
|
||||
0: "key",
|
||||
1: "weight",
|
||||
2: "en",
|
||||
3: "sk"
|
||||
};
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
//console.log("csv import installed");
|
||||
|
||||
instance.on("close", () => {
|
||||
|
||||
})
|
||||
|
||||
|
||||
instance.on("data", (flowdata) => {
|
||||
|
||||
instance.send(0, "start import");
|
||||
console.log("csv import", flowdata.data);
|
||||
|
||||
//{table: "nodes", startFrom: 1, delimiter: ";", uniqueColumn: "node", path: "flow/audit_rvo14_lampy.csv", mapImport: {1: "node", 3: "tbname", 2: "line"}}
|
||||
|
||||
|
||||
if(typeof flowdata.data === 'object')
|
||||
{
|
||||
console.log("*******************", flowdata.data);
|
||||
|
||||
if(!flowdata.data.hasOwnProperty("table"))
|
||||
{
|
||||
instance.send(0, "!!!!csv import - nedefinovana tabulka");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!flowdata.data.hasOwnProperty("uniqueColumn"))
|
||||
{
|
||||
//instance.send(0, "!!!!csv import - nedefinovane uniqueColumn");
|
||||
//return;
|
||||
}
|
||||
|
||||
if(!flowdata.data.hasOwnProperty("path"))
|
||||
{
|
||||
instance.send(0, "!!!!csv import - nedefinovana cesta k suboru");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!flowdata.data.hasOwnProperty("mapImport"))
|
||||
{
|
||||
instance.send(0, "!!!!csv import - nedefinovany mapImport");
|
||||
return;
|
||||
}
|
||||
|
||||
table = flowdata.data.table;
|
||||
uniqueColumn = flowdata.data.uniqueColumn;
|
||||
if(uniqueColumn === "") uniqueColumn = undefined;
|
||||
|
||||
path = flowdata.data.path;
|
||||
mapImport = flowdata.data.mapImport;
|
||||
|
||||
if(flowdata.data.hasOwnProperty("delimiter")) delimiter = flowdata.data.delimiter;
|
||||
if(flowdata.data.hasOwnProperty("startFrom")) startFrom = flowdata.data.startFrom;
|
||||
}
|
||||
|
||||
|
||||
var db = TABLE(table);
|
||||
db.clear();
|
||||
|
||||
let keys = Object.keys(mapImport);
|
||||
|
||||
try {
|
||||
const data = fs.readFileSync(path, 'utf8')
|
||||
|
||||
let lines = data.split("\n");
|
||||
|
||||
for(let i = startFrom; i < lines.length; i++)
|
||||
{
|
||||
let line = lines[i];
|
||||
if(line === "") continue;
|
||||
|
||||
let data = line.split(delimiter);
|
||||
if(data.length == 0) continue;
|
||||
|
||||
let insertData = {};
|
||||
|
||||
keys.map(function(key){
|
||||
let k = mapImport[key];
|
||||
|
||||
//console.log("importineg", i, key, k);
|
||||
|
||||
if(data[key] != undefined) insertData[k] = data[key].trim();
|
||||
else{
|
||||
console.log("undefined", key, data);
|
||||
}
|
||||
});
|
||||
|
||||
console.log("insertData", insertData);
|
||||
|
||||
if(uniqueColumn != undefined)
|
||||
{
|
||||
db.insert(insertData, true).where(uniqueColumn, insertData[uniqueColumn]);
|
||||
}
|
||||
else
|
||||
{
|
||||
db.insert(insertData);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
console.log("csv import finished");
|
||||
instance.send(0, "csv import finished");
|
||||
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
instance.send(0, err);
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
107
flow/db_init.js
107
flow/db_init.js
|
|
@ -1,107 +0,0 @@
|
|||
exports.id = 'db_init';
|
||||
exports.title = 'DB Initialization';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#888600';
|
||||
exports.version = '1.0.2';
|
||||
exports.icon = 'sign-out';
|
||||
exports.input = 1;
|
||||
exports.output = ["blue"];
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="host" data-jc-config="placeholder:test.mosquitto.org;required:false" class="m">Hostname or IP address (if not empty - setting will override db setting)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="port" data-jc-config="placeholder:1883;required:true" class="m">Port</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="clientid">@(Client id)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="username" class="m">@(Username)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
|
||||
exports.readme = `
|
||||
# DB initialization
|
||||
`;
|
||||
|
||||
const { promisifyBuilder, makeMapFromDbResult } = require('./helper/db_helper.js');
|
||||
const { initNotification } = require('./helper/notification_reporter');
|
||||
|
||||
|
||||
exports.install = async function(instance) {
|
||||
|
||||
const dbNodes = TABLE("nodes");
|
||||
const dbRelays = TABLE("relays");
|
||||
const dbSettings = TABLE("settings");
|
||||
const dbStatus = TABLE("status");
|
||||
const dbPins = TABLE("pins");
|
||||
const dbNotifications = TABLE("notifications");
|
||||
|
||||
FLOW.GLOBALS = {};
|
||||
const dbs = FLOW.GLOBALS;
|
||||
|
||||
const responseSettings = await promisifyBuilder(dbSettings.find());
|
||||
const responseNodes = await promisifyBuilder(dbNodes.find());
|
||||
const responsePins = await promisifyBuilder(dbPins.find());
|
||||
const responseStatus = await promisifyBuilder(dbStatus.find());
|
||||
const responseRelays = await promisifyBuilder(dbRelays.find());
|
||||
const response = await promisifyBuilder(dbNotifications.find());
|
||||
|
||||
dbs.pinsData = makeMapFromDbResult(responsePins, "pin");
|
||||
dbs.relaysData = makeMapFromDbResult(responseRelays, "line");
|
||||
dbs.nodesData = makeMapFromDbResult(responseNodes, "node");
|
||||
dbs.statusData = responseStatus[0];
|
||||
dbs.notificationsData = makeMapFromDbResult(response, "key");
|
||||
|
||||
//+|354|nodesdata.....+|482|nodesdata....
|
||||
//for some reason, if last line in nodes.table is not empty, flow wrote more nodes data in one row,
|
||||
//so we have to add empty line at the bottom of nodes table to avoid this.
|
||||
//now, remove empty lines from nodesData database:
|
||||
if(dbs.nodesData.hasOwnProperty("0")) delete dbs.nodesData["0"];
|
||||
|
||||
dbs.settings = {
|
||||
edge_fw_version : "2024-10-14", //rok-mesiac-den
|
||||
language : responseSettings[0]["lang"],
|
||||
rvo_name : responseSettings[0]["rvo_name"],
|
||||
project_id : responseSettings[0]["project_id"],
|
||||
rvoTbName : dbs.relaysData[0]["tbname"],
|
||||
temperature_address : responseSettings[0]["temperature_address"],
|
||||
controller_type : responseSettings[0]["controller_type"],
|
||||
serial_port : responseSettings[0]["serial_port"],
|
||||
node_status_nok_time : responseSettings[0]["node_status_nok_time"] * 60 * 60 * 1000 ,// hour * minutes *
|
||||
latitude : responseSettings[0]["latitude"],
|
||||
longitude : responseSettings[0]["longitude"],
|
||||
no_voltage : new Set(),//modbus_citysys - elektromer
|
||||
backup_on_failure : responseSettings[0]["backup_on_failure"],
|
||||
restore_from_backup : responseSettings[0]["restore_from_backup"],
|
||||
restore_backup_wait : responseSettings[0]["restore_backup_wait"],
|
||||
mqtt_host : responseSettings[0]["mqtt_host"],
|
||||
mqtt_clientid : responseSettings[0]["mqtt_clientid"],
|
||||
mqtt_username : responseSettings[0]["mqtt_username"],
|
||||
mqtt_port : responseSettings[0]["mqtt_port"],
|
||||
|
||||
//dynamic values
|
||||
masterNodeIsResponding : true, //cmd_manager
|
||||
maintenance_mode : false,
|
||||
}
|
||||
|
||||
FLOW.dbLoaded = true;
|
||||
initNotification();
|
||||
|
||||
setTimeout(()=> {
|
||||
console.log("DB_INIT - data loaded");
|
||||
instance.send(0, "_")
|
||||
}, 5000)
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
1686
flow/designer.json
1686
flow/designer.json
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,43 +0,0 @@
|
|||
exports.id = 'id_bez_pomlcky';
|
||||
exports.title = 'nazov';
|
||||
exports.version = '1.0.0';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#2134B0';
|
||||
exports.input = 1;
|
||||
exports.output = ["red", "white"];
|
||||
exports.click = false;
|
||||
exports.author = 'Daniel Segeš';
|
||||
exports.icon = 'bolt';
|
||||
exports.options = { edge: "undefined" };
|
||||
//exports.npm = ['serialport'];
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="edge" data-jc-config="placeholder:undefined;required:true" class="m">CSV Import</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
exports.readme = `# readme`;
|
||||
|
||||
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
|
||||
|
||||
instance.on("close", () => {
|
||||
|
||||
})
|
||||
|
||||
|
||||
instance.on("data", (flowdata) => {
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,151 +0,0 @@
|
|||
exports.id = 'gettemperature';
|
||||
exports.title = 'Thermometer';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#5CB36D';
|
||||
exports.version = '1.0.2';
|
||||
exports.input = 1;
|
||||
exports.output = ["red", "white", "blue"];
|
||||
exports.author = 'Rastislav Kovac';
|
||||
exports.icon = 'thermometer-three-quarters';
|
||||
|
||||
exports.readme = `# Getting temperature values from RVO`;
|
||||
|
||||
const { errLogger, logger, monitor } = require('./helper/logger');
|
||||
|
||||
const SEND_TO = {
|
||||
debug: 0,
|
||||
tb: 1,
|
||||
di_do_controller: 2
|
||||
}
|
||||
|
||||
//read temperature - frequency
|
||||
let timeoutMin = 5;//minutes
|
||||
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
const { exec } = require('child_process');
|
||||
const { sendNotification } = require('./helper/notification_reporter.js');
|
||||
|
||||
let startRead;
|
||||
let dataToTb;
|
||||
let counter = 0;
|
||||
|
||||
let SETTINGS;
|
||||
let temperatureAddress = "";
|
||||
let rvoTbName = "";
|
||||
|
||||
|
||||
logger.debug(exports.title, "installed");
|
||||
|
||||
instance.on("close", function(){
|
||||
clearInterval(startRead);
|
||||
})
|
||||
|
||||
|
||||
const main = function(){
|
||||
|
||||
try {
|
||||
|
||||
if(SETTINGS.controller_type === "unipi")
|
||||
{
|
||||
clearInterval(startRead);
|
||||
return;
|
||||
}
|
||||
|
||||
if(temperatureAddress === "") throw "gettemperature: temperatureAddress is not defined";
|
||||
|
||||
exec(`owread -C ${temperatureAddress}/temperature`, (error, stdout, stderr) => {
|
||||
|
||||
if(!error)
|
||||
{
|
||||
parseData(stdout)
|
||||
return;
|
||||
}
|
||||
|
||||
sendNotification("main", rvoTbName, "thermometer_is_not_responding", {}, {"Error": error}, SEND_TO.tb, instance, "thermometer");
|
||||
logger.debug("gettemparature", error);
|
||||
monitor.info("Thermometer is not responding", error);
|
||||
|
||||
dataToTb = {
|
||||
[rvoTbName]: [
|
||||
{
|
||||
"ts": Date.now(),
|
||||
"values": {
|
||||
"status": "NOK"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
instance.send(SEND_TO.tb, dataToTb);
|
||||
instance.send(SEND_TO.di_do_controller, {sender: "gettemperature", status: "NOK"});
|
||||
});
|
||||
|
||||
}
|
||||
catch(err) {
|
||||
errLogger.error(exports.title, err);
|
||||
clearInterval(startRead);
|
||||
}
|
||||
}
|
||||
|
||||
const parseData = function(data) {
|
||||
|
||||
data = parseFloat(data);
|
||||
logger.debug("gettemperature", data);
|
||||
|
||||
if (!isNaN(data)){
|
||||
|
||||
|
||||
if(counter > 290)
|
||||
{
|
||||
instance.send(SEND_TO.debug, "[Get temperature component] - temperature data are comming again from RVO after more than 1 day break");
|
||||
sendNotification("parseData", rvoTbName, "thermometer_is_responding_again", {}, "", SEND_TO.tb, instance, "thermometer");
|
||||
}
|
||||
|
||||
logger.debug("gettemperature", data);
|
||||
|
||||
dataToTb = {
|
||||
[rvoTbName]: [
|
||||
{
|
||||
"ts": Date.now(),
|
||||
"values": {
|
||||
"temperature": Number(data.toFixed(2)),
|
||||
"status": "OK"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
instance.send(SEND_TO.tb, dataToTb);
|
||||
instance.send(SEND_TO.di_do_controller, {sender: "gettemperature", status: "OK"});
|
||||
|
||||
counter = 0;
|
||||
|
||||
} else {
|
||||
|
||||
counter++;
|
||||
monitor.info("gettemperature err", counter, data);
|
||||
|
||||
//ked je problem 1 den
|
||||
let day = 24 * 60 / timeoutMin;
|
||||
if(counter > day && counter < day + 2) {
|
||||
sendNotification("parseData", rvoTbName, "thermometer_sends_invalid_data", {}, "", SEND_TO.tb, instance, "thermometer");
|
||||
|
||||
instance.send(SEND_TO.debug, "[Get temperature component] - no temperature data from RVO for more than 1 day");
|
||||
instance.send(SEND_TO.di_do_controller, {sender: "gettemperature", status: "NOK"});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
instance.on("data", _ => {
|
||||
SETTINGS = FLOW.GLOBALS.settings;
|
||||
temperatureAddress = SETTINGS.temperature_address;
|
||||
rvoTbName = SETTINGS.rvoTbName;
|
||||
startRead = setInterval(main, timeoutMin * 1000 * 60);
|
||||
main();
|
||||
})
|
||||
|
||||
};
|
||||
|
|
@ -1,11 +1,8 @@
|
|||
class DataToTbHandler {
|
||||
|
||||
class DataToTbHandler
|
||||
{
|
||||
constructor(index) {
|
||||
this.index = index;
|
||||
|
||||
// time, after new value for the given key will be resend to tb (e.g. {status: "OK"})
|
||||
this.timeToHoldTbValue = 30*60; //30 minutes
|
||||
|
||||
this.previousValues = {};
|
||||
this.debug = false;
|
||||
this.messageCounter = 0;
|
||||
|
|
@ -13,33 +10,42 @@ class DataToTbHandler {
|
|||
this.sender = "";
|
||||
}
|
||||
|
||||
dump() {
|
||||
dump()
|
||||
{
|
||||
console.log("----------------------------");
|
||||
console.log("previousValues", this.previousValues);
|
||||
console.log("----------------------------");
|
||||
}
|
||||
|
||||
setSender(sender) {
|
||||
setSender(sender)
|
||||
{
|
||||
this.sender = sender;
|
||||
}
|
||||
|
||||
isEmptyObject(obj) {
|
||||
for (var name in obj) {
|
||||
return false;
|
||||
isEmptyObject( obj ) {
|
||||
for ( var name in obj ) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
sendToTb(dataToTb, instance) {
|
||||
sendToTb(dataToTb, instance)
|
||||
{
|
||||
|
||||
if(!FLOW.OMS_brokerready)
|
||||
{
|
||||
return dataToTb;
|
||||
}
|
||||
|
||||
let keys = Object.keys(dataToTb);
|
||||
|
||||
if(keys.length == 0)
|
||||
{
|
||||
if(this.debug) console.log("sendToTb received empty object", dataToTb);
|
||||
if(this.debug) console.log("sendToTb received epty object", dataToTb);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
let tbname = keys[0];
|
||||
let ts;
|
||||
|
||||
|
|
@ -49,11 +55,16 @@ class DataToTbHandler {
|
|||
for(let i = 0; i < arrayOfValues.length; i++)
|
||||
{
|
||||
ts = arrayOfValues[i].ts;
|
||||
|
||||
//console.log("sendToTb------------>before", arrayOfValues[i].values, tbname);
|
||||
|
||||
let values = this.prepareValuesForTb(tbname, ts, arrayOfValues[i].values);
|
||||
|
||||
//console.log("sendToTb------------>after", values);
|
||||
|
||||
if(!this.isEmptyObject(values))
|
||||
{
|
||||
arrayOfValuesToSend.push({ts: ts, values: values});
|
||||
arrayOfValuesToSend.push({ts: ts, values: values});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -63,6 +74,17 @@ class DataToTbHandler {
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
let dataToTb = {
|
||||
[tbname]: [
|
||||
{
|
||||
"ts": Date.now(),
|
||||
"values": values
|
||||
}
|
||||
]
|
||||
}
|
||||
*/
|
||||
|
||||
this.messageCounter++;
|
||||
|
||||
let dataToTbModified = {
|
||||
|
|
@ -70,18 +92,26 @@ class DataToTbHandler {
|
|||
}
|
||||
|
||||
//console.log(this.sender + " DATA SEND TO TB ", tbname, this.messageCounter, new Date(ts), dataToTbModified[tbname][0].values, this.instance);
|
||||
//if(this.debug) console.log(this.sender + " DATA SEND TO TB ", this.index, tbname, arrayOfValuesToSend);
|
||||
if(this.debug) console.log(this.sender + " DATA SEND TO TB ", this.index, tbname, arrayOfValuesToSend);
|
||||
|
||||
instance.send(this.index, dataToTbModified);
|
||||
}
|
||||
|
||||
getDiffTimestamp(key) {
|
||||
getDiffTimestamp(key)
|
||||
{
|
||||
let seconds = 60*60;//1h
|
||||
//seconds = 1;//for testing
|
||||
|
||||
//TODO set different value for given key!!!
|
||||
//if(key == "status") this.timeToHoldTbValue = 2*60*60;//2h
|
||||
return this.timeToHoldTbValue * 1000;
|
||||
//if(key == "status") seconds = 2*60*60;//2h
|
||||
|
||||
let timestampDiffToRemoveKey = seconds*1000;
|
||||
|
||||
return timestampDiffToRemoveKey;
|
||||
}
|
||||
|
||||
prepareValuesForTb(tbname, timestamp, values) {
|
||||
|
||||
prepareValuesForTb(tbname, timestamp, values)
|
||||
{
|
||||
let keys = Object.keys(values);
|
||||
if(!this.previousValues.hasOwnProperty(tbname))
|
||||
{
|
||||
|
|
@ -130,4 +160,4 @@ class DataToTbHandler {
|
|||
}
|
||||
}
|
||||
|
||||
module.exports = DataToTbHandler;
|
||||
module.exports = DataToTbHandler;
|
||||
|
|
@ -97,9 +97,7 @@ class ErrorToServiceHandler
|
|||
console.log("ErrorToServiceHandler------------------------>send to service", dataToInfoSender);
|
||||
|
||||
//TODO UGLY!!!
|
||||
// if error occures too early FLOW.GLOBALs.settings.project_id is still undefined
|
||||
// if(this.projects_id === undefined) this.projects_id = FLOW.GLOBALS.settings.project_id;
|
||||
if(this.projects_id === undefined) return;
|
||||
if(this.projects_id === undefined) this.projects_id = FLOW.OMS_projects_id;
|
||||
|
||||
/*
|
||||
if(this.projects_id === undefined)
|
||||
|
|
|
|||
72
flow/helper/error_reporter.js
Normal file
72
flow/helper/error_reporter.js
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
|
||||
//key is device, value = str
|
||||
let sentValues= {};
|
||||
|
||||
function sendError(func, device, weight, str, extra, tb_output, instance, type) {
|
||||
// if ((weight === ERRWEIGHT.DEBUG) && (instance.CONFIG.debug === false)){
|
||||
// return; // Allow debug messages only if CONFIG.debug is active
|
||||
// }
|
||||
|
||||
let key = device;
|
||||
if(type != undefined) key = type;
|
||||
|
||||
if(sentValues.hasOwnProperty(key))
|
||||
{
|
||||
if(sentValues[key] == str)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sentValues[key] = str;
|
||||
|
||||
let content = {
|
||||
"type": weight,
|
||||
"status": "new",
|
||||
"source": {
|
||||
"func":func,
|
||||
"component":instance.id,
|
||||
"component_name":instance.name,
|
||||
"edge":device
|
||||
},
|
||||
"message":str,
|
||||
"message_data": extra
|
||||
};
|
||||
|
||||
let msg = {};
|
||||
msg[device] = [
|
||||
{
|
||||
"ts": Date.now(),
|
||||
"values": {
|
||||
"_event":content
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
// Msg can be outputted from components only after configuration
|
||||
/*if (canSendErrData()){
|
||||
sendBufferedErrors();
|
||||
} else {
|
||||
bufferError(msg);
|
||||
}*/
|
||||
instance.send(tb_output, msg); // Even if error server is unavailable, send this message to output, for other possible component connections
|
||||
|
||||
}
|
||||
|
||||
|
||||
let ERRWEIGHT = {
|
||||
EMERGENCY: "emergency", // System unusable
|
||||
ALERT: "alert", // Action must be taken immidiately
|
||||
CRITICAL: "critical", // Component unable to function
|
||||
ERROR: "error", // Error, but component able to recover from it
|
||||
WARNING: "warning", // Possibility of error, system running futher
|
||||
NOTICE: "notice", // Significant message but not an error, things user might want to know about
|
||||
INFO: "informational", // Info
|
||||
DEBUG: "debug" // Debug - only if CONFIG.debug is enabled
|
||||
};
|
||||
|
||||
|
||||
module.exports = {
|
||||
sendError,
|
||||
ERRWEIGHT
|
||||
}
|
||||
56
flow/helper/error_reporting.js
Normal file
56
flow/helper/error_reporting.js
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
const ERRWEIGHT = {
|
||||
EMERGENCY: "emergency", // System unusable
|
||||
ALERT: "alert", // Action must be taken immidiately
|
||||
CRITICAL: "critical", // Component unable to function
|
||||
ERROR: "error", // Error, but component able to recover from it
|
||||
WARNING: "warning", // Possibility of error, system running futher
|
||||
NOTICE: "notice", // Significant message but not an error, things user might want to know about
|
||||
INFO: "informational", // Info
|
||||
DEBUG: "debug" // Debug - only if CONFIG.debug is enabled
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
function sendError(func, device, weight, str, extra){
|
||||
if ((weight === ERRWEIGHT.DEBUG) && (instance.CONFIG.debug === false)){
|
||||
return; // Allow debug messages only if CONFIG.debug is active
|
||||
}
|
||||
|
||||
let content = {
|
||||
"type": weight,
|
||||
"status": "new",
|
||||
"source": {
|
||||
"func":func,
|
||||
"component":instance.id,
|
||||
"component_name":instance.name,
|
||||
"edge":myEdge
|
||||
},
|
||||
"message":str,
|
||||
"message_data": extra
|
||||
};
|
||||
let msg = {};
|
||||
msg[device] = [
|
||||
{
|
||||
"ts": Date.now(),
|
||||
"values": {
|
||||
"_event":content
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
// Msg can be outputted from components only after configuration
|
||||
/*if (canSendErrData()){
|
||||
sendBufferedErrors();
|
||||
} else {
|
||||
bufferError(msg);
|
||||
}*/
|
||||
instance.send(0, msg); // Even if error server is unavailable, send this message to output, for other possible component connections
|
||||
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
sendError,
|
||||
ERRWEIGHT,
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
//https://github.com/log4js-node/log4js-node/blob/master/examples/example.js
|
||||
//file: { type: 'file', filename: path.join(__dirname, 'log/file.log') }
|
||||
|
||||
var log4js = require("log4js");
|
||||
var path = require('path');
|
||||
|
||||
log4js.configure({
|
||||
appenders: {
|
||||
errLogs: { type: 'file', compress:true, daysToKeep: 2, maxLogSize: 1048576, backups: 1, keepFileExt: true, filename: path.join(__dirname + "/../../", 'err.txt') },
|
||||
monitorLogs: { type: 'file', compress:true, daysToKeep: 2, maxLogSize: 1048576, backups: 1, keepFileExt: true, filename: path.join(__dirname + "/../../", 'monitor.txt') },
|
||||
console: { type: 'console' }
|
||||
},
|
||||
categories: {
|
||||
errLogs: { appenders: ['console', 'errLogs'], level: 'error' },
|
||||
monitorLogs: { appenders: ['console', 'monitorLogs'], level: 'trace' },
|
||||
//another: { appenders: ['console'], level: 'trace' },
|
||||
default: { appenders: ['console'], level: 'trace' }
|
||||
}
|
||||
});
|
||||
|
||||
const errLogger = log4js.getLogger("errLogs");
|
||||
const logger = log4js.getLogger();
|
||||
const monitor = log4js.getLogger("monitorLogs");
|
||||
|
||||
//USAGE
|
||||
//logger.debug("text")
|
||||
//monitor.info('info');
|
||||
//errLogger.error("some error");
|
||||
|
||||
module.exports = { errLogger, logger, monitor };
|
||||
|
|
@ -1,6 +1,10 @@
|
|||
|
||||
const { promisifyBuilder, makeMapFromDbResult } = require('./db_helper.js');
|
||||
const dbNotifications = TABLE("notifications");
|
||||
|
||||
//key is device, value = str
|
||||
let sentValues= {};
|
||||
let notificationsData = null;
|
||||
let notificationsData = {};
|
||||
|
||||
let ERRWEIGHT = {
|
||||
EMERGENCY: "emergency", // System unusable
|
||||
|
|
@ -20,9 +24,12 @@ function getKey(map, val) {
|
|||
//https://stackoverflow.com/questions/41117799/string-interpolation-on-variable
|
||||
var template = (tpl, args) => tpl.replace(/\${(\w+)}/g, (_, v) => args[v]);
|
||||
|
||||
async function initNotifications()
|
||||
{
|
||||
let response = await promisifyBuilder(dbNotifications.find());
|
||||
notificationsData = makeMapFromDbResult(response, "key");
|
||||
|
||||
function initNotification() {
|
||||
notificationsData = FLOW.GLOBALS.notificationsData;
|
||||
console.log("initNotifications done" );
|
||||
}
|
||||
|
||||
function sendNotification(func, device, key, params, extra, tb_output, instance, saveKey) {
|
||||
|
|
@ -32,7 +39,7 @@ function sendNotification(func, device, key, params, extra, tb_output, instance,
|
|||
let storeToSendValues = true;
|
||||
if(saveKey == undefined) storeToSendValues = false;
|
||||
|
||||
let lang = FLOW.GLOBALS.settings.language;
|
||||
let lang = FLOW.OMS_language;
|
||||
if(lang != "en" || lang != "sk") lang = "en";
|
||||
|
||||
let tpl = key;
|
||||
|
|
@ -48,8 +55,7 @@ function sendNotification(func, device, key, params, extra, tb_output, instance,
|
|||
}
|
||||
else
|
||||
{
|
||||
//console.error("sendNotification: Notifications: undefined key", key, func, notificationsData);
|
||||
console.error("sendNotification: Notifications: undefined key", key, func );
|
||||
console.error("sendNotification: Notifications: undefined key", key, func, notificationsData);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -85,7 +91,7 @@ function sendNotification(func, device, key, params, extra, tb_output, instance,
|
|||
|
||||
if(storeToSendValues) sentValues[saveKey] = tpl;
|
||||
|
||||
let str = FLOW.GLOBALS.settings.rvo_name;
|
||||
let str = FLOW.OMS_rvo_name;
|
||||
if(str != "") str = str + ": ";
|
||||
str = str + tpl;
|
||||
|
||||
|
|
@ -126,6 +132,6 @@ function sendNotification(func, device, key, params, extra, tb_output, instance,
|
|||
|
||||
module.exports = {
|
||||
sendNotification,
|
||||
ERRWEIGHT,
|
||||
initNotification
|
||||
}
|
||||
initNotifications,
|
||||
ERRWEIGHT
|
||||
}
|
||||
|
|
@ -1,100 +1,94 @@
|
|||
const { exec } = require('child_process');
|
||||
|
||||
function openPort(port){
|
||||
return new Promise((resolve, reject) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
var callbackError = function(err) {
|
||||
port.removeListener('error', callbackError);
|
||||
port.removeListener('open', callbackError);
|
||||
var callbackError = function(err) {
|
||||
port.removeListener('error', callbackError);
|
||||
port.removeListener('open', callbackError);
|
||||
|
||||
reject(err.message);
|
||||
};
|
||||
reject(err.message);
|
||||
};
|
||||
|
||||
var callbackOpen = function(data) {
|
||||
port.removeListener('error', callbackError);
|
||||
port.removeListener('open', callbackOpen);
|
||||
var callbackOpen = function(data) {
|
||||
port.removeListener('error', callbackError);
|
||||
port.removeListener('open', callbackOpen);
|
||||
|
||||
resolve("port open: ok");
|
||||
};
|
||||
resolve("port open: ok");
|
||||
};
|
||||
|
||||
port.on('error', callbackError);
|
||||
port.on('open', callbackOpen);
|
||||
port.on('error', callbackError);
|
||||
port.on('open', callbackOpen);
|
||||
|
||||
port.open();
|
||||
port.open();
|
||||
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function runSyncExec(command){
|
||||
return new Promise((resolve, reject) => {
|
||||
function runSyncExec(command){
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
exec(command, (error, stdout, stderr) => {
|
||||
if(error == null) resolve(stdout);
|
||||
reject(error);
|
||||
});
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
exec(command, (error, stdout, stderr) => {
|
||||
if(error == null) resolve(stdout);
|
||||
reject(error);
|
||||
});
|
||||
async function writeData(port, data, readbytes, timeout){
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
})
|
||||
}
|
||||
//readbytes = 0 = broadcast
|
||||
if(readbytes == undefined) readbytes = 0;
|
||||
if(timeout == undefined) timeout = 10000;//10s, default timeout MASTERA je 3s
|
||||
|
||||
async function writeData(port, data, readbytes, timeout){
|
||||
return new Promise((resolve, reject) => {
|
||||
//cmd-manager mame http route POST / terminal a tomu sa tiez nastavuje timeout!!!
|
||||
|
||||
var callback = function(data) {
|
||||
rsPortReceivedData.push(...data);
|
||||
let l = rsPortReceivedData.length;
|
||||
|
||||
// If first item in data array is 255, we just write broadcast command to rsPort
|
||||
// We wait 3 seconds and resolve(["broadcast"])
|
||||
// It is important to resolve with array
|
||||
if(data[0] == 255) {
|
||||
if(l >= readbytes)
|
||||
{
|
||||
port.removeListener('data', callback);
|
||||
|
||||
clearTimeout(t);
|
||||
resolve(rsPortReceivedData);
|
||||
}
|
||||
};
|
||||
|
||||
port.removeListener('data', callback);
|
||||
|
||||
let t = setTimeout(() => {
|
||||
port.removeListener('data', callback);
|
||||
|
||||
console.log("serialport helper: writeData TIMEOUT READING", rsPortReceivedData);
|
||||
|
||||
reject("TIMEOUT READING");
|
||||
}, timeout);
|
||||
|
||||
let rsPortReceivedData = [];
|
||||
|
||||
if(readbytes > 0) port.on('data', callback);
|
||||
|
||||
port.write(Buffer.from(data), function(err) {
|
||||
if (err) {
|
||||
port.removeListener('data', callback);
|
||||
reject(err.message);
|
||||
}
|
||||
|
||||
if(readbytes == 0)
|
||||
{
|
||||
resolve(rsPortReceivedData);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
setTimeout(resolve, 3000, ["broadcast"]);
|
||||
return;
|
||||
}
|
||||
|
||||
//cmd-manager mame http route POST / terminal a tomu sa tiez nastavuje timeout!!!
|
||||
|
||||
var callback = function(data) {
|
||||
rsPortReceivedData.push(...data);
|
||||
let l = rsPortReceivedData.length;
|
||||
|
||||
if(l >= readbytes)
|
||||
{
|
||||
port.removeListener('data', callback);
|
||||
|
||||
clearTimeout(t);
|
||||
resolve(rsPortReceivedData);
|
||||
}
|
||||
};
|
||||
|
||||
port.removeListener('data', callback);
|
||||
|
||||
let t = setTimeout(() => {
|
||||
port.removeListener('data', callback);
|
||||
|
||||
console.log("serialport helper: writeData TIMEOUT READING", rsPortReceivedData);
|
||||
|
||||
reject("TIMEOUT READING");
|
||||
}, timeout);
|
||||
|
||||
let rsPortReceivedData = [];
|
||||
|
||||
port.on('data', callback);
|
||||
|
||||
port.write(Buffer.from(data), function(err) {
|
||||
if (err) {
|
||||
port.removeListener('data', callback);
|
||||
reject(err.message);
|
||||
}
|
||||
|
||||
});
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
openPort,
|
||||
runSyncExec,
|
||||
writeData
|
||||
}
|
||||
}
|
||||
|
|
@ -3,9 +3,12 @@ exports.title = 'Info sender';
|
|||
exports.version = '1.0.0';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#2134B0';
|
||||
exports.input = 2;
|
||||
exports.input = 1;
|
||||
exports.output = 1
|
||||
exports.click = false;
|
||||
exports.author = 'oms-is';
|
||||
exports.icon = 'bolt';
|
||||
exports.options = { edge: "undefined" };
|
||||
|
||||
const { networkInterfaces } = require('os');
|
||||
|
||||
|
|
@ -19,12 +22,13 @@ exports.html = `<div class="padding">
|
|||
|
||||
exports.readme = `# send all data to projects.worksys.io, required to monitor status of controller(unipi)`;
|
||||
|
||||
exports.install = function(instance) {
|
||||
const fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
let id;
|
||||
exports.install = async function(instance) {
|
||||
|
||||
let allValues = {};
|
||||
let sendAllValuesInterval;
|
||||
let configured = false;
|
||||
|
||||
let now = new Date();
|
||||
console.log(exports.title, "INSTALLED", now.toLocaleString("sk-SK"));
|
||||
|
|
@ -43,19 +47,23 @@ exports.install = function(instance) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function sendValues()
|
||||
{
|
||||
if(!configured) return;
|
||||
const id = FLOW.OMS_projects_id;
|
||||
|
||||
if(Object.keys(allValues).length > 0)
|
||||
{
|
||||
if(id)
|
||||
if(id !== undefined)
|
||||
{
|
||||
delete allValues.__force__;
|
||||
let dataToSend = {...allValues};
|
||||
dataToSend.id = id;
|
||||
dataToSend.ipAddresses = ipAddresses;
|
||||
//dataToSend.notify_date = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
||||
|
||||
//console.log(exports.title, "------------>sendValues", dataToSend);
|
||||
|
||||
instance.send(0, dataToSend);
|
||||
|
||||
|
|
@ -63,7 +71,7 @@ exports.install = function(instance) {
|
|||
}
|
||||
else
|
||||
{
|
||||
console.log(exports.title, "unable to send data, no id");
|
||||
console.log(exports.title, "unable to send data, id is undefined");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -73,14 +81,10 @@ exports.install = function(instance) {
|
|||
clearInterval(sendAllValuesInterval);
|
||||
})
|
||||
|
||||
instance.on("0", _ => {
|
||||
id = FLOW.GLOBALS.settings.project_id;
|
||||
configured = true;
|
||||
})
|
||||
|
||||
instance.on("1", flowdata => {
|
||||
instance.on("data", (flowdata) => {
|
||||
|
||||
allValues = { ...allValues, ...flowdata.data};
|
||||
|
||||
//console.log("DATA RECEIVED", flowdata.data);
|
||||
|
||||
//__force__
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
348
flow/modbus_reader.js
Normal file
348
flow/modbus_reader.js
Normal file
|
|
@ -0,0 +1,348 @@
|
|||
exports.id = 'modbus_reader';
|
||||
exports.title = 'Modbus reader';
|
||||
exports.version = '2.0.0';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#2134B0';
|
||||
exports.output = ["red", "white", "yellow"];
|
||||
exports.click = false;
|
||||
exports.author = 'Rastislav Kovac';
|
||||
exports.icon = 'bolt';
|
||||
exports.readme = `
|
||||
Modbus requests to modbus devices (electromer, twilight sensor, thermometer.
|
||||
Component keeps running arround deviceConfig array in "timeoutInterval" intervals. Array items are objects with single modbus devices.
|
||||
Everything is sent to dido_controller. If requests to device fail (all registers must fail to send NOK status) , we send "NOK-'device'" status to dido_controller.
|
||||
This device needs to be configured in dido_controller!!! Double check if it is. In dido_controller we calculate final status and all values with status are pushed to tb.
|
||||
`;
|
||||
|
||||
const modbus = require('jsmodbus');
|
||||
const SerialPort = require('serialport');
|
||||
const { timeoutInterval, deviceConfig } = require("../databases/modbus_config");
|
||||
const { sendNotification } = require('./helper/notification_reporter');
|
||||
|
||||
const DELAY_BETWEEN_DEVICES = 10000;
|
||||
|
||||
const SEND_TO = {
|
||||
debug: 0,
|
||||
dido_controller: 1,
|
||||
tb: 2
|
||||
};
|
||||
|
||||
//to handle NOK and OK sendNotifications s
|
||||
const numberOfNotResponding = {};
|
||||
let tbName = null;
|
||||
let mainSocket;
|
||||
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
class SocketWithClients {
|
||||
|
||||
constructor () {
|
||||
this.stream = null;
|
||||
this.socket = null;
|
||||
this.clients = {};
|
||||
this.allValues = {};
|
||||
this.errors = 0;
|
||||
this.index = 0;
|
||||
this.timeoutInterval = 5000;
|
||||
|
||||
// we need to go always around for all devices. So we need index value, device address, as well as number of registers for single device
|
||||
this.deviceAddress = null; // device address (1 - EM340 and 2 for twilight_sensor)
|
||||
this.indexInDeviceConfig = 0; // first item in deviceConfig
|
||||
this.lengthOfActualDeviceStream = null;
|
||||
this.device = null;
|
||||
|
||||
// lampSwitchNotification helper variables
|
||||
this.onNotificationSent = false;
|
||||
this.offNotificationSent = false;
|
||||
|
||||
this.startSocket();
|
||||
}
|
||||
|
||||
startSocket = () => {
|
||||
|
||||
let obj = this;
|
||||
|
||||
this.socket = new SerialPort("/dev/ttymxc0", {
|
||||
baudRate: 9600,
|
||||
})
|
||||
|
||||
// we create a client for every deviceAddress ( = address) in list and push them into dictionary
|
||||
for( let i = 0; i < deviceConfig.length; i++)
|
||||
{
|
||||
this.clients[deviceConfig[i].deviceAddress] = new modbus.client.RTU(this.socket, deviceConfig[i].deviceAddress, 2000); // 2000 is timeout in register request, default is 5000, which is too long
|
||||
}
|
||||
|
||||
this.socket.on('error', function(e) {
|
||||
console.log('socket connection error', e);
|
||||
if(e.code == 'ECONNREFUSED' || e.code == 'ECONNRESET') {
|
||||
console.log(exports.title + ' Waiting 10 seconds before trying to connect again');
|
||||
setTimeout(obj.startSocket, 10000);
|
||||
}
|
||||
});
|
||||
|
||||
this.socket.on('close', function() {
|
||||
console.log('Socket connection closed ' + exports.title + ' Waiting 10 seconds before trying to connect again');
|
||||
setTimeout(obj.startSocket, 10000);
|
||||
});
|
||||
|
||||
this.socket.on('open', function () {
|
||||
console.log("socket connected");
|
||||
obj.getActualStreamAndDevice();
|
||||
obj.timeoutInterval = timeoutInterval - DELAY_BETWEEN_DEVICES; // to make sure readout always runs in timeoutinterval we substract DELAY_BETWEEN_DEVICES
|
||||
})
|
||||
|
||||
};
|
||||
|
||||
getActualStreamAndDevice = () => {
|
||||
const dev = deviceConfig[this.indexInDeviceConfig];
|
||||
this.index = 0;
|
||||
this.errors = 0;
|
||||
this.stream = dev.stream;
|
||||
this.lengthOfActualDeviceStream = dev.stream.length;
|
||||
this.deviceAddress = dev.deviceAddress; // 1 or 2 or any number
|
||||
this.device = dev.device; //em340, twilight_sensor
|
||||
|
||||
if(this.indexInDeviceConfig == 0) setTimeout(this.readRegisters, this.timeoutInterval);
|
||||
else setTimeout(this.readRegisters, DELAY_BETWEEN_DEVICES);
|
||||
}
|
||||
|
||||
readRegisters = () => {
|
||||
|
||||
const str = this.stream[this.index];
|
||||
const register = str.register;
|
||||
const size = str.size;
|
||||
const tbAttribute = str.tbAttribute;
|
||||
|
||||
let obj = this;
|
||||
|
||||
this.clients[this.deviceAddress].readHoldingRegisters(register, size)
|
||||
.then( function (resp) {
|
||||
|
||||
resp = resp.response._body.valuesAsArray; //resp is array of length 1 or 2, f.e. [2360,0]
|
||||
// console.log(deviceAddress, register, tbAttribute, resp);
|
||||
|
||||
//device is responding again after NOK status
|
||||
if(numberOfNotResponding.hasOwnProperty(obj.device))
|
||||
{
|
||||
let message = "";
|
||||
if(obj.device == "em340")
|
||||
{
|
||||
message = "electrometer_ok";
|
||||
}
|
||||
else if(obj.device == "twilight_sensor")
|
||||
{
|
||||
message = "twilight_sensor_ok";
|
||||
}
|
||||
message && sendNotification("modbus_reader: readRegisters", tbName, message, {}, "", SEND_TO.tb, instance);
|
||||
delete numberOfNotResponding[obj.device];
|
||||
}
|
||||
|
||||
obj.transformResponse(resp, register);
|
||||
|
||||
//obj.errors = 0;
|
||||
obj.index++;
|
||||
obj.readAnotherRegister();
|
||||
|
||||
}).catch (function () {
|
||||
|
||||
console.log("errors pri citani modbus registra", register, obj.indexInDeviceConfig, tbName, tbAttribute);
|
||||
|
||||
obj.errors++;
|
||||
if(obj.errors == obj.lengthOfActualDeviceStream)
|
||||
{
|
||||
instance.send(SEND_TO.dido_controller, {status: "NOK-" + obj.device}); // NOK-em340, NOK-em111, NOK-twilight_sensor, NOK-thermometer
|
||||
|
||||
//todo - neposlalo notification, ked sme vypojili twilight a neposle to do tb, ale do dido ??
|
||||
if(!numberOfNotResponding.hasOwnProperty(obj.device))
|
||||
{
|
||||
let message = "";
|
||||
if(obj.device == "twilight_sensor")
|
||||
{
|
||||
message = "twilight_sensor_nok";
|
||||
}
|
||||
else if(obj.device == "em340")
|
||||
{
|
||||
message = "electrometer_nok";
|
||||
}
|
||||
message && sendNotification("modbus_reader: readingTimeouted", tbName, message, {}, "", SEND_TO.tb, instance);
|
||||
numberOfNotResponding[obj.device] = 1;
|
||||
}
|
||||
|
||||
obj.errors = 0;
|
||||
numberOfNotResponding[obj.device] += 1;
|
||||
}
|
||||
|
||||
console.error(require('util').inspect(arguments, {
|
||||
depth: null
|
||||
}))
|
||||
|
||||
// if reading out of device's last register returns error, we send accumulated allValues to dido_controller (if allValues are not an empty object)
|
||||
if(obj.index + 1 >= obj.lengthOfActualDeviceStream)
|
||||
{
|
||||
if(!isObjectEmpty(obj.allValues)) instance.send(SEND_TO.dido_controller, {values: obj.allValues});
|
||||
obj.allValues = {};
|
||||
}
|
||||
obj.index++;
|
||||
obj.readAnotherRegister();
|
||||
})
|
||||
|
||||
};
|
||||
|
||||
readAnotherRegister = () => {
|
||||
if(this.index < this.lengthOfActualDeviceStream) setTimeout(this.readRegisters, 0);
|
||||
else this.setNewStream();
|
||||
}
|
||||
|
||||
transformResponse = (response, register) => {
|
||||
|
||||
for (let i = 0; i < this.lengthOfActualDeviceStream; i++) {
|
||||
|
||||
let a = this.stream[i];
|
||||
if (a.register === register)
|
||||
{
|
||||
let tbAttribute = a.tbAttribute;
|
||||
let multiplier = a.multiplier;
|
||||
|
||||
let value = this.calculateValue(response, multiplier);
|
||||
// console.log(register, tbName, tbAttribute, response, a.multiplier, value);
|
||||
|
||||
// if(tbName == undefined) return;
|
||||
|
||||
if(this.index + 1 < this.lengthOfActualDeviceStream)
|
||||
{
|
||||
this.allValues[tbAttribute] = value;
|
||||
return;
|
||||
}
|
||||
|
||||
const values = {
|
||||
...this.allValues,
|
||||
[tbAttribute]: value,
|
||||
};
|
||||
|
||||
this.checkNullVoltage(values);
|
||||
this.lampSwitchNotification(values);
|
||||
|
||||
instance.send(SEND_TO.dido_controller, {values: values});
|
||||
|
||||
this.allValues = {};
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
setNewStream = () =>
|
||||
{
|
||||
if(this.lengthOfActualDeviceStream == this.index)
|
||||
{
|
||||
if(this.indexInDeviceConfig + 1 == deviceConfig.length)
|
||||
{
|
||||
this.indexInDeviceConfig = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.indexInDeviceConfig += 1;
|
||||
}
|
||||
|
||||
this.getActualStreamAndDevice();
|
||||
}
|
||||
}
|
||||
|
||||
calculateValue = (response, multiplier) =>
|
||||
{
|
||||
let value = 0;
|
||||
|
||||
let l = response.length;
|
||||
if (l === 2)
|
||||
{
|
||||
value = (response[1]*(2**16) + response[0]);
|
||||
|
||||
if(value >= (2**31)) // ak je MSB bit nastavený, eventuálne sa dá použiť aj (value & 0x80000000), ak vieš robiť logický súčin
|
||||
{
|
||||
value = value - "0xFFFFFFFF" + 1;
|
||||
}
|
||||
}
|
||||
else if (l === 1)
|
||||
{
|
||||
value = response[0];
|
||||
|
||||
if(value >= (2**15)) // ak je MSB bit nastavený, eventuálne sa dá použiť aj (value & 0x8000), ak vieš robiť logický súčin
|
||||
{
|
||||
value = value - "0xFFFF" + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return Math.round(value * multiplier * 10) / 10;
|
||||
}
|
||||
|
||||
checkNullVoltage = (values) => {
|
||||
|
||||
if(!(values.hasOwnProperty("Phase_1_voltage") || values.hasOwnProperty("Phase_2_voltage") || values.hasOwnProperty("Phase_3_voltage"))) return;
|
||||
|
||||
Object.keys(values).map(singleValue => {
|
||||
if (["Phase_1_voltage", "Phase_2_voltage", "Phase_3_voltage"].includes(singleValue))
|
||||
{
|
||||
let l = singleValue.split("_");
|
||||
let phase = parseInt(l[1]);
|
||||
|
||||
if(FLOW.OMS_no_voltage == undefined) FLOW.OMS_no_voltage = new Set();
|
||||
// console.log(values[singleValue], tbName);
|
||||
|
||||
if(values[singleValue] == 0)
|
||||
{
|
||||
FLOW.OMS_no_voltage.add(phase);
|
||||
sendNotification("modbus_reader: checkNullVoltage", tbName, "no_voltage_on_phase", {phase: phase}, "", SEND_TO.tb, instance, "voltage" + phase );
|
||||
// console.log('no voltage')
|
||||
}
|
||||
else
|
||||
{
|
||||
FLOW.OMS_no_voltage.delete(phase);
|
||||
// console.log('voltage detected')
|
||||
sendNotification("modbus_reader: checkNullVoltage", tbName, "voltage_on_phase_restored", {phase: phase}, "", SEND_TO.tb, instance, "voltage" + phase);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* function sends notification to slack and to tb, if EM total_power value changes more than 500. This should show, that RVO lamps has been switched on or off
|
||||
*/
|
||||
lampSwitchNotification = (values) => {
|
||||
|
||||
if(!values.hasOwnProperty("total_power")) return;
|
||||
|
||||
const actualTotalPower = values.total_power;
|
||||
if(actualTotalPower > 600 && this.onNotificationSent == false)
|
||||
{
|
||||
sendNotification("modbus_reader: lampSwitchNotification", tbName, "lamps_have_turned_on", {}, "", SEND_TO.tb, instance);
|
||||
this.onNotificationSent = true;
|
||||
this.offNotificationSent = false;
|
||||
}
|
||||
else if(actualTotalPower <= 600 && this.offNotificationSent == false)
|
||||
{
|
||||
sendNotification("modbus_reader: lampSwitchNotification", tbName, "lamps_have_turned_off", {}, "", SEND_TO.tb, instance);
|
||||
this.onNotificationSent = false;
|
||||
this.offNotificationSent = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const isObjectEmpty = (objectName) => {
|
||||
return Object.keys(objectName).length === 0 && objectName.constructor === Object;
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
|
||||
mainSocket = new SocketWithClients();
|
||||
tbName = FLOW.OMS_rvo_tbname;
|
||||
|
||||
// this notification is to show, that flow (unipi) has been restarted
|
||||
sendNotification("modbus_reader", tbName, "flow_restart", {}, "", SEND_TO.slack, instance);
|
||||
|
||||
}, 25000);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
exports.id = 'monitorcpu';
|
||||
exports.title = 'CPU';
|
||||
exports.version = '1.0.0';
|
||||
exports.author = 'Peter Širka';
|
||||
exports.group = 'Monitoring';
|
||||
exports.color = '#F6BB42';
|
||||
exports.output = 1;
|
||||
exports.icon = 'microchip';
|
||||
exports.options = { enabled: true };
|
||||
exports.click = true;
|
||||
exports.readme = `# CPU monitoring
|
||||
|
||||
This component monitors CPU \`% percentage\` consumption in Linux systems. It uses \`mpstat\` command.
|
||||
|
||||
__Data Example__:
|
||||
|
||||
\`\`\`javascript
|
||||
{
|
||||
cpu: 30, // percentage
|
||||
cores: [4, 60, 0], // percentage
|
||||
count: 3 // count of cores
|
||||
}
|
||||
\`\`\``;
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-3 m">
|
||||
<div data---="textbox__interval__placeholder:10000;increment:true;type:number;required:true;maxlength:10;align:center">@(Interval in milliseconds)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
var fields = ['CPU', '%idle'];
|
||||
var current = { cores: [], cpu: 0, count: 0 };
|
||||
var proc = null;
|
||||
var tproc = null;
|
||||
|
||||
instance.custom.kill = function() {
|
||||
if (proc) {
|
||||
proc.kill('SIGKILL');
|
||||
proc = null;
|
||||
}
|
||||
};
|
||||
|
||||
instance.custom.run = function() {
|
||||
|
||||
if (tproc) {
|
||||
clearTimeout(tproc);
|
||||
tproc = null;
|
||||
}
|
||||
|
||||
instance.custom.kill();
|
||||
proc = require('child_process').spawn('mpstat', ['-P', 'ALL', 10]);
|
||||
proc.stdout.on('data', U.streamer('\n\n', instance.custom.process));
|
||||
proc.stdout.on('error', function(e) {
|
||||
instance.error(e);
|
||||
instance.custom.kill();
|
||||
tproc = setTimeout(instance.custom.run, instance.options.interval || 5000);
|
||||
});
|
||||
};
|
||||
|
||||
instance.custom.process = function(chunk) {
|
||||
current.cpu = 0;
|
||||
chunk.toString('utf8').parseTerminal(fields, instance.custom.parse);
|
||||
current.count = current.cores.length;
|
||||
if (current.count) {
|
||||
instance.send2(current);
|
||||
instance.custom.status();
|
||||
}
|
||||
};
|
||||
|
||||
instance.custom.parse = function(values) {
|
||||
var val = 100 - values[1].parseFloat2();
|
||||
if (values[0] === 'all')
|
||||
current.cpu = val;
|
||||
else
|
||||
current.cores[+values[0]] = val;
|
||||
};
|
||||
|
||||
instance.custom.status = function() {
|
||||
if (instance.options.enabled)
|
||||
instance.status(current.cpu.floor(1) + '%');
|
||||
else
|
||||
instance.status('Disabled', 'red');
|
||||
};
|
||||
|
||||
instance.on('click', function() {
|
||||
instance.options.enabled = !instance.options.enabled;
|
||||
instance.custom.status();
|
||||
if (instance.options.enabled)
|
||||
instance.custom.run();
|
||||
else
|
||||
instance.custom.kill();
|
||||
});
|
||||
|
||||
instance.on('close', function() {
|
||||
instance.custom.kill();
|
||||
if (tproc) {
|
||||
clearTimeout(tproc);
|
||||
tproc = null;
|
||||
}
|
||||
});
|
||||
|
||||
setTimeout(instance.custom.run, 1000);
|
||||
};
|
||||
441
flow/mqtt.js
441
flow/mqtt.js
|
|
@ -1,441 +0,0 @@
|
|||
exports.id = 'mqtt';
|
||||
exports.title = 'MQTT broker';
|
||||
exports.group = 'MQTT';
|
||||
exports.color = '#888600';
|
||||
exports.version = '1.0.1';
|
||||
exports.icon = 'exchange';
|
||||
exports.input = true;
|
||||
exports.output = 0;
|
||||
exports.author = 'Martin Smola';
|
||||
exports.variables = true;
|
||||
exports.options = { host: '127.0.0.1', port: 1883 };
|
||||
exports.traffic = false;
|
||||
exports.npm = ['mqtt'];
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="host" data-jc-config="placeholder:test.mosquitto.org;required:true" class="m">Hostname or IP address</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="port" data-jc-config="placeholder:1883;required:true" class="m">Port</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="clientid">@(Client id)</div>
|
||||
<div class="help m">@(Supports variables, example: \`client_{device-id}\`)</div>
|
||||
<div data-jc="checkbox" data-jc-path="secure" class="m">@(Secure (ssl))</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="checkbox" data-jc-path="auth" class="m">@(Require Authorization)</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" data-bind="?.auth__show:value">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="username" class="m">@(Username)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="password" data-jc-config="type:password" class="m">@(Password)</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="checkbox" data-jc-path="lwt" class="m">@(LWT)</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" data-bind="?.lwt__show:value">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="lwttopic">@(Last will topic)</div>
|
||||
<div class="help m">@(Supports variables, example: \`lwt/{device-id}\`)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="lwtmessage">@(Last will message)</div>
|
||||
<div class="help m">@(Supports variables, example: \`{device-id} is offline\`)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
ON('save.mqtt', function(component, options) {
|
||||
!component.name && (component.name = '{0} @ {1}:{2}'.format(options.username || '', options.host, options.port || '1883'));
|
||||
});
|
||||
</script>`;
|
||||
|
||||
exports.readme = `
|
||||
# MQTT Broker
|
||||
|
||||
## Input
|
||||
Allows to change connection programaticaly
|
||||
\`\`\`javascipt
|
||||
{
|
||||
host: '1.2.3.4',
|
||||
port: '',
|
||||
secure: true/false,
|
||||
username: 'john',
|
||||
password: 'X',
|
||||
lwttopic: '',
|
||||
lwtmessage: '',
|
||||
clientid: ''
|
||||
}
|
||||
\`\`\`
|
||||
`;
|
||||
|
||||
var MQTT_BROKERS = [];
|
||||
var mqtt;
|
||||
|
||||
global.MQTT = {};
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
var broker;
|
||||
|
||||
mqtt = require('mqtt');
|
||||
|
||||
instance.on('data', function(flowdata){
|
||||
var data= flowdata.data;
|
||||
var options = instance.options;
|
||||
|
||||
if (data.host && data.port)
|
||||
return instance.custom.reconfigure(data, options);
|
||||
|
||||
if (data.close === true)
|
||||
instance.close(NOOP);
|
||||
});
|
||||
|
||||
instance.custom.reconfigure = function(o, old_options) {
|
||||
|
||||
if (old_options)
|
||||
MQTT_BROKERS = MQTT_BROKERS.remove(function(b){
|
||||
return b.id === old_options.id;
|
||||
});
|
||||
|
||||
var options = instance.options;
|
||||
|
||||
if (!options.host || !options.port) {
|
||||
instance.status('Not configured', 'red');
|
||||
return;
|
||||
}
|
||||
|
||||
options.id = (options.username || '') + '@' + options.host + ':' + options.port;
|
||||
|
||||
if (broker) {
|
||||
broker.close();
|
||||
EMIT('mqtt.brokers.status', 'reconfigured', old_options.id, options.id);
|
||||
}
|
||||
|
||||
instance.custom.createBroker();
|
||||
};
|
||||
|
||||
instance.custom.createBroker = function() {
|
||||
|
||||
ON('mqtt.brokers.status', brokerstatus);
|
||||
|
||||
var o = instance.options;
|
||||
var opts = {
|
||||
host: o.host,
|
||||
port: o.port,
|
||||
id: o.id,
|
||||
secure: o.secure,
|
||||
rejectUnauthorized: false,
|
||||
reconnectPeriod: 3000,
|
||||
resubscribe: false
|
||||
};
|
||||
|
||||
if (o.auth) {
|
||||
opts.username = o.username;
|
||||
opts.password = o.password;
|
||||
}
|
||||
|
||||
if (o.lwt) {
|
||||
opts.will = {
|
||||
topic: instance.arg(o.lwttopic),
|
||||
payload: instance.arg(o.lwtmessage)
|
||||
}
|
||||
}
|
||||
|
||||
if (o.clientid)
|
||||
opts.clientId = instance.arg(o.clientid);
|
||||
|
||||
broker = new Broker(opts);
|
||||
MQTT_BROKERS.push(broker);
|
||||
|
||||
instance.status('Ready');
|
||||
};
|
||||
|
||||
instance.close = function(done) {
|
||||
|
||||
broker && broker.close(function() {
|
||||
MQTT_BROKERS = MQTT_BROKERS.remove('id', instance.options.id);
|
||||
EMIT('mqtt.brokers.status', 'removed', instance.options.id);
|
||||
});
|
||||
|
||||
OFF('mqtt.brokers.status', brokerstatus);
|
||||
|
||||
done();
|
||||
};
|
||||
|
||||
function brokerstatus(status, brokerid, err) {
|
||||
if (brokerid !== instance.options.id)
|
||||
return;
|
||||
|
||||
switch (status) {
|
||||
case 'connecting':
|
||||
instance.status('Connecting', '#a6c3ff');
|
||||
break;
|
||||
case 'connected':
|
||||
instance.status('Connected', 'green');
|
||||
break;
|
||||
case 'disconnected':
|
||||
instance.status('Disconnected', 'red');
|
||||
break;
|
||||
case 'connectionfailed':
|
||||
instance.status('Connection failed', 'red');
|
||||
break;
|
||||
case 'error':
|
||||
instance.error('MQTT Error, ID: ' + instance.id + '\n ' + err);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
instance.on('options', instance.custom.reconfigure);
|
||||
instance.custom.reconfigure();
|
||||
};
|
||||
|
||||
FLOW.trigger('mqtt.brokers', function(next) {
|
||||
var brokers = [''];
|
||||
MQTT_BROKERS.forEach(n => brokers.push(n.id));
|
||||
next(brokers);
|
||||
});
|
||||
|
||||
MQTT.add = function(brokerid, componentid) {
|
||||
var broker = MQTT_BROKERS.findItem('id', brokerid);
|
||||
|
||||
if (broker)
|
||||
broker.add(componentid);
|
||||
};
|
||||
|
||||
MQTT.remove = function(brokerid, componentid) {
|
||||
var broker = MQTT_BROKERS.findItem('id', brokerid);
|
||||
broker && broker.remove(componentid);
|
||||
};
|
||||
|
||||
MQTT.publish = function(brokerid, topic, data, options) {
|
||||
var broker = MQTT_BROKERS.findItem('id', brokerid);
|
||||
if (broker)
|
||||
broker.publish(topic, data, options);
|
||||
else
|
||||
EMIT('mqtt.brokers.status', 'error', brokerid, 'No such broker');
|
||||
};
|
||||
|
||||
MQTT.subscribe = function(brokerid, componentid, topic, qos) {
|
||||
var broker = MQTT_BROKERS.findItem('id', brokerid);
|
||||
|
||||
if (!broker)
|
||||
return;
|
||||
|
||||
broker.add(componentid);
|
||||
broker.subscribe(componentid, topic, qos);
|
||||
};
|
||||
|
||||
MQTT.unsubscribe = function(brokerid, componentid, topic, qos) {
|
||||
var broker = MQTT_BROKERS.findItem('id', brokerid);
|
||||
if (!broker)
|
||||
return;
|
||||
|
||||
broker.unsubscribe(componentid, topic);
|
||||
broker.remove(componentid);
|
||||
};
|
||||
|
||||
MQTT.broker = function(brokerid) {
|
||||
return MQTT_BROKERS.findItem('id', brokerid);
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
https://github.com/mqttjs/MQTT.js/blob/master/examples/client/secure-client.js
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
TODO
|
||||
|
||||
- add `birth` and `last will and testament` messages
|
||||
- add options to self.client.connect(broker [,options]); - credentials, certificate etc.
|
||||
|
||||
|
||||
*/
|
||||
|
||||
function Broker(options) {
|
||||
var self = this;
|
||||
|
||||
if (!options.host || !options.port)
|
||||
return false;
|
||||
|
||||
self.connecting = false;
|
||||
self.connected = false;
|
||||
self.closing = false;
|
||||
self.components = [];
|
||||
self.subscribtions = {};
|
||||
self.id = options.id;
|
||||
self.options = options;
|
||||
setTimeout(function() {
|
||||
EMIT('mqtt.brokers.status', 'new', self.id);
|
||||
}, 500);
|
||||
return self;
|
||||
}
|
||||
|
||||
Broker.prototype.connect = function() {
|
||||
|
||||
var self = this;
|
||||
if (self.connected || self.connecting)
|
||||
return EMIT('mqtt.brokers.status', self.connected ? 'connected' : 'connecting', self.id);
|
||||
|
||||
self.connecting = true;
|
||||
var broker = self.options.secure ? 'mqtts://' : 'mqtt://' + self.options.host + ':' + self.options.port;
|
||||
|
||||
EMIT('mqtt.brokers.status', 'connecting', self.id);
|
||||
|
||||
self.client = mqtt.connect(broker, self.options);
|
||||
|
||||
self.client.on('connect', function() {
|
||||
self.connecting = false;
|
||||
self.connected = true;
|
||||
if (self.reconnecting) {
|
||||
EMIT('mqtt.brokers.status', 'reconnected', self.id);
|
||||
self.reconnecting = false;
|
||||
self.resubscribe();
|
||||
}
|
||||
EMIT('mqtt.brokers.status', 'connected', self.id);
|
||||
});
|
||||
|
||||
self.client.on('reconnect', function() {
|
||||
self.connecting = true;
|
||||
self.connected = false;
|
||||
self.reconnecting = true;
|
||||
EMIT('mqtt.brokers.status', 'connecting', self.id);
|
||||
});
|
||||
|
||||
self.client.on('message', function(topic, message) {
|
||||
message = message.toString();
|
||||
if (message[0] === '{') {
|
||||
TRY(function() {
|
||||
message = JSON.parse(message);
|
||||
}, () => FLOW.debug('MQTT: Error parsing data', message));
|
||||
}
|
||||
EMIT('mqtt.brokers.message', self.id, topic, message);
|
||||
});
|
||||
|
||||
self.client.on('close', function(err) {
|
||||
if (err && err.toString().indexOf('Error')) {
|
||||
self.connecting = false;
|
||||
self.connected = false;
|
||||
EMIT('mqtt.brokers.status', 'error', self.id, err.code);
|
||||
}
|
||||
|
||||
if (self.connected || !self.connecting) {
|
||||
self.connected = false;
|
||||
EMIT('mqtt.brokers.status', 'disconnected', self.id);
|
||||
} else if (self.connecting) {
|
||||
self.connecting = false;
|
||||
EMIT('mqtt.brokers.status', 'connectionfailed', self.id);
|
||||
}
|
||||
});
|
||||
|
||||
self.client.on('error', function(err) {
|
||||
|
||||
if (self.connecting) {
|
||||
self.client.end();
|
||||
self.connecting = false;
|
||||
EMIT('mqtt.brokers.status', 'error', self.id, err);
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
Broker.prototype.disconnect = function(reconnect) {
|
||||
var self = this;
|
||||
if (!self.closing)
|
||||
self.close(function(){
|
||||
reconnect && self.connect();
|
||||
});
|
||||
};
|
||||
|
||||
Broker.prototype.close = function(callback) {
|
||||
var self = this;
|
||||
self.closing = true;
|
||||
|
||||
if ((self.connected || self.connecting) && self.client && self.client.end)
|
||||
self.client.end(true, cb);
|
||||
else
|
||||
cb();
|
||||
|
||||
function cb() {
|
||||
EMIT('mqtt.brokers.status', 'disconnected', self.id);
|
||||
self.client && self.client.removeAllListeners();
|
||||
self.components = [];
|
||||
self.client = null;
|
||||
callback && callback();
|
||||
}
|
||||
};
|
||||
|
||||
Broker.prototype.subscribe = function(componentid, topic) {
|
||||
var self = this;
|
||||
self.subscribtions[topic] = self.subscribtions[topic] || [];
|
||||
if (self.subscribtions[topic].indexOf(componentid) > -1)
|
||||
return;
|
||||
self.client.subscribe(topic);
|
||||
self.subscribtions[topic].push(componentid);
|
||||
};
|
||||
|
||||
Broker.prototype.resubscribe = function() {
|
||||
var self = this;
|
||||
var topics = Object.keys(self.subscribtions);
|
||||
for (var i = 0; i < topics.length; i++)
|
||||
self.client.subscribe(topics[i]);
|
||||
};
|
||||
|
||||
Broker.prototype.unsubscribe = function(componentid, topic) {
|
||||
var self = this;
|
||||
var sub = self.subscribtions[topic];
|
||||
if (sub) {
|
||||
self.subscribtions[topic] = sub.remove(componentid);
|
||||
self.client.connected && !self.subscribtions[topic].length && self.client.unsubscribe(topic);
|
||||
}
|
||||
};
|
||||
|
||||
Broker.prototype.publish = function(topic, data, options) {
|
||||
var self = this;
|
||||
if (!self.connected)
|
||||
return;
|
||||
|
||||
if (typeof(data) === 'object') {
|
||||
options.qos = parseInt(data.qos || options.qos);
|
||||
options.retain = data.retain || options.retain;
|
||||
topic = data.topic || topic;
|
||||
data.payload && (data = typeof(data.payload) === 'string' ? data.payload : JSON.stringify(data.payload));
|
||||
}
|
||||
|
||||
if (options.qos !== 0 || options.qos !== 1 || options.qos !== 2)
|
||||
options.qos = null;
|
||||
|
||||
if (typeof(data) !== 'string')
|
||||
data = JSON.stringify(data);
|
||||
|
||||
self.client.publish(topic, data || '', options);
|
||||
};
|
||||
|
||||
Broker.prototype.add = function(componentid) {
|
||||
var self = this;
|
||||
self.components.indexOf(componentid) === -1 && self.components.push(componentid);
|
||||
self.connect();
|
||||
};
|
||||
|
||||
Broker.prototype.remove = function(componentid) {
|
||||
var self = this;
|
||||
self.components = self.components.remove(componentid);
|
||||
!self.components.length && self.disconnect();
|
||||
};
|
||||
|
|
@ -1,171 +0,0 @@
|
|||
exports.id = 'mqttlistener';
|
||||
exports.title = 'MQTT listener';
|
||||
exports.group = 'MQTT';
|
||||
exports.color = '#888600';
|
||||
exports.version = '1.0.0';
|
||||
exports.icon = 'sign-out';
|
||||
exports.input = 1;
|
||||
exports.output = ["red", "white"];
|
||||
exports.author = 'Rastislav Kovac';
|
||||
exports.options = { host: "", port: 1883, clientid: "", username: "" };
|
||||
//exports.npm = ['mqtt', 'streamroller'];
|
||||
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="host" data-jc-config="placeholder:test.mosquitto.org;required:false" class="m">Hostname or IP address</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="port" data-jc-config="placeholder:1883;required:true" class="m">Port</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="clientid">@(Client id)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="username" class="m">@(Username)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
|
||||
exports.readme = `
|
||||
# MQTT processor
|
||||
|
||||
Version 1.0.0
|
||||
|
||||
It serves as a client and subscribes to 'rpc' topic. It receives rpc calls from kovobel-prod01, which receives it from platform.
|
||||
|
||||
`;
|
||||
|
||||
const instanceSendTo = {
|
||||
debug: 0,
|
||||
rpcCall: 1,
|
||||
}
|
||||
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
|
||||
const mqtt = require("mqtt");
|
||||
|
||||
instance.on('options', loadNodes);
|
||||
|
||||
|
||||
function loadNodes()
|
||||
{
|
||||
|
||||
if(instance.options.host == "")
|
||||
{
|
||||
instance.status('No configuration', 'red');
|
||||
}
|
||||
else
|
||||
{
|
||||
var o = instance.options;
|
||||
opts = {
|
||||
host: o.host,
|
||||
port: o.port,
|
||||
clientId: o.clientid,
|
||||
rejectUnauthorized: false,
|
||||
resubscribe: true
|
||||
};
|
||||
|
||||
connectToServer();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function connectToServer()
|
||||
{
|
||||
var url = "mqtt://" + opts.host + ":" + opts.port;
|
||||
console.log("MQTT URL: ", url);
|
||||
|
||||
client = mqtt.connect(url, opts);
|
||||
|
||||
client.on('connect', function() {
|
||||
instance.status("Connected", "green");
|
||||
client.subscribe('rpc', function (err) {
|
||||
if (!err) {
|
||||
client.publish('rpc', 'Hello mqtt');
|
||||
console.log('message published');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
client.on('reconnect', function() {
|
||||
instance.status("Reconnecting", "yellow");
|
||||
});
|
||||
|
||||
client.on('message', function(topic, message) {
|
||||
// message is type of buffer
|
||||
message = message.toString();
|
||||
|
||||
// instance.send(1, message);
|
||||
// return;
|
||||
|
||||
if (message[0] === '{') {
|
||||
|
||||
try {
|
||||
message = JSON.parse(message);
|
||||
|
||||
if (Object.keys(message).length < 2 || !Object.keys(message).includes("message")) return;
|
||||
|
||||
message.message = JSON.parse(message.message);
|
||||
instance.send(instanceSendTo.rpcCall, message);
|
||||
|
||||
} catch (e) {
|
||||
instance.debug(`MQTT: Error parsing data, ${e}`);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
client.on('close', function(err) {
|
||||
if (err && err.toString().indexOf('Error')) {
|
||||
instance.status("Err: "+err.code, "red");
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker CLOSE signal received !", "error":err, "opt":opts });
|
||||
} else {
|
||||
instance.status("Disconnected", "red");
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker CLOSE signal received !", "error":err, "opt":opts });
|
||||
}
|
||||
});
|
||||
|
||||
client.on('error', function(err) {
|
||||
instance.status("Err: "+ err.code, "red");
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker ERROR signal received !", "error":err, "opt":opts });
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//set opts accortding to options
|
||||
instance.reconfigure = function() {
|
||||
|
||||
var o = instance.options;
|
||||
opts = {
|
||||
host: o.host,
|
||||
port: o.port,
|
||||
clientId: o.clientid,
|
||||
rejectUnauthorized: false,
|
||||
resubscribe: true
|
||||
};
|
||||
|
||||
connectToServer();
|
||||
};
|
||||
|
||||
instance.close = function(done) {
|
||||
client.end();
|
||||
};
|
||||
|
||||
|
||||
loadNodes();
|
||||
|
||||
instance.on('options', instance.reconfigure);
|
||||
instance.reconfigure();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,317 +0,0 @@
|
|||
exports.id = 'mqttprocessor';
|
||||
exports.title = 'MQTT processor';
|
||||
exports.group = 'MQTT';
|
||||
exports.color = '#888600';
|
||||
exports.version = '1.0.0';
|
||||
exports.icon = 'sign-out';
|
||||
exports.input = 1;
|
||||
exports.output = ["red", "white", "blue"];
|
||||
exports.author = 'Rastislav Kovac';
|
||||
exports.options = { host: "", port: 1883, clientid: "", username: "" };
|
||||
//exports.npm = ['mqtt', 'streamroller'];
|
||||
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="host" data-jc-config="placeholder:test.mosquitto.org;required:false" class="m">Hostname or IP address</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="port" data-jc-config="placeholder:1883;required:true" class="m">Port</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="clientid">@(Client id)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="username" class="m">@(Username)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
|
||||
exports.readme = `
|
||||
# MQTT processor
|
||||
|
||||
Version 1.0.0
|
||||
|
||||
It serves as a client, listens and subscribes to nodes in citysys configuration.
|
||||
Is able to send messages to flow (as rpc calls from platform)
|
||||
|
||||
Added:
|
||||
- database collections,
|
||||
- rpc response
|
||||
`;
|
||||
|
||||
const instanceSendTo = {
|
||||
debug: 0,
|
||||
rpcCall: 1,
|
||||
cmdManager: 2
|
||||
}
|
||||
|
||||
const { promisifyBuilder, makeMapFromDbResult } = require('./helper/db_helper.js');
|
||||
const mqtt = require('mqtt');
|
||||
|
||||
|
||||
//topics = {joqRYBVL30k9eQWOlZ5qwpD2KJpNEmA6gPxXzwaM: 'lamp_697/brightness'} --> to get topic from dataToTb tb name.
|
||||
const topics = {};
|
||||
//tbNames = {'lamp_697/brightness': joqRYBVL30k9eQWOlZ5qwpD2KJpNEmA6gPxXzwaM }
|
||||
const tbNames = {};
|
||||
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
let client = null;
|
||||
let opts = null;
|
||||
|
||||
instance.on('options', loadNodes);
|
||||
|
||||
|
||||
async function loadNodes()
|
||||
{
|
||||
const nodes = TABLE("nodes");
|
||||
let nodesData = await promisifyBuilder(nodes.find());
|
||||
|
||||
nodesData.map(item => {
|
||||
const value = 'lamp_' + item.node + '/brightness';
|
||||
const key = item.tbname;
|
||||
topics[key] = value;
|
||||
tbNames[value] = key;
|
||||
})
|
||||
|
||||
// console.log('******* -------- ', topics);
|
||||
// console.log('******* -------- ', tbNames);
|
||||
|
||||
if(instance.options.host == "")
|
||||
{
|
||||
instance.status('No configuration', 'red');
|
||||
}
|
||||
else
|
||||
{
|
||||
var o = instance.options;
|
||||
opts = {
|
||||
host: o.host,
|
||||
port: o.port,
|
||||
clientId: o.clientid,
|
||||
rejectUnauthorized: false,
|
||||
resubscribe: true
|
||||
};
|
||||
|
||||
connectToServer();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function connectToServer()
|
||||
{
|
||||
var url = "mqtt://" + opts.host + ":" + opts.port;
|
||||
console.log("MQTT URL: ", url);
|
||||
|
||||
client = mqtt.connect(url, opts);
|
||||
|
||||
client.on('connect', function() {
|
||||
instance.status("Connected", "green");
|
||||
// array of subscribed topics ==> Object.values(topics)
|
||||
client.subscribe(Object.values(topics), function (err) {
|
||||
if (!err) {
|
||||
client.publish('presence', 'Hello mqtt');
|
||||
console.log('message published');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
client.on('reconnect', function() {
|
||||
instance.status("Reconnecting", "yellow");
|
||||
});
|
||||
|
||||
client.on('message', function(topic, message) {
|
||||
// message is type of buffer
|
||||
message = message.toString();
|
||||
|
||||
if (message[0] === '{') {
|
||||
|
||||
try {
|
||||
message = JSON.parse(message);
|
||||
|
||||
// we ensure to process messages only with 1 key ==> {'lamp_698/brightness': 20 } and if topic is in topics
|
||||
if (Object.keys(message).length > 1 || !Object.values(topics).includes(topic)) return;
|
||||
|
||||
instance.send(0, {message:message, topic:topic})
|
||||
|
||||
const date = Date.now();
|
||||
const tbName = tbNames[topic];
|
||||
|
||||
|
||||
const transformToRpc = {
|
||||
"topic": "v1/gateway/rpc",
|
||||
"content": {
|
||||
// 'device' is not needed here in 3rd party systems
|
||||
"device": "KjbN4q7JPZmexgdnz2yKQ98YAWwO0Q3BMX6ERLoV",
|
||||
"data": {
|
||||
// 'id' is not needed here
|
||||
"id": 5,
|
||||
"method": "set_command",
|
||||
"params": {
|
||||
"entities": [
|
||||
{
|
||||
"entity_type": "street_luminaire",
|
||||
"tb_name": tbName
|
||||
}
|
||||
],
|
||||
"command": "dimming",
|
||||
"payload": {
|
||||
"value": message[topic]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
instance.send(instanceSendTo.cmdManager, transformToRpc);
|
||||
|
||||
} catch (e) {
|
||||
instance.debug(`MQTT: Error parsing data, ${e}`);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
client.on('close', function(err) {
|
||||
if (err && err.toString().indexOf('Error')) {
|
||||
instance.status("Err: "+err.code, "red");
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker CLOSE signal received !", "error":err, "opt":opts });
|
||||
} else {
|
||||
instance.status("Disconnected", "red");
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker CLOSE signal received !", "error":err, "opt":opts });
|
||||
}
|
||||
});
|
||||
|
||||
client.on('error', function(err) {
|
||||
instance.status("Err: "+ err.code, "red");
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker ERROR signal received !", "error":err, "opt":opts });
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//set opts accortding to options
|
||||
instance.reconfigure = function() {
|
||||
|
||||
var o = instance.options;
|
||||
opts = {
|
||||
host: o.host,
|
||||
port: o.port,
|
||||
clientId: o.clientid,
|
||||
rejectUnauthorized: false,
|
||||
resubscribe: true
|
||||
};
|
||||
|
||||
connectToServer();
|
||||
};
|
||||
|
||||
|
||||
instance.on('data', function(data) {
|
||||
const value = data.data;
|
||||
const nodeTbName = Object.keys(value)[0];
|
||||
|
||||
// tbnames of all lamps
|
||||
const nodes = Object.values(tbNames);
|
||||
|
||||
if(nodes.includes(nodeTbName))
|
||||
{
|
||||
|
||||
if(value[nodeTbName][0].values.hasOwnProperty('dimming'))
|
||||
{
|
||||
const key = nodeTbName;
|
||||
const tbValues = value[key][0].values;
|
||||
|
||||
Object.keys(tbValues).map(item => {
|
||||
if(item != 'dimming')
|
||||
{
|
||||
delete tbValues[item];
|
||||
}
|
||||
})
|
||||
|
||||
const topic = topics[key];
|
||||
// console.log('---- ***********', key, topic)
|
||||
// console.log('^^^^^^^^^^^^^^', value);
|
||||
|
||||
// transform data to send to 3rd party
|
||||
const v = value[key][0];
|
||||
v[topic] = v.values['dimming'];
|
||||
delete v.values;
|
||||
|
||||
client.publish(topic, JSON.stringify(v));
|
||||
}
|
||||
else if(value[nodeTbName][0].values.hasOwnProperty('status'))
|
||||
{
|
||||
const key = nodeTbName;
|
||||
const tbValues = value[key][0].values;
|
||||
|
||||
Object.keys(tbValues).map(item => {
|
||||
if(item != 'status')
|
||||
{
|
||||
delete tbValues[item];
|
||||
}
|
||||
})
|
||||
|
||||
// we expect topic to be 'lamp_000/brightness'. we must make 'lamp_000/status'
|
||||
const topic = topics[key].slice(0, 8) + '/status';
|
||||
// console.log('---- ***********', key, topic)
|
||||
// console.log('^^^^^^^^^^^^^^', value);
|
||||
|
||||
// transform data to send to 3rd party
|
||||
const v = value[key][0];
|
||||
v[topic] = v.values['status'];
|
||||
delete v.values;
|
||||
|
||||
client.publish(topic, JSON.stringify(v));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
instance.close = function(done) {
|
||||
client.end();
|
||||
};
|
||||
|
||||
|
||||
|
||||
loadNodes();
|
||||
|
||||
instance.on('options', instance.reconfigure);
|
||||
instance.reconfigure();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
[ {
|
||||
node: 683,
|
||||
tbname: 'XKQbz3WAwY21dGa0R453rWyJm9PZOjqlvpr6Nkeo',
|
||||
line: 3,
|
||||
profile: '{"intervals":[{"cct":3000,"value":0,"end_time":"20:00","start_time":"13:00"},{"cct":3000,"value":100,"end_time":"21:20","start_time":"20:00"},{"cct":3000,"value":0,"end_time":"13:00","start_time":"05:30"},{"cct":3000,"value":80,"end_time":"22:20","start_time":"21:50"},{"cct":3000,"value":70,"end_time":"22:50","start_time":"22:20"},{"cct":3000,"value":60,"end_time":"23:20","start_time":"22:50"},{"cct":3000,"value":50,"end_time":"23:50","start_time":"23:20"},{"cct":3000,"value":40,"end_time":"00:20","start_time":"23:50"},{"cct":3000,"value":100,"end_time":"05:30","start_time":"03:20"},{"cct":3000,"value":30,"end_time":"00:50","start_time":"00:20"},{"cct":3000,"value":20,"end_time":"01:20","start_time":"00:50"},{"cct":3000,"value":90,"end_time":"21:50","start_time":"21:20"},{"cct":3000,"value":30,"end_time":"01:50","start_time":"01:20"},{"cct":3000,"value":40,"end_time":"02:20","start_time":"01:50"},{"cct":3000,"value":50,"end_time":"02:50","start_time":"02:20"},{"cct":3000,"value":60,"end_time":"03:20","start_time":"02:50"}],"astro_clock":true,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":0,"dusk_astro_clock_offset":0,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}',
|
||||
processed: true,
|
||||
status: true
|
||||
},
|
||||
{
|
||||
node: 688,
|
||||
tbname: 'PaGbQ3wBAZWOmRvK9VDpvz5endLJYopEqlkzNMxX',
|
||||
line: 3,
|
||||
profile: '{"intervals":[{"cct":3000,"value":0,"end_time":"20:00","start_time":"13:00"},{"cct":3000,"value":100,"end_time":"21:20","start_time":"20:00"},{"cct":3000,"value":0,"end_time":"13:00","start_time":"05:30"},{"cct":3000,"value":80,"end_time":"22:20","start_time":"21:50"},{"cct":3000,"value":70,"end_time":"22:50","start_time":"22:20"},{"cct":3000,"value":60,"end_time":"23:20","start_time":"22:50"},{"cct":3000,"value":50,"end_time":"23:50","start_time":"23:20"},{"cct":3000,"value":40,"end_time":"00:20","start_time":"23:50"},{"cct":3000,"value":100,"end_time":"05:30","start_time":"03:20"},{"cct":3000,"value":30,"end_time":"00:50","start_time":"00:20"},{"cct":3000,"value":20,"end_time":"01:20","start_time":"00:50"},{"cct":3000,"value":90,"end_time":"21:50","start_time":"21:20"},{"cct":3000,"value":30,"end_time":"01:50","start_time":"01:20"},{"cct":3000,"value":40,"end_time":"02:20","start_time":"01:50"},{"cct":3000,"value":50,"end_time":"02:50","start_time":"02:20"},{"cct":3000,"value":60,"end_time":"03:20","start_time":"02:50"}],"astro_clock":true,"dawn_lux_sensor":false,"dusk_lux_sensor":false,"dawn_lux_sensor_value":5,"dusk_lux_sensor_value":5,"dawn_astro_clock_offset":0,"dusk_astro_clock_offset":0,"dawn_lux_sensor_time_window":30,"dusk_lux_sensor_time_window":30,"dawn_astro_clock_time_window":60,"dusk_astro_clock_time_window":60}',
|
||||
processed: true,
|
||||
status: true
|
||||
}
|
||||
]
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
exports.id = 'mqttpublish';
|
||||
exports.title = 'MQTT publish';
|
||||
exports.group = 'MQTT';
|
||||
exports.color = '#888600';
|
||||
exports.version = '1.1.0';
|
||||
exports.icon = 'sign-out';
|
||||
exports.input = true;
|
||||
exports.output = 1;
|
||||
exports.author = 'Martin Smola';
|
||||
exports.options = {};
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div data-jc="dropdown" data-jc-path="broker" data-jc-config="datasource:mqttconfig.brokers;required:true" class="m">@(Brokers)</div>
|
||||
<div data-jc="textbox" data-jc-path="topic" data-jc-config="placeholder:hello/world">Topic</div>
|
||||
<div class="help m">@(Supports variables, example: \`device/{device-id}\`)</div>
|
||||
<div data-jc="textbox" data-jc-path="staticmessage" data-jc-config="placeholder:123">Static message(string)</div>
|
||||
<div class="help m">@(Supports variables), @(If specified then incoming data are ignored and this message is sent instead. Topic is required if static message is defined.)</div>
|
||||
<div data-jc="dropdown" data-jc-path="qos" data-jc-config="items:,0,1,2" class="m">@(QoS)</div>
|
||||
<div data-jc="checkbox" data-jc-path="retain" class="m">@(Retain)</div>
|
||||
</div>
|
||||
<script>
|
||||
var mqttconfig = { brokers: [] };
|
||||
ON('open.mqttpublish', function(component, options) {
|
||||
TRIGGER('mqtt.brokers', 'mqttconfig.brokers');
|
||||
});
|
||||
ON('save.mqttpublish', function(component, options) {
|
||||
!component.name && (component.name = options.broker + (options.topic ? ' -> ' + options.topic : ''));
|
||||
});
|
||||
</script>`;
|
||||
|
||||
exports.readme = `# MQTT publish
|
||||
|
||||
If the topic field is left empty and the data object does not have a 'topic' property then nothing is send.
|
||||
Also if data object has a valid topic property it is assumed the object also have data property which is send as a payload;
|
||||
Example:
|
||||
\`\`\`javacsript
|
||||
{
|
||||
topic: '/topic',
|
||||
data: {
|
||||
hello: 'world'
|
||||
}
|
||||
}
|
||||
// in above case only { hello: 'world' } is published
|
||||
\`\`\`
|
||||
|
||||
If the topic field is not empty then the entire incomming data object is passed to the output.`;
|
||||
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
var PUBLISH_OPTIONS = {};
|
||||
|
||||
var ready = false;
|
||||
|
||||
instance.custom.reconfigure = function() {
|
||||
|
||||
ready = false;
|
||||
|
||||
if (!MQTT.broker(instance.options.broker))
|
||||
return instance.status('No broker', 'red');
|
||||
|
||||
if (instance.options.broker) {
|
||||
|
||||
MQTT.add(instance.options.broker, instance.id);
|
||||
ready = true;
|
||||
PUBLISH_OPTIONS.retain = instance.options.retain || false;
|
||||
PUBLISH_OPTIONS.qos = parseInt(instance.options.qos || 0);
|
||||
return;
|
||||
}
|
||||
|
||||
instance.status('Not configured', 'red');
|
||||
};
|
||||
|
||||
instance.on('options', instance.custom.reconfigure);
|
||||
|
||||
instance.on('data', function(flowdata) {
|
||||
if (!ready)
|
||||
return;
|
||||
var msg = instance.options.staticmessage ? instance.arg(instance.options.staticmessage) : flowdata.data;
|
||||
var topic = instance.arg(instance.options.topic || msg.topic);
|
||||
if (topic) {
|
||||
if (msg.topic)
|
||||
msg = msg.data;
|
||||
MQTT.publish(instance.options.broker, topic, msg, PUBLISH_OPTIONS);
|
||||
} else
|
||||
instance.debug('MQTT publish no topic');
|
||||
|
||||
instance.send(flowdata);
|
||||
});
|
||||
|
||||
instance.on('close', function() {
|
||||
MQTT.remove(instance.options.broker, instance.id);
|
||||
OFF('mqtt.brokers.status', instance.custom.brokerstatus);
|
||||
});
|
||||
|
||||
|
||||
instance.custom.brokerstatus = function(status, brokerid, msg) {
|
||||
if (brokerid !== instance.options.broker)
|
||||
return;
|
||||
|
||||
switch (status) {
|
||||
case 'connecting':
|
||||
instance.status('Connecting', '#a6c3ff');
|
||||
break;
|
||||
case 'connected':
|
||||
instance.status('Connected', 'green');
|
||||
break;
|
||||
case 'disconnected':
|
||||
instance.status('Disconnected', 'red');
|
||||
break;
|
||||
case 'connectionfailed':
|
||||
instance.status('Connection failed', 'red');
|
||||
break;
|
||||
case 'new':
|
||||
!ready && instance.custom.reconfigure();
|
||||
break;
|
||||
case 'removed':
|
||||
instance.custom.reconfigure();
|
||||
break;
|
||||
case 'error':
|
||||
instance.status(msg, 'red');
|
||||
break;
|
||||
case 'reconfigured':
|
||||
instance.options.broker = msg;
|
||||
instance.reconfig();
|
||||
instance.custom.reconfigure();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ON('mqtt.brokers.status', instance.custom.brokerstatus);
|
||||
|
||||
instance.custom.reconfigure();
|
||||
};
|
||||
|
|
@ -1,168 +0,0 @@
|
|||
exports.id = 'mqttsubscribe';
|
||||
exports.title = 'MQTT subscribe';
|
||||
exports.group = 'MQTT';
|
||||
exports.color = '#888600';
|
||||
exports.version = '1.1.0';
|
||||
exports.icon = 'sign-in';
|
||||
exports.output = 1;
|
||||
exports.variables = true;
|
||||
exports.author = 'Martin Smola';
|
||||
exports.options = {};
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div data-jc="dropdown" data-jc-path="broker" data-jc-config="datasource:mqttconfig.brokers;required:true" class="m">@(Select a broker)</div>
|
||||
<div data-jc="textbox" data-jc-path="topic" data-jc-config="placeholder:hello/world;required:true">Topic</div>
|
||||
<div class="help m">@(Supports variables, example: \`device/{device-id}\`)</div>
|
||||
<div data-jc="dropdown" data-jc-path="qos" data-jc-config="items:,0,1,2" class="m">@(QoS)</div>
|
||||
</div>
|
||||
<script>
|
||||
var mqttconfig = { brokers: [] };
|
||||
ON('open.mqttsubscribe', function(component, options) {
|
||||
TRIGGER('mqtt.brokers', 'mqttconfig.brokers');
|
||||
});
|
||||
ON('save.mqttsubscribe', function(component, options) {
|
||||
!component.name && (component.name = options.broker + (options.topic ? ' -> ' + options.topic : ''));
|
||||
});
|
||||
</script>`;
|
||||
|
||||
exports.readme = `
|
||||
# MQTT subscribe
|
||||
|
||||
The data recieved are passed to the output as follows:
|
||||
\`\`\`javascript
|
||||
{
|
||||
topic: '/lights/on',
|
||||
data: 'kitchen'
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
If the topic is wildcard then there's an array of matches in flowdata repository which can be used in Function component like so:
|
||||
\`\`\`javascript
|
||||
// wildcard -> /+/status
|
||||
// topic -> /devicename/status
|
||||
|
||||
var match = flowdata.get('mqtt_wildcard');
|
||||
// match === ['devicename']
|
||||
\`\`\`
|
||||
|
||||
More on wildcard topics [here](https://mosquitto.org/man/mqtt-7.html)
|
||||
`;
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
var old_topic;
|
||||
var ready = false;
|
||||
|
||||
instance.custom.reconfigure = function(o, old_options) {
|
||||
|
||||
|
||||
ready = false;
|
||||
|
||||
if (!MQTT.broker(instance.options.broker))
|
||||
return instance.status('No broker', 'red');
|
||||
|
||||
if (instance.options.broker && instance.options.topic) {
|
||||
|
||||
if (old_topic)
|
||||
MQTT.unsubscribe(instance.options.broker, instance.id, old_topic);
|
||||
|
||||
old_topic = instance.arg(instance.options.topic);
|
||||
MQTT.subscribe(instance.options.broker, instance.id, old_topic);
|
||||
ready = true;
|
||||
return;
|
||||
}
|
||||
|
||||
instance.status('Not configured', 'red');
|
||||
};
|
||||
|
||||
instance.on('options', instance.custom.reconfigure);
|
||||
|
||||
instance.on('close', function() {
|
||||
MQTT.unsubscribe(instance.options.broker, instance.id, instance.options.topic);
|
||||
OFF('mqtt.brokers.message', instance.custom.message);
|
||||
OFF('mqtt.brokers.status', instance.custom.brokerstatus);
|
||||
});
|
||||
|
||||
instance.custom.brokerstatus = function(status, brokerid, msg) {
|
||||
if (brokerid !== instance.options.broker)
|
||||
return;
|
||||
|
||||
switch (status) {
|
||||
case 'connecting':
|
||||
instance.status('Connecting', '#a6c3ff');
|
||||
break;
|
||||
case 'connected':
|
||||
instance.status('Connected', 'green');
|
||||
break;
|
||||
case 'disconnected':
|
||||
instance.status('Disconnected', 'red');
|
||||
break;
|
||||
case 'connectionfailed':
|
||||
instance.status('Connection failed', 'red');
|
||||
break;
|
||||
case 'new':
|
||||
!ready && instance.custom.reconfigure();
|
||||
break;
|
||||
case 'removed':
|
||||
instance.custom.reconfigure();
|
||||
break;
|
||||
case 'error':
|
||||
instance.status(msg, 'red');
|
||||
break;
|
||||
case 'reconfigured':
|
||||
instance.options.broker = msg;
|
||||
instance.reconfig();
|
||||
instance.custom.reconfigure();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
instance.custom.message = function(brokerid, topic, message) {
|
||||
if (brokerid !== instance.options.broker)
|
||||
return;
|
||||
|
||||
var match = mqttWildcard(topic, old_topic);
|
||||
if (match) {
|
||||
var flowdata = instance.make({ topic: topic, data: message })
|
||||
flowdata.set('mqtt_wildcard', match);
|
||||
instance.send2(flowdata);
|
||||
}
|
||||
}
|
||||
|
||||
ON('mqtt.brokers.message', instance.custom.message);
|
||||
ON('mqtt.brokers.status', instance.custom.brokerstatus);
|
||||
|
||||
instance.custom.reconfigure();
|
||||
};
|
||||
|
||||
// https://github.com/hobbyquaker/mqtt-wildcard
|
||||
function mqttWildcard(topic, wildcard) {
|
||||
if (topic === wildcard) {
|
||||
return [];
|
||||
} else if (wildcard === '#') {
|
||||
return [topic];
|
||||
}
|
||||
|
||||
var res = [];
|
||||
|
||||
var t = String(topic).split('/');
|
||||
var w = String(wildcard).split('/');
|
||||
|
||||
var i = 0;
|
||||
for (var lt = t.length; i < lt; i++) {
|
||||
if (w[i] === '+') {
|
||||
res.push(t[i]);
|
||||
} else if (w[i] === '#') {
|
||||
res.push(t.slice(i).join('/'));
|
||||
return res;
|
||||
} else if (w[i] !== t[i]) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if (w[i] === '#') {
|
||||
i += 1;
|
||||
}
|
||||
|
||||
return (i === w.length) ? res : null;
|
||||
}
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
exports.id = 'nodesdb_change_check';
|
||||
exports.title = 'Nodes DB change check';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#888600';
|
||||
exports.version = '1.0.2';
|
||||
exports.icon = 'sign-out';
|
||||
exports.input = 1;
|
||||
exports.output = 1;
|
||||
exports.readme = `Check, if nodes.table db changed compared to original database`;
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { sendNotification } = require('./helper/notification_reporter');
|
||||
const nodesOriginalFile = path.join(__dirname, '../databases/nodes_original/', 'nodes_original.table');
|
||||
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
function compareArrays(array1, array2) {
|
||||
let message = "";
|
||||
let areEqual = true;
|
||||
let zmenene = []
|
||||
|
||||
if (array1.length !== array2.length) {
|
||||
message += "Nezhoda v pocte nodov. "
|
||||
}
|
||||
|
||||
const set1 = new Set(array1.map(obj => JSON.stringify(obj)));
|
||||
const set2 = new Set(array2.map(obj => JSON.stringify(obj)));
|
||||
|
||||
for (const objStr of set1) {
|
||||
|
||||
if (!set2.has(objStr)) {
|
||||
zmenene.push(objStr)
|
||||
areEqual = false;
|
||||
} else {
|
||||
set2.delete(objStr);
|
||||
}
|
||||
}
|
||||
|
||||
if(!areEqual) {
|
||||
message += `Aktualne nody: ${zmenene.toString()}. Zmenene proti originalu: ${Array.from(set2).join(' ')}`;
|
||||
sendNotification("Nodesdb_changecheck", FLOW.GLOBALS.settings.rvoTbName, "nodes_db_changed", "", message, 0, instance);
|
||||
}
|
||||
else console.log("Arrays are equal.");
|
||||
|
||||
console.log(message)
|
||||
}
|
||||
|
||||
|
||||
instance.on("data", _ => {
|
||||
|
||||
let nodesData = FLOW.GLOBALS.nodesData;
|
||||
|
||||
// we check if nodes.table has changed compared to nodes_original.table (we have array of nodes e.g. [{node:255, tbname: "agruhuwhgursuhgo34hgsdiguhrr"}]
|
||||
const nodes_actual = Object.keys(nodesData).map(node => ({[node]: nodesData[node].tbname}))
|
||||
let nodes_original = fs.readFileSync(nodesOriginalFile, { encoding: 'utf8', flag: 'r' });
|
||||
|
||||
try {
|
||||
nodes_original = JSON.parse(nodes_original);
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
|
||||
setTimeout(() => compareArrays(nodes_actual, nodes_original),10000);
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
191
flow/nosql.js
191
flow/nosql.js
|
|
@ -1,191 +0,0 @@
|
|||
exports.id = 'nosql';
|
||||
exports.title = 'NoSQL';
|
||||
exports.version = '1.2.1';
|
||||
exports.group = 'Databases';
|
||||
exports.author = 'Martin Smola';
|
||||
exports.color = '#D770AD';
|
||||
exports.icon = 'database';
|
||||
exports.input = true;
|
||||
exports.output = 2;
|
||||
exports.options = {};
|
||||
exports.readme = `# NoSQL embedded
|
||||
|
||||
## Outputs
|
||||
|
||||
First output is response from nosql engine and second is the data passed in.
|
||||
|
||||
## Collection
|
||||
|
||||
if the collection field is left empty, then we try to look at \`flowdata.get('collection')\`, to set this value you need to use \`flowdata.set('collection', '<collection-name>')\` in previous component (currently only \`function\` can be used)
|
||||
|
||||
## Insert
|
||||
|
||||
- will insert recieved data
|
||||
- expects data to be an Object
|
||||
- returns error, success, id
|
||||
|
||||
## Read
|
||||
|
||||
- will read a document by id
|
||||
- expects data to be an Object with an \`id\` property
|
||||
- returns error, response
|
||||
|
||||
## Update
|
||||
|
||||
- will update document by id
|
||||
- expects data to be an Object with \`id\` property and all the props to be updated
|
||||
- returns error, response
|
||||
- if response is 0 then update failed
|
||||
|
||||
## Remove
|
||||
|
||||
- will remove document by id
|
||||
- expects data to be an Object with an \`id\` property
|
||||
- returns error, response
|
||||
- if response is 0 then remove failed
|
||||
|
||||
## Query
|
||||
|
||||
- will query DB
|
||||
- expects data to be an Array as shown bellow
|
||||
- returns error, response
|
||||
|
||||
\`\`\`javascript
|
||||
[
|
||||
['where', 'sensor', 'temp'], // builder.where('sensor', 'temp');
|
||||
['limit', 2] // builder.limit(2);
|
||||
]
|
||||
\`\`\``;
|
||||
|
||||
exports.html = `
|
||||
<div class="padding">
|
||||
<div data-jc="textbox" data-jc-path="collection" class="m mt10">DB collection name</div>
|
||||
<div data-jc="dropdown" data-jc-path="method" data-jc-config="required:true;items:insert,update,read,query,remove" class="m">@(Method)</div>
|
||||
<div data-jc="visible" data-jc-path="method" data-jc-config="if:value === 'insert'">
|
||||
<div data-jc="checkbox" data-jc-path="addid">Add unique ID to data before insert</div>
|
||||
</div>
|
||||
<div data-jc="visible" data-jc-path="method" data-jc-config="if:value === 'update'">
|
||||
<div data-jc="checkbox" data-jc-path="upsert">Insert document if it doesn't exist</div>
|
||||
<div data-jc="checkbox" data-jc-path="upsertid">Add unique ID to data before insert (only if it doesn't exist)</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
instance.on('data', function(flowdata, next) {
|
||||
|
||||
instance.send2(1, flowdata.clone());
|
||||
|
||||
var options = instance.options;
|
||||
var collection = options.collection || flowdata.get('collection');
|
||||
if (!collection) {
|
||||
flowdata.data = { err: '[DB] No collection specified' };
|
||||
next(0, flowdata);
|
||||
instance.error('[DB] No collection specified');
|
||||
return;
|
||||
}
|
||||
|
||||
var nosql = NOSQL(collection);
|
||||
var builder;
|
||||
|
||||
if (options.method === 'read') {
|
||||
|
||||
if (!flowdata.data.id) {
|
||||
flowdata.data = { err: '[DB] Cannot get record by id: `undefined`' };
|
||||
next(0, flowdata);
|
||||
instance.error('[DB] Cannot get record by id: `undefined`');
|
||||
return;
|
||||
}
|
||||
|
||||
builder = nosql.find();
|
||||
builder.where('id', flowdata.data.id);
|
||||
builder.first();
|
||||
builder.callback(function(err, response) {
|
||||
if (err) {
|
||||
instance.throw(err);
|
||||
} else {
|
||||
flowdata.data = { response: response };
|
||||
next(0, flowdata);
|
||||
}
|
||||
});
|
||||
|
||||
} else if (options.method === 'insert') {
|
||||
|
||||
options.addid && (flowdata.data.id = UID());
|
||||
nosql.insert(flowdata.data).callback(function(err) {
|
||||
if (err)
|
||||
instance.throw(err);
|
||||
else {
|
||||
flowdata.data = { success: err ? false : true, id: flowdata.data.id };
|
||||
next(0, flowdata);
|
||||
}
|
||||
});
|
||||
|
||||
} else if (options.method === 'query') {
|
||||
|
||||
var query = flowdata.data;
|
||||
builder = nosql.find();
|
||||
|
||||
query && query instanceof Array && query.forEach(function(q) {
|
||||
if (q instanceof Array) {
|
||||
var m = q[0];
|
||||
var args = q.splice(1);
|
||||
builder[m] && (builder[m].apply(builder, args));
|
||||
}
|
||||
});
|
||||
|
||||
builder.callback(function(err, response) {
|
||||
if (err) {
|
||||
instance.throw(err);
|
||||
} else {
|
||||
flowdata.data = { response: response || [] };
|
||||
next(0, flowdata);
|
||||
}
|
||||
});
|
||||
|
||||
} else if (options.method === 'update') {
|
||||
|
||||
if (!options.upsert && !flowdata.data.id) {
|
||||
flowdata.data = { err: '[DB] Cannot update record by id: `undefined`' };
|
||||
next(0, flowdata);
|
||||
instance.error('[DB] Cannot update record by id: `undefined`');
|
||||
return;
|
||||
}
|
||||
|
||||
if (options.upsert && (options.upsertid && !flowdata.data.id)) {
|
||||
flowdata.data.id = UID();
|
||||
builder = nosql.modify(flowdata.data, options.upsert);
|
||||
builder.where('id', flowdata.data.id);
|
||||
builder.callback(function(err, count) {
|
||||
if (err)
|
||||
instance.throw(err);
|
||||
else {
|
||||
flowdata.data = { response: count || 0 };
|
||||
next(0, flowdata);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
} else if (options.method === 'remove') {
|
||||
|
||||
if (!flowdata.data.id) {
|
||||
flowdata.data = { err: '[DB] Cannot remove record by id: `undefined`' };
|
||||
next(0, flowdata);
|
||||
instance.error('[DB] Cannot remove record by id: `undefined`');
|
||||
return;
|
||||
}
|
||||
|
||||
builder = nosql.remove();
|
||||
builder.where('id', flowdata.data.id);
|
||||
builder.callback(function(err, count) {
|
||||
if (err)
|
||||
instance.throw(err);
|
||||
else {
|
||||
flowdata.data = { response: count || 0 };
|
||||
next(0, flowdata);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
};
|
||||
31
flow/notifikacie.csv
Normal file
31
flow/notifikacie.csv
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
key;weight;en;sk
|
||||
switching_profile_point_applied_to_line;INFO;Switching profile point applied to line no. ${line} : ${value};Aplikovaný bod spínacieho profilu na línií č. ${line} : ${value}
|
||||
dusk_has_occured;INFO;Dusk has occured;Nastal súmrak
|
||||
dawn_has_occured;INFO;Dawn has occured;Nastal úsvit
|
||||
dimming_profile_was_successfully_received_by_node;NOTICE;Dimming profile was successfully received by node no. ${node};Stmievací profil bol úspešne prijatý nodom č. ${node}
|
||||
master_node_is_responding_again;NOTICE;Master node is responding again;Master node začal znovu odpovedať
|
||||
command_was_sent_from_terminal_interface;DEBUG;A command was sent from terminal interface;Z terminálu bol odoslaný príkaz
|
||||
master_node_is_not_responding;ALERT;Master node is not responding;Master node neodpovedá
|
||||
configuration_of_dimming_profile_to_node_failed;ALERT;Configuration of dimming profile to node no. ${node} has failed;Konfigurácia stmievacieho profilu pre node č. ${node} zlyhala
|
||||
circuit_breaker_was_turned_on_line;NOTICE;Circuit breaker was turned on - line no. ${line};Zapnutie ističa na línii č. ${line}
|
||||
circuit_breaker_was_turned_off_line;ERROR;Circuit breaker was turned off - line no. ${line};Vypnutie ističa na línií č. ${line}
|
||||
dimming_profile_was_processed_for_node;INFO;Dimming profile was processed for node no. ${node};Stmievací profil bol spracovaný pre node č. ${node}
|
||||
switching_profile_was_processed_for_line;INFO;Switching profile was processed for line no. ${line};Spínací profil bol spracovaný pre líniu č. ${line}
|
||||
thermometer_is_not_responding;WARNING;Thermometer is not responding;Teplomer neodpovedá
|
||||
thermometer_is_responding_again;NOTICE;Thermometer is responding again;Teplomer znovu odpovedá
|
||||
thermometer_sends_invalid_data;WARNING;Thermometer sends invalid data;Teplomer posiela neplatné hodnoty
|
||||
main_switch_has_been_turned_off;CRITICAL;Main switch has been turned off;Hlavný vypínač bol vypnutý
|
||||
main_switch_has_been_turned_on;NOTICE;Main switch has been turned on;Hlavný vypínač bol zapnutý
|
||||
power_supply_has_disconnected_input;ALERT;Power supply has disconnected input;Napájací zdroj nemá napätie na vstupe
|
||||
power_supply_works_correctly;NOTICE;Power supply works correctly ;Napájací zdroj pracuje správne
|
||||
battery_level_is_low;ERROR;Battery level is low;Batéria má nízku úroveň napätia
|
||||
battery_level_is_ok;NOTICE;Battery level is OK;Batéria má správnu úroveň napätia
|
||||
door_has_been_open;NOTICE;Door has been open;Dvere boli otvorené
|
||||
door_has_been_closed;NOTICE;Door has been closed;Dvere boli zatvorené
|
||||
door_has_been_open_without_permision_alarm_is_on;WARNING;Door has been open without permision - alarm is on;Dvere boli otvorené bez povolania - zapnutá siréna
|
||||
state_of_contactor_for_line;INFO;State of contactor for line no. ${line} is ${value};Stav stýkača pre líniu č. ${line} je ${value}
|
||||
local_database_is_corrupted;CRITICAL;;
|
||||
electrometer_is_not_responding;ERROR;Electrometer is not responding;Elektromer neodpovedá
|
||||
no_voltage_detected_on_phase;CRITICAL;No voltage detected on phase no. ${phase};Na fáze č. ${phase} nie je napätie
|
||||
electrometer_is_responding_again;NOTICE;Electrometer is responding again;Elektromer znovu odpovedá
|
||||
voltaga_on_phase_has_been_restored;NOTICE;Voltaga on phase no. ${phase} has been restored;Napätie na fáze č. ${phase} bolo obnovené
|
||||
|
|
|
@ -1,595 +0,0 @@
|
|||
Production line;Operation;Error type;Error code;Orig Message (EN);User defined error
|
||||
CMFB;OP10;C_STOP;121;Machine Not At Home Position;
|
||||
CMFB;OP10;C_STOP;122;Auto Mode Not Selected;
|
||||
CMFB;OP10;C_STOP;125;Part NOK;
|
||||
CMFB;OP10;C_STOP;140;Left Shift Conduit Contact Detect Sensor Backcheck Error;
|
||||
CMFB;OP10;C_STOP;141;Left Select Conduit Contact Detect Sensor Backcheck Error;
|
||||
CMFB;OP10;C_STOP;142;Right Shift Conduit Contact Detect Sensor Backcheck Error;
|
||||
CMFB;OP10;C_STOP;143;Right Select Conduit Contact Detect Sensor Backcheck Error;
|
||||
CMFB;OP10;C_STOP;144;Left Shift Conduit In Place Sensor Backcheck Error;
|
||||
CMFB;OP10;C_STOP;145;Left Select Conduit In Place Sensor Backcheck Error;
|
||||
CMFB;OP10;C_STOP;146;Right Select Conduit In Place Sensor Backcheck Error;
|
||||
CMFB;OP10;C_STOP;147;Left Shift Conduit In Place Sensor Backcheck Error;
|
||||
CMFB;OP10;C_STOP;148;Left_Shift_Conduit_Placed_In_Place Sensors Backcheck Error;
|
||||
CMFB;OP10;C_STOP;149;Left_Select_Conduit_Placed_In_Place Sensors Backcheck Error;
|
||||
CMFB;OP10;C_STOP;150;Right_Shift_Conduit_Placed_In_Place Sensors Backcheck Error;
|
||||
CMFB;OP10;C_STOP;151;Right_Select_Conduit_Placed_In_Place Sensors Backcheck Error;
|
||||
CMFB;OP10;I_STOP;101;Left Clampping Conduit Cylinder Home Position Timeout Error [I3.1&I3.3,Q3.3],;
|
||||
CMFB;OP10;I_STOP;102;Left Clampping Conduit Cylinder Work Position Timeout Error [I3.0&I3.2,Q3.2],;
|
||||
CMFB;OP10;I_STOP;103;Left Clampping Conduit Cylinder Sensors Miscompare [I3.1&I3.3,I3.0&I3.2],;
|
||||
CMFB;OP10;I_STOP;104;Right Clampping Conduit Cylinder Work Position Timeout Error [I4.0&I4.2,Q3.4],;
|
||||
CMFB;OP10;I_STOP;105;Right Clampping Conduit Cylinder Home Position Timeout Error [I4.1&I4.3,Q3.5],;
|
||||
CMFB;OP10;I_STOP;106;Right Clampping Conduit Cylinder Sensors Miscompare [I4.1&I4.3,I4.0&I4.2],;
|
||||
CMFB;OP10;I_STOP;107;Right Clipping Conduit Cylinder Work Position Timeout Error [I5.2,Q3.6],;
|
||||
CMFB;OP10;I_STOP;108;Right Clipping Conduit Cylinder Home Position Timeout Error [I5.3,Q3.7],;
|
||||
CMFB;OP10;I_STOP;109;Right Clipping Cylinder Sensors Miscompare [I3.1&I3.3,I3.0&I3.2],;
|
||||
CMFB;OP10;I_STOP;110;Left Clipping Cylinder Work Position Timeout Error [I6.2,Q5.2],;
|
||||
CMFB;OP10;I_STOP;111;Left Clipping Cylinder Home Position Timeout Error [I6.3,Q5.3],;
|
||||
CMFB;OP10;I_STOP;112;Left Clipping Cylinder Sensors Miscompare [I6.2,I6.3],;
|
||||
CMFB;OP10;I_STOP;113;Right Striping Cylinder Work Position Timeout Error [I5.0,Q4.0],;
|
||||
CMFB;OP10;I_STOP;114;Right Striping Cylinder Home Position Timeout Error [I3.1&I3.3,Q3.3],;
|
||||
CMFB;OP10;I_STOP;115;Right Striping Cylinder Sensors Miscompare [I3.1&I3.3,I3.0&I3.2],;
|
||||
CMFB;OP10;I_STOP;116;Left Striping Cylinder Work Position Timeout Error [I6.0,Q5.4],;
|
||||
CMFB;OP10;I_STOP;117;Left Stripping Cylinder Work Position Timeout Error [I6.1,Q5.5],;
|
||||
CMFB;OP10;I_STOP;118;Left Stripping Cylinder Sensors Miscompare [I6.0,I6.1],;
|
||||
CMFB;OP10;I_STOP;119;Left Escaping Cylinder Work Position Timeout Error [I6.4,Q5.6],;
|
||||
CMFB;OP10;I_STOP;120;Left Escaping Cylinder Home Position Timeout Error [I6.5,Q5.7],;
|
||||
CMFB;OP10;I_STOP;121;Left Escaping Cylinder Sensors Miscompare [I6.4,I6.5],;
|
||||
CMFB;OP10;I_STOP;122;Right Escaping Cylinder Work Position Timeout Error [I5.4,Q4.2],;
|
||||
CMFB;OP10;I_STOP;123;Right Escaping Cylinder Home Position Timeout Error [I5.5,Q4.3],;
|
||||
CMFB;OP10;I_STOP;124;Right Escaping Cylinder Sensors Miscompare [I5.4,I5.5],;
|
||||
CMFB;OP10;I_STOP;125;UP Clamping End of Conduit Cylinder Work Position Timeout Error [I8.0&I8.4,Q4.7],;
|
||||
CMFB;OP10;I_STOP;126;UP Clamping End of Conduit Cylinder Home Position Timeout Error [I8.1&I8.5,Q4.6],;
|
||||
CMFB;OP10;I_STOP;127;UP Clamping End of Conduit Cylinder Sensors Miscompare [I8.0&I8.4,I8.1&I8.5],;
|
||||
CMFB;OP10;I_STOP;128;DOWN Clamping End of Conduit Cylinder Work Position Timeout Error [I8.2&I8.6,Q4.4],;
|
||||
CMFB;OP10;I_STOP;129;DOWN Clamping End of Conduit Cylinder Home Position Timeout Error [I8.3&I8.7,Q4.5],;
|
||||
CMFB;OP10;I_STOP;130;DOWN Clamping End of Conduit Cylinder Sensors Miscompare [I8.2&I8.6,I8.3&I8.7],;
|
||||
CMFB;OP10;I_STOP;131;Fixture Moving Cylinder Work Position Timeout Error [I7.0,Q5.0],;
|
||||
CMFB;OP10;I_STOP;132;Fixture Moving Cylinder Home Position Timeout Error [I7.1,Q5.1],;
|
||||
CMFB;OP10;I_STOP;133;Fixture Moving Cylinder Sensors Miscompare Error[I7.0,I7.1],;
|
||||
CMFB;OP10;I_STOP;134;Hydraulic Cylinder Work Positio Timeout Error,;
|
||||
CMFB;OP10;I_STOP;135;Hydraulic Cylinder Home Position Timeout Error[I7.2],;
|
||||
CMFB;OP10;I_STOP;136;Hydraulic Cylinder Sensors Miscompare Error,;
|
||||
CMFB;OP10;I_STOP;137;Left Press Conduit Cylinder Work Positio Timeout Error[I10.3],;
|
||||
CMFB;OP10;I_STOP;138;Left Press Conduit Cylinder Home Positio Timeout Error[I10.2],;
|
||||
CMFB;OP10;I_STOP;139;Left Press Conduit Cylinder Sensors Miscompare Error[I10.2,I10.3],;
|
||||
CMFB;OP10;I_STOP;140;Right Press Conduit Cylinder Work Positio Timeout Error[I10.5],;
|
||||
CMFB;OP10;I_STOP;141;Right Press Conduit Cylinder Home Positio Timeout Error[I10.4],;
|
||||
CMFB;OP10;I_STOP;142;Right Press Conduit Cylinder Sensors Miscompare Error[I10.4,I10.5],;
|
||||
CMFB;OP10;I_STOP;151;Emergency Stop Relay Not ON,Pls Press Reset Button.,;
|
||||
CMFB;OP10;I_STOP;152;Emergency Stop Button Pressed;
|
||||
CMFB;OP20A;C_STOP;101;Light Curtain Blocked(I2.0),;
|
||||
CMFB;OP20A;C_STOP;121;Machine Not At Home Position,;
|
||||
CMFB;OP20A;C_STOP;122;Auto Mode Not Selected,;
|
||||
CMFB;OP20A;C_STOP;125;The Part Is NOK,;
|
||||
CMFB;OP20A;C_STOP;140;Grommet Assembly_PositionLeft sensor backcheck fault[I8.0],;
|
||||
CMFB;OP20A;C_STOP;141;Grommet Assembly_PositionRight sensor backcheck fault[I8.1],;
|
||||
CMFB;OP20A;C_STOP;142;AssemblyOK_Left_Front sensor backcheck fault[I8.2],;
|
||||
CMFB;OP20A;C_STOP;143;AssemblyOK_Left_Back sensor backcheck fault[I8.3],;
|
||||
CMFB;OP20A;C_STOP;144;AssemblyOK_Right_Front sensor backcheck fault[I8.4],;
|
||||
CMFB;OP20A;C_STOP;145;AssemblyOK_Right_Back sensor backcheck fault[I8.5],;
|
||||
CMFB;OP20A;C_STOP;146;Grommet present sensor backcheck fault[I5.6],;
|
||||
CMFB;OP20A;C_STOP;147;Clip check_front sensor backcheck fault[I9.6],;
|
||||
CMFB;OP20A;C_STOP;148;Clip check_back sensor backcheck fault[9.7],;
|
||||
CMFB;OP20A;C_STOP;149;Gromment left sensor backcheck fault[I8.6],;
|
||||
CMFB;OP20A;C_STOP;150;Check Sensor 11 Backcheck Error,;
|
||||
CMFB;OP20A;C_STOP;151;Check Sensor 12 Backcheck Error,;
|
||||
CMFB;OP20A;C_STOP;152;Check Sensor 13 Backcheck Error;
|
||||
CMFB;OP20A;I_STOP;100;Pressing cylinder Sensor Miscompare[I4.4,I4.5],;
|
||||
CMFB;OP20A;I_STOP;101;Clip ClampCylinder_front Work Position Timeout Errror[I9.1],;
|
||||
CMFB;OP20A;I_STOP;102;Clip ClampCylinder_front Home Position Timeout Errror[I9.0],;
|
||||
CMFB;OP20A;I_STOP;103;Clip ClampCylinder_front Sensor Miscompare[I9.0,I9.1],;
|
||||
CMFB;OP20A;I_STOP;104;Clip ClampCylinder_back Work Position Timeout Errror[I9.3],;
|
||||
CMFB;OP20A;I_STOP;105;Clip ClampCylinder_back Home Position Timeout Errror[I9.2],;
|
||||
CMFB;OP20A;I_STOP;106;Clip ClampCylinder_back Sensor Miscompare[I9.2,I9.3],;
|
||||
CMFB;OP20A;I_STOP;107;Clip Assembly Cylinder Work Position Timeout Errror[I9.5],;
|
||||
CMFB;OP20A;I_STOP;116;Clip Assembly Cylinder Home Position Timeout Errror[I9.4],;
|
||||
CMFB;OP20A;I_STOP;117;Clip Assembly Cylinder Sensor Miscompare[I9.4,I9.5],;
|
||||
CMFB;OP20A;I_STOP;151;Emergency Stop Relay Not ON,;
|
||||
CMFB;OP20A;I_STOP;152;Emergency Stop Button Pressed;
|
||||
CMFB;OP20B;C_STOP;100;Load Material cylinder Work Position Timeout Errror[I4.1],;
|
||||
CMFB;OP20B;C_STOP;101;Load Material cylinder Home Position Timeout Errror[I4.0],;
|
||||
CMFB;OP20B;C_STOP;102;Load Material cylinder Sensor Miscompare[I4.0,I4.1],;
|
||||
CMFB;OP20B;C_STOP;103;The Assembly of cylinder Work Position Timeout Errror[I4.3],;
|
||||
CMFB;OP20B;C_STOP;104;The Assembly of cylinder Home Position Timeout Errror[I4.2],;
|
||||
CMFB;OP20B;C_STOP;105;The Assembly of cylinder Sensor Miscompare[I4.2,I4.3],;
|
||||
CMFB;OP20B;C_STOP;106;Pressing cylinder Work Position Timeout Errror[I4.5],;
|
||||
CMFB;OP20B;C_STOP;107;Pressing cylinder Home Position Timeout Errror[I4.4],;
|
||||
CMFB;OP20B;C_STOP;108;Pressing cylinder Sensor Miscompare[I4.4,I4.5],;
|
||||
CMFB;OP20B;C_STOP;109;Clip ClampCylinder_front Work Position Timeout Errror[I9.1],;
|
||||
CMFB;OP20B;C_STOP;110;Clip ClampCylinder_front Home Position Timeout Errror[I9.0],;
|
||||
CMFB;OP20B;C_STOP;111;Clip ClampCylinder_front Sensor Miscompare[I9.0,I9.1],;
|
||||
CMFB;OP20B;C_STOP;112;Clip ClampCylinder_back Work Position Timeout Errror[I9.3],;
|
||||
CMFB;OP20B;C_STOP;113;Clip ClampCylinder_back Home Position Timeout Errror[I9.2],;
|
||||
CMFB;OP20B;C_STOP;114;Clip ClampCylinder_back Sensor Miscompare[I9.2,I9.3],;
|
||||
CMFB;OP20B;C_STOP;115;Clip Assembly Cylinder Work Position Timeout Errror[I9.5],;
|
||||
CMFB;OP20B;C_STOP;126;Clip Assembly NOK!,;
|
||||
CMFB;OP20B;C_STOP;140;Select Damper Prestretching sensor backcheck fault[I5.0],;
|
||||
CMFB;OP20B;C_STOP;141;Select Omgea Prestretching sensor backcheck fault[I5.1],;
|
||||
CMFB;OP20B;C_STOP;142;Shift Damper Prestretching sensor backcheck fault[I5.2],;
|
||||
CMFB;OP20B;C_STOP;143;Shift Omgea Prestretching sensor backcheck fault[I5.3],;
|
||||
CMFB;OP20B;C_STOP;144;Gromment ASSY Postion1 sensor backcheck fault[I5.4],;
|
||||
CMFB;OP20B;C_STOP;145;Gromment ASSY Postion2 sensor backcheck fault[I5.5],;
|
||||
CMFB;OP20B;C_STOP;146;Grommet present_Right sensor backcheck fault[I5.6];
|
||||
CMFB;OP20B;I_STOP;100;Rotating Pressure cylinder Sensor Miscompare[I7.2,I7.3],;
|
||||
CMFB;OP20B;I_STOP;101;Cover Cylinder Work Position Timeout Errror[I7.1],;
|
||||
CMFB;OP20B;I_STOP;102;Cover Cylinder Home Position Timeout Errror[I7.0],;
|
||||
CMFB;OP20B;I_STOP;103;Cover Cylinder Sensor Miscompare[I7.0,I7.1],;
|
||||
CMFB;OP20B;I_STOP;108;Remodel cylinder Work Position Timeout Errror[I7.7],;
|
||||
CMFB;OP20B;I_STOP;109;Remodel cylinder Home Position Timeout Errror[I7.6],;
|
||||
CMFB;OP20B;I_STOP;110;Remodel cylinder Sensor Miscompare[I7.6,I7.7],;
|
||||
CMFB;OP20B;I_STOP;111;Limit cylinder Work Position Timeout Errror[I7.5],;
|
||||
CMFB;OP20B;I_STOP;112;Limit cylinder Home Position Timeout Errror[I7.4],;
|
||||
CMFB;OP20B;I_STOP;113;Limit cylinder Sensor Miscompare[I7.4,I7.5],;
|
||||
CMFB;OP20B;I_STOP;114;Rotating Pressure cylinder Work Position Timeout Errror[I7.3],;
|
||||
CMFB;OP20B;I_STOP;115;Rotating Pressure cylinder Home Position Timeout Errror[I7.2];
|
||||
CMFB;OP30A;C_STOP;101; Left Station Light Curtain Blocked(I2.0),;
|
||||
CMFB;OP30A;C_STOP;121; Machine Not At Home Position_L,;
|
||||
CMFB;OP30A;C_STOP;122; Auto Mode Not Selected_L,;
|
||||
CMFB;OP30A;C_STOP;125; The Part Of Station Is NOK,;
|
||||
CMFB;OP30A;C_STOP;140; left front select swivetube present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;141; left front select swivetube assy present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;142; left front select omgea present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;143; left inside select swivetube present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;144; left inside select swivetube assy present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;145; left inside select omgea present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;146; right outside shift omgea present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;147; right outside shift swiveltube assy present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;148; right outside shift swiveltube present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;149; right inside shift omgea present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;150; right inside shift swiveltube assy present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;151; right inside shift swiveltube present sensor backcheck fault,;
|
||||
CMFB;OP30A;C_STOP;152; romemet assy present sensor backcheck fault;
|
||||
CMFB;OP30A;I_STOP;100;left front select rotating cylinder Work Position Timeout Errror[I3.1],;
|
||||
CMFB;OP30A;I_STOP;101;left front select rotating cylinder Home Position Timeout Errror[I3.0],;
|
||||
CMFB;OP30A;I_STOP;102;left front select rotating cylinder Sensor Miscompare[I3.0,I3.1],;
|
||||
CMFB;OP30A;I_STOP;103;left front select pull in cylinder Work Position Timeout Errror[I3.3],;
|
||||
CMFB;OP30A;I_STOP;104;left front select pull in cylinder Home Position Timeout Errror[I3.2],;
|
||||
CMFB;OP30A;I_STOP;105;left front select pull in cylinder Sensor Miscompare[I3.2,I3.3],;
|
||||
CMFB;OP30A;I_STOP;106;outside select prepull testing force not reach 1000N,;
|
||||
CMFB;OP30A;I_STOP;107;outside select prepull testing cylinder Home Position Timeout Errror[I3.4],;
|
||||
CMFB;OP30A;I_STOP;108;outside select prepull testing cylinder Sensor Miscompare[I3.4,I3.5],;
|
||||
CMFB;OP30A;I_STOP;109;left outside lifting release cylinder Work Position Timeout Errror[I3.7],;
|
||||
CMFB;OP30A;I_STOP;110;left outside lifting release cylinder Home Position Timeout Errror[I3.6],;
|
||||
CMFB;OP30A;I_STOP;111;left outside lifting release cylinder Cylinder Sensor Miscompare[I3.6,I3.7],;
|
||||
CMFB;OP30A;I_STOP;112;left outside select griping cylinder Work Position Timeout Errror[I4.1],;
|
||||
CMFB;OP30A;I_STOP;113;left outside select griping cylinder Home Position Timeout Errror[I4.0],;
|
||||
CMFB;OP30A;I_STOP;114;left outside select griping cylinder Sensor Miscompare[I4.0,I4.1],;
|
||||
CMFB;OP30A;I_STOP;115;outside pullout testing cylinder Work Position Timeout Errror[I4.3],;
|
||||
CMFB;OP30A;I_STOP;116;outside pullout testing cylinder Home Position Timeout Errror[I4.2],;
|
||||
CMFB;OP30A;I_STOP;117;outside pullout testing cylinder Sensor Miscompare[I4.2,I4.3],;
|
||||
CMFB;OP30A;I_STOP;118;left inside shift rotating cylinder Work Position Timeout Errror[I5.1],;
|
||||
CMFB;OP30A;I_STOP;119;left inside shift rotating cylinder Home Position Timeout Errror[I5.0],;
|
||||
CMFB;OP30A;I_STOP;120;left inside shift rotating cylinder Sensor Miscompare[I5.0,I5.1],;
|
||||
CMFB;OP30A;I_STOP;121;left inside shift pull in cylinder Work Position Timeout Errror[I5.3],;
|
||||
CMFB;OP30A;I_STOP;122;left inside shift pull in cylinder Home Position Timeout Errror[I5.2],;
|
||||
CMFB;OP30A;I_STOP;123;left inside shift pull in cylinder Sensor Miscompare[I5.2,I5.3],;
|
||||
CMFB;OP30A;I_STOP;124;Inside select prepull testing force not reach 1000N,;
|
||||
CMFB;OP30A;I_STOP;125;Inside select prepull testing cylinder Home Position Timeout Errror[I5.4],;
|
||||
CMFB;OP30A;I_STOP;126;Inside select prepull testing cylinder Sensor Miscompare[I5.4,I5.5],;
|
||||
CMFB;OP30A;I_STOP;127;left inside lifting release cylinder Work Position Timeout Errror[I5.7],;
|
||||
CMFB;OP30A;I_STOP;128;left inside lifting release cylinder Home Position Timeout Errror[I5.6],;
|
||||
CMFB;OP30A;I_STOP;129;left inside lifting release cylinder Sensor Miscompare[I5.6,I5.7],;
|
||||
CMFB;OP30A;I_STOP;130;left inside shift griping cylinder Work Position Timeout Errror[I6.1],;
|
||||
CMFB;OP30A;I_STOP;131;left inside shift griping cylinder Home Position Timeout Errror[I6.0],;
|
||||
CMFB;OP30A;I_STOP;132;left inside shift griping cylinder Sensor Miscompare[I6.0,I6.1],;
|
||||
CMFB;OP30A;I_STOP;133;inside pullout testing cylinder Work Position Timeout Errror[I6.3],;
|
||||
CMFB;OP30A;I_STOP;134;inside pullout testing cylinder Home Position Timeout Errror[I6.2],;
|
||||
CMFB;OP30A;I_STOP;135;inside pullout testing cylinder Sensor Miscompare[I6.2,I6.3],;
|
||||
CMFB;OP30A;I_STOP;136;right outside select pull in cylinder Work Position Timeout Errror[I7.1],;
|
||||
CMFB;OP30A;I_STOP;137;right outside select pull in cylinder Home Position Timeout Errror[I7.0],;
|
||||
CMFB;OP30A;I_STOP;138;right outside select pull in cylinder Sensor Miscompare[I7.0,I7.1],;
|
||||
CMFB;OP30A;I_STOP;139;right outside lifting release cylinder Work Position Timeout Errror[I7.3],;
|
||||
CMFB;OP30A;I_STOP;140;right outside lifting release cylinder Home Position Timeout Errror[I7.2],;
|
||||
CMFB;OP30A;I_STOP;141;right outside lifting release cylinder Sensor Miscompare[I7.2,I7.3],;
|
||||
CMFB;OP30A;I_STOP;142;right outside select griping the cylinder Work Position Timeout Errror[I7.5],;
|
||||
CMFB;OP30A;I_STOP;143;right outside select griping the cylinder Home Position Timeout Errror[I7.4],;
|
||||
CMFB;OP30A;I_STOP;144;right outside select griping the cylinder Sensor Miscompare[I7.4,I7.5],;
|
||||
CMFB;OP30A;I_STOP;145;right outside select rotating cylinder Work Position Timeout Errror[I7.7],;
|
||||
CMFB;OP30A;I_STOP;146;right outside select rotating cylinder Home Position Timeout Errror[I7.6],;
|
||||
CMFB;OP30A;I_STOP;147;right outside select rotating cylinder Sensor Miscompare[I7.6,I7.7],;
|
||||
CMFB;OP30A;I_STOP;148;left outside positioning cylinder Work Position Timeout Errror[I8.1],;
|
||||
CMFB;OP30A;I_STOP;149;left outside positioning cylinder Home Position Timeout Errror[I8.0],;
|
||||
CMFB;OP30A;I_STOP;150;left outside positioning cylinder Sensor Miscompare[I8.0,I8.1],;
|
||||
CMFB;OP30A;I_STOP;151;right outside positioning cylinder Work Position Timeout Errror[I8.3],;
|
||||
CMFB;OP30A;I_STOP;152;right outside positioning cylinder Home Position Timeout Errror[I8.2],;
|
||||
CMFB;OP30A;I_STOP;153;right outside positioning cylinder Sensor Miscompare[I8.2,I8.3],;
|
||||
CMFB;OP30A;I_STOP;154;right inside select rotating cylinder Work Position Timeout Errror[I9.1],;
|
||||
CMFB;OP30A;I_STOP;155;right inside select rotating cylinder Home Position Timeout Errror[I9.0],;
|
||||
CMFB;OP30A;I_STOP;156;right inside shift rotating cylinder Sensor Miscompare[I9.0,I9.1],;
|
||||
CMFB;OP30A;I_STOP;157;right inside shift pull in cylinder Work Position Timeout Errror[I9.3],;
|
||||
CMFB;OP30A;I_STOP;158;right inside shift pull in cylinder Home Position Timeout Errror[I9.2],;
|
||||
CMFB;OP30A;I_STOP;159;right inside shift pull in cylinder Sensor Miscompare[I9.2,I9.3],;
|
||||
CMFB;OP30A;I_STOP;160;right inside lifting release cylinder Work Position Timeout Errror[I9.5],;
|
||||
CMFB;OP30A;I_STOP;161;right inside lifting release cylinder Home Position Timeout Errror[I9.4],;
|
||||
CMFB;OP30A;I_STOP;162;right inside lifting release cylinder Sensor Miscompare[I9.4,I9.5],;
|
||||
CMFB;OP30A;I_STOP;163;right inside shift griping the cylinder Work Position Timeout Errror[I9.7],;
|
||||
CMFB;OP30A;I_STOP;164;right inside shift griping the cylinder Home Position Timeout Errror[I9.6],;
|
||||
CMFB;OP30A;I_STOP;165;right inside shift griping the cylinder Sensor Miscompare[I9.6,I9.7],;
|
||||
CMFB;OP30A;I_STOP;166;left inside postiton cylinder Work Position Timeout Errror[I10.1],;
|
||||
CMFB;OP30A;I_STOP;167;left inside postiton cylinder Home Position Timeout Errror[I10.0],;
|
||||
CMFB;OP30A;I_STOP;168;left inside postiton cylinder Sensor Miscompare[I10.0,I10.1],;
|
||||
CMFB;OP30A;I_STOP;169;right inside positioning cylinder Work Position Timeout Errror[I10.3],;
|
||||
CMFB;OP30A;I_STOP;170;right inside positioning cylinder Home Position Timeout Errror[I10.2],;
|
||||
CMFB;OP30A;I_STOP;171;right inside positioning cylinder Sensor Miscompare[I10.2,I10.3];
|
||||
CMFB;OP30B;C_STOP;101;" Left Station Light Curtain Blocked(I2.0),";
|
||||
CMFB;OP30B;C_STOP;121;" Machine Not At Home Position_L,";
|
||||
CMFB;OP30B;C_STOP;122;" Auto Mode Not Selected_L,";
|
||||
CMFB;OP30B;C_STOP;125;" The Part Of Station Is NOK,";
|
||||
CMFB;OP30B;C_STOP;140;" left front select swivetube present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;141;" left front select swivetube assy present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;142;" left front select omgea present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;143;" left inside select swivetube present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;144;" left inside select swivetube assy present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;145;" left inside select omgea present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;146;" right outside shift omgea present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;147;" right outside shift swiveltube assy present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;148;" right outside shift swiveltube present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;149;" right inside shift omgea present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;150;" right inside shift swiveltube assy present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;151;" right inside shift swiveltube present sensor backcheck fault,";
|
||||
CMFB;OP30B;C_STOP;152;" romemet assy present sensor backcheck fault";
|
||||
CMFB;OP30B;I_STOP;100;" left front select rotating cylinder Work Position Timeout Errror[I3.1],";
|
||||
CMFB;OP30B;I_STOP;101;" left front select rotating cylinder Home Position Timeout Errror[I3.0],";
|
||||
CMFB;OP30B;I_STOP;102;" left front select rotating cylinder Sensor Miscompare[I3.0,I3.1],";
|
||||
CMFB;OP30B;I_STOP;103;" left front select pull in cylinder Work Position Timeout Errror[I3.3],";
|
||||
CMFB;OP30B;I_STOP;104;" left front select pull in cylinder Home Position Timeout Errror[I3.2],";
|
||||
CMFB;OP30B;I_STOP;105;" left front select pull in cylinder Sensor Miscompare[I3.2,I3.3],";
|
||||
CMFB;OP30B;I_STOP;106;" outside select prepull testing force not reach 1000N,";
|
||||
CMFB;OP30B;I_STOP;107;" outside select prepull testing cylinder Home Position Timeout Errror[I3.4],";
|
||||
CMFB;OP30B;I_STOP;108;" outside select prepull testing cylinder Sensor Miscompare[I3.4,I3.5],";
|
||||
CMFB;OP30B;I_STOP;109;" left outside lifting release cylinder Work Position Timeout Errror[I3.7],";
|
||||
CMFB;OP30B;I_STOP;110;" left outside lifting release cylinder Home Position Timeout Errror[I3.6],";
|
||||
CMFB;OP30B;I_STOP;111;" left outside lifting release cylinder Cylinder Sensor Miscompare[I3.6,I3.7],";
|
||||
CMFB;OP30B;I_STOP;112;" left outside select griping cylinder Work Position Timeout Errror[I4.1],";
|
||||
CMFB;OP30B;I_STOP;113;" left outside select griping cylinder Home Position Timeout Errror[I4.0],";
|
||||
CMFB;OP30B;I_STOP;114;" left outside select griping cylinder Sensor Miscompare[I4.0,I4.1],";
|
||||
CMFB;OP30B;I_STOP;115;" outside pullout testing cylinder Work Position Timeout Errror[I4.3],";
|
||||
CMFB;OP30B;I_STOP;116;" outside pullout testing cylinder Home Position Timeout Errror[I4.2],";
|
||||
CMFB;OP30B;I_STOP;117;" outside pullout testing cylinder Sensor Miscompare[I4.2,I4.3],";
|
||||
CMFB;OP30B;I_STOP;118;" left inside shift rotating cylinder Work Position Timeout Errror[I5.1],";
|
||||
CMFB;OP30B;I_STOP;119;" left inside shift rotating cylinder Home Position Timeout Errror[I5.0],";
|
||||
CMFB;OP30B;I_STOP;120;" left inside shift rotating cylinder Sensor Miscompare[I5.0,I5.1],";
|
||||
CMFB;OP30B;I_STOP;121;" left inside shift pull in cylinder Work Position Timeout Errror[I5.3],";
|
||||
CMFB;OP30B;I_STOP;122;" left inside shift pull in cylinder Home Position Timeout Errror[I5.2],";
|
||||
CMFB;OP30B;I_STOP;123;" left inside shift pull in cylinder Sensor Miscompare[I5.2,I5.3],";
|
||||
CMFB;OP30B;I_STOP;124;" Inside select prepull testing force not reach 1000N,";
|
||||
CMFB;OP30B;I_STOP;125;" Inside select prepull testing cylinder Home Position Timeout Errror[I5.4],";
|
||||
CMFB;OP30B;I_STOP;126;" Inside select prepull testing cylinder Sensor Miscompare[I5.4,I5.5],";
|
||||
CMFB;OP30B;I_STOP;127;" left inside lifting release cylinder Work Position Timeout Errror[I5.7],";
|
||||
CMFB;OP30B;I_STOP;128;" left inside lifting release cylinder Home Position Timeout Errror[I5.6],";
|
||||
CMFB;OP30B;I_STOP;129;" left inside lifting release cylinder Sensor Miscompare[I5.6,I5.7],";
|
||||
CMFB;OP30B;I_STOP;130;" left inside shift griping cylinder Work Position Timeout Errror[I6.1],";
|
||||
CMFB;OP30B;I_STOP;131;" left inside shift griping cylinder Home Position Timeout Errror[I6.0],";
|
||||
CMFB;OP30B;I_STOP;132;" left inside shift griping cylinder Sensor Miscompare[I6.0,I6.1],";
|
||||
CMFB;OP30B;I_STOP;133;" inside pullout testing cylinder Work Position Timeout Errror[I6.3],";
|
||||
CMFB;OP30B;I_STOP;134;" inside pullout testing cylinder Home Position Timeout Errror[I6.2],";
|
||||
CMFB;OP30B;I_STOP;135;" inside pullout testing cylinder Sensor Miscompare[I6.2,I6.3],";
|
||||
CMFB;OP30B;I_STOP;136;" right outside select pull in cylinder Work Position Timeout Errror[I7.1],";
|
||||
CMFB;OP30B;I_STOP;137;" right outside select pull in cylinder Home Position Timeout Errror[I7.0],";
|
||||
CMFB;OP30B;I_STOP;138;" right outside select pull in cylinder Sensor Miscompare[I7.0,I7.1],";
|
||||
CMFB;OP30B;I_STOP;139;" right outside lifting release cylinder Work Position Timeout Errror[I7.3],";
|
||||
CMFB;OP30B;I_STOP;140;" right outside lifting release cylinder Home Position Timeout Errror[I7.2],";
|
||||
CMFB;OP30B;I_STOP;141;" right outside lifting release cylinder Sensor Miscompare[I7.2,I7.3],";
|
||||
CMFB;OP30B;I_STOP;142;" right outside select griping the cylinder Work Position Timeout Errror[I7.5],";
|
||||
CMFB;OP30B;I_STOP;143;" right outside select griping the cylinder Home Position Timeout Errror[I7.4],";
|
||||
CMFB;OP30B;I_STOP;144;" right outside select griping the cylinder Sensor Miscompare[I7.4,I7.5],";
|
||||
CMFB;OP30B;I_STOP;145;" right outside select rotating cylinder Work Position Timeout Errror[I7.7],";
|
||||
CMFB;OP30B;I_STOP;146;" right outside select rotating cylinder Home Position Timeout Errror[I7.6],";
|
||||
CMFB;OP30B;I_STOP;147;" right outside select rotating cylinder Sensor Miscompare[I7.6,I7.7],";
|
||||
CMFB;OP30B;I_STOP;148;" left outside positioning cylinder Work Position Timeout Errror[I8.1],";
|
||||
CMFB;OP30B;I_STOP;149;" left outside positioning cylinder Home Position Timeout Errror[I8.0],";
|
||||
CMFB;OP30B;I_STOP;150;" left outside positioning cylinder Sensor Miscompare[I8.0,I8.1],";
|
||||
CMFB;OP30B;I_STOP;151;" right outside positioning cylinder Work Position Timeout Errror[I8.3],";
|
||||
CMFB;OP30B;I_STOP;152;" right outside positioning cylinder Home Position Timeout Errror[I8.2],";
|
||||
CMFB;OP30B;I_STOP;153;" right outside positioning cylinder Sensor Miscompare[I8.2,I8.3],";
|
||||
CMFB;OP30B;I_STOP;154;" right inside select rotating cylinder Work Position Timeout Errror[I9.1],";
|
||||
CMFB;OP30B;I_STOP;155;" right inside select rotating cylinder Home Position Timeout Errror[I9.0],";
|
||||
CMFB;OP30B;I_STOP;156;" right inside shift rotating cylinder Sensor Miscompare[I9.0,I9.1],";
|
||||
CMFB;OP30B;I_STOP;157;" right inside shift pull in cylinder Work Position Timeout Errror[I9.3],";
|
||||
CMFB;OP30B;I_STOP;158;" right inside shift pull in cylinder Home Position Timeout Errror[I9.2],";
|
||||
CMFB;OP30B;I_STOP;159;" right inside shift pull in cylinder Sensor Miscompare[I9.2,I9.3],";
|
||||
CMFB;OP30B;I_STOP;160;" right inside lifting release cylinder Work Position Timeout Errror[I9.5],";
|
||||
CMFB;OP30B;I_STOP;161;" right inside lifting release cylinder Home Position Timeout Errror[I9.4],";
|
||||
CMFB;OP30B;I_STOP;162;" right inside lifting release cylinder Sensor Miscompare[I9.4,I9.5],";
|
||||
CMFB;OP30B;I_STOP;163;" right inside shift griping the cylinder Work Position Timeout Errror[I9.7],";
|
||||
CMFB;OP30B;I_STOP;164;" right inside shift griping the cylinder Home Position Timeout Errror[I9.6],";
|
||||
CMFB;OP30B;I_STOP;165;" right inside shift griping the cylinder Sensor Miscompare[I9.6,I9.7],";
|
||||
CMFB;OP30B;I_STOP;166;" left inside postiton cylinder Work Position Timeout Errror[I10.1],";
|
||||
CMFB;OP30B;I_STOP;167;" left inside postiton cylinder Home Position Timeout Errror[I10.0],";
|
||||
CMFB;OP30B;I_STOP;168;" left inside postiton cylinder Sensor Miscompare[I10.0,I10.1],";
|
||||
CMFB;OP30B;I_STOP;169;" right inside positioning cylinder Work Position Timeout Errror[I10.3],";
|
||||
CMFB;OP30B;I_STOP;170;" right inside positioning cylinder Home Position Timeout Errror[I10.2],";
|
||||
CMFB;OP30B;I_STOP;171;" right inside positioning cylinder Sensor Miscompare[I10.2,I10.3]";
|
||||
CMFB;OP40A;C_STOP;101;Left Station Light Curtain Blocked(I2.0),;
|
||||
CMFB;OP40A;C_STOP;121;Machine Not At Home Position_L,;
|
||||
CMFB;OP40A;C_STOP;122;Auto Mode Not Selected_L,;
|
||||
CMFB;OP40A;C_STOP;125;The Part Of Left Station Is NOK,;
|
||||
CMFB;OP40A;C_STOP;140;detection pressure 1 sensor backcheck fault,;
|
||||
CMFB;OP40A;C_STOP;141;detection pressure 2 sensor backcheck fault,;
|
||||
CMFB;OP40A;C_STOP;142;shift terminal type sensor backcheck fault,;
|
||||
CMFB;OP40A;C_STOP;143;shift boot present sensor backcheck fault,;
|
||||
CMFB;OP40A;C_STOP;144;shift terminal present sensor backcheck fault,;
|
||||
CMFB;OP40A;C_STOP;145;shift terminal no present sensor backcheck fault,;
|
||||
CMFB;OP40A;C_STOP;146;select terminal present sensor backcheck fault,;
|
||||
CMFB;OP40A;C_STOP;147;select terminal no present sensor backcheck fault,;
|
||||
CMFB;OP40A;C_STOP;148;select boot present Backcheck Error,;
|
||||
CMFB;OP40A;C_STOP;149;Shift Terminal Type Confirmation Sensor_1 Backcheck Error,;
|
||||
CMFB;OP40A;C_STOP;150;Shift Terminal Type Confirmation Sensor_2 Backcheck Error,;
|
||||
CMFB;OP40A;C_STOP;151;Select Terminal Type Confirmation Sensor_1 Backcheck Error,;
|
||||
CMFB;OP40A;C_STOP;152;Select Terminal Type Confirmation Sensor_2 Backcheck Error,;
|
||||
CMFB;OP40A;C_STOP;153;select termianl type Backcheck Error,;
|
||||
CMFB;OP40A;C_STOP;154;detect steel wire present1 Backcheck Error,;
|
||||
CMFB;OP40A;C_STOP;155;detect steel wire present2 Backcheck Error;
|
||||
CMFB;OP40A;I_STOP;100;front clamping wire cylinder Work Position Timeout Errror[I3.1],;
|
||||
CMFB;OP40A;I_STOP;101;front clamping wire cylinder Home Position Timeout Errror[I3.0],;
|
||||
CMFB;OP40A;I_STOP;102;front clamping wire cylinder Sensor Miscompare[I3.0,I3.1],;
|
||||
CMFB;OP40A;I_STOP;103;back clamping wire cylinder Work Position Timeout Errror[I3.3],;
|
||||
CMFB;OP40A;I_STOP;104;back clamping wire cylinder Home Position Timeout Errror[I3.2],;
|
||||
CMFB;OP40A;I_STOP;105;back clamping wire cylinder Sensor Miscompare[I3.2,I3.3],;
|
||||
CMFB;OP40A;I_STOP;106;Select Wire Not Put Well[I3.5],;
|
||||
CMFB;OP40A;I_STOP;107;pushing select wire cylinder Home Position Timeout Errror[I3.4],;
|
||||
CMFB;OP40A;I_STOP;108;pushing select wire cylinder Sensor Miscompare[I3.4,I3.5],;
|
||||
CMFB;OP40A;I_STOP;109;crimping cylinder Work Position Timeout Errror[I5.0],;
|
||||
CMFB;OP40A;I_STOP;110;crimping cylinder Home Position Timeout Errror[I4.2],;
|
||||
CMFB;OP40A;I_STOP;111;crimping cylinder Cylinder Sensor Miscompare[I3.6,I3.7],;
|
||||
CMFB;OP40A;I_STOP;112;Shift Wire Not Put Well[I4.1],;
|
||||
CMFB;OP40A;I_STOP;113;pushing shift wire cylinder Home Position Timeout Errror[I4.0],;
|
||||
CMFB;OP40A;I_STOP;114;pushing shift wire cylinder Sensor Miscompare[I4.0,I4.1],;
|
||||
CMFB;OP40A;I_STOP;115;front cliping wire cylinder Work Position Timeout Errror[I4.3],;
|
||||
CMFB;OP40A;I_STOP;116;front cliping wire cylinder Home Position Timeout Errror[I4.2],;
|
||||
CMFB;OP40A;I_STOP;117;front cliping wire cylinder Sensor Miscompare[I4.2,I4.3],;
|
||||
CMFB;OP40A;I_STOP;118;back cliping wire cylinder Work Position Timeout Errror[I4.5],;
|
||||
CMFB;OP40A;I_STOP;119;back cliping wire cylinder Home Position Timeout Errror[I4.4],;
|
||||
CMFB;OP40A;I_STOP;120;back cliping wire cylinder Sensor Miscompare[I4.4,I4.5],;
|
||||
CMFB;OP40A;I_STOP;121;Grease Pump Pressure Alarm For Terminal[I8.7],;
|
||||
CMFB;OP40A;I_STOP;122;Grease valve1Home Position Timeout Errror[],;
|
||||
CMFB;OP40A;I_STOP;123;Grease valve1Sensor Miscompare[],;
|
||||
CMFB;OP40A;I_STOP;124;Grease Pump Pressure Alarm For Inner Member,;
|
||||
CMFB;OP40A;I_STOP;125;Grease valve2 Home Position Timeout Errror[],;
|
||||
CMFB;OP40A;I_STOP;126;Grease valve2 Sensor Miscompare[],;
|
||||
CMFB;OP40A;I_STOP;151;Emergency Stop Relay Not ON,;
|
||||
CMFB;OP40A;I_STOP;152;Emergency Stop Button Pressed;
|
||||
CMFB;OP40B;C_STOP;101;Right Station Light Curtain Blocked(I2.6),;
|
||||
CMFB;OP40B;C_STOP;121;Machine Not At Home Position_R,;
|
||||
CMFB;OP40B;C_STOP;122;Auto Mode Not Selected_R,;
|
||||
CMFB;OP40B;C_STOP;125;The Part Of Right Station Is NOK,;
|
||||
CMFB;OP40B;C_STOP;140;shift omega present sensor backcheck fault,;
|
||||
CMFB;OP40B;C_STOP;141;select omega present sensor backcheck fault,;
|
||||
CMFB;OP40B;C_STOP;142;gromment present sensor backcheck fault,;
|
||||
CMFB;OP40B;C_STOP;143;detect steel wire present3 sensor backcheck fault,;
|
||||
CMFB;OP40B;C_STOP;144;detect steel wire present4 sensor backcheck fault,;
|
||||
CMFB;OP40B;C_STOP;148;Check Shift Wire Exists R sensor backcheck failure,;
|
||||
CMFB;OP40B;C_STOP;149;Check Select Wire Exists R sensor backcheck failure;
|
||||
CMFB;OP40B;I_STOP;100;Horizontal cylinder Work Position Timeout Error[I6.1],;
|
||||
CMFB;OP40B;I_STOP;101;Horizontal cylinder Home Position Timeout Error[I6.0],;
|
||||
CMFB;OP40B;I_STOP;102;Horizontal cylinder Sensors Miscompare Error[6.0,I6.1],;
|
||||
CMFB;OP40B;I_STOP;103;front Pressing wire cylinder Work Position Timeout Error[I6.3],;
|
||||
CMFB;OP40B;I_STOP;104;front Pressing wire cylinder Home Position Timeout Error[I6.2],;
|
||||
CMFB;OP40B;I_STOP;105;front Pressing wire cylinder Sensors Miscompare Error[I6.2,I6.3],;
|
||||
CMFB;OP40B;I_STOP;106;back Pressing wire cylinder Work Position Timeout Error[I6.5],;
|
||||
CMFB;OP40B;I_STOP;107;back Pressing wire cylinder Home Position Timeout Error[I6.4],;
|
||||
CMFB;OP40B;I_STOP;108;back Pressing wire cylinder Sensors Miscompare Error[6.4,I6.5],;
|
||||
CMFB;OP40B;I_STOP;109;Vertical Cylinder Work Position Timeout Error[I6.7],;
|
||||
CMFB;OP40B;I_STOP;110;Vertical Cylinder Home Position Timeout Error[I6.6],;
|
||||
CMFB;OP40B;I_STOP;111;Vertical Cylinder Sensors Miscompare Error[I6.6,I6.7],;
|
||||
CMFB;OP40B;I_STOP;112;Grease valve 3 Work Position Timeout Error[],;
|
||||
CMFB;OP40B;I_STOP;113;Grease valve 3 Home Position Timeout Error[],;
|
||||
CMFB;OP40B;I_STOP;114;Grease valve 3 Sensors Miscompare Error[],;
|
||||
CMFB;OP40B;I_STOP;115;Grease valve 4 Work Position Timeout Error[],;
|
||||
CMFB;OP40B;I_STOP;116;Grease valve 4 Home Position Timeout Error[],;
|
||||
CMFB;OP40B;I_STOP;117;Grease valve 4 Sensors Miscompare Error[],;
|
||||
CMFB;OP40B;I_STOP;151;Emergency Stop Relay Not ON,;
|
||||
CMFB;OP40B;I_STOP;152;Emergency Stop Button Pressed;
|
||||
CMFB;OP50;C_STOP;101;Light Curtain Blocked(I2.0),;
|
||||
CMFB;OP50;C_STOP;121;Machine Not At Home Position,;
|
||||
CMFB;OP50;C_STOP;122;Auto Mode Not Selected,;
|
||||
CMFB;OP50;C_STOP;125;The Part Is NOK,;
|
||||
CMFB;OP50;C_STOP;132;select conduit present left Sensor Backcheck Error[7.6],;
|
||||
CMFB;OP50;C_STOP;133;select conduit present right Sensor Backcheck Error[7.7],;
|
||||
CMFB;OP50;C_STOP;134;terminal present Sensor Backcheck Error[8.2],;
|
||||
CMFB;OP50;C_STOP;140;check shift omega Sensor Backcheck Error[I3.2],;
|
||||
CMFB;OP50;C_STOP;141;check select omega Sensor Backcheck Error[I3.3],;
|
||||
CMFB;OP50;C_STOP;142;check shift rodt Sensor Backcheck Error[I3.4],;
|
||||
CMFB;OP50;C_STOP;143;check select rod Sensor Backcheck Error[I3.5],;
|
||||
CMFB;OP50;C_STOP;144;shift check omega Sensor Backcheck Error[I5.7],;
|
||||
CMFB;OP50;C_STOP;145;select check omega Sensor Backcheck Error[I6.7],;
|
||||
CMFB;OP50;C_STOP;146;shift conduit present left Sensor Backcheck Error[7.4],;
|
||||
CMFB;OP50;C_STOP;147;shift conduit present right Sensor Backcheck Error[7.5],;
|
||||
CMFB;OP50;C_STOP;148;Shift Terminal Check Sensor Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;149;Select Terminal Check Sensor Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;150;Heavy Mass Check Sensor 1 Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;151;Heavy Mass Check Sensor 2 Check Sensor Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;152;Shift Swivel Tube Check Sensor Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;153;Select Swivel Tube Check Sensor Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;154;Shift Adjust Check Sensor Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;155;Select Adjust Check Sensor Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;156;Shift Star Sleve Check Sensor Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;157;Select Star Sleve Check Sensor Backcheck Error,;
|
||||
CMFB;OP50;C_STOP;158;Gromment Detect Check Sensor Backcheck Error;
|
||||
CMFB;OP50;I_STOP;100;crimping cylinder Work Position Timeout Errror[I3.1],;
|
||||
CMFB;OP50;I_STOP;101;crimping cylinder Home Position Timeout Errror[I3.0],;
|
||||
CMFB;OP50;I_STOP;102;crimping cylinderSensor Miscompare[I3.0,I3.1],;
|
||||
CMFB;OP50;I_STOP;103;left front location cylinder Work Position Timeout Errror[I4.1],;
|
||||
CMFB;OP50;I_STOP;104;left front location cylinder Home Position Timeout Errror[I4.0],;
|
||||
CMFB;OP50;I_STOP;105;left front location cylinder Sensor Miscompare[I4.0,I4.1],;
|
||||
CMFB;OP50;I_STOP;106;left back location cylinder Work Position Timeout Errror[I4.3],;
|
||||
CMFB;OP50;I_STOP;107;left back location cylinder Home Position Timeout Errror[I4.2],;
|
||||
CMFB;OP50;I_STOP;108;left back location cylinder Sensor Miscompare[I4.2,I4.3],;
|
||||
CMFB;OP50;I_STOP;109;right front location cylinder Work Position Timeout Errror[I4.5],;
|
||||
CMFB;OP50;I_STOP;110;right front location cylinder Home Position Timeout Errror[I4.4],;
|
||||
CMFB;OP50;I_STOP;111;right front location cylinder Sensor Miscompare[I4.4,I4.5],;
|
||||
CMFB;OP50;I_STOP;112;right back location cylinder Work Position Timeout Errror[I4.7],;
|
||||
CMFB;OP50;I_STOP;113;right back location cylinder Home Position Timeout Errror[I4.6],;
|
||||
CMFB;OP50;I_STOP;114;right back location cylinder Sensor Miscompare[I4.6,I4.7],;
|
||||
CMFB;OP50;I_STOP;115;select terminal pullout test cylinder Work Position Timeout Errror[I5.1],;
|
||||
CMFB;OP50;I_STOP;116;select terminal pullout test cylinder Not Reach 500N,;
|
||||
CMFB;OP50;I_STOP;117;select terminal pullout test cylinder Sensor Miscompare[I5.0,I5.1],;
|
||||
CMFB;OP50;I_STOP;118;selcet terminal fixed cylinder Work Position Timeout Errror[I5.3],;
|
||||
CMFB;OP50;I_STOP;119;selcet terminal fixed cylinder Home Position Timeout Errror[I5.2],;
|
||||
CMFB;OP50;I_STOP;120;selcet terminal fixed cylinder Sensor Miscompare[I5.2,I5.3],;
|
||||
CMFB;OP50;I_STOP;121;pulling select cable cylinder Work Position Timeout Errror[I5.5],;
|
||||
CMFB;OP50;I_STOP;122;pulling select cable cylinder Home Position Timeout Errror[I5.4],;
|
||||
CMFB;OP50;I_STOP;123;pulling select cable cylinder Sensor Miscompare[I5.4,I5.5],;
|
||||
CMFB;OP50;I_STOP;124;shift terminal pullout test cylinder Work Position Timeout Errror[I6.1],;
|
||||
CMFB;OP50;I_STOP;125;shift terminal pullout test cylinder Not Reach 500N,;
|
||||
CMFB;OP50;I_STOP;126;shift terminal pullout test cylinder Sensor Miscompare[I6.0,I6.1],;
|
||||
CMFB;OP50;I_STOP;127;shift terminal fixed cylinder Work Position Timeout Errror[I6.3],;
|
||||
CMFB;OP50;I_STOP;128;shift terminal fixed cylinder Home Position Timeout Errror[I6.2],;
|
||||
CMFB;OP50;I_STOP;129;shift terminal fixed cylinder Sensor Miscompare[I6.2,I6.3],;
|
||||
CMFB;OP50;I_STOP;130;pulling shift cable cylinder Work Position Timeout Errror[I6.5],;
|
||||
CMFB;OP50;I_STOP;131;pulling shift cable cylinder Home Position Timeout Errror[I6.4],;
|
||||
CMFB;OP50;I_STOP;132;pulling shift cable cylinder Sensor Miscompare[I6.4,I6.5],;
|
||||
CMFB;OP50;I_STOP;133;prepull shift cable cylinder Work Position Timeout Errror[I7.1],;
|
||||
CMFB;OP50;I_STOP;134;prepull shift cable cylinder Home Position Timeout Errror[I7.0],;
|
||||
CMFB;OP50;I_STOP;135;prepull shift cable cylinder Sensor Miscompare[I7.0,I7.1],;
|
||||
CMFB;OP50;I_STOP;136;prepull select cable cylinder Work Position Timeout Errror[I7.3],;
|
||||
CMFB;OP50;I_STOP;137;prepull select cable cylinder Home Position Timeout Errror[I7.2],;
|
||||
CMFB;OP50;I_STOP;138;prepull select cable cylinder Sensor Miscompare[I7.2,I7.3],;
|
||||
CMFB;OP50;I_STOP;139;terminal greasing valve Work Position Timeout Errror[I8.1],;
|
||||
CMFB;OP50;I_STOP;140;terminal greasing valve Home Position Timeout Errror[I8.0],;
|
||||
CMFB;OP50;I_STOP;141;terminal greasing valve Sensor Miscompare[I8.0,I8.1],;
|
||||
CMFB;OP50;I_STOP;161;Emergency Stop Relay Not ON,;
|
||||
CMFB;OP50;I_STOP;162;Emergency Stop Button Pressed;
|
||||
CMFB;OP55;C_STOP;102;Emergency Stop Relay Not ON,;
|
||||
CMFB;OP55;C_STOP;121;Machine Not At Home Position,;
|
||||
CMFB;OP55;C_STOP;122;Auto Mode Not Selected,;
|
||||
CMFB;OP55;C_STOP;125;Part NOK,;
|
||||
CMFB;OP55;C_STOP;140;Shift check1 Sensors Backcheck Error,;
|
||||
CMFB;OP55;C_STOP;141;Shift check2 Sensors Backcheck Error,;
|
||||
CMFB;OP55;C_STOP;142;Select check1 Sensors Backcheck Error,;
|
||||
CMFB;OP55;C_STOP;143;Select check1 Sensors Backcheck Error,;
|
||||
CMFB;OP55;C_STOP;149;Left_Select_Conduit_Placed_In_Place Sensors Backcheck Error,;
|
||||
CMFB;OP55;C_STOP;150;Right_Shift_Conduit_Placed_In_Place Sensors Backcheck Error,;
|
||||
CMFB;OP55;C_STOP;151;Right_Select_Conduit_Placed_In_Place Sensors Backcheck Error;
|
||||
CMFB;OP55;I_STOP;101;Shift bushing assy cylinder Work Position Timeout Error [I3.3,Q3.1],;
|
||||
CMFB;OP55;I_STOP;102;Shift bushing assy cylinder Home Position Timeout Error [I3.2,Q3.0],;
|
||||
CMFB;OP55;I_STOP;103;Shift bushing assy cylinder Sensors Miscompare [I3.2,I3.3],;
|
||||
CMFB;OP55;I_STOP;104;Select bushing assy cylinder Work Position Timeout Error [I4.3,Q3.3],;
|
||||
CMFB;OP55;I_STOP;105;Select bushing assy cylinder Home Position Timeout Error [I4.2,Q3.2],;
|
||||
CMFB;OP55;I_STOP;106;Select bushing assy cylinder Sensors Miscompare [I4.2,I4.3],;
|
||||
CMFB;OP55;I_STOP;107;Shift test cylinder Work Position Timeout Error [I3.5,Q4.1],;
|
||||
CMFB;OP55;I_STOP;108;Shift test cylinder Home Position Timeout Error [I3.4,Q4.0],;
|
||||
CMFB;OP55;I_STOP;109;Shift test cylinder Sensors Miscompare [I3.4,I3.5],;
|
||||
CMFB;OP55;I_STOP;110;Select test cylinder Work Position Timeout Error [I4.3,Q4.3],;
|
||||
CMFB;OP55;I_STOP;111;Select test cylinder Home Position Timeout Error [I4.2,Q4.2],;
|
||||
CMFB;OP55;I_STOP;112;Select test cylinder Sensors Miscompare [I4.2,I4.3],;
|
||||
CMFB;OP55;I_STOP;113;Conduit clamp cylinder Work Position Timeout Error [I4.7,Q4.5],;
|
||||
CMFB;OP55;I_STOP;114;Conduit clamp cylinder Home Position Timeout Error [I4.6,Q4.4],;
|
||||
CMFB;OP55;I_STOP;115;Conduit clamp cylinderCylinder Sensors Miscompare [I4.6,I4.7],;
|
||||
CMFB;OP55;I_STOP;116;Screw feeder cylinder Work Position Timeout Error [5.1,Q7.3],;
|
||||
CMFB;OP55;I_STOP;117;Screw feeder cylinder Home Position Timeout Error [I5.0,Q7.2],;
|
||||
CMFB;OP55;I_STOP;118;Screw feeder cylinder Cylinder Sensors Miscompare [I5.0,I5.1],;
|
||||
CMFB;OP55;I_STOP;124;Screw NOK,;
|
||||
CMFB;OP55;I_STOP;125;IAI Error,;
|
||||
CMFB;OP55;I_STOP;126;Shift Screw test Error,;
|
||||
CMFB;OP55;I_STOP;127;Select Screw test Error,;
|
||||
CMFB;OP55;I_STOP;128;Shift washer assembly not correct,;
|
||||
CMFB;OP55;I_STOP;129;Selcet washer assembly not correct,;
|
||||
CMFB;OP55;I_STOP;130;Part Pullout Testing Not OK,;
|
||||
CMFB;OP55;I_STOP;131;Screw operation Timeout Error,;
|
||||
CMFB;OP55;I_STOP;151;Emergency Stop Relay Not ON,Pls Press Reset Button.,;
|
||||
CMFB;OP55;I_STOP;152;Emergency Stop Button Pressed;
|
||||
CMFB;OP60;C_STOP;121;Machine Not At Home Position,;
|
||||
CMFB;OP60;C_STOP;122;Auto Mode Not Selected,;
|
||||
CMFB;OP60;C_STOP;123;No Model Selected,;
|
||||
CMFB;OP60;C_STOP;125;Outside select terminal check1 Sensor Backcheck Error[I3.2],;
|
||||
CMFB;OP60;C_STOP;126;Outside select terminal check2 Sensor Backcheck Error[I3.3],;
|
||||
CMFB;OP60;C_STOP;127;Outside select termianl present1 Sensor Backcheck Error[I3.4],;
|
||||
CMFB;OP60;C_STOP;128;Outside select termianl present2 Sensor Backcheck Error[I3.5],;
|
||||
CMFB;OP60;C_STOP;129;Outside select omega present1 Sensor Backcheck Error[I3.6],;
|
||||
CMFB;OP60;C_STOP;130;Outside shift terminal check1 Sensor Backcheck Error[I4.2],;
|
||||
CMFB;OP60;C_STOP;131;Outside shift terminal check2 Sensor Backcheck Error[I4.3],;
|
||||
CMFB;OP60;C_STOP;132;Outside shift termianl present1 Sensor Backcheck Error[I4.4],;
|
||||
CMFB;OP60;C_STOP;133;Outside shift omega present1 Sensor Backcheck Error[I4.5],;
|
||||
CMFB;OP60;C_STOP;134;Outside shift conduit present Sensor Backcheck Error[I5.2],;
|
||||
CMFB;OP60;C_STOP;135;Outside select conduit present Sensor Backcheck Error[I5.3],;
|
||||
CMFB;OP60;C_STOP;136;Inside shift conduit present Sensor Insidecheck Error[I5.6],;
|
||||
CMFB;OP60;C_STOP;137;Inside select conduit present Sensor Backcheck Error[I5.7],;
|
||||
CMFB;OP60;C_STOP;138;Outside select omega present Sensor Backcheck Error[I6.0],;
|
||||
CMFB;OP60;C_STOP;139;Outside select tube present Sensor Backcheck Error[I6.1],;
|
||||
CMFB;OP60;C_STOP;140;Outside select adjuster check1 Sensor Backcheck Error[I6.2],;
|
||||
CMFB;OP60;C_STOP;141;Outside select adjuster check2 Sensor Backcheck [I6.3],;
|
||||
CMFB;OP60;C_STOP;142;Outside shift omega present Sensor Backcheck Error[I6.4],;
|
||||
CMFB;OP60;C_STOP;143;Outside shift tube present Sensor Backcheck Error[I6.5],;
|
||||
CMFB;OP60;C_STOP;144;Outside shift adjuster check1 Sensor Backcheck Error[I6.6],;
|
||||
CMFB;OP60;C_STOP;145;Outside shift adjuster check2 Sensor Backcheck Error[I6.7],;
|
||||
CMFB;OP60;C_STOP;146;Inside select terminal check1 Sensor Backcheck Error[I7.2],;
|
||||
CMFB;OP60;C_STOP;147;Inside select terminal check2 Sensor Backcheck Error[I7.3],;
|
||||
CMFB;OP60;C_STOP;148;Inside select termianl present1 Sensor Backcheck Error[I7.4],;
|
||||
CMFB;OP60;C_STOP;149;Inside select termianl present2 Sensor Backcheck [I7.5],;
|
||||
CMFB;OP60;C_STOP;150;Inside select omega present1 Sensor Backcheck Error[I7.6],;
|
||||
CMFB;OP60;C_STOP;151;Inside shift terminal check1 Sensor Insidecheck Error[I8.2],;
|
||||
CMFB;OP60;C_STOP;152;Inside shift terminal check2 Sensor Insidecheck Error[I8.3],;
|
||||
CMFB;OP60;C_STOP;153;Inside shift termianl present Sensor Insidecheck Error[I8.4],;
|
||||
CMFB;OP60;C_STOP;154;Inside shift omega present1 Sensor Insidecheck Error[I8.5],;
|
||||
CMFB;OP60;C_STOP;155;Inside select omega present2 Sensor Backcheck Error[I9.0],;
|
||||
CMFB;OP60;C_STOP;156;Inside select tube present Sensor Backcheck Error[I9.1],;
|
||||
CMFB;OP60;C_STOP;157;Insideselect adjuster check1 Sensor Backcheck Error[I9.2],;
|
||||
CMFB;OP60;C_STOP;158;Inside select adjuster check2 Sensor Backcheck Error[I9.3],;
|
||||
CMFB;OP60;C_STOP;159;Inside shift omega present2 Sensor Insidecheck Error[I9.4],;
|
||||
CMFB;OP60;C_STOP;160;Inside shift tube present Sensor Insidecheck Error[I9.5],;
|
||||
CMFB;OP60;C_STOP;161;Inside shift adjuster check1 Sensor Insidecheck Error[I9.6],;
|
||||
CMFB;OP60;C_STOP;162;Inside shift adjuster check2 Sensor Insidecheck Error[I9.7];
|
||||
CMFB;OP60;I_STOP;101;Outside select release cylinder Work Position Timeout[I3.1],;
|
||||
CMFB;OP60;I_STOP;102;Outside select release cylinder Home Position Timeout[I3.0],;
|
||||
CMFB;OP60;I_STOP;103;Outside select release cylinder Sensors Miscompare[I3.0,I3.1],;
|
||||
CMFB;OP60;I_STOP;104;Outside shift release cylinder Work Position Timeout[I4.1],;
|
||||
CMFB;OP60;I_STOP;105;Outside shift release cylinder Home Position Timeout[I4.0],;
|
||||
CMFB;OP60;I_STOP;106;Outside shift release cylinder Sensors Miscompare[I4.0,I4.1],;
|
||||
CMFB;OP60;I_STOP;107;Outside clamp conduit cylinder Work Position Timeout[I5.1],;
|
||||
CMFB;OP60;I_STOP;108;Outside clamp conduit cylinder Home Position Timeout[I5.0],;
|
||||
CMFB;OP60;I_STOP;109;Outside clamp conduit cylinder Sensors Miscompare[I5.0,I5.1],;
|
||||
CMFB;OP60;I_STOP;110;Inside select release cylinder Work Position Timeout[I5.5],;
|
||||
CMFB;OP60;I_STOP;111;Inside select release cylinder Home Position Timeout[I5.4],;
|
||||
CMFB;OP60;I_STOP;112;Inside select release cylinder Sensors Miscompare[I5.4,I5.5],;
|
||||
CMFB;OP60;I_STOP;113;Inside shift release cylinder Work Position Timeout[I7.1],;
|
||||
CMFB;OP60;I_STOP;114;Inside shift release cylinder Home Position Timeout[I7.0],;
|
||||
CMFB;OP60;I_STOP;115;Inside shift release cylinder Sensors Miscompare[I7.0,I7.1],;
|
||||
CMFB;OP60;I_STOP;116;Inside clamp conduit cylinder Work Position Timeout[I8.1],;
|
||||
CMFB;OP60;I_STOP;117;Inside clamp conduit cylinder Home Position Timeout[I8.0],;
|
||||
CMFB;OP60;I_STOP;118;Inside clamp conduit cylinder Sensors Miscompare[I8.0,I8.1],;
|
||||
CMFB;OP60;I_STOP;119;Outside Selectlength_Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;120;Outside Shiftlength_Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;121;Outside SelectA+B_Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;122;Outside ShiftA+B_Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;123;Inside Selectlength_Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;124;Inside Shiftlength_Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;125;Inside SelectA+B_Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;126;Inside ShiftA+B_Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;127;Lazer_Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;135;Light Curtain Blocked In Cycle,;
|
||||
CMFB;OP60;I_STOP;136;Before Select Cable A+B Test, Force Reach Stop Force, Please Check,;
|
||||
CMFB;OP60;I_STOP;137;Before Shift Cable A+B Test, Force Reach Stop Force, Please Check,;
|
||||
CMFB;OP60;I_STOP;140;Select Cable Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;141;Shift Cable Axis Alarm,;
|
||||
CMFB;OP60;I_STOP;142;Outside Part Select Cable Friction Test Failed,Please Check,;
|
||||
CMFB;OP60;I_STOP;143;Outside Part Shift Cable Friction Test Failed,Please Check,;
|
||||
CMFB;OP60;I_STOP;144;Inside Part Select Cable Friction Test Failed,Please Check,;
|
||||
CMFB;OP60;I_STOP;145;Inside Part Shift Cable Friction Test Failed,Please Check,;
|
||||
CMFB;OP60;I_STOP;151;Emergency Stop Relay Not ON,;
|
||||
CMFB;OP60;I_STOP;152;Emergency Stop Button Pressed;
|
||||
CMFB;OP70;C_STOP;102;Emergency Stop Relay Not ON,;
|
||||
CMFB;OP70;C_STOP;121;Machine Not At Home Position,;
|
||||
CMFB;OP70;C_STOP;122;Auto Mode Not Selected,;
|
||||
CMFB;OP70;C_STOP;125;Part NOK,;
|
||||
CMFB;OP70;C_STOP;133;select adjuster present Sensors Backcheck Error[I5.4],;
|
||||
CMFB;OP70;C_STOP;134;shift right omega present Sensors Backcheck Error[I5.5],;
|
||||
CMFB;OP70;C_STOP;135;shift right clip present Sensors Backcheck Error[I5.6],;
|
||||
CMFB;OP70;C_STOP;136;slect adjuster locker present Sensors Backcheck Error[I5.7],;
|
||||
CMFB;OP70;C_STOP;137;gromment present Sensors Backcheck Error[I6.0],;
|
||||
CMFB;OP70;C_STOP;141;select omega present Sensors Backcheck Error[I3.4],;
|
||||
CMFB;OP70;C_STOP;142;select clip present Sensors Backcheck Error[I3.5],;
|
||||
CMFB;OP70;C_STOP;143;shift clip present Sensors Backcheck Error[I3.6],;
|
||||
CMFB;OP70;C_STOP;144;shift omega present Sensors Backcheck Error[I3.7],;
|
||||
CMFB;OP70;C_STOP;145;select star sleeve present Sensors Backcheck Error[I4.6],;
|
||||
CMFB;OP70;C_STOP;146;shift star sleeve present Sensors Backcheck Error[I4.7],;
|
||||
CMFB;OP70;C_STOP;147;select right omega present Sensors Backcheck Error[I5.2],;
|
||||
CMFB;OP70;C_STOP;148;select right clip present Sensors Backcheck Error[I5.3];
|
||||
CMFB;;MANUAL;;;Zoradenie
|
||||
CMFB;;MANUAL;;;Zmena_typu
|
||||
CMFB;;MANUAL;;;Chyba_material
|
||||
CMFB;;MANUAL;;;Zastavene_QE
|
||||
CMFB;;MANUAL;;;Zastavene_PE
|
||||
CMFB;;MANUAL;;;Nedostatok_operatorov
|
||||
CMFB;;MANUAL;;;Odstavka
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
{"$1634465281992ram":[{"timestamp":1634480076668,"ram":60.69,"ram_max":249}]}
|
||||
|
|
@ -1,228 +0,0 @@
|
|||
exports.id = 'showdb';
|
||||
exports.title = 'Show db data';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#888600';
|
||||
exports.version = '1.0.2';
|
||||
exports.icon = 'sign-out';
|
||||
exports.input = 5;
|
||||
exports.output = 1;
|
||||
|
||||
|
||||
exports.install = async function(instance) {
|
||||
|
||||
instance.on("0", _ => {
|
||||
instance.send(0, FLOW.GLOBALS.settings);
|
||||
})
|
||||
instance.on("1", _ => {
|
||||
instance.send(0, FLOW.GLOBALS.relaysData);
|
||||
})
|
||||
instance.on("2", _ => {
|
||||
instance.send(0, FLOW.GLOBALS.nodesData);
|
||||
})
|
||||
instance.on("3", _ => {
|
||||
instance.send(0, FLOW.GLOBALS.pinsData);
|
||||
})
|
||||
instance.on("4", _ => {
|
||||
instance.send(0, {rpcSwitchOffLine, rpcSetNodeDimming, rpcLineProfile, rpcNodeProfile, sunCalcExample, dataFromTerminalBroadcast})
|
||||
})
|
||||
};
|
||||
|
||||
|
||||
|
||||
const rpcSwitchOffLine =
|
||||
{
|
||||
"topic": "v1/gateway/rpc",
|
||||
"content": {
|
||||
"device": "jbN4q7JPZmexgdnz2yKbWGDYAWwO0Q3BMX6ERLoV",
|
||||
"data": {
|
||||
"id": 8,
|
||||
"method": "set_command",
|
||||
"params": {
|
||||
"entities": [
|
||||
{
|
||||
"entity_type": "edb_line",
|
||||
"tb_name": "MgnK93rkoAazbqdQ4yB2Q0yZ1YXGx6pmwBeVEP2O"
|
||||
}
|
||||
],
|
||||
"command": "switch",
|
||||
"payload": {
|
||||
"value": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const rpcSetNodeDimming =
|
||||
{
|
||||
"topic": "v1/gateway/rpc",
|
||||
"content": {
|
||||
"device": "jbN4q7JPZmexgdnz2yKbWGDYAWwO0Q3BMX6ERLoV",
|
||||
"data": {
|
||||
"id": 10,
|
||||
"method": "set_command",
|
||||
"params": {
|
||||
"entities": [
|
||||
{
|
||||
"entity_type": "street_luminaire",
|
||||
"tb_name": "jbN4q7JPZmexgdnz2yKbWdDYAWwO0Q3BMX6ERLoV"
|
||||
}
|
||||
],
|
||||
"command": "dimming",
|
||||
"payload": {
|
||||
"value": 5
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const rpcLineProfile =
|
||||
{
|
||||
"topic": "v1/gateway/rpc",
|
||||
"content": {
|
||||
"device": "jbN4q7JPZmexgdnz2yKbWGDYAWwO0Q3BMX6ERLoV",
|
||||
"data": {
|
||||
"id": 9,
|
||||
"method": "set_profile",
|
||||
"params": {
|
||||
"entities": [
|
||||
{
|
||||
"entity_type": "edb_line",
|
||||
"tb_name": "MgnK93rkoAazbqdQ4yB2Q0yZ1YXGx6pmwBeVEP2O"
|
||||
}
|
||||
],
|
||||
"payload": {
|
||||
"intervals": [
|
||||
{
|
||||
"value": 0,
|
||||
"end_time": "20:00",
|
||||
"start_time": "13:00"
|
||||
},
|
||||
{
|
||||
"value": 1,
|
||||
"end_time": "05:30",
|
||||
"start_time": "20:00"
|
||||
},
|
||||
{
|
||||
"value": 0,
|
||||
"end_time": "13:00",
|
||||
"start_time": "05:30"
|
||||
}
|
||||
],
|
||||
"astro_clock": true,
|
||||
"dawn_lux_sensor": false,
|
||||
"dusk_lux_sensor": false,
|
||||
"dawn_lux_sensor_value": 5,
|
||||
"dusk_lux_sensor_value": 5,
|
||||
"dawn_astro_clock_offset": 0,
|
||||
"dusk_astro_clock_offset": 0,
|
||||
"dawn_lux_sensor_time_window": 30,
|
||||
"dusk_lux_sensor_time_window": 30,
|
||||
"dawn_astro_clock_time_window": 60,
|
||||
"dusk_astro_clock_time_window": 60
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const rpcNodeProfile =
|
||||
{
|
||||
"topic": "v1/gateway/rpc",
|
||||
"content": {
|
||||
"device": "jbN4q7JPZmexgdnz2yKbWGDYAWwO0Q3BMX6ERLoV",
|
||||
"data": {
|
||||
"id": 11,
|
||||
"method": "set_profile",
|
||||
"params": {
|
||||
"entities": [
|
||||
{
|
||||
"entity_type": "street_luminaire",
|
||||
"tb_name": "jbN4q7JPZmexgdnz2yKbWdDYAWwO0Q3BMX6ERLoV"
|
||||
}
|
||||
],
|
||||
"payload": {
|
||||
"intervals": [
|
||||
{
|
||||
"cct": 3000,
|
||||
"value": 0,
|
||||
"end_time": "17:50",
|
||||
"start_time": "13:00"
|
||||
},
|
||||
{
|
||||
"cct": 3000,
|
||||
"value": 100,
|
||||
"end_time": "21:30",
|
||||
"start_time": "17:50"
|
||||
},
|
||||
{
|
||||
"cct": 3000,
|
||||
"value": 0,
|
||||
"end_time": "13:00",
|
||||
"start_time": "07:10"
|
||||
},
|
||||
{
|
||||
"cct": 3000,
|
||||
"value": 50,
|
||||
"end_time": "00:00",
|
||||
"start_time": "21:30"
|
||||
},
|
||||
{
|
||||
"cct": 3000,
|
||||
"value": 10,
|
||||
"end_time": "04:30",
|
||||
"start_time": "00:00"
|
||||
},
|
||||
{
|
||||
"cct": 3000,
|
||||
"value": 100,
|
||||
"end_time": "07:10",
|
||||
"start_time": "04:30"
|
||||
}
|
||||
],
|
||||
"astro_clock": true,
|
||||
"dawn_lux_sensor": false,
|
||||
"dusk_lux_sensor": false,
|
||||
"dawn_lux_sensor_value": 5,
|
||||
"dusk_lux_sensor_value": 5,
|
||||
"dawn_astro_clock_offset": 30,
|
||||
"dusk_astro_clock_offset": 20,
|
||||
"dawn_lux_sensor_time_window": 30,
|
||||
"dusk_lux_sensor_time_window": 30,
|
||||
"dawn_astro_clock_time_window": 60,
|
||||
"dusk_astro_clock_time_window": 60
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const sunCalcExample = {
|
||||
dusk_no_offset: '20:18',
|
||||
dawn_no_offset: '05:19',
|
||||
dusk: '20:18',
|
||||
dusk_hours: 20,
|
||||
dusk_minutes: 18,
|
||||
dawn: '05:19',
|
||||
dawn_hours: 5,
|
||||
dawn_minutes: 19,
|
||||
dusk_time: 1715278688962,
|
||||
dawn_time: 1715224744357,
|
||||
dusk_astro_clock_offset: 0,
|
||||
dawn_astro_clock_offset: 0
|
||||
}
|
||||
|
||||
|
||||
const dataFromTerminalBroadcast = {
|
||||
address: 4294967295,
|
||||
byte1: 0,
|
||||
byte2: 0,
|
||||
byte3: 0,
|
||||
byte4: 96,
|
||||
name: "Time Schedule settings",
|
||||
recipient: 2,
|
||||
register: 8,
|
||||
rw: 1
|
||||
}
|
||||
124
flow/slack_connector.js
Normal file
124
flow/slack_connector.js
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
exports.id = 'slack_connector';
|
||||
exports.title = 'Slack_Connector';
|
||||
exports.version = '1.0.0';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#888600';
|
||||
exports.input = 1;
|
||||
exports.output = 1;
|
||||
exports.click = false;
|
||||
exports.author = 'Jakub Klena';
|
||||
exports.icon = 'sign-out';
|
||||
exports.options = { slack_channel: "C071KN2Q8SK", api_key: "", bot_name: "Flow DEMO", bot_icon: ":totaljs:" };
|
||||
// Slack channel - where to post the messages, can be name like "backend-alerts"
|
||||
// Bot Name - Name of the "user" that will post these messages, it should be based on which server it is running on.
|
||||
// Bot Icon - We can use any slack icon (even custom ones uploaded by us) as the "user" profile picture
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="slack_channel" data-jc-config="placeholder:name or id;required:true" class="m">Slack Channel</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="api_key" data-jc-config="placeholder:api key;required:true" class="m">API Key:</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="bot_name" data-jc-config="placeholder:Flow DEMO;required:false" class="m">Bot Name</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="bot_icon" data-jc-config="placeholder:\:totaljs\:;required:true" class="m">Bot Icon</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
exports.readme = `Sends any string received on input to Slack Channel.`;
|
||||
|
||||
var log4js = require("log4js");
|
||||
var path = require('path');
|
||||
|
||||
log4js.configure({
|
||||
appenders: {
|
||||
errLogs: { type: 'file', compress:true, daysToKeep: 2, maxLogSize: 1048576, backups: 1, keepFileExt: true, filename: path.join(__dirname + "/../", 'err.txt') },
|
||||
monitorLogs: { type: 'file', compress:true, daysToKeep: 2, maxLogSize: 1048576, backups: 1, keepFileExt: true, filename: path.join(__dirname + "/../", 'monitor.txt') },
|
||||
console: { type: 'console' }
|
||||
},
|
||||
categories: {
|
||||
errLogs: { appenders: ['console', 'errLogs'], level: 'error' },
|
||||
monitorLogs: { appenders: ['console', 'monitorLogs'], level: 'trace' },
|
||||
//another: { appenders: ['console'], level: 'trace' },
|
||||
default: { appenders: ['console'], level: 'trace' }
|
||||
}
|
||||
});
|
||||
|
||||
const errLogger = log4js.getLogger("errLogs");
|
||||
const logger = log4js.getLogger();
|
||||
const monitor = log4js.getLogger("monitorLogs");
|
||||
|
||||
exports.install = function(instance) {
|
||||
var can = false;
|
||||
|
||||
process.on('uncaughtException', function (err) {
|
||||
errLogger.error('uncaughtException:', err.message);
|
||||
errLogger.error(err.stack);
|
||||
instance.error(err);
|
||||
});
|
||||
|
||||
instance.on('data', function(data) {
|
||||
if (!can) return;
|
||||
|
||||
let str = String(data.data); // Ensuring data get converted to string
|
||||
let message = {
|
||||
'channel': instance.options.slack_channel,
|
||||
'username': instance.options.bot_name,
|
||||
'icon_emoji': instance.options.bot_icon,
|
||||
'text': str
|
||||
};
|
||||
let headers = {
|
||||
'Content-type': `application/json`,
|
||||
'Authorization': `Bearer ${instance.options.api_key}`
|
||||
};
|
||||
|
||||
if (F.is4) {
|
||||
let opt = {
|
||||
'method': 'post',
|
||||
'url': 'https://slack.com/api/chat.postMessage',
|
||||
'headers': headers,
|
||||
'body': JSON.stringify(message),
|
||||
'type': 'json',
|
||||
'callback': function(err, response) {
|
||||
if (response && !err) {
|
||||
var msg = { data: response.body, status: response.status, headers: response.headers, host: response.host, cookies: response.cookies };
|
||||
instance.send2(msg);
|
||||
} else if (err) {
|
||||
errLogger.error('Slack post failed - err:', err, '\n - response was:', response);
|
||||
instance.error(err, response);
|
||||
}
|
||||
}
|
||||
};
|
||||
REQUEST(opt);
|
||||
|
||||
} else {
|
||||
U.request('https://slack.com/api/chat.postMessage', ['json', 'post'], JSON.stringify(message), function(err, data, status, headers, host) {
|
||||
if (response && !err) {
|
||||
response.data = { data: data, status: status, headers: headers, host: host };
|
||||
instance.send2(response);
|
||||
} else if (err) {
|
||||
errLogger.error('Slack post failed - err:', err, '\n - response was:', response);
|
||||
instance.error(err, response);
|
||||
}
|
||||
}, null, headers);
|
||||
}
|
||||
});
|
||||
|
||||
instance.reconfigure = function() {
|
||||
var options = instance.options;
|
||||
can = options.slack_channel && options.bot_name && options.bot_icon && options.api_key ? true : false;
|
||||
instance.status(can ? '' : 'Not configured', can ? undefined : 'red');
|
||||
};
|
||||
|
||||
instance.on('options', instance.reconfigure);
|
||||
instance.reconfigure();
|
||||
}
|
||||
187
flow/slack_filter.js
Normal file
187
flow/slack_filter.js
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
exports.id = 'slack_filter';
|
||||
exports.title = 'Slack Filter';
|
||||
exports.group = 'Citysys';
|
||||
exports.color = '#30E193';
|
||||
exports.input = 1;
|
||||
exports.output = 1;
|
||||
exports.author = 'Jakub Klena';
|
||||
exports.icon = 'plug';
|
||||
exports.version = '1.0.8';
|
||||
exports.options = { 'name':'', 'types': '["emergency", "critical", "error", "alert"]', 'message_includes':'["is responding again"]', 'tag_on_include':'[{"user_id":"U072JE5JUQG", "includes":["Electrometer", "Twilight sensor"]}]', 'slack_channel':'' };
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div data-jc="textbox" data-jc-path="name" data-jc-config="required:true">@(Name of this server)</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div data-jc="textbox" data-jc-path="slack_channel" data-jc-config="required:false">@(Slack channel to receive the alerts)</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div data-jc="textbox" data-jc-path="types" data-jc-config="required:false">@(Watch these types, comma separated names)</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div data-jc="textbox" data-jc-path="message_includes" data-jc-config="required:false">@(Watch messages that include any of the following strings)</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div data-jc="textbox" data-jc-path="tag_on_include" data-jc-config="required:false">@(Tag people if message includes something)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
exports.readme = `# Slack Filter`;
|
||||
|
||||
exports.install = function(instance) {
|
||||
var running = false;
|
||||
instance["savedSlackMessages"] = [];
|
||||
var timer = null;
|
||||
|
||||
instance.on('data', function(response) {
|
||||
if (!running) return;
|
||||
let value = response.data;
|
||||
if (typeof value !== 'object') return;
|
||||
|
||||
let can = false
|
||||
var k = Object.keys(value);
|
||||
var interested = JSON.parse(instance.options.types);
|
||||
var msg_incl = JSON.parse(instance.options.message_includes);
|
||||
var tags = JSON.parse(instance.options.tag_on_include);
|
||||
|
||||
if (k.length <= 0) return;
|
||||
if (value[k[0]].length <= 0) return;
|
||||
if (!Object.prototype.hasOwnProperty.call(value[k[0]][0], 'values')) return;
|
||||
if (!Object.prototype.hasOwnProperty.call(value[k[0]][0]['values'], '_event')) return;
|
||||
if (!Object.prototype.hasOwnProperty.call(value[k[0]][0]['values']['_event'], 'type')) return;
|
||||
if (!Object.prototype.hasOwnProperty.call(value[k[0]][0]['values']['_event'], 'source')) return;
|
||||
if (!Object.prototype.hasOwnProperty.call(value[k[0]][0]['values']['_event']['source'], 'func')) return;
|
||||
if (!Object.prototype.hasOwnProperty.call(value[k[0]][0]['values']['_event'], 'message')) return;
|
||||
if (!Object.prototype.hasOwnProperty.call(value[k[0]][0]['values']['_event'], 'message_data')) return;
|
||||
|
||||
let icon = ':totaljs:';
|
||||
let type = value[k[0]][0]['values']['_event']['type'];
|
||||
let source = value[k[0]][0]['values']['_event']['source']['func'];
|
||||
let message = value[k[0]][0]['values']['_event']['message'];
|
||||
let message_data = value[k[0]][0]['values']['_event']['message_data'];
|
||||
let tag = '';
|
||||
|
||||
switch(type){
|
||||
case 'debug':
|
||||
icon = ':beetle:';
|
||||
break;
|
||||
case 'info':
|
||||
icon = ':speech_balloon:';
|
||||
break;
|
||||
case 'notice':
|
||||
icon = ':speech_balloon:';
|
||||
break;
|
||||
case 'warning':
|
||||
icon = ':exclamation:';
|
||||
break;
|
||||
case 'alert':
|
||||
icon = ':warning:';
|
||||
break;
|
||||
case 'error':
|
||||
icon = ':no_entry:';
|
||||
break;
|
||||
case 'emergency':
|
||||
icon = ':fire:';
|
||||
break;
|
||||
case 'critical':
|
||||
icon = ':fire:';
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if this message includes one of the strings we are watching for
|
||||
for (const msg of msg_incl){
|
||||
if (message.includes(msg)){
|
||||
if (msg == 'is responding again') icon = ':large_green_circle:';
|
||||
can = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Check if message is one of the types we are watching for
|
||||
if (interested.includes(type)){
|
||||
can = true;
|
||||
}
|
||||
|
||||
if (!can) return;
|
||||
|
||||
|
||||
// Check for each person tags based on what the message includes
|
||||
for (const person of tags){
|
||||
for (const msg of person.includes){
|
||||
if (message.includes(msg)){
|
||||
tag += '<@'+person.user_id+'> ';
|
||||
break; // Break out from this person checks as they are already tagged now
|
||||
}
|
||||
}
|
||||
}
|
||||
// Now that all people are tagged add new line symbol
|
||||
if (tag != '') tag += '\n';
|
||||
|
||||
let send_data = tag+instance.options.name+' '+type.toUpperCase()+'\n*Source*: '+source+'\n*Message*: '+message;
|
||||
if (message_data) {
|
||||
send_data += '\nData: '+message_data;
|
||||
}
|
||||
|
||||
let ignore_msg = false
|
||||
if (message.includes('Configuration of dimming profile to node no')){
|
||||
for (let i = 0; i < FLOW["savedSlackMessages"].length; i++){
|
||||
if (FLOW["savedSlackMessages"][i].message == message){
|
||||
ignore_msg = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!ignore_msg){
|
||||
FLOW["savedSlackMessages"].push({message, 'dateandtime': Date.now()});
|
||||
if (timer === null){
|
||||
timer = setTimeout(checkSavedMessages, 60*60000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!ignore_msg){
|
||||
instance.send2({'msg':send_data,'bot_name':instance.options.name+' '+type.toUpperCase(),'bot_icon':icon,'channel':instance.options.slack_channel});
|
||||
}
|
||||
});
|
||||
|
||||
function checkSavedMessages(){
|
||||
var d = Date.now();
|
||||
d = d - 86400000; // older then 24hr
|
||||
var a = [];
|
||||
//Remove msgs older then 24hr
|
||||
for (let i = 0; i < FLOW["savedSlackMessages"].length; i++){
|
||||
if (FLOW["savedSlackMessages"][i].dateandtime > d){
|
||||
a.push(FLOW["savedSlackMessages"][i]);
|
||||
}
|
||||
}
|
||||
FLOW["savedSlackMessages"] = a;
|
||||
|
||||
if (FLOW["savedSlackMessages"].length > 0) {
|
||||
timer = setTimeout(checkSavedMessages, 60*60000);
|
||||
} else {
|
||||
timer = null;
|
||||
}
|
||||
}
|
||||
|
||||
instance.reconfigure = function() {
|
||||
try {
|
||||
if (!FLOW["savedSlackMessages"]){
|
||||
FLOW["savedSlackMessages"] = [];
|
||||
}
|
||||
|
||||
if (instance.options.name) {
|
||||
instance.status('Running');
|
||||
running = true;
|
||||
} else {
|
||||
instance.status('Please enter name', 'red');
|
||||
running = false;
|
||||
}
|
||||
} catch (e) {
|
||||
instance.error('Citysys connector: ' + e.message);
|
||||
}
|
||||
};
|
||||
|
||||
instance.on('options', instance.reconfigure);
|
||||
instance.reconfigure();
|
||||
};
|
||||
120
flow/test.js
120
flow/test.js
|
|
@ -1,120 +0,0 @@
|
|||
const getTimezoneOffset = (timeZone, date = new Date()) => {
|
||||
const tz = date.toLocaleString("en", {timeZone, timeStyle: "long"}).split(" ").slice(-1)[0];
|
||||
const dateString = date.toString();
|
||||
const offset = Date.parse(`${dateString} UTC`) - Date.parse(`${dateString} ${tz}`);
|
||||
|
||||
// return UTC offset in millis
|
||||
return offset;
|
||||
}
|
||||
|
||||
let profile = {
|
||||
"time_points": [
|
||||
{
|
||||
"start_time": "13:00",
|
||||
"value": 0
|
||||
},
|
||||
{
|
||||
"start_time": "16:00",
|
||||
"value": 1
|
||||
}
|
||||
],
|
||||
"astro_clock": true,
|
||||
"dusk_astro_clock_offset": 0,
|
||||
"dawn_astro_clock_offset": 0,
|
||||
"dusk_lux_sensor": false,
|
||||
"dawn_lux_sensor": false,
|
||||
"dusk_lux_sensor_value": 5,
|
||||
"dawn_lux_sensor_value": 5,
|
||||
"dusk_lux_sensor_time_window": 30,
|
||||
"dawn_lux_sensor_time_window": 30,
|
||||
}
|
||||
|
||||
let now = new Date(); // Creates a Date Object using the clients current time
|
||||
console.log(now, now.getTime());
|
||||
|
||||
//let [hours, minutes, seconds] = "18:19:02".split(':');
|
||||
//d.setHours(+hours); // Set the hours, using implicit type coercion
|
||||
//d.setMinutes(minutes); // You can pass Number or String. It doesn't really matter
|
||||
//d.setSeconds(seconds);
|
||||
|
||||
let time_points = profile.time_points;
|
||||
time_points.push( {"start_time": "1:00", "value": 1} );
|
||||
|
||||
time_points.sort(function (a, b) {
|
||||
|
||||
let [ahours, aminutes, aseconds] = a.start_time.split(':');
|
||||
let [bhours, bminutes, bseconds] = b.start_time.split(':');
|
||||
|
||||
let ad = new Date();
|
||||
ad.setHours( parseInt(ahours) );
|
||||
ad.setMinutes( parseInt(aminutes) );
|
||||
ad.setSeconds(0);
|
||||
|
||||
let bd = new Date();
|
||||
bd.setHours( parseInt(bhours) );
|
||||
bd.setMinutes( parseInt(bminutes) );
|
||||
ad.setSeconds(0);
|
||||
|
||||
return ad.getTime() - bd.getTime();
|
||||
});
|
||||
|
||||
console.log(time_points);
|
||||
|
||||
let value = time_points[ time_points.length - 1].value;
|
||||
|
||||
for(let i = 0; i < time_points.length; i++)
|
||||
{
|
||||
let [hours, minutes, seconds] = time_points[i].start_time.split(':');
|
||||
|
||||
let start_time = new Date();
|
||||
start_time.setHours( parseInt(hours) );
|
||||
start_time.setMinutes( parseInt(minutes) );
|
||||
start_time.setSeconds(0);
|
||||
|
||||
if(now.getTime() > start_time.getTime())
|
||||
{
|
||||
value = time_points[i].value;
|
||||
}
|
||||
|
||||
//console.log(start_time);
|
||||
}
|
||||
|
||||
console.log(value);
|
||||
|
||||
const offset = getTimezoneOffset("Europe/Bratislava");
|
||||
console.log(offset);
|
||||
|
||||
|
||||
function removeTask(obj)
|
||||
{
|
||||
|
||||
let keys = Object.keys(obj);
|
||||
tasks = tasks.filter((task) => {
|
||||
|
||||
let counter = 0;
|
||||
for(let i = 0; i < keys.length; i++)
|
||||
{
|
||||
let key = keys[i];
|
||||
if(task.hasOwnProperty(key) && obj.hasOwnProperty(key))
|
||||
{
|
||||
if(task[key] == obj[key]) counter++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(counter == keys.length) return false;
|
||||
return true;
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function convertUTCDateToLocalDate(date) {
|
||||
var newDate = new Date(date);
|
||||
newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
|
||||
return newDate;
|
||||
}
|
||||
|
||||
let d = convertUTCDateToLocalDate(new Date("2022-04-26T06:56:54.000Z"));
|
||||
|
||||
console.log(d, d.getHours());
|
||||
|
|
@ -1,99 +1,220 @@
|
|||
exports.id = 'thermometer';
|
||||
exports.title = 'Thermometer';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#5CB36D';
|
||||
exports.input = 1;
|
||||
exports.version = '1.0.3';
|
||||
exports.output = ["red", "white", "blue"];
|
||||
exports.icon = 'thermometer-three-quarters';
|
||||
|
||||
exports.readme = `# Getting temperature values for RVO. In case of LM, you need device address. In case of unipi, evok sends values, in case thermometer is installed`;
|
||||
|
||||
const { errLogger, logger, monitor } = require('./helper/logger');
|
||||
|
||||
const SEND_TO = {
|
||||
debug: 0,
|
||||
tb: 1,
|
||||
dido_controller: 2
|
||||
}
|
||||
|
||||
//read temperature - frequency
|
||||
let timeoutMin = 1;//minutes
|
||||
let NUMBER_OF_FAILURES_TO_SEND_ERROR = 3;
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
const { exec } = require('child_process');
|
||||
const { sendNotification } = require('./helper/notification_reporter');
|
||||
|
||||
let startRead;
|
||||
let counter = 0;
|
||||
let rvoTbName = "";
|
||||
let temperatureAddress = "";
|
||||
|
||||
logger.debug(exports.title, "installed");
|
||||
|
||||
instance.on("close", function(){
|
||||
clearInterval(startRead);
|
||||
})
|
||||
|
||||
|
||||
const main = function() {
|
||||
|
||||
try {
|
||||
|
||||
if(temperatureAddress === "") throw "Thermometer: temperatureAddress is not defined";
|
||||
|
||||
exec(`owread -C ${temperatureAddress}/temperature`, (error, stdout, stderr) => {
|
||||
debugger;
|
||||
error = 1;
|
||||
if(!error)
|
||||
{
|
||||
parseData(stdout)
|
||||
return;
|
||||
}
|
||||
|
||||
counter++;
|
||||
if(counter == NUMBER_OF_FAILURES_TO_SEND_ERROR) sendNotification("Thermometer_main", rvoTbName, "thermometer_is_not_responding", {}, {"Error": error}, SEND_TO.tb, instance, "thermometer");
|
||||
monitor.info("Thermometer is not responding", error);
|
||||
instance.send(SEND_TO.dido_controller, {status: "NOK-thermometer"});
|
||||
});
|
||||
|
||||
}
|
||||
catch(err) {
|
||||
errLogger.error(exports.title, err);
|
||||
clearInterval(startRead);
|
||||
}
|
||||
}
|
||||
|
||||
const parseData = function(data) {
|
||||
|
||||
data = parseFloat(data);
|
||||
logger.debug("Thermometer", data);
|
||||
|
||||
if(isNaN(data)) {
|
||||
errLogger.error("Thermometer sends invalid data");
|
||||
return;
|
||||
}
|
||||
|
||||
if(counter > NUMBER_OF_FAILURES_TO_SEND_ERROR) //1 hour
|
||||
{
|
||||
instance.send(SEND_TO.debug, "Thermometer - temperature data are comming again");
|
||||
sendNotification("Thermometer_parseData", rvoTbName, "thermometer_is_responding_again", {}, "", SEND_TO.tb, instance, "thermometer");
|
||||
}
|
||||
|
||||
const values = {
|
||||
"temperature": Number(data.toFixed(2)),
|
||||
}
|
||||
|
||||
instance.send(SEND_TO.dido_controller, {values: values});
|
||||
counter = 0;
|
||||
}
|
||||
|
||||
instance.on("data", _ => {
|
||||
temperatureAddress = FLOW.GLOBALS.settings.temperature_address;
|
||||
rvoTbName = FLOW.GLOBALS.settings.rvoTbName;
|
||||
startRead = setInterval(main, timeoutMin * 1000 * 60);
|
||||
main();
|
||||
})
|
||||
};
|
||||
exports.id = 'thermometer';
|
||||
exports.title = 'Thermometer';
|
||||
exports.group = 'Worksys';
|
||||
exports.color = '#5CB36D';
|
||||
exports.version = '1.0.3';
|
||||
exports.output = ["red", "white", "blue"];
|
||||
exports.author = 'Rastislav Kovac';
|
||||
exports.icon = 'thermometer-three-quarters';
|
||||
|
||||
exports.readme = `# Getting temperature values for RVO. In case of LM, you need device address. In case of unipi, evok sends values, in case thermometer is installed`;
|
||||
|
||||
const instanceSendTo = {
|
||||
debug: 0,
|
||||
tb: 1,
|
||||
dido_controller: 2
|
||||
}
|
||||
|
||||
//read temperature - frequency
|
||||
let timeoutMin = 5;//minutes
|
||||
|
||||
var path = require('path');
|
||||
var log4js = require("log4js");
|
||||
|
||||
log4js.configure({
|
||||
appenders: {
|
||||
errLogs: { type: 'file', filename: path.join(__dirname + "/../", 'err.txt') },
|
||||
monitorLogs: { type: 'file', compress:true, daysToKeep: 2, maxLogSize: 1048576, backups: 1, keepFileExt: true, filename: path.join(__dirname + "/../", 'monitor.txt') },
|
||||
console: { type: 'console' }
|
||||
},
|
||||
categories: {
|
||||
errLogs: { appenders: ['console', 'errLogs'], level: 'error' },
|
||||
monitorLogs: { appenders: ['console', 'monitorLogs'], level: 'trace' },
|
||||
//another: { appenders: ['console'], level: 'trace' },
|
||||
default: { appenders: ['console'], level: 'trace' }
|
||||
}
|
||||
});
|
||||
|
||||
const errLogger = log4js.getLogger("errLogs");
|
||||
const logger = log4js.getLogger();
|
||||
const monitor = log4js.getLogger("monitorLogs");
|
||||
|
||||
//logger.debug("text")
|
||||
//monitor.info('info');
|
||||
//errLogger.error("some error");
|
||||
|
||||
const { promisifyBuilder, makeMapFromDbResult } = require('./helper/db_helper');
|
||||
const dbSettings = TABLE("settings");
|
||||
let temperatureAddress = "";
|
||||
|
||||
async function loadSettings()
|
||||
{
|
||||
//todo global FLOW.OMS_edgeName is making problem, so we load it here as well, it should not be
|
||||
let responseSettings = await promisifyBuilder(dbSettings.find());
|
||||
temperatureAddress = responseSettings[0]["temperature_adress"];
|
||||
}
|
||||
|
||||
loadSettings();
|
||||
|
||||
|
||||
exports.install = function(instance) {
|
||||
|
||||
const { exec } = require('child_process');
|
||||
const { sendNotification, ERRWEIGHT } = require('./helper/notification_reporter');
|
||||
|
||||
let startRead;
|
||||
let dataToTb;
|
||||
let counter = 0;
|
||||
|
||||
let edgeName = "";
|
||||
|
||||
|
||||
logger.debug(exports.title, "installed");
|
||||
|
||||
instance.on("close", function(){
|
||||
clearInterval(startRead);
|
||||
})
|
||||
|
||||
|
||||
const start = function() {
|
||||
|
||||
try {
|
||||
|
||||
if(FLOW.OMS_controller_type === "unipi")
|
||||
{
|
||||
clearInterval(startRead);
|
||||
return;
|
||||
}
|
||||
|
||||
if(temperatureAddress === "") throw "gettemperature: temperatureAddress is not defined";
|
||||
|
||||
logger.debug("FLOW.OMS_temperature_adress", FLOW.OMS_temperature_adress);
|
||||
|
||||
exec(`owread -C ${temperatureAddress}/temperature`, (error, stdout, stderr) => {
|
||||
|
||||
edgeName = FLOW.OMS_edgeName;
|
||||
|
||||
if(edgeName !== "")
|
||||
{
|
||||
if(error)
|
||||
{
|
||||
|
||||
if(FLOW.OMS_brokerready == undefined)
|
||||
{
|
||||
logger.debug("gettemparature - FLOW.OMS_brokerready is undefined");
|
||||
|
||||
setTimeout(function(){
|
||||
start();
|
||||
}, 3000);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if(FLOW.OMS_brokerready)
|
||||
{
|
||||
//sendNotification("start", edgeName, ERRWEIGHT.WARNING, "Thermometer is not responding", {"Error": error}, instanceSendTo.tb, instance, "thermometer");
|
||||
sendNotification("start", edgeName, "thermometer_is_not_responding", {}, {"Error": error}, instanceSendTo.tb, instance, "thermometer");
|
||||
}
|
||||
|
||||
let status = "NOK";
|
||||
dataToTb = {
|
||||
[edgeName]: [
|
||||
{
|
||||
"ts": Date.now(),
|
||||
"values": {
|
||||
"status": status
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
monitor.info("Thermometer is not responding", error, FLOW.OMS_brokerready);
|
||||
|
||||
// instance.send(instanceSendTo.tb, dataToTb); // poslat stav nok do tb, ak to handluje dido_controller ??
|
||||
instance.send(instanceSendTo.dido_controller, {status: "NOK-thermometer"});
|
||||
}
|
||||
else parseData(stdout);
|
||||
}
|
||||
else
|
||||
{
|
||||
monitor.info("gettemperature: edgeName is not defined", FLOW.OMS_edgeName);
|
||||
|
||||
setTimeout(function(){
|
||||
start();
|
||||
}, 3000);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//instance.send({"Temp":stdout,"stderr":stderr,"err":error});
|
||||
});
|
||||
|
||||
}
|
||||
catch(err) {
|
||||
errLogger.error(exports.title, err);
|
||||
}
|
||||
}
|
||||
|
||||
const parseData = function(data) {
|
||||
|
||||
data = parseFloat(data);
|
||||
|
||||
logger.debug("gettemperature", data);
|
||||
|
||||
if(!isNaN(data)) {
|
||||
|
||||
if(counter > 290)
|
||||
{
|
||||
instance.send(instanceSendTo.debug, "[Get temperature component] - temperature data are comming again from RVO after more than 1 day break");
|
||||
|
||||
//sendNotification("parseData", edgeName, ERRWEIGHT.NOTICE, "Thermometer is working again", "", instanceSendTo.tb, instance, "thermometer");
|
||||
if(FLOW.OMS_brokerready) sendNotification("parseData", edgeName, "thermometer_is_responding_again", {}, "", instanceSendTo.tb, instance, "thermometer");
|
||||
}
|
||||
|
||||
logger.debug("gettemperature", data);
|
||||
const values = {
|
||||
"temperature": Number(data.toFixed(2)),
|
||||
"status": "OK"
|
||||
}
|
||||
|
||||
dataToTb = {
|
||||
[edgeName]: [
|
||||
{
|
||||
"ts": Date.now(),
|
||||
"values":values
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
instance.send(instanceSendTo.tb, dataToTb);
|
||||
instance.send(instanceSendTo.dido_controller, values);
|
||||
|
||||
counter = 0;
|
||||
|
||||
} else {
|
||||
|
||||
counter++;
|
||||
monitor.info("gettemperature err", counter, data);
|
||||
|
||||
//ked je problem 1 den
|
||||
let day = 24 * 60 / timeoutMin;
|
||||
if ( counter > day && counter < day + 2 ) {
|
||||
//sendNotification("parseData", edgeName, ERRWEIGHT.WARNING, "Thermometer receives invalid data", "", instanceSendTo.tb, instance, "thermometer");
|
||||
sendNotification("parseData", edgeName, "thermometer_sends_invalid_data", {}, "", instanceSendTo.tb, instance, "thermometer");
|
||||
|
||||
instance.send(instanceSendTo.debug, "[Get temperature component] - no temperature data from RVO for more than 1 day");
|
||||
instance.send(instanceSendTo.dido_controller, {status: "NOK-thermometer"});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
setTimeout(function(){
|
||||
start();
|
||||
}, 15000);
|
||||
|
||||
startRead = setInterval(start, timeoutMin * 1000 * 60);
|
||||
|
||||
};
|
||||
|
|
@ -4,28 +4,30 @@ exports.group = 'MQTT';
|
|||
exports.color = '#888600';
|
||||
exports.version = '1.0.2';
|
||||
exports.icon = 'sign-out';
|
||||
exports.input = 2;
|
||||
exports.input = 1;
|
||||
exports.output = ["red", "white", "blue"];
|
||||
exports.author = 'Daniel Segeš';
|
||||
exports.options = { host: 'tb-stage.worksys.io', port: 1883, clientid: "", username: "" };
|
||||
exports.npm = ['mqtt'];
|
||||
|
||||
|
||||
exports.html = `<div class="padding">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="host" data-jc-config="placeholder:test.mosquitto.org;required:false" class="m">Hostname or IP address (if not empty - setting will override db setting)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="port" data-jc-config="placeholder:1883;required:true" class="m">Port</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="clientid">@(Client id)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="username" class="m">@(Username)</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="host" data-jc-config="placeholder:test.mosquitto.org;required:false" class="m">Hostname or IP address (if not empty - setting will override db setting)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="port" data-jc-config="placeholder:1883;required:true" class="m">Port</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="clientid">@(Client id)</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div data-jc="textbox" data-jc-path="username" class="m">@(Username)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
|
||||
|
|
@ -39,22 +41,21 @@ Added:
|
|||
- rpc response
|
||||
`;
|
||||
|
||||
const { promisifyBuilder } = require('./helper/db_helper');
|
||||
const { errLogger, monitor } = require('./helper/logger');
|
||||
const fs = require('fs');
|
||||
const mqtt = require('mqtt');
|
||||
|
||||
const SEND_TO = {
|
||||
const instanceSendTo = {
|
||||
debug: 0,
|
||||
rpcCall: 1,
|
||||
services: 2
|
||||
}
|
||||
|
||||
const { promisifyBuilder, makeMapFromDbResult } = require('./helper/db_helper.js');
|
||||
|
||||
//CONFIG
|
||||
let useLog4js = true;
|
||||
let createTelemetryBackup = true;
|
||||
let saveTelemetryOnError = true;//backup_on_failure overrides this value
|
||||
//------------------------
|
||||
|
||||
var fs = require('fs');
|
||||
let rollers;
|
||||
if(createTelemetryBackup) rollers = require('streamroller');
|
||||
|
||||
|
|
@ -63,18 +64,51 @@ let insertNoSqlCounter = 0;
|
|||
let insertBackupNoSqlCounter = 0;
|
||||
let processingData = false;
|
||||
|
||||
let backup_on_failure = false;//== saveTelemetryOnError - create backup client send failure
|
||||
let backup_on_failure = false;//== saveTelemetryOnError - create backup broker send failure
|
||||
let restore_from_backup = 0; //how many rows process at once?
|
||||
let restore_backup_wait = 0;//wait seconds
|
||||
let lastRestoreTime = 0;
|
||||
|
||||
// if there is an error in client connection, flow logs to monitor.txt. Not to log messages every second, we use sendClientError variable
|
||||
let sendClientError = true;
|
||||
let errLogger;
|
||||
let logger;
|
||||
let monitor;
|
||||
|
||||
if(useLog4js)
|
||||
{
|
||||
var path = require('path');
|
||||
var log4js = require("log4js");
|
||||
|
||||
log4js.configure({
|
||||
appenders: {
|
||||
errLogs: { type: 'file', filename: path.join(__dirname + "/../", 'err.txt') },
|
||||
monitorLogs: { type: 'file', compress:true, daysToKeep: 2, maxLogSize: 1048576, backups: 1, keepFileExt: true, filename: path.join(__dirname + "/../", 'monitor.txt') },
|
||||
console: { type: 'console' }
|
||||
},
|
||||
categories: {
|
||||
errLogs: { appenders: ['console', 'errLogs'], level: 'error' },
|
||||
monitorLogs: { appenders: ['console', 'monitorLogs'], level: 'trace' },
|
||||
//another: { appenders: ['console'], level: 'trace' },
|
||||
default: { appenders: ['console'], level: 'trace' }
|
||||
}
|
||||
});
|
||||
|
||||
errLogger = log4js.getLogger("errLogs");
|
||||
logger = log4js.getLogger();
|
||||
monitor = log4js.getLogger("monitorLogs");
|
||||
|
||||
//USAGE
|
||||
//logger.debug("text");
|
||||
//monitor.info('info');
|
||||
//errLogger.error("some error");
|
||||
}
|
||||
|
||||
process.on('uncaughtException', function (err) {
|
||||
|
||||
errLogger.error('uncaughtException:', err.message)
|
||||
errLogger.error(err.stack);
|
||||
if(errLogger)
|
||||
{
|
||||
errLogger.error('uncaughtException:', err.message)
|
||||
errLogger.error(err.stack);
|
||||
}
|
||||
|
||||
//TODO
|
||||
//send to service
|
||||
|
|
@ -88,9 +122,13 @@ const nosqlBackup = NOSQL('/backup/tbdata');
|
|||
|
||||
exports.install = function(instance) {
|
||||
|
||||
var client;
|
||||
var broker;
|
||||
var opts;
|
||||
var clientReady = false;
|
||||
var brokerready = false;
|
||||
|
||||
instance.on('options', loadSettings);
|
||||
|
||||
mqtt = require('mqtt');
|
||||
|
||||
// wsmqtt status for notification purposes on projects.worksys.io database
|
||||
let wsmqttName = null;
|
||||
|
|
@ -99,28 +137,21 @@ exports.install = function(instance) {
|
|||
|
||||
function getWsmqttName(host)
|
||||
{
|
||||
if(host == "tb-demo.worksys.io" || host == '192.168.252.4') return 'wsmqtt_demo';
|
||||
else if(host == "tb-qas01.worksys.io" || host == '192.168.252.5') return 'wsmqtt_qas01';
|
||||
else if(host == "tb-prod01.worksys.io" || host == '192.168.252.1') return 'wsmqtt_prod01';
|
||||
if(host == "tb-demo.worksys.io" || host == '192.168.252.4') return 'wsmqtt_demo';
|
||||
else if(host == "tb-qas01.worksys.io" || host == '192.168.252.5') return 'wsmqtt_qas01';
|
||||
else if(host == "tb-prod01.worksys.io" || host == '192.168.252.1') return 'wsmqtt_prod01';
|
||||
}
|
||||
|
||||
function sendWsStatus()
|
||||
{
|
||||
instance.send(SEND_TO.services, {[wsmqttName]: wsmqtt_status});
|
||||
instance.send(instanceSendTo.services, {[wsmqttName]: wsmqtt_status});
|
||||
}
|
||||
|
||||
sendWsStatusVar = setInterval(sendWsStatus, 180000);
|
||||
|
||||
function main()
|
||||
{
|
||||
if(!FLOW.dbLoaded) return;
|
||||
|
||||
loadSettings();
|
||||
clearInterval(sendWsStatus);
|
||||
sendWsStatusVar = setInterval(sendWsStatus, 180000);
|
||||
}
|
||||
|
||||
//set opts according to db settings
|
||||
function loadSettings()
|
||||
async function loadSettings()
|
||||
{
|
||||
|
||||
if(instance.options.host !== "")
|
||||
|
|
@ -143,17 +174,21 @@ exports.install = function(instance) {
|
|||
else
|
||||
{
|
||||
|
||||
const SETTINGS = FLOW.GLOBALS.settings;
|
||||
backup_on_failure = SETTINGS.backup_on_failure;
|
||||
const dbSettings = TABLE("settings");
|
||||
let responseSettings = await promisifyBuilder(dbSettings.find());
|
||||
|
||||
backup_on_failure = responseSettings[0]["backup_on_failure"];
|
||||
saveTelemetryOnError = backup_on_failure;
|
||||
|
||||
restore_from_backup = SETTINGS.restore_from_backup;
|
||||
restore_backup_wait = SETTINGS.restore_backup_wait;
|
||||
restore_from_backup = responseSettings[0]["restore_from_backup"];
|
||||
restore_backup_wait = responseSettings[0]["restore_backup_wait"];
|
||||
|
||||
let mqtt_host = SETTINGS.mqtt_host;
|
||||
let mqtt_clientid = SETTINGS.mqtt_clientid;
|
||||
let mqtt_username = SETTINGS.mqtt_username;
|
||||
let mqtt_port = SETTINGS.mqtt_port;
|
||||
let mqtt_host = responseSettings[0]["mqtt_host"];
|
||||
let mqtt_clientid = responseSettings[0]["mqtt_clientid"];
|
||||
let mqtt_username = responseSettings[0]["mqtt_username"];
|
||||
let mqtt_port = responseSettings[0]["mqtt_port"];
|
||||
|
||||
console.log("wsmqttpublich -> loadSettings from db", responseSettings[0]);
|
||||
|
||||
opts = {
|
||||
host: mqtt_host,
|
||||
|
|
@ -176,78 +211,74 @@ exports.install = function(instance) {
|
|||
var url = "mqtt://" + opts.host + ":" + opts.port;
|
||||
console.log("MQTT URL: ", url);
|
||||
|
||||
client = mqtt.connect(url, opts);
|
||||
broker = mqtt.connect(url, opts);
|
||||
|
||||
client.on('connect', function() {
|
||||
broker.on('connect', function() {
|
||||
instance.status("Connected", "green");
|
||||
monitor.info("MQTT client connected");
|
||||
monitor.info("MQTT broker connected");
|
||||
|
||||
sendClientError = true;
|
||||
clientReady = true;
|
||||
brokerready = true;
|
||||
FLOW.OMS_brokerready = brokerready;
|
||||
wsmqtt_status = 'connected';
|
||||
});
|
||||
|
||||
client.on('reconnect', function() {
|
||||
broker.on('reconnect', function() {
|
||||
instance.status("Reconnecting", "yellow");
|
||||
clientReady = false;
|
||||
brokerready = false;
|
||||
|
||||
FLOW.OMS_brokerready = brokerready;
|
||||
});
|
||||
|
||||
client.on('message', function(topic, message) {
|
||||
broker.on('message', function(topic, message) {
|
||||
// message is type of buffer
|
||||
message = message.toString();
|
||||
if (message[0] === '{') {
|
||||
TRY(function() {
|
||||
|
||||
message = JSON.parse(message);
|
||||
console.log("ooooo------x", message);
|
||||
if (message.hasOwnProperty("device") && message.hasOwnProperty("data") && message.data.hasOwnProperty("id")) {
|
||||
client.publish(topic, `{"device": ${message.device}, "id": ${message.data.id}, "data": {"success": true}}`, {qos:1});
|
||||
instance.send(SEND_TO.rpcCall, {"device": message.device, "id": message.data.id, "RPC response": {"success": true}});
|
||||
broker.publish(topic, `{"device": ${message.device}, "id": ${message.data.id}, "data": {"success": true}}`, {qos:1});
|
||||
instance.send(instanceSendTo.rpcCall, {"device": message.device, "id": message.data.id, "RPC response": {"success": true}});
|
||||
}
|
||||
|
||||
}, () => instance.debug('MQTT: Error parsing data', message));
|
||||
}
|
||||
|
||||
instance.send(SEND_TO.rpcCall, {"topic":topic, "content":message });
|
||||
instance.send(instanceSendTo.rpcCall, {"topic":topic, "content":message });
|
||||
});
|
||||
|
||||
client.on('close', function(err) {
|
||||
clientReady = false;
|
||||
broker.on('close', function(err) {
|
||||
brokerready = false;
|
||||
FLOW.OMS_brokerready = brokerready;
|
||||
wsmqtt_status = 'disconnected';
|
||||
|
||||
if (err && err.toString().indexOf('Error')) {
|
||||
instance.status("Err: "+err.code, "red");
|
||||
instance.send(SEND_TO.debug, {"message":"Client CLOSE signal received !", "error":err, "opt":opts });
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker CLOSE signal received !", "error":err, "opt":opts });
|
||||
} else {
|
||||
instance.status("Disconnected", "red");
|
||||
instance.send(SEND_TO.debug, {"message":"Client CLOSE signal received !", "error":err, "opt":opts });
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker CLOSE signal received !", "error":err, "opt":opts });
|
||||
}
|
||||
|
||||
client.reconnect();
|
||||
broker.reconnect();
|
||||
});
|
||||
|
||||
client.on('error', function(err) {
|
||||
broker.on('error', function(err) {
|
||||
instance.status("Err: "+ err.code, "red");
|
||||
instance.send(SEND_TO.debug, {"message":"Client ERROR signal received !", "error":err, "opt":opts });
|
||||
if(sendClientError) {
|
||||
monitor.info('MQTT client error', err);
|
||||
sendClientError = false;
|
||||
}
|
||||
clientReady = false;
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker ERROR signal received !", "error":err, "opt":opts });
|
||||
monitor.info('MQTT broker error', err);
|
||||
|
||||
brokerready = false;
|
||||
FLOW.OMS_brokerready = brokerready;
|
||||
wsmqtt_status = 'disconnected';
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
instance.on('data', function(data) {
|
||||
|
||||
instance.on("0", _ => {
|
||||
main();
|
||||
})
|
||||
|
||||
|
||||
instance.on('1', function(data) {
|
||||
|
||||
if(clientReady)
|
||||
if (brokerready)
|
||||
{
|
||||
//do we have some data in backup file?
|
||||
//if any, process data from database
|
||||
|
|
@ -256,12 +287,13 @@ console.log("ooooo------x", message);
|
|||
//read telemetry data and send back to server
|
||||
if(!processingData) processDataFromDatabase();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(clientReady)
|
||||
if (brokerready)
|
||||
{
|
||||
let stringifiedJson = JSON.stringify(data.data);
|
||||
client.publish("v1/gateway/telemetry", stringifiedJson, {qos: 1});
|
||||
broker.publish("v1/gateway/telemetry", stringifiedJson, {qos: 1});
|
||||
|
||||
//backup telemetry
|
||||
if(createTelemetryBackup)
|
||||
|
|
@ -286,8 +318,8 @@ console.log("ooooo------x", message);
|
|||
else
|
||||
{
|
||||
|
||||
//logger.debug("Client unavailable. Data not sent !", JSON.stringify(data.data));
|
||||
instance.send(SEND_TO.debug, {"message":"Client unavailable. Data not sent !", "data": data.data });
|
||||
if(logger) logger.debug("Broker unavailable. Data not sent !", data.data);
|
||||
instance.send(instanceSendTo.debug, {"message":"Broker unavailable. Data not sent !", "data": data.data });
|
||||
|
||||
if(saveTelemetryOnError)
|
||||
{
|
||||
|
|
@ -303,9 +335,9 @@ console.log("ooooo------x", message);
|
|||
});
|
||||
|
||||
|
||||
instance.close = function(done) {
|
||||
if(clientReady){
|
||||
client.end();
|
||||
instance.close = function(done) {
|
||||
if (brokerready){
|
||||
broker.end();
|
||||
clearInterval(sendWsStatusVar);
|
||||
}
|
||||
};
|
||||
|
|
@ -332,7 +364,7 @@ console.log("ooooo------x", message);
|
|||
let firstDigit = files[i].slice(0, pos);
|
||||
|
||||
fileCounter = parseInt(firstDigit);
|
||||
if(isNaN(fileCounter)) fileCounter = 0;
|
||||
if (isNaN(fileCounter)) fileCounter = 0;
|
||||
//console.log("getDbBackupFileCounter digit:", files[i], firstDigit, fileCounter, isNaN(fileCounter), type);
|
||||
|
||||
if(type == "max")
|
||||
|
|
@ -402,7 +434,10 @@ console.log("ooooo------x", message);
|
|||
|
||||
const processDataFromDatabase = async () => {
|
||||
|
||||
if(restore_from_backup <= 0) return;
|
||||
if(restore_from_backup <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//calculate diff
|
||||
const now = new Date();
|
||||
|
|
@ -434,7 +469,7 @@ console.log("ooooo------x", message);
|
|||
|
||||
for(let i = 0; i < records.length; i++)
|
||||
{
|
||||
if(clientReady) {
|
||||
if (brokerready) {
|
||||
|
||||
let item = records[i];
|
||||
let id = item.id;
|
||||
|
|
@ -443,18 +478,18 @@ console.log("ooooo------x", message);
|
|||
{
|
||||
//console.log("------------processDataFromDatabase - remove", id, dataBase, i);
|
||||
|
||||
try {
|
||||
try{
|
||||
|
||||
let o = JSON.parse(JSON.stringify(item));
|
||||
delete o.id;
|
||||
let message = JSON.stringify(o);
|
||||
|
||||
client.publish("v1/gateway/telemetry", message, {qos:1});
|
||||
broker.publish("v1/gateway/telemetry", message, {qos:1});
|
||||
|
||||
//remove from database
|
||||
await promisifyBuilder(nosql.remove().where("id", id));
|
||||
|
||||
} catch(error) {
|
||||
} catch (error) {
|
||||
//process error
|
||||
console.log("processDataFromDatabase", error);
|
||||
}
|
||||
|
|
@ -489,6 +524,8 @@ console.log("ooooo------x", message);
|
|||
|
||||
}
|
||||
|
||||
instance.on('options', main);
|
||||
//instance.reconfigure();
|
||||
loadSettings();
|
||||
|
||||
//instance.on('options', instance.reconfigure);
|
||||
//instance.reconfigure();
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue