@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,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
+ }