Skip to content

Commit b36bd0e

Browse files
committed
Harden inverter metadata reading logic, and add preliminary support for DeviceType. This should be helpful to diagnose device-specific edge cases.
1 parent 23bef97 commit b36bd0e

File tree

1 file changed

+18
-28
lines changed

1 file changed

+18
-28
lines changed

index.js

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -381,47 +381,42 @@ SMAHomeManager.prototype = {
381381
return;
382382
}
383383

384+
// Only register the inverter discovery after all metadata has been discovered.
384385
let deviceClass;
386+
let deviceType;
385387
let serialNumber;
386388
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) {
393391
this.discovered.inverter = {
394392
DeviceClass: deviceClass,
393+
DeviceType: deviceType,
395394
SerialNumber: serialNumber,
396395
FirmwareRevision: firmwareRevision,
397396
};
398397
}
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();
399406
}.bind(this));
400407

401408
// Read serial number (U32, RAW).
402409
client.readHoldingRegisters(30057, 2, function(err, data) {
403410
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();
411412
}.bind(this));
412413

413414
// Read firmware version (U32, FW).
414415
client.readHoldingRegisters(40065, 2, function(err, data) {
415416
// TRICKY: some inverters don't expose the firmware version: SBn.n-1AV-40.
416417
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();
425420
return;
426421
}
427422

@@ -454,13 +449,8 @@ SMAHomeManager.prototype = {
454449
releaseType = 'S(pecial release)';
455450
break;
456451
}
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();
464454
}.bind(this));
465455
},
466456

0 commit comments

Comments
 (0)