Skip to content

Commit

Permalink
add HmIP-eTRV (close #10)
Browse files Browse the repository at this point in the history
  • Loading branch information
hobbyquaker committed Oct 18, 2018
1 parent b484a34 commit e03ce7e
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 25 deletions.
1 change: 1 addition & 0 deletions homematic-devices/hmip-etrv-2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('./hmip-etrv');
107 changes: 82 additions & 25 deletions homematic-devices/hmip-etrv.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,19 @@ module.exports = class HmipEtrv {
}

const datapointTemperature = config.iface + '.' + config.description.ADDRESS + ':1.ACTUAL_TEMPERATURE';
let valueTemperature = (ccu.values && ccu.values[datapointTemperature] && ccu.values[datapointTemperature].value) || 0;
let actualTemperature = (ccu.values && ccu.values[datapointTemperature] && ccu.values[datapointTemperature].value) || 0;

const datapointLevel = config.iface + '.' + config.description.ADDRESS + ':1.LEVEL';
let valueLevel = (ccu.values && ccu.values[datapointLevel] && ccu.values[datapointLevel].value) || 0;
let level = (ccu.values && ccu.values[datapointLevel] && ccu.values[datapointLevel].value) || 0;

const datapointSetpoint = config.iface + '.' + config.description.ADDRESS + ':1.SET_POINT_TEMPERATURE';
let valueSetpoint = (ccu.values && ccu.values[datapointSetpoint] && ccu.values[datapointSetpoint].value) || 0;

This comment has been minimized.

Copy link
@ptweety

ptweety Oct 18, 2018

Contributor

Ich würde hier setPointTemperature statt valueSetpoint gut finden

This comment has been minimized.

Copy link
@hobbyquaker

hobbyquaker Oct 18, 2018

Author Member

Jap, wäre "richtiger" ;-) dann müsste es auch datapointSetPointTemperature statt datapointSetpoint heissen. PR welcome :)


const datapointControlMode = config.iface + '.' + config.description.ADDRESS + ':1.SET_POINT_MODE';

This comment has been minimized.

Copy link
@ptweety

ptweety Oct 18, 2018

Contributor

Wäre es nicht konsistent datapointSetpointMode zu schreiben?

This comment has been minimized.

Copy link
@hobbyquaker

hobbyquaker Oct 18, 2018

Author Member

da geb ich Dir recht, nehme gerne einen PR an :)

let setPointMode = (ccu.values && ccu.values[datapointControlMode] && ccu.values[datapointControlMode].value) || 0;

const datapointLowbat = config.iface + '.' + config.description.ADDRESS + ':0.LOW_BAT';
let lowbat = (ccu.values && ccu.values[datapointLowbat] && ccu.values[datapointLowbat].value) ?
let lowBat = (ccu.values && ccu.values[datapointLowbat] && ccu.values[datapointLowbat].value) ?
hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW :
hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;

