@@ -381,47 +381,42 @@ SMAHomeManager.prototype = {
381
381
return ;
382
382
}
383
383
384
+ // Only register the inverter discovery after all metadata has been discovered.
384
385
let deviceClass ;
386
+ let deviceType ;
385
387
let serialNumber ;
386
388
let firmwareRevision ;
387
-
388
- // Read device class (U32, ENUM).
389
- client . readHoldingRegisters ( 30051 , 2 , function ( err , data ) {
390
- const deviceClassId = data . buffer . readUInt32BE ( ) ;
391
- deviceClass = SMA_DEVICE_CLASSES . get ( deviceClassId ) || `unknown ${ deviceClassId } ` ;
392
- if ( serialNumber && firmwareRevision ) {
389
+ registerInverterDiscoveryIfComplete = function ( ) {
390
+ if ( deviceClass && deviceType && serialNumber && firmwareRevision ) {
393
391
this . discovered . inverter = {
394
392
DeviceClass : deviceClass ,
393
+ DeviceType : deviceType ,
395
394
SerialNumber : serialNumber ,
396
395
FirmwareRevision : firmwareRevision ,
397
396
} ;
398
397
}
398
+ } . bind ( this ) ;
399
+
400
+ // Read device class (U32, ENUM).
401
+ client . readHoldingRegisters ( 30051 , 4 , function ( err , data ) {
402
+ const deviceClassId = data . buffer . slice ( 0 , 4 ) . readUInt32BE ( ) ;
403
+ deviceType = data . buffer . slice ( 4 , 8 ) . readUInt32BE ( ) ;
404
+ deviceClass = SMA_DEVICE_CLASSES . get ( deviceClassId ) || `unknown ${ deviceClassId } ` ;
405
+ registerInverterDiscoveryIfComplete ( ) ;
399
406
} . bind ( this ) ) ;
400
407
401
408
// Read serial number (U32, RAW).
402
409
client . readHoldingRegisters ( 30057 , 2 , function ( err , data ) {
403
410
serialNumber = data . buffer . readUInt32BE ( ) ;
404
- if ( deviceClass && firmwareRevision ) {
405
- this . discovered . inverter = {
406
- DeviceClass : deviceClass ,
407
- SerialNumber : serialNumber ,
408
- FirmwareRevision : firmwareRevision ,
409
- } ;
410
- }
411
+ registerInverterDiscoveryIfComplete ( ) ;
411
412
} . bind ( this ) ) ;
412
413
413
414
// Read firmware version (U32, FW).
414
415
client . readHoldingRegisters ( 40065 , 2 , function ( err , data ) {
415
416
// TRICKY: some inverters don't expose the firmware version: SBn.n-1AV-40.
416
417
if ( data . buffer . equals ( SMA_MODBUS_U32_NAN_VALUE ) ) {
417
- const firmwareRevision = 'unknown' ;
418
- if ( deviceClass && serialNumber ) {
419
- this . discovered . inverter = {
420
- DeviceClass : deviceClass ,
421
- SerialNumber : serialNumber ,
422
- FirmwareRevision : firmwareRevision ,
423
- } ;
424
- }
418
+ firmwareRevision = 'unknown' ;
419
+ registerInverterDiscoveryIfComplete ( ) ;
425
420
return ;
426
421
}
427
422
@@ -454,13 +449,8 @@ SMAHomeManager.prototype = {
454
449
releaseType = 'S(pecial release)' ;
455
450
break ;
456
451
}
457
- const firmwareRevision = major + '.' + minor + '.' + build + '.' + releaseType ;
458
- if ( serialNumber ) {
459
- this . discovered . inverter = {
460
- SerialNumber : serialNumber ,
461
- FirmwareRevision : firmwareRevision ,
462
- } ;
463
- }
452
+ firmwareRevision = major + '.' + minor + '.' + build + '.' + releaseType ;
453
+ registerInverterDiscoveryIfComplete ( ) ;
464
454
} . bind ( this ) ) ;
465
455
} ,
466
456
0 commit comments