@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,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'ethernetip': use nodePCCC a library that allows communication to certain Allen-Bradley PLCs -
|
|
3
|
+
* The SLC 500 series, Micrologix and ControlLogix/CompactLogix PLCs using PCCC embedded in Ethernet/IP
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
var EthernetIp;
|
|
8
|
+
const utils = require('../../utils');
|
|
9
|
+
const deviceUtils = require('../device-utils');
|
|
10
|
+
|
|
11
|
+
function EthernetIPclient(_data, _logger, _events) {
|
|
12
|
+
|
|
13
|
+
var data = JSON.parse(JSON.stringify(_data)); // Current Device data { id, name, tags, enabled, ... }
|
|
14
|
+
var logger = _logger;
|
|
15
|
+
var events = _events; // Events to commit change to runtime
|
|
16
|
+
var lastStatus = ''; // Last Device status
|
|
17
|
+
var working = false; // Working flag to manage overloading polling and connection
|
|
18
|
+
var conn = new EthernetIp;
|
|
19
|
+
var doneReading = false;
|
|
20
|
+
var doneWriting = false;
|
|
21
|
+
var overloading = 0; // Overloading counter to mange the break connection
|
|
22
|
+
var connected = false; // Connected flag
|
|
23
|
+
var itemsMap = {}; // Items Mapped Tag name with Item path to find for set value
|
|
24
|
+
var varsValue = []; // Signale to send to frontend { id, type, value }
|
|
25
|
+
var lastTimestampValue; // Last Timestamp of asked values
|
|
26
|
+
/**
|
|
27
|
+
* initialize the device type
|
|
28
|
+
*/
|
|
29
|
+
this.init = function (_type) {
|
|
30
|
+
console.error('Not supported!');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Connect to device
|
|
35
|
+
* Emit connection status to clients, clear all Tags values
|
|
36
|
+
*/
|
|
37
|
+
this.connect = function () {
|
|
38
|
+
return new Promise(function (resolve, reject) {
|
|
39
|
+
if (data.property && data.property.address) {
|
|
40
|
+
try {
|
|
41
|
+
if (_checkWorking(true)) {
|
|
42
|
+
logger.info(`'${data.name}' try to connect ${data.property.address}`, true);
|
|
43
|
+
_connect(function (err) {
|
|
44
|
+
if (err) {
|
|
45
|
+
logger.error(`'${data.name}' connect failed! ${err}`);
|
|
46
|
+
_emitStatus('connect-error');
|
|
47
|
+
_clearVarsValue();
|
|
48
|
+
reject();
|
|
49
|
+
} else {
|
|
50
|
+
connected = true;
|
|
51
|
+
conn.addItems(Object.keys(itemsMap));
|
|
52
|
+
logger.info(`'${data.name}' connected!`, true);
|
|
53
|
+
_emitStatus('connect-ok');
|
|
54
|
+
resolve();
|
|
55
|
+
}
|
|
56
|
+
_checkWorking(false);
|
|
57
|
+
});
|
|
58
|
+
} else {
|
|
59
|
+
reject();
|
|
60
|
+
_emitStatus('connect-error');
|
|
61
|
+
}
|
|
62
|
+
} catch (err) {
|
|
63
|
+
logger.error(`'${data.name}' try to connect error! ${err}`);
|
|
64
|
+
_checkWorking(false);
|
|
65
|
+
_emitStatus('connect-error');
|
|
66
|
+
_clearVarsValue();
|
|
67
|
+
reject();
|
|
68
|
+
}
|
|
69
|
+
} else {
|
|
70
|
+
logger.error(`'${data.name}' missing connection data!`);
|
|
71
|
+
_emitStatus('connect-failed');
|
|
72
|
+
_clearVarsValue();
|
|
73
|
+
reject();
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Disconnect the device
|
|
81
|
+
* Emit connection status to clients, clear all Tags values
|
|
82
|
+
*/
|
|
83
|
+
this.disconnect = function () {
|
|
84
|
+
return new Promise(function (resolve, reject) {
|
|
85
|
+
try {
|
|
86
|
+
if (conn && connected) {
|
|
87
|
+
conn.dropConnection(function (result) {
|
|
88
|
+
if (result) {
|
|
89
|
+
logger.error(`'${data.name}' try to disconnect failed!`);
|
|
90
|
+
} else {
|
|
91
|
+
logger.info(`'${data.name}' disconnected!`, true);
|
|
92
|
+
}
|
|
93
|
+
resolve(result);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
resolve(true);
|
|
97
|
+
} catch (err) {
|
|
98
|
+
if (err) {
|
|
99
|
+
logger.error(`'${data.name}' disconnect failure! ${err}`);
|
|
100
|
+
}
|
|
101
|
+
reject();
|
|
102
|
+
}
|
|
103
|
+
connected = false;
|
|
104
|
+
_checkWorking(false);
|
|
105
|
+
_emitStatus('connect-off');
|
|
106
|
+
_clearVarsValue();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Read values in polling mode
|
|
112
|
+
* Update the tags values list, save in DAQ if value changed or in interval and emit values to clients
|
|
113
|
+
*/
|
|
114
|
+
this.polling = async function () {
|
|
115
|
+
if (_checkWorking(true)) {
|
|
116
|
+
if (conn && connected) {
|
|
117
|
+
try {
|
|
118
|
+
_readValues().then(result => {
|
|
119
|
+
_checkWorking(false);
|
|
120
|
+
if (result) {
|
|
121
|
+
let varsValueChanged = _updateVarsValue(result);
|
|
122
|
+
lastTimestampValue = new Date().getTime();
|
|
123
|
+
_emitValues(varsValue);
|
|
124
|
+
if (this.addDaq && !utils.isEmptyObject(varsValueChanged)) {
|
|
125
|
+
this.addDaq(varsValueChanged, data.name, data.id);
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
// console.error('then error');
|
|
129
|
+
}
|
|
130
|
+
}, reason => {
|
|
131
|
+
logger.error(`'${data.name}' _readValues error! ${reason}`);
|
|
132
|
+
_checkWorking(false);
|
|
133
|
+
});
|
|
134
|
+
} catch (err) {
|
|
135
|
+
logger.error(`'${data.name}' polling error: ${err}`);
|
|
136
|
+
_checkWorking(false);
|
|
137
|
+
}
|
|
138
|
+
} else {
|
|
139
|
+
_checkWorking(false);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Load Tags attribute to read with polling
|
|
146
|
+
*/
|
|
147
|
+
this.load = function (_data) {
|
|
148
|
+
varsValue = [];
|
|
149
|
+
data = JSON.parse(JSON.stringify(_data));
|
|
150
|
+
try {
|
|
151
|
+
itemsMap = {};
|
|
152
|
+
var count = Object.keys(data.tags).length;
|
|
153
|
+
for (var id in data.tags) {
|
|
154
|
+
itemsMap[data.tags[id].address] = data.tags[id];
|
|
155
|
+
// if (!itemsMap[data.tags[id].address]) {
|
|
156
|
+
// itemsMap[data.tags[id].address] = [data.tags[id]];
|
|
157
|
+
// } else {
|
|
158
|
+
// itemsMap[data.tags[id].address].push(data.tags[id]);
|
|
159
|
+
// }
|
|
160
|
+
}
|
|
161
|
+
logger.info(`'${data.name}' data loaded (${count})`, true);
|
|
162
|
+
} catch (err) {
|
|
163
|
+
logger.error(`'${data.name}' load error! ${err}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Return Tags values array { id: <name>, value: <value> }
|
|
169
|
+
*/
|
|
170
|
+
this.getValues = function () {
|
|
171
|
+
return varsValue;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Return Tag value { id: <name>, value: <value>, ts: <lastTimestampValue> }
|
|
176
|
+
*/
|
|
177
|
+
this.getValue = function (id) {
|
|
178
|
+
if (varsValue[id]) {
|
|
179
|
+
return { id: id, value: varsValue[id].value, ts: lastTimestampValue };
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Return connection status 'connect-off', 'connect-ok', 'connect-error', 'connect-busy'
|
|
186
|
+
*/
|
|
187
|
+
this.getStatus = function () {
|
|
188
|
+
return lastStatus;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Return Tag property to show in frontend
|
|
193
|
+
*/
|
|
194
|
+
this.getTagProperty = function (tagid) {
|
|
195
|
+
if (data.tags[tagid]) {
|
|
196
|
+
return { id: tagid, name: data.tags[tagid].name, type: data.tags[tagid].type, format: data.tags[tagid].format };
|
|
197
|
+
} else {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Set the Tag value to device
|
|
204
|
+
* take the address from
|
|
205
|
+
*/
|
|
206
|
+
this.setValue = function (tagId, value) {
|
|
207
|
+
if (data.tags[tagId]) {
|
|
208
|
+
let valueToSend = deviceUtils.tagRawCalculator(value, data.tags[tagId]);
|
|
209
|
+
conn.writeItems([data.tags[tagId].address], [parseFloat(valueToSend)], (error) => {
|
|
210
|
+
if (error) {
|
|
211
|
+
logger.error(`'${data.tags[tagId].name}' setValue error! ${error}`);
|
|
212
|
+
} else {
|
|
213
|
+
logger.info(`'${data.tags[tagId].name}' setValue(${tagId}, ${valueToSend})`, true, true);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Return if device is connected
|
|
223
|
+
*/
|
|
224
|
+
this.isConnected = function () {
|
|
225
|
+
return connected;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Bind the DAQ store function
|
|
230
|
+
*/
|
|
231
|
+
this.bindAddDaq = function (fnc) {
|
|
232
|
+
this.addDaq = fnc; // Add the DAQ value to db history
|
|
233
|
+
}
|
|
234
|
+
this.addDaq = null;
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Return the timestamp of last read tag operation on polling
|
|
238
|
+
* @returns
|
|
239
|
+
*/
|
|
240
|
+
this.lastReadTimestamp = () => {
|
|
241
|
+
return lastTimestampValue;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Return the Daq settings of Tag
|
|
246
|
+
* @returns
|
|
247
|
+
*/
|
|
248
|
+
this.getTagDaqSettings = (tagId) => {
|
|
249
|
+
return data.tags[tagId] ? data.tags[tagId].daq : null;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Set Daq settings of Tag
|
|
254
|
+
* @returns
|
|
255
|
+
*/
|
|
256
|
+
this.setTagDaqSettings = (tagId, settings) => {
|
|
257
|
+
if (data.tags[tagId]) {
|
|
258
|
+
utils.mergeObjectsValues(data.tags[tagId].daq, settings);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Clear local Items value by set all to null
|
|
264
|
+
*/
|
|
265
|
+
var _clearVarsValue = function () {
|
|
266
|
+
for (var id in varsValue) {
|
|
267
|
+
varsValue[id].value = null;
|
|
268
|
+
}
|
|
269
|
+
if (varsValue.length) {
|
|
270
|
+
_emitValues(varsValue);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Read all values
|
|
276
|
+
*/
|
|
277
|
+
var _readValues = function () {
|
|
278
|
+
return new Promise((resolve, reject) => {
|
|
279
|
+
conn.readAllItems((err, items) => {
|
|
280
|
+
if (err) {
|
|
281
|
+
reject(err);
|
|
282
|
+
}
|
|
283
|
+
resolve(items);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Update the Tags values read
|
|
290
|
+
* @param {*} vars
|
|
291
|
+
*/
|
|
292
|
+
var _updateVarsValue = (vars) => {
|
|
293
|
+
const timestamp = new Date().getTime();
|
|
294
|
+
var changed = {};
|
|
295
|
+
Object.keys(itemsMap).forEach(key => {
|
|
296
|
+
if (!utils.isNullOrUndefined(vars[key])) {
|
|
297
|
+
var id = itemsMap[key].id;
|
|
298
|
+
var valueChanged = itemsMap[key].value !== vars[key];
|
|
299
|
+
itemsMap[key].rawValue = vars[key];
|
|
300
|
+
itemsMap[key].value = deviceUtils.tagValueCompose(vars[key], itemsMap[key]);
|
|
301
|
+
varsValue[id] = { id: id, value: itemsMap[key].value, type: itemsMap[key].type, daq: itemsMap[key].daq, changed: valueChanged, timestamp: timestamp };
|
|
302
|
+
if (this.addDaq && deviceUtils.tagDaqToSave(varsValue[id], timestamp)) {
|
|
303
|
+
changed[id] = varsValue[id];
|
|
304
|
+
}
|
|
305
|
+
varsValue[id].changed = false;
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
return changed;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Connect with RTU or TCP
|
|
313
|
+
*/
|
|
314
|
+
var _connect = function (callback) {
|
|
315
|
+
try {
|
|
316
|
+
var port = 44818;
|
|
317
|
+
var addr = data.property.address;
|
|
318
|
+
if (data.property.address.indexOf(':') !== -1) {
|
|
319
|
+
var addr = data.property.address.substring(0, data.property.address.indexOf(':'));
|
|
320
|
+
var temp = data.property.address.substring(data.property.address.indexOf(':') + 1);
|
|
321
|
+
port = parseInt(temp);
|
|
322
|
+
}
|
|
323
|
+
if (data.property.options) {
|
|
324
|
+
conn.initiateConnection({ port: port, host: addr, routing: [0x01, 0x00, data.property.rack, data.property.slot] }, callback);
|
|
325
|
+
} else {
|
|
326
|
+
conn.initiateConnection({ port: port, host: addr /* , routing: [0x01,0x00,0x01,0x00] */ }, callback);
|
|
327
|
+
}
|
|
328
|
+
} catch (err) {
|
|
329
|
+
callback(err);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Emit the PLC connection status
|
|
335
|
+
* @param {*} status
|
|
336
|
+
*/
|
|
337
|
+
var _emitStatus = function (status) {
|
|
338
|
+
lastStatus = status;
|
|
339
|
+
events.emit('device-status:changed', { id: data.id, status: status });
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Emit the webapi Tags values array { id: <name>, value: <value>, type: <type> }
|
|
344
|
+
* @param {*} values
|
|
345
|
+
*/
|
|
346
|
+
var _emitValues = function (values) {
|
|
347
|
+
events.emit('device-value:changed', { id: data.id, values: values });
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Used to manage the async connection and polling automation (that not overloading)
|
|
352
|
+
* @param {*} check
|
|
353
|
+
*/
|
|
354
|
+
var _checkWorking = function (check) {
|
|
355
|
+
if (check && working) {
|
|
356
|
+
overloading++;
|
|
357
|
+
logger.warn(`'${data.name}' working (connection || polling) overload! ${overloading}`);
|
|
358
|
+
// !The driver don't give the break connection
|
|
359
|
+
if (overloading >= 3) {
|
|
360
|
+
conn.dropConnection();
|
|
361
|
+
} else {
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
working = check;
|
|
366
|
+
overloading = 0;
|
|
367
|
+
return true;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
module.exports = {
|
|
372
|
+
init: function (settings) {
|
|
373
|
+
},
|
|
374
|
+
create: function (data, logger, events, manager) {
|
|
375
|
+
// To use with plugin
|
|
376
|
+
try { EthernetIp = require('nodepccc'); } catch { }
|
|
377
|
+
if (!EthernetIp && manager) { try { EthernetIp = manager.require('nodepccc'); } catch { } }
|
|
378
|
+
if (!EthernetIp) return null;
|
|
379
|
+
return new EthernetIPclient(data, logger, events);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'FuxaServer': FUXA as device to use with the scripts
|
|
3
|
+
*/
|
|
4
|
+
'use strict';
|
|
5
|
+
|
|
6
|
+
const utils = require('../../utils');
|
|
7
|
+
const deviceUtils = require('../device-utils');
|
|
8
|
+
|
|
9
|
+
function FuxaServer(_data, _logger, _events) {
|
|
10
|
+
|
|
11
|
+
var data = JSON.parse(JSON.stringify(_data)); // Current Device data { id, name, tags, enabled, ... }
|
|
12
|
+
var logger = _logger;
|
|
13
|
+
var working = false; // Working flag to manage overloading polling and connection
|
|
14
|
+
var events = _events; // Events to commit change to runtime
|
|
15
|
+
var varsValue = {}; // Tags to send to frontend { id, type, value }
|
|
16
|
+
var lastTimestampValue; // Last Timestamp of values
|
|
17
|
+
var tagsMap = {}; // Map of tag id
|
|
18
|
+
var overloading = 0; // Overloading counter to mange the break connection
|
|
19
|
+
var tocheck = false; // Flag that define if there are tags to check by polling
|
|
20
|
+
var connectionTags = []; // Tags of connection status of devices
|
|
21
|
+
var type;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* initialize the server device type
|
|
25
|
+
*/
|
|
26
|
+
this.init = function (_type) {
|
|
27
|
+
type = _type;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Connected with itself
|
|
32
|
+
*/
|
|
33
|
+
this.connect = function () {
|
|
34
|
+
return new Promise(async function (resolve, reject) {
|
|
35
|
+
resolve();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Disconnect with itself
|
|
42
|
+
* Clear all Tags values
|
|
43
|
+
*/
|
|
44
|
+
this.disconnect = function () {
|
|
45
|
+
return new Promise(function (resolve, reject) {
|
|
46
|
+
_clearVarsValue();
|
|
47
|
+
resolve(true);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Read values in polling mode
|
|
53
|
+
* Update the tags values list, save in DAQ if value changed or in interval and emit values to clients
|
|
54
|
+
*/
|
|
55
|
+
this.polling = async function () {
|
|
56
|
+
if (_checkWorking(true)) {
|
|
57
|
+
try {
|
|
58
|
+
if (tocheck) {
|
|
59
|
+
var varsValueChanged = _checkVarsChanged();
|
|
60
|
+
lastTimestampValue = new Date().getTime();
|
|
61
|
+
_emitValues(varsValue);
|
|
62
|
+
if (this.addDaq && !utils.isEmptyObject(varsValueChanged)) {
|
|
63
|
+
this.addDaq(varsValueChanged, data.name, data.id);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
_checkConnectionStatus();
|
|
67
|
+
} catch (err) {
|
|
68
|
+
logger.error(`'${data.name}' polling error: ${err}`);
|
|
69
|
+
}
|
|
70
|
+
_checkWorking(false);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Load Tags attribute to read with polling
|
|
76
|
+
*/
|
|
77
|
+
this.load = function (_data) {
|
|
78
|
+
varsValue = [];
|
|
79
|
+
data = JSON.parse(JSON.stringify(_data));
|
|
80
|
+
tagsMap = {};
|
|
81
|
+
var count = Object.keys(data.tags).length;
|
|
82
|
+
connectionTags = [];
|
|
83
|
+
for (var id in data.tags) {
|
|
84
|
+
tagsMap[id] = data.tags[id];
|
|
85
|
+
const dataTag = data.tags[id];
|
|
86
|
+
if (dataTag.init) {
|
|
87
|
+
data.tags[id].value = _parseValue(dataTag.init, dataTag.type);
|
|
88
|
+
}
|
|
89
|
+
if (dataTag.sysType === TagSystemTypeEnum.deviceConnectionStatus) {
|
|
90
|
+
data.tags[id].timestamp = Date.now();
|
|
91
|
+
connectionTags.push(data.tags[id]);
|
|
92
|
+
}
|
|
93
|
+
varsValue[id] = data.tags[id];
|
|
94
|
+
}
|
|
95
|
+
tocheck = !utils.isEmptyObject(data.tags);
|
|
96
|
+
logger.info(`'${data.name}' data loaded (${count})`, true);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Return Tags values array { id: <tagId>, value: <value> }
|
|
101
|
+
*/
|
|
102
|
+
this.getValues = function () {
|
|
103
|
+
return data.tags;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Return Tag value { id: <tagId>, value: <value>, ts: <lastTimestampValue> }
|
|
108
|
+
*/
|
|
109
|
+
this.getValue = function (id) {
|
|
110
|
+
if (varsValue[id]) {
|
|
111
|
+
return { id: id, value: varsValue[id].value, ts: lastTimestampValue };
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Return connection status FUXA server is always connected, 'connect-ok'
|
|
118
|
+
*/
|
|
119
|
+
this.getStatus = function () {
|
|
120
|
+
return 'connect-ok';
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Return Tag property to show in frontend
|
|
125
|
+
*/
|
|
126
|
+
this.getTagProperty = function (id) {
|
|
127
|
+
if (data.tags[id]) {
|
|
128
|
+
return { id: id, name: data.tags[id].name, type: data.tags[id].type, format: data.tags[id].format };
|
|
129
|
+
} else {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Set the Tag value to device
|
|
136
|
+
*/
|
|
137
|
+
this.setValue = function (id, value) {
|
|
138
|
+
if (varsValue[id]) {
|
|
139
|
+
var val = _parseValue(value, varsValue[id].type);
|
|
140
|
+
varsValue[id].value = val;
|
|
141
|
+
varsValue[id].changed = true;
|
|
142
|
+
logger.info(`'${data.name}' setValue(${id}, ${value})`, true, true);
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Set the connection status to tag of device sttus
|
|
150
|
+
* @param {*} deviceId
|
|
151
|
+
* @param {*} status
|
|
152
|
+
*/
|
|
153
|
+
this.setConnectionStatus = function(deviceId, status) {
|
|
154
|
+
var tag = connectionTags.find(tag => tag.memaddress === deviceId);
|
|
155
|
+
if (tag) {
|
|
156
|
+
tag.value = status;
|
|
157
|
+
tag.timestamp = Date.now();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Return connected with itself
|
|
163
|
+
*/
|
|
164
|
+
this.isConnected = function () {
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Bind the DAQ store function
|
|
170
|
+
*/
|
|
171
|
+
this.bindAddDaq = function (fnc) {
|
|
172
|
+
this.addDaq = fnc; // Add the DAQ value to db history
|
|
173
|
+
}
|
|
174
|
+
this.addDaq = null;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Return the timestamp of last read tag operation on polling
|
|
178
|
+
* @returns
|
|
179
|
+
*/
|
|
180
|
+
this.lastReadTimestamp = () => {
|
|
181
|
+
return lastTimestampValue;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Return the Daq settings of Tag
|
|
186
|
+
* @returns
|
|
187
|
+
*/
|
|
188
|
+
this.getTagDaqSettings = (tagId) => {
|
|
189
|
+
return data.tags[tagId] ? data.tags[tagId].daq : null;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Set Daq settings of Tag
|
|
194
|
+
* @returns
|
|
195
|
+
*/
|
|
196
|
+
this.setTagDaqSettings = (tagId, settings) => {
|
|
197
|
+
if (data.tags[tagId]) {
|
|
198
|
+
utils.mergeObjectsValues(data.tags[tagId].daq, settings);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Cheack and parse the value return converted value
|
|
204
|
+
* @param {*} value as string
|
|
205
|
+
*/
|
|
206
|
+
var _parseValue = function (value, type) {
|
|
207
|
+
if (type === 'number') {
|
|
208
|
+
return parseFloat(value);
|
|
209
|
+
} else if (type === 'boolean') {
|
|
210
|
+
if (typeof value === 'string') {
|
|
211
|
+
return value.toLowerCase() !== 'false';
|
|
212
|
+
}
|
|
213
|
+
return Boolean(value);
|
|
214
|
+
} else if (type === 'string') {
|
|
215
|
+
return value;
|
|
216
|
+
} else {
|
|
217
|
+
let val = parseFloat(value);
|
|
218
|
+
if (Number.isNaN(val)) {
|
|
219
|
+
// maybe boolean
|
|
220
|
+
val = Number(value);
|
|
221
|
+
// maybe string
|
|
222
|
+
if (Number.isNaN(val)) {
|
|
223
|
+
val = value;
|
|
224
|
+
}
|
|
225
|
+
} else {
|
|
226
|
+
val = parseFloat(val.toFixed(5));
|
|
227
|
+
}
|
|
228
|
+
return val;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Clear Tags value
|
|
234
|
+
*/
|
|
235
|
+
var _clearVarsValue = function () {
|
|
236
|
+
for (var id in varsValue) {
|
|
237
|
+
varsValue[id].value = null;
|
|
238
|
+
}
|
|
239
|
+
_emitValues(varsValue);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Return the Tags that have value changed and clear value changed flag of all Tags
|
|
244
|
+
*/
|
|
245
|
+
var _checkVarsChanged = () => {
|
|
246
|
+
const timestamp = new Date().getTime();
|
|
247
|
+
var result = {};
|
|
248
|
+
for (var id in data.tags) {
|
|
249
|
+
if (!utils.isNullOrUndefined(data.tags[id].value)) {
|
|
250
|
+
data.tags[id].value = deviceUtils.tagValueCompose(data.tags[id].value, data.tags[id]);
|
|
251
|
+
data.tags[id].timestamp = timestamp;
|
|
252
|
+
if (this.addDaq && deviceUtils.tagDaqToSave(data.tags[id], timestamp)) {
|
|
253
|
+
result[id] = data.tags[id];
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
data.tags[id].changed = false;
|
|
257
|
+
varsValue[id] = data.tags[id];
|
|
258
|
+
}
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Emit the Tags values array { id: <name>, value: <value>, type: <type> }
|
|
263
|
+
* @param {*} values
|
|
264
|
+
*/
|
|
265
|
+
var _emitValues = function (values) {
|
|
266
|
+
events.emit('device-value:changed', { id: data.name, values: values });
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Used to manage the async connection and polling automation (that not overloading)
|
|
271
|
+
* @param {*} check
|
|
272
|
+
*/
|
|
273
|
+
var _checkWorking = function (check) {
|
|
274
|
+
if (check && working) {
|
|
275
|
+
overloading++;
|
|
276
|
+
logger.warn(`'${data.name}' working (connection || polling) overload! ${overloading}`);
|
|
277
|
+
// !The driver don't give the break connection
|
|
278
|
+
if (overloading >= 3) {
|
|
279
|
+
disconnect();
|
|
280
|
+
} else {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
working = check;
|
|
285
|
+
overloading = 0;
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
var _checkConnectionStatus = function () {
|
|
290
|
+
var dt = Date.now() - 60000;
|
|
291
|
+
connectionTags.forEach(tag => {
|
|
292
|
+
if (tag.value && tag.timestamp < dt) {
|
|
293
|
+
tag.value = 0;
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
module.exports = {
|
|
301
|
+
init: function (settings) {
|
|
302
|
+
},
|
|
303
|
+
create: function (data, logger, events) {
|
|
304
|
+
return new FuxaServer(data, logger, events);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
var TagSystemTypeEnum = {
|
|
309
|
+
deviceConnectionStatus: 1,
|
|
310
|
+
}
|