Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
214 additions
and
56 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
from typing import Tuple | ||
from unittest.mock import Mock | ||
|
||
import pytest | ||
|
||
from modules.solaredge import device | ||
from modules.solaredge.config import (SolaredgeCounterConfiguration, SolaredgeCounterSetup, | ||
SolaredgeExternalInverterConfiguration, SolaredgeExternalInverterSetup) | ||
from modules.solaredge.counter import SolaredgeCounter | ||
from modules.solaredge.external_inverter import SolaredgeExternalInverter | ||
|
||
|
||
class Params: | ||
def __init__(self, | ||
name: str, | ||
meter_id_counter: int, | ||
meter_id_inverter: int, | ||
synergy_units: int, | ||
expected_counter_register: Tuple[int, int], | ||
expected_inverter_register: Tuple[int, int]): | ||
self.name = name | ||
self.meter_id_counter = meter_id_counter | ||
self.meter_id_inverter = meter_id_inverter | ||
self.synergy_units = synergy_units | ||
self.expected_counter_register = expected_counter_register | ||
self.expected_inverter_register = expected_inverter_register | ||
|
||
|
||
cases = [Params("counter id 1, inverter id 2, synergy units 1", 1, 2, 1, (1, 1), (2, 1)), | ||
Params("counter id 1, inverter id 3, synergy units 2", 1, 3, 2, (1, 2), (2, 2)), | ||
Params("counter id 2, inverter id 1, synergy units 3", 2, 1, 3, (2, 3), (1, 3)), | ||
Params("counter id 3, inverter id 1, synergy units 1", 3, 1, 1, (2, 1), (1, 1)) | ||
] | ||
|
||
|
||
@pytest.mark.parametrize("params", cases, ids=[c.name for c in cases]) | ||
def test_set_component_registers(monkeypatch, params: Params): | ||
# setup | ||
client = Mock() | ||
monkeypatch.setattr(device, "SolaredgeMeterRegisters", Mock(side_effect=lambda *args: args)) | ||
counter = SolaredgeCounter(2, SolaredgeCounterSetup( | ||
configuration=SolaredgeCounterConfiguration(meter_id=params.meter_id_counter)), client) | ||
external_inverter = SolaredgeExternalInverter(2, SolaredgeExternalInverterSetup( | ||
configuration=SolaredgeExternalInverterConfiguration(meter_id=params.meter_id_inverter)), client) | ||
components = {"component1": counter, "component2": external_inverter} | ||
|
||
# execution | ||
device.Device.set_component_registers(components, synergy_units=params.synergy_units) | ||
|
||
# evaluation | ||
assert external_inverter.registers == params.expected_inverter_register | ||
assert counter.registers == params.expected_counter_register |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
class SolaredgeMeterRegisters: | ||
def __init__(self, internal_meter_id: int = 1, synergy_units: int = 1): | ||
# 40206: Total Real Power (sum of active phases) | ||
# 40207/40208/40209: Real Power by phase | ||
# 40210: AC Real Power Scale Factor | ||
self.powers = 40206 | ||
# 40191/40192/40193: AC Current by phase | ||
# 40194: AC Current Scale Factor | ||
self.currents = 40191 | ||
# 40196/40197/40198: Voltage per phase | ||
# 40203: AC Voltage Scale Factor | ||
self.voltages = 40196 | ||
# 40204: AC Frequency | ||
# 40205: AC Frequency Scale Factor | ||
self.frequency = 40204 | ||
# 40222/40223/40224: Power factor by phase (unit=%) | ||
# 40225: AC Power Factor Scale Factor | ||
self.power_factors = 40222 | ||
# 40226: Total Exported Real Energy | ||
# 40228/40230/40232: Total Exported Real Energy Phase (not used) | ||
# 40234: Total Imported Real Energy | ||
# 40236/40238/40240: Total Imported Real Energy Phase (not used) | ||
# 40242: Real Energy Scale Factor | ||
self.imp_exp = 40226 | ||
# 40155: C_Option Export + Import, Production, consumption, | ||
self.option = 40155 | ||
self._update_offset_meter_id(internal_meter_id) | ||
self._update_offset_synergy_units(synergy_units) | ||
|
||
def _update_offset_meter_id(self, meter_id: int) -> None: | ||
OFFSET = [0, 174, 348] | ||
self._add_offset(OFFSET[meter_id-1]) | ||
|
||
def _update_offset_synergy_units(self, synergy_units: int) -> None: | ||
"""https://www.solaredge.com/sites/default/files/sunspec-implementation-technical-note.pdf: | ||
For 2-unit three phase inverters with Synergy technology, add 50 to the default addresses. | ||
For 3-unit three phase inverters with Synergy technology, add 70 to the default addresses. | ||
""" | ||
OFFSET = [0, 50, 70] | ||
self._add_offset(OFFSET[synergy_units-1]) | ||
|
||
def _add_offset(self, offset: int) -> None: | ||
for name, value in self.__dict__.items(): | ||
setattr(self, name, value+offset) |
Oops, something went wrong.