@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,195 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { EnyoApplianceConnectionType, EnyoApplianceStateEnum, EnyoApplianceTopologyFeatureEnum, EnyoApplianceTypeEnum } from "../../types/enyo-appliance.js";
|
|
3
|
+
import { EnyoDataBusMessageEnum } from "../../types/enyo-data-bus-value.js";
|
|
4
|
+
import { EnyoSourceEnum } from "../../types/enyo-source.enum.js";
|
|
5
|
+
import { EnergyAppModbusConfigurationError, EnergyAppModbusConnectionError } from './interfaces.js';
|
|
6
|
+
import { EnergyAppModbusRegisterMapper } from './EnergyAppModbusRegisterMapper.js';
|
|
7
|
+
import { EnergyAppModbusConnectionHealth } from './EnergyAppModbusConnectionHealth.js';
|
|
8
|
+
import { EnergyAppModbusFaultTolerantReader } from './EnergyAppModbusFaultTolerantReader.js';
|
|
9
|
+
import { EnyoMeterApplianceAvailableFeaturesEnum, } from "../../types/enyo-meter-appliance.js";
|
|
10
|
+
export class EnergyAppModbusMeter {
|
|
11
|
+
client;
|
|
12
|
+
config;
|
|
13
|
+
networkDevice;
|
|
14
|
+
_registerMapper;
|
|
15
|
+
_connectionHealth;
|
|
16
|
+
_modbusInstance;
|
|
17
|
+
_appliance;
|
|
18
|
+
constructor(client, config, networkDevice) {
|
|
19
|
+
this.client = client;
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.networkDevice = networkDevice;
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.client = client;
|
|
24
|
+
this.networkDevice = networkDevice;
|
|
25
|
+
this._registerMapper = new EnergyAppModbusRegisterMapper();
|
|
26
|
+
this._connectionHealth = new EnergyAppModbusConnectionHealth();
|
|
27
|
+
// Validate configuration
|
|
28
|
+
const validation = this._registerMapper.validateRegisterMap(config.registers);
|
|
29
|
+
if (!validation.valid) {
|
|
30
|
+
throw new EnergyAppModbusConfigurationError(`Invalid meter configuration: ${validation.errors.join(', ')}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
get appliance() {
|
|
34
|
+
if (!this._appliance) {
|
|
35
|
+
throw new Error('Meter appliance not initialized. Call connect() first.');
|
|
36
|
+
}
|
|
37
|
+
return this._appliance;
|
|
38
|
+
}
|
|
39
|
+
async connect() {
|
|
40
|
+
try {
|
|
41
|
+
console.log(`Connecting to meter at ${this.networkDevice.hostname}...`);
|
|
42
|
+
// Create modbus connection
|
|
43
|
+
this._modbusInstance = await this.client.useModbus().connect({
|
|
44
|
+
host: this.networkDevice.hostname,
|
|
45
|
+
unitId: this.config.options?.unitId || 1,
|
|
46
|
+
port: this.config.options?.port || 502,
|
|
47
|
+
timeout: this.config.options?.timeout || 5000
|
|
48
|
+
});
|
|
49
|
+
// Initialize appliance
|
|
50
|
+
await this._initializeAppliance();
|
|
51
|
+
console.log(`Successfully connected to meter ${this.config.name[0]?.name} at ${this.networkDevice.hostname}`);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new EnergyAppModbusConnectionError(`Failed to connect to meter at ${this.networkDevice.hostname}: ${error.message}`, error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async disconnect() {
|
|
58
|
+
if (this._modbusInstance) {
|
|
59
|
+
try {
|
|
60
|
+
await this._modbusInstance.disconnect();
|
|
61
|
+
console.log(`Disconnected from meter at ${this.networkDevice.hostname}`);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.warn(`Error disconnecting from meter: ${error.message}`);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
this._modbusInstance = undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
isConnected() {
|
|
72
|
+
return this._modbusInstance !== undefined && this._connectionHealth.isHealthy();
|
|
73
|
+
}
|
|
74
|
+
async updateData() {
|
|
75
|
+
if (!this._modbusInstance || !this._appliance) {
|
|
76
|
+
throw new Error('Meter not connected. Call connect() first.');
|
|
77
|
+
}
|
|
78
|
+
const reader = new EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
79
|
+
const registerData = await this._registerMapper.readMultipleRegisters(reader, this.config.registers);
|
|
80
|
+
// Extract meter data with fallbacks
|
|
81
|
+
const gridFeedInPowerW = registerData.gridFeedInPower || 0;
|
|
82
|
+
const gridConsumptionPowerW = registerData.gridConsumptionPower || 0;
|
|
83
|
+
const gridFeedInWh = registerData.gridFeedInEnergy || 0;
|
|
84
|
+
const gridConsumptionWh = registerData.gridConsumptionEnergy || 0;
|
|
85
|
+
// Calculate net grid power (positive = consumption, negative = feed-in)
|
|
86
|
+
const gridPowerW = this.config.registers.gridPower !== undefined ? registerData.gridPower : (gridConsumptionPowerW - gridFeedInPowerW);
|
|
87
|
+
const message = {
|
|
88
|
+
type: 'message',
|
|
89
|
+
source: EnyoSourceEnum.Device,
|
|
90
|
+
id: randomUUID(),
|
|
91
|
+
timestampIso: new Date().toISOString(),
|
|
92
|
+
message: EnyoDataBusMessageEnum.MeterValuesUpdateV1,
|
|
93
|
+
applianceId: this._appliance.id,
|
|
94
|
+
data: {
|
|
95
|
+
gridPowerW,
|
|
96
|
+
gridFeedInWh,
|
|
97
|
+
gridConsumptionWh
|
|
98
|
+
},
|
|
99
|
+
resolution: '10s'
|
|
100
|
+
};
|
|
101
|
+
console.log(`Meter Data (${this.config.name[0]?.name}): Grid Power=${gridPowerW}W (Feed-in=${gridFeedInPowerW}W, Consumption=${gridConsumptionPowerW}W), Feed-in Energy=${gridFeedInWh}Wh, Consumption Energy=${gridConsumptionWh}Wh`);
|
|
102
|
+
return [message];
|
|
103
|
+
}
|
|
104
|
+
// Convenience methods for accessing specific register values
|
|
105
|
+
async getGridPower() {
|
|
106
|
+
if (!this._modbusInstance) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const reader = new EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
110
|
+
// Try direct grid power register first
|
|
111
|
+
if (this.config.registers.gridPower) {
|
|
112
|
+
const result = await this._registerMapper.readRegister(reader, this.config.registers.gridPower);
|
|
113
|
+
if (result.success) {
|
|
114
|
+
return result.value;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Calculate from feed-in and consumption
|
|
118
|
+
if (this.config.registers.gridFeedInPower && this.config.registers.gridConsumptionPower) {
|
|
119
|
+
const feedInResult = await this._registerMapper.readRegister(reader, this.config.registers.gridFeedInPower);
|
|
120
|
+
const consumptionResult = await this._registerMapper.readRegister(reader, this.config.registers.gridConsumptionPower);
|
|
121
|
+
if (feedInResult.success && consumptionResult.success) {
|
|
122
|
+
return consumptionResult.value - feedInResult.value;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
async getGridFeedInEnergy() {
|
|
128
|
+
if (!this._modbusInstance || !this.config.registers.gridFeedInEnergy) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const reader = new EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
132
|
+
const result = await this._registerMapper.readRegister(reader, this.config.registers.gridFeedInEnergy);
|
|
133
|
+
return result.success ? result.value : null;
|
|
134
|
+
}
|
|
135
|
+
async getGridConsumptionEnergy() {
|
|
136
|
+
if (!this._modbusInstance || !this.config.registers.gridConsumptionEnergy) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const reader = new EnergyAppModbusFaultTolerantReader(this._modbusInstance, this._connectionHealth);
|
|
140
|
+
const result = await this._registerMapper.readRegister(reader, this.config.registers.gridConsumptionEnergy);
|
|
141
|
+
return result.success ? result.value : null;
|
|
142
|
+
}
|
|
143
|
+
async _initializeAppliance() {
|
|
144
|
+
const appliances = await this.client.useAppliances().list();
|
|
145
|
+
let existingAppliance = appliances.find(a => a.networkDeviceIds.includes(this.networkDevice.id) &&
|
|
146
|
+
a.type === EnyoApplianceTypeEnum.Meter);
|
|
147
|
+
if (!existingAppliance) {
|
|
148
|
+
// Create new appliance
|
|
149
|
+
existingAppliance = {
|
|
150
|
+
id: randomUUID(),
|
|
151
|
+
type: EnyoApplianceTypeEnum.Meter,
|
|
152
|
+
networkDeviceIds: [this.networkDevice.id],
|
|
153
|
+
name: this.config.name,
|
|
154
|
+
metadata: {
|
|
155
|
+
state: EnyoApplianceStateEnum.Connected,
|
|
156
|
+
connectionType: EnyoApplianceConnectionType.Connector,
|
|
157
|
+
...this.config.options?.topology && { topology: this.config.options.topology }
|
|
158
|
+
},
|
|
159
|
+
topology: {
|
|
160
|
+
features: [EnyoApplianceTopologyFeatureEnum.IntermediateOfPrimaryMeter]
|
|
161
|
+
},
|
|
162
|
+
meter: {
|
|
163
|
+
availableFeatures: [EnyoMeterApplianceAvailableFeaturesEnum.LivePowerConsumption, EnyoMeterApplianceAvailableFeaturesEnum.MeterValues]
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
await this.client.useAppliances().save(existingAppliance, undefined);
|
|
167
|
+
console.log(`Created new meter appliance: ${this.config.name[0]?.name}`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// Update existing appliance
|
|
171
|
+
existingAppliance = {
|
|
172
|
+
...existingAppliance,
|
|
173
|
+
name: this.config.name,
|
|
174
|
+
metadata: {
|
|
175
|
+
...existingAppliance.metadata,
|
|
176
|
+
connectionType: EnyoApplianceConnectionType.Connector,
|
|
177
|
+
state: EnyoApplianceStateEnum.Connected,
|
|
178
|
+
...this.config.options?.topology && { topology: this.config.options.topology }
|
|
179
|
+
},
|
|
180
|
+
topology: {
|
|
181
|
+
features: [EnyoApplianceTopologyFeatureEnum.IntermediateOfPrimaryMeter]
|
|
182
|
+
},
|
|
183
|
+
meter: {
|
|
184
|
+
availableFeatures: [EnyoMeterApplianceAvailableFeaturesEnum.LivePowerConsumption, EnyoMeterApplianceAvailableFeaturesEnum.MeterValues]
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
await this.client.useAppliances().save(existingAppliance, existingAppliance?.id);
|
|
188
|
+
console.log(`Updated existing meter appliance: ${this.config.name[0]?.name}`);
|
|
189
|
+
}
|
|
190
|
+
this._appliance = existingAppliance;
|
|
191
|
+
}
|
|
192
|
+
modbusClient() {
|
|
193
|
+
return this._modbusInstance;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type IRegisterMapper, type IRegisterReader, type IDataTypeConverter, type EnergyAppModbusRegisterConfig, type EnergyAppRegisterMap, type RegisterReadResult } from './interfaces.js';
|
|
2
|
+
export declare class EnergyAppModbusRegisterMapper implements IRegisterMapper {
|
|
3
|
+
private readonly dataTypeConverter;
|
|
4
|
+
constructor(dataTypeConverter?: IDataTypeConverter);
|
|
5
|
+
readRegister<T>(reader: IRegisterReader, config: EnergyAppModbusRegisterConfig): Promise<RegisterReadResult<T>>;
|
|
6
|
+
readMultipleRegisters(reader: IRegisterReader, registerMap: EnergyAppRegisterMap): Promise<{
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
}>;
|
|
9
|
+
validateRegisterMap(registerMap: EnergyAppRegisterMap): {
|
|
10
|
+
valid: boolean;
|
|
11
|
+
errors: string[];
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { EnergyAppModbusReadError } from './interfaces.js';
|
|
2
|
+
import { EnergyAppModbusDataTypeConverter } from './EnergyAppModbusDataTypeConverter.js';
|
|
3
|
+
export class EnergyAppModbusRegisterMapper {
|
|
4
|
+
dataTypeConverter;
|
|
5
|
+
constructor(dataTypeConverter) {
|
|
6
|
+
this.dataTypeConverter = dataTypeConverter || new EnergyAppModbusDataTypeConverter();
|
|
7
|
+
}
|
|
8
|
+
async readRegister(reader, config) {
|
|
9
|
+
try {
|
|
10
|
+
// Calculate quantity if not provided
|
|
11
|
+
const quantity = config.quantity || this.dataTypeConverter.getRegisterQuantity(config.dataType);
|
|
12
|
+
const result = await reader.readHoldingRegisters(config.address, quantity);
|
|
13
|
+
if (!result.success || !result.value) {
|
|
14
|
+
return {
|
|
15
|
+
success: false,
|
|
16
|
+
error: new EnergyAppModbusReadError(`Failed to read register ${config.address}: ${result.error?.message || 'Unknown error'}`, config.address)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const convertedValue = this.dataTypeConverter.convertFromBuffer(result.value, config.dataType, config.scale, config.quantity);
|
|
20
|
+
// Validate the converted value
|
|
21
|
+
if (!this.dataTypeConverter.isValidValue(convertedValue, config.dataType)) {
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
error: new EnergyAppModbusReadError(`Invalid value 0x${convertedValue.toString(16)} for register ${config.address}`, config.address)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
success: true,
|
|
29
|
+
value: convertedValue
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error: new EnergyAppModbusReadError(`Error reading register ${config.address}: ${error.message}`, config.address)
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async readMultipleRegisters(reader, registerMap) {
|
|
40
|
+
const results = {};
|
|
41
|
+
const failures = [];
|
|
42
|
+
// Read all registers
|
|
43
|
+
for (const [name, config] of Object.entries(registerMap)) {
|
|
44
|
+
if (!config) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const result = await this.readRegister(reader, config);
|
|
48
|
+
if (result.success) {
|
|
49
|
+
results[name] = result.value;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Check if this register was required
|
|
53
|
+
if (config.required) {
|
|
54
|
+
failures.push(`${name} (${config.address})`);
|
|
55
|
+
}
|
|
56
|
+
console.warn(`Failed to read register ${name} (${config.address}): ${result.error?.message}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// If any required registers failed, log warning
|
|
60
|
+
if (failures.length > 0) {
|
|
61
|
+
console.warn(`Failed to read required registers: ${failures.join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
validateRegisterMap(registerMap) {
|
|
66
|
+
const errors = [];
|
|
67
|
+
for (const [name, config] of Object.entries(registerMap)) {
|
|
68
|
+
if (!config) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Validate address
|
|
72
|
+
if (!Number.isInteger(config.address) || config.address < 1) {
|
|
73
|
+
errors.push(`Invalid address for register '${name}': ${config.address}`);
|
|
74
|
+
}
|
|
75
|
+
// Validate data type
|
|
76
|
+
const validDataTypes = ['uint16', 'int16', 'uint32', 'int32', 'float32', 'string'];
|
|
77
|
+
if (!validDataTypes.includes(config.dataType)) {
|
|
78
|
+
errors.push(`Invalid data type for register '${name}': ${config.dataType}`);
|
|
79
|
+
}
|
|
80
|
+
// Validate scale
|
|
81
|
+
if (config.scale !== undefined && (!Number.isInteger(config.scale) || config.scale < 0)) {
|
|
82
|
+
errors.push(`Invalid scale for register '${name}': ${config.scale}`);
|
|
83
|
+
}
|
|
84
|
+
// Validate quantity
|
|
85
|
+
if (config.quantity !== undefined && (!Number.isInteger(config.quantity) || config.quantity < 1)) {
|
|
86
|
+
errors.push(`Invalid quantity for register '${name}': ${config.quantity}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
valid: errors.length === 0,
|
|
91
|
+
errors
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import type { EnergyApp } from "../../index.js";
|
|
2
|
+
import type { EnyoNetworkDevice } from "../../types/enyo-network-device.js";
|
|
3
|
+
import type { EnyoAppliance, EnyoApplianceName, EnyoApplianceTopology } from "../../types/enyo-appliance.js";
|
|
4
|
+
import { EnyoBatteryStateEnum, EnyoDataBusMessage, EnyoInverterStateEnum } from "../../types/enyo-data-bus-value.js";
|
|
5
|
+
import { EnergyAppModbusInstance } from "../../packages/energy-app-modbus.js";
|
|
6
|
+
/**
|
|
7
|
+
* Data Types for Modbus Register Configuration
|
|
8
|
+
*
|
|
9
|
+
* @description Supported data types for reading Modbus registers
|
|
10
|
+
* - Numeric types: uint16, int16, uint32, int32, float32
|
|
11
|
+
* - String type: string (requires length property in register config)
|
|
12
|
+
*/
|
|
13
|
+
export type EnergyAppModbusDataType = 'uint16' | 'int16' | 'uint32' | 'int32' | 'float32' | 'string';
|
|
14
|
+
export interface EnergyAppBatteryStateValueMapping {
|
|
15
|
+
value: number;
|
|
16
|
+
mappedState: EnyoBatteryStateEnum;
|
|
17
|
+
}
|
|
18
|
+
export interface EnergyAppInverterStateValueMapping {
|
|
19
|
+
value: number;
|
|
20
|
+
mappedState: EnyoInverterStateEnum;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Register Configuration Interface
|
|
24
|
+
*
|
|
25
|
+
* @description Configuration for reading a Modbus register
|
|
26
|
+
*/
|
|
27
|
+
export interface EnergyAppModbusRegisterConfig {
|
|
28
|
+
/** Modbus register address */
|
|
29
|
+
address: number;
|
|
30
|
+
/** Data type of the register value */
|
|
31
|
+
dataType: EnergyAppModbusDataType;
|
|
32
|
+
/** For FIX2, FIX3 scaling (divide by 10^scale) - only applies to numeric types */
|
|
33
|
+
scale?: number;
|
|
34
|
+
/** Number of registers to read (auto-calculated from dataType if not provided) */
|
|
35
|
+
quantity?: number;
|
|
36
|
+
/** Whether this register is required for device operation */
|
|
37
|
+
required?: boolean;
|
|
38
|
+
/** For mapping numeric values to enum states (only applies to numeric types) */
|
|
39
|
+
valueMapping?: EnergyAppBatteryStateValueMapping[] | EnergyAppInverterStateValueMapping[];
|
|
40
|
+
}
|
|
41
|
+
export interface EnergyAppRegisterMap {
|
|
42
|
+
[key: string]: EnergyAppModbusRegisterConfig | undefined;
|
|
43
|
+
}
|
|
44
|
+
export interface EnergyAppModbusConnectionOptions {
|
|
45
|
+
unitId?: number;
|
|
46
|
+
port?: number;
|
|
47
|
+
timeout?: number;
|
|
48
|
+
retryAttempts?: number;
|
|
49
|
+
retryDelayMs?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface EnergyAppModbusDeviceConfig {
|
|
52
|
+
name: EnyoApplianceName[];
|
|
53
|
+
registers: EnergyAppRegisterMap;
|
|
54
|
+
options?: EnergyAppModbusConnectionOptions & {
|
|
55
|
+
topology?: EnyoApplianceTopology;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export interface EnergyAppModbusInverterConfig extends EnergyAppModbusDeviceConfig {
|
|
59
|
+
registers: {
|
|
60
|
+
serialNumber?: EnergyAppModbusRegisterConfig;
|
|
61
|
+
power?: EnergyAppModbusRegisterConfig;
|
|
62
|
+
voltageL1?: EnergyAppModbusRegisterConfig;
|
|
63
|
+
voltageL2?: EnergyAppModbusRegisterConfig;
|
|
64
|
+
voltageL3?: EnergyAppModbusRegisterConfig;
|
|
65
|
+
maxPvProductionW?: EnergyAppModbusRegisterConfig;
|
|
66
|
+
state?: EnergyAppModbusRegisterConfig;
|
|
67
|
+
activePowerLimitationW?: EnergyAppModbusRegisterConfig;
|
|
68
|
+
string1Power?: EnergyAppModbusRegisterConfig;
|
|
69
|
+
string1Voltage?: EnergyAppModbusRegisterConfig;
|
|
70
|
+
string2Power?: EnergyAppModbusRegisterConfig;
|
|
71
|
+
string2Voltage?: EnergyAppModbusRegisterConfig;
|
|
72
|
+
string3Power?: EnergyAppModbusRegisterConfig;
|
|
73
|
+
string3Voltage?: EnergyAppModbusRegisterConfig;
|
|
74
|
+
string4Power?: EnergyAppModbusRegisterConfig;
|
|
75
|
+
string4Voltage?: EnergyAppModbusRegisterConfig;
|
|
76
|
+
[key: string]: EnergyAppModbusRegisterConfig | undefined;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export interface EnergyAppModbusBatteryConfig extends EnergyAppModbusDeviceConfig {
|
|
80
|
+
inverter?: IEnergyAppModbusInverter;
|
|
81
|
+
registers: {
|
|
82
|
+
current?: EnergyAppModbusRegisterConfig;
|
|
83
|
+
voltage?: EnergyAppModbusRegisterConfig;
|
|
84
|
+
soc?: EnergyAppModbusRegisterConfig;
|
|
85
|
+
power?: EnergyAppModbusRegisterConfig;
|
|
86
|
+
temperature?: EnergyAppModbusRegisterConfig;
|
|
87
|
+
state?: EnergyAppModbusRegisterConfig;
|
|
88
|
+
maxCapacityWh?: EnergyAppModbusRegisterConfig;
|
|
89
|
+
maxDischargePowerW?: EnergyAppModbusRegisterConfig;
|
|
90
|
+
maxChargingPowerW?: EnergyAppModbusRegisterConfig;
|
|
91
|
+
drainPercentage?: EnergyAppModbusRegisterConfig;
|
|
92
|
+
loadPercentage?: EnergyAppModbusRegisterConfig;
|
|
93
|
+
[key: string]: EnergyAppModbusRegisterConfig | undefined;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export interface EnergyAppModbusMeterConfig extends EnergyAppModbusDeviceConfig {
|
|
97
|
+
registers: {
|
|
98
|
+
gridPower?: EnergyAppModbusRegisterConfig;
|
|
99
|
+
gridFeedInPower?: EnergyAppModbusRegisterConfig;
|
|
100
|
+
gridConsumptionPower?: EnergyAppModbusRegisterConfig;
|
|
101
|
+
gridFeedInEnergy?: EnergyAppModbusRegisterConfig;
|
|
102
|
+
gridConsumptionEnergy?: EnergyAppModbusRegisterConfig;
|
|
103
|
+
[key: string]: EnergyAppModbusRegisterConfig | undefined;
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export interface RegisterReadResult<T = any> {
|
|
107
|
+
success: boolean;
|
|
108
|
+
value?: T;
|
|
109
|
+
error?: Error;
|
|
110
|
+
}
|
|
111
|
+
export interface IRegisterReader {
|
|
112
|
+
readHoldingRegisters(startAddress: number, quantity: number): Promise<RegisterReadResult<Buffer>>;
|
|
113
|
+
readInputRegisters?(startAddress: number, quantity: number): Promise<RegisterReadResult<Buffer>>;
|
|
114
|
+
isHealthy(): boolean;
|
|
115
|
+
}
|
|
116
|
+
export interface IRegisterMapper {
|
|
117
|
+
readRegister<T>(reader: IRegisterReader, config: EnergyAppModbusRegisterConfig): Promise<RegisterReadResult<T>>;
|
|
118
|
+
readMultipleRegisters(reader: IRegisterReader, registerMap: EnergyAppRegisterMap): Promise<{
|
|
119
|
+
[key: string]: any;
|
|
120
|
+
}>;
|
|
121
|
+
validateRegisterMap(registerMap: EnergyAppRegisterMap): {
|
|
122
|
+
valid: boolean;
|
|
123
|
+
errors: string[];
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Data Type Converter Interface
|
|
128
|
+
*
|
|
129
|
+
* @description Interface for converting raw Modbus buffer data into appropriate JavaScript types
|
|
130
|
+
*/
|
|
131
|
+
export interface IDataTypeConverter {
|
|
132
|
+
/**
|
|
133
|
+
* Converts raw buffer data from Modbus registers into appropriate JavaScript types
|
|
134
|
+
*
|
|
135
|
+
* @param buffer - Raw buffer data from Modbus registers
|
|
136
|
+
* @param dataType - The expected data type for conversion
|
|
137
|
+
* @param scale - Optional scaling factor for numeric types (divide by 10^scale)
|
|
138
|
+
* @param quantity - Required for string types, specifies the string length in characters
|
|
139
|
+
*/
|
|
140
|
+
convertFromBuffer(buffer: Buffer, dataType: EnergyAppModbusDataType, scale?: number, quantity?: number): any;
|
|
141
|
+
/**
|
|
142
|
+
* Validates if a value is valid for the given data type
|
|
143
|
+
*
|
|
144
|
+
* @param value - The value to validate
|
|
145
|
+
* @param dataType - The expected data type
|
|
146
|
+
*/
|
|
147
|
+
isValidValue(value: any, dataType: EnergyAppModbusDataType): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Calculates the number of Modbus registers required for a given data type
|
|
150
|
+
*
|
|
151
|
+
* @param dataType - The data type to calculate register quantity for
|
|
152
|
+
*/
|
|
153
|
+
getRegisterQuantity(dataType: EnergyAppModbusDataType): number;
|
|
154
|
+
}
|
|
155
|
+
export interface IConnectionHealth {
|
|
156
|
+
recordSuccess(): void;
|
|
157
|
+
recordFailure(error: Error): void;
|
|
158
|
+
isHealthy(): boolean;
|
|
159
|
+
getConsecutiveFailures(): number;
|
|
160
|
+
getLastError(): Error | undefined;
|
|
161
|
+
}
|
|
162
|
+
export interface EnergyAppModbusDevice {
|
|
163
|
+
readonly client: EnergyApp;
|
|
164
|
+
readonly config: EnergyAppModbusDeviceConfig;
|
|
165
|
+
readonly appliance: EnyoAppliance;
|
|
166
|
+
readonly networkDevice: EnyoNetworkDevice;
|
|
167
|
+
connect(): Promise<void>;
|
|
168
|
+
disconnect(): Promise<void>;
|
|
169
|
+
isConnected(): boolean;
|
|
170
|
+
updateData(): Promise<EnyoDataBusMessage[]>;
|
|
171
|
+
modbusClient(): EnergyAppModbusInstance | undefined;
|
|
172
|
+
}
|
|
173
|
+
export interface IEnergyAppModbusInverter extends EnergyAppModbusDevice {
|
|
174
|
+
readonly config: EnergyAppModbusInverterConfig;
|
|
175
|
+
getSerialNumber(): Promise<string | null>;
|
|
176
|
+
getCurrentPower(): Promise<number | null>;
|
|
177
|
+
getTotalEnergy(): Promise<number | null>;
|
|
178
|
+
}
|
|
179
|
+
export interface IEnergyAppModbusBattery extends EnergyAppModbusDevice {
|
|
180
|
+
readonly config: EnergyAppModbusBatteryConfig;
|
|
181
|
+
readonly inverter?: IEnergyAppModbusInverter;
|
|
182
|
+
getSoc(): Promise<number | null>;
|
|
183
|
+
getCurrent(): Promise<number | null>;
|
|
184
|
+
getPower(): Promise<number | null>;
|
|
185
|
+
}
|
|
186
|
+
export interface IEnergyAppModbusMeter extends EnergyAppModbusDevice {
|
|
187
|
+
readonly config: EnergyAppModbusMeterConfig;
|
|
188
|
+
getGridPower(): Promise<number | null>;
|
|
189
|
+
getGridFeedInEnergy(): Promise<number | null>;
|
|
190
|
+
getGridConsumptionEnergy(): Promise<number | null>;
|
|
191
|
+
}
|
|
192
|
+
export declare class EnergyAppModbusConfigurationError extends Error {
|
|
193
|
+
constructor(message: string);
|
|
194
|
+
}
|
|
195
|
+
export declare class EnergyAppModbusConnectionError extends Error {
|
|
196
|
+
readonly cause?: Error | undefined;
|
|
197
|
+
constructor(message: string, cause?: Error | undefined);
|
|
198
|
+
}
|
|
199
|
+
export declare class EnergyAppModbusReadError extends Error {
|
|
200
|
+
readonly register?: number | undefined;
|
|
201
|
+
constructor(message: string, register?: number | undefined);
|
|
202
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Error types
|
|
2
|
+
export class EnergyAppModbusConfigurationError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(`Modbus Configuration Error: ${message}`);
|
|
5
|
+
this.name = 'ModbusConfigurationError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class EnergyAppModbusConnectionError extends Error {
|
|
9
|
+
cause;
|
|
10
|
+
constructor(message, cause) {
|
|
11
|
+
super(`Modbus Connection Error: ${message}`);
|
|
12
|
+
this.cause = cause;
|
|
13
|
+
this.name = 'ModbusConnectionError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class EnergyAppModbusReadError extends Error {
|
|
17
|
+
register;
|
|
18
|
+
constructor(message, register) {
|
|
19
|
+
super(`Modbus Read Error: ${message}`);
|
|
20
|
+
this.register = register;
|
|
21
|
+
this.name = 'ModbusReadError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export type OCPPVersion = '1.6' | '2.0.1';
|
|
2
|
+
export type MessageType = 2 | 3 | 4;
|
|
3
|
+
export declare const MESSAGE_TYPE: {
|
|
4
|
+
readonly CALL: 2;
|
|
5
|
+
readonly CALLRESULT: 3;
|
|
6
|
+
readonly CALLERROR: 4;
|
|
7
|
+
};
|
|
8
|
+
export interface OCPPMessage {
|
|
9
|
+
messageType: MessageType;
|
|
10
|
+
messageId: string;
|
|
11
|
+
action?: string;
|
|
12
|
+
payload?: any;
|
|
13
|
+
errorCode?: string;
|
|
14
|
+
errorDescription?: string;
|
|
15
|
+
errorDetails?: any;
|
|
16
|
+
}
|
|
17
|
+
export interface CallMessage extends OCPPMessage {
|
|
18
|
+
messageType: typeof MESSAGE_TYPE.CALL;
|
|
19
|
+
action: string;
|
|
20
|
+
payload: any;
|
|
21
|
+
}
|
|
22
|
+
export interface CallResultMessage extends OCPPMessage {
|
|
23
|
+
messageType: typeof MESSAGE_TYPE.CALLRESULT;
|
|
24
|
+
payload: any;
|
|
25
|
+
}
|
|
26
|
+
export interface CallErrorMessage extends OCPPMessage {
|
|
27
|
+
messageType: typeof MESSAGE_TYPE.CALLERROR;
|
|
28
|
+
errorCode: string;
|
|
29
|
+
errorDescription: string;
|
|
30
|
+
errorDetails?: any;
|
|
31
|
+
}
|
|
32
|
+
export type OCPPMessageUnion = CallMessage | CallResultMessage | CallErrorMessage;
|
|
33
|
+
export declare enum ErrorCode {
|
|
34
|
+
NotImplemented = "NotImplemented",
|
|
35
|
+
NotSupported = "NotSupported",
|
|
36
|
+
InternalError = "InternalError",
|
|
37
|
+
ProtocolError = "ProtocolError",
|
|
38
|
+
SecurityError = "SecurityError",
|
|
39
|
+
FormationViolation = "FormationViolation",
|
|
40
|
+
PropertyConstraintViolation = "PropertyConstraintViolation",
|
|
41
|
+
OccurenceConstraintViolation = "OccurenceConstraintViolation",
|
|
42
|
+
TypeConstraintViolation = "TypeConstraintViolation",
|
|
43
|
+
GenericError = "GenericError"
|
|
44
|
+
}
|
|
45
|
+
export declare enum GenericChargePointStatus {
|
|
46
|
+
Available = "Available",
|
|
47
|
+
Occupied = "Occupied",
|
|
48
|
+
Suspended = "Suspended",
|
|
49
|
+
Finishing = "Finishing",
|
|
50
|
+
Reserved = "Reserved",
|
|
51
|
+
Unavailable = "Unavailable",
|
|
52
|
+
Faulted = "Faulted"
|
|
53
|
+
}
|
|
54
|
+
import { ChargePointStatus, OCPP16MeterValueSampledValue } from './ocpp16.js';
|
|
55
|
+
import { ConnectorStatusEnumType, OCPP201TransactionEventRequest } from './ocpp201.js';
|
|
56
|
+
export type OCPP201MeterValueSampledValue = NonNullable<NonNullable<OCPP201TransactionEventRequest['meterValue']>[number]['sampledValue'][number]>;
|
|
57
|
+
export declare function mapOCCP16StatusToGeneric(status: ChargePointStatus): GenericChargePointStatus;
|
|
58
|
+
export declare function mapOCCP201StatusToGeneric(connectorStatus: ConnectorStatusEnumType, chargingState?: 'Charging' | 'EVConnected' | 'SuspendedEV' | 'SuspendedEVSE' | 'Idle'): GenericChargePointStatus;
|
|
59
|
+
export declare function mapGenericToOCCP16Status(status: GenericChargePointStatus): ChargePointStatus;
|
|
60
|
+
export declare function mapGenericToOCCP201Status(status: GenericChargePointStatus): ConnectorStatusEnumType;
|
|
61
|
+
export type GenericOcppMeterValueContext = 'Transaction.Begin' | 'Transaction.End' | 'Sample.Clock' | 'Sample.Periodic' | 'Trigger' | 'Interruption.Begin' | 'Interruption.End';
|
|
62
|
+
export interface GenericOcppMeterValues {
|
|
63
|
+
context?: GenericOcppMeterValueContext;
|
|
64
|
+
outletVoltagePhase1: number;
|
|
65
|
+
outletVoltagePhase2: number;
|
|
66
|
+
outletVoltagePhase3: number;
|
|
67
|
+
outletCurrentPhase1: number;
|
|
68
|
+
outletCurrentPhase2: number;
|
|
69
|
+
outletCurrentPhase3: number;
|
|
70
|
+
powerImportByEvInWatt: number;
|
|
71
|
+
evStateOfChargeInPercent: number;
|
|
72
|
+
currentMeterValueInWattHours: number;
|
|
73
|
+
}
|
|
74
|
+
export declare function mapOCPP16MeterValueToGeneric(sampledValues: OCPP16MeterValueSampledValue[]): GenericOcppMeterValues;
|
|
75
|
+
export declare function mapOCPP201MeterValueToGeneric(sampledValues: OCPP201MeterValueSampledValue[]): GenericOcppMeterValues;
|