UNPKG

thing-it-device-enocean-ip

Version:

[thing-it-node] Device Plugin for EnOcean IP products.

346 lines (315 loc) 10.3 kB
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); }