thing-it-device-enocean-ip
Version:
[thing-it-node] Device Plugin for EnOcean IP products.
346 lines (315 loc) • 10.3 kB
JavaScript
module.exports = {
metadata: {
plugin: "roomControl",
label: "EnOcean IP SR06 2T+ RoomControl ",
role: "actor",
family: "roomControl",
deviceTypes: ["enocean-ip/gateway"],
tangible: false,
services: [],
events:[{
label: "Heat",
id: "heat"
}, {
label: "Cool",
id: "cool"
}, {
label: "Off",
id: "off"
}, {
label: 'Button A0 Pressed',
id: 'buttonA0Pressed'
}, {
label: 'Button A0 Released',
id: 'buttonA0Released'
}, {
label: 'Button AI Pressed',
id: 'buttonAIPressed'
}, {
label: 'Button AI Released',
id: 'buttonAIReleased'
}, {
label: 'Button B0 Pressed',
id: 'buttonB0Pressed'
}, {
label: 'Button B0 Released',
id: 'buttonB0Released'
}, {
label: 'Button BI Pressed',
id: 'buttonBIPressed'
}, {
label: 'Button BI Released',
id: 'buttonBIReleased'
}, {
label: 'Set',
id: 'set'
}],
state: [{
label: "Temperature",
id: "temperature",
type:{
id: "decimal"
}
}, {
label: "Set Point Temperature",
id: "setpoint",
type: {
id: "decimal"
}
}, {
label: 'Last Button Operation',
id: 'lastButtonOperation'
}, {
label: "Heat Active",
id:"heatActive",
type: {
id: "boolean"
}
}, {
label: "Cool Active",
id: "coolActive",
type: {
id: "boolean"
}
}],
configuration: [{
label: "Thermostat Device ID",
id: "thermostatDeviceId",
type: {
id: "string"
}
}, {
label: "Button Device ID",
id: "buttonDeviceId",
type: {
id: "string"
}
}, {
label: "Temperature Base Point",
id:"temperatureBasePoint",
type: {
id: "decimal"
},
defaultValue: 22.00
}, {
label: "Set Point Scale",
id: "setPointScale",
type:{
id: "decimal"
},
defaultValue: 1.0
}]
},
create: function () {
return new RoomControl();
}
};
var q = require('q');
var moment = require('moment');
/**
*
*/
function RoomControl() {
/**
*
*/
RoomControl.prototype.start = function () {
var deferred = q.defer();
this.state = {};
if (this.isSimulated()) {
this.interval = setInterval(function () {
this.publishStateChange();
}.bind(this), 20000);
}
else {
// Retrieve current state
if(this.configuration.setPointScale < 1.0 || this.configuration.setPointScale > 10.0){
this.logInfo("Set Point Scale value invalid. Setting to default.")
this.configuration.setPointScale = 1;
}
if(this.configuration.temperatureBasePoint < 15 || this.configuration.temperatureBasePoint > 30){
this.configuration.temperatureBasePoint = 22;
}
this.device.adapter.getDeviceState(this.configuration.thermostatDeviceId).then(function(body){
let tempDiff;
for(let n in body.state.functions){
//console.log(body.state.functions[n]);
if (body.state.functions[n].key === "temperature") {
this.state.temperature = body.state.functions[n].value;
//console.log(this.state.temperature);
}
if (body.state.functions[n].key === "setpoint") {
this.state.setpoint = setpointConversion(body.state.functions[n].value, this.configuration.temperatureBasePoint, this.configuration.setPointScale);
//console.log(this.state.setpoint);
}
}
tempDiff = this.state.temperature - this.state.setpoint;
if(tempDiff >= 0.5){
this.state.coolActive = true;
this.state.heatActive = false;
this.publishEvent("cool", {});
}
if(tempDiff <= -0.5){
this.state.coolActive = false;
this.state.heatActive = true;
this.publishEvent("heat", {});
}
if(tempDiff > -0.5 && tempDiff < 0.5){
this.state.coolActive = false;
this.state.heatActive = false;
this.publishEvent("off", {});
}
this.publishStateChange();
console.log(this.state);
}.bind(this), function (err){
console.log(err)
}.bind(this));
//Receive incoming state changes
this.device.adapter.listeners.push(telegram => {
if(telegram.deviceId === this.configuration.thermostatDeviceId) {
for (let n in telegram.functions) {
let tempDiff;
if (telegram.functions[n].key === "temperature") {
this.state.temperature = telegram.functions[n].value;
}
if (telegram.functions[n].key === "setpoint") {
this.state.setpoint = setpointConversion(telegram.functions[n].value, this.configuration.temperatureBasePoint, this.configuration.setPointScale);
}
//this.publishStateChange();
tempDiff = this.state.temperature - this.state.setpoint;
if(tempDiff >= 0.5){
this.state.coolActive = true;
this.state.heatActive = false;
this.publishEvent("cool", {});
}
if(tempDiff <= -0.5){
this.state.coolActive = false;
this.state.heatActive = true;
this.publishEvent("heat", {});
}
if(tempDiff > -0.5 && tempDiff < 0.5){
this.state.coolActive = false;
this.state.heatActive = false;
this.publishEvent("off", {});
}
}
this.publishStateChange();
}
if(telegram.deviceId === this.configuration.buttonDeviceId) {
for (let n in telegram.functions) {
if (telegram.functions[n].key.indexOf('button') === 0) {
this.publishEvent(telegram.functions[n].key + capitalizeFirstLetter(telegram.functions[n].value), {});
this.state.lastButtonOperation = capitalizeFirstLetter(telegram.functions[n].key) + ' ' + capitalizeFirstLetter(telegram.functions[n].value);
//this.publishStateChange();
}
}
this.publishStateChange();
}
});
//this.publishStateChange();
}
deferred.resolve();
return deferred.promise;
};
/**
*
*/
RoomControl.prototype.getState = function () {
return this.state;
};
/**
*
*/
RoomControl.prototype.setState = function (state) {
this.state = state;
this.publishEvent("set", {});
};
/**
*
*/
RoomControl.prototype.stop = function () {
if (this.isSimulated()) {
if (this.interval) {
clearInterval(this.interval);
}
}
}
}
/**
*
*/
function setpointConversion(value, baseTemp, scale){
let setVar;
let setPoint;
switch (value) {
case 0.00:
setVar = -3.0;
setPoint = baseTemp + scale*setVar;
break;
case 21.00:
setVar = -2.5;
setPoint = baseTemp + scale*setVar;
break;
case 42.00:
setVar = -2.0;
setPoint = baseTemp + scale*setVar;
break;
case 63.00:
setVar = -1.5;
setPoint = baseTemp + scale*setVar;
break;
case 85.00:
setVar = -1.0;
setPoint = baseTemp + scale*setVar;
break;
case 106.00:
setVar = -0.5;
setPoint = baseTemp + scale*setVar;
break;
case 128.00:
setVar = 0.0;
setPoint = baseTemp + scale*setVar;
break;
case 149.00:
setVar = 0.5;
setPoint = baseTemp + scale*setVar;
break;
case 171.00:
setVar = 1.0;
setPoint = baseTemp + scale*setVar;
break;
case 192.00:
setVar = 1.5;
setPoint = baseTemp + scale*setVar;
break;
case 213.00:
setVar = 2.0;
setPoint = baseTemp + scale*setVar;
break;
case 234.00:
setVar = 2.5;
setPoint = baseTemp + scale*setVar;
break;
case 255.00:
setVar = 3.0;
setPoint = baseTemp + scale*setVar;
break;
}
if(setPoint < 15.00){
setPoint = 15.00;
return setPoint;
}
else if(setPoint > 30.00){
setPoint = 30.00;
return setPoint;
}
else{
return setPoint;
}
}
/**
*
*/
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}