Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/samples/sample_modbus/sample_modbus/bat.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def update(self) -> None:
# read_input_registers_bulk benötigit als Parameter das Startregister, die Anzahl der Register,
# Register-Mapping und die Modbus-ID
resp = self.client.read_input_registers_bulk(
Register.CURRENT_L1, 70, mapping=self.REG_MAPPING, unit=self.id)
Register.CURRENT_L1, 70, mapping=self.REG_MAPPING, device_id=self.id)
imported, exported = self.peak_filter.check_values(resp[Register.POWER],
resp[Register.IMPORTED],
resp[Register.EXPORTED])
Expand All @@ -66,8 +66,8 @@ def update(self) -> None:
self.store.set(bat_state)

# Einzelregister lesen (dauert länger, bei sehr weit >100 auseinanderliegenden Registern sinnvoll)
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
soc = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, device_id=unit)
soc = self.client.read_holding_registers(reg, ModbusDataType.INT_32, device_id=unit)
self.peak_filter.check_values(power)
imported, exported = self.sim_counter.sim_count(power)

Expand Down
4 changes: 2 additions & 2 deletions docs/samples/sample_modbus/sample_modbus/counter.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def update(self):
# read_input_registers_bulk benötigit als Parameter das Startregister, die Anzahl der Register,
# Register-Mapping und die Modbus-ID
resp = self.client.read_input_registers_bulk(
Register.VOLTAGE_L1, 76, mapping=self.REG_MAPPING, unit=self.id)
Register.VOLTAGE_L1, 76, mapping=self.REG_MAPPING, device_id=self.id)
imported, exported = self.peak_filter.check_values(sum(resp[Register.POWER_L1]),
resp[Register.IMPORTED],
resp[Register.EXPORTED])
Expand All @@ -74,7 +74,7 @@ def update(self):
self.store.set(counter_state)

# Einzelregister lesen (dauert länger, bei sehr weit >100 auseinanderliegenden Registern sinnvoll)
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, device_id=unit)
self.peak_filter.check_values(power)
imported, exported = self.sim_counter.sim_count(power)

Expand Down
4 changes: 2 additions & 2 deletions docs/samples/sample_modbus/sample_modbus/inverter.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def update(self) -> None:
# read_input_registers_bulk benötigit als Parameter das Startregister, die Anzahl der Register,
# Register-Mapping und die Modbus-ID
resp = self.client.read_input_registers_bulk(
Register.CURRENT_L1, 70, mapping=self.REG_MAPPING, unit=self.id)
Register.CURRENT_L1, 70, mapping=self.REG_MAPPING, device_id=self.id)
_, exported = self.peak_filter.check_values(resp[Register.POWER], None, resp[Register.EXPORTED])
inverter_state = InverterState(
power=resp[Register.POWER],
Expand All @@ -62,7 +62,7 @@ def update(self) -> None:
self.store.set(inverter_state)

# Einzelregister lesen (dauert länger, bei sehr weit >100 auseinanderliegenden Registern sinnvoll)
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, device_id=unit)
self.peak_filter.check_values(power)
exported = self.sim_counter.sim_count(power)[1]

Expand Down
18 changes: 9 additions & 9 deletions packages/modbus_control_tester.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import logging
import struct
from typing import Optional
from pymodbus.client.sync import ModbusTcpClient
from pymodbus.client import ModbusTcpClient
import time
from modules.common import modbus
from modules.common.modbus import ModbusDataType
Expand Down Expand Up @@ -54,7 +54,7 @@ class ReadMode(Enum):


def heartbeat_read():
read_client.read_input_registers(10104, modbus.ModbusDataType.INT_16, unit=slave_id)
read_client.read_input_registers(10104, modbus.ModbusDataType.INT_16, device_id=slave_id)


