@@ -223,6 +223,8 @@ const localDevices = pjson.load('devices_' + config.ccuAddress) || {};
223
223
localDevices . HmIP = localDevices . HmIP || { } ;
224
224
const localParamsetDescriptions = pjson . load ( 'paramset-descriptions-v2_' + config . ccuAddress ) || { } ;
225
225
const localRssiInfo = { HmIP : { } } ;
226
+ const localServiceMessages = { HmIP : { } } ;
227
+ const serviceMessages = [ 'CONFIG_PENDING' , 'DUTY_CYCLE' , 'ERROR_CODE' , 'LOW_BAT' , 'SABOTAGE' , 'UNREACH' ] ;
226
228
let hmipAddress ;
227
229
const rpcClients = { } ;
228
230
@@ -302,7 +304,7 @@ function initRpcClients() {
302
304
303
305
let count = 0 ; // Math.floor(Math.random() * 65536);
304
306
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 ;
306
308
daemonIndex [ config . daemons [ daemon ] . ident ] = daemon ;
307
309
308
310
rpcClients [ daemon ] = ( config . daemons [ daemon ] . protocol === 'binrpc' ? binrpc : xmlrpc ) . createClient ( {
@@ -327,6 +329,26 @@ function initRpcClients() {
327
329
setInterval ( pingPong , 15000 ) ;
328
330
}
329
331
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
+
330
352
const rpcMethods = {
331
353
'system.multicall' ( err , params , callback ) {
332
354
const queue = [ ] ;
@@ -351,7 +373,10 @@ const rpcMethods = {
351
373
const evDaemon = params [ 0 ] === 'CUxD' ? 'CUxD' : daemonIndex [ params [ 0 ] ] ;
352
374
lastEvent [ evDaemon ] = ( new Date ( ) ) . getTime ( ) ;
353
375
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
+ }
355
380
if ( params [ 2 ] . startsWith ( 'RSSI_' ) ) {
356
381
if ( ! localRssiInfo . HmIP [ hmipAddress ] ) {
357
382
localRssiInfo . HmIP [ hmipAddress ] = { } ;
@@ -676,6 +701,24 @@ function rpcProxy(daemon, method, params, callback) {
676
701
}
677
702
break ;
678
703
}
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
+ }
679
722
case 'rssiInfo' : {
680
723
if ( localRssiInfo [ daemon ] ) {
681
724
log . debug ( 'respond to rssiInfo from cache' ) ;
@@ -740,6 +783,11 @@ function rpcProxy(daemon, method, params, callback) {
740
783
localRssiInfo . HmIP [ device ] [ hmipAddress ] [ 0 ] = res . RSSI_PEER ;
741
784
localRssiInfo . HmIP [ hmipAddress ] [ device ] [ 1 ] = res . RSSI_PEER ;
742
785
}
786
+ serviceMessages . forEach ( dp => {
787
+ if ( typeof res [ dp ] !== 'undefined' ) {
788
+ setServiceMessage ( daemon , params [ 0 ] , dp , res [ dp ] ) ;
789
+ }
790
+ } )
743
791
}
744
792
if ( callback ) {
745
793
callback ( err , res ) ;
0 commit comments