UNPKG

redmatic-homekit

Version:

HAP-Nodejs based Node-RED nodes to create HomeKit Accessories

93 lines (78 loc) 3.65 kB
const Accessory = require('./lib/accessory'); module.exports = class HmCcTc extends Accessory { init(config, node) { const {ccu} = node; let valveStateDevice; let valveState = 0; let valueSetpoint; function targetState() { // 0=off, 1=heat, 3=auto return valueSetpoint > 0 ? 1 : 0; } function currentState() { // 0=off, 1=heat return valveState > 0 ? 1 : 0; } const serviceThermostat = this.addService('Thermostat', config.name) .setProps('CurrentTemperature', {minValue: -40, maxValue: 80}) .get('CurrentTemperature', config.deviceAddress + ':1.TEMPERATURE') .setProps('TargetTemperature', {minValue: 6, maxValue: 30, minStep: 0.5}) .get('TargetTemperature', config.deviceAddress + ':2.SETPOINT', value => { valueSetpoint = value; return value; }) .set('TargetTemperature', config.deviceAddress + ':2.SETPOINT', value => { valueSetpoint = value; return value; }) .setProps('CurrentHeatingCoolingState', {validValues: [0, 1], maxValue: 1}) .get('CurrentHeatingCoolingState', config.deviceAddress + ':2.SETPOINT', () => { setTimeout(() => { updateHeatingCoolingState(); }, 1000); return currentState(); }) .setProps('TargetHeatingCoolingState', {validValues: [0, 1]}) .get('TargetHeatingCoolingState', config.deviceAddress + ':2.SETPOINT', () => { setTimeout(() => { updateHeatingCoolingState(); }, 1000); return targetState(); }) .set('TargetHeatingCoolingState', config.deviceAddress + ':2.SETPOINT', value => { valueSetpoint = value ? 21 : 0; setTimeout(() => { updateHeatingCoolingState(); }, 1000); return valueSetpoint; }); function updateHeatingCoolingState() { serviceThermostat.update('CurrentHeatingCoolingState', currentState()); serviceThermostat.update('TargetHeatingCoolingState', targetState()); } const links = ccu.getLinks(config.iface, config.description.ADDRESS + ':2'); node.debug(config.name + ' ' + config.description.ADDRESS + ':2 linked to ' + JSON.stringify(links)); if (links[0]) { valveStateDevice = links[0].split(':')[0]; this.subscribe(config.iface + '.' + valveStateDevice + ':1.VALVE_STATE', value => { valveState = value; updateHeatingCoolingState(); }); } this.addService('BatteryService', config.name) .get('StatusLowBattery', config.deviceAddress + ':0.LOWBAT', (value, c) => { return value ? c.BATTERY_LEVEL_LOW : c.BATTERY_LEVEL_NORMAL; }) .get('BatteryLevel', config.deviceAddress + ':0.LOWBAT', value => { return value ? 0 : 100; }) .update('ChargingState', 2); if (this.option('HumiditySensor')) { this.addService('HumiditySensor', config.name) .get('CurrentRelativeHumidity', config.deviceAddress + ':1.HUMIDITY') .get('StatusLowBattery', config.deviceAddress + ':0.LOWBAT', (value, c) => { return value ? c.BATTERY_LEVEL_LOW : c.BATTERY_LEVEL_NORMAL; }); } } };