@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.
Files changed (414) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/_images/Pipes/P1.svg +39 -0
  4. package/_images/Tanks/Fl.svg +7 -0
  5. package/api/alarms/index.js +132 -0
  6. package/api/auth/index.js +71 -0
  7. package/api/command/index.js +187 -0
  8. package/api/daq/index.js +79 -0
  9. package/api/diagnose/index.js +163 -0
  10. package/api/index.js +181 -0
  11. package/api/jwt-helper.js +106 -0
  12. package/api/plugins/index.js +109 -0
  13. package/api/projects/index.js +229 -0
  14. package/api/resources/index.js +118 -0
  15. package/api/scripts/index.js +82 -0
  16. package/api/users/index.js +109 -0
  17. package/dist/3rdpartylicenses.txt +1477 -0
  18. package/dist/Quicksand-Bold.071154c292aef0b8.woff +0 -0
  19. package/dist/Quicksand-Bold.6383d6475ed5c40f.woff2 +0 -0
  20. package/dist/Quicksand-Bold.f07d467887f9cfab.ttf +0 -0
  21. package/dist/Quicksand-Medium.0982a651e8d4315f.woff +0 -0
  22. package/dist/Quicksand-Medium.9d2733fbfb9b1be8.ttf +0 -0
  23. package/dist/Quicksand-Medium.b09302365c586eb2.woff2 +0 -0
  24. package/dist/Quicksand-Regular.16adf9eecd267273.woff +0 -0
  25. package/dist/Quicksand-Regular.78819724f6aeff59.woff2 +0 -0
  26. package/dist/Quicksand-Regular.8829564f0e14bf76.ttf +0 -0
  27. package/dist/assets/fonts/icomoon.eot +0 -0
  28. package/dist/assets/fonts/icomoon.svg +19 -0
  29. package/dist/assets/fonts/icomoon.ttf +0 -0
  30. package/dist/assets/fonts/icomoon.woff +0 -0
  31. package/dist/assets/fonts/myicons.eot +0 -0
  32. package/dist/assets/fonts/myicons.svg +19 -0
  33. package/dist/assets/fonts/myicons.ttf +0 -0
  34. package/dist/assets/fonts/myicons.woff +0 -0
  35. package/dist/assets/fonts/quicksand-bold/Quicksand-Bold.ttf +0 -0
  36. package/dist/assets/fonts/quicksand-bold/Quicksand-Bold.woff +0 -0
  37. package/dist/assets/fonts/quicksand-bold/Quicksand-Bold.woff2 +0 -0
  38. package/dist/assets/fonts/quicksand-medium/Quicksand-Medium.ttf +0 -0
  39. package/dist/assets/fonts/quicksand-medium/Quicksand-Medium.woff +0 -0
  40. package/dist/assets/fonts/quicksand-medium/Quicksand-Medium.woff2 +0 -0
  41. package/dist/assets/fonts/quicksand-regular/Quicksand-Regular.ttf +0 -0
  42. package/dist/assets/fonts/quicksand-regular/Quicksand-Regular.woff +0 -0
  43. package/dist/assets/fonts/quicksand-regular/Quicksand-Regular.woff2 +0 -0
  44. package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.svg +10486 -0
  45. package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.ttf +0 -0
  46. package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.woff +0 -0
  47. package/dist/assets/fonts/roboto-bold/roboto-bold-webfont.woff2 +0 -0
  48. package/dist/assets/fonts/roboto-light/roboto-light-webfont.svg +9998 -0
  49. package/dist/assets/fonts/roboto-light/roboto-light-webfont.ttf +0 -0
  50. package/dist/assets/fonts/roboto-light/roboto-light-webfont.woff +0 -0
  51. package/dist/assets/fonts/roboto-light/roboto-light-webfont.woff2 +0 -0
  52. package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.svg +10487 -0
  53. package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.ttf +0 -0
  54. package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.woff +0 -0
  55. package/dist/assets/fonts/roboto-medium/roboto-medium-webfont.woff2 +0 -0
  56. package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.svg +10004 -0
  57. package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.ttf +0 -0
  58. package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.woff +0 -0
  59. package/dist/assets/fonts/roboto-regular/roboto-regular-webfont.woff2 +0 -0
  60. package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.svg +10012 -0
  61. package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.ttf +0 -0
  62. package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.woff +0 -0
  63. package/dist/assets/fonts/roboto-thin/roboto-thin-webfont.woff2 +0 -0
  64. package/dist/assets/i18n/de.json +1308 -0
  65. package/dist/assets/i18n/en.json +1438 -0
  66. package/dist/assets/i18n/es.json +777 -0
  67. package/dist/assets/i18n/fr.json +1129 -0
  68. package/dist/assets/i18n/ko.json +774 -0
  69. package/dist/assets/i18n/pt.json +657 -0
  70. package/dist/assets/i18n/ru.json +1228 -0
  71. package/dist/assets/i18n/tr.json +673 -0
  72. package/dist/assets/i18n/ua.json +614 -0
  73. package/dist/assets/i18n/zh-cn.json +1252 -0
  74. package/dist/assets/images/align-bottom.svg +88 -0
  75. package/dist/assets/images/align-center.svg +86 -0
  76. package/dist/assets/images/align-left.svg +86 -0
  77. package/dist/assets/images/align-middle.svg +88 -0
  78. package/dist/assets/images/align-right.svg +88 -0
  79. package/dist/assets/images/align-top.svg +88 -0
  80. package/dist/assets/images/bag.svg +115 -0
  81. package/dist/assets/images/button.svg +22 -0
  82. package/dist/assets/images/chart.svg +17 -0
  83. package/dist/assets/images/circle.svg +84 -0
  84. package/dist/assets/images/compressor-a.svg +2 -0
  85. package/dist/assets/images/editvalue.svg +14 -0
  86. package/dist/assets/images/ellipse.svg +84 -0
  87. package/dist/assets/images/flip-orizontal.svg +86 -0
  88. package/dist/assets/images/flip-vertical.svg +82 -0
  89. package/dist/assets/images/gauge-donut.png +0 -0
  90. package/dist/assets/images/gauge-mat.png +0 -0
  91. package/dist/assets/images/gauge-zone.png +0 -0
  92. package/dist/assets/images/graphbar.svg +18 -0
  93. package/dist/assets/images/group.svg +91 -0
  94. package/dist/assets/images/iframe.svg +54 -0
  95. package/dist/assets/images/image.svg +95 -0
  96. package/dist/assets/images/led-circle.svg +77 -0
  97. package/dist/assets/images/line.svg +86 -0
  98. package/dist/assets/images/linecap-butt.svg +77 -0
  99. package/dist/assets/images/linecap-round.svg +77 -0
  100. package/dist/assets/images/linecap-square.svg +82 -0
  101. package/dist/assets/images/linejoin-bevel.svg +77 -0
  102. package/dist/assets/images/linejoin-miter.svg +77 -0
  103. package/dist/assets/images/linejoin-round.svg +77 -0
  104. package/dist/assets/images/logo.svg +18 -0
  105. package/dist/assets/images/path.svg +100 -0
  106. package/dist/assets/images/pencil.svg +98 -0
  107. package/dist/assets/images/pipe.svg +15 -0
  108. package/dist/assets/images/progress-v.svg +79 -0
  109. package/dist/assets/images/rect.svg +84 -0
  110. package/dist/assets/images/select-pointer.svg +93 -0
  111. package/dist/assets/images/selectvalue.svg +14 -0
  112. package/dist/assets/images/semaphore.svg +19 -0
  113. package/dist/assets/images/slider.svg +17 -0
  114. package/dist/assets/images/switch.svg +15 -0
  115. package/dist/assets/images/table.svg +55 -0
  116. package/dist/assets/images/text.svg +294 -0
  117. package/dist/assets/images/to-bottom.svg +163 -0
  118. package/dist/assets/images/to-path.svg +94 -0
  119. package/dist/assets/images/to-top.svg +163 -0
  120. package/dist/assets/images/to_top.svg +88 -0
  121. package/dist/assets/images/todelete.svg +13 -0
  122. package/dist/assets/images/ungroup.svg +108 -0
  123. package/dist/assets/images/value.svg +81 -0
  124. package/dist/assets/images/valve-a.svg +2 -0
  125. package/dist/assets/images/webcam.svg +16 -0
  126. package/dist/assets/lib/ext-styles.css +28 -0
  127. package/dist/assets/lib/gauge/gauge.js +988 -0
  128. package/dist/assets/lib/gauge/gauge.min.js +1 -0
  129. package/dist/assets/lib/nouislider/nouislider.min.css +1 -0
  130. package/dist/assets/lib/nouislider/nouislider.min.js +1 -0
  131. package/dist/assets/lib/numeral/locales.min.js +7 -0
  132. package/dist/assets/lib/numeral/numeral.min.js +8 -0
  133. package/dist/assets/lib/pdfkit-table/index.js +967 -0
  134. package/dist/assets/lib/svg/raphael.min.js +1 -0
  135. package/dist/assets/lib/svg/svg.js +5573 -0
  136. package/dist/assets/lib/svg/svg.min.js +13 -0
  137. package/dist/assets/lib/svgeditor/extensions/ext-bundle.min.js +1 -0
  138. package/dist/assets/lib/svgeditor/extensions/ext-html_button.min.css +1 -0
  139. package/dist/assets/lib/svgeditor/fuxa-editor.min.js +23 -0
  140. package/dist/assets/lib/svgeditor/jquery-plugin.min.css +2 -0
  141. package/dist/assets/lib/svgeditor/jquery-plugin.min.js +52 -0
  142. package/dist/assets/lib/svgeditor/jquery-ui-1.8.17.custom.min.js +54 -0
  143. package/dist/assets/lib/svgeditor/jquery.min.js +4 -0
  144. package/dist/assets/lib/svgeditor/shapes/ape-shapes.js +39 -0
  145. package/dist/assets/lib/svgeditor/shapes/img/agitator-disc.svg +17 -0
  146. package/dist/assets/lib/svgeditor/shapes/img/agitator-paddle.svg +16 -0
  147. package/dist/assets/lib/svgeditor/shapes/img/agitator-prop.svg +15 -0
  148. package/dist/assets/lib/svgeditor/shapes/img/agitator-turbo.svg +19 -0
  149. package/dist/assets/lib/svgeditor/shapes/img/anim-eli.svg +13 -0
  150. package/dist/assets/lib/svgeditor/shapes/img/anim-piston.svg +14 -0
  151. package/dist/assets/lib/svgeditor/shapes/img/centrifugal.svg +68 -0
  152. package/dist/assets/lib/svgeditor/shapes/img/centrifugal1.svg +67 -0
  153. package/dist/assets/lib/svgeditor/shapes/img/centrifuge1.svg +67 -0
  154. package/dist/assets/lib/svgeditor/shapes/img/centrifuge2.svg +16 -0
  155. package/dist/assets/lib/svgeditor/shapes/img/centrifuge3.svg +16 -0
  156. package/dist/assets/lib/svgeditor/shapes/img/centrifuge4.svg +16 -0
  157. package/dist/assets/lib/svgeditor/shapes/img/compair.svg +92 -0
  158. package/dist/assets/lib/svgeditor/shapes/img/compdiaph.svg +16 -0
  159. package/dist/assets/lib/svgeditor/shapes/img/compejector.svg +16 -0
  160. package/dist/assets/lib/svgeditor/shapes/img/compreci.svg +17 -0
  161. package/dist/assets/lib/svgeditor/shapes/img/compreci2.svg +68 -0
  162. package/dist/assets/lib/svgeditor/shapes/img/compressor-fan.svg +18 -0
  163. package/dist/assets/lib/svgeditor/shapes/img/compressor-piston.svg +16 -0
  164. package/dist/assets/lib/svgeditor/shapes/img/compressor-void.svg +16 -0
  165. package/dist/assets/lib/svgeditor/shapes/img/compring.svg +72 -0
  166. package/dist/assets/lib/svgeditor/shapes/img/compring2.svg +72 -0
  167. package/dist/assets/lib/svgeditor/shapes/img/comprotary.svg +16 -0
  168. package/dist/assets/lib/svgeditor/shapes/img/comprotary2.svg +18 -0
  169. package/dist/assets/lib/svgeditor/shapes/img/compscrew.svg +16 -0
  170. package/dist/assets/lib/svgeditor/shapes/img/compsilence.svg +20 -0
  171. package/dist/assets/lib/svgeditor/shapes/img/compturbo.svg +72 -0
  172. package/dist/assets/lib/svgeditor/shapes/img/crusher1.svg +16 -0
  173. package/dist/assets/lib/svgeditor/shapes/img/crusher2.svg +16 -0
  174. package/dist/assets/lib/svgeditor/shapes/img/crusher3.svg +16 -0
  175. package/dist/assets/lib/svgeditor/shapes/img/crusher4.svg +17 -0
  176. package/dist/assets/lib/svgeditor/shapes/img/crusher5.svg +18 -0
  177. package/dist/assets/lib/svgeditor/shapes/img/crusher6.svg +16 -0
  178. package/dist/assets/lib/svgeditor/shapes/img/crusher7.svg +21 -0
  179. package/dist/assets/lib/svgeditor/shapes/img/diaph.svg +16 -0
  180. package/dist/assets/lib/svgeditor/shapes/img/drier1.svg +63 -0
  181. package/dist/assets/lib/svgeditor/shapes/img/drier2.svg +17 -0
  182. package/dist/assets/lib/svgeditor/shapes/img/drier3.svg +23 -0
  183. package/dist/assets/lib/svgeditor/shapes/img/drier4.svg +18 -0
  184. package/dist/assets/lib/svgeditor/shapes/img/drier5.svg +16 -0
  185. package/dist/assets/lib/svgeditor/shapes/img/exchanger-filter.svg +16 -0
  186. package/dist/assets/lib/svgeditor/shapes/img/exchanger-heat.svg +16 -0
  187. package/dist/assets/lib/svgeditor/shapes/img/exchanger-tube.svg +16 -0
  188. package/dist/assets/lib/svgeditor/shapes/img/exchanger1.svg +67 -0
  189. package/dist/assets/lib/svgeditor/shapes/img/exchanger2.svg +16 -0
  190. package/dist/assets/lib/svgeditor/shapes/img/exchanger3.svg +15 -0
  191. package/dist/assets/lib/svgeditor/shapes/img/exchanger4.svg +15 -0
  192. package/dist/assets/lib/svgeditor/shapes/img/exchanger5.svg +16 -0
  193. package/dist/assets/lib/svgeditor/shapes/img/exchanger6.svg +71 -0
  194. package/dist/assets/lib/svgeditor/shapes/img/exchanger7.svg +16 -0
  195. package/dist/assets/lib/svgeditor/shapes/img/exchanger8.svg +16 -0
  196. package/dist/assets/lib/svgeditor/shapes/img/exchanger9.svg +16 -0
  197. package/dist/assets/lib/svgeditor/shapes/img/feeder.svg +17 -0
  198. package/dist/assets/lib/svgeditor/shapes/img/feeder2.svg +16 -0
  199. package/dist/assets/lib/svgeditor/shapes/img/feeder3.svg +63 -0
  200. package/dist/assets/lib/svgeditor/shapes/img/filter2.svg +68 -0
  201. package/dist/assets/lib/svgeditor/shapes/img/filter3.svg +17 -0
  202. package/dist/assets/lib/svgeditor/shapes/img/fitting1.svg +67 -0
  203. package/dist/assets/lib/svgeditor/shapes/img/fitting10.svg +16 -0
  204. package/dist/assets/lib/svgeditor/shapes/img/fitting11.svg +17 -0
  205. package/dist/assets/lib/svgeditor/shapes/img/fitting12.svg +16 -0
  206. package/dist/assets/lib/svgeditor/shapes/img/fitting13.svg +15 -0
  207. package/dist/assets/lib/svgeditor/shapes/img/fitting2.svg +15 -0
  208. package/dist/assets/lib/svgeditor/shapes/img/fitting3.svg +17 -0
  209. package/dist/assets/lib/svgeditor/shapes/img/fitting4.svg +16 -0
  210. package/dist/assets/lib/svgeditor/shapes/img/fitting5.svg +16 -0
  211. package/dist/assets/lib/svgeditor/shapes/img/fitting6.svg +16 -0
  212. package/dist/assets/lib/svgeditor/shapes/img/fitting7.svg +15 -0
  213. package/dist/assets/lib/svgeditor/shapes/img/fitting8.svg +15 -0
  214. package/dist/assets/lib/svgeditor/shapes/img/fitting9.svg +15 -0
  215. package/dist/assets/lib/svgeditor/shapes/img/misc1.svg +75 -0
  216. package/dist/assets/lib/svgeditor/shapes/img/misc2.svg +71 -0
  217. package/dist/assets/lib/svgeditor/shapes/img/misc3.svg +15 -0
  218. package/dist/assets/lib/svgeditor/shapes/img/misc4.svg +16 -0
  219. package/dist/assets/lib/svgeditor/shapes/img/misc5.svg +16 -0
  220. package/dist/assets/lib/svgeditor/shapes/img/misc6.svg +15 -0
  221. package/dist/assets/lib/svgeditor/shapes/img/misc7.svg +64 -0
  222. package/dist/assets/lib/svgeditor/shapes/img/misc8.svg +15 -0
  223. package/dist/assets/lib/svgeditor/shapes/img/motor-simb.svg +17 -0
  224. package/dist/assets/lib/svgeditor/shapes/img/nozzle.svg +15 -0
  225. package/dist/assets/lib/svgeditor/shapes/img/nozzle2.svg +15 -0
  226. package/dist/assets/lib/svgeditor/shapes/img/pipi1.svg +16 -0
  227. package/dist/assets/lib/svgeditor/shapes/img/pipi2.svg +17 -0
  228. package/dist/assets/lib/svgeditor/shapes/img/pipi3.svg +15 -0
  229. package/dist/assets/lib/svgeditor/shapes/img/pipi4.svg +15 -0
  230. package/dist/assets/lib/svgeditor/shapes/img/pipi5.svg +16 -0
  231. package/dist/assets/lib/svgeditor/shapes/img/pipi6.svg +15 -0
  232. package/dist/assets/lib/svgeditor/shapes/img/pipi7.svg +16 -0
  233. package/dist/assets/lib/svgeditor/shapes/img/pumpblower.svg +76 -0
  234. package/dist/assets/lib/svgeditor/shapes/img/pumpcentri1.svg +64 -0
  235. package/dist/assets/lib/svgeditor/shapes/img/pumpcentri2.svg +64 -0
  236. package/dist/assets/lib/svgeditor/shapes/img/pumpfeed.svg +64 -0
  237. package/dist/assets/lib/svgeditor/shapes/img/pumpgear.svg +18 -0
  238. package/dist/assets/lib/svgeditor/shapes/img/pumpgear2.svg +19 -0
  239. package/dist/assets/lib/svgeditor/shapes/img/pumphidra.svg +68 -0
  240. package/dist/assets/lib/svgeditor/shapes/img/pumphorizo.svg +68 -0
  241. package/dist/assets/lib/svgeditor/shapes/img/pumpjet.svg +68 -0
  242. package/dist/assets/lib/svgeditor/shapes/img/pumpperis.svg +20 -0
  243. package/dist/assets/lib/svgeditor/shapes/img/pumpscreew.svg +17 -0
  244. package/dist/assets/lib/svgeditor/shapes/img/pumpscreew2.svg +72 -0
  245. package/dist/assets/lib/svgeditor/shapes/img/pumpturbi.svg +64 -0
  246. package/dist/assets/lib/svgeditor/shapes/img/pumpvacuum.svg +72 -0
  247. package/dist/assets/lib/svgeditor/shapes/img/shape-arrow.svg +13 -0
  248. package/dist/assets/lib/svgeditor/shapes/img/shape-circle.svg +13 -0
  249. package/dist/assets/lib/svgeditor/shapes/img/shape-circleindi.svg +13 -0
  250. package/dist/assets/lib/svgeditor/shapes/img/shape-cloud.svg +63 -0
  251. package/dist/assets/lib/svgeditor/shapes/img/shape-cone.svg +71 -0
  252. package/dist/assets/lib/svgeditor/shapes/img/shape-corner.svg +15 -0
  253. package/dist/assets/lib/svgeditor/shapes/img/shape-cross.svg +15 -0
  254. package/dist/assets/lib/svgeditor/shapes/img/shape-cylinder.svg +71 -0
  255. package/dist/assets/lib/svgeditor/shapes/img/shape-delay.svg +13 -0
  256. package/dist/assets/lib/svgeditor/shapes/img/shape-diamond.svg +13 -0
  257. package/dist/assets/lib/svgeditor/shapes/img/shape-display.svg +15 -0
  258. package/dist/assets/lib/svgeditor/shapes/img/shape-docu.svg +15 -0
  259. package/dist/assets/lib/svgeditor/shapes/img/shape-doublearrow.svg +13 -0
  260. package/dist/assets/lib/svgeditor/shapes/img/shape-drop.svg +15 -0
  261. package/dist/assets/lib/svgeditor/shapes/img/shape-halfcircle.svg +13 -0
  262. package/dist/assets/lib/svgeditor/shapes/img/shape-heart.svg +15 -0
  263. package/dist/assets/lib/svgeditor/shapes/img/shape-looplimit.svg +13 -0
  264. package/dist/assets/lib/svgeditor/shapes/img/shape-maninput.svg +15 -0
  265. package/dist/assets/lib/svgeditor/shapes/img/shape-nosymbol.svg +15 -0
  266. package/dist/assets/lib/svgeditor/shapes/img/shape-octagon.svg +15 -0
  267. package/dist/assets/lib/svgeditor/shapes/img/shape-offpage.svg +13 -0
  268. package/dist/assets/lib/svgeditor/shapes/img/shape-or.svg +15 -0
  269. package/dist/assets/lib/svgeditor/shapes/img/shape-or2.svg +17 -0
  270. package/dist/assets/lib/svgeditor/shapes/img/shape-parallelogram.svg +15 -0
  271. package/dist/assets/lib/svgeditor/shapes/img/shape-pentagon.svg +15 -0
  272. package/dist/assets/lib/svgeditor/shapes/img/shape-poval.svg +15 -0
  273. package/dist/assets/lib/svgeditor/shapes/img/shape-prepara.svg +13 -0
  274. package/dist/assets/lib/svgeditor/shapes/img/shape-rectangle.svg +13 -0
  275. package/dist/assets/lib/svgeditor/shapes/img/shape-rectindi.svg +16 -0
  276. package/dist/assets/lib/svgeditor/shapes/img/shape-star4.svg +15 -0
  277. package/dist/assets/lib/svgeditor/shapes/img/shape-switch.svg +15 -0
  278. package/dist/assets/lib/svgeditor/shapes/img/shape-tape.svg +15 -0
  279. package/dist/assets/lib/svgeditor/shapes/img/shape-tee.svg +63 -0
  280. package/dist/assets/lib/svgeditor/shapes/img/shape-ticket.svg +13 -0
  281. package/dist/assets/lib/svgeditor/shapes/img/shape-trape.svg +13 -0
  282. package/dist/assets/lib/svgeditor/shapes/img/shape-triangle.svg +13 -0
  283. package/dist/assets/lib/svgeditor/shapes/img/shape-vor.svg +14 -0
  284. package/dist/assets/lib/svgeditor/shapes/img/tank1.svg +63 -0
  285. package/dist/assets/lib/svgeditor/shapes/img/tank2.svg +15 -0
  286. package/dist/assets/lib/svgeditor/shapes/img/tank3.svg +15 -0
  287. package/dist/assets/lib/svgeditor/shapes/img/tank4.svg +15 -0
  288. package/dist/assets/lib/svgeditor/shapes/img/tank5.svg +15 -0
  289. package/dist/assets/lib/svgeditor/shapes/img/tank6.svg +68 -0
  290. package/dist/assets/lib/svgeditor/shapes/img/tank7.svg +15 -0
  291. package/dist/assets/lib/svgeditor/shapes/img/tank8.svg +15 -0
  292. package/dist/assets/lib/svgeditor/shapes/img/tank9.svg +21 -0
  293. package/dist/assets/lib/svgeditor/shapes/img/valve-ax.svg +13 -0
  294. package/dist/assets/lib/svgeditor/shapes/img/valve-bx.svg +13 -0
  295. package/dist/assets/lib/svgeditor/shapes/img/valve-cx.svg +13 -0
  296. package/dist/assets/lib/svgeditor/shapes/img/webcam.svg +6 -0
  297. package/dist/assets/lib/svgeditor/shapes/my-shapes.js +178 -0
  298. package/dist/assets/lib/svgeditor/shapes/proc-comp-shapes.js +105 -0
  299. package/dist/assets/lib/svgeditor/shapes/proc-general-shapes.js +60 -0
  300. package/dist/assets/lib/svgeditor/shapes/proc-pumps-shapes.js +112 -0
  301. package/dist/assets/lib/svgeditor/shapes/proc-shapes.js +606 -0
  302. package/dist/assets/lib/svgeditor/shapes/shapes.js +30 -0
  303. package/dist/assets/lib/svgeditor/svg-editor.min.css +1 -0
  304. package/dist/assets/lib/uplot/placement.min.js +2 -0
  305. package/dist/assets/project.demo.fuxap +1 -0
  306. package/dist/favicon.ico +0 -0
  307. package/dist/icomoon.86abfb46e057ade8.eot +0 -0
  308. package/dist/icomoon.c1f8b59bad308d66.woff +0 -0
  309. package/dist/icomoon.ce427f75e21963af.ttf +0 -0
  310. package/dist/icomoon.dfb0a89feb346906.svg +19 -0
  311. package/dist/index.html +50 -0
  312. package/dist/logo.0e8e64e69250a450.svg +18 -0
  313. package/dist/main.a356f552d9838b9e.js +1 -0
  314. package/dist/material-icons-outlined.78a93b2079680a08.woff +0 -0
  315. package/dist/material-icons-outlined.f86cb7b0aa53f0fe.woff2 +0 -0
  316. package/dist/material-icons-round.92dc7ca2f4c591e7.woff +0 -0
  317. package/dist/material-icons-round.b10ec9db5b7fbc74.woff2 +0 -0
  318. package/dist/material-icons-sharp.3885863ee4746422.woff2 +0 -0
  319. package/dist/material-icons-sharp.a71cb2bf66c604de.woff +0 -0
  320. package/dist/material-icons-two-tone.588d63134de807a7.woff +0 -0
  321. package/dist/material-icons-two-tone.675bd578bd14533e.woff2 +0 -0
  322. package/dist/material-icons.4ad034d2c499d9b6.woff +0 -0
  323. package/dist/material-icons.59322316b3fd6063.woff2 +0 -0
  324. package/dist/polyfills.2696a6f9dc75535e.js +1 -0
  325. package/dist/roboto-bold-webfont.29ac6158e35aee95.woff +0 -0
  326. package/dist/roboto-bold-webfont.568ab1fa3f154a77.svg +10486 -0
  327. package/dist/roboto-bold-webfont.6bcfbdc216b3bc78.woff2 +0 -0
  328. package/dist/roboto-bold-webfont.7c22a4dfdee2ff33.ttf +0 -0
  329. package/dist/roboto-light-webfont.13492ec56771eeee.svg +9998 -0
  330. package/dist/roboto-light-webfont.61fa26c99b07ac83.woff2 +0 -0
  331. package/dist/roboto-light-webfont.95295ce84942d8ce.ttf +0 -0
  332. package/dist/roboto-light-webfont.ae19119a2889dfdf.woff +0 -0
  333. package/dist/roboto-medium-webfont.30344f0411888055.woff +0 -0
  334. package/dist/roboto-medium-webfont.57fb00cab0317d2d.woff2 +0 -0
  335. package/dist/roboto-medium-webfont.a40869e060a388c0.ttf +0 -0
  336. package/dist/roboto-medium-webfont.ea02241c29620c02.svg +10487 -0
  337. package/dist/roboto-regular-webfont.2b0501b72f5a94d5.ttf +0 -0
  338. package/dist/roboto-regular-webfont.2ce0ba9a06424965.svg +10004 -0
  339. package/dist/roboto-regular-webfont.ae47f6f1292d196f.woff2 +0 -0
  340. package/dist/roboto-regular-webfont.f58066a2d9061006.woff +0 -0
  341. package/dist/roboto-thin-webfont.0a64479870f676e8.ttf +0 -0
  342. package/dist/roboto-thin-webfont.0f7221f5c7e972ef.woff2 +0 -0
  343. package/dist/roboto-thin-webfont.51b221e22714b1fe.svg +10012 -0
  344. package/dist/roboto-thin-webfont.dac941649dd4eac0.woff +0 -0
  345. package/dist/runtime.8ef63094e52a66ba.js +1 -0
  346. package/dist/scripts.1c3385254ff4c93c.js +1 -0
  347. package/dist/styles.cf8e3cf50d039a5c.css +1 -0
  348. package/fuxa.js +39 -0
  349. package/main.js +381 -0
  350. package/package.json +68 -0
  351. package/paths.js +44 -0
  352. package/project.default.json +11 -0
  353. package/project.demo.fuxap +1 -0
  354. package/runtime/alarms/alarmstorage.js +205 -0
  355. package/runtime/alarms/index.js +678 -0
  356. package/runtime/devices/bacnet/index.js +730 -0
  357. package/runtime/devices/device-utils.js +95 -0
  358. package/runtime/devices/device.js +551 -0
  359. package/runtime/devices/ethernetip/index.js +381 -0
  360. package/runtime/devices/fuxaserver/index.js +310 -0
  361. package/runtime/devices/httprequest/index.js +495 -0
  362. package/runtime/devices/index.js +489 -0
  363. package/runtime/devices/modbus/datatypes.js +122 -0
  364. package/runtime/devices/modbus/index.js +730 -0
  365. package/runtime/devices/mqtt/index.js +618 -0
  366. package/runtime/devices/odbc/index.js +408 -0
  367. package/runtime/devices/opcua/index.js +817 -0
  368. package/runtime/devices/s7/datatypes.js +88 -0
  369. package/runtime/devices/s7/index.js +702 -0
  370. package/runtime/devices/template/index.js +141 -0
  371. package/runtime/events.js +33 -0
  372. package/runtime/index.js +559 -0
  373. package/runtime/jobs/cleaner.js +74 -0
  374. package/runtime/jobs/fonts/LICENSE.txt +202 -0
  375. package/runtime/jobs/fonts/Roboto-Black.ttf +0 -0
  376. package/runtime/jobs/fonts/Roboto-BlackItalic.ttf +0 -0
  377. package/runtime/jobs/fonts/Roboto-Bold.ttf +0 -0
  378. package/runtime/jobs/fonts/Roboto-BoldItalic.ttf +0 -0
  379. package/runtime/jobs/fonts/Roboto-Italic.ttf +0 -0
  380. package/runtime/jobs/fonts/Roboto-Light.ttf +0 -0
  381. package/runtime/jobs/fonts/Roboto-LightItalic.ttf +0 -0
  382. package/runtime/jobs/fonts/Roboto-Medium.ttf +0 -0
  383. package/runtime/jobs/fonts/Roboto-MediumItalic.ttf +0 -0
  384. package/runtime/jobs/fonts/Roboto-Regular.ttf +0 -0
  385. package/runtime/jobs/fonts/Roboto-Thin.ttf +0 -0
  386. package/runtime/jobs/fonts/Roboto-ThinItalic.ttf +0 -0
  387. package/runtime/jobs/helper/image-generator.js +82 -0
  388. package/runtime/jobs/index.js +214 -0
  389. package/runtime/jobs/report.js +353 -0
  390. package/runtime/logger.js +113 -0
  391. package/runtime/notificator/index.js +383 -0
  392. package/runtime/notificator/notifystorage.js +179 -0
  393. package/runtime/plugins/index.js +255 -0
  394. package/runtime/project/index.js +959 -0
  395. package/runtime/project/prjstorage.js +222 -0
  396. package/runtime/scripts/index.js +313 -0
  397. package/runtime/scripts/msm.js +146 -0
  398. package/runtime/storage/calculator.js +227 -0
  399. package/runtime/storage/daqstorage.js +188 -0
  400. package/runtime/storage/influxdb/index.js +240 -0
  401. package/runtime/storage/sqlite/currentstorage.js +144 -0
  402. package/runtime/storage/sqlite/index.js +695 -0
  403. package/runtime/storage/tdengine/index.js +106 -0
  404. package/runtime/users/index.js +123 -0
  405. package/runtime/users/usrstorage.js +201 -0
  406. package/runtime/utils.js +284 -0
  407. package/screenshot/feature-action-move.gif +0 -0
  408. package/screenshot/fuxa-ani.gif +0 -0
  409. package/screenshot/fuxa-device.gif +0 -0
  410. package/screenshot/fuxa-editor.png +0 -0
  411. package/screenshot/fuxa-hmi.gif +0 -0
  412. package/screenshot/fuxa-home.png +0 -0
  413. package/screenshot/fuxa-test.gif +0 -0
  414. package/settings.default.js +65 -0
