Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(bluefox) fix error if no devices are connected to cube #21

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 51 additions & 1 deletion maxcube-commandparser.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ function parseCommandHello (payload) {
function parseCommandMetadata (payload) {
var payloadArr = payload.split(",");

if (payloadArr.length < 3) {
console.error('Invalid Metadata received');
return { rooms: {}, devices: {} };
}

var decodedPayload = new Buffer(payloadArr[2], 'base64');
var room_count = decodedPayload[2];
var currentIndex = 3;
Expand Down Expand Up @@ -205,9 +210,20 @@ function decodeDevice (payload) {
var deviceStatus = {};
var deviceType = undefined;
switch (payload[0]) {
case 8: deviceType = EQ3MAX_DEV_TYPE_PUSH_BUTTON; break;
case 6:
if (payload[1] === 9) {
deviceType = EQ3MAX_DEV_TYPE_PUSH_BUTTON;
deviceStatus = decodeDeviceButton (payload);
} else {
deviceType = EQ3MAX_DEV_TYPE_SHUTTER_CONTACT;
deviceStatus = decodeDeviceContact (payload);
}

break;
case 8: deviceType = EQ3MAX_DEV_TYPE_PUSH_BUTTON; deviceStatus = decodeDeviceButton (payload); break;
case 11: deviceType = EQ3MAX_DEV_TYPE_THERMOSTAT; deviceStatus = decodeDeviceThermostat (payload); break;
case 12: deviceType = EQ3MAX_DEV_TYPE_WALLTHERMOSTAT; deviceStatus = decodeDeviceThermostat (payload); break;
case 13: deviceType = EQ3MAX_DEV_TYPE_THERMOSTAT_PLUS; deviceStatus = decodeDeviceThermostat (payload); break; // ??? if 13 is correct
default: deviceType = EQ3MAX_DEV_TYPE_UNKNOWN; break;
}

Expand All @@ -216,6 +232,40 @@ function decodeDevice (payload) {
return deviceStatus;
}

function decodeDeviceContact (payload) {
var deviceStatus = {
rf_address: payload.slice(1, 4).toString('hex'),
opened: (payload[5] & 0x2) && !(payload[5] & 0x1),
initialized: !!(payload[5] & (1 << 1)),
fromCmd: !!(payload[5] & (1 << 2)),
error: !!(payload[5] & (1 << 3)),
valid: !!(payload[5] & (1 << 4)),
dst_active: !!(payload[6] & (1 << 3)),
gateway_known: !!(payload[6] & (1 << 4)),
link_error: !!(payload[6] & (1 << 6)),
battery_low: !!(payload[6] & (1 << 7)),
opened: !!(payload[6] & (1 << 1))
};
return deviceStatus;
}

function decodeDeviceButton (payload) {
var deviceStatus = {
rf_address: payload.slice(1, 4).toString('hex'),
opened: (payload[5] & 0x2) && !(payload[5] & 0x1),
initialized: !!(payload[5] & (1 << 1)),
fromCmd: !!(payload[5] & (1 << 2)),
error: !!(payload[5] & (1 << 3)),
valid: !!(payload[5] & (1 << 4)),
dst_active: !!(payload[6] & (1 << 3)),
gateway_known: !!(payload[6] & (1 << 4)),
link_error: !!(payload[6] & (1 << 6)),
battery_low: !!(payload[6] & (1 << 7)),
eco_mode: !!(payload[6] & (1 << 1))
};
return deviceStatus;
}

function decodeDeviceThermostat (payload) {
/*
source: http://www.domoticaforum.eu/viewtopic.php?f=66&t=6654
Expand Down
2 changes: 1 addition & 1 deletion maxcube-lowlevel.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ function initSocket () {

this.socket.on('error', function(err) {
console.error(err);
self.emit('error');
self.emit('error', err);
});
}

Expand Down
1 change: 1 addition & 0 deletions maxcube.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ function MaxCube(ip, port) {
case 'H': {
self.commStatus.duty_cycle = parsedCommand.duty_cycle;
self.commStatus.free_memory_slots = parsedCommand.free_memory_slots;
self.emit('hello', parsedCommand);
break;
}
case 'M': {
Expand Down