From 024038a775341d4155e0fefe4b6510bbc863a544 Mon Sep 17 00:00:00 2001 From: Pietro Brenna Date: Wed, 10 Nov 2021 18:11:17 +0100 Subject: [PATCH] nodi s7 briq --- package-lock.json | 714 ++++++++++++++++++++++++++++++++++++++++- package.json | 18 +- red/s7/s7-briq.html | 52 +++ red/s7/s7-briq.js | 230 +++++++++++++ testing/poetry.lock | 24 ++ testing/pyproject.toml | 15 + testing/test.py | 18 ++ 7 files changed, 1060 insertions(+), 11 deletions(-) create mode 100644 red/s7/s7-briq.html create mode 100644 red/s7/s7-briq.js create mode 100644 testing/poetry.lock create mode 100644 testing/pyproject.toml create mode 100644 testing/test.py diff --git a/package-lock.json b/package-lock.json index 294210d..6772826 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,675 @@ { "name": "red-briq-nodes", - "version": "0.2.4", - "lockfileVersion": 1, + "version": "0.2.5", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "red-briq-nodes", + "version": "0.2.5", + "license": "Apache-2.0", + "dependencies": { + "denque": "^1.4.1", + "is-ip": "^3.1.0", + "nodes7": "^0.3.14", + "simple-xmpp": "^1.3.1", + "validate": "^5.1.0" + } + }, + "node_modules/@xmpp/jid": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@xmpp/jid/-/jid-0.0.2.tgz", + "integrity": "sha1-DVKMqdWNr8gzZlVk/+YvMyoxZ/I=" + }, + "node_modules/@xmpp/streamparser": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@xmpp/streamparser/-/streamparser-0.0.6.tgz", + "integrity": "sha1-EYAz6p23yGoctGED8mnr/3n28eo=", + "dependencies": { + "@xmpp/xml": "^0.1.3", + "inherits": "^2.0.3", + "ltx": "^2.5.0" + } + }, + "node_modules/@xmpp/xml": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@xmpp/xml/-/xml-0.1.3.tgz", + "integrity": "sha1-HxQ5nlPkGWiFWGmPbGLnHjmoam4=", + "dependencies": { + "inherits": "^2.0.3", + "ltx": "^2.6.2" + } + }, + "node_modules/ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "node_modules/backoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.3.0.tgz", + "integrity": "sha1-7nx+OAk/kuRyhZ22NedlJFT8Ieo=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/browser-request": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", + "integrity": "sha1-ns5bWsqJopkyJC4Yv5M975h2zBc=", + "engines": [ + "node" + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.1.tgz", + "integrity": "sha1-ikeQFwAjjk/DIml3EjAibyS0Fak=" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/eivindfjeldstad-dot": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/eivindfjeldstad-dot/-/eivindfjeldstad-dot-0.0.1.tgz", + "integrity": "sha1-IvyXa/rzBuCDmjHbjoITSA+vuJM=", + "deprecated": "Use @eivifj/dot instead" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "dependencies": { + "ip-regex": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "node_modules/ltx": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/ltx/-/ltx-2.9.2.tgz", + "integrity": "sha512-llB7HflFhlfsYYT1SAe80elCBO5C20ryLdwPB/A/BZk38hhVeZztDlWQ9uTyvKNPX4aK6sA+JfS1f/mfzp5cxA==", + "dependencies": { + "inherits": "^2.0.4" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dependencies": { + "mime-db": "1.43.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/node-xmpp-client": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/node-xmpp-client/-/node-xmpp-client-3.2.0.tgz", + "integrity": "sha1-r0Un3wzFq9JpDLohOcwezcgeoYk=", + "deprecated": "this package is deprecated please use https://www.npmjs.com/package/@xmpp/client", + "dependencies": { + "browser-request": "^0.3.3", + "debug": "^2.2.0", + "md5.js": "^1.3.3", + "minimist": "^1.2.0", + "node-xmpp-core": "^5.0.9", + "request": "^2.65.0", + "ws": "^1.1.1" + } + }, + "node_modules/node-xmpp-core": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/node-xmpp-core/-/node-xmpp-core-5.0.9.tgz", + "integrity": "sha1-XCjCjtsfs/i+uixnYHd2E/SPNCo=", + "deprecated": "this package is deprecated please use https://github.com/xmppjs/xmpp.js", + "dependencies": { + "@xmpp/jid": "^0.0.2", + "@xmpp/streamparser": "^0.0.6", + "@xmpp/xml": "^0.1.3", + "debug": "^2.2.0", + "inherits": "^2.0.1", + "lodash.assign": "^4.0.0", + "node-xmpp-tls-connect": "^1.0.1", + "reconnect-core": "https://github.com/dodo/reconnect-core/tarball/merged" + } + }, + "node_modules/node-xmpp-tls-connect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/node-xmpp-tls-connect/-/node-xmpp-tls-connect-1.0.1.tgz", + "integrity": "sha1-kazkOsJrE4hhsr5HjfnfGdYdxcM=", + "deprecated": "this package is deprecated please use https://github.com/xmppjs/xmpp.js" + }, + "node_modules/nodes7": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/nodes7/-/nodes7-0.3.14.tgz", + "integrity": "sha512-94SSssnZ4Vm1AcyFYnWTI9Se78NXIPVJ3avtn6K+nUqLDuQtH4Qrbo1fAV3LgzAgds5CnT8ff7eHZYRlYBcIxQ==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/qbox/-/qbox-0.1.7.tgz", + "integrity": "sha1-6A8NxdCfhp2IghaMP2asjdKEDwI=", + "engines": { + "node": "*" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/reconnect-core": { + "version": "0.0.1", + "resolved": "https://github.com/dodo/reconnect-core/tarball/merged", + "integrity": "sha512-wZK/v5ZaNaSUs2Wnwh2YSX/Jqv6bQHKNEwojdzV11tByKziR9ikOssf5tvUhx+8/oCBz6AakOFAjZuqPoiRHJQ==", + "license": "MIT", + "dependencies": { + "backoff": "~2.3.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/simple-xmpp": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-xmpp/-/simple-xmpp-1.3.1.tgz", + "integrity": "sha512-o0wGVlI8Q4o0qTz6Kylbo1QPOMVn+DA/vyHHZecqcQ+LK4ZWGe3wtRON9QjHAkSyxB36PoagmiUz4pHADau8Mw==", + "dependencies": { + "node-xmpp-client": "^3.0.0", + "qbox": "0.1.x" + } + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/typecast": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/typecast/-/typecast-0.0.1.tgz", + "integrity": "sha1-//t13La98d744pO2tuiT1sHtGd4=" + }, + "node_modules/ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/validate": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/validate/-/validate-5.1.0.tgz", + "integrity": "sha512-Y+vJv+xR3XsaQM8W1rQvwc6is/sgCUBv3lvNKc2DZ1HcVcEWAaHVSFB5uoxkQnw2riUq77Rg5nv1u8YuuSu/Zw==", + "dependencies": { + "component-type": "1.2.1", + "eivindfjeldstad-dot": "0.0.1", + "typecast": "0.0.1" + }, + "engines": { + "node": ">=7.6" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dependencies": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + } + }, "dependencies": { "@xmpp/jid": { "version": "0.0.2", @@ -98,6 +765,11 @@ "delayed-stream": "~1.0.0" } }, + "component-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.1.tgz", + "integrity": "sha1-ikeQFwAjjk/DIml3EjAibyS0Fak=" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -138,6 +810,11 @@ "safer-buffer": "^2.1.0" } }, + "eivindfjeldstad-dot": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/eivindfjeldstad-dot/-/eivindfjeldstad-dot-0.0.1.tgz", + "integrity": "sha1-IvyXa/rzBuCDmjHbjoITSA+vuJM=" + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -219,6 +896,19 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" + }, + "is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "requires": { + "ip-regex": "^4.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -340,6 +1030,11 @@ "resolved": "https://registry.npmjs.org/node-xmpp-tls-connect/-/node-xmpp-tls-connect-1.0.1.tgz", "integrity": "sha1-kazkOsJrE4hhsr5HjfnfGdYdxcM=" }, + "nodes7": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/nodes7/-/nodes7-0.3.14.tgz", + "integrity": "sha512-94SSssnZ4Vm1AcyFYnWTI9Se78NXIPVJ3avtn6K+nUqLDuQtH4Qrbo1fAV3LgzAgds5CnT8ff7eHZYRlYBcIxQ==" + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -466,6 +1161,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "typecast": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/typecast/-/typecast-0.0.1.tgz", + "integrity": "sha1-//t13La98d744pO2tuiT1sHtGd4=" + }, "ultron": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", @@ -484,6 +1184,16 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "validate": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/validate/-/validate-5.1.0.tgz", + "integrity": "sha512-Y+vJv+xR3XsaQM8W1rQvwc6is/sgCUBv3lvNKc2DZ1HcVcEWAaHVSFB5uoxkQnw2riUq77Rg5nv1u8YuuSu/Zw==", + "requires": { + "component-type": "1.2.1", + "eivindfjeldstad-dot": "0.0.1", + "typecast": "0.0.1" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", diff --git a/package.json b/package.json index cbca5f3..33ad0e8 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,13 @@ { "name": "red-briq-nodes", - "version": "0.2.4", - "description": "A Node-RED node to talk to an XMPP server", + "version": "0.2.5", + "description": "Various forked and original nodes", "dependencies": { "denque": "^1.4.1", - "simple-xmpp": "^1.3.1" + "simple-xmpp": "^1.3.1", + "is-ip": "^3.1.0", + "nodes7": "^0.3.14", + "validate": "^5.1.0" }, "repository": { "type": "git", @@ -20,12 +23,9 @@ "xmpp": "red/xmpp/92-xmpp.js", "my-debounce": "red/my-debounce/my-debounce.js", "command-parse": "red/command-parse/command-parse.js", - "briq-tcp": "red/tcp/tcp.js" + "briq-tcp": "red/tcp/tcp.js", + "s7-briq": "red/s7/s7-briq.js" } }, - "author": { - "name": "Dave Conway-Jones", - "email": "ceejay@vnet.ibm.com", - "url": "http://nodered.org" - } + "author": "info@briq.it" } diff --git a/red/s7/s7-briq.html b/red/s7/s7-briq.html new file mode 100644 index 0000000..9256297 --- /dev/null +++ b/red/s7/s7-briq.html @@ -0,0 +1,52 @@ + + + + + + + + + + \ No newline at end of file diff --git a/red/s7/s7-briq.js b/red/s7/s7-briq.js new file mode 100644 index 0000000..cdaba2a --- /dev/null +++ b/red/s7/s7-briq.js @@ -0,0 +1,230 @@ +const Schema = require('validate'); +const isIp = require('is-ip'); +const NodeS7 = require('nodes7'); +const slowConnect = 5000; +function hop(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} +function pos_integer(n) { + return parseInt(n) == n && n >= 0; +} +function is_ip(s) { + return isIp.version(s) !== undefined; +} +const plc_schema = new Schema({ + ip: { + type: String, + required: true, + use: { is_ip } + }, + port: { + type: Number, + required: true, + use: { pos_integer } + }, + rack: { + type: Number, + required: true, + use: { pos_integer } + }, + slot: { + type: Number, + required: true, + use: { pos_integer } + } +}); +const write_msg = new Schema({ + plc: plc_schema, + payload: { + variable: { + type: String, + required: true + }, + value: { + required: true + } + } +}); +const read_msg = new Schema({ + plc: plc_schema, + payload: { + variable: { + type: String, + required: true + }, + } +}); +let s7nodes = {}; +let s7promises = {}; +let s7_read_write_queue = {}; // lista di {msg, resolve, reject} +let s7write_lock = {}; // si può scrivere +function s7node_from_plc(plc) { + if (hop(s7nodes, plc.ip)) { + // c'è già un oggetto connessione + let s7obj = s7nodes[plc.ip]; + if (s7obj.isoConnectionState == 4) { + // è connesso + return new Promise((resolve, reject) => { + resolve(s7obj) + }); + } else { + // non è connesso: rifare + delete s7nodes[plc.ip]; + return s7node_from_plc(plc); + } + } else if (hop(s7promises, plc.ip)) { + // sta già provando a connettersi ma bisogna aspettare la promise + let prom = s7promises[plc.ip]; + return prom.then(() => { + return s7nodes[plc.ip]; + }, () => { + return s7node_from_plc(plc) + }); + } else { + let conn_opt = { + host: plc.ip, + port: plc.port, + rack: plc.rack, + slot: plc.slot + }; + let nuovo = new NodeS7(); + let prom = new Promise( + (resolve, reject) => { + setTimeout(() => { + nuovo.initiateConnection( + conn_opt, + (arg1) => { + delete s7promises[plc.ip]; + if (arg1 !== undefined) { + reject(arg1) + } else { + s7nodes[plc.ip] = nuovo; + resolve(nuovo) + } + }) + }, slowConnect); + }); + s7promises[plc.ip] = prom; + return prom; + } +}; +function s7_write(plc, obj, variable, value) { + if (!hop(s7_read_write_queue, plc.ip)) { + s7_read_write_queue[plc.ip] = []; + } + let queue_prom = {}; + let out = new Promise((resolve, reject) => { + queue_prom.resolve = resolve; + queue_prom.reject = reject; + }); + s7_read_write_queue[plc.ip].push({ action: "write", variable, value, reject: queue_prom.reject, resolve: queue_prom.resolve }); + s7_read_write_loop(plc.ip, obj); + return out; +} +function s7_read(plc, obj, variable) { + if (!hop(s7_read_write_queue, plc.ip)) { + s7_read_write_queue[plc.ip] = []; + } + let queue_prom = {}; + let out = new Promise((resolve, reject) => { + queue_prom.resolve = resolve; + queue_prom.reject = reject; + }); + s7_read_write_queue[plc.ip].push({ action: "read", variable, reject: queue_prom.reject, resolve: queue_prom.resolve }); + s7_read_write_loop(plc.ip, obj); + return out; +} +function s7_read_write_loop(ip, obj) { + let q = s7_read_write_queue[ip]; + if (!hop(s7write_lock, ip)) { + s7write_lock[ip] = false; + } + if (!s7write_lock[ip] && q.length > 0) { + s7write_lock[ip] = true; + let item = q.shift(); + if (item.action == "write") { + obj.writeItems(item.variable, [item.value], (e) => { + if (e) { + // questa scrittura è fallita + item.reject(e); + } else { + // questa scrittura è riuscita + item.resolve(); + } + s7write_lock[ip] = false; + s7_read_write_loop(ip, obj); + }) + } else if (item.action == "read") { + obj.removeItems(undefined); // questo elimina tutte + obj.addItems(item.variable); + obj.readAllItems((anyBadQualities, dataObject) => { + if (anyBadQualities) { + console.error("bad qual", anyBadQualities) + item.reject(anyBadQualities); + } else { + console.log("letti", dataObject); + item.resolve(dataObject[item.variable]); + } + s7write_lock[ip] = false; + s7_read_write_loop(ip, obj); + }) + } + } else { + // è già lockato o vuoto + } +} +module.exports = function (RED) { + function S7BriqWrite(config) { + RED.nodes.createNode(this, config); + var node = this; + node.on('input', function (msg) { + try { + write_msg.assert(msg); + } catch (e) { + let errors = write_msg.validate(msg); + node.error("Msg non valido: " + errors.map(x => x.path + ": " + x.error).join("\n")); + return; + } + s7node_from_plc(msg.plc).then(s7conn => { + return s7_write(msg.plc, s7conn, msg.payload.variable, [msg.payload.value]); + }).then(() => { + msg.result = "ok"; + node.send(msg); + return true; + }).catch(err => { + msg.result = "err"; + node.send(msg); + node.error("Impossibile scrivere il valore: " + err); + }); + }); + } + RED.nodes.registerType("s7briqwrite", S7BriqWrite); + + function S7BriqRead(config) { + RED.nodes.createNode(this, config); + var node = this; + node.on('input', function (msg) { + console.log("input", msg); + try { + read_msg.assert(msg); + } catch (e) { + let errors = write_msg.validate(msg); + node.error("Msg non valido: " + errors.map(x => x.path + ": " + x.error).join("\n")); + return; + } + s7node_from_plc(msg.plc).then(s7conn => { + return s7_read(msg.plc, s7conn, msg.payload.variable); + }).then((out) => { + msg.result = "ok"; + msg.payload.value = out; + node.send(msg); + return true; + }).catch(err => { + msg.result = "err"; + node.send(msg); + node.error("Impossibile scrivere il valore: " + err); + }); + }); + } + RED.nodes.registerType("s7briqread", S7BriqRead); +} \ No newline at end of file diff --git a/testing/poetry.lock b/testing/poetry.lock new file mode 100644 index 0000000..003b0f3 --- /dev/null +++ b/testing/poetry.lock @@ -0,0 +1,24 @@ +[[package]] +name = "python-snap7" +version = "1.1" +description = "Python wrapper for the snap7 library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-asyncio", "mypy", "pycodestyle", "types-setuptools"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "3d111be4ca682f78c931e41917cd86b1659ff3c844220b973392dd844d411fd3" + +[metadata.files] +python-snap7 = [ + {file = "python-snap7-1.1.tar.gz", hash = "sha256:0fbb25d3c6cc1328ac5916aaf0d02f96c7939804bb387079d3b84ab44494a1f9"}, + {file = "python_snap7-1.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:807b78d32b395ef30ff9a654c4d40468633c054f81defbcf1463eb5e3d894098"}, + {file = "python_snap7-1.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:29c2ff855ff0da35f9b3c3ec454add8c8a73f68102bcc9aa395cdba2ede18df0"}, + {file = "python_snap7-1.1-py3-none-win_amd64.whl", hash = "sha256:b4e74a8a8a241ae12b4fb087a8291707bee03f5ae7cd328b9b768a524ff2519f"}, +] diff --git a/testing/pyproject.toml b/testing/pyproject.toml new file mode 100644 index 0000000..bef6ab8 --- /dev/null +++ b/testing/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "red-s7-briq-testing" +version = "0.1.0" +description = "" +authors = ["Pietro Brenna "] + +[tool.poetry.dependencies] +python = "^3.9" +python-snap7 = "^1.1" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/testing/test.py b/testing/test.py new file mode 100644 index 0000000..65a480c --- /dev/null +++ b/testing/test.py @@ -0,0 +1,18 @@ +import snap7 +import time +from snap7.types import Areas +from ctypes import c_char, byref, sizeof + +class MyServer(snap7.server.Server): + pass + +s = MyServer() +area_m = (c_char * 160)() +s.register_area(snap7.types.srvAreaMK, 0, area_m) +s.start(tcpport=1102) +while True: + ev = s.pick_event() + if ev is None: + time.sleep(1) + else: + print(s.event_text(ev)) \ No newline at end of file