A Node.js module for controlling X10 devices through a serial CM11A interface. It allows NodeJe applications to conrol X10 devices through the serial interface of the CM11A, and monitors status of X10 devices.
npm install cm11a-js
// Import the module
const CM11A = require('cm11a-js');
// Create an CM11 object
let cm11 = CM11A();
// Start the service, connecting to the Serial Port
cm11.start('/dev/ttyUSB0');
// Issue Commands
let units = ['A1', 'A2'];
cm11.turnOn(units);
cm11.dim(units, 11);
cm11.bright(units, 11);
cm11.turnOff(units);
// Close the connection to the CM11A
cm11.stop();
cm11.start(port);
Opens serial communications with the CM11A on the specified serial port, and begins monitoring for unit status.
port
is the serial port to open, e.g./dev/ttyUSB0
on Linux, andCOM1
on Windows.
cm11.stop();
Close serial communications with the CM11A, and stops monitoring device status.
cm11.turnOn(addresses);
Turns on the specified unit addresses.
addresses
is an array of X10 device addresses. e.g. ['A1', 'A3']
cm11.turnOff(addresses);
Turns off the specified unit addresses.
addresses
is an array of X10 device addresses. e.g. ['A1', 'A3']
cm11.bright(addresses, level);
Brightens the the specified unit addresses by the specfied level.
addresses
is an array of X10 device addresses. e.g. ['A1', 'A3']level
is a value between 0 and 22, indicating how much to brighten the device. Note: this is a relative value, not an absolute value.
cm11.dim(addresses, level);
Dims the the specified unit addresses by the specfied level.
addresses
is an array of X10 device addresses. e.g. ['A1', 'A3']level
is a value between 0 and 22, indicating how much to dim the device. Note: this is a relative value, not an absolute value.
cm11.setClock();
Sets the clock of the CM11A controller to the current time provided by the PC.
cm11.status();
Reads the status from the CM11A returns the status through the status callback event below.
Calling modules can subscribe to the following events on cm11a-js interface.
Provides the status of X10 devices when the CM11A detects a change on the power line.
cm11a.on('unitStatus', callback);
When the status of a device changes, the callback function will be called with the following object:
{
// An array of unit codes for which status is being reported.
units: array,
// The X10 Function that was called on the device
x10Function: string,
// The level of the function is DIM or BRIGHT
level: number
}
Provides the status of the CM11A as read from the device with the status()
function.
cm11a.on('status', callback);
After the status has been read from the CM11A, the specified callback function will be called with the following object:
See section 9 in the Interface Communication Protocol on the Heyu website for more details.
{
// Time since last battery change
batteryTimer: value,
// CM11A Firmware Revision
firmwareRev: value,
// An object containing values of the CM11A's clock
time: {
// Day of the year
dayOfYear: value,
// Hour of the day
hours: value,
// Minute of the hour
minutes: value,
// Second of the minute
seconds: value
},
// An object containing the status of monitored devices
monitoredDevices: {
// House code being monitored
houseCode: value,
// Currently addressed devices
addresed: value,
// On/Off status of monitored devices
onOffStatus: value,
// Dim status of the monitored devices
dimStatus: value
},
// A bitmask indicating Which day it is (SMTWTFS)
dayMask: value
}
Notifies the calling software when communications with the CM11A have been closed.
cm11a.on('close', callback);
When the serial port has been closed, the specified callback function will be called with no parameters.
Kudos to the Heyu project. Heyu provides a complete interface to the CM11A (and other devices). The documentation and research they have done has been priceless! Heyu ran my house for many years!