@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,702 @@
1
+ /**
2
+ * 's7': snap7 wrapper to communicate with Siemens PLC (S7)
3
+ */
4
+
5
+ var snap7;
6
+ var datatypes;
7
+ const utils = require('../../utils');
8
+ const deviceUtils = require('../device-utils');
9
+
10
+ const MAX_MIX_ITEM = 20;
11
+
12
+ function S7client(_data, _logger, _events) {
13
+
14
+ var db = {}; // Loaded Signal in DB format { DB index, start, size, ... }
15
+ var data = JSON.parse(JSON.stringify(_data)); // Current Device data { id, name, tags, enabled, ... }
16
+ var logger = _logger; // Logger
17
+ var s7client = new snap7.S7Client();// Client node-S7
18
+ var working = false; // Working flag to manage overloading polling and connection
19
+ var events = _events; // Events to commit change to runtime
20
+ var lastStatus = ''; // Last Device status
21
+ var varsValue = []; // Signale to send to frontend { id, type, value }
22
+ var dbItemsMap = {}; // DB Mapped Signale name with DbItem to find for set value
23
+ var mixItemsMap = {}; // E/I/A/Q/M Mapped Signale name to find for read in polling and set value
24
+ var overloading = 0; // Overloading counter to mange the break connection
25
+ var lastTimestampValue; // Last Timestamp of asked values
26
+
27
+ /**
28
+ * Connect to PLC
29
+ * Emit connection status to clients, clear all Tags values
30
+ */
31
+ this.connect = function () {
32
+ return new Promise(function (resolve, reject) {
33
+ if (data.property && data.property.rack >= 0 && data.property.slot >= 0) {
34
+ try {
35
+ if (!s7client.Connected() && _checkWorking(true)) {
36
+ logger.info(`'${data.name}' try to connect ${data.property.address}`, true);
37
+ s7client.ConnectTo(data.property.address, data.property.rack, data.property.slot, function (err) {
38
+ if (err) {
39
+ logger.error(`'${data.name}' connect failed! ${err}`);
40
+ _emitStatus('connect-error');
41
+ _clearVarsValue();
42
+ reject();
43
+ } else {
44
+ logger.info(`'${data.name}' connected!`, true);
45
+ _emitStatus('connect-ok');
46
+ resolve();
47
+ }
48
+ _checkWorking(false);
49
+ });
50
+ } else {
51
+ reject();
52
+ }
53
+ } catch (err) {
54
+ logger.error(`'${data.name}' try to connect error! ${err}`);
55
+ _checkWorking(false);
56
+ _emitStatus('connect-error');
57
+ _clearVarsValue();
58
+ reject();
59
+ }
60
+ } else {
61
+ logger.error(`'${data.name}' missing connection data!`);
62
+ _emitStatus('connect-failed');
63
+ _clearVarsValue();
64
+ reject();
65
+ }
66
+ });
67
+ }
68
+
69
+ /**
70
+ * Disconnect the PLC
71
+ * Emit connection status to clients, clear all Tags values
72
+ */
73
+ this.disconnect = function () {
74
+ return new Promise(function (resolve, reject) {
75
+ _checkWorking(false);
76
+ if (!s7client.Connected()) {
77
+ _emitStatus('connect-off');
78
+ _clearVarsValue();
79
+ resolve(true);
80
+ } else {
81
+ var result = s7client.Disconnect();
82
+ if (result) {
83
+ logger.info(`'${data.name}' disconnected!`, true);
84
+ } else {
85
+ logger.error(`'${data.name}' try to disconnect failed!`);
86
+ }
87
+ _emitStatus('connect-off');
88
+ _clearVarsValue();
89
+ resolve(result);
90
+ }
91
+ });
92
+ }
93
+
94
+ /**
95
+ * Read values in polling mode
96
+ * Update the tags values list, save in DAQ if value changed or in interval and emit values to clients
97
+ */
98
+ this.polling = function () {
99
+ if (_checkWorking(true)) {
100
+ var readVarsfnc = [];
101
+ for (var dbnum in db) {
102
+ readVarsfnc.push(_readDB(parseInt(dbnum), Object.values(db[dbnum].Items)));
103
+ }
104
+ if (Object.keys(mixItemsMap).length) {
105
+ utils.chunkArray(Object.values(mixItemsMap), MAX_MIX_ITEM).forEach((chunk) => {
106
+ readVarsfnc.push(_readVars(chunk));
107
+ })
108
+ }
109
+ Promise.all(readVarsfnc).then(result => {
110
+ _checkWorking(false);
111
+ if (result.length) {
112
+ let varsValueChanged = _updateVarsValue(result);
113
+ lastTimestampValue = new Date().getTime();
114
+ _emitValues(varsValue);
115
+ if (this.addDaq && !utils.isEmptyObject(varsValueChanged)) {
116
+ this.addDaq(varsValueChanged, data.name, data.id);
117
+ }
118
+ } else {
119
+ // console.error('not');
120
+ }
121
+ if (lastStatus !== 'connect-ok') {
122
+ _emitStatus('connect-ok');
123
+ }
124
+ }, reason => {
125
+ if (reason && reason.stack) {
126
+ logger.error(`'${data.name}' _readVars error! ${reason.stack}`);
127
+ } else {
128
+ logger.error(`'${data.name}' _readVars error! ${reason}`);
129
+ }
130
+ _checkWorking(false);
131
+ });
132
+ } else {
133
+ _emitStatus('connect-busy');
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Load Tags attribute to read with polling
139
+ */
140
+ this.load = function (_data) {
141
+ data = JSON.parse(JSON.stringify(_data));
142
+ db = {};
143
+ varsValue = [];
144
+ dbItemsMap = {};
145
+ mixItemsMap = {};
146
+ var count = 0;
147
+ for (var id in data.tags) {
148
+ try {
149
+ var varDb = _getTagItem(data.tags[id]);
150
+ if (varDb instanceof DbItem) {
151
+ if (!db[varDb.dbnum]) {
152
+ var grptag = new DbItems(varDb.dbnum);
153
+ db[varDb.dbnum] = grptag;
154
+ }
155
+ if (!db[varDb.dbnum].Items[varDb.Start]) {
156
+ db[varDb.dbnum].Items[varDb.Start] = varDb;
157
+ }
158
+ db[varDb.dbnum].Items[varDb.Start].Tags.push(data.tags[id]); // because you can have multiple tags at the same DB address
159
+ if (db[varDb.dbnum].MaxSize < varDb.Start + datatypes[varDb.type].S7WordLen) {
160
+ db[varDb.dbnum].MaxSize = varDb.Start + datatypes[varDb.type].S7WordLen;
161
+ }
162
+ // check Bit to Map
163
+ if (varDb.bit >= 0) {
164
+ varDb.BitMap[varDb.bit] = id;
165
+ }
166
+ count++;
167
+ dbItemsMap[id] = db[varDb.dbnum].Items[varDb.Start];
168
+ dbItemsMap[id].format = data.tags[id].format;
169
+ } else if (varDb && !isNaN(varDb.Start)) {
170
+ varDb.id = id;
171
+ varDb.name = data.tags[id].name;
172
+ varDb.format = data.tags[id].format;
173
+ varDb.daq = data.tags[id].daq;
174
+ mixItemsMap[id] = varDb;
175
+ }
176
+ } catch (err) {
177
+ logger.error(`'${data.name}' load error! ${err}`);
178
+ }
179
+ }
180
+ logger.info(`'${data.name}' data loaded (${count})`, true);
181
+ }
182
+
183
+ /**
184
+ * Return Tags values array { id: <name>, value: <value>, type: <type> }
185
+ */
186
+ this.getValues = function () {
187
+ return varsValue;
188
+ }
189
+
190
+ /**
191
+ * Return Tag value { id: <name>, value: <value>, ts: <lastTimestampValue> }
192
+ */
193
+ this.getValue = function (id) {
194
+ if (varsValue[id]) {
195
+ return { id: id, value: varsValue[id].value, ts: lastTimestampValue };
196
+ }
197
+ return null;
198
+ }
199
+
200
+ /**
201
+ * Return connection status 'connect-off', 'connect-ok', 'connect-error'
202
+ */
203
+ this.getStatus = function () {
204
+ return lastStatus;
205
+ }
206
+
207
+ /**
208
+ * Return Tag property
209
+ */
210
+ this.getTagProperty = function (id) {
211
+ if (dbItemsMap[id]) {
212
+ return { id: id, name: id, type: dbItemsMap[id].type, format: dbItemsMap[id].format };
213
+ } else if (mixItemsMap[id]) {
214
+ return { id: id, name: id, type: mixItemsMap[id].type, format: mixItemsMap[id].format };
215
+ } else {
216
+ return null;
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Set the Tag value
222
+ * Read the current Tag object, write the value in object and send to SPS
223
+ */
224
+ this.setValue = function (sigid, value) {
225
+ var item = _getTagItem(data.tags[sigid]);
226
+ if (item) {
227
+ value = deviceUtils.tagRawCalculator(value, data.tags[sigid]);
228
+ item.value = value;
229
+ _writeVars([item], (item instanceof DbItem)).then(result => {
230
+ logger.info(`'${data.name}' setValue(${sigid}, ${value})`, true, true);
231
+ }, reason => {
232
+ if (reason && reason.stack) {
233
+ logger.error(`'${data.name}' _writeVars error! ${reason.stack}`);
234
+ } else {
235
+ logger.error(`'${data.name}' _writeVars error! ${reason}`);
236
+ }
237
+ });
238
+ return true;
239
+ }
240
+ return false;
241
+ }
242
+
243
+ /**
244
+ * Return if PLC is connected
245
+ * Don't work if PLC will disconnect
246
+ */
247
+ this.isConnected = function () {
248
+ return s7client.Connected();
249
+ }
250
+
251
+ /**
252
+ * Bind the DAQ store function
253
+ */
254
+ this.bindAddDaq = function (fnc) {
255
+ this.addDaq = fnc; // Add the DAQ value to db history
256
+ }
257
+
258
+ this.addDaq = null; // Add the DAQ value to db history
259
+
260
+ /**
261
+ * Return the timestamp of last read tag operation on polling
262
+ * @returns
263
+ */
264
+ this.lastReadTimestamp = () => {
265
+ return lastTimestampValue;
266
+ }
267
+
268
+ /**
269
+ * Return the Daq settings of Tag
270
+ * @returns
271
+ */
272
+ this.getTagDaqSettings = (tagId) => {
273
+ return data.tags[tagId] ? data.tags[tagId].daq : null;
274
+ }
275
+
276
+ /**
277
+ * Set Daq settings of Tag
278
+ * @returns
279
+ */
280
+ this.setTagDaqSettings = (tagId, settings) => {
281
+ if (data.tags[tagId]) {
282
+ utils.mergeObjectsValues(data.tags[tagId].daq, settings);
283
+ }
284
+ }
285
+
286
+ /**
287
+ * Clear the Tags values by setting to null
288
+ * Emit to clients
289
+ */
290
+ var _clearVarsValue = function () {
291
+ for (var id in varsValue) {
292
+ varsValue[id].value = null;
293
+ }
294
+ for (var dbid in db) {
295
+ for (var itemid in db[dbid].Items) {
296
+ db[dbid].Items[itemid].value = null;
297
+ }
298
+ }
299
+ for (var mi in mixItemsMap) {
300
+ mixItemsMap[mi].value = null;
301
+ }
302
+ _emitValues(varsValue);
303
+ }
304
+
305
+ /**
306
+ * Update the Tags values read
307
+ * @param {*} vars
308
+ */
309
+ var _updateVarsValue = (vars) => {
310
+ var someval = false;
311
+ var tempTags = {};
312
+ for (var vid in vars) {
313
+ let items = vars[vid];
314
+ for (var itemidx in items) {
315
+ const changed = items[itemidx].changed;
316
+ if (items[itemidx] instanceof DbItem) {
317
+ let type = items[itemidx].type;
318
+ let value = items[itemidx].value;
319
+ let tags = items[itemidx].Tags;
320
+ tags.forEach(tag => {
321
+ tempTags[tag.id] = {
322
+ id: tag.id,
323
+ rawValue: value,
324
+ type: type,
325
+ daq: tag.daq,
326
+ changed: changed,
327
+ tagref: tag
328
+ };
329
+ if (type === 'BOOL') {
330
+ try {
331
+ let pos = parseInt(tag.address.charAt(tag.address.length - 1));
332
+ tempTags[tag.id].rawValue = _getBit(value, pos) ? 1 : 0;
333
+ } catch (err) { }
334
+ }
335
+ someval = true;
336
+ });
337
+ } else {
338
+ if (items[itemidx].type === 'BOOL') {
339
+ try {
340
+ items[itemidx].value = (_getBit(items[itemidx].value, items[itemidx].bit)) ? 1 : 0;
341
+ } catch (err) { }
342
+ }
343
+ tempTags[items[itemidx].id] = {
344
+ id: items[itemidx].id,
345
+ rawValue: items[itemidx].value,
346
+ type: items[itemidx].type,
347
+ daq: items[itemidx].daq,
348
+ changed: changed,
349
+ tagref: items[itemidx]
350
+ };
351
+ someval = true;
352
+ }
353
+ }
354
+ }
355
+ if (someval) {
356
+ const timestamp = new Date().getTime();
357
+ var result = {};
358
+ for (var id in tempTags) {
359
+ if (!utils.isNullOrUndefined(tempTags[id].rawValue)) {
360
+ tempTags[id].value = deviceUtils.tagValueCompose(tempTags[id].rawValue, tempTags[id].tagref);
361
+ tempTags[id].timestamp = timestamp;
362
+ if (this.addDaq && deviceUtils.tagDaqToSave(tempTags[id], timestamp)) {
363
+ result[id] = tempTags[id];
364
+ }
365
+ }
366
+ varsValue[id] = tempTags[id];
367
+ varsValue[id].changed = false;
368
+ }
369
+ return result;
370
+ }
371
+ return null;
372
+ }
373
+
374
+ //#region Bit Manipolation
375
+ _getBit = function (number, bitPosition) {
376
+ return ((number >> bitPosition) % 2 != 0)
377
+ }
378
+
379
+ _setBit = function (number, bitPosition) {
380
+ return number | 1 << bitPosition;
381
+ }
382
+
383
+ _clearBit = function (number, bitPosition) {
384
+ return number & ~(1 << bitPosition);
385
+ }
386
+
387
+ _toggleBit = function (number, bitPosition) {
388
+ return _getBit(number, bitPosition) ? _clearBit(number, bitPosition) : _setBit(number, bitPosition);
389
+ }
390
+ //#endregion
391
+
392
+ /**
393
+ * Emit the PLC Tags values array { id: <name>, value: <value>, type: <type> }
394
+ * @param {*} values
395
+ */
396
+ var _emitValues = function (values) {
397
+ events.emit('device-value:changed', { id: data.id, values: values });
398
+ }
399
+
400
+ /**
401
+ * Emit the PLC connection status
402
+ * @param {*} status
403
+ */
404
+ var _emitStatus = function (status) {
405
+ lastStatus = status;
406
+ events.emit('device-status:changed', { id: data.id, status: status });
407
+ }
408
+
409
+ /**
410
+ * Used to manage the async connection and polling automation (that not overloading)
411
+ * @param {*} check
412
+ */
413
+ var _checkWorking = function (check) {
414
+ if (check && working) {
415
+ overloading++;
416
+ logger.warn(`'${data.name}' working (connection || polling) overload! ${overloading}`);
417
+ // !The driver don't give the break connection
418
+ if (overloading >= 3) {
419
+ s7client.Disconnect();
420
+ } else {
421
+ return false;
422
+ }
423
+ }
424
+ working = check;
425
+ overloading = 0;
426
+ return true;
427
+ }
428
+
429
+ /**
430
+ * Read a DB and parse the result
431
+ * @param {int} DBNr - The DB Number to read
432
+ * @param {array} vars - Array of Var objects
433
+ * @param {int} vars[].start - Position of the first byte
434
+ * @param {int} [vars[].bit] - Position of the bit in the byte
435
+ * @param {Datatype} vars[].type - Data type (BYTE, WORD, INT, etc), see {@link /s7client/?api=Datatypes|Datatypes}
436
+ * @returns {Promise} - Resolves to the vars array with populate *value* property
437
+ */
438
+ var _readDB = function (DBNr, vars) {
439
+ return new Promise((resolve, reject) => {
440
+ if (vars.length === 0) return resolve([]);
441
+
442
+ let end = 0;
443
+ let offset = Number.MAX_SAFE_INTEGER;
444
+ vars.forEach(v => {
445
+ if (v.Start < offset) offset = v.Start;
446
+ if (end < v.Start + datatypes[v.type].bytes) {
447
+ end = v.Start + datatypes[v.type].bytes;
448
+ }
449
+ });
450
+ s7client.DBRead(DBNr, offset, end - offset, (err, res) => {
451
+ if (err) {
452
+ logger.error(`'${data.name}' ${err}: ${_getErr(err)}`, false);
453
+ } else {
454
+ vars.map(v => {
455
+ let value = null;
456
+ if (v.type === 'BOOL') {
457
+ // check the full byte and send all bit if there is a change
458
+ value = datatypes['BYTE'].parser(res, v.Start - offset, -1);
459
+ } else {
460
+ value = datatypes[v.type].parser(res, v.Start - offset, v.bit);
461
+ }
462
+ v.changed = value !== v.value;
463
+ v.value = value;
464
+ return v;
465
+ });
466
+ }
467
+ resolve(vars);
468
+ });
469
+ });
470
+ }
471
+
472
+ /**
473
+ * Read multiple Vars
474
+ * @param {*} vars
475
+ */
476
+ var _readVars = function (vars) {
477
+ return new Promise((resolve, reject) => {
478
+ s7client.ReadMultiVars(vars, (err, res) => {
479
+ if (err) return _getErr(err);
480
+ let errs = [];
481
+ res = vars.map((v, i) => {
482
+ let value = null;
483
+ if (res[i].Result !== 0) {
484
+ errs.push(`${v.name} - ${s7client.ErrorText(res[i].Result)}`);
485
+ } else {
486
+ try {
487
+ if (v.type === 'BOOL') {
488
+ // check the full byte and send all bit if there is a change
489
+ value = datatypes['BYTE'].parser(res[i].Data);//, v.Start, -1);
490
+ } else {
491
+ value = datatypes[v.type].parser(res[i].Data);
492
+ }
493
+ v.changed = value !== v.value;
494
+ v.value = value;
495
+ return v;
496
+ } catch { }
497
+ }
498
+ });
499
+ if (errs.length) return reject(_getErr(errs));
500
+ resolve(vars);
501
+ });
502
+ });
503
+ }
504
+
505
+ /**
506
+ * Write a DB and parse the result
507
+ * @param {int} DBNr - The DB Number to read
508
+ * @param {array} vars - Array of Var objects
509
+ * @param {int} vars[].Start - Position of the first byte
510
+ * @param {int} [vars[].bit] - Position of the bit in the byte
511
+ * @param {Datatype} vars[].type - Data type (BYTE, WORD, INT, etc), see {@link /s7client/?api=Datatypes|Datatypes}
512
+ * @returns {Promise} - Resolves to the vars array with populate *value* property
513
+ */
514
+ var _writeDB = function (DBNr, vars) {
515
+ return new Promise((resolve, reject) => {
516
+ if (vars.length === 0) return resolve([]);
517
+ let end = 0;
518
+ let offset = Number.MAX_SAFE_INTEGER;
519
+ let v = vars[0];
520
+ if (v.Start < offset) offset = v.Start;
521
+ if (end < v.Start + datatypes[v.type].bytes) {
522
+ end = v.Start + datatypes[v.type].bytes;
523
+ }
524
+ let buffer = datatypes[v.type].formatter(v.value)
525
+ s7client.DBWrite(DBNr, offset, end - offset, buffer, (err, res) => {
526
+ if (err) return _getErr(err);
527
+ resolve(changed);
528
+ });
529
+ });
530
+ }
531
+
532
+ /**
533
+ * Write multiple Vars
534
+ * @param {array} vars - Array of Var objects
535
+ * @param {int} vars[].Start - Position of the first byte
536
+ * @param {int} [vars[].bit] - Position of the bit in the byte
537
+ * @param {Datatype} vars[].type - Data type (BYTE, WORD, INT, etc), see {@link /s7client/?api=Datatypes|Datatypes}
538
+ * @param {string} vars[].area - Area (pe, pa, mk, db, ct, tm)
539
+ * @param {string} [vars[].dbnr] - DB Nr if read from area=db
540
+ * @param vars[].value - Value
541
+ * @returns {Promise} - Resolves to the vars array with populate *value* property
542
+ */
543
+ var _writeVars = function (vars) {
544
+ var toWrite = vars.map(v => ({
545
+ Area: v.Area,
546
+ WordLen: datatypes[v.type].S7WordLen,
547
+ DBNumber: v.dbnum,
548
+ Start: v.type === 'BOOL' ? v.Start * 8 + v.bit : v.Start,
549
+ Amount: 1,
550
+ Data: datatypes[v.type].formatter(parseFloat(v.value))
551
+ }));
552
+ return new Promise((resolve, reject) => {
553
+ s7client.WriteMultiVars(toWrite, (err, res) => {
554
+ if (err) return _getErr(err);
555
+ let errs = [];
556
+
557
+ res = vars.map((v, i) => {
558
+ if (res[i].Result !== 0) return errs.push(s7client.ErrorText(res[i].Result));
559
+ return v;
560
+ });
561
+ if (errs.length) return reject(_getErr(errs));
562
+ resolve(res);
563
+ });
564
+ });
565
+ }
566
+
567
+ /**
568
+ * Return the Tag object (DbItem) with value
569
+ * DB X DBX 10.3 = Bool, DB X DBB 10 = Byte/Char, DB X DBW 10 = Int/Word, DB X DBD 10 = DInt/DWord, DB X DBD 10 = Real
570
+ */
571
+ var _getTagItem = function (tag) {
572
+ try {
573
+ var variable = tag.address.toUpperCase().split(' ').join('');
574
+ if (variable) {
575
+ var prefix = variable.substring(0, 2);
576
+ if (prefix === 'DB') {
577
+ // DB[n]"
578
+ var startpos = variable.indexOf('.');
579
+ var dbNum = parseInt(variable.substring(2, startpos));
580
+ if (dbNum >= 0) {
581
+ // DBX 0.0"
582
+ var dbType = variable.substring(startpos + 1, startpos + 4);
583
+ var dbStart = variable.substring(startpos + 4);
584
+ var result = new DbItem(dbNum);
585
+ result.type = tag.type.toUpperCase();
586
+ result.Area = s7client['S7AreaDB'];
587
+ if (dbType === 'DBB') {
588
+ result.Start = parseInt(dbStart);
589
+ if (result.Start >= 0) {
590
+ return result;
591
+ }
592
+ } else if (dbType === 'DBW') {
593
+ result.Start = parseInt(dbStart);
594
+ if (result.Start >= 0) {
595
+ return result;
596
+ }
597
+ } else if (dbType === 'DBD') {
598
+ result.Start = parseInt(dbStart);
599
+ if (result.Start >= 0) {
600
+ return result;
601
+ }
602
+ } else if (dbType === 'DBX') {
603
+ var dbBool = dbStart.split('.');
604
+ if (dbBool.length >= 2) {
605
+ result.Start = parseInt(dbBool[0]);
606
+ result.bit = parseInt(dbBool[1]);
607
+ if (result.Start >= 0 && result.bit >= 0) {
608
+ return result;
609
+ }
610
+ }
611
+ }
612
+ }
613
+ } else {
614
+ var type = tag.type.toUpperCase();
615
+ var len = datatypes[type].S7WordLen;
616
+ switch (prefix) {
617
+ case 'EB':
618
+ case 'IB':
619
+ case 'EW':
620
+ case 'IW':
621
+ case 'ED':
622
+ case 'ID':
623
+ return { Area: s7client['S7AreaPE'], WordLen: len, Start: parseInt(variable.substring(2)), Amount: 1, type: type };
624
+ case 'AB':
625
+ case 'QB':
626
+ case 'AW':
627
+ case 'QW':
628
+ case 'AD':
629
+ case 'QD':
630
+ return { Area: s7client['S7AreaPA'], WordLen: len, Start: parseInt(variable.substring(2)), Amount: 1, type: type };
631
+ case 'MB':
632
+ case 'MW':
633
+ case 'MD':
634
+ return { Area: s7client['S7AreaMK'], WordLen: len, Start: parseInt(variable.substring(2)), Amount: 1, type: type };
635
+ default:
636
+ len = datatypes['BYTE'].S7WordLen;
637
+ var start = parseInt(variable.substring(1, variable.indexOf('.')));
638
+ var bit = parseInt(variable.substring(variable.indexOf('.') + 1));
639
+ switch (prefix.substring(0, 1)) {
640
+ case 'E':
641
+ case 'I':
642
+ return { Area: s7client['S7AreaPE'], WordLen: len, Start: start, Amount: 1, type: type, bit: bit };
643
+ case 'A':
644
+ case 'Q':
645
+ return { Area: s7client['S7AreaPA'], WordLen: len, Start: start, Amount: 1, type: type, bit: bit };
646
+ case 'M':
647
+ return { Area: s7client['S7AreaMK'], WordLen: len, Start: start, Amount: 1, type: type, bit: bit };
648
+ case 'O':
649
+ case 'T':
650
+ case 'Z':
651
+ case 'C':
652
+ return null;
653
+ default:
654
+ return null;
655
+ }
656
+ }
657
+ }
658
+ }
659
+ } catch (err) {
660
+
661
+ }
662
+ return null;
663
+ }
664
+
665
+ /**
666
+ * Return error message, from error code
667
+ * @param {*} s7err
668
+ */
669
+ var _getErr = function (s7err) {
670
+ if (Array.isArray(s7err)) return new Error('Errors: ' + s7err.join('; '));
671
+ return new Error(s7client.ErrorText(s7err));
672
+ }
673
+ }
674
+
675
+ module.exports = {
676
+ init: function (settings) {
677
+ // deviceCloseTimeout = settings.deviceCloseTimeout || 15000;
678
+ },
679
+ create: function (data, logger, events, manager) {
680
+ try { snap7 = require('node-snap7'); } catch { }
681
+ if (!snap7 && manager) { try { snap7 = manager.require('node-snap7'); } catch { } }
682
+ if (snap7) datatypes = require('./datatypes');
683
+ else return null;
684
+ return new S7client(data, logger, events);
685
+ }
686
+ }
687
+
688
+ function DbItem(dbnum) {
689
+ this.dbnum = dbnum;
690
+ this.type = '';
691
+ this.Area = -1;
692
+ this.Start = -1;
693
+ this.bit = -1;
694
+ this.Tags = [];
695
+ this.BitMap = {};
696
+ }
697
+
698
+ function DbItems(dbnum) {
699
+ this.DBNumber = dbnum;
700
+ this.MaxSize = 0;
701
+ this.Items = {};
702
+ }