From b919a6796ceb2f54890488525938fbb8217fc188 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Sun, 5 Sep 2021 08:37:22 +0200 Subject: [PATCH 01/32] WIP --- .gitignore | 2 + EM24DINAV23XE1X-proxy-tcp.py | 303 +++++++++++++++++++++++++++++++++++ SE-MTR-3Y-400V-A.cmd | 2 + SE-MTR-3Y-400V-A.conf | 65 ++++++++ semp-tcp.py | 2 +- 5 files changed, 373 insertions(+), 1 deletion(-) create mode 100644 EM24DINAV23XE1X-proxy-tcp.py create mode 100644 SE-MTR-3Y-400V-A.cmd create mode 100644 SE-MTR-3Y-400V-A.conf diff --git a/.gitignore b/.gitignore index 6f7f2e5..c3d4e4c 100644 --- a/.gitignore +++ b/.gitignore @@ -104,3 +104,5 @@ venv.bak/ # mypy .mypy_cache/ +*.bak +out*.txt diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py new file mode 100644 index 0000000..b2d5bea --- /dev/null +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -0,0 +1,303 @@ +#!/usr/bin/env python3 + +import argparse +import configparser +import importlib +import logging +import sys +import threading +import time + +from pymodbus.server.sync import StartTcpServer +from pymodbus.constants import Endian +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.transaction import ModbusSocketFramer +from pymodbus.transaction import ModbusRtuFramer +from pymodbus.datastore import ModbusSlaveContext +from pymodbus.datastore import ModbusServerContext +from pymodbus.payload import BinaryPayloadBuilder + + +def t_update(ctx, stop, module, device, refresh): + + this_t = threading.currentThread() + logger = logging.getLogger() + + while not stop.is_set(): + try: + values = module.values(device) + + if not values: + logger.debug(f"{this_t.name}: no new values") + continue + + block_1001 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_1001.add_32bit_float(values.get("energy_active", 0)) # total active energy + block_1001.add_32bit_float(values.get("import_energy_active", 0)) # imported active energy + block_1001.add_32bit_float(values.get("energy_active", 0)) # total active energy non-reset + block_1001.add_32bit_float(values.get("import_energy_active", 0)) # imported active energy non-reset + block_1001.add_32bit_float(values.get("power_active", 0)) # total power + block_1001.add_32bit_float(values.get("p1_power_active", 0)) # power l1 + block_1001.add_32bit_float(values.get("p2_power_active", 0)) # power l2 + block_1001.add_32bit_float(values.get("p3_power_active", 0)) # power l3 + block_1001.add_32bit_float(values.get("voltage_ln", 0)) # l-n voltage + block_1001.add_32bit_float(values.get("p1n_voltage", 0)) # l1-n voltage + block_1001.add_32bit_float(values.get("p2n_voltage", 0)) # l2-n voltage + block_1001.add_32bit_float(values.get("p3n_voltage", 0)) # l3-n voltage + block_1001.add_32bit_float(values.get("voltage_ll", 0)) # l-l voltage + block_1001.add_32bit_float(values.get("p12_voltage", 0)) # l1-l2 voltage + block_1001.add_32bit_float(values.get("p23_voltage", 0)) # l2-l3 voltage + block_1001.add_32bit_float(values.get("p31_voltage", 0)) # l3-l1 voltage + block_1001.add_32bit_float(values.get("frequency", 0)) # line frequency + ctx.setValues(3, 1000, block_1001.to_registers()) + + block_1101 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_1101.add_32bit_float(values.get("p1_energy_active", 0)) # total active energy l1 + block_1101.add_32bit_float(values.get("p2_energy_active", 0)) # total active energy l2 + block_1101.add_32bit_float(values.get("p3_energy_active", 0)) # total active energy l3 + block_1101.add_32bit_float(values.get("p1_import_energy_active", 0)) # imported active energy l1 + block_1101.add_32bit_float(values.get("p2_import_energy_active", 0)) # imported active energy l2 + block_1101.add_32bit_float(values.get("p3_import_energy_active", 0)) # imported active energy l3 + block_1101.add_32bit_float(values.get("export_energy_active", 0)) # total exported active energy + block_1101.add_32bit_float(values.get("export_energy_active", 0)) # total exported active energy non-reset + block_1101.add_32bit_float(values.get("p1_export_energy_active", 0)) # exported energy l1 + block_1101.add_32bit_float(values.get("p2_export_energy_active", 0)) # exported energy l2 + block_1101.add_32bit_float(values.get("p3_export_energy_active", 0)) # exported energy l3 + block_1101.add_32bit_float(values.get("energy_reactive", 0)) # total reactive energy + block_1101.add_32bit_float(values.get("p1_energy_reactive", 0)) # reactive energy l1 + block_1101.add_32bit_float(values.get("p2_energy_reactive", 0)) # reactive energy l2 + block_1101.add_32bit_float(values.get("p3_energy_reactive", 0)) # reactive energy l3 + block_1101.add_32bit_float(values.get("energy_apparent", 0)) # total apparent energy + block_1101.add_32bit_float(values.get("p1_energy_apparent", 0)) # apparent energy l1 + block_1101.add_32bit_float(values.get("p2_energy_apparent", 0)) # apparent energy l2 + block_1101.add_32bit_float(values.get("p3_energy_apparent", 0)) # apparent energy l3 + block_1101.add_32bit_float(values.get("power_factor", 0)) # power factor + block_1101.add_32bit_float(values.get("p1_power_factor", 0)) # power factor l1 + block_1101.add_32bit_float(values.get("p2_power_factor", 0)) # power factor l2 + block_1101.add_32bit_float(values.get("p3_power_factor", 0)) # power factor l3 + block_1101.add_32bit_float(values.get("power_reactive", 0)) # total reactive power + block_1101.add_32bit_float(values.get("p1_power_reactive", 0)) # reactive power l1 + block_1101.add_32bit_float(values.get("p2_power_reactive", 0)) # reactive power l2 + block_1101.add_32bit_float(values.get("p3_power_reactive", 0)) # reactive power l3 + block_1101.add_32bit_float(values.get("power_apparent", 0)) # total apparent power + block_1101.add_32bit_float(values.get("p1_power_apparent", 0)) # apparent power l1 + block_1101.add_32bit_float(values.get("p2_power_apparent", 0)) # apparent power l2 + block_1101.add_32bit_float(values.get("p3_power_apparent", 0)) # apparent power l3 + block_1101.add_32bit_float(values.get("p1_current", 0)) # current l1 + block_1101.add_32bit_float(values.get("p2_current", 0)) # current l2 + block_1101.add_32bit_float(values.get("p3_current", 0)) # current l3 + block_1101.add_32bit_float(values.get("demand_power_active", 0)) # demand power + block_1101.add_32bit_float(values.get("minimum_demand_power_active", 0)) # minimum demand power + block_1101.add_32bit_float(values.get("maximum_demand_power_active", 0)) # maximum demand power + block_1101.add_32bit_float(values.get("demand_power_apparent", 0)) # apparent demand power + block_1101.add_32bit_float(values.get("p1_demand_power_active", 0)) # demand power l1 + block_1101.add_32bit_float(values.get("p2_demand_power_active", 0)) # demand power l2 + block_1101.add_32bit_float(values.get("p3_demand_power_active", 0)) # demand power l3 + ctx.setValues(3, 1100, block_1101.to_registers()) + except Exception as e: + logger.critical(f"{this_t.name}: {e}") + finally: + time.sleep(refresh) + + +if __name__ == "__main__": + argparser = argparse.ArgumentParser() + argparser.add_argument("-c", "--config", type=str, default="semp-tcp.conf") + argparser.add_argument("-v", "--verbose", action="store_true", default=False) + args = argparser.parse_args() + + default_config = { + "server": { + "address": "0.0.0.0", + "port": 502, + "framer": "socket", + "log_level": "INFO", + "meters": 'Meter1' + }, + "meters": { + "dst_address": 2, + "type": "generic", + "ct_current": 5, + "ct_inverted": 0, + "phase_offset": 120, + "serial_number": 987654, + "refresh_rate": 5 + } + } + + confparser = configparser.ConfigParser() + confparser.read(args.config) + + if not confparser.has_section("server"): + confparser["server"] = default_config["server"] + + log_handler = logging.StreamHandler(sys.stdout) + log_handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")) + + logger = logging.getLogger() + logger.setLevel(getattr(logging, confparser["server"].get("log_level", fallback=default_config["server"]["log_level"]).upper())) + logger.addHandler(log_handler) + + if args.verbose: + logger.setLevel(logging.DEBUG) + + slaves = {} + threads = [] + thread_stops = [] + + try: + if confparser.has_option("server", "meters"): + meters = [m.strip() for m in confparser["server"].get("meters", fallback=default_config["server"]["meters"]).split(',')] + + for meter in meters: + address = confparser[meter].getint("dst_address", fallback=default_config["meters"]["dst_address"]) + meter_type = confparser[meter].get("type", fallback=default_config["meters"]["type"]) + meter_module = importlib.import_module(f"devices.{meter_type}") + meter_device = meter_module.device(confparser[meter]) + + slave_ctx = ModbusSlaveContext() + + block_0x0000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + + block_0x0000.add_32bit_int( 1), #0001 0000h 2 V L1-N INT32 Value weight: Volt*10 N/A 1.0 + block_0x0000.add_32bit_int( 3), #0003 0002h 2 V L2-N INT32 N/A 1.0 + block_0x0000.add_32bit_int( 5), #0005 0004h 2 V L3-N INT32 N/A 1.0 + block_0x0000.add_32bit_int( 7), #0007 0006h 2 V L1-L2 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 9), #0009 0008h 2 V L2-L3 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 11), #0011 000Ah 2 V L3-L1 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 13), #0013 000Ch 2 A L1 INT32 Value weight: Ampere*1000 N/A 1.0 + block_0x0000.add_32bit_int( 15), #0015 000Eh 2 A L2 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 17), #0017 0010h 2 A L3 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 19), #0019 0012h 2 W L1 INT32 Value weight: Watt*10 N/A 1.0 + block_0x0000.add_32bit_int( 21), #0021 0014h 2 W L2 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 23), #0023 0016h 2 W L3 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 25), #0025 0018h 2 VA L1 INT32 Value weight: VA*10 N/A 1.0 + block_0x0000.add_32bit_int( 27), #0027 001Ah 2 VA L2 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 29), #0029 001Ch 2 VA L3 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 31), #0031 001Eh 2 VAR L1 INT32 Value weight: var*10 N/A 1.0 + block_0x0000.add_32bit_int( 33), #0033 0020h 2 VAR L2 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 35), #0035 0022h 2 VAR L3 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 37), #0037 0024h 2 V L-N ? INT32 Value weight: Volt*10 N/A 1.0 + block_0x0000.add_32bit_int( 39), #0039 0026h 2 V L-L ? INT32 N/A 1.0 + block_0x0000.add_32bit_int( 41), #0041 0028h 2 W ? INT32 Value weight: Watt*10 N/A 1.0 + block_0x0000.add_32bit_int( 43), #0043 002Ah 2 VA ? INT32 Value weight: VA*10 N/A 1.0 + block_0x0000.add_32bit_int( 45), #0045 002Ch 2 VAR ? INT32 Value weight: var*10 N/A 1.0 + block_0x0000.add_16bit_int( 47), #0047 002Eh 1 PF L1 INT16 Negative values correspond to lead(C), positive value correspond to lag(L) Value weight: PF*1000 N/A 1.0 + block_0x0000.add_16bit_int( 48), #0048 002Fh 1 PF L2 INT16 N/A 1.0 + block_0x0000.add_16bit_int( 49), #0049 0030h 1 PF L3 INT16 N/A 1.0 + block_0x0000.add_16bit_int( 50), #0050 0031h 1 PF ? INT16 N/A 1.0 + block_0x0000.add_16bit_int( 51), #0051 0032h 1 Phase sequence INT16 Value �1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) N/A 1.0 + block_0x0000.add_16bit_uint( 52),#0052 0033h 1 Hz UINT16 Value weight: Hz*10 N/A 1.0 + block_0x0000.add_32bit_int( 53), #0053 0034h 2 KWh(+) TOT INT32 Value weight: kWh*10 N/A 1.0 + block_0x0000.add_32bit_int( 55), #0055 0036h 2 Kvarh(+) TOT INT32 Value weight: kvarh*10 N/A 1.0 + block_0x0000.add_32bit_int( 57), #0057 0038h 2 DMD W ? INT32 Value weight: Watt*10 N/A 1.0 + block_0x0000.add_32bit_int( 59), #0059 003Ah 2 DMD W ? max INT32 Value weight: Watt*10 N/A 1.0 + block_0x0000.add_32bit_int( 61), #0061 003Ch 2 KWh(+) PAR INT32 Value weight: kWh*10 N/A 1.0 + block_0x0000.add_32bit_int( 63), #0063 003Eh 2 Kvarh(+) PAR INT32 Value weight: kvarh*10 N/A 1.0 + block_0x0000.add_32bit_int( 65), #0065 0040h 2 KWh(+) L1 INT32 Value weight: kWh*10 N/A 1.0 + block_0x0000.add_32bit_int( 67), #0067 0042h 2 KWh(+) L2 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 69), #0069 0044h 2 KWh(+) L3 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 71), #0071 0046h 2 KWh(+) T1 INT32 Value weight: kWh*10 N/A 1.0 + block_0x0000.add_32bit_int( 73), #0073 0048h 2 KWh(+) T2 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 75), #0075 004Ah 2 KWh(+) T3 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 77), #0077 004Ch 2 KWh(+) T4 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 79), #0079 004Eh 2 KWh(-) TOT INT32 Value weight: kWh*10 N/A 1.0 + block_0x0000.add_32bit_int( 81), #0081 0050h 2 Kvarh(-) TOT INT32 Value weight: kvarh*10 N/A 1.0 + block_0x0000.add_16bit_int( 83), #0083 1 unused + block_0x0000.add_16bit_int( 84), #0084 1 unused + block_0x0000.add_16bit_int( 85), #0085 1 unused + block_0x0000.add_16bit_int( 86), #0086 1 unused + block_0x0000.add_16bit_int( 87), #0087 1 unused + block_0x0000.add_16bit_int( 88), #0088 1 unused + block_0x0000.add_16bit_int( 89), #0089 1 unused + block_0x0000.add_16bit_int( 90), #0090 1 unused + block_0x0000.add_32bit_int( 91), #0091 005Ah 2 Hour INT32 Value weight: hour*100 N/A 1.0 + block_0x0000.add_16bit_int( 93), #0093 1 unused + block_0x0000.add_16bit_int( 94), #0094 1 unused + block_0x0000.add_16bit_int( 95), #0095 1 unused + block_0x0000.add_16bit_int( 96), #0096 1 unused + block_0x0000.add_16bit_int( 97), #0096 1 unused + block_0x0000.add_16bit_int( 98), #0097 1 unused + block_0x0000.add_16bit_int( 99), #0098 1 unused + block_0x0000.add_16bit_int( 101), #0099 1 unused + block_0x0000.add_16bit_int( 102), #0100 1 unused + block_0x0000.add_16bit_int( 103), #0101 1 unused + block_0x0000.add_16bit_int( 104), #0102 1 unused + block_0x0000.add_16bit_int( 105), #0103 1 unused + block_0x0000.add_16bit_int( 106), #0104 1 unused + block_0x0000.add_16bit_int( 107), #0105 1 unused + block_0x0000.add_16bit_int( 108), #0106 1 unused + block_0x0000.add_16bit_int( 109), #0107 1 unused + block_0x0000.add_16bit_int( 110), #0108 1 unused + block_0x0000.add_16bit_int( 110), #0109 1 unused + block_0x0000.add_16bit_int( 110), #0110 1 unused + block_0x0000.add_32bit_int( 111), #0111 006Eh 2 Kvarh(+) T1 INT32 Value weight: kvarh*10 N/A 1.0 + block_0x0000.add_32bit_int( 113), #0113 0070h 2 Kvarh(+) T2 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 115), #0115 0072h 2 Kvarh(+) T3 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 117), #0117 0074h 2 Kvarh(+) T4 INT32 N/A 1.0 + block_0x0000.add_32bit_int( 119), #0119 0076h 2 DMD VA ? INT32 Value weight: VA*10 N/A 1.0 + block_0x0000.add_32bit_int( 121), #0121 0078h 2 DMD VA ? max INT32 Value weight: VA*10 N/A 1.0 + block_0x0000.add_32bit_int( 123), #0123 007Ah 2 DMD A max INT32 Value weight: Ampere*1000 N/A 1.0 + + slave_ctx.setValues(3, 0x0000, block_0x0000.to_registers()) + + block_0x000B = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_0x000B.add_16bit_int(1648), #0012 000Bh 1 Carlo Gavazzi identification code UINT 16 For a valid request, length must be 1, otherwise the request is forwarded to instantaneous variables + # EM24DINAV23XE1X 1648 (0x670) + slave_ctx.setValues(3, 0x000B, block_0x000B.to_registers()) + + update_t_stop = threading.Event() + update_t = threading.Thread( + target=t_update, + name=f"t_update_{address}", + args=( + slave_ctx, + update_t_stop, + meter_module, + meter_device, + confparser[meter].getint("refresh_rate", fallback=default_config["meters"]["refresh_rate"]) + ) + ) + + threads.append(update_t) + thread_stops.append(update_t_stop) + + slaves.update({address: slave_ctx}) + logger.info(f"Created {update_t}: {meter} {meter_type} {meter_device}") + + if not slaves: + logger.warning(f"No meters defined in {args.config}") + + config_framer = confparser["server"].get("framer", fallback=default_config["server"]["framer"]) + framer = False + + if config_framer == "socket": + framer = ModbusSocketFramer + elif config_framer == "rtu": + framer = ModbusRtuFramer + + identity = ModbusDeviceIdentification() + server_ctx = ModbusServerContext(slaves=slaves, single=False) + + time.sleep(1) + + for t in threads: + t.start() + logger.info(f"Starting {t}") + + StartTcpServer( + server_ctx, + framer=framer, + identity=identity, + address=( + confparser["server"].get("address", fallback=default_config["server"]["address"]), + confparser["server"].getint("port", fallback=default_config["server"]["port"]) + ) + ) + except KeyboardInterrupt: + pass + finally: + for t_stop in thread_stops: + t_stop.set() + for t in threads: + t.join() diff --git a/SE-MTR-3Y-400V-A.cmd b/SE-MTR-3Y-400V-A.cmd new file mode 100644 index 0000000..4197185 --- /dev/null +++ b/SE-MTR-3Y-400V-A.cmd @@ -0,0 +1,2 @@ +echo use -v for more information +python EM24DINAV23XE1X-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf $* \ No newline at end of file diff --git a/SE-MTR-3Y-400V-A.conf b/SE-MTR-3Y-400V-A.conf new file mode 100644 index 0000000..6c08caf --- /dev/null +++ b/SE-MTR-3Y-400V-A.conf @@ -0,0 +1,65 @@ +[server] +# Serving IP address. +# optional, default: all interfaces +address=0.0.0.0 +# ip-address=0.0.0.0 +# ip_address=0.0.0.0 + +# Serving port. +# optional, default: 5502 +port = 502 + +# Modbus frame type, set to rtu for Modbus RTU over TCP +# optional, default: socket +#framer = socket + +# Logging level, CRITICAL, ERROR, WARNING, INFO, DEBUG +# optional, default: INFO +log_level = INFO + +# Masqueraded meters, comma separated. +# optional, default: '' +meters = SE-MTR-3Y-400V-A + +[SE-MTR-3Y-400V-A] +type=SE-MTR-3Y-400V-A +host=solaredge.fritz.box +port=502 +src_address=2 +dst_address=2 + + +# Meters defined in [server] need a config section, one per meter. +# Depending on the type of meter that is to be masqueraded, you can +# define a number of generic and type specific variables. + +# Modbus address of the meter as defined in the SolarEdge inverter. +# This value needs to be unique. +# optional, default: 2 +#dst_address = 2 + +# Source meter type, which corresponds to a script in /devices. +# The generic.py device returns null values. +# optional, default: generic +#type = generic + +# Masqueraded serial number. +# Need not be correct, must be unique, must be an integer. +# optional, default: 987654 +#serial_number = 987654 + +# Current transformer amperage rating. +# optional, default: 5 +#ct_current = 50 + +# Current transformer direction inversion, set to 1 if required. +# optional, default: 0 +#ct_inverted = 0 + +# Offset between phases, set to 0, 90, 120 or 180. +# optional, default: 0 +#phase_offset = 120 + +# Number of seconds between value refreshes. +# optional, default: 5 +#refresh_rate = 5 diff --git a/semp-tcp.py b/semp-tcp.py index d327145..80ddf41 100755 --- a/semp-tcp.py +++ b/semp-tcp.py @@ -112,7 +112,7 @@ def t_update(ctx, stop, module, device, refresh): "port": 5502, "framer": "socket", "log_level": "INFO", - "meters": '' + "meters": 'Meter1' }, "meters": { "dst_address": 2, From c8ecd12f00aeb3bcdcb39588ee106516db8ce79c Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 8 Sep 2021 01:00:16 +0200 Subject: [PATCH 02/32] send Gavazzi model number on address 11 --- EM24DINAV23XE1X-proxy-tcp.py | 16 ++++++++++------ SE-MTR-3Y-400V-A.cmd | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index b2d5bea..b33a75d 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -18,6 +18,14 @@ from pymodbus.payload import BinaryPayloadBuilder +class EM24SlaveContext(ModbusSlaveContext): + def getValues(self, fx, address, count=1): + if (address == 11 and count==1): + print("Return Gavazzi Model number 1648") + return [1648] + return super().getValues(fx, address, count) + + def t_update(ctx, stop, module, device, refresh): this_t = threading.currentThread() @@ -155,7 +163,8 @@ def t_update(ctx, stop, module, device, refresh): meter_module = importlib.import_module(f"devices.{meter_type}") meter_device = meter_module.device(confparser[meter]) - slave_ctx = ModbusSlaveContext() + slave_ctx = EM24SlaveContext() + # slave_ctx = ModbusSlaveContext() block_0x0000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) @@ -241,11 +250,6 @@ def t_update(ctx, stop, module, device, refresh): slave_ctx.setValues(3, 0x0000, block_0x0000.to_registers()) - block_0x000B = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_0x000B.add_16bit_int(1648), #0012 000Bh 1 Carlo Gavazzi identification code UINT 16 For a valid request, length must be 1, otherwise the request is forwarded to instantaneous variables - # EM24DINAV23XE1X 1648 (0x670) - slave_ctx.setValues(3, 0x000B, block_0x000B.to_registers()) - update_t_stop = threading.Event() update_t = threading.Thread( target=t_update, diff --git a/SE-MTR-3Y-400V-A.cmd b/SE-MTR-3Y-400V-A.cmd index 4197185..9a402a5 100644 --- a/SE-MTR-3Y-400V-A.cmd +++ b/SE-MTR-3Y-400V-A.cmd @@ -1,2 +1,2 @@ echo use -v for more information -python EM24DINAV23XE1X-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf $* \ No newline at end of file +python EM24DINAV23XE1X-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf %* \ No newline at end of file From b57bef95b66b3dc0c8b4e82d2afdb82a5af0442e Mon Sep 17 00:00:00 2001 From: ixtrader Date: Mon, 4 Oct 2021 01:00:55 +0200 Subject: [PATCH 03/32] =?UTF-8?q?SE7K=20l=C3=A4uft=20testweise=20im=20debu?= =?UTF-8?q?gger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...py => EM24DINAV23XE1X-proxy-tcp - Kopie.py | 0 SE-MTR-3Y-400V-A.sh | 3 + SE7K-proxy-tcp.cmd | 2 + SE7K-proxy-tcp.py | 357 ++++++++++++++++++ SE7K.conf | 65 ++++ devices/sdm630.py | 2 + devices/solaredge-inverter.py | 92 +++++ 7 files changed, 521 insertions(+) rename EM24DINAV23XE1X-proxy-tcp.py => EM24DINAV23XE1X-proxy-tcp - Kopie.py (100%) create mode 100644 SE-MTR-3Y-400V-A.sh create mode 100644 SE7K-proxy-tcp.cmd create mode 100644 SE7K-proxy-tcp.py create mode 100644 SE7K.conf create mode 100644 devices/solaredge-inverter.py diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp - Kopie.py similarity index 100% rename from EM24DINAV23XE1X-proxy-tcp.py rename to EM24DINAV23XE1X-proxy-tcp - Kopie.py diff --git a/SE-MTR-3Y-400V-A.sh b/SE-MTR-3Y-400V-A.sh new file mode 100644 index 0000000..161d799 --- /dev/null +++ b/SE-MTR-3Y-400V-A.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo use -v for more information +python EM24DINAV23XE1X-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf $* \ No newline at end of file diff --git a/SE7K-proxy-tcp.cmd b/SE7K-proxy-tcp.cmd new file mode 100644 index 0000000..146c8b8 --- /dev/null +++ b/SE7K-proxy-tcp.cmd @@ -0,0 +1,2 @@ +echo use -v for more information +python SE7K-proxy-tcp.py -c SE7K.conf %* \ No newline at end of file diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py new file mode 100644 index 0000000..e1fb9af --- /dev/null +++ b/SE7K-proxy-tcp.py @@ -0,0 +1,357 @@ +#!/usr/bin/env python3 + +import argparse +import configparser +import importlib +import logging +import sys +import threading +import time + +from pymodbus.server.sync import StartTcpServer +from pymodbus.constants import Endian +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.transaction import ModbusSocketFramer +from pymodbus.transaction import ModbusRtuFramer +from pymodbus.datastore import ModbusSlaveContext +from pymodbus.datastore import ModbusServerContext +from pymodbus.payload import BinaryPayloadBuilder + + +class EM24SlaveContext(ModbusSlaveContext): + def getValues(self, fx, address, count=1): + #if (address == 11 and count==1): + # print("Return Gavazzi Model number 1648") + # return [1648] + return super().getValues(fx, address, count) + + +def setMeterValues(values, block): + if not values: + block.add_16bit_uint(0) + block.add_16bit_uint(0) + + block.add_16bit_uint(1) + block.add_16bit_uint(65) + block.add_string (values.get("c_manufacturer" ,"12345678901234567890123456789012")) + block.add_string (values.get("c_model" ,"12345678901234567890123456789012")) + block.add_string (values.get("c_option" ,"1234567890123456")) + block.add_string (values.get("c_version" ,"1234567890123456")) + block.add_string (values.get("c_serialnumber" ,"12345678901234567890123456789012")) + block.add_16bit_int (values.get("c_deviceaddress" , 0)) + + block.add_16bit_int (values.get("c_sunspec_did" , 103)) + block.add_16bit_int (values.get("c_sunspec_length", 50)) + block.add_16bit_uint(values.get("current" , 0)) + block.add_16bit_uint(values.get("p1_current" , 0)) + block.add_16bit_uint(values.get("p2_current" , 0)) + block.add_16bit_uint(values.get("p3_current" , 0)) + block.add_16bit_int (values.get("current_scale" , 0)) + + block.add_16bit_uint(values.get("voltage_ln" , 0)) + block.add_16bit_uint(values.get("p1n_voltage" , 0)) + block.add_16bit_uint(values.get("p2n_voltage" , 0)) + block.add_16bit_uint(values.get("p3n_voltage" , 0)) + block.add_16bit_uint(values.get("voltage_ll" , 0)) + block.add_16bit_uint(values.get("p1n_voltage" , 0)) + block.add_16bit_uint(values.get("p2n_voltage" , 0)) + block.add_16bit_uint(values.get("p3n_voltage" , 0)) + block.add_16bit_int (values.get("voltage_scale" , 0)) + + block.add_16bit_uint(values.get("frequency" , 0)) + block.add_16bit_int (values.get("frequency_scale" , 0)) + + block.add_16bit_int(values.get("power" , 0)) + block.add_16bit_int(values.get("p1_power" , 0)) + block.add_16bit_int(values.get("p2_power" , 0)) + block.add_16bit_int(values.get("p3_power" , 0)) + block.add_16bit_int (values.get("power_scale" , 0)) + + block.add_16bit_int(values.get("power_apparent" , 0)) + block.add_16bit_int(values.get("p1_power_apparent" , 0)) + block.add_16bit_int(values.get("p2_power_apparent" , 0)) + block.add_16bit_int(values.get("p3_power_apparent" , 0)) + block.add_16bit_int (values.get("power_apparent_scale" , 0)) + + block.add_16bit_int(values.get("power_reactive" , 0)) + block.add_16bit_int(values.get("p1_power_reactive" , 0)) + block.add_16bit_int(values.get("p2_power_reactive" , 0)) + block.add_16bit_int(values.get("p3_power_reactive" , 0)) + block.add_16bit_int (values.get("power_reactive_scale" , 0)) + + block.add_16bit_int(values.get("power_factor" , 0)) + block.add_16bit_int(values.get("p1_power_factor" , 0)) + block.add_16bit_int(values.get("p2_power_factor" , 0)) + block.add_16bit_int(values.get("p3_power_factor" , 0)) + block.add_16bit_int (values.get("power_factor_scale" , 0)) + + block.add_32bit_uint(values.get("export_energy_active" , 0)) + block.add_32bit_uint(values.get("p1_export_energy_active" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_active" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_active" , 0)) + block.add_32bit_uint(values.get("import_energy_active" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_active" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_active" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_active" , 0)) + block.add_16bit_int (values.get("energy_active_scale" , 0)) + + block.add_32bit_uint(values.get("export_energy_apparent", 0)) + block.add_32bit_uint(values.get("p1_export_energy_apparent" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_apparent" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_apparent" , 0)) + block.add_32bit_uint(values.get("import_energy_apparent" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_apparent" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_apparent" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_apparent" , 0)) + block.add_16bit_int (values.get("energy_apparent_scale" , 0)) + + block.add_32bit_uint(values.get("import_energy_reactive_q1" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_reactive_q1" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_reactive_q1" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_reactive_q1" , 0)) + block.add_32bit_uint(values.get("import_energy_reactive_q2" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_reactive_q2" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_reactive_q2" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_reactive_q2" , 0)) + block.add_32bit_uint(values.get("export_energy_reactive_q3" , 0)) + block.add_32bit_uint(values.get("p1_export_energy_reactive_q3" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_reactive_q3" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_reactive_q3" , 0)) + block.add_32bit_uint(values.get("export_energy_reactive_q4" , 0)) + block.add_32bit_uint(values.get("p1_export_energy_reactive_q4" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_reactive_q4" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_reactive_q4" , 0)) + block.add_16bit_int (values.get("energy_reactive_scale" , 0)) + + block.add_32bit_uint(values.get("events" , 0)) + # + + +def setBatteryValues(values, block): + if not values: + block.add_16bit_uint(0) + block.add_16bit_uint(0) + + block.add_16bit_uint(1) ## TODO set correct values + block.add_16bit_uint(65) ## TODO set correct values + +def t_update(ctx, stop, module, device, refresh): + + this_t = threading.currentThread() + logger = logging.getLogger() + + while not stop.is_set(): + try: + values = module.values(device) + + if not values: + logger.debug(f"{this_t.name}: no new values") + continue + + block_1001 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + + + block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_40000.add_string("SunS") + block_40000.add_16bit_int(1) + block_40000.add_16bit_int (values.get("C_SunSpec_Length", 65)) + block_40000.add_string (values.get("c_manufacturer" ,"12345678901234567890123456789012")) + block_40000.add_string (values.get("c_model" ,"12345678901234567890123456789012")) + block_40000.add_string ( "NOT_IMPLEMENTED.") + block_40000.add_string (values.get("c_version" ,"1234567890123456")) + block_40000.add_string (values.get("c_serialnumber" ,"12345678901234567890123456789012")) + block_40000.add_16bit_int (values.get("c_deviceaddress" , 0)) + + block_40000.add_16bit_int (values.get("c_sunspec_did" , 103)) + block_40000.add_16bit_int (50) + block_40000.add_16bit_uint(values.get("current" , 0)) + block_40000.add_16bit_uint(values.get("p1_current" , 0)) + block_40000.add_16bit_uint(values.get("p2_current" , 0)) + block_40000.add_16bit_uint(values.get("p3_current" , 0)) + block_40000.add_16bit_int (values.get("current_scale" , 0)) + + block_40000.add_16bit_uint(values.get("p1_voltage" , 0)) + block_40000.add_16bit_uint(values.get("p2_voltage" , 0)) + block_40000.add_16bit_uint(values.get("p3_voltage" , 0)) + block_40000.add_16bit_uint(values.get("p1n_voltage" , 0)) + block_40000.add_16bit_uint(values.get("p2n_voltage" , 0)) + block_40000.add_16bit_uint(values.get("p3n_voltage" , 0)) + block_40000.add_16bit_int (values.get("voltage_scale" , 0)) + + block_40000.add_16bit_uint(values.get("power_ac" , 0)) + block_40000.add_16bit_int (values.get("power_ac_scale" , 0)) + + block_40000.add_16bit_uint(values.get("frequency" , 0)) + block_40000.add_16bit_int (values.get("frequency_scale" , 0)) + + + block_40000.add_16bit_uint(values.get("power_apparent" , 0)) + block_40000.add_16bit_int (values.get("power_apparent_scale" , 0)) + + block_40000.add_16bit_uint(values.get("power_reactive" , 0)) + block_40000.add_16bit_int (values.get("power_reactive_scale" , 0)) + + block_40000.add_16bit_uint(values.get("power_factor" , 0)) + block_40000.add_16bit_int (values.get("power_factor_scale" , 0)) + + block_40000.add_32bit_uint(values.get("energy_total" , 0)) + block_40000.add_16bit_int (values.get("energy_total_scale" , 0)) + + block_40000.add_16bit_uint(values.get("current_dc" , 0)) + block_40000.add_16bit_int (values.get("current_dc_scale" , 0)) + + block_40000.add_16bit_uint(values.get("voltage_dc" , 0)) + block_40000.add_16bit_int (values.get("voltage_dc_scale" , 0)) + + block_40000.add_16bit_uint(values.get("power_dc" , 0)) + block_40000.add_16bit_int (values.get("power_dc_scale" , 0)) + + block_40000.add_16bit_uint(values.get("temperature" , 0)) + block_40000.add_16bit_int (values.get("temperature_scale" , 0)) + + block_40000.add_16bit_uint(values.get("status" , 0)) + block_40000.add_16bit_uint(values.get("vendor_status" , 0)) + + block_40000.add_16bit_uint(values.get("rrcr_state" , 0)) + block_40000.add_16bit_uint(values.get("active_power_limit" , 0)) + block_40000.add_32bit_float(values.get("cosphi" , 0)) + + block_40000.add_string("123456789012345678901234") # 12 dummy worter = 24 Byte + ctx.setValues(3, 40000, block_40000.to_registers()) + + block_40121 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + setMeterValues(values["meters"]["Meter1"],block_40121) + + ctx.setValues(3, 40121, block_40121.to_registers()) + block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + ctx.setValues(3, 40295, block_40295.to_registers()) + block_40469 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + ctx.setValues(3, 40469, block_40469.to_registers()) + + block_57598 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + ctx.setValues(3, 57598, block_57598.to_registers()) + block_57854 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + ctx.setValues(3, 57854, block_57854.to_registers()) + + except Exception as e: + logger.critical(f"{this_t.name}: {e}") + finally: + time.sleep(refresh) + + +if __name__ == "__main__": + argparser = argparse.ArgumentParser() + argparser.add_argument("-c", "--config", type=str, default="semp-tcp.conf") + argparser.add_argument("-v", "--verbose", action="store_true", default=False) + args = argparser.parse_args() + + default_config = { + "server": { + "address": "0.0.0.0", + "port": 502, + "framer": "socket", + "log_level": "INFO", + "meters": 'Meter1' + }, + "meters": { + "dst_address": 2, + "type": "generic", + "ct_current": 5, + "ct_inverted": 0, + "phase_offset": 120, + "serial_number": 987654, + "refresh_rate": 2 + } + } + + confparser = configparser.ConfigParser() + confparser.read(args.config) + + if not confparser.has_section("server"): + confparser["server"] = default_config["server"] + + log_handler = logging.StreamHandler(sys.stdout) + log_handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")) + + logger = logging.getLogger() + logger.setLevel(getattr(logging, confparser["server"].get("log_level", fallback=default_config["server"]["log_level"]).upper())) + logger.addHandler(log_handler) + + if args.verbose: + logger.setLevel(logging.DEBUG) + + slaves = {} + threads = [] + thread_stops = [] + + try: + if confparser.has_option("server", "meters"): + meters = [m.strip() for m in confparser["server"].get("meters", fallback=default_config["server"]["meters"]).split(',')] + + for meter in meters: + address = confparser[meter].getint("dst_address", fallback=default_config["meters"]["dst_address"]) + meter_type = confparser[meter].get("type", fallback=default_config["meters"]["type"]) + meter_module = importlib.import_module(f"devices.{meter_type}") + meter_device = meter_module.device(confparser[meter]) + + #slave_ctx = EM24SlaveContext() + slave_ctx = ModbusSlaveContext() + + block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + slave_ctx.setValues(3, 40000, block_40000.to_registers()) + + update_t_stop = threading.Event() + update_t = threading.Thread( + target=t_update, + name=f"t_update_{address}", + args=( + slave_ctx, + update_t_stop, + meter_module, + meter_device, + confparser[meter].getint("refresh_rate", fallback=default_config["meters"]["refresh_rate"]) + ) + ) + + threads.append(update_t) + thread_stops.append(update_t_stop) + + slaves.update({address: slave_ctx}) + logger.info(f"Created {update_t}: {meter} {meter_type} {meter_device}") + + if not slaves: + logger.warning(f"No meters defined in {args.config}") + + config_framer = confparser["server"].get("framer", fallback=default_config["server"]["framer"]) + framer = False + + if config_framer == "socket": + framer = ModbusSocketFramer + elif config_framer == "rtu": + framer = ModbusRtuFramer + + identity = ModbusDeviceIdentification() + server_ctx = ModbusServerContext(slaves=slaves, single=False) + + time.sleep(1) + + for t in threads: + t.start() + logger.info(f"Starting {t}") + + StartTcpServer( + server_ctx, + framer=framer, + identity=identity, + address=( + confparser["server"].get("address", fallback=default_config["server"]["address"]), + confparser["server"].getint("port", fallback=default_config["server"]["port"]) + ) + ) + except KeyboardInterrupt: + pass + finally: + for t_stop in thread_stops: + t_stop.set() + for t in threads: + t.join() diff --git a/SE7K.conf b/SE7K.conf new file mode 100644 index 0000000..9fd51b8 --- /dev/null +++ b/SE7K.conf @@ -0,0 +1,65 @@ +[server] +# Serving IP address. +# optional, default: all interfaces +address=0.0.0.0 +# ip-address=0.0.0.0 +# ip_address=0.0.0.0 + +# Serving port. +# optional, default: 5502 +port = 502 + +# Modbus frame type, set to rtu for Modbus RTU over TCP +# optional, default: socket +#framer = socket + +# Logging level, CRITICAL, ERROR, WARNING, INFO, DEBUG +# optional, default: INFO +log_level = INFO + +# Masqueraded meters, comma separated. +# optional, default: '' +meters = SE7K + +[SE7K] +type=solaredge-inverter +host=solaredge.fritz.box +port=502 +src_address=2 +dst_address=2 + + +# Meters defined in [server] need a config section, one per meter. +# Depending on the type of meter that is to be masqueraded, you can +# define a number of generic and type specific variables. + +# Modbus address of the meter as defined in the SolarEdge inverter. +# This value needs to be unique. +# optional, default: 2 +#dst_address = 2 + +# Source meter type, which corresponds to a script in /devices. +# The generic.py device returns null values. +# optional, default: generic +#type = generic + +# Masqueraded serial number. +# Need not be correct, must be unique, must be an integer. +# optional, default: 987654 +#serial_number = 987654 + +# Current transformer amperage rating. +# optional, default: 5 +#ct_current = 50 + +# Current transformer direction inversion, set to 1 if required. +# optional, default: 0 +#ct_inverted = 0 + +# Offset between phases, set to 0, 90, 120 or 180. +# optional, default: 0 +#phase_offset = 120 + +# Number of seconds between value refreshes. +# optional, default: 5 +refresh_rate = 2 diff --git a/devices/sdm630.py b/devices/sdm630.py index 6be3ef3..005351c 100644 --- a/devices/sdm630.py +++ b/devices/sdm630.py @@ -70,6 +70,8 @@ def values(device): logger.debug(f"values: {values}") + + return { "energy_active": values.get("total_energy_active", 0), "import_energy_active": values.get("import_energy_active", 0), diff --git a/devices/solaredge-inverter.py b/devices/solaredge-inverter.py new file mode 100644 index 0000000..0d59dc3 --- /dev/null +++ b/devices/solaredge-inverter.py @@ -0,0 +1,92 @@ +import logging + +import solaredge_modbus + + +def device(config): + + # Configuration parameters: + # + # timeout seconds to wait for a response, default: 1 + # retries number of retries, default: 3 + # unit modbus address, default: 1 + # + # For Modbus TCP: + # host ip or hostname + # port modbus tcp port + # + # For Modbus RTU: + # device serial device, e.g. /dev/ttyUSB0 + # stopbits number of stop bits + # parity parity setting, N, E or O + # baud baud rate + + timeout = config.getint("timeout", fallback=1) + retries = config.getint("retries", fallback=3) + unit = config.getint("src_address", fallback=1) + + host = config.get("host", fallback=False) + port = config.getint("port", fallback=False) + device = config.get("device", fallback=False) + + if device: + stopbits = config.getint("stopbits", fallback=1) + parity = config.get("parity", fallback="N") + baud = config.getint("baud", fallback=2400) + + if (parity + and parity.upper() in ["N", "E", "O"]): + parity = parity.upper() + else: + parity = False + + return solaredge_modbus.Inverter( + device=device, + stopbits=stopbits, + parity=parity, + baud=baud, + timeout=timeout, + retries=retries, + unit=unit + ) + else: + return solaredge_modbus.Inverter( + host=host, + port=port, + timeout=timeout, + retries=retries, + unit=unit + ) + + +def values(device): + if not device: + return {} + + logger = logging.getLogger() + logger.debug(f"device: {device}") + + values = {} + values = device.read_all() + meters = device.meters() + batteries = device.batteries() + values["meters"] = {} + values["batteries"] = {} + + for meter, params in meters.items(): + meter_values = params.read_all() + values["meters"][meter] = meter_values + + for battery, params in batteries.items(): + battery_values = params.read_all() + values["batteries"][battery] = battery_values + + logger.debug(f"values: {values}") + + + for battery, params in batteries.items(): + battery_values = params.read_all() + values["batteries"][battery] = battery_values + + return values + From 77547db95034aa311571a995dbed98c49fc67446 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 6 Oct 2021 00:44:59 +0200 Subject: [PATCH 04/32] use full stringlength --- SE7K-proxy-tcp.py | 21 +++++++++++---------- SE7K.conf | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index e1fb9af..8fa2df0 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -7,6 +7,7 @@ import sys import threading import time +import string from pymodbus.server.sync import StartTcpServer from pymodbus.constants import Endian @@ -33,11 +34,11 @@ def setMeterValues(values, block): block.add_16bit_uint(1) block.add_16bit_uint(65) - block.add_string (values.get("c_manufacturer" ,"12345678901234567890123456789012")) - block.add_string (values.get("c_model" ,"12345678901234567890123456789012")) - block.add_string (values.get("c_option" ,"1234567890123456")) - block.add_string (values.get("c_version" ,"1234567890123456")) - block.add_string (values.get("c_serialnumber" ,"12345678901234567890123456789012")) + block.add_string (string.ljust(32, values.get("c_manufacturer" ,"12345678901234567890123456789012"),' ')) + block.add_string (string.ljust(32, values.get("c_model" ,"12345678901234567890123456789012"),' ')) + block.add_string (string.ljust(16, values.get("c_option" ,"1234567890123456"),' ')) + block.add_string (string.ljust(16, values.get("c_version" ,"1234567890123456"),' ')) + block.add_string (string.ljust(32, values.get("c_serialnumber" ,"12345678901234567890123456789012"),' ')) block.add_16bit_int (values.get("c_deviceaddress" , 0)) block.add_16bit_int (values.get("c_sunspec_did" , 103)) @@ -155,11 +156,11 @@ def t_update(ctx, stop, module, device, refresh): block_40000.add_string("SunS") block_40000.add_16bit_int(1) block_40000.add_16bit_int (values.get("C_SunSpec_Length", 65)) - block_40000.add_string (values.get("c_manufacturer" ,"12345678901234567890123456789012")) - block_40000.add_string (values.get("c_model" ,"12345678901234567890123456789012")) - block_40000.add_string ( "NOT_IMPLEMENTED.") - block_40000.add_string (values.get("c_version" ,"1234567890123456")) - block_40000.add_string (values.get("c_serialnumber" ,"12345678901234567890123456789012")) + block_40000.add_string (string.ljust(32, values.get("c_manufacturer" ,"12345678901234567890123456789012"),' ')) + block_40000.add_string (string.ljust(32, values.get("c_model" ,"12345678901234567890123456789012"),' ')) + block_40000.add_string (string.ljust(16, "NOT_IMPLEMENTED.",' ')) + block_40000.add_string (string.ljust(16, values.get("c_version" ,"1234567890123456"),' ')) + block_40000.add_string (string.ljust(32, values.get("c_serialnumber" ,"12345678901234567890123456789012"),' ')) block_40000.add_16bit_int (values.get("c_deviceaddress" , 0)) block_40000.add_16bit_int (values.get("c_sunspec_did" , 103)) diff --git a/SE7K.conf b/SE7K.conf index 9fd51b8..6516a3c 100644 --- a/SE7K.conf +++ b/SE7K.conf @@ -62,4 +62,4 @@ dst_address=2 # Number of seconds between value refreshes. # optional, default: 5 -refresh_rate = 2 +refresh_rate = 20 From e84f9705150db9b9957dfd7a9509d65c990d8e65 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 6 Oct 2021 00:47:50 +0200 Subject: [PATCH 05/32] port 5502 --- SE7K.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SE7K.conf b/SE7K.conf index 6516a3c..01b94c0 100644 --- a/SE7K.conf +++ b/SE7K.conf @@ -7,7 +7,7 @@ address=0.0.0.0 # Serving port. # optional, default: 5502 -port = 502 +port = 5502 # Modbus frame type, set to rtu for Modbus RTU over TCP # optional, default: socket From 01d82041b0b2c2100fdefbe4b1ec94341ab4cd0f Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 6 Oct 2021 01:00:58 +0200 Subject: [PATCH 06/32] using as string method --- SE7K-proxy-tcp.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index 8fa2df0..2a8bdf6 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -7,7 +7,6 @@ import sys import threading import time -import string from pymodbus.server.sync import StartTcpServer from pymodbus.constants import Endian @@ -34,11 +33,11 @@ def setMeterValues(values, block): block.add_16bit_uint(1) block.add_16bit_uint(65) - block.add_string (string.ljust(32, values.get("c_manufacturer" ,"12345678901234567890123456789012"),' ')) - block.add_string (string.ljust(32, values.get("c_model" ,"12345678901234567890123456789012"),' ')) - block.add_string (string.ljust(16, values.get("c_option" ,"1234567890123456"),' ')) - block.add_string (string.ljust(16, values.get("c_version" ,"1234567890123456"),' ')) - block.add_string (string.ljust(32, values.get("c_serialnumber" ,"12345678901234567890123456789012"),' ')) + block.add_string (values.get("c_manufacturer" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_string (values.get("c_model" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_string (values.get("c_option" ,"1234567890123456").ljust(16,' ')) + block.add_string (values.get("c_version" ,"1234567890123456").ljust(16,' ')) + block.add_string (values.get("c_serialnumber" ,"12345678901234567890123456789012").ljust(32,' ')) block.add_16bit_int (values.get("c_deviceaddress" , 0)) block.add_16bit_int (values.get("c_sunspec_did" , 103)) @@ -156,11 +155,11 @@ def t_update(ctx, stop, module, device, refresh): block_40000.add_string("SunS") block_40000.add_16bit_int(1) block_40000.add_16bit_int (values.get("C_SunSpec_Length", 65)) - block_40000.add_string (string.ljust(32, values.get("c_manufacturer" ,"12345678901234567890123456789012"),' ')) - block_40000.add_string (string.ljust(32, values.get("c_model" ,"12345678901234567890123456789012"),' ')) - block_40000.add_string (string.ljust(16, "NOT_IMPLEMENTED.",' ')) - block_40000.add_string (string.ljust(16, values.get("c_version" ,"1234567890123456"),' ')) - block_40000.add_string (string.ljust(32, values.get("c_serialnumber" ,"12345678901234567890123456789012"),' ')) + block_40000.add_string (values.get("c_manufacturer" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_string (values.get("c_model" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_string ( "NOT_IMPLEMENTED.".ljust(16,' ')) + block_40000.add_string (values.get("c_version" ,"1234567890123456").ljust(16,' ')) + block_40000.add_string (values.get("c_serialnumber" ,"12345678901234567890123456789012").ljust(32,' ')) block_40000.add_16bit_int (values.get("c_deviceaddress" , 0)) block_40000.add_16bit_int (values.get("c_sunspec_did" , 103)) From 267e76ecd8151e1c97fdedbb942ccd8600192b93 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 6 Oct 2021 01:19:25 +0200 Subject: [PATCH 07/32] Endian.Big instead of Little --- SE7K-proxy-tcp.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index 2a8bdf6..410de94 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -148,10 +148,10 @@ def t_update(ctx, stop, module, device, refresh): logger.debug(f"{this_t.name}: no new values") continue - block_1001 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_1001 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) block_40000.add_string("SunS") block_40000.add_16bit_int(1) block_40000.add_16bit_int (values.get("C_SunSpec_Length", 65)) @@ -219,18 +219,18 @@ def t_update(ctx, stop, module, device, refresh): block_40000.add_string("123456789012345678901234") # 12 dummy worter = 24 Byte ctx.setValues(3, 40000, block_40000.to_registers()) - block_40121 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_40121 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) setMeterValues(values["meters"]["Meter1"],block_40121) ctx.setValues(3, 40121, block_40121.to_registers()) - block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) ctx.setValues(3, 40295, block_40295.to_registers()) - block_40469 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_40469 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) ctx.setValues(3, 40469, block_40469.to_registers()) - block_57598 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_57598 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) ctx.setValues(3, 57598, block_57598.to_registers()) - block_57854 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_57854 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) ctx.setValues(3, 57854, block_57854.to_registers()) except Exception as e: From bf219c99ae569834b1ae6531217b2425a74ee09f Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 6 Oct 2021 21:45:54 +0200 Subject: [PATCH 08/32] add dummy words for correct alignement --- SE7K-proxy-tcp.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index 410de94..6745113 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -203,11 +203,16 @@ def t_update(ctx, stop, module, device, refresh): block_40000.add_16bit_uint(values.get("voltage_dc" , 0)) block_40000.add_16bit_int (values.get("voltage_dc_scale" , 0)) - block_40000.add_16bit_uint(values.get("power_dc" , 0)) + block_40000.add_16bit_int(values.get("power_dc" , 0)) block_40000.add_16bit_int (values.get("power_dc_scale" , 0)) - block_40000.add_16bit_uint(values.get("temperature" , 0)) - block_40000.add_16bit_int (values.get("temperature_scale" , 0)) + block_40000.add_16bit_int(0) # 1 dummy word + + block_40000.add_16bit_int(values.get("temperature" , 0)) + block_40000.add_16bit_int(values.get("temperature_scale" , 0)) + + block_40000.add_16bit_int(0) # 1 dummy word + block_40000.add_16bit_int(0) # 1 dummy word block_40000.add_16bit_uint(values.get("status" , 0)) block_40000.add_16bit_uint(values.get("vendor_status" , 0)) From 0f4974c66c10afde61a00e7c57f6a5fe169eb483 Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 6 Oct 2021 22:45:37 +0200 Subject: [PATCH 09/32] use default 502 port --- SE-MTR-3Y-400V-A.sh | 0 SE7K-proxy-tcp.nohup.sh | 2 ++ SE7K-proxy-tcp.sh | 2 ++ SE7K.conf | 4 ++-- nohup.out | 43 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 49 insertions(+), 2 deletions(-) mode change 100644 => 100755 SE-MTR-3Y-400V-A.sh create mode 100755 SE7K-proxy-tcp.nohup.sh create mode 100755 SE7K-proxy-tcp.sh create mode 100644 nohup.out diff --git a/SE-MTR-3Y-400V-A.sh b/SE-MTR-3Y-400V-A.sh old mode 100644 new mode 100755 diff --git a/SE7K-proxy-tcp.nohup.sh b/SE7K-proxy-tcp.nohup.sh new file mode 100755 index 0000000..f008736 --- /dev/null +++ b/SE7K-proxy-tcp.nohup.sh @@ -0,0 +1,2 @@ +#!/bin/bash +nohup python3 SE7K-proxy-tcp.py -c SE7K.conf & diff --git a/SE7K-proxy-tcp.sh b/SE7K-proxy-tcp.sh new file mode 100755 index 0000000..63fcc34 --- /dev/null +++ b/SE7K-proxy-tcp.sh @@ -0,0 +1,2 @@ +#!/bin/bash +python3 SE7K-proxy-tcp.py -c SE7K.conf diff --git a/SE7K.conf b/SE7K.conf index 01b94c0..9fd51b8 100644 --- a/SE7K.conf +++ b/SE7K.conf @@ -7,7 +7,7 @@ address=0.0.0.0 # Serving port. # optional, default: 5502 -port = 5502 +port = 502 # Modbus frame type, set to rtu for Modbus RTU over TCP # optional, default: socket @@ -62,4 +62,4 @@ dst_address=2 # Number of seconds between value refreshes. # optional, default: 5 -refresh_rate = 20 +refresh_rate = 2 diff --git a/nohup.out b/nohup.out new file mode 100644 index 0000000..1742406 --- /dev/null +++ b/nohup.out @@ -0,0 +1,43 @@ +2021-10-06 22:11:56 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) +2021-10-06 22:11:57 INFO: Starting +2021-10-06 22:11:58 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out +2021-10-06 22:11:59 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out +2021-10-06 22:12:00 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out +2021-10-06 22:12:01 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out +2021-10-06 22:12:02 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out +2021-10-06 22:12:03 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out +2021-10-06 22:12:04 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out +2021-10-06 22:12:06 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out +2021-10-06 22:28:11 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) +2021-10-06 22:28:12 INFO: Starting +2021-10-06 22:28:12 ERROR: Connection to (solaredge.fritz.box, 502) failed: [Errno 111] Connection refused +Traceback (most recent call last): + File "SE7K-proxy-tcp.py", line 353, in + confparser["server"].getint("port", fallback=default_config["server"]["port"]) + File "/usr/local/lib/python3.7/dist-packages/pymodbus-2.5.3rc1-py3.7.egg/pymodbus/server/sync.py", line 620, in StartTcpServer + server = ModbusTcpServer(context, framer, identity, address, **kwargs) + File "/usr/local/lib/python3.7/dist-packages/pymodbus-2.5.3rc1-py3.7.egg/pymodbus/server/sync.py", line 340, in __init__ + **kwargs) + File "/usr/lib/python3.7/socketserver.py", line 452, in __init__ + self.server_bind() + File "/usr/lib/python3.7/socketserver.py", line 466, in server_bind + self.socket.bind(self.server_address) +PermissionError: [Errno 13] Permission denied +2021-10-06 22:30:21 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) +2021-10-06 22:30:22 INFO: Starting +Traceback (most recent call last): + File "SE7K-proxy-tcp.py", line 353, in + confparser["server"].getint("port", fallback=default_config["server"]["port"]) + File "/usr/local/lib/python3.7/dist-packages/pymodbus-2.5.3rc1-py3.7.egg/pymodbus/server/sync.py", line 620, in StartTcpServer + server = ModbusTcpServer(context, framer, identity, address, **kwargs) + File "/usr/local/lib/python3.7/dist-packages/pymodbus-2.5.3rc1-py3.7.egg/pymodbus/server/sync.py", line 340, in __init__ + **kwargs) + File "/usr/lib/python3.7/socketserver.py", line 452, in __init__ + self.server_bind() + File "/usr/lib/python3.7/socketserver.py", line 466, in server_bind + self.socket.bind(self.server_address) +PermissionError: [Errno 13] Permission denied +2021-10-06 22:31:52 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) +2021-10-06 22:31:53 INFO: Starting +2021-10-06 22:34:29 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) +2021-10-06 22:34:30 INFO: Starting From a62fa753d607462593bf4ef67d13f4be8b2be252 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 6 Oct 2021 22:57:45 +0200 Subject: [PATCH 10/32] Invalidate unused meter blocks --- SE7K-proxy-tcp.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index 6745113..e9c9546 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -225,18 +225,18 @@ def t_update(ctx, stop, module, device, refresh): ctx.setValues(3, 40000, block_40000.to_registers()) block_40121 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - setMeterValues(values["meters"]["Meter1"],block_40121) - ctx.setValues(3, 40121, block_40121.to_registers()) - block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - ctx.setValues(3, 40295, block_40295.to_registers()) - block_40469 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - ctx.setValues(3, 40469, block_40469.to_registers()) - - block_57598 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - ctx.setValues(3, 57598, block_57598.to_registers()) - block_57854 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - ctx.setValues(3, 57854, block_57854.to_registers()) + #setMeterValues(values["meters"]["Meter1"],block_40121) + + # block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 40295, block_40295.to_registers()) + # block_40469 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 40469, block_40469.to_registers()) + + # block_57598 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 57598, block_57598.to_registers()) + # block_57854 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 57854, block_57854.to_registers()) except Exception as e: logger.critical(f"{this_t.name}: {e}") From f580307b1d052fe887ef0676b878b871364edf2a Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 6 Oct 2021 23:04:35 +0200 Subject: [PATCH 11/32] setMeterValues --- SE7K-proxy-tcp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index e9c9546..8e63377 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -225,8 +225,8 @@ def t_update(ctx, stop, module, device, refresh): ctx.setValues(3, 40000, block_40000.to_registers()) block_40121 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + setMeterValues(values["meters"]["Meter1"],block_40121) ctx.setValues(3, 40121, block_40121.to_registers()) - #setMeterValues(values["meters"]["Meter1"],block_40121) # block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) # ctx.setValues(3, 40295, block_40295.to_registers()) From dcd018ef8a456fa7e817ab7eb3f1e501e57d7253 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Thu, 7 Oct 2021 08:48:59 +0200 Subject: [PATCH 12/32] power store as int --- SE7K-proxy-tcp.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index 8e63377..7471ec2 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -178,20 +178,19 @@ def t_update(ctx, stop, module, device, refresh): block_40000.add_16bit_uint(values.get("p3n_voltage" , 0)) block_40000.add_16bit_int (values.get("voltage_scale" , 0)) - block_40000.add_16bit_uint(values.get("power_ac" , 0)) + block_40000.add_16bit_int(values.get("power_ac" , 0)) block_40000.add_16bit_int (values.get("power_ac_scale" , 0)) block_40000.add_16bit_uint(values.get("frequency" , 0)) block_40000.add_16bit_int (values.get("frequency_scale" , 0)) - - block_40000.add_16bit_uint(values.get("power_apparent" , 0)) + block_40000.add_16bit_int(values.get("power_apparent" , 0)) block_40000.add_16bit_int (values.get("power_apparent_scale" , 0)) - block_40000.add_16bit_uint(values.get("power_reactive" , 0)) + block_40000.add_16bit_int(values.get("power_reactive" , 0)) block_40000.add_16bit_int (values.get("power_reactive_scale" , 0)) - block_40000.add_16bit_uint(values.get("power_factor" , 0)) + block_40000.add_16bit_int(values.get("power_factor" , 0)) block_40000.add_16bit_int (values.get("power_factor_scale" , 0)) block_40000.add_32bit_uint(values.get("energy_total" , 0)) @@ -218,7 +217,7 @@ def t_update(ctx, stop, module, device, refresh): block_40000.add_16bit_uint(values.get("vendor_status" , 0)) block_40000.add_16bit_uint(values.get("rrcr_state" , 0)) - block_40000.add_16bit_uint(values.get("active_power_limit" , 0)) + block_40000.add_16bit_int(values.get("active_power_limit" , 0)) block_40000.add_32bit_float(values.get("cosphi" , 0)) block_40000.add_string("123456789012345678901234") # 12 dummy worter = 24 Byte From 025117a8417fa8e45140e1860d134cc085db1f74 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Thu, 7 Oct 2021 09:26:32 +0200 Subject: [PATCH 13/32] ignore nohup.out --- .gitignore | 2 ++ nohup.out | 43 ------------------------------------------- 2 files changed, 2 insertions(+), 43 deletions(-) delete mode 100644 nohup.out diff --git a/.gitignore b/.gitignore index c3d4e4c..68b9f7c 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,5 @@ venv.bak/ .mypy_cache/ *.bak out*.txt +nohup.out + diff --git a/nohup.out b/nohup.out deleted file mode 100644 index 1742406..0000000 --- a/nohup.out +++ /dev/null @@ -1,43 +0,0 @@ -2021-10-06 22:11:56 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) -2021-10-06 22:11:57 INFO: Starting -2021-10-06 22:11:58 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out -2021-10-06 22:11:59 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out -2021-10-06 22:12:00 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out -2021-10-06 22:12:01 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out -2021-10-06 22:12:02 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out -2021-10-06 22:12:03 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out -2021-10-06 22:12:04 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out -2021-10-06 22:12:06 ERROR: Connection to (solaredge.fritz.box, 502) failed: timed out -2021-10-06 22:28:11 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) -2021-10-06 22:28:12 INFO: Starting -2021-10-06 22:28:12 ERROR: Connection to (solaredge.fritz.box, 502) failed: [Errno 111] Connection refused -Traceback (most recent call last): - File "SE7K-proxy-tcp.py", line 353, in - confparser["server"].getint("port", fallback=default_config["server"]["port"]) - File "/usr/local/lib/python3.7/dist-packages/pymodbus-2.5.3rc1-py3.7.egg/pymodbus/server/sync.py", line 620, in StartTcpServer - server = ModbusTcpServer(context, framer, identity, address, **kwargs) - File "/usr/local/lib/python3.7/dist-packages/pymodbus-2.5.3rc1-py3.7.egg/pymodbus/server/sync.py", line 340, in __init__ - **kwargs) - File "/usr/lib/python3.7/socketserver.py", line 452, in __init__ - self.server_bind() - File "/usr/lib/python3.7/socketserver.py", line 466, in server_bind - self.socket.bind(self.server_address) -PermissionError: [Errno 13] Permission denied -2021-10-06 22:30:21 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) -2021-10-06 22:30:22 INFO: Starting -Traceback (most recent call last): - File "SE7K-proxy-tcp.py", line 353, in - confparser["server"].getint("port", fallback=default_config["server"]["port"]) - File "/usr/local/lib/python3.7/dist-packages/pymodbus-2.5.3rc1-py3.7.egg/pymodbus/server/sync.py", line 620, in StartTcpServer - server = ModbusTcpServer(context, framer, identity, address, **kwargs) - File "/usr/local/lib/python3.7/dist-packages/pymodbus-2.5.3rc1-py3.7.egg/pymodbus/server/sync.py", line 340, in __init__ - **kwargs) - File "/usr/lib/python3.7/socketserver.py", line 452, in __init__ - self.server_bind() - File "/usr/lib/python3.7/socketserver.py", line 466, in server_bind - self.socket.bind(self.server_address) -PermissionError: [Errno 13] Permission denied -2021-10-06 22:31:52 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) -2021-10-06 22:31:53 INFO: Starting -2021-10-06 22:34:29 INFO: Created : SE7K solaredge-inverter Inverter(solaredge.fritz.box:502, connectionType.TCP: timeout=1, retries=3, unit=0x2) -2021-10-06 22:34:30 INFO: Starting From 77327e8d689d252f2b3a4e553f7e8396c642c1e8 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Thu, 7 Oct 2021 09:37:22 +0200 Subject: [PATCH 14/32] sample frequency less than a second --- SE7K-proxy-tcp.py | 2 +- SE7K.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index 7471ec2..0779086 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -313,7 +313,7 @@ def t_update(ctx, stop, module, device, refresh): update_t_stop, meter_module, meter_device, - confparser[meter].getint("refresh_rate", fallback=default_config["meters"]["refresh_rate"]) + confparser[meter].getfloat("refresh_rate", fallback=default_config["meters"]["refresh_rate"]) ) ) diff --git a/SE7K.conf b/SE7K.conf index 9fd51b8..ded71a9 100644 --- a/SE7K.conf +++ b/SE7K.conf @@ -62,4 +62,4 @@ dst_address=2 # Number of seconds between value refreshes. # optional, default: 5 -refresh_rate = 2 +refresh_rate = 0.5 From ba464ecb1f5c03b239b9a7fe2356f9cc370406cc Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 13 Oct 2021 18:43:28 +0200 Subject: [PATCH 15/32] wip --- .gitignore | 1 + ...V23XE1X-proxy-tcp - Kopie.py => EM24DINAV23XE1X-proxy-tcp.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) rename EM24DINAV23XE1X-proxy-tcp - Kopie.py => EM24DINAV23XE1X-proxy-tcp.py (99%) diff --git a/.gitignore b/.gitignore index 68b9f7c..9d984e9 100644 --- a/.gitignore +++ b/.gitignore @@ -107,4 +107,5 @@ venv.bak/ *.bak out*.txt nohup.out +/bak diff --git a/EM24DINAV23XE1X-proxy-tcp - Kopie.py b/EM24DINAV23XE1X-proxy-tcp.py similarity index 99% rename from EM24DINAV23XE1X-proxy-tcp - Kopie.py rename to EM24DINAV23XE1X-proxy-tcp.py index b33a75d..d0d27ef 100644 --- a/EM24DINAV23XE1X-proxy-tcp - Kopie.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -259,7 +259,7 @@ def t_update(ctx, stop, module, device, refresh): update_t_stop, meter_module, meter_device, - confparser[meter].getint("refresh_rate", fallback=default_config["meters"]["refresh_rate"]) + confparser[meter].getfloat("refresh_rate", fallback=default_config["meters"]["refresh_rate"]) ) ) From 2d5465c6a652bbfc1dcceadac0328c5fc171613f Mon Sep 17 00:00:00 2001 From: ixtrader Date: Sat, 16 Oct 2021 21:32:13 +0200 Subject: [PATCH 16/32] wip --- EM24DINAV23XE1X-proxy-tcp.py | 88 +++++++++++++++++++++++++++++++++++ SE7K-proxy-tcp.py | 2 + devices/solaredge-inverter.py | 27 ++++++----- raspberry-proxy.cmd | 2 + raspberry.conf | 65 ++++++++++++++++++++++++++ 5 files changed, 170 insertions(+), 14 deletions(-) create mode 100644 raspberry-proxy.cmd create mode 100644 raspberry.conf diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index d0d27ef..26be269 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -25,6 +25,94 @@ def getValues(self, fx, address, count=1): return [1648] return super().getValues(fx, address, count) +def setMeterValues(values, block): + if not values: + block.add_16bit_uint(0) + block.add_16bit_uint(0) + return + + block.add_32bit_int( 1), #0001 0000h 2 V L1-N INT32 Value weight: Volt*10 N/A 1.0 + block.add_32bit_int( 3), #0003 0002h 2 V L2-N INT32 N/A 1.0 + block.add_32bit_int( 5), #0005 0004h 2 V L3-N INT32 N/A 1.0 + block.add_32bit_int( 7), #0007 0006h 2 V L1-L2 INT32 N/A 1.0 + block.add_32bit_int( 9), #0009 0008h 2 V L2-L3 INT32 N/A 1.0 + block.add_32bit_int( 11), #0011 000Ah 2 V L3-L1 INT32 N/A 1.0 + block.add_32bit_int( 13), #0013 000Ch 2 A L1 INT32 Value weight: Ampere*1000 N/A 1.0 + block.add_32bit_int( 15), #0015 000Eh 2 A L2 INT32 N/A 1.0 + block.add_32bit_int( 17), #0017 0010h 2 A L3 INT32 N/A 1.0 + block.add_32bit_int( 19), #0019 0012h 2 W L1 INT32 Value weight: Watt*10 N/A 1.0 + block.add_32bit_int( 21), #0021 0014h 2 W L2 INT32 N/A 1.0 + block.add_32bit_int( 23), #0023 0016h 2 W L3 INT32 N/A 1.0 + block.add_32bit_int( 25), #0025 0018h 2 VA L1 INT32 Value weight: VA*10 N/A 1.0 + block.add_32bit_int( 27), #0027 001Ah 2 VA L2 INT32 N/A 1.0 + block.add_32bit_int( 29), #0029 001Ch 2 VA L3 INT32 N/A 1.0 + block.add_32bit_int( 31), #0031 001Eh 2 VAR L1 INT32 Value weight: var*10 N/A 1.0 + block.add_32bit_int( 33), #0033 0020h 2 VAR L2 INT32 N/A 1.0 + block.add_32bit_int( 35), #0035 0022h 2 VAR L3 INT32 N/A 1.0 + block.add_32bit_int( 37), #0037 0024h 2 V L-N ? INT32 Value weight: Volt*10 N/A 1.0 + block.add_32bit_int( 39), #0039 0026h 2 V L-L ? INT32 N/A 1.0 + block.add_32bit_int( 41), #0041 0028h 2 W ? INT32 Value weight: Watt*10 N/A 1.0 + block.add_32bit_int( 43), #0043 002Ah 2 VA ? INT32 Value weight: VA*10 N/A 1.0 + block.add_32bit_int( 45), #0045 002Ch 2 VAR ? INT32 Value weight: var*10 N/A 1.0 + block.add_16bit_int( 47), #0047 002Eh 1 PF L1 INT16 Negative values correspond to lead(C), positive value correspond to lag(L) Value weight: PF*1000 N/A 1.0 + block.add_16bit_int( 48), #0048 002Fh 1 PF L2 INT16 N/A 1.0 + block.add_16bit_int( 49), #0049 0030h 1 PF L3 INT16 N/A 1.0 + block.add_16bit_int( 50), #0050 0031h 1 PF ? INT16 N/A 1.0 + block.add_16bit_int( 51), #0051 0032h 1 Phase sequence INT16 Value �1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) N/A 1.0 + block.add_16bit_uint( 52),#0052 0033h 1 Hz UINT16 Value weight: Hz*10 N/A 1.0 + block.add_32bit_int( 53), #0053 0034h 2 KWh(+) TOT INT32 Value weight: kWh*10 N/A 1.0 + block.add_32bit_int( 55), #0055 0036h 2 Kvarh(+) TOT INT32 Value weight: kvarh*10 N/A 1.0 + block.add_32bit_int( 57), #0057 0038h 2 DMD W ? INT32 Value weight: Watt*10 N/A 1.0 + block.add_32bit_int( 59), #0059 003Ah 2 DMD W ? max INT32 Value weight: Watt*10 N/A 1.0 + block.add_32bit_int( 61), #0061 003Ch 2 KWh(+) PAR INT32 Value weight: kWh*10 N/A 1.0 + block.add_32bit_int( 63), #0063 003Eh 2 Kvarh(+) PAR INT32 Value weight: kvarh*10 N/A 1.0 + block.add_32bit_int( 65), #0065 0040h 2 KWh(+) L1 INT32 Value weight: kWh*10 N/A 1.0 + block.add_32bit_int( 67), #0067 0042h 2 KWh(+) L2 INT32 N/A 1.0 + block.add_32bit_int( 69), #0069 0044h 2 KWh(+) L3 INT32 N/A 1.0 + block.add_32bit_int( 71), #0071 0046h 2 KWh(+) T1 INT32 Value weight: kWh*10 N/A 1.0 + block.add_32bit_int( 73), #0073 0048h 2 KWh(+) T2 INT32 N/A 1.0 + block.add_32bit_int( 75), #0075 004Ah 2 KWh(+) T3 INT32 N/A 1.0 + block.add_32bit_int( 77), #0077 004Ch 2 KWh(+) T4 INT32 N/A 1.0 + block.add_32bit_int( 79), #0079 004Eh 2 KWh(-) TOT INT32 Value weight: kWh*10 N/A 1.0 + block.add_32bit_int( 81), #0081 0050h 2 Kvarh(-) TOT INT32 Value weight: kvarh*10 N/A 1.0 + block.add_16bit_int( 83), #0083 1 unused + block.add_16bit_int( 84), #0084 1 unused + block.add_16bit_int( 85), #0085 1 unused + block.add_16bit_int( 86), #0086 1 unused + block.add_16bit_int( 87), #0087 1 unused + block.add_16bit_int( 88), #0088 1 unused + block.add_16bit_int( 89), #0089 1 unused + block.add_16bit_int( 90), #0090 1 unused + block.add_32bit_int( 91), #0091 005Ah 2 Hour INT32 Value weight: hour*100 N/A 1.0 + block.add_16bit_int( 93), #0093 1 unused + block.add_16bit_int( 94), #0094 1 unused + block.add_16bit_int( 95), #0095 1 unused + block.add_16bit_int( 96), #0096 1 unused + block.add_16bit_int( 97), #0096 1 unused + block.add_16bit_int( 98), #0097 1 unused + block.add_16bit_int( 99), #0098 1 unused + block.add_16bit_int( 101), #0099 1 unused + block.add_16bit_int( 102), #0100 1 unused + block.add_16bit_int( 103), #0101 1 unused + block.add_16bit_int( 104), #0102 1 unused + block.add_16bit_int( 105), #0103 1 unused + block.add_16bit_int( 106), #0104 1 unused + block.add_16bit_int( 107), #0105 1 unused + block.add_16bit_int( 108), #0106 1 unused + block.add_16bit_int( 109), #0107 1 unused + block.add_16bit_int( 110), #0108 1 unused + block.add_16bit_int( 110), #0109 1 unused + block.add_16bit_int( 110), #0110 1 unused + block.add_32bit_int( 111), #0111 006Eh 2 Kvarh(+) T1 INT32 Value weight: kvarh*10 N/A 1.0 + block.add_32bit_int( 113), #0113 0070h 2 Kvarh(+) T2 INT32 N/A 1.0 + block.add_32bit_int( 115), #0115 0072h 2 Kvarh(+) T3 INT32 N/A 1.0 + block.add_32bit_int( 117), #0117 0074h 2 Kvarh(+) T4 INT32 N/A 1.0 + block.add_32bit_int( 119), #0119 0076h 2 DMD VA ? INT32 Value weight: VA*10 N/A 1.0 + block.add_32bit_int( 121), #0121 0078h 2 DMD VA ? max INT32 Value weight: VA*10 N/A 1.0 + block.add_32bit_int( 123), #0123 007Ah 2 DMD A max INT32 Value weight: Ampere*1000 N/A 1.0 + + # + def t_update(ctx, stop, module, device, refresh): diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index 0779086..a81816c 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -30,6 +30,7 @@ def setMeterValues(values, block): if not values: block.add_16bit_uint(0) block.add_16bit_uint(0) + return block.add_16bit_uint(1) block.add_16bit_uint(65) @@ -131,6 +132,7 @@ def setBatteryValues(values, block): if not values: block.add_16bit_uint(0) block.add_16bit_uint(0) + return block.add_16bit_uint(1) ## TODO set correct values block.add_16bit_uint(65) ## TODO set correct values diff --git a/devices/solaredge-inverter.py b/devices/solaredge-inverter.py index 0d59dc3..362413d 100644 --- a/devices/solaredge-inverter.py +++ b/devices/solaredge-inverter.py @@ -1,5 +1,5 @@ import logging - +import re import solaredge_modbus @@ -67,26 +67,25 @@ def values(device): logger.debug(f"device: {device}") values = {} - values = device.read_all() + inverter_values=device.read_all() + logger.info(f"inverter_values: {inverter_values}") + # append type to key to prevent key name collision with legacy values + values = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in inverter_values.items()} + meters = device.meters() batteries = device.batteries() - values["meters"] = {} - values["batteries"] = {} + values["connected_meters"] = {} + values["connected_batteries"] = {} for meter, params in meters.items(): meter_values = params.read_all() - values["meters"][meter] = meter_values + values["connected_meters"][meter] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in meter_values.items()} for battery, params in batteries.items(): battery_values = params.read_all() - values["batteries"][battery] = battery_values + values["connected_batteries"][battery] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in battery_values.items()} - logger.debug(f"values: {values}") + logger.info(f"values: {values}") - - for battery, params in batteries.items(): - battery_values = params.read_all() - values["batteries"][battery] = battery_values - - return values - + return values + # append type to key \ No newline at end of file diff --git a/raspberry-proxy.cmd b/raspberry-proxy.cmd new file mode 100644 index 0000000..76aa8ff --- /dev/null +++ b/raspberry-proxy.cmd @@ -0,0 +1,2 @@ +echo use -v for more information +python SE7K-proxy-tcp.py -c raspberry.conf %* \ No newline at end of file diff --git a/raspberry.conf b/raspberry.conf new file mode 100644 index 0000000..9923872 --- /dev/null +++ b/raspberry.conf @@ -0,0 +1,65 @@ +[server] +# Serving IP address. +# optional, default: all interfaces +address=0.0.0.0 +# ip-address=0.0.0.0 +# ip_address=0.0.0.0 + +# Serving port. +# optional, default: 5502 +port = 502 + +# Modbus frame type, set to rtu for Modbus RTU over TCP +# optional, default: socket +#framer = socket + +# Logging level, CRITICAL, ERROR, WARNING, INFO, DEBUG +# optional, default: INFO +log_level = INFO + +# Masqueraded meters, comma separated. +# optional, default: '' +meters = SE7K + +[SE7K] +type=solaredge-inverter +host=raspberrypi.fritz.box +port=502 +src_address=2 +dst_address=2 + + +# Meters defined in [server] need a config section, one per meter. +# Depending on the type of meter that is to be masqueraded, you can +# define a number of generic and type specific variables. + +# Modbus address of the meter as defined in the SolarEdge inverter. +# This value needs to be unique. +# optional, default: 2 +#dst_address = 2 + +# Source meter type, which corresponds to a script in /devices. +# The generic.py device returns null values. +# optional, default: generic +#type = generic + +# Masqueraded serial number. +# Need not be correct, must be unique, must be an integer. +# optional, default: 987654 +#serial_number = 987654 + +# Current transformer amperage rating. +# optional, default: 5 +#ct_current = 50 + +# Current transformer direction inversion, set to 1 if required. +# optional, default: 0 +#ct_inverted = 0 + +# Offset between phases, set to 0, 90, 120 or 180. +# optional, default: 0 +#phase_offset = 120 + +# Number of seconds between value refreshes. +# optional, default: 5 +refresh_rate = 0.5 From 6aa73c872ff3272784319a3bbd82aa64c3d684fd Mon Sep 17 00:00:00 2001 From: ixtrader Date: Sat, 16 Oct 2021 23:29:03 +0200 Subject: [PATCH 17/32] SE keys are independent from legacy implementation --- SE7K-proxy-tcp.py | 270 +++++++++++++++++----------------- devices/solaredge-inverter.py | 4 +- 2 files changed, 137 insertions(+), 137 deletions(-) diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index a81816c..aaaa77c 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -34,97 +34,97 @@ def setMeterValues(values, block): block.add_16bit_uint(1) block.add_16bit_uint(65) - block.add_string (values.get("c_manufacturer" ,"12345678901234567890123456789012").ljust(32,' ')) - block.add_string (values.get("c_model" ,"12345678901234567890123456789012").ljust(32,' ')) - block.add_string (values.get("c_option" ,"1234567890123456").ljust(16,' ')) - block.add_string (values.get("c_version" ,"1234567890123456").ljust(16,' ')) - block.add_string (values.get("c_serialnumber" ,"12345678901234567890123456789012").ljust(32,' ')) - block.add_16bit_int (values.get("c_deviceaddress" , 0)) - - block.add_16bit_int (values.get("c_sunspec_did" , 103)) - block.add_16bit_int (values.get("c_sunspec_length", 50)) - block.add_16bit_uint(values.get("current" , 0)) - block.add_16bit_uint(values.get("p1_current" , 0)) - block.add_16bit_uint(values.get("p2_current" , 0)) - block.add_16bit_uint(values.get("p3_current" , 0)) - block.add_16bit_int (values.get("current_scale" , 0)) - - block.add_16bit_uint(values.get("voltage_ln" , 0)) - block.add_16bit_uint(values.get("p1n_voltage" , 0)) - block.add_16bit_uint(values.get("p2n_voltage" , 0)) - block.add_16bit_uint(values.get("p3n_voltage" , 0)) - block.add_16bit_uint(values.get("voltage_ll" , 0)) - block.add_16bit_uint(values.get("p1n_voltage" , 0)) - block.add_16bit_uint(values.get("p2n_voltage" , 0)) - block.add_16bit_uint(values.get("p3n_voltage" , 0)) - block.add_16bit_int (values.get("voltage_scale" , 0)) + block.add_string (values.get("c_manufacturer_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_string (values.get("c_model_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_string (values.get("c_option_str" ,"1234567890123456").ljust(16,' ')) + block.add_string (values.get("c_version_str" ,"1234567890123456").ljust(16,' ')) + block.add_string (values.get("c_serialnumber_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_16bit_int (values.get("c_deviceaddress_int" , 0)) + + block.add_16bit_int (values.get("c_sunspec_did_int" , 103)) + block.add_16bit_int (values.get("c_sunspec_length_int", 50)) + block.add_16bit_uint(values.get("current_int" , 0)) + block.add_16bit_uint(values.get("p1_current_int" , 0)) + block.add_16bit_uint(values.get("p2_current_int" , 0)) + block.add_16bit_uint(values.get("p3_current_int" , 0)) + block.add_16bit_int (values.get("current_scale_int" , 0)) + + block.add_16bit_uint(values.get("voltage_ln_int" , 0)) + block.add_16bit_uint(values.get("p1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("p2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block.add_16bit_uint(values.get("voltage_ll_int" , 0)) + block.add_16bit_uint(values.get("p1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("p2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block.add_16bit_int (values.get("voltage_scale_int" , 0)) - block.add_16bit_uint(values.get("frequency" , 0)) - block.add_16bit_int (values.get("frequency_scale" , 0)) - - block.add_16bit_int(values.get("power" , 0)) - block.add_16bit_int(values.get("p1_power" , 0)) - block.add_16bit_int(values.get("p2_power" , 0)) - block.add_16bit_int(values.get("p3_power" , 0)) - block.add_16bit_int (values.get("power_scale" , 0)) - - block.add_16bit_int(values.get("power_apparent" , 0)) - block.add_16bit_int(values.get("p1_power_apparent" , 0)) - block.add_16bit_int(values.get("p2_power_apparent" , 0)) - block.add_16bit_int(values.get("p3_power_apparent" , 0)) - block.add_16bit_int (values.get("power_apparent_scale" , 0)) - - block.add_16bit_int(values.get("power_reactive" , 0)) - block.add_16bit_int(values.get("p1_power_reactive" , 0)) - block.add_16bit_int(values.get("p2_power_reactive" , 0)) - block.add_16bit_int(values.get("p3_power_reactive" , 0)) - block.add_16bit_int (values.get("power_reactive_scale" , 0)) - - block.add_16bit_int(values.get("power_factor" , 0)) - block.add_16bit_int(values.get("p1_power_factor" , 0)) - block.add_16bit_int(values.get("p2_power_factor" , 0)) - block.add_16bit_int(values.get("p3_power_factor" , 0)) - block.add_16bit_int (values.get("power_factor_scale" , 0)) - - block.add_32bit_uint(values.get("export_energy_active" , 0)) - block.add_32bit_uint(values.get("p1_export_energy_active" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_active" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_active" , 0)) - block.add_32bit_uint(values.get("import_energy_active" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_active" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_active" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_active" , 0)) - block.add_16bit_int (values.get("energy_active_scale" , 0)) - - block.add_32bit_uint(values.get("export_energy_apparent", 0)) - block.add_32bit_uint(values.get("p1_export_energy_apparent" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_apparent" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_apparent" , 0)) - block.add_32bit_uint(values.get("import_energy_apparent" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_apparent" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_apparent" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_apparent" , 0)) - block.add_16bit_int (values.get("energy_apparent_scale" , 0)) - - block.add_32bit_uint(values.get("import_energy_reactive_q1" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_reactive_q1" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_reactive_q1" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_reactive_q1" , 0)) - block.add_32bit_uint(values.get("import_energy_reactive_q2" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_reactive_q2" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_reactive_q2" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_reactive_q2" , 0)) - block.add_32bit_uint(values.get("export_energy_reactive_q3" , 0)) - block.add_32bit_uint(values.get("p1_export_energy_reactive_q3" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_reactive_q3" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_reactive_q3" , 0)) - block.add_32bit_uint(values.get("export_energy_reactive_q4" , 0)) - block.add_32bit_uint(values.get("p1_export_energy_reactive_q4" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_reactive_q4" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_reactive_q4" , 0)) - block.add_16bit_int (values.get("energy_reactive_scale" , 0)) - - block.add_32bit_uint(values.get("events" , 0)) + block.add_16bit_uint(values.get("frequency_int" , 0)) + block.add_16bit_int (values.get("frequency_scale_int" , 0)) + + block.add_16bit_int(values.get("power_int" , 0)) + block.add_16bit_int(values.get("p1_power_int" , 0)) + block.add_16bit_int(values.get("p2_power_int" , 0)) + block.add_16bit_int(values.get("p3_power_int" , 0)) + block.add_16bit_int (values.get("power_scale_int" , 0)) + + block.add_16bit_int(values.get("power_apparent_int" , 0)) + block.add_16bit_int(values.get("p1_power_apparent_int" , 0)) + block.add_16bit_int(values.get("p2_power_apparent_int" , 0)) + block.add_16bit_int(values.get("p3_power_apparent_int" , 0)) + block.add_16bit_int (values.get("power_apparent_scale_int" , 0)) + + block.add_16bit_int(values.get("power_reactive_int" , 0)) + block.add_16bit_int(values.get("p1_power_reactive_int" , 0)) + block.add_16bit_int(values.get("p2_power_reactive_int" , 0)) + block.add_16bit_int(values.get("p3_power_reactive_int" , 0)) + block.add_16bit_int (values.get("power_reactive_scale_int" , 0)) + + block.add_16bit_int(values.get("power_factor_int" , 0)) + block.add_16bit_int(values.get("p1_power_factor_int" , 0)) + block.add_16bit_int(values.get("p2_power_factor_int" , 0)) + block.add_16bit_int(values.get("p3_power_factor_int" , 0)) + block.add_16bit_int (values.get("power_factor_scale_int" , 0)) + + block.add_32bit_uint(values.get("export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p1_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_active_int" , 0)) + block.add_16bit_int (values.get("energy_active_scale_int" , 0)) + + block.add_32bit_uint(values.get("export_energy_apparent_int", 0)) + block.add_32bit_uint(values.get("p1_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_apparent_int" , 0)) + block.add_16bit_int (values.get("energy_apparent_scale_int" , 0)) + + block.add_32bit_uint(values.get("import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("p1_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("p1_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_reactive_q4_int" , 0)) + block.add_16bit_int (values.get("energy_reactive_scale_int" , 0)) + + block.add_32bit_uint(values.get("events_int" , 0)) # @@ -156,77 +156,77 @@ def t_update(ctx, stop, module, device, refresh): block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) block_40000.add_string("SunS") block_40000.add_16bit_int(1) - block_40000.add_16bit_int (values.get("C_SunSpec_Length", 65)) - block_40000.add_string (values.get("c_manufacturer" ,"12345678901234567890123456789012").ljust(32,' ')) - block_40000.add_string (values.get("c_model" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_16bit_int (values.get("C_SunSpec_Length_int", 65)) + block_40000.add_string (values.get("c_manufacturer_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_string (values.get("c_model_str" ,"12345678901234567890123456789012").ljust(32,' ')) block_40000.add_string ( "NOT_IMPLEMENTED.".ljust(16,' ')) - block_40000.add_string (values.get("c_version" ,"1234567890123456").ljust(16,' ')) - block_40000.add_string (values.get("c_serialnumber" ,"12345678901234567890123456789012").ljust(32,' ')) - block_40000.add_16bit_int (values.get("c_deviceaddress" , 0)) + block_40000.add_string (values.get("c_version_str" ,"1234567890123456").ljust(16,' ')) + block_40000.add_string (values.get("c_serialnumber_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_16bit_int (values.get("c_deviceaddress_int" , 0)) - block_40000.add_16bit_int (values.get("c_sunspec_did" , 103)) + block_40000.add_16bit_int (values.get("c_sunspec_did_int" , 103)) block_40000.add_16bit_int (50) - block_40000.add_16bit_uint(values.get("current" , 0)) - block_40000.add_16bit_uint(values.get("p1_current" , 0)) - block_40000.add_16bit_uint(values.get("p2_current" , 0)) - block_40000.add_16bit_uint(values.get("p3_current" , 0)) - block_40000.add_16bit_int (values.get("current_scale" , 0)) - - block_40000.add_16bit_uint(values.get("p1_voltage" , 0)) - block_40000.add_16bit_uint(values.get("p2_voltage" , 0)) - block_40000.add_16bit_uint(values.get("p3_voltage" , 0)) - block_40000.add_16bit_uint(values.get("p1n_voltage" , 0)) - block_40000.add_16bit_uint(values.get("p2n_voltage" , 0)) - block_40000.add_16bit_uint(values.get("p3n_voltage" , 0)) - block_40000.add_16bit_int (values.get("voltage_scale" , 0)) + block_40000.add_16bit_uint(values.get("current_int" , 0)) + block_40000.add_16bit_uint(values.get("p1_current_int" , 0)) + block_40000.add_16bit_uint(values.get("p2_current_int" , 0)) + block_40000.add_16bit_uint(values.get("p3_current_int" , 0)) + block_40000.add_16bit_int (values.get("current_scale_int" , 0)) + + block_40000.add_16bit_uint(values.get("p1_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p2_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p3_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p1n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p2n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block_40000.add_16bit_int (values.get("voltage_scale_int" , 0)) - block_40000.add_16bit_int(values.get("power_ac" , 0)) - block_40000.add_16bit_int (values.get("power_ac_scale" , 0)) + block_40000.add_16bit_int(values.get("power_ac_int" , 0)) + block_40000.add_16bit_int (values.get("power_ac_scale_int" , 0)) - block_40000.add_16bit_uint(values.get("frequency" , 0)) - block_40000.add_16bit_int (values.get("frequency_scale" , 0)) + block_40000.add_16bit_uint(values.get("frequency_int" , 0)) + block_40000.add_16bit_int (values.get("frequency_scale_int" , 0)) - block_40000.add_16bit_int(values.get("power_apparent" , 0)) - block_40000.add_16bit_int (values.get("power_apparent_scale" , 0)) + block_40000.add_16bit_int(values.get("power_apparent_int" , 0)) + block_40000.add_16bit_int (values.get("power_apparent_scale_int" , 0)) - block_40000.add_16bit_int(values.get("power_reactive" , 0)) - block_40000.add_16bit_int (values.get("power_reactive_scale" , 0)) + block_40000.add_16bit_int(values.get("power_reactive_int" , 0)) + block_40000.add_16bit_int (values.get("power_reactive_scale_int" , 0)) - block_40000.add_16bit_int(values.get("power_factor" , 0)) - block_40000.add_16bit_int (values.get("power_factor_scale" , 0)) + block_40000.add_16bit_int(values.get("power_factor_int" , 0)) + block_40000.add_16bit_int (values.get("power_factor_scale_int" , 0)) - block_40000.add_32bit_uint(values.get("energy_total" , 0)) - block_40000.add_16bit_int (values.get("energy_total_scale" , 0)) + block_40000.add_32bit_uint(values.get("energy_total_int" , 0)) + block_40000.add_16bit_int (values.get("energy_total_scale_int" , 0)) - block_40000.add_16bit_uint(values.get("current_dc" , 0)) - block_40000.add_16bit_int (values.get("current_dc_scale" , 0)) + block_40000.add_16bit_uint(values.get("current_dc_int" , 0)) + block_40000.add_16bit_int (values.get("current_dc_scale_int" , 0)) - block_40000.add_16bit_uint(values.get("voltage_dc" , 0)) - block_40000.add_16bit_int (values.get("voltage_dc_scale" , 0)) + block_40000.add_16bit_uint(values.get("voltage_dc_int" , 0)) + block_40000.add_16bit_int (values.get("voltage_dc_scale_int" , 0)) - block_40000.add_16bit_int(values.get("power_dc" , 0)) - block_40000.add_16bit_int (values.get("power_dc_scale" , 0)) + block_40000.add_16bit_int(values.get("power_dc_int" , 0)) + block_40000.add_16bit_int (values.get("power_dc_scale_int" , 0)) block_40000.add_16bit_int(0) # 1 dummy word - block_40000.add_16bit_int(values.get("temperature" , 0)) - block_40000.add_16bit_int(values.get("temperature_scale" , 0)) + block_40000.add_16bit_int(values.get("temperature_int" , 0)) + block_40000.add_16bit_int(values.get("temperature_scale_int" , 0)) block_40000.add_16bit_int(0) # 1 dummy word block_40000.add_16bit_int(0) # 1 dummy word - block_40000.add_16bit_uint(values.get("status" , 0)) - block_40000.add_16bit_uint(values.get("vendor_status" , 0)) + block_40000.add_16bit_uint(values.get("status_int" , 0)) + block_40000.add_16bit_uint(values.get("vendor_status_int" , 0)) - block_40000.add_16bit_uint(values.get("rrcr_state" , 0)) - block_40000.add_16bit_int(values.get("active_power_limit" , 0)) + block_40000.add_16bit_uint(values.get("rrcr_state_int" , 0)) + block_40000.add_16bit_int(values.get("active_power_limit_int" , 0)) block_40000.add_32bit_float(values.get("cosphi" , 0)) block_40000.add_string("123456789012345678901234") # 12 dummy worter = 24 Byte ctx.setValues(3, 40000, block_40000.to_registers()) block_40121 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - setMeterValues(values["meters"]["Meter1"],block_40121) + setMeterValues(values["connected_meters"]["Meter1"],block_40121) ctx.setValues(3, 40121, block_40121.to_registers()) # block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) diff --git a/devices/solaredge-inverter.py b/devices/solaredge-inverter.py index 362413d..448499b 100644 --- a/devices/solaredge-inverter.py +++ b/devices/solaredge-inverter.py @@ -68,7 +68,7 @@ def values(device): values = {} inverter_values=device.read_all() - logger.info(f"inverter_values: {inverter_values}") + # append type to key to prevent key name collision with legacy values values = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in inverter_values.items()} @@ -85,7 +85,7 @@ def values(device): battery_values = params.read_all() values["connected_batteries"][battery] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in battery_values.items()} - logger.info(f"values: {values}") + logger.debug(f"values: {values}") return values # append type to key \ No newline at end of file From a73a640a1b39b44daa4004cb78e5c8e8a24364f6 Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 25 Oct 2021 01:44:04 +0200 Subject: [PATCH 18/32] modbus-proxy als init.d deamon einrichten --- SE7K-proxy-tcp.d.sh | 8 ++++ init.d/modbus-proxy | 87 ++++++++++++++++++++++++++++++++++++++++++ init.d/modbus-proxy.md | 7 ++++ 3 files changed, 102 insertions(+) create mode 100755 SE7K-proxy-tcp.d.sh create mode 100644 init.d/modbus-proxy create mode 100644 init.d/modbus-proxy.md diff --git a/SE7K-proxy-tcp.d.sh b/SE7K-proxy-tcp.d.sh new file mode 100755 index 0000000..8da030d --- /dev/null +++ b/SE7K-proxy-tcp.d.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set +x +meinpfad=$(dirname $0) +file=/var/log/modbus-proxy.log +[ -e $file ] && [ $(stat --printf '%s' "$file") -gt 104857600 ] && rm "$file" +file=/var/log/modbus-proxy.err +[ -e $file ] && [ $(stat --printf '%s' "$file") -gt 104857600 ] && rm "$file" +nohup python3 $meinpfad/SE7K-proxy-tcp.py -c $meinpfad/SE7K.conf 2>>/var/log/modbus-proxy.err >>/var/log/modbus-proxy.log & diff --git a/init.d/modbus-proxy b/init.d/modbus-proxy new file mode 100644 index 0000000..2dcdb5f --- /dev/null +++ b/init.d/modbus-proxy @@ -0,0 +1,87 @@ +#!/bin/sh +# Start/stop the modbus-proxy daemon. +# +### BEGIN INIT INFO +# Provides: cron +# Required-Start: $remote_fs $syslog $time +# Required-Stop: $remote_fs $syslog $time +# Should-Start: $network $named slapd autofs ypbind nscd nslcd winbind sssd +# Should-Stop: $network $named slapd autofs ypbind nscd nslcd winbind sssd +# Default-Start: 2 3 4 5 +# Default-Stop: +# Short-Description: Regular background program processing daemon +# Description: cron is a standard UNIX program that runs user-specified +# programs at periodic scheduled times. vixie cron adds a +# number of features to the basic UNIX cron, including better +# security and more powerful configuration options. +### END INIT INFO + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +DESC="modbus proxy daemon" +NAME=modbus-proxy +DAEMON=/home/martin/gitHubClones/solaredge_meterproxy/SE7K-proxy-tcp.d.sh +PIDFILE=/var/run/modbus-proxy.pid +SCRIPTNAME=/etc/init.d/"$NAME" + +test -f $DAEMON || exit 0 + +. /lib/lsb/init-functions + +# +# We read /etc/environment, but warn about locale information in +# there because it should be in /etc/default/locale. +parse_environment () +{ + for ENV_FILE in /etc/environment /etc/default/locale; do + [ -r "$ENV_FILE" ] || continue + [ -s "$ENV_FILE" ] || continue + + for var in LANG LANGUAGE LC_ALL LC_CTYPE; do + value=`egrep "^${var}=" "$ENV_FILE" | tail -n1 | cut -d= -f2` + [ -n "$value" ] && eval export $var=$value + + if [ -n "$value" ] && [ "$ENV_FILE" = /etc/environment ]; then + log_warning_msg "/etc/environment has been deprecated for locale information; use /etc/default/locale for $var=$value instead" + fi + done + done + +# Get the timezone set. + if [ -z "$TZ" -a -e /etc/timezone ]; then + TZ=`cat /etc/timezone` + fi +} + +# Parse the system's environment +if [ "$READ_ENV" = "yes" ] ; then + parse_environment +fi + + +case "$1" in +start) log_daemon_msg "Starting modbus proxy service" "modbus_proxy" + start_daemon -p $PIDFILE $DAEMON $EXTRA_OPTS + log_end_msg $? + ;; +stop) log_daemon_msg "Stopping modbus proxy service" "modbus_proxy" + killproc -p $PIDFILE $DAEMON + RETVAL=$? + [ $RETVAL -eq 0 ] && [ -e "$PIDFILE" ] && rm -f $PIDFILE + log_end_msg $RETVAL + ;; +restart) log_daemon_msg "Restarting modbus proxy service" "modbus_proxy" + $0 stop + $0 start + ;; +reload|force-reload) log_daemon_msg "Reloading configuration files for modbus proxy service" "modbus_proxy" + $0 stop + $0 start + ;; +status) + status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $? + ;; +*) log_action_msg "Usage: /etc/init.d/modbus_proxy {start|stop|status|restart|reload|force-reload}" + exit 2 + ;; +esac +exit 0 diff --git a/init.d/modbus-proxy.md b/init.d/modbus-proxy.md new file mode 100644 index 0000000..160da17 --- /dev/null +++ b/init.d/modbus-proxy.md @@ -0,0 +1,7 @@ +die modbus-proxy datei muss in /etc/init.d als ausfhrbare datei kopiert werden. + +systemctl start modbus-proxy +systemctl enable modbus-proxy + +martin@raspberrypi:~ $ ps -ef |grep python +root 436 1 11 01:35 ? 00:00:44 python3 /home/martin/gitHubClones/solaredge_meterproxy/SE7K-proxy-tcp.py -c /home/martin/gitHubClones/solaredge_meterproxy/SE7K.conf From e5246a96411a5fbb74baaa106f6031642f7c5b73 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Sun, 20 Feb 2022 10:07:47 +0100 Subject: [PATCH 19/32] WIP --- SE-MTR-3Y-400V-A.conf | 8 ++--- devices/solaredge-inverter.py | 64 ++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/SE-MTR-3Y-400V-A.conf b/SE-MTR-3Y-400V-A.conf index 6c08caf..e2a2516 100644 --- a/SE-MTR-3Y-400V-A.conf +++ b/SE-MTR-3Y-400V-A.conf @@ -19,11 +19,11 @@ log_level = INFO # Masqueraded meters, comma separated. # optional, default: '' -meters = SE-MTR-3Y-400V-A +meters = solaredge-inverter -[SE-MTR-3Y-400V-A] -type=SE-MTR-3Y-400V-A -host=solaredge.fritz.box +[solaredge-inverter] +type=solaredge-inverter +host=raspberrypi.fritz.box port=502 src_address=2 dst_address=2 diff --git a/devices/solaredge-inverter.py b/devices/solaredge-inverter.py index 448499b..8a82498 100644 --- a/devices/solaredge-inverter.py +++ b/devices/solaredge-inverter.py @@ -87,5 +87,67 @@ def values(device): logger.debug(f"values: {values}") - return values + # additional values for emulation of SE-WNC-3Y-400-MB-K1 or WattNode WNC-3Y-400-MB + + # TODO Calculate the values for the SE-WNC-3Y-400-MB-K1 meter from the SolarEdge meter provided by SE7K + SE_WNC_3Y_400_MB_K1_values = { + "energy_active": values.get("total_energy_active", 0), + "import_energy_active": values.get("import_energy_active", 0), + "power_active": values.get("total_power_active", 0), + "p1_power_active": values.get("p1_power_active", 0), + "p2_power_active": values.get("p2_power_active", 0), + "p3_power_active": values.get("p3_power_active", 0), + "voltage_ln": values.get("voltage_ln", 0), + "p1n_voltage": values.get("p1_voltage", 0), + "p2n_voltage": values.get("p2_voltage", 0), + "p3n_voltage": values.get("p3_voltage", 0), + "voltage_ll": values.get("voltage_ll", 0), + "p12_voltage": values.get("p12_voltage", 0), + "p23_voltage": values.get("p23_voltage", 0), + "p31_voltage": values.get("p31_voltage", 0), + "frequency": values.get("frequency", 0), + "p1_energy_active": values.get("total_energy_active", 0), + # "p2_energy_active" + # "p3_energy_active" + "p1_import_energy_active": values.get("import_energy_active", 0), + # "p2_import_energy_active" + # "p3_import_energy_active" + "export_energy_active": values.get("export_energy_active", 0), + "p1_export_energy_active": values.get("export_energy_active", 0), + # "p2_export_energy_active" + # "p3_export_energy_active" + "energy_reactive": values.get("total_energy_reactive", 0), + "p1_energy_reactive": values.get("total_energy_reactive", 0), + # "p2_energy_reactive" + # "p3_energy_reactive" + "energy_apparent": values.get("total_energy_apparent", 0), + "p1_energy_apparent": values.get("total_energy_apparent", 0), + # "p2_energy_apparent" + # "p3_energy_apparent" + "power_factor": values.get("total_power_factor", 0), + "p1_power_factor": values.get("p1_power_factor", 0), + "p2_power_factor": values.get("p2_power_factor", 0), + "p3_power_factor": values.get("p3_power_factor", 0), + "power_reactive": values.get("total_power_reactive", 0), + "p1_power_reactive": values.get("p1_power_reactive", 0), + "p2_power_reactive": values.get("p2_power_reactive", 0), + "p3_power_reactive": values.get("p3_power_reactive", 0), + "power_apparent": values.get("total_power_apparent", 0), + "p1_power_apparent": values.get("p1_power_apparent", 0), + "p2_power_apparent": values.get("p2_power_apparent", 0), + "p3_power_apparent": values.get("p3_power_apparent", 0), + "p1_current": values.get("p1_current", 0), + "p2_current": values.get("p2_current", 0), + "p3_current": values.get("p3_current", 0), + "demand_power_active": values.get("total_import_demand_power_active", 0), + # "minimum_demand_power_active" + "maximum_demand_power_active": values.get("maximum_import_demand_power_active", 0), + "demand_power_apparent": values.get("total_demand_power_apparent", 0), + "p1_demand_power_active": (values.get("p1_demand_current", 0) * values.get("p1_voltage", 0)), + "p2_demand_power_active": (values.get("p2_demand_current", 0) * values.get("p2_voltage", 0)), + "p3_demand_power_active": (values.get("p3_demand_current", 0) * values.get("p3_voltage", 0)) + } + + + return values | SE_WNC_3Y_400_MB_K1_values # append type to key \ No newline at end of file From a9569a4755cbe6d16968f293bc94af79259817bf Mon Sep 17 00:00:00 2001 From: ixtrader Date: Mon, 28 Feb 2022 22:55:56 +0100 Subject: [PATCH 20/32] WIP --- EM24DINAV23XE1X-proxy-tcp.py | 281 ++++++++++++----------------------- SE-MTR-3Y-400V-A.conf | 2 +- SE7K-proxy-tcp.py | 3 - devices/EM24.py | 153 +++++++++++++++++++ 4 files changed, 249 insertions(+), 190 deletions(-) create mode 100644 devices/EM24.py diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index 26be269..b144aec 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -17,7 +17,7 @@ from pymodbus.datastore import ModbusServerContext from pymodbus.payload import BinaryPayloadBuilder - +sys.path.append('C:/gitHubClones/modbus/solaredge_modbus/src') class EM24SlaveContext(ModbusSlaveContext): def getValues(self, fx, address, count=1): if (address == 11 and count==1): @@ -25,93 +25,6 @@ def getValues(self, fx, address, count=1): return [1648] return super().getValues(fx, address, count) -def setMeterValues(values, block): - if not values: - block.add_16bit_uint(0) - block.add_16bit_uint(0) - return - - block.add_32bit_int( 1), #0001 0000h 2 V L1-N INT32 Value weight: Volt*10 N/A 1.0 - block.add_32bit_int( 3), #0003 0002h 2 V L2-N INT32 N/A 1.0 - block.add_32bit_int( 5), #0005 0004h 2 V L3-N INT32 N/A 1.0 - block.add_32bit_int( 7), #0007 0006h 2 V L1-L2 INT32 N/A 1.0 - block.add_32bit_int( 9), #0009 0008h 2 V L2-L3 INT32 N/A 1.0 - block.add_32bit_int( 11), #0011 000Ah 2 V L3-L1 INT32 N/A 1.0 - block.add_32bit_int( 13), #0013 000Ch 2 A L1 INT32 Value weight: Ampere*1000 N/A 1.0 - block.add_32bit_int( 15), #0015 000Eh 2 A L2 INT32 N/A 1.0 - block.add_32bit_int( 17), #0017 0010h 2 A L3 INT32 N/A 1.0 - block.add_32bit_int( 19), #0019 0012h 2 W L1 INT32 Value weight: Watt*10 N/A 1.0 - block.add_32bit_int( 21), #0021 0014h 2 W L2 INT32 N/A 1.0 - block.add_32bit_int( 23), #0023 0016h 2 W L3 INT32 N/A 1.0 - block.add_32bit_int( 25), #0025 0018h 2 VA L1 INT32 Value weight: VA*10 N/A 1.0 - block.add_32bit_int( 27), #0027 001Ah 2 VA L2 INT32 N/A 1.0 - block.add_32bit_int( 29), #0029 001Ch 2 VA L3 INT32 N/A 1.0 - block.add_32bit_int( 31), #0031 001Eh 2 VAR L1 INT32 Value weight: var*10 N/A 1.0 - block.add_32bit_int( 33), #0033 0020h 2 VAR L2 INT32 N/A 1.0 - block.add_32bit_int( 35), #0035 0022h 2 VAR L3 INT32 N/A 1.0 - block.add_32bit_int( 37), #0037 0024h 2 V L-N ? INT32 Value weight: Volt*10 N/A 1.0 - block.add_32bit_int( 39), #0039 0026h 2 V L-L ? INT32 N/A 1.0 - block.add_32bit_int( 41), #0041 0028h 2 W ? INT32 Value weight: Watt*10 N/A 1.0 - block.add_32bit_int( 43), #0043 002Ah 2 VA ? INT32 Value weight: VA*10 N/A 1.0 - block.add_32bit_int( 45), #0045 002Ch 2 VAR ? INT32 Value weight: var*10 N/A 1.0 - block.add_16bit_int( 47), #0047 002Eh 1 PF L1 INT16 Negative values correspond to lead(C), positive value correspond to lag(L) Value weight: PF*1000 N/A 1.0 - block.add_16bit_int( 48), #0048 002Fh 1 PF L2 INT16 N/A 1.0 - block.add_16bit_int( 49), #0049 0030h 1 PF L3 INT16 N/A 1.0 - block.add_16bit_int( 50), #0050 0031h 1 PF ? INT16 N/A 1.0 - block.add_16bit_int( 51), #0051 0032h 1 Phase sequence INT16 Value �1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) N/A 1.0 - block.add_16bit_uint( 52),#0052 0033h 1 Hz UINT16 Value weight: Hz*10 N/A 1.0 - block.add_32bit_int( 53), #0053 0034h 2 KWh(+) TOT INT32 Value weight: kWh*10 N/A 1.0 - block.add_32bit_int( 55), #0055 0036h 2 Kvarh(+) TOT INT32 Value weight: kvarh*10 N/A 1.0 - block.add_32bit_int( 57), #0057 0038h 2 DMD W ? INT32 Value weight: Watt*10 N/A 1.0 - block.add_32bit_int( 59), #0059 003Ah 2 DMD W ? max INT32 Value weight: Watt*10 N/A 1.0 - block.add_32bit_int( 61), #0061 003Ch 2 KWh(+) PAR INT32 Value weight: kWh*10 N/A 1.0 - block.add_32bit_int( 63), #0063 003Eh 2 Kvarh(+) PAR INT32 Value weight: kvarh*10 N/A 1.0 - block.add_32bit_int( 65), #0065 0040h 2 KWh(+) L1 INT32 Value weight: kWh*10 N/A 1.0 - block.add_32bit_int( 67), #0067 0042h 2 KWh(+) L2 INT32 N/A 1.0 - block.add_32bit_int( 69), #0069 0044h 2 KWh(+) L3 INT32 N/A 1.0 - block.add_32bit_int( 71), #0071 0046h 2 KWh(+) T1 INT32 Value weight: kWh*10 N/A 1.0 - block.add_32bit_int( 73), #0073 0048h 2 KWh(+) T2 INT32 N/A 1.0 - block.add_32bit_int( 75), #0075 004Ah 2 KWh(+) T3 INT32 N/A 1.0 - block.add_32bit_int( 77), #0077 004Ch 2 KWh(+) T4 INT32 N/A 1.0 - block.add_32bit_int( 79), #0079 004Eh 2 KWh(-) TOT INT32 Value weight: kWh*10 N/A 1.0 - block.add_32bit_int( 81), #0081 0050h 2 Kvarh(-) TOT INT32 Value weight: kvarh*10 N/A 1.0 - block.add_16bit_int( 83), #0083 1 unused - block.add_16bit_int( 84), #0084 1 unused - block.add_16bit_int( 85), #0085 1 unused - block.add_16bit_int( 86), #0086 1 unused - block.add_16bit_int( 87), #0087 1 unused - block.add_16bit_int( 88), #0088 1 unused - block.add_16bit_int( 89), #0089 1 unused - block.add_16bit_int( 90), #0090 1 unused - block.add_32bit_int( 91), #0091 005Ah 2 Hour INT32 Value weight: hour*100 N/A 1.0 - block.add_16bit_int( 93), #0093 1 unused - block.add_16bit_int( 94), #0094 1 unused - block.add_16bit_int( 95), #0095 1 unused - block.add_16bit_int( 96), #0096 1 unused - block.add_16bit_int( 97), #0096 1 unused - block.add_16bit_int( 98), #0097 1 unused - block.add_16bit_int( 99), #0098 1 unused - block.add_16bit_int( 101), #0099 1 unused - block.add_16bit_int( 102), #0100 1 unused - block.add_16bit_int( 103), #0101 1 unused - block.add_16bit_int( 104), #0102 1 unused - block.add_16bit_int( 105), #0103 1 unused - block.add_16bit_int( 106), #0104 1 unused - block.add_16bit_int( 107), #0105 1 unused - block.add_16bit_int( 108), #0106 1 unused - block.add_16bit_int( 109), #0107 1 unused - block.add_16bit_int( 110), #0108 1 unused - block.add_16bit_int( 110), #0109 1 unused - block.add_16bit_int( 110), #0110 1 unused - block.add_32bit_int( 111), #0111 006Eh 2 Kvarh(+) T1 INT32 Value weight: kvarh*10 N/A 1.0 - block.add_32bit_int( 113), #0113 0070h 2 Kvarh(+) T2 INT32 N/A 1.0 - block.add_32bit_int( 115), #0115 0072h 2 Kvarh(+) T3 INT32 N/A 1.0 - block.add_32bit_int( 117), #0117 0074h 2 Kvarh(+) T4 INT32 N/A 1.0 - block.add_32bit_int( 119), #0119 0076h 2 DMD VA ? INT32 Value weight: VA*10 N/A 1.0 - block.add_32bit_int( 121), #0121 0078h 2 DMD VA ? max INT32 Value weight: VA*10 N/A 1.0 - block.add_32bit_int( 123), #0123 007Ah 2 DMD A max INT32 Value weight: Ampere*1000 N/A 1.0 - - # def t_update(ctx, stop, module, device, refresh): @@ -121,30 +34,99 @@ def t_update(ctx, stop, module, device, refresh): while not stop.is_set(): try: + values = {} + values = device.read_all() + meters = device.meters() + batteries = device.batteries() + values["meters"] = {} + values["batteries"] = {} + + for meter, params in meters.items(): + meter_values = params.read_all() + values["meters"][meter] = meter_values + + for battery, params in batteries.items(): + battery_values = params.read_all() + values["batteries"][battery] = battery_values + + meterValues = values["meters"]["Meter1"] + + + + # print("current:"+str(meterValues['current'])) + + # print(meterValues['current']*10**meterValues['current_scale']) + # print(meterValues['p1_current']*10**meterValues['current_scale']) + # print(meterValues['p2_current']*10**meterValues['current_scale']) + # print(meterValues['p3_current']*10**meterValues['current_scale']) + + # print(meterValues['voltage_ln']*10**meterValues['voltage_scale']) + # print(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) + # print(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) + # print(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) + + # print(meterValues['voltage_ll']*10**meterValues['voltage_scale']) + # print(meterValues['p12_voltage']*10**meterValues['voltage_scale']) + # print(meterValues['p23_voltage']*10**meterValues['voltage_scale']) + # print(meterValues['p31_voltage']*10**meterValues['voltage_scale']) + + # print(meterValues['frequency']*10**meterValues['frequency_scale']) + + # print(meterValues['power']*10**meterValues['power_scale']) + # print(meterValues['p1_power']*10**meterValues['power_scale']) + # print(meterValues['p2_power']*10**meterValues['power_scale']) + # print(meterValues['p3_power']*10**meterValues['power_scale']) + + # print(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) + # print(meterValues['p1_power_apparent']*10**meterValues['power_apparent_scale']) + # print(meterValues['p2_power_apparent']*10**meterValues['power_apparent_scale']) + # print(meterValues['p3_power_apparent']*10**meterValues['power_apparent_scale']) + + # print(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) + # print(meterValues['p1_power_reactive']*10**meterValues['power_reactive_scale']) + # print(meterValues['p2_power_reactive']*10**meterValues['power_reactive_scale']) + # print(meterValues['p3_power_reactive']*10**meterValues['power_reactive_scale']) + + # print(meterValues['power_factor']*10**meterValues['power_factor_scale']) + # print(meterValues['p1_power_factor']*10**meterValues['power_factor_scale']) + # print(meterValues['p2_power_factor']*10**meterValues['power_factor_scale']) + # print(meterValues['p3_power_factor']*10**meterValues['power_factor_scale']) + + # print(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) + # print(meterValues['p1_export_energy_active']*10**meterValues['energy_active_scale']) + # print(meterValues['p2_export_energy_active']*10**meterValues['energy_active_scale']) + # print(meterValues['p3_export_energy_active']*10**meterValues['energy_active_scale']) + + # print(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) + # print(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) + # print(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) + # print(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) + + values = module.values(device) if not values: logger.debug(f"{this_t.name}: no new values") - continue + continue block_1001 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_1001.add_32bit_float(values.get("energy_active", 0)) # total active energy - block_1001.add_32bit_float(values.get("import_energy_active", 0)) # imported active energy + block_1001.add_32bit_float(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) # imported active energy block_1001.add_32bit_float(values.get("energy_active", 0)) # total active energy non-reset - block_1001.add_32bit_float(values.get("import_energy_active", 0)) # imported active energy non-reset + block_1001.add_32bit_float(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) # imported active energy non-reset block_1001.add_32bit_float(values.get("power_active", 0)) # total power block_1001.add_32bit_float(values.get("p1_power_active", 0)) # power l1 block_1001.add_32bit_float(values.get("p2_power_active", 0)) # power l2 block_1001.add_32bit_float(values.get("p3_power_active", 0)) # power l3 - block_1001.add_32bit_float(values.get("voltage_ln", 0)) # l-n voltage - block_1001.add_32bit_float(values.get("p1n_voltage", 0)) # l1-n voltage - block_1001.add_32bit_float(values.get("p2n_voltage", 0)) # l2-n voltage - block_1001.add_32bit_float(values.get("p3n_voltage", 0)) # l3-n voltage - block_1001.add_32bit_float(values.get("voltage_ll", 0)) # l-l voltage - block_1001.add_32bit_float(values.get("p12_voltage", 0)) # l1-l2 voltage - block_1001.add_32bit_float(values.get("p23_voltage", 0)) # l2-l3 voltage - block_1001.add_32bit_float(values.get("p31_voltage", 0)) # l3-l1 voltage - block_1001.add_32bit_float(values.get("frequency", 0)) # line frequency + block_1001.add_32bit_float(meterValues['voltage_ln']*10**meterValues['voltage_scale']) # l-n voltage + block_1001.add_32bit_float(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) # l1-n voltage + block_1001.add_32bit_float(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) # l2-n voltage + block_1001.add_32bit_float(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) # l3-n voltage + block_1001.add_32bit_float(meterValues['voltage_ll']*10**meterValues['voltage_scale']) # l-l voltage + block_1001.add_32bit_float(meterValues['p12_voltage']*10**meterValues['voltage_scale']) # l1-l2 voltage + block_1001.add_32bit_float(meterValues['p23_voltage']*10**meterValues['voltage_scale']) # l2-l3 voltage + block_1001.add_32bit_float(meterValues['p31_voltage']*10**meterValues['voltage_scale']) # l3-l1 voltage + block_1001.add_32bit_float(meterValues['frequency']*10**meterValues['frequency_scale']) # line frequency ctx.setValues(3, 1000, block_1001.to_registers()) block_1101 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) @@ -179,9 +161,9 @@ def t_update(ctx, stop, module, device, refresh): block_1101.add_32bit_float(values.get("p1_power_apparent", 0)) # apparent power l1 block_1101.add_32bit_float(values.get("p2_power_apparent", 0)) # apparent power l2 block_1101.add_32bit_float(values.get("p3_power_apparent", 0)) # apparent power l3 - block_1101.add_32bit_float(values.get("p1_current", 0)) # current l1 - block_1101.add_32bit_float(values.get("p2_current", 0)) # current l2 - block_1101.add_32bit_float(values.get("p3_current", 0)) # current l3 + block_1101.add_32bit_float(meterValues['p1_current']*10**meterValues['current_scale']) # current l1 + block_1101.add_32bit_float(meterValues['p2_current']*10**meterValues['current_scale']) # current l2 + block_1101.add_32bit_float(meterValues['p3_current']*10**meterValues['current_scale']) # current l3 block_1101.add_32bit_float(values.get("demand_power_active", 0)) # demand power block_1101.add_32bit_float(values.get("minimum_demand_power_active", 0)) # minimum demand power block_1101.add_32bit_float(values.get("maximum_demand_power_active", 0)) # maximum demand power @@ -254,89 +236,16 @@ def t_update(ctx, stop, module, device, refresh): slave_ctx = EM24SlaveContext() # slave_ctx = ModbusSlaveContext() - block_0x0000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - - block_0x0000.add_32bit_int( 1), #0001 0000h 2 V L1-N INT32 Value weight: Volt*10 N/A 1.0 - block_0x0000.add_32bit_int( 3), #0003 0002h 2 V L2-N INT32 N/A 1.0 - block_0x0000.add_32bit_int( 5), #0005 0004h 2 V L3-N INT32 N/A 1.0 - block_0x0000.add_32bit_int( 7), #0007 0006h 2 V L1-L2 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 9), #0009 0008h 2 V L2-L3 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 11), #0011 000Ah 2 V L3-L1 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 13), #0013 000Ch 2 A L1 INT32 Value weight: Ampere*1000 N/A 1.0 - block_0x0000.add_32bit_int( 15), #0015 000Eh 2 A L2 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 17), #0017 0010h 2 A L3 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 19), #0019 0012h 2 W L1 INT32 Value weight: Watt*10 N/A 1.0 - block_0x0000.add_32bit_int( 21), #0021 0014h 2 W L2 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 23), #0023 0016h 2 W L3 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 25), #0025 0018h 2 VA L1 INT32 Value weight: VA*10 N/A 1.0 - block_0x0000.add_32bit_int( 27), #0027 001Ah 2 VA L2 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 29), #0029 001Ch 2 VA L3 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 31), #0031 001Eh 2 VAR L1 INT32 Value weight: var*10 N/A 1.0 - block_0x0000.add_32bit_int( 33), #0033 0020h 2 VAR L2 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 35), #0035 0022h 2 VAR L3 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 37), #0037 0024h 2 V L-N ? INT32 Value weight: Volt*10 N/A 1.0 - block_0x0000.add_32bit_int( 39), #0039 0026h 2 V L-L ? INT32 N/A 1.0 - block_0x0000.add_32bit_int( 41), #0041 0028h 2 W ? INT32 Value weight: Watt*10 N/A 1.0 - block_0x0000.add_32bit_int( 43), #0043 002Ah 2 VA ? INT32 Value weight: VA*10 N/A 1.0 - block_0x0000.add_32bit_int( 45), #0045 002Ch 2 VAR ? INT32 Value weight: var*10 N/A 1.0 - block_0x0000.add_16bit_int( 47), #0047 002Eh 1 PF L1 INT16 Negative values correspond to lead(C), positive value correspond to lag(L) Value weight: PF*1000 N/A 1.0 - block_0x0000.add_16bit_int( 48), #0048 002Fh 1 PF L2 INT16 N/A 1.0 - block_0x0000.add_16bit_int( 49), #0049 0030h 1 PF L3 INT16 N/A 1.0 - block_0x0000.add_16bit_int( 50), #0050 0031h 1 PF ? INT16 N/A 1.0 - block_0x0000.add_16bit_int( 51), #0051 0032h 1 Phase sequence INT16 Value �1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) N/A 1.0 - block_0x0000.add_16bit_uint( 52),#0052 0033h 1 Hz UINT16 Value weight: Hz*10 N/A 1.0 - block_0x0000.add_32bit_int( 53), #0053 0034h 2 KWh(+) TOT INT32 Value weight: kWh*10 N/A 1.0 - block_0x0000.add_32bit_int( 55), #0055 0036h 2 Kvarh(+) TOT INT32 Value weight: kvarh*10 N/A 1.0 - block_0x0000.add_32bit_int( 57), #0057 0038h 2 DMD W ? INT32 Value weight: Watt*10 N/A 1.0 - block_0x0000.add_32bit_int( 59), #0059 003Ah 2 DMD W ? max INT32 Value weight: Watt*10 N/A 1.0 - block_0x0000.add_32bit_int( 61), #0061 003Ch 2 KWh(+) PAR INT32 Value weight: kWh*10 N/A 1.0 - block_0x0000.add_32bit_int( 63), #0063 003Eh 2 Kvarh(+) PAR INT32 Value weight: kvarh*10 N/A 1.0 - block_0x0000.add_32bit_int( 65), #0065 0040h 2 KWh(+) L1 INT32 Value weight: kWh*10 N/A 1.0 - block_0x0000.add_32bit_int( 67), #0067 0042h 2 KWh(+) L2 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 69), #0069 0044h 2 KWh(+) L3 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 71), #0071 0046h 2 KWh(+) T1 INT32 Value weight: kWh*10 N/A 1.0 - block_0x0000.add_32bit_int( 73), #0073 0048h 2 KWh(+) T2 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 75), #0075 004Ah 2 KWh(+) T3 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 77), #0077 004Ch 2 KWh(+) T4 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 79), #0079 004Eh 2 KWh(-) TOT INT32 Value weight: kWh*10 N/A 1.0 - block_0x0000.add_32bit_int( 81), #0081 0050h 2 Kvarh(-) TOT INT32 Value weight: kvarh*10 N/A 1.0 - block_0x0000.add_16bit_int( 83), #0083 1 unused - block_0x0000.add_16bit_int( 84), #0084 1 unused - block_0x0000.add_16bit_int( 85), #0085 1 unused - block_0x0000.add_16bit_int( 86), #0086 1 unused - block_0x0000.add_16bit_int( 87), #0087 1 unused - block_0x0000.add_16bit_int( 88), #0088 1 unused - block_0x0000.add_16bit_int( 89), #0089 1 unused - block_0x0000.add_16bit_int( 90), #0090 1 unused - block_0x0000.add_32bit_int( 91), #0091 005Ah 2 Hour INT32 Value weight: hour*100 N/A 1.0 - block_0x0000.add_16bit_int( 93), #0093 1 unused - block_0x0000.add_16bit_int( 94), #0094 1 unused - block_0x0000.add_16bit_int( 95), #0095 1 unused - block_0x0000.add_16bit_int( 96), #0096 1 unused - block_0x0000.add_16bit_int( 97), #0096 1 unused - block_0x0000.add_16bit_int( 98), #0097 1 unused - block_0x0000.add_16bit_int( 99), #0098 1 unused - block_0x0000.add_16bit_int( 101), #0099 1 unused - block_0x0000.add_16bit_int( 102), #0100 1 unused - block_0x0000.add_16bit_int( 103), #0101 1 unused - block_0x0000.add_16bit_int( 104), #0102 1 unused - block_0x0000.add_16bit_int( 105), #0103 1 unused - block_0x0000.add_16bit_int( 106), #0104 1 unused - block_0x0000.add_16bit_int( 107), #0105 1 unused - block_0x0000.add_16bit_int( 108), #0106 1 unused - block_0x0000.add_16bit_int( 109), #0107 1 unused - block_0x0000.add_16bit_int( 110), #0108 1 unused - block_0x0000.add_16bit_int( 110), #0109 1 unused - block_0x0000.add_16bit_int( 110), #0110 1 unused - block_0x0000.add_32bit_int( 111), #0111 006Eh 2 Kvarh(+) T1 INT32 Value weight: kvarh*10 N/A 1.0 - block_0x0000.add_32bit_int( 113), #0113 0070h 2 Kvarh(+) T2 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 115), #0115 0072h 2 Kvarh(+) T3 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 117), #0117 0074h 2 Kvarh(+) T4 INT32 N/A 1.0 - block_0x0000.add_32bit_int( 119), #0119 0076h 2 DMD VA ? INT32 Value weight: VA*10 N/A 1.0 - block_0x0000.add_32bit_int( 121), #0121 0078h 2 DMD VA ? max INT32 Value weight: VA*10 N/A 1.0 - block_0x0000.add_32bit_int( 123), #0123 007Ah 2 DMD A max INT32 Value weight: Ampere*1000 N/A 1.0 - - slave_ctx.setValues(3, 0x0000, block_0x0000.to_registers()) + # block_11 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + # block_11.add_16bit_int(1648) + # slave_ctx.setValues(3, 11, block_11.to_registers()) + + + block_1001 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + slave_ctx.setValues(3, 1000, block_1001.to_registers()) + + block_1101 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + slave_ctx.setValues(3, 1100, block_1101.to_registers()) update_t_stop = threading.Event() update_t = threading.Thread( diff --git a/SE-MTR-3Y-400V-A.conf b/SE-MTR-3Y-400V-A.conf index e2a2516..93f3c98 100644 --- a/SE-MTR-3Y-400V-A.conf +++ b/SE-MTR-3Y-400V-A.conf @@ -26,7 +26,7 @@ type=solaredge-inverter host=raspberrypi.fritz.box port=502 src_address=2 -dst_address=2 +dst_address=1 # Meters defined in [server] need a config section, one per meter. diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index aaaa77c..5a39e9b 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -150,9 +150,6 @@ def t_update(ctx, stop, module, device, refresh): logger.debug(f"{this_t.name}: no new values") continue - block_1001 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - - block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) block_40000.add_string("SunS") block_40000.add_16bit_int(1) diff --git a/devices/EM24.py b/devices/EM24.py new file mode 100644 index 0000000..8a82498 --- /dev/null +++ b/devices/EM24.py @@ -0,0 +1,153 @@ +import logging +import re +import solaredge_modbus + + +def device(config): + + # Configuration parameters: + # + # timeout seconds to wait for a response, default: 1 + # retries number of retries, default: 3 + # unit modbus address, default: 1 + # + # For Modbus TCP: + # host ip or hostname + # port modbus tcp port + # + # For Modbus RTU: + # device serial device, e.g. /dev/ttyUSB0 + # stopbits number of stop bits + # parity parity setting, N, E or O + # baud baud rate + + timeout = config.getint("timeout", fallback=1) + retries = config.getint("retries", fallback=3) + unit = config.getint("src_address", fallback=1) + + host = config.get("host", fallback=False) + port = config.getint("port", fallback=False) + device = config.get("device", fallback=False) + + if device: + stopbits = config.getint("stopbits", fallback=1) + parity = config.get("parity", fallback="N") + baud = config.getint("baud", fallback=2400) + + if (parity + and parity.upper() in ["N", "E", "O"]): + parity = parity.upper() + else: + parity = False + + return solaredge_modbus.Inverter( + device=device, + stopbits=stopbits, + parity=parity, + baud=baud, + timeout=timeout, + retries=retries, + unit=unit + ) + else: + return solaredge_modbus.Inverter( + host=host, + port=port, + timeout=timeout, + retries=retries, + unit=unit + ) + + +def values(device): + if not device: + return {} + + logger = logging.getLogger() + logger.debug(f"device: {device}") + + values = {} + inverter_values=device.read_all() + + # append type to key to prevent key name collision with legacy values + values = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in inverter_values.items()} + + meters = device.meters() + batteries = device.batteries() + values["connected_meters"] = {} + values["connected_batteries"] = {} + + for meter, params in meters.items(): + meter_values = params.read_all() + values["connected_meters"][meter] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in meter_values.items()} + + for battery, params in batteries.items(): + battery_values = params.read_all() + values["connected_batteries"][battery] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in battery_values.items()} + + logger.debug(f"values: {values}") + + # additional values for emulation of SE-WNC-3Y-400-MB-K1 or WattNode WNC-3Y-400-MB + + # TODO Calculate the values for the SE-WNC-3Y-400-MB-K1 meter from the SolarEdge meter provided by SE7K + SE_WNC_3Y_400_MB_K1_values = { + "energy_active": values.get("total_energy_active", 0), + "import_energy_active": values.get("import_energy_active", 0), + "power_active": values.get("total_power_active", 0), + "p1_power_active": values.get("p1_power_active", 0), + "p2_power_active": values.get("p2_power_active", 0), + "p3_power_active": values.get("p3_power_active", 0), + "voltage_ln": values.get("voltage_ln", 0), + "p1n_voltage": values.get("p1_voltage", 0), + "p2n_voltage": values.get("p2_voltage", 0), + "p3n_voltage": values.get("p3_voltage", 0), + "voltage_ll": values.get("voltage_ll", 0), + "p12_voltage": values.get("p12_voltage", 0), + "p23_voltage": values.get("p23_voltage", 0), + "p31_voltage": values.get("p31_voltage", 0), + "frequency": values.get("frequency", 0), + "p1_energy_active": values.get("total_energy_active", 0), + # "p2_energy_active" + # "p3_energy_active" + "p1_import_energy_active": values.get("import_energy_active", 0), + # "p2_import_energy_active" + # "p3_import_energy_active" + "export_energy_active": values.get("export_energy_active", 0), + "p1_export_energy_active": values.get("export_energy_active", 0), + # "p2_export_energy_active" + # "p3_export_energy_active" + "energy_reactive": values.get("total_energy_reactive", 0), + "p1_energy_reactive": values.get("total_energy_reactive", 0), + # "p2_energy_reactive" + # "p3_energy_reactive" + "energy_apparent": values.get("total_energy_apparent", 0), + "p1_energy_apparent": values.get("total_energy_apparent", 0), + # "p2_energy_apparent" + # "p3_energy_apparent" + "power_factor": values.get("total_power_factor", 0), + "p1_power_factor": values.get("p1_power_factor", 0), + "p2_power_factor": values.get("p2_power_factor", 0), + "p3_power_factor": values.get("p3_power_factor", 0), + "power_reactive": values.get("total_power_reactive", 0), + "p1_power_reactive": values.get("p1_power_reactive", 0), + "p2_power_reactive": values.get("p2_power_reactive", 0), + "p3_power_reactive": values.get("p3_power_reactive", 0), + "power_apparent": values.get("total_power_apparent", 0), + "p1_power_apparent": values.get("p1_power_apparent", 0), + "p2_power_apparent": values.get("p2_power_apparent", 0), + "p3_power_apparent": values.get("p3_power_apparent", 0), + "p1_current": values.get("p1_current", 0), + "p2_current": values.get("p2_current", 0), + "p3_current": values.get("p3_current", 0), + "demand_power_active": values.get("total_import_demand_power_active", 0), + # "minimum_demand_power_active" + "maximum_demand_power_active": values.get("maximum_import_demand_power_active", 0), + "demand_power_apparent": values.get("total_demand_power_apparent", 0), + "p1_demand_power_active": (values.get("p1_demand_current", 0) * values.get("p1_voltage", 0)), + "p2_demand_power_active": (values.get("p2_demand_current", 0) * values.get("p2_voltage", 0)), + "p3_demand_power_active": (values.get("p3_demand_current", 0) * values.get("p3_voltage", 0)) + } + + + return values | SE_WNC_3Y_400_MB_K1_values + # append type to key \ No newline at end of file From 38915a7533bc2fdf9917b87385b506a6fedd1ec8 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 2 Mar 2022 20:36:35 +0100 Subject: [PATCH 21/32] WIP --- EM24DINAV23XE1X-proxy-tcp.py | 198 +++++++++++++++++++++------------ documents/CarloGavazziEM24.pdf | Bin 0 -> 164848 bytes documents/em24_e1_cp.pdf | Bin 0 -> 652334 bytes 3 files changed, 129 insertions(+), 69 deletions(-) create mode 100644 documents/CarloGavazziEM24.pdf create mode 100644 documents/em24_e1_cp.pdf diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index b144aec..5c2409b 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -109,69 +109,78 @@ def t_update(ctx, stop, module, device, refresh): logger.debug(f"{this_t.name}: no new values") continue - block_1001 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_1001.add_32bit_float(values.get("energy_active", 0)) # total active energy - block_1001.add_32bit_float(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) # imported active energy - block_1001.add_32bit_float(values.get("energy_active", 0)) # total active energy non-reset - block_1001.add_32bit_float(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) # imported active energy non-reset - block_1001.add_32bit_float(values.get("power_active", 0)) # total power - block_1001.add_32bit_float(values.get("p1_power_active", 0)) # power l1 - block_1001.add_32bit_float(values.get("p2_power_active", 0)) # power l2 - block_1001.add_32bit_float(values.get("p3_power_active", 0)) # power l3 - block_1001.add_32bit_float(meterValues['voltage_ln']*10**meterValues['voltage_scale']) # l-n voltage - block_1001.add_32bit_float(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) # l1-n voltage - block_1001.add_32bit_float(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) # l2-n voltage - block_1001.add_32bit_float(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) # l3-n voltage - block_1001.add_32bit_float(meterValues['voltage_ll']*10**meterValues['voltage_scale']) # l-l voltage - block_1001.add_32bit_float(meterValues['p12_voltage']*10**meterValues['voltage_scale']) # l1-l2 voltage - block_1001.add_32bit_float(meterValues['p23_voltage']*10**meterValues['voltage_scale']) # l2-l3 voltage - block_1001.add_32bit_float(meterValues['p31_voltage']*10**meterValues['voltage_scale']) # l3-l1 voltage - block_1001.add_32bit_float(meterValues['frequency']*10**meterValues['frequency_scale']) # line frequency - ctx.setValues(3, 1000, block_1001.to_registers()) - - block_1101 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_1101.add_32bit_float(values.get("p1_energy_active", 0)) # total active energy l1 - block_1101.add_32bit_float(values.get("p2_energy_active", 0)) # total active energy l2 - block_1101.add_32bit_float(values.get("p3_energy_active", 0)) # total active energy l3 - block_1101.add_32bit_float(values.get("p1_import_energy_active", 0)) # imported active energy l1 - block_1101.add_32bit_float(values.get("p2_import_energy_active", 0)) # imported active energy l2 - block_1101.add_32bit_float(values.get("p3_import_energy_active", 0)) # imported active energy l3 - block_1101.add_32bit_float(values.get("export_energy_active", 0)) # total exported active energy - block_1101.add_32bit_float(values.get("export_energy_active", 0)) # total exported active energy non-reset - block_1101.add_32bit_float(values.get("p1_export_energy_active", 0)) # exported energy l1 - block_1101.add_32bit_float(values.get("p2_export_energy_active", 0)) # exported energy l2 - block_1101.add_32bit_float(values.get("p3_export_energy_active", 0)) # exported energy l3 - block_1101.add_32bit_float(values.get("energy_reactive", 0)) # total reactive energy - block_1101.add_32bit_float(values.get("p1_energy_reactive", 0)) # reactive energy l1 - block_1101.add_32bit_float(values.get("p2_energy_reactive", 0)) # reactive energy l2 - block_1101.add_32bit_float(values.get("p3_energy_reactive", 0)) # reactive energy l3 - block_1101.add_32bit_float(values.get("energy_apparent", 0)) # total apparent energy - block_1101.add_32bit_float(values.get("p1_energy_apparent", 0)) # apparent energy l1 - block_1101.add_32bit_float(values.get("p2_energy_apparent", 0)) # apparent energy l2 - block_1101.add_32bit_float(values.get("p3_energy_apparent", 0)) # apparent energy l3 - block_1101.add_32bit_float(values.get("power_factor", 0)) # power factor - block_1101.add_32bit_float(values.get("p1_power_factor", 0)) # power factor l1 - block_1101.add_32bit_float(values.get("p2_power_factor", 0)) # power factor l2 - block_1101.add_32bit_float(values.get("p3_power_factor", 0)) # power factor l3 - block_1101.add_32bit_float(values.get("power_reactive", 0)) # total reactive power - block_1101.add_32bit_float(values.get("p1_power_reactive", 0)) # reactive power l1 - block_1101.add_32bit_float(values.get("p2_power_reactive", 0)) # reactive power l2 - block_1101.add_32bit_float(values.get("p3_power_reactive", 0)) # reactive power l3 - block_1101.add_32bit_float(values.get("power_apparent", 0)) # total apparent power - block_1101.add_32bit_float(values.get("p1_power_apparent", 0)) # apparent power l1 - block_1101.add_32bit_float(values.get("p2_power_apparent", 0)) # apparent power l2 - block_1101.add_32bit_float(values.get("p3_power_apparent", 0)) # apparent power l3 - block_1101.add_32bit_float(meterValues['p1_current']*10**meterValues['current_scale']) # current l1 - block_1101.add_32bit_float(meterValues['p2_current']*10**meterValues['current_scale']) # current l2 - block_1101.add_32bit_float(meterValues['p3_current']*10**meterValues['current_scale']) # current l3 - block_1101.add_32bit_float(values.get("demand_power_active", 0)) # demand power - block_1101.add_32bit_float(values.get("minimum_demand_power_active", 0)) # minimum demand power - block_1101.add_32bit_float(values.get("maximum_demand_power_active", 0)) # maximum demand power - block_1101.add_32bit_float(values.get("demand_power_apparent", 0)) # apparent demand power - block_1101.add_32bit_float(values.get("p1_demand_power_active", 0)) # demand power l1 - block_1101.add_32bit_float(values.get("p2_demand_power_active", 0)) # demand power l2 - block_1101.add_32bit_float(values.get("p3_demand_power_active", 0)) # demand power l3 - ctx.setValues(3, 1100, block_1101.to_registers()) + block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_0.add_32bit_int(meterValues['p1n_voltage']) # l1-n voltage + block_0.add_32bit_int(meterValues['p2n_voltage']) # l2-n voltage + block_0.add_32bit_int(meterValues['p3n_voltage']) # l3-n voltage + block_0.add_32bit_int(meterValues['p12_voltage']) # l1-l2 voltage + block_0.add_32bit_int(meterValues['p23_voltage']) # l2-l3 voltage + block_0.add_32bit_int(meterValues['p31_voltage']) # l3-l1 voltage + block_0.add_32bit_int(meterValues['p1_current']) # current l1 + block_0.add_32bit_int(meterValues['p2_current']) # current l2 + block_0.add_32bit_int(meterValues['p3_current']) # current l3 + block_0.add_32bit_int(meterValues['p1_power_active']) # power l1 + block_0.add_32bit_int(meterValues['p2_power_active']) # power l2 + block_0.add_32bit_int(meterValues['p3_power_active']) # power l3 + block_0.add_32bit_int(meterValues['p1_power_apparent']) # apparent power l1 + block_0.add_32bit_int(meterValues['p2_power_apparent']) # apparent power l2 + block_0.add_32bit_int(meterValues['p3_power_apparent']) # apparent power l3 + block_0.add_32bit_int(meterValues['p1_power_reactive']) # reactive power l1 + block_0.add_32bit_int(meterValues['p2_power_reactive']) # reactive power l2 + block_0.add_32bit_int(meterValues['p3_power_reactive']) # reactive power l3 + block_0.add_32bit_int(meterValues['voltage_ln']) # l-n voltage + block_0.add_32bit_int(meterValues['voltage_ll']) # l-l voltage + block_0.add_32bit_int(meterValues['power_active']) # total power + block_0.add_32bit_int(meterValues['power_apparent']) # total apparent power + block_0.add_32bit_int(meterValues['power_reactive']) # total reactive power + block_0.add_16bit_int(meterValues['p1_power_factor']) # power factor l1 + block_0.add_16bit_int(meterValues['p2_power_factor']) # power factor l2 + block_0.add_16bit_int(meterValues['p3_power_factor']) # power factor l3 + block_0.add_16bit_int(meterValues['power_factor']) # power factor + block_0.add_16bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) + + block_0.add_16bit_uint(meterValues['frequency']) # line frequency + + block_0.add_32bit_int(meterValues['export_energy_active']) # total exported active energy non-reset + block_0.add_32bit_int(meterValues['export_energy_apparent']) # imported active energy + block_0.add_32bit_int(meterValues['demand_power_active']) # demand power + block_0.add_32bit_int(meterValues['maximum_demand_power_active']) # maximum demand power + block_0.add_32bit_int(meterValues['energy_active']) # total active energy + block_0.add_32bit_int(meterValues['energy_apparent']) # total apparent energy + block_0.add_32bit_int(meterValues['p1_import_energy_active']) # imported active energy l1 + block_0.add_32bit_int(meterValues['p2_import_energy_active']) # imported active energy l2 + block_0.add_32bit_int(meterValues['p3_import_energy_active']) # imported active energy l3 + block_0.add_32bit_int(10) # total active energy Tarif 1 + block_0.add_32bit_int(20) # total active energy Tarif 2 + block_0.add_32bit_int(30) # total active energy Tarif 3 + block_0.add_32bit_int(40) # total active energy Tarif 4 + block_0.add_32bit_int(meterValues['import_energy_active']) # imported active energy + block_0.add_32bit_int(meterValues['import_energy_apparent']) # imported active energy + block_0.add_32bit_int(24000) # total active energy Tarif 4 + block_0.add_32bit_int(11) # total apparent energy Tarif 1 + block_0.add_32bit_int(22) # total apparent energy Tarif 2 + block_0.add_32bit_int(33) # total apparent energy Tarif 3 + block_0.add_32bit_int(44) # total apparent energy Tarif 4 + block_0.add_32bit_int(meterValues['demand_power_apparent']) # apparent demand power + block_0.add_32bit_int(meterValues['demand_power_apparent']) # apparent demand power max + block_0.add_32bit_int(meterValues['demand_power_apparent']) # DMD A max + ctx.setValues(3, 0, block_0.to_registers()) + + ## unused values + # "energy_reactive" # total reactive energy + # "p1_export_energy_active", 0)) # exported energy l1 + # "p2_export_energy_active", 0)) # exported energy l2 + # "p3_export_energy_active", 0)) # exported energy l3 + # "p1_energy_reactive", 0)) # reactive energy l1 + # "p2_energy_reactive", 0)) # reactive energy l2 + # "p3_energy_reactive", 0)) # reactive energy l3 + # "p1_energy_apparent", 0)) # apparent energy l1 + # "p2_energy_apparent", 0)) # apparent energy l2 + # "p3_energy_apparent", 0)) # apparent energy l3 + # "minimum_demand_power_active", 0)) # minimum demand power + # "p1_demand_power_active", 0)) # demand power l1 + # "p2_demand_power_active", 0)) # demand power l2 + # "p3_demand_power_active", 0)) # demand power l3 except Exception as e: logger.critical(f"{this_t.name}: {e}") finally: @@ -240,12 +249,63 @@ def t_update(ctx, stop, module, device, refresh): # block_11.add_16bit_int(1648) # slave_ctx.setValues(3, 11, block_11.to_registers()) - - block_1001 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - slave_ctx.setValues(3, 1000, block_1001.to_registers()) - - block_1101 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - slave_ctx.setValues(3, 1100, block_1101.to_registers()) + block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_0.add_32bit_int(1234) + slave_ctx.setValues(3, 0, block_0.to_registers()) + + block_770 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_770.add_16bit_int(4126) # Version and revision measurment module + block_770.add_16bit_int(68) # + block_770.add_16bit_int(4127) # Version and revision communication module + block_770.add_16bit_int(67) # + block_770.add_16bit_int(0) # Current tariff + slave_ctx.setValues(3, 770, block_770.to_registers()) + + block_848 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_848.add_16bit_int(4128) # Measurement module’s firmware CRC + slave_ctx.setValues(3, 848, block_848.to_registers()) + + block_20480 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_20480.add_string("MB24DINAV23XE1X") + slave_ctx.setValues(3, 20480, block_20480.to_registers()) + + block_41216 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_41216.add_16bit_int(3) # Front selector status + slave_ctx.setValues(3, 41216, block_41216.to_registers()) + + block_4096 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_4096.add_16bit_int(9999) # PASSWORD + block_4096.add_16bit_int(0) # unused + block_4096.add_16bit_int(0) # Measuring system + block_4096.add_32bit_int(10) # Current transformer ratio + block_4096.add_32bit_int(10) # Voltage transformer ratio + block_4096.add_16bit_int(1) # unused + block_4096.add_16bit_int(2) # unused + block_4096.add_16bit_int(3) # unused + block_4096.add_16bit_int(4) # unused + block_4096.add_16bit_int(5) # unused + block_4096.add_16bit_int(6) # unused + block_4096.add_16bit_int(7) # unused + block_4096.add_16bit_int(8) # unused + block_4096.add_16bit_int(9) # unused + block_4096.add_32bit_int(15) # Interval time + slave_ctx.setValues(3, 4096, block_4096.to_registers()) + + block_4360 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_4360.add_16bit_int(2) # PASSWORD + block_4360.add_16bit_int(2) # PASSWORD + slave_ctx.setValues(3, 4360, block_4360.to_registers()) + + block_40960 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_40960.add_16bit_int(1) # Type of application + block_40960.add_16bit_int(3) # Default page for selector position “LOCK” + block_40960.add_16bit_int(1) # Default page for selector position “1” + block_40960.add_16bit_int(3) # Default page for selector position “2” + block_40960.add_16bit_int(3) # Default page for selector position “kvarh” + block_40960.add_16bit_int(1) # ID code of user 1 + block_40960.add_16bit_int(2) # ID code of user 2 + block_40960.add_16bit_int(3) # ID code of user 3 + slave_ctx.setValues(3, 40960, block_40960.to_registers()) update_t_stop = threading.Event() update_t = threading.Thread( diff --git a/documents/CarloGavazziEM24.pdf b/documents/CarloGavazziEM24.pdf new file mode 100644 index 0000000000000000000000000000000000000000..db552405bf19d9c5c21080595b60a36531d995a3 GIT binary patch literal 164848 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 z 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%0A*BBY`5 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%0Dn}L?0LeysC<5fn1hkgR?34i*I~<5 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

!UZyi)?> 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Ð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 z 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 z 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 z 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 }>@k11wUfVE>Jt0;>!Z&*qgLqq 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 Q6)L`ZvaFsh?fdHg164Eu=Kufz literal 0 HcmV?d00001 From e3290975df37053ce18ab9eb9c146b54b2e30d1b Mon Sep 17 00:00:00 2001 From: ixtrader Date: Thu, 3 Mar 2022 10:17:01 +0100 Subject: [PATCH 22/32] first functional Code. Values proved so far. --- EM24DINAV23XE1X-proxy-tcp.py | 149 ++++++++++++++++++++--------------- 1 file changed, 87 insertions(+), 62 deletions(-) diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index 5c2409b..c25fdc2 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -53,54 +53,79 @@ def t_update(ctx, stop, module, device, refresh): - # print("current:"+str(meterValues['current'])) - - # print(meterValues['current']*10**meterValues['current_scale']) - # print(meterValues['p1_current']*10**meterValues['current_scale']) - # print(meterValues['p2_current']*10**meterValues['current_scale']) - # print(meterValues['p3_current']*10**meterValues['current_scale']) - - # print(meterValues['voltage_ln']*10**meterValues['voltage_scale']) + print("current:"+str(meterValues['current'])) + print(str(meterValues['current']*10**meterValues['current_scale'])) + #print(meterValues['p1_current']*10**meterValues['current_scale']) + #print(meterValues['p2_current']*10**meterValues['current_scale']) + #print(meterValues['p3_current']*10**meterValues['current_scale']) + print(meterValues['current_scale']) + + print("voltage_ln:"+str(meterValues['voltage_ln'])) + print(meterValues['voltage_ln']*10**meterValues['voltage_scale']) # print(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) # print(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) # print(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) - - # print(meterValues['voltage_ll']*10**meterValues['voltage_scale']) + print(meterValues['voltage_scale']) + + print("voltage_ll:"+str(meterValues['voltage_ll'])) + print(meterValues['voltage_ll']*10**meterValues['voltage_scale']) # print(meterValues['p12_voltage']*10**meterValues['voltage_scale']) # print(meterValues['p23_voltage']*10**meterValues['voltage_scale']) # print(meterValues['p31_voltage']*10**meterValues['voltage_scale']) + print(meterValues['voltage_scale']) + - # print(meterValues['frequency']*10**meterValues['frequency_scale']) + print("frequency:"+str(meterValues['frequency'])) + print(meterValues['frequency']*10**meterValues['frequency_scale']) - # print(meterValues['power']*10**meterValues['power_scale']) + print("power:"+str(meterValues['power'])) + print(meterValues['power']*10**meterValues['power_scale']) # print(meterValues['p1_power']*10**meterValues['power_scale']) # print(meterValues['p2_power']*10**meterValues['power_scale']) # print(meterValues['p3_power']*10**meterValues['power_scale']) + print(meterValues['power_scale']) - # print(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) + print("power_apparent:"+str(meterValues['power_apparent'])) + print(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) # print(meterValues['p1_power_apparent']*10**meterValues['power_apparent_scale']) # print(meterValues['p2_power_apparent']*10**meterValues['power_apparent_scale']) # print(meterValues['p3_power_apparent']*10**meterValues['power_apparent_scale']) + print(meterValues['power_apparent_scale']) - # print(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) + print("power_reactive:"+str(meterValues['power_reactive'])) + print(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) # print(meterValues['p1_power_reactive']*10**meterValues['power_reactive_scale']) # print(meterValues['p2_power_reactive']*10**meterValues['power_reactive_scale']) # print(meterValues['p3_power_reactive']*10**meterValues['power_reactive_scale']) + print(meterValues['power_reactive_scale']) - # print(meterValues['power_factor']*10**meterValues['power_factor_scale']) + print("power_factor:"+str(meterValues['power_factor'])) + print(meterValues['power_factor']*10**meterValues['power_factor_scale']) # print(meterValues['p1_power_factor']*10**meterValues['power_factor_scale']) # print(meterValues['p2_power_factor']*10**meterValues['power_factor_scale']) # print(meterValues['p3_power_factor']*10**meterValues['power_factor_scale']) + print(meterValues['power_factor_scale']) - # print(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) + print("export_energy_active:"+str(meterValues['export_energy_active'])) + print(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) # print(meterValues['p1_export_energy_active']*10**meterValues['energy_active_scale']) # print(meterValues['p2_export_energy_active']*10**meterValues['energy_active_scale']) # print(meterValues['p3_export_energy_active']*10**meterValues['energy_active_scale']) + print(meterValues['energy_active_scale']) + + print("import_energy_active:"+str(meterValues['import_energy_active'])) + print(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) + # print(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) + # print(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) + # print(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) + print(meterValues['energy_active_scale']) - # print(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) + print("import_energy_apparent:"+str(meterValues['import_energy_apparent'])) + print(meterValues['import_energy_apparent']*10**meterValues['energy_apparent_scale']) # print(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) # print(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) # print(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) + print(meterValues['energy_apparent_scale']) values = module.values(device) @@ -110,60 +135,60 @@ def t_update(ctx, stop, module, device, refresh): continue block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_0.add_32bit_int(meterValues['p1n_voltage']) # l1-n voltage - block_0.add_32bit_int(meterValues['p2n_voltage']) # l2-n voltage - block_0.add_32bit_int(meterValues['p3n_voltage']) # l3-n voltage - block_0.add_32bit_int(meterValues['p12_voltage']) # l1-l2 voltage - block_0.add_32bit_int(meterValues['p23_voltage']) # l2-l3 voltage - block_0.add_32bit_int(meterValues['p31_voltage']) # l3-l1 voltage - block_0.add_32bit_int(meterValues['p1_current']) # current l1 - block_0.add_32bit_int(meterValues['p2_current']) # current l2 - block_0.add_32bit_int(meterValues['p3_current']) # current l3 - block_0.add_32bit_int(meterValues['p1_power_active']) # power l1 - block_0.add_32bit_int(meterValues['p2_power_active']) # power l2 - block_0.add_32bit_int(meterValues['p3_power_active']) # power l3 - block_0.add_32bit_int(meterValues['p1_power_apparent']) # apparent power l1 - block_0.add_32bit_int(meterValues['p2_power_apparent']) # apparent power l2 - block_0.add_32bit_int(meterValues['p3_power_apparent']) # apparent power l3 - block_0.add_32bit_int(meterValues['p1_power_reactive']) # reactive power l1 - block_0.add_32bit_int(meterValues['p2_power_reactive']) # reactive power l2 - block_0.add_32bit_int(meterValues['p3_power_reactive']) # reactive power l3 - block_0.add_32bit_int(meterValues['voltage_ln']) # l-n voltage - block_0.add_32bit_int(meterValues['voltage_ll']) # l-l voltage - block_0.add_32bit_int(meterValues['power_active']) # total power - block_0.add_32bit_int(meterValues['power_apparent']) # total apparent power - block_0.add_32bit_int(meterValues['power_reactive']) # total reactive power - block_0.add_16bit_int(meterValues['p1_power_factor']) # power factor l1 - block_0.add_16bit_int(meterValues['p2_power_factor']) # power factor l2 - block_0.add_16bit_int(meterValues['p3_power_factor']) # power factor l3 - block_0.add_16bit_int(meterValues['power_factor']) # power factor + block_0.add_32bit_int(int(meterValues['p1n_voltage']/10)) # l1-n voltage * 10 + block_0.add_32bit_int(int(meterValues['p2n_voltage']/10)) # l2-n voltage + block_0.add_32bit_int(int(meterValues['p3n_voltage']/10)) # l3-n voltage + block_0.add_32bit_int(int(meterValues['p12_voltage']/10)) # l1-l2 voltage + block_0.add_32bit_int(int(meterValues['p23_voltage']/10)) # l2-l3 voltage + block_0.add_32bit_int(int(meterValues['p31_voltage']/10)) # l3-l1 voltage + block_0.add_32bit_int(meterValues['p1_current']*100) # current l1 * 1000 + block_0.add_32bit_int(meterValues['p2_current']*100) # current l2 + block_0.add_32bit_int(meterValues['p3_current']*100) # current l3 + block_0.add_32bit_int(meterValues['p1_power']*10) # power l1 *10 + block_0.add_32bit_int(meterValues['p2_power']*10) # power l2 + block_0.add_32bit_int(meterValues['p3_power']*10) # power l3 + block_0.add_32bit_int(meterValues['p1_power_apparent']*10) # apparent power l1 *10 + block_0.add_32bit_int(meterValues['p2_power_apparent']*10) # apparent power l2 + block_0.add_32bit_int(meterValues['p3_power_apparent']*10) # apparent power l3 + block_0.add_32bit_int(meterValues['p1_power_reactive']*10) # reactive power l1 *10 + block_0.add_32bit_int(meterValues['p2_power_reactive']*10) # reactive power l2 + block_0.add_32bit_int(meterValues['p3_power_reactive']*10) # reactive power l3 + block_0.add_32bit_int(int(meterValues['voltage_ln']/10)) # l-n voltage *10 + block_0.add_32bit_int(int(meterValues['voltage_ll']/10)) # l-l voltage + block_0.add_32bit_int(meterValues['power']*10) # total power *10 + block_0.add_32bit_int(meterValues['power_apparent']*10) # total apparent power + block_0.add_32bit_int(meterValues['power_reactive']*10) # total reactive power + block_0.add_16bit_int(int(meterValues['p1_power_factor']/10)) # power factor l1 *1000 + block_0.add_16bit_int(int(meterValues['p2_power_factor']/10)) # power factor l2 + block_0.add_16bit_int(int(meterValues['p3_power_factor']/10)) # power factor l3 + block_0.add_16bit_int(int(meterValues['power_factor']/10)) # power factor block_0.add_16bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_0.add_16bit_uint(meterValues['frequency']) # line frequency - - block_0.add_32bit_int(meterValues['export_energy_active']) # total exported active energy non-reset - block_0.add_32bit_int(meterValues['export_energy_apparent']) # imported active energy - block_0.add_32bit_int(meterValues['demand_power_active']) # demand power - block_0.add_32bit_int(meterValues['maximum_demand_power_active']) # maximum demand power - block_0.add_32bit_int(meterValues['energy_active']) # total active energy - block_0.add_32bit_int(meterValues['energy_apparent']) # total apparent energy - block_0.add_32bit_int(meterValues['p1_import_energy_active']) # imported active energy l1 - block_0.add_32bit_int(meterValues['p2_import_energy_active']) # imported active energy l2 - block_0.add_32bit_int(meterValues['p3_import_energy_active']) # imported active energy l3 + block_0.add_16bit_uint(int(meterValues['frequency']/10)) # line frequency *10 + + block_0.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_0.add_32bit_int(56) # demand power + block_0.add_32bit_int(58) # maximum demand power + block_0.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['p1_import_energy_active']/100)) # imported active energy l1 + block_0.add_32bit_int(int(meterValues['p2_import_energy_active']/100)) # imported active energy l2 + block_0.add_32bit_int(int(meterValues['p3_import_energy_active']/100)) # imported active energy l3 block_0.add_32bit_int(10) # total active energy Tarif 1 block_0.add_32bit_int(20) # total active energy Tarif 2 block_0.add_32bit_int(30) # total active energy Tarif 3 block_0.add_32bit_int(40) # total active energy Tarif 4 - block_0.add_32bit_int(meterValues['import_energy_active']) # imported active energy - block_0.add_32bit_int(meterValues['import_energy_apparent']) # imported active energy - block_0.add_32bit_int(24000) # total active energy Tarif 4 - block_0.add_32bit_int(11) # total apparent energy Tarif 1 + block_0.add_32bit_int(int(meterValues['export_energy_active']/100)) # total exported active energy non-reset /100) + block_0.add_32bit_int(int(meterValues['export_energy_apparent']/100)) # imported active energy non-reset + block_0.add_32bit_int(2400) # hour *100 + block_0.add_32bit_int(11) # total apparent energy Tarif 1 *10 block_0.add_32bit_int(22) # total apparent energy Tarif 2 block_0.add_32bit_int(33) # total apparent energy Tarif 3 block_0.add_32bit_int(44) # total apparent energy Tarif 4 - block_0.add_32bit_int(meterValues['demand_power_apparent']) # apparent demand power - block_0.add_32bit_int(meterValues['demand_power_apparent']) # apparent demand power max - block_0.add_32bit_int(meterValues['demand_power_apparent']) # DMD A max + block_0.add_32bit_int(118) # apparent demand power + block_0.add_32bit_int(120) # apparent demand power max + block_0.add_32bit_int(122) # DMD A max *10 ctx.setValues(3, 0, block_0.to_registers()) ## unused values From 413b82f1330d5eb2d62090391d9a593a22f19772 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Sat, 5 Mar 2022 00:15:21 +0100 Subject: [PATCH 23/32] readable by the openwb EM24 Module and the Gavazzi config software --- EM24DINAV23XE1X-proxy-tcp.py | 256 +++++++++++++++++++++++------------ 1 file changed, 172 insertions(+), 84 deletions(-) diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index c25fdc2..65a00be 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -21,7 +21,7 @@ class EM24SlaveContext(ModbusSlaveContext): def getValues(self, fx, address, count=1): if (address == 11 and count==1): - print("Return Gavazzi Model number 1648") + logger.info("Return Gavazzi Model number 1648") return [1648] return super().getValues(fx, address, count) @@ -53,79 +53,79 @@ def t_update(ctx, stop, module, device, refresh): - print("current:"+str(meterValues['current'])) - print(str(meterValues['current']*10**meterValues['current_scale'])) - #print(meterValues['p1_current']*10**meterValues['current_scale']) - #print(meterValues['p2_current']*10**meterValues['current_scale']) - #print(meterValues['p3_current']*10**meterValues['current_scale']) - print(meterValues['current_scale']) - - print("voltage_ln:"+str(meterValues['voltage_ln'])) - print(meterValues['voltage_ln']*10**meterValues['voltage_scale']) - # print(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) - # print(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) - # print(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) - print(meterValues['voltage_scale']) - - print("voltage_ll:"+str(meterValues['voltage_ll'])) - print(meterValues['voltage_ll']*10**meterValues['voltage_scale']) - # print(meterValues['p12_voltage']*10**meterValues['voltage_scale']) - # print(meterValues['p23_voltage']*10**meterValues['voltage_scale']) - # print(meterValues['p31_voltage']*10**meterValues['voltage_scale']) - print(meterValues['voltage_scale']) + logger.info("current:"+str(meterValues['current'])) + logger.info(str(meterValues['current']*10**meterValues['current_scale'])) + logger.info(meterValues['p1_current']*10**meterValues['current_scale']) + logger.info(meterValues['p2_current']*10**meterValues['current_scale']) + logger.info(meterValues['p3_current']*10**meterValues['current_scale']) + logger.debug(meterValues['current_scale']) + + logger.debug("voltage_ln:"+str(meterValues['voltage_ln'])) + logger.debug(meterValues['voltage_ln']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['voltage_scale']) + + logger.debug("voltage_ll:"+str(meterValues['voltage_ll'])) + logger.debug(meterValues['voltage_ll']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p12_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p23_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p31_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['voltage_scale']) - print("frequency:"+str(meterValues['frequency'])) - print(meterValues['frequency']*10**meterValues['frequency_scale']) - - print("power:"+str(meterValues['power'])) - print(meterValues['power']*10**meterValues['power_scale']) - # print(meterValues['p1_power']*10**meterValues['power_scale']) - # print(meterValues['p2_power']*10**meterValues['power_scale']) - # print(meterValues['p3_power']*10**meterValues['power_scale']) - print(meterValues['power_scale']) - - print("power_apparent:"+str(meterValues['power_apparent'])) - print(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) - # print(meterValues['p1_power_apparent']*10**meterValues['power_apparent_scale']) - # print(meterValues['p2_power_apparent']*10**meterValues['power_apparent_scale']) - # print(meterValues['p3_power_apparent']*10**meterValues['power_apparent_scale']) - print(meterValues['power_apparent_scale']) - - print("power_reactive:"+str(meterValues['power_reactive'])) - print(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) - # print(meterValues['p1_power_reactive']*10**meterValues['power_reactive_scale']) - # print(meterValues['p2_power_reactive']*10**meterValues['power_reactive_scale']) - # print(meterValues['p3_power_reactive']*10**meterValues['power_reactive_scale']) - print(meterValues['power_reactive_scale']) - - print("power_factor:"+str(meterValues['power_factor'])) - print(meterValues['power_factor']*10**meterValues['power_factor_scale']) - # print(meterValues['p1_power_factor']*10**meterValues['power_factor_scale']) - # print(meterValues['p2_power_factor']*10**meterValues['power_factor_scale']) - # print(meterValues['p3_power_factor']*10**meterValues['power_factor_scale']) - print(meterValues['power_factor_scale']) - - print("export_energy_active:"+str(meterValues['export_energy_active'])) - print(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) - # print(meterValues['p1_export_energy_active']*10**meterValues['energy_active_scale']) - # print(meterValues['p2_export_energy_active']*10**meterValues['energy_active_scale']) - # print(meterValues['p3_export_energy_active']*10**meterValues['energy_active_scale']) - print(meterValues['energy_active_scale']) - - print("import_energy_active:"+str(meterValues['import_energy_active'])) - print(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) - # print(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) - # print(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) - # print(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) - print(meterValues['energy_active_scale']) - - print("import_energy_apparent:"+str(meterValues['import_energy_apparent'])) - print(meterValues['import_energy_apparent']*10**meterValues['energy_apparent_scale']) - # print(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) - # print(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) - # print(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) - print(meterValues['energy_apparent_scale']) + logger.info("frequency:"+str(meterValues['frequency'])) + logger.info(meterValues['frequency']*10**meterValues['frequency_scale']) + + logger.info("power:"+str(meterValues['power'])) + logger.info(meterValues['power']*10**meterValues['power_scale']) + logger.info(meterValues['p1_power']*10**meterValues['power_scale']) + logger.info(meterValues['p2_power']*10**meterValues['power_scale']) + logger.info(meterValues['p3_power']*10**meterValues['power_scale']) + logger.info(meterValues['power_scale']) + + logger.info("power_apparent:"+str(meterValues['power_apparent'])) + logger.info(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['p1_power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['p2_power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['p3_power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['power_apparent_scale']) + + logger.info("power_reactive:"+str(meterValues['power_reactive'])) + logger.info(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['p1_power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['p2_power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['p3_power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['power_reactive_scale']) + + logger.info("power_factor:"+str(meterValues['power_factor'])) + logger.info(meterValues['power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['p1_power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['p2_power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['p3_power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['power_factor_scale']) + + logger.debug("export_energy_active:"+str(meterValues['export_energy_active'])) + logger.debug(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p1_export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p2_export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p3_export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['energy_active_scale']) + + logger.debug("import_energy_active:"+str(meterValues['import_energy_active'])) + logger.debug(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['energy_active_scale']) + + logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent'])) + logger.debug(meterValues['import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['p1_import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['p2_import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['p3_import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['energy_apparent_scale']) values = module.values(device) @@ -144,20 +144,20 @@ def t_update(ctx, stop, module, device, refresh): block_0.add_32bit_int(meterValues['p1_current']*100) # current l1 * 1000 block_0.add_32bit_int(meterValues['p2_current']*100) # current l2 block_0.add_32bit_int(meterValues['p3_current']*100) # current l3 - block_0.add_32bit_int(meterValues['p1_power']*10) # power l1 *10 - block_0.add_32bit_int(meterValues['p2_power']*10) # power l2 - block_0.add_32bit_int(meterValues['p3_power']*10) # power l3 - block_0.add_32bit_int(meterValues['p1_power_apparent']*10) # apparent power l1 *10 - block_0.add_32bit_int(meterValues['p2_power_apparent']*10) # apparent power l2 - block_0.add_32bit_int(meterValues['p3_power_apparent']*10) # apparent power l3 - block_0.add_32bit_int(meterValues['p1_power_reactive']*10) # reactive power l1 *10 - block_0.add_32bit_int(meterValues['p2_power_reactive']*10) # reactive power l2 - block_0.add_32bit_int(meterValues['p3_power_reactive']*10) # reactive power l3 + block_0.add_32bit_int(meterValues['p1_power']*-10) # power l1 *10 + block_0.add_32bit_int(meterValues['p2_power']*-10) # power l2 + block_0.add_32bit_int(meterValues['p3_power']*-10) # power l3 + block_0.add_32bit_int(meterValues['p1_power_apparent']*-10) # apparent power l1 *10 + block_0.add_32bit_int(meterValues['p2_power_apparent']*-10) # apparent power l2 + block_0.add_32bit_int(meterValues['p3_power_apparent']*-10) # apparent power l3 + block_0.add_32bit_int(meterValues['p1_power_reactive']*-10) # reactive power l1 *10 + block_0.add_32bit_int(meterValues['p2_power_reactive']*-10) # reactive power l2 + block_0.add_32bit_int(meterValues['p3_power_reactive']*-10) # reactive power l3 block_0.add_32bit_int(int(meterValues['voltage_ln']/10)) # l-n voltage *10 block_0.add_32bit_int(int(meterValues['voltage_ll']/10)) # l-l voltage - block_0.add_32bit_int(meterValues['power']*10) # total power *10 - block_0.add_32bit_int(meterValues['power_apparent']*10) # total apparent power - block_0.add_32bit_int(meterValues['power_reactive']*10) # total reactive power + block_0.add_32bit_int(meterValues['power']*-10) # total power *10 + block_0.add_32bit_int(meterValues['power_apparent']*-10) # total apparent power + block_0.add_32bit_int(meterValues['power_reactive']*-10) # total reactive power block_0.add_16bit_int(int(meterValues['p1_power_factor']/10)) # power factor l1 *1000 block_0.add_16bit_int(int(meterValues['p2_power_factor']/10)) # power factor l2 block_0.add_16bit_int(int(meterValues['p3_power_factor']/10)) # power factor l3 @@ -190,6 +190,85 @@ def t_update(ctx, stop, module, device, refresh): block_0.add_32bit_int(120) # apparent demand power max block_0.add_32bit_int(122) # DMD A max *10 ctx.setValues(3, 0, block_0.to_registers()) + ctx.setValues(4, 0, block_0.to_registers()) + + block_254 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_254.add_32bit_int(2400) # hour *100 *100 + block_254.add_32bit_int(256) # unused *100 + block_254.add_32bit_int(int(meterValues['voltage_ln']/10)) # l-n voltage *10 + block_254.add_32bit_int(int(meterValues['voltage_ll']/10)) # l-l voltage + block_254.add_32bit_int(meterValues['power']*-10) # total power *10 + block_254.add_32bit_int(meterValues['power_apparent']*-10) # total apparent power + block_254.add_32bit_int(meterValues['power_reactive']*-10) # total reactive power + block_254.add_32bit_int(int(meterValues['power_factor']/10)) # power factor + block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) + block_254.add_32bit_int(int(meterValues['frequency']/10)) # line frequency *10 + block_254.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['export_energy_active']/100)) # total exported active energy non-reset /100) + block_254.add_32bit_int(int(meterValues['export_energy_apparent']/100)) # imported active energy non-reset + block_254.add_32bit_int(56) # demand power + block_254.add_32bit_int(58) # maximum demand power + + + + + block_254.add_32bit_int(int(meterValues['p12_voltage']/10)) # l1-l2 voltage + block_254.add_32bit_int(int(meterValues['p1n_voltage']/10)) # l1-n voltage * 10 + block_254.add_32bit_int(meterValues['p1_current']*100) # current l1 * 1000 + block_254.add_32bit_int(meterValues['p1_power']*-10) # power l1 *10 + block_254.add_32bit_int(meterValues['p1_power_apparent']*-10) # apparent power l1 *10 + block_254.add_32bit_int(meterValues['p1_power_reactive']*-10) # reactive power l1 *10 + block_254.add_32bit_int(int(meterValues['p1_power_factor']/10)) # power factor l1 *1000 + + block_254.add_32bit_int(int(meterValues['p23_voltage']/10)) # l2-l3 voltage + block_254.add_32bit_int(int(meterValues['p2n_voltage']/10)) # l2-n voltage + block_254.add_32bit_int(meterValues['p2_current']*100) # current l2 + block_254.add_32bit_int(meterValues['p2_power']*-10) # power l2 + block_254.add_32bit_int(meterValues['p2_power_apparent']*-10) # apparent power l2 + block_254.add_32bit_int(meterValues['p2_power_reactive']*-10) # reactive power l2 + block_254.add_32bit_int(int(meterValues['p2_power_factor']/10)) # power factor l2 + + block_254.add_32bit_int(int(meterValues['p31_voltage']/10)) # l3-l1 voltage + block_254.add_32bit_int(int(meterValues['p3n_voltage']/10)) # l3-n voltage + block_254.add_32bit_int(meterValues['p3_current']*100) # current l3 + block_254.add_32bit_int(meterValues['p3_power']*-10) # power l3 + block_254.add_32bit_int(meterValues['p3_power_apparent']*-10) # apparent power l3 + block_254.add_32bit_int(meterValues['p3_power_reactive']*-10) # reactive power l3 + block_254.add_32bit_int(int(meterValues['p3_power_factor']/10)) # power factor l3 + + block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) + + block_254.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['p1_import_energy_active']/100)) # imported active energy l1 + block_254.add_32bit_int(int(meterValues['p2_import_energy_active']/100)) # imported active energy l2 + block_254.add_32bit_int(int(meterValues['p3_import_energy_active']/100)) # imported active energy l3 + block_254.add_32bit_int(10) # total active energy Tarif 1 + block_254.add_32bit_int(20) # total active energy Tarif 2 + block_254.add_32bit_int(30) # total active energy Tarif 3 + block_254.add_32bit_int(40) # total active energy Tarif 4 + block_254.add_32bit_int(346) # unused *100 + block_254.add_32bit_int(348) # unused *100 + block_254.add_32bit_int(350) # unused *100 + block_254.add_32bit_int(352) # unused *100 + block_254.add_32bit_int(11) # total apparent energy Tarif 1 *10 + block_254.add_32bit_int(22) # total apparent energy Tarif 2 + block_254.add_32bit_int(33) # total apparent energy Tarif 3 + block_254.add_32bit_int(44) # total apparent energy Tarif 4 + block_254.add_32bit_int(262) # unused *100 + block_254.add_32bit_int(264) # unused *100 + block_254.add_32bit_int(266) # unused *100 + block_254.add_32bit_int(268) # unused *100 + block_254.add_32bit_int(270) # unused *100 + block_254.add_32bit_int(272) # unused *100 + block_254.add_32bit_int(274) # unused *100 + block_254.add_32bit_int(276) # unused *100 + block_254.add_32bit_int(118) # apparent demand power + block_254.add_32bit_int(120) # apparent demand power max + block_254.add_32bit_int(122) # DMD A max *10 + ctx.setValues(3, 254, block_254.to_registers()) + ctx.setValues(4, 254, block_254.to_registers()) ## unused values # "energy_reactive" # total reactive energy @@ -273,10 +352,12 @@ def t_update(ctx, stop, module, device, refresh): # block_11 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) # block_11.add_16bit_int(1648) # slave_ctx.setValues(3, 11, block_11.to_registers()) + # slave_ctx.setValues(4, 11, block_11.to_registers()) block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_0.add_32bit_int(1234) slave_ctx.setValues(3, 0, block_0.to_registers()) + slave_ctx.setValues(4, 0, block_0.to_registers()) block_770 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_770.add_16bit_int(4126) # Version and revision measurment module @@ -285,18 +366,22 @@ def t_update(ctx, stop, module, device, refresh): block_770.add_16bit_int(67) # block_770.add_16bit_int(0) # Current tariff slave_ctx.setValues(3, 770, block_770.to_registers()) + slave_ctx.setValues(4, 770, block_770.to_registers()) block_848 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_848.add_16bit_int(4128) # Measurement module’s firmware CRC slave_ctx.setValues(3, 848, block_848.to_registers()) + slave_ctx.setValues(4, 848, block_848.to_registers()) block_20480 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_20480.add_string("MB24DINAV23XE1X") slave_ctx.setValues(3, 20480, block_20480.to_registers()) + slave_ctx.setValues(4, 20480, block_20480.to_registers()) block_41216 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_41216.add_16bit_int(3) # Front selector status slave_ctx.setValues(3, 41216, block_41216.to_registers()) + slave_ctx.setValues(4, 41216, block_41216.to_registers()) block_4096 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_4096.add_16bit_int(9999) # PASSWORD @@ -315,11 +400,13 @@ def t_update(ctx, stop, module, device, refresh): block_4096.add_16bit_int(9) # unused block_4096.add_32bit_int(15) # Interval time slave_ctx.setValues(3, 4096, block_4096.to_registers()) + slave_ctx.setValues(4, 4096, block_4096.to_registers()) block_4360 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_4360.add_16bit_int(2) # PASSWORD block_4360.add_16bit_int(2) # PASSWORD slave_ctx.setValues(3, 4360, block_4360.to_registers()) + slave_ctx.setValues(4, 4360, block_4360.to_registers()) block_40960 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_40960.add_16bit_int(1) # Type of application @@ -331,6 +418,7 @@ def t_update(ctx, stop, module, device, refresh): block_40960.add_16bit_int(2) # ID code of user 2 block_40960.add_16bit_int(3) # ID code of user 3 slave_ctx.setValues(3, 40960, block_40960.to_registers()) + slave_ctx.setValues(4, 40960, block_40960.to_registers()) update_t_stop = threading.Event() update_t = threading.Thread( From 56f43cd48c4655997566ceb2e3a112e180a678dc Mon Sep 17 00:00:00 2001 From: ixtrader Date: Tue, 8 Mar 2022 23:40:38 +0100 Subject: [PATCH 24/32] integraged EM24 ans SE7K Proxy --- EM24DINAV23XE1X-proxy-tcp.py | 216 ++++++---- SE7K-EM24-PROXY.cmd | 2 + SE7K-EM24-proxy-tcp.py | 753 +++++++++++++++++++++++++++++++++++ devices/EM24.py | 153 ------- 4 files changed, 893 insertions(+), 231 deletions(-) create mode 100644 SE7K-EM24-PROXY.cmd create mode 100644 SE7K-EM24-proxy-tcp.py delete mode 100644 devices/EM24.py diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index 65a00be..36a3166 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -8,7 +8,10 @@ import threading import time +sys.path.append('C:\gitHubClones\pymodbus') + from pymodbus.server.sync import StartTcpServer +from pymodbus.server.sync import ModbusTcpServer from pymodbus.constants import Endian from pymodbus.device import ModbusDeviceIdentification from pymodbus.transaction import ModbusSocketFramer @@ -17,16 +20,73 @@ from pymodbus.datastore import ModbusServerContext from pymodbus.payload import BinaryPayloadBuilder + + sys.path.append('C:/gitHubClones/modbus/solaredge_modbus/src') class EM24SlaveContext(ModbusSlaveContext): def getValues(self, fx, address, count=1): if (address == 11 and count==1): - logger.info("Return Gavazzi Model number 1648") + logger.info("Gavazzi Model number 1648 supplied") return [1648] return super().getValues(fx, address, count) +class ModbusMyTcpServer(ModbusTcpServer): + clientCounter = 0 + + def process_request(self, request, client): + """ Callback for connecting a new client thread + + :param request: The request to handle + :param client: The address of the client + """ + self.clientCounter += 1 + logger = logging.getLogger() + logger.info("Started thread to serve client at " + str(client) + " clientCounter = " + str(self.clientCounter)) + super().process_request(request,client) + + def shutdown(self): + """ Stops the serve_forever loop. + + Overridden to signal handlers to stop. + """ + logger = logging.getLogger() + logger.info("shutdown to serve client") + super().shutdown() + + def server_close(self): + """ Callback for stopping the running server + """ + logger = logging.getLogger() + logger.debug("Modbus server stopped") + super().server_close() + + +# --------------------------------------------------------------------------- # +# Creation Factorie +# --------------------------------------------------------------------------- # +def StartMyTcpServer(context=None, identity=None, address=None, + custom_functions=[], **kwargs): + """ A factory to start and run a tcp modbus server + + :param context: The ModbusServerContext datastore + :param identity: An optional identify structure + :param address: An optional (interface, port) to bind to. + :param custom_functions: An optional list of custom function classes + supported by server instance. + :param ignore_missing_slaves: True to not send errors on a request to a + missing slave + """ + framer = kwargs.pop("framer", ModbusSocketFramer) + server = ModbusMyTcpServer(context, framer, identity, address, **kwargs) + + for f in custom_functions: + server.decoder.register(f) + server.serve_forever() + + + def t_update(ctx, stop, module, device, refresh): this_t = threading.currentThread() @@ -51,81 +111,80 @@ def t_update(ctx, stop, module, device, refresh): meterValues = values["meters"]["Meter1"] - - - logger.info("current:"+str(meterValues['current'])) - logger.info(str(meterValues['current']*10**meterValues['current_scale'])) - logger.info(meterValues['p1_current']*10**meterValues['current_scale']) - logger.info(meterValues['p2_current']*10**meterValues['current_scale']) - logger.info(meterValues['p3_current']*10**meterValues['current_scale']) - logger.debug(meterValues['current_scale']) - - logger.debug("voltage_ln:"+str(meterValues['voltage_ln'])) - logger.debug(meterValues['voltage_ln']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['voltage_scale']) - - logger.debug("voltage_ll:"+str(meterValues['voltage_ll'])) - logger.debug(meterValues['voltage_ll']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p12_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p23_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p31_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['voltage_scale']) - - - logger.info("frequency:"+str(meterValues['frequency'])) - logger.info(meterValues['frequency']*10**meterValues['frequency_scale']) - - logger.info("power:"+str(meterValues['power'])) - logger.info(meterValues['power']*10**meterValues['power_scale']) - logger.info(meterValues['p1_power']*10**meterValues['power_scale']) - logger.info(meterValues['p2_power']*10**meterValues['power_scale']) - logger.info(meterValues['p3_power']*10**meterValues['power_scale']) - logger.info(meterValues['power_scale']) - - logger.info("power_apparent:"+str(meterValues['power_apparent'])) - logger.info(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['p1_power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['p2_power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['p3_power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['power_apparent_scale']) - - logger.info("power_reactive:"+str(meterValues['power_reactive'])) - logger.info(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['p1_power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['p2_power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['p3_power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['power_reactive_scale']) - - logger.info("power_factor:"+str(meterValues['power_factor'])) - logger.info(meterValues['power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['p1_power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['p2_power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['p3_power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['power_factor_scale']) - - logger.debug("export_energy_active:"+str(meterValues['export_energy_active'])) - logger.debug(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p1_export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p2_export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p3_export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['energy_active_scale']) - - logger.debug("import_energy_active:"+str(meterValues['import_energy_active'])) - logger.debug(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['energy_active_scale']) - - logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent'])) - logger.debug(meterValues['import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['p1_import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['p2_import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['p3_import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['energy_apparent_scale']) + if logger.isEnabledFor(logging.DEBUG): + logger.info("current:"+str(meterValues['current'])) + logger.info(str(meterValues['current']*10**meterValues['current_scale'])) + logger.info(meterValues['p1_current']*10**meterValues['current_scale']) + logger.info(meterValues['p2_current']*10**meterValues['current_scale']) + logger.info(meterValues['p3_current']*10**meterValues['current_scale']) + logger.debug(meterValues['current_scale']) + + logger.debug("voltage_ln:"+str(meterValues['voltage_ln'])) + logger.debug(meterValues['voltage_ln']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['voltage_scale']) + + logger.debug("voltage_ll:"+str(meterValues['voltage_ll'])) + logger.debug(meterValues['voltage_ll']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p12_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p23_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p31_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['voltage_scale']) + + + logger.info("frequency:"+str(meterValues['frequency'])) + logger.info(meterValues['frequency']*10**meterValues['frequency_scale']) + + logger.info("power:"+str(meterValues['power'])) + logger.info(meterValues['power']*10**meterValues['power_scale']) + logger.info(meterValues['p1_power']*10**meterValues['power_scale']) + logger.info(meterValues['p2_power']*10**meterValues['power_scale']) + logger.info(meterValues['p3_power']*10**meterValues['power_scale']) + logger.info(meterValues['power_scale']) + + logger.info("power_apparent:"+str(meterValues['power_apparent'])) + logger.info(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['p1_power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['p2_power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['p3_power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['power_apparent_scale']) + + logger.info("power_reactive:"+str(meterValues['power_reactive'])) + logger.info(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['p1_power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['p2_power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['p3_power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['power_reactive_scale']) + + logger.info("power_factor:"+str(meterValues['power_factor'])) + logger.info(meterValues['power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['p1_power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['p2_power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['p3_power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['power_factor_scale']) + + logger.debug("export_energy_active:"+str(meterValues['export_energy_active'])) + logger.debug(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p1_export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p2_export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p3_export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['energy_active_scale']) + + logger.debug("import_energy_active:"+str(meterValues['import_energy_active'])) + logger.debug(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['energy_active_scale']) + + logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent'])) + logger.debug(meterValues['import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['p1_import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['p2_import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['p3_import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['energy_apparent_scale']) values = module.values(device) @@ -437,6 +496,7 @@ def t_update(ctx, stop, module, device, refresh): thread_stops.append(update_t_stop) slaves.update({address: slave_ctx}) + slaves.update({2: slave_ctx}) logger.info(f"Created {update_t}: {meter} {meter_type} {meter_device}") if not slaves: @@ -454,12 +514,12 @@ def t_update(ctx, stop, module, device, refresh): server_ctx = ModbusServerContext(slaves=slaves, single=False) time.sleep(1) - + for t in threads: t.start() logger.info(f"Starting {t}") - StartTcpServer( + StartMyTcpServer( server_ctx, framer=framer, identity=identity, diff --git a/SE7K-EM24-PROXY.cmd b/SE7K-EM24-PROXY.cmd new file mode 100644 index 0000000..8281ff4 --- /dev/null +++ b/SE7K-EM24-PROXY.cmd @@ -0,0 +1,2 @@ +echo use -v for more information +python SE7K-EM24-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf %* \ No newline at end of file diff --git a/SE7K-EM24-proxy-tcp.py b/SE7K-EM24-proxy-tcp.py new file mode 100644 index 0000000..f43d98f --- /dev/null +++ b/SE7K-EM24-proxy-tcp.py @@ -0,0 +1,753 @@ +#!/usr/bin/env python3 + +import argparse +import configparser +import importlib +import logging +import sys +import threading +import time + +sys.path.append('C:\gitHubClones\pymodbus') + +from pymodbus.server.sync import StartTcpServer +from pymodbus.server.sync import ModbusTcpServer +from pymodbus.constants import Endian +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.transaction import ModbusSocketFramer +from pymodbus.transaction import ModbusRtuFramer +from pymodbus.datastore import ModbusSlaveContext +from pymodbus.datastore import ModbusServerContext +from pymodbus.payload import BinaryPayloadBuilder + + + +sys.path.append('C:/gitHubClones/modbus/solaredge_modbus/src') +class EM24SlaveContext(ModbusSlaveContext): + def getValues(self, fx, address, count=1): + if (address == 11 and count==1): + logger.info("Gavazzi Model number 1648 supplied") + return [1648] + return super().getValues(fx, address, count) + + + +class ModbusMyTcpServer(ModbusTcpServer): + clientCounter = 0 + + def process_request(self, request, client): + """ Callback for connecting a new client thread + + :param request: The request to handle + :param client: The address of the client + """ + self.clientCounter += 1 + logger = logging.getLogger() + logger.info("Started thread to serve client at " + str(client) + " clientCounter = " + str(self.clientCounter)) + super().process_request(request,client) + + def shutdown(self): + """ Stops the serve_forever loop. + + Overridden to signal handlers to stop. + """ + logger = logging.getLogger() + logger.info("shutdown to serve client") + super().shutdown() + + def server_close(self): + """ Callback for stopping the running server + """ + logger = logging.getLogger() + logger.debug("Modbus server stopped") + super().server_close() + + +# --------------------------------------------------------------------------- # +# Creation Factorie +# --------------------------------------------------------------------------- # +def StartMyTcpServer(context=None, identity=None, address=None, + custom_functions=[], **kwargs): + """ A factory to start and run a tcp modbus server + + :param context: The ModbusServerContext datastore + :param identity: An optional identify structure + :param address: An optional (interface, port) to bind to. + :param custom_functions: An optional list of custom function classes + supported by server instance. + :param ignore_missing_slaves: True to not send errors on a request to a + missing slave + """ + framer = kwargs.pop("framer", ModbusSocketFramer) + server = ModbusMyTcpServer(context, framer, identity, address, **kwargs) + + for f in custom_functions: + server.decoder.register(f) + server.serve_forever() + + +def setMeterValues(values, block): + if not values: + block.add_16bit_uint(0) + block.add_16bit_uint(0) + return + + block.add_16bit_uint(1) + block.add_16bit_uint(65) + block.add_string (values.get("c_manufacturer_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_string (values.get("c_model_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_string (values.get("c_option_str" ,"1234567890123456").ljust(16,' ')) + block.add_string (values.get("c_version_str" ,"1234567890123456").ljust(16,' ')) + block.add_string (values.get("c_serialnumber_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_16bit_int (values.get("c_deviceaddress_int" , 0)) + + block.add_16bit_int (values.get("c_sunspec_did_int" , 103)) + block.add_16bit_int (values.get("c_sunspec_length_int", 50)) + block.add_16bit_uint(values.get("current_int" , 0)) + block.add_16bit_uint(values.get("p1_current_int" , 0)) + block.add_16bit_uint(values.get("p2_current_int" , 0)) + block.add_16bit_uint(values.get("p3_current_int" , 0)) + block.add_16bit_int (values.get("current_scale_int" , 0)) + + block.add_16bit_uint(values.get("voltage_ln_int" , 0)) + block.add_16bit_uint(values.get("p1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("p2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block.add_16bit_uint(values.get("voltage_ll_int" , 0)) + block.add_16bit_uint(values.get("p1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("p2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block.add_16bit_int (values.get("voltage_scale_int" , 0)) + + block.add_16bit_uint(values.get("frequency_int" , 0)) + block.add_16bit_int (values.get("frequency_scale_int" , 0)) + + block.add_16bit_int(values.get("power_int" , 0)) + block.add_16bit_int(values.get("p1_power_int" , 0)) + block.add_16bit_int(values.get("p2_power_int" , 0)) + block.add_16bit_int(values.get("p3_power_int" , 0)) + block.add_16bit_int (values.get("power_scale_int" , 0)) + + block.add_16bit_int(values.get("power_apparent_int" , 0)) + block.add_16bit_int(values.get("p1_power_apparent_int" , 0)) + block.add_16bit_int(values.get("p2_power_apparent_int" , 0)) + block.add_16bit_int(values.get("p3_power_apparent_int" , 0)) + block.add_16bit_int (values.get("power_apparent_scale_int" , 0)) + + block.add_16bit_int(values.get("power_reactive_int" , 0)) + block.add_16bit_int(values.get("p1_power_reactive_int" , 0)) + block.add_16bit_int(values.get("p2_power_reactive_int" , 0)) + block.add_16bit_int(values.get("p3_power_reactive_int" , 0)) + block.add_16bit_int (values.get("power_reactive_scale_int" , 0)) + + block.add_16bit_int(values.get("power_factor_int" , 0)) + block.add_16bit_int(values.get("p1_power_factor_int" , 0)) + block.add_16bit_int(values.get("p2_power_factor_int" , 0)) + block.add_16bit_int(values.get("p3_power_factor_int" , 0)) + block.add_16bit_int (values.get("power_factor_scale_int" , 0)) + + block.add_32bit_uint(values.get("export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p1_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_active_int" , 0)) + block.add_16bit_int (values.get("energy_active_scale_int" , 0)) + + block.add_32bit_uint(values.get("export_energy_apparent_int", 0)) + block.add_32bit_uint(values.get("p1_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_apparent_int" , 0)) + block.add_16bit_int (values.get("energy_apparent_scale_int" , 0)) + + block.add_32bit_uint(values.get("import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("p1_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("p2_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("p3_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("p1_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("p1_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("p2_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("p3_export_energy_reactive_q4_int" , 0)) + block.add_16bit_int (values.get("energy_reactive_scale_int" , 0)) + + block.add_32bit_uint(values.get("events_int" , 0)) + # + + +def setBatteryValues(values, block): + if not values: + block.add_16bit_uint(0) + block.add_16bit_uint(0) + return + + block.add_16bit_uint(1) ## TODO set correct values + block.add_16bit_uint(65) ## TODO set correct values + +def t_update_se7k(ctx, stop, module, device, refresh): + + this_t = threading.currentThread() + logger = logging.getLogger() + + try: + values = module.values(device) + + if not values: + return + + block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + block_40000.add_string("SunS") + block_40000.add_16bit_int(1) + block_40000.add_16bit_int (values.get("C_SunSpec_Length_int", 65)) + block_40000.add_string (values.get("c_manufacturer_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_string (values.get("c_model_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_string ( "NOT_IMPLEMENTED.".ljust(16,' ')) + block_40000.add_string (values.get("c_version_str" ,"1234567890123456").ljust(16,' ')) + block_40000.add_string (values.get("c_serialnumber_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_16bit_int (values.get("c_deviceaddress_int" , 0)) + + block_40000.add_16bit_int (values.get("c_sunspec_did_int" , 103)) + block_40000.add_16bit_int (50) + block_40000.add_16bit_uint(values.get("current_int" , 0)) + block_40000.add_16bit_uint(values.get("p1_current_int" , 0)) + block_40000.add_16bit_uint(values.get("p2_current_int" , 0)) + block_40000.add_16bit_uint(values.get("p3_current_int" , 0)) + block_40000.add_16bit_int (values.get("current_scale_int" , 0)) + + block_40000.add_16bit_uint(values.get("p1_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p2_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p3_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p1n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p2n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block_40000.add_16bit_int (values.get("voltage_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_ac_int" , 0)) + block_40000.add_16bit_int (values.get("power_ac_scale_int" , 0)) + + block_40000.add_16bit_uint(values.get("frequency_int" , 0)) + block_40000.add_16bit_int (values.get("frequency_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_apparent_int" , 0)) + block_40000.add_16bit_int (values.get("power_apparent_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_reactive_int" , 0)) + block_40000.add_16bit_int (values.get("power_reactive_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_factor_int" , 0)) + block_40000.add_16bit_int (values.get("power_factor_scale_int" , 0)) + + block_40000.add_32bit_uint(values.get("energy_total_int" , 0)) + block_40000.add_16bit_int (values.get("energy_total_scale_int" , 0)) + + block_40000.add_16bit_uint(values.get("current_dc_int" , 0)) + block_40000.add_16bit_int (values.get("current_dc_scale_int" , 0)) + + block_40000.add_16bit_uint(values.get("voltage_dc_int" , 0)) + block_40000.add_16bit_int (values.get("voltage_dc_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_dc_int" , 0)) + block_40000.add_16bit_int (values.get("power_dc_scale_int" , 0)) + + block_40000.add_16bit_int(0) # 1 dummy word + + block_40000.add_16bit_int(values.get("temperature_int" , 0)) + block_40000.add_16bit_int(values.get("temperature_scale_int" , 0)) + + block_40000.add_16bit_int(0) # 1 dummy word + block_40000.add_16bit_int(0) # 1 dummy word + + block_40000.add_16bit_uint(values.get("status_int" , 0)) + block_40000.add_16bit_uint(values.get("vendor_status_int" , 0)) + + block_40000.add_16bit_uint(values.get("rrcr_state_int" , 0)) + block_40000.add_16bit_int(values.get("active_power_limit_int" , 0)) + block_40000.add_32bit_float(values.get("cosphi" , 0)) + + block_40000.add_string("123456789012345678901234") # 12 dummy worter = 24 Byte + ctx.setValues(3, 40000, block_40000.to_registers()) + + block_40121 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + setMeterValues(values["connected_meters"]["Meter1"],block_40121) + ctx.setValues(3, 40121, block_40121.to_registers()) + + # block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 40295, block_40295.to_registers()) + # block_40469 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 40469, block_40469.to_registers()) + + # block_57598 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 57598, block_57598.to_registers()) + # block_57854 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 57854, block_57854.to_registers()) + + except Exception as e: + logger.critical(f"{this_t.name}: {e}") + + + + +def t_update(ctx, SE7K_CTX, stop, module, device, refresh): + + this_t = threading.currentThread() + logger = logging.getLogger() + + while not stop.is_set(): + try: + t_update_se7k(SE7K_CTX, stop, module, device, refresh) + values = {} + values = device.read_all() + meters = device.meters() + batteries = device.batteries() + values["meters"] = {} + values["batteries"] = {} + + for meter, params in meters.items(): + meter_values = params.read_all() + values["meters"][meter] = meter_values + + for battery, params in batteries.items(): + battery_values = params.read_all() + values["batteries"][battery] = battery_values + + meterValues = values["meters"]["Meter1"] + logger.info(meterValues['power']*10**meterValues['power_scale']) + + if logger.isEnabledFor(logging.DEBUG): + logger.info("current:"+str(meterValues['current'])) + logger.info(str(meterValues['current']*10**meterValues['current_scale'])) + logger.info(meterValues['p1_current']*10**meterValues['current_scale']) + logger.info(meterValues['p2_current']*10**meterValues['current_scale']) + logger.info(meterValues['p3_current']*10**meterValues['current_scale']) + logger.debug(meterValues['current_scale']) + + logger.debug("voltage_ln:"+str(meterValues['voltage_ln'])) + logger.debug(meterValues['voltage_ln']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['voltage_scale']) + + logger.debug("voltage_ll:"+str(meterValues['voltage_ll'])) + logger.debug(meterValues['voltage_ll']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p12_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p23_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['p31_voltage']*10**meterValues['voltage_scale']) + logger.debug(meterValues['voltage_scale']) + + + logger.info("frequency:"+str(meterValues['frequency'])) + logger.info(meterValues['frequency']*10**meterValues['frequency_scale']) + + logger.info("power:"+str(meterValues['power'])) + logger.info(meterValues['power']*10**meterValues['power_scale']) + logger.info(meterValues['p1_power']*10**meterValues['power_scale']) + logger.info(meterValues['p2_power']*10**meterValues['power_scale']) + logger.info(meterValues['p3_power']*10**meterValues['power_scale']) + logger.info(meterValues['power_scale']) + + logger.info("power_apparent:"+str(meterValues['power_apparent'])) + logger.info(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['p1_power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['p2_power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['p3_power_apparent']*10**meterValues['power_apparent_scale']) + logger.info(meterValues['power_apparent_scale']) + + logger.info("power_reactive:"+str(meterValues['power_reactive'])) + logger.info(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['p1_power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['p2_power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['p3_power_reactive']*10**meterValues['power_reactive_scale']) + logger.info(meterValues['power_reactive_scale']) + + logger.info("power_factor:"+str(meterValues['power_factor'])) + logger.info(meterValues['power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['p1_power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['p2_power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['p3_power_factor']*10**meterValues['power_factor_scale']) + logger.info(meterValues['power_factor_scale']) + + logger.debug("export_energy_active:"+str(meterValues['export_energy_active'])) + logger.debug(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p1_export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p2_export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p3_export_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['energy_active_scale']) + + logger.debug("import_energy_active:"+str(meterValues['import_energy_active'])) + logger.debug(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) + logger.debug(meterValues['energy_active_scale']) + + logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent'])) + logger.debug(meterValues['import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['p1_import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['p2_import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['p3_import_energy_apparent']*10**meterValues['energy_apparent_scale']) + logger.debug(meterValues['energy_apparent_scale']) + + + values = module.values(device) + + if not values: + logger.debug(f"{this_t.name}: no new values") + continue + + block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_0.add_32bit_int(int(meterValues['p1n_voltage']/10)) # l1-n voltage * 10 + block_0.add_32bit_int(int(meterValues['p2n_voltage']/10)) # l2-n voltage + block_0.add_32bit_int(int(meterValues['p3n_voltage']/10)) # l3-n voltage + block_0.add_32bit_int(int(meterValues['p12_voltage']/10)) # l1-l2 voltage + block_0.add_32bit_int(int(meterValues['p23_voltage']/10)) # l2-l3 voltage + block_0.add_32bit_int(int(meterValues['p31_voltage']/10)) # l3-l1 voltage + block_0.add_32bit_int(meterValues['p1_current']*100) # current l1 * 1000 + block_0.add_32bit_int(meterValues['p2_current']*100) # current l2 + block_0.add_32bit_int(meterValues['p3_current']*100) # current l3 + block_0.add_32bit_int(meterValues['p1_power']*-10) # power l1 *10 + block_0.add_32bit_int(meterValues['p2_power']*-10) # power l2 + block_0.add_32bit_int(meterValues['p3_power']*-10) # power l3 + block_0.add_32bit_int(meterValues['p1_power_apparent']*-10) # apparent power l1 *10 + block_0.add_32bit_int(meterValues['p2_power_apparent']*-10) # apparent power l2 + block_0.add_32bit_int(meterValues['p3_power_apparent']*-10) # apparent power l3 + block_0.add_32bit_int(meterValues['p1_power_reactive']*-10) # reactive power l1 *10 + block_0.add_32bit_int(meterValues['p2_power_reactive']*-10) # reactive power l2 + block_0.add_32bit_int(meterValues['p3_power_reactive']*-10) # reactive power l3 + block_0.add_32bit_int(int(meterValues['voltage_ln']/10)) # l-n voltage *10 + block_0.add_32bit_int(int(meterValues['voltage_ll']/10)) # l-l voltage + block_0.add_32bit_int(meterValues['power']*-10) # total power *10 + block_0.add_32bit_int(meterValues['power_apparent']*-10) # total apparent power + block_0.add_32bit_int(meterValues['power_reactive']*-10) # total reactive power + block_0.add_16bit_int(int(meterValues['p1_power_factor']/10)) # power factor l1 *1000 + block_0.add_16bit_int(int(meterValues['p2_power_factor']/10)) # power factor l2 + block_0.add_16bit_int(int(meterValues['p3_power_factor']/10)) # power factor l3 + block_0.add_16bit_int(int(meterValues['power_factor']/10)) # power factor + block_0.add_16bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) + + block_0.add_16bit_uint(int(meterValues['frequency']/10)) # line frequency *10 + + block_0.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_0.add_32bit_int(56) # demand power + block_0.add_32bit_int(58) # maximum demand power + block_0.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['p1_import_energy_active']/100)) # imported active energy l1 + block_0.add_32bit_int(int(meterValues['p2_import_energy_active']/100)) # imported active energy l2 + block_0.add_32bit_int(int(meterValues['p3_import_energy_active']/100)) # imported active energy l3 + block_0.add_32bit_int(10) # total active energy Tarif 1 + block_0.add_32bit_int(20) # total active energy Tarif 2 + block_0.add_32bit_int(30) # total active energy Tarif 3 + block_0.add_32bit_int(40) # total active energy Tarif 4 + block_0.add_32bit_int(int(meterValues['export_energy_active']/100)) # total exported active energy non-reset /100) + block_0.add_32bit_int(int(meterValues['export_energy_apparent']/100)) # imported active energy non-reset + block_0.add_32bit_int(2400) # hour *100 + block_0.add_32bit_int(11) # total apparent energy Tarif 1 *10 + block_0.add_32bit_int(22) # total apparent energy Tarif 2 + block_0.add_32bit_int(33) # total apparent energy Tarif 3 + block_0.add_32bit_int(44) # total apparent energy Tarif 4 + block_0.add_32bit_int(118) # apparent demand power + block_0.add_32bit_int(120) # apparent demand power max + block_0.add_32bit_int(122) # DMD A max *10 + ctx.setValues(3, 0, block_0.to_registers()) + ctx.setValues(4, 0, block_0.to_registers()) + + block_254 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_254.add_32bit_int(2400) # hour *100 *100 + block_254.add_32bit_int(256) # unused *100 + block_254.add_32bit_int(int(meterValues['voltage_ln']/10)) # l-n voltage *10 + block_254.add_32bit_int(int(meterValues['voltage_ll']/10)) # l-l voltage + block_254.add_32bit_int(meterValues['power']*-10) # total power *10 + block_254.add_32bit_int(meterValues['power_apparent']*-10) # total apparent power + block_254.add_32bit_int(meterValues['power_reactive']*-10) # total reactive power + block_254.add_32bit_int(int(meterValues['power_factor']/10)) # power factor + block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) + block_254.add_32bit_int(int(meterValues['frequency']/10)) # line frequency *10 + block_254.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['export_energy_active']/100)) # total exported active energy non-reset /100) + block_254.add_32bit_int(int(meterValues['export_energy_apparent']/100)) # imported active energy non-reset + block_254.add_32bit_int(56) # demand power + block_254.add_32bit_int(58) # maximum demand power + + + + + block_254.add_32bit_int(int(meterValues['p12_voltage']/10)) # l1-l2 voltage + block_254.add_32bit_int(int(meterValues['p1n_voltage']/10)) # l1-n voltage * 10 + block_254.add_32bit_int(meterValues['p1_current']*100) # current l1 * 1000 + block_254.add_32bit_int(meterValues['p1_power']*-10) # power l1 *10 + block_254.add_32bit_int(meterValues['p1_power_apparent']*-10) # apparent power l1 *10 + block_254.add_32bit_int(meterValues['p1_power_reactive']*-10) # reactive power l1 *10 + block_254.add_32bit_int(int(meterValues['p1_power_factor']/10)) # power factor l1 *1000 + + block_254.add_32bit_int(int(meterValues['p23_voltage']/10)) # l2-l3 voltage + block_254.add_32bit_int(int(meterValues['p2n_voltage']/10)) # l2-n voltage + block_254.add_32bit_int(meterValues['p2_current']*100) # current l2 + block_254.add_32bit_int(meterValues['p2_power']*-10) # power l2 + block_254.add_32bit_int(meterValues['p2_power_apparent']*-10) # apparent power l2 + block_254.add_32bit_int(meterValues['p2_power_reactive']*-10) # reactive power l2 + block_254.add_32bit_int(int(meterValues['p2_power_factor']/10)) # power factor l2 + + block_254.add_32bit_int(int(meterValues['p31_voltage']/10)) # l3-l1 voltage + block_254.add_32bit_int(int(meterValues['p3n_voltage']/10)) # l3-n voltage + block_254.add_32bit_int(meterValues['p3_current']*100) # current l3 + block_254.add_32bit_int(meterValues['p3_power']*-10) # power l3 + block_254.add_32bit_int(meterValues['p3_power_apparent']*-10) # apparent power l3 + block_254.add_32bit_int(meterValues['p3_power_reactive']*-10) # reactive power l3 + block_254.add_32bit_int(int(meterValues['p3_power_factor']/10)) # power factor l3 + + block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) + + block_254.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['p1_import_energy_active']/100)) # imported active energy l1 + block_254.add_32bit_int(int(meterValues['p2_import_energy_active']/100)) # imported active energy l2 + block_254.add_32bit_int(int(meterValues['p3_import_energy_active']/100)) # imported active energy l3 + block_254.add_32bit_int(10) # total active energy Tarif 1 + block_254.add_32bit_int(20) # total active energy Tarif 2 + block_254.add_32bit_int(30) # total active energy Tarif 3 + block_254.add_32bit_int(40) # total active energy Tarif 4 + block_254.add_32bit_int(346) # unused *100 + block_254.add_32bit_int(348) # unused *100 + block_254.add_32bit_int(350) # unused *100 + block_254.add_32bit_int(352) # unused *100 + block_254.add_32bit_int(11) # total apparent energy Tarif 1 *10 + block_254.add_32bit_int(22) # total apparent energy Tarif 2 + block_254.add_32bit_int(33) # total apparent energy Tarif 3 + block_254.add_32bit_int(44) # total apparent energy Tarif 4 + block_254.add_32bit_int(262) # unused *100 + block_254.add_32bit_int(264) # unused *100 + block_254.add_32bit_int(266) # unused *100 + block_254.add_32bit_int(268) # unused *100 + block_254.add_32bit_int(270) # unused *100 + block_254.add_32bit_int(272) # unused *100 + block_254.add_32bit_int(274) # unused *100 + block_254.add_32bit_int(276) # unused *100 + block_254.add_32bit_int(118) # apparent demand power + block_254.add_32bit_int(120) # apparent demand power max + block_254.add_32bit_int(122) # DMD A max *10 + ctx.setValues(3, 254, block_254.to_registers()) + ctx.setValues(4, 254, block_254.to_registers()) + + ## unused values + # "energy_reactive" # total reactive energy + # "p1_export_energy_active", 0)) # exported energy l1 + # "p2_export_energy_active", 0)) # exported energy l2 + # "p3_export_energy_active", 0)) # exported energy l3 + # "p1_energy_reactive", 0)) # reactive energy l1 + # "p2_energy_reactive", 0)) # reactive energy l2 + # "p3_energy_reactive", 0)) # reactive energy l3 + # "p1_energy_apparent", 0)) # apparent energy l1 + # "p2_energy_apparent", 0)) # apparent energy l2 + # "p3_energy_apparent", 0)) # apparent energy l3 + # "minimum_demand_power_active", 0)) # minimum demand power + # "p1_demand_power_active", 0)) # demand power l1 + # "p2_demand_power_active", 0)) # demand power l2 + # "p3_demand_power_active", 0)) # demand power l3 + except Exception as e: + logger.critical(f"{this_t.name}: {e}") + finally: + time.sleep(0.6) + + +if __name__ == "__main__": + argparser = argparse.ArgumentParser() + argparser.add_argument("-c", "--config", type=str, default="semp-tcp.conf") + argparser.add_argument("-v", "--verbose", action="store_true", default=False) + args = argparser.parse_args() + + default_config = { + "server": { + "address": "0.0.0.0", + "port": 502, + "framer": "socket", + "log_level": "INFO", + "meters": 'Meter1' + }, + "meters": { + "dst_address": 2, + "type": "generic", + "ct_current": 5, + "ct_inverted": 0, + "phase_offset": 120, + "serial_number": 987654, + "refresh_rate": 5 + } + } + + confparser = configparser.ConfigParser() + confparser.read(args.config) + + if not confparser.has_section("server"): + confparser["server"] = default_config["server"] + + log_handler = logging.StreamHandler(sys.stdout) + log_handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")) + + logger = logging.getLogger() + logger.setLevel(getattr(logging, confparser["server"].get("log_level", fallback=default_config["server"]["log_level"]).upper())) + logger.addHandler(log_handler) + + if args.verbose: + logger.setLevel(logging.DEBUG) + + slaves = {} + threads = [] + thread_stops = [] + + try: + if confparser.has_option("server", "meters"): + meters = [m.strip() for m in confparser["server"].get("meters", fallback=default_config["server"]["meters"]).split(',')] + + for meter in meters: + address = confparser[meter].getint("dst_address", fallback=default_config["meters"]["dst_address"]) + meter_type = confparser[meter].get("type", fallback=default_config["meters"]["type"]) + meter_module = importlib.import_module(f"devices.{meter_type}") + meter_device = meter_module.device(confparser[meter]) + + EM24_slave_ctx = EM24SlaveContext() + SE7K_slave_ctx = ModbusSlaveContext() + + # block_11 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + # block_11.add_16bit_int(1648) + # EM24_slave_ctx.setValues(3, 11, block_11.to_registers()) + # EM24_slave_ctx.setValues(4, 11, block_11.to_registers()) + + block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_0.add_32bit_int(1234) + EM24_slave_ctx.setValues(3, 0, block_0.to_registers()) + EM24_slave_ctx.setValues(4, 0, block_0.to_registers()) + + block_770 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_770.add_16bit_int(4126) # Version and revision measurment module + block_770.add_16bit_int(68) # + block_770.add_16bit_int(4127) # Version and revision communication module + block_770.add_16bit_int(67) # + block_770.add_16bit_int(0) # Current tariff + EM24_slave_ctx.setValues(3, 770, block_770.to_registers()) + EM24_slave_ctx.setValues(4, 770, block_770.to_registers()) + + block_848 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_848.add_16bit_int(4128) # Measurement module’s firmware CRC + EM24_slave_ctx.setValues(3, 848, block_848.to_registers()) + EM24_slave_ctx.setValues(4, 848, block_848.to_registers()) + + block_20480 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_20480.add_string("MB24DINAV23XE1X") + EM24_slave_ctx.setValues(3, 20480, block_20480.to_registers()) + EM24_slave_ctx.setValues(4, 20480, block_20480.to_registers()) + + block_41216 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_41216.add_16bit_int(3) # Front selector status + EM24_slave_ctx.setValues(3, 41216, block_41216.to_registers()) + EM24_slave_ctx.setValues(4, 41216, block_41216.to_registers()) + + block_4096 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_4096.add_16bit_int(9999) # PASSWORD + block_4096.add_16bit_int(0) # unused + block_4096.add_16bit_int(0) # Measuring system + block_4096.add_32bit_int(10) # Current transformer ratio + block_4096.add_32bit_int(10) # Voltage transformer ratio + block_4096.add_16bit_int(1) # unused + block_4096.add_16bit_int(2) # unused + block_4096.add_16bit_int(3) # unused + block_4096.add_16bit_int(4) # unused + block_4096.add_16bit_int(5) # unused + block_4096.add_16bit_int(6) # unused + block_4096.add_16bit_int(7) # unused + block_4096.add_16bit_int(8) # unused + block_4096.add_16bit_int(9) # unused + block_4096.add_32bit_int(15) # Interval time + EM24_slave_ctx.setValues(3, 4096, block_4096.to_registers()) + EM24_slave_ctx.setValues(4, 4096, block_4096.to_registers()) + + block_4360 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_4360.add_16bit_int(2) # PASSWORD + block_4360.add_16bit_int(2) # PASSWORD + EM24_slave_ctx.setValues(3, 4360, block_4360.to_registers()) + EM24_slave_ctx.setValues(4, 4360, block_4360.to_registers()) + + block_40960 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_40960.add_16bit_int(1) # Type of application + block_40960.add_16bit_int(3) # Default page for selector position “LOCK” + block_40960.add_16bit_int(1) # Default page for selector position “1” + block_40960.add_16bit_int(3) # Default page for selector position “2” + block_40960.add_16bit_int(3) # Default page for selector position “kvarh” + block_40960.add_16bit_int(1) # ID code of user 1 + block_40960.add_16bit_int(2) # ID code of user 2 + block_40960.add_16bit_int(3) # ID code of user 3 + EM24_slave_ctx.setValues(3, 40960, block_40960.to_registers()) + EM24_slave_ctx.setValues(4, 40960, block_40960.to_registers()) + + update_t_stop = threading.Event() + update_t = threading.Thread( + target=t_update, + name=f"t_update_{address}", + args=( + EM24_slave_ctx, + SE7K_slave_ctx, + update_t_stop, + meter_module, + meter_device, + confparser[meter].getfloat("refresh_rate", fallback=default_config["meters"]["refresh_rate"]) + ) + ) + + threads.append(update_t) + thread_stops.append(update_t_stop) + + slaves.update({1: EM24_slave_ctx}) + slaves.update({2: SE7K_slave_ctx}) + logger.info(f"Created {update_t}: {meter} {meter_type} {meter_device}") + + if not slaves: + logger.warning(f"No meters defined in {args.config}") + + config_framer = confparser["server"].get("framer", fallback=default_config["server"]["framer"]) + framer = False + + if config_framer == "socket": + framer = ModbusSocketFramer + elif config_framer == "rtu": + framer = ModbusRtuFramer + + identity = ModbusDeviceIdentification() + server_ctx = ModbusServerContext(slaves=slaves, single=False) + + time.sleep(1) + + for t in threads: + t.start() + logger.info(f"Starting {t}") + + StartMyTcpServer( + server_ctx, + framer=framer, + identity=identity, + address=( + confparser["server"].get("address", fallback=default_config["server"]["address"]), + confparser["server"].getint("port", fallback=default_config["server"]["port"]) + ) + ) + except KeyboardInterrupt: + pass + finally: + for t_stop in thread_stops: + t_stop.set() + for t in threads: + t.join() diff --git a/devices/EM24.py b/devices/EM24.py deleted file mode 100644 index 8a82498..0000000 --- a/devices/EM24.py +++ /dev/null @@ -1,153 +0,0 @@ -import logging -import re -import solaredge_modbus - - -def device(config): - - # Configuration parameters: - # - # timeout seconds to wait for a response, default: 1 - # retries number of retries, default: 3 - # unit modbus address, default: 1 - # - # For Modbus TCP: - # host ip or hostname - # port modbus tcp port - # - # For Modbus RTU: - # device serial device, e.g. /dev/ttyUSB0 - # stopbits number of stop bits - # parity parity setting, N, E or O - # baud baud rate - - timeout = config.getint("timeout", fallback=1) - retries = config.getint("retries", fallback=3) - unit = config.getint("src_address", fallback=1) - - host = config.get("host", fallback=False) - port = config.getint("port", fallback=False) - device = config.get("device", fallback=False) - - if device: - stopbits = config.getint("stopbits", fallback=1) - parity = config.get("parity", fallback="N") - baud = config.getint("baud", fallback=2400) - - if (parity - and parity.upper() in ["N", "E", "O"]): - parity = parity.upper() - else: - parity = False - - return solaredge_modbus.Inverter( - device=device, - stopbits=stopbits, - parity=parity, - baud=baud, - timeout=timeout, - retries=retries, - unit=unit - ) - else: - return solaredge_modbus.Inverter( - host=host, - port=port, - timeout=timeout, - retries=retries, - unit=unit - ) - - -def values(device): - if not device: - return {} - - logger = logging.getLogger() - logger.debug(f"device: {device}") - - values = {} - inverter_values=device.read_all() - - # append type to key to prevent key name collision with legacy values - values = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in inverter_values.items()} - - meters = device.meters() - batteries = device.batteries() - values["connected_meters"] = {} - values["connected_batteries"] = {} - - for meter, params in meters.items(): - meter_values = params.read_all() - values["connected_meters"][meter] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in meter_values.items()} - - for battery, params in batteries.items(): - battery_values = params.read_all() - values["connected_batteries"][battery] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in battery_values.items()} - - logger.debug(f"values: {values}") - - # additional values for emulation of SE-WNC-3Y-400-MB-K1 or WattNode WNC-3Y-400-MB - - # TODO Calculate the values for the SE-WNC-3Y-400-MB-K1 meter from the SolarEdge meter provided by SE7K - SE_WNC_3Y_400_MB_K1_values = { - "energy_active": values.get("total_energy_active", 0), - "import_energy_active": values.get("import_energy_active", 0), - "power_active": values.get("total_power_active", 0), - "p1_power_active": values.get("p1_power_active", 0), - "p2_power_active": values.get("p2_power_active", 0), - "p3_power_active": values.get("p3_power_active", 0), - "voltage_ln": values.get("voltage_ln", 0), - "p1n_voltage": values.get("p1_voltage", 0), - "p2n_voltage": values.get("p2_voltage", 0), - "p3n_voltage": values.get("p3_voltage", 0), - "voltage_ll": values.get("voltage_ll", 0), - "p12_voltage": values.get("p12_voltage", 0), - "p23_voltage": values.get("p23_voltage", 0), - "p31_voltage": values.get("p31_voltage", 0), - "frequency": values.get("frequency", 0), - "p1_energy_active": values.get("total_energy_active", 0), - # "p2_energy_active" - # "p3_energy_active" - "p1_import_energy_active": values.get("import_energy_active", 0), - # "p2_import_energy_active" - # "p3_import_energy_active" - "export_energy_active": values.get("export_energy_active", 0), - "p1_export_energy_active": values.get("export_energy_active", 0), - # "p2_export_energy_active" - # "p3_export_energy_active" - "energy_reactive": values.get("total_energy_reactive", 0), - "p1_energy_reactive": values.get("total_energy_reactive", 0), - # "p2_energy_reactive" - # "p3_energy_reactive" - "energy_apparent": values.get("total_energy_apparent", 0), - "p1_energy_apparent": values.get("total_energy_apparent", 0), - # "p2_energy_apparent" - # "p3_energy_apparent" - "power_factor": values.get("total_power_factor", 0), - "p1_power_factor": values.get("p1_power_factor", 0), - "p2_power_factor": values.get("p2_power_factor", 0), - "p3_power_factor": values.get("p3_power_factor", 0), - "power_reactive": values.get("total_power_reactive", 0), - "p1_power_reactive": values.get("p1_power_reactive", 0), - "p2_power_reactive": values.get("p2_power_reactive", 0), - "p3_power_reactive": values.get("p3_power_reactive", 0), - "power_apparent": values.get("total_power_apparent", 0), - "p1_power_apparent": values.get("p1_power_apparent", 0), - "p2_power_apparent": values.get("p2_power_apparent", 0), - "p3_power_apparent": values.get("p3_power_apparent", 0), - "p1_current": values.get("p1_current", 0), - "p2_current": values.get("p2_current", 0), - "p3_current": values.get("p3_current", 0), - "demand_power_active": values.get("total_import_demand_power_active", 0), - # "minimum_demand_power_active" - "maximum_demand_power_active": values.get("maximum_import_demand_power_active", 0), - "demand_power_apparent": values.get("total_demand_power_apparent", 0), - "p1_demand_power_active": (values.get("p1_demand_current", 0) * values.get("p1_voltage", 0)), - "p2_demand_power_active": (values.get("p2_demand_current", 0) * values.get("p2_voltage", 0)), - "p3_demand_power_active": (values.get("p3_demand_current", 0) * values.get("p3_voltage", 0)) - } - - - return values | SE_WNC_3Y_400_MB_K1_values - # append type to key \ No newline at end of file From 901429cdd4db4a7a636cf1f79febeeb66a1745d0 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 9 Mar 2022 12:59:06 +0100 Subject: [PATCH 25/32] adaption for new nmakel naming conventions --- EM24DINAV23XE1X-proxy-tcp.py | 389 ++++++++++++++--------------- SE7K-EM24-proxy-tcp.py | 453 ++++++++++++++++------------------ devices/solaredge-inverter.py | 78 +++--- documents/Victron.txt | 5 + 4 files changed, 448 insertions(+), 477 deletions(-) create mode 100644 documents/Victron.txt diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index 36a3166..41d4d29 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -8,8 +8,6 @@ import threading import time -sys.path.append('C:\gitHubClones\pymodbus') - from pymodbus.server.sync import StartTcpServer from pymodbus.server.sync import ModbusTcpServer from pymodbus.constants import Endian @@ -21,8 +19,6 @@ from pymodbus.payload import BinaryPayloadBuilder - -sys.path.append('C:/gitHubClones/modbus/solaredge_modbus/src') class EM24SlaveContext(ModbusSlaveContext): def getValues(self, fx, address, count=1): if (address == 11 and count==1): @@ -94,152 +90,139 @@ def t_update(ctx, stop, module, device, refresh): while not stop.is_set(): try: - values = {} - values = device.read_all() - meters = device.meters() - batteries = device.batteries() - values["meters"] = {} - values["batteries"] = {} - - for meter, params in meters.items(): - meter_values = params.read_all() - values["meters"][meter] = meter_values + values = module.values(device) + if not values: + logger.debug(f"{this_t.name}: no new values") + continue - for battery, params in batteries.items(): - battery_values = params.read_all() - values["batteries"][battery] = battery_values + meterValues = values["connected_meters"]["Meter1"] - meterValues = values["meters"]["Meter1"] + logger.info(meterValues['power_int']*10**meterValues['power_scale_int']) if logger.isEnabledFor(logging.DEBUG): - logger.info("current:"+str(meterValues['current'])) - logger.info(str(meterValues['current']*10**meterValues['current_scale'])) - logger.info(meterValues['p1_current']*10**meterValues['current_scale']) - logger.info(meterValues['p2_current']*10**meterValues['current_scale']) - logger.info(meterValues['p3_current']*10**meterValues['current_scale']) - logger.debug(meterValues['current_scale']) - - logger.debug("voltage_ln:"+str(meterValues['voltage_ln'])) - logger.debug(meterValues['voltage_ln']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['voltage_scale']) - - logger.debug("voltage_ll:"+str(meterValues['voltage_ll'])) - logger.debug(meterValues['voltage_ll']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p12_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p23_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p31_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['voltage_scale']) + logger.info("current:"+str(meterValues['current_int'])) + logger.info(str(meterValues['current_int']*10**meterValues['current_scale_int'])) + logger.info(meterValues['l1_current_int']*10**meterValues['current_scale_int']) + logger.info(meterValues['l2_current_int']*10**meterValues['current_scale_int']) + logger.info(meterValues['l3_current_int']*10**meterValues['current_scale_int']) + logger.debug(meterValues['current_scale_int']) + + logger.debug("voltage_ln:"+str(meterValues['voltage_ln_int'])) + logger.debug(meterValues['voltage_ln_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l1n_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l2n_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l3n_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['voltage_scale_int']) + + logger.debug("voltage_ll:"+str(meterValues['voltage_ll_int'])) + logger.debug(meterValues['voltage_ll_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l12_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l23_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l31_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['voltage_scale_int']) - logger.info("frequency:"+str(meterValues['frequency'])) - logger.info(meterValues['frequency']*10**meterValues['frequency_scale']) - - logger.info("power:"+str(meterValues['power'])) - logger.info(meterValues['power']*10**meterValues['power_scale']) - logger.info(meterValues['p1_power']*10**meterValues['power_scale']) - logger.info(meterValues['p2_power']*10**meterValues['power_scale']) - logger.info(meterValues['p3_power']*10**meterValues['power_scale']) - logger.info(meterValues['power_scale']) - - logger.info("power_apparent:"+str(meterValues['power_apparent'])) - logger.info(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['p1_power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['p2_power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['p3_power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['power_apparent_scale']) - - logger.info("power_reactive:"+str(meterValues['power_reactive'])) - logger.info(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['p1_power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['p2_power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['p3_power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['power_reactive_scale']) - - logger.info("power_factor:"+str(meterValues['power_factor'])) - logger.info(meterValues['power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['p1_power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['p2_power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['p3_power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['power_factor_scale']) - - logger.debug("export_energy_active:"+str(meterValues['export_energy_active'])) - logger.debug(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p1_export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p2_export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p3_export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['energy_active_scale']) - - logger.debug("import_energy_active:"+str(meterValues['import_energy_active'])) - logger.debug(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['energy_active_scale']) - - logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent'])) - logger.debug(meterValues['import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['p1_import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['p2_import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['p3_import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['energy_apparent_scale']) - + logger.info("frequency:"+str(meterValues['frequency_int'])) + logger.info(meterValues['frequency_int']*10**meterValues['frequency_scale_int']) + + logger.info("power:"+str(meterValues['power_int'])) + logger.info(meterValues['power_int']*10**meterValues['power_scale_int']) + logger.info(meterValues['l1_power_int']*10**meterValues['power_scale_int']) + logger.info(meterValues['l2_power_int']*10**meterValues['power_scale_int']) + logger.info(meterValues['l3_power_int']*10**meterValues['power_scale_int']) + logger.info(meterValues['power_scale_int']) + + logger.info("power_apparent:"+str(meterValues['power_apparent_int'])) + logger.info(meterValues['power_apparent_int']*10**meterValues['power_apparent_scale_int']) + logger.info(meterValues['l1_power_apparent_int']*10**meterValues['power_apparent_scale_int']) + logger.info(meterValues['l2_power_apparent_int']*10**meterValues['power_apparent_scale_int']) + logger.info(meterValues['l3_power_apparent_int']*10**meterValues['power_apparent_scale_int']) + logger.info(meterValues['power_apparent_scale_int']) + + logger.info("power_reactive:"+str(meterValues['power_reactive_int'])) + logger.info(meterValues['power_reactive_int']*10**meterValues['power_reactive_scale_int']) + logger.info(meterValues['l1_power_reactive_int']*10**meterValues['power_reactive_scale_int']) + logger.info(meterValues['l2_power_reactive_int']*10**meterValues['power_reactive_scale_int']) + logger.info(meterValues['l3_power_reactive_int']*10**meterValues['power_reactive_scale_int']) + logger.info(meterValues['power_reactive_scale_int']) + + logger.info("power_factor:"+str(meterValues['power_factor_int'])) + logger.info(meterValues['power_factor_int']*10**meterValues['power_factor_scale_int']) + logger.info(meterValues['l1_power_factor_int']*10**meterValues['power_factor_scale_int']) + logger.info(meterValues['l2_power_factor_int']*10**meterValues['power_factor_scale_int']) + logger.info(meterValues['l3_power_factor_int']*10**meterValues['power_factor_scale_int']) + logger.info(meterValues['power_factor_scale_int']) + + logger.debug("export_energy_active:"+str(meterValues['export_energy_active_int'])) + logger.debug(meterValues['export_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l1_export_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l2_export_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l3_export_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['energy_active_scale_int']) + + logger.debug("import_energy_active:"+str(meterValues['import_energy_active_int'])) + logger.debug(meterValues['import_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l1_import_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l2_import_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l3_import_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['energy_active_scale_int']) + + logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent_int'])) + logger.debug(meterValues['import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) + logger.debug(meterValues['l1_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) + logger.debug(meterValues['l2_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) + logger.debug(meterValues['l3_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) + logger.debug(meterValues['energy_apparent_scale_int']) - values = module.values(device) - if not values: - logger.debug(f"{this_t.name}: no new values") - continue block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_0.add_32bit_int(int(meterValues['p1n_voltage']/10)) # l1-n voltage * 10 - block_0.add_32bit_int(int(meterValues['p2n_voltage']/10)) # l2-n voltage - block_0.add_32bit_int(int(meterValues['p3n_voltage']/10)) # l3-n voltage - block_0.add_32bit_int(int(meterValues['p12_voltage']/10)) # l1-l2 voltage - block_0.add_32bit_int(int(meterValues['p23_voltage']/10)) # l2-l3 voltage - block_0.add_32bit_int(int(meterValues['p31_voltage']/10)) # l3-l1 voltage - block_0.add_32bit_int(meterValues['p1_current']*100) # current l1 * 1000 - block_0.add_32bit_int(meterValues['p2_current']*100) # current l2 - block_0.add_32bit_int(meterValues['p3_current']*100) # current l3 - block_0.add_32bit_int(meterValues['p1_power']*-10) # power l1 *10 - block_0.add_32bit_int(meterValues['p2_power']*-10) # power l2 - block_0.add_32bit_int(meterValues['p3_power']*-10) # power l3 - block_0.add_32bit_int(meterValues['p1_power_apparent']*-10) # apparent power l1 *10 - block_0.add_32bit_int(meterValues['p2_power_apparent']*-10) # apparent power l2 - block_0.add_32bit_int(meterValues['p3_power_apparent']*-10) # apparent power l3 - block_0.add_32bit_int(meterValues['p1_power_reactive']*-10) # reactive power l1 *10 - block_0.add_32bit_int(meterValues['p2_power_reactive']*-10) # reactive power l2 - block_0.add_32bit_int(meterValues['p3_power_reactive']*-10) # reactive power l3 - block_0.add_32bit_int(int(meterValues['voltage_ln']/10)) # l-n voltage *10 - block_0.add_32bit_int(int(meterValues['voltage_ll']/10)) # l-l voltage - block_0.add_32bit_int(meterValues['power']*-10) # total power *10 - block_0.add_32bit_int(meterValues['power_apparent']*-10) # total apparent power - block_0.add_32bit_int(meterValues['power_reactive']*-10) # total reactive power - block_0.add_16bit_int(int(meterValues['p1_power_factor']/10)) # power factor l1 *1000 - block_0.add_16bit_int(int(meterValues['p2_power_factor']/10)) # power factor l2 - block_0.add_16bit_int(int(meterValues['p3_power_factor']/10)) # power factor l3 - block_0.add_16bit_int(int(meterValues['power_factor']/10)) # power factor + block_0.add_32bit_int(int(meterValues['l1n_voltage_int']/10)) # l1-n voltage * 10 + block_0.add_32bit_int(int(meterValues['l2n_voltage_int']/10)) # l2-n voltage + block_0.add_32bit_int(int(meterValues['l3n_voltage_int']/10)) # l3-n voltage + block_0.add_32bit_int(int(meterValues['l12_voltage_int']/10)) # l1-l2 voltage + block_0.add_32bit_int(int(meterValues['l23_voltage_int']/10)) # l2-l3 voltage + block_0.add_32bit_int(int(meterValues['l31_voltage_int']/10)) # l3-l1 voltage + block_0.add_32bit_int(meterValues['l1_current_int']*100) # current l1 * 1000 + block_0.add_32bit_int(meterValues['l2_current_int']*100) # current l2 + block_0.add_32bit_int(meterValues['l3_current_int']*100) # current l3 + block_0.add_32bit_int(meterValues['l1_power_int']*-10) # power l1 *10 + block_0.add_32bit_int(meterValues['l2_power_int']*-10) # power l2 + block_0.add_32bit_int(meterValues['l3_power_int']*-10) # power l3 + block_0.add_32bit_int(meterValues['l1_power_apparent_int']*-10) # apparent power l1 *10 + block_0.add_32bit_int(meterValues['l2_power_apparent_int']*-10) # apparent power l2 + block_0.add_32bit_int(meterValues['l3_power_apparent_int']*-10) # apparent power l3 + block_0.add_32bit_int(meterValues['l1_power_reactive_int']*-10) # reactive power l1 *10 + block_0.add_32bit_int(meterValues['l2_power_reactive_int']*-10) # reactive power l2 + block_0.add_32bit_int(meterValues['l3_power_reactive_int']*-10) # reactive power l3 + block_0.add_32bit_int(int(meterValues['voltage_ln_int']/10)) # l-n voltage *10 + block_0.add_32bit_int(int(meterValues['voltage_ll_int']/10)) # l-l voltage + block_0.add_32bit_int(meterValues['power_int']*-10) # total power *10 + block_0.add_32bit_int(meterValues['power_apparent_int']*-10) # total apparent power + block_0.add_32bit_int(meterValues['power_reactive_int']*-10) # total reactive power + block_0.add_16bit_int(int(meterValues['l1_power_factor_int']/10)) # power factor l1 *1000 + block_0.add_16bit_int(int(meterValues['l2_power_factor_int']/10)) # power factor l2 + block_0.add_16bit_int(int(meterValues['l3_power_factor_int']/10)) # power factor l3 + block_0.add_16bit_int(int(meterValues['power_factor_int']/10)) # power factor block_0.add_16bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_0.add_16bit_uint(int(meterValues['frequency']/10)) # line frequency *10 + block_0.add_16bit_uint(int(meterValues['frequency_int']/10)) # line frequency *10 - block_0.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy block_0.add_32bit_int(56) # demand power block_0.add_32bit_int(58) # maximum demand power - block_0.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['p1_import_energy_active']/100)) # imported active energy l1 - block_0.add_32bit_int(int(meterValues['p2_import_energy_active']/100)) # imported active energy l2 - block_0.add_32bit_int(int(meterValues['p3_import_energy_active']/100)) # imported active energy l3 + block_0.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['l1_import_energy_active_int']/100)) # imported active energy l1 + block_0.add_32bit_int(int(meterValues['l2_import_energy_active_int']/100)) # imported active energy l2 + block_0.add_32bit_int(int(meterValues['l3_import_energy_active_int']/100)) # imported active energy l3 block_0.add_32bit_int(10) # total active energy Tarif 1 block_0.add_32bit_int(20) # total active energy Tarif 2 block_0.add_32bit_int(30) # total active energy Tarif 3 block_0.add_32bit_int(40) # total active energy Tarif 4 - block_0.add_32bit_int(int(meterValues['export_energy_active']/100)) # total exported active energy non-reset /100) - block_0.add_32bit_int(int(meterValues['export_energy_apparent']/100)) # imported active energy non-reset + block_0.add_32bit_int(int(meterValues['export_energy_active_int']/100)) # total exported active energy non-reset /100) + block_0.add_32bit_int(int(meterValues['export_energy_apparent_int']/100)) # imported active energy non-reset block_0.add_32bit_int(2400) # hour *100 block_0.add_32bit_int(11) # total apparent energy Tarif 1 *10 block_0.add_32bit_int(22) # total apparent energy Tarif 2 @@ -254,55 +237,55 @@ def t_update(ctx, stop, module, device, refresh): block_254 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_254.add_32bit_int(2400) # hour *100 *100 block_254.add_32bit_int(256) # unused *100 - block_254.add_32bit_int(int(meterValues['voltage_ln']/10)) # l-n voltage *10 - block_254.add_32bit_int(int(meterValues['voltage_ll']/10)) # l-l voltage - block_254.add_32bit_int(meterValues['power']*-10) # total power *10 - block_254.add_32bit_int(meterValues['power_apparent']*-10) # total apparent power - block_254.add_32bit_int(meterValues['power_reactive']*-10) # total reactive power - block_254.add_32bit_int(int(meterValues['power_factor']/10)) # power factor + block_254.add_32bit_int(int(meterValues['voltage_ln_int']/10)) # l-n voltage *10 + block_254.add_32bit_int(int(meterValues['voltage_ll_int']/10)) # l-l voltage + block_254.add_32bit_int(meterValues['power_int']*-10) # total power *10 + block_254.add_32bit_int(meterValues['power_apparent_int']*-10) # total apparent power + block_254.add_32bit_int(meterValues['power_reactive_int']*-10) # total reactive power + block_254.add_32bit_int(int(meterValues['power_factor_int']/10)) # power factor block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_254.add_32bit_int(int(meterValues['frequency']/10)) # line frequency *10 - block_254.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['export_energy_active']/100)) # total exported active energy non-reset /100) - block_254.add_32bit_int(int(meterValues['export_energy_apparent']/100)) # imported active energy non-reset + block_254.add_32bit_int(int(meterValues['frequency_int']/10)) # line frequency *10 + block_254.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['export_energy_active_int']/100)) # total exported active energy non-reset /100) + block_254.add_32bit_int(int(meterValues['export_energy_apparent_int']/100)) # imported active energy non-reset block_254.add_32bit_int(56) # demand power block_254.add_32bit_int(58) # maximum demand power - block_254.add_32bit_int(int(meterValues['p12_voltage']/10)) # l1-l2 voltage - block_254.add_32bit_int(int(meterValues['p1n_voltage']/10)) # l1-n voltage * 10 - block_254.add_32bit_int(meterValues['p1_current']*100) # current l1 * 1000 - block_254.add_32bit_int(meterValues['p1_power']*-10) # power l1 *10 - block_254.add_32bit_int(meterValues['p1_power_apparent']*-10) # apparent power l1 *10 - block_254.add_32bit_int(meterValues['p1_power_reactive']*-10) # reactive power l1 *10 - block_254.add_32bit_int(int(meterValues['p1_power_factor']/10)) # power factor l1 *1000 + block_254.add_32bit_int(int(meterValues['l12_voltage_int']/10)) # l1-l2 voltage + block_254.add_32bit_int(int(meterValues['l1n_voltage_int']/10)) # l1-n voltage * 10 + block_254.add_32bit_int(meterValues['l1_current_int']*100) # current l1 * 1000 + block_254.add_32bit_int(meterValues['l1_power_int']*-10) # power l1 *10 + block_254.add_32bit_int(meterValues['l1_power_apparent_int']*-10) # apparent power l1 *10 + block_254.add_32bit_int(meterValues['l1_power_reactive_int']*-10) # reactive power l1 *10 + block_254.add_32bit_int(int(meterValues['l1_power_factor_int']/10)) # power factor l1 *1000 - block_254.add_32bit_int(int(meterValues['p23_voltage']/10)) # l2-l3 voltage - block_254.add_32bit_int(int(meterValues['p2n_voltage']/10)) # l2-n voltage - block_254.add_32bit_int(meterValues['p2_current']*100) # current l2 - block_254.add_32bit_int(meterValues['p2_power']*-10) # power l2 - block_254.add_32bit_int(meterValues['p2_power_apparent']*-10) # apparent power l2 - block_254.add_32bit_int(meterValues['p2_power_reactive']*-10) # reactive power l2 - block_254.add_32bit_int(int(meterValues['p2_power_factor']/10)) # power factor l2 + block_254.add_32bit_int(int(meterValues['l23_voltage_int']/10)) # l2-l3 voltage + block_254.add_32bit_int(int(meterValues['l2n_voltage_int']/10)) # l2-n voltage + block_254.add_32bit_int(meterValues['l2_current_int']*100) # current l2 + block_254.add_32bit_int(meterValues['l2_power_int']*-10) # power l2 + block_254.add_32bit_int(meterValues['l2_power_apparent_int']*-10) # apparent power l2 + block_254.add_32bit_int(meterValues['l2_power_reactive_int']*-10) # reactive power l2 + block_254.add_32bit_int(int(meterValues['l2_power_factor_int']/10)) # power factor l2 - block_254.add_32bit_int(int(meterValues['p31_voltage']/10)) # l3-l1 voltage - block_254.add_32bit_int(int(meterValues['p3n_voltage']/10)) # l3-n voltage - block_254.add_32bit_int(meterValues['p3_current']*100) # current l3 - block_254.add_32bit_int(meterValues['p3_power']*-10) # power l3 - block_254.add_32bit_int(meterValues['p3_power_apparent']*-10) # apparent power l3 - block_254.add_32bit_int(meterValues['p3_power_reactive']*-10) # reactive power l3 - block_254.add_32bit_int(int(meterValues['p3_power_factor']/10)) # power factor l3 + block_254.add_32bit_int(int(meterValues['l31_voltage_int']/10)) # l3-l1 voltage + block_254.add_32bit_int(int(meterValues['l3n_voltage_int']/10)) # l3-n voltage + block_254.add_32bit_int(meterValues['l3_current_int']*100) # current l3 + block_254.add_32bit_int(meterValues['l3_power_int']*-10) # power l3 + block_254.add_32bit_int(meterValues['l3_power_apparent_int']*-10) # apparent power l3 + block_254.add_32bit_int(meterValues['l3_power_reactive_int']*-10) # reactive power l3 + block_254.add_32bit_int(int(meterValues['l3_power_factor_int']/10)) # power factor l3 block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_254.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['p1_import_energy_active']/100)) # imported active energy l1 - block_254.add_32bit_int(int(meterValues['p2_import_energy_active']/100)) # imported active energy l2 - block_254.add_32bit_int(int(meterValues['p3_import_energy_active']/100)) # imported active energy l3 + block_254.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['l1_import_energy_active_int']/100)) # imported active energy l1 + block_254.add_32bit_int(int(meterValues['l2_import_energy_active_int']/100)) # imported active energy l2 + block_254.add_32bit_int(int(meterValues['l3_import_energy_active_int']/100)) # imported active energy l3 block_254.add_32bit_int(10) # total active energy Tarif 1 block_254.add_32bit_int(20) # total active energy Tarif 2 block_254.add_32bit_int(30) # total active energy Tarif 3 @@ -331,19 +314,19 @@ def t_update(ctx, stop, module, device, refresh): ## unused values # "energy_reactive" # total reactive energy - # "p1_export_energy_active", 0)) # exported energy l1 - # "p2_export_energy_active", 0)) # exported energy l2 - # "p3_export_energy_active", 0)) # exported energy l3 - # "p1_energy_reactive", 0)) # reactive energy l1 - # "p2_energy_reactive", 0)) # reactive energy l2 - # "p3_energy_reactive", 0)) # reactive energy l3 - # "p1_energy_apparent", 0)) # apparent energy l1 - # "p2_energy_apparent", 0)) # apparent energy l2 - # "p3_energy_apparent", 0)) # apparent energy l3 + # "l1_export_energy_active", 0)) # exported energy l1 + # "l2_export_energy_active", 0)) # exported energy l2 + # "l3_export_energy_active", 0)) # exported energy l3 + # "l1_energy_reactive", 0)) # reactive energy l1 + # "l2_energy_reactive", 0)) # reactive energy l2 + # "l3_energy_reactive", 0)) # reactive energy l3 + # "l1_energy_apparent", 0)) # apparent energy l1 + # "l2_energy_apparent", 0)) # apparent energy l2 + # "l3_energy_apparent", 0)) # apparent energy l3 # "minimum_demand_power_active", 0)) # minimum demand power - # "p1_demand_power_active", 0)) # demand power l1 - # "p2_demand_power_active", 0)) # demand power l2 - # "p3_demand_power_active", 0)) # demand power l3 + # "l1_demand_power_active", 0)) # demand power l1 + # "l2_demand_power_active", 0)) # demand power l2 + # "l3_demand_power_active", 0)) # demand power l3 except Exception as e: logger.critical(f"{this_t.name}: {e}") finally: @@ -405,18 +388,18 @@ def t_update(ctx, stop, module, device, refresh): meter_module = importlib.import_module(f"devices.{meter_type}") meter_device = meter_module.device(confparser[meter]) - slave_ctx = EM24SlaveContext() - # slave_ctx = ModbusSlaveContext() + EM24_slave_ctx = EM24SlaveContext() + # SE7K_slave_ctx = ModbusSlaveContext() # block_11 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) # block_11.add_16bit_int(1648) - # slave_ctx.setValues(3, 11, block_11.to_registers()) - # slave_ctx.setValues(4, 11, block_11.to_registers()) + # EM24_slave_ctx.setValues(3, 11, block_11.to_registers()) + # EM24_slave_ctx.setValues(4, 11, block_11.to_registers()) block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_0.add_32bit_int(1234) - slave_ctx.setValues(3, 0, block_0.to_registers()) - slave_ctx.setValues(4, 0, block_0.to_registers()) + EM24_slave_ctx.setValues(3, 0, block_0.to_registers()) + EM24_slave_ctx.setValues(4, 0, block_0.to_registers()) block_770 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_770.add_16bit_int(4126) # Version and revision measurment module @@ -424,23 +407,23 @@ def t_update(ctx, stop, module, device, refresh): block_770.add_16bit_int(4127) # Version and revision communication module block_770.add_16bit_int(67) # block_770.add_16bit_int(0) # Current tariff - slave_ctx.setValues(3, 770, block_770.to_registers()) - slave_ctx.setValues(4, 770, block_770.to_registers()) + EM24_slave_ctx.setValues(3, 770, block_770.to_registers()) + EM24_slave_ctx.setValues(4, 770, block_770.to_registers()) block_848 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_848.add_16bit_int(4128) # Measurement module’s firmware CRC - slave_ctx.setValues(3, 848, block_848.to_registers()) - slave_ctx.setValues(4, 848, block_848.to_registers()) + EM24_slave_ctx.setValues(3, 848, block_848.to_registers()) + EM24_slave_ctx.setValues(4, 848, block_848.to_registers()) block_20480 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_20480.add_string("MB24DINAV23XE1X") - slave_ctx.setValues(3, 20480, block_20480.to_registers()) - slave_ctx.setValues(4, 20480, block_20480.to_registers()) + EM24_slave_ctx.setValues(3, 20480, block_20480.to_registers()) + EM24_slave_ctx.setValues(4, 20480, block_20480.to_registers()) block_41216 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_41216.add_16bit_int(3) # Front selector status - slave_ctx.setValues(3, 41216, block_41216.to_registers()) - slave_ctx.setValues(4, 41216, block_41216.to_registers()) + EM24_slave_ctx.setValues(3, 41216, block_41216.to_registers()) + EM24_slave_ctx.setValues(4, 41216, block_41216.to_registers()) block_4096 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_4096.add_16bit_int(9999) # PASSWORD @@ -458,14 +441,14 @@ def t_update(ctx, stop, module, device, refresh): block_4096.add_16bit_int(8) # unused block_4096.add_16bit_int(9) # unused block_4096.add_32bit_int(15) # Interval time - slave_ctx.setValues(3, 4096, block_4096.to_registers()) - slave_ctx.setValues(4, 4096, block_4096.to_registers()) + EM24_slave_ctx.setValues(3, 4096, block_4096.to_registers()) + EM24_slave_ctx.setValues(4, 4096, block_4096.to_registers()) block_4360 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_4360.add_16bit_int(2) # PASSWORD block_4360.add_16bit_int(2) # PASSWORD - slave_ctx.setValues(3, 4360, block_4360.to_registers()) - slave_ctx.setValues(4, 4360, block_4360.to_registers()) + EM24_slave_ctx.setValues(3, 4360, block_4360.to_registers()) + EM24_slave_ctx.setValues(4, 4360, block_4360.to_registers()) block_40960 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_40960.add_16bit_int(1) # Type of application @@ -476,15 +459,15 @@ def t_update(ctx, stop, module, device, refresh): block_40960.add_16bit_int(1) # ID code of user 1 block_40960.add_16bit_int(2) # ID code of user 2 block_40960.add_16bit_int(3) # ID code of user 3 - slave_ctx.setValues(3, 40960, block_40960.to_registers()) - slave_ctx.setValues(4, 40960, block_40960.to_registers()) + EM24_slave_ctx.setValues(3, 40960, block_40960.to_registers()) + EM24_slave_ctx.setValues(4, 40960, block_40960.to_registers()) update_t_stop = threading.Event() update_t = threading.Thread( target=t_update, name=f"t_update_{address}", args=( - slave_ctx, + EM24_slave_ctx, update_t_stop, meter_module, meter_device, @@ -495,8 +478,8 @@ def t_update(ctx, stop, module, device, refresh): threads.append(update_t) thread_stops.append(update_t_stop) - slaves.update({address: slave_ctx}) - slaves.update({2: slave_ctx}) + slaves.update({address: EM24_slave_ctx}) + slaves.update({2: EM24_slave_ctx}) logger.info(f"Created {update_t}: {meter} {meter_type} {meter_device}") if not slaves: diff --git a/SE7K-EM24-proxy-tcp.py b/SE7K-EM24-proxy-tcp.py index f43d98f..0d9ee8f 100644 --- a/SE7K-EM24-proxy-tcp.py +++ b/SE7K-EM24-proxy-tcp.py @@ -8,8 +8,6 @@ import threading import time -sys.path.append('C:\gitHubClones\pymodbus') - from pymodbus.server.sync import StartTcpServer from pymodbus.server.sync import ModbusTcpServer from pymodbus.constants import Endian @@ -21,8 +19,6 @@ from pymodbus.payload import BinaryPayloadBuilder - -sys.path.append('C:/gitHubClones/modbus/solaredge_modbus/src') class EM24SlaveContext(ModbusSlaveContext): def getValues(self, fx, address, count=1): if (address == 11 and count==1): @@ -104,84 +100,84 @@ def setMeterValues(values, block): block.add_16bit_int (values.get("c_sunspec_did_int" , 103)) block.add_16bit_int (values.get("c_sunspec_length_int", 50)) block.add_16bit_uint(values.get("current_int" , 0)) - block.add_16bit_uint(values.get("p1_current_int" , 0)) - block.add_16bit_uint(values.get("p2_current_int" , 0)) - block.add_16bit_uint(values.get("p3_current_int" , 0)) + block.add_16bit_uint(values.get("l1_current_int" , 0)) + block.add_16bit_uint(values.get("l2_current_int" , 0)) + block.add_16bit_uint(values.get("l3_current_int" , 0)) block.add_16bit_int (values.get("current_scale_int" , 0)) block.add_16bit_uint(values.get("voltage_ln_int" , 0)) - block.add_16bit_uint(values.get("p1n_voltage_int" , 0)) - block.add_16bit_uint(values.get("p2n_voltage_int" , 0)) - block.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l3n_voltage_int" , 0)) block.add_16bit_uint(values.get("voltage_ll_int" , 0)) - block.add_16bit_uint(values.get("p1n_voltage_int" , 0)) - block.add_16bit_uint(values.get("p2n_voltage_int" , 0)) - block.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l3n_voltage_int" , 0)) block.add_16bit_int (values.get("voltage_scale_int" , 0)) block.add_16bit_uint(values.get("frequency_int" , 0)) block.add_16bit_int (values.get("frequency_scale_int" , 0)) block.add_16bit_int(values.get("power_int" , 0)) - block.add_16bit_int(values.get("p1_power_int" , 0)) - block.add_16bit_int(values.get("p2_power_int" , 0)) - block.add_16bit_int(values.get("p3_power_int" , 0)) + block.add_16bit_int(values.get("l1_power_int" , 0)) + block.add_16bit_int(values.get("l2_power_int" , 0)) + block.add_16bit_int(values.get("l3_power_int" , 0)) block.add_16bit_int (values.get("power_scale_int" , 0)) block.add_16bit_int(values.get("power_apparent_int" , 0)) - block.add_16bit_int(values.get("p1_power_apparent_int" , 0)) - block.add_16bit_int(values.get("p2_power_apparent_int" , 0)) - block.add_16bit_int(values.get("p3_power_apparent_int" , 0)) + block.add_16bit_int(values.get("l1_power_apparent_int" , 0)) + block.add_16bit_int(values.get("l2_power_apparent_int" , 0)) + block.add_16bit_int(values.get("l3_power_apparent_int" , 0)) block.add_16bit_int (values.get("power_apparent_scale_int" , 0)) block.add_16bit_int(values.get("power_reactive_int" , 0)) - block.add_16bit_int(values.get("p1_power_reactive_int" , 0)) - block.add_16bit_int(values.get("p2_power_reactive_int" , 0)) - block.add_16bit_int(values.get("p3_power_reactive_int" , 0)) + block.add_16bit_int(values.get("l1_power_reactive_int" , 0)) + block.add_16bit_int(values.get("l2_power_reactive_int" , 0)) + block.add_16bit_int(values.get("l3_power_reactive_int" , 0)) block.add_16bit_int (values.get("power_reactive_scale_int" , 0)) block.add_16bit_int(values.get("power_factor_int" , 0)) - block.add_16bit_int(values.get("p1_power_factor_int" , 0)) - block.add_16bit_int(values.get("p2_power_factor_int" , 0)) - block.add_16bit_int(values.get("p3_power_factor_int" , 0)) + block.add_16bit_int(values.get("l1_power_factor_int" , 0)) + block.add_16bit_int(values.get("l2_power_factor_int" , 0)) + block.add_16bit_int(values.get("l3_power_factor_int" , 0)) block.add_16bit_int (values.get("power_factor_scale_int" , 0)) block.add_32bit_uint(values.get("export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p1_export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_active_int" , 0)) block.add_32bit_uint(values.get("import_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_active_int" , 0)) block.add_16bit_int (values.get("energy_active_scale_int" , 0)) block.add_32bit_uint(values.get("export_energy_apparent_int", 0)) - block.add_32bit_uint(values.get("p1_export_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_apparent_int" , 0)) block.add_32bit_uint(values.get("import_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_apparent_int" , 0)) block.add_16bit_int (values.get("energy_apparent_scale_int" , 0)) block.add_32bit_uint(values.get("import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_reactive_q1_int" , 0)) block.add_32bit_uint(values.get("import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_reactive_q2_int" , 0)) block.add_32bit_uint(values.get("export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("p1_export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_reactive_q3_int" , 0)) block.add_32bit_uint(values.get("export_energy_reactive_q4_int" , 0)) - block.add_32bit_uint(values.get("p1_export_energy_reactive_q4_int" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_reactive_q4_int" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_reactive_q4_int" , 0)) block.add_16bit_int (values.get("energy_reactive_scale_int" , 0)) block.add_32bit_uint(values.get("events_int" , 0)) @@ -214,7 +210,7 @@ def t_update_se7k(ctx, stop, module, device, refresh): block_40000.add_16bit_int (values.get("C_SunSpec_Length_int", 65)) block_40000.add_string (values.get("c_manufacturer_str" ,"12345678901234567890123456789012").ljust(32,' ')) block_40000.add_string (values.get("c_model_str" ,"12345678901234567890123456789012").ljust(32,' ')) - block_40000.add_string ( "NOT_IMPLEMENTED.".ljust(16,' ')) + block_40000.add_string ("NOT_IMPLEMENTED.".ljust(16,' ')) block_40000.add_string (values.get("c_version_str" ,"1234567890123456").ljust(16,' ')) block_40000.add_string (values.get("c_serialnumber_str" ,"12345678901234567890123456789012").ljust(32,' ')) block_40000.add_16bit_int (values.get("c_deviceaddress_int" , 0)) @@ -222,17 +218,17 @@ def t_update_se7k(ctx, stop, module, device, refresh): block_40000.add_16bit_int (values.get("c_sunspec_did_int" , 103)) block_40000.add_16bit_int (50) block_40000.add_16bit_uint(values.get("current_int" , 0)) - block_40000.add_16bit_uint(values.get("p1_current_int" , 0)) - block_40000.add_16bit_uint(values.get("p2_current_int" , 0)) - block_40000.add_16bit_uint(values.get("p3_current_int" , 0)) + block_40000.add_16bit_uint(values.get("l1_current_int" , 0)) + block_40000.add_16bit_uint(values.get("l2_current_int" , 0)) + block_40000.add_16bit_uint(values.get("l3_current_int" , 0)) block_40000.add_16bit_int (values.get("current_scale_int" , 0)) - block_40000.add_16bit_uint(values.get("p1_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p2_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p3_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p1n_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p2n_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l1_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l2_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l3_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l1n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l2n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l3n_voltage_int" , 0)) block_40000.add_16bit_int (values.get("voltage_scale_int" , 0)) block_40000.add_16bit_int(values.get("power_ac_int" , 0)) @@ -308,153 +304,140 @@ def t_update(ctx, SE7K_CTX, stop, module, device, refresh): while not stop.is_set(): try: t_update_se7k(SE7K_CTX, stop, module, device, refresh) - values = {} - values = device.read_all() - meters = device.meters() - batteries = device.batteries() - values["meters"] = {} - values["batteries"] = {} - for meter, params in meters.items(): - meter_values = params.read_all() - values["meters"][meter] = meter_values + values = module.values(device) + if not values: + logger.debug(f"{this_t.name}: no new values") + continue - for battery, params in batteries.items(): - battery_values = params.read_all() - values["batteries"][battery] = battery_values + meterValues = values["connected_meters"]["Meter1"] - meterValues = values["meters"]["Meter1"] - logger.info(meterValues['power']*10**meterValues['power_scale']) + logger.info(meterValues['power_int']*10**meterValues['power_scale_int']) if logger.isEnabledFor(logging.DEBUG): - logger.info("current:"+str(meterValues['current'])) - logger.info(str(meterValues['current']*10**meterValues['current_scale'])) - logger.info(meterValues['p1_current']*10**meterValues['current_scale']) - logger.info(meterValues['p2_current']*10**meterValues['current_scale']) - logger.info(meterValues['p3_current']*10**meterValues['current_scale']) - logger.debug(meterValues['current_scale']) - - logger.debug("voltage_ln:"+str(meterValues['voltage_ln'])) - logger.debug(meterValues['voltage_ln']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p1n_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p2n_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p3n_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['voltage_scale']) - - logger.debug("voltage_ll:"+str(meterValues['voltage_ll'])) - logger.debug(meterValues['voltage_ll']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p12_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p23_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['p31_voltage']*10**meterValues['voltage_scale']) - logger.debug(meterValues['voltage_scale']) + logger.info("current:"+str(meterValues['current_int'])) + logger.info(str(meterValues['current_int']*10**meterValues['current_scale_int'])) + logger.info(meterValues['l1_current_int']*10**meterValues['current_scale_int']) + logger.info(meterValues['l2_current_int']*10**meterValues['current_scale_int']) + logger.info(meterValues['l3_current_int']*10**meterValues['current_scale_int']) + logger.debug(meterValues['current_scale_int']) + + logger.debug("voltage_ln:"+str(meterValues['voltage_ln_int'])) + logger.debug(meterValues['voltage_ln_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l1n_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l2n_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l3n_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['voltage_scale_int']) + + logger.debug("voltage_ll:"+str(meterValues['voltage_ll_int'])) + logger.debug(meterValues['voltage_ll_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l12_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l23_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['l31_voltage_int']*10**meterValues['voltage_scale_int']) + logger.debug(meterValues['voltage_scale_int']) - logger.info("frequency:"+str(meterValues['frequency'])) - logger.info(meterValues['frequency']*10**meterValues['frequency_scale']) - - logger.info("power:"+str(meterValues['power'])) - logger.info(meterValues['power']*10**meterValues['power_scale']) - logger.info(meterValues['p1_power']*10**meterValues['power_scale']) - logger.info(meterValues['p2_power']*10**meterValues['power_scale']) - logger.info(meterValues['p3_power']*10**meterValues['power_scale']) - logger.info(meterValues['power_scale']) - - logger.info("power_apparent:"+str(meterValues['power_apparent'])) - logger.info(meterValues['power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['p1_power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['p2_power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['p3_power_apparent']*10**meterValues['power_apparent_scale']) - logger.info(meterValues['power_apparent_scale']) - - logger.info("power_reactive:"+str(meterValues['power_reactive'])) - logger.info(meterValues['power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['p1_power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['p2_power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['p3_power_reactive']*10**meterValues['power_reactive_scale']) - logger.info(meterValues['power_reactive_scale']) - - logger.info("power_factor:"+str(meterValues['power_factor'])) - logger.info(meterValues['power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['p1_power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['p2_power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['p3_power_factor']*10**meterValues['power_factor_scale']) - logger.info(meterValues['power_factor_scale']) - - logger.debug("export_energy_active:"+str(meterValues['export_energy_active'])) - logger.debug(meterValues['export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p1_export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p2_export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p3_export_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['energy_active_scale']) - - logger.debug("import_energy_active:"+str(meterValues['import_energy_active'])) - logger.debug(meterValues['import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p1_import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p2_import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['p3_import_energy_active']*10**meterValues['energy_active_scale']) - logger.debug(meterValues['energy_active_scale']) - - logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent'])) - logger.debug(meterValues['import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['p1_import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['p2_import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['p3_import_energy_apparent']*10**meterValues['energy_apparent_scale']) - logger.debug(meterValues['energy_apparent_scale']) + logger.info("frequency:"+str(meterValues['frequency_int'])) + logger.info(meterValues['frequency_int']*10**meterValues['frequency_scale_int']) + + logger.info("power:"+str(meterValues['power_int'])) + logger.info(meterValues['power_int']*10**meterValues['power_scale_int']) + logger.info(meterValues['l1_power_int']*10**meterValues['power_scale_int']) + logger.info(meterValues['l2_power_int']*10**meterValues['power_scale_int']) + logger.info(meterValues['l3_power_int']*10**meterValues['power_scale_int']) + logger.info(meterValues['power_scale_int']) + + logger.info("power_apparent:"+str(meterValues['power_apparent_int'])) + logger.info(meterValues['power_apparent_int']*10**meterValues['power_apparent_scale_int']) + logger.info(meterValues['l1_power_apparent_int']*10**meterValues['power_apparent_scale_int']) + logger.info(meterValues['l2_power_apparent_int']*10**meterValues['power_apparent_scale_int']) + logger.info(meterValues['l3_power_apparent_int']*10**meterValues['power_apparent_scale_int']) + logger.info(meterValues['power_apparent_scale_int']) + + logger.info("power_reactive:"+str(meterValues['power_reactive_int'])) + logger.info(meterValues['power_reactive_int']*10**meterValues['power_reactive_scale_int']) + logger.info(meterValues['l1_power_reactive_int']*10**meterValues['power_reactive_scale_int']) + logger.info(meterValues['l2_power_reactive_int']*10**meterValues['power_reactive_scale_int']) + logger.info(meterValues['l3_power_reactive_int']*10**meterValues['power_reactive_scale_int']) + logger.info(meterValues['power_reactive_scale_int']) + + logger.info("power_factor:"+str(meterValues['power_factor_int'])) + logger.info(meterValues['power_factor_int']*10**meterValues['power_factor_scale_int']) + logger.info(meterValues['l1_power_factor_int']*10**meterValues['power_factor_scale_int']) + logger.info(meterValues['l2_power_factor_int']*10**meterValues['power_factor_scale_int']) + logger.info(meterValues['l3_power_factor_int']*10**meterValues['power_factor_scale_int']) + logger.info(meterValues['power_factor_scale_int']) + + logger.debug("export_energy_active:"+str(meterValues['export_energy_active_int'])) + logger.debug(meterValues['export_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l1_export_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l2_export_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l3_export_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['energy_active_scale_int']) + + logger.debug("import_energy_active:"+str(meterValues['import_energy_active_int'])) + logger.debug(meterValues['import_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l1_import_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l2_import_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['l3_import_energy_active_int']*10**meterValues['energy_active_scale_int']) + logger.debug(meterValues['energy_active_scale_int']) + + logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent_int'])) + logger.debug(meterValues['import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) + logger.debug(meterValues['l1_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) + logger.debug(meterValues['l2_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) + logger.debug(meterValues['l3_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) + logger.debug(meterValues['energy_apparent_scale_int']) - values = module.values(device) - - if not values: - logger.debug(f"{this_t.name}: no new values") - continue block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_0.add_32bit_int(int(meterValues['p1n_voltage']/10)) # l1-n voltage * 10 - block_0.add_32bit_int(int(meterValues['p2n_voltage']/10)) # l2-n voltage - block_0.add_32bit_int(int(meterValues['p3n_voltage']/10)) # l3-n voltage - block_0.add_32bit_int(int(meterValues['p12_voltage']/10)) # l1-l2 voltage - block_0.add_32bit_int(int(meterValues['p23_voltage']/10)) # l2-l3 voltage - block_0.add_32bit_int(int(meterValues['p31_voltage']/10)) # l3-l1 voltage - block_0.add_32bit_int(meterValues['p1_current']*100) # current l1 * 1000 - block_0.add_32bit_int(meterValues['p2_current']*100) # current l2 - block_0.add_32bit_int(meterValues['p3_current']*100) # current l3 - block_0.add_32bit_int(meterValues['p1_power']*-10) # power l1 *10 - block_0.add_32bit_int(meterValues['p2_power']*-10) # power l2 - block_0.add_32bit_int(meterValues['p3_power']*-10) # power l3 - block_0.add_32bit_int(meterValues['p1_power_apparent']*-10) # apparent power l1 *10 - block_0.add_32bit_int(meterValues['p2_power_apparent']*-10) # apparent power l2 - block_0.add_32bit_int(meterValues['p3_power_apparent']*-10) # apparent power l3 - block_0.add_32bit_int(meterValues['p1_power_reactive']*-10) # reactive power l1 *10 - block_0.add_32bit_int(meterValues['p2_power_reactive']*-10) # reactive power l2 - block_0.add_32bit_int(meterValues['p3_power_reactive']*-10) # reactive power l3 - block_0.add_32bit_int(int(meterValues['voltage_ln']/10)) # l-n voltage *10 - block_0.add_32bit_int(int(meterValues['voltage_ll']/10)) # l-l voltage - block_0.add_32bit_int(meterValues['power']*-10) # total power *10 - block_0.add_32bit_int(meterValues['power_apparent']*-10) # total apparent power - block_0.add_32bit_int(meterValues['power_reactive']*-10) # total reactive power - block_0.add_16bit_int(int(meterValues['p1_power_factor']/10)) # power factor l1 *1000 - block_0.add_16bit_int(int(meterValues['p2_power_factor']/10)) # power factor l2 - block_0.add_16bit_int(int(meterValues['p3_power_factor']/10)) # power factor l3 - block_0.add_16bit_int(int(meterValues['power_factor']/10)) # power factor + block_0.add_32bit_int(int(meterValues['l1n_voltage_int']/10)) # l1-n voltage * 10 + block_0.add_32bit_int(int(meterValues['l2n_voltage_int']/10)) # l2-n voltage + block_0.add_32bit_int(int(meterValues['l3n_voltage_int']/10)) # l3-n voltage + block_0.add_32bit_int(int(meterValues['l12_voltage_int']/10)) # l1-l2 voltage + block_0.add_32bit_int(int(meterValues['l23_voltage_int']/10)) # l2-l3 voltage + block_0.add_32bit_int(int(meterValues['l31_voltage_int']/10)) # l3-l1 voltage + block_0.add_32bit_int(meterValues['l1_current_int']*100) # current l1 * 1000 + block_0.add_32bit_int(meterValues['l2_current_int']*100) # current l2 + block_0.add_32bit_int(meterValues['l3_current_int']*100) # current l3 + block_0.add_32bit_int(meterValues['l1_power_int']*-10) # power l1 *10 + block_0.add_32bit_int(meterValues['l2_power_int']*-10) # power l2 + block_0.add_32bit_int(meterValues['l3_power_int']*-10) # power l3 + block_0.add_32bit_int(meterValues['l1_power_apparent_int']*-10) # apparent power l1 *10 + block_0.add_32bit_int(meterValues['l2_power_apparent_int']*-10) # apparent power l2 + block_0.add_32bit_int(meterValues['l3_power_apparent_int']*-10) # apparent power l3 + block_0.add_32bit_int(meterValues['l1_power_reactive_int']*-10) # reactive power l1 *10 + block_0.add_32bit_int(meterValues['l2_power_reactive_int']*-10) # reactive power l2 + block_0.add_32bit_int(meterValues['l3_power_reactive_int']*-10) # reactive power l3 + block_0.add_32bit_int(int(meterValues['voltage_ln_int']/10)) # l-n voltage *10 + block_0.add_32bit_int(int(meterValues['voltage_ll_int']/10)) # l-l voltage + block_0.add_32bit_int(meterValues['power_int']*-10) # total power *10 + block_0.add_32bit_int(meterValues['power_apparent_int']*-10) # total apparent power + block_0.add_32bit_int(meterValues['power_reactive_int']*-10) # total reactive power + block_0.add_16bit_int(int(meterValues['l1_power_factor_int']/10)) # power factor l1 *1000 + block_0.add_16bit_int(int(meterValues['l2_power_factor_int']/10)) # power factor l2 + block_0.add_16bit_int(int(meterValues['l3_power_factor_int']/10)) # power factor l3 + block_0.add_16bit_int(int(meterValues['power_factor_int']/10)) # power factor block_0.add_16bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_0.add_16bit_uint(int(meterValues['frequency']/10)) # line frequency *10 + block_0.add_16bit_uint(int(meterValues['frequency_int']/10)) # line frequency *10 - block_0.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy block_0.add_32bit_int(56) # demand power block_0.add_32bit_int(58) # maximum demand power - block_0.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['p1_import_energy_active']/100)) # imported active energy l1 - block_0.add_32bit_int(int(meterValues['p2_import_energy_active']/100)) # imported active energy l2 - block_0.add_32bit_int(int(meterValues['p3_import_energy_active']/100)) # imported active energy l3 + block_0.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy + block_0.add_32bit_int(int(meterValues['l1_import_energy_active_int']/100)) # imported active energy l1 + block_0.add_32bit_int(int(meterValues['l2_import_energy_active_int']/100)) # imported active energy l2 + block_0.add_32bit_int(int(meterValues['l3_import_energy_active_int']/100)) # imported active energy l3 block_0.add_32bit_int(10) # total active energy Tarif 1 block_0.add_32bit_int(20) # total active energy Tarif 2 block_0.add_32bit_int(30) # total active energy Tarif 3 block_0.add_32bit_int(40) # total active energy Tarif 4 - block_0.add_32bit_int(int(meterValues['export_energy_active']/100)) # total exported active energy non-reset /100) - block_0.add_32bit_int(int(meterValues['export_energy_apparent']/100)) # imported active energy non-reset + block_0.add_32bit_int(int(meterValues['export_energy_active_int']/100)) # total exported active energy non-reset /100) + block_0.add_32bit_int(int(meterValues['export_energy_apparent_int']/100)) # imported active energy non-reset block_0.add_32bit_int(2400) # hour *100 block_0.add_32bit_int(11) # total apparent energy Tarif 1 *10 block_0.add_32bit_int(22) # total apparent energy Tarif 2 @@ -469,55 +452,55 @@ def t_update(ctx, SE7K_CTX, stop, module, device, refresh): block_254 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_254.add_32bit_int(2400) # hour *100 *100 block_254.add_32bit_int(256) # unused *100 - block_254.add_32bit_int(int(meterValues['voltage_ln']/10)) # l-n voltage *10 - block_254.add_32bit_int(int(meterValues['voltage_ll']/10)) # l-l voltage - block_254.add_32bit_int(meterValues['power']*-10) # total power *10 - block_254.add_32bit_int(meterValues['power_apparent']*-10) # total apparent power - block_254.add_32bit_int(meterValues['power_reactive']*-10) # total reactive power - block_254.add_32bit_int(int(meterValues['power_factor']/10)) # power factor + block_254.add_32bit_int(int(meterValues['voltage_ln_int']/10)) # l-n voltage *10 + block_254.add_32bit_int(int(meterValues['voltage_ll_int']/10)) # l-l voltage + block_254.add_32bit_int(meterValues['power_int']*-10) # total power *10 + block_254.add_32bit_int(meterValues['power_apparent_int']*-10) # total apparent power + block_254.add_32bit_int(meterValues['power_reactive_int']*-10) # total reactive power + block_254.add_32bit_int(int(meterValues['power_factor_int']/10)) # power factor block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_254.add_32bit_int(int(meterValues['frequency']/10)) # line frequency *10 - block_254.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['export_energy_active']/100)) # total exported active energy non-reset /100) - block_254.add_32bit_int(int(meterValues['export_energy_apparent']/100)) # imported active energy non-reset + block_254.add_32bit_int(int(meterValues['frequency_int']/10)) # line frequency *10 + block_254.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['export_energy_active_int']/100)) # total exported active energy non-reset /100) + block_254.add_32bit_int(int(meterValues['export_energy_apparent_int']/100)) # imported active energy non-reset block_254.add_32bit_int(56) # demand power block_254.add_32bit_int(58) # maximum demand power - block_254.add_32bit_int(int(meterValues['p12_voltage']/10)) # l1-l2 voltage - block_254.add_32bit_int(int(meterValues['p1n_voltage']/10)) # l1-n voltage * 10 - block_254.add_32bit_int(meterValues['p1_current']*100) # current l1 * 1000 - block_254.add_32bit_int(meterValues['p1_power']*-10) # power l1 *10 - block_254.add_32bit_int(meterValues['p1_power_apparent']*-10) # apparent power l1 *10 - block_254.add_32bit_int(meterValues['p1_power_reactive']*-10) # reactive power l1 *10 - block_254.add_32bit_int(int(meterValues['p1_power_factor']/10)) # power factor l1 *1000 + block_254.add_32bit_int(int(meterValues['l12_voltage_int']/10)) # l1-l2 voltage + block_254.add_32bit_int(int(meterValues['l1n_voltage_int']/10)) # l1-n voltage * 10 + block_254.add_32bit_int(meterValues['l1_current_int']*100) # current l1 * 1000 + block_254.add_32bit_int(meterValues['l1_power_int']*-10) # power l1 *10 + block_254.add_32bit_int(meterValues['l1_power_apparent_int']*-10) # apparent power l1 *10 + block_254.add_32bit_int(meterValues['l1_power_reactive_int']*-10) # reactive power l1 *10 + block_254.add_32bit_int(int(meterValues['l1_power_factor_int']/10)) # power factor l1 *1000 - block_254.add_32bit_int(int(meterValues['p23_voltage']/10)) # l2-l3 voltage - block_254.add_32bit_int(int(meterValues['p2n_voltage']/10)) # l2-n voltage - block_254.add_32bit_int(meterValues['p2_current']*100) # current l2 - block_254.add_32bit_int(meterValues['p2_power']*-10) # power l2 - block_254.add_32bit_int(meterValues['p2_power_apparent']*-10) # apparent power l2 - block_254.add_32bit_int(meterValues['p2_power_reactive']*-10) # reactive power l2 - block_254.add_32bit_int(int(meterValues['p2_power_factor']/10)) # power factor l2 + block_254.add_32bit_int(int(meterValues['l23_voltage_int']/10)) # l2-l3 voltage + block_254.add_32bit_int(int(meterValues['l2n_voltage_int']/10)) # l2-n voltage + block_254.add_32bit_int(meterValues['l2_current_int']*100) # current l2 + block_254.add_32bit_int(meterValues['l2_power_int']*-10) # power l2 + block_254.add_32bit_int(meterValues['l2_power_apparent_int']*-10) # apparent power l2 + block_254.add_32bit_int(meterValues['l2_power_reactive_int']*-10) # reactive power l2 + block_254.add_32bit_int(int(meterValues['l2_power_factor_int']/10)) # power factor l2 - block_254.add_32bit_int(int(meterValues['p31_voltage']/10)) # l3-l1 voltage - block_254.add_32bit_int(int(meterValues['p3n_voltage']/10)) # l3-n voltage - block_254.add_32bit_int(meterValues['p3_current']*100) # current l3 - block_254.add_32bit_int(meterValues['p3_power']*-10) # power l3 - block_254.add_32bit_int(meterValues['p3_power_apparent']*-10) # apparent power l3 - block_254.add_32bit_int(meterValues['p3_power_reactive']*-10) # reactive power l3 - block_254.add_32bit_int(int(meterValues['p3_power_factor']/10)) # power factor l3 + block_254.add_32bit_int(int(meterValues['l31_voltage_int']/10)) # l3-l1 voltage + block_254.add_32bit_int(int(meterValues['l3n_voltage_int']/10)) # l3-n voltage + block_254.add_32bit_int(meterValues['l3_current_int']*100) # current l3 + block_254.add_32bit_int(meterValues['l3_power_int']*-10) # power l3 + block_254.add_32bit_int(meterValues['l3_power_apparent_int']*-10) # apparent power l3 + block_254.add_32bit_int(meterValues['l3_power_reactive_int']*-10) # reactive power l3 + block_254.add_32bit_int(int(meterValues['l3_power_factor_int']/10)) # power factor l3 block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_254.add_32bit_int(int(meterValues['import_energy_active']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['import_energy_apparent']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['p1_import_energy_active']/100)) # imported active energy l1 - block_254.add_32bit_int(int(meterValues['p2_import_energy_active']/100)) # imported active energy l2 - block_254.add_32bit_int(int(meterValues['p3_import_energy_active']/100)) # imported active energy l3 + block_254.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy + block_254.add_32bit_int(int(meterValues['l1_import_energy_active_int']/100)) # imported active energy l1 + block_254.add_32bit_int(int(meterValues['l2_import_energy_active_int']/100)) # imported active energy l2 + block_254.add_32bit_int(int(meterValues['l3_import_energy_active_int']/100)) # imported active energy l3 block_254.add_32bit_int(10) # total active energy Tarif 1 block_254.add_32bit_int(20) # total active energy Tarif 2 block_254.add_32bit_int(30) # total active energy Tarif 3 @@ -546,19 +529,19 @@ def t_update(ctx, SE7K_CTX, stop, module, device, refresh): ## unused values # "energy_reactive" # total reactive energy - # "p1_export_energy_active", 0)) # exported energy l1 - # "p2_export_energy_active", 0)) # exported energy l2 - # "p3_export_energy_active", 0)) # exported energy l3 - # "p1_energy_reactive", 0)) # reactive energy l1 - # "p2_energy_reactive", 0)) # reactive energy l2 - # "p3_energy_reactive", 0)) # reactive energy l3 - # "p1_energy_apparent", 0)) # apparent energy l1 - # "p2_energy_apparent", 0)) # apparent energy l2 - # "p3_energy_apparent", 0)) # apparent energy l3 + # "l1_export_energy_active", 0)) # exported energy l1 + # "l2_export_energy_active", 0)) # exported energy l2 + # "l3_export_energy_active", 0)) # exported energy l3 + # "l1_energy_reactive", 0)) # reactive energy l1 + # "l2_energy_reactive", 0)) # reactive energy l2 + # "l3_energy_reactive", 0)) # reactive energy l3 + # "l1_energy_apparent", 0)) # apparent energy l1 + # "l2_energy_apparent", 0)) # apparent energy l2 + # "l3_energy_apparent", 0)) # apparent energy l3 # "minimum_demand_power_active", 0)) # minimum demand power - # "p1_demand_power_active", 0)) # demand power l1 - # "p2_demand_power_active", 0)) # demand power l2 - # "p3_demand_power_active", 0)) # demand power l3 + # "l1_demand_power_active", 0)) # demand power l1 + # "l2_demand_power_active", 0)) # demand power l2 + # "l3_demand_power_active", 0)) # demand power l3 except Exception as e: logger.critical(f"{this_t.name}: {e}") finally: diff --git a/devices/solaredge-inverter.py b/devices/solaredge-inverter.py index 8a82498..26dd639 100644 --- a/devices/solaredge-inverter.py +++ b/devices/solaredge-inverter.py @@ -94,58 +94,58 @@ def values(device): "energy_active": values.get("total_energy_active", 0), "import_energy_active": values.get("import_energy_active", 0), "power_active": values.get("total_power_active", 0), - "p1_power_active": values.get("p1_power_active", 0), - "p2_power_active": values.get("p2_power_active", 0), - "p3_power_active": values.get("p3_power_active", 0), + "l1_power_active": values.get("l1_power_active", 0), + "l2_power_active": values.get("l2_power_active", 0), + "l3_power_active": values.get("l3_power_active", 0), "voltage_ln": values.get("voltage_ln", 0), - "p1n_voltage": values.get("p1_voltage", 0), - "p2n_voltage": values.get("p2_voltage", 0), - "p3n_voltage": values.get("p3_voltage", 0), + "l1n_voltage": values.get("l1n_voltage", 0), + "l2n_voltage": values.get("l2n_voltage", 0), + "l3n_voltage": values.get("l3n_voltage", 0), "voltage_ll": values.get("voltage_ll", 0), - "p12_voltage": values.get("p12_voltage", 0), - "p23_voltage": values.get("p23_voltage", 0), - "p31_voltage": values.get("p31_voltage", 0), + "l12_voltage": values.get("l12_voltage", 0), + "l23_voltage": values.get("l23_voltage", 0), + "l31_voltage": values.get("l31_voltage", 0), "frequency": values.get("frequency", 0), - "p1_energy_active": values.get("total_energy_active", 0), - # "p2_energy_active" - # "p3_energy_active" - "p1_import_energy_active": values.get("import_energy_active", 0), - # "p2_import_energy_active" - # "p3_import_energy_active" + "l1_energy_active": values.get("total_energy_active", 0), + # "l2_energy_active" + # "l3_energy_active" + "l1_import_energy_active": values.get("import_energy_active", 0), + # "l2_import_energy_active" + # "l3_import_energy_active" "export_energy_active": values.get("export_energy_active", 0), - "p1_export_energy_active": values.get("export_energy_active", 0), - # "p2_export_energy_active" - # "p3_export_energy_active" + "l1_export_energy_active": values.get("export_energy_active", 0), + # "l2_export_energy_active" + # "l3_export_energy_active" "energy_reactive": values.get("total_energy_reactive", 0), - "p1_energy_reactive": values.get("total_energy_reactive", 0), - # "p2_energy_reactive" - # "p3_energy_reactive" + "l1_energy_reactive": values.get("total_energy_reactive", 0), + # "l2_energy_reactive" + # "l3_energy_reactive" "energy_apparent": values.get("total_energy_apparent", 0), - "p1_energy_apparent": values.get("total_energy_apparent", 0), - # "p2_energy_apparent" - # "p3_energy_apparent" + "l1_energy_apparent": values.get("total_energy_apparent", 0), + # "l2_energy_apparent" + # "l3_energy_apparent" "power_factor": values.get("total_power_factor", 0), - "p1_power_factor": values.get("p1_power_factor", 0), - "p2_power_factor": values.get("p2_power_factor", 0), - "p3_power_factor": values.get("p3_power_factor", 0), + "l1_power_factor": values.get("l1_power_factor", 0), + "l2_power_factor": values.get("l2_power_factor", 0), + "l3_power_factor": values.get("l3_power_factor", 0), "power_reactive": values.get("total_power_reactive", 0), - "p1_power_reactive": values.get("p1_power_reactive", 0), - "p2_power_reactive": values.get("p2_power_reactive", 0), - "p3_power_reactive": values.get("p3_power_reactive", 0), + "l1_power_reactive": values.get("l1_power_reactive", 0), + "l2_power_reactive": values.get("l2_power_reactive", 0), + "l3_power_reactive": values.get("l3_power_reactive", 0), "power_apparent": values.get("total_power_apparent", 0), - "p1_power_apparent": values.get("p1_power_apparent", 0), - "p2_power_apparent": values.get("p2_power_apparent", 0), - "p3_power_apparent": values.get("p3_power_apparent", 0), - "p1_current": values.get("p1_current", 0), - "p2_current": values.get("p2_current", 0), - "p3_current": values.get("p3_current", 0), + "l1_power_apparent": values.get("l1_power_apparent", 0), + "l2_power_apparent": values.get("l2_power_apparent", 0), + "l3_power_apparent": values.get("l3_power_apparent", 0), + "l1_current": values.get("l1_current", 0), + "l2_current": values.get("l2_current", 0), + "l3_current": values.get("l3_current", 0), "demand_power_active": values.get("total_import_demand_power_active", 0), # "minimum_demand_power_active" "maximum_demand_power_active": values.get("maximum_import_demand_power_active", 0), "demand_power_apparent": values.get("total_demand_power_apparent", 0), - "p1_demand_power_active": (values.get("p1_demand_current", 0) * values.get("p1_voltage", 0)), - "p2_demand_power_active": (values.get("p2_demand_current", 0) * values.get("p2_voltage", 0)), - "p3_demand_power_active": (values.get("p3_demand_current", 0) * values.get("p3_voltage", 0)) + "l1_demand_power_active": (values.get("l1_demand_current", 0) * values.get("l1_voltage", 0)), + "l2_demand_power_active": (values.get("l2_demand_current", 0) * values.get("l2_voltage", 0)), + "l3_demand_power_active": (values.get("l3_demand_current", 0) * values.get("l3_voltage", 0)) } diff --git a/documents/Victron.txt b/documents/Victron.txt new file mode 100644 index 0000000..2162fad --- /dev/null +++ b/documents/Victron.txt @@ -0,0 +1,5 @@ +Victron erwartet folgenden Zähler + +EM24DINAV23XE1X 1648 (0x670) + +Er muss im Register 0B de wert 1648 zurückgeben \ No newline at end of file From 127828be494e15d12c205a392222ee13b1b24330 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 9 Mar 2022 23:18:27 +0100 Subject: [PATCH 26/32] Use the nmakel variables in EM24DINAV23XE1X proxy --- EM24DINAV23XE1X-proxy-tcp.py | 272 +++++++++++++++---------------- SE-MTR-3Y-400V-A.cmd | 2 +- SE-MTR-3Y-400V-A.sh | 2 +- SE7K-EM24-PROXY.cmd | 2 +- SE7K-EM24-proxy-tcp.py | 296 +++++++++++++++++----------------- SE7K-proxy-tcp.cmd | 2 +- SE7K-proxy-tcp.py | 111 +++++++------ devices/solaredge-inverter.py | 117 +++++++------- 8 files changed, 394 insertions(+), 410 deletions(-) diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index 41d4d29..5db0e69 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -4,6 +4,7 @@ import configparser import importlib import logging +from operator import truediv import sys import threading import time @@ -97,132 +98,111 @@ def t_update(ctx, stop, module, device, refresh): meterValues = values["connected_meters"]["Meter1"] - logger.info(meterValues['power_int']*10**meterValues['power_scale_int']) + logger.info(values.get('power_active')) if logger.isEnabledFor(logging.DEBUG): - logger.info("current:"+str(meterValues['current_int'])) - logger.info(str(meterValues['current_int']*10**meterValues['current_scale_int'])) - logger.info(meterValues['l1_current_int']*10**meterValues['current_scale_int']) - logger.info(meterValues['l2_current_int']*10**meterValues['current_scale_int']) - logger.info(meterValues['l3_current_int']*10**meterValues['current_scale_int']) - logger.debug(meterValues['current_scale_int']) - - logger.debug("voltage_ln:"+str(meterValues['voltage_ln_int'])) - logger.debug(meterValues['voltage_ln_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l1n_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l2n_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l3n_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['voltage_scale_int']) - - logger.debug("voltage_ll:"+str(meterValues['voltage_ll_int'])) - logger.debug(meterValues['voltage_ll_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l12_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l23_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l31_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['voltage_scale_int']) + logger.info("current:") + logger.info(values.get('l1_current')) + logger.info(values.get('l2_current')) + logger.info(values.get('l3_current')) + + logger.info("voltage_ln:"+str(values.get('voltage_ln'))) + logger.info(values.get('l1n_voltage')) + logger.info(values.get('l2n_voltage')) + logger.info(values.get('l3n_voltage')) + + logger.info("voltage_ll:"+str(values.get('voltage_ll'))) + logger.info(values.get('l12_voltage')) + logger.info(values.get('l23_voltage')) + logger.info(values.get('l31_voltage')) - logger.info("frequency:"+str(meterValues['frequency_int'])) - logger.info(meterValues['frequency_int']*10**meterValues['frequency_scale_int']) - - logger.info("power:"+str(meterValues['power_int'])) - logger.info(meterValues['power_int']*10**meterValues['power_scale_int']) - logger.info(meterValues['l1_power_int']*10**meterValues['power_scale_int']) - logger.info(meterValues['l2_power_int']*10**meterValues['power_scale_int']) - logger.info(meterValues['l3_power_int']*10**meterValues['power_scale_int']) - logger.info(meterValues['power_scale_int']) - - logger.info("power_apparent:"+str(meterValues['power_apparent_int'])) - logger.info(meterValues['power_apparent_int']*10**meterValues['power_apparent_scale_int']) - logger.info(meterValues['l1_power_apparent_int']*10**meterValues['power_apparent_scale_int']) - logger.info(meterValues['l2_power_apparent_int']*10**meterValues['power_apparent_scale_int']) - logger.info(meterValues['l3_power_apparent_int']*10**meterValues['power_apparent_scale_int']) - logger.info(meterValues['power_apparent_scale_int']) - - logger.info("power_reactive:"+str(meterValues['power_reactive_int'])) - logger.info(meterValues['power_reactive_int']*10**meterValues['power_reactive_scale_int']) - logger.info(meterValues['l1_power_reactive_int']*10**meterValues['power_reactive_scale_int']) - logger.info(meterValues['l2_power_reactive_int']*10**meterValues['power_reactive_scale_int']) - logger.info(meterValues['l3_power_reactive_int']*10**meterValues['power_reactive_scale_int']) - logger.info(meterValues['power_reactive_scale_int']) - - logger.info("power_factor:"+str(meterValues['power_factor_int'])) - logger.info(meterValues['power_factor_int']*10**meterValues['power_factor_scale_int']) - logger.info(meterValues['l1_power_factor_int']*10**meterValues['power_factor_scale_int']) - logger.info(meterValues['l2_power_factor_int']*10**meterValues['power_factor_scale_int']) - logger.info(meterValues['l3_power_factor_int']*10**meterValues['power_factor_scale_int']) - logger.info(meterValues['power_factor_scale_int']) - - logger.debug("export_energy_active:"+str(meterValues['export_energy_active_int'])) - logger.debug(meterValues['export_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l1_export_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l2_export_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l3_export_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['energy_active_scale_int']) - - logger.debug("import_energy_active:"+str(meterValues['import_energy_active_int'])) - logger.debug(meterValues['import_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l1_import_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l2_import_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l3_import_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['energy_active_scale_int']) - - logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent_int'])) - logger.debug(meterValues['import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) - logger.debug(meterValues['l1_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) - logger.debug(meterValues['l2_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) - logger.debug(meterValues['l3_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) - logger.debug(meterValues['energy_apparent_scale_int']) + logger.info("frequency:"+str(values.get('frequency'))) + + logger.info("power:"+str(values.get('power_active'))) + logger.info(values.get('l1_power_active')) + logger.info(values.get('l2_power_active')) + logger.info(values.get('l3_power_active')) + + logger.info("power_apparent:"+str(values.get('power_apparent'))) + logger.info(values.get('l1_power_apparent')) + logger.info(values.get('l2_power_apparent')) + logger.info(values.get('l3_power_apparent')) + + logger.info("power_reactive:"+str(values.get('power_reactive'))) + logger.info(values.get('l1_power_reactive')) + logger.info(values.get('l2_power_reactive')) + logger.info(values.get('l3_power_reactive')) + + logger.info("power_factor:"+str(values.get('power_factor'))) + logger.info(values.get('l1_power_factor')) + logger.info(values.get('l2_power_factor')) + logger.info(values.get('l3_power_factor')) + + logger.info("export_energy_active:"+str(values.get('export_energy_active')/1000)) + logger.info(values.get('l1_export_energy_active')/1000) + logger.info(values.get('l2_export_energy_active')/1000) + logger.info(values.get('l3_export_energy_active')/1000) + + logger.info("import_energy_active:"+str(values.get('import_energy_active')/1000)) + logger.info(values.get('l1_import_energy_active')/1000) + logger.info(values.get('l2_import_energy_active')/1000) + logger.info(values.get('l3_import_energy_active')/1000) + + logger.info("energy_apparent:"+str(values.get('energy_apparent')/1000)) + logger.info(values.get('l1_energy_apparent')/1000) + logger.info(values.get('l2_energy_apparent')/1000) + logger.info(values.get('l3_energy_apparent')/1000) block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_0.add_32bit_int(int(meterValues['l1n_voltage_int']/10)) # l1-n voltage * 10 - block_0.add_32bit_int(int(meterValues['l2n_voltage_int']/10)) # l2-n voltage - block_0.add_32bit_int(int(meterValues['l3n_voltage_int']/10)) # l3-n voltage - block_0.add_32bit_int(int(meterValues['l12_voltage_int']/10)) # l1-l2 voltage - block_0.add_32bit_int(int(meterValues['l23_voltage_int']/10)) # l2-l3 voltage - block_0.add_32bit_int(int(meterValues['l31_voltage_int']/10)) # l3-l1 voltage - block_0.add_32bit_int(meterValues['l1_current_int']*100) # current l1 * 1000 - block_0.add_32bit_int(meterValues['l2_current_int']*100) # current l2 - block_0.add_32bit_int(meterValues['l3_current_int']*100) # current l3 - block_0.add_32bit_int(meterValues['l1_power_int']*-10) # power l1 *10 - block_0.add_32bit_int(meterValues['l2_power_int']*-10) # power l2 - block_0.add_32bit_int(meterValues['l3_power_int']*-10) # power l3 - block_0.add_32bit_int(meterValues['l1_power_apparent_int']*-10) # apparent power l1 *10 - block_0.add_32bit_int(meterValues['l2_power_apparent_int']*-10) # apparent power l2 - block_0.add_32bit_int(meterValues['l3_power_apparent_int']*-10) # apparent power l3 - block_0.add_32bit_int(meterValues['l1_power_reactive_int']*-10) # reactive power l1 *10 - block_0.add_32bit_int(meterValues['l2_power_reactive_int']*-10) # reactive power l2 - block_0.add_32bit_int(meterValues['l3_power_reactive_int']*-10) # reactive power l3 - block_0.add_32bit_int(int(meterValues['voltage_ln_int']/10)) # l-n voltage *10 - block_0.add_32bit_int(int(meterValues['voltage_ll_int']/10)) # l-l voltage - block_0.add_32bit_int(meterValues['power_int']*-10) # total power *10 - block_0.add_32bit_int(meterValues['power_apparent_int']*-10) # total apparent power - block_0.add_32bit_int(meterValues['power_reactive_int']*-10) # total reactive power - block_0.add_16bit_int(int(meterValues['l1_power_factor_int']/10)) # power factor l1 *1000 - block_0.add_16bit_int(int(meterValues['l2_power_factor_int']/10)) # power factor l2 - block_0.add_16bit_int(int(meterValues['l3_power_factor_int']/10)) # power factor l3 - block_0.add_16bit_int(int(meterValues['power_factor_int']/10)) # power factor + block_0.add_32bit_int(int(values.get('l1n_voltage')*10)) # l1-n voltage * 10 + block_0.add_32bit_int(int(values.get('l2n_voltage')*10)) # l2-n voltage + block_0.add_32bit_int(int(values.get('l3n_voltage')*10)) # l3-n voltage + block_0.add_32bit_int(int(values.get('l12_voltage')*10)) # l1-l2 voltage + block_0.add_32bit_int(int(values.get('l23_voltage')*10)) # l2-l3 voltage + block_0.add_32bit_int(int(values.get('l31_voltage')*10)) # l3-l1 voltage + block_0.add_32bit_int(int(values.get('l1_current')*1000)) # current l1 * 1000 + block_0.add_32bit_int(int(values.get('l2_current')*1000)) # current l2 + block_0.add_32bit_int(int(values.get('l3_current')*1000)) # current l3 + block_0.add_32bit_int(int(values.get('l1_power_active')*-10)) # power l1 *10 + block_0.add_32bit_int(int(values.get('l2_power_active')*-10)) # power l2 + block_0.add_32bit_int(int(values.get('l3_power_active')*-10)) # power l3 + block_0.add_32bit_int(int(values.get('l1_power_apparent')*-10)) # apparent power l1 *10 + block_0.add_32bit_int(int(values.get('l2_power_apparent')*-10)) # apparent power l2 + block_0.add_32bit_int(int(values.get('l3_power_apparent')*-10)) # apparent power l3 + block_0.add_32bit_int(int(values.get('l1_power_reactive')*-10)) # reactive power l1 *10 + block_0.add_32bit_int(int(values.get('l2_power_reactive')*-10)) # reactive power l2 + block_0.add_32bit_int(int(values.get('l3_power_reactive')*-10)) # reactive power l3 + block_0.add_32bit_int(int(values.get('voltage_ln')*10)) # l-n voltage *10 + block_0.add_32bit_int(int(values.get('voltage_ll')*10)) # l-l voltage + block_0.add_32bit_int(int(values.get('power_active')*-10)) # total power *10 + block_0.add_32bit_int(int(values.get('power_apparent')*-10)) # total apparent power + block_0.add_32bit_int(int(values.get('power_reactive')*-10)) # total reactive power + block_0.add_16bit_int(int(values.get('l1_power_factor')*10)) # power factor l1 *1000 + block_0.add_16bit_int(int(values.get('l2_power_factor')*10)) # power factor l2 + block_0.add_16bit_int(int(values.get('l3_power_factor')*10)) # power factor l3 + block_0.add_16bit_int(int(values.get('power_factor')*10)) # power factor block_0.add_16bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_0.add_16bit_uint(int(meterValues['frequency_int']/10)) # line frequency *10 + block_0.add_16bit_uint(int(values.get('frequency')*10)) # line frequency *10 - block_0.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy + block_0.add_32bit_int(int(values.get('import_energy_active')/100)) # imported active energy *10 + block_0.add_32bit_int(int(values.get('energy_apparent')/100)) # imported active energy block_0.add_32bit_int(56) # demand power block_0.add_32bit_int(58) # maximum demand power - block_0.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['l1_import_energy_active_int']/100)) # imported active energy l1 - block_0.add_32bit_int(int(meterValues['l2_import_energy_active_int']/100)) # imported active energy l2 - block_0.add_32bit_int(int(meterValues['l3_import_energy_active_int']/100)) # imported active energy l3 + block_0.add_32bit_int(int(values.get('import_energy_active')/100)) # imported active energy + block_0.add_32bit_int(int(values.get('energy_apparent')/100)) # imported active energy + block_0.add_32bit_int(int(values.get('l1_import_energy_active')/100)) # imported active energy l1 + block_0.add_32bit_int(int(values.get('l2_import_energy_active')/100)) # imported active energy l2 + block_0.add_32bit_int(int(values.get('l3_import_energy_active')/100)) # imported active energy l3 block_0.add_32bit_int(10) # total active energy Tarif 1 block_0.add_32bit_int(20) # total active energy Tarif 2 block_0.add_32bit_int(30) # total active energy Tarif 3 block_0.add_32bit_int(40) # total active energy Tarif 4 - block_0.add_32bit_int(int(meterValues['export_energy_active_int']/100)) # total exported active energy non-reset /100) - block_0.add_32bit_int(int(meterValues['export_energy_apparent_int']/100)) # imported active energy non-reset + block_0.add_32bit_int(int(values.get('export_energy_active')/100)) # total exported active energy non-reset ) + block_0.add_32bit_int(int(values.get('import_energy_active')/100)) # import active energy non-reset block_0.add_32bit_int(2400) # hour *100 block_0.add_32bit_int(11) # total apparent energy Tarif 1 *10 block_0.add_32bit_int(22) # total apparent energy Tarif 2 @@ -237,55 +217,55 @@ def t_update(ctx, stop, module, device, refresh): block_254 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_254.add_32bit_int(2400) # hour *100 *100 block_254.add_32bit_int(256) # unused *100 - block_254.add_32bit_int(int(meterValues['voltage_ln_int']/10)) # l-n voltage *10 - block_254.add_32bit_int(int(meterValues['voltage_ll_int']/10)) # l-l voltage - block_254.add_32bit_int(meterValues['power_int']*-10) # total power *10 - block_254.add_32bit_int(meterValues['power_apparent_int']*-10) # total apparent power - block_254.add_32bit_int(meterValues['power_reactive_int']*-10) # total reactive power - block_254.add_32bit_int(int(meterValues['power_factor_int']/10)) # power factor + block_254.add_32bit_int(int(values.get('voltage_ln')*10)) # l-n voltage *10 + block_254.add_32bit_int(int(values.get('voltage_ll')*10)) # l-l voltage + block_254.add_32bit_int(int(values.get('power_active')*-10)) # total power *10 + block_254.add_32bit_int(int(values.get('power_apparent')*-10)) # total apparent power + block_254.add_32bit_int(int(values.get('power_reactive')*-10)) # total reactive power + block_254.add_32bit_int(int(values.get('power_factor')*10)) # power factor block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_254.add_32bit_int(int(meterValues['frequency_int']/10)) # line frequency *10 - block_254.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['export_energy_active_int']/100)) # total exported active energy non-reset /100) - block_254.add_32bit_int(int(meterValues['export_energy_apparent_int']/100)) # imported active energy non-reset + block_254.add_32bit_int(int(values.get('frequency')*10)) # line frequency *10 + block_254.add_32bit_int(int(values.get('import_energy_active')/100)) # imported active energy + block_254.add_32bit_int(int(values.get('energy_apparent')/100)) # imported active energy + block_254.add_32bit_int(int(values.get('export_energy_active')/100)) # total exported active energy non-reset ) + block_254.add_32bit_int(int(values.get('import_energy_active')/100)) # imported active energy non-reset block_254.add_32bit_int(56) # demand power block_254.add_32bit_int(58) # maximum demand power - block_254.add_32bit_int(int(meterValues['l12_voltage_int']/10)) # l1-l2 voltage - block_254.add_32bit_int(int(meterValues['l1n_voltage_int']/10)) # l1-n voltage * 10 - block_254.add_32bit_int(meterValues['l1_current_int']*100) # current l1 * 1000 - block_254.add_32bit_int(meterValues['l1_power_int']*-10) # power l1 *10 - block_254.add_32bit_int(meterValues['l1_power_apparent_int']*-10) # apparent power l1 *10 - block_254.add_32bit_int(meterValues['l1_power_reactive_int']*-10) # reactive power l1 *10 - block_254.add_32bit_int(int(meterValues['l1_power_factor_int']/10)) # power factor l1 *1000 + block_254.add_32bit_int(int(values.get('l12_voltage')*10)) # l1-l2 voltage + block_254.add_32bit_int(int(values.get('l1n_voltage')*10)) # l1-n voltage * 10 + block_254.add_32bit_int(int(values.get('l1_current')*100)) # current l1 * 1000 + block_254.add_32bit_int(int(values.get('l1_power_active')*-10)) # power l1 *10 + block_254.add_32bit_int(int(values.get('l1_power_apparent')*-10)) # apparent power l1 *10 + block_254.add_32bit_int(int(values.get('l1_power_reactive')*-10)) # reactive power l1 *10 + block_254.add_32bit_int(int(values.get('l1_power_factor')*1000)) # power factor l1 *1000 - block_254.add_32bit_int(int(meterValues['l23_voltage_int']/10)) # l2-l3 voltage - block_254.add_32bit_int(int(meterValues['l2n_voltage_int']/10)) # l2-n voltage - block_254.add_32bit_int(meterValues['l2_current_int']*100) # current l2 - block_254.add_32bit_int(meterValues['l2_power_int']*-10) # power l2 - block_254.add_32bit_int(meterValues['l2_power_apparent_int']*-10) # apparent power l2 - block_254.add_32bit_int(meterValues['l2_power_reactive_int']*-10) # reactive power l2 - block_254.add_32bit_int(int(meterValues['l2_power_factor_int']/10)) # power factor l2 + block_254.add_32bit_int(int(values.get('l23_voltage')*10)) # l2-l3 voltage + block_254.add_32bit_int(int(values.get('l2n_voltage')*10)) # l2-n voltage + block_254.add_32bit_int(int(values.get('l2_current')*100)) # current l2 + block_254.add_32bit_int(int(values.get('l2_power_active')*-10)) # power l2 + block_254.add_32bit_int(int(values.get('l2_power_apparent')*-10)) # apparent power l2 + block_254.add_32bit_int(int(values.get('l2_power_reactive')*-10)) # reactive power l2 + block_254.add_32bit_int(int(values.get('l2_power_factor')*1000)) # power factor l2 - block_254.add_32bit_int(int(meterValues['l31_voltage_int']/10)) # l3-l1 voltage - block_254.add_32bit_int(int(meterValues['l3n_voltage_int']/10)) # l3-n voltage - block_254.add_32bit_int(meterValues['l3_current_int']*100) # current l3 - block_254.add_32bit_int(meterValues['l3_power_int']*-10) # power l3 - block_254.add_32bit_int(meterValues['l3_power_apparent_int']*-10) # apparent power l3 - block_254.add_32bit_int(meterValues['l3_power_reactive_int']*-10) # reactive power l3 - block_254.add_32bit_int(int(meterValues['l3_power_factor_int']/10)) # power factor l3 + block_254.add_32bit_int(int(values.get('l31_voltage')*10)) # l3-l1 voltage + block_254.add_32bit_int(int(values.get('l3n_voltage')*10)) # l3-n voltage + block_254.add_32bit_int(int(values.get('l3_current')*100)) # current l3 + block_254.add_32bit_int(int(values.get('l3_power_active')*-10)) # power l3 + block_254.add_32bit_int(int(values.get('l3_power_apparent')*-10)) # apparent power l3 + block_254.add_32bit_int(int(values.get('l3_power_reactive')*-10)) # reactive power l3 + block_254.add_32bit_int(int(values.get('l3_power_factor')*1000)) # power factor l3 block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_254.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['l1_import_energy_active_int']/100)) # imported active energy l1 - block_254.add_32bit_int(int(meterValues['l2_import_energy_active_int']/100)) # imported active energy l2 - block_254.add_32bit_int(int(meterValues['l3_import_energy_active_int']/100)) # imported active energy l3 + block_254.add_32bit_int(int(values.get('import_energy_active')/100)) # imported active energy + block_254.add_32bit_int(int(values.get('energy_apparent')/100)) # imported active energy + block_254.add_32bit_int(int(values.get('l1_import_energy_active')/100)) # imported active energy l1 + block_254.add_32bit_int(int(values.get('l2_import_energy_active')/100)) # imported active energy l2 + block_254.add_32bit_int(int(values.get('l3_import_energy_active')/100)) # imported active energy l3 block_254.add_32bit_int(10) # total active energy Tarif 1 block_254.add_32bit_int(20) # total active energy Tarif 2 block_254.add_32bit_int(30) # total active energy Tarif 3 diff --git a/SE-MTR-3Y-400V-A.cmd b/SE-MTR-3Y-400V-A.cmd index 9a402a5..09918e0 100644 --- a/SE-MTR-3Y-400V-A.cmd +++ b/SE-MTR-3Y-400V-A.cmd @@ -1,2 +1,2 @@ echo use -v for more information -python EM24DINAV23XE1X-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf %* \ No newline at end of file +python EM24DINAV23XE1X-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf %* diff --git a/SE-MTR-3Y-400V-A.sh b/SE-MTR-3Y-400V-A.sh index 161d799..089d5f0 100755 --- a/SE-MTR-3Y-400V-A.sh +++ b/SE-MTR-3Y-400V-A.sh @@ -1,3 +1,3 @@ #!/bin/bash echo use -v for more information -python EM24DINAV23XE1X-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf $* \ No newline at end of file +python EM24DINAV23XE1X-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf $* diff --git a/SE7K-EM24-PROXY.cmd b/SE7K-EM24-PROXY.cmd index 8281ff4..2d10031 100644 --- a/SE7K-EM24-PROXY.cmd +++ b/SE7K-EM24-PROXY.cmd @@ -1,2 +1,2 @@ echo use -v for more information -python SE7K-EM24-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf %* \ No newline at end of file +python SE7K-EM24-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf %* diff --git a/SE7K-EM24-proxy-tcp.py b/SE7K-EM24-proxy-tcp.py index 0d9ee8f..1ac7af8 100644 --- a/SE7K-EM24-proxy-tcp.py +++ b/SE7K-EM24-proxy-tcp.py @@ -310,134 +310,134 @@ def t_update(ctx, SE7K_CTX, stop, module, device, refresh): logger.debug(f"{this_t.name}: no new values") continue - meterValues = values["connected_meters"]["Meter1"] - - logger.info(meterValues['power_int']*10**meterValues['power_scale_int']) + # use the values from the SE-MTR-3Y-400V-A SE Meter + values = values["connected_meters"]["Meter1"] + logger.info(values.get('power_int', 0)*10**values.get('power_scale_int', 0)) if logger.isEnabledFor(logging.DEBUG): - logger.info("current:"+str(meterValues['current_int'])) - logger.info(str(meterValues['current_int']*10**meterValues['current_scale_int'])) - logger.info(meterValues['l1_current_int']*10**meterValues['current_scale_int']) - logger.info(meterValues['l2_current_int']*10**meterValues['current_scale_int']) - logger.info(meterValues['l3_current_int']*10**meterValues['current_scale_int']) - logger.debug(meterValues['current_scale_int']) - - logger.debug("voltage_ln:"+str(meterValues['voltage_ln_int'])) - logger.debug(meterValues['voltage_ln_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l1n_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l2n_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l3n_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['voltage_scale_int']) - - logger.debug("voltage_ll:"+str(meterValues['voltage_ll_int'])) - logger.debug(meterValues['voltage_ll_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l12_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l23_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['l31_voltage_int']*10**meterValues['voltage_scale_int']) - logger.debug(meterValues['voltage_scale_int']) + logger.info("current:"+str(values.get('current_int', 0))) + logger.info(values.get('current_int', 0)*10**values.get('current_scale_int', 0)) + logger.info(values.get('l1_current_int', 0)*10**values.get('current_scale_int', 0)) + logger.info(values.get('l2_current_int', 0)*10**values.get('current_scale_int', 0)) + logger.info(values.get('l3_current_int', 0)*10**values.get('current_scale_int', 0)) + logger.debug(values.get('current_scale_int', 0)) + + logger.debug("voltage_ln:"+str(values.get('voltage_ln_int', 0))) + logger.debug(values.get('voltage_ln_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l1n_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l2n_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l3n_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('voltage_scale_int', 0)) + + logger.debug("voltage_ll:"+str(values.get('voltage_ll_int', 0))) + logger.debug(values.get('voltage_ll_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l12_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l23_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l31_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('voltage_scale_int', 0)) - logger.info("frequency:"+str(meterValues['frequency_int'])) - logger.info(meterValues['frequency_int']*10**meterValues['frequency_scale_int']) - - logger.info("power:"+str(meterValues['power_int'])) - logger.info(meterValues['power_int']*10**meterValues['power_scale_int']) - logger.info(meterValues['l1_power_int']*10**meterValues['power_scale_int']) - logger.info(meterValues['l2_power_int']*10**meterValues['power_scale_int']) - logger.info(meterValues['l3_power_int']*10**meterValues['power_scale_int']) - logger.info(meterValues['power_scale_int']) - - logger.info("power_apparent:"+str(meterValues['power_apparent_int'])) - logger.info(meterValues['power_apparent_int']*10**meterValues['power_apparent_scale_int']) - logger.info(meterValues['l1_power_apparent_int']*10**meterValues['power_apparent_scale_int']) - logger.info(meterValues['l2_power_apparent_int']*10**meterValues['power_apparent_scale_int']) - logger.info(meterValues['l3_power_apparent_int']*10**meterValues['power_apparent_scale_int']) - logger.info(meterValues['power_apparent_scale_int']) - - logger.info("power_reactive:"+str(meterValues['power_reactive_int'])) - logger.info(meterValues['power_reactive_int']*10**meterValues['power_reactive_scale_int']) - logger.info(meterValues['l1_power_reactive_int']*10**meterValues['power_reactive_scale_int']) - logger.info(meterValues['l2_power_reactive_int']*10**meterValues['power_reactive_scale_int']) - logger.info(meterValues['l3_power_reactive_int']*10**meterValues['power_reactive_scale_int']) - logger.info(meterValues['power_reactive_scale_int']) - - logger.info("power_factor:"+str(meterValues['power_factor_int'])) - logger.info(meterValues['power_factor_int']*10**meterValues['power_factor_scale_int']) - logger.info(meterValues['l1_power_factor_int']*10**meterValues['power_factor_scale_int']) - logger.info(meterValues['l2_power_factor_int']*10**meterValues['power_factor_scale_int']) - logger.info(meterValues['l3_power_factor_int']*10**meterValues['power_factor_scale_int']) - logger.info(meterValues['power_factor_scale_int']) - - logger.debug("export_energy_active:"+str(meterValues['export_energy_active_int'])) - logger.debug(meterValues['export_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l1_export_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l2_export_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l3_export_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['energy_active_scale_int']) - - logger.debug("import_energy_active:"+str(meterValues['import_energy_active_int'])) - logger.debug(meterValues['import_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l1_import_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l2_import_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['l3_import_energy_active_int']*10**meterValues['energy_active_scale_int']) - logger.debug(meterValues['energy_active_scale_int']) - - logger.debug("import_energy_apparent:"+str(meterValues['import_energy_apparent_int'])) - logger.debug(meterValues['import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) - logger.debug(meterValues['l1_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) - logger.debug(meterValues['l2_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) - logger.debug(meterValues['l3_import_energy_apparent_int']*10**meterValues['energy_apparent_scale_int']) - logger.debug(meterValues['energy_apparent_scale_int']) + logger.info("frequency:"+str(values.get('frequency_int', 0))) + logger.info(values.get('frequency_int', 0)*10**values.get('frequency_scale_int', 0)) + + logger.info("power:"+str(values.get('power_int', 0))) + logger.info(values.get('power_int', 0)*10**values.get('power_scale_int', 0)) + logger.info(values.get('l1_power_int', 0)*10**values.get('power_scale_int', 0)) + logger.info(values.get('l2_power_int', 0)*10**values.get('power_scale_int', 0)) + logger.info(values.get('l3_power_int', 0)*10**values.get('power_scale_int', 0)) + logger.info(values.get('power_scale_int', 0)) + + logger.info("power_apparent:"+str(values.get('power_apparent_int', 0))) + logger.info(values.get('power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) + logger.info(values.get('l1_power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) + logger.info(values.get('l2_power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) + logger.info(values.get('l3_power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) + logger.info(values.get('power_apparent_scale_int', 0)) + + logger.info("power_reactive:"+str(values.get('power_reactive_int', 0))) + logger.info(values.get('power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) + logger.info(values.get('l1_power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) + logger.info(values.get('l2_power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) + logger.info(values.get('l3_power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) + logger.info(values.get('power_reactive_scale_int', 0)) + + logger.info("power_factor:"+str(values.get('power_factor_int', 0))) + logger.info(values.get('power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) + logger.info(values.get('l1_power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) + logger.info(values.get('l2_power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) + logger.info(values.get('l3_power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) + logger.info(values.get('power_factor_scale_int', 0)) + + logger.debug("export_energy_active:"+str(values.get('export_energy_active_int', 0))) + logger.debug(values.get('export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l1_export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l2_export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l3_export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('energy_active_scale_int', 0)) + + logger.debug("import_energy_active:"+str(values.get('import_energy_active_int', 0))) + logger.debug(values.get('import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l1_import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l2_import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l3_import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('energy_active_scale_int', 0)) + + logger.debug("import_energy_apparent:"+str(values.get('import_energy_apparent_int', 0))) + logger.debug(values.get('import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) + logger.debug(values.get('l1_import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) + logger.debug(values.get('l2_import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) + logger.debug(values.get('l3_import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) + logger.debug(values.get('energy_apparent_scale_int', 0)) block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_0.add_32bit_int(int(meterValues['l1n_voltage_int']/10)) # l1-n voltage * 10 - block_0.add_32bit_int(int(meterValues['l2n_voltage_int']/10)) # l2-n voltage - block_0.add_32bit_int(int(meterValues['l3n_voltage_int']/10)) # l3-n voltage - block_0.add_32bit_int(int(meterValues['l12_voltage_int']/10)) # l1-l2 voltage - block_0.add_32bit_int(int(meterValues['l23_voltage_int']/10)) # l2-l3 voltage - block_0.add_32bit_int(int(meterValues['l31_voltage_int']/10)) # l3-l1 voltage - block_0.add_32bit_int(meterValues['l1_current_int']*100) # current l1 * 1000 - block_0.add_32bit_int(meterValues['l2_current_int']*100) # current l2 - block_0.add_32bit_int(meterValues['l3_current_int']*100) # current l3 - block_0.add_32bit_int(meterValues['l1_power_int']*-10) # power l1 *10 - block_0.add_32bit_int(meterValues['l2_power_int']*-10) # power l2 - block_0.add_32bit_int(meterValues['l3_power_int']*-10) # power l3 - block_0.add_32bit_int(meterValues['l1_power_apparent_int']*-10) # apparent power l1 *10 - block_0.add_32bit_int(meterValues['l2_power_apparent_int']*-10) # apparent power l2 - block_0.add_32bit_int(meterValues['l3_power_apparent_int']*-10) # apparent power l3 - block_0.add_32bit_int(meterValues['l1_power_reactive_int']*-10) # reactive power l1 *10 - block_0.add_32bit_int(meterValues['l2_power_reactive_int']*-10) # reactive power l2 - block_0.add_32bit_int(meterValues['l3_power_reactive_int']*-10) # reactive power l3 - block_0.add_32bit_int(int(meterValues['voltage_ln_int']/10)) # l-n voltage *10 - block_0.add_32bit_int(int(meterValues['voltage_ll_int']/10)) # l-l voltage - block_0.add_32bit_int(meterValues['power_int']*-10) # total power *10 - block_0.add_32bit_int(meterValues['power_apparent_int']*-10) # total apparent power - block_0.add_32bit_int(meterValues['power_reactive_int']*-10) # total reactive power - block_0.add_16bit_int(int(meterValues['l1_power_factor_int']/10)) # power factor l1 *1000 - block_0.add_16bit_int(int(meterValues['l2_power_factor_int']/10)) # power factor l2 - block_0.add_16bit_int(int(meterValues['l3_power_factor_int']/10)) # power factor l3 - block_0.add_16bit_int(int(meterValues['power_factor_int']/10)) # power factor + block_0.add_32bit_int(int(values.get('l1n_voltage_int', 0)/10)) # l1-n voltage * 10 + block_0.add_32bit_int(int(values.get('l2n_voltage_int', 0)/10)) # l2-n voltage + block_0.add_32bit_int(int(values.get('l3n_voltage_int', 0)/10)) # l3-n voltage + block_0.add_32bit_int(int(values.get('l12_voltage_int', 0)/10)) # l1-l2 voltage + block_0.add_32bit_int(int(values.get('l23_voltage_int', 0)/10)) # l2-l3 voltage + block_0.add_32bit_int(int(values.get('l31_voltage_int', 0)/10)) # l3-l1 voltage + block_0.add_32bit_int(values.get('l1_current_int', 0)*100) # current l1 * 1000 + block_0.add_32bit_int(values.get('l2_current_int', 0)*100) # current l2 + block_0.add_32bit_int(values.get('l3_current_int', 0)*100) # current l3 + block_0.add_32bit_int(values.get('l1_power_int', 0)*-10) # power l1 *10 + block_0.add_32bit_int(values.get('l2_power_int', 0)*-10) # power l2 + block_0.add_32bit_int(values.get('l3_power_int', 0)*-10) # power l3 + block_0.add_32bit_int(values.get('l1_power_apparent_int', 0)*-10) # apparent power l1 *10 + block_0.add_32bit_int(values.get('l2_power_apparent_int', 0)*-10) # apparent power l2 + block_0.add_32bit_int(values.get('l3_power_apparent_int', 0)*-10) # apparent power l3 + block_0.add_32bit_int(values.get('l1_power_reactive_int', 0)*-10) # reactive power l1 *10 + block_0.add_32bit_int(values.get('l2_power_reactive_int', 0)*-10) # reactive power l2 + block_0.add_32bit_int(values.get('l3_power_reactive_int', 0)*-10) # reactive power l3 + block_0.add_32bit_int(int(values.get('voltage_ln_int', 0)/10)) # l-n voltage *10 + block_0.add_32bit_int(int(values.get('voltage_ll_int', 0)/10)) # l-l voltage + block_0.add_32bit_int(values.get('power_int', 0)*-10) # total power *10 + block_0.add_32bit_int(values.get('power_apparent_int', 0)*-10) # total apparent power + block_0.add_32bit_int(values.get('power_reactive_int', 0)*-10) # total reactive power + block_0.add_16bit_int(int(values.get('l1_power_factor_int', 0)/10)) # power factor l1 *1000 + block_0.add_16bit_int(int(values.get('l2_power_factor_int', 0)/10)) # power factor l2 + block_0.add_16bit_int(int(values.get('l3_power_factor_int', 0)/10)) # power factor l3 + block_0.add_16bit_int(int(values.get('power_factor_int', 0)/10)) # power factor block_0.add_16bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_0.add_16bit_uint(int(meterValues['frequency_int']/10)) # line frequency *10 + block_0.add_16bit_uint(int(values.get('frequency_int', 0)/10)) # line frequency *10 - block_0.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy + block_0.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy + block_0.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy block_0.add_32bit_int(56) # demand power block_0.add_32bit_int(58) # maximum demand power - block_0.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy - block_0.add_32bit_int(int(meterValues['l1_import_energy_active_int']/100)) # imported active energy l1 - block_0.add_32bit_int(int(meterValues['l2_import_energy_active_int']/100)) # imported active energy l2 - block_0.add_32bit_int(int(meterValues['l3_import_energy_active_int']/100)) # imported active energy l3 + block_0.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy + block_0.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy + block_0.add_32bit_int(int(values.get('l1_import_energy_active_int', 0)/100)) # imported active energy l1 + block_0.add_32bit_int(int(values.get('l2_import_energy_active_int', 0)/100)) # imported active energy l2 + block_0.add_32bit_int(int(values.get('l3_import_energy_active_int', 0)/100)) # imported active energy l3 block_0.add_32bit_int(10) # total active energy Tarif 1 block_0.add_32bit_int(20) # total active energy Tarif 2 block_0.add_32bit_int(30) # total active energy Tarif 3 block_0.add_32bit_int(40) # total active energy Tarif 4 - block_0.add_32bit_int(int(meterValues['export_energy_active_int']/100)) # total exported active energy non-reset /100) - block_0.add_32bit_int(int(meterValues['export_energy_apparent_int']/100)) # imported active energy non-reset + block_0.add_32bit_int(int(values.get('export_energy_active_int', 0)/100)) # total exported active energy non-reset /100) + block_0.add_32bit_int(int(values.get('export_energy_apparent_int', 0)/100)) # imported active energy non-reset block_0.add_32bit_int(2400) # hour *100 block_0.add_32bit_int(11) # total apparent energy Tarif 1 *10 block_0.add_32bit_int(22) # total apparent energy Tarif 2 @@ -452,55 +452,55 @@ def t_update(ctx, SE7K_CTX, stop, module, device, refresh): block_254 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) block_254.add_32bit_int(2400) # hour *100 *100 block_254.add_32bit_int(256) # unused *100 - block_254.add_32bit_int(int(meterValues['voltage_ln_int']/10)) # l-n voltage *10 - block_254.add_32bit_int(int(meterValues['voltage_ll_int']/10)) # l-l voltage - block_254.add_32bit_int(meterValues['power_int']*-10) # total power *10 - block_254.add_32bit_int(meterValues['power_apparent_int']*-10) # total apparent power - block_254.add_32bit_int(meterValues['power_reactive_int']*-10) # total reactive power - block_254.add_32bit_int(int(meterValues['power_factor_int']/10)) # power factor + block_254.add_32bit_int(int(values.get('voltage_ln_int', 0)/10)) # l-n voltage *10 + block_254.add_32bit_int(int(values.get('voltage_ll_int', 0)/10)) # l-l voltage + block_254.add_32bit_int(values.get('power_int', 0)*-10) # total power *10 + block_254.add_32bit_int(values.get('power_apparent_int', 0)*-10) # total apparent power + block_254.add_32bit_int(values.get('power_reactive_int', 0)*-10) # total reactive power + block_254.add_32bit_int(int(values.get('power_factor_int', 0)/10)) # power factor block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_254.add_32bit_int(int(meterValues['frequency_int']/10)) # line frequency *10 - block_254.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['export_energy_active_int']/100)) # total exported active energy non-reset /100) - block_254.add_32bit_int(int(meterValues['export_energy_apparent_int']/100)) # imported active energy non-reset + block_254.add_32bit_int(int(values.get('frequency_int', 0)/10)) # line frequency *10 + block_254.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy + block_254.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy + block_254.add_32bit_int(int(values.get('export_energy_active_int', 0)/100)) # total exported active energy non-reset /100) + block_254.add_32bit_int(int(values.get('export_energy_apparent_int', 0)/100)) # imported active energy non-reset block_254.add_32bit_int(56) # demand power block_254.add_32bit_int(58) # maximum demand power - block_254.add_32bit_int(int(meterValues['l12_voltage_int']/10)) # l1-l2 voltage - block_254.add_32bit_int(int(meterValues['l1n_voltage_int']/10)) # l1-n voltage * 10 - block_254.add_32bit_int(meterValues['l1_current_int']*100) # current l1 * 1000 - block_254.add_32bit_int(meterValues['l1_power_int']*-10) # power l1 *10 - block_254.add_32bit_int(meterValues['l1_power_apparent_int']*-10) # apparent power l1 *10 - block_254.add_32bit_int(meterValues['l1_power_reactive_int']*-10) # reactive power l1 *10 - block_254.add_32bit_int(int(meterValues['l1_power_factor_int']/10)) # power factor l1 *1000 + block_254.add_32bit_int(int(values.get('l12_voltage_int', 0)/10)) # l1-l2 voltage + block_254.add_32bit_int(int(values.get('l1n_voltage_int', 0)/10)) # l1-n voltage * 10 + block_254.add_32bit_int(values.get('l1_current_int', 0)*100) # current l1 * 1000 + block_254.add_32bit_int(values.get('l1_power_int', 0)*-10) # power l1 *10 + block_254.add_32bit_int(values.get('l1_power_apparent_int', 0)*-10) # apparent power l1 *10 + block_254.add_32bit_int(values.get('l1_power_reactive_int', 0)*-10) # reactive power l1 *10 + block_254.add_32bit_int(int(values.get('l1_power_factor_int', 0)/10)) # power factor l1 *1000 - block_254.add_32bit_int(int(meterValues['l23_voltage_int']/10)) # l2-l3 voltage - block_254.add_32bit_int(int(meterValues['l2n_voltage_int']/10)) # l2-n voltage - block_254.add_32bit_int(meterValues['l2_current_int']*100) # current l2 - block_254.add_32bit_int(meterValues['l2_power_int']*-10) # power l2 - block_254.add_32bit_int(meterValues['l2_power_apparent_int']*-10) # apparent power l2 - block_254.add_32bit_int(meterValues['l2_power_reactive_int']*-10) # reactive power l2 - block_254.add_32bit_int(int(meterValues['l2_power_factor_int']/10)) # power factor l2 + block_254.add_32bit_int(int(values.get('l23_voltage_int', 0)/10)) # l2-l3 voltage + block_254.add_32bit_int(int(values.get('l2n_voltage_int', 0)/10)) # l2-n voltage + block_254.add_32bit_int(values.get('l2_current_int', 0)*100) # current l2 + block_254.add_32bit_int(values.get('l2_power_int', 0)*-10) # power l2 + block_254.add_32bit_int(values.get('l2_power_apparent_int', 0)*-10) # apparent power l2 + block_254.add_32bit_int(values.get('l2_power_reactive_int', 0)*-10) # reactive power l2 + block_254.add_32bit_int(int(values.get('l2_power_factor_int', 0)/10)) # power factor l2 - block_254.add_32bit_int(int(meterValues['l31_voltage_int']/10)) # l3-l1 voltage - block_254.add_32bit_int(int(meterValues['l3n_voltage_int']/10)) # l3-n voltage - block_254.add_32bit_int(meterValues['l3_current_int']*100) # current l3 - block_254.add_32bit_int(meterValues['l3_power_int']*-10) # power l3 - block_254.add_32bit_int(meterValues['l3_power_apparent_int']*-10) # apparent power l3 - block_254.add_32bit_int(meterValues['l3_power_reactive_int']*-10) # reactive power l3 - block_254.add_32bit_int(int(meterValues['l3_power_factor_int']/10)) # power factor l3 + block_254.add_32bit_int(int(values.get('l31_voltage_int', 0)/10)) # l3-l1 voltage + block_254.add_32bit_int(int(values.get('l3n_voltage_int', 0)/10)) # l3-n voltage + block_254.add_32bit_int(values.get('l3_current_int', 0)*100) # current l3 + block_254.add_32bit_int(values.get('l3_power_int', 0)*-10) # power l3 + block_254.add_32bit_int(values.get('l3_power_apparent_int', 0)*-10) # apparent power l3 + block_254.add_32bit_int(values.get('l3_power_reactive_int', 0)*-10) # reactive power l3 + block_254.add_32bit_int(int(values.get('l3_power_factor_int', 0)/10)) # power factor l3 block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_254.add_32bit_int(int(meterValues['import_energy_active_int']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['import_energy_apparent_int']/100)) # imported active energy - block_254.add_32bit_int(int(meterValues['l1_import_energy_active_int']/100)) # imported active energy l1 - block_254.add_32bit_int(int(meterValues['l2_import_energy_active_int']/100)) # imported active energy l2 - block_254.add_32bit_int(int(meterValues['l3_import_energy_active_int']/100)) # imported active energy l3 + block_254.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy + block_254.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy + block_254.add_32bit_int(int(values.get('l1_import_energy_active_int', 0)/100)) # imported active energy l1 + block_254.add_32bit_int(int(values.get('l2_import_energy_active_int', 0)/100)) # imported active energy l2 + block_254.add_32bit_int(int(values.get('l3_import_energy_active_int', 0)/100)) # imported active energy l3 block_254.add_32bit_int(10) # total active energy Tarif 1 block_254.add_32bit_int(20) # total active energy Tarif 2 block_254.add_32bit_int(30) # total active energy Tarif 3 diff --git a/SE7K-proxy-tcp.cmd b/SE7K-proxy-tcp.cmd index 146c8b8..db0d585 100644 --- a/SE7K-proxy-tcp.cmd +++ b/SE7K-proxy-tcp.cmd @@ -1,2 +1,2 @@ echo use -v for more information -python SE7K-proxy-tcp.py -c SE7K.conf %* \ No newline at end of file +python SE7K-proxy-tcp.py -c SE7K.conf %* diff --git a/SE7K-proxy-tcp.py b/SE7K-proxy-tcp.py index 5a39e9b..f38d56a 100644 --- a/SE7K-proxy-tcp.py +++ b/SE7K-proxy-tcp.py @@ -44,84 +44,84 @@ def setMeterValues(values, block): block.add_16bit_int (values.get("c_sunspec_did_int" , 103)) block.add_16bit_int (values.get("c_sunspec_length_int", 50)) block.add_16bit_uint(values.get("current_int" , 0)) - block.add_16bit_uint(values.get("p1_current_int" , 0)) - block.add_16bit_uint(values.get("p2_current_int" , 0)) - block.add_16bit_uint(values.get("p3_current_int" , 0)) + block.add_16bit_uint(values.get("l1_current_int" , 0)) + block.add_16bit_uint(values.get("l2_current_int" , 0)) + block.add_16bit_uint(values.get("l3_current_int" , 0)) block.add_16bit_int (values.get("current_scale_int" , 0)) block.add_16bit_uint(values.get("voltage_ln_int" , 0)) - block.add_16bit_uint(values.get("p1n_voltage_int" , 0)) - block.add_16bit_uint(values.get("p2n_voltage_int" , 0)) - block.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l3n_voltage_int" , 0)) block.add_16bit_uint(values.get("voltage_ll_int" , 0)) - block.add_16bit_uint(values.get("p1n_voltage_int" , 0)) - block.add_16bit_uint(values.get("p2n_voltage_int" , 0)) - block.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l3n_voltage_int" , 0)) block.add_16bit_int (values.get("voltage_scale_int" , 0)) block.add_16bit_uint(values.get("frequency_int" , 0)) block.add_16bit_int (values.get("frequency_scale_int" , 0)) block.add_16bit_int(values.get("power_int" , 0)) - block.add_16bit_int(values.get("p1_power_int" , 0)) - block.add_16bit_int(values.get("p2_power_int" , 0)) - block.add_16bit_int(values.get("p3_power_int" , 0)) + block.add_16bit_int(values.get("l1_power_int" , 0)) + block.add_16bit_int(values.get("l2_power_int" , 0)) + block.add_16bit_int(values.get("l3_power_int" , 0)) block.add_16bit_int (values.get("power_scale_int" , 0)) block.add_16bit_int(values.get("power_apparent_int" , 0)) - block.add_16bit_int(values.get("p1_power_apparent_int" , 0)) - block.add_16bit_int(values.get("p2_power_apparent_int" , 0)) - block.add_16bit_int(values.get("p3_power_apparent_int" , 0)) + block.add_16bit_int(values.get("l1_power_apparent_int" , 0)) + block.add_16bit_int(values.get("l2_power_apparent_int" , 0)) + block.add_16bit_int(values.get("l3_power_apparent_int" , 0)) block.add_16bit_int (values.get("power_apparent_scale_int" , 0)) block.add_16bit_int(values.get("power_reactive_int" , 0)) - block.add_16bit_int(values.get("p1_power_reactive_int" , 0)) - block.add_16bit_int(values.get("p2_power_reactive_int" , 0)) - block.add_16bit_int(values.get("p3_power_reactive_int" , 0)) + block.add_16bit_int(values.get("l1_power_reactive_int" , 0)) + block.add_16bit_int(values.get("l2_power_reactive_int" , 0)) + block.add_16bit_int(values.get("l3_power_reactive_int" , 0)) block.add_16bit_int (values.get("power_reactive_scale_int" , 0)) block.add_16bit_int(values.get("power_factor_int" , 0)) - block.add_16bit_int(values.get("p1_power_factor_int" , 0)) - block.add_16bit_int(values.get("p2_power_factor_int" , 0)) - block.add_16bit_int(values.get("p3_power_factor_int" , 0)) + block.add_16bit_int(values.get("l1_power_factor_int" , 0)) + block.add_16bit_int(values.get("l2_power_factor_int" , 0)) + block.add_16bit_int(values.get("l3_power_factor_int" , 0)) block.add_16bit_int (values.get("power_factor_scale_int" , 0)) block.add_32bit_uint(values.get("export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p1_export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_active_int" , 0)) block.add_32bit_uint(values.get("import_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_active_int" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_active_int" , 0)) block.add_16bit_int (values.get("energy_active_scale_int" , 0)) block.add_32bit_uint(values.get("export_energy_apparent_int", 0)) - block.add_32bit_uint(values.get("p1_export_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_apparent_int" , 0)) block.add_32bit_uint(values.get("import_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_apparent_int" , 0)) block.add_16bit_int (values.get("energy_apparent_scale_int" , 0)) block.add_32bit_uint(values.get("import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_reactive_q1_int" , 0)) block.add_32bit_uint(values.get("import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("p1_import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("p2_import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("p3_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_reactive_q2_int" , 0)) block.add_32bit_uint(values.get("export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("p1_export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_reactive_q3_int" , 0)) block.add_32bit_uint(values.get("export_energy_reactive_q4_int" , 0)) - block.add_32bit_uint(values.get("p1_export_energy_reactive_q4_int" , 0)) - block.add_32bit_uint(values.get("p2_export_energy_reactive_q4_int" , 0)) - block.add_32bit_uint(values.get("p3_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_reactive_q4_int" , 0)) block.add_16bit_int (values.get("energy_reactive_scale_int" , 0)) block.add_32bit_uint(values.get("events_int" , 0)) @@ -164,19 +164,19 @@ def t_update(ctx, stop, module, device, refresh): block_40000.add_16bit_int (values.get("c_sunspec_did_int" , 103)) block_40000.add_16bit_int (50) block_40000.add_16bit_uint(values.get("current_int" , 0)) - block_40000.add_16bit_uint(values.get("p1_current_int" , 0)) - block_40000.add_16bit_uint(values.get("p2_current_int" , 0)) - block_40000.add_16bit_uint(values.get("p3_current_int" , 0)) + block_40000.add_16bit_uint(values.get("l1_current_int" , 0)) + block_40000.add_16bit_uint(values.get("l2_current_int" , 0)) + block_40000.add_16bit_uint(values.get("l3_current_int" , 0)) block_40000.add_16bit_int (values.get("current_scale_int" , 0)) - block_40000.add_16bit_uint(values.get("p1_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p2_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p3_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p1n_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p2n_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("p3n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l1_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l2_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l3_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l1n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l2n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l3n_voltage_int" , 0)) block_40000.add_16bit_int (values.get("voltage_scale_int" , 0)) - + block_40000.add_16bit_int(values.get("power_ac_int" , 0)) block_40000.add_16bit_int (values.get("power_ac_scale_int" , 0)) @@ -235,7 +235,6 @@ def t_update(ctx, stop, module, device, refresh): # ctx.setValues(3, 57598, block_57598.to_registers()) # block_57854 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) # ctx.setValues(3, 57854, block_57854.to_registers()) - except Exception as e: logger.critical(f"{this_t.name}: {e}") finally: diff --git a/devices/solaredge-inverter.py b/devices/solaredge-inverter.py index 26dd639..b7dbd74 100644 --- a/devices/solaredge-inverter.py +++ b/devices/solaredge-inverter.py @@ -90,64 +90,69 @@ def values(device): # additional values for emulation of SE-WNC-3Y-400-MB-K1 or WattNode WNC-3Y-400-MB # TODO Calculate the values for the SE-WNC-3Y-400-MB-K1 meter from the SolarEdge meter provided by SE7K + + meterValues = values["connected_meters"]["Meter1"] + + SE_WNC_3Y_400_MB_K1_values = { - "energy_active": values.get("total_energy_active", 0), - "import_energy_active": values.get("import_energy_active", 0), - "power_active": values.get("total_power_active", 0), - "l1_power_active": values.get("l1_power_active", 0), - "l2_power_active": values.get("l2_power_active", 0), - "l3_power_active": values.get("l3_power_active", 0), - "voltage_ln": values.get("voltage_ln", 0), - "l1n_voltage": values.get("l1n_voltage", 0), - "l2n_voltage": values.get("l2n_voltage", 0), - "l3n_voltage": values.get("l3n_voltage", 0), - "voltage_ll": values.get("voltage_ll", 0), - "l12_voltage": values.get("l12_voltage", 0), - "l23_voltage": values.get("l23_voltage", 0), - "l31_voltage": values.get("l31_voltage", 0), - "frequency": values.get("frequency", 0), - "l1_energy_active": values.get("total_energy_active", 0), - # "l2_energy_active" - # "l3_energy_active" - "l1_import_energy_active": values.get("import_energy_active", 0), - # "l2_import_energy_active" - # "l3_import_energy_active" - "export_energy_active": values.get("export_energy_active", 0), - "l1_export_energy_active": values.get("export_energy_active", 0), - # "l2_export_energy_active" - # "l3_export_energy_active" - "energy_reactive": values.get("total_energy_reactive", 0), - "l1_energy_reactive": values.get("total_energy_reactive", 0), - # "l2_energy_reactive" - # "l3_energy_reactive" - "energy_apparent": values.get("total_energy_apparent", 0), - "l1_energy_apparent": values.get("total_energy_apparent", 0), - # "l2_energy_apparent" - # "l3_energy_apparent" - "power_factor": values.get("total_power_factor", 0), - "l1_power_factor": values.get("l1_power_factor", 0), - "l2_power_factor": values.get("l2_power_factor", 0), - "l3_power_factor": values.get("l3_power_factor", 0), - "power_reactive": values.get("total_power_reactive", 0), - "l1_power_reactive": values.get("l1_power_reactive", 0), - "l2_power_reactive": values.get("l2_power_reactive", 0), - "l3_power_reactive": values.get("l3_power_reactive", 0), - "power_apparent": values.get("total_power_apparent", 0), - "l1_power_apparent": values.get("l1_power_apparent", 0), - "l2_power_apparent": values.get("l2_power_apparent", 0), - "l3_power_apparent": values.get("l3_power_apparent", 0), - "l1_current": values.get("l1_current", 0), - "l2_current": values.get("l2_current", 0), - "l3_current": values.get("l3_current", 0), - "demand_power_active": values.get("total_import_demand_power_active", 0), - # "minimum_demand_power_active" - "maximum_demand_power_active": values.get("maximum_import_demand_power_active", 0), - "demand_power_apparent": values.get("total_demand_power_apparent", 0), - "l1_demand_power_active": (values.get("l1_demand_current", 0) * values.get("l1_voltage", 0)), - "l2_demand_power_active": (values.get("l2_demand_current", 0) * values.get("l2_voltage", 0)), - "l3_demand_power_active": (values.get("l3_demand_current", 0) * values.get("l3_voltage", 0)) + "energy_active": meterValues.get('export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "import_energy_active": meterValues.get('import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "power_active": meterValues.get('power_int', 0)*10**meterValues.get('power_scale_int', 0), + "l1_power_active": meterValues.get('l1_power_int', 0)*10**meterValues.get('power_scale_int', 0), + "l2_power_active": meterValues.get('l2_power_int', 0)*10**meterValues.get('power_scale_int', 0), + "l3_power_active": meterValues.get('l3_power_int', 0)*10**meterValues.get('power_scale_int', 0), + "voltage_ln": meterValues.get('voltage_ln_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l1n_voltage": meterValues.get('l1n_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l2n_voltage": meterValues.get('l2n_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l3n_voltage": meterValues.get('l3n_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "voltage_ll": meterValues.get('voltage_ll_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l12_voltage": meterValues.get('l12_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l23_voltage": meterValues.get('l23_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l31_voltage": meterValues.get('l31_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "frequency": meterValues.get('frequency_int', 0)*10**meterValues.get('frequency_scale_int', 0), + "l1_energy_active": meterValues.get('l1_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l2_energy_active": meterValues.get('l2_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l3_energy_active": meterValues.get('l3_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l1_import_energy_active": meterValues.get('l1_import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l2_import_energy_active": meterValues.get('l2_import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l3_import_energy_active": meterValues.get('l3_import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "export_energy_active": meterValues.get('export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l1_export_energy_active": meterValues.get('l1_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l2_export_energy_active": meterValues.get('l2_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l3_export_energy_active": meterValues.get('l3_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "energy_reactive": 0.0, + "l1_energy_reactive": 0.0, + "l2_energy_reactive": 0.0, + "l3_energy_reactive": 0.0, + "energy_apparent": meterValues.get('import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), + "l1_energy_apparent": meterValues.get('l1_import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), + "l2_energy_apparent": meterValues.get('l2_import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), + "l3_energy_apparent": meterValues.get('l3_import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), + "power_factor": meterValues.get('power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), + "l1_power_factor": meterValues.get('l1_power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), + "l2_power_factor": meterValues.get('l2_power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), + "l3_power_factor": meterValues.get('l3_power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), + "power_reactive": meterValues.get('power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), + "l1_power_reactive": meterValues.get('l1_power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), + "l2_power_reactive": meterValues.get('l2_power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), + "l3_power_reactive": meterValues.get('l3_power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), + "power_apparent": meterValues.get('power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), + "l1_power_apparent": meterValues.get('l1_power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), + "l2_power_apparent": meterValues.get('l2_power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), + "l3_power_apparent": meterValues.get('l3_power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), + "l1_current": meterValues.get('l1_current_int', 0)*10**meterValues.get('current_scale_int', 0), + "l2_current": meterValues.get('l2_current_int', 0)*10**meterValues.get('current_scale_int', 0), + "l3_current": meterValues.get('l3_current_int', 0)*10**meterValues.get('current_scale_int', 0), + "demand_power_active": 0.0, + "minimum_demand_power_active": 0.0, + "maximum_demand_power_active": 0.0, + "demand_power_apparent": 0.0, + "l1_demand_power_active": 0.0, + "l2_demand_power_active": 0.0, + "l3_demand_power_active": 0.0, } + values |= SE_WNC_3Y_400_MB_K1_values - return values | SE_WNC_3Y_400_MB_K1_values + return values # append type to key \ No newline at end of file From ff218cd8e542216540710ed5f7c419431ee7d9ae Mon Sep 17 00:00:00 2001 From: ixtrader Date: Wed, 9 Mar 2022 23:34:22 +0100 Subject: [PATCH 27/32] remove logging on INFO level --- EM24DINAV23XE1X-proxy-tcp.py | 2 -- SE7K-EM24-proxy-tcp.py | 1 - 2 files changed, 3 deletions(-) diff --git a/EM24DINAV23XE1X-proxy-tcp.py b/EM24DINAV23XE1X-proxy-tcp.py index 5db0e69..3b58e8b 100644 --- a/EM24DINAV23XE1X-proxy-tcp.py +++ b/EM24DINAV23XE1X-proxy-tcp.py @@ -98,8 +98,6 @@ def t_update(ctx, stop, module, device, refresh): meterValues = values["connected_meters"]["Meter1"] - logger.info(values.get('power_active')) - if logger.isEnabledFor(logging.DEBUG): logger.info("current:") logger.info(values.get('l1_current')) diff --git a/SE7K-EM24-proxy-tcp.py b/SE7K-EM24-proxy-tcp.py index 1ac7af8..272242c 100644 --- a/SE7K-EM24-proxy-tcp.py +++ b/SE7K-EM24-proxy-tcp.py @@ -312,7 +312,6 @@ def t_update(ctx, SE7K_CTX, stop, module, device, refresh): # use the values from the SE-MTR-3Y-400V-A SE Meter values = values["connected_meters"]["Meter1"] - logger.info(values.get('power_int', 0)*10**values.get('power_scale_int', 0)) if logger.isEnabledFor(logging.DEBUG): logger.info("current:"+str(values.get('current_int', 0))) From f71c58392bf1947f628f82a59dcb5fe6266e1fd0 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Thu, 10 Mar 2022 00:02:06 +0100 Subject: [PATCH 28/32] prepare for raspberry distribution --- SE-MTR-3Y-400V-A.cmd => EM24-proxy-tcp.cmd | 0 SE-MTR-3Y-400V-A.sh => EM24-proxy-tcp.sh | 0 SE-MTR-3Y-400V-A.conf | 3 ++- SE7K-EM23-proxy-tcp.sh | 2 ++ SE7K-EM24-PROXY.cmd => SE7K-EM24-proxy-tcp.cmd | 0 SE7K-EM24-proxy-tcp.d.sh | 10 ++++++++++ SE7K-proxy-tcp.d.sh | 4 +++- SE7K-proxy-tcp.nohup.sh | 2 -- SE7K.conf | 3 ++- 9 files changed, 19 insertions(+), 5 deletions(-) rename SE-MTR-3Y-400V-A.cmd => EM24-proxy-tcp.cmd (100%) rename SE-MTR-3Y-400V-A.sh => EM24-proxy-tcp.sh (100%) mode change 100755 => 100644 create mode 100644 SE7K-EM23-proxy-tcp.sh rename SE7K-EM24-PROXY.cmd => SE7K-EM24-proxy-tcp.cmd (100%) create mode 100644 SE7K-EM24-proxy-tcp.d.sh delete mode 100755 SE7K-proxy-tcp.nohup.sh diff --git a/SE-MTR-3Y-400V-A.cmd b/EM24-proxy-tcp.cmd similarity index 100% rename from SE-MTR-3Y-400V-A.cmd rename to EM24-proxy-tcp.cmd diff --git a/SE-MTR-3Y-400V-A.sh b/EM24-proxy-tcp.sh old mode 100755 new mode 100644 similarity index 100% rename from SE-MTR-3Y-400V-A.sh rename to EM24-proxy-tcp.sh diff --git a/SE-MTR-3Y-400V-A.conf b/SE-MTR-3Y-400V-A.conf index 93f3c98..ae3c8a9 100644 --- a/SE-MTR-3Y-400V-A.conf +++ b/SE-MTR-3Y-400V-A.conf @@ -22,8 +22,9 @@ log_level = INFO meters = solaredge-inverter [solaredge-inverter] +# the solarage inverter should have an SE-MTR-3Y-400V-A meter attached type=solaredge-inverter -host=raspberrypi.fritz.box +host=solaredge.fritz.box port=502 src_address=2 dst_address=1 diff --git a/SE7K-EM23-proxy-tcp.sh b/SE7K-EM23-proxy-tcp.sh new file mode 100644 index 0000000..7df619b --- /dev/null +++ b/SE7K-EM23-proxy-tcp.sh @@ -0,0 +1,2 @@ +#!/bin/bash +python3 SE7K-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf diff --git a/SE7K-EM24-PROXY.cmd b/SE7K-EM24-proxy-tcp.cmd similarity index 100% rename from SE7K-EM24-PROXY.cmd rename to SE7K-EM24-proxy-tcp.cmd diff --git a/SE7K-EM24-proxy-tcp.d.sh b/SE7K-EM24-proxy-tcp.d.sh new file mode 100644 index 0000000..14757c5 --- /dev/null +++ b/SE7K-EM24-proxy-tcp.d.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set +x +meinpfad=$(dirname $0) +file=/var/log/SE7K-EM24-proxy.log +logfile=$file +[ -e $file ] && [ $(stat --printf '%s' "$file") -gt 104857600 ] && rm "$file" +file=/var/log/SE7K-EM24-proxy.err +errfile=$file +[ -e $file ] && [ $(stat --printf '%s' "$file") -gt 104857600 ] && rm "$file" +nohup python3 $meinpfad/SE7K-EM24-proxy-tcp.py -c $meinpfad/SE-MTR-3Y-400V-A.conf 2>>$errfile >>$logfile & diff --git a/SE7K-proxy-tcp.d.sh b/SE7K-proxy-tcp.d.sh index 8da030d..b74067b 100755 --- a/SE7K-proxy-tcp.d.sh +++ b/SE7K-proxy-tcp.d.sh @@ -2,7 +2,9 @@ set +x meinpfad=$(dirname $0) file=/var/log/modbus-proxy.log +logfile=$file [ -e $file ] && [ $(stat --printf '%s' "$file") -gt 104857600 ] && rm "$file" file=/var/log/modbus-proxy.err +errfile=$file [ -e $file ] && [ $(stat --printf '%s' "$file") -gt 104857600 ] && rm "$file" -nohup python3 $meinpfad/SE7K-proxy-tcp.py -c $meinpfad/SE7K.conf 2>>/var/log/modbus-proxy.err >>/var/log/modbus-proxy.log & +nohup python3 $meinpfad/SE7K-proxy-tcp.py -c $meinpfad/SE7K.conf 2>>$errfile >>$logfile & diff --git a/SE7K-proxy-tcp.nohup.sh b/SE7K-proxy-tcp.nohup.sh deleted file mode 100755 index f008736..0000000 --- a/SE7K-proxy-tcp.nohup.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -nohup python3 SE7K-proxy-tcp.py -c SE7K.conf & diff --git a/SE7K.conf b/SE7K.conf index ded71a9..868b093 100644 --- a/SE7K.conf +++ b/SE7K.conf @@ -22,8 +22,9 @@ log_level = INFO meters = SE7K [SE7K] +# the solarage inverter should have an SE-MTR-3Y-400V-A meter attached type=solaredge-inverter -host=solaredge.fritz.box +host=raspberrypi.fritz.box port=502 src_address=2 dst_address=2 From 4261fc99554477cbfcba68b31e53d063d076ee60 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Thu, 10 Mar 2022 01:56:53 +0100 Subject: [PATCH 29/32] set unix lineendings for shell scripts --- EM24-proxy-tcp.sh | 1 + SE7K-EM23-proxy-tcp.sh | 1 + SE7K-EM24-proxy-tcp.py | 1472 +++++++++++++++++---------------- SE7K-proxy-tcp.d.sh | 1 + SE7K-proxy-tcp.sh | 1 + devices/solaredge-inverter.py | 313 ++++--- init.d/modbus-proxy | 174 ++-- init.d/modbus-proxy.md | 2 +- 8 files changed, 985 insertions(+), 980 deletions(-) diff --git a/EM24-proxy-tcp.sh b/EM24-proxy-tcp.sh index 089d5f0..8da5ea7 100644 --- a/EM24-proxy-tcp.sh +++ b/EM24-proxy-tcp.sh @@ -1,3 +1,4 @@ #!/bin/bash echo use -v for more information python EM24DINAV23XE1X-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf $* + diff --git a/SE7K-EM23-proxy-tcp.sh b/SE7K-EM23-proxy-tcp.sh index 7df619b..1acad09 100644 --- a/SE7K-EM23-proxy-tcp.sh +++ b/SE7K-EM23-proxy-tcp.sh @@ -1,2 +1,3 @@ #!/bin/bash python3 SE7K-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf + diff --git a/SE7K-EM24-proxy-tcp.py b/SE7K-EM24-proxy-tcp.py index 272242c..6b7e1be 100644 --- a/SE7K-EM24-proxy-tcp.py +++ b/SE7K-EM24-proxy-tcp.py @@ -1,735 +1,737 @@ -#!/usr/bin/env python3 - -import argparse -import configparser -import importlib -import logging -import sys -import threading -import time - -from pymodbus.server.sync import StartTcpServer -from pymodbus.server.sync import ModbusTcpServer -from pymodbus.constants import Endian -from pymodbus.device import ModbusDeviceIdentification -from pymodbus.transaction import ModbusSocketFramer -from pymodbus.transaction import ModbusRtuFramer -from pymodbus.datastore import ModbusSlaveContext -from pymodbus.datastore import ModbusServerContext -from pymodbus.payload import BinaryPayloadBuilder - - -class EM24SlaveContext(ModbusSlaveContext): - def getValues(self, fx, address, count=1): - if (address == 11 and count==1): - logger.info("Gavazzi Model number 1648 supplied") - return [1648] - return super().getValues(fx, address, count) - - - -class ModbusMyTcpServer(ModbusTcpServer): - clientCounter = 0 - - def process_request(self, request, client): - """ Callback for connecting a new client thread - - :param request: The request to handle - :param client: The address of the client - """ - self.clientCounter += 1 - logger = logging.getLogger() - logger.info("Started thread to serve client at " + str(client) + " clientCounter = " + str(self.clientCounter)) - super().process_request(request,client) - - def shutdown(self): - """ Stops the serve_forever loop. - - Overridden to signal handlers to stop. - """ - logger = logging.getLogger() - logger.info("shutdown to serve client") - super().shutdown() - - def server_close(self): - """ Callback for stopping the running server - """ - logger = logging.getLogger() - logger.debug("Modbus server stopped") - super().server_close() - - -# --------------------------------------------------------------------------- # -# Creation Factorie -# --------------------------------------------------------------------------- # -def StartMyTcpServer(context=None, identity=None, address=None, - custom_functions=[], **kwargs): - """ A factory to start and run a tcp modbus server - - :param context: The ModbusServerContext datastore - :param identity: An optional identify structure - :param address: An optional (interface, port) to bind to. - :param custom_functions: An optional list of custom function classes - supported by server instance. - :param ignore_missing_slaves: True to not send errors on a request to a - missing slave - """ - framer = kwargs.pop("framer", ModbusSocketFramer) - server = ModbusMyTcpServer(context, framer, identity, address, **kwargs) - - for f in custom_functions: - server.decoder.register(f) - server.serve_forever() - - -def setMeterValues(values, block): - if not values: - block.add_16bit_uint(0) - block.add_16bit_uint(0) - return - - block.add_16bit_uint(1) - block.add_16bit_uint(65) - block.add_string (values.get("c_manufacturer_str" ,"12345678901234567890123456789012").ljust(32,' ')) - block.add_string (values.get("c_model_str" ,"12345678901234567890123456789012").ljust(32,' ')) - block.add_string (values.get("c_option_str" ,"1234567890123456").ljust(16,' ')) - block.add_string (values.get("c_version_str" ,"1234567890123456").ljust(16,' ')) - block.add_string (values.get("c_serialnumber_str" ,"12345678901234567890123456789012").ljust(32,' ')) - block.add_16bit_int (values.get("c_deviceaddress_int" , 0)) - - block.add_16bit_int (values.get("c_sunspec_did_int" , 103)) - block.add_16bit_int (values.get("c_sunspec_length_int", 50)) - block.add_16bit_uint(values.get("current_int" , 0)) - block.add_16bit_uint(values.get("l1_current_int" , 0)) - block.add_16bit_uint(values.get("l2_current_int" , 0)) - block.add_16bit_uint(values.get("l3_current_int" , 0)) - block.add_16bit_int (values.get("current_scale_int" , 0)) - - block.add_16bit_uint(values.get("voltage_ln_int" , 0)) - block.add_16bit_uint(values.get("l1n_voltage_int" , 0)) - block.add_16bit_uint(values.get("l2n_voltage_int" , 0)) - block.add_16bit_uint(values.get("l3n_voltage_int" , 0)) - block.add_16bit_uint(values.get("voltage_ll_int" , 0)) - block.add_16bit_uint(values.get("l1n_voltage_int" , 0)) - block.add_16bit_uint(values.get("l2n_voltage_int" , 0)) - block.add_16bit_uint(values.get("l3n_voltage_int" , 0)) - block.add_16bit_int (values.get("voltage_scale_int" , 0)) - - block.add_16bit_uint(values.get("frequency_int" , 0)) - block.add_16bit_int (values.get("frequency_scale_int" , 0)) - - block.add_16bit_int(values.get("power_int" , 0)) - block.add_16bit_int(values.get("l1_power_int" , 0)) - block.add_16bit_int(values.get("l2_power_int" , 0)) - block.add_16bit_int(values.get("l3_power_int" , 0)) - block.add_16bit_int (values.get("power_scale_int" , 0)) - - block.add_16bit_int(values.get("power_apparent_int" , 0)) - block.add_16bit_int(values.get("l1_power_apparent_int" , 0)) - block.add_16bit_int(values.get("l2_power_apparent_int" , 0)) - block.add_16bit_int(values.get("l3_power_apparent_int" , 0)) - block.add_16bit_int (values.get("power_apparent_scale_int" , 0)) - - block.add_16bit_int(values.get("power_reactive_int" , 0)) - block.add_16bit_int(values.get("l1_power_reactive_int" , 0)) - block.add_16bit_int(values.get("l2_power_reactive_int" , 0)) - block.add_16bit_int(values.get("l3_power_reactive_int" , 0)) - block.add_16bit_int (values.get("power_reactive_scale_int" , 0)) - - block.add_16bit_int(values.get("power_factor_int" , 0)) - block.add_16bit_int(values.get("l1_power_factor_int" , 0)) - block.add_16bit_int(values.get("l2_power_factor_int" , 0)) - block.add_16bit_int(values.get("l3_power_factor_int" , 0)) - block.add_16bit_int (values.get("power_factor_scale_int" , 0)) - - block.add_32bit_uint(values.get("export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("l1_export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("l2_export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("l3_export_energy_active_int" , 0)) - block.add_32bit_uint(values.get("import_energy_active_int" , 0)) - block.add_32bit_uint(values.get("l1_import_energy_active_int" , 0)) - block.add_32bit_uint(values.get("l2_import_energy_active_int" , 0)) - block.add_32bit_uint(values.get("l3_import_energy_active_int" , 0)) - block.add_16bit_int (values.get("energy_active_scale_int" , 0)) - - block.add_32bit_uint(values.get("export_energy_apparent_int", 0)) - block.add_32bit_uint(values.get("l1_export_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("l2_export_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("l3_export_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("import_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("l1_import_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("l2_import_energy_apparent_int" , 0)) - block.add_32bit_uint(values.get("l3_import_energy_apparent_int" , 0)) - block.add_16bit_int (values.get("energy_apparent_scale_int" , 0)) - - block.add_32bit_uint(values.get("import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("l1_import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("l2_import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("l3_import_energy_reactive_q1_int" , 0)) - block.add_32bit_uint(values.get("import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("l1_import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("l2_import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("l3_import_energy_reactive_q2_int" , 0)) - block.add_32bit_uint(values.get("export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("l1_export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("l2_export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("l3_export_energy_reactive_q3_int" , 0)) - block.add_32bit_uint(values.get("export_energy_reactive_q4_int" , 0)) - block.add_32bit_uint(values.get("l1_export_energy_reactive_q4_int" , 0)) - block.add_32bit_uint(values.get("l2_export_energy_reactive_q4_int" , 0)) - block.add_32bit_uint(values.get("l3_export_energy_reactive_q4_int" , 0)) - block.add_16bit_int (values.get("energy_reactive_scale_int" , 0)) - - block.add_32bit_uint(values.get("events_int" , 0)) - # - - -def setBatteryValues(values, block): - if not values: - block.add_16bit_uint(0) - block.add_16bit_uint(0) - return - - block.add_16bit_uint(1) ## TODO set correct values - block.add_16bit_uint(65) ## TODO set correct values - -def t_update_se7k(ctx, stop, module, device, refresh): - - this_t = threading.currentThread() - logger = logging.getLogger() - - try: - values = module.values(device) - - if not values: - return - - block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - block_40000.add_string("SunS") - block_40000.add_16bit_int(1) - block_40000.add_16bit_int (values.get("C_SunSpec_Length_int", 65)) - block_40000.add_string (values.get("c_manufacturer_str" ,"12345678901234567890123456789012").ljust(32,' ')) - block_40000.add_string (values.get("c_model_str" ,"12345678901234567890123456789012").ljust(32,' ')) - block_40000.add_string ("NOT_IMPLEMENTED.".ljust(16,' ')) - block_40000.add_string (values.get("c_version_str" ,"1234567890123456").ljust(16,' ')) - block_40000.add_string (values.get("c_serialnumber_str" ,"12345678901234567890123456789012").ljust(32,' ')) - block_40000.add_16bit_int (values.get("c_deviceaddress_int" , 0)) - - block_40000.add_16bit_int (values.get("c_sunspec_did_int" , 103)) - block_40000.add_16bit_int (50) - block_40000.add_16bit_uint(values.get("current_int" , 0)) - block_40000.add_16bit_uint(values.get("l1_current_int" , 0)) - block_40000.add_16bit_uint(values.get("l2_current_int" , 0)) - block_40000.add_16bit_uint(values.get("l3_current_int" , 0)) - block_40000.add_16bit_int (values.get("current_scale_int" , 0)) - - block_40000.add_16bit_uint(values.get("l1_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("l2_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("l3_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("l1n_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("l2n_voltage_int" , 0)) - block_40000.add_16bit_uint(values.get("l3n_voltage_int" , 0)) - block_40000.add_16bit_int (values.get("voltage_scale_int" , 0)) - - block_40000.add_16bit_int(values.get("power_ac_int" , 0)) - block_40000.add_16bit_int (values.get("power_ac_scale_int" , 0)) - - block_40000.add_16bit_uint(values.get("frequency_int" , 0)) - block_40000.add_16bit_int (values.get("frequency_scale_int" , 0)) - - block_40000.add_16bit_int(values.get("power_apparent_int" , 0)) - block_40000.add_16bit_int (values.get("power_apparent_scale_int" , 0)) - - block_40000.add_16bit_int(values.get("power_reactive_int" , 0)) - block_40000.add_16bit_int (values.get("power_reactive_scale_int" , 0)) - - block_40000.add_16bit_int(values.get("power_factor_int" , 0)) - block_40000.add_16bit_int (values.get("power_factor_scale_int" , 0)) - - block_40000.add_32bit_uint(values.get("energy_total_int" , 0)) - block_40000.add_16bit_int (values.get("energy_total_scale_int" , 0)) - - block_40000.add_16bit_uint(values.get("current_dc_int" , 0)) - block_40000.add_16bit_int (values.get("current_dc_scale_int" , 0)) - - block_40000.add_16bit_uint(values.get("voltage_dc_int" , 0)) - block_40000.add_16bit_int (values.get("voltage_dc_scale_int" , 0)) - - block_40000.add_16bit_int(values.get("power_dc_int" , 0)) - block_40000.add_16bit_int (values.get("power_dc_scale_int" , 0)) - - block_40000.add_16bit_int(0) # 1 dummy word - - block_40000.add_16bit_int(values.get("temperature_int" , 0)) - block_40000.add_16bit_int(values.get("temperature_scale_int" , 0)) - - block_40000.add_16bit_int(0) # 1 dummy word - block_40000.add_16bit_int(0) # 1 dummy word - - block_40000.add_16bit_uint(values.get("status_int" , 0)) - block_40000.add_16bit_uint(values.get("vendor_status_int" , 0)) - - block_40000.add_16bit_uint(values.get("rrcr_state_int" , 0)) - block_40000.add_16bit_int(values.get("active_power_limit_int" , 0)) - block_40000.add_32bit_float(values.get("cosphi" , 0)) - - block_40000.add_string("123456789012345678901234") # 12 dummy worter = 24 Byte - ctx.setValues(3, 40000, block_40000.to_registers()) - - block_40121 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - setMeterValues(values["connected_meters"]["Meter1"],block_40121) - ctx.setValues(3, 40121, block_40121.to_registers()) - - # block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - # ctx.setValues(3, 40295, block_40295.to_registers()) - # block_40469 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - # ctx.setValues(3, 40469, block_40469.to_registers()) - - # block_57598 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - # ctx.setValues(3, 57598, block_57598.to_registers()) - # block_57854 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) - # ctx.setValues(3, 57854, block_57854.to_registers()) - - except Exception as e: - logger.critical(f"{this_t.name}: {e}") - - - - -def t_update(ctx, SE7K_CTX, stop, module, device, refresh): - - this_t = threading.currentThread() - logger = logging.getLogger() - - while not stop.is_set(): - try: - t_update_se7k(SE7K_CTX, stop, module, device, refresh) - - values = module.values(device) - if not values: - logger.debug(f"{this_t.name}: no new values") - continue - - # use the values from the SE-MTR-3Y-400V-A SE Meter - values = values["connected_meters"]["Meter1"] - - if logger.isEnabledFor(logging.DEBUG): - logger.info("current:"+str(values.get('current_int', 0))) - logger.info(values.get('current_int', 0)*10**values.get('current_scale_int', 0)) - logger.info(values.get('l1_current_int', 0)*10**values.get('current_scale_int', 0)) - logger.info(values.get('l2_current_int', 0)*10**values.get('current_scale_int', 0)) - logger.info(values.get('l3_current_int', 0)*10**values.get('current_scale_int', 0)) - logger.debug(values.get('current_scale_int', 0)) - - logger.debug("voltage_ln:"+str(values.get('voltage_ln_int', 0))) - logger.debug(values.get('voltage_ln_int', 0)*10**values.get('voltage_scale_int', 0)) - logger.debug(values.get('l1n_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) - logger.debug(values.get('l2n_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) - logger.debug(values.get('l3n_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) - logger.debug(values.get('voltage_scale_int', 0)) - - logger.debug("voltage_ll:"+str(values.get('voltage_ll_int', 0))) - logger.debug(values.get('voltage_ll_int', 0)*10**values.get('voltage_scale_int', 0)) - logger.debug(values.get('l12_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) - logger.debug(values.get('l23_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) - logger.debug(values.get('l31_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) - logger.debug(values.get('voltage_scale_int', 0)) - - - logger.info("frequency:"+str(values.get('frequency_int', 0))) - logger.info(values.get('frequency_int', 0)*10**values.get('frequency_scale_int', 0)) - - logger.info("power:"+str(values.get('power_int', 0))) - logger.info(values.get('power_int', 0)*10**values.get('power_scale_int', 0)) - logger.info(values.get('l1_power_int', 0)*10**values.get('power_scale_int', 0)) - logger.info(values.get('l2_power_int', 0)*10**values.get('power_scale_int', 0)) - logger.info(values.get('l3_power_int', 0)*10**values.get('power_scale_int', 0)) - logger.info(values.get('power_scale_int', 0)) - - logger.info("power_apparent:"+str(values.get('power_apparent_int', 0))) - logger.info(values.get('power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) - logger.info(values.get('l1_power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) - logger.info(values.get('l2_power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) - logger.info(values.get('l3_power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) - logger.info(values.get('power_apparent_scale_int', 0)) - - logger.info("power_reactive:"+str(values.get('power_reactive_int', 0))) - logger.info(values.get('power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) - logger.info(values.get('l1_power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) - logger.info(values.get('l2_power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) - logger.info(values.get('l3_power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) - logger.info(values.get('power_reactive_scale_int', 0)) - - logger.info("power_factor:"+str(values.get('power_factor_int', 0))) - logger.info(values.get('power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) - logger.info(values.get('l1_power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) - logger.info(values.get('l2_power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) - logger.info(values.get('l3_power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) - logger.info(values.get('power_factor_scale_int', 0)) - - logger.debug("export_energy_active:"+str(values.get('export_energy_active_int', 0))) - logger.debug(values.get('export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) - logger.debug(values.get('l1_export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) - logger.debug(values.get('l2_export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) - logger.debug(values.get('l3_export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) - logger.debug(values.get('energy_active_scale_int', 0)) - - logger.debug("import_energy_active:"+str(values.get('import_energy_active_int', 0))) - logger.debug(values.get('import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) - logger.debug(values.get('l1_import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) - logger.debug(values.get('l2_import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) - logger.debug(values.get('l3_import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) - logger.debug(values.get('energy_active_scale_int', 0)) - - logger.debug("import_energy_apparent:"+str(values.get('import_energy_apparent_int', 0))) - logger.debug(values.get('import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) - logger.debug(values.get('l1_import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) - logger.debug(values.get('l2_import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) - logger.debug(values.get('l3_import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) - logger.debug(values.get('energy_apparent_scale_int', 0)) - - - - block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_0.add_32bit_int(int(values.get('l1n_voltage_int', 0)/10)) # l1-n voltage * 10 - block_0.add_32bit_int(int(values.get('l2n_voltage_int', 0)/10)) # l2-n voltage - block_0.add_32bit_int(int(values.get('l3n_voltage_int', 0)/10)) # l3-n voltage - block_0.add_32bit_int(int(values.get('l12_voltage_int', 0)/10)) # l1-l2 voltage - block_0.add_32bit_int(int(values.get('l23_voltage_int', 0)/10)) # l2-l3 voltage - block_0.add_32bit_int(int(values.get('l31_voltage_int', 0)/10)) # l3-l1 voltage - block_0.add_32bit_int(values.get('l1_current_int', 0)*100) # current l1 * 1000 - block_0.add_32bit_int(values.get('l2_current_int', 0)*100) # current l2 - block_0.add_32bit_int(values.get('l3_current_int', 0)*100) # current l3 - block_0.add_32bit_int(values.get('l1_power_int', 0)*-10) # power l1 *10 - block_0.add_32bit_int(values.get('l2_power_int', 0)*-10) # power l2 - block_0.add_32bit_int(values.get('l3_power_int', 0)*-10) # power l3 - block_0.add_32bit_int(values.get('l1_power_apparent_int', 0)*-10) # apparent power l1 *10 - block_0.add_32bit_int(values.get('l2_power_apparent_int', 0)*-10) # apparent power l2 - block_0.add_32bit_int(values.get('l3_power_apparent_int', 0)*-10) # apparent power l3 - block_0.add_32bit_int(values.get('l1_power_reactive_int', 0)*-10) # reactive power l1 *10 - block_0.add_32bit_int(values.get('l2_power_reactive_int', 0)*-10) # reactive power l2 - block_0.add_32bit_int(values.get('l3_power_reactive_int', 0)*-10) # reactive power l3 - block_0.add_32bit_int(int(values.get('voltage_ln_int', 0)/10)) # l-n voltage *10 - block_0.add_32bit_int(int(values.get('voltage_ll_int', 0)/10)) # l-l voltage - block_0.add_32bit_int(values.get('power_int', 0)*-10) # total power *10 - block_0.add_32bit_int(values.get('power_apparent_int', 0)*-10) # total apparent power - block_0.add_32bit_int(values.get('power_reactive_int', 0)*-10) # total reactive power - block_0.add_16bit_int(int(values.get('l1_power_factor_int', 0)/10)) # power factor l1 *1000 - block_0.add_16bit_int(int(values.get('l2_power_factor_int', 0)/10)) # power factor l2 - block_0.add_16bit_int(int(values.get('l3_power_factor_int', 0)/10)) # power factor l3 - block_0.add_16bit_int(int(values.get('power_factor_int', 0)/10)) # power factor - block_0.add_16bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - - block_0.add_16bit_uint(int(values.get('frequency_int', 0)/10)) # line frequency *10 - - block_0.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy - block_0.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy - block_0.add_32bit_int(56) # demand power - block_0.add_32bit_int(58) # maximum demand power - block_0.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy - block_0.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy - block_0.add_32bit_int(int(values.get('l1_import_energy_active_int', 0)/100)) # imported active energy l1 - block_0.add_32bit_int(int(values.get('l2_import_energy_active_int', 0)/100)) # imported active energy l2 - block_0.add_32bit_int(int(values.get('l3_import_energy_active_int', 0)/100)) # imported active energy l3 - block_0.add_32bit_int(10) # total active energy Tarif 1 - block_0.add_32bit_int(20) # total active energy Tarif 2 - block_0.add_32bit_int(30) # total active energy Tarif 3 - block_0.add_32bit_int(40) # total active energy Tarif 4 - block_0.add_32bit_int(int(values.get('export_energy_active_int', 0)/100)) # total exported active energy non-reset /100) - block_0.add_32bit_int(int(values.get('export_energy_apparent_int', 0)/100)) # imported active energy non-reset - block_0.add_32bit_int(2400) # hour *100 - block_0.add_32bit_int(11) # total apparent energy Tarif 1 *10 - block_0.add_32bit_int(22) # total apparent energy Tarif 2 - block_0.add_32bit_int(33) # total apparent energy Tarif 3 - block_0.add_32bit_int(44) # total apparent energy Tarif 4 - block_0.add_32bit_int(118) # apparent demand power - block_0.add_32bit_int(120) # apparent demand power max - block_0.add_32bit_int(122) # DMD A max *10 - ctx.setValues(3, 0, block_0.to_registers()) - ctx.setValues(4, 0, block_0.to_registers()) - - block_254 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_254.add_32bit_int(2400) # hour *100 *100 - block_254.add_32bit_int(256) # unused *100 - block_254.add_32bit_int(int(values.get('voltage_ln_int', 0)/10)) # l-n voltage *10 - block_254.add_32bit_int(int(values.get('voltage_ll_int', 0)/10)) # l-l voltage - block_254.add_32bit_int(values.get('power_int', 0)*-10) # total power *10 - block_254.add_32bit_int(values.get('power_apparent_int', 0)*-10) # total apparent power - block_254.add_32bit_int(values.get('power_reactive_int', 0)*-10) # total reactive power - block_254.add_32bit_int(int(values.get('power_factor_int', 0)/10)) # power factor - block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - block_254.add_32bit_int(int(values.get('frequency_int', 0)/10)) # line frequency *10 - block_254.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy - block_254.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy - block_254.add_32bit_int(int(values.get('export_energy_active_int', 0)/100)) # total exported active energy non-reset /100) - block_254.add_32bit_int(int(values.get('export_energy_apparent_int', 0)/100)) # imported active energy non-reset - block_254.add_32bit_int(56) # demand power - block_254.add_32bit_int(58) # maximum demand power - - - - - block_254.add_32bit_int(int(values.get('l12_voltage_int', 0)/10)) # l1-l2 voltage - block_254.add_32bit_int(int(values.get('l1n_voltage_int', 0)/10)) # l1-n voltage * 10 - block_254.add_32bit_int(values.get('l1_current_int', 0)*100) # current l1 * 1000 - block_254.add_32bit_int(values.get('l1_power_int', 0)*-10) # power l1 *10 - block_254.add_32bit_int(values.get('l1_power_apparent_int', 0)*-10) # apparent power l1 *10 - block_254.add_32bit_int(values.get('l1_power_reactive_int', 0)*-10) # reactive power l1 *10 - block_254.add_32bit_int(int(values.get('l1_power_factor_int', 0)/10)) # power factor l1 *1000 - - block_254.add_32bit_int(int(values.get('l23_voltage_int', 0)/10)) # l2-l3 voltage - block_254.add_32bit_int(int(values.get('l2n_voltage_int', 0)/10)) # l2-n voltage - block_254.add_32bit_int(values.get('l2_current_int', 0)*100) # current l2 - block_254.add_32bit_int(values.get('l2_power_int', 0)*-10) # power l2 - block_254.add_32bit_int(values.get('l2_power_apparent_int', 0)*-10) # apparent power l2 - block_254.add_32bit_int(values.get('l2_power_reactive_int', 0)*-10) # reactive power l2 - block_254.add_32bit_int(int(values.get('l2_power_factor_int', 0)/10)) # power factor l2 - - block_254.add_32bit_int(int(values.get('l31_voltage_int', 0)/10)) # l3-l1 voltage - block_254.add_32bit_int(int(values.get('l3n_voltage_int', 0)/10)) # l3-n voltage - block_254.add_32bit_int(values.get('l3_current_int', 0)*100) # current l3 - block_254.add_32bit_int(values.get('l3_power_int', 0)*-10) # power l3 - block_254.add_32bit_int(values.get('l3_power_apparent_int', 0)*-10) # apparent power l3 - block_254.add_32bit_int(values.get('l3_power_reactive_int', 0)*-10) # reactive power l3 - block_254.add_32bit_int(int(values.get('l3_power_factor_int', 0)/10)) # power factor l3 - - block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) - - block_254.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy - block_254.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy - block_254.add_32bit_int(int(values.get('l1_import_energy_active_int', 0)/100)) # imported active energy l1 - block_254.add_32bit_int(int(values.get('l2_import_energy_active_int', 0)/100)) # imported active energy l2 - block_254.add_32bit_int(int(values.get('l3_import_energy_active_int', 0)/100)) # imported active energy l3 - block_254.add_32bit_int(10) # total active energy Tarif 1 - block_254.add_32bit_int(20) # total active energy Tarif 2 - block_254.add_32bit_int(30) # total active energy Tarif 3 - block_254.add_32bit_int(40) # total active energy Tarif 4 - block_254.add_32bit_int(346) # unused *100 - block_254.add_32bit_int(348) # unused *100 - block_254.add_32bit_int(350) # unused *100 - block_254.add_32bit_int(352) # unused *100 - block_254.add_32bit_int(11) # total apparent energy Tarif 1 *10 - block_254.add_32bit_int(22) # total apparent energy Tarif 2 - block_254.add_32bit_int(33) # total apparent energy Tarif 3 - block_254.add_32bit_int(44) # total apparent energy Tarif 4 - block_254.add_32bit_int(262) # unused *100 - block_254.add_32bit_int(264) # unused *100 - block_254.add_32bit_int(266) # unused *100 - block_254.add_32bit_int(268) # unused *100 - block_254.add_32bit_int(270) # unused *100 - block_254.add_32bit_int(272) # unused *100 - block_254.add_32bit_int(274) # unused *100 - block_254.add_32bit_int(276) # unused *100 - block_254.add_32bit_int(118) # apparent demand power - block_254.add_32bit_int(120) # apparent demand power max - block_254.add_32bit_int(122) # DMD A max *10 - ctx.setValues(3, 254, block_254.to_registers()) - ctx.setValues(4, 254, block_254.to_registers()) - - ## unused values - # "energy_reactive" # total reactive energy - # "l1_export_energy_active", 0)) # exported energy l1 - # "l2_export_energy_active", 0)) # exported energy l2 - # "l3_export_energy_active", 0)) # exported energy l3 - # "l1_energy_reactive", 0)) # reactive energy l1 - # "l2_energy_reactive", 0)) # reactive energy l2 - # "l3_energy_reactive", 0)) # reactive energy l3 - # "l1_energy_apparent", 0)) # apparent energy l1 - # "l2_energy_apparent", 0)) # apparent energy l2 - # "l3_energy_apparent", 0)) # apparent energy l3 - # "minimum_demand_power_active", 0)) # minimum demand power - # "l1_demand_power_active", 0)) # demand power l1 - # "l2_demand_power_active", 0)) # demand power l2 - # "l3_demand_power_active", 0)) # demand power l3 - except Exception as e: - logger.critical(f"{this_t.name}: {e}") - finally: - time.sleep(0.6) - - -if __name__ == "__main__": - argparser = argparse.ArgumentParser() - argparser.add_argument("-c", "--config", type=str, default="semp-tcp.conf") - argparser.add_argument("-v", "--verbose", action="store_true", default=False) - args = argparser.parse_args() - - default_config = { - "server": { - "address": "0.0.0.0", - "port": 502, - "framer": "socket", - "log_level": "INFO", - "meters": 'Meter1' - }, - "meters": { - "dst_address": 2, - "type": "generic", - "ct_current": 5, - "ct_inverted": 0, - "phase_offset": 120, - "serial_number": 987654, - "refresh_rate": 5 - } - } - - confparser = configparser.ConfigParser() - confparser.read(args.config) - - if not confparser.has_section("server"): - confparser["server"] = default_config["server"] - - log_handler = logging.StreamHandler(sys.stdout) - log_handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")) - - logger = logging.getLogger() - logger.setLevel(getattr(logging, confparser["server"].get("log_level", fallback=default_config["server"]["log_level"]).upper())) - logger.addHandler(log_handler) - - if args.verbose: - logger.setLevel(logging.DEBUG) - - slaves = {} - threads = [] - thread_stops = [] - - try: - if confparser.has_option("server", "meters"): - meters = [m.strip() for m in confparser["server"].get("meters", fallback=default_config["server"]["meters"]).split(',')] - - for meter in meters: - address = confparser[meter].getint("dst_address", fallback=default_config["meters"]["dst_address"]) - meter_type = confparser[meter].get("type", fallback=default_config["meters"]["type"]) - meter_module = importlib.import_module(f"devices.{meter_type}") - meter_device = meter_module.device(confparser[meter]) - - EM24_slave_ctx = EM24SlaveContext() - SE7K_slave_ctx = ModbusSlaveContext() - - # block_11 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - # block_11.add_16bit_int(1648) - # EM24_slave_ctx.setValues(3, 11, block_11.to_registers()) - # EM24_slave_ctx.setValues(4, 11, block_11.to_registers()) - - block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_0.add_32bit_int(1234) - EM24_slave_ctx.setValues(3, 0, block_0.to_registers()) - EM24_slave_ctx.setValues(4, 0, block_0.to_registers()) - - block_770 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_770.add_16bit_int(4126) # Version and revision measurment module - block_770.add_16bit_int(68) # - block_770.add_16bit_int(4127) # Version and revision communication module - block_770.add_16bit_int(67) # - block_770.add_16bit_int(0) # Current tariff - EM24_slave_ctx.setValues(3, 770, block_770.to_registers()) - EM24_slave_ctx.setValues(4, 770, block_770.to_registers()) - - block_848 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_848.add_16bit_int(4128) # Measurement module’s firmware CRC - EM24_slave_ctx.setValues(3, 848, block_848.to_registers()) - EM24_slave_ctx.setValues(4, 848, block_848.to_registers()) - - block_20480 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_20480.add_string("MB24DINAV23XE1X") - EM24_slave_ctx.setValues(3, 20480, block_20480.to_registers()) - EM24_slave_ctx.setValues(4, 20480, block_20480.to_registers()) - - block_41216 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_41216.add_16bit_int(3) # Front selector status - EM24_slave_ctx.setValues(3, 41216, block_41216.to_registers()) - EM24_slave_ctx.setValues(4, 41216, block_41216.to_registers()) - - block_4096 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_4096.add_16bit_int(9999) # PASSWORD - block_4096.add_16bit_int(0) # unused - block_4096.add_16bit_int(0) # Measuring system - block_4096.add_32bit_int(10) # Current transformer ratio - block_4096.add_32bit_int(10) # Voltage transformer ratio - block_4096.add_16bit_int(1) # unused - block_4096.add_16bit_int(2) # unused - block_4096.add_16bit_int(3) # unused - block_4096.add_16bit_int(4) # unused - block_4096.add_16bit_int(5) # unused - block_4096.add_16bit_int(6) # unused - block_4096.add_16bit_int(7) # unused - block_4096.add_16bit_int(8) # unused - block_4096.add_16bit_int(9) # unused - block_4096.add_32bit_int(15) # Interval time - EM24_slave_ctx.setValues(3, 4096, block_4096.to_registers()) - EM24_slave_ctx.setValues(4, 4096, block_4096.to_registers()) - - block_4360 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_4360.add_16bit_int(2) # PASSWORD - block_4360.add_16bit_int(2) # PASSWORD - EM24_slave_ctx.setValues(3, 4360, block_4360.to_registers()) - EM24_slave_ctx.setValues(4, 4360, block_4360.to_registers()) - - block_40960 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) - block_40960.add_16bit_int(1) # Type of application - block_40960.add_16bit_int(3) # Default page for selector position “LOCK” - block_40960.add_16bit_int(1) # Default page for selector position “1” - block_40960.add_16bit_int(3) # Default page for selector position “2” - block_40960.add_16bit_int(3) # Default page for selector position “kvarh” - block_40960.add_16bit_int(1) # ID code of user 1 - block_40960.add_16bit_int(2) # ID code of user 2 - block_40960.add_16bit_int(3) # ID code of user 3 - EM24_slave_ctx.setValues(3, 40960, block_40960.to_registers()) - EM24_slave_ctx.setValues(4, 40960, block_40960.to_registers()) - - update_t_stop = threading.Event() - update_t = threading.Thread( - target=t_update, - name=f"t_update_{address}", - args=( - EM24_slave_ctx, - SE7K_slave_ctx, - update_t_stop, - meter_module, - meter_device, - confparser[meter].getfloat("refresh_rate", fallback=default_config["meters"]["refresh_rate"]) - ) - ) - - threads.append(update_t) - thread_stops.append(update_t_stop) - - slaves.update({1: EM24_slave_ctx}) - slaves.update({2: SE7K_slave_ctx}) - logger.info(f"Created {update_t}: {meter} {meter_type} {meter_device}") - - if not slaves: - logger.warning(f"No meters defined in {args.config}") - - config_framer = confparser["server"].get("framer", fallback=default_config["server"]["framer"]) - framer = False - - if config_framer == "socket": - framer = ModbusSocketFramer - elif config_framer == "rtu": - framer = ModbusRtuFramer - - identity = ModbusDeviceIdentification() - server_ctx = ModbusServerContext(slaves=slaves, single=False) - - time.sleep(1) - - for t in threads: - t.start() - logger.info(f"Starting {t}") - - StartMyTcpServer( - server_ctx, - framer=framer, - identity=identity, - address=( - confparser["server"].get("address", fallback=default_config["server"]["address"]), - confparser["server"].getint("port", fallback=default_config["server"]["port"]) - ) - ) - except KeyboardInterrupt: - pass - finally: - for t_stop in thread_stops: - t_stop.set() - for t in threads: - t.join() +#!/usr/bin/env python3 + +import argparse +import configparser +import importlib +import logging +import sys +import threading +import time + +from pymodbus.server.sync import StartTcpServer +from pymodbus.server.sync import ModbusTcpServer +from pymodbus.constants import Endian +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.transaction import ModbusSocketFramer +from pymodbus.transaction import ModbusRtuFramer +from pymodbus.datastore import ModbusSlaveContext +from pymodbus.datastore import ModbusServerContext +from pymodbus.payload import BinaryPayloadBuilder + + +class EM24SlaveContext(ModbusSlaveContext): + def getValues(self, fx, address, count=1): + if (address == 11 and count==1): + logger.info("Gavazzi Model number 1648 supplied") + return [1648] + return super().getValues(fx, address, count) + + + +class ModbusMyTcpServer(ModbusTcpServer): + clientCounter = 0 + + def process_request(self, request, client): + """ Callback for connecting a new client thread + + :param request: The request to handle + :param client: The address of the client + """ + self.clientCounter += 1 + logger = logging.getLogger() + logger.info("Started thread to serve client at " + str(client) + " clientCounter = " + str(self.clientCounter)) + super().process_request(request,client) + + def shutdown(self): + """ Stops the serve_forever loop. + + Overridden to signal handlers to stop. + """ + logger = logging.getLogger() + logger.info("shutdown to serve client") + super().shutdown() + + def server_close(self): + """ Callback for stopping the running server + """ + logger = logging.getLogger() + logger.debug("Modbus server stopped") + super().server_close() + + +# --------------------------------------------------------------------------- # +# Creation Factorie +# --------------------------------------------------------------------------- # +def StartMyTcpServer(context=None, identity=None, address=None, + custom_functions=[], **kwargs): + """ A factory to start and run a tcp modbus server + + :param context: The ModbusServerContext datastore + :param identity: An optional identify structure + :param address: An optional (interface, port) to bind to. + :param custom_functions: An optional list of custom function classes + supported by server instance. + :param ignore_missing_slaves: True to not send errors on a request to a + missing slave + """ + framer = kwargs.pop("framer", ModbusSocketFramer) + server = ModbusMyTcpServer(context, framer, identity, address, **kwargs) + + for f in custom_functions: + server.decoder.register(f) + server.serve_forever() + + +def setMeterValues(values, block): + if not values: + block.add_16bit_uint(0) + block.add_16bit_uint(0) + return + + block.add_16bit_uint(1) + block.add_16bit_uint(65) + block.add_string (values.get("c_manufacturer_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_string (values.get("c_model_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_string (values.get("c_option_str" ,"1234567890123456").ljust(16,' ')) + block.add_string (values.get("c_version_str" ,"1234567890123456").ljust(16,' ')) + block.add_string (values.get("c_serialnumber_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block.add_16bit_int (values.get("c_deviceaddress_int" , 0)) + + block.add_16bit_int (values.get("c_sunspec_did_int" , 103)) + block.add_16bit_int (values.get("c_sunspec_length_int", 50)) + block.add_16bit_uint(values.get("current_int" , 0)) + block.add_16bit_uint(values.get("l1_current_int" , 0)) + block.add_16bit_uint(values.get("l2_current_int" , 0)) + block.add_16bit_uint(values.get("l3_current_int" , 0)) + block.add_16bit_int (values.get("current_scale_int" , 0)) + + block.add_16bit_uint(values.get("voltage_ln_int" , 0)) + block.add_16bit_uint(values.get("l1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l3n_voltage_int" , 0)) + block.add_16bit_uint(values.get("voltage_ll_int" , 0)) + block.add_16bit_uint(values.get("l1n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l2n_voltage_int" , 0)) + block.add_16bit_uint(values.get("l3n_voltage_int" , 0)) + block.add_16bit_int (values.get("voltage_scale_int" , 0)) + + block.add_16bit_uint(values.get("frequency_int" , 0)) + block.add_16bit_int (values.get("frequency_scale_int" , 0)) + + block.add_16bit_int(values.get("power_int" , 0)) + block.add_16bit_int(values.get("l1_power_int" , 0)) + block.add_16bit_int(values.get("l2_power_int" , 0)) + block.add_16bit_int(values.get("l3_power_int" , 0)) + block.add_16bit_int (values.get("power_scale_int" , 0)) + + block.add_16bit_int(values.get("power_apparent_int" , 0)) + block.add_16bit_int(values.get("l1_power_apparent_int" , 0)) + block.add_16bit_int(values.get("l2_power_apparent_int" , 0)) + block.add_16bit_int(values.get("l3_power_apparent_int" , 0)) + block.add_16bit_int (values.get("power_apparent_scale_int" , 0)) + + block.add_16bit_int(values.get("power_reactive_int" , 0)) + block.add_16bit_int(values.get("l1_power_reactive_int" , 0)) + block.add_16bit_int(values.get("l2_power_reactive_int" , 0)) + block.add_16bit_int(values.get("l3_power_reactive_int" , 0)) + block.add_16bit_int (values.get("power_reactive_scale_int" , 0)) + + block.add_16bit_int(values.get("power_factor_int" , 0)) + block.add_16bit_int(values.get("l1_power_factor_int" , 0)) + block.add_16bit_int(values.get("l2_power_factor_int" , 0)) + block.add_16bit_int(values.get("l3_power_factor_int" , 0)) + block.add_16bit_int (values.get("power_factor_scale_int" , 0)) + + block.add_32bit_uint(values.get("export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_active_int" , 0)) + block.add_32bit_uint(values.get("import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_active_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_active_int" , 0)) + block.add_16bit_int (values.get("energy_active_scale_int" , 0)) + + block.add_32bit_uint(values.get("export_energy_apparent_int", 0)) + block.add_32bit_uint(values.get("l1_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_apparent_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_apparent_int" , 0)) + block.add_16bit_int (values.get("energy_apparent_scale_int" , 0)) + + block.add_32bit_uint(values.get("import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_reactive_q1_int" , 0)) + block.add_32bit_uint(values.get("import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("l1_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("l2_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("l3_import_energy_reactive_q2_int" , 0)) + block.add_32bit_uint(values.get("export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_reactive_q3_int" , 0)) + block.add_32bit_uint(values.get("export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("l1_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("l2_export_energy_reactive_q4_int" , 0)) + block.add_32bit_uint(values.get("l3_export_energy_reactive_q4_int" , 0)) + block.add_16bit_int (values.get("energy_reactive_scale_int" , 0)) + + block.add_32bit_uint(values.get("events_int" , 0)) + # + + +def setBatteryValues(values, block): + if not values: + block.add_16bit_uint(0) + block.add_16bit_uint(0) + return + + block.add_16bit_uint(1) ## TODO set correct values + block.add_16bit_uint(65) ## TODO set correct values + +def t_update_se7k(ctx, stop, module, device, refresh): + + this_t = threading.currentThread() + logger = logging.getLogger() + + try: + values = module.values(device) + + if not values: + return + + block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + block_40000.add_string("SunS") + block_40000.add_16bit_int(1) + block_40000.add_16bit_int (values.get("C_SunSpec_Length_int", 65)) + block_40000.add_string (values.get("c_manufacturer_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_string (values.get("c_model_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_string ("NOT_IMPLEMENTED.".ljust(16,' ')) + block_40000.add_string (values.get("c_version_str" ,"1234567890123456").ljust(16,' ')) + block_40000.add_string (values.get("c_serialnumber_str" ,"12345678901234567890123456789012").ljust(32,' ')) + block_40000.add_16bit_int (values.get("c_deviceaddress_int" , 0)) + + block_40000.add_16bit_int (values.get("c_sunspec_did_int" , 103)) + block_40000.add_16bit_int (50) + block_40000.add_16bit_uint(values.get("current_int" , 0)) + block_40000.add_16bit_uint(values.get("l1_current_int" , 0)) + block_40000.add_16bit_uint(values.get("l2_current_int" , 0)) + block_40000.add_16bit_uint(values.get("l3_current_int" , 0)) + block_40000.add_16bit_int (values.get("current_scale_int" , 0)) + + block_40000.add_16bit_uint(values.get("l1_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l2_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l3_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l1n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l2n_voltage_int" , 0)) + block_40000.add_16bit_uint(values.get("l3n_voltage_int" , 0)) + block_40000.add_16bit_int (values.get("voltage_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_ac_int" , 0)) + block_40000.add_16bit_int (values.get("power_ac_scale_int" , 0)) + + block_40000.add_16bit_uint(values.get("frequency_int" , 0)) + block_40000.add_16bit_int (values.get("frequency_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_apparent_int" , 0)) + block_40000.add_16bit_int (values.get("power_apparent_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_reactive_int" , 0)) + block_40000.add_16bit_int (values.get("power_reactive_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_factor_int" , 0)) + block_40000.add_16bit_int (values.get("power_factor_scale_int" , 0)) + + block_40000.add_32bit_uint(values.get("energy_total_int" , 0)) + block_40000.add_16bit_int (values.get("energy_total_scale_int" , 0)) + + block_40000.add_16bit_uint(values.get("current_dc_int" , 0)) + block_40000.add_16bit_int (values.get("current_dc_scale_int" , 0)) + + block_40000.add_16bit_uint(values.get("voltage_dc_int" , 0)) + block_40000.add_16bit_int (values.get("voltage_dc_scale_int" , 0)) + + block_40000.add_16bit_int(values.get("power_dc_int" , 0)) + block_40000.add_16bit_int (values.get("power_dc_scale_int" , 0)) + + block_40000.add_16bit_int(0) # 1 dummy word + + block_40000.add_16bit_int(values.get("temperature_int" , 0)) + block_40000.add_16bit_int(values.get("temperature_scale_int" , 0)) + + block_40000.add_16bit_int(0) # 1 dummy word + block_40000.add_16bit_int(0) # 1 dummy word + + block_40000.add_16bit_uint(values.get("status_int" , 0)) + block_40000.add_16bit_uint(values.get("vendor_status_int" , 0)) + + block_40000.add_16bit_uint(values.get("rrcr_state_int" , 0)) + block_40000.add_16bit_int(values.get("active_power_limit_int" , 0)) + block_40000.add_32bit_float(values.get("cosphi" , 0)) + + block_40000.add_string("123456789012345678901234") # 12 dummy worter = 24 Byte + ctx.setValues(3, 40000, block_40000.to_registers()) + + block_40121 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + setMeterValues(values["connected_meters"]["Meter1"],block_40121) + ctx.setValues(3, 40121, block_40121.to_registers()) + + # block_40295 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 40295, block_40295.to_registers()) + # block_40469 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 40469, block_40469.to_registers()) + + # block_57598 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 57598, block_57598.to_registers()) + # block_57854 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + # ctx.setValues(3, 57854, block_57854.to_registers()) + + except Exception as e: + logger.critical(f"{this_t.name}: {e}") + + + + +def t_update(ctx, SE7K_CTX, stop, module, device, refresh): + + this_t = threading.currentThread() + logger = logging.getLogger() + + while not stop.is_set(): + try: + logger.debug('before t_update_se7k ') + t_update_se7k(SE7K_CTX, stop, module, device, refresh) + logger.debug('after t_update_se7k ') + + values = module.values(device) + if not values: + logger.debug(f"{this_t.name}: no new values") + continue + + # use the values from the SE-MTR-3Y-400V-A SE Meter + values = values["connected_meters"]["Meter1"] + + if logger.isEnabledFor(logging.DEBUG): + logger.info("current:"+str(values.get('current_int', 0))) + logger.info(values.get('current_int', 0)*10**values.get('current_scale_int', 0)) + logger.info(values.get('l1_current_int', 0)*10**values.get('current_scale_int', 0)) + logger.info(values.get('l2_current_int', 0)*10**values.get('current_scale_int', 0)) + logger.info(values.get('l3_current_int', 0)*10**values.get('current_scale_int', 0)) + logger.debug(values.get('current_scale_int', 0)) + + logger.debug("voltage_ln:"+str(values.get('voltage_ln_int', 0))) + logger.debug(values.get('voltage_ln_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l1n_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l2n_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l3n_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('voltage_scale_int', 0)) + + logger.debug("voltage_ll:"+str(values.get('voltage_ll_int', 0))) + logger.debug(values.get('voltage_ll_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l12_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l23_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('l31_voltage_int', 0)*10**values.get('voltage_scale_int', 0)) + logger.debug(values.get('voltage_scale_int', 0)) + + + logger.info("frequency:"+str(values.get('frequency_int', 0))) + logger.info(values.get('frequency_int', 0)*10**values.get('frequency_scale_int', 0)) + + logger.info("power:"+str(values.get('power_int', 0))) + logger.info(values.get('power_int', 0)*10**values.get('power_scale_int', 0)) + logger.info(values.get('l1_power_int', 0)*10**values.get('power_scale_int', 0)) + logger.info(values.get('l2_power_int', 0)*10**values.get('power_scale_int', 0)) + logger.info(values.get('l3_power_int', 0)*10**values.get('power_scale_int', 0)) + logger.info(values.get('power_scale_int', 0)) + + logger.info("power_apparent:"+str(values.get('power_apparent_int', 0))) + logger.info(values.get('power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) + logger.info(values.get('l1_power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) + logger.info(values.get('l2_power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) + logger.info(values.get('l3_power_apparent_int', 0)*10**values.get('power_apparent_scale_int', 0)) + logger.info(values.get('power_apparent_scale_int', 0)) + + logger.info("power_reactive:"+str(values.get('power_reactive_int', 0))) + logger.info(values.get('power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) + logger.info(values.get('l1_power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) + logger.info(values.get('l2_power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) + logger.info(values.get('l3_power_reactive_int', 0)*10**values.get('power_reactive_scale_int', 0)) + logger.info(values.get('power_reactive_scale_int', 0)) + + logger.info("power_factor:"+str(values.get('power_factor_int', 0))) + logger.info(values.get('power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) + logger.info(values.get('l1_power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) + logger.info(values.get('l2_power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) + logger.info(values.get('l3_power_factor_int', 0)*10**values.get('power_factor_scale_int', 0)) + logger.info(values.get('power_factor_scale_int', 0)) + + logger.debug("export_energy_active:"+str(values.get('export_energy_active_int', 0))) + logger.debug(values.get('export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l1_export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l2_export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l3_export_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('energy_active_scale_int', 0)) + + logger.debug("import_energy_active:"+str(values.get('import_energy_active_int', 0))) + logger.debug(values.get('import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l1_import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l2_import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('l3_import_energy_active_int', 0)*10**values.get('energy_active_scale_int', 0)) + logger.debug(values.get('energy_active_scale_int', 0)) + + logger.debug("import_energy_apparent:"+str(values.get('import_energy_apparent_int', 0))) + logger.debug(values.get('import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) + logger.debug(values.get('l1_import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) + logger.debug(values.get('l2_import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) + logger.debug(values.get('l3_import_energy_apparent_int', 0)*10**values.get('energy_apparent_scale_int', 0)) + logger.debug(values.get('energy_apparent_scale_int', 0)) + + + + block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_0.add_32bit_int(int(values.get('l1n_voltage_int', 0)/10)) # l1-n voltage * 10 + block_0.add_32bit_int(int(values.get('l2n_voltage_int', 0)/10)) # l2-n voltage + block_0.add_32bit_int(int(values.get('l3n_voltage_int', 0)/10)) # l3-n voltage + block_0.add_32bit_int(int(values.get('l12_voltage_int', 0)/10)) # l1-l2 voltage + block_0.add_32bit_int(int(values.get('l23_voltage_int', 0)/10)) # l2-l3 voltage + block_0.add_32bit_int(int(values.get('l31_voltage_int', 0)/10)) # l3-l1 voltage + block_0.add_32bit_int(values.get('l1_current_int', 0)*100) # current l1 * 1000 + block_0.add_32bit_int(values.get('l2_current_int', 0)*100) # current l2 + block_0.add_32bit_int(values.get('l3_current_int', 0)*100) # current l3 + block_0.add_32bit_int(values.get('l1_power_int', 0)*-10) # power l1 *10 + block_0.add_32bit_int(values.get('l2_power_int', 0)*-10) # power l2 + block_0.add_32bit_int(values.get('l3_power_int', 0)*-10) # power l3 + block_0.add_32bit_int(values.get('l1_power_apparent_int', 0)*-10) # apparent power l1 *10 + block_0.add_32bit_int(values.get('l2_power_apparent_int', 0)*-10) # apparent power l2 + block_0.add_32bit_int(values.get('l3_power_apparent_int', 0)*-10) # apparent power l3 + block_0.add_32bit_int(values.get('l1_power_reactive_int', 0)*-10) # reactive power l1 *10 + block_0.add_32bit_int(values.get('l2_power_reactive_int', 0)*-10) # reactive power l2 + block_0.add_32bit_int(values.get('l3_power_reactive_int', 0)*-10) # reactive power l3 + block_0.add_32bit_int(int(values.get('voltage_ln_int', 0)/10)) # l-n voltage *10 + block_0.add_32bit_int(int(values.get('voltage_ll_int', 0)/10)) # l-l voltage + block_0.add_32bit_int(values.get('power_int', 0)*-10) # total power *10 + block_0.add_32bit_int(values.get('power_apparent_int', 0)*-10) # total apparent power + block_0.add_32bit_int(values.get('power_reactive_int', 0)*-10) # total reactive power + block_0.add_16bit_int(int(values.get('l1_power_factor_int', 0)/10)) # power factor l1 *1000 + block_0.add_16bit_int(int(values.get('l2_power_factor_int', 0)/10)) # power factor l2 + block_0.add_16bit_int(int(values.get('l3_power_factor_int', 0)/10)) # power factor l3 + block_0.add_16bit_int(int(values.get('power_factor_int', 0)/10)) # power factor + block_0.add_16bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) + + block_0.add_16bit_uint(int(values.get('frequency_int', 0)/10)) # line frequency *10 + + block_0.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy + block_0.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy + block_0.add_32bit_int(56) # demand power + block_0.add_32bit_int(58) # maximum demand power + block_0.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy + block_0.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy + block_0.add_32bit_int(int(values.get('l1_import_energy_active_int', 0)/100)) # imported active energy l1 + block_0.add_32bit_int(int(values.get('l2_import_energy_active_int', 0)/100)) # imported active energy l2 + block_0.add_32bit_int(int(values.get('l3_import_energy_active_int', 0)/100)) # imported active energy l3 + block_0.add_32bit_int(10) # total active energy Tarif 1 + block_0.add_32bit_int(20) # total active energy Tarif 2 + block_0.add_32bit_int(30) # total active energy Tarif 3 + block_0.add_32bit_int(40) # total active energy Tarif 4 + block_0.add_32bit_int(int(values.get('export_energy_active_int', 0)/100)) # total exported active energy non-reset /100) + block_0.add_32bit_int(int(values.get('export_energy_apparent_int', 0)/100)) # imported active energy non-reset + block_0.add_32bit_int(2400) # hour *100 + block_0.add_32bit_int(11) # total apparent energy Tarif 1 *10 + block_0.add_32bit_int(22) # total apparent energy Tarif 2 + block_0.add_32bit_int(33) # total apparent energy Tarif 3 + block_0.add_32bit_int(44) # total apparent energy Tarif 4 + block_0.add_32bit_int(118) # apparent demand power + block_0.add_32bit_int(120) # apparent demand power max + block_0.add_32bit_int(122) # DMD A max *10 + ctx.setValues(3, 0, block_0.to_registers()) + ctx.setValues(4, 0, block_0.to_registers()) + + block_254 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_254.add_32bit_int(2400) # hour *100 *100 + block_254.add_32bit_int(256) # unused *100 + block_254.add_32bit_int(int(values.get('voltage_ln_int', 0)/10)) # l-n voltage *10 + block_254.add_32bit_int(int(values.get('voltage_ll_int', 0)/10)) # l-l voltage + block_254.add_32bit_int(values.get('power_int', 0)*-10) # total power *10 + block_254.add_32bit_int(values.get('power_apparent_int', 0)*-10) # total apparent power + block_254.add_32bit_int(values.get('power_reactive_int', 0)*-10) # total reactive power + block_254.add_32bit_int(int(values.get('power_factor_int', 0)/10)) # power factor + block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) + block_254.add_32bit_int(int(values.get('frequency_int', 0)/10)) # line frequency *10 + block_254.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy + block_254.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy + block_254.add_32bit_int(int(values.get('export_energy_active_int', 0)/100)) # total exported active energy non-reset /100) + block_254.add_32bit_int(int(values.get('export_energy_apparent_int', 0)/100)) # imported active energy non-reset + block_254.add_32bit_int(56) # demand power + block_254.add_32bit_int(58) # maximum demand power + + + + + block_254.add_32bit_int(int(values.get('l12_voltage_int', 0)/10)) # l1-l2 voltage + block_254.add_32bit_int(int(values.get('l1n_voltage_int', 0)/10)) # l1-n voltage * 10 + block_254.add_32bit_int(values.get('l1_current_int', 0)*100) # current l1 * 1000 + block_254.add_32bit_int(values.get('l1_power_int', 0)*-10) # power l1 *10 + block_254.add_32bit_int(values.get('l1_power_apparent_int', 0)*-10) # apparent power l1 *10 + block_254.add_32bit_int(values.get('l1_power_reactive_int', 0)*-10) # reactive power l1 *10 + block_254.add_32bit_int(int(values.get('l1_power_factor_int', 0)/10)) # power factor l1 *1000 + + block_254.add_32bit_int(int(values.get('l23_voltage_int', 0)/10)) # l2-l3 voltage + block_254.add_32bit_int(int(values.get('l2n_voltage_int', 0)/10)) # l2-n voltage + block_254.add_32bit_int(values.get('l2_current_int', 0)*100) # current l2 + block_254.add_32bit_int(values.get('l2_power_int', 0)*-10) # power l2 + block_254.add_32bit_int(values.get('l2_power_apparent_int', 0)*-10) # apparent power l2 + block_254.add_32bit_int(values.get('l2_power_reactive_int', 0)*-10) # reactive power l2 + block_254.add_32bit_int(int(values.get('l2_power_factor_int', 0)/10)) # power factor l2 + + block_254.add_32bit_int(int(values.get('l31_voltage_int', 0)/10)) # l3-l1 voltage + block_254.add_32bit_int(int(values.get('l3n_voltage_int', 0)/10)) # l3-n voltage + block_254.add_32bit_int(values.get('l3_current_int', 0)*100) # current l3 + block_254.add_32bit_int(values.get('l3_power_int', 0)*-10) # power l3 + block_254.add_32bit_int(values.get('l3_power_apparent_int', 0)*-10) # apparent power l3 + block_254.add_32bit_int(values.get('l3_power_reactive_int', 0)*-10) # reactive power l3 + block_254.add_32bit_int(int(values.get('l3_power_factor_int', 0)/10)) # power factor l3 + + block_254.add_32bit_int(0) # Value –1 correspond to L1-L3-L2 sequence, value 0 correspond to L1-L2-L3 sequence (this value is meaningful only in case of 3-phase systems) + + block_254.add_32bit_int(int(values.get('import_energy_active_int', 0)/100)) # imported active energy + block_254.add_32bit_int(int(values.get('import_energy_apparent_int', 0)/100)) # imported active energy + block_254.add_32bit_int(int(values.get('l1_import_energy_active_int', 0)/100)) # imported active energy l1 + block_254.add_32bit_int(int(values.get('l2_import_energy_active_int', 0)/100)) # imported active energy l2 + block_254.add_32bit_int(int(values.get('l3_import_energy_active_int', 0)/100)) # imported active energy l3 + block_254.add_32bit_int(10) # total active energy Tarif 1 + block_254.add_32bit_int(20) # total active energy Tarif 2 + block_254.add_32bit_int(30) # total active energy Tarif 3 + block_254.add_32bit_int(40) # total active energy Tarif 4 + block_254.add_32bit_int(346) # unused *100 + block_254.add_32bit_int(348) # unused *100 + block_254.add_32bit_int(350) # unused *100 + block_254.add_32bit_int(352) # unused *100 + block_254.add_32bit_int(11) # total apparent energy Tarif 1 *10 + block_254.add_32bit_int(22) # total apparent energy Tarif 2 + block_254.add_32bit_int(33) # total apparent energy Tarif 3 + block_254.add_32bit_int(44) # total apparent energy Tarif 4 + block_254.add_32bit_int(262) # unused *100 + block_254.add_32bit_int(264) # unused *100 + block_254.add_32bit_int(266) # unused *100 + block_254.add_32bit_int(268) # unused *100 + block_254.add_32bit_int(270) # unused *100 + block_254.add_32bit_int(272) # unused *100 + block_254.add_32bit_int(274) # unused *100 + block_254.add_32bit_int(276) # unused *100 + block_254.add_32bit_int(118) # apparent demand power + block_254.add_32bit_int(120) # apparent demand power max + block_254.add_32bit_int(122) # DMD A max *10 + ctx.setValues(3, 254, block_254.to_registers()) + ctx.setValues(4, 254, block_254.to_registers()) + + ## unused values + # "energy_reactive" # total reactive energy + # "l1_export_energy_active", 0)) # exported energy l1 + # "l2_export_energy_active", 0)) # exported energy l2 + # "l3_export_energy_active", 0)) # exported energy l3 + # "l1_energy_reactive", 0)) # reactive energy l1 + # "l2_energy_reactive", 0)) # reactive energy l2 + # "l3_energy_reactive", 0)) # reactive energy l3 + # "l1_energy_apparent", 0)) # apparent energy l1 + # "l2_energy_apparent", 0)) # apparent energy l2 + # "l3_energy_apparent", 0)) # apparent energy l3 + # "minimum_demand_power_active", 0)) # minimum demand power + # "l1_demand_power_active", 0)) # demand power l1 + # "l2_demand_power_active", 0)) # demand power l2 + # "l3_demand_power_active", 0)) # demand power l3 + except Exception as e: + logger.critical(f"{this_t.name}: {e}") + finally: + time.sleep(0.6) + + +if __name__ == "__main__": + argparser = argparse.ArgumentParser() + argparser.add_argument("-c", "--config", type=str, default="semp-tcp.conf") + argparser.add_argument("-v", "--verbose", action="store_true", default=False) + args = argparser.parse_args() + + default_config = { + "server": { + "address": "0.0.0.0", + "port": 502, + "framer": "socket", + "log_level": "INFO", + "meters": 'Meter1' + }, + "meters": { + "dst_address": 2, + "type": "generic", + "ct_current": 5, + "ct_inverted": 0, + "phase_offset": 120, + "serial_number": 987654, + "refresh_rate": 5 + } + } + + confparser = configparser.ConfigParser() + confparser.read(args.config) + + if not confparser.has_section("server"): + confparser["server"] = default_config["server"] + + log_handler = logging.StreamHandler(sys.stdout) + log_handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")) + + logger = logging.getLogger() + logger.setLevel(getattr(logging, confparser["server"].get("log_level", fallback=default_config["server"]["log_level"]).upper())) + logger.addHandler(log_handler) + + if args.verbose: + logger.setLevel(logging.DEBUG) + + slaves = {} + threads = [] + thread_stops = [] + + try: + if confparser.has_option("server", "meters"): + meters = [m.strip() for m in confparser["server"].get("meters", fallback=default_config["server"]["meters"]).split(',')] + + for meter in meters: + address = confparser[meter].getint("dst_address", fallback=default_config["meters"]["dst_address"]) + meter_type = confparser[meter].get("type", fallback=default_config["meters"]["type"]) + meter_module = importlib.import_module(f"devices.{meter_type}") + meter_device = meter_module.device(confparser[meter]) + + EM24_slave_ctx = EM24SlaveContext() + SE7K_slave_ctx = ModbusSlaveContext() + + # block_11 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + # block_11.add_16bit_int(1648) + # EM24_slave_ctx.setValues(3, 11, block_11.to_registers()) + # EM24_slave_ctx.setValues(4, 11, block_11.to_registers()) + + block_0 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_0.add_32bit_int(1234) + EM24_slave_ctx.setValues(3, 0, block_0.to_registers()) + EM24_slave_ctx.setValues(4, 0, block_0.to_registers()) + + block_770 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_770.add_16bit_int(4126) # Version and revision measurment module + block_770.add_16bit_int(68) # + block_770.add_16bit_int(4127) # Version and revision communication module + block_770.add_16bit_int(67) # + block_770.add_16bit_int(0) # Current tariff + EM24_slave_ctx.setValues(3, 770, block_770.to_registers()) + EM24_slave_ctx.setValues(4, 770, block_770.to_registers()) + + block_848 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_848.add_16bit_int(4128) # Measurement module’s firmware CRC + EM24_slave_ctx.setValues(3, 848, block_848.to_registers()) + EM24_slave_ctx.setValues(4, 848, block_848.to_registers()) + + block_20480 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_20480.add_string("MB24DINAV23XE1X") + EM24_slave_ctx.setValues(3, 20480, block_20480.to_registers()) + EM24_slave_ctx.setValues(4, 20480, block_20480.to_registers()) + + block_41216 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_41216.add_16bit_int(3) # Front selector status + EM24_slave_ctx.setValues(3, 41216, block_41216.to_registers()) + EM24_slave_ctx.setValues(4, 41216, block_41216.to_registers()) + + block_4096 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_4096.add_16bit_int(9999) # PASSWORD + block_4096.add_16bit_int(0) # unused + block_4096.add_16bit_int(0) # Measuring system + block_4096.add_32bit_int(10) # Current transformer ratio + block_4096.add_32bit_int(10) # Voltage transformer ratio + block_4096.add_16bit_int(1) # unused + block_4096.add_16bit_int(2) # unused + block_4096.add_16bit_int(3) # unused + block_4096.add_16bit_int(4) # unused + block_4096.add_16bit_int(5) # unused + block_4096.add_16bit_int(6) # unused + block_4096.add_16bit_int(7) # unused + block_4096.add_16bit_int(8) # unused + block_4096.add_16bit_int(9) # unused + block_4096.add_32bit_int(15) # Interval time + EM24_slave_ctx.setValues(3, 4096, block_4096.to_registers()) + EM24_slave_ctx.setValues(4, 4096, block_4096.to_registers()) + + block_4360 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_4360.add_16bit_int(2) # PASSWORD + block_4360.add_16bit_int(2) # PASSWORD + EM24_slave_ctx.setValues(3, 4360, block_4360.to_registers()) + EM24_slave_ctx.setValues(4, 4360, block_4360.to_registers()) + + block_40960 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Little) + block_40960.add_16bit_int(1) # Type of application + block_40960.add_16bit_int(3) # Default page for selector position “LOCK” + block_40960.add_16bit_int(1) # Default page for selector position “1” + block_40960.add_16bit_int(3) # Default page for selector position “2” + block_40960.add_16bit_int(3) # Default page for selector position “kvarh” + block_40960.add_16bit_int(1) # ID code of user 1 + block_40960.add_16bit_int(2) # ID code of user 2 + block_40960.add_16bit_int(3) # ID code of user 3 + EM24_slave_ctx.setValues(3, 40960, block_40960.to_registers()) + EM24_slave_ctx.setValues(4, 40960, block_40960.to_registers()) + + update_t_stop = threading.Event() + update_t = threading.Thread( + target=t_update, + name=f"t_update_{address}", + args=( + EM24_slave_ctx, + SE7K_slave_ctx, + update_t_stop, + meter_module, + meter_device, + confparser[meter].getfloat("refresh_rate", fallback=default_config["meters"]["refresh_rate"]) + ) + ) + + threads.append(update_t) + thread_stops.append(update_t_stop) + + slaves.update({1: EM24_slave_ctx}) + slaves.update({2: SE7K_slave_ctx}) + logger.info(f"Created {update_t}: {meter} {meter_type} {meter_device}") + + if not slaves: + logger.warning(f"No meters defined in {args.config}") + + config_framer = confparser["server"].get("framer", fallback=default_config["server"]["framer"]) + framer = False + + if config_framer == "socket": + framer = ModbusSocketFramer + elif config_framer == "rtu": + framer = ModbusRtuFramer + + identity = ModbusDeviceIdentification() + server_ctx = ModbusServerContext(slaves=slaves, single=False) + + time.sleep(1) + + for t in threads: + t.start() + logger.info(f"Starting {t}") + + StartMyTcpServer( + server_ctx, + framer=framer, + identity=identity, + address=( + confparser["server"].get("address", fallback=default_config["server"]["address"]), + confparser["server"].getint("port", fallback=default_config["server"]["port"]) + ) + ) + except KeyboardInterrupt: + pass + finally: + for t_stop in thread_stops: + t_stop.set() + for t in threads: + t.join() diff --git a/SE7K-proxy-tcp.d.sh b/SE7K-proxy-tcp.d.sh index b74067b..ddf012b 100755 --- a/SE7K-proxy-tcp.d.sh +++ b/SE7K-proxy-tcp.d.sh @@ -8,3 +8,4 @@ file=/var/log/modbus-proxy.err errfile=$file [ -e $file ] && [ $(stat --printf '%s' "$file") -gt 104857600 ] && rm "$file" nohup python3 $meinpfad/SE7K-proxy-tcp.py -c $meinpfad/SE7K.conf 2>>$errfile >>$logfile & + diff --git a/SE7K-proxy-tcp.sh b/SE7K-proxy-tcp.sh index 63fcc34..5a914d3 100755 --- a/SE7K-proxy-tcp.sh +++ b/SE7K-proxy-tcp.sh @@ -1,2 +1,3 @@ #!/bin/bash python3 SE7K-proxy-tcp.py -c SE7K.conf + diff --git a/devices/solaredge-inverter.py b/devices/solaredge-inverter.py index b7dbd74..63be4c4 100644 --- a/devices/solaredge-inverter.py +++ b/devices/solaredge-inverter.py @@ -1,158 +1,157 @@ -import logging -import re -import solaredge_modbus - - -def device(config): - - # Configuration parameters: - # - # timeout seconds to wait for a response, default: 1 - # retries number of retries, default: 3 - # unit modbus address, default: 1 - # - # For Modbus TCP: - # host ip or hostname - # port modbus tcp port - # - # For Modbus RTU: - # device serial device, e.g. /dev/ttyUSB0 - # stopbits number of stop bits - # parity parity setting, N, E or O - # baud baud rate - - timeout = config.getint("timeout", fallback=1) - retries = config.getint("retries", fallback=3) - unit = config.getint("src_address", fallback=1) - - host = config.get("host", fallback=False) - port = config.getint("port", fallback=False) - device = config.get("device", fallback=False) - - if device: - stopbits = config.getint("stopbits", fallback=1) - parity = config.get("parity", fallback="N") - baud = config.getint("baud", fallback=2400) - - if (parity - and parity.upper() in ["N", "E", "O"]): - parity = parity.upper() - else: - parity = False - - return solaredge_modbus.Inverter( - device=device, - stopbits=stopbits, - parity=parity, - baud=baud, - timeout=timeout, - retries=retries, - unit=unit - ) - else: - return solaredge_modbus.Inverter( - host=host, - port=port, - timeout=timeout, - retries=retries, - unit=unit - ) - - -def values(device): - if not device: - return {} - - logger = logging.getLogger() - logger.debug(f"device: {device}") - - values = {} - inverter_values=device.read_all() - - # append type to key to prevent key name collision with legacy values - values = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in inverter_values.items()} - - meters = device.meters() - batteries = device.batteries() - values["connected_meters"] = {} - values["connected_batteries"] = {} - - for meter, params in meters.items(): - meter_values = params.read_all() - values["connected_meters"][meter] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in meter_values.items()} - - for battery, params in batteries.items(): - battery_values = params.read_all() - values["connected_batteries"][battery] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in battery_values.items()} - - logger.debug(f"values: {values}") - - # additional values for emulation of SE-WNC-3Y-400-MB-K1 or WattNode WNC-3Y-400-MB - - # TODO Calculate the values for the SE-WNC-3Y-400-MB-K1 meter from the SolarEdge meter provided by SE7K - - meterValues = values["connected_meters"]["Meter1"] - - - SE_WNC_3Y_400_MB_K1_values = { - "energy_active": meterValues.get('export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "import_energy_active": meterValues.get('import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "power_active": meterValues.get('power_int', 0)*10**meterValues.get('power_scale_int', 0), - "l1_power_active": meterValues.get('l1_power_int', 0)*10**meterValues.get('power_scale_int', 0), - "l2_power_active": meterValues.get('l2_power_int', 0)*10**meterValues.get('power_scale_int', 0), - "l3_power_active": meterValues.get('l3_power_int', 0)*10**meterValues.get('power_scale_int', 0), - "voltage_ln": meterValues.get('voltage_ln_int', 0)*10**meterValues.get('voltage_scale_int', 0), - "l1n_voltage": meterValues.get('l1n_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), - "l2n_voltage": meterValues.get('l2n_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), - "l3n_voltage": meterValues.get('l3n_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), - "voltage_ll": meterValues.get('voltage_ll_int', 0)*10**meterValues.get('voltage_scale_int', 0), - "l12_voltage": meterValues.get('l12_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), - "l23_voltage": meterValues.get('l23_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), - "l31_voltage": meterValues.get('l31_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), - "frequency": meterValues.get('frequency_int', 0)*10**meterValues.get('frequency_scale_int', 0), - "l1_energy_active": meterValues.get('l1_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "l2_energy_active": meterValues.get('l2_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "l3_energy_active": meterValues.get('l3_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "l1_import_energy_active": meterValues.get('l1_import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "l2_import_energy_active": meterValues.get('l2_import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "l3_import_energy_active": meterValues.get('l3_import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "export_energy_active": meterValues.get('export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "l1_export_energy_active": meterValues.get('l1_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "l2_export_energy_active": meterValues.get('l2_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "l3_export_energy_active": meterValues.get('l3_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), - "energy_reactive": 0.0, - "l1_energy_reactive": 0.0, - "l2_energy_reactive": 0.0, - "l3_energy_reactive": 0.0, - "energy_apparent": meterValues.get('import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), - "l1_energy_apparent": meterValues.get('l1_import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), - "l2_energy_apparent": meterValues.get('l2_import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), - "l3_energy_apparent": meterValues.get('l3_import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), - "power_factor": meterValues.get('power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), - "l1_power_factor": meterValues.get('l1_power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), - "l2_power_factor": meterValues.get('l2_power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), - "l3_power_factor": meterValues.get('l3_power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), - "power_reactive": meterValues.get('power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), - "l1_power_reactive": meterValues.get('l1_power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), - "l2_power_reactive": meterValues.get('l2_power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), - "l3_power_reactive": meterValues.get('l3_power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), - "power_apparent": meterValues.get('power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), - "l1_power_apparent": meterValues.get('l1_power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), - "l2_power_apparent": meterValues.get('l2_power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), - "l3_power_apparent": meterValues.get('l3_power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), - "l1_current": meterValues.get('l1_current_int', 0)*10**meterValues.get('current_scale_int', 0), - "l2_current": meterValues.get('l2_current_int', 0)*10**meterValues.get('current_scale_int', 0), - "l3_current": meterValues.get('l3_current_int', 0)*10**meterValues.get('current_scale_int', 0), - "demand_power_active": 0.0, - "minimum_demand_power_active": 0.0, - "maximum_demand_power_active": 0.0, - "demand_power_apparent": 0.0, - "l1_demand_power_active": 0.0, - "l2_demand_power_active": 0.0, - "l3_demand_power_active": 0.0, - } - - values |= SE_WNC_3Y_400_MB_K1_values - - return values +import logging +import re +import solaredge_modbus + + +def device(config): + + # Configuration parameters: + # + # timeout seconds to wait for a response, default: 1 + # retries number of retries, default: 3 + # unit modbus address, default: 1 + # + # For Modbus TCP: + # host ip or hostname + # port modbus tcp port + # + # For Modbus RTU: + # device serial device, e.g. /dev/ttyUSB0 + # stopbits number of stop bits + # parity parity setting, N, E or O + # baud baud rate + + timeout = config.getint("timeout", fallback=1) + retries = config.getint("retries", fallback=3) + unit = config.getint("src_address", fallback=1) + + host = config.get("host", fallback=False) + port = config.getint("port", fallback=False) + device = config.get("device", fallback=False) + + if device: + stopbits = config.getint("stopbits", fallback=1) + parity = config.get("parity", fallback="N") + baud = config.getint("baud", fallback=2400) + + if (parity + and parity.upper() in ["N", "E", "O"]): + parity = parity.upper() + else: + parity = False + + return solaredge_modbus.Inverter( + device=device, + stopbits=stopbits, + parity=parity, + baud=baud, + timeout=timeout, + retries=retries, + unit=unit + ) + else: + return solaredge_modbus.Inverter( + host=host, + port=port, + timeout=timeout, + retries=retries, + unit=unit + ) + + +def values(device): + if not device: + return {} + + logger = logging.getLogger() + logger.debug(f"device: {device}") + + values = {} + inverter_values=device.read_all() + + # append type to key to prevent key name collision with legacy values + values = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in inverter_values.items()} + + meters = device.meters() + batteries = device.batteries() + values["connected_meters"] = {} + values["connected_batteries"] = {} + + for meter, params in meters.items(): + meter_values = params.read_all() + values["connected_meters"][meter] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in meter_values.items()} + + for battery, params in batteries.items(): + battery_values = params.read_all() + values["connected_batteries"][battery] = {key+'_'+re.search('\'(.*)\'',str(type(value))).group(1):value for key, value in battery_values.items()} + + logger.debug(f"values: {values}") + + # additional values for emulation of SE-WNC-3Y-400-MB-K1 or WattNode WNC-3Y-400-MB + + # TODO Calculate the values for the SE-WNC-3Y-400-MB-K1 meter from the SolarEdge meter provided by SE7K + + meterValues = values["connected_meters"]["Meter1"] + + + SE_WNC_3Y_400_MB_K1_values = { + "energy_active": meterValues.get('export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "import_energy_active": meterValues.get('import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "power_active": meterValues.get('power_int', 0)*10**meterValues.get('power_scale_int', 0), + "l1_power_active": meterValues.get('l1_power_int', 0)*10**meterValues.get('power_scale_int', 0), + "l2_power_active": meterValues.get('l2_power_int', 0)*10**meterValues.get('power_scale_int', 0), + "l3_power_active": meterValues.get('l3_power_int', 0)*10**meterValues.get('power_scale_int', 0), + "voltage_ln": meterValues.get('voltage_ln_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l1n_voltage": meterValues.get('l1n_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l2n_voltage": meterValues.get('l2n_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l3n_voltage": meterValues.get('l3n_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "voltage_ll": meterValues.get('voltage_ll_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l12_voltage": meterValues.get('l12_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l23_voltage": meterValues.get('l23_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "l31_voltage": meterValues.get('l31_voltage_int', 0)*10**meterValues.get('voltage_scale_int', 0), + "frequency": meterValues.get('frequency_int', 0)*10**meterValues.get('frequency_scale_int', 0), + "l1_energy_active": meterValues.get('l1_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l2_energy_active": meterValues.get('l2_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l3_energy_active": meterValues.get('l3_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l1_import_energy_active": meterValues.get('l1_import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l2_import_energy_active": meterValues.get('l2_import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l3_import_energy_active": meterValues.get('l3_import_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "export_energy_active": meterValues.get('export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l1_export_energy_active": meterValues.get('l1_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l2_export_energy_active": meterValues.get('l2_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "l3_export_energy_active": meterValues.get('l3_export_energy_active_int', 0)*10**meterValues.get('energy_active_scale_int', 0), + "energy_reactive": 0.0, + "l1_energy_reactive": 0.0, + "l2_energy_reactive": 0.0, + "l3_energy_reactive": 0.0, + "energy_apparent": meterValues.get('import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), + "l1_energy_apparent": meterValues.get('l1_import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), + "l2_energy_apparent": meterValues.get('l2_import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), + "l3_energy_apparent": meterValues.get('l3_import_energy_apparent_int', 0)*10**meterValues.get('energy_apparent_scale_int', 0), + "power_factor": meterValues.get('power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), + "l1_power_factor": meterValues.get('l1_power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), + "l2_power_factor": meterValues.get('l2_power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), + "l3_power_factor": meterValues.get('l3_power_factor_int', 0)*10**meterValues.get('power_factor_scale_int', 0), + "power_reactive": meterValues.get('power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), + "l1_power_reactive": meterValues.get('l1_power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), + "l2_power_reactive": meterValues.get('l2_power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), + "l3_power_reactive": meterValues.get('l3_power_reactive_int', 0)*10**meterValues.get('power_reactive_scale_int', 0), + "power_apparent": meterValues.get('power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), + "l1_power_apparent": meterValues.get('l1_power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), + "l2_power_apparent": meterValues.get('l2_power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), + "l3_power_apparent": meterValues.get('l3_power_apparent_int', 0)*10**meterValues.get('power_apparent_scale_int', 0), + "l1_current": meterValues.get('l1_current_int', 0)*10**meterValues.get('current_scale_int', 0), + "l2_current": meterValues.get('l2_current_int', 0)*10**meterValues.get('current_scale_int', 0), + "l3_current": meterValues.get('l3_current_int', 0)*10**meterValues.get('current_scale_int', 0), + "demand_power_active": 0.0, + "minimum_demand_power_active": 0.0, + "maximum_demand_power_active": 0.0, + "demand_power_apparent": 0.0, + "l1_demand_power_active": 0.0, + "l2_demand_power_active": 0.0, + "l3_demand_power_active": 0.0, + } + + + return dict(list(values.items()) + list(SE_WNC_3Y_400_MB_K1_values.items())) # append type to key \ No newline at end of file diff --git a/init.d/modbus-proxy b/init.d/modbus-proxy index 2dcdb5f..d405845 100644 --- a/init.d/modbus-proxy +++ b/init.d/modbus-proxy @@ -1,87 +1,87 @@ -#!/bin/sh -# Start/stop the modbus-proxy daemon. -# -### BEGIN INIT INFO -# Provides: cron -# Required-Start: $remote_fs $syslog $time -# Required-Stop: $remote_fs $syslog $time -# Should-Start: $network $named slapd autofs ypbind nscd nslcd winbind sssd -# Should-Stop: $network $named slapd autofs ypbind nscd nslcd winbind sssd -# Default-Start: 2 3 4 5 -# Default-Stop: -# Short-Description: Regular background program processing daemon -# Description: cron is a standard UNIX program that runs user-specified -# programs at periodic scheduled times. vixie cron adds a -# number of features to the basic UNIX cron, including better -# security and more powerful configuration options. -### END INIT INFO - -PATH=/bin:/usr/bin:/sbin:/usr/sbin -DESC="modbus proxy daemon" -NAME=modbus-proxy -DAEMON=/home/martin/gitHubClones/solaredge_meterproxy/SE7K-proxy-tcp.d.sh -PIDFILE=/var/run/modbus-proxy.pid -SCRIPTNAME=/etc/init.d/"$NAME" - -test -f $DAEMON || exit 0 - -. /lib/lsb/init-functions - -# -# We read /etc/environment, but warn about locale information in -# there because it should be in /etc/default/locale. -parse_environment () -{ - for ENV_FILE in /etc/environment /etc/default/locale; do - [ -r "$ENV_FILE" ] || continue - [ -s "$ENV_FILE" ] || continue - - for var in LANG LANGUAGE LC_ALL LC_CTYPE; do - value=`egrep "^${var}=" "$ENV_FILE" | tail -n1 | cut -d= -f2` - [ -n "$value" ] && eval export $var=$value - - if [ -n "$value" ] && [ "$ENV_FILE" = /etc/environment ]; then - log_warning_msg "/etc/environment has been deprecated for locale information; use /etc/default/locale for $var=$value instead" - fi - done - done - -# Get the timezone set. - if [ -z "$TZ" -a -e /etc/timezone ]; then - TZ=`cat /etc/timezone` - fi -} - -# Parse the system's environment -if [ "$READ_ENV" = "yes" ] ; then - parse_environment -fi - - -case "$1" in -start) log_daemon_msg "Starting modbus proxy service" "modbus_proxy" - start_daemon -p $PIDFILE $DAEMON $EXTRA_OPTS - log_end_msg $? - ;; -stop) log_daemon_msg "Stopping modbus proxy service" "modbus_proxy" - killproc -p $PIDFILE $DAEMON - RETVAL=$? - [ $RETVAL -eq 0 ] && [ -e "$PIDFILE" ] && rm -f $PIDFILE - log_end_msg $RETVAL - ;; -restart) log_daemon_msg "Restarting modbus proxy service" "modbus_proxy" - $0 stop - $0 start - ;; -reload|force-reload) log_daemon_msg "Reloading configuration files for modbus proxy service" "modbus_proxy" - $0 stop - $0 start - ;; -status) - status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $? - ;; -*) log_action_msg "Usage: /etc/init.d/modbus_proxy {start|stop|status|restart|reload|force-reload}" - exit 2 - ;; -esac -exit 0 +#!/bin/sh +# Start/stop the modbus-proxy daemon. +# +### BEGIN INIT INFO +# Provides: cron +# Required-Start: $remote_fs $syslog $time +# Required-Stop: $remote_fs $syslog $time +# Should-Start: $network $named slapd autofs ypbind nscd nslcd winbind sssd +# Should-Stop: $network $named slapd autofs ypbind nscd nslcd winbind sssd +# Default-Start: 2 3 4 5 +# Default-Stop: +# Short-Description: Regular background program processing daemon +# Description: cron is a standard UNIX program that runs user-specified +# programs at periodic scheduled times. vixie cron adds a +# number of features to the basic UNIX cron, including better +# security and more powerful configuration options. +### END INIT INFO + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +DESC="modbus proxy daemon" +NAME=modbus-proxy +DAEMON=/home/martin/gitHubClones/solaredge_meterproxy/SE7K-EM24-proxy-tcp.d.sh +PIDFILE=/var/run/modbus-proxy.pid +SCRIPTNAME=/etc/init.d/"$NAME" + +test -f $DAEMON || exit 0 + +. /lib/lsb/init-functions + +# +# We read /etc/environment, but warn about locale information in +# there because it should be in /etc/default/locale. +parse_environment () +{ + for ENV_FILE in /etc/environment /etc/default/locale; do + [ -r "$ENV_FILE" ] || continue + [ -s "$ENV_FILE" ] || continue + + for var in LANG LANGUAGE LC_ALL LC_CTYPE; do + value=`egrep "^${var}=" "$ENV_FILE" | tail -n1 | cut -d= -f2` + [ -n "$value" ] && eval export $var=$value + + if [ -n "$value" ] && [ "$ENV_FILE" = /etc/environment ]; then + log_warning_msg "/etc/environment has been deprecated for locale information; use /etc/default/locale for $var=$value instead" + fi + done + done + +# Get the timezone set. + if [ -z "$TZ" -a -e /etc/timezone ]; then + TZ=`cat /etc/timezone` + fi +} + +# Parse the system's environment +if [ "$READ_ENV" = "yes" ] ; then + parse_environment +fi + + +case "$1" in +start) log_daemon_msg "Starting modbus proxy service" "modbus_proxy" + start_daemon -p $PIDFILE $DAEMON $EXTRA_OPTS + log_end_msg $? + ;; +stop) log_daemon_msg "Stopping modbus proxy service" "modbus_proxy" + killproc -p $PIDFILE $DAEMON + RETVAL=$? + [ $RETVAL -eq 0 ] && [ -e "$PIDFILE" ] && rm -f $PIDFILE + log_end_msg $RETVAL + ;; +restart) log_daemon_msg "Restarting modbus proxy service" "modbus_proxy" + $0 stop + $0 start + ;; +reload|force-reload) log_daemon_msg "Reloading configuration files for modbus proxy service" "modbus_proxy" + $0 stop + $0 start + ;; +status) + status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $? + ;; +*) log_action_msg "Usage: /etc/init.d/modbus_proxy {start|stop|status|restart|reload|force-reload}" + exit 2 + ;; +esac +exit 0 diff --git a/init.d/modbus-proxy.md b/init.d/modbus-proxy.md index 160da17..1a98921 100644 --- a/init.d/modbus-proxy.md +++ b/init.d/modbus-proxy.md @@ -1,4 +1,4 @@ -die modbus-proxy datei muss in /etc/init.d als ausfhrbare datei kopiert werden. +the modbus-proxy file must be stored in /etc/init.d and flagged executable. systemctl start modbus-proxy systemctl enable modbus-proxy From 02bf44cbca87a19617cb089c00ddd37ead9b9b70 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Fri, 11 Mar 2022 15:45:44 +0100 Subject: [PATCH 30/32] revert all changes to existing files --- devices/sdm630.py | 260 +++++++++++++++++++++++----------------------- semp-tcp.py | 2 +- 2 files changed, 130 insertions(+), 132 deletions(-) diff --git a/devices/sdm630.py b/devices/sdm630.py index ca4efcf..98ccd53 100644 --- a/devices/sdm630.py +++ b/devices/sdm630.py @@ -1,131 +1,129 @@ -import logging - -import sdm_modbus - - -def device(config): - - # Configuration parameters: - # - # timeout seconds to wait for a response, default: 1 - # retries number of retries, default: 3 - # unit modbus address, default: 1 - # - # For Modbus TCP: - # host ip or hostname - # port modbus tcp port - # - # For Modbus RTU: - # device serial device, e.g. /dev/ttyUSB0 - # stopbits number of stop bits - # parity parity setting, N, E or O - # baud baud rate - - timeout = config.getint("timeout", fallback=1) - retries = config.getint("retries", fallback=3) - unit = config.getint("src_address", fallback=1) - - host = config.get("host", fallback=False) - port = config.getint("port", fallback=False) - device = config.get("device", fallback=False) - - if device: - stopbits = config.getint("stopbits", fallback=1) - parity = config.get("parity", fallback="N") - baud = config.getint("baud", fallback=9600) - - if (parity - and parity.upper() in ["N", "E", "O"]): - parity = parity.upper() - else: - parity = False - - return sdm_modbus.SDM630( - device=device, - stopbits=stopbits, - parity=parity, - baud=baud, - timeout=timeout, - retries=retries, - unit=unit - ) - else: - return sdm_modbus.SDM630( - host=host, - port=port, - timeout=timeout, - retries=retries, - unit=unit - ) - - -def values(device): - if not device: - return {} - - logger = logging.getLogger() - logger.debug(f"device: {device}") - - values = device.read_all() - - logger.debug(f"values: {values}") - - - - return { - "energy_active": values.get("total_energy_active", 0), - "import_energy_active": values.get("import_energy_active", 0), - "power_active": values.get("total_power_active", 0), - "l1_power_active": values.get("l1_power_active", 0), - "l2_power_active": values.get("l2_power_active", 0), - "l3_power_active": values.get("l3_power_active", 0), - "voltage_ln": values.get("voltage_ln", 0), - "l1n_voltage": values.get("l1_voltage", 0), - "l2n_voltage": values.get("l2_voltage", 0), - "l3n_voltage": values.get("l3_voltage", 0), - "voltage_ll": values.get("voltage_ll", 0), - "l12_voltage": values.get("l12_voltage", 0), - "l23_voltage": values.get("l23_voltage", 0), - "l31_voltage": values.get("l31_voltage", 0), - "frequency": values.get("frequency", 0), - "l1_energy_active": values.get("total_energy_active", 0), - # "l2_energy_active" - # "l3_energy_active" - "l1_import_energy_active": values.get("import_energy_active", 0), - # "l2_import_energy_active" - # "l3_import_energy_active" - "export_energy_active": values.get("export_energy_active", 0), - "l1_export_energy_active": values.get("export_energy_active", 0), - # "l2_export_energy_active" - # "l3_export_energy_active" - "energy_reactive": values.get("total_energy_reactive", 0), - "l1_energy_reactive": values.get("total_energy_reactive", 0), - # "l2_energy_reactive" - # "l3_energy_reactive" - "energy_apparent": values.get("total_energy_apparent", 0), - "l1_energy_apparent": values.get("total_energy_apparent", 0), - # "l2_energy_apparent" - # "l3_energy_apparent" - "power_factor": values.get("total_power_factor", 0), - "l1_power_factor": values.get("l1_power_factor", 0), - "l2_power_factor": values.get("l2_power_factor", 0), - "l3_power_factor": values.get("l3_power_factor", 0), - "power_reactive": values.get("total_power_reactive", 0), - "l1_power_reactive": values.get("l1_power_reactive", 0), - "l2_power_reactive": values.get("l2_power_reactive", 0), - "l3_power_reactive": values.get("l3_power_reactive", 0), - "power_apparent": values.get("total_power_apparent", 0), - "l1_power_apparent": values.get("l1_power_apparent", 0), - "l2_power_apparent": values.get("l2_power_apparent", 0), - "l3_power_apparent": values.get("l3_power_apparent", 0), - "l1_current": values.get("l1_current", 0), - "l2_current": values.get("l2_current", 0), - "l3_current": values.get("l3_current", 0), - "demand_power_active": values.get("total_import_demand_power_active", 0), - # "minimum_demand_power_active" - "maximum_demand_power_active": values.get("maximum_import_demand_power_active", 0), - "demand_power_apparent": values.get("total_demand_power_apparent", 0), - "l1_demand_power_active": (values.get("l1_demand_current", 0) * values.get("l1_voltage", 0)), - "l2_demand_power_active": (values.get("l2_demand_current", 0) * values.get("l2_voltage", 0)), - "l3_demand_power_active": (values.get("l3_demand_current", 0) * values.get("l3_voltage", 0)) - } +import logging + +import sdm_modbus + + +def device(config): + + # Configuration parameters: + # + # timeout seconds to wait for a response, default: 1 + # retries number of retries, default: 3 + # unit modbus address, default: 1 + # + # For Modbus TCP: + # host ip or hostname + # port modbus tcp port + # + # For Modbus RTU: + # device serial device, e.g. /dev/ttyUSB0 + # stopbits number of stop bits + # parity parity setting, N, E or O + # baud baud rate + + timeout = config.getint("timeout", fallback=1) + retries = config.getint("retries", fallback=3) + unit = config.getint("src_address", fallback=1) + + host = config.get("host", fallback=False) + port = config.getint("port", fallback=False) + device = config.get("device", fallback=False) + + if device: + stopbits = config.getint("stopbits", fallback=1) + parity = config.get("parity", fallback="N") + baud = config.getint("baud", fallback=9600) + + if (parity + and parity.upper() in ["N", "E", "O"]): + parity = parity.upper() + else: + parity = False + + return sdm_modbus.SDM630( + device=device, + stopbits=stopbits, + parity=parity, + baud=baud, + timeout=timeout, + retries=retries, + unit=unit + ) + else: + return sdm_modbus.SDM630( + host=host, + port=port, + timeout=timeout, + retries=retries, + unit=unit + ) + + +def values(device): + if not device: + return {} + + logger = logging.getLogger() + logger.debug(f"device: {device}") + + values = device.read_all() + + logger.debug(f"values: {values}") + + return { + "energy_active": values.get("total_energy_active", 0), + "import_energy_active": values.get("import_energy_active", 0), + "power_active": values.get("total_power_active", 0), + "l1_power_active": values.get("l1_power_active", 0), + "l2_power_active": values.get("l2_power_active", 0), + "l3_power_active": values.get("l3_power_active", 0), + "voltage_ln": values.get("voltage_ln", 0), + "l1n_voltage": values.get("l1_voltage", 0), + "l2n_voltage": values.get("l2_voltage", 0), + "l3n_voltage": values.get("l3_voltage", 0), + "voltage_ll": values.get("voltage_ll", 0), + "l12_voltage": values.get("l12_voltage", 0), + "l23_voltage": values.get("l23_voltage", 0), + "l31_voltage": values.get("l31_voltage", 0), + "frequency": values.get("frequency", 0), + "l1_energy_active": values.get("total_energy_active", 0), + # "l2_energy_active" + # "l3_energy_active" + "l1_import_energy_active": values.get("import_energy_active", 0), + # "l2_import_energy_active" + # "l3_import_energy_active" + "export_energy_active": values.get("export_energy_active", 0), + "l1_export_energy_active": values.get("export_energy_active", 0), + # "l2_export_energy_active" + # "l3_export_energy_active" + "energy_reactive": values.get("total_energy_reactive", 0), + "l1_energy_reactive": values.get("total_energy_reactive", 0), + # "l2_energy_reactive" + # "l3_energy_reactive" + "energy_apparent": values.get("total_energy_apparent", 0), + "l1_energy_apparent": values.get("total_energy_apparent", 0), + # "l2_energy_apparent" + # "l3_energy_apparent" + "power_factor": values.get("total_power_factor", 0), + "l1_power_factor": values.get("l1_power_factor", 0), + "l2_power_factor": values.get("l2_power_factor", 0), + "l3_power_factor": values.get("l3_power_factor", 0), + "power_reactive": values.get("total_power_reactive", 0), + "l1_power_reactive": values.get("l1_power_reactive", 0), + "l2_power_reactive": values.get("l2_power_reactive", 0), + "l3_power_reactive": values.get("l3_power_reactive", 0), + "power_apparent": values.get("total_power_apparent", 0), + "l1_power_apparent": values.get("l1_power_apparent", 0), + "l2_power_apparent": values.get("l2_power_apparent", 0), + "l3_power_apparent": values.get("l3_power_apparent", 0), + "l1_current": values.get("l1_current", 0), + "l2_current": values.get("l2_current", 0), + "l3_current": values.get("l3_current", 0), + "demand_power_active": values.get("total_import_demand_power_active", 0), + # "minimum_demand_power_active" + "maximum_demand_power_active": values.get("maximum_import_demand_power_active", 0), + "demand_power_apparent": values.get("total_demand_power_apparent", 0), + "l1_demand_power_active": (values.get("l1_demand_current", 0) * values.get("l1_voltage", 0)), + "l2_demand_power_active": (values.get("l2_demand_current", 0) * values.get("l2_voltage", 0)), + "l3_demand_power_active": (values.get("l3_demand_current", 0) * values.get("l3_voltage", 0)) + } diff --git a/semp-tcp.py b/semp-tcp.py index ceecc7e..27abe3a 100755 --- a/semp-tcp.py +++ b/semp-tcp.py @@ -112,7 +112,7 @@ def t_update(ctx, stop, module, device, refresh): "port": 5502, "framer": "socket", "log_level": "INFO", - "meters": 'Meter1' + "meters": '' }, "meters": { "dst_address": 2, From ac681cf1c9e0fc8dc6178a04ec8bfdf9fef0b9b7 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Fri, 11 Mar 2022 15:48:01 +0100 Subject: [PATCH 31/32] use unix file format --- devices/sdm630.py | 258 +++++++++++++++++++++++----------------------- 1 file changed, 129 insertions(+), 129 deletions(-) diff --git a/devices/sdm630.py b/devices/sdm630.py index 98ccd53..4eea910 100644 --- a/devices/sdm630.py +++ b/devices/sdm630.py @@ -1,129 +1,129 @@ -import logging - -import sdm_modbus - - -def device(config): - - # Configuration parameters: - # - # timeout seconds to wait for a response, default: 1 - # retries number of retries, default: 3 - # unit modbus address, default: 1 - # - # For Modbus TCP: - # host ip or hostname - # port modbus tcp port - # - # For Modbus RTU: - # device serial device, e.g. /dev/ttyUSB0 - # stopbits number of stop bits - # parity parity setting, N, E or O - # baud baud rate - - timeout = config.getint("timeout", fallback=1) - retries = config.getint("retries", fallback=3) - unit = config.getint("src_address", fallback=1) - - host = config.get("host", fallback=False) - port = config.getint("port", fallback=False) - device = config.get("device", fallback=False) - - if device: - stopbits = config.getint("stopbits", fallback=1) - parity = config.get("parity", fallback="N") - baud = config.getint("baud", fallback=9600) - - if (parity - and parity.upper() in ["N", "E", "O"]): - parity = parity.upper() - else: - parity = False - - return sdm_modbus.SDM630( - device=device, - stopbits=stopbits, - parity=parity, - baud=baud, - timeout=timeout, - retries=retries, - unit=unit - ) - else: - return sdm_modbus.SDM630( - host=host, - port=port, - timeout=timeout, - retries=retries, - unit=unit - ) - - -def values(device): - if not device: - return {} - - logger = logging.getLogger() - logger.debug(f"device: {device}") - - values = device.read_all() - - logger.debug(f"values: {values}") - - return { - "energy_active": values.get("total_energy_active", 0), - "import_energy_active": values.get("import_energy_active", 0), - "power_active": values.get("total_power_active", 0), - "l1_power_active": values.get("l1_power_active", 0), - "l2_power_active": values.get("l2_power_active", 0), - "l3_power_active": values.get("l3_power_active", 0), - "voltage_ln": values.get("voltage_ln", 0), - "l1n_voltage": values.get("l1_voltage", 0), - "l2n_voltage": values.get("l2_voltage", 0), - "l3n_voltage": values.get("l3_voltage", 0), - "voltage_ll": values.get("voltage_ll", 0), - "l12_voltage": values.get("l12_voltage", 0), - "l23_voltage": values.get("l23_voltage", 0), - "l31_voltage": values.get("l31_voltage", 0), - "frequency": values.get("frequency", 0), - "l1_energy_active": values.get("total_energy_active", 0), - # "l2_energy_active" - # "l3_energy_active" - "l1_import_energy_active": values.get("import_energy_active", 0), - # "l2_import_energy_active" - # "l3_import_energy_active" - "export_energy_active": values.get("export_energy_active", 0), - "l1_export_energy_active": values.get("export_energy_active", 0), - # "l2_export_energy_active" - # "l3_export_energy_active" - "energy_reactive": values.get("total_energy_reactive", 0), - "l1_energy_reactive": values.get("total_energy_reactive", 0), - # "l2_energy_reactive" - # "l3_energy_reactive" - "energy_apparent": values.get("total_energy_apparent", 0), - "l1_energy_apparent": values.get("total_energy_apparent", 0), - # "l2_energy_apparent" - # "l3_energy_apparent" - "power_factor": values.get("total_power_factor", 0), - "l1_power_factor": values.get("l1_power_factor", 0), - "l2_power_factor": values.get("l2_power_factor", 0), - "l3_power_factor": values.get("l3_power_factor", 0), - "power_reactive": values.get("total_power_reactive", 0), - "l1_power_reactive": values.get("l1_power_reactive", 0), - "l2_power_reactive": values.get("l2_power_reactive", 0), - "l3_power_reactive": values.get("l3_power_reactive", 0), - "power_apparent": values.get("total_power_apparent", 0), - "l1_power_apparent": values.get("l1_power_apparent", 0), - "l2_power_apparent": values.get("l2_power_apparent", 0), - "l3_power_apparent": values.get("l3_power_apparent", 0), - "l1_current": values.get("l1_current", 0), - "l2_current": values.get("l2_current", 0), - "l3_current": values.get("l3_current", 0), - "demand_power_active": values.get("total_import_demand_power_active", 0), - # "minimum_demand_power_active" - "maximum_demand_power_active": values.get("maximum_import_demand_power_active", 0), - "demand_power_apparent": values.get("total_demand_power_apparent", 0), - "l1_demand_power_active": (values.get("l1_demand_current", 0) * values.get("l1_voltage", 0)), - "l2_demand_power_active": (values.get("l2_demand_current", 0) * values.get("l2_voltage", 0)), - "l3_demand_power_active": (values.get("l3_demand_current", 0) * values.get("l3_voltage", 0)) - } +import logging + +import sdm_modbus + + +def device(config): + + # Configuration parameters: + # + # timeout seconds to wait for a response, default: 1 + # retries number of retries, default: 3 + # unit modbus address, default: 1 + # + # For Modbus TCP: + # host ip or hostname + # port modbus tcp port + # + # For Modbus RTU: + # device serial device, e.g. /dev/ttyUSB0 + # stopbits number of stop bits + # parity parity setting, N, E or O + # baud baud rate + + timeout = config.getint("timeout", fallback=1) + retries = config.getint("retries", fallback=3) + unit = config.getint("src_address", fallback=1) + + host = config.get("host", fallback=False) + port = config.getint("port", fallback=False) + device = config.get("device", fallback=False) + + if device: + stopbits = config.getint("stopbits", fallback=1) + parity = config.get("parity", fallback="N") + baud = config.getint("baud", fallback=9600) + + if (parity + and parity.upper() in ["N", "E", "O"]): + parity = parity.upper() + else: + parity = False + + return sdm_modbus.SDM630( + device=device, + stopbits=stopbits, + parity=parity, + baud=baud, + timeout=timeout, + retries=retries, + unit=unit + ) + else: + return sdm_modbus.SDM630( + host=host, + port=port, + timeout=timeout, + retries=retries, + unit=unit + ) + + +def values(device): + if not device: + return {} + + logger = logging.getLogger() + logger.debug(f"device: {device}") + + values = device.read_all() + + logger.debug(f"values: {values}") + + return { + "energy_active": values.get("total_energy_active", 0), + "import_energy_active": values.get("import_energy_active", 0), + "power_active": values.get("total_power_active", 0), + "l1_power_active": values.get("l1_power_active", 0), + "l2_power_active": values.get("l2_power_active", 0), + "l3_power_active": values.get("l3_power_active", 0), + "voltage_ln": values.get("voltage_ln", 0), + "l1n_voltage": values.get("l1_voltage", 0), + "l2n_voltage": values.get("l2_voltage", 0), + "l3n_voltage": values.get("l3_voltage", 0), + "voltage_ll": values.get("voltage_ll", 0), + "l12_voltage": values.get("l12_voltage", 0), + "l23_voltage": values.get("l23_voltage", 0), + "l31_voltage": values.get("l31_voltage", 0), + "frequency": values.get("frequency", 0), + "l1_energy_active": values.get("total_energy_active", 0), + # "l2_energy_active" + # "l3_energy_active" + "l1_import_energy_active": values.get("import_energy_active", 0), + # "l2_import_energy_active" + # "l3_import_energy_active" + "export_energy_active": values.get("export_energy_active", 0), + "l1_export_energy_active": values.get("export_energy_active", 0), + # "l2_export_energy_active" + # "l3_export_energy_active" + "energy_reactive": values.get("total_energy_reactive", 0), + "l1_energy_reactive": values.get("total_energy_reactive", 0), + # "l2_energy_reactive" + # "l3_energy_reactive" + "energy_apparent": values.get("total_energy_apparent", 0), + "l1_energy_apparent": values.get("total_energy_apparent", 0), + # "l2_energy_apparent" + # "l3_energy_apparent" + "power_factor": values.get("total_power_factor", 0), + "l1_power_factor": values.get("l1_power_factor", 0), + "l2_power_factor": values.get("l2_power_factor", 0), + "l3_power_factor": values.get("l3_power_factor", 0), + "power_reactive": values.get("total_power_reactive", 0), + "l1_power_reactive": values.get("l1_power_reactive", 0), + "l2_power_reactive": values.get("l2_power_reactive", 0), + "l3_power_reactive": values.get("l3_power_reactive", 0), + "power_apparent": values.get("total_power_apparent", 0), + "l1_power_apparent": values.get("l1_power_apparent", 0), + "l2_power_apparent": values.get("l2_power_apparent", 0), + "l3_power_apparent": values.get("l3_power_apparent", 0), + "l1_current": values.get("l1_current", 0), + "l2_current": values.get("l2_current", 0), + "l3_current": values.get("l3_current", 0), + "demand_power_active": values.get("total_import_demand_power_active", 0), + # "minimum_demand_power_active" + "maximum_demand_power_active": values.get("maximum_import_demand_power_active", 0), + "demand_power_apparent": values.get("total_demand_power_apparent", 0), + "l1_demand_power_active": (values.get("l1_demand_current", 0) * values.get("l1_voltage", 0)), + "l2_demand_power_active": (values.get("l2_demand_current", 0) * values.get("l2_voltage", 0)), + "l3_demand_power_active": (values.get("l3_demand_current", 0) * values.get("l3_voltage", 0)) + } From 0818914985543675791216e27f2e636c00d84d29 Mon Sep 17 00:00:00 2001 From: ixtrader Date: Sun, 13 Mar 2022 18:58:11 +0100 Subject: [PATCH 32/32] log the first and then every thousandth connection attempt. Log if data might be invalid --- SE-MTR-3Y-400V-A.conf | 1 + SE7K-EM24-proxy-tcp.py | 22 ++++++++++++++----- ...M23-proxy-tcp.sh => SE7K-EM24-proxy-tcp.sh | 1 - 3 files changed, 18 insertions(+), 6 deletions(-) rename SE7K-EM23-proxy-tcp.sh => SE7K-EM24-proxy-tcp.sh (98%) diff --git a/SE-MTR-3Y-400V-A.conf b/SE-MTR-3Y-400V-A.conf index ae3c8a9..2de4e5f 100644 --- a/SE-MTR-3Y-400V-A.conf +++ b/SE-MTR-3Y-400V-A.conf @@ -25,6 +25,7 @@ meters = solaredge-inverter # the solarage inverter should have an SE-MTR-3Y-400V-A meter attached type=solaredge-inverter host=solaredge.fritz.box +#host=raspberrypi.fritz.box port=502 src_address=2 dst_address=1 diff --git a/SE7K-EM24-proxy-tcp.py b/SE7K-EM24-proxy-tcp.py index 6b7e1be..8d5d173 100644 --- a/SE7K-EM24-proxy-tcp.py +++ b/SE7K-EM24-proxy-tcp.py @@ -29,7 +29,7 @@ def getValues(self, fx, address, count=1): class ModbusMyTcpServer(ModbusTcpServer): - clientCounter = 0 + clientCounter={} def process_request(self, request, client): """ Callback for connecting a new client thread @@ -37,9 +37,12 @@ def process_request(self, request, client): :param request: The request to handle :param client: The address of the client """ - self.clientCounter += 1 + self.clientCounter[client[0]] = self.clientCounter.get(client[0],0) + 1 + logger = logging.getLogger() - logger.info("Started thread to serve client at " + str(client) + " clientCounter = " + str(self.clientCounter)) + if self.clientCounter[client[0]]%1000 == 1: + logger.info("Started thread to serve client at " + str(client[0]) + " clientCounter = " + str(self.clientCounter[client[0]]) + " request"+ str(request)) + super().process_request(request,client) def shutdown(self): @@ -202,7 +205,13 @@ def t_update_se7k(ctx, stop, module, device, refresh): values = module.values(device) if not values: - return + logger.info("no values read from device so discard") + return + + if values.get("energy_total_int") == 0: + logger.info("energy_total_int not set") + if values.get("frequency_int") == 0: + logger.info("power_ac_int not set so discard update") block_40000 = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) block_40000.add_string("SunS") @@ -292,6 +301,8 @@ def t_update_se7k(ctx, stop, module, device, refresh): except Exception as e: logger.critical(f"{this_t.name}: {e}") + return + return @@ -304,7 +315,8 @@ def t_update(ctx, SE7K_CTX, stop, module, device, refresh): while not stop.is_set(): try: logger.debug('before t_update_se7k ') - t_update_se7k(SE7K_CTX, stop, module, device, refresh) + if not t_update_se7k(SE7K_CTX, stop, module, device, refresh): + logger.debug('update not succesful t_update_se7k ') logger.debug('after t_update_se7k ') values = module.values(device) diff --git a/SE7K-EM23-proxy-tcp.sh b/SE7K-EM24-proxy-tcp.sh similarity index 98% rename from SE7K-EM23-proxy-tcp.sh rename to SE7K-EM24-proxy-tcp.sh index 1acad09..7df619b 100644 --- a/SE7K-EM23-proxy-tcp.sh +++ b/SE7K-EM24-proxy-tcp.sh @@ -1,3 +1,2 @@ #!/bin/bash python3 SE7K-proxy-tcp.py -c SE-MTR-3Y-400V-A.conf -