def read_reg(register: int,
Expand All @@ -66,28 +66,28 @@ def read_reg(register: int,
if action == Actions.READ_NUMBER:
if read_mode == ReadMode.READ_INPUT_REG:
if length > 1:
resp = read_client.read_input_registers(register, [data_type]*length, unit=slave_id)
resp = read_client.read_input_registers(register, [data_type]*length, device_id=slave_id)
else:
resp = read_client.read_input_registers(register, data_type, unit=slave_id)
resp = read_client.read_input_registers(register, data_type, device_id=slave_id)
elif read_mode == ReadMode.READ_HOLDING_REG:
if length > 1:
resp = read_client.read_holding_registers(register, [data_type]*length, unit=slave_id)
resp = read_client.read_holding_registers(register, [data_type]*length, device_id=slave_id)
else:
resp = read_client.read_holding_registers(register, data_type, unit=slave_id)
resp = read_client.read_holding_registers(register, data_type, device_id=slave_id)
return resp
elif action == Actions.READ_STR:
if read_mode == ReadMode.READ_INPUT_REG:
resp = read_client.read_input_registers(register, [modbus.ModbusDataType.INT_16]*length, unit=slave_id)
resp = read_client.read_input_registers(register, [modbus.ModbusDataType.INT_16]*length, device_id=slave_id)
elif read_mode == ReadMode.READ_HOLDING_REG:
resp = read_client.read_holding_registers(
register, [modbus.ModbusDataType.INT_16]*length, unit=slave_id)
register, [modbus.ModbusDataType.INT_16]*length, device_id=slave_id)
string = ""
for word in resp:
string += struct.pack(">h", word).decode("utf-8")
return resp
elif action == Actions.WRITE_VALUE:
client = ModbusTcpClient(host, port=port)
client.write_registers(register, write_value, unit=slave_id)
client.write_registers(register, write_value, device_id=slave_id)
return None
except Exception:
log.exception("Fehler")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,16 +148,16 @@ def switch_phases(self, phases_to_use: int) -> None:
time.sleep(5)
if phases_to_use == 1:
self._client.client.delegate.write_register(
0x0001, 256, unit=self.ID_PHASE_SWITCH_UNIT)
0x0001, 256, device_id=self.ID_PHASE_SWITCH_UNIT)
time.sleep(1)
self._client.client.delegate.write_register(
0x0001, 512, unit=self.ID_PHASE_SWITCH_UNIT)
0x0001, 512, device_id=self.ID_PHASE_SWITCH_UNIT)
else:
self._client.client.delegate.write_register(
0x0002, 512, unit=self.ID_PHASE_SWITCH_UNIT)
0x0002, 512, device_id=self.ID_PHASE_SWITCH_UNIT)
time.sleep(1)
self._client.client.delegate.write_register(
0x0002, 256, unit=self.ID_PHASE_SWITCH_UNIT)
0x0002, 256, device_id=self.ID_PHASE_SWITCH_UNIT)
except AttributeError:
self._create_client()
self._validate_version()
Expand Down
16 changes: 8 additions & 8 deletions packages/modules/common/b23.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def get_serial_number(self) -> str:
# Modbus mapping version: 0x8910, 1 Register, only 2 bytes
data_type = ModbusDataType.UINT_32
time.sleep(0.1)
value = self.client.read_holding_registers(0x8900, data_type, unit=self.id)
value = self.client.read_holding_registers(0x8900, data_type, device_id=self.id)
return str(self.check_nan(value, value, data_type))

def get_currents(self) -> List[float]:
Expand All @@ -55,27 +55,27 @@ def get_currents(self) -> List[float]:
data_type = ModbusDataType.UINT_32
time.sleep(0.1)
return [self.check_nan(val, val / 100, data_type)
for val in self.client.read_holding_registers(0x5B0C, [data_type]*3, unit=self.id)]
for val in self.client.read_holding_registers(0x5B0C, [data_type]*3, device_id=self.id)]

def get_frequency(self) -> float:
"""Returns frequency in Hz.
"""
data_type = ModbusDataType.UINT_16
time.sleep(0.1)
raw_value = self.client.read_holding_registers(0x5B2C, data_type, unit=self.id)
raw_value = self.client.read_holding_registers(0x5B2C, data_type, device_id=self.id)
return self.check_nan(raw_value, raw_value / 100, data_type)