@@ -0,0 +1,817 @@
1
+ /**
2
+ * OPC UA Client Driver
3
+ */
4
+ var opcua;
5
+
6
+ const async = require('async');
7
+ const utils = require('../../utils');
8
+ const deviceUtils = require('../device-utils');
9
+
10
+ function OpcUAclient(_data, _logger, _events) {
11
+
12
+ var data = _data; // Current Device data { id, name, tags, enabled, ... }
13
+ var logger = _logger; // Logger
14
+ var working = false; // Working flag to manage overloading polling and connection
15
+ var connected = false; // Connected flag
16
+ var monitored = false; // Monitored flag
17
+ var lastStatus = ''; // Last Device status
18
+ var events = _events; // Events to commit change to runtime
19
+ var the_session;
20
+ var the_subscription = null;
21
+ var options = { connectionStrategy: { maxRetry: 1 }, keepSessionAlive: true, endpointMustExist: false }; // Connections options
22
+ var client = opcua.OPCUAClient.create(options);
23
+ const attributeKeys = Object.keys(opcua.AttributeIds).filter((x) => x === 'DataType' || x === 'AccessLevel' || x === 'UserAccessLevel');//x !== "INVALID" && x[0].match(/[a-zA-Z]/));
24
+
25
+ var varsValue = []; // Signale to send to frontend { id, type, value }
26
+ var getProperty = null; // Function to ask property (security)
27
+ var lastTimestampValue; // Last Timestamp of asked values
28
+ var tagsIdMap = {}; // Map of tag id with opc nodeId
29
+ /**
30
+ * Connect the client to OPC UA server
31
+ * Open Session, Create Subscription, Emit connection status, Clear the memory Tags value
32
+ */
33
+ this.connect = function () {
34
+ var self = this;
35
+ return new Promise(function (resolve, reject) {
36
+ if (!_checkWorking(true)) {
37
+ reject();
38
+ } else {
39
+ var property = null;
40
+ async.series([
41
+ // step 1 check property
42
+ function (callback) {
43
+ if (getProperty) {
44
+ getProperty({query: 'security', name: data.id}).then(result => {
45
+ if (result && result.value && result.value !== 'null') {
46
+ // property security mode
47
+ property = JSON.parse(result.value);
48
+ var opts = {
49
+ // applicationName: 'Myclient',
50
+ endpointMustExist: false,
51
+ keepSessionAlive: true,
52
+ connectionStrategy: { maxRetry: 1 } };
53
+ if (property.mode) {
54
+ if (property.mode.securityMode) {
55
+ opts['securityMode'] = property.mode.securityMode;
56
+ }
57
+ if (property.mode.securityPolicy) {
58
+ opts['securityPolicy'] = property.mode.securityPolicy;
59
+ }
60
+ }
61
+ client = opcua.OPCUAClient.create(opts);
62
+ }
63
+ callback();
64
+ }).catch(function (err) {
65
+ callback(err);
66
+ });
67
+ } else {
68
+ callback();
69
+ }
70
+ },
71
+ // step 2 connect
72
+ function (callback) {
73
+ const endpoint = data.property.address;
74
+ client.connect(endpoint, function (err) {
75
+ if (err) {
76
+ _clearVarsValue();
77
+ logger.error(`'${data.name}' connect failure! ${err}`);
78
+ } else {
79
+ logger.info(`'${data.name}' connection`, true);
80
+ }
81
+ callback(err);
82
+ });
83
+ client.on("connection_lost", () => {
84
+ logger.error(`'${data.name}' connection lost!`);
85
+ self.disconnect().then(function () { });
86
+ });
87
+ client.on("backoff", (retry, delay) => {
88
+ logger.error(`'${data.name}' retry to connect! ${retry}`);
89
+ });
90
+ },
91
+ // step 3 create session
92
+ function (callback) {
93
+ const userIdentityInfo = { };
94
+ if (property && property.uid && property.pwd) {
95
+ userIdentityInfo['userName'] = property.uid;
96
+ userIdentityInfo['password'] = property.pwd;
97
+ }
98
+ client.createSession(userIdentityInfo, function (err, session) {
99
+ if (err) {
100
+ _clearVarsValue();
101
+ logger.error(`'${data.name}' createSession failure! ${err}`);
102
+ } else {
103
+ the_session = session;
104
+ the_session.on('session_closed', () => {
105
+ logger.warn(`'${data.name}' Warning => Session closed`);
106
+ });
107
+ the_session.on('keepalive', () => {
108
+ logger.info(`'${data.name}' session keepalive`, true);
109
+ });
110
+ the_session.on('keepalive_failure', () => {
111
+ logger.error(`'${data.name}' session keepalive failure!`);
112
+ });
113
+ the_session.on("terminated", function() {
114
+ console.log("terminated");
115
+ });
116
+ _createSubscription();
117
+ }
118
+ callback(err);
119
+ });
120
+ }],
121
+ function (err) {
122
+ if (err) {
123
+ logger.error(`'${data.name}' try to connect error! ${err}`);
124
+ _emitStatus('connect-error');
125
+ _clearVarsValue();
126
+ connected = false;
127
+ reject();
128
+ client.disconnect(function () { });
129
+ } else {
130
+ logger.info(`'${data.name}' connected!`, true);
131
+ _emitStatus('connect-ok');
132
+ connected = true;
133
+ resolve();
134
+ }
135
+ _checkWorking(false);
136
+ });
137
+ }
138
+ });
139
+ }
140
+
141
+ /**
142
+ * Disconnect the OPC UA server
143
+ * Emit connection status, Clear the memory Tags value
144
+ */
145
+ this.disconnect = function () {
146
+ return new Promise(function (resolve, reject) {
147
+ _disconnect(function (err) {
148
+ if (err) {
149
+ logger.error(`'${data.name}' disconnect failure! ${err}`);
150
+ }
151
+ connected = false;
152
+ monitored = false;
153
+ _checkWorking(false);
154
+ _emitStatus('connect-off');
155
+ _clearVarsValue();
156
+ resolve(true);
157
+ });
158
+ });
159
+ }
160
+
161
+ /**
162
+ * Browse Server Nodes, read the childres of gived node
163
+ * The browser callback have a children nodes count limit and have to use _browseNext
164
+ */
165
+ this.browse = function (node) {
166
+ let nodeId = (node) ? node.id : opcua.resolveNodeId('RootFolder');
167
+ return new Promise(function (resolve, reject) {
168
+ // "RootFolder"
169
+ if (the_session) {
170
+ const b = [{
171
+ nodeId: nodeId,
172
+ referenceTypeId: 'Organizes',
173
+ includeSubtypes: true,
174
+ browseDirection: opcua.BrowseDirection.Forward,
175
+ resultMask: 0x3f
176
+
177
+ },
178
+ {
179
+ nodeId: nodeId,
180
+ referenceTypeId: 'Aggregates',
181
+ includeSubtypes: true,
182
+ browseDirection: opcua.BrowseDirection.Forward,
183
+ resultMask: 0x3f
184
+
185
+ },
186
+ {
187
+ nodeId: nodeId,
188
+ referenceTypeId: 'HasSubtype',
189
+ includeSubtypes: true,
190
+ browseDirection: opcua.BrowseDirection.Forward,
191
+ resultMask: 0x3f
192
+ }];
193
+
194
+ the_session.browse(nodeId, function (err, browseResult) {
195
+ if (!err) {
196
+ let opcNodes = [];
197
+ browseResult.references.forEach(function (reference) {
198
+ let node = new OpcNode(reference.browseName.toString());
199
+ if (reference.displayName) {
200
+ node.name = reference.displayName.text;
201
+ }
202
+ node.id = reference.nodeId;
203
+ node.class = reference.nodeClass;
204
+ opcNodes.push(node);
205
+ });
206
+
207
+ if (browseResult.continuationPoint) {
208
+ var nextresult = _browseNext(browseResult.continuationPoint).then(nodes => {
209
+ for (let i = 0; i < nodes.length; i++) {
210
+ opcNodes.push(nodes[i]);
211
+ }
212
+ resolve(opcNodes);
213
+ });
214
+ } else {
215
+ resolve(opcNodes);
216
+ }
217
+ } else {
218
+ reject(err);
219
+ }
220
+ });
221
+ } else {
222
+ reject('Session Error');
223
+ }
224
+ });
225
+ }
226
+
227
+ /**
228
+ * Browser the next children nodes after contipoint position
229
+ * @param {*} contipoint
230
+ */
231
+ var _browseNext = function (contipoint) {
232
+ var opcNodes = [];
233
+ var browseNextRequest = new opcua.BrowseNextRequest({
234
+ continuationPoints: [contipoint]
235
+ });
236
+ return new Promise(function (resolve, reject) {
237
+ the_session.performMessageTransaction(browseNextRequest, function (err, response) {
238
+ if (err) {
239
+ reject(err);
240
+ } else {
241
+ if (response.results && response.results[0]) {
242
+ let browseResult = response.results[0];
243
+ browseResult.references.forEach(function (reference) {
244
+ let node = new OpcNode(reference.browseName.toString());
245
+ if (reference.displayName) {
246
+ node.name = reference.displayName.text;
247
+ }
248
+ node.id = reference.nodeId;
249
+ node.class = reference.nodeClass;
250
+ opcNodes.push(node);
251
+ });
252
+ if (browseResult.continuationPoint) {
253
+ _browseNext(browseResult.continuationPoint).then(nodes => {
254
+ for (let i = 0; i < nodes.length; i++) {
255
+ opcNodes.push(nodes[i]);
256
+ }
257
+ return resolve(opcNodes);
258
+ });
259
+ } else {
260
+ return resolve(opcNodes);
261
+ }
262
+ } else {
263
+ return resolve(opcNodes);
264
+ }
265
+ }
266
+ });
267
+ });
268
+ }
269
+
270
+ /**
271
+ * Read node attribute
272
+ */
273
+ this.readAttribute = function (node) {
274
+
275
+ const attr = [];
276
+
277
+ const nodesToRead = attributeKeys.map((attr) => ({
278
+ nodeId: node.id,
279
+ attributeId: opcua.AttributeIds[attr]
280
+ }));
281
+
282
+ return new Promise(function (resolve, reject) {
283
+
284
+ the_session.read(nodesToRead, function (err, dataValues) {
285
+ if (err) {
286
+ reject('#readAllAttributes returned ' + err.message);
287
+ } else {
288
+ node.attribute = {};
289
+ for (let i = 0; i < nodesToRead.length; i++) {
290
+ const obj = _attrToObject(nodesToRead[i].attributeId, dataValues[i]);
291
+ if (obj) {
292
+ node.attribute[nodesToRead[i].attributeId] = obj.attribute;
293
+ }
294
+ // if (dataValue.statusCode !== opcua.StatusCodes.Good) {
295
+ // continue;
296
+ // }
297
+ // const s = toString1(nodeToRead.attributeId, dataValue);
298
+ // append_text(attributeIdtoString[nodeToRead.attributeId], s, attr);
299
+ }
300
+ resolve(node);
301
+ }
302
+ });
303
+ });
304
+ }
305
+
306
+ /**
307
+ * Take the current Tags value (only changed), Reset the change flag, Emit Tags value
308
+ * Save DAQ value
309
+ */
310
+ this.polling = function () {
311
+ if (_checkWorking(true)) {
312
+ if (!monitored) {
313
+ _startMonitor().then(ok => {
314
+ if (ok && connected) {
315
+ monitored = true;
316
+ }
317
+ _checkWorking(false);
318
+ }).catch(function (err) {
319
+ logger.error(`'${data.name}' polling error (_startMonitor): ${err}`);
320
+ _checkWorking(false);
321
+ });
322
+ } else if (the_session && client) {
323
+ try {
324
+ var varsValueChanged = _checkVarsChanged();
325
+ lastTimestampValue = new Date().getTime();
326
+ _emitValues(varsValue);
327
+
328
+ if (this.addDaq && !utils.isEmptyObject(varsValueChanged)) {
329
+ this.addDaq(varsValueChanged, data.name, data.id);
330
+ }
331
+ } catch (err) {
332
+ logger.error(`'${data.name}' polling error: ${err}`);
333
+ }
334
+ _checkWorking(false);
335
+ } else {
336
+ _checkWorking(false);
337
+ }
338
+ }
339
+ }
340
+
341
+ /**
342
+ * Load Tags to read by polling
343
+ */
344
+ this.load = function (_data) {
345
+ data = JSON.parse(JSON.stringify(_data));
346
+ try {
347
+ var count = Object.keys(data.tags).length;
348
+ logger.info(`'${data.name}' data loaded (${count})`, true);
349
+ } catch (err) {
350
+ logger.error(`'${data.name}' load error! ${err}`);
351
+ }
352
+ }
353
+
354
+ /**
355
+ * Return Tags values array { id: <name>, value: <value>, type: <type> }
356
+ */
357
+ this.getValues = function () {
358
+ return data.tags;
359
+ }
360
+
361
+ /**
362
+ * Return Tag value { id: <name>, value: <value>, ts: <lastTimestampValue> }
363
+ */
364
+ this.getValue = function (id) {
365
+ if (varsValue[id]) {
366
+ return {id: id, value: varsValue[id].value, ts: lastTimestampValue };
367
+ }
368
+ return null;
369
+ }
370
+
371
+ /**
372
+ * Return Device status Connected/Disconnected 'connect-off', 'connect-ok', 'connect-error'
373
+ */
374
+ this.getStatus = function () {
375
+ return lastStatus;
376
+ }
377
+
378
+ /**
379
+ * Return Tag property
380
+ */
381
+ this.getTagProperty = function (id) {
382
+ if (data.tags[id]) {
383
+ return { id: id, name: data.tags[id].name, type: data.tags[id].type, format: data.tags[id].format };
384
+ } else {
385
+ return null;
386
+ }
387
+ }
388
+
389
+ /**
390
+ * Set Tag value, used to set value from frontend
391
+ */
392
+ this.setValue = function (tagId, value) {
393
+ if (the_session && data.tags[tagId]) {
394
+ let opctype = _toDataType(data.tags[tagId].type);
395
+ let valueToSend = _toValue(opctype, value);
396
+ valueToSend = deviceUtils.tagRawCalculator(valueToSend, data.tags[tagId]);
397
+ var nodesToWrite = [
398
+ {
399
+ nodeId: data.tags[tagId].address,
400
+ attributeId: opcua.AttributeIds.Value,
401
+ value: /*new DataValue(*/{
402
+ value: {/* Variant */
403
+ dataType: opctype,
404
+ value: valueToSend
405
+ }
406
+ }
407
+ }
408
+ ];
409
+
410
+ the_session.write(nodesToWrite, function (err, statusCodes) {
411
+ if (err) {
412
+ logger.error(`'${data.name}' setValue error! ${err}`);
413
+ } else {
414
+ logger.info(`'${data.name}' setValue(${tagId}, ${value})`, true, true);
415
+ }
416
+ });
417
+ return true;
418
+ }
419
+ return false;
420
+ }
421
+
422
+ /**
423
+ * Is Connected true/false
424
+ */
425
+ this.isConnected = function () {
426
+ return connected;
427
+ }
428
+
429
+ /**
430
+ * Set the callback to set value to DAQ
431
+ */
432
+ this.bindAddDaq = function (fnc) {
433
+ this.addDaq = fnc; // Add the DAQ value to db history
434
+ }
435
+ this.addDaq = null; // Callback to add the DAQ value to db history
436
+
437
+
438
+ /**
439
+ * Return the timestamp of last read tag operation on polling
440
+ * @returns
441
+ */
442
+ this.lastReadTimestamp = () => {
443
+ return lastTimestampValue;
444
+ }
445
+
446
+ /**
447
+ * Set function to ask property (security)
448
+ */
449
+ this.bindGetProperty = function (fnc) {
450
+ getProperty = fnc;
451
+ }
452
+
453
+ /**
454
+ * Return the Daq settings of Tag
455
+ * @returns
456
+ */
457
+ this.getTagDaqSettings = (tagId) => {
458
+ return data.tags[tagId] ? data.tags[tagId].daq : null;
459
+ }
460
+
461
+ /**
462
+ * Set Daq settings of Tag
463
+ * @returns
464
+ */
465
+ this.setTagDaqSettings = (tagId, settings) => {
466
+ if (data.tags[tagId]) {
467
+ utils.mergeObjectsValues(data.tags[tagId].daq, settings);
468
+ }
469
+ }
470
+
471
+ /**
472
+ * Disconnect the OPC UA client and close session if used
473
+ * @param {*} callback
474
+ */
475
+ var _disconnect = function (callback) {
476
+ if (!the_session) {
477
+ client.disconnect(function (err) {
478
+ callback(err);
479
+ });
480
+ } else {
481
+ the_session.close(function () {
482
+ client.disconnect(function (err) {
483
+ callback(err);
484
+ });
485
+ });
486
+ }
487
+ }
488
+
489
+ /**
490
+ * Create a session subscription to refresh Tags value
491
+ */
492
+ var _createSubscription = function () {
493
+ if (the_session) {
494
+ const parameters = {
495
+ requestedPublishingInterval: 500,
496
+ requestedLifetimeCount: 600,
497
+ requestedMaxKeepAliveCount: 10,
498
+ maxNotificationsPerPublish: 0,
499
+ publishingEnabled: true,
500
+ priority: 0
501
+ };
502
+ the_session.createSubscription2(
503
+ parameters,
504
+ (err, subscription) => {
505
+ if (err) {
506
+ logger.error(`'${data.name}' can't create subscription! ${err.message}`);
507
+ return;
508
+ }
509
+ the_subscription = subscription;
510
+ logger.info(`'${data.name}' subscription created!`, true);
511
+ });
512
+ }
513
+ }
514
+
515
+ /**
516
+ * Start the monitor by subsribe the Tags to check if value change
517
+ * samplingInterval = 1000 msec.
518
+ * @param {*} callback
519
+ */
520
+ var _startMonitor = function () {
521
+ return new Promise(async function (resolve, reject) {
522
+ if (the_session && the_subscription) {
523
+ tagsIdMap = {};
524
+ var count = 0;
525
+ for (var id in data.tags) {
526
+ count++;
527
+ try {
528
+ var nodeId = data.tags[id].address;
529
+ tagsIdMap[nodeId] = id;
530
+ var monitoredItem = await the_subscription.monitor(
531
+ { nodeId: nodeId, attributeId: opcua.AttributeIds.Value },
532
+ { samplingInterval: data.polling || 1000, discardOldest: true, queueSize: 1 },
533
+ opcua.TimestampsToReturn.Both
534
+ );
535
+ monitoredItem.on('changed', _monitorcallback(nodeId));
536
+ } catch (err) {
537
+ logger.error(`'${nodeId}' _startMonitor ${err}`);
538
+ }
539
+ }
540
+ resolve(true);
541
+ } else {
542
+ reject();
543
+ }
544
+ });
545
+ }
546
+
547
+ /**
548
+ * Callback from monitor of changed Tag value
549
+ * And set the changed value to local Tags
550
+ * @param {*} _nodeId
551
+ */
552
+ var _monitorcallback = function (_nodeId) {
553
+ var nodeId = _nodeId;
554
+ return function (dataValue) {
555
+ if (dataValue && dataValue.value) {
556
+ // console.log(nodeId.toString(), '\t value : ', dataValue.value.value.toString());
557
+ let id = tagsIdMap[nodeId];
558
+ if (data.tags[id]) {
559
+ data.tags[id].rawValue = dataValue.value.value;
560
+ data.tags[id].serverTimestamp = dataValue.serverTimestamp.toString();
561
+ data.tags[id].timestamp = new Date().getTime();
562
+ data.tags[id].changed = true;
563
+ }
564
+ }
565
+ };
566
+ }
567
+
568
+ /**
569
+ * Clear local Tags value by set all to null
570
+ */
571
+ var _clearVarsValue = function () {
572
+ for (let id in varsValue) {
573
+ varsValue[id].value = null;
574
+ }
575
+ _emitValues(varsValue);
576
+ }
577
+
578
+ /**
579
+ * Return the Tags that have value changed and clear value changed flag of all Tags
580
+ */
581
+ var _checkVarsChanged = () => {
582
+ const timestamp = new Date().getTime();
583
+ var result = {};
584
+ for (var id in data.tags) {
585
+ data.tags[id].value = deviceUtils.tagValueCompose(data.tags[id].rawValue, data.tags[id]);
586
+ if (this.addDaq && !utils.isNullOrUndefined(data.tags[id].value) && deviceUtils.tagDaqToSave(data.tags[id], timestamp)) {
587
+ result[id] = data.tags[id];
588
+ }
589
+ data.tags[id].changed = false;
590
+ varsValue[id] = data.tags[id];
591
+ }
592
+ return result;
593
+ }
594
+
595
+ /**
596
+ * To manage a overloading connection
597
+ * @param {*} check
598
+ */
599
+ var _checkWorking = function (check) {
600
+ if (check && working) {
601
+ if (monitored) {
602
+ logger.warn(`'${data.name}' working (connection || polling) overload!`);
603
+ }
604
+ return false;
605
+ }
606
+ working = check;
607
+ return true;
608
+ }
609
+
610
+ /**
611
+ * Emit Tags in application
612
+ * @param {*} values
613
+ */
614
+ var _emitValues = function (values) {
615
+ events.emit('device-value:changed', { id: data.id, values: values });
616
+ }
617
+
618
+ /**
619
+ * Emit status in application
620
+ * @param {*} status
621
+ */
622
+ var _emitStatus = function (status) {
623
+ lastStatus = status;
624
+ events.emit('device-status:changed', { id: data.id, status: status });
625
+ }
626
+
627
+ /**
628
+ * Return formatted Tag attribute
629
+ * @param {*} attribute
630
+ * @param {*} dataValue
631
+ */
632
+ var _attrToObject = function (attribute, dataValue) {
633
+
634
+ if (!dataValue || !dataValue.value || !dataValue.value.hasOwnProperty('value')) {
635
+ return null;
636
+ }
637
+ switch (attribute) {
638
+ case opcua.AttributeIds.DataType:
639
+ let dtype = opcua.DataType[dataValue.value.value.value];
640
+ return { attribute: dtype };
641
+ // case opcua.AttributeIds.NodeClass:
642
+ // return NodeClass[dataValue.value.value] + " (" + dataValue.value.value + ")";
643
+ // case opcua.AttributeIds.IsAbstract:
644
+ // case opcua.AttributeIds.Historizing:
645
+ // case opcua.AttributeIds.EventNotifier:
646
+ // return dataValue.value.value ? "true" : "false"
647
+ // case opcua.AttributeIds.WriteMask:
648
+ // case opcua.AttributeIds.UserWriteMask:
649
+ // return " (" + dataValue.value.value + ")";
650
+ // case opcua.AttributeIds.NodeId:
651
+ // case opcua.AttributeIds.BrowseName:
652
+ // case opcua.AttributeIds.DisplayName:
653
+ // case opcua.AttributeIds.Description:
654
+ // case opcua.AttributeIds.ValueRank:
655
+ // case opcua.AttributeIds.ArrayDimensions:
656
+ // case opcua.AttributeIds.Executable:
657
+ // case opcua.AttributeIds.UserExecutable:
658
+ // case opcua.AttributeIds.MinimumSamplingInterval:
659
+ // if (!dataValue.value.value) {
660
+ // return "null";
661
+ // }
662
+ // return dataValue.value.value.toString();
663
+ case opcua.AttributeIds.UserAccessLevel:
664
+ case opcua.AttributeIds.AccessLevel:
665
+ if (!dataValue.value.value) {
666
+ return null;
667
+ }
668
+ let rlev = opcua.AccessLevelFlag[dataValue.value.value & 1];
669
+ let wlev = opcua.AccessLevelFlag[dataValue.value.value & 2];
670
+ let lev = '';
671
+ if (rlev) {
672
+ lev += 'R';
673
+ }
674
+ if (wlev) {
675
+ if (rlev) {
676
+ lev += '/';
677
+ }
678
+ lev += 'W';
679
+ }
680
+ return { attribute: lev };
681
+ default:
682
+ return null;
683
+ }
684
+ }
685
+
686
+ /**
687
+ * Convert OPCUA data type from string
688
+ * @param {*} type
689
+ */
690
+ var _toDataType = function (type) {
691
+ if (type === 'Boolean') {
692
+ return opcua.DataType.Boolean;
693
+ } else if (type === 'SByte') {
694
+ return opcua.DataType.SByte;
695
+ } else if (type === 'Byte') {
696
+ return opcua.DataType.Byte;
697
+ } else if (type === 'Int16') {
698
+ return opcua.DataType.Int16;
699
+ } else if (type === 'UInt16') {
700
+ return opcua.DataType.UInt16;
701
+ } else if (type === 'Int32') {
702
+ return opcua.DataType.Int32;
703
+ } else if (type === 'UInt32') {
704
+ return opcua.DataType.UInt32;
705
+ } else if (type === 'Int64') {
706
+ return opcua.DataType.Int64;
707
+ } else if (type === 'UInt64') {
708
+ return opcua.DataType.UInt64;
709
+ } else if (type === 'Float') {
710
+ return opcua.DataType.Float;
711
+ } else if (type === 'Double') {
712
+ return opcua.DataType.Double;
713
+ } else if (type === 'String') {
714
+ return opcua.DataType.String;
715
+ } else if (type === 'DateTime') {
716
+ return opcua.DataType.DateTime;
717
+ } else if (type === 'Guid') {
718
+ return opcua.DataType.Guid;
719
+ } else if (type === 'ByteString') {
720
+ return opcua.DataType.ByteString;
721
+ }
722
+ }
723
+
724
+ /**
725
+ * Convert value from string depending of type
726
+ * @param {*} type
727
+ * @param {*} value
728
+ */
729
+ var _toValue = function (type, value) {
730
+ switch (type) {
731
+ case opcua.DataType.Boolean:
732
+ if (typeof value === 'string' && (value.toLowerCase() === 'true' || value === '1')) {
733
+ return true;
734
+ }
735
+ return false;
736
+ case opcua.DataType.SByte:
737
+ case opcua.DataType.Byte:
738
+ case opcua.DataType.Int16:
739
+ case opcua.DataType.UInt16:
740
+ case opcua.DataType.Int32:
741
+ case opcua.DataType.UInt3:
742
+ case opcua.DataType.Int64:
743
+ case opcua.DataType.UInt64:
744
+ return parseInt(value);
745
+ case opcua.DataType.Float:
746
+ case opcua.DataType.Double:
747
+ return parseFloat(value);
748
+ default:
749
+ return value;
750
+ }
751
+ }
752
+ }
753
+
754
+ /**
755
+ * Return security and encryption mode supported from server endpoint
756
+ */
757
+ function getEndPoints(endpointUrl) {
758
+ return new Promise(function (resolve, reject) {
759
+ if (loadOpcUALib()) {
760
+ let opts = { connectionStrategy: { maxRetry: 1 } };
761
+ let client = opcua.OPCUAClient.create(opts);
762
+ try {
763
+ client.connect(endpointUrl, function (err) {
764
+ if (err) {
765
+ reject('getendpoints-connect-error: ' + err.message);
766
+ } else {
767
+ const endpoints = client.getEndpoints().then(endpoints => {
768
+ const reducedEndpoints = endpoints.map(endpoint => ({
769
+ endpointUrl: endpoint.endpointUrl,
770
+ securityMode: endpoint.securityMode.toString(),
771
+ securityPolicy: endpoint.securityPolicyUri.toString(),
772
+ }));
773
+ resolve( reducedEndpoints);
774
+ client.disconnect();
775
+ }, reason => {
776
+ reject('getendpoints-error: ' + reason);
777
+ client.disconnect();
778
+ });
779
+ }
780
+ });
781
+ } catch (err) {
782
+ reject('getendpoints-error: ' + err);
783
+ }
784
+ } else {
785
+ reject('getendpoints-error: node-opcua not found!');
786
+ }
787
+ });
788
+ }
789
+
790
+ function loadOpcUALib() {
791
+ if (!opcua) {
792
+ try { opcua = require('node-opcua'); } catch { }
793
+ if (!opcua && manager) { try { opcua = manager.require('node-opcua'); } catch { } }
794
+ }
795
+ return (opcua) ? true : false;
796
+ }
797
+
798
+ module.exports = {
799
+ init: function (settings) {
800
+ // deviceCloseTimeout = settings.deviceCloseTimeout || 15000;
801
+ },
802
+ create: function (data, logger, events, manager) {
803
+ if (!loadOpcUALib()) return null;
804
+ return new OpcUAclient(data, logger, events);
805
+ },
806
+ getEndPoints: getEndPoints
807
+ }
808
+
809
+ function OpcNode(name) {
810
+ this.name = name;
811
+ this.id = '';
812
+ this.class = '';
813
+ this.type = '';
814
+ this.value = '';
815
+ this.timestamp = '';
816
+ this.attribute;
817
+ }