Huawei EMMA A02 – Modbus Registermap & Node‑RED Function Nodes
This Node‑RED flow provides a complete Modbus registermap and a set of function nodes for reading, decoding, and normalizing Modbus registers from the Huawei EMMA A02 (SmartHEMS) energy management module.
🔍 Overview
This flow includes:
- A structured registermap for the Huawei EMMA A02
- Function nodes to decode and normalize Modbus register values
- A modular architecture separating register definitions, Modbus read operations and data decoding
📘 Documentation Basis
The registermap and decoding logic are based on the official Huawei SmartHEMS documentation:
SmartHEMS – MODBUS Interface Definitions
- Version: V100R025C00SPC100
- Issue: V100R025C00SPC100
- Date: 2025‑06‑18
- Documentation source: https://www.photovoltaikforum.com/core/file-download/514695/
The registermap was generated with Microsoft Copilot, following section “3.1 Register Definitions for the EMMA”.
🧩 What This Flow Provides
✔️ Complete Registermap
A comprehensive JSON‑based registermap that provides all required fields to generate the payload for the Modbus Flex Getter and to pass decoding metadata to subsequent function nodes.
✔️ Decoding Function Nodes
Reusable function nodes that:
- Convert raw Modbus values into engineering units
- Handle signed/unsigned values
- Normalize naming and output structure
🛠️ Requirements
- Node‑RED (tested on v4.12)
- node-red-contrib-modbus
- Huawei EMMA A02 with Modbus enabled
- Network access to the EMMA’s Modbus TCP interface (or RS485 if adapted)
🚀 Getting Started
- Import the flow into Node‑RED
- Configure the Modbus connection (IP, port, unit ID)
- Deploy the flow
- Start receiving structured EMMA A02 data
📝 Notes
- The registermap is based on the official documentation and may evolve with future firmware updates.
- Contributions, corrections, and extensions are welcome.
🧩 Flow
[{"id":"flow_test_solution_a","type":"tab","label":"Huawei EMMA Modbus","disabled":false,"info":"","env":[{"name":"registerMap","value":"{\"offeringName\":{\"category\":\"characteristicData\",\"categoryName\":\"Characteristic data\",\"signal\":\"offeringName\",\"signalName\":\"Offering name\",\"readWrite\":\"RO\",\"type\":\"STR\",\"unit\":\"N/A\",\"gain\":null,\"address\":30000,\"quantity\":15},\"sn\":{\"category\":\"characteristicData\",\"categoryName\":\"Characteristic data\",\"signal\":\"sn\",\"signalName\":\"SN\",\"readWrite\":\"RO\",\"type\":\"STR\",\"unit\":\"N/A\",\"gain\":null,\"address\":30015,\"quantity\":10},\"softwareVersion\":{\"category\":\"characteristicData\",\"categoryName\":\"Characteristic data\",\"signal\":\"softwareVersion\",\"signalName\":\"Software version\",\"readWrite\":\"RO\",\"type\":\"STR\",\"unit\":\"N/A\",\"gain\":null,\"address\":30035,\"quantity\":15},\"model\":{\"category\":\"characteristicData\",\"categoryName\":\"Characteristic data\",\"signal\":\"model\",\"signalName\":\"Model\",\"readWrite\":\"RO\",\"type\":\"STR\",\"unit\":\"N/A\",\"gain\":null,\"address\":30222,\"quantity\":20},\"inverterTotalAbsorbedEnergy\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"inverterTotalAbsorbedEnergy\",\"signalName\":\"Inverter total absorbed energy\",\"readWrite\":\"RO\",\"type\":\"U64\",\"unit\":\"kWh\",\"gain\":100,\"address\":30302,\"quantity\":4},\"energyChargedToday\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"energyChargedToday\",\"signalName\":\"Energy charged today\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30306,\"quantity\":2},\"totalChargedEnergy\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"totalChargedEnergy\",\"signalName\":\"Total charged energy\",\"readWrite\":\"RO\",\"type\":\"U64\",\"unit\":\"kWh\",\"gain\":100,\"address\":30308,\"quantity\":4},\"energyDischargedToday\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"energyDischargedToday\",\"signalName\":\"Energy discharged today\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30312,\"quantity\":2},\"totalDischargedEnergy\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"totalDischargedEnergy\",\"signalName\":\"Total discharged energy\",\"readWrite\":\"RO\",\"type\":\"U64\",\"unit\":\"kWh\",\"gain\":100,\"address\":30314,\"quantity\":4},\"essChargeableEnergy\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"essChargeableEnergy\",\"signalName\":\"ESS chargeable energy\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":1000,\"address\":30318,\"quantity\":2},\"essDischargeableEnergy\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"essDischargeableEnergy\",\"signalName\":\"ESS dischargeable energy\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":1000,\"address\":30320,\"quantity\":2},\"ratedEssCapacity\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"ratedEssCapacity\",\"signalName\":\"Rated ESS capacity\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":1000,\"address\":30322,\"quantity\":2},\"consumptionToday\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"consumptionToday\",\"signalName\":\"Consumption today\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30324,\"quantity\":2},\"totalEnergyConsumption\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"totalEnergyConsumption\",\"signalName\":\"Total energy consumption\",\"readWrite\":\"RO\",\"type\":\"U64\",\"unit\":\"kWh\",\"gain\":100,\"address\":30326,\"quantity\":4},\"feedInToGridToday\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"feedInToGridToday\",\"signalName\":\"Feed-in to grid today\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30330,\"quantity\":2},\"totalFeedInToGrid\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"totalFeedInToGrid\",\"signalName\":\"Total feed-in to grid\",\"readWrite\":\"RO\",\"type\":\"U64\",\"unit\":\"kWh\",\"gain\":100,\"address\":30332,\"quantity\":4},\"supplyFromGridToday\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"supplyFromGridToday\",\"signalName\":\"Supply from grid today\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30336,\"quantity\":2},\"totalSupplyFromGrid\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"totalSupplyFromGrid\",\"signalName\":\"Total supply from grid\",\"readWrite\":\"RO\",\"type\":\"U64\",\"unit\":\"kWh\",\"gain\":100,\"address\":30338,\"quantity\":4},\"inverterEnergyYieldToday\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"inverterEnergyYieldToday\",\"signalName\":\"Inverter energy yield today\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30342,\"quantity\":2},\"inverterTotalEnergyYield\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"inverterTotalEnergyYield\",\"signalName\":\"Inverter total energy yield\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30344,\"quantity\":2},\"pvYieldToday\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"pvYieldToday\",\"signalName\":\"PV yield today\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30346,\"quantity\":2},\"totalPvEnergyYield\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"totalPvEnergyYield\",\"signalName\":\"Total PV energy yield\",\"readWrite\":\"RO\",\"type\":\"U64\",\"unit\":\"kWh\",\"gain\":100,\"address\":30348,\"quantity\":4},\"pvOutputPower\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"pvOutputPower\",\"signalName\":\"PV output power\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kW\",\"gain\":1000,\"address\":30354,\"quantity\":2},\"loadPower\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"loadPower\",\"signalName\":\"Load power\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kW\",\"gain\":1000,\"address\":30356,\"quantity\":2},\"feedInPower\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"feedInPower\",\"signalName\":\"Feed-in power\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":30358,\"quantity\":2},\"batteryChargeDischargePower\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"batteryChargeDischargePower\",\"signalName\":\"Battery charge/discharge power\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":30360,\"quantity\":2},\"inverterRatedPower\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"inverterRatedPower\",\"signalName\":\"Inverter rated power\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kW\",\"gain\":1000,\"address\":30362,\"quantity\":2},\"inverterActivePower\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"inverterActivePower\",\"signalName\":\"Inverter active power\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":30364,\"quantity\":2},\"soc\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"soc\",\"signalName\":\"SOC\",\"readWrite\":\"RO\",\"type\":\"U16\",\"unit\":\"%\",\"gain\":100,\"address\":30368,\"quantity\":1},\"essChargeableCapacity\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"essChargeableCapacity\",\"signalName\":\"ESS chargeable capacity\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":1000,\"address\":30369,\"quantity\":2},\"essDischargeableCapacity\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"essDischargeableCapacity\",\"signalName\":\"ESS dischargeable capacity\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":1000,\"address\":30371,\"quantity\":2},\"backupPowerSoc\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"backupPowerSoc\",\"signalName\":\"Backup power SOC\",\"readWrite\":\"RO\",\"type\":\"U16\",\"unit\":\"%\",\"gain\":100,\"address\":30373,\"quantity\":1},\"yieldThisMonth\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"yieldThisMonth\",\"signalName\":\"Yield this month\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30380,\"quantity\":2},\"monthlyEnergyConsumption\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"monthlyEnergyConsumption\",\"signalName\":\"Monthly energy consumption\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30382,\"quantity\":2},\"monthlyFeedInToGrid\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"monthlyFeedInToGrid\",\"signalName\":\"Monthly feed-in to grid\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30384,\"quantity\":2},\"yieldThisYear\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"yieldThisYear\",\"signalName\":\"Yield this year\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30386,\"quantity\":2},\"annualEnergyConsumption\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"annualEnergyConsumption\",\"signalName\":\"Annual energy consumption\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30388,\"quantity\":2},\"yearlyFeedInToGrid\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"yearlyFeedInToGrid\",\"signalName\":\"Yearly feed-in to grid\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30390,\"quantity\":2},\"monthlySupplyFromGrid\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"monthlySupplyFromGrid\",\"signalName\":\"Monthly supply from grid\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30394,\"quantity\":2},\"yearlySupplyFromGrid\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"yearlySupplyFromGrid\",\"signalName\":\"Yearly supply from grid\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30396,\"quantity\":2},\"backupTimeNotificationThreshold\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"backupTimeNotificationThreshold\",\"signalName\":\"Backup time notification threshold\",\"readWrite\":\"RO\",\"type\":\"U16\",\"unit\":\"min\",\"gain\":1,\"address\":30406,\"quantity\":1},\"energyChargedThisMonth\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"energyChargedThisMonth\",\"signalName\":\"Energy charged this month\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30407,\"quantity\":2},\"energyDischargedThisMonth\":{\"category\":\"sampledData\",\"categoryName\":\"Sampled data\",\"signal\":\"energyDischargedThisMonth\",\"signalName\":\"Energy discharged this month\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"kWh\",\"gain\":100,\"address\":30409,\"quantity\":2},\"numberOfInvertersFound\":{\"category\":\"deviceManagement\",\"categoryName\":\"Device management\",\"signal\":\"numberOfInvertersFound\",\"signalName\":\"Number of inverters found\",\"readWrite\":\"RO\",\"type\":\"U16\",\"unit\":\"N/A\",\"gain\":null,\"address\":30801,\"quantity\":1},\"numberOfChargersFound\":{\"category\":\"deviceManagement\",\"categoryName\":\"Device management\",\"signal\":\"numberOfChargersFound\",\"signalName\":\"Number of chargers found\",\"readWrite\":\"RO\",\"type\":\"U16\",\"unit\":\"N/A\",\"gain\":null,\"address\":30804,\"quantity\":1},\"subdevicePresenceFlag\":{\"category\":\"deviceManagement\",\"categoryName\":\"Device management\",\"signal\":\"subdevicePresenceFlag\",\"signalName\":\"Subdevice presence flag\",\"readWrite\":\"RO\",\"type\":\"Bitfield32\",\"unit\":\"N/A\",\"gain\":null,\"address\":30811,\"quantity\":2},\"dstState\":{\"category\":\"timeManagement\",\"categoryName\":\"Time management\",\"signal\":\"dstState\",\"signalName\":\"DST state\",\"readWrite\":\"RO\",\"type\":\"U16\",\"unit\":\"N/A\",\"gain\":null,\"address\":31002,\"quantity\":1},\"localTime\":{\"category\":\"timeManagement\",\"categoryName\":\"Time management\",\"signal\":\"localTime\",\"signalName\":\"Local time\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"N/A\",\"gain\":null,\"address\":31003,\"quantity\":2},\"wifiStaSignalStrength\":{\"category\":\"wifiManagement\",\"categoryName\":\"WiFi management\",\"signal\":\"wifiStaSignalStrength\",\"signalName\":\"WiFi-STA signal strength\",\"readWrite\":\"RO\",\"type\":\"UINT16\",\"unit\":\"N/A\",\"gain\":null,\"address\":31135,\"quantity\":1},\"phaseAVoltageBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseAVoltageBuiltIn\",\"signalName\":\"Phase A voltage of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":100,\"address\":31639,\"quantity\":2},\"phaseBVoltageBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseBVoltageBuiltIn\",\"signalName\":\"Phase B voltage of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":100,\"address\":31641,\"quantity\":2},\"phaseCVoltageBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseCVoltageBuiltIn\",\"signalName\":\"Phase C voltage of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":100,\"address\":31643,\"quantity\":2},\"abLineVoltageBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"abLineVoltageBuiltIn\",\"signalName\":\"A-B line voltage of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":100,\"address\":31645,\"quantity\":2},\"bcLineVoltageBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"bcLineVoltageBuiltIn\",\"signalName\":\"B-C line voltage of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":100,\"address\":31647,\"quantity\":2},\"caLineVoltageBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"caLineVoltageBuiltIn\",\"signalName\":\"C-A line voltage of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":100,\"address\":31649,\"quantity\":2},\"phaseACurrentBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseACurrentBuiltIn\",\"signalName\":\"Phase A current of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"A\",\"gain\":10,\"address\":31651,\"quantity\":2},\"phaseBCurrentBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseBCurrentBuiltIn\",\"signalName\":\"Phase B current of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"A\",\"gain\":10,\"address\":31653,\"quantity\":2},\"phaseCCurrentBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseCCurrentBuiltIn\",\"signalName\":\"Phase C current of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"A\",\"gain\":10,\"address\":31655,\"quantity\":2},\"activePowerBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"activePowerBuiltIn\",\"signalName\":\"Active power of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":31657,\"quantity\":2},\"powerFactorBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"powerFactorBuiltIn\",\"signalName\":\"Power factor of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"N/A\",\"gain\":1000,\"address\":31661,\"quantity\":2},\"apparentPowerBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"apparentPowerBuiltIn\",\"signalName\":\"Apparent power of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kVA\",\"gain\":1000,\"address\":31663,\"quantity\":2},\"phaseAActivePowerBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseAActivePowerBuiltIn\",\"signalName\":\"Phase A active power of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":31665,\"quantity\":2},\"phaseBActivePowerBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseBActivePowerBuiltIn\",\"signalName\":\"Phase B active power of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":31667,\"quantity\":2},\"phaseCActivePowerBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseCActivePowerBuiltIn\",\"signalName\":\"Phase C active power of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":31669,\"quantity\":2},\"totalActiveEnergyBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"totalActiveEnergyBuiltIn\",\"signalName\":\"Total active energy of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I64\",\"unit\":\"kWh\",\"gain\":100,\"address\":31671,\"quantity\":4},\"totalNegativeActiveEnergyBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"totalNegativeActiveEnergyBuiltIn\",\"signalName\":\"Total negative active energy of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I64\",\"unit\":\"kWh\",\"gain\":100,\"address\":31679,\"quantity\":4},\"totalPositiveActiveEnergyBuiltIn\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"totalPositiveActiveEnergyBuiltIn\",\"signalName\":\"Total positive active energy of built-in electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I64\",\"unit\":\"kWh\",\"gain\":100,\"address\":31687,\"quantity\":4},\"phaseAVoltageExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseAVoltageExternal\",\"signalName\":\"Phase A voltage of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":10,\"address\":31895,\"quantity\":2},\"phaseBVoltageExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseBVoltageExternal\",\"signalName\":\"Phase B voltage of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":10,\"address\":31897,\"quantity\":2},\"phaseCVoltageExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseCVoltageExternal\",\"signalName\":\"Phase C voltage of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":10,\"address\":31899,\"quantity\":2},\"abLineVoltageExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"abLineVoltageExternal\",\"signalName\":\"A-B line voltage of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":10,\"address\":31901,\"quantity\":2},\"bcLineVoltageExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"bcLineVoltageExternal\",\"signalName\":\"B-C line voltage of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":10,\"address\":31903,\"quantity\":2},\"caLineVoltageExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"caLineVoltageExternal\",\"signalName\":\"C-A line voltage of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"U32\",\"unit\":\"V\",\"gain\":10,\"address\":31905,\"quantity\":2},\"phaseACurrentExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseACurrentExternal\",\"signalName\":\"Phase A current of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"A\",\"gain\":100,\"address\":31907,\"quantity\":2},\"phaseBCurrentExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseBCurrentExternal\",\"signalName\":\"Phase B current of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"A\",\"gain\":100,\"address\":31909,\"quantity\":2},\"phaseCCurrentExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseCCurrentExternal\",\"signalName\":\"Phase C current of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"A\",\"gain\":100,\"address\":31911,\"quantity\":2},\"activePowerExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"activePowerExternal\",\"signalName\":\"Active power of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":31913,\"quantity\":2},\"powerFactorExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"powerFactorExternal\",\"signalName\":\"Power factor of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"N/A\",\"gain\":1000,\"address\":31917,\"quantity\":2},\"apparentPowerExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"apparentPowerExternal\",\"signalName\":\"Apparent power of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kVA\",\"gain\":1000,\"address\":31919,\"quantity\":2},\"phaseAActivePowerExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseAActivePowerExternal\",\"signalName\":\"Phase A active power of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":31921,\"quantity\":2},\"phaseBActivePowerExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseBActivePowerExternal\",\"signalName\":\"Phase B active power of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":31923,\"quantity\":2},\"phaseCActivePowerExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"phaseCActivePowerExternal\",\"signalName\":\"Phase C active power of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":31925,\"quantity\":2},\"totalActiveEnergyExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"totalActiveEnergyExternal\",\"signalName\":\"Total active energy of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I64\",\"unit\":\"kWh\",\"gain\":100,\"address\":31927,\"quantity\":4},\"totalNegativeActiveEnergyExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"totalNegativeActiveEnergyExternal\",\"signalName\":\"Total negative active energy of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I64\",\"unit\":\"kWh\",\"gain\":100,\"address\":31935,\"quantity\":4},\"totalPositiveActiveEnergyExternal\":{\"category\":\"meterManagement\",\"categoryName\":\"Meter management\",\"signal\":\"totalPositiveActiveEnergyExternal\",\"signalName\":\"Total positive active energy of external electric energy sensor\",\"readWrite\":\"RO\",\"type\":\"I64\",\"unit\":\"kWh\",\"gain\":100,\"address\":31943,\"quantity\":4},\"essControlMode\":{\"category\":\"batteryControl\",\"categoryName\":\"Battery control\",\"signal\":\"essControlMode\",\"signalName\":\"ESS control mode\",\"readWrite\":\"RW\",\"type\":\"ENUM16\",\"unit\":\"N/A\",\"gain\":null,\"address\":40000,\"quantity\":1},\"touPreferredUseOfSurplusPvPower\":{\"category\":\"batteryControl\",\"categoryName\":\"Battery control\",\"signal\":\"touPreferredUseOfSurplusPvPower\",\"signalName\":\"[Time of Use mode] Preferred use of surplus PV power\",\"readWrite\":\"RW\",\"type\":\"ENUM16\",\"unit\":\"N/A\",\"gain\":null,\"address\":40001,\"quantity\":1},\"touMaximumPowerForChargingBatteriesFromGrid\":{\"category\":\"batteryControl\",\"categoryName\":\"Battery control\",\"signal\":\"touMaximumPowerForChargingBatteriesFromGrid\",\"signalName\":\"[Time of Use mode] Maximum power for charging batteries from grid\",\"readWrite\":\"RW\",\"type\":\"U32\",\"unit\":\"kW\",\"gain\":1000,\"address\":40002,\"quantity\":2},\"touChargeDischargeTimeWindow\":{\"category\":\"batteryControl\",\"categoryName\":\"Battery control\",\"signal\":\"touChargeDischargeTimeWindow\",\"signalName\":\"[Time of Use mode] Charge / Discharge time window\",\"readWrite\":\"RW\",\"type\":\"MLD\",\"unit\":\"N/A\",\"gain\":null,\"address\":40004,\"quantity\":43},\"powerControlModeAtGridConnectionPoint\":{\"category\":\"limitedFeedIn\",\"categoryName\":\"Limited feed-in\",\"signal\":\"powerControlModeAtGridConnectionPoint\",\"signalName\":\"Power control mode at grid connection point\",\"readWrite\":\"RW\",\"type\":\"ENUM16\",\"unit\":\"N/A\",\"gain\":null,\"address\":40100,\"quantity\":1},\"limitationMode\":{\"category\":\"limitedFeedIn\",\"categoryName\":\"Limited feed-in\",\"signal\":\"limitationMode\",\"signalName\":\"Limitation mode\",\"readWrite\":\"RW\",\"type\":\"ENUM16\",\"unit\":\"N/A\",\"gain\":null,\"address\":40101,\"quantity\":1},\"maximumGridFeedInPowerKW\":{\"category\":\"limitedFeedIn\",\"categoryName\":\"Limited feed-in\",\"signal\":\"maximumGridFeedInPowerKW\",\"signalName\":\"Maximum grid feed-in power (kW)\",\"readWrite\":\"RW\",\"type\":\"I32\",\"unit\":\"kW\",\"gain\":1000,\"address\":40107,\"quantity\":2},\"maximumGridFeedInPowerPercent\":{\"category\":\"limitedFeedIn\",\"categoryName\":\"Limited feed-in\",\"signal\":\"maximumGridFeedInPowerPercent\",\"signalName\":\"Maximum grid feed-in power (%)\",\"readWrite\":\"RW\",\"type\":\"U16\",\"unit\":\"%\",\"gain\":10,\"address\":40109,\"quantity\":1},\"threePhaseImbalanceControl\":{\"category\":\"limitedFeedIn\",\"categoryName\":\"Limited feed-in\",\"signal\":\"threePhaseImbalanceControl\",\"signalName\":\"Three-phase imbalance control\",\"readWrite\":\"RW\",\"type\":\"ENUM16\",\"unit\":\"N/A\",\"gain\":null,\"address\":40110,\"quantity\":1},\"systemTime\":{\"category\":\"timeManagement\",\"categoryName\":\"Timemanagement\",\"signal\":\"systemTime\",\"signalName\":\"System time\",\"readWrite\":\"RW\",\"type\":\"U32\",\"unit\":\"N/A\",\"gain\":1,\"address\":40470,\"quantity\":2},\"localTimeYear\":{\"category\":\"timeManagement\",\"categoryName\":\"Timemanagement\",\"signal\":\"localTimeYear\",\"signalName\":\"Local time - year\",\"readWrite\":\"RW\",\"type\":\"U16\",\"unit\":\"N/A\",\"gain\":1,\"address\":40490,\"quantity\":1},\"localTimeMonth\":{\"category\":\"timeManagement\",\"categoryName\":\"Timemanagement\",\"signal\":\"localTimeMonth\",\"signalName\":\"Local time - month\",\"readWrite\":\"RW\",\"type\":\"U16\",\"unit\":\"N/A\",\"gain\":1,\"address\":40491,\"quantity\":1},\"localTimeDay\":{\"category\":\"timeManagement\",\"categoryName\":\"Timemanagement\",\"signal\":\"localTimeDay\",\"signalName\":\"Local time - day\",\"readWrite\":\"RW\",\"type\":\"U16\",\"unit\":\"N/A\",\"gain\":1,\"address\":40492,\"quantity\":1},\"localTimeHour\":{\"category\":\"timeManagement\",\"categoryName\":\"Timemanagement\",\"signal\":\"localTimeHour\",\"signalName\":\"Local time - hour\",\"readWrite\":\"RW\",\"type\":\"U16\",\"unit\":\"N/A\",\"gain\":1,\"address\":40493,\"quantity\":1},\"localTimeMinute\":{\"category\":\"timeManagement\",\"categoryName\":\"Timemanagement\",\"signal\":\"localTimeMinute\",\"signalName\":\"Local time - minute\",\"readWrite\":\"RW\",\"type\":\"U16\",\"unit\":\"N/A\",\"gain\":1,\"address\":40494,\"quantity\":1},\"localTimeSecond\":{\"category\":\"timeManagement\",\"categoryName\":\"Timemanagement\",\"signal\":\"localTimeSecond\",\"signalName\":\"Local time - second\",\"readWrite\":\"RW\",\"type\":\"U16\",\"unit\":\"N/A\",\"gain\":1,\"address\":40495,\"quantity\":1},\"powerSupplyConfiguration\":{\"category\":\"smartGuard\",\"categoryName\":\"SmartGuard\",\"signal\":\"powerSupplyConfiguration\",\"signalName\":\"Power supply configuration\",\"readWrite\":\"RW\",\"type\":\"ENUM16\",\"unit\":\"N/A\",\"gain\":null,\"address\":41214,\"quantity\":1},\"considerMainsToBeFaultyIf\":{\"category\":\"smartGuard\",\"categoryName\":\"SmartGuard\",\"signal\":\"considerMainsToBeFaultyIf\",\"signalName\":\"Consider mains to be faulty if\",\"readWrite\":\"RW\",\"type\":\"ENUM16\",\"unit\":\"N/A\",\"gain\":null,\"address\":41215,\"quantity\":1}}","type":"json"}]},{"id":"flex_test_solution_a","type":"modbus-flex-getter","z":"flow_test_solution_a","name":"Flex Getter Test","showStatusActivities":true,"showErrors":true,"showWarnings":true,"logIOActivities":false,"server":"5bd70e63aaf8f283","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":true,"delayOnStart":false,"enableDeformedMessages":false,"startDelayTime":"","x":1060,"y":620,"wires":[["30221e7ae0acb693"],[]]},{"id":"88d60b2ab912969b","type":"debug","z":"flow_test_solution_a","name":"Registers","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1340,"y":880,"wires":[]},{"id":"56e9074f8be8e959","type":"debug","z":"flow_test_solution_a","name":"Value","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1330,"y":740,"wires":[]},{"id":"58af4ba31907999c","type":"function","z":"flow_test_solution_a","name":"Get EMMA Signal","func":"const registerMap = context.get(\"registerMap\");\n\n\n// -------------------------------\n// INPUT: msg.signalName (camelCase)\n// -------------------------------\nconst sig = msg.payload;\n\nif (!sig || !registerMap[sig]) {\n node.error(\"Unknown signalName: \" + sig);\n return null;\n}\n\nconst r = registerMap[sig];\n\n// -------------------------------\n// OUTPUT: msg.payload\n// -------------------------------\nmsg.payload = {\n fc: 3,\n unitid: \"0\",\n address: String(r.address),\n quantity: String(r.quantity)\n};\n\n// -------------------------------\n// OUTPUT: msg._meta\n// -------------------------------\nmsg._meta = {\n category: r.category,\n signalName: r.signalName,\n readWrite: r.readWrite,\n type: r.type,\n unit: r.unit,\n gain: r.gain\n};\n\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"// Der Code hier wird ausgeführt,\n// wenn der Node gestartet wird\n\nlet rmString = env.get(\"registerMap\");\n\nif (!rmString) {\n node.error(\"Environment variable 'registerMap' not found\");\n return null;\n}\n\nlet registerMap;\n// Case 1: Already an object → no parsing needed\nif (typeof rmString === \"object\") {\n registerMap = rmString;\n}\n// Case 2: JSON string → try parsing\nelse if (typeof rmString === \"string\") {\n try {\n registerMap = JSON.parse(rmString);\n } catch (err) {\n node.error(\"JSON parse error: \" + err.message);\n return null;\n }\n}\n// Case 3: Anything else → invalid\nelse {\n node.error(\"Invalid rm type: \" + typeof rmString);\n return null;\n}\n\nif (registerMap && typeof registerMap === \"object\") {\n const count = Object.keys(registerMap).length;\n\n context.set(\"registerMap\", registerMap);\n node.status({\n fill: \"green\",\n shape: \"dot\",\n text: `RegisterMap: ${count} entries`\n });\n node.log(`RegisterMap loaded: ${count} entries`);\n} else {\n node.status({\n fill: \"red\",\n shape: \"ring\",\n text: \"RegisterMap missing!\"\n });\n}","finalize":"","libs":[],"x":830,"y":620,"wires":[["flex_test_solution_a"]]},{"id":"69bbe42ee0280e9d","type":"inject","z":"flow_test_solution_a","name":"Consumption Today (U32)","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"consumptionToday","payloadType":"str","x":510,"y":740,"wires":[["58af4ba31907999c"]]},{"id":"3ed11b02c8e17721","type":"inject","z":"flow_test_solution_a","name":"Registers","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":420,"y":880,"wires":[["2dd4c6dae105980b"]]},{"id":"2dd4c6dae105980b","type":"function","z":"flow_test_solution_a","name":"List EMMA Signals","func":"const registerMap = context.get(\"registerMap\");\n\nconst signalList = Object.values(registerMap).map(e => e.signal);\n\nmsg.payload = signalList;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"// Der Code hier wird ausgeführt,\n// wenn der Node gestartet wird\n\nlet rmString = env.get(\"registerMap\");\n\nif (!rmString) {\n node.error(\"Environment variable 'registerMap' not found\");\n return null;\n}\n\nlet registerMap;\n// Case 1: Already an object → no parsing needed\nif (typeof rmString === \"object\") {\n registerMap = rmString;\n}\n// Case 2: JSON string → try parsing\nelse if (typeof rmString === \"string\") {\n try {\n registerMap = JSON.parse(rmString);\n } catch (err) {\n node.error(\"JSON parse error: \" + err.message);\n return null;\n }\n}\n// Case 3: Anything else → invalid\nelse {\n node.error(\"Invalid rm type: \" + typeof rmString);\n return null;\n}\n\nif (registerMap && typeof registerMap === \"object\") {\n const count = Object.keys(registerMap).length;\n\n context.set(\"registerMap\", registerMap);\n node.status({\n fill: \"green\",\n shape: \"dot\",\n text: `RegisterMap: ${count} entries`\n });\n node.log(`RegisterMap loaded: ${count} entries`);\n} else {\n node.status({\n fill: \"red\",\n shape: \"ring\",\n text: \"RegisterMap missing!\"\n });\n}","finalize":"","libs":[],"x":830,"y":880,"wires":[["88d60b2ab912969b"]]},{"id":"30221e7ae0acb693","type":"function","z":"flow_test_solution_a","name":"EMMA Universal Decoder","func":"// Universal Modbus decoder using msg.payload.meta\n\nfunction toSigned(val, bits) {\n const max = Math.pow(2, bits);\n const limit = Math.pow(2, bits - 1);\n return val >= limit ? val - max : val;\n}\n\nlet regs = msg.payload;\nlet meta = msg._meta;\n\nif (!regs || !meta) {\n msg.error = \"Missing registers or meta\";\n return msg;\n}\n\nlet type = meta.type;\nlet gain = meta.gain || 1;\nlet value;\n\nnode.log(meta);\n\nswitch (type) {\n\n // -------------------------\n // 16-bit unsigned\n // -------------------------\n case \"U16\":\n value = regs[0] & 0xFFFF;\n break;\n\n // -------------------------\n // 16-bit signed\n // -------------------------\n case \"I16\":\n value = toSigned(regs[0] & 0xFFFF, 16);\n break;\n\n // -------------------------\n // 32-bit unsigned\n // -------------------------\n case \"U32\":\n value = (regs[0] << 16) + regs[1];\n break;\n\n // -------------------------\n // 32-bit signed\n // -------------------------\n case \"I32\":\n value = (regs[0] << 16) + regs[1];\n value = toSigned(value, 32);\n break;\n\n // -------------------------\n // 64-bit unsigned\n // -------------------------\n case \"U64\":\n value = Number(\n (BigInt(regs[0]) << 48n) +\n (BigInt(regs[1]) << 32n) +\n (BigInt(regs[2]) << 16n) +\n BigInt(regs[3])\n );\n break;\n\n // -------------------------\n // 64-bit signed\n // -------------------------\n case \"I64\":\n let raw64 =\n (BigInt(regs[0]) << 48n) +\n (BigInt(regs[1]) << 32n) +\n (BigInt(regs[2]) << 16n) +\n BigInt(regs[3]);\n\n // signed conversion: if highest bit set → negative\n if (raw64 & (1n << 63n)) {\n raw64 = raw64 - (1n << 64n);\n }\n\n value = Number(raw64);\n break;\n\n // -------------------------\n // String decoding\n // -------------------------\n case \"STR\":\n let chars = [];\n\n for (let i = 0; i < regs.length; i++) {\n let w = regs[i];\n\n let high = (w & 0xFF00) >> 8;\n let low = (w & 0x00FF);\n\n chars.push(String.fromCharCode(high));\n chars.push(String.fromCharCode(low));\n }\n\n let str = chars.join(\"\").replace(/\\u0000/g, \"\");\n msg.payload = meta.signalName + \": \" + str;\n return msg;\n\n default:\n msg.error = \"Unknown type: \" + type;\n return msg;\n}\n\n// -------------------------\n// Numeric output\n// -------------------------\n\n// Wenn gain = \"N/A\", dann nicht dividieren\nlet scaledValue = (meta.gain === \"N/A\" || meta.gain === null)\n ? value\n : value / meta.gain;\n\n// Wenn unit = \"N/A\", dann Unit komplett weglassen\nlet unitText = (meta.unit === \"N/A\" || meta.unit === null)\n ? \"\"\n : \" \" + meta.unit;\n\n// Ausgabe zusammenbauen\nmsg.payload = meta.signalName + \": \" + scaledValue + unitText;\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1070,"y":740,"wires":[["56e9074f8be8e959"]]},{"id":"1cb82d11c2e3bc77","type":"inject","z":"flow_test_solution_a","name":"Model (STR)","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"model","payloadType":"str","x":610,"y":260,"wires":[["58af4ba31907999c"]]},{"id":"26003a5dedca1182","type":"inject","z":"flow_test_solution_a","name":"Inverter total absorbed energy (U64)","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"inverterTotalAbsorbedEnergy","payloadType":"str","x":460,"y":440,"wires":[["58af4ba31907999c"]]},{"id":"4196772c1c19dbe5","type":"inject","z":"flow_test_solution_a","name":"Consumption today (U32)","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"consumptionToday","payloadType":"str","x":490,"y":380,"wires":[["58af4ba31907999c"]]},{"id":"74687e1d6ca8b9ce","type":"inject","z":"flow_test_solution_a","name":"SOC (U16)","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"soc","payloadType":"str","x":560,"y":320,"wires":[["58af4ba31907999c"]]},{"id":"988de345732b9d73","type":"inject","z":"flow_test_solution_a","name":"FeedI in power (I32)","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"feedInPower","payloadType":"str","x":470,"y":520,"wires":[["58af4ba31907999c"]]},{"id":"5b0841ed6dbf3955","type":"inject","z":"flow_test_solution_a","name":"Total active energy of built-in electric energy sensor (I64)","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"totalActiveEnergyBuiltIn","payloadType":"str","x":370,"y":600,"wires":[["58af4ba31907999c"]]},{"id":"ad694d974dcdb7b8","type":"inject","z":"flow_test_solution_a","name":"Subdevice presence flag (Bitfield32)","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"subdevicePresenceFlag","payloadType":"str","x":440,"y":680,"wires":[["58af4ba31907999c"]]},{"id":"da623d03fb09af71","type":"inject","z":"flow_test_solution_a","name":"Offering name","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"offeringName","payloadType":"str","x":410,"y":1040,"wires":[["41817ac42b925126"]]},{"id":"a507cdcc41410d40","type":"inject","z":"flow_test_solution_a","name":"SN","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"sn","payloadType":"str","x":370,"y":1080,"wires":[["41817ac42b925126"]]},{"id":"920d260be9949845","type":"inject","z":"flow_test_solution_a","name":"Software version","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"softwareVersion","payloadType":"str","x":380,"y":1120,"wires":[["41817ac42b925126"]]},{"id":"a579dd94ac291a7b","type":"inject","z":"flow_test_solution_a","name":"Model","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"model","payloadType":"str","x":430,"y":1160,"wires":[["41817ac42b925126"]]},{"id":"f9bd849eb1cfdc1b","type":"inject","z":"flow_test_solution_a","name":"Feed-in to grid today","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"feedInToGridToday","payloadType":"str","x":770,"y":1060,"wires":[["afbf71909825b933"]]},{"id":"8b1aa1e3d8b95396","type":"inject","z":"flow_test_solution_a","name":"Supply from grid today","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"supplyFromGridToday","payloadType":"str","x":740,"y":1100,"wires":[["afbf71909825b933"]]},{"id":"a5d506baf77beb20","type":"inject","z":"flow_test_solution_a","name":"Inverter energ yield today","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"inverterEnergyYieldToday","payloadType":"str","x":770,"y":1140,"wires":[["afbf71909825b933"]]},{"id":"f157ca8ba519db2e","type":"inject","z":"flow_test_solution_a","name":"Consumption today","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"consumptionToday","payloadType":"str","x":790,"y":1020,"wires":[["afbf71909825b933"]]},{"id":"95b9ffc890a728f4","type":"inject","z":"flow_test_solution_a","name":"PV yeald today","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"pvYieldToday","payloadType":"str","x":800,"y":1180,"wires":[["afbf71909825b933"]]},{"id":"00b118bb82a3d7c0","type":"inject","z":"flow_test_solution_a","name":"Phase A voltage","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"phaseAVoltageBuiltIn","payloadType":"str","x":1180,"y":1000,"wires":[["429d9eb725669c52"]]},{"id":"ce6abb5d0a3d4542","type":"inject","z":"flow_test_solution_a","name":"Phase B voltage","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"phaseBVoltageBuiltIn","payloadType":"str","x":1160,"y":1040,"wires":[["429d9eb725669c52"]]},{"id":"33e11b6566edc594","type":"inject","z":"flow_test_solution_a","name":"Phase C voltage","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"phaseCVoltageBuiltIn","payloadType":"str","x":1140,"y":1080,"wires":[["429d9eb725669c52"]]},{"id":"55f73135185c1ed9","type":"inject","z":"flow_test_solution_a","name":"A-B line voltage","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"abLineVoltageBuiltIn","payloadType":"str","x":1140,"y":1120,"wires":[["429d9eb725669c52"]]},{"id":"da45060ce0a36883","type":"inject","z":"flow_test_solution_a","name":"B-C line voltage","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"bcLineVoltageBuiltIn","payloadType":"str","x":1160,"y":1160,"wires":[["429d9eb725669c52"]]},{"id":"96aada8f08dac711","type":"inject","z":"flow_test_solution_a","name":"C-A line voltage","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"caLineVoltageBuiltIn","payloadType":"str","x":1180,"y":1200,"wires":[["429d9eb725669c52"]]},{"id":"41817ac42b925126","type":"link out","z":"flow_test_solution_a","name":"Get EMMA Signal","mode":"link","links":["2308dc36cb8092c8"],"x":535,"y":1100,"wires":[]},{"id":"2308dc36cb8092c8","type":"link in","z":"flow_test_solution_a","name":"Get EMMA Signal","links":["41817ac42b925126","afbf71909825b933","429d9eb725669c52","78e641737bdcf4dc","6a4bdefeabb94578","807ba039d4fb4df3"],"x":705,"y":740,"wires":[["58af4ba31907999c"]]},{"id":"afbf71909825b933","type":"link out","z":"flow_test_solution_a","name":"Get EMMA Signal","mode":"link","links":["2308dc36cb8092c8"],"x":965,"y":1100,"wires":[]},{"id":"429d9eb725669c52","type":"link out","z":"flow_test_solution_a","name":"Get EMMA Signal","mode":"link","links":["2308dc36cb8092c8"],"x":1315,"y":1100,"wires":[]},{"id":"fb90fae22fb8bd1f","type":"inject","z":"flow_test_solution_a","name":"Phase A active power","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"phaseAActivePowerBuiltIn","payloadType":"str","x":400,"y":1280,"wires":[["78e641737bdcf4dc"]]},{"id":"1af12deac0da5bf1","type":"inject","z":"flow_test_solution_a","name":"Phase B active power","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"phaseBActivePowerBuiltIn","payloadType":"str","x":400,"y":1320,"wires":[["78e641737bdcf4dc"]]},{"id":"f4d55cc55cb1a9a1","type":"inject","z":"flow_test_solution_a","name":"Phase C active power","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"phaseCActivePowerBuiltIn","payloadType":"str","x":400,"y":1360,"wires":[["78e641737bdcf4dc"]]},{"id":"78e641737bdcf4dc","type":"link out","z":"flow_test_solution_a","name":"Get EMMA Signal","mode":"link","links":["2308dc36cb8092c8"],"x":585,"y":1340,"wires":[]},{"id":"c10a02a5c0f8bda3","type":"inject","z":"flow_test_solution_a","name":"Active Power","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"activePowerBuiltIn","payloadType":"str","x":410,"y":1400,"wires":[["78e641737bdcf4dc"]]},{"id":"inject_systemTime","type":"inject","z":"flow_test_solution_a","name":"System time","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"systemTime","payloadType":"str","x":850,"y":1280,"wires":[["6a4bdefeabb94578"]]},{"id":"inject_localTimeYear","type":"inject","z":"flow_test_solution_a","name":"Local time - year","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"localTimeYear","payloadType":"str","x":840,"y":1320,"wires":[["6a4bdefeabb94578"]]},{"id":"inject_localTimeMonth","type":"inject","z":"flow_test_solution_a","name":"Local time - month","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"localTimeMonth","payloadType":"str","x":830,"y":1360,"wires":[["6a4bdefeabb94578"]]},{"id":"inject_localTimeDay","type":"inject","z":"flow_test_solution_a","name":"Local time - day","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"localTimeDay","payloadType":"str","x":840,"y":1400,"wires":[["6a4bdefeabb94578"]]},{"id":"inject_localTimeHour","type":"inject","z":"flow_test_solution_a","name":"Local time - hour","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"localTimeHour","payloadType":"str","x":840,"y":1440,"wires":[["6a4bdefeabb94578"]]},{"id":"inject_localTimeMinute","type":"inject","z":"flow_test_solution_a","name":"Local time - minute","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"localTimeMinute","payloadType":"str","x":830,"y":1480,"wires":[["6a4bdefeabb94578"]]},{"id":"inject_localTimeSecond","type":"inject","z":"flow_test_solution_a","name":"Local time - second","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"localTimeSecond","payloadType":"str","x":830,"y":1520,"wires":[["6a4bdefeabb94578"]]},{"id":"6a4bdefeabb94578","type":"link out","z":"flow_test_solution_a","name":"Get EMMA Signal","mode":"link","links":["2308dc36cb8092c8"],"x":995,"y":1400,"wires":[]},{"id":"807ba039d4fb4df3","type":"link out","z":"flow_test_solution_a","name":"Get EMMA Signal","mode":"link","links":["2308dc36cb8092c8"],"x":1555,"y":1300,"wires":[]},{"id":"inject_essControlMode","type":"inject","z":"flow_test_solution_a","name":"ESS control mode","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"essControlMode","payloadType":"str","x":1190,"y":1320,"wires":[["807ba039d4fb4df3"]]},{"id":"inject_maxPowerForChargingBatteriesFromGrid","type":"inject","z":"flow_test_solution_a","name":"[Time of Use mode] Maximum power for chargin g batteries from grid","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"touMaximumPowerForChargingBatteriesFromGrid","payloadType":"str","x":1340,"y":1400,"wires":[["807ba039d4fb4df3"]]},{"id":"inject_maximumGridFeedInPowerKW","type":"inject","z":"flow_test_solution_a","name":"Maximum grid feed-in power (kW)","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"maximumGridFeedInPowerKW","payloadType":"str","x":1230,"y":1360,"wires":[["807ba039d4fb4df3"]]},{"id":"5bd70e63aaf8f283","type":"modbus-client","name":"Huawei Emma","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"failureLogEnabled":true,"tcpHost":"192.168.1.98","tcpPort":502,"tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":9600,"serialDatabits":8,"serialStopbits":1,"serialParity":"none","serialConnectionDelay":100,"serialAsciiResponseStartDelimiter":"0x3A","unit_id":1,"commandDelay":1,"clientTimeout":1000,"reconnectOnTimeout":true,"reconnectTimeout":2000,"parallelUnitIdsAllowed":true,"showErrors":false,"showWarnings":true,"showLogs":true},{"id":"7c446fac53af6ab7","type":"global-config","env":[],"modules":{"node-red-contrib-modbus":"5.45.2"}}]