def get_imported(self) -> float:
"""Returns imported energy in Wh.
"""
data_type = ModbusDataType.UINT_64
time.sleep(0.1)
raw_value = self.client.read_holding_registers(0x5000, data_type, unit=self.id)
raw_value = self.client.read_holding_registers(0x5000, data_type, device_id=self.id)
return self.check_nan(raw_value, raw_value * 10, data_type)

def get_exported(self) -> float:
time.sleep(0.1)
return self.client.read_holding_registers(0x5004, ModbusDataType.UINT_64, unit=self.id) * 10
return self.client.read_holding_registers(0x5004, ModbusDataType.UINT_64, device_id=self.id) * 10

def get_power(self) -> Tuple[List[float], float]:
"""Returns power per phase and total power.
Expand All @@ -84,7 +84,7 @@ def get_power(self) -> Tuple[List[float], float]:
time.sleep(0.1)
# reading of total power and power per phase in one call
powers = [self.check_nan(val, val / 100, data_type)
for val in self.client.read_holding_registers(0x5B14, [data_type]*4, unit=self.id)]
for val in self.client.read_holding_registers(0x5B14, [data_type]*4, device_id=self.id)]
return powers[1:4], powers[0]

def get_power_factors(self) -> List[float]:
Expand All @@ -95,15 +95,15 @@ def get_power_factors(self) -> List[float]:
data_type = ModbusDataType.INT_16
time.sleep(0.1)
return [self.check_nan(val, val / 1000, data_type)
for val in self.client.read_holding_registers(0x5B3B, [data_type]*3, unit=self.id)]
for val in self.client.read_holding_registers(0x5B3B, [data_type]*3, device_id=self.id)]

def get_voltages(self) -> List[float]:
"""Returns voltages for all 3 phases.
"""
data_type = ModbusDataType.UINT_32
time.sleep(0.1)
values = [self.check_nan(val, val / 10, data_type)
for val in self.client.read_holding_registers(0x5B00, [data_type]*3, unit=self.id)]
for val in self.client.read_holding_registers(0x5B00, [data_type]*3, device_id=self.id)]
return values

def get_counter_state(self) -> CounterState:
Expand Down
18 changes: 9 additions & 9 deletions packages/modules/common/evse.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ def __init__(self, modbus_id: int, client: modbus.ModbusSerialClient_) -> None:
self.id = modbus_id
with client:
time.sleep(0.1)
self.version = self.client.read_holding_registers(1005, ModbusDataType.UINT_16, unit=self.id)
self.version = self.client.read_holding_registers(1005, ModbusDataType.UINT_16, device_id=self.id)
time.sleep(0.1)
self.max_current = self.client.read_holding_registers(2007, ModbusDataType.UINT_16, unit=self.id)
self.max_current = self.client.read_holding_registers(2007, ModbusDataType.UINT_16, device_id=self.id)
with ModifyLoglevelContext(log, logging.DEBUG):
log.debug(f"Firmware-Version der EVSE: {self.version}")
if self.version < 17:
Expand All @@ -50,7 +50,7 @@ def __init__(self, modbus_id: int, client: modbus.ModbusSerialClient_) -> None:
def get_plug_charge_state(self) -> Tuple[bool, bool, float]:
time.sleep(0.1)
raw_set_current, _, state_number = self.client.read_holding_registers(
1000, [ModbusDataType.UINT_16]*3, unit=self.id)
1000, [ModbusDataType.UINT_16]*3, device_id=self.id)
# remove leading zeros
self.evse_current = int(raw_set_current)
log.debug("Gesetzte Stromstärke EVSE: "+str(self.evse_current) +
Expand Down Expand Up @@ -78,7 +78,7 @@ def get_evse_state(self) -> EvseState:

def is_precise_current_active(self) -> bool:
time.sleep(0.1)
value = self.client.read_holding_registers(2005, ModbusDataType.UINT_16, unit=self.id)
value = self.client.read_holding_registers(2005, ModbusDataType.UINT_16, device_id=self.id)
with ModifyLoglevelContext(log, logging.DEBUG):
if value & self.PRECISE_CURRENT_BIT:
log.debug("Angabe der Ströme in 0,01A-Schritten ist aktiviert.")
Expand All @@ -89,23 +89,23 @@ def is_precise_current_active(self) -> bool:

def activate_precise_current(self) -> None:
time.sleep(0.1)
value = self.client.read_holding_registers(2005, ModbusDataType.UINT_16, unit=self.id)
value = self.client.read_holding_registers(2005, ModbusDataType.UINT_16, device_id=self.id)
if value & self.PRECISE_CURRENT_BIT:
return
else:
with ModifyLoglevelContext(log, logging.DEBUG):
log.debug("Bit zur Angabe der Ströme in 0,1A-Schritten wird gesetzt.")
self.client.write_register(2005, value ^ self.PRECISE_CURRENT_BIT, unit=self.id)
self.client.write_register(2005, value ^ self.PRECISE_CURRENT_BIT, device_id=self.id)
# Zeit zum Verarbeiten geben
time.sleep(1)

def deactivate_precise_current(self) -> None:
time.sleep(0.1)
value = self.client.read_holding_registers(2005, ModbusDataType.UINT_16, unit=self.id)
value = self.client.read_holding_registers(2005, ModbusDataType.UINT_16, device_id=self.id)
if value & self.PRECISE_CURRENT_BIT:
with ModifyLoglevelContext(log, logging.DEBUG):
log.debug("Bit zur Angabe der Ströme in 0,1A-Schritten wird zurueckgesetzt.")
self.client.write_register(2005, value ^ self.PRECISE_CURRENT_BIT, unit=self.id)
self.client.write_register(2005, value ^ self.PRECISE_CURRENT_BIT, device_id=self.id)
else:
return

Expand All @@ -118,4 +118,4 @@ def set_current(self, current: int, phases_in_use: Optional[int] = None) -> None
current = 16
formatted_current = round(current*100) if self._precise_current else round(current)
if self.evse_current != formatted_current:
self.client.write_register(1000, formatted_current, unit=self.id)
self.client.write_register(1000, formatted_current, device_id=self.id)
10 changes: 5 additions & 5 deletions packages/modules/common/lovato.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,29 +17,29 @@ def __init__(self, modbus_id: int, client: modbus.ModbusTcpClient_, fault_state:

def get_voltages(self) -> List[float]:
return [val / 100 for val in self.client.read_input_registers(
0x0001, [ModbusDataType.INT_32]*3, unit=self.id)]
0x0001, [ModbusDataType.INT_32]*3, device_id=self.id)]

def get_power(self) -> Tuple[List[float], float]:
powers = [val / 100 for val in self.client.read_input_registers(
0x0013, [ModbusDataType.INT_32]*3, unit=self.id
0x0013, [ModbusDataType.INT_32]*3, device_id=self.id
)]
power = sum(powers)
return powers, power

def get_power_factors(self) -> List[float]:
return [val / 10000 for val in self.client.read_input_registers(
0x0025, [ModbusDataType.INT_32]*3, unit=self.id)]
0x0025, [ModbusDataType.INT_32]*3, device_id=self.id)]

def get_frequency(self) -> float:
frequency = self.client.read_input_registers(0x0031, ModbusDataType.INT_32, unit=self.id) / 100
frequency = self.client.read_input_registers(0x0031, ModbusDataType.INT_32, device_id=self.id) / 100
if frequency > 100:
# needed if external measurement clamps connected
frequency = frequency / 10
return frequency

def get_currents(self) -> List[float]:
return [val / 10000 for val in self.client.read_input_registers(
0x0007, [ModbusDataType.INT_32]*3, unit=self.id)]
0x0007, [ModbusDataType.INT_32]*3, device_id=self.id)]

def get_counter_state(self) -> CounterState:
powers, power = self.get_power()
Expand Down
Loading
Loading