diff --git a/CHANGELOG.md b/CHANGELOG.md index f2bf5df..f35a322 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased +### Added +* Ability to set heat setpoint. + ## v1.2.1 - 2019-03-26 ### Fixed * Messages larger than 1024 bytes are now handled properly. diff --git a/README.md b/README.md index 3238334..c4c3c4c 100755 --- a/README.md +++ b/README.md @@ -192,6 +192,10 @@ Requests controller configuration from the connected unit. Emits the `controller Activates or deactivates a circuit. See [`SLSetCircuitStateMessage`](#slsetcircuitstatemessage) documentation for argument values. Emits the `circuitStateChanged` event when response is acknowledged. +### setSetPoint(controllerId, bodyType, temperature) + +Sets the heating setpoint for any body. See [`SLSetHeatSetPointMessage`](#slsetheatsetpointmessage) documentation for argument values. Emits the `setPointChanged` event when response is acknowledged. + ### Events * `loggedIn` - Indicates that a connection to the server has been established and the login process completed. `get` methods can be called once this event has been emitted. @@ -201,6 +205,7 @@ Activates or deactivates a circuit. See [`SLSetCircuitStateMessage`](#slsetcircu * `saltCellConfig` - Indicates that a response to `getSaltCellConfig()` has been received. Event handler receives a [`SLSaltCellConfigMessage`](#slsaltcellconfigmessage) object. * `controllerConfig` - Indicates that a response to `getControllerConfig()` has been received. Event handler receives a [`SLControllerConfigMessage`](#slcontrollerconfigmessage) object. * `circuitStateChanged` - Indicates that a response to `setCircuitState()` has been received. Event handler receives a [`SLSetCircuitStateMessage`](#slsetcircuitstatemessage) object. +* `setPointChanged` - Indicates that a response to `setSetPoint()` has been received. Event handler receives a [`SLSetHeatSetPointMessage`](#slsetheatsetpointmessage) object. ### Properties @@ -355,6 +360,17 @@ Passed as an argument to the emitted `circuitStateChanged` event. The passed ver * This ID can be retrieved from `SLControllerConfigMessage`'s `bodyArray` property. * `circuitState` - integer indicating whether to switch the circuit on (`1`) or off (`0`). +## SLSetHeatSetPointMessage + +Passed as an argument to the emitted `setPointChanged` event. The passed version is empty, however, since the response is just an acknowledgement of receipt of the set command. + +### Properties + +* `controllerId` - integer indicating the ID of the controller to send this command to. + * Note that while `SLControllerConfigMessage` includes a controllerId, this ID, in my experience, should always be 0. +* `bodyType` - integer indicating the type of body to set the setpoint of. The pool is body `0` and the spa is body `1`. +* `temperature` - integer indicating the desired setpoint. This is presumably in whatever units your system is set to (celsius or fahrenheit). + ## SLGetGatewayDataMessage Passed as an argument to the emitted `gatewayFound` event. Contains information about the remote unit's status and access properties. diff --git a/index.js b/index.js index 60850e8..512594f 100644 --- a/index.js +++ b/index.js @@ -206,6 +206,10 @@ class UnitConnection extends EventEmitter { this.client.write(new messages.SLSetCircuitStateMessage(controllerId, circuitId, circuitState).toBuffer()); } + setSetPoint(controllerId, bodyType, temperature) { + this.client.write(new messages.SLSetHeatSetPointMessage(controllerId, bodyType, temperature).toBuffer()); + } + onClientMessage(msg) { // console.log('received message of length ' + msg.length); if (msg.length < 4) { @@ -247,6 +251,10 @@ class UnitConnection extends EventEmitter { // console.log(" it's circuit toggle ack"); this.emit('circuitStateChanged', new messages.SLSetCircuitStateMessage()); break; + case messages.SLSetHeatSetPointMessage.getResponseId(): + // console.log(" it's a setpoint ack"); + this.emit('setPointChanged', new messages.SLSetHeatSetPointMessage()); + break; case 13: // console.log(" it's a login failure."); this.emit('loginFailed'); diff --git a/messages/SLSetHeatSetPoint.js b/messages/SLSetHeatSetPoint.js new file mode 100644 index 0000000..0d5bb54 --- /dev/null +++ b/messages/SLSetHeatSetPoint.js @@ -0,0 +1,27 @@ +'use strict'; + +const SLMessage = require('./SLMessage.js').SLMessage; + +const MSG_ID = 12528; + +exports.SLSetHeatSetPoint = class SLSetHeatSetPoint extends SLMessage { + constructor(controllerIndex, bodyType, temperature) { + super(0, MSG_ID); + + this.controllerIndex = controllerIndex; + this.bodyType = bodyType; + this.temperature = temperature; + } + + encode() { + this.writeInt32LE(this.controllerIndex || 0); + this.writeInt32LE(this.bodyType || 0); + this.writeInt32LE(this.temperature || 0); + + super.encode(); + } + + static getResponseId() { + return MSG_ID + 1; + } +}; diff --git a/messages/index.js b/messages/index.js index a283e6d..e3b18c0 100644 --- a/messages/index.js +++ b/messages/index.js @@ -9,3 +9,4 @@ exports.SLSaltCellConfigMessage = require('./SLSaltCellConfigMessage.js').SLSalt exports.SLVersionMessage = require('./SLVersionMessage.js').SLVersionMessage; exports.SLSetCircuitStateMessage = require('./SLSetCircuitStateMessage.js').SLSetCircuitStateMessage; exports.SLGetGatewayDataMessage = require('./SLGetGatewayDataMessage.js').SLGetGatewayDataMessage; +exports.SLSetHeatSetPointMessage = require('./SLSetHeatSetPoint.js').SLSetHeatSetPoint;