Skip to content

Commit 1a8ddf5

Browse files
committed
fake getServiceMessages for HmIP (Workaround #45)
1 parent 41c3904 commit 1a8ddf5

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed

main.js

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ const localDevices = pjson.load('devices_' + config.ccuAddress) || {};
223223
localDevices.HmIP = localDevices.HmIP || {};
224224
const localParamsetDescriptions = pjson.load('paramset-descriptions-v2_' + config.ccuAddress) || {};
225225
const localRssiInfo = {HmIP: {}};
226+
const localServiceMessages = {HmIP: {}};
227+
const serviceMessages = ['CONFIG_PENDING', 'DUTY_CYCLE', 'ERROR_CODE', 'LOW_BAT', 'SABOTAGE', 'UNREACH'];
226228
let hmipAddress;
227229
const rpcClients = {};
228230

@@ -302,7 +304,7 @@ function initRpcClients() {
302304

303305
let count = 0; // Math.floor(Math.random() * 65536);
304306
Object.keys(config.daemons).forEach(daemon => {
305-
config.daemons[daemon].ident = daemon === 'CUxD' ? 'CUxD' : 'hmm_' + count;
307+
config.daemons[daemon].ident = daemon === 'CUxD' ? 'CUxD' : 'hmm_' + daemon;
306308
daemonIndex[config.daemons[daemon].ident] = daemon;
307309

308310
rpcClients[daemon] = (config.daemons[daemon].protocol === 'binrpc' ? binrpc : xmlrpc).createClient({
@@ -327,6 +329,26 @@ function initRpcClients() {
327329
setInterval(pingPong, 15000);
328330
}
329331

332+
function setServiceMessage(daemon, channel, datapoint, value) {
333+
console.log('setServiceMessage', daemon, channel, datapoint, value);
334+
if (value) {
335+
if (!localServiceMessages[daemon]) {
336+
localServiceMessages[daemon] = {};
337+
}
338+
if (!localServiceMessages[daemon][channel]) {
339+
localServiceMessages[daemon][channel] = {};
340+
}
341+
localServiceMessages[daemon][channel][datapoint] = value;
342+
} else {
343+
if (localServiceMessages[daemon] && localServiceMessages[daemon][channel] && localServiceMessages[daemon][channel][datapoint]) {
344+
delete localServiceMessages[daemon][channel][datapoint];
345+
if ((Object.keys(localServiceMessages[daemon][channel])).length === 0) {
346+
delete localServiceMessages[daemon][channel];
347+
}
348+
}
349+
}
350+
}
351+
330352
const rpcMethods = {
331353
'system.multicall'(err, params, callback) {
332354
const queue = [];
@@ -351,7 +373,10 @@ const rpcMethods = {
351373
const evDaemon = params[0] === 'CUxD' ? 'CUxD' : daemonIndex[params[0]];
352374
lastEvent[evDaemon] = (new Date()).getTime();
353375
if (evDaemon === 'HmIP') {
354-
const device = params[1].split(':')[0];
376+
const [device, channelNumber] = params[1].split(':');
377+
if (serviceMessages.includes(params[2])) {
378+
setServiceMessage(evDaemon, params[1], params[2], params[3]);
379+
}
355380
if (params[2].startsWith('RSSI_')) {
356381
if (!localRssiInfo.HmIP[hmipAddress]) {
357382
localRssiInfo.HmIP[hmipAddress] = {};
@@ -676,6 +701,24 @@ function rpcProxy(daemon, method, params, callback) {
676701
}
677702
break;
678703
}
704+
case 'getServiceMessages': {
705+
if (daemon === 'HmIP') {
706+
const arr = [];
707+
Object.keys(localServiceMessages[daemon]).forEach(channel => {
708+
Object.keys(localServiceMessages[daemon][channel]).forEach(dp => {
709+
arr.push([channel, dp, localServiceMessages[daemon][channel][dp]]);
710+
});
711+
});
712+
callback(null, arr);
713+
} else {
714+
rpcClients[daemon].methodCall(method, params, (err, res) => {
715+
if (typeof callback === 'function') {
716+
callback(err, res);
717+
}
718+
});
719+
}
720+
break;
721+
}
679722
case 'rssiInfo': {
680723
if (localRssiInfo[daemon]) {
681724
log.debug('respond to rssiInfo from cache');
@@ -740,6 +783,11 @@ function rpcProxy(daemon, method, params, callback) {
740783
localRssiInfo.HmIP[device][hmipAddress][0] = res.RSSI_PEER;
741784
localRssiInfo.HmIP[hmipAddress][device][1] = res.RSSI_PEER;
742785
}
786+
serviceMessages.forEach(dp => {
787+
if (typeof res[dp] !== 'undefined') {
788+
setServiceMessage(daemon, params[0], dp, res[dp]);
789+
}
790+
})
743791
}
744792
if (callback) {
745793
callback(err, res);

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "homematic-manager",
3-
"version": "2.1.13",
3+
"version": "2.2.0",
44
"private": true,
55
"dependencies": {
66
"async": "2.6.1",

0 commit comments

Comments
 (0)