diff --git a/README.md b/README.md index f9f5506..bc5f4ac 100755 --- a/README.md +++ b/README.md @@ -178,87 +178,87 @@ client.connect(); Closes the connection. -#### getVersion() +#### getVersion(senderId) -Requests the system version string from the connected unit. Emits the `version` event when the response comes back. +Requests the system version string from the connected unit. Emits the `version` event when the response comes back. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### getPoolStatus() +#### getPoolStatus(senderId) -Requests pool status from the connected unit. Emits the `poolStatus` event when the response comes back. +Requests pool status from the connected unit. Emits the `poolStatus` event when the response comes back. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### getChemicalData() +#### getChemicalData(senderId) -Requests chemical data from the connected unit (may require an IntelliChem or similar). Emits the `chemicalData` event when the response comes back. +Requests chemical data from the connected unit (may require an IntelliChem or similar). Emits the `chemicalData` event when the response comes back. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### getSaltCellConfig() +#### getSaltCellConfig(senderId) -Requests salt cell status/configuration from the connected unit (requires an IntelliChlor or compatible salt cell). Emits the `saltCellConfig` event when the response comes back. +Requests salt cell status/configuration from the connected unit (requires an IntelliChlor or compatible salt cell). Emits the `saltCellConfig` event when the response comes back. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### getControllerConfig() +#### getControllerConfig(senderId) -Requests controller configuration from the connected unit. Emits the `controllerConfig` event when the response comes back. +Requests controller configuration from the connected unit. Emits the `controllerConfig` event when the response comes back. `senderId` isan optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### setCircuitState(controllerId, circuitId, circuitState) +#### setCircuitState(controllerId, circuitId, circuitState, senderId) -Activates or deactivates a circuit. See [`SLSetCircuitStateMessage`](#slsetcircuitstatemessage) documentation for argument values. Emits the `circuitStateChanged` event when response is acknowledged. +Activates or deactivates a circuit. See [`SLSetCircuitStateMessage`](#slsetcircuitstatemessage) documentation for argument values. Emits the `circuitStateChanged` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### setSetPoint(controllerId, bodyType, temperature) +#### setSetPoint(controllerId, bodyType, temperature, senderId) -Sets the heating setpoint for any body. See [`SLSetHeatSetPointMessage`](#slsetheatsetpointmessage) documentation for argument values. Emits the `setPointChanged` event when response is acknowledged. +Sets the heating setpoint for any body. See [`SLSetHeatSetPointMessage`](#slsetheatsetpointmessage) documentation for argument values. Emits the `setPointChanged` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### setHeatMode(controllerId, bodyType, heatMode) +#### setHeatMode(controllerId, bodyType, heatMode, senderId) -Sets the preferred heat mode. See [`SLSetHeatModeMessage`](#slsetheatmodemessage) documentation for argument values. Emits the `heatModeChanged` event when response is acknowledged. +Sets the preferred heat mode. See [`SLSetHeatModeMessage`](#slsetheatmodemessage) documentation for argument values. Emits the `heatModeChanged` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### sendLightCommand(controllerId, command) +#### sendLightCommand(controllerId, command, senderId) -Sends a lighting command. See [`SLLightControlMessage`](#sllightcontrolmessage) documentation for argument values. Emits the `sentLightCommand` event when response is acknowledged. +Sends a lighting command. See [`SLLightControlMessage`](#sllightcontrolmessage) documentation for argument values. Emits the `sentLightCommand` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. Note that better/more complete handling of lighting is desired, but I have yet to find all the commands I need to implement to make that happen. This currently sends each command to all lights and there is no ability to send to an individual light. Pull requests adding more functionality here would be most welcome. -#### setSaltCellOutput(controllerId, poolOutput, spaOutput) +#### setSaltCellOutput(controllerId, poolOutput, spaOutput, senderId) -Sets the salt cell's output levels. See [`SLSetSaltCellConfigMessage`](#slsetsaltcellconfigmessage) documentation for argument values. Emits the `setSaltCellConfig` event when response is acknowledged. +Sets the salt cell's output levels. See [`SLSetSaltCellConfigMessage`](#slsetsaltcellconfigmessage) documentation for argument values. Emits the `setSaltCellConfig` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### getScheduleData(scheduleType) +#### getScheduleData(scheduleType, senderId) -Retrieves a list of schedule events of the specified type. See [`SLGetScheduleData`](#slgetscheduledata) documentation for argument values. Emits the `getScheduleData` event when response is acknowledged. +Retrieves a list of schedule events of the specified type. See [`SLGetScheduleData`](#slgetscheduledata) documentation for argument values. Emits the `getScheduleData` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### addNewScheduleEvent(scheduleType) +#### addNewScheduleEvent(scheduleType, senderId) -Adds a new event to the specified schedule type. See [`SLAddNewScheduleEvent`](#sladdnewscheduleevent) documentation for argument values. Emits the `addNewScheduleEvent` event when response is acknowledged. +Adds a new event to the specified schedule type. See [`SLAddNewScheduleEvent`](#sladdnewscheduleevent) documentation for argument values. Emits the `addNewScheduleEvent` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### deleteScheduleEventById(scheduleId) +#### deleteScheduleEventById(scheduleId, senderId) -Deletes a scheduled event with specified id. See [`SLDeleteScheduleEventById`](#sldeletescheduleeventbyid) documentation for argument values. Emits the `deleteScheduleById` event when response is acknowledged. +Deletes a scheduled event with specified id. See [`SLDeleteScheduleEventById`](#sldeletescheduleeventbyid) documentation for argument values. Emits the `deleteScheduleById` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### setScheduleEventById(scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint) +#### setScheduleEventById(scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint, senderId) -Configures a schedule event. See [`SLSetScheduleEventById`](#slsetscheduleeventbyid) documentation for argument values. Emits the `setScheduleEventById` event when response is acknowledged. +Configures a schedule event. See [`SLSetScheduleEventById`](#slsetscheduleeventbyid) documentation for argument values. Emits the `setScheduleEventById` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### setCircuitRuntimebyId(circuitId, runTime) +#### setCircuitRuntimebyId(circuitId, runTime, senderId) -Configures default run-time of a circuit, usually referred to as the 'egg timer'. This also applies to 'run-once' programs as this will set the length of the program. See [`SLSetCircuitRuntimeById`](#slsetcircuitruntimebyid) documentation for argument values. Emits the `setCircuitRuntimeById` event when response is acknowledged. +Configures default run-time of a circuit, usually referred to as the 'egg timer'. This also applies to 'run-once' programs as this will set the length of the program. See [`SLSetCircuitRuntimeById`](#slsetcircuitruntimebyid) documentation for argument values. Emits the `setCircuitRuntimeById` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### getPumpStatus(pumpId) +#### getPumpStatus(pumpId, senderId) -Gets information about the specified pump. See [`SLGetPumpStatus`](#slgetpumpstatus) documentation for argument values. Emits the `getPumpStatus` event when response is acknowledged. +Gets information about the specified pump. See [`SLGetPumpStatus`](#slgetpumpstatus) documentation for argument values. Emits the `getPumpStatus` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### setPumpFlow(pumpId, circuitId, setPoint, isRPMs) +#### setPumpFlow(pumpId, circuitId, setPoint, isRPMs, senderId) -Sets flow setting for a pump/circuit combination. See [`SLSetPumpFlow`](#slsetpumpflow) documentation for argument values. Emits the `setPumpFlow` event when response is acknowledged. +Sets flow setting for a pump/circuit combination. See [`SLSetPumpFlow`](#slsetpumpflow) documentation for argument values. Emits the `setPumpFlow` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### cancelDelay() +#### cancelDelay(senderId) -Cancels any delays on the system. See [`SLCancelDelay`](#slcanceldelay) documentation. Emits the `cancelDelay` event when response is acknowledged. +Cancels any delays on the system. See [`SLCancelDelay`](#slcanceldelay) documentation. Emits the `cancelDelay` event when response is acknowledged. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### addClient(senderId) +#### addClient(clientId, senderId) -Registers to receive updates from controller when something changes. Takes a random number `senderId` to identify the client. Emits the `poolStatus` event when something changes on the controller. +Registers to receive updates from controller when something changes. Takes a random number `clientId` to identify the client. Emits the `poolStatus` event when something changes on the controller. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. -#### removeClient(senderId) +#### removeClient(clientId, senderId) -No longer receive `poolStatus` messages from controller. Takes a random number `senderId` that should match a previously registered client with `addClient`. +No longer receive `poolStatus` messages from controller. Takes a random number `clientId` that should match a previously registered client with `addClient`. `senderId` is an optional 16-bit integer and will be present as the `senderId` field on the returned message. ### Events @@ -295,6 +295,49 @@ No longer receive `poolStatus` messages from controller. Takes a random number ` * `gatewaySubtype` - byte * `gatewayName` - string representing the server's name. Will be in the format Pentair: xx-xx-xx +### All messages + +Information about features common to all the below SL Message types. + +#### decodeTime(time) + +Interprets a time integer recorded as minutes past midnight and returns the ScreenLogic string representation of it in 24-hour time. + +#### encodeTime(time) + +Interprets the string representing 24-hour time and returns an integer of minutes past midnight. + +#### decodeDayMask(mask) + +Converts a day mask from, for example, `SLGetScheduleData`'s events[idx].days property into a `DAY_VALUES` array for ease of use. + +#### encodeDayMask(days) + +Converts an array of DAY_VALUES into a mask used by, for example, `SLGetScheduleData`'s events[idx].days property. + +#### getDayValue(dayName) + +Returns the value of a given `DAY_VALUES` day name. + +`DAY_VALUES` is defined as the following array for simplicity of checking whether a specific day is set in a mask: + +```js +const DAY_VALUES = [ + ['Mon', 0x1 ], + ['Tue', 0x2 ], + ['Wed', 0x4 ], + ['Thu', 0x8 ], + ['Fri', 0x10 ], + ['Sat', 0x20 ], + ['Sun', 0x40 ], +]; +``` + +#### Properties + +* `senderId` - an integer matching whatever was passed as the `senderId` argument when making the initial request (default 0) +* `messageId` - an integer indicating the ScreenLogic ID for this message + ### SLVersionMessage Passed as an argument to the emitted `version` event handler. diff --git a/index.js b/index.js index e24cfe5..a3f9281 100644 --- a/index.js +++ b/index.js @@ -191,110 +191,110 @@ class UnitConnection extends EventEmitter { this.client.write(new messages.SLLoginMessage(password).toBuffer()); } - getPoolStatus() { - debugUnit('sending pool status query...'); - this.client.write(new messages.SLPoolStatusMessage().toBuffer()); + getPoolStatus(senderId) { + debugUnit('[%d] sending pool status query...', senderId || 0); + this.client.write(new messages.SLPoolStatusMessage(null, senderId).toBuffer()); } - getControllerConfig() { - debugUnit('sending controller config query...'); - this.client.write(new messages.SLControllerConfigMessage().toBuffer()); + getControllerConfig(senderId) { + debugUnit('[%d] sending controller config query...', senderId || 0); + this.client.write(new messages.SLControllerConfigMessage(null, senderId).toBuffer()); } - getChemicalData() { - debugUnit('sending chemical data query...'); - this.client.write(new messages.SLChemDataMessage().toBuffer()); + getChemicalData(senderId) { + debugUnit('[%d] sending chemical data query...', senderId || 0); + this.client.write(new messages.SLChemDataMessage(null, senderId).toBuffer()); } - getSaltCellConfig() { - debugUnit('sending salt cell config query...'); - this.client.write(new messages.SLSaltCellConfigMessage().toBuffer()); + getSaltCellConfig(senderId) { + debugUnit('[%d] sending salt cell config query...', senderId || 0); + this.client.write(new messages.SLSaltCellConfigMessage(null, senderId).toBuffer()); } - getVersion() { - debugUnit('sending version query...'); - this.client.write(new messages.SLVersionMessage().toBuffer()); + getVersion(senderId) { + debugUnit('[%d] sending version query...', senderId || 0); + this.client.write(new messages.SLVersionMessage(null, senderId).toBuffer()); } - getEquipmentConfiguration() { - debugUnit('sending equipment configuration query...'); - this.client.write(new messages.SLEquipmentConfigurationMessage().toBuffer()); + getEquipmentConfiguration(senderId) { + debugUnit('[%d] sending equipment configuration query...', senderId || 0); + this.client.write(new messages.SLEquipmentConfigurationMessage(null, senderId).toBuffer()); } - setCircuitState(controllerId, circuitId, circuitState) { - debugUnit('sending set circuit state command: controllerId: %d, circuitId: %d, circuitState: %d...', controllerId, circuitId, circuitState); - this.client.write(new messages.SLSetCircuitStateMessage(controllerId, circuitId, circuitState).toBuffer()); + setCircuitState(controllerId, circuitId, circuitState, senderId) { + debugUnit('[%d] sending set circuit state command: controllerId: %d, circuitId: %d, circuitState: %d...', senderId || 0, controllerId, circuitId, circuitState); + this.client.write(new messages.SLSetCircuitStateMessage(controllerId, circuitId, circuitState, senderId).toBuffer()); } - setSetPoint(controllerId, bodyType, temperature) { - debugUnit('sending set setpoint command: controllerId: %d, bodyType: %d, temperature: %d...', controllerId, bodyType, temperature); - this.client.write(new messages.SLSetHeatSetPointMessage(controllerId, bodyType, temperature).toBuffer()); + setSetPoint(controllerId, bodyType, temperature, senderId) { + debugUnit('[%d] sending set setpoint command: controllerId: %d, bodyType: %d, temperature: %d...', senderId || 0, controllerId, bodyType, temperature); + this.client.write(new messages.SLSetHeatSetPointMessage(controllerId, bodyType, temperature, senderId).toBuffer()); } - setHeatMode(controllerId, bodyType, heatMode) { - debugUnit('sending set heatmode command: controllerId: %d, bodyType: %d, heatMode: %d...', controllerId, bodyType, heatMode); - this.client.write(new messages.SLSetHeatModeMessage(controllerId, bodyType, heatMode).toBuffer()); + setHeatMode(controllerId, bodyType, heatMode, senderId) { + debugUnit('[%d] sending set heatmode command: controllerId: %d, bodyType: %d, heatMode: %d...', senderId || 0, controllerId, bodyType, heatMode); + this.client.write(new messages.SLSetHeatModeMessage(controllerId, bodyType, heatMode, senderId).toBuffer()); } - sendLightCommand(controllerId, command) { - debugUnit('sending light command: controllerId: %d, command: %d...', controllerId, command); - this.client.write(new messages.SLLightControlMessage(controllerId, command).toBuffer()); + sendLightCommand(controllerId, command, senderId) { + debugUnit('[%d] sending light command: controllerId: %d, command: %d...', senderId || 0, controllerId, command); + this.client.write(new messages.SLLightControlMessage(controllerId, command, senderId).toBuffer()); } - setSaltCellOutput(controllerId, poolOutput, spaOutput) { - debugUnit('sending set saltcell output command: controllerId: %d, poolOutput: %d, spaOutput: %d...', controllerId, poolOutput, spaOutput); - this.client.write(new messages.SLSetSaltCellConfigMessage(controllerId, poolOutput, spaOutput).toBuffer()); + setSaltCellOutput(controllerId, poolOutput, spaOutput, senderId) { + debugUnit('[%d] sending set saltcell output command: controllerId: %d, poolOutput: %d, spaOutput: %d...', senderId || 0, controllerId, poolOutput, spaOutput); + this.client.write(new messages.SLSetSaltCellConfigMessage(controllerId, poolOutput, spaOutput, senderId).toBuffer()); } - getScheduleData(scheduleType) { - debugUnit('sending set schedule data query for scheduleType: %d...', scheduleType); - this.client.write(new messages.SLGetScheduleData(null, scheduleType).toBuffer()); + getScheduleData(scheduleType, senderId) { + debugUnit('[%d] sending set schedule data query for scheduleType: %d...', senderId || 0, scheduleType); + this.client.write(new messages.SLGetScheduleData(null, scheduleType, senderId).toBuffer()); } - addNewScheduleEvent(scheduleType) { - debugUnit('sending add new schedule event command for scheduleType: %d...', scheduleType); - this.client.write(new messages.SLAddNewScheduleEvent(null, scheduleType).toBuffer()); + addNewScheduleEvent(scheduleType, senderId) { + debugUnit('[%d] sending add new schedule event command for scheduleType: %d...', senderId || 0, scheduleType); + this.client.write(new messages.SLAddNewScheduleEvent(null, scheduleType, senderId).toBuffer()); } - deleteScheduleEventById(scheduleId) { - debugUnit('sending delete schedule event command for scheduleId: %d...', scheduleId); - this.client.write(new messages.SLDeleteScheduleEventById(scheduleId).toBuffer()); + deleteScheduleEventById(scheduleId, senderId) { + debugUnit('[%d] sending delete schedule event command for scheduleId: %d...', senderId || 0, scheduleId); + this.client.write(new messages.SLDeleteScheduleEventById(scheduleId, senderId).toBuffer()); } // todo: should this just accept a SLSetScheduleEventById message instead of all these args? - setScheduleEventById(scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint) { - debugUnit('sending set schedule event command for scheduleId: %d, circuitId: %d, startTime: %d, stopTime: %d, dayMask: %d, flags: %d, heatCmd: %d, heatSetPoint: %d...', scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint); - this.client.write(new messages.SLSetScheduleEventById(null, scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint).toBuffer()); + setScheduleEventById(scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint, senderId) { + debugUnit('[%d] sending set schedule event command for scheduleId: %d, circuitId: %d, startTime: %d, stopTime: %d, dayMask: %d, flags: %d, heatCmd: %d, heatSetPoint: %d...', senderId || 0, scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint); + this.client.write(new messages.SLSetScheduleEventById(null, scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint, senderId).toBuffer()); } - setCircuitRuntimebyId(circuitId, runTime) { - debugUnit('sending set circuit runtime command for circuitId: %d, runTime: %d...', circuitId, runTime); - this.client.write(new messages.SLSetCircuitRuntimeById(circuitId, runTime).toBuffer()); + setCircuitRuntimebyId(circuitId, runTime, senderId) { + debugUnit('[%d] sending set circuit runtime command for circuitId: %d, runTime: %d...', senderId || 0, circuitId, runTime); + this.client.write(new messages.SLSetCircuitRuntimeById(circuitId, runTime, senderId).toBuffer()); } - getPumpStatus(pumpId) { - debugUnit('sending get pump status command for pumpId: %d...', pumpId); - this.client.write(new messages.SLGetPumpStatus(null, pumpId).toBuffer()); + getPumpStatus(pumpId, senderId) { + debugUnit('[%d] sending get pump status command for pumpId: %d...', senderId || 0, pumpId); + this.client.write(new messages.SLGetPumpStatus(null, pumpId, senderId).toBuffer()); } - setPumpFlow(pumpId, circuitId, setPoint, isRPMs) { - debugUnit('sending set pump flow command for pumpId: %d, circuitId: %d, setPoint: %d, isRPMs: %d...', pumpId, circuitId, setPoint, isRPMs); - this.client.write(new messages.SLSetPumpFlow(pumpId, circuitId, setPoint, isRPMs).toBuffer()); + setPumpFlow(pumpId, circuitId, setPoint, isRPMs, senderId) { + debugUnit('[%d] sending set pump flow command for pumpId: %d, circuitId: %d, setPoint: %d, isRPMs: %d...', senderId || 0, pumpId, circuitId, setPoint, isRPMs); + this.client.write(new messages.SLSetPumpFlow(pumpId, circuitId, setPoint, isRPMs, senderId).toBuffer()); } - cancelDelay() { - debugUnit('sending cancel delay command...'); - this.client.write(new messages.SLCancelDelay().toBuffer()); + cancelDelay(senderId) { + debugUnit('[%d] sending cancel delay command...', senderId || 0); + this.client.write(new messages.SLCancelDelay(senderId).toBuffer()); } - addClient(senderId) { - debugUnit('sending add client command...'); - this.client.write(new messages.SLAddClient(senderId).toBuffer()); + addClient(clientId, senderId) { + debugUnit('[%d] sending add client command, clientId %d...', senderId || 0, clientId); + this.client.write(new messages.SLAddClient(clientId, senderId).toBuffer()); } - removeClient(senderId) { - debugUnit('sending remove client command...'); - this.client.write(new messages.SLRemoveClient(senderId).toBuffer()); + removeClient(clientId, senderId) { + debugUnit('[%d] sending remove client command, clientId %d...', senderId || 0, clientId); + this.client.write(new messages.SLRemoveClient(clientId, senderId).toBuffer()); } onClientMessage(msg) { diff --git a/messages/SLAddClient.js b/messages/SLAddClient.js index 4e24def..b69b96a 100644 --- a/messages/SLAddClient.js +++ b/messages/SLAddClient.js @@ -5,15 +5,15 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12522; exports.SLAddClient = class SLAddClient extends SLMessage { - constructor(senderId) { - super(0, MSG_ID); + constructor(clientId, senderId) { + super(senderId, MSG_ID); - this.senderId = senderId; + this.clientId = clientId; } encode() { this.writeInt32LE(0); - this.writeInt32LE(this.senderId); + this.writeInt32LE(this.clientId); super.encode(); } diff --git a/messages/SLAddNewScheduleEvent.js b/messages/SLAddNewScheduleEvent.js index 865f4aa..1ef31c9 100644 --- a/messages/SLAddNewScheduleEvent.js +++ b/messages/SLAddNewScheduleEvent.js @@ -6,23 +6,15 @@ const MSG_ID = 12544; exports.SLAddNewScheduleEvent = class SLAddNewScheduleEvent extends SLMessage { - constructor(buf, scheduleType) { - var size; + constructor(buf, scheduleType, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); + } else { + super(senderId, MSG_ID); - - if (!buf) { - // console.log('Requested Schedule type = ', scheduleType); this.writeInt32LE(0); this.writeInt32LE(scheduleType); - } else { - this._wroteSize = true; - this.writeBuffer(buf, 0); - - this.decode(); } } diff --git a/messages/SLCancelDelay.js b/messages/SLCancelDelay.js index fa748c7..d2f53bd 100644 --- a/messages/SLCancelDelay.js +++ b/messages/SLCancelDelay.js @@ -5,9 +5,8 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12580; exports.SLCancelDelay = class SLCancelDelay extends SLMessage { - constructor() { - super(0, MSG_ID); - + constructor(senderId) { + super(senderId, MSG_ID); } encode() { diff --git a/messages/SLChemDataMessage.js b/messages/SLChemDataMessage.js index 24024c8..38db74a 100755 --- a/messages/SLChemDataMessage.js +++ b/messages/SLChemDataMessage.js @@ -5,20 +5,14 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12592; exports.SLChemDataMessage = class SLChemDataMessage extends SLMessage { - constructor(buf) { - var size; + constructor(buf, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); - - if (!buf) { - this.writeInt32LE(0); // controller index + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); } else { - this._wroteSize = true; - this.writeBuffer(buf, 0); + super(senderId, MSG_ID); - this.decode(); + this.writeInt32LE(0); // controller index } } diff --git a/messages/SLControllerConfigMessage.js b/messages/SLControllerConfigMessage.js index 9af847d..ac85dd8 100755 --- a/messages/SLControllerConfigMessage.js +++ b/messages/SLControllerConfigMessage.js @@ -13,21 +13,15 @@ const CIRCUIT_NAME_VALUE_MAP = [ ]; exports.SLControllerConfigMessage = class SLControllerConfigMessage extends SLMessage { - constructor(buf) { - var size; + constructor(buf, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); - - if (!buf) { - this.writeInt32LE(0); - this.writeInt32LE(0); + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); } else { - this._wroteSize = true; - this.writeBuffer(buf, 0); + super(senderId, MSG_ID); - this.decode(); + this.writeInt32LE(0); + this.writeInt32LE(0); } } diff --git a/messages/SLDeleteScheduleEventById.js b/messages/SLDeleteScheduleEventById.js index 6e69ed6..aad97d4 100644 --- a/messages/SLDeleteScheduleEventById.js +++ b/messages/SLDeleteScheduleEventById.js @@ -5,8 +5,8 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12546; exports.SLDeleteScheduleEventById = class SLDeleteScheduleEventById extends SLMessage { - constructor(scheduleId) { - super(0, MSG_ID); + constructor(scheduleId, senderId) { + super(senderId, MSG_ID); this.writeInt32LE(0); this.writeInt32LE(scheduleId); diff --git a/messages/SLEquipmentConfigurationMessage.js b/messages/SLEquipmentConfigurationMessage.js index 51ac931..9c0d9cf 100644 --- a/messages/SLEquipmentConfigurationMessage.js +++ b/messages/SLEquipmentConfigurationMessage.js @@ -5,21 +5,15 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12566; exports.SLEquipmentConfigurationMessage = class SLEquipmentConfigurationMessage extends SLMessage { - constructor(buf) { - var size; + constructor(buf, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); - - if (!buf) { - this.writeInt32LE(0); - this.writeInt32LE(0); + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); } else { - this._wroteSize = true; - this.writeBuffer(buf, 0); + super(senderId, MSG_ID); - this.decode(); + this.writeInt32LE(0); + this.writeInt32LE(0); } } diff --git a/messages/SLGetPumpStatus.js b/messages/SLGetPumpStatus.js index a3aef3f..ba8df98 100644 --- a/messages/SLGetPumpStatus.js +++ b/messages/SLGetPumpStatus.js @@ -5,21 +5,15 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12584; exports.SLGetPumpStatus = class SLGetPumpStatus extends SLMessage { - constructor(buf, pumpId) { - var size; + constructor(buf, pumpId, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); + } else { + super(senderId, MSG_ID); - if (!buf) { this.writeInt32LE(0); this.writeInt32LE(pumpId); - } else { - this._wroteSize = true; - this.writeBuffer(buf, 0); - - this.decode(); } } diff --git a/messages/SLGetScheduleData.js b/messages/SLGetScheduleData.js index 70d6b50..83422c7 100644 --- a/messages/SLGetScheduleData.js +++ b/messages/SLGetScheduleData.js @@ -5,22 +5,15 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12542; exports.SLGetScheduleData = class SLGetScheduleData extends SLMessage { - constructor(buf, scheduleType) { - var size; + constructor(buf, scheduleType, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); + } else { + super(senderId, MSG_ID); - - if (!buf) { this.writeInt32LE(0); this.writeInt32LE(scheduleType); - } else { - this._wroteSize = true; - this.writeBuffer(buf, 0); - - this.decode(); } } diff --git a/messages/SLLightControl.js b/messages/SLLightControl.js index 702bb73..f711c98 100644 --- a/messages/SLLightControl.js +++ b/messages/SLLightControl.js @@ -5,8 +5,8 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12556; exports.SLLightControl = class SLLightControl extends SLMessage { - constructor(controllerIndex, command) { - super(0, MSG_ID); + constructor(controllerIndex, command, senderId) { + super(senderId, MSG_ID); this.controllerIndex = controllerIndex; this.command = command; diff --git a/messages/SLMessage.js b/messages/SLMessage.js index 4132b86..e049410 100644 --- a/messages/SLMessage.js +++ b/messages/SLMessage.js @@ -27,7 +27,7 @@ exports.SLMessage = class SLMessage extends SmartBuffer { this.writeUInt16LE(messageId || 0); this._wroteSize = false; - } else if (senderId) { + } else if (typeof senderId === 'object') { this._wroteSize = true; var buffer = senderId; this.writeBuffer(buffer, 0); diff --git a/messages/SLPoolStatusMessage.js b/messages/SLPoolStatusMessage.js index ac80522..7d16f5f 100755 --- a/messages/SLPoolStatusMessage.js +++ b/messages/SLPoolStatusMessage.js @@ -9,20 +9,14 @@ const SPA_CIRCUIT_ID = 500; const POOL_CIRCUIT_ID = 505; exports.SLPoolStatusMessage = class SLPoolStatusMessage extends SLMessage { - constructor(buf) { - var size; + constructor(buf, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); - - if (!buf) { - this.writeInt32LE(0); + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); } else { - this._wroteSize = true; - this.writeBuffer(buf, 0); + super(senderId, MSG_ID); - this.decode(); + this.writeInt32LE(0); } } diff --git a/messages/SLRemoveClient.js b/messages/SLRemoveClient.js index 3e5dea1..e5dfc2c 100644 --- a/messages/SLRemoveClient.js +++ b/messages/SLRemoveClient.js @@ -5,15 +5,15 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12524; exports.SLRemoveClient = class SLRemoveClient extends SLMessage { - constructor(senderId) { - super(0, MSG_ID); + constructor(clientId, senderId) { + super(senderId, MSG_ID); - this.senderId = senderId; + this.clientId = clientId; } encode() { this.writeInt32LE(0); - this.writeInt32LE(this.senderId); + this.writeInt32LE(this.clientId); super.encode(); } diff --git a/messages/SLSaltCellConfigMessage.js b/messages/SLSaltCellConfigMessage.js index 3285927..072c62a 100755 --- a/messages/SLSaltCellConfigMessage.js +++ b/messages/SLSaltCellConfigMessage.js @@ -5,20 +5,14 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12572; exports.SLSaltCellConfigMessage = class SLSaltCellConfigMessage extends SLMessage { - constructor(buf) { - var size; + constructor(buf, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); - - if (!buf) { - this.writeInt32LE(0); // controller index + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); } else { - this._wroteSize = true; - this.writeBuffer(buf, 0); + super(senderId, MSG_ID); - this.decode(); + this.writeInt32LE(0); // controller index } } diff --git a/messages/SLSetCircuitRuntimeById.js b/messages/SLSetCircuitRuntimeById.js index e6b962b..1de4934 100644 --- a/messages/SLSetCircuitRuntimeById.js +++ b/messages/SLSetCircuitRuntimeById.js @@ -6,8 +6,8 @@ const MSG_ID = 12550; exports.SLSetCircuitRuntimeById = class SLSetCircuitRuntimeById extends SLMessage { - constructor(circuitId, runTime) { - super(0, MSG_ID); + constructor(circuitId, runTime, senderId) { + super(senderId, MSG_ID); this.circuitId = circuitId; this.runTime = runTime; diff --git a/messages/SLSetCircuitStateMessage.js b/messages/SLSetCircuitStateMessage.js index a3195f8..f4ad69d 100644 --- a/messages/SLSetCircuitStateMessage.js +++ b/messages/SLSetCircuitStateMessage.js @@ -5,8 +5,8 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12530; exports.SLSetCircuitStateMessage = class SLSetCircuitStateMessage extends SLMessage { - constructor(controllerId, circuitId, circuitState) { - super(0, MSG_ID); + constructor(controllerId, circuitId, circuitState, senderId) { + super(senderId, MSG_ID); this.controllerId = controllerId; this.circuitId = circuitId; diff --git a/messages/SLSetHeatMode.js b/messages/SLSetHeatMode.js index 9460915..4b3a570 100644 --- a/messages/SLSetHeatMode.js +++ b/messages/SLSetHeatMode.js @@ -5,8 +5,8 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12538; exports.SLSetHeatMode = class SLSetHeatMode extends SLMessage { - constructor(controllerIndex, bodyType, heatMode) { - super(0, MSG_ID); + constructor(controllerIndex, bodyType, heatMode, senderId) { + super(senderId, MSG_ID); this.controllerIndex = controllerIndex; this.bodyType = bodyType; diff --git a/messages/SLSetHeatSetPoint.js b/messages/SLSetHeatSetPoint.js index 0d5bb54..c90ffab 100644 --- a/messages/SLSetHeatSetPoint.js +++ b/messages/SLSetHeatSetPoint.js @@ -5,8 +5,8 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12528; exports.SLSetHeatSetPoint = class SLSetHeatSetPoint extends SLMessage { - constructor(controllerIndex, bodyType, temperature) { - super(0, MSG_ID); + constructor(controllerIndex, bodyType, temperature, senderId) { + super(senderId, MSG_ID); this.controllerIndex = controllerIndex; this.bodyType = bodyType; diff --git a/messages/SLSetPumpFlow.js b/messages/SLSetPumpFlow.js index a3b23c0..f02ca6a 100644 --- a/messages/SLSetPumpFlow.js +++ b/messages/SLSetPumpFlow.js @@ -5,8 +5,9 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12586; exports.SLSetPumpFlow = class SLSetPumpFlow extends SLMessage { - constructor(pumpId, circuitId, setPoint, isRPMs) { - super(0, MSG_ID); + constructor(pumpId, circuitId, setPoint, isRPMs, senderId) { + super(senderId, MSG_ID); + this.pumpId = pumpId; this.circuitId = circuitId; this.setPoint = setPoint; diff --git a/messages/SLSetSaltCellConfigMessage.js b/messages/SLSetSaltCellConfigMessage.js index b95f4d7..7dce44c 100644 --- a/messages/SLSetSaltCellConfigMessage.js +++ b/messages/SLSetSaltCellConfigMessage.js @@ -5,8 +5,8 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 12576; exports.SLSetSaltCellConfigMessage = class SLSetSaltCellConfigMessage extends SLMessage { - constructor(controllerIndex, poolOutput, spaOutput) { - super(0, MSG_ID); + constructor(controllerIndex, poolOutput, spaOutput, senderId) { + super(senderId, MSG_ID); this.controllerIndex = controllerIndex; this.poolOutput = poolOutput; diff --git a/messages/SLSetScheduleEventById.js b/messages/SLSetScheduleEventById.js index ecd5d9f..9476938 100644 --- a/messages/SLSetScheduleEventById.js +++ b/messages/SLSetScheduleEventById.js @@ -6,15 +6,13 @@ const MSG_ID = 12548; exports.SLSetScheduleEventById = class SLSetScheduleEventById extends SLMessage { - constructor(buf, scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint) { - var size; + constructor(buf, scheduleId, circuitId, startTime, stopTime, dayMask, flags, heatCmd, heatSetPoint, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); + } else { + super(senderId, MSG_ID); - - if (!buf) { this.writeInt32LE(0); this.writeInt32LE(scheduleId); this.writeInt32LE(circuitId); @@ -24,11 +22,6 @@ exports.SLSetScheduleEventById = class SLSetScheduleEventById extends SLMessage this.writeInt32LE(flags); this.writeInt32LE(heatCmd); this.writeInt32LE(heatSetPoint); - } else { - this._wroteSize = true; - this.writeBuffer(buf, 0); - - this.decode(); } } diff --git a/messages/SLVersionMessage.js b/messages/SLVersionMessage.js index eca449e..8cc27ea 100755 --- a/messages/SLVersionMessage.js +++ b/messages/SLVersionMessage.js @@ -5,18 +5,12 @@ const SLMessage = require('./SLMessage.js').SLMessage; const MSG_ID = 8120; exports.SLVersionMessage = class SLVersionMessage extends SLMessage { - constructor(buf) { - var size; + constructor(buf, senderId) { if (buf) { - size = buf.readInt32LE(4) + 8; - } - super(0, MSG_ID, size); - - if (buf) { - this._wroteSize = true; - this.writeBuffer(buf, 0); - - this.decode(); + var size = buf.readInt32LE(4) + 8; + super(buf, MSG_ID, size); + } else { + super(senderId, MSG_ID); } } diff --git a/test/find.spec.js b/test/find.spec.js index 935e0f9..83c5414 100644 --- a/test/find.spec.js +++ b/test/find.spec.js @@ -3,8 +3,8 @@ const ScreenLogic = require('../index'); // you'll need a ScreenLogic-enabled device on your network for this to succeed -describe('Finder', () => { - it('finds a server', done => { +describe('Finder', function() { + it('finds a server', function(done) { let finder = new ScreenLogic.FindUnits(); finder.on('serverFound', server => { finder.close(); diff --git a/test/slmessage.spec.js b/test/slmessage.spec.js index b307375..58d9b1c 100644 --- a/test/slmessage.spec.js +++ b/test/slmessage.spec.js @@ -9,7 +9,7 @@ function slMessageLen(str) { return 4 + str.length + SLMessage.slackForAlignment(str.length); } -describe('SLMessage utilities', () => { +describe('SLMessage utilities', function() { // message header = senderId, messageId, bodyLen. // senderId and messageId are int16's, so 2b each. bodyLen is an int32, so 4b. total 8b. let msgHeaderLen = 8; diff --git a/test/unit.spec.js b/test/unit.spec.js index adb2adb..681beb7 100644 --- a/test/unit.spec.js +++ b/test/unit.spec.js @@ -1,11 +1,12 @@ 'use strict'; const ScreenLogic = require('../index'); +var assert = require('assert'); // you'll need a ScreenLogic-enabled device on your network for this to succeed -describe('Unit', () => { +describe('Unit', function() { let unit; - before(done => { + before(function(done) { let finder = new ScreenLogic.FindUnits(); finder.on('serverFound', server => { finder.close(); @@ -21,50 +22,57 @@ describe('Unit', () => { finder.search(); }); - after(() => { + after(function() { unit.close(); }); - // let circuit; - it('gets pool status', done => { + it('gets pool status', function(done) { unit.on('poolStatus', status => { - /* circuit = */status.circuitArray[0]; + assert.equal(status.senderId, 0); done(); }); unit.getPoolStatus(); }); - it('gets controller config', done => { + it('gets controller config', function(done) { unit.on('controllerConfig', config => { + assert.equal(config.senderId, 42); done(); }); - unit.getControllerConfig(); + + unit.getControllerConfig(42); }); - it('gets chemical data', done => { - unit.on('chemicalData', () => { + it('gets chemical data', function(done) { + unit.on('chemicalData', chemData => { + assert.equal(chemData.senderId, 123); done(); }); - unit.getChemicalData(); + + unit.getChemicalData(123); }); - it('gets salt cell config', done => { - unit.on('saltCellConfig', () => { + it('gets salt cell config', function(done) { + unit.on('saltCellConfig', saltConfig => { + assert.equal(saltConfig.senderId, 0); done(); }); + unit.getSaltCellConfig(); }); - it('gets version', done => { - unit.on('version', () => { + it('gets version', function(done) { + unit.on('version', version => { + assert.equal(version.senderId, 41239); done(); }); - unit.getVersion(); + + unit.getVersion(41239); }); /* uncomment this and the `circuit` stuff above to test setting state - it('sets circuit state', done => { + it('sets circuit state', function(done) { unit.on('circuitStateChanged', () => { done(); });