@frangoteam/fuxa-min 1.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/_images/Pipes/P1.svg +39 -0
- package/_images/Tanks/Fl.svg +7 -0
- package/api/alarms/index.js +132 -0
- package/api/auth/index.js +71 -0
- package/api/command/index.js +187 -0
- package/api/daq/index.js +79 -0
- package/api/diagnose/index.js +163 -0
- package/api/index.js +181 -0
- package/api/jwt-helper.js +106 -0
- package/api/plugins/index.js +109 -0
- package/api/projects/index.js +229 -0
- package/api/resources/index.js +118 -0
- package/api/scripts/index.js +82 -0
- package/api/users/index.js +109 -0
- package/dist/3rdpartylicenses.txt +1477 -0
- package/dist/Quicksand-Bold.071154c292aef0b8.woff +0 -0
- package/dist/Quicksand-Bold.6383d6475ed5c40f.woff2 +0 -0
- package/dist/Quicksand-Bold.f07d467887f9cfab.ttf +0 -0
- package/dist/Quicksand-Medium.0982a651e8d4315f.woff +0 -0
- package/dist/Quicksand-Medium.9d2733fbfb9b1be8.ttf +0 -0
- package/dist/Quicksand-Medium.b09302365c586eb2.woff2 +0 -0
- package/dist/Quicksand-Regular.16adf9eecd267273.woff +0 -0
- package/dist/Quicksand-Regular.78819724f6aeff59.woff2 +0 -0
- package/dist/Quicksand-Regular.8829564f0e14bf76.ttf +0 -0
- package/dist/assets/fonts/icomoon.eot +0 -0
- package/dist/assets/fonts/icomoon.svg +19 -0
- package/dist/assets/fonts/icomoon.ttf +0 -0
- package/dist/assets/fonts/icomoon.woff +0 -0
- package/dist/assets/fonts/myicons.eot +0 -0
- package/dist/assets/fonts/myicons.svg +19 -0
- package/dist/assets/fonts/myicons.ttf +0 -0
- package/dist/assets/fonts/myicons.woff +0 -0
- package/dist/assets/fonts/quicksand-bold/Quicksand-Bold.ttf +0 -0
- package/dist/assets/fonts/quicksand-bold/Quicksand-Bold.woff +0 -0
- package/dist/assets/fonts/quicksand-bold/Quicksand-Bold.woff2 +0 -0
- package/dist/assets/fonts/quicksand-medium/Quicksand-Medium.ttf +0 -0
- package/dist/assets/fonts/quicksand-medium/Quicksand-Medium.woff +0 -0
- package/dist/assets/fonts/quicksand-medium/Quicksand-Medium.woff2 +0 -0
- package/dist/assets/fonts/quicksand-regular/Quicksand-Regular.ttf +0 -0
- package/dist/assets/fonts/quicksand-regular/Quicksand-Regular.woff +0 -0
- package/dist/assets/fonts/quicksand-regular/Quicksand-Regular.woff2 +0 -0
- package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.svg +10486 -0
- package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.ttf +0 -0
- package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.woff +0 -0
- package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.woff2 +0 -0
- package/dist/assets/fonts/roboto-light/roboto-light-webfont.svg +9998 -0
- package/dist/assets/fonts/roboto-light/roboto-light-webfont.ttf +0 -0
- package/dist/assets/fonts/roboto-light/roboto-light-webfont.woff +0 -0
- package/dist/assets/fonts/roboto-light/roboto-light-webfont.woff2 +0 -0
- package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.svg +10487 -0
- package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.ttf +0 -0
- package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.woff +0 -0
- package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.woff2 +0 -0
- package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.svg +10004 -0
- package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.ttf +0 -0
- package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.woff +0 -0
- package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.woff2 +0 -0
- package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.svg +10012 -0
- package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.ttf +0 -0
- package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.woff +0 -0
- package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.woff2 +0 -0
- package/dist/assets/i18n/de.json +1308 -0
- package/dist/assets/i18n/en.json +1438 -0
- package/dist/assets/i18n/es.json +777 -0
- package/dist/assets/i18n/fr.json +1129 -0
- package/dist/assets/i18n/ko.json +774 -0
- package/dist/assets/i18n/pt.json +657 -0
- package/dist/assets/i18n/ru.json +1228 -0
- package/dist/assets/i18n/tr.json +673 -0
- package/dist/assets/i18n/ua.json +614 -0
- package/dist/assets/i18n/zh-cn.json +1252 -0
- package/dist/assets/images/align-bottom.svg +88 -0
- package/dist/assets/images/align-center.svg +86 -0
- package/dist/assets/images/align-left.svg +86 -0
- package/dist/assets/images/align-middle.svg +88 -0
- package/dist/assets/images/align-right.svg +88 -0
- package/dist/assets/images/align-top.svg +88 -0
- package/dist/assets/images/bag.svg +115 -0
- package/dist/assets/images/button.svg +22 -0
- package/dist/assets/images/chart.svg +17 -0
- package/dist/assets/images/circle.svg +84 -0
- package/dist/assets/images/compressor-a.svg +2 -0
- package/dist/assets/images/editvalue.svg +14 -0
- package/dist/assets/images/ellipse.svg +84 -0
- package/dist/assets/images/flip-orizontal.svg +86 -0
- package/dist/assets/images/flip-vertical.svg +82 -0
- package/dist/assets/images/gauge-donut.png +0 -0
- package/dist/assets/images/gauge-mat.png +0 -0
- package/dist/assets/images/gauge-zone.png +0 -0
- package/dist/assets/images/graphbar.svg +18 -0
- package/dist/assets/images/group.svg +91 -0
- package/dist/assets/images/iframe.svg +54 -0
- package/dist/assets/images/image.svg +95 -0
- package/dist/assets/images/led-circle.svg +77 -0
- package/dist/assets/images/line.svg +86 -0
- package/dist/assets/images/linecap-butt.svg +77 -0
- package/dist/assets/images/linecap-round.svg +77 -0
- package/dist/assets/images/linecap-square.svg +82 -0
- package/dist/assets/images/linejoin-bevel.svg +77 -0
- package/dist/assets/images/linejoin-miter.svg +77 -0
- package/dist/assets/images/linejoin-round.svg +77 -0
- package/dist/assets/images/logo.svg +18 -0
- package/dist/assets/images/path.svg +100 -0
- package/dist/assets/images/pencil.svg +98 -0
- package/dist/assets/images/pipe.svg +15 -0
- package/dist/assets/images/progress-v.svg +79 -0
- package/dist/assets/images/rect.svg +84 -0
- package/dist/assets/images/select-pointer.svg +93 -0
- package/dist/assets/images/selectvalue.svg +14 -0
- package/dist/assets/images/semaphore.svg +19 -0
- package/dist/assets/images/slider.svg +17 -0
- package/dist/assets/images/switch.svg +15 -0
- package/dist/assets/images/table.svg +55 -0
- package/dist/assets/images/text.svg +294 -0
- package/dist/assets/images/to-bottom.svg +163 -0
- package/dist/assets/images/to-path.svg +94 -0
- package/dist/assets/images/to-top.svg +163 -0
- package/dist/assets/images/to_top.svg +88 -0
- package/dist/assets/images/todelete.svg +13 -0
- package/dist/assets/images/ungroup.svg +108 -0
- package/dist/assets/images/value.svg +81 -0
- package/dist/assets/images/valve-a.svg +2 -0
- package/dist/assets/images/webcam.svg +16 -0
- package/dist/assets/lib/ext-styles.css +28 -0
- package/dist/assets/lib/gauge/gauge.js +988 -0
- package/dist/assets/lib/gauge/gauge.min.js +1 -0
- package/dist/assets/lib/nouislider/nouislider.min.css +1 -0
- package/dist/assets/lib/nouislider/nouislider.min.js +1 -0
- package/dist/assets/lib/numeral/locales.min.js +7 -0
- package/dist/assets/lib/numeral/numeral.min.js +8 -0
- package/dist/assets/lib/pdfkit-table/index.js +967 -0
- package/dist/assets/lib/svg/raphael.min.js +1 -0
- package/dist/assets/lib/svg/svg.js +5573 -0
- package/dist/assets/lib/svg/svg.min.js +13 -0
- package/dist/assets/lib/svgeditor/extensions/ext-bundle.min.js +1 -0
- package/dist/assets/lib/svgeditor/extensions/ext-html_button.min.css +1 -0
- package/dist/assets/lib/svgeditor/fuxa-editor.min.js +23 -0
- package/dist/assets/lib/svgeditor/jquery-plugin.min.css +2 -0
- package/dist/assets/lib/svgeditor/jquery-plugin.min.js +52 -0
- package/dist/assets/lib/svgeditor/jquery-ui-1.8.17.custom.min.js +54 -0
- package/dist/assets/lib/svgeditor/jquery.min.js +4 -0
- package/dist/assets/lib/svgeditor/shapes/ape-shapes.js +39 -0
- package/dist/assets/lib/svgeditor/shapes/img/agitator-disc.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/agitator-paddle.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/agitator-prop.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/agitator-turbo.svg +19 -0
- package/dist/assets/lib/svgeditor/shapes/img/anim-eli.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/anim-piston.svg +14 -0
- package/dist/assets/lib/svgeditor/shapes/img/centrifugal.svg +68 -0
- package/dist/assets/lib/svgeditor/shapes/img/centrifugal1.svg +67 -0
- package/dist/assets/lib/svgeditor/shapes/img/centrifuge1.svg +67 -0
- package/dist/assets/lib/svgeditor/shapes/img/centrifuge2.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/centrifuge3.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/centrifuge4.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/compair.svg +92 -0
- package/dist/assets/lib/svgeditor/shapes/img/compdiaph.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/compejector.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/compreci.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/compreci2.svg +68 -0
- package/dist/assets/lib/svgeditor/shapes/img/compressor-fan.svg +18 -0
- package/dist/assets/lib/svgeditor/shapes/img/compressor-piston.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/compressor-void.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/compring.svg +72 -0
- package/dist/assets/lib/svgeditor/shapes/img/compring2.svg +72 -0
- package/dist/assets/lib/svgeditor/shapes/img/comprotary.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/comprotary2.svg +18 -0
- package/dist/assets/lib/svgeditor/shapes/img/compscrew.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/compsilence.svg +20 -0
- package/dist/assets/lib/svgeditor/shapes/img/compturbo.svg +72 -0
- package/dist/assets/lib/svgeditor/shapes/img/crusher1.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/crusher2.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/crusher3.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/crusher4.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/crusher5.svg +18 -0
- package/dist/assets/lib/svgeditor/shapes/img/crusher6.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/crusher7.svg +21 -0
- package/dist/assets/lib/svgeditor/shapes/img/diaph.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/drier1.svg +63 -0
- package/dist/assets/lib/svgeditor/shapes/img/drier2.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/drier3.svg +23 -0
- package/dist/assets/lib/svgeditor/shapes/img/drier4.svg +18 -0
- package/dist/assets/lib/svgeditor/shapes/img/drier5.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger-filter.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger-heat.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger-tube.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger1.svg +67 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger2.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger3.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger4.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger5.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger6.svg +71 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger7.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger8.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/exchanger9.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/feeder.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/feeder2.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/feeder3.svg +63 -0
- package/dist/assets/lib/svgeditor/shapes/img/filter2.svg +68 -0
- package/dist/assets/lib/svgeditor/shapes/img/filter3.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting1.svg +67 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting10.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting11.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting12.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting13.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting2.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting3.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting4.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting5.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting6.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting7.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting8.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/fitting9.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/misc1.svg +75 -0
- package/dist/assets/lib/svgeditor/shapes/img/misc2.svg +71 -0
- package/dist/assets/lib/svgeditor/shapes/img/misc3.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/misc4.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/misc5.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/misc6.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/misc7.svg +64 -0
- package/dist/assets/lib/svgeditor/shapes/img/misc8.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/motor-simb.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/nozzle.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/nozzle2.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/pipi1.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/pipi2.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/pipi3.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/pipi4.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/pipi5.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/pipi6.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/pipi7.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpblower.svg +76 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpcentri1.svg +64 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpcentri2.svg +64 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpfeed.svg +64 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpgear.svg +18 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpgear2.svg +19 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumphidra.svg +68 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumphorizo.svg +68 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpjet.svg +68 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpperis.svg +20 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpscreew.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpscreew2.svg +72 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpturbi.svg +64 -0
- package/dist/assets/lib/svgeditor/shapes/img/pumpvacuum.svg +72 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-arrow.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-circle.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-circleindi.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-cloud.svg +63 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-cone.svg +71 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-corner.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-cross.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-cylinder.svg +71 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-delay.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-diamond.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-display.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-docu.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-doublearrow.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-drop.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-halfcircle.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-heart.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-looplimit.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-maninput.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-nosymbol.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-octagon.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-offpage.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-or.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-or2.svg +17 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-parallelogram.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-pentagon.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-poval.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-prepara.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-rectangle.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-rectindi.svg +16 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-star4.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-switch.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-tape.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-tee.svg +63 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-ticket.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-trape.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-triangle.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/shape-vor.svg +14 -0
- package/dist/assets/lib/svgeditor/shapes/img/tank1.svg +63 -0
- package/dist/assets/lib/svgeditor/shapes/img/tank2.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/tank3.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/tank4.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/tank5.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/tank6.svg +68 -0
- package/dist/assets/lib/svgeditor/shapes/img/tank7.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/tank8.svg +15 -0
- package/dist/assets/lib/svgeditor/shapes/img/tank9.svg +21 -0
- package/dist/assets/lib/svgeditor/shapes/img/valve-ax.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/valve-bx.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/valve-cx.svg +13 -0
- package/dist/assets/lib/svgeditor/shapes/img/webcam.svg +6 -0
- package/dist/assets/lib/svgeditor/shapes/my-shapes.js +178 -0
- package/dist/assets/lib/svgeditor/shapes/proc-comp-shapes.js +105 -0
- package/dist/assets/lib/svgeditor/shapes/proc-general-shapes.js +60 -0
- package/dist/assets/lib/svgeditor/shapes/proc-pumps-shapes.js +112 -0
- package/dist/assets/lib/svgeditor/shapes/proc-shapes.js +606 -0
- package/dist/assets/lib/svgeditor/shapes/shapes.js +30 -0
- package/dist/assets/lib/svgeditor/svg-editor.min.css +1 -0
- package/dist/assets/lib/uplot/placement.min.js +2 -0
- package/dist/assets/project.demo.fuxap +1 -0
- package/dist/favicon.ico +0 -0
- package/dist/icomoon.86abfb46e057ade8.eot +0 -0
- package/dist/icomoon.c1f8b59bad308d66.woff +0 -0
- package/dist/icomoon.ce427f75e21963af.ttf +0 -0
- package/dist/icomoon.dfb0a89feb346906.svg +19 -0
- package/dist/index.html +50 -0
- package/dist/logo.0e8e64e69250a450.svg +18 -0
- package/dist/main.a356f552d9838b9e.js +1 -0
- package/dist/material-icons-outlined.78a93b2079680a08.woff +0 -0
- package/dist/material-icons-outlined.f86cb7b0aa53f0fe.woff2 +0 -0
- package/dist/material-icons-round.92dc7ca2f4c591e7.woff +0 -0
- package/dist/material-icons-round.b10ec9db5b7fbc74.woff2 +0 -0
- package/dist/material-icons-sharp.3885863ee4746422.woff2 +0 -0
- package/dist/material-icons-sharp.a71cb2bf66c604de.woff +0 -0
- package/dist/material-icons-two-tone.588d63134de807a7.woff +0 -0
- package/dist/material-icons-two-tone.675bd578bd14533e.woff2 +0 -0
- package/dist/material-icons.4ad034d2c499d9b6.woff +0 -0
- package/dist/material-icons.59322316b3fd6063.woff2 +0 -0
- package/dist/polyfills.2696a6f9dc75535e.js +1 -0
- package/dist/roboto-bold-webfont.29ac6158e35aee95.woff +0 -0
- package/dist/roboto-bold-webfont.568ab1fa3f154a77.svg +10486 -0
- package/dist/roboto-bold-webfont.6bcfbdc216b3bc78.woff2 +0 -0
- package/dist/roboto-bold-webfont.7c22a4dfdee2ff33.ttf +0 -0
- package/dist/roboto-light-webfont.13492ec56771eeee.svg +9998 -0
- package/dist/roboto-light-webfont.61fa26c99b07ac83.woff2 +0 -0
- package/dist/roboto-light-webfont.95295ce84942d8ce.ttf +0 -0
- package/dist/roboto-light-webfont.ae19119a2889dfdf.woff +0 -0
- package/dist/roboto-medium-webfont.30344f0411888055.woff +0 -0
- package/dist/roboto-medium-webfont.57fb00cab0317d2d.woff2 +0 -0
- package/dist/roboto-medium-webfont.a40869e060a388c0.ttf +0 -0
- package/dist/roboto-medium-webfont.ea02241c29620c02.svg +10487 -0
- package/dist/roboto-regular-webfont.2b0501b72f5a94d5.ttf +0 -0
- package/dist/roboto-regular-webfont.2ce0ba9a06424965.svg +10004 -0
- package/dist/roboto-regular-webfont.ae47f6f1292d196f.woff2 +0 -0
- package/dist/roboto-regular-webfont.f58066a2d9061006.woff +0 -0
- package/dist/roboto-thin-webfont.0a64479870f676e8.ttf +0 -0
- package/dist/roboto-thin-webfont.0f7221f5c7e972ef.woff2 +0 -0
- package/dist/roboto-thin-webfont.51b221e22714b1fe.svg +10012 -0
- package/dist/roboto-thin-webfont.dac941649dd4eac0.woff +0 -0
- package/dist/runtime.8ef63094e52a66ba.js +1 -0
- package/dist/scripts.1c3385254ff4c93c.js +1 -0
- package/dist/styles.cf8e3cf50d039a5c.css +1 -0
- package/fuxa.js +39 -0
- package/main.js +381 -0
- package/package.json +68 -0
- package/paths.js +44 -0
- package/project.default.json +11 -0
- package/project.demo.fuxap +1 -0
- package/runtime/alarms/alarmstorage.js +205 -0
- package/runtime/alarms/index.js +678 -0
- package/runtime/devices/bacnet/index.js +730 -0
- package/runtime/devices/device-utils.js +95 -0
- package/runtime/devices/device.js +551 -0
- package/runtime/devices/ethernetip/index.js +381 -0
- package/runtime/devices/fuxaserver/index.js +310 -0
- package/runtime/devices/httprequest/index.js +495 -0
- package/runtime/devices/index.js +489 -0
- package/runtime/devices/modbus/datatypes.js +122 -0
- package/runtime/devices/modbus/index.js +730 -0
- package/runtime/devices/mqtt/index.js +618 -0
- package/runtime/devices/odbc/index.js +408 -0
- package/runtime/devices/opcua/index.js +817 -0
- package/runtime/devices/s7/datatypes.js +88 -0
- package/runtime/devices/s7/index.js +702 -0
- package/runtime/devices/template/index.js +141 -0
- package/runtime/events.js +33 -0
- package/runtime/index.js +559 -0
- package/runtime/jobs/cleaner.js +74 -0
- package/runtime/jobs/fonts/LICENSE.txt +202 -0
- package/runtime/jobs/fonts/Roboto-Black.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-BlackItalic.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-Bold.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-BoldItalic.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-Italic.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-Light.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-LightItalic.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-Medium.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-MediumItalic.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-Regular.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-Thin.ttf +0 -0
- package/runtime/jobs/fonts/Roboto-ThinItalic.ttf +0 -0
- package/runtime/jobs/helper/image-generator.js +82 -0
- package/runtime/jobs/index.js +214 -0
- package/runtime/jobs/report.js +353 -0
- package/runtime/logger.js +113 -0
- package/runtime/notificator/index.js +383 -0
- package/runtime/notificator/notifystorage.js +179 -0
- package/runtime/plugins/index.js +255 -0
- package/runtime/project/index.js +959 -0
- package/runtime/project/prjstorage.js +222 -0
- package/runtime/scripts/index.js +313 -0
- package/runtime/scripts/msm.js +146 -0
- package/runtime/storage/calculator.js +227 -0
- package/runtime/storage/daqstorage.js +188 -0
- package/runtime/storage/influxdb/index.js +240 -0
- package/runtime/storage/sqlite/currentstorage.js +144 -0
- package/runtime/storage/sqlite/index.js +695 -0
- package/runtime/storage/tdengine/index.js +106 -0
- package/runtime/users/index.js +123 -0
- package/runtime/users/usrstorage.js +201 -0
- package/runtime/utils.js +284 -0
- package/screenshot/feature-action-move.gif +0 -0
- package/screenshot/fuxa-ani.gif +0 -0
- package/screenshot/fuxa-device.gif +0 -0
- package/screenshot/fuxa-editor.png +0 -0
- package/screenshot/fuxa-hmi.gif +0 -0
- package/screenshot/fuxa-home.png +0 -0
- package/screenshot/fuxa-test.gif +0 -0
- package/settings.default.js +65 -0
|
@@ -0,0 +1,695 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module to manage the DAQ node with sqlite (a DaqNode per Device)
|
|
3
|
+
* There are 2 database:
|
|
4
|
+
* 1 to map all Tags/Nodes with map-id, Tag/Node-id, name and type.
|
|
5
|
+
* 2 to save the Tags/Nodes values with timestamp, map-id and value.
|
|
6
|
+
* The values have a Timestamp resolution of Seconds
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
var sqlite3 = require('sqlite3').verbose();
|
|
14
|
+
|
|
15
|
+
const db_daqdata_prefix = 'daq-data_';
|
|
16
|
+
const db_daqmap_prefix = 'daq-map_';
|
|
17
|
+
const db_daqtoken = 3600000; // 1 hour
|
|
18
|
+
const archive_folder = 'archive';
|
|
19
|
+
|
|
20
|
+
function DaqNode(_settings, _log, _id, _currentStorate) {
|
|
21
|
+
|
|
22
|
+
var settings = _settings; // Application settings
|
|
23
|
+
var logger = _log; // Application logger
|
|
24
|
+
var id = _id; // Device id
|
|
25
|
+
const currentStorage = _currentStorate // Database to set the last value (current)
|
|
26
|
+
var initready = false; // Initilized flag
|
|
27
|
+
var mapworking = false; // Data mapping working flag
|
|
28
|
+
var dataworking = false; // Save data working flag
|
|
29
|
+
var db_daqmap; // Database of mapped data
|
|
30
|
+
var db_daqdata; // Database of data
|
|
31
|
+
var daqTagsMap = {}; // Mapped db Tags/Nodes
|
|
32
|
+
var daqNextToken = new Date().getTime();// Interval to split Database data
|
|
33
|
+
|
|
34
|
+
daqNextToken += (settings.daqTokenizer) ? db_daqtoken * settings.daqTokenizer : db_daqtoken * 24;
|
|
35
|
+
if (settings.daqTokenizer === 0) {
|
|
36
|
+
daqNextToken = 0;
|
|
37
|
+
} else {
|
|
38
|
+
// check database pending
|
|
39
|
+
var pendsfile = path.join(settings.dbDir, db_daqdata_prefix + id + '_');
|
|
40
|
+
var pendsfiles = fs.readdirSync(settings.dbDir);
|
|
41
|
+
for (var i in pendsfiles) {
|
|
42
|
+
var filePath = path.join(settings.dbDir, pendsfiles[i]);
|
|
43
|
+
if (filePath.indexOf(pendsfile) === 0) {
|
|
44
|
+
_checkToArchiveDBfile(filePath);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// define file database
|
|
49
|
+
var suffix = (daqNextToken) ? _getDateTimeSuffix(new Date()) : '';
|
|
50
|
+
var db_daqdata_file = path.join(settings.dbDir, db_daqdata_prefix + id + '_' + suffix + '.db');
|
|
51
|
+
var db_daqmap_file = path.join(settings.dbDir, db_daqmap_prefix + id + '.db');
|
|
52
|
+
|
|
53
|
+
var db_daqmap_exists = require('fs').existsSync(db_daqmap_file);
|
|
54
|
+
var db_daqdata_exists = require('fs').existsSync(db_daqdata_file);
|
|
55
|
+
if (!db_daqmap_exists && db_daqdata_exists) {
|
|
56
|
+
// reset daq db
|
|
57
|
+
_resetDB(db_daqdata_file);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// bind database daqdata
|
|
61
|
+
_bindDaqData(db_daqdata_file).then(result => {
|
|
62
|
+
logger.info(`daqstorage.connected-to-data '${db_daqdata_file}' database`, true);
|
|
63
|
+
db_daqdata = result;
|
|
64
|
+
}).catch(function (err) {
|
|
65
|
+
if (err) {
|
|
66
|
+
logger.error(`daqstorage.connected-to-data failed! '${id}' ${err}`);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// bind database daqmap
|
|
71
|
+
_bindDaqMap(db_daqmap_file).then(result => {
|
|
72
|
+
logger.info(`daqstorage.connected-to-map '${db_daqmap_file}' database`, true);
|
|
73
|
+
db_daqmap = result;
|
|
74
|
+
_loadMap().then(result => {
|
|
75
|
+
logger.info(`daqstorage.load-map successful! '${id}'`, true);
|
|
76
|
+
initready = true;
|
|
77
|
+
}).catch(function (err) {
|
|
78
|
+
if (err) {
|
|
79
|
+
logger.error(`daqstorage.load-map failed! '${id}' ${err}`);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}).catch(function (err) {
|
|
83
|
+
if (err) {
|
|
84
|
+
logger.error(`daqstorage.bind-map failed! '${id}' ${err}`);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Close data and map database
|
|
90
|
+
*/
|
|
91
|
+
this.close = function () {
|
|
92
|
+
if (db_daqmap) {
|
|
93
|
+
db_daqmap.close();
|
|
94
|
+
}
|
|
95
|
+
if (db_daqdata) {
|
|
96
|
+
db_daqdata.close();
|
|
97
|
+
}
|
|
98
|
+
logger.info(`daqstorage.closed successful! '${id}'`, true);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Set function callback to get Tag/Node property and return function reference to set value
|
|
103
|
+
*/
|
|
104
|
+
this.setCall = function (fncgetprop) {
|
|
105
|
+
fncGetTagProp = fncgetprop;
|
|
106
|
+
return this.addDaqValues;
|
|
107
|
+
}
|
|
108
|
+
var fncGetTagProp = null;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Add Daq value of Tag/Node
|
|
112
|
+
* Check if the Tag/Node is mapped otherwise first add the value to data db then check if the db is to split and to archive
|
|
113
|
+
*/
|
|
114
|
+
this.addDaqValue = function (tagid, tagvalue) {
|
|
115
|
+
if (initready) {
|
|
116
|
+
if (!daqTagsMap[tagid]) {
|
|
117
|
+
// tags is not mapped
|
|
118
|
+
var prop = fncGetTagProp(tagid);
|
|
119
|
+
if (prop && _checkMapWorking(true)) {
|
|
120
|
+
_insertTagToMap(prop.id, prop.name, prop.type).then(function (result) {
|
|
121
|
+
_getTagMap(prop.id, prop.name, prop.type).then(function (result) {
|
|
122
|
+
_addTagMap(result.mapid, prop.id, prop.name);
|
|
123
|
+
}).catch(function (err) {
|
|
124
|
+
logger.error(`daqstorage.add-daq-value _getTagMap failed! '${id}' ${err}`);
|
|
125
|
+
});
|
|
126
|
+
_checkMapWorking(false);
|
|
127
|
+
}).catch(function (err) {
|
|
128
|
+
_checkMapWorking(false);
|
|
129
|
+
logger.error(`daqstorage.add-daq-value _insertTagToMap failed! '${id}' ${err}`);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
if (_checkDataWorking(true)) {
|
|
134
|
+
// check if db_daqdata are bindet
|
|
135
|
+
if (db_daqdata) {
|
|
136
|
+
_insertTagValue(daqTagsMap[tagid].mapid, tagvalue).then(function (lastts) {
|
|
137
|
+
// check db tokenizer after inserted
|
|
138
|
+
if (daqNextToken && daqNextToken < lastts) {
|
|
139
|
+
// close data DB, open and bind the new db, rename and move the closed db
|
|
140
|
+
db_daqdata.close(function () {
|
|
141
|
+
var suffix = _getDateTimeSuffix(new Date());
|
|
142
|
+
var oldfile = db_daqdata_file;
|
|
143
|
+
db_daqdata_file = path.join(settings.dbDir, db_daqdata_prefix + id + '_' + suffix + '.db');
|
|
144
|
+
db_daqdata = null;
|
|
145
|
+
_bindDaqData(db_daqdata_file).then(result => {
|
|
146
|
+
logger.info(`daqstorage.add-daq-value _bindDaqData '${id}' database`, true);
|
|
147
|
+
daqNextToken += (settings.daqTimeToken) ? db_daqtoken * settings.daqTimeToken : db_daqtoken;
|
|
148
|
+
db_daqdata = result;
|
|
149
|
+
_archiveDBfile(oldfile, lastts);
|
|
150
|
+
_checkDataWorking(false);
|
|
151
|
+
}).catch(function (err) {
|
|
152
|
+
_checkDataWorking(false);
|
|
153
|
+
logger.error(`daqstorage.add-daq-value _bindDaqData failed! '${id}' ${err}`);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
} else {
|
|
157
|
+
_checkDataWorking(false);
|
|
158
|
+
}
|
|
159
|
+
}).catch(function (err) {
|
|
160
|
+
_checkDataWorking(false);
|
|
161
|
+
});
|
|
162
|
+
} else {
|
|
163
|
+
// some things was wrong by tokenize...try to bind the db_daqdata
|
|
164
|
+
_bindDaqData(db_daqdata_file).then(result => {
|
|
165
|
+
logger.info(`daqstorage.add-daq-value _bindDaqData '${db_daqmap_file}' database`, true);
|
|
166
|
+
db_daqdata = result;
|
|
167
|
+
_checkDataWorking(false);
|
|
168
|
+
}).catch(function (err) {
|
|
169
|
+
_checkDataWorking(false);
|
|
170
|
+
logger.error(`daqstorage.add-daq-value _bindDaqData failed! '${id}' ${err}`);
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Add Daq value of Tag/Node
|
|
180
|
+
* Check if the Tag/Node is mapped otherwise first add the value to data db then check if the db is to split and to archive
|
|
181
|
+
*/
|
|
182
|
+
this.addDaqValues = function (tags, deviceName, deviceId) {
|
|
183
|
+
if (initready) {
|
|
184
|
+
if (db_daqdata) {
|
|
185
|
+
var addMapfnc = [];
|
|
186
|
+
var addDaqfnc = [];
|
|
187
|
+
var dataToRestore = [];
|
|
188
|
+
// prepare functions
|
|
189
|
+
for (var tagid in tags) {
|
|
190
|
+
const tag = tags[tagid];
|
|
191
|
+
if (!tag.daq) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (tag.daq.restored) {
|
|
195
|
+
dataToRestore.push({id: tag.id, deviceId: deviceId, value: tag.value});
|
|
196
|
+
}
|
|
197
|
+
if (!tag.daq.enabled) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (!daqTagsMap[tagid]) {
|
|
202
|
+
var prop = fncGetTagProp(tagid);
|
|
203
|
+
if (prop) {
|
|
204
|
+
addMapfnc.push(_insertTagToMap(prop.id, prop.name, prop.type));
|
|
205
|
+
}
|
|
206
|
+
} else {
|
|
207
|
+
addDaqfnc.push(_insertTagValue(daqTagsMap[tagid].mapid, tag.value));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// check function to insert in map
|
|
211
|
+
if (addMapfnc.length > 0) {
|
|
212
|
+
Promise.all(addMapfnc).then(result => {
|
|
213
|
+
logger.info(`daqstorage.add-daq-values _insertTagToMap '${id}' ${result}`, true);
|
|
214
|
+
for (var idx = 0; idx < result.length; idx++) {
|
|
215
|
+
_getTagMap(result[idx]).then(function (result) {
|
|
216
|
+
_addTagMap(result.mapid, result.id, result.name);
|
|
217
|
+
}).catch(function (err) {
|
|
218
|
+
logger.error(`daqstorage.add-daq-value _getTagMap failed! '${id}' ${err}`);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}, reason => {
|
|
222
|
+
if (reason && reason.stack) {
|
|
223
|
+
logger.error(`daqstorage.add-daq-value _insertTagToMap failed! '${id}' ${reason.stack}`);
|
|
224
|
+
} else {
|
|
225
|
+
logger.error(`daqstorage.add-daq-value _insertTagToMap failed! '${id}' ${reason}`);
|
|
226
|
+
}
|
|
227
|
+
_checkDataWorking(false);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
// check function to add daq data
|
|
231
|
+
if (addDaqfnc.length > 0) {
|
|
232
|
+
if (_checkDataWorking(true)) {
|
|
233
|
+
Promise.all(addDaqfnc).then(result => {
|
|
234
|
+
// check db tokenizer after inserted
|
|
235
|
+
var lastts = 0 || result[0];
|
|
236
|
+
if (daqNextToken && daqNextToken < lastts) {
|
|
237
|
+
// close data DB, open and bind the new db, rename and move the closed db
|
|
238
|
+
db_daqdata.close(function () {
|
|
239
|
+
var suffix = _getDateTimeSuffix(new Date());
|
|
240
|
+
var oldfile = db_daqdata_file;
|
|
241
|
+
db_daqdata_file = path.join(settings.dbDir, db_daqdata_prefix + id + '_' + suffix + '.db');
|
|
242
|
+
db_daqdata = null;
|
|
243
|
+
_bindDaqData(db_daqdata_file).then(result => {
|
|
244
|
+
logger.info(`daqstorage.add-daq-values '${db_daqmap_file}' database`, true);
|
|
245
|
+
daqNextToken += (settings.daqTimeToken) ? db_daqtoken * settings.daqTimeToken : db_daqtoken;
|
|
246
|
+
db_daqdata = result;
|
|
247
|
+
_archiveDBfile(oldfile, lastts);
|
|
248
|
+
_checkDataWorking(false);
|
|
249
|
+
}).catch(function (err) {
|
|
250
|
+
_checkDataWorking(false);
|
|
251
|
+
logger.error(`daqstorage.add-daq-values _bindDaqData failed! '${id}' ${err}`);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
} else {
|
|
255
|
+
_checkDataWorking(false);
|
|
256
|
+
}
|
|
257
|
+
}, reason => {
|
|
258
|
+
if (reason && reason.stack) {
|
|
259
|
+
logger.error(`daqstorage.add-daq-values addDaqfnc failed! '${id}' ${reason.stack}`);
|
|
260
|
+
} else {
|
|
261
|
+
logger.error(`daqstorage.add-daq-values addDaqfnc failed! '${id}' ${reason}`);
|
|
262
|
+
}
|
|
263
|
+
_checkDataWorking(false);
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (dataToRestore.length && currentStorage) {
|
|
268
|
+
currentStorage.setValues(dataToRestore);
|
|
269
|
+
}
|
|
270
|
+
} else {
|
|
271
|
+
// some things was wrong by tokenize...try to bind the db_daqdata
|
|
272
|
+
_bindDaqData(db_daqdata_file).then(result => {
|
|
273
|
+
logger.info(`daqstorage.add-daq-values '${db_daqmap_file}' database`, true);
|
|
274
|
+
db_daqdata = result;
|
|
275
|
+
_checkDataWorking(false);
|
|
276
|
+
}).catch(function (err) {
|
|
277
|
+
_checkDataWorking(false);
|
|
278
|
+
logger.error(`daqstorage.add-daq-values _bindDaqData failed! '${id}' ${err}`);
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Return Tags/Nodes map list
|
|
286
|
+
*/
|
|
287
|
+
this.getDaqMap = function () {
|
|
288
|
+
return daqTagsMap;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Return array of timeserie <timestamp, value>
|
|
293
|
+
*/
|
|
294
|
+
this.getDaqValue = function (tagid, fromts, tots) {
|
|
295
|
+
return new Promise(function (resolve, reject) {
|
|
296
|
+
if (daqTagsMap[tagid]) {
|
|
297
|
+
var result = [];
|
|
298
|
+
// search in current db
|
|
299
|
+
_getTagValues(db_daqdata, daqTagsMap[tagid].mapid, fromts, tots).then(function (rows) {
|
|
300
|
+
// search in archive
|
|
301
|
+
var archivefiles = _getArchiveFiles(id, fromts, tots);
|
|
302
|
+
var dbfncs = [];
|
|
303
|
+
archivefiles.forEach(file => {
|
|
304
|
+
dbfncs.push(_bindAndGetTagValues(file, daqTagsMap[tagid].mapid, fromts, tots));
|
|
305
|
+
});
|
|
306
|
+
Promise.all(dbfncs).then(values => {
|
|
307
|
+
for (var i = 0; i < values.length; i++) {
|
|
308
|
+
result = result.concat(values[i]);
|
|
309
|
+
}
|
|
310
|
+
result = result.concat(rows);
|
|
311
|
+
resolve(result);
|
|
312
|
+
}, reason => {
|
|
313
|
+
if (reason.stack) {
|
|
314
|
+
logger.error(`daqstorage.get-daq-value failed! '${id}' ${reason.stack}`);
|
|
315
|
+
} else {
|
|
316
|
+
logger.error(`daqstorage.get-daq-value failed! '${id}' ${reason}`);
|
|
317
|
+
}
|
|
318
|
+
reject(reason);
|
|
319
|
+
});
|
|
320
|
+
}).catch(function (err) {
|
|
321
|
+
logger.error(`daqstorage.get-daq-value _getTagValues failed! '${id}' ${err}`);
|
|
322
|
+
reject(err);
|
|
323
|
+
});
|
|
324
|
+
} else {
|
|
325
|
+
reject('tag id ' + tagid + ' not found!');
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Used to manage the async add Tag/Node in map db (that not overloading)
|
|
332
|
+
* @param {*} check
|
|
333
|
+
*/
|
|
334
|
+
var _checkMapWorking = function (check) {
|
|
335
|
+
if (check && mapworking) {
|
|
336
|
+
logger.warn(`daqstorage.mapping-overload! '${id}'`);
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
mapworking = check;
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Used to manage the async add Tag/Node in data db (that not overloading)
|
|
345
|
+
* @param {*} check
|
|
346
|
+
*/
|
|
347
|
+
var _checkDataWorking = function (check) {
|
|
348
|
+
if (check && dataworking) {
|
|
349
|
+
logger.warn(`daqstorage.data-overload! '${id}'`);
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
dataworking = check;
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Bind the map database by create the table if not exist
|
|
358
|
+
* @param {*} dbfile
|
|
359
|
+
*/
|
|
360
|
+
function _bindDaqMap(dbfile) {
|
|
361
|
+
return new Promise(function (resolve, reject) {
|
|
362
|
+
try {
|
|
363
|
+
var db = new sqlite3.Database(dbfile, function (err) {
|
|
364
|
+
if (err) {
|
|
365
|
+
logger.error(`daqstorage.bind-daq-map error! '${id}' ${err}`);
|
|
366
|
+
reject();
|
|
367
|
+
}
|
|
368
|
+
logger.info(`daqstorage.bind-daq-map '${dbfile}' database`, true);
|
|
369
|
+
});
|
|
370
|
+
db.serialize(function () {
|
|
371
|
+
db.run("CREATE TABLE if not exists data (mapid INTEGER PRIMARY KEY AUTOINCREMENT, id TEXT, name TEXT, type TEXT)", function (err) {
|
|
372
|
+
if (err) {
|
|
373
|
+
logger.error(`daqstorage.bind-daq-map-to-create-table error! '${id}' ${err}`);
|
|
374
|
+
reject();
|
|
375
|
+
} else {
|
|
376
|
+
resolve(db);
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
} catch (err) {
|
|
381
|
+
reject(err);
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Bind the data database by create the table if not exist
|
|
388
|
+
* @param {*} dbfile
|
|
389
|
+
*/
|
|
390
|
+
function _bindDaqData(dbfile) {
|
|
391
|
+
return new Promise(function (resolve, reject) {
|
|
392
|
+
try {
|
|
393
|
+
var db = new sqlite3.Database(dbfile, function (err) {
|
|
394
|
+
if (err) {
|
|
395
|
+
logger.error(`daqstorage.bind-daq-data error! '${id}' ${err}`);
|
|
396
|
+
reject();
|
|
397
|
+
}
|
|
398
|
+
logger.info(`daqstorage.bind-daq-data '${dbfile}' database`, true);
|
|
399
|
+
});
|
|
400
|
+
db.serialize(function () {
|
|
401
|
+
db.run("CREATE TABLE if not exists data (dt INTEGER, id INTEGER, value TEXT)", function (err) {
|
|
402
|
+
if (err) {
|
|
403
|
+
logger.error(`daqstorage.bind-daq-data-to-create-table error! '${id}' ${err}`);
|
|
404
|
+
reject();
|
|
405
|
+
} else {
|
|
406
|
+
resolve(db);
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
} catch (err) {
|
|
411
|
+
reject(err);
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Move the db file to archive folder.
|
|
418
|
+
* Open the db take the last data and rename the file with the start and last data time
|
|
419
|
+
* @param {*} dbfile
|
|
420
|
+
*/
|
|
421
|
+
function _checkToArchiveDBfile(dbfile) {
|
|
422
|
+
if (dbfile.indexOf('-journal') !== -1) {
|
|
423
|
+
// delete pending db journal
|
|
424
|
+
try {
|
|
425
|
+
fs.unlinkSync(dbfile);
|
|
426
|
+
logger.info(`daqstorage.check-to-archive-db-file '${dbfile}' pending db journal deleted!`, true);
|
|
427
|
+
} catch (e) {
|
|
428
|
+
console.error(e);
|
|
429
|
+
}
|
|
430
|
+
} else {
|
|
431
|
+
_bindDaqData(dbfile).then(result => {
|
|
432
|
+
logger.info(`daqstorage.check-to-archive-db-file '${dbfile}'`, true);
|
|
433
|
+
_getLastTagValue(result).then(lastrow => {
|
|
434
|
+
result.close(function () {
|
|
435
|
+
// rename and move to archive
|
|
436
|
+
if (lastrow) {
|
|
437
|
+
var filearchived = _archiveDBfile(dbfile, lastrow.dt);
|
|
438
|
+
logger.info(`daqstorage.check-to-archive-db-file '${filearchived}'`, true);
|
|
439
|
+
} else {
|
|
440
|
+
// delete void db
|
|
441
|
+
try {
|
|
442
|
+
fs.unlinkSync(dbfile);
|
|
443
|
+
logger.info(`daqstorage.check-to-archive-db-file '${dbfile}' database deleted!`, true);
|
|
444
|
+
} catch (e) {
|
|
445
|
+
console.error(e);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
}).catch(function (err) {
|
|
450
|
+
logger.error(`daqstorage.check-to-archive-db-file error! '${id}' ${err}`);
|
|
451
|
+
});
|
|
452
|
+
}).catch(function (err) {
|
|
453
|
+
logger.error(`daqstorage.check-to-archive-db-file error! '${id}' ${err}`);
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
function _getArchiveFiles(id, fromts, tots) {
|
|
459
|
+
const archive = path.resolve(settings.dbDir, archive_folder);
|
|
460
|
+
var result = [];
|
|
461
|
+
if (fs.existsSync(archive)) {
|
|
462
|
+
fs.readdirSync(archive).forEach(file => {
|
|
463
|
+
const fromTo = _suffixToTimestamp(file);
|
|
464
|
+
if (file.indexOf(`_${id}_`) > 0 && fromTo && fromTo.from <= tots && fromTo.to >= fromts) {
|
|
465
|
+
result.push(path.join(archive, file));
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
result.sort();
|
|
469
|
+
}
|
|
470
|
+
return result;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
function _archiveDBfile(dbfile, ts) {
|
|
474
|
+
var suffix = _getDateTimeSuffix(new Date(ts));
|
|
475
|
+
var archive = path.resolve(settings.dbDir, archive_folder);
|
|
476
|
+
if (!fs.existsSync(archive)) {
|
|
477
|
+
fs.mkdirSync(archive);
|
|
478
|
+
}
|
|
479
|
+
var dbfilenew = path.join(archive, path.basename(dbfile, path.extname(dbfile))) + '_' + suffix + path.extname(dbfile);
|
|
480
|
+
try {
|
|
481
|
+
fs.renameSync(dbfile, dbfilenew);
|
|
482
|
+
} catch (err) {
|
|
483
|
+
console.error(err);
|
|
484
|
+
}
|
|
485
|
+
return dbfilenew;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
function _getDateTimeSuffix(dt) {
|
|
489
|
+
var yyyy = dt.getFullYear();
|
|
490
|
+
var mm = dt.getMonth() + 1;
|
|
491
|
+
var dd = dt.getDate();
|
|
492
|
+
if (dd < 10) {
|
|
493
|
+
dd = '0' + dd;
|
|
494
|
+
}
|
|
495
|
+
if (mm < 10) {
|
|
496
|
+
mm = '0' + mm;
|
|
497
|
+
}
|
|
498
|
+
var HH = dt.getHours();
|
|
499
|
+
var MM = dt.getMinutes();
|
|
500
|
+
var SS = dt.getSeconds();
|
|
501
|
+
if (HH < 10) {
|
|
502
|
+
HH = '0' + HH;
|
|
503
|
+
}
|
|
504
|
+
if (MM < 10) {
|
|
505
|
+
MM = '0' + MM;
|
|
506
|
+
}
|
|
507
|
+
if (SS < 10) {
|
|
508
|
+
SS = '0' + SS;
|
|
509
|
+
}
|
|
510
|
+
return '' + yyyy + mm + dd + HH + MM + SS;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
function _resetDB(file) {
|
|
514
|
+
try {
|
|
515
|
+
fs.unlinkSync(file);
|
|
516
|
+
logger.info(`daqstorage._resetDB '${file}' file of database deleted!`, true);
|
|
517
|
+
} catch (err) {
|
|
518
|
+
console.error(err);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
function _loadMap() {
|
|
523
|
+
daqTagsMap = {};
|
|
524
|
+
return new Promise(function (resolve, reject) {
|
|
525
|
+
db_daqmap.all("SELECT mapid, id, name, type FROM data", function (err, rows) {
|
|
526
|
+
if (err) {
|
|
527
|
+
reject(err);
|
|
528
|
+
}
|
|
529
|
+
else if (rows) {
|
|
530
|
+
for (var idx = 0; idx < rows.length; idx++) {
|
|
531
|
+
var row = rows[idx];
|
|
532
|
+
_addTagMap(row.mapid, row.id, row.name);
|
|
533
|
+
// cfg.push({ id: row.mapid, name: row.name, interval_range: row.interval_range, interval: row.interval, sample_range: row.sample_range, samples: row.samples, enabled: row.enabled, divisor: row.divisor, value: null });
|
|
534
|
+
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
resolve(true);
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
function _getTagMap(id) {
|
|
543
|
+
return new Promise(function (resolve, reject) {
|
|
544
|
+
var sql = "SELECT mapid, id, name, type FROM data WHERE id = ?";
|
|
545
|
+
db_daqmap.get(sql, [id], function (err, row) {
|
|
546
|
+
if (err) {
|
|
547
|
+
reject(err);
|
|
548
|
+
} else {
|
|
549
|
+
resolve(row);
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
function _insertTagToMap(tagid, name, type) {
|
|
556
|
+
return new Promise(function (resolve, reject) {
|
|
557
|
+
var sqlRequest = "INSERT INTO data (id, name, type) ";
|
|
558
|
+
db_daqmap.run(sqlRequest + "VALUES('" + tagid + "','" + name + "','" + type + "'); SELECT last_insert_rowid() FROM data", function (err) {
|
|
559
|
+
if (err !== null) {
|
|
560
|
+
reject(err);
|
|
561
|
+
} else {
|
|
562
|
+
resolve(tagid);
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
function _getLastTagValue(db) {
|
|
569
|
+
return new Promise(function (resolve, reject) {
|
|
570
|
+
var sql = "SELECT dt FROM data ORDER BY dt DESC LIMIT 1";
|
|
571
|
+
db.get(sql, [], function (err, row) {
|
|
572
|
+
if (err) {
|
|
573
|
+
console.error(err);
|
|
574
|
+
reject(err);
|
|
575
|
+
} else {
|
|
576
|
+
resolve(row);
|
|
577
|
+
}
|
|
578
|
+
});
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
function _bindAndGetTagValues(dbfile, id, fromts, tots) {
|
|
583
|
+
return new Promise(function (resolve, reject) {
|
|
584
|
+
_bindDaqData(dbfile).then(result => {
|
|
585
|
+
_getTagValues(result, id, fromts, tots).then(rows => {
|
|
586
|
+
result.close();
|
|
587
|
+
resolve(rows);
|
|
588
|
+
}).catch(function (err) {
|
|
589
|
+
reject(err);
|
|
590
|
+
});
|
|
591
|
+
}).catch(function (err) {
|
|
592
|
+
reject(err);
|
|
593
|
+
});
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
function _getTagValues(db, id, fromts, tots) {
|
|
598
|
+
return new Promise(function (resolve, reject) {
|
|
599
|
+
const booleanMapping = { "true": true, "false": false };
|
|
600
|
+
var sql = "SELECT dt, value FROM data WHERE id = ? AND dt BETWEEN ? and ? ORDER BY dt ASC";
|
|
601
|
+
db.all(sql, [id, fromts, tots], function (err, rows) {
|
|
602
|
+
if (err) {
|
|
603
|
+
console.error(err);
|
|
604
|
+
reject(err);
|
|
605
|
+
} else {
|
|
606
|
+
for (var i = 0; i < rows.length; i++) {
|
|
607
|
+
rows[i].value = booleanMapping[rows[i].value] !== undefined ? booleanMapping[rows[i].value] : rows[i].value;
|
|
608
|
+
}
|
|
609
|
+
resolve(rows);
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
function _insertTagValue(mapid, value) {
|
|
616
|
+
return new Promise(function (resolve, reject) {
|
|
617
|
+
var ts = new Date().getTime();
|
|
618
|
+
var sqlRequest = "INSERT INTO data (dt, id, value) ";
|
|
619
|
+
db_daqdata.run(sqlRequest + "VALUES('" + ts + "','" + mapid + "','" + value + "')", function (err) {
|
|
620
|
+
if (err !== null) {
|
|
621
|
+
reject();
|
|
622
|
+
}
|
|
623
|
+
else {
|
|
624
|
+
resolve(ts);
|
|
625
|
+
}
|
|
626
|
+
});
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
function _addTagMap(mapid, id, name) {
|
|
631
|
+
if (daqTagsMap[id]) {
|
|
632
|
+
return false;
|
|
633
|
+
}
|
|
634
|
+
daqTagsMap[id] = { mapid: mapid, name: name };
|
|
635
|
+
return true;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
return true;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* Check and remove old data
|
|
643
|
+
*/
|
|
644
|
+
function checkRetention(dtlimit, dbDir, callbackRemoved, callbackError) {
|
|
645
|
+
var archiveDir = path.resolve(dbDir, archive_folder);
|
|
646
|
+
if (fs.existsSync(archiveDir)) {
|
|
647
|
+
var files = fs.readdirSync(archiveDir);
|
|
648
|
+
files.forEach(file => {
|
|
649
|
+
const fromTo = _suffixToTimestamp(file);
|
|
650
|
+
if (fromTo && fromTo.from < dtlimit.getTime()) {
|
|
651
|
+
try {
|
|
652
|
+
fs.unlink(path.join(archiveDir, file), (err) => {
|
|
653
|
+
if (err && callbackError) {
|
|
654
|
+
callbackError(`daqstorage.checkRetention remove file ${file} failed! ${err}`);
|
|
655
|
+
}
|
|
656
|
+
});
|
|
657
|
+
if (callbackRemoved) {
|
|
658
|
+
callbackRemoved(file);
|
|
659
|
+
}
|
|
660
|
+
} catch (error) {
|
|
661
|
+
console.error(error);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
function _suffixToTimestamp(file) {
|
|
669
|
+
function _parseSuffix(dtText) {
|
|
670
|
+
if (dtText.length >= 14) {
|
|
671
|
+
var yyyy = parseInt(dtText.substring(0, 4));
|
|
672
|
+
var mm = parseInt(dtText.substring(4, 6)) - 1;
|
|
673
|
+
var dd = parseInt(dtText.substring(6, 8));
|
|
674
|
+
var HH = parseInt(dtText.substring(8, 10));
|
|
675
|
+
var MM = parseInt(dtText.substring(10, 12));
|
|
676
|
+
var SS = parseInt(dtText.substring(12, 14));
|
|
677
|
+
return new Date(yyyy, mm, dd, HH, MM, SS).getTime();
|
|
678
|
+
}
|
|
679
|
+
return null;
|
|
680
|
+
}
|
|
681
|
+
var ranges = file.split('_');
|
|
682
|
+
if (ranges.length >= 3) {
|
|
683
|
+
return { from: _parseSuffix(ranges[ranges.length - 2]),
|
|
684
|
+
to: _parseSuffix(ranges[ranges.length - 1])
|
|
685
|
+
};
|
|
686
|
+
}
|
|
687
|
+
return null;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
module.exports = {
|
|
691
|
+
create: function (data, logger, id, currentStorate) {
|
|
692
|
+
return new DaqNode(data, logger, id, currentStorate);
|
|
693
|
+
},
|
|
694
|
+
checkRetention: checkRetention
|
|
695
|
+
};
|