From 56667aa0d777d9370eac13e64c2fcb87b1a83f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Bowman=20M=C3=B8rch?= Date: Sun, 1 Oct 2023 11:52:36 +0200 Subject: [PATCH] Bump packages and a bit of cleanup --- package.json | 37 +- src/lib/decoder/auto-decode.ts | 14 +- src/lib/decoder/decoder-interface.ts | 6 +- src/lib/decoder/mysensors-decoder.spec.ts | 48 +- src/lib/decoder/mysensors-decoder.ts | 50 +- src/lib/decoder/mysensors-mqtt.spec.ts | 42 +- src/lib/decoder/mysensors-mqtt.ts | 21 +- src/lib/decoder/mysensors-serial.spec.ts | 48 +- src/lib/decoder/mysensors-serial.ts | 37 +- src/nodes/controller.html | 120 +- src/nodes/decode.html | 81 +- src/nodes/encapsulate.html | 258 +-- src/nodes/encode.html | 80 +- src/nodes/mysdebug.html | 32 +- src/nodes/mysensors-db.html | 5 + yarn.lock | 2364 +++++++++++---------- 16 files changed, 1702 insertions(+), 1541 deletions(-) diff --git a/package.json b/package.json index 7d996cf..20cdf3f 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "author": { "name": "Thomas Bowman Mørch" }, - "version": "4.2.0", + "version": "4.3.0", "engines": { "node": ">=16.0.0" }, @@ -65,28 +65,27 @@ "date-fns-tz": "^2.0.0" }, "devDependencies": { - "@types/chai": "^4.3.5", - "@types/mocha": "^10.0.1", - "@types/node": "^20.1.4", - "@types/node-red": "1.3.1", - "@types/node-red-node-test-helper": "^0.2.3", - "@types/sinon": "^10.0.15", - "@typescript-eslint/eslint-plugin": "^5.59.6", - "@typescript-eslint/parser": "^5.59.6", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-import-newlines": "^1.3.1", - "chai": "^4.3.7", - "eslint": "^8.40.0", + "@types/chai": "^4.3.6", + "@types/mocha": "^10.0.2", + "@types/node": "^20.8.0", + "@types/node-red": "1.3.2", + "@types/node-red-node-test-helper": "^0.3.1", + "@types/sinon": "^10.0.17", + "@typescript-eslint/eslint-plugin": "^6.7.3", + "@typescript-eslint/parser": "^6.7.3", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-import-newlines": "^1.3.4", + "chai": "^4.3.10", + "eslint": "^8.50.0", "husky": "^8.0.3", - "lint-staged": "^13.2.2", + "lint-staged": "^14.0.1", "mocha": "^10.2.0", - "node-red": "^3.0.2", - "node-red-node-test-helper": "^0.3.1", + "node-red": "^3.1.0", + "node-red-node-test-helper": "^0.3.2", "nyc": "^15.1.0", - "sinon": "^15.0.4", + "sinon": "^16.0.0", "source-map-support": "^0.5.21", "ts-node": "^10.9.1", - "tslint": "^6.1.3", - "typescript": "*" + "typescript": "5.2.2" } } diff --git a/src/lib/decoder/auto-decode.ts b/src/lib/decoder/auto-decode.ts index 87e33e4..fcd0b7a 100644 --- a/src/lib/decoder/auto-decode.ts +++ b/src/lib/decoder/auto-decode.ts @@ -5,23 +5,23 @@ import { MsgOrigin, MysensorsCommand, validateStrongMysensorsMsg, -} from '../mysensors-msg'; -import { MysensorsMqtt } from './mysensors-mqtt'; -import { MysensorsSerial } from './mysensors-serial'; +} from '../mysensors-msg' +import { MysensorsMqtt } from './mysensors-mqtt' +import { MysensorsSerial } from './mysensors-serial' export async function AutoDecode( - msg: Readonly + msg: Readonly, ): Promise | undefined> { if (validateStrongMysensorsMsg(msg)) { return { ...msg, origin: MsgOrigin.decoded, - }; + } } if (!msg.topic) { - return new MysensorsSerial().decode(msg as INodeMessage); + return new MysensorsSerial().decode(msg as INodeMessage) } else { - return new MysensorsMqtt().decode(msg as INodeMessage); + return new MysensorsMqtt().decode(msg as INodeMessage) } } diff --git a/src/lib/decoder/decoder-interface.ts b/src/lib/decoder/decoder-interface.ts index 4a41fb6..f1d52d9 100644 --- a/src/lib/decoder/decoder-interface.ts +++ b/src/lib/decoder/decoder-interface.ts @@ -1,4 +1,8 @@ -import { INodeMessage, IStrongMysensorsMsg, MysensorsCommand } from '../mysensors-msg'; +import { + INodeMessage, + IStrongMysensorsMsg, + MysensorsCommand, +} from '../mysensors-msg' export interface IDecoder { decode(msg: Readonly): Promise| undefined> diff --git a/src/lib/decoder/mysensors-decoder.spec.ts b/src/lib/decoder/mysensors-decoder.spec.ts index 35baadc..7f94b47 100644 --- a/src/lib/decoder/mysensors-decoder.spec.ts +++ b/src/lib/decoder/mysensors-decoder.spec.ts @@ -1,19 +1,19 @@ -import {MysensorsDecoder} from './mysensors-decoder'; -import { IStrongMysensorsMsg, MysensorsCommand } from '../mysensors-msg'; -import { expect } from 'chai'; -import { useSinonSandbox } from '../../../test/sinon'; +import {MysensorsDecoder} from './mysensors-decoder' +import { IStrongMysensorsMsg, MysensorsCommand } from '../mysensors-msg' +import { expect } from 'chai' +import { useSinonSandbox } from '../../../test/sinon' describe('lib/decoder/mysensors-decoder', () => { - const sinon = useSinonSandbox(); + const sinon = useSinonSandbox() class dummy extends MysensorsDecoder { public testEnrich(msg: IStrongMysensorsMsg) { - return this.enrich(msg); + return this.enrich(msg) } } it('should descriptions for C_SET message', async () => { - const decoder = new dummy(false); + const decoder = new dummy(false) const result = await decoder.testEnrich({ ack: 0, @@ -22,7 +22,7 @@ describe('lib/decoder/mysensors-decoder', () => { messageType: 1, nodeId: 1, subType: 1, - }); + }) expect(result).to.deep.equal({ _msgid: '', @@ -33,11 +33,11 @@ describe('lib/decoder/mysensors-decoder', () => { nodeId: 1, subType: 1, subTypeStr: 'V_HUM', - }); - }); + }) + }) it('should descriptions for C_REQ message', async () => { - const decoder = new dummy(false); + const decoder = new dummy(false) const result = await decoder.testEnrich({ ack: 0, @@ -46,7 +46,7 @@ describe('lib/decoder/mysensors-decoder', () => { messageType: 2, nodeId: 1, subType: 5, - }); + }) expect(result).to.deep.equal({ _msgid: '', @@ -57,11 +57,11 @@ describe('lib/decoder/mysensors-decoder', () => { nodeId: 1, subType: 5, subTypeStr: 'V_FORECAST', - }); - }); + }) + }) it('should return descriptions for STREAM message', async() => { - const decoder = new dummy(false); + const decoder = new dummy(false) const result = await decoder.testEnrich({ ack: 0, @@ -70,7 +70,7 @@ describe('lib/decoder/mysensors-decoder', () => { messageType: 4, nodeId: 1, subType: 1, - }); + }) expect(result).to.deep.equal({ _msgid: '', @@ -81,16 +81,16 @@ describe('lib/decoder/mysensors-decoder', () => { nodeId: 1, subType: 1, subTypeStr: 'ST_FIRMWARE_CONFIG_RESPONSE', - }); + }) - }); + }) it('should enrich with database lookup', async() => { const database = { getChild: sinon.stub().resolves({sType: 1}), // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any; - const decoder = new dummy(true, database); + } as any + const decoder = new dummy(true, database) const result = await decoder.testEnrich({ ack: 0, @@ -99,7 +99,7 @@ describe('lib/decoder/mysensors-decoder', () => { messageType: 1, nodeId: 1, subType: 1, - }); + }) expect(result).to.deep.equal({ _msgid: '', @@ -111,6 +111,6 @@ describe('lib/decoder/mysensors-decoder', () => { subType: 1, subTypeStr: 'V_HUM', sensorTypeStr: 'S_MOTION', - }); - }); -}); + }) + }) +}) diff --git a/src/lib/decoder/mysensors-decoder.ts b/src/lib/decoder/mysensors-decoder.ts index a4ed044..a2b505d 100644 --- a/src/lib/decoder/mysensors-decoder.ts +++ b/src/lib/decoder/mysensors-decoder.ts @@ -1,50 +1,50 @@ -import { IStorage } from '../storage-interface'; -import { IStrongMysensorsMsg, MysensorsCommand } from '../mysensors-msg'; +import { IStorage } from '../storage-interface' +import { IStrongMysensorsMsg, MysensorsCommand } from '../mysensors-msg' import { mysensor_command, mysensor_data, mysensor_internal, mysensor_sensor, mysensor_stream, -} from '../mysensors-types'; -import { NullCheck } from '../nullcheck'; +} from '../mysensors-types' +import { NullCheck } from '../nullcheck' export abstract class MysensorsDecoder { - protected enrichWithDb: boolean; + protected enrichWithDb: boolean constructor(enrich?: boolean, private database?: IStorage) { - this.enrichWithDb = enrich && !!database || false; + this.enrichWithDb = enrich && !!database || false } protected async enrich(msg: IStrongMysensorsMsg): Promise> { const newMsg: IStrongMysensorsMsg = { - ...msg - }; - newMsg.messageTypeStr = mysensor_command[msg.messageType]; + ...msg, + } + newMsg.messageTypeStr = mysensor_command[msg.messageType] switch (msg.messageType) { - case mysensor_command.C_INTERNAL: - newMsg.subTypeStr = mysensor_internal[msg.subType]; - break; - case mysensor_command.C_PRESENTATION: - newMsg.subTypeStr = mysensor_sensor[msg.subType]; - break; - case mysensor_command.C_REQ: - case mysensor_command.C_SET: - newMsg.subTypeStr = mysensor_data[msg.subType]; - break; - case mysensor_command.C_STREAM: - newMsg.subTypeStr = mysensor_stream[msg.subType]; - break; + case mysensor_command.C_INTERNAL: + newMsg.subTypeStr = mysensor_internal[msg.subType] + break + case mysensor_command.C_PRESENTATION: + newMsg.subTypeStr = mysensor_sensor[msg.subType] + break + case mysensor_command.C_REQ: + case mysensor_command.C_SET: + newMsg.subTypeStr = mysensor_data[msg.subType] + break + case mysensor_command.C_STREAM: + newMsg.subTypeStr = mysensor_stream[msg.subType] + break } if (this.enrichWithDb && this.database) { - const res = await this.database.getChild(msg.nodeId, msg.childSensorId); + const res = await this.database.getChild(msg.nodeId, msg.childSensorId) if (NullCheck.isDefinedOrNonNull(res)) { - newMsg.sensorTypeStr = mysensor_sensor[res.sType]; + newMsg.sensorTypeStr = mysensor_sensor[res.sType] } } - return newMsg; + return newMsg } } diff --git a/src/lib/decoder/mysensors-mqtt.spec.ts b/src/lib/decoder/mysensors-mqtt.spec.ts index 983ee52..8929ad0 100644 --- a/src/lib/decoder/mysensors-mqtt.spec.ts +++ b/src/lib/decoder/mysensors-mqtt.spec.ts @@ -1,8 +1,12 @@ -import { expect } from 'chai'; -import 'mocha'; -import { IMysensorsMsg, INodeMessage, IStrongMysensorsMsg } from '../mysensors-msg'; -import { mysensor_command } from '../mysensors-types'; -import { MysensorsMqtt } from './mysensors-mqtt'; +import { expect } from 'chai' +import 'mocha' +import { + IMysensorsMsg, + INodeMessage, + IStrongMysensorsMsg, +} from '../mysensors-msg' +import { mysensor_command } from '../mysensors-types' +import { MysensorsMqtt } from './mysensors-mqtt' describe('MQTT decode / encode', () => { it('Should create correct decoded output when mqtt topic is received', async () => { @@ -10,7 +14,7 @@ describe('MQTT decode / encode', () => { _msgid: '', payload: '6', topic: 'mys-in/1/2/3/0/5', - }; + } const expected: IMysensorsMsg = { _msgid: '', ack: 0, @@ -21,19 +25,19 @@ describe('MQTT decode / encode', () => { subType: 5, topicRoot: 'mys-in', - }; - const out = await new MysensorsMqtt().decode(msg); - expect(out).to.include(expected); - }); + } + const out = await new MysensorsMqtt().decode(msg) + expect(out).to.include(expected) + }) it('if not mysensors formatted input return undefined', async () => { const msg: INodeMessage = { _msgid: '', payload: '200', - }; - const out = await new MysensorsMqtt().decode(msg); - expect(out).to.equal(undefined); - }); + } + const out = await new MysensorsMqtt().decode(msg) + expect(out).to.equal(undefined) + }) it('Encode to mysensors mqtt message', () => { const msg: IStrongMysensorsMsg = { @@ -45,8 +49,8 @@ describe('MQTT decode / encode', () => { payload: '100', subType: 4, topicRoot: 'mys-out', - }; - const out = new MysensorsMqtt().encode(msg); - expect(out).to.include({topic: 'mys-out/1/2/0/0/4', payload: '100'}); - }); -}); + } + const out = new MysensorsMqtt().encode(msg) + expect(out).to.include({topic: 'mys-out/1/2/0/0/4', payload: '100'}) + }) +}) diff --git a/src/lib/decoder/mysensors-mqtt.ts b/src/lib/decoder/mysensors-mqtt.ts index 4a12bda..0486622 100644 --- a/src/lib/decoder/mysensors-mqtt.ts +++ b/src/lib/decoder/mysensors-mqtt.ts @@ -1,12 +1,17 @@ -import { INodeMessage, IStrongMysensorsMsg, MsgOrigin, MysensorsCommand } from '../mysensors-msg'; -import { IDecoder } from './decoder-interface'; -import { MysensorsDecoder } from './mysensors-decoder'; +import { + INodeMessage, + IStrongMysensorsMsg, + MsgOrigin, + MysensorsCommand, +} from '../mysensors-msg' +import { IDecoder } from './decoder-interface' +import { MysensorsDecoder } from './mysensors-decoder' export class MysensorsMqtt extends MysensorsDecoder implements IDecoder { public async decode(msg: Readonly): Promise| undefined> { if (msg.topic) { - const split = msg.topic.toString().split('/'); + const split = msg.topic.toString().split('/') if (split.length >= 6) { const msgOut: IStrongMysensorsMsg = { ...msg, @@ -17,19 +22,19 @@ export class MysensorsMqtt extends MysensorsDecoder implements IDecoder { ack: (split[split.length - 2] === '1') ? 1 : 0, subType: parseInt( split[split.length - 1], 10 ), origin: MsgOrigin.mqtt, - }; - return this.enrich(msgOut); + } + return this.enrich(msgOut) } } } public encode( - msg: Readonly> + msg: Readonly>, ): IStrongMysensorsMsg { return { ...msg, topic: (msg.topicRoot ? `${msg.topicRoot}/` : '') + `${msg.nodeId}/${msg.childSensorId}/${msg.messageType}/${msg.ack}/${msg.subType}`, - }; + } } } diff --git a/src/lib/decoder/mysensors-serial.spec.ts b/src/lib/decoder/mysensors-serial.spec.ts index 6383310..3e9207a 100644 --- a/src/lib/decoder/mysensors-serial.spec.ts +++ b/src/lib/decoder/mysensors-serial.spec.ts @@ -1,21 +1,25 @@ -import { expect } from 'chai'; -import 'mocha'; -import { IMysensorsMsg, INodeMessage, IStrongMysensorsMsg } from '../mysensors-msg'; -import { mysensor_command } from '../mysensors-types'; -import { MysensorsSerial } from './mysensors-serial'; +import { expect } from 'chai' +import 'mocha' +import { + IMysensorsMsg, + INodeMessage, + IStrongMysensorsMsg, +} from '../mysensors-msg' +import { mysensor_command } from '../mysensors-types' +import { MysensorsSerial } from './mysensors-serial' describe('Serial decode / encode', () => { - let decode: MysensorsSerial; + let decode: MysensorsSerial beforeEach(() => { - decode = new MysensorsSerial(); - }); + decode = new MysensorsSerial() + }) it('Should create correct decoded output when serial is received', async () => { const msg: INodeMessage = { _msgid: 'id', payload: '1;2;3;0;5;6', - }; + } const expected: IMysensorsMsg = { _msgid: 'id', @@ -25,19 +29,19 @@ describe('Serial decode / encode', () => { nodeId: 1, payload: '6', subType: 5, - }; - const out = await decode.decode(msg); - expect(out).to.include(expected); - }); + } + const out = await decode.decode(msg) + expect(out).to.include(expected) + }) it('if not mysensors formatted input return undefined', async () => { const msg: INodeMessage = { _msgid: 'id', payload: '200', - }; - const out = await decode.decode(msg); - expect(out).to.eq(undefined); - }); + } + const out = await decode.decode(msg) + expect(out).to.eq(undefined) + }) it('Encode to mysensors serial message', () => { const msg: IStrongMysensorsMsg = { @@ -48,8 +52,8 @@ describe('Serial decode / encode', () => { nodeId: 1, payload: '100', subType: 4, - }; - const out = decode.encode(msg); - expect(out).to.include({payload: '1;2;2;0;4;100'}); - }); -}); + } + const out = decode.encode(msg) + expect(out).to.include({payload: '1;2;2;0;4;100'}) + }) +}) diff --git a/src/lib/decoder/mysensors-serial.ts b/src/lib/decoder/mysensors-serial.ts index 74ed311..6d01469 100644 --- a/src/lib/decoder/mysensors-serial.ts +++ b/src/lib/decoder/mysensors-serial.ts @@ -1,18 +1,23 @@ -import { INodeMessage, IStrongMysensorsMsg, MsgOrigin, MysensorsCommand } from '../mysensors-msg'; -import { IStorage } from '../storage-interface'; -import { IDecoder } from './decoder-interface'; -import { MysensorsDecoder } from './mysensors-decoder'; +import { + INodeMessage, + IStrongMysensorsMsg, + MsgOrigin, + MysensorsCommand, +} from '../mysensors-msg' +import { IStorage } from '../storage-interface' +import { IDecoder } from './decoder-interface' +import { MysensorsDecoder } from './mysensors-decoder' export class MysensorsSerial extends MysensorsDecoder implements IDecoder { constructor(enrich?: boolean, database?: IStorage, private addNewline = false) { - super(enrich, database); + super(enrich, database) } public async decode(msg: Readonly): Promise| undefined> { - let message = msg.payload.toString(); - message = message.replace(/(\r\n|\n|\r)/gm, ''); - const tokens = message.split(';'); + let message = msg.payload.toString() + message = message.replace(/(\r\n|\n|\r)/gm, '') + const tokens = message.split(';') if (tokens.length === 6) { const msgOut: IStrongMysensorsMsg = { @@ -23,15 +28,15 @@ export class MysensorsSerial extends MysensorsDecoder implements IDecoder { ack: tokens[3] === '1' ? 1 : 0, subType: parseInt(tokens[4], 10), payload: tokens[5], - origin: MsgOrigin.serial - }; + origin: MsgOrigin.serial, + } - return this.enrich(msgOut); + return this.enrich(msgOut) } } public encode( - msg: Readonly> + msg: Readonly>, ): IStrongMysensorsMsg { // eslint-disable-next-line max-len const payload = [ @@ -40,11 +45,11 @@ export class MysensorsSerial extends MysensorsDecoder implements IDecoder { msg.messageType, msg.ack, msg.subType, - msg.payload - ].join(';'); + msg.payload, + ].join(';') return { ...msg, - payload: `${payload}${this.addNewline ? '\n' : ''}` - }; + payload: `${payload}${this.addNewline ? '\n' : ''}`, + } } } diff --git a/src/nodes/controller.html b/src/nodes/controller.html index ce77427..99eaeaa 100644 --- a/src/nodes/controller.html +++ b/src/nodes/controller.html @@ -1,53 +1,56 @@