Expand All @@ -44,13 +46,27 @@ module.exports = class HmipEtrv {

function targetState() {
// 0=off, 1=heat, 3=auto
return valueSetpoint > 12 ? 3 : 0;
let target;
homematic.log(config.name + ' controlMode ' + setPointMode);
switch (setPointMode) {
case 1:
// Manu
target = valueSetpoint > 4.5 ? 1 : 0;
break;
default:
// Auto/Party
target = 3;
}
homematic.log(config.name + ' TargetHeatingCoolingState ' + target);
return target;

}

function currentState() {
// 0=off, 1=heat
return (valueLevel > 0 && valueSetpoint > 12) ? 1 : 0;

const current = level > 0 ? 1 : 0;
homematic.log(config.name + ' CurrentHeatingCoolingState ' + current);
return current;
}

const acc = bridgeConfig.accessory({id: config.description.ADDRESS, name: config.name});
Expand All @@ -72,7 +88,7 @@ module.exports = class HmipEtrv {
acc.addService(hap.Service.Thermostat, config.name, subtypeThermostat)
.getCharacteristic(hap.Characteristic.CurrentTemperature)
.setProps({minValue: -40, maxValue: 80})
.updateValue(valueTemperature)
.updateValue(actualTemperature)

acc.getService(subtypeThermostat)
.getCharacteristic(hap.Characteristic.TargetTemperature)
Expand All @@ -86,7 +102,7 @@ module.exports = class HmipEtrv {

acc.getService(subtypeThermostat)
.getCharacteristic(hap.Characteristic.TargetHeatingCoolingState)
.setProps({validValues: [0, 3]})
.setProps({validValues: [0, 1, 3]})
.updateValue(targetState());

acc.addService(hap.Service.BatteryService, config.name, subtypeBattery);
Expand All @@ -95,8 +111,8 @@ module.exports = class HmipEtrv {
}

const getListenerCurrentTemperature = callback => {
homematic.debug('get ' + config.name + ' ' + subtypeThermostat + ' CurrentTemperature ' + getError() + ' ' + valueTemperature);
callback(null, valueTemperature);
homematic.debug('get ' + config.name + ' ' + subtypeThermostat + ' CurrentTemperature ' + getError() + ' ' + actualTemperature);
callback(null, actualTemperature);
};

const getListenerTargetTemperature = callback => {
Expand All @@ -119,28 +135,65 @@ module.exports = class HmipEtrv {
const state = targetState();
homematic.debug('get ' + config.name + ' ' + subtypeThermostat + ' TargetHeatingCoolingState ' + getError() + ' ' + state);
callback(null, state);
setTimeout(() => {
updateHeatingCoolingState();
}, 1000);
};

const setListenerTargetHeatingCoolingState = (value, callback) => {
// 0=off, 1=heat, 3=auto
homematic.log('set ' + config.name + ' 0 TargetHeatingCoolingState ' + value);
callback();
if (value === 0) {
ccu.methodCall(config.iface, 'putParamset', [config.description.ADDRESS + ':1', 'VALUES', {
'CONTROL_MODE': 1,
'SET_POINT_TEMPERATURE': 4.5
}]).then(() => {
callback();
})
.catch(() => {
callback(new Error(hap.HAPServer.Status.SERVICE_COMMUNICATION_FAILURE));
});
} else if (value === 1) {
ccu.methodCall(config.iface, 'putParamset', [config.description.ADDRESS + ':1', 'VALUES', {
'CONTROL_MODE': 1,
'SET_POINT_TEMPERATURE': 21
}]).then(() => {
callback();
})
.catch(() => {
callback(new Error(hap.HAPServer.Status.SERVICE_COMMUNICATION_FAILURE));
});
} else {
ccu.setValue(config.iface, config.description.ADDRESS + ':1', 'CONTROL_MODE', value === 3 ? 0 : 1)

This comment has been minimized.

Copy link
@ptweety

ptweety Oct 18, 2018

Contributor

Sollte das nicht eher SET_POINT_MODE statt CONTROL_MODE sein?

This comment has been minimized.

Copy link
@hobbyquaker

hobbyquaker Oct 18, 2018

Author Member

ich versteh zugegebenermaßen den Unterschied zwischen den CONTROL_MODE und SET_POINT_MODE Datenpunkten nicht. Mit CONTROL_MODE scheint es allerdings zu funktionieren.

.then(() => {
callback();
})
.catch(() => {
callback(new Error(hap.HAPServer.Status.SERVICE_COMMUNICATION_FAILURE));
});
}


};

const getListenerCurrentHeatingCoolingState = callback => {
const state = currentState();
homematic.debug('get ' + config.name + ' ' + subtypeThermostat + ' CurrentHeatingCoolingState ' + getError() + ' ' + state);
callback(null, state);
setTimeout(() => {
updateHeatingCoolingState();
}, 1000);
};


const getListenerLowbat = callback => {
homematic.debug('get ' + config.name + ' ' + subtypeBattery + ' StatusLowBattery ' + getError() + ' ' + lowbat);
callback(null, lowbat);
homematic.debug('get ' + config.name + ' ' + subtypeBattery + ' StatusLowBattery ' + getError() + ' ' + lowBat);
callback(null, lowBat);
};

const getListenerBattery = callback => {
homematic.debug('get ' + config.name + ' ' + subtypeBattery + ' Batterylevel ' + getError() + ' ' + battery);
callback(null, lowbat);
callback(null, battery);
};

acc.getService(subtypeThermostat).getCharacteristic(hap.Characteristic.TargetTemperature).on('get', getListenerTargetTemperature);
Expand All @@ -154,13 +207,15 @@ module.exports = class HmipEtrv {

function updateHeatingCoolingState() {
const current = currentState();
homematic.debug('update ' + config.name + ' 0 CurrentHeatingCoolingState ' + current);
homematic.log('update ' + config.name + ' 0 CurrentHeatingCoolingState ' + current);
acc.getService(subtypeThermostat).updateCharacteristic(hap.Characteristic.CurrentHeatingCoolingState, current);
const target = targetState();
homematic.debug('update ' + config.name + ' 0 TargetHeatingCoolingState ' + target);
homematic.log('update ' + config.name + ' 0 TargetHeatingCoolingState ' + target);
acc.getService(subtypeThermostat).updateCharacteristic(hap.Characteristic.TargetHeatingCoolingState, target);
}



const idSubscription = ccu.subscribe({
iface: config.iface,
device: config.description.ADDRESS,
Expand All @@ -170,23 +225,21 @@ module.exports = class HmipEtrv {
switch (msg.channelIndex + '.' + msg.datapoint) {
case '0.UNREACH':
unreach = msg.value;
homematic.debug('update ' + config.name + ' ' + subtypeThermostat + ' StatusFault ' + unreach);
acc.getService(subtypeThermostat).updateCharacteristic(hap.Characteristic.StatusFault, unreach);
break;
case '0.OPERATING_VOLTAGE':
battery = batteryPercent(msg.value);
homematic.debug('update ' + config.name + ' ' + subtypeBattery + ' BatteryLevel ' + battery);
acc.getService(subtypeBattery).updateCharacteristic(hap.Characteristic.BatteryLevel, battery);
break;
case '0.LOW_BAT':
lowbat = msg.value ? hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
homematic.debug('update ' + config.name + ' ' + subtypeBattery + ' StatusLowBattery ' + lowbat);
acc.getService(subtypeBattery).updateCharacteristic(hap.Characteristic.StatusLowBattery, lowbat);
lowBat = msg.value ? hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
homematic.debug('update ' + config.name + ' ' + subtypeBattery + ' StatusLowBattery ' + lowBat);
acc.getService(subtypeBattery).updateCharacteristic(hap.Characteristic.StatusLowBattery, lowBat);
break;
case '1.ACTUAL_TEMPERATURE':
valueTemperature = msg.value;
homematic.debug('update ' + config.name + ' ' + subtypeThermostat + ' CurrentTemperature ' + valueTemperature);
acc.getService(subtypeThermostat).updateCharacteristic(hap.Characteristic.CurrentTemperature, valueTemperature);
actualTemperature = msg.value;
homematic.debug('update ' + config.name + ' ' + subtypeThermostat + ' CurrentTemperature ' + actualTemperature);
acc.getService(subtypeThermostat).updateCharacteristic(hap.Characteristic.CurrentTemperature, actualTemperature);
break;
case '1.SET_POINT_TEMPERATURE':
valueSetpoint = msg.value;
Expand All @@ -195,7 +248,11 @@ module.exports = class HmipEtrv {
updateHeatingCoolingState();
break;
case '1.LEVEL':
valueLevel = msg.value;
level = msg.value;
updateHeatingCoolingState();
break;
case '1.SET_POINT_MODE':
setPointMode = msg.value;
updateHeatingCoolingState();
break;
default:
Expand Down

0 comments on commit e03ce7e

Please sign in to comment.