@enyo-energy/energy-app-sdk 0.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +216 -0
- package/dist/cjs/connect-ems-api.cjs +2 -0
- package/dist/cjs/connect-ems-api.d.cts +30 -0
- package/dist/cjs/connect-ems-permission.enum.cjs +7 -0
- package/dist/cjs/connect-ems-permission.enum.d.cts +3 -0
- package/dist/cjs/connect-ems-permission.type.cjs +2 -0
- package/dist/cjs/connect-ems-permission.type.d.cts +1 -0
- package/dist/cjs/connect-package-definition.cjs +14 -0
- package/dist/cjs/connect-package-definition.d.cts +57 -0
- package/dist/cjs/energy-app-appliance-type.enum.cjs +14 -0
- package/dist/cjs/energy-app-appliance-type.enum.d.cts +10 -0
- package/dist/cjs/energy-app-package-configuration.cjs +2 -0
- package/dist/cjs/energy-app-package-configuration.d.cts +30 -0
- package/dist/cjs/energy-app-package-definition.cjs +30 -0
- package/dist/cjs/energy-app-package-definition.d.cts +123 -0
- package/dist/cjs/energy-app-permission.type.cjs +21 -0
- package/dist/cjs/energy-app-permission.type.d.cts +18 -0
- package/dist/cjs/enyo-energy-app-sdk.cjs +12 -0
- package/dist/cjs/enyo-energy-app-sdk.d.cts +67 -0
- package/dist/cjs/hems-one-energy-app-sdk.cjs +12 -0
- package/dist/cjs/hems-one-energy-app-sdk.d.cts +64 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusBattery.cjs +388 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusBattery.d.cts +59 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusConnectionHealth.cjs +37 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusConnectionHealth.d.cts +15 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusDataTypeConverter.cjs +130 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusDataTypeConverter.d.cts +41 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusFaultTolerantReader.cjs +49 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusFaultTolerantReader.d.cts +10 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusInverter.cjs +348 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusInverter.d.cts +56 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusMeter.cjs +199 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusMeter.d.cts +26 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusRegisterMapper.cjs +98 -0
- package/dist/cjs/implementations/modbus/EnergyAppModbusRegisterMapper.d.cts +13 -0
- package/dist/cjs/implementations/modbus/interfaces.cjs +29 -0
- package/dist/cjs/implementations/modbus/interfaces.d.cts +202 -0
- package/dist/cjs/implementations/ocpp/ocpp-common.cjs +337 -0
- package/dist/cjs/implementations/ocpp/ocpp-common.d.cts +75 -0
- package/dist/cjs/implementations/ocpp/ocpp16.cjs +51 -0
- package/dist/cjs/implementations/ocpp/ocpp16.d.cts +137 -0
- package/dist/cjs/implementations/ocpp/ocpp201.cjs +84 -0
- package/dist/cjs/implementations/ocpp/ocpp201.d.cts +215 -0
- package/dist/cjs/index.cjs +117 -0
- package/dist/cjs/index.d.cts +56 -0
- package/dist/cjs/mockConnectEmsApi.cjs +167 -0
- package/dist/cjs/mockConnectEmsApi.d.cts +10 -0
- package/dist/cjs/packages/connect-appliance.cjs +2 -0
- package/dist/cjs/packages/connect-appliance.d.cts +24 -0
- package/dist/cjs/packages/connect-http-api.cjs +2 -0
- package/dist/cjs/packages/connect-http-api.d.cts +15 -0
- package/dist/cjs/packages/connect-interval.cjs +2 -0
- package/dist/cjs/packages/connect-interval.d.cts +15 -0
- package/dist/cjs/packages/connect-modbus.cjs +2 -0
- package/dist/cjs/packages/connect-modbus.d.cts +60 -0
- package/dist/cjs/packages/connect-network-devices.cjs +2 -0
- package/dist/cjs/packages/connect-network-devices.d.cts +40 -0
- package/dist/cjs/packages/connect-storage.cjs +2 -0
- package/dist/cjs/packages/connect-storage.d.cts +14 -0
- package/dist/cjs/packages/energy-app-appliance.cjs +2 -0
- package/dist/cjs/packages/energy-app-appliance.d.cts +17 -0
- package/dist/cjs/packages/energy-app-authentication.cjs +2 -0
- package/dist/cjs/packages/energy-app-authentication.d.cts +52 -0
- package/dist/cjs/packages/energy-app-charge.cjs +2 -0
- package/dist/cjs/packages/energy-app-charge.d.cts +13 -0
- package/dist/cjs/packages/energy-app-charging-card.cjs +2 -0
- package/dist/cjs/packages/energy-app-charging-card.d.cts +11 -0
- package/dist/cjs/packages/energy-app-data-bus.cjs +2 -0
- package/dist/cjs/packages/energy-app-data-bus.d.cts +12 -0
- package/dist/cjs/packages/energy-app-electricity-prices.cjs +2 -0
- package/dist/cjs/packages/energy-app-electricity-prices.d.cts +59 -0
- package/dist/cjs/packages/energy-app-interval.cjs +2 -0
- package/dist/cjs/packages/energy-app-interval.d.cts +15 -0
- package/dist/cjs/packages/energy-app-modbus.cjs +2 -0
- package/dist/cjs/packages/energy-app-modbus.d.cts +46 -0
- package/dist/cjs/packages/energy-app-network-device.cjs +2 -0
- package/dist/cjs/packages/energy-app-network-device.d.cts +25 -0
- package/dist/cjs/packages/energy-app-notification.cjs +2 -0
- package/dist/cjs/packages/energy-app-notification.d.cts +50 -0
- package/dist/cjs/packages/energy-app-ocpp.cjs +16 -0
- package/dist/cjs/packages/energy-app-ocpp.d.cts +52 -0
- package/dist/cjs/packages/energy-app-settings.cjs +2 -0
- package/dist/cjs/packages/energy-app-settings.d.cts +47 -0
- package/dist/cjs/packages/energy-app-storage.cjs +2 -0
- package/dist/cjs/packages/energy-app-storage.d.cts +14 -0
- package/dist/cjs/packages/energy-app-vehicle.cjs +2 -0
- package/dist/cjs/packages/energy-app-vehicle.d.cts +11 -0
- package/dist/cjs/permission-not-granted.cjs +18 -0
- package/dist/cjs/permission-not-granted.d.cts +8 -0
- package/dist/cjs/types/connect-appliance-type.enum.cjs +10 -0
- package/dist/cjs/types/connect-appliance-type.enum.d.cts +6 -0
- package/dist/cjs/types/energy-app-settings.cjs +2 -0
- package/dist/cjs/types/energy-app-settings.d.cts +74 -0
- package/dist/cjs/types/enyo-appliance.cjs +33 -0
- package/dist/cjs/types/enyo-appliance.d.cts +81 -0
- package/dist/cjs/types/enyo-authentication.cjs +9 -0
- package/dist/cjs/types/enyo-authentication.d.cts +69 -0
- package/dist/cjs/types/enyo-battery-appliance.cjs +2 -0
- package/dist/cjs/types/enyo-battery-appliance.d.cts +6 -0
- package/dist/cjs/types/enyo-charge.cjs +15 -0
- package/dist/cjs/types/enyo-charge.d.cts +82 -0
- package/dist/cjs/types/enyo-charger-appliance.cjs +41 -0
- package/dist/cjs/types/enyo-charger-appliance.d.cts +49 -0
- package/dist/cjs/types/enyo-charging-card.cjs +2 -0
- package/dist/cjs/types/enyo-charging-card.d.cts +11 -0
- package/dist/cjs/types/enyo-data-bus-value.cjs +78 -0
- package/dist/cjs/types/enyo-data-bus-value.d.cts +379 -0
- package/dist/cjs/types/enyo-electricity-prices.cjs +2 -0
- package/dist/cjs/types/enyo-electricity-prices.d.cts +63 -0
- package/dist/cjs/types/enyo-energy-tariff.cjs +2 -0
- package/dist/cjs/types/enyo-energy-tariff.d.cts +70 -0
- package/dist/cjs/types/enyo-heatpump-appliance.cjs +19 -0
- package/dist/cjs/types/enyo-heatpump-appliance.d.cts +34 -0
- package/dist/cjs/types/enyo-inverter-appliance.cjs +2 -0
- package/dist/cjs/types/enyo-inverter-appliance.d.cts +3 -0
- package/dist/cjs/types/enyo-meter-appliance.cjs +10 -0
- package/dist/cjs/types/enyo-meter-appliance.d.cts +10 -0
- package/dist/cjs/types/enyo-network-device.cjs +2 -0
- package/dist/cjs/types/enyo-network-device.d.cts +31 -0
- package/dist/cjs/types/enyo-notification.cjs +2 -0
- package/dist/cjs/types/enyo-notification.d.cts +48 -0
- package/dist/cjs/types/enyo-settings.cjs +2 -0
- package/dist/cjs/types/enyo-settings.d.cts +74 -0
- package/dist/cjs/types/enyo-source.enum.cjs +8 -0
- package/dist/cjs/types/enyo-source.enum.d.cts +4 -0
- package/dist/cjs/types/enyo-vehicle.cjs +2 -0
- package/dist/cjs/types/enyo-vehicle.d.cts +12 -0
- package/dist/cjs/types/enyo-websocket-connection.cjs +2 -0
- package/dist/cjs/types/enyo-websocket-connection.d.cts +8 -0
- package/dist/cjs/types/hems-one-appliance.cjs +33 -0
- package/dist/cjs/types/hems-one-appliance.d.cts +81 -0
- package/dist/cjs/types/hems-one-authentication.cjs +9 -0
- package/dist/cjs/types/hems-one-authentication.d.cts +69 -0
- package/dist/cjs/types/hems-one-battery-appliance.cjs +2 -0
- package/dist/cjs/types/hems-one-battery-appliance.d.cts +6 -0
- package/dist/cjs/types/hems-one-charge.cjs +15 -0
- package/dist/cjs/types/hems-one-charge.d.cts +82 -0
- package/dist/cjs/types/hems-one-charger-appliance.cjs +41 -0
- package/dist/cjs/types/hems-one-charger-appliance.d.cts +49 -0
- package/dist/cjs/types/hems-one-charging-card.cjs +2 -0
- package/dist/cjs/types/hems-one-charging-card.d.cts +11 -0
- package/dist/cjs/types/hems-one-data-bus-command.cjs +9 -0
- package/dist/cjs/types/hems-one-data-bus-command.d.cts +34 -0
- package/dist/cjs/types/hems-one-data-bus-value.cjs +78 -0
- package/dist/cjs/types/hems-one-data-bus-value.d.cts +379 -0
- package/dist/cjs/types/hems-one-electricity-prices.cjs +2 -0
- package/dist/cjs/types/hems-one-electricity-prices.d.cts +63 -0
- package/dist/cjs/types/hems-one-energy-tariff.cjs +2 -0
- package/dist/cjs/types/hems-one-energy-tariff.d.cts +70 -0
- package/dist/cjs/types/hems-one-heatpump-appliance.cjs +19 -0
- package/dist/cjs/types/hems-one-heatpump-appliance.d.cts +34 -0
- package/dist/cjs/types/hems-one-inverter-appliance.cjs +2 -0
- package/dist/cjs/types/hems-one-inverter-appliance.d.cts +3 -0
- package/dist/cjs/types/hems-one-meter-appliance.cjs +10 -0
- package/dist/cjs/types/hems-one-meter-appliance.d.cts +10 -0
- package/dist/cjs/types/hems-one-network-device.cjs +2 -0
- package/dist/cjs/types/hems-one-network-device.d.cts +31 -0
- package/dist/cjs/types/hems-one-source.enum.cjs +8 -0
- package/dist/cjs/types/hems-one-source.enum.d.cts +4 -0
- package/dist/cjs/types/hems-one-vehicle.cjs +2 -0
- package/dist/cjs/types/hems-one-vehicle.d.cts +12 -0
- package/dist/cjs/types/hems-one-websocket-connection.cjs +2 -0
- package/dist/cjs/types/hems-one-websocket-connection.d.cts +8 -0
- package/dist/cjs/version.cjs +19 -0
- package/dist/cjs/version.d.cts +13 -0
- package/dist/connect-ems-api.d.ts +30 -0
- package/dist/connect-ems-api.js +1 -0
- package/dist/connect-ems-permission.enum.d.ts +3 -0
- package/dist/connect-ems-permission.enum.js +4 -0
- package/dist/connect-ems-permission.type.d.ts +1 -0
- package/dist/connect-ems-permission.type.js +1 -0
- package/dist/connect-package-definition.d.ts +57 -0
- package/dist/connect-package-definition.js +10 -0
- package/dist/energy-app-appliance-type.enum.d.ts +10 -0
- package/dist/energy-app-appliance-type.enum.js +11 -0
- package/dist/energy-app-package-configuration.d.ts +30 -0
- package/dist/energy-app-package-configuration.js +1 -0
- package/dist/energy-app-package-definition.d.ts +123 -0
- package/dist/energy-app-package-definition.js +26 -0
- package/dist/energy-app-permission.type.d.ts +18 -0
- package/dist/energy-app-permission.type.js +18 -0
- package/dist/enyo-energy-app-sdk.d.ts +67 -0
- package/dist/enyo-energy-app-sdk.js +9 -0
- package/dist/hems-one-energy-app-sdk.d.ts +67 -0
- package/dist/hems-one-energy-app-sdk.js +9 -0
- package/dist/implementations/modbus/EnergyAppModbusBattery.d.ts +59 -0
- package/dist/implementations/modbus/EnergyAppModbusBattery.js +384 -0
- package/dist/implementations/modbus/EnergyAppModbusConnectionHealth.d.ts +15 -0
- package/dist/implementations/modbus/EnergyAppModbusConnectionHealth.js +33 -0
- package/dist/implementations/modbus/EnergyAppModbusDataTypeConverter.d.ts +41 -0
- package/dist/implementations/modbus/EnergyAppModbusDataTypeConverter.js +126 -0
- package/dist/implementations/modbus/EnergyAppModbusFaultTolerantReader.d.ts +10 -0
- package/dist/implementations/modbus/EnergyAppModbusFaultTolerantReader.js +45 -0
- package/dist/implementations/modbus/EnergyAppModbusInverter.d.ts +56 -0
- package/dist/implementations/modbus/EnergyAppModbusInverter.js +344 -0
- package/dist/implementations/modbus/EnergyAppModbusMeter.d.ts +26 -0
- package/dist/implementations/modbus/EnergyAppModbusMeter.js +195 -0
- package/dist/implementations/modbus/EnergyAppModbusRegisterMapper.d.ts +13 -0
- package/dist/implementations/modbus/EnergyAppModbusRegisterMapper.js +94 -0
- package/dist/implementations/modbus/interfaces.d.ts +202 -0
- package/dist/implementations/modbus/interfaces.js +23 -0
- package/dist/implementations/ocpp/ocpp-common.d.ts +75 -0
- package/dist/implementations/ocpp/ocpp-common.js +328 -0
- package/dist/implementations/ocpp/ocpp16.d.ts +137 -0
- package/dist/implementations/ocpp/ocpp16.js +48 -0
- package/dist/implementations/ocpp/ocpp201.d.ts +215 -0
- package/dist/implementations/ocpp/ocpp201.js +81 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.js +99 -0
- package/dist/mockConnectEmsApi.d.ts +10 -0
- package/dist/mockConnectEmsApi.js +160 -0
- package/dist/packages/connect-appliance.d.ts +24 -0
- package/dist/packages/connect-appliance.js +1 -0
- package/dist/packages/connect-http-api.d.ts +15 -0
- package/dist/packages/connect-http-api.js +1 -0
- package/dist/packages/connect-interval.d.ts +15 -0
- package/dist/packages/connect-interval.js +1 -0
- package/dist/packages/connect-modbus.d.ts +60 -0
- package/dist/packages/connect-modbus.js +1 -0
- package/dist/packages/connect-network-devices.d.ts +40 -0
- package/dist/packages/connect-network-devices.js +1 -0
- package/dist/packages/connect-storage.d.ts +14 -0
- package/dist/packages/connect-storage.js +1 -0
- package/dist/packages/energy-app-appliance.d.ts +17 -0
- package/dist/packages/energy-app-appliance.js +1 -0
- package/dist/packages/energy-app-authentication.d.ts +52 -0
- package/dist/packages/energy-app-authentication.js +1 -0
- package/dist/packages/energy-app-charge.d.ts +13 -0
- package/dist/packages/energy-app-charge.js +1 -0
- package/dist/packages/energy-app-charging-card.d.ts +11 -0
- package/dist/packages/energy-app-charging-card.js +1 -0
- package/dist/packages/energy-app-data-bus.d.ts +12 -0
- package/dist/packages/energy-app-data-bus.js +1 -0
- package/dist/packages/energy-app-electricity-prices.d.ts +59 -0
- package/dist/packages/energy-app-electricity-prices.js +1 -0
- package/dist/packages/energy-app-interval.d.ts +15 -0
- package/dist/packages/energy-app-interval.js +1 -0
- package/dist/packages/energy-app-modbus.d.ts +46 -0
- package/dist/packages/energy-app-modbus.js +1 -0
- package/dist/packages/energy-app-network-device.d.ts +25 -0
- package/dist/packages/energy-app-network-device.js +1 -0
- package/dist/packages/energy-app-notification.d.ts +50 -0
- package/dist/packages/energy-app-notification.js +1 -0
- package/dist/packages/energy-app-ocpp.d.ts +52 -0
- package/dist/packages/energy-app-ocpp.js +13 -0
- package/dist/packages/energy-app-settings.d.ts +47 -0
- package/dist/packages/energy-app-settings.js +1 -0
- package/dist/packages/energy-app-storage.d.ts +14 -0
- package/dist/packages/energy-app-storage.js +1 -0
- package/dist/packages/energy-app-vehicle.d.ts +11 -0
- package/dist/packages/energy-app-vehicle.js +1 -0
- package/dist/permission-not-granted.d.ts +8 -0
- package/dist/permission-not-granted.js +14 -0
- package/dist/types/connect-appliance-type.enum.d.ts +6 -0
- package/dist/types/connect-appliance-type.enum.js +7 -0
- package/dist/types/energy-app-settings.d.ts +74 -0
- package/dist/types/energy-app-settings.js +1 -0
- package/dist/types/enyo-appliance.d.ts +81 -0
- package/dist/types/enyo-appliance.js +30 -0
- package/dist/types/enyo-authentication.d.ts +69 -0
- package/dist/types/enyo-authentication.js +6 -0
- package/dist/types/enyo-battery-appliance.d.ts +6 -0
- package/dist/types/enyo-battery-appliance.js +1 -0
- package/dist/types/enyo-charge.d.ts +82 -0
- package/dist/types/enyo-charge.js +12 -0
- package/dist/types/enyo-charger-appliance.d.ts +49 -0
- package/dist/types/enyo-charger-appliance.js +38 -0
- package/dist/types/enyo-charging-card.d.ts +11 -0
- package/dist/types/enyo-charging-card.js +1 -0
- package/dist/types/enyo-data-bus-value.d.ts +379 -0
- package/dist/types/enyo-data-bus-value.js +75 -0
- package/dist/types/enyo-electricity-prices.d.ts +63 -0
- package/dist/types/enyo-electricity-prices.js +1 -0
- package/dist/types/enyo-energy-tariff.d.ts +70 -0
- package/dist/types/enyo-energy-tariff.js +1 -0
- package/dist/types/enyo-heatpump-appliance.d.ts +34 -0
- package/dist/types/enyo-heatpump-appliance.js +16 -0
- package/dist/types/enyo-inverter-appliance.d.ts +3 -0
- package/dist/types/enyo-inverter-appliance.js +1 -0
- package/dist/types/enyo-meter-appliance.d.ts +10 -0
- package/dist/types/enyo-meter-appliance.js +7 -0
- package/dist/types/enyo-network-device.d.ts +31 -0
- package/dist/types/enyo-network-device.js +1 -0
- package/dist/types/enyo-notification.d.ts +48 -0
- package/dist/types/enyo-notification.js +1 -0
- package/dist/types/enyo-settings.d.ts +74 -0
- package/dist/types/enyo-settings.js +1 -0
- package/dist/types/enyo-source.enum.d.ts +4 -0
- package/dist/types/enyo-source.enum.js +5 -0
- package/dist/types/enyo-vehicle.d.ts +12 -0
- package/dist/types/enyo-vehicle.js +1 -0
- package/dist/types/enyo-websocket-connection.d.ts +8 -0
- package/dist/types/enyo-websocket-connection.js +1 -0
- package/dist/types/hems-one-appliance.d.ts +81 -0
- package/dist/types/hems-one-appliance.js +30 -0
- package/dist/types/hems-one-authentication.d.ts +69 -0
- package/dist/types/hems-one-authentication.js +6 -0
- package/dist/types/hems-one-battery-appliance.d.ts +6 -0
- package/dist/types/hems-one-battery-appliance.js +1 -0
- package/dist/types/hems-one-charge.d.ts +82 -0
- package/dist/types/hems-one-charge.js +12 -0
- package/dist/types/hems-one-charger-appliance.d.ts +49 -0
- package/dist/types/hems-one-charger-appliance.js +38 -0
- package/dist/types/hems-one-charging-card.d.ts +11 -0
- package/dist/types/hems-one-charging-card.js +1 -0
- package/dist/types/hems-one-data-bus-command.d.ts +34 -0
- package/dist/types/hems-one-data-bus-command.js +6 -0
- package/dist/types/hems-one-data-bus-value.d.ts +379 -0
- package/dist/types/hems-one-data-bus-value.js +75 -0
- package/dist/types/hems-one-electricity-prices.d.ts +63 -0
- package/dist/types/hems-one-electricity-prices.js +1 -0
- package/dist/types/hems-one-energy-tariff.d.ts +70 -0
- package/dist/types/hems-one-energy-tariff.js +1 -0
- package/dist/types/hems-one-heatpump-appliance.d.ts +34 -0
- package/dist/types/hems-one-heatpump-appliance.js +16 -0
- package/dist/types/hems-one-inverter-appliance.d.ts +3 -0
- package/dist/types/hems-one-inverter-appliance.js +1 -0
- package/dist/types/hems-one-meter-appliance.d.ts +10 -0
- package/dist/types/hems-one-meter-appliance.js +7 -0
- package/dist/types/hems-one-network-device.d.ts +31 -0
- package/dist/types/hems-one-network-device.js +1 -0
- package/dist/types/hems-one-source.enum.d.ts +4 -0
- package/dist/types/hems-one-source.enum.js +5 -0
- package/dist/types/hems-one-vehicle.d.ts +12 -0
- package/dist/types/hems-one-vehicle.js +1 -0
- package/dist/types/hems-one-websocket-connection.d.ts +8 -0
- package/dist/types/hems-one-websocket-connection.js +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.js +15 -0
- package/package.json +43 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EnergyAppModbusDataTypeConverter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Data Type Converter for Modbus Register Values
|
|
6
|
+
*
|
|
7
|
+
* @description Converts raw buffer data from Modbus registers into appropriate JavaScript types
|
|
8
|
+
*/
|
|
9
|
+
class EnergyAppModbusDataTypeConverter {
|
|
10
|
+
/**
|
|
11
|
+
* Converts raw buffer data from Modbus registers into appropriate JavaScript types
|
|
12
|
+
*
|
|
13
|
+
* @param buffer - Raw buffer data from Modbus registers
|
|
14
|
+
* @param dataType - The expected data type for conversion
|
|
15
|
+
* @param scale - Optional scaling factor for numeric types (divide by 10^scale)
|
|
16
|
+
* @param quantity - Required for string types, specifies the string length in characters
|
|
17
|
+
* @returns Converted value (number for numeric types, string for string type)
|
|
18
|
+
*/
|
|
19
|
+
convertFromBuffer(buffer, dataType, scale, quantity) {
|
|
20
|
+
try {
|
|
21
|
+
switch (dataType) {
|
|
22
|
+
case 'uint16': {
|
|
23
|
+
const value = buffer.readUInt16BE(0);
|
|
24
|
+
return this.applyScale(value, scale);
|
|
25
|
+
}
|
|
26
|
+
case 'int16': {
|
|
27
|
+
const value = buffer.readInt16BE(0);
|
|
28
|
+
return this.applyScale(value, scale);
|
|
29
|
+
}
|
|
30
|
+
case 'uint32': {
|
|
31
|
+
const value = buffer.readUInt32BE(0);
|
|
32
|
+
return this.applyScale(value, scale);
|
|
33
|
+
}
|
|
34
|
+
case 'int32': {
|
|
35
|
+
const value = buffer.readInt32BE(0);
|
|
36
|
+
return this.applyScale(value, scale);
|
|
37
|
+
}
|
|
38
|
+
case 'float32': {
|
|
39
|
+
const value = buffer.readFloatBE(0);
|
|
40
|
+
return this.applyScale(value, scale);
|
|
41
|
+
}
|
|
42
|
+
case 'string': {
|
|
43
|
+
if (!quantity || quantity <= 0) {
|
|
44
|
+
throw new Error('String data type requires a valid quantity parameter');
|
|
45
|
+
}
|
|
46
|
+
// Convert buffer to string, handling null termination and trimming whitespace
|
|
47
|
+
return buffer.toString('ascii', 0, Math.min(buffer.length, quantity * 2))
|
|
48
|
+
.replace(/\u0000/gmi, '') // Remove null terminators
|
|
49
|
+
.trim(); // Remove leading/trailing whitespace
|
|
50
|
+
}
|
|
51
|
+
default:
|
|
52
|
+
throw new Error(`Unsupported data type: ${dataType}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error(`Failed to convert Buffer (length ${buffer.length}) to ${dataType}: ${error}`, error);
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Applies scaling to numeric values
|
|
62
|
+
*
|
|
63
|
+
* @param value - The numeric value to scale
|
|
64
|
+
* @param scale - Optional scaling factor (divide by 10^scale)
|
|
65
|
+
* @returns Scaled value or original value if no scale provided
|
|
66
|
+
*/
|
|
67
|
+
applyScale(value, scale) {
|
|
68
|
+
if (scale !== undefined && scale > 0) {
|
|
69
|
+
return value / Math.pow(10, scale);
|
|
70
|
+
}
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Validates if a value is valid for the given data type
|
|
75
|
+
*
|
|
76
|
+
* @param value - The value to validate
|
|
77
|
+
* @param dataType - The expected data type
|
|
78
|
+
* @returns True if the value is valid, false otherwise
|
|
79
|
+
*/
|
|
80
|
+
isValidValue(value, dataType) {
|
|
81
|
+
if (value === null || value === undefined) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
switch (dataType) {
|
|
85
|
+
case 'string': {
|
|
86
|
+
// For strings, check if it's a valid string and not empty
|
|
87
|
+
return typeof value === 'string' && value.length > 0;
|
|
88
|
+
}
|
|
89
|
+
case 'uint16':
|
|
90
|
+
case 'int16':
|
|
91
|
+
case 'uint32':
|
|
92
|
+
case 'int32':
|
|
93
|
+
case 'float32': {
|
|
94
|
+
// For numeric types, check if it's a valid number and not a common NaN value
|
|
95
|
+
if (typeof value !== 'number' || isNaN(value)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
// Check for common NaN values used in Modbus devices
|
|
99
|
+
const nanValues = [0x8000, 0xFFFF, 0x80000000, 0xFFFFFFFF];
|
|
100
|
+
// For signed values, also check negative NaN indicators
|
|
101
|
+
if (dataType === 'int16' || dataType === 'int32') {
|
|
102
|
+
nanValues.push(-32768, -2147483648);
|
|
103
|
+
}
|
|
104
|
+
return !nanValues.includes(value);
|
|
105
|
+
}
|
|
106
|
+
default:
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Calculates the number of Modbus registers required for a given data type
|
|
112
|
+
*
|
|
113
|
+
* @param dataType - The data type to calculate register quantity for
|
|
114
|
+
* @returns Number of 16-bit registers required
|
|
115
|
+
*/
|
|
116
|
+
getRegisterQuantity(dataType) {
|
|
117
|
+
switch (dataType) {
|
|
118
|
+
case 'uint16':
|
|
119
|
+
case 'int16':
|
|
120
|
+
return 1;
|
|
121
|
+
case 'uint32':
|
|
122
|
+
case 'int32':
|
|
123
|
+
case 'float32':
|
|
124
|
+
return 2;
|
|
125
|
+
default:
|
|
126
|
+
throw new Error(`Unsupported data type: ${dataType}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.EnergyAppModbusDataTypeConverter = EnergyAppModbusDataTypeConverter;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { IDataTypeConverter, EnergyAppModbusDataType } from './interfaces.cjs';
|
|
2
|
+
/**
|
|
3
|
+
* Data Type Converter for Modbus Register Values
|
|
4
|
+
*
|
|
5
|
+
* @description Converts raw buffer data from Modbus registers into appropriate JavaScript types
|
|
6
|
+
*/
|
|
7
|
+
export declare class EnergyAppModbusDataTypeConverter implements IDataTypeConverter {
|
|
8
|
+
/**
|
|
9
|
+
* Converts raw buffer data from Modbus registers into appropriate JavaScript types
|
|
10
|
+
*
|
|
11
|
+
* @param buffer - Raw buffer data from Modbus registers
|
|
12
|
+
* @param dataType - The expected data type for conversion
|
|
13
|
+
* @param scale - Optional scaling factor for numeric types (divide by 10^scale)
|
|
14
|
+
* @param quantity - Required for string types, specifies the string length in characters
|
|
15
|
+
* @returns Converted value (number for numeric types, string for string type)
|
|
16
|
+
*/
|
|
17
|
+
convertFromBuffer(buffer: Buffer, dataType: EnergyAppModbusDataType, scale?: number, quantity?: number): any;
|
|
18
|
+
/**
|
|
19
|
+
* Applies scaling to numeric values
|
|
20
|
+
*
|
|
21
|
+
* @param value - The numeric value to scale
|
|
22
|
+
* @param scale - Optional scaling factor (divide by 10^scale)
|
|
23
|
+
* @returns Scaled value or original value if no scale provided
|
|
24
|
+
*/
|
|
25
|
+
private applyScale;
|
|
26
|
+
/**
|
|
27
|
+
* Validates if a value is valid for the given data type
|
|
28
|
+
*
|
|
29
|
+
* @param value - The value to validate
|
|
30
|
+
* @param dataType - The expected data type
|
|
31
|
+
* @returns True if the value is valid, false otherwise
|
|
32
|
+
*/
|
|
33
|
+
isValidValue(value: any, dataType: EnergyAppModbusDataType): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Calculates the number of Modbus registers required for a given data type
|
|
36
|
+
*
|
|
37
|
+
* @param dataType - The data type to calculate register quantity for
|
|
38
|
+
* @returns Number of 16-bit registers required
|
|
39
|
+
*/
|
|
40
|
+
getRegisterQuantity(dataType: EnergyAppModbusDataType): number;
|
|
41
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EnergyAppModbusFaultTolerantReader = void 0;
|
|
4
|
+
class EnergyAppModbusFaultTolerantReader {
|
|
5
|
+
_modbusInstance;
|
|
6
|
+
_connectionHealth;
|
|
7
|
+
constructor(modbusInstance, connectionHealth) {
|
|
8
|
+
this._modbusInstance = modbusInstance;
|
|
9
|
+
this._connectionHealth = connectionHealth;
|
|
10
|
+
}
|
|
11
|
+
async readHoldingRegisters(startAddress, quantity) {
|
|
12
|
+
try {
|
|
13
|
+
const result = await this._modbusInstance.readHoldingRegisters(startAddress, quantity);
|
|
14
|
+
this._connectionHealth.recordSuccess();
|
|
15
|
+
return {
|
|
16
|
+
success: true,
|
|
17
|
+
value: result
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const err = error;
|
|
22
|
+
this._connectionHealth.recordFailure(err);
|
|
23
|
+
console.warn(`Failed to read registers ${startAddress}-${startAddress + quantity - 1}: ${err.message} ` +
|
|
24
|
+
`(consecutive failures: ${this._connectionHealth.getConsecutiveFailures()})`);
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
error: err
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async readInputRegisters(startAddress, quantity) {
|
|
32
|
+
try {
|
|
33
|
+
// Note: This would need to be implemented in the SDK if input registers are needed
|
|
34
|
+
throw new Error('Input registers not supported by current SDK');
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const err = error;
|
|
38
|
+
this._connectionHealth.recordFailure(err);
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
error: err
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
isHealthy() {
|
|
46
|
+
return this._connectionHealth.isHealthy();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.EnergyAppModbusFaultTolerantReader = EnergyAppModbusFaultTolerantReader;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EnergyAppModbusInstance } from "../../packages/energy-app-modbus.cjs";
|
|
2
|
+
import type { IRegisterReader, IConnectionHealth, RegisterReadResult } from './interfaces.cjs';
|
|
3
|
+
export declare class EnergyAppModbusFaultTolerantReader implements IRegisterReader {
|
|
4
|
+
private readonly _modbusInstance;
|
|
5
|
+
private readonly _connectionHealth;
|
|
6
|
+
constructor(modbusInstance: EnergyAppModbusInstance, connectionHealth: IConnectionHealth);
|
|
7
|
+
readHoldingRegisters(startAddress: number, quantity: number): Promise<RegisterReadResult<Buffer>>;
|
|
8
|
+
readInputRegisters(startAddress: number, quantity: number): Promise<RegisterReadResult<Buffer>>;
|
|
9
|
+
isHealthy(): boolean;
|
|
10
|
+
}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EnergyAppModbusInverter = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const enyo_appliance_js_1 = require("../../types/enyo-appliance.cjs");
|
|
6
|
+
const enyo_appliance_js_2 = require("../../types/enyo-appliance.cjs");
|
|
7
|
+
const enyo_data_bus_value_js_1 = require("../../types/enyo-data-bus-value.cjs");
|
|
8
|
+
const enyo_source_enum_js_1 = require("../../types/enyo-source.enum.cjs");
|
|
9
|
+
const interfaces_js_1 = require("./interfaces.cjs");
|
|
10
|
+
const EnergyAppModbusRegisterMapper_js_1 = require("./EnergyAppModbusRegisterMapper.cjs");
|
|
11
|
+
const EnergyAppModbusConnectionHealth_js_1 = require("./EnergyAppModbusConnectionHealth.cjs");
|
|
12
|
+
const EnergyAppModbusFaultTolerantReader_js_1 = require("./EnergyAppModbusFaultTolerantReader.cjs");
|
|
13
|
+
class EnergyAppModbusInverter {
|
|
14
|
+
client;
|
|
15
|
+
config;
|
|
16
|
+
networkDevice;
|
|
17
|
+
_registerMapper;
|
|
18
|
+
_connectionHealth;
|
|
19
|
+
_modbusInstance;
|
|
20
|
+
_appliance;
|
|
21
|
+
_inverterMetadata;
|
|
22
|
+
constructor(client, config, networkDevice) {
|
|
23
|
+
this.client = client;
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.networkDevice = networkDevice;
|
|
26
|
+
this._registerMapper = new EnergyAppModbusRegisterMapper_js_1.EnergyAppModbusRegisterMapper();
|
|
27
|
+
this._connectionHealth = new EnergyAppModbusConnectionHealth_js_1.EnergyAppModbusConnectionHealth();
|
|
28
|
+
// Validate configuration
|
|
29
|
+
const validation = this._registerMapper.validateRegisterMap(config.registers);
|
|
30
|
+
if (!validation.valid) {
|
|
31
|
+
throw new interfaces_js_1.EnergyAppModbusConfigurationError(`Invalid inverter configuration: ${validation.errors.join(', ')}`);
|
|
32
|
+
}
|
|
33
|
+
this.client = client;
|
|
34
|
+
this.config = config;
|
|
35
|
+
this.networkDevice = networkDevice;
|
|
36
|
+
}
|
|
37
|
+
get appliance() {
|
|
38
|
+
if (!this._appliance) {
|
|
39
|
+
throw new Error('Appliance not initialized. Call connect() first.');
|
|
40
|
+
}
|
|
41
|
+
return this._appliance;
|
|
42
|
+
}
|
|
43
|
+
async connect() {
|
|
44
|
+
try {
|
|
45
|
+
console.log(`Connecting to inverter at ${this.networkDevice.hostname}...`);
|
|
46
|
+
// Create modbus connection
|
|
47
|
+
this._modbusInstance = await this.client.useModbus().connect({
|
|
48
|
+
host: this.networkDevice.hostname,
|
|
49
|
+
unitId: this.config.options?.unitId || 1,
|
|
50
|
+
port: this.config.options?.port || 502,
|
|
51
|
+
timeout: this.config.options?.timeout || 5000
|
|
52
|
+
});
|
|
53
|
+
// Discover inverter metadata during connection
|
|
54
|
+
this._inverterMetadata = await this._discoverInverterMetadata();
|
|
55
|
+
// Initialize appliance
|
|
56
|
+
await this._initializeAppliance();
|
|
57
|
+
console.log(`Successfully connected to inverter ${this.config.name[0]?.name} at ${this.networkDevice.hostname}`);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new interfaces_js_1.EnergyAppModbusConnectionError(`Failed to connect to inverter at ${this.networkDevice.hostname}: ${error.message}`, error);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async disconnect() {
|
|
64
|
+
if (this._modbusInstance) {
|
|
65
|
+
try {
|
|
66
|
+
await this._modbusInstance.disconnect();
|
|
67
|
+
console.log(`Disconnected from inverter at ${this.networkDevice.hostname}`);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.warn(`Error disconnecting from inverter: ${error.message}`);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
this._modbusInstance = undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
isConnected() {
|
|
78
|
+
return this._modbusInstance !== undefined && this._connectionHealth.isHealthy();
|
|
79
|
+
}
|
|
80
|
+
async updateData() {
|
|
81
|
+
if (!this._modbusInstance || !this._appliance) {
|
|
82
|
+
throw new Error('Inverter not connected. Call connect() first.');
|
|
83
|
+
}
|
|
84
|
+
const reader = new EnergyAppModbusFaultTolerantReader_js_1.EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
85
|
+
const registerData = await this._registerMapper.readMultipleRegisters(reader, this.config.registers);
|
|
86
|
+
// Extract known values with fallbacks
|
|
87
|
+
const pvPowerW = registerData.power || 0; // Required field, default to 0 if not available
|
|
88
|
+
const voltageL1 = registerData.voltageL1 || 0; // Required field, default to 0 if not available
|
|
89
|
+
const voltageL2 = registerData.voltageL2 || undefined;
|
|
90
|
+
const voltageL3 = registerData.voltageL3 || undefined;
|
|
91
|
+
// Read current inverter state if available
|
|
92
|
+
let inverterState;
|
|
93
|
+
try {
|
|
94
|
+
inverterState = await this.getInverterState() || undefined;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.warn(`Failed to read inverter state: ${error.message}`);
|
|
98
|
+
}
|
|
99
|
+
// Read active power limitation if available
|
|
100
|
+
let activePowerLimitationW;
|
|
101
|
+
try {
|
|
102
|
+
activePowerLimitationW = await this.getActivePowerLimitation() || undefined;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.warn(`Failed to read active power limitation: ${error.message}`);
|
|
106
|
+
}
|
|
107
|
+
// Read string data if available
|
|
108
|
+
const strings = [];
|
|
109
|
+
for (let stringIndex = 1; stringIndex <= 4; stringIndex++) {
|
|
110
|
+
let stringPower;
|
|
111
|
+
let stringVoltage;
|
|
112
|
+
let hasData = false;
|
|
113
|
+
// Try to read string power
|
|
114
|
+
try {
|
|
115
|
+
const power = await this.getStringPower(stringIndex);
|
|
116
|
+
if (power !== null) {
|
|
117
|
+
stringPower = power;
|
|
118
|
+
hasData = true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.warn(`Failed to read string${stringIndex} power: ${error.message}`);
|
|
123
|
+
}
|
|
124
|
+
// Try to read string voltage
|
|
125
|
+
try {
|
|
126
|
+
const voltage = await this.getStringVoltage(stringIndex);
|
|
127
|
+
if (voltage !== null) {
|
|
128
|
+
stringVoltage = voltage;
|
|
129
|
+
hasData = true;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.warn(`Failed to read string${stringIndex} voltage: ${error.message}`);
|
|
134
|
+
}
|
|
135
|
+
// Only add string to array if we have at least one value
|
|
136
|
+
if (hasData) {
|
|
137
|
+
strings.push({
|
|
138
|
+
index: stringIndex,
|
|
139
|
+
...(stringVoltage !== undefined && { voltage: stringVoltage }),
|
|
140
|
+
...(stringPower !== undefined && { powerW: stringPower })
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const message = {
|
|
145
|
+
type: 'message',
|
|
146
|
+
source: enyo_source_enum_js_1.EnyoSourceEnum.Device,
|
|
147
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
148
|
+
timestampIso: new Date().toISOString(),
|
|
149
|
+
message: enyo_data_bus_value_js_1.EnyoDataBusMessageEnum.InverterValuesUpdateV1,
|
|
150
|
+
applianceId: this._appliance.id,
|
|
151
|
+
data: {
|
|
152
|
+
state: inverterState,
|
|
153
|
+
pvPowerW,
|
|
154
|
+
voltageL1,
|
|
155
|
+
voltageL2,
|
|
156
|
+
voltageL3,
|
|
157
|
+
activePowerLimitationW,
|
|
158
|
+
...(strings.length > 0 && { strings })
|
|
159
|
+
},
|
|
160
|
+
resolution: '10s'
|
|
161
|
+
};
|
|
162
|
+
// Create logging info with string data if available
|
|
163
|
+
const stringInfo = strings.length > 0
|
|
164
|
+
? `, Strings=[${strings.map(s => `${s.index}:${s.powerW || 'N/A'}W/${s.voltage || 'N/A'}V`).join(',')}]`
|
|
165
|
+
: '';
|
|
166
|
+
console.log(`Inverter Data (${this.config.name[0]?.name}): State=${inverterState || 'N/A'}, Power=${pvPowerW}W, Voltage=${voltageL1}V, PowerLimit=${activePowerLimitationW || 'N/A'}W${stringInfo}`);
|
|
167
|
+
return [message];
|
|
168
|
+
}
|
|
169
|
+
// Convenience methods for accessing specific register values
|
|
170
|
+
async getSerialNumber() {
|
|
171
|
+
if (!this._modbusInstance || !this.config.registers.serialNumber) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const reader = new EnergyAppModbusFaultTolerantReader_js_1.EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
175
|
+
const result = await this._registerMapper.readRegister(reader, this.config.registers.serialNumber);
|
|
176
|
+
return result.success ? result.value : null;
|
|
177
|
+
}
|
|
178
|
+
async getCurrentPower() {
|
|
179
|
+
if (!this._modbusInstance || !this.config.registers.power) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
const reader = new EnergyAppModbusFaultTolerantReader_js_1.EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
183
|
+
const result = await this._registerMapper.readRegister(reader, this.config.registers.power);
|
|
184
|
+
return result.success ? result.value : null;
|
|
185
|
+
}
|
|
186
|
+
async getTotalEnergy() {
|
|
187
|
+
if (!this._modbusInstance || !this.config.registers.totalEnergy) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
const reader = new EnergyAppModbusFaultTolerantReader_js_1.EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
191
|
+
const result = await this._registerMapper.readRegister(reader, this.config.registers.totalEnergy);
|
|
192
|
+
return result.success ? result.value : null;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Reads the current inverter state from modbus registers.
|
|
196
|
+
* Maps the register value to EnyoInverterStateEnum using the configured value mapping.
|
|
197
|
+
*/
|
|
198
|
+
async getInverterState() {
|
|
199
|
+
if (!this._modbusInstance || !this.config.registers.state) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const reader = new EnergyAppModbusFaultTolerantReader_js_1.EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
204
|
+
const result = await this._registerMapper.readRegister(reader, this.config.registers.state);
|
|
205
|
+
if (!result.success || result.value === undefined) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
// Use configured value mapping if available
|
|
209
|
+
if (this.config.registers.state.valueMapping) {
|
|
210
|
+
const mapping = this.config.registers.state.valueMapping
|
|
211
|
+
.find(m => m.value === result.value);
|
|
212
|
+
if (mapping) {
|
|
213
|
+
return mapping.mappedState;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
console.warn(`No mapping found for inverter state value: ${result.value} (Address ${this.config.registers.state.address}, ${this.config.registers.state.dataType}). Available mappings: ${this.config.registers.state.valueMapping.map(m => m.value).join(', ')}`);
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
console.warn('Inverter state register configured without value mapping. Please configure valueMapping in register config.');
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
console.warn(`Failed to read inverter state: ${error.message}`);
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Reads the current active power limitation from modbus registers.
|
|
232
|
+
*/
|
|
233
|
+
async getActivePowerLimitation() {
|
|
234
|
+
if (!this._modbusInstance || !this.config.registers.activePowerLimitationW) {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
const reader = new EnergyAppModbusFaultTolerantReader_js_1.EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
238
|
+
const result = await this._registerMapper.readRegister(reader, this.config.registers.activePowerLimitationW);
|
|
239
|
+
return result.success ? result.value : null;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Reads the power value for a specific string from modbus registers.
|
|
243
|
+
*
|
|
244
|
+
* @param stringIndex - The string index (1-4)
|
|
245
|
+
* @returns Promise resolving to power value in Watts or null if not available
|
|
246
|
+
*/
|
|
247
|
+
async getStringPower(stringIndex) {
|
|
248
|
+
if (!this._modbusInstance || stringIndex < 1 || stringIndex > 4) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
const registerKey = `string${stringIndex}Power`;
|
|
252
|
+
const registerConfig = this.config.registers[registerKey];
|
|
253
|
+
if (!registerConfig) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
const reader = new EnergyAppModbusFaultTolerantReader_js_1.EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
257
|
+
const result = await this._registerMapper.readRegister(reader, registerConfig);
|
|
258
|
+
return result.success ? result.value : null;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Reads the voltage value for a specific string from modbus registers.
|
|
262
|
+
*
|
|
263
|
+
* @param stringIndex - The string index (1-4)
|
|
264
|
+
* @returns Promise resolving to voltage value in Volts or null if not available
|
|
265
|
+
*/
|
|
266
|
+
async getStringVoltage(stringIndex) {
|
|
267
|
+
if (!this._modbusInstance || stringIndex < 1 || stringIndex > 4) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
const registerKey = `string${stringIndex}Voltage`;
|
|
271
|
+
const registerConfig = this.config.registers[registerKey];
|
|
272
|
+
if (!registerConfig) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
const reader = new EnergyAppModbusFaultTolerantReader_js_1.EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
276
|
+
const result = await this._registerMapper.readRegister(reader, registerConfig);
|
|
277
|
+
return result.success ? result.value : null;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Discovers and caches inverter metadata from modbus registers during connection.
|
|
281
|
+
* This method reads static metadata like max PV production once
|
|
282
|
+
* and stores them for later use in appliance creation.
|
|
283
|
+
*/
|
|
284
|
+
async _discoverInverterMetadata() {
|
|
285
|
+
if (!this._modbusInstance) {
|
|
286
|
+
throw new Error('Modbus instance not available');
|
|
287
|
+
}
|
|
288
|
+
const reader = new EnergyAppModbusFaultTolerantReader_js_1.EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
289
|
+
const metadata = {};
|
|
290
|
+
try {
|
|
291
|
+
// Read max PV production if configured
|
|
292
|
+
if (this.config.registers.maxPvProductionW) {
|
|
293
|
+
const result = await this._registerMapper.readRegister(reader, this.config.registers.maxPvProductionW);
|
|
294
|
+
if (result.success && result.value !== undefined) {
|
|
295
|
+
metadata.maxPvProductionW = result.value;
|
|
296
|
+
console.log(`Discovered inverter max PV production: ${result.value} W`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
console.warn(`Warning: Failed to discover some inverter metadata: ${error.message}`);
|
|
302
|
+
}
|
|
303
|
+
return metadata;
|
|
304
|
+
}
|
|
305
|
+
async _initializeAppliance() {
|
|
306
|
+
const appliances = await this.client.useAppliances().list();
|
|
307
|
+
let existingAppliance = appliances.find(a => a.networkDeviceIds.includes(this.networkDevice.id) &&
|
|
308
|
+
a.type === enyo_appliance_js_2.EnyoApplianceTypeEnum.Inverter);
|
|
309
|
+
if (!existingAppliance) {
|
|
310
|
+
// Create new appliance
|
|
311
|
+
existingAppliance = {
|
|
312
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
313
|
+
type: enyo_appliance_js_2.EnyoApplianceTypeEnum.Inverter,
|
|
314
|
+
networkDeviceIds: [this.networkDevice.id],
|
|
315
|
+
name: this.config.name,
|
|
316
|
+
metadata: {
|
|
317
|
+
state: enyo_appliance_js_2.EnyoApplianceStateEnum.Connected,
|
|
318
|
+
connectionType: enyo_appliance_js_1.EnyoApplianceConnectionType.Connector,
|
|
319
|
+
...this.config.options?.topology && { topology: this.config.options.topology }
|
|
320
|
+
},
|
|
321
|
+
inverter: this._inverterMetadata
|
|
322
|
+
};
|
|
323
|
+
await this.client.useAppliances().save(existingAppliance, undefined);
|
|
324
|
+
console.log(`Created new inverter appliance: ${this.config.name[0]?.name}`);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
// Update existing appliance
|
|
328
|
+
existingAppliance = {
|
|
329
|
+
...existingAppliance,
|
|
330
|
+
name: this.config.name,
|
|
331
|
+
metadata: {
|
|
332
|
+
...existingAppliance.metadata,
|
|
333
|
+
connectionType: enyo_appliance_js_1.EnyoApplianceConnectionType.Connector,
|
|
334
|
+
state: enyo_appliance_js_2.EnyoApplianceStateEnum.Connected,
|
|
335
|
+
...this.config.options?.topology && { topology: this.config.options.topology }
|
|
336
|
+
},
|
|
337
|
+
inverter: this._inverterMetadata
|
|
338
|
+
};
|
|
339
|
+
await this.client.useAppliances().save(existingAppliance, existingAppliance?.id);
|
|
340
|
+
console.log(`Updated existing inverter appliance: ${this.config.name[0]?.name}`);
|
|
341
|
+
}
|
|
342
|
+
this._appliance = existingAppliance;
|
|
343
|
+
}
|
|
344
|
+
modbusClient() {
|
|
345
|
+
return this._modbusInstance;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
exports.EnergyAppModbusInverter = EnergyAppModbusInverter;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { EnergyAppModbusInstance } from "../../packages/energy-app-modbus.cjs";
|
|
2
|
+
import { EnyoAppliance } from "../../types/enyo-appliance.cjs";
|
|
3
|
+
import type { EnyoNetworkDevice } from "../../types/enyo-network-device.cjs";
|
|
4
|
+
import { EnyoDataBusMessage, EnyoInverterStateEnum } from "../../types/enyo-data-bus-value.cjs";
|
|
5
|
+
import { type EnergyAppModbusDevice, type EnergyAppModbusInverterConfig } from './interfaces.cjs';
|
|
6
|
+
import { EnergyApp } from "../../index.cjs";
|
|
7
|
+
export declare class EnergyAppModbusInverter implements EnergyAppModbusDevice {
|
|
8
|
+
readonly client: EnergyApp;
|
|
9
|
+
readonly config: EnergyAppModbusInverterConfig;
|
|
10
|
+
readonly networkDevice: EnyoNetworkDevice;
|
|
11
|
+
private readonly _registerMapper;
|
|
12
|
+
private readonly _connectionHealth;
|
|
13
|
+
private _modbusInstance?;
|
|
14
|
+
private _appliance?;
|
|
15
|
+
private _inverterMetadata?;
|
|
16
|
+
constructor(client: EnergyApp, config: EnergyAppModbusInverterConfig, networkDevice: EnyoNetworkDevice);
|
|
17
|
+
get appliance(): EnyoAppliance;
|
|
18
|
+
connect(): Promise<void>;
|
|
19
|
+
disconnect(): Promise<void>;
|
|
20
|
+
isConnected(): boolean;
|
|
21
|
+
updateData(): Promise<EnyoDataBusMessage[]>;
|
|
22
|
+
getSerialNumber(): Promise<string | null>;
|
|
23
|
+
getCurrentPower(): Promise<number | null>;
|
|
24
|
+
getTotalEnergy(): Promise<number | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Reads the current inverter state from modbus registers.
|
|
27
|
+
* Maps the register value to EnyoInverterStateEnum using the configured value mapping.
|
|
28
|
+
*/
|
|
29
|
+
getInverterState(): Promise<EnyoInverterStateEnum | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Reads the current active power limitation from modbus registers.
|
|
32
|
+
*/
|
|
33
|
+
getActivePowerLimitation(): Promise<number | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Reads the power value for a specific string from modbus registers.
|
|
36
|
+
*
|
|
37
|
+
* @param stringIndex - The string index (1-4)
|
|
38
|
+
* @returns Promise resolving to power value in Watts or null if not available
|
|
39
|
+
*/
|
|
40
|
+
getStringPower(stringIndex: number): Promise<number | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Reads the voltage value for a specific string from modbus registers.
|
|
43
|
+
*
|
|
44
|
+
* @param stringIndex - The string index (1-4)
|
|
45
|
+
* @returns Promise resolving to voltage value in Volts or null if not available
|
|
46
|
+
*/
|
|
47
|
+
getStringVoltage(stringIndex: number): Promise<number | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Discovers and caches inverter metadata from modbus registers during connection.
|
|
50
|
+
* This method reads static metadata like max PV production once
|
|
51
|
+
* and stores them for later use in appliance creation.
|
|
52
|
+
*/
|
|
53
|
+
private _discoverInverterMetadata;
|
|
54
|
+
private _initializeAppliance;
|
|
55
|
+
modbusClient(): EnergyAppModbusInstance | undefined;
|
|
56
|
+
}
|