From 3933cd6e1e79386cf198afc34a5bd763f97ee4e1 Mon Sep 17 00:00:00 2001 From: kodonnell Date: Sat, 16 Jan 2021 18:57:24 +1300 Subject: [PATCH 01/10] progress --- mate3/api.py | 225 ++- mate3/devices.py | 13 +- mate3/main.py | 20 +- mate3/modbus_client.py | 6 + mate3/sunspec/fields.py | 344 ++-- mate3/sunspec/model_base.py | 7 +- mate3/sunspec/models.py | 2186 ++++++++++------------- mate3/sunspec/scripts/code_generator.py | 217 +-- 8 files changed, 1360 insertions(+), 1658 deletions(-) diff --git a/mate3/api.py b/mate3/api.py index e126501..8ffa032 100644 --- a/mate3/api.py +++ b/mate3/api.py @@ -1,14 +1,15 @@ from dataclasses import dataclass from datetime import datetime -from typing import List +from typing import Iterable, List from loguru import logger -from pymodbus.constants import Defaults +from pymodbus.constants import Defaults, Endian +from pymodbus.payload import BinaryPayloadDecoder from mate3.devices import DeviceValues from mate3.modbus_client import CachingModbusClient, ModbusTcpClient, NonCachingModbusClient from mate3.read import AllModelReads, ModelRead -from mate3.sunspec.fields import Field, Mode, Uint16Field, Uint32Field +from mate3.sunspec.fields import Field, FieldRead, Mode, Uint16Field, Uint32Field from mate3.sunspec.models import MODEL_DEVICE_IDS, SunSpecEndModel, SunSpecHeaderModel @@ -93,104 +94,85 @@ def devices(self) -> DeviceValues: raise RuntimeError("Can't access devices until after first read") return self._devices - def _get_reading_ranges(self, fields): - """ - Get the ranges of registers which can be read as a contiguous block, which allows for greater performance than - reading a single register at a time. - """ - - # The mate3s gets unhappy if one tries to read too much at once - max_range_size = 100 + def _read_contiguous_fields(self, address: int, fields: Iterable[Field]): + + # First, read the registers: + count = sum(f.size for f in fields) + registers = self._client.read_holding_registers(address=address, count=count) + read_time = datetime.now() + + # Now use the decoder to decode the fields: + decoder = BinaryPayloadDecoder.fromRegisters(registers=registers, byteorder=Endian.Big, wordorder=Endian.Big) + registers_pointer = 0 + for field in fields: + end_register_pointer = registers_pointer + field.size + field.last_read = FieldRead( + registers=registers[registers_pointer:end_register_pointer], + address=address + registers_pointer, + time=read_time, + ) - # Loop through fields in start order, finding contiguous blocks of registers: - ranges = [] - previous_range = None - for field in sorted(fields, key=lambda x: x.start): - if ( - previous_range is None - or previous_range.end != field.start - or previous_range.size + field.size >= max_range_size - ): - previous_range = ReadingRange(fields=[field], start=field.start, size=field.size) - ranges.append(previous_range) - else: - previous_range.extend(field) - return ranges + # Bump our register pointer forward + registers_pointer = end_register_pointer - def _read_model(self, device_address: int, first: bool, all_reads: AllModelReads): + def _read_model(self, device_address: int, first: bool): """ Read an individual model at `address`. Use `first` to specify that this is the first block - see comment below. By default reads everything in the model - use `only` to specify a list of Fields to read, if you want to limit. """ - # Read the first register for the device ID: registers = self._client.read_holding_registers(address=device_address, count=2) + decoder = BinaryPayloadDecoder.fromRegisters(registers, byteorder=Endian.Big, wordorder=Endian.Big) # If first, then this is the SunSpecHeaderModel, which has a device ID of Uint32 type not Uint16 like the rest. if first: - _, device_id = Uint32Field._from_registers(None, registers[:2]) + device_id = decoder.decode_32bit_uint() else: - # Don't use the Uint16Field parser as for the SunSpec end block the value is 65535, which is actually the - # 'not implemented' value, so None is returned. - device_id = registers[0] + device_id = decoder.decode_16bit_uint() if device_id not in MODEL_DEVICE_IDS: logger.warning(f"Unknown model type with device ID {device_id}") - return None, None + return None - model = MODEL_DEVICE_IDS[device_id] + # Instantiate the model: + model = MODEL_DEVICE_IDS[device_id]() # TODO: Make sure we don't read past the end of length (as reported by device). This shouldn't happen except in # e.g. a case where the (old) device model firmware returns only 10 fields, and then 'new' one (whatever we're # using in our spec) specifies 11, then we'd accidentally try to read one more. # Get the readable fields: - fields = [field for field in model.__model_fields__ if field.mode in (Mode.R, Mode.RW)] + fields = model.fields(modes=(Mode.R, Mode.RW)) - # Order fields by start registry, as this is the order in which we will receive the values - fields = sorted(fields, key=lambda f: f.start) + # Get the ranges of registers which can be read as a contiguous block, which allows for greater performance + # than reading a single register at a time. (NB: the fields aren't contiguous at the moment as we've ignored + # e.g. write-only fields.) The mate3s gets unhappy if one tries to read too much at once, so limit to no more + # than 100 registers read at once. + max_range_size = 100 + block_fields = [] + blocks = [] + block_size = 0 + for field in sorted(fields, key=lambda x: x.start): + if (not block_fields) or block_fields[-1].end != field.start or block_size + field.size >= max_range_size: + # OK, we're done with this batch, so create a new one: + block_fields = [field] + blocks.append(block_fields) + # Reset: + block_size = 0 + else: + block_fields.append(field) + block_size += field.size # Get registers in large ranges, as this drastically improves performance and isn't so demanding of the mate3 - model_reads = ModelRead() - for reading_range in self._get_reading_ranges(fields): - logger.debug( - f"Reading range {reading_range.start} -> {reading_range.end}, of {len(reading_range.fields)} fields" - ) - register_number = device_address + reading_range.start - 1 # -1 as starts are 1-indexed in fields - registers = self._client.read_holding_registers(address=register_number, count=reading_range.size) - read_time = datetime.now() - - offset = 0 - for field in reading_range.fields: - address = register_number + offset - try: - field_registers = registers[offset : offset + field.size] - if len(field_registers) != field.size: - raise RuntimeError( - "Didn't get the right number of registers from reading range for this field." - ) - implemented, raw_value = field.from_registers(field_registers) - model_reads.add( - field_name=field.name, - registers=field_registers, - raw_value=raw_value, - implemented=implemented, - address=address, - time=read_time, - ) - except Exception as e: - logger.warning(f"Error reading field {field.name} - so setting as not implemented. Message: {e}") - model_reads.add( - field_name=field.name, - registers=[], - raw_value=None, - implemented=False, - address=address, - time=read_time, - ) - offset += field.size - - return model, model_reads + for block_fields in blocks: + start_address = device_address + block_fields[0].start - 1 # -1 as starts are 1-indexed in fields + count = sum(f.size for f in fields) + logger.debug(f"Reading block of {len(block_fields)} fields from {start_address} (count={count})") + self._read_contiguous_fields(address=start_address, fields=block_fields) + + # TODO: scale factors + + return model def read_all(self): """ @@ -201,68 +183,69 @@ def read_all(self): register = self.sunspec_register max_models = 30 first = True - all_reads = AllModelReads() + models = [] + # all_reads = AllModelReads() for _ in range(max_models): - model, model_reads = self._read_model(register, first, all_reads) + model = self._read_model(register, first) first = False # Unknown device - if not model: + if model is None: continue # No more blocks to read - if model == SunSpecEndModel: + if isinstance(model, SunSpecEndModel): break - # Save the model reads for this model: - all_reads.add(model, model_reads) + # Save the model: + models.append(model) # Move register to next block - that is, add the length of the block, which is what follows after the length # field. For normal fields, we'll already have read 2 registers (DI and length) so we must add this to our # total increment. For the SunSpecHeaderModel, we need to add 4 as DID is a UInt32 in this case (i.e. 2 # registers) and there's a model ID field (1 register) and length (1 register) - register += model_reads["length"].raw_value + (4 if model == SunSpecHeaderModel else 2) + register += model.length.value + (4 if isinstance(model, SunSpecHeaderModel) else 2) # create devices if needed: if self._devices is None: self._devices = DeviceValues(client=self) # update: - self._devices.update(all_reads) - - def read_all_modbus_values_unparsed(self): - """ - This method just reads all of the values from the modbus devices, with no care about parsing them. All it - assumes is the standard structure of two registers (DID + length), except for the header. - """ - register = self.sunspec_register - max_models = 30 - first = True - reads = {} - for _ in range(max_models): - # Data starts generally at 3rd register, except for start (SunSpecHeaderModel) where it starts at 5th - data_offset = 4 if first else 2 - registers = self._client.read_holding_registers(address=register, count=data_offset) - # The length is the last register (i.e. the one before data) - _, length = Uint16Field._from_registers(None, registers[-1:]) - - # We're done when length == 0 i.e. SunSpecEndModel - if length == 0: - break - - # Now read everything (in maximum bunches of 100) - batch = 100 - for start_offset in range(0, length, batch): - count = min(batch, length - start_offset) - registers = self._client.read_holding_registers( - address=register + data_offset + start_offset, count=count - ) - addresses = [register + i for i in range(count)] - for addr, bites in zip(addresses, registers): - reads[addr] = bites - - # See comment in self.read re the increment of 2 or 4 - register += length + (4 if first else 2) - first = False - - return reads + self._devices.update(models) + + # def read_all_modbus_values_unparsed(self): + # """ + # This method just reads all of the values from the modbus devices, with no care about parsing them. All it + # assumes is the standard structure of two registers (DID + length), except for the header. + # """ + # register = self.sunspec_register + # max_models = 30 + # first = True + # reads = {} + # for _ in range(max_models): + # # Data starts generally at 3rd register, except for start (SunSpecHeaderModel) where it starts at 5th + # data_offset = 4 if first else 2 + # registers = self._client.read_holding_registers(address=register, count=data_offset) + # # The length is the last register (i.e. the one before data) + # _, length = Uint16Field._from_registers(None, registers[-1:]) + + # # We're done when length == 0 i.e. SunSpecEndModel + # if length == 0: + # break + + # # Now read everything (in maximum bunches of 100) + # batch = 100 + # for start_offset in range(0, length, batch): + # count = min(batch, length - start_offset) + # registers = self._client.read_holding_registers( + # address=register + data_offset + start_offset, count=count + # ) + # addresses = [register + i for i in range(count)] + # for addr, bites in zip(addresses, registers): + # reads[addr] = bites + + # # See comment in self.read re the increment of 2 or 4 + # register += length + (4 if first else 2) + # first = False + + # return reads diff --git a/mate3/devices.py b/mate3/devices.py index 0b9374c..4e70e4d 100644 --- a/mate3/devices.py +++ b/mate3/devices.py @@ -1,5 +1,5 @@ import dataclasses as dc -from typing import Dict, Iterable, Optional +from typing import Dict, Iterable, List, Optional from loguru import logger @@ -184,10 +184,13 @@ def split_phase_radian_inverter(self) -> SplitPhaseRadianInverterDeviceValues: """ return self._get_single_device("split_phase_radian_inverter") - def update(self, all_reads: AllModelReads) -> None: - """ - This is the key method, and is used to update the state of the devices with new values. - """ + def update(self, models: List[Model]) -> None: + + for model in models: + if isinstance(model, OutBackModel): + self.mate3s[None] = model + + return # Update mate: self._update_model_and_config( diff --git a/mate3/main.py b/mate3/main.py index 3f379ea..4dce9e4 100644 --- a/mate3/main.py +++ b/mate3/main.py @@ -25,16 +25,16 @@ def read(client, args): # values: print("\t" + " | ".join(["name".ljust(50), "impl", "sf", "unscaled", "value".ljust(20)])) print("\t" + " | ".join(["-" * 50, "----", "--", "--------", "-" * 20])) - for value in device.fields([Mode.R, Mode.RW]): - ss = [f"\t{value.field.name.ljust(50)}"] - ss.append("Y".rjust(4) if value.implemented else "N".rjust(4)) - if value.scale_factor is not None: - ss.append(f"{value.scale_factor.value}".rjust(2)) - ss.append(f"{value.raw_value}".rjust(8)) - else: - ss.append(" -") - ss.append(" " * 7 + "-") - ss.append(f"{repr(value.value)}".ljust(20) if value.implemented else "-".ljust(20)) + for field in device.fields([Mode.R, Mode.RW]): + ss = [f"\t{field.name.ljust(50)}"] + ss.append("Y".rjust(4) if field.implemented else "N".rjust(4)) + # if field.scale_factor is not None: + # ss.append(f"{value.scale_factor.value}".rjust(2)) + # ss.append(f"{value.raw_value}".rjust(8)) + # else: + ss.append(" -") + ss.append(" " * 7 + "-") + ss.append(f"{repr(field.value)}".ljust(20) if field.implemented else "-".ljust(20)) print(" | ".join(ss)) print() diff --git a/mate3/modbus_client.py b/mate3/modbus_client.py index 4167faa..af247f6 100644 --- a/mate3/modbus_client.py +++ b/mate3/modbus_client.py @@ -1,9 +1,15 @@ import json +from datetime import datetime from hashlib import md5 from pathlib import Path +from typing import Iterable from loguru import logger from pymodbus.client.sync import ModbusTcpClient +from pymodbus.constants import Endian +from pymodbus.payload import BinaryPayloadDecoder + +from mate3.sunspec.fields import Field, FieldRead class NonCachingModbusClient(ModbusTcpClient): diff --git a/mate3/sunspec/fields.py b/mate3/sunspec/fields.py index bbc8421..769e940 100644 --- a/mate3/sunspec/fields.py +++ b/mate3/sunspec/fields.py @@ -2,8 +2,14 @@ import socket import struct from abc import ABCMeta, abstractmethod +from datetime import datetime from enum import Enum, IntFlag -from typing import Optional +from functools import wraps +from typing import Any, Optional, Tuple +from uuid import uuid4 + +from pymodbus.constants import Endian +from pymodbus.payload import BinaryPayloadBuilder, BinaryPayloadDecoder class Mode(Enum): @@ -13,155 +19,235 @@ class Mode(Enum): @dc.dataclass -class Field(metaclass=ABCMeta): - """ - A Field is a representation of a field on a SunSpec model, with nice utilities such as converting to/from the - underlying registers. - """ +class FieldRead: + address: int + time: datetime + registers: Tuple[int] + guid: int = dc.field(default_factory=lambda: uuid4().int) + + +def has_been_read(f): + @wraps(f) + def wrapper(self, *args, **kwargs): + if self._last_read is None: + raise RuntimeError(f"{f} can only be called after field {self.name} has been read") + return f(self, *args, **kwargs) + + return wrapper - name: str - start: int - size: int - mode: Mode - description: Optional[str] = None + +class Field(metaclass=ABCMeta): + def __init__(self, name: str, start: int, size: int, mode: Mode, description: Optional[str] = None): + self.name = name + self.start = start + self.size = size + self.mode = mode + self.description = description + + # Internal state (all None until read) + self._last_read: Optional[FieldRead] = None + self._value = None + self._implemented = None @property def end(self): return self.start + self.size - def from_registers(self, registers): + @property + def last_read(self): + return self._last_read + + @last_read.setter + def last_read(self, read: FieldRead): + self._last_read = read + + @property + @has_been_read + def value(self): """ - Decode registers into the actual value. + OK, we get a bit clever here in that we only decode fields lazily. This is for two reasons - firstly, it can + save decoding everything on the first run (when you're getting devices etc.) and secondly it resolves some + inter-field dependency (e.g. to read a scaled field we first need to read the scale factor ... and you say we + could do that, but reading sequential fields can be nicer for the mate3) """ if self.mode not in (Mode.R, Mode.RW): - raise RuntimeError("Can't read from a write-only field!") - if not all(isinstance(i, int) for i in registers): - raise ValueError("Registers should be an iterable of ints!") - if len(registers) != self.size: - raise ValueError(f"Expected {self.size} registers!") - return self._from_registers(registers) - - def to_registers(self, value): - """ - Encode a value into registers. - """ - if self.mode not in (Mode.W, Mode.RW): - raise RuntimeError("Can't write to a read-only field!") - registers = self._to_registers(value) - if len(registers) != self.size: - raise ValueError(f"Expected {self.size} registers!") - return registers + raise RuntimeError("Can't read from this field!") + if not self.implemented: + return None + decoder = BinaryPayloadDecoder.fromRegisters( + registers=self._last_read.registers, byteorder=Endian.Big, wordorder=Endian.Big + ) + + return self.decode_from_registers(decoder) @abstractmethod - def _from_registers(self, registers): - """ - Method to override that actually does the conversion, sans checks. - """ + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Any: pass @abstractmethod - def _to_registers(self, value): - """ - Method to override that actually does the conversion, sans checks. - """ + def encode_to_payload(self, value: Any, encoder: BinaryPayloadBuilder): pass + @property + def implemented(self) -> bool: + return self._implemented + -@dc.dataclass class IntegerField(Field): """ And IntegerField will have an integer value, and optionally has units and a scale factor. """ - units: Optional[str] = None - scale_factor: Optional[Field] = None # TODO: should be IntegerField but can't refer to itself in definition ... + def __init__(self, *args, units: Optional[str] = None, **kwargs): + self.units = units + super().__init__(*args, **kwargs) + @property + @abstractmethod + def _modbus_decode_type(self) -> str: + """ + Something like '8bit_int' + """ + pass -@dc.dataclass -class Uint16Field(IntegerField): - def _from_registers(self, registers): - val = registers[0] - if val == 0xFFFF: - # As per sunspec, this is "not implemented" - return False, None - return True, val + @property + @abstractmethod + def _not_implemented_value(self) -> Any: + """ + E.g. -0x8000 for Int16 + """ + pass - def _to_registers(self, value): + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> int: + return getattr(decoder, "decode_" + self._modbus_decode_type)() + + def encode_to_payload(self, value: int, encoder: BinaryPayloadBuilder): if not isinstance(value, int): - raise ValueError("Expected an integer!") - if value < 0 or value > 0xFFFF - 1: - raise ValueError("int16 must be between 0 and 0xffff - 1") - return (value,) + raise TypeError("value needs to be an int!") + return getattr(encoder, "add_" + self._modbus_decode_type)(value) + @property + def implemented(self) -> bool: + return self.value != self._not_implemented_value -@dc.dataclass -class Int16Field(IntegerField): - """ - Note that values are stored in twos-compliment for 16 bits in modbus registers so e.g. the value -1 will be stored - as 65535. However, python will happily read this in as 65535, so we need to convert back to -1. Turns out the - easiest way is using the fixedint package, and just calling `int(Int16(65535))` which gives -1. Likewise when we - want to write we've got to go from -1 tp 65535 - you can just call `int(UInt16(-1))` as UInt16 casts the Python - internal twos-complement representation into 16 bits, which is just what we want. It seems to work, but yeh, it's - mostly 'cos it's less confusing than bit manipulation. - """ - def _from_registers(self, registers): - val = registers[0] - if val == 0x8000: - # As per sunspec, this is "not implemented" - return False, None - return True, int.from_bytes(val.to_bytes(2, byteorder="little", signed=False), byteorder="little", signed=True) +class Uint16Field(IntegerField): + _modbus_decode_type = "16bit_uint" + _not_implemented_value = 0xFFFF - def _to_registers(self, value): - if not isinstance(value, int): - raise ValueError("Expected an integer!") - if value < -0x7FFF or value > 0x7FFF: - raise ValueError("int16 must be between -+0x7fff") - return (int.from_bytes(value.to_bytes(2, "little", signed=True), byteorder="little", signed=False),) + +class Int16Field(IntegerField): + _modbus_decode_type = "16bit_int" + # 0x8000 is the not-implemented value before decoding, as per spec, which is -0x8000 after decoding: + _not_implemented_value = -0x8000 -@dc.dataclass class Uint32Field(IntegerField): - def _from_registers(self, registers): - val = (registers[0] << 16) | registers[1] - if val == 0xFFFFFFFF: - # As per sunspec, this is "not implemented" - return False, None - return True, val + _modbus_decode_type = "32bit_uint" + _not_implemented_value = 0xFFFFFFFF - def _to_registers(self, value): - if not isinstance(value, int): - raise ValueError("Expected an integer!") - if value < 0 or value > 0xFFFFFFFF - 1: - raise ValueError("int16 must be between 0 and 0xffffffff-1") - return (value >> 16, value & 0xFFFF) + +class Int32Field(IntegerField): + _modbus_decode_type = "32bit_int" + # 0x80000000 is the not-implement value before decoding, as per spec, which is -0x80000000 after decoding: + # TODO: check this! + _not_implemented_value = -0x80000000 + + +class FloatField(IntegerField): + def __init__( + self, + *args, + scale_factor: int, + **kwargs, + ): + if not isinstance(scale_factor, int): + raise TypeError("scale_factor should be an int!") + self._scale_factor = scale_factor + super().__init__(*args, **kwargs) + + @property + def scale_factor(self) -> Optional[int]: + return self._scale_factor + + def _check_scale_factor(self): + if not self._scale_factor.implemented: + raise RuntimeError(f"Scale factor {self._scale_factor} should be implemented.") + if self._scale_factor.scale_factor is not None: + raise RuntimeError(f"Scale factor {self._scale_factor} shouldn't have it's own scale factor!") + if self._scale_factor.value is None: + raise RuntimeError(f"Scale factor {self._scale_factor} should not be None.") + sf = self.scale_factor.value + if not isinstance(sf, int): + raise RuntimeError(f"Scale factor {self._scale_factor} should be an integer.") + if sf < -10 or sf > 10: + raise RuntimeError(f"Scale factor {self._scale_factor} should be between -10 and 10.") + return sf + + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> float: + + # First get our scale factor: + sf = self._check_scale_factor() + + # Sweet. Now get the integer value and scale it: + value = super().decode_from_registers(decoder) + value *= 10 ** sf + # Round it to what it should be after scaling: + return round(value, -sf if sf < 0 else 0) + + def encode_to_payload(self, value: float, encoder: BinaryPayloadBuilder) -> None: + if not isinstance(value, float): + raise TypeError("value must be a Float") + + # Get our scale factor: + sf = self._check_scale_factor() + + # Raise to the right power: + scaled_value = value / (10 ** sf) + # Round it to what it should be after scaling: + # TODO: raise error if too many digits specified + scaled_value = int(round(scaled_value, 0)) + + return super().encode_to_payload(value, encoder) + + +class FloatInt16Field(FloatField, Int16Field): + pass + + +class FloatInt32Field(FloatField, Int32Field): + pass + + +class FloatUint16Field(FloatField, Uint16Field): + pass + + +class FloatUint32Field(FloatField, Uint32Field): + pass -@dc.dataclass class StringField(Field): - def _from_registers(self, registers): - # As per sunspec, if all registers are 0, then not implemented: - if all(i == 0 for i in registers): - return False, None - int8s = [] - for i in registers: - int8s.append(i >> 8) - int8s.append(i & 255) - chars = map(chr, int8s) - return True, "".join(chars).strip("\0") + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> str: + bites = decoder.decode_string(size=self.size * 2) # Size * 2 as size is in 16 bit units, i.e. 2 bytes. + return bites.rstrip(b"\x00") - def _to_registers(self, value): + @property + @has_been_read + def implemented(self) -> bool: + return self.last_read.value != "\x00" * self.size * 2 + + def encode_to_payload(self, value: str, encoder: BinaryPayloadBuilder): if not isinstance(value, str): raise ValueError("Expected str!") if len(value) > self.size * 2: raise ValueError(f"String must be less than {self.size * 2} characters") # Pad with "\0" if needed: value = value.ljust(self.size * 2, "\0") - int8s = [ord(i) for i in value] - int16s = [] - for i in range(self.size): - int16s.append((int8s[i * 2] << 8) | int8s[i * 2 + 1]) - return tuple(int16s) + # Encode to ascii: + value = value.encode("ascii") + # Finally, do it: + return encoder.add_string(value) class BitfieldMixin: @@ -170,6 +256,10 @@ class BitfieldMixin: "on" and "off", unfortunately. """ + def __init__(self, *args, flags: IntFlag, **kwargs): + self.flags = flags + super().__init__(*args, **kwargs) + def _get_flags(self, value, mx, not_implemented): # TODO: as per spec ... "if the most significant bit in a bitfield is set, all other bits shall be ignored" if value == not_implemented: @@ -185,15 +275,12 @@ def _set_flags(self, flags): return flags.value -@dc.dataclass class Bit16Field(BitfieldMixin, Uint16Field): """ The actual IntFlags are in the flags attr, and this is a basic wrapper that e.g. checks the value is implemented before using the flags, etc. """ - flags: IntFlag = None # None isn't possible - just need it for dataclass since there are defaults already defined - def _from_registers(self, registers): implemented, value = super()._from_registers(registers) if not implemented: @@ -205,7 +292,6 @@ def _to_registers(self, flags): return super()._to_registers(value) -@dc.dataclass class Bit32Field(BitfieldMixin, Uint32Field): """ The actual IntFlags are in the flags attr, and this is a basic wrapper that e.g. checks the value is implemented @@ -215,13 +301,11 @@ class Bit32Field(BitfieldMixin, Uint32Field): be a bit16 for now ... """ - flags: IntFlag = None # None isn't possible - just need it for dataclass since there are defaults already defined - def _from_registers(self, registers): implemented, value = super()._from_registers(registers) if not implemented: return False, None - return self._get_flags(value, mx=0x7FFF, not_implemented=0xFFFF) + return self._get_flags(value, mx=0x7FFFFFFF, not_implemented=0xFFFFFFFF) def _to_registers(self, flags): value = self._set_flags(flags) @@ -229,6 +313,10 @@ def _to_registers(self, flags): class EnumMixin: + def __init__(self, *args, options: Enum, **kwargs): + self.options = options + super().__init__(*args, **kwargs) + def _get_option(self, val): if val is None: return None @@ -250,29 +338,27 @@ def _to_registers(self, value): return super()._to_registers(value) -@dc.dataclass class EnumUint16Field(EnumMixin, Uint16Field): - options: Enum = None # None isn't possible - just need it for dataclass since there are defaults defined in parents + pass -@dc.dataclass class EnumInt16Field(EnumMixin, Int16Field): - options: Enum = None # None isn't possible - just need it for dataclass since there are defaults defined in parents + pass -@dc.dataclass -class AddressField(Field): - def _from_registers(self, registers): - val = (registers[0] << 16) | registers[1] - if val == 0: - # As per spec, this isn't implemented - return False, None - return True, socket.inet_ntoa(struct.pack("!I", val)) +class AddressField(Uint32Field): + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> str: + uint32 = super().decode_from_registers(decoder) + return socket.inet_ntoa(struct.pack("!I", uint32)) - def _to_registers(self, value): - bites = socket.inet_aton(value) - num = struct.unpack("!I", bites)[0] - return (num >> 16, num & 0xFFFF) + @property + @has_been_read + def implemented(self) -> bool: + # Not implemented if raw value is 0, which equates to 0.0.0.0 when inet_ntoa'd + return self._last_read.value != "0.0.0.0" + + # def encode_to_payload(self, value: int, encoder: BinaryPayloadBuilder): + # return getattr(encoder, "add_" + self._modbus_decode_type)(value) class DescribedIntFlag(IntFlag): diff --git a/mate3/sunspec/model_base.py b/mate3/sunspec/model_base.py index 436c77a..5875463 100644 --- a/mate3/sunspec/model_base.py +++ b/mate3/sunspec/model_base.py @@ -1,6 +1,6 @@ from typing import Iterable, Optional -from mate3.sunspec.fields import Mode +from mate3.sunspec.fields import Field, Mode class Model: @@ -8,13 +8,12 @@ class Model: Base model for Sunspec models - which are really just containers for Fields. """ - @classmethod - def fields(cls, modes: Optional[Iterable[Mode]] = None): + def fields(self, modes: Optional[Iterable[Mode]] = None) -> Iterable[Field]: """ Often we want to loop through all the fields for a model - ignoring those that aren't 'real' fields such as _address above, or the 'config' field that often gets added when a device has the 'realtime' and 'config' models. """ - for field in cls.__model_fields__: + for field in vars(self).values(): if modes is None or field.mode in modes: yield field diff --git a/mate3/sunspec/models.py b/mate3/sunspec/models.py index dc19902..e354f7f 100644 --- a/mate3/sunspec/models.py +++ b/mate3/sunspec/models.py @@ -8,6 +8,9 @@ Int16Field, Uint16Field, Uint32Field, + FloatInt16Field, + FloatUint16Field, + FloatUint32Field, EnumUint16Field, EnumInt16Field, Bit16Field, @@ -201,1322 +204,975 @@ class OutBackUpdateDeviceFirmwarePortFlags(DescribedIntFlag): class SunSpecHeaderModel(Model): - did: Uint32Field = Uint32Field("did", 1, 2, Mode.R) - model_id: Uint16Field = Uint16Field("model_id", 3, 1, Mode.R) - length: Uint16Field = Uint16Field("length", 4, 1, Mode.R) - manufacturer: StringField = StringField("manufacturer", 5, 16, Mode.R) - model: StringField = StringField("model", 21, 16, Mode.R) - options: StringField = StringField("options", 37, 8, Mode.R) - version: StringField = StringField("version", 45, 8, Mode.R) - serial_number: StringField = StringField("serial_number", 53, 16, Mode.R) - - -SunSpecHeaderModel.__model_fields__ = [SunSpecHeaderModel.did, SunSpecHeaderModel.model_id, SunSpecHeaderModel.length, SunSpecHeaderModel.manufacturer, SunSpecHeaderModel.model, SunSpecHeaderModel.options, SunSpecHeaderModel.version, SunSpecHeaderModel.serial_number] + def __init__(self): + self.did: Uint32Field = Uint32Field("did", 1, 2, Mode.R) + self.model_id: Uint16Field = Uint16Field("model_id", 3, 1, Mode.R) + self.length: Uint16Field = Uint16Field("length", 4, 1, Mode.R) + self.manufacturer: StringField = StringField("manufacturer", 5, 16, Mode.R) + self.model: StringField = StringField("model", 21, 16, Mode.R) + self.options: StringField = StringField("options", 37, 8, Mode.R) + self.version: StringField = StringField("version", 45, 8, Mode.R) + self.serial_number: StringField = StringField("serial_number", 53, 16, Mode.R) class SunSpecEndModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Should be 65535") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Should be 0") - - -SunSpecEndModel.__model_fields__ = [SunSpecEndModel.did, SunSpecEndModel.length] + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Should be 65535") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Should be 0") class SunSpecCommonModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Common Model block") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - manufacturer: StringField = StringField("manufacturer", 3, 16, Mode.R) - model: StringField = StringField("model", 19, 16, Mode.R) - options: StringField = StringField("options", 35, 8, Mode.R) - version: StringField = StringField("version", 43, 8, Mode.R) - serial_number: StringField = StringField("serial_number", 51, 16, Mode.R) - device_address: Uint16Field = Uint16Field("device_address", 67, 1, Mode.RW) - - -SunSpecCommonModel.__model_fields__ = [SunSpecCommonModel.did, SunSpecCommonModel.length, SunSpecCommonModel.manufacturer, SunSpecCommonModel.model, SunSpecCommonModel.options, SunSpecCommonModel.version, SunSpecCommonModel.serial_number, SunSpecCommonModel.device_address] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Common Model block") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.manufacturer: StringField = StringField("manufacturer", 3, 16, Mode.R) + self.model: StringField = StringField("model", 19, 16, Mode.R) + self.options: StringField = StringField("options", 35, 8, Mode.R) + self.version: StringField = StringField("version", 43, 8, Mode.R) + self.serial_number: StringField = StringField("serial_number", 51, 16, Mode.R) + self.device_address: Uint16Field = Uint16Field("device_address", 67, 1, Mode.RW) class SunSpecInverterSinglePhaseModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Single Phase Inverter") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of model block", units="Registers") - ac_current: Uint16Field = Uint16Field("ac_current", 3, 1, Mode.R, description="AC Total Current value", units="Amps") - ac_current_a: Uint16Field = Uint16Field("ac_current_a", 4, 1, Mode.R, description="AC Phase-A Current value", units="Amps") - ac_current_b: Uint16Field = Uint16Field("ac_current_b", 5, 1, Mode.R, description="AC Phase-B Current value", units="Amps") - ac_current_c: Uint16Field = Uint16Field("ac_current_c", 6, 1, Mode.R, description="AC Phase-C Current value", units="Amps") - ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 7, 1, Mode.R, description="AC Current Scale factor", units="SF") - ac_voltage_ab: Uint16Field = Uint16Field("ac_voltage_ab", 8, 1, Mode.R, description="AC Voltage Phase-AB value", units="Volts") - ac_voltage_bc: Uint16Field = Uint16Field("ac_voltage_bc", 9, 1, Mode.R, description="AC Voltage Phase BC value", units="Volts") - ac_voltage_ca: Uint16Field = Uint16Field("ac_voltage_ca", 10, 1, Mode.R, description="AC Voltage Phase CA value", units="Volts") - ac_voltage_an: Uint16Field = Uint16Field("ac_voltage_an", 11, 1, Mode.R, description="AC Voltage Phase-A-to-neutral value", units="Volts") - ac_voltage_bn: Uint16Field = Uint16Field("ac_voltage_bn", 12, 1, Mode.R, description="AC Voltage Phase B-to-neutral value", units="Volts") - ac_voltage_cn: Uint16Field = Uint16Field("ac_voltage_cn", 13, 1, Mode.R, description="AC Voltage Phase C-to-neutral value", units="Volts") - ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 14, 1, Mode.R, description="AC Voltage Scale factor", units="SF") - ac_power: Int16Field = Int16Field("ac_power", 15, 1, Mode.R, description="AC Power value", units="Watts") - ac_power_scale_factor: Int16Field = Int16Field("ac_power_scale_factor", 16, 1, Mode.R, description="AC Power Scale factor", units="SF") - ac_frequency: Uint16Field = Uint16Field("ac_frequency", 17, 1, Mode.R, description="AC Frequency value", units="Hertz") - ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 18, 1, Mode.R, description="Scale factor", units="SF") - ac_va: Int16Field = Int16Field("ac_va", 19, 1, Mode.R, description="Apparent Power", units="VA") - ac_va_scale_factor: Int16Field = Int16Field("ac_va_scale_factor", 20, 1, Mode.R, description="Scale factor", units="SF") - ac_var: Int16Field = Int16Field("ac_var", 21, 1, Mode.R, description="Reactive Power", units="VAR") - ac_var_scale_factor: Int16Field = Int16Field("ac_var_scale_factor", 22, 1, Mode.R, description="Scale factor", units="SF") - ac_pf: Int16Field = Int16Field("ac_pf", 23, 1, Mode.R, description="Power Factor") - ac_pf_scale_factor: Int16Field = Int16Field("ac_pf_scale_factor", 24, 1, Mode.R, description="Scale factor", units="SF") - ac_energy_wh: Uint32Field = Uint32Field("ac_energy_wh", 25, 2, Mode.R, description="AC Lifetime Energy production", units="WattHours") - ac_energy_wh_scale_factor: Uint16Field = Uint16Field("ac_energy_wh_scale_factor", 27, 1, Mode.R, description="AC Lifetime Energy production scale factor", units="SF") - dc_current: Uint16Field = Uint16Field("dc_current", 28, 1, Mode.R, description="DC Current value", units="Amps") - dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 29, 1, Mode.R, description="Scale factor", units="SF") - dc_voltage: Uint16Field = Uint16Field("dc_voltage", 30, 1, Mode.R, description="DC Voltage value", units="Volts") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 31, 1, Mode.R, description="Scale factor", units="SF") - dc_power: Int16Field = Int16Field("dc_power", 32, 1, Mode.R, description="DC Power value", units="Watts") - dc_power_scale_factor: Int16Field = Int16Field("dc_power_scale_factor", 33, 1, Mode.R, description="Scale factor", units="SF") - temp_cab: Int16Field = Int16Field("temp_cab", 34, 1, Mode.R, description="Cabinet Temperature", units="Degrees C") - temp_sink: Int16Field = Int16Field("temp_sink", 35, 1, Mode.R, description="Coolant or Heat Sink Temperature", units="Degrees C") - temp_trans: Int16Field = Int16Field("temp_trans", 36, 1, Mode.R, description="Transformer Temperature", units="Degrees C") - temp_other: Int16Field = Int16Field("temp_other", 37, 1, Mode.R, description="Other Temperature", units="Degrees C") - temp_scale_factor: Int16Field = Int16Field("temp_scale_factor", 38, 1, Mode.R, description="Scale factor", units="SF") - status: Uint16Field = Uint16Field("status", 39, 1, Mode.R, description="Operating State", units="Enumerated") - status_vendor: Uint16Field = Uint16Field("status_vendor", 40, 1, Mode.R, description="Vendor Defined Operating State", units="Enumerated") - event_1: Bit32Field = Bit32Field("event_1", 41, 2, Mode.R, description="Event Flags (bits 0-31)", flags=IEvent1Flags) - - -SunSpecInverterSinglePhaseModel.ac_current.scale_factor = SunSpecInverterSinglePhaseModel.ac_current_scale_factor -SunSpecInverterSinglePhaseModel.ac_current_a.scale_factor = SunSpecInverterSinglePhaseModel.ac_current_scale_factor -SunSpecInverterSinglePhaseModel.ac_current_b.scale_factor = SunSpecInverterSinglePhaseModel.ac_current_scale_factor -SunSpecInverterSinglePhaseModel.ac_current_c.scale_factor = SunSpecInverterSinglePhaseModel.ac_current_scale_factor -SunSpecInverterSinglePhaseModel.ac_voltage_ab.scale_factor = SunSpecInverterSinglePhaseModel.ac_voltage_scale_factor -SunSpecInverterSinglePhaseModel.ac_voltage_bc.scale_factor = SunSpecInverterSinglePhaseModel.ac_voltage_scale_factor -SunSpecInverterSinglePhaseModel.ac_voltage_ca.scale_factor = SunSpecInverterSinglePhaseModel.ac_voltage_scale_factor -SunSpecInverterSinglePhaseModel.ac_voltage_an.scale_factor = SunSpecInverterSinglePhaseModel.ac_voltage_scale_factor -SunSpecInverterSinglePhaseModel.ac_voltage_bn.scale_factor = SunSpecInverterSinglePhaseModel.ac_voltage_scale_factor -SunSpecInverterSinglePhaseModel.ac_voltage_cn.scale_factor = SunSpecInverterSinglePhaseModel.ac_voltage_scale_factor -SunSpecInverterSinglePhaseModel.ac_power.scale_factor = SunSpecInverterSinglePhaseModel.ac_power_scale_factor -SunSpecInverterSinglePhaseModel.ac_frequency.scale_factor = SunSpecInverterSinglePhaseModel.ac_frequency_scale_factor -SunSpecInverterSinglePhaseModel.ac_va.scale_factor = SunSpecInverterSinglePhaseModel.ac_va_scale_factor -SunSpecInverterSinglePhaseModel.ac_var.scale_factor = SunSpecInverterSinglePhaseModel.ac_var_scale_factor -SunSpecInverterSinglePhaseModel.ac_pf.scale_factor = SunSpecInverterSinglePhaseModel.ac_pf_scale_factor -SunSpecInverterSinglePhaseModel.ac_energy_wh.scale_factor = SunSpecInverterSinglePhaseModel.ac_energy_wh_scale_factor -SunSpecInverterSinglePhaseModel.dc_current.scale_factor = SunSpecInverterSinglePhaseModel.dc_current_scale_factor -SunSpecInverterSinglePhaseModel.dc_voltage.scale_factor = SunSpecInverterSinglePhaseModel.dc_voltage_scale_factor -SunSpecInverterSinglePhaseModel.dc_power.scale_factor = SunSpecInverterSinglePhaseModel.dc_power_scale_factor -SunSpecInverterSinglePhaseModel.temp_cab.scale_factor = SunSpecInverterSinglePhaseModel.temp_scale_factor -SunSpecInverterSinglePhaseModel.temp_sink.scale_factor = SunSpecInverterSinglePhaseModel.temp_scale_factor -SunSpecInverterSinglePhaseModel.temp_trans.scale_factor = SunSpecInverterSinglePhaseModel.temp_scale_factor -SunSpecInverterSinglePhaseModel.temp_other.scale_factor = SunSpecInverterSinglePhaseModel.temp_scale_factor -SunSpecInverterSinglePhaseModel.__model_fields__ = [SunSpecInverterSinglePhaseModel.did, SunSpecInverterSinglePhaseModel.length, SunSpecInverterSinglePhaseModel.ac_current, SunSpecInverterSinglePhaseModel.ac_current_a, SunSpecInverterSinglePhaseModel.ac_current_b, SunSpecInverterSinglePhaseModel.ac_current_c, SunSpecInverterSinglePhaseModel.ac_current_scale_factor, SunSpecInverterSinglePhaseModel.ac_voltage_ab, SunSpecInverterSinglePhaseModel.ac_voltage_bc, SunSpecInverterSinglePhaseModel.ac_voltage_ca, SunSpecInverterSinglePhaseModel.ac_voltage_an, SunSpecInverterSinglePhaseModel.ac_voltage_bn, SunSpecInverterSinglePhaseModel.ac_voltage_cn, SunSpecInverterSinglePhaseModel.ac_voltage_scale_factor, SunSpecInverterSinglePhaseModel.ac_power, SunSpecInverterSinglePhaseModel.ac_power_scale_factor, SunSpecInverterSinglePhaseModel.ac_frequency, SunSpecInverterSinglePhaseModel.ac_frequency_scale_factor, SunSpecInverterSinglePhaseModel.ac_va, SunSpecInverterSinglePhaseModel.ac_va_scale_factor, SunSpecInverterSinglePhaseModel.ac_var, SunSpecInverterSinglePhaseModel.ac_var_scale_factor, SunSpecInverterSinglePhaseModel.ac_pf, SunSpecInverterSinglePhaseModel.ac_pf_scale_factor, SunSpecInverterSinglePhaseModel.ac_energy_wh, SunSpecInverterSinglePhaseModel.ac_energy_wh_scale_factor, SunSpecInverterSinglePhaseModel.dc_current, SunSpecInverterSinglePhaseModel.dc_current_scale_factor, SunSpecInverterSinglePhaseModel.dc_voltage, SunSpecInverterSinglePhaseModel.dc_voltage_scale_factor, SunSpecInverterSinglePhaseModel.dc_power, SunSpecInverterSinglePhaseModel.dc_power_scale_factor, SunSpecInverterSinglePhaseModel.temp_cab, SunSpecInverterSinglePhaseModel.temp_sink, SunSpecInverterSinglePhaseModel.temp_trans, SunSpecInverterSinglePhaseModel.temp_other, SunSpecInverterSinglePhaseModel.temp_scale_factor, SunSpecInverterSinglePhaseModel.status, SunSpecInverterSinglePhaseModel.status_vendor, SunSpecInverterSinglePhaseModel.event_1] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Single Phase Inverter") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of model block") + self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 7, 1, Mode.R, units="SF", description="AC Current Scale factor") + self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 14, 1, Mode.R, units="SF", description="AC Voltage Scale factor") + self.ac_power_scale_factor: Int16Field = Int16Field("ac_power_scale_factor", 16, 1, Mode.R, units="SF", description="AC Power Scale factor") + self.ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 18, 1, Mode.R, units="SF", description="Scale factor") + self.ac_va_scale_factor: Int16Field = Int16Field("ac_va_scale_factor", 20, 1, Mode.R, units="SF", description="Scale factor") + self.ac_var_scale_factor: Int16Field = Int16Field("ac_var_scale_factor", 22, 1, Mode.R, units="SF", description="Scale factor") + self.ac_pf_scale_factor: Int16Field = Int16Field("ac_pf_scale_factor", 24, 1, Mode.R, units="SF", description="Scale factor") + self.ac_energy_wh_scale_factor: Uint16Field = Uint16Field("ac_energy_wh_scale_factor", 27, 1, Mode.R, units="SF", description="AC Lifetime Energy production scale factor") + self.dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 29, 1, Mode.R, units="SF", description="Scale factor") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 31, 1, Mode.R, units="SF", description="Scale factor") + self.dc_power_scale_factor: Int16Field = Int16Field("dc_power_scale_factor", 33, 1, Mode.R, units="SF", description="Scale factor") + self.temp_scale_factor: Int16Field = Int16Field("temp_scale_factor", 38, 1, Mode.R, units="SF", description="Scale factor") + self.status: Uint16Field = Uint16Field("status", 39, 1, Mode.R, units="Enumerated", description="Operating State") + self.status_vendor: Uint16Field = Uint16Field("status_vendor", 40, 1, Mode.R, units="Enumerated", description="Vendor Defined Operating State") + self.event_1: Bit32Field = Bit32Field("event_1", 41, 2, Mode.R, flags=IEvent1Flags, description="Event Flags (bits 0-31)") + self.ac_current: FloatUint16Field = FloatUint16Field("ac_current", 3, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Total Current value") + self.ac_current_a: FloatUint16Field = FloatUint16Field("ac_current_a", 4, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Phase-A Current value") + self.ac_current_b: FloatUint16Field = FloatUint16Field("ac_current_b", 5, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Phase-B Current value") + self.ac_current_c: FloatUint16Field = FloatUint16Field("ac_current_c", 6, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Phase-C Current value") + self.ac_voltage_ab: FloatUint16Field = FloatUint16Field("ac_voltage_ab", 8, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase-AB value") + self.ac_voltage_bc: FloatUint16Field = FloatUint16Field("ac_voltage_bc", 9, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase BC value") + self.ac_voltage_ca: FloatUint16Field = FloatUint16Field("ac_voltage_ca", 10, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase CA value") + self.ac_voltage_an: FloatUint16Field = FloatUint16Field("ac_voltage_an", 11, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase-A-to-neutral value") + self.ac_voltage_bn: FloatUint16Field = FloatUint16Field("ac_voltage_bn", 12, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase B-to-neutral value") + self.ac_voltage_cn: FloatUint16Field = FloatUint16Field("ac_voltage_cn", 13, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase C-to-neutral value") + self.ac_power: FloatInt16Field = FloatInt16Field("ac_power", 15, 1, Mode.R, units="Watts", scale_factor=self.ac_power_scale_factor, description="AC Power value") + self.ac_frequency: FloatUint16Field = FloatUint16Field("ac_frequency", 17, 1, Mode.R, units="Hertz", scale_factor=self.ac_frequency_scale_factor, description="AC Frequency value") + self.ac_va: FloatInt16Field = FloatInt16Field("ac_va", 19, 1, Mode.R, units="VA", scale_factor=self.ac_va_scale_factor, description="Apparent Power") + self.ac_var: FloatInt16Field = FloatInt16Field("ac_var", 21, 1, Mode.R, units="VAR", scale_factor=self.ac_var_scale_factor, description="Reactive Power") + self.ac_pf: FloatInt16Field = FloatInt16Field("ac_pf", 23, 1, Mode.R, scale_factor=self.ac_pf_scale_factor, description="Power Factor") + self.ac_energy_wh: FloatUint32Field = FloatUint32Field("ac_energy_wh", 25, 2, Mode.R, units="WattHours", scale_factor=self.ac_energy_wh_scale_factor, description="AC Lifetime Energy production") + self.dc_current: FloatUint16Field = FloatUint16Field("dc_current", 28, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="DC Current value") + self.dc_voltage: FloatUint16Field = FloatUint16Field("dc_voltage", 30, 1, Mode.R, units="Volts", scale_factor=self.dc_voltage_scale_factor, description="DC Voltage value") + self.dc_power: FloatInt16Field = FloatInt16Field("dc_power", 32, 1, Mode.R, units="Watts", scale_factor=self.dc_power_scale_factor, description="DC Power value") + self.temp_cab: FloatInt16Field = FloatInt16Field("temp_cab", 34, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Cabinet Temperature") + self.temp_sink: FloatInt16Field = FloatInt16Field("temp_sink", 35, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Coolant or Heat Sink Temperature") + self.temp_trans: FloatInt16Field = FloatInt16Field("temp_trans", 36, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Transformer Temperature") + self.temp_other: FloatInt16Field = FloatInt16Field("temp_other", 37, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Other Temperature") class SunSpecInverterSplitPhaseModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Split Phase Inverter") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of model block", units="Registers") - ac_current: Uint16Field = Uint16Field("ac_current", 3, 1, Mode.R, description="AC Total Current value", units="Amps") - ac_current_a: Uint16Field = Uint16Field("ac_current_a", 4, 1, Mode.R, description="AC Phase-A Current value", units="Amps") - ac_current_b: Uint16Field = Uint16Field("ac_current_b", 5, 1, Mode.R, description="AC Phase-B Current value", units="Amps") - ac_current_c: Uint16Field = Uint16Field("ac_current_c", 6, 1, Mode.R, description="AC Phase-C Current value", units="Amps") - ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 7, 1, Mode.R, description="AC Current Scale factor", units="SF") - ac_voltage_ab: Uint16Field = Uint16Field("ac_voltage_ab", 8, 1, Mode.R, description="AC Voltage Phase-AB value", units="Volts") - ac_voltage_bc: Uint16Field = Uint16Field("ac_voltage_bc", 9, 1, Mode.R, description="AC Voltage Phase BC value", units="Volts") - ac_voltage_ca: Uint16Field = Uint16Field("ac_voltage_ca", 10, 1, Mode.R, description="AC Voltage Phase CA value", units="Volts") - ac_voltage_an: Uint16Field = Uint16Field("ac_voltage_an", 11, 1, Mode.R, description="AC Voltage Phase-A-to-neutral value", units="Volts") - ac_voltage_bn: Uint16Field = Uint16Field("ac_voltage_bn", 12, 1, Mode.R, description="AC Voltage Phase B-to-neutral value", units="Volts") - ac_voltage_cn: Uint16Field = Uint16Field("ac_voltage_cn", 13, 1, Mode.R, description="AC Voltage Phase C-to-neutral value", units="Volts") - ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 14, 1, Mode.R, description="AC Voltage Scale factor", units="SF") - ac_power: Int16Field = Int16Field("ac_power", 15, 1, Mode.R, description="AC Power value", units="Watts") - ac_power_scale_factor: Int16Field = Int16Field("ac_power_scale_factor", 16, 1, Mode.R, description="AC Power Scale factor", units="SF") - ac_frequency: Uint16Field = Uint16Field("ac_frequency", 17, 1, Mode.R, description="AC Frequency value", units="Hertz") - ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 18, 1, Mode.R, description="Scale factor", units="SF") - ac_va: Int16Field = Int16Field("ac_va", 19, 1, Mode.R, description="Apparent Power", units="VA") - ac_va_scale_factor: Int16Field = Int16Field("ac_va_scale_factor", 20, 1, Mode.R, description="Scale factor", units="SF") - ac_var: Int16Field = Int16Field("ac_var", 21, 1, Mode.R, description="Reactive Power", units="VAR") - ac_var_scale_factor: Int16Field = Int16Field("ac_var_scale_factor", 22, 1, Mode.R, description="Scale factor", units="SF") - ac_pf: Int16Field = Int16Field("ac_pf", 23, 1, Mode.R, description="Power Factor") - ac_pf_scale_factor: Int16Field = Int16Field("ac_pf_scale_factor", 24, 1, Mode.R, description="Scale factor", units="SF") - ac_energy_wh: Uint32Field = Uint32Field("ac_energy_wh", 25, 2, Mode.R, description="AC Lifetime Energy production", units="WattHours") - ac_energy_wh_scale_factor: Uint16Field = Uint16Field("ac_energy_wh_scale_factor", 27, 1, Mode.R, description="AC Lifetime Energy production scale factor", units="SF") - dc_current: Uint16Field = Uint16Field("dc_current", 28, 1, Mode.R, description="DC Current value", units="Amps") - dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 29, 1, Mode.R, description="Scale factor", units="SF") - dc_voltage: Uint16Field = Uint16Field("dc_voltage", 30, 1, Mode.R, description="DC Voltage value", units="Volts") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 31, 1, Mode.R, description="Scale factor", units="SF") - dc_power: Int16Field = Int16Field("dc_power", 32, 1, Mode.R, description="DC Power value", units="Watts") - dc_power_scale_factor: Int16Field = Int16Field("dc_power_scale_factor", 33, 1, Mode.R, description="Scale factor", units="SF") - temp_cab: Int16Field = Int16Field("temp_cab", 34, 1, Mode.R, description="Cabinet Temperature", units="Degrees C") - temp_sink: Int16Field = Int16Field("temp_sink", 35, 1, Mode.R, description="Coolant or Heat Sink Temperature", units="Degrees C") - temp_trans: Int16Field = Int16Field("temp_trans", 36, 1, Mode.R, description="Transformer Temperature", units="Degrees C") - temp_other: Int16Field = Int16Field("temp_other", 37, 1, Mode.R, description="Other Temperature", units="Degrees C") - temp_scale_factor: Int16Field = Int16Field("temp_scale_factor", 38, 1, Mode.R, description="Scale factor", units="SF") - status: Uint16Field = Uint16Field("status", 39, 1, Mode.R, description="Operating State", units="Enumerated") - status_vendor: Uint16Field = Uint16Field("status_vendor", 40, 1, Mode.R, description="Vendor Defined Operating State", units="Enumerated") - event_1: Bit32Field = Bit32Field("event_1", 41, 2, Mode.R, description="Event Flags (bits 0-31)", flags=IEvent1Flags) - - -SunSpecInverterSplitPhaseModel.ac_current.scale_factor = SunSpecInverterSplitPhaseModel.ac_current_scale_factor -SunSpecInverterSplitPhaseModel.ac_current_a.scale_factor = SunSpecInverterSplitPhaseModel.ac_current_scale_factor -SunSpecInverterSplitPhaseModel.ac_current_b.scale_factor = SunSpecInverterSplitPhaseModel.ac_current_scale_factor -SunSpecInverterSplitPhaseModel.ac_current_c.scale_factor = SunSpecInverterSplitPhaseModel.ac_current_scale_factor -SunSpecInverterSplitPhaseModel.ac_voltage_ab.scale_factor = SunSpecInverterSplitPhaseModel.ac_voltage_scale_factor -SunSpecInverterSplitPhaseModel.ac_voltage_bc.scale_factor = SunSpecInverterSplitPhaseModel.ac_voltage_scale_factor -SunSpecInverterSplitPhaseModel.ac_voltage_ca.scale_factor = SunSpecInverterSplitPhaseModel.ac_voltage_scale_factor -SunSpecInverterSplitPhaseModel.ac_voltage_an.scale_factor = SunSpecInverterSplitPhaseModel.ac_voltage_scale_factor -SunSpecInverterSplitPhaseModel.ac_voltage_bn.scale_factor = SunSpecInverterSplitPhaseModel.ac_voltage_scale_factor -SunSpecInverterSplitPhaseModel.ac_voltage_cn.scale_factor = SunSpecInverterSplitPhaseModel.ac_voltage_scale_factor -SunSpecInverterSplitPhaseModel.ac_power.scale_factor = SunSpecInverterSplitPhaseModel.ac_power_scale_factor -SunSpecInverterSplitPhaseModel.ac_frequency.scale_factor = SunSpecInverterSplitPhaseModel.ac_frequency_scale_factor -SunSpecInverterSplitPhaseModel.ac_va.scale_factor = SunSpecInverterSplitPhaseModel.ac_va_scale_factor -SunSpecInverterSplitPhaseModel.ac_var.scale_factor = SunSpecInverterSplitPhaseModel.ac_var_scale_factor -SunSpecInverterSplitPhaseModel.ac_pf.scale_factor = SunSpecInverterSplitPhaseModel.ac_pf_scale_factor -SunSpecInverterSplitPhaseModel.ac_energy_wh.scale_factor = SunSpecInverterSplitPhaseModel.ac_energy_wh_scale_factor -SunSpecInverterSplitPhaseModel.dc_current.scale_factor = SunSpecInverterSplitPhaseModel.dc_current_scale_factor -SunSpecInverterSplitPhaseModel.dc_voltage.scale_factor = SunSpecInverterSplitPhaseModel.dc_voltage_scale_factor -SunSpecInverterSplitPhaseModel.dc_power.scale_factor = SunSpecInverterSplitPhaseModel.dc_power_scale_factor -SunSpecInverterSplitPhaseModel.temp_cab.scale_factor = SunSpecInverterSplitPhaseModel.temp_scale_factor -SunSpecInverterSplitPhaseModel.temp_sink.scale_factor = SunSpecInverterSplitPhaseModel.temp_scale_factor -SunSpecInverterSplitPhaseModel.temp_trans.scale_factor = SunSpecInverterSplitPhaseModel.temp_scale_factor -SunSpecInverterSplitPhaseModel.temp_other.scale_factor = SunSpecInverterSplitPhaseModel.temp_scale_factor -SunSpecInverterSplitPhaseModel.__model_fields__ = [SunSpecInverterSplitPhaseModel.did, SunSpecInverterSplitPhaseModel.length, SunSpecInverterSplitPhaseModel.ac_current, SunSpecInverterSplitPhaseModel.ac_current_a, SunSpecInverterSplitPhaseModel.ac_current_b, SunSpecInverterSplitPhaseModel.ac_current_c, SunSpecInverterSplitPhaseModel.ac_current_scale_factor, SunSpecInverterSplitPhaseModel.ac_voltage_ab, SunSpecInverterSplitPhaseModel.ac_voltage_bc, SunSpecInverterSplitPhaseModel.ac_voltage_ca, SunSpecInverterSplitPhaseModel.ac_voltage_an, SunSpecInverterSplitPhaseModel.ac_voltage_bn, SunSpecInverterSplitPhaseModel.ac_voltage_cn, SunSpecInverterSplitPhaseModel.ac_voltage_scale_factor, SunSpecInverterSplitPhaseModel.ac_power, SunSpecInverterSplitPhaseModel.ac_power_scale_factor, SunSpecInverterSplitPhaseModel.ac_frequency, SunSpecInverterSplitPhaseModel.ac_frequency_scale_factor, SunSpecInverterSplitPhaseModel.ac_va, SunSpecInverterSplitPhaseModel.ac_va_scale_factor, SunSpecInverterSplitPhaseModel.ac_var, SunSpecInverterSplitPhaseModel.ac_var_scale_factor, SunSpecInverterSplitPhaseModel.ac_pf, SunSpecInverterSplitPhaseModel.ac_pf_scale_factor, SunSpecInverterSplitPhaseModel.ac_energy_wh, SunSpecInverterSplitPhaseModel.ac_energy_wh_scale_factor, SunSpecInverterSplitPhaseModel.dc_current, SunSpecInverterSplitPhaseModel.dc_current_scale_factor, SunSpecInverterSplitPhaseModel.dc_voltage, SunSpecInverterSplitPhaseModel.dc_voltage_scale_factor, SunSpecInverterSplitPhaseModel.dc_power, SunSpecInverterSplitPhaseModel.dc_power_scale_factor, SunSpecInverterSplitPhaseModel.temp_cab, SunSpecInverterSplitPhaseModel.temp_sink, SunSpecInverterSplitPhaseModel.temp_trans, SunSpecInverterSplitPhaseModel.temp_other, SunSpecInverterSplitPhaseModel.temp_scale_factor, SunSpecInverterSplitPhaseModel.status, SunSpecInverterSplitPhaseModel.status_vendor, SunSpecInverterSplitPhaseModel.event_1] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Split Phase Inverter") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of model block") + self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 7, 1, Mode.R, units="SF", description="AC Current Scale factor") + self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 14, 1, Mode.R, units="SF", description="AC Voltage Scale factor") + self.ac_power_scale_factor: Int16Field = Int16Field("ac_power_scale_factor", 16, 1, Mode.R, units="SF", description="AC Power Scale factor") + self.ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 18, 1, Mode.R, units="SF", description="Scale factor") + self.ac_va_scale_factor: Int16Field = Int16Field("ac_va_scale_factor", 20, 1, Mode.R, units="SF", description="Scale factor") + self.ac_var_scale_factor: Int16Field = Int16Field("ac_var_scale_factor", 22, 1, Mode.R, units="SF", description="Scale factor") + self.ac_pf_scale_factor: Int16Field = Int16Field("ac_pf_scale_factor", 24, 1, Mode.R, units="SF", description="Scale factor") + self.ac_energy_wh_scale_factor: Uint16Field = Uint16Field("ac_energy_wh_scale_factor", 27, 1, Mode.R, units="SF", description="AC Lifetime Energy production scale factor") + self.dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 29, 1, Mode.R, units="SF", description="Scale factor") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 31, 1, Mode.R, units="SF", description="Scale factor") + self.dc_power_scale_factor: Int16Field = Int16Field("dc_power_scale_factor", 33, 1, Mode.R, units="SF", description="Scale factor") + self.temp_scale_factor: Int16Field = Int16Field("temp_scale_factor", 38, 1, Mode.R, units="SF", description="Scale factor") + self.status: Uint16Field = Uint16Field("status", 39, 1, Mode.R, units="Enumerated", description="Operating State") + self.status_vendor: Uint16Field = Uint16Field("status_vendor", 40, 1, Mode.R, units="Enumerated", description="Vendor Defined Operating State") + self.event_1: Bit32Field = Bit32Field("event_1", 41, 2, Mode.R, flags=IEvent1Flags, description="Event Flags (bits 0-31)") + self.ac_current: FloatUint16Field = FloatUint16Field("ac_current", 3, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Total Current value") + self.ac_current_a: FloatUint16Field = FloatUint16Field("ac_current_a", 4, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Phase-A Current value") + self.ac_current_b: FloatUint16Field = FloatUint16Field("ac_current_b", 5, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Phase-B Current value") + self.ac_current_c: FloatUint16Field = FloatUint16Field("ac_current_c", 6, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Phase-C Current value") + self.ac_voltage_ab: FloatUint16Field = FloatUint16Field("ac_voltage_ab", 8, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase-AB value") + self.ac_voltage_bc: FloatUint16Field = FloatUint16Field("ac_voltage_bc", 9, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase BC value") + self.ac_voltage_ca: FloatUint16Field = FloatUint16Field("ac_voltage_ca", 10, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase CA value") + self.ac_voltage_an: FloatUint16Field = FloatUint16Field("ac_voltage_an", 11, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase-A-to-neutral value") + self.ac_voltage_bn: FloatUint16Field = FloatUint16Field("ac_voltage_bn", 12, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase B-to-neutral value") + self.ac_voltage_cn: FloatUint16Field = FloatUint16Field("ac_voltage_cn", 13, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase C-to-neutral value") + self.ac_power: FloatInt16Field = FloatInt16Field("ac_power", 15, 1, Mode.R, units="Watts", scale_factor=self.ac_power_scale_factor, description="AC Power value") + self.ac_frequency: FloatUint16Field = FloatUint16Field("ac_frequency", 17, 1, Mode.R, units="Hertz", scale_factor=self.ac_frequency_scale_factor, description="AC Frequency value") + self.ac_va: FloatInt16Field = FloatInt16Field("ac_va", 19, 1, Mode.R, units="VA", scale_factor=self.ac_va_scale_factor, description="Apparent Power") + self.ac_var: FloatInt16Field = FloatInt16Field("ac_var", 21, 1, Mode.R, units="VAR", scale_factor=self.ac_var_scale_factor, description="Reactive Power") + self.ac_pf: FloatInt16Field = FloatInt16Field("ac_pf", 23, 1, Mode.R, scale_factor=self.ac_pf_scale_factor, description="Power Factor") + self.ac_energy_wh: FloatUint32Field = FloatUint32Field("ac_energy_wh", 25, 2, Mode.R, units="WattHours", scale_factor=self.ac_energy_wh_scale_factor, description="AC Lifetime Energy production") + self.dc_current: FloatUint16Field = FloatUint16Field("dc_current", 28, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="DC Current value") + self.dc_voltage: FloatUint16Field = FloatUint16Field("dc_voltage", 30, 1, Mode.R, units="Volts", scale_factor=self.dc_voltage_scale_factor, description="DC Voltage value") + self.dc_power: FloatInt16Field = FloatInt16Field("dc_power", 32, 1, Mode.R, units="Watts", scale_factor=self.dc_power_scale_factor, description="DC Power value") + self.temp_cab: FloatInt16Field = FloatInt16Field("temp_cab", 34, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Cabinet Temperature") + self.temp_sink: FloatInt16Field = FloatInt16Field("temp_sink", 35, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Coolant or Heat Sink Temperature") + self.temp_trans: FloatInt16Field = FloatInt16Field("temp_trans", 36, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Transformer Temperature") + self.temp_other: FloatInt16Field = FloatInt16Field("temp_other", 37, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Other Temperature") class SunSpecInverterThreePhaseModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Three Phase Inverter") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of model block", units="Registers") - ac_current: Uint16Field = Uint16Field("ac_current", 3, 1, Mode.R, description="AC Total Current value", units="Amps") - ac_current_a: Uint16Field = Uint16Field("ac_current_a", 4, 1, Mode.R, description="AC Phase-A Current value", units="Amps") - ac_current_b: Uint16Field = Uint16Field("ac_current_b", 5, 1, Mode.R, description="AC Phase-B Current value", units="Amps") - ac_current_c: Uint16Field = Uint16Field("ac_current_c", 6, 1, Mode.R, description="AC Phase-C Current value", units="Amps") - ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 7, 1, Mode.R, description="AC Current Scale factor", units="SF") - ac_voltage_ab: Uint16Field = Uint16Field("ac_voltage_ab", 8, 1, Mode.R, description="AC Voltage Phase-AB value", units="Volts") - ac_voltage_bc: Uint16Field = Uint16Field("ac_voltage_bc", 9, 1, Mode.R, description="AC Voltage Phase BC value", units="Volts") - ac_voltage_ca: Uint16Field = Uint16Field("ac_voltage_ca", 10, 1, Mode.R, description="AC Voltage Phase CA value", units="Volts") - ac_voltage_an: Uint16Field = Uint16Field("ac_voltage_an", 11, 1, Mode.R, description="AC Voltage Phase-A-to-neutral value", units="Volts") - ac_voltage_bn: Uint16Field = Uint16Field("ac_voltage_bn", 12, 1, Mode.R, description="AC Voltage Phase B-to-neutral value", units="Volts") - ac_voltage_cn: Uint16Field = Uint16Field("ac_voltage_cn", 13, 1, Mode.R, description="AC Voltage Phase C-to-neutral value", units="Volts") - ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 14, 1, Mode.R, description="AC Voltage Scale factor", units="SF") - ac_power: Int16Field = Int16Field("ac_power", 15, 1, Mode.R, description="AC Power value", units="Watts") - ac_power_scale_factor: Int16Field = Int16Field("ac_power_scale_factor", 16, 1, Mode.R, description="AC Power Scale factor", units="SF") - ac_frequency: Uint16Field = Uint16Field("ac_frequency", 17, 1, Mode.R, description="AC Frequency value", units="Hertz") - ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 18, 1, Mode.R, description="Scale factor", units="SF") - ac_va: Int16Field = Int16Field("ac_va", 19, 1, Mode.R, description="Apparent Power", units="VA") - ac_va_scale_factor: Int16Field = Int16Field("ac_va_scale_factor", 20, 1, Mode.R, description="Scale factor", units="SF") - ac_var: Int16Field = Int16Field("ac_var", 21, 1, Mode.R, description="Reactive Power", units="VAR") - ac_var_scale_factor: Int16Field = Int16Field("ac_var_scale_factor", 22, 1, Mode.R, description="Scale factor", units="SF") - ac_pf: Int16Field = Int16Field("ac_pf", 23, 1, Mode.R, description="Power Factor") - ac_pf_scale_factor: Int16Field = Int16Field("ac_pf_scale_factor", 24, 1, Mode.R, description="Scale factor", units="SF") - ac_energy_wh: Uint32Field = Uint32Field("ac_energy_wh", 25, 2, Mode.R, description="AC Lifetime Energy production", units="WattHours") - ac_energy_wh_scale_factor: Uint16Field = Uint16Field("ac_energy_wh_scale_factor", 27, 1, Mode.R, description="AC Lifetime Energy production scale factor", units="SF") - dc_current: Uint16Field = Uint16Field("dc_current", 28, 1, Mode.R, description="DC Current value", units="Amps") - dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 29, 1, Mode.R, description="Scale factor", units="SF") - dc_voltage: Uint16Field = Uint16Field("dc_voltage", 30, 1, Mode.R, description="DC Voltage value", units="Volts") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 31, 1, Mode.R, description="Scale factor", units="SF") - dc_power: Int16Field = Int16Field("dc_power", 32, 1, Mode.R, description="DC Power value", units="Watts") - dc_power_scale_factor: Int16Field = Int16Field("dc_power_scale_factor", 33, 1, Mode.R, description="Scale factor", units="SF") - temp_cab: Int16Field = Int16Field("temp_cab", 34, 1, Mode.R, description="Cabinet Temperature", units="Degrees C") - temp_sink: Int16Field = Int16Field("temp_sink", 35, 1, Mode.R, description="Coolant or Heat Sink Temperature", units="Degrees C") - temp_trans: Int16Field = Int16Field("temp_trans", 36, 1, Mode.R, description="Transformer Temperature", units="Degrees C") - temp_other: Int16Field = Int16Field("temp_other", 37, 1, Mode.R, description="Other Temperature", units="Degrees C") - temp_scale_factor: Int16Field = Int16Field("temp_scale_factor", 38, 1, Mode.R, description="Scale factor", units="SF") - status: Uint16Field = Uint16Field("status", 39, 1, Mode.R, description="Operating State", units="Enumerated") - status_vendor: Uint16Field = Uint16Field("status_vendor", 40, 1, Mode.R, description="Vendor Defined Operating State", units="Enumerated") - event_1: Bit32Field = Bit32Field("event_1", 41, 2, Mode.R, description="Event Flags (bits 0-31)", flags=IEvent1Flags) - - -SunSpecInverterThreePhaseModel.ac_current.scale_factor = SunSpecInverterThreePhaseModel.ac_current_scale_factor -SunSpecInverterThreePhaseModel.ac_current_a.scale_factor = SunSpecInverterThreePhaseModel.ac_current_scale_factor -SunSpecInverterThreePhaseModel.ac_current_b.scale_factor = SunSpecInverterThreePhaseModel.ac_current_scale_factor -SunSpecInverterThreePhaseModel.ac_current_c.scale_factor = SunSpecInverterThreePhaseModel.ac_current_scale_factor -SunSpecInverterThreePhaseModel.ac_voltage_ab.scale_factor = SunSpecInverterThreePhaseModel.ac_voltage_scale_factor -SunSpecInverterThreePhaseModel.ac_voltage_bc.scale_factor = SunSpecInverterThreePhaseModel.ac_voltage_scale_factor -SunSpecInverterThreePhaseModel.ac_voltage_ca.scale_factor = SunSpecInverterThreePhaseModel.ac_voltage_scale_factor -SunSpecInverterThreePhaseModel.ac_voltage_an.scale_factor = SunSpecInverterThreePhaseModel.ac_voltage_scale_factor -SunSpecInverterThreePhaseModel.ac_voltage_bn.scale_factor = SunSpecInverterThreePhaseModel.ac_voltage_scale_factor -SunSpecInverterThreePhaseModel.ac_voltage_cn.scale_factor = SunSpecInverterThreePhaseModel.ac_voltage_scale_factor -SunSpecInverterThreePhaseModel.ac_power.scale_factor = SunSpecInverterThreePhaseModel.ac_power_scale_factor -SunSpecInverterThreePhaseModel.ac_frequency.scale_factor = SunSpecInverterThreePhaseModel.ac_frequency_scale_factor -SunSpecInverterThreePhaseModel.ac_va.scale_factor = SunSpecInverterThreePhaseModel.ac_va_scale_factor -SunSpecInverterThreePhaseModel.ac_var.scale_factor = SunSpecInverterThreePhaseModel.ac_var_scale_factor -SunSpecInverterThreePhaseModel.ac_pf.scale_factor = SunSpecInverterThreePhaseModel.ac_pf_scale_factor -SunSpecInverterThreePhaseModel.ac_energy_wh.scale_factor = SunSpecInverterThreePhaseModel.ac_energy_wh_scale_factor -SunSpecInverterThreePhaseModel.dc_current.scale_factor = SunSpecInverterThreePhaseModel.dc_current_scale_factor -SunSpecInverterThreePhaseModel.dc_voltage.scale_factor = SunSpecInverterThreePhaseModel.dc_voltage_scale_factor -SunSpecInverterThreePhaseModel.dc_power.scale_factor = SunSpecInverterThreePhaseModel.dc_power_scale_factor -SunSpecInverterThreePhaseModel.temp_cab.scale_factor = SunSpecInverterThreePhaseModel.temp_scale_factor -SunSpecInverterThreePhaseModel.temp_sink.scale_factor = SunSpecInverterThreePhaseModel.temp_scale_factor -SunSpecInverterThreePhaseModel.temp_trans.scale_factor = SunSpecInverterThreePhaseModel.temp_scale_factor -SunSpecInverterThreePhaseModel.temp_other.scale_factor = SunSpecInverterThreePhaseModel.temp_scale_factor -SunSpecInverterThreePhaseModel.__model_fields__ = [SunSpecInverterThreePhaseModel.did, SunSpecInverterThreePhaseModel.length, SunSpecInverterThreePhaseModel.ac_current, SunSpecInverterThreePhaseModel.ac_current_a, SunSpecInverterThreePhaseModel.ac_current_b, SunSpecInverterThreePhaseModel.ac_current_c, SunSpecInverterThreePhaseModel.ac_current_scale_factor, SunSpecInverterThreePhaseModel.ac_voltage_ab, SunSpecInverterThreePhaseModel.ac_voltage_bc, SunSpecInverterThreePhaseModel.ac_voltage_ca, SunSpecInverterThreePhaseModel.ac_voltage_an, SunSpecInverterThreePhaseModel.ac_voltage_bn, SunSpecInverterThreePhaseModel.ac_voltage_cn, SunSpecInverterThreePhaseModel.ac_voltage_scale_factor, SunSpecInverterThreePhaseModel.ac_power, SunSpecInverterThreePhaseModel.ac_power_scale_factor, SunSpecInverterThreePhaseModel.ac_frequency, SunSpecInverterThreePhaseModel.ac_frequency_scale_factor, SunSpecInverterThreePhaseModel.ac_va, SunSpecInverterThreePhaseModel.ac_va_scale_factor, SunSpecInverterThreePhaseModel.ac_var, SunSpecInverterThreePhaseModel.ac_var_scale_factor, SunSpecInverterThreePhaseModel.ac_pf, SunSpecInverterThreePhaseModel.ac_pf_scale_factor, SunSpecInverterThreePhaseModel.ac_energy_wh, SunSpecInverterThreePhaseModel.ac_energy_wh_scale_factor, SunSpecInverterThreePhaseModel.dc_current, SunSpecInverterThreePhaseModel.dc_current_scale_factor, SunSpecInverterThreePhaseModel.dc_voltage, SunSpecInverterThreePhaseModel.dc_voltage_scale_factor, SunSpecInverterThreePhaseModel.dc_power, SunSpecInverterThreePhaseModel.dc_power_scale_factor, SunSpecInverterThreePhaseModel.temp_cab, SunSpecInverterThreePhaseModel.temp_sink, SunSpecInverterThreePhaseModel.temp_trans, SunSpecInverterThreePhaseModel.temp_other, SunSpecInverterThreePhaseModel.temp_scale_factor, SunSpecInverterThreePhaseModel.status, SunSpecInverterThreePhaseModel.status_vendor, SunSpecInverterThreePhaseModel.event_1] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Three Phase Inverter") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of model block") + self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 7, 1, Mode.R, units="SF", description="AC Current Scale factor") + self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 14, 1, Mode.R, units="SF", description="AC Voltage Scale factor") + self.ac_power_scale_factor: Int16Field = Int16Field("ac_power_scale_factor", 16, 1, Mode.R, units="SF", description="AC Power Scale factor") + self.ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 18, 1, Mode.R, units="SF", description="Scale factor") + self.ac_va_scale_factor: Int16Field = Int16Field("ac_va_scale_factor", 20, 1, Mode.R, units="SF", description="Scale factor") + self.ac_var_scale_factor: Int16Field = Int16Field("ac_var_scale_factor", 22, 1, Mode.R, units="SF", description="Scale factor") + self.ac_pf_scale_factor: Int16Field = Int16Field("ac_pf_scale_factor", 24, 1, Mode.R, units="SF", description="Scale factor") + self.ac_energy_wh_scale_factor: Uint16Field = Uint16Field("ac_energy_wh_scale_factor", 27, 1, Mode.R, units="SF", description="AC Lifetime Energy production scale factor") + self.dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 29, 1, Mode.R, units="SF", description="Scale factor") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 31, 1, Mode.R, units="SF", description="Scale factor") + self.dc_power_scale_factor: Int16Field = Int16Field("dc_power_scale_factor", 33, 1, Mode.R, units="SF", description="Scale factor") + self.temp_scale_factor: Int16Field = Int16Field("temp_scale_factor", 38, 1, Mode.R, units="SF", description="Scale factor") + self.status: Uint16Field = Uint16Field("status", 39, 1, Mode.R, units="Enumerated", description="Operating State") + self.status_vendor: Uint16Field = Uint16Field("status_vendor", 40, 1, Mode.R, units="Enumerated", description="Vendor Defined Operating State") + self.event_1: Bit32Field = Bit32Field("event_1", 41, 2, Mode.R, flags=IEvent1Flags, description="Event Flags (bits 0-31)") + self.ac_current: FloatUint16Field = FloatUint16Field("ac_current", 3, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Total Current value") + self.ac_current_a: FloatUint16Field = FloatUint16Field("ac_current_a", 4, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Phase-A Current value") + self.ac_current_b: FloatUint16Field = FloatUint16Field("ac_current_b", 5, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Phase-B Current value") + self.ac_current_c: FloatUint16Field = FloatUint16Field("ac_current_c", 6, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="AC Phase-C Current value") + self.ac_voltage_ab: FloatUint16Field = FloatUint16Field("ac_voltage_ab", 8, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase-AB value") + self.ac_voltage_bc: FloatUint16Field = FloatUint16Field("ac_voltage_bc", 9, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase BC value") + self.ac_voltage_ca: FloatUint16Field = FloatUint16Field("ac_voltage_ca", 10, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase CA value") + self.ac_voltage_an: FloatUint16Field = FloatUint16Field("ac_voltage_an", 11, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase-A-to-neutral value") + self.ac_voltage_bn: FloatUint16Field = FloatUint16Field("ac_voltage_bn", 12, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase B-to-neutral value") + self.ac_voltage_cn: FloatUint16Field = FloatUint16Field("ac_voltage_cn", 13, 1, Mode.R, units="Volts", scale_factor=self.ac_voltage_scale_factor, description="AC Voltage Phase C-to-neutral value") + self.ac_power: FloatInt16Field = FloatInt16Field("ac_power", 15, 1, Mode.R, units="Watts", scale_factor=self.ac_power_scale_factor, description="AC Power value") + self.ac_frequency: FloatUint16Field = FloatUint16Field("ac_frequency", 17, 1, Mode.R, units="Hertz", scale_factor=self.ac_frequency_scale_factor, description="AC Frequency value") + self.ac_va: FloatInt16Field = FloatInt16Field("ac_va", 19, 1, Mode.R, units="VA", scale_factor=self.ac_va_scale_factor, description="Apparent Power") + self.ac_var: FloatInt16Field = FloatInt16Field("ac_var", 21, 1, Mode.R, units="VAR", scale_factor=self.ac_var_scale_factor, description="Reactive Power") + self.ac_pf: FloatInt16Field = FloatInt16Field("ac_pf", 23, 1, Mode.R, scale_factor=self.ac_pf_scale_factor, description="Power Factor") + self.ac_energy_wh: FloatUint32Field = FloatUint32Field("ac_energy_wh", 25, 2, Mode.R, units="WattHours", scale_factor=self.ac_energy_wh_scale_factor, description="AC Lifetime Energy production") + self.dc_current: FloatUint16Field = FloatUint16Field("dc_current", 28, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="DC Current value") + self.dc_voltage: FloatUint16Field = FloatUint16Field("dc_voltage", 30, 1, Mode.R, units="Volts", scale_factor=self.dc_voltage_scale_factor, description="DC Voltage value") + self.dc_power: FloatInt16Field = FloatInt16Field("dc_power", 32, 1, Mode.R, units="Watts", scale_factor=self.dc_power_scale_factor, description="DC Power value") + self.temp_cab: FloatInt16Field = FloatInt16Field("temp_cab", 34, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Cabinet Temperature") + self.temp_sink: FloatInt16Field = FloatInt16Field("temp_sink", 35, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Coolant or Heat Sink Temperature") + self.temp_trans: FloatInt16Field = FloatInt16Field("temp_trans", 36, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Transformer Temperature") + self.temp_other: FloatInt16Field = FloatInt16Field("temp_other", 37, 1, Mode.R, units="Degrees C", scale_factor=self.temp_scale_factor, description="Other Temperature") class OutBackModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Outback Interface") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 3, 1, Mode.R, description="OutBack Major firmware revision") - mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 4, 1, Mode.R, description="OutBack Mid firmware revision") - minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 5, 1, Mode.R, description="OutBack Minor firmware revision") - encryption_key: Uint16Field = Uint16Field("encryption_key", 6, 1, Mode.R, description="Encryption key for current session (0 = Encryption not enabled)") - mac_address: StringField = StringField("mac_address", 7, 7, Mode.R, description="Ethernet MAC address") - write_password: StringField = StringField("write_password", 14, 8, Mode.W, description="Password required to write to any register") - enable_dhcp: EnumUint16Field = EnumUint16Field("enable_dhcp", 22, 1, Mode.RW, description="0 = DHCP Disabled, use configured network parameter; 1 = DHCP Enabled", options=Enum("enable_dhcp", [('DHCP Disabled, use configured network parameter', 0), ('DHCP Enabled', 1)])) - tcpip_address: AddressField = AddressField("tcpip_address", 23, 2, Mode.RW, description="TCP/IP Address xxx.xxx.xxx.xxx") - tcpip_gateway_msw: AddressField = AddressField("tcpip_gateway_msw", 25, 2, Mode.RW, description="TCP/IP Gateway xxx.xxx.xxx.xxx") - tcpip_netmask_msw: AddressField = AddressField("tcpip_netmask_msw", 27, 2, Mode.RW, description="TCP/IP Netmask xxx.xxx.xxx.xxx") - tcpip_dns_1_msw: AddressField = AddressField("tcpip_dns_1_msw", 29, 2, Mode.RW, description="TCP/IP DNS 1 xxx.xxx.xxx.xxx") - tcpip_dns_2_msw: AddressField = AddressField("tcpip_dns_2_msw", 31, 2, Mode.RW, description="TCP/IP DNS 2 xxx.xxx.xxx.xxx") - modbus_port: Uint16Field = Uint16Field("modbus_port", 33, 1, Mode.RW, description="Outback MODBUS IP port, default 502") - smtp_server_name: StringField = StringField("smtp_server_name", 34, 20, Mode.RW, description="Email server name") - smtp_account_name: StringField = StringField("smtp_account_name", 54, 16, Mode.RW, description="Email account name") - smtp_ssl_enable: EnumUint16Field = EnumUint16Field("smtp_ssl_enable", 70, 1, Mode.RW, description="0 = SSL Disabled; 1 = SSL Enabled (not implemented)", options=Enum("smtp_ssl_enable", [('SSL Disabled', 0), ('SSL Enabled (not implemented)', 1)])) - smtp_email_password: StringField = StringField("smtp_email_password", 71, 8, Mode.W, description="Email account password") - smtp_email_user_name: StringField = StringField("smtp_email_user_name", 79, 20, Mode.RW, description="Email account User Name") - status_email_interval: Uint16Field = Uint16Field("status_email_interval", 99, 1, Mode.RW, description="0 = Status Email Disabled, 1-23 Status Email every n hours") - status_email_status_time: Uint16Field = Uint16Field("status_email_status_time", 100, 1, Mode.RW, description="Hour of first status email of the day") - status_email_subject_line: StringField = StringField("status_email_subject_line", 101, 25, Mode.RW, description="Status Email Subject Line") - status_email_to_address_1: StringField = StringField("status_email_to_address_1", 126, 20, Mode.RW, description="Status Email to Address 1") - status_email_to_address_2: StringField = StringField("status_email_to_address_2", 146, 20, Mode.RW, description="Status Email to Address 2") - alarm_email_enable: EnumUint16Field = EnumUint16Field("alarm_email_enable", 166, 1, Mode.RW, description="0 = Disabled; 1 = Enabled", options=Enum("alarm_email_enable", [('Disabled', 0), ('Enabled', 1)])) - system_name: StringField = StringField("system_name", 167, 30, Mode.RW, description="OutBack System Name") - alarm_email_to_address_1: StringField = StringField("alarm_email_to_address_1", 197, 15, Mode.RW, description="Status Alarm to Address 1") - alarm_email_to_address_2: StringField = StringField("alarm_email_to_address_2", 212, 20, Mode.RW, description="Status Alarm to Address 2") - ftp_password: StringField = StringField("ftp_password", 232, 8, Mode.W, description="FTP password") - telnet_password: StringField = StringField("telnet_password", 240, 8, Mode.W, description="Telnet password (not implemented)") - sd_card_data_log_write_interval: Uint16Field = Uint16Field("sd_card_data_log_write_interval", 248, 1, Mode.RW, description="0 = SD-Card Data Logging disabled, 1-60 seconds") - sd_card_data_log_retain_days: Uint16Field = Uint16Field("sd_card_data_log_retain_days", 249, 1, Mode.RW, description="0 = Log until SD-Card is full then erase oldest, 1-731 Number of days to retain data logs") - sd_card_data_logging_mode: EnumUint16Field = EnumUint16Field("sd_card_data_logging_mode", 250, 1, Mode.RW, description="0 = Disabled; 1 = Excel Format; 2 = Compact Format", options=Enum("sd_card_data_logging_mode", [('Compact Format', 2), ('Disabled', 0), ('Excel Format', 1)])) - time_server_name: StringField = StringField("time_server_name", 251, 20, Mode.RW, description="Timeserver domain name") - enable_time_server: EnumUint16Field = EnumUint16Field("enable_time_server", 271, 1, Mode.RW, description="0 = Time Server Disabled, use configured time parameters; 1 = Time Server Enabled", options=Enum("enable_time_server", [('Time Server Enabled', 1), ('Time Server Disabled, use configured time parameters', 0)])) - set_time_zone: Int16Field = Int16Field("set_time_zone", 272, 1, Mode.RW, description="Time Zone -12.0 \u2026 +14.0", units="Hours") - enable_float_coordination: EnumUint16Field = EnumUint16Field("enable_float_coordination", 273, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("enable_float_coordination", [('Disabled', 0), ('Enabled', 1)])) - enable_fndc_charge_termination: EnumUint16Field = EnumUint16Field("enable_fndc_charge_termination", 274, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("enable_fndc_charge_termination", [('Disabled', 0), ('Enabled', 1)])) - enable_fndc_grid_tie_control: EnumUint16Field = EnumUint16Field("enable_fndc_grid_tie_control", 275, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("enable_fndc_grid_tie_control", [('Disabled', 0), ('Enabled', 1)])) - voltage_scale_factor: Int16Field = Int16Field("voltage_scale_factor", 276, 1, Mode.R, description="DC Voltage Scale Factor") - hour_scale_factor: Int16Field = Int16Field("hour_scale_factor", 277, 1, Mode.R, description="Hours Scale Factor") - ags_mode: EnumUint16Field = EnumUint16Field("ags_mode", 278, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_port: Uint16Field = Uint16Field("ags_port", 279, 1, Mode.RW, description="AGS device port number 0-10") - ags_port_type: EnumUint16Field = EnumUint16Field("ags_port_type", 280, 1, Mode.RW, description="0=Radian AUX Relay, 1=Radian AUX Output", options=Enum("ags_port_type", [('Radian AUX Output', 1), ('Radian AUX Relay', 0)])) - ags_generator_type: EnumUint16Field = EnumUint16Field("ags_generator_type", 281, 1, Mode.RW, description="0=AC Gen, 1=DC Gen, 2=No Gen", options=Enum("ags_generator_type", [('AC Gen', 0), ('DC Gen', 1), ('No Gen', 2)])) - ags_dc_gen_absorb_voltage: Uint16Field = Uint16Field("ags_dc_gen_absorb_voltage", 282, 1, Mode.RW, description="DC Generator Absorb Voltage", units="Volts") - ags_dc_gen_absorb_time: Uint16Field = Uint16Field("ags_dc_gen_absorb_time", 283, 1, Mode.RW, description="DC Generator Absorb Time", units="Hour") - ags_fault_time: Uint16Field = Uint16Field("ags_fault_time", 284, 1, Mode.RW, description="AGS Generator fault time delay", units="Minutes") - ags_gen_cool_down_time: Uint16Field = Uint16Field("ags_gen_cool_down_time", 285, 1, Mode.RW, description="AGS Generator Cool Down Time", units="Minutes") - ags_gen_warm_up_time: Uint16Field = Uint16Field("ags_gen_warm_up_time", 286, 1, Mode.RW, description="AGS Generator Warm Up Time", units="Minutes") - ags_generator_exercise_mode: EnumUint16Field = EnumUint16Field("ags_generator_exercise_mode", 287, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_generator_exercise_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_exercise_start_hour: Uint16Field = Uint16Field("ags_exercise_start_hour", 288, 1, Mode.RW, description="Exercise Start Hour 0-23", units="Hour") - ags_exercise_start_minute: Uint16Field = Uint16Field("ags_exercise_start_minute", 289, 1, Mode.RW, description="Exercise Start Minute 0-59", units="Minutes") - ags_exercise_day: EnumUint16Field = EnumUint16Field("ags_exercise_day", 290, 1, Mode.RW, description="0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thr, 5=Fri, 6=Sat", options=Enum("ags_exercise_day", [('Fri', 5), ('Mon', 1), ('Sat', 6), ('Sun', 0), ('Thr', 4), ('Tue', 2), ('Wed', 3)])) - ags_exercise_period: Uint16Field = Uint16Field("ags_exercise_period", 291, 1, Mode.RW, description="Exercise Period 1-240 minutes", units="Minutes") - ags_exercise_interval: Uint16Field = Uint16Field("ags_exercise_interval", 292, 1, Mode.RW, description="Exercise interval 1-8 Weeks", units="Weeks") - ags_sell_mode: EnumUint16Field = EnumUint16Field("ags_sell_mode", 293, 1, Mode.RW, description="Sell During Generator Exercise Period, 0=Selling Enabled, 1=Selling Disabled", options=Enum("ags_sell_mode", [('Selling Disabled', 1), ('Selling Enabled', 0)])) - ags_2_min_start_mode: EnumUint16Field = EnumUint16Field("ags_2_min_start_mode", 294, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_2_min_start_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_2_min_start_voltage: Uint16Field = Uint16Field("ags_2_min_start_voltage", 295, 1, Mode.RW, description="Two Minute AGS Start Voltage", units="Volts") - ags_2_hour_start_mode: EnumUint16Field = EnumUint16Field("ags_2_hour_start_mode", 296, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_2_hour_start_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_2_hour_start_voltage: Uint16Field = Uint16Field("ags_2_hour_start_voltage", 297, 1, Mode.RW, description="Two Hour AGS Start Voltage", units="Volts") - ags_24_hour_start_mode: EnumUint16Field = EnumUint16Field("ags_24_hour_start_mode", 298, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_24_hour_start_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_24_hour_start_voltage: Uint16Field = Uint16Field("ags_24_hour_start_voltage", 299, 1, Mode.RW, description="Twenty Four Hour AGS Start Voltage", units="Volts") - ags_load_start_mode: EnumUint16Field = EnumUint16Field("ags_load_start_mode", 300, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_load_start_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_load_start_kw: Uint16Field = Uint16Field("ags_load_start_kw", 301, 1, Mode.RW, description="Load Start kWatts", units="kWatts") - ags_load_start_delay: Uint16Field = Uint16Field("ags_load_start_delay", 302, 1, Mode.RW, description="Load Start Delay", units="Minutes") - ags_load_stop_kw: Uint16Field = Uint16Field("ags_load_stop_kw", 303, 1, Mode.RW, description="Load Stop kWatts", units="kWatts") - ags_load_stop_delay: Uint16Field = Uint16Field("ags_load_stop_delay", 304, 1, Mode.RW, description="Load Stop Delay", units="Minutes") - ags_soc_start_mode: EnumUint16Field = EnumUint16Field("ags_soc_start_mode", 305, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_soc_start_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_soc_start_percentage: Uint16Field = Uint16Field("ags_soc_start_percentage", 306, 1, Mode.RW, description="AGS SOC Start Percentage", units="Percent") - ags_soc_stop_percentage: Uint16Field = Uint16Field("ags_soc_stop_percentage", 307, 1, Mode.RW, description="AGS SOC Stop Percentage", units="Percent") - ags_enable_full_charge_mode: EnumUint16Field = EnumUint16Field("ags_enable_full_charge_mode", 308, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_enable_full_charge_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_full_charge_interval: Uint16Field = Uint16Field("ags_full_charge_interval", 309, 1, Mode.RW, description="AGS SOC Full Charge Interval", units="Days") - ags_must_run_mode: EnumUint16Field = EnumUint16Field("ags_must_run_mode", 310, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_must_run_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_must_run_weekday_start_hour: Uint16Field = Uint16Field("ags_must_run_weekday_start_hour", 311, 1, Mode.RW, description="AGS Must Run Weekday Start Hour 0-23", units="Hour") - ags_must_run_weekday_start_minute: Uint16Field = Uint16Field("ags_must_run_weekday_start_minute", 312, 1, Mode.RW, description="AGS Must Run Weekday Start Minute 0-59", units="Minute") - ags_must_run_weekday_stop_hour: Uint16Field = Uint16Field("ags_must_run_weekday_stop_hour", 313, 1, Mode.RW, description="AGS Must Run Weekday Stop Hour 0-23", units="Hour") - ags_must_run_weekday_stop_minute: Uint16Field = Uint16Field("ags_must_run_weekday_stop_minute", 314, 1, Mode.RW, description="AGS Must Run Weekday Stop Minute 0-59", units="Minute") - ags_must_run_weekend_start_hour: Uint16Field = Uint16Field("ags_must_run_weekend_start_hour", 315, 1, Mode.RW, description="AGS Must Run Weekend Start Hour 0-23", units="Hour") - ags_must_run_weekend_start_minute: Uint16Field = Uint16Field("ags_must_run_weekend_start_minute", 316, 1, Mode.RW, description="AGS Must Run Weekend Start Minute 0-59", units="Minute") - ags_must_run_weekend_stop_hour: Uint16Field = Uint16Field("ags_must_run_weekend_stop_hour", 317, 1, Mode.RW, description="AGS Must Run Weekend Stop Hour 0-23", units="Hour") - ags_must_run_weekend_stop_minute: Uint16Field = Uint16Field("ags_must_run_weekend_stop_minute", 318, 1, Mode.RW, description="AGS Must Run Weekend Stop Minute 0-59", units="Minute") - ags_quiet_time_mode: EnumUint16Field = EnumUint16Field("ags_quiet_time_mode", 319, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("ags_quiet_time_mode", [('Disabled', 0), ('Enabled', 1)])) - ags_quiet_time_weekday_start_hour: Uint16Field = Uint16Field("ags_quiet_time_weekday_start_hour", 320, 1, Mode.RW, description="AGS Quiet Time Weekday Start Hour 0-23", units="Hour") - ags_quiet_time_weekday_start_minute: Uint16Field = Uint16Field("ags_quiet_time_weekday_start_minute", 321, 1, Mode.RW, description="AGS Quiet Time Weekday Start Minute 0-59", units="Minute") - ags_quiet_time_weekday_stop_hour: Uint16Field = Uint16Field("ags_quiet_time_weekday_stop_hour", 322, 1, Mode.RW, description="AGS Quiet Time Weekday Stop Hour 0-23", units="Hour") - ags_quiet_time_weekday_stop_minute: Uint16Field = Uint16Field("ags_quiet_time_weekday_stop_minute", 323, 1, Mode.RW, description="AGS Quiet Time Weekday Stop Minute 0-59", units="Minute") - ags_quiet_time_weekend_start_hour: Uint16Field = Uint16Field("ags_quiet_time_weekend_start_hour", 324, 1, Mode.RW, description="AGS Quiet Time Weekend Start Hour 0-23", units="Hour") - ags_quiet_time_weekend_start_minute: Uint16Field = Uint16Field("ags_quiet_time_weekend_start_minute", 325, 1, Mode.RW, description="AGS Quiet Time Weekend Start Minute 0-59", units="Minute") - ags_quiet_time_weekend_stop_hour: Uint16Field = Uint16Field("ags_quiet_time_weekend_stop_hour", 326, 1, Mode.RW, description="AGS Quiet Time Weekend Stop Hour 0-23", units="Hour") - ags_quiet_time_weekend_stop_minute: Uint16Field = Uint16Field("ags_quiet_time_weekend_stop_minute", 327, 1, Mode.RW, description="AGS Quiet Time Weekend Stop Minute 0-59", units="Minute") - ags_total_generator_run_time: Uint32Field = Uint32Field("ags_total_generator_run_time", 328, 2, Mode.RW, description="AGS Generator Total Run Time in Seconds", units="Hours") - hbx_mode: EnumUint16Field = EnumUint16Field("hbx_mode", 330, 1, Mode.RW, description="0=Disabled, 1=Voltage Only, 2=SOC Only, 3=Both", options=Enum("hbx_mode", [('Both', 3), ('Disabled', 0), ('SOC Only', 2), ('Voltage Only', 1)])) - hbx_grid_connect_voltage: Uint16Field = Uint16Field("hbx_grid_connect_voltage", 331, 1, Mode.RW, description="HBX Grid Connect Voltage", units="Volts") - hbx_grid_connect_delay: Uint16Field = Uint16Field("hbx_grid_connect_delay", 332, 1, Mode.RW, description="HBX Grid Connect Delay", units="Hours") - hbx_grid_disconnect_voltage: Uint16Field = Uint16Field("hbx_grid_disconnect_voltage", 333, 1, Mode.RW, description="HBX Grid Disconnect Voltage", units="Volts") - hbx_grid_disconnect_delay: Uint16Field = Uint16Field("hbx_grid_disconnect_delay", 334, 1, Mode.RW, description="HBX Grid Disconnect Delay", units="Hours") - hbx_grid_connect_soc: Uint16Field = Uint16Field("hbx_grid_connect_soc", 335, 1, Mode.RW, description="HBX Grid Connect SOC Percentage", units="Percent") - hbx_grid_disconnect_soc: Uint16Field = Uint16Field("hbx_grid_disconnect_soc", 336, 1, Mode.RW, description="HBX Grid Disconnect SOC Percentage", units="Percent") - grid_use_interval_1_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_1_mode", 337, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("grid_use_interval_1_mode", [('Disabled', 0), ('Enabled', 1)])) - grid_use_interval_1_weekday_start_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekday_start_hour", 338, 1, Mode.RW, description="Grid Use Interval 1 Weekday Start Hour 0-23", units="Hour") - grid_use_interval_1_weekday_start_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekday_start_minute", 339, 1, Mode.RW, description="Grid Use Interval 1 Weekday Start Minute 0-59", units="Hour") - grid_use_interval_1_weekday_stop_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekday_stop_hour", 340, 1, Mode.RW, description="Grid Use Interval 1 Weekday Stop Hour 0-23", units="Hour") - grid_use_interval_1_weekday_stop_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekday_stop_minute", 341, 1, Mode.RW, description="Grid Use Interval 1 Weekday Stop Minute 0-59", units="Hour") - grid_use_interval_1_weekend_start_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekend_start_hour", 342, 1, Mode.RW, description="Grid Use Interval 1 Weekend Start Hour 0-23", units="Hour") - grid_use_interval_1_weekend_start_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekend_start_minute", 343, 1, Mode.RW, description="Grid Use Interval 1 Weekend Start Minute 0-59", units="Hour") - grid_use_interval_1_weekend_stop_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekend_stop_hour", 344, 1, Mode.RW, description="Grid Use Interval 1 Weekend Stop Hour 0-23", units="Hour") - grid_use_interval_1_weekend_stop_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekend_stop_minute", 345, 1, Mode.RW, description="Grid Use Interval 1 Weekend Stop Minute 0-59", units="Hour") - grid_use_interval_2_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_2_mode", 346, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("grid_use_interval_2_mode", [('Disabled', 0), ('Enabled', 1)])) - grid_use_interval_2_weekday_start_hour: Uint16Field = Uint16Field("grid_use_interval_2_weekday_start_hour", 347, 1, Mode.RW, description="Grid Use Interval 2 Weekday Start Hour 0-23", units="Hour") - grid_use_interval_2_weekday_start_minute: Uint16Field = Uint16Field("grid_use_interval_2_weekday_start_minute", 348, 1, Mode.RW, description="Grid Use Interval 2 Weekday Start Minute 0-59", units="Hour") - grid_use_interval_2_weekday_stop_hour: Uint16Field = Uint16Field("grid_use_interval_2_weekday_stop_hour", 349, 1, Mode.RW, description="Grid Use Interval 2 Weekday Stop Hour 0-23", units="Hour") - grid_use_interval_2_weekday_stop_minute: Uint16Field = Uint16Field("grid_use_interval_2_weekday_stop_minute", 350, 1, Mode.RW, description="Grid Use Interval 2 Weekday Stop Minute 0-59", units="Hour") - grid_use_interval_3_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_3_mode", 351, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("grid_use_interval_3_mode", [('Disabled', 0), ('Enabled', 1)])) - grid_use_interval_3_weekday_start_hour: Uint16Field = Uint16Field("grid_use_interval_3_weekday_start_hour", 352, 1, Mode.RW, description="Grid Use Interval 3 Weekday Start Hour 0-23", units="Hour") - grid_use_interval_3_weekday_start_minute: Uint16Field = Uint16Field("grid_use_interval_3_weekday_start_minute", 353, 1, Mode.RW, description="Grid Use Interval 3 Weekday Start Minute 0-59", units="Hour") - grid_use_interval_3_weekday_stop_hour: Uint16Field = Uint16Field("grid_use_interval_3_weekday_stop_hour", 354, 1, Mode.RW, description="Grid Use Interval 3 Weekday Stop Hour 0-23", units="Hour") - grid_use_interval_3_weekday_stop_minute: Uint16Field = Uint16Field("grid_use_interval_3_weekday_stop_minute", 355, 1, Mode.RW, description="Grid Use Interval 3 Weekday Stop Minute 0-59", units="Hour") - load_grid_transfer_mode: EnumUint16Field = EnumUint16Field("load_grid_transfer_mode", 356, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("load_grid_transfer_mode", [('Disabled', 0), ('Enabled', 1)])) - load_grid_transfer_threshold: Uint16Field = Uint16Field("load_grid_transfer_threshold", 357, 1, Mode.RW, description="Load Grid Transfer Threshold kW", units="kWatts") - load_grid_transfer_connect_delay: Uint16Field = Uint16Field("load_grid_transfer_connect_delay", 358, 1, Mode.RW, description="Load Grid Transfer Connect Delay Seconds", units="Seconds") - load_grid_transfer_disconnect_delay: Uint16Field = Uint16Field("load_grid_transfer_disconnect_delay", 359, 1, Mode.RW, description="Load Grid Transfer Disconnect Delay Seconds", units="Seconds") - load_grid_transfer_connect_battery_voltage: Uint16Field = Uint16Field("load_grid_transfer_connect_battery_voltage", 360, 1, Mode.RW, description="Load Grid Transfer Low Battery Connect Voltage", units="Volts") - load_grid_transfer_re_connect_battery_voltage: Uint16Field = Uint16Field("load_grid_transfer_re_connect_battery_voltage", 361, 1, Mode.RW, description="Load Grid Transfer Low Battery Re-Connect Voltage", units="Volts") - global_charger_control_mode: EnumUint16Field = EnumUint16Field("global_charger_control_mode", 362, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("global_charger_control_mode", [('Disabled', 0), ('Enabled', 1)])) - global_charger_control_output_limit: Uint16Field = Uint16Field("global_charger_control_output_limit", 363, 1, Mode.RW, description="Global Charger Output Limit Amps", units="Amps") - radian_ac_coupled_control_mode: EnumUint16Field = EnumUint16Field("radian_ac_coupled_control_mode", 364, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("radian_ac_coupled_control_mode", [('Disabled', 0), ('Enabled', 1)])) - radian_ac_coupled_aux_port: Uint16Field = Uint16Field("radian_ac_coupled_aux_port", 365, 1, Mode.RW, description="Radian Inverter Port Number for AUX Control 0-10", units="Port") - url_update_lock: Uint32Field = Uint32Field("url_update_lock", 366, 2, Mode.W, description="Unlock Key", units="key") - web_reporting_base_url: StringField = StringField("web_reporting_base_url", 368, 20, Mode.RW, description="WEB Reporting Base URL") - web_user_logged_in_status: EnumUint16Field = EnumUint16Field("web_user_logged_in_status", 388, 1, Mode.RW, description="0=WEB User NOT logged in, 1=WEB user logged in", options=Enum("web_user_logged_in_status", [('WEB User NOT logged in', 0), ('WEB user logged in', 1)])) - hub_type: EnumUint16Field = EnumUint16Field("hub_type", 389, 1, Mode.R, description="0=Legecy HUB, 4= HUB4, 10=HUB10.3, 11=HUB3PH", options=Enum("hub_type", [('HUB10.3', 10), ('HUB3PH', 11), ('HUB4', 4), ('Legecy HUB', 0)])) - hub_major_firmware_number: Uint16Field = Uint16Field("hub_major_firmware_number", 390, 1, Mode.R, description="HUB Major firmware revision") - hub_mid_firmware_number: Uint16Field = Uint16Field("hub_mid_firmware_number", 391, 1, Mode.R, description="HUB Mid firmware revision") - hub_minor_firmware_number: Uint16Field = Uint16Field("hub_minor_firmware_number", 392, 1, Mode.R, description="HUB Minor firmware revision") - year: Uint16Field = Uint16Field("year", 393, 1, Mode.RW, description="Clock year (4 digit)") - month: Uint16Field = Uint16Field("month", 394, 1, Mode.RW, description="Clock Month (1 - 12)") - day: Uint16Field = Uint16Field("day", 395, 1, Mode.RW, description="Clock Day (1 - 31)") - hour: Uint16Field = Uint16Field("hour", 396, 1, Mode.RW, description="Clock Hour (0 - 23)") - minute: Uint16Field = Uint16Field("minute", 397, 1, Mode.RW, description="Clock Minute (0 - 59)") - second: Uint16Field = Uint16Field("second", 398, 1, Mode.RW, description="Clock Second (0 - 59)") - temp_battery: Int16Field = Int16Field("temp_battery", 399, 1, Mode.R, description="Battery temp in degrees C", units="Degrees C") - temp_ambient: Int16Field = Int16Field("temp_ambient", 400, 1, Mode.R, description="Ambient temp from temp sensor connected to device, in degrees C", units="Degrees C") - temp_scale_factor: Int16Field = Int16Field("temp_scale_factor", 401, 1, Mode.R, description="Temperature Scale Factor") - error: Bit16Field = Bit16Field("error", 402, 1, Mode.R, description="Bit field for errors. See Outback_Error Table", flags=OutBackErrorFlags) - status: Bit16Field = Bit16Field("status", 403, 1, Mode.R, description="Bit field for status.See Outback_Status Table", flags=OutBackStatusFlags) - update_device_firmware_port: Bit16Field = Bit16Field("update_device_firmware_port", 404, 1, Mode.RW, description="Device Firmware update See Device_FW_Update", flags=OutBackUpdateDeviceFirmwarePortFlags) - gateway_type: EnumUint16Field = EnumUint16Field("gateway_type", 405, 1, Mode.R, description="1=AXS Port, 2= MATE3", options=Enum("gateway_type", [('AXS Port', 1), ('MATE3', 2)])) - system_voltage: Uint16Field = Uint16Field("system_voltage", 406, 1, Mode.R, description="12, 24, 26, 48 or 60 VDC", units="Volts") - measured_system_voltage: Uint16Field = Uint16Field("measured_system_voltage", 407, 1, Mode.R, description="Current system battery voltage computed by gateway", units="Volts") - ags_ac_reconnect_delay: Uint16Field = Uint16Field("ags_ac_reconnect_delay", 408, 1, Mode.RW, description="AGS AC Reconnect Delay", units="Minute") - multi_phase_coordination: EnumUint16Field = EnumUint16Field("multi_phase_coordination", 409, 1, Mode.RW, description="0=Disabled, 1=Enabled", options=Enum("multi_phase_coordination", [('Disabled', 0), ('Enabled', 1)])) - sched_1_ac_mode: EnumInt16Field = EnumInt16Field("sched_1_ac_mode", 410, 1, Mode.RW, description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero", options=Enum("sched_1_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)])) - sched_1_ac_mode_hour: Uint16Field = Uint16Field("sched_1_ac_mode_hour", 411, 1, Mode.RW, description="Start Hour for AC Input Mode schedule 1", units="Hour") - sched_1_ac_mode_minute: Uint16Field = Uint16Field("sched_1_ac_mode_minute", 412, 1, Mode.RW, description="Start Minute for AC Input Mode schedule 1", units="Minute") - sched_2_ac_mode: EnumInt16Field = EnumInt16Field("sched_2_ac_mode", 413, 1, Mode.RW, description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero", options=Enum("sched_2_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)])) - sched_2_ac_mode_hour: Uint16Field = Uint16Field("sched_2_ac_mode_hour", 414, 1, Mode.RW, description="Start Hour for AC Input Mode schedule 2", units="Hour") - sched_2_ac_mode_minute: Uint16Field = Uint16Field("sched_2_ac_mode_minute", 415, 1, Mode.RW, description="Start Minute for AC Input Mode schedule 2", units="Minute") - sched_3_ac_mode: EnumInt16Field = EnumInt16Field("sched_3_ac_mode", 416, 1, Mode.RW, description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero", options=Enum("sched_3_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)])) - sched_3_ac_mode_hour: Uint16Field = Uint16Field("sched_3_ac_mode_hour", 417, 1, Mode.RW, description="Start Hour for AC Input Mode schedule 3", units="Hour") - sched_3_ac_mode_minute: Uint16Field = Uint16Field("sched_3_ac_mode_minute", 418, 1, Mode.RW, description="Start Minute for AC Input Mode schedule 3", units="Minute") - auto_reboot: EnumUint16Field = EnumUint16Field("auto_reboot", 419, 1, Mode.RW, description="OPTICS auto reboot every 24 hours 0=Disable, 1=Enable", options=Enum("auto_reboot", [('Disable', 0), ('Enable', 1)])) - time_zone_scale_factor: Int16Field = Int16Field("time_zone_scale_factor", 420, 1, Mode.R, description="Time Zone scale factor") - spare_reg_3: Uint16Field = Uint16Field("spare_reg_3", 421, 1, Mode.RW, description="Spare Register 3") - spare_reg_4: Uint16Field = Uint16Field("spare_reg_4", 422, 1, Mode.RW, description="Spare Register 4") - - -OutBackModel.set_time_zone.scale_factor = OutBackModel.time_zone_scale_factor -OutBackModel.ags_dc_gen_absorb_voltage.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.ags_dc_gen_absorb_time.scale_factor = OutBackModel.hour_scale_factor -OutBackModel.ags_2_min_start_voltage.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.ags_2_hour_start_voltage.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.ags_24_hour_start_voltage.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.hbx_grid_connect_voltage.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.hbx_grid_connect_delay.scale_factor = OutBackModel.hour_scale_factor -OutBackModel.hbx_grid_disconnect_voltage.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.hbx_grid_disconnect_delay.scale_factor = OutBackModel.hour_scale_factor -OutBackModel.load_grid_transfer_threshold.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.load_grid_transfer_connect_battery_voltage.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.load_grid_transfer_re_connect_battery_voltage.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.measured_system_voltage.scale_factor = OutBackModel.voltage_scale_factor -OutBackModel.__model_fields__ = [OutBackModel.did, OutBackModel.length, OutBackModel.major_firmware_number, OutBackModel.mid_firmware_number, OutBackModel.minor_firmware_number, OutBackModel.encryption_key, OutBackModel.mac_address, OutBackModel.write_password, OutBackModel.enable_dhcp, OutBackModel.tcpip_address, OutBackModel.tcpip_gateway_msw, OutBackModel.tcpip_netmask_msw, OutBackModel.tcpip_dns_1_msw, OutBackModel.tcpip_dns_2_msw, OutBackModel.modbus_port, OutBackModel.smtp_server_name, OutBackModel.smtp_account_name, OutBackModel.smtp_ssl_enable, OutBackModel.smtp_email_password, OutBackModel.smtp_email_user_name, OutBackModel.status_email_interval, OutBackModel.status_email_status_time, OutBackModel.status_email_subject_line, OutBackModel.status_email_to_address_1, OutBackModel.status_email_to_address_2, OutBackModel.alarm_email_enable, OutBackModel.system_name, OutBackModel.alarm_email_to_address_1, OutBackModel.alarm_email_to_address_2, OutBackModel.ftp_password, OutBackModel.telnet_password, OutBackModel.sd_card_data_log_write_interval, OutBackModel.sd_card_data_log_retain_days, OutBackModel.sd_card_data_logging_mode, OutBackModel.time_server_name, OutBackModel.enable_time_server, OutBackModel.set_time_zone, OutBackModel.enable_float_coordination, OutBackModel.enable_fndc_charge_termination, OutBackModel.enable_fndc_grid_tie_control, OutBackModel.voltage_scale_factor, OutBackModel.hour_scale_factor, OutBackModel.ags_mode, OutBackModel.ags_port, OutBackModel.ags_port_type, OutBackModel.ags_generator_type, OutBackModel.ags_dc_gen_absorb_voltage, OutBackModel.ags_dc_gen_absorb_time, OutBackModel.ags_fault_time, OutBackModel.ags_gen_cool_down_time, OutBackModel.ags_gen_warm_up_time, OutBackModel.ags_generator_exercise_mode, OutBackModel.ags_exercise_start_hour, OutBackModel.ags_exercise_start_minute, OutBackModel.ags_exercise_day, OutBackModel.ags_exercise_period, OutBackModel.ags_exercise_interval, OutBackModel.ags_sell_mode, OutBackModel.ags_2_min_start_mode, OutBackModel.ags_2_min_start_voltage, OutBackModel.ags_2_hour_start_mode, OutBackModel.ags_2_hour_start_voltage, OutBackModel.ags_24_hour_start_mode, OutBackModel.ags_24_hour_start_voltage, OutBackModel.ags_load_start_mode, OutBackModel.ags_load_start_kw, OutBackModel.ags_load_start_delay, OutBackModel.ags_load_stop_kw, OutBackModel.ags_load_stop_delay, OutBackModel.ags_soc_start_mode, OutBackModel.ags_soc_start_percentage, OutBackModel.ags_soc_stop_percentage, OutBackModel.ags_enable_full_charge_mode, OutBackModel.ags_full_charge_interval, OutBackModel.ags_must_run_mode, OutBackModel.ags_must_run_weekday_start_hour, OutBackModel.ags_must_run_weekday_start_minute, OutBackModel.ags_must_run_weekday_stop_hour, OutBackModel.ags_must_run_weekday_stop_minute, OutBackModel.ags_must_run_weekend_start_hour, OutBackModel.ags_must_run_weekend_start_minute, OutBackModel.ags_must_run_weekend_stop_hour, OutBackModel.ags_must_run_weekend_stop_minute, OutBackModel.ags_quiet_time_mode, OutBackModel.ags_quiet_time_weekday_start_hour, OutBackModel.ags_quiet_time_weekday_start_minute, OutBackModel.ags_quiet_time_weekday_stop_hour, OutBackModel.ags_quiet_time_weekday_stop_minute, OutBackModel.ags_quiet_time_weekend_start_hour, OutBackModel.ags_quiet_time_weekend_start_minute, OutBackModel.ags_quiet_time_weekend_stop_hour, OutBackModel.ags_quiet_time_weekend_stop_minute, OutBackModel.ags_total_generator_run_time, OutBackModel.hbx_mode, OutBackModel.hbx_grid_connect_voltage, OutBackModel.hbx_grid_connect_delay, OutBackModel.hbx_grid_disconnect_voltage, OutBackModel.hbx_grid_disconnect_delay, OutBackModel.hbx_grid_connect_soc, OutBackModel.hbx_grid_disconnect_soc, OutBackModel.grid_use_interval_1_mode, OutBackModel.grid_use_interval_1_weekday_start_hour, OutBackModel.grid_use_interval_1_weekday_start_minute, OutBackModel.grid_use_interval_1_weekday_stop_hour, OutBackModel.grid_use_interval_1_weekday_stop_minute, OutBackModel.grid_use_interval_1_weekend_start_hour, OutBackModel.grid_use_interval_1_weekend_start_minute, OutBackModel.grid_use_interval_1_weekend_stop_hour, OutBackModel.grid_use_interval_1_weekend_stop_minute, OutBackModel.grid_use_interval_2_mode, OutBackModel.grid_use_interval_2_weekday_start_hour, OutBackModel.grid_use_interval_2_weekday_start_minute, OutBackModel.grid_use_interval_2_weekday_stop_hour, OutBackModel.grid_use_interval_2_weekday_stop_minute, OutBackModel.grid_use_interval_3_mode, OutBackModel.grid_use_interval_3_weekday_start_hour, OutBackModel.grid_use_interval_3_weekday_start_minute, OutBackModel.grid_use_interval_3_weekday_stop_hour, OutBackModel.grid_use_interval_3_weekday_stop_minute, OutBackModel.load_grid_transfer_mode, OutBackModel.load_grid_transfer_threshold, OutBackModel.load_grid_transfer_connect_delay, OutBackModel.load_grid_transfer_disconnect_delay, OutBackModel.load_grid_transfer_connect_battery_voltage, OutBackModel.load_grid_transfer_re_connect_battery_voltage, OutBackModel.global_charger_control_mode, OutBackModel.global_charger_control_output_limit, OutBackModel.radian_ac_coupled_control_mode, OutBackModel.radian_ac_coupled_aux_port, OutBackModel.url_update_lock, OutBackModel.web_reporting_base_url, OutBackModel.web_user_logged_in_status, OutBackModel.hub_type, OutBackModel.hub_major_firmware_number, OutBackModel.hub_mid_firmware_number, OutBackModel.hub_minor_firmware_number, OutBackModel.year, OutBackModel.month, OutBackModel.day, OutBackModel.hour, OutBackModel.minute, OutBackModel.second, OutBackModel.temp_battery, OutBackModel.temp_ambient, OutBackModel.temp_scale_factor, OutBackModel.error, OutBackModel.status, OutBackModel.update_device_firmware_port, OutBackModel.gateway_type, OutBackModel.system_voltage, OutBackModel.measured_system_voltage, OutBackModel.ags_ac_reconnect_delay, OutBackModel.multi_phase_coordination, OutBackModel.sched_1_ac_mode, OutBackModel.sched_1_ac_mode_hour, OutBackModel.sched_1_ac_mode_minute, OutBackModel.sched_2_ac_mode, OutBackModel.sched_2_ac_mode_hour, OutBackModel.sched_2_ac_mode_minute, OutBackModel.sched_3_ac_mode, OutBackModel.sched_3_ac_mode_hour, OutBackModel.sched_3_ac_mode_minute, OutBackModel.auto_reboot, OutBackModel.time_zone_scale_factor, OutBackModel.spare_reg_3, OutBackModel.spare_reg_4] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Outback Interface") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 3, 1, Mode.R, description="OutBack Major firmware revision") + self.mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 4, 1, Mode.R, description="OutBack Mid firmware revision") + self.minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 5, 1, Mode.R, description="OutBack Minor firmware revision") + self.encryption_key: Uint16Field = Uint16Field("encryption_key", 6, 1, Mode.R, description="Encryption key for current session (0 = Encryption not enabled)") + self.mac_address: StringField = StringField("mac_address", 7, 7, Mode.R, description="Ethernet MAC address") + self.write_password: StringField = StringField("write_password", 14, 8, Mode.W, description="Password required to write to any register") + self.enable_dhcp: EnumUint16Field = EnumUint16Field("enable_dhcp", 22, 1, Mode.RW, options=Enum("enable_dhcp", [('DHCP Disabled, use configured network parameter', 0), ('DHCP Enabled', 1)]), description="0 = DHCP Disabled, use configured network parameter; 1 = DHCP Enabled") + self.tcpip_address: AddressField = AddressField("tcpip_address", 23, 2, Mode.RW, description="TCP/IP Address xxx.xxx.xxx.xxx") + self.tcpip_gateway_msw: AddressField = AddressField("tcpip_gateway_msw", 25, 2, Mode.RW, description="TCP/IP Gateway xxx.xxx.xxx.xxx") + self.tcpip_netmask_msw: AddressField = AddressField("tcpip_netmask_msw", 27, 2, Mode.RW, description="TCP/IP Netmask xxx.xxx.xxx.xxx") + self.tcpip_dns_1_msw: AddressField = AddressField("tcpip_dns_1_msw", 29, 2, Mode.RW, description="TCP/IP DNS 1 xxx.xxx.xxx.xxx") + self.tcpip_dns_2_msw: AddressField = AddressField("tcpip_dns_2_msw", 31, 2, Mode.RW, description="TCP/IP DNS 2 xxx.xxx.xxx.xxx") + self.modbus_port: Uint16Field = Uint16Field("modbus_port", 33, 1, Mode.RW, description="Outback MODBUS IP port, default 502") + self.smtp_server_name: StringField = StringField("smtp_server_name", 34, 20, Mode.RW, description="Email server name") + self.smtp_account_name: StringField = StringField("smtp_account_name", 54, 16, Mode.RW, description="Email account name") + self.smtp_ssl_enable: EnumUint16Field = EnumUint16Field("smtp_ssl_enable", 70, 1, Mode.RW, options=Enum("smtp_ssl_enable", [('SSL Disabled', 0), ('SSL Enabled (not implemented)', 1)]), description="0 = SSL Disabled; 1 = SSL Enabled (not implemented)") + self.smtp_email_password: StringField = StringField("smtp_email_password", 71, 8, Mode.W, description="Email account password") + self.smtp_email_user_name: StringField = StringField("smtp_email_user_name", 79, 20, Mode.RW, description="Email account User Name") + self.status_email_interval: Uint16Field = Uint16Field("status_email_interval", 99, 1, Mode.RW, description="0 = Status Email Disabled, 1-23 Status Email every n hours") + self.status_email_status_time: Uint16Field = Uint16Field("status_email_status_time", 100, 1, Mode.RW, description="Hour of first status email of the day") + self.status_email_subject_line: StringField = StringField("status_email_subject_line", 101, 25, Mode.RW, description="Status Email Subject Line") + self.status_email_to_address_1: StringField = StringField("status_email_to_address_1", 126, 20, Mode.RW, description="Status Email to Address 1") + self.status_email_to_address_2: StringField = StringField("status_email_to_address_2", 146, 20, Mode.RW, description="Status Email to Address 2") + self.alarm_email_enable: EnumUint16Field = EnumUint16Field("alarm_email_enable", 166, 1, Mode.RW, options=Enum("alarm_email_enable", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.system_name: StringField = StringField("system_name", 167, 30, Mode.RW, description="OutBack System Name") + self.alarm_email_to_address_1: StringField = StringField("alarm_email_to_address_1", 197, 15, Mode.RW, description="Status Alarm to Address 1") + self.alarm_email_to_address_2: StringField = StringField("alarm_email_to_address_2", 212, 20, Mode.RW, description="Status Alarm to Address 2") + self.ftp_password: StringField = StringField("ftp_password", 232, 8, Mode.W, description="FTP password") + self.telnet_password: StringField = StringField("telnet_password", 240, 8, Mode.W, description="Telnet password (not implemented)") + self.sd_card_data_log_write_interval: Uint16Field = Uint16Field("sd_card_data_log_write_interval", 248, 1, Mode.RW, description="0 = SD-Card Data Logging disabled, 1-60 seconds") + self.sd_card_data_log_retain_days: Uint16Field = Uint16Field("sd_card_data_log_retain_days", 249, 1, Mode.RW, description="0 = Log until SD-Card is full then erase oldest, 1-731 Number of days to retain data logs") + self.sd_card_data_logging_mode: EnumUint16Field = EnumUint16Field("sd_card_data_logging_mode", 250, 1, Mode.RW, options=Enum("sd_card_data_logging_mode", [('Compact Format', 2), ('Disabled', 0), ('Excel Format', 1)]), description="0 = Disabled; 1 = Excel Format; 2 = Compact Format") + self.time_server_name: StringField = StringField("time_server_name", 251, 20, Mode.RW, description="Timeserver domain name") + self.enable_time_server: EnumUint16Field = EnumUint16Field("enable_time_server", 271, 1, Mode.RW, options=Enum("enable_time_server", [('Time Server Enabled', 1), ('Time Server Disabled, use configured time parameters', 0)]), description="0 = Time Server Disabled, use configured time parameters; 1 = Time Server Enabled") + self.enable_float_coordination: EnumUint16Field = EnumUint16Field("enable_float_coordination", 273, 1, Mode.RW, options=Enum("enable_float_coordination", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.enable_fndc_charge_termination: EnumUint16Field = EnumUint16Field("enable_fndc_charge_termination", 274, 1, Mode.RW, options=Enum("enable_fndc_charge_termination", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.enable_fndc_grid_tie_control: EnumUint16Field = EnumUint16Field("enable_fndc_grid_tie_control", 275, 1, Mode.RW, options=Enum("enable_fndc_grid_tie_control", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.voltage_scale_factor: Int16Field = Int16Field("voltage_scale_factor", 276, 1, Mode.R, description="DC Voltage Scale Factor") + self.hour_scale_factor: Int16Field = Int16Field("hour_scale_factor", 277, 1, Mode.R, description="Hours Scale Factor") + self.ags_mode: EnumUint16Field = EnumUint16Field("ags_mode", 278, 1, Mode.RW, options=Enum("ags_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_port: Uint16Field = Uint16Field("ags_port", 279, 1, Mode.RW, description="AGS device port number 0-10") + self.ags_port_type: EnumUint16Field = EnumUint16Field("ags_port_type", 280, 1, Mode.RW, options=Enum("ags_port_type", [('Radian AUX Output', 1), ('Radian AUX Relay', 0)]), description="0=Radian AUX Relay, 1=Radian AUX Output") + self.ags_generator_type: EnumUint16Field = EnumUint16Field("ags_generator_type", 281, 1, Mode.RW, options=Enum("ags_generator_type", [('AC Gen', 0), ('DC Gen', 1), ('No Gen', 2)]), description="0=AC Gen, 1=DC Gen, 2=No Gen") + self.ags_fault_time: Uint16Field = Uint16Field("ags_fault_time", 284, 1, Mode.RW, units="Minutes", description="AGS Generator fault time delay") + self.ags_gen_cool_down_time: Uint16Field = Uint16Field("ags_gen_cool_down_time", 285, 1, Mode.RW, units="Minutes", description="AGS Generator Cool Down Time") + self.ags_gen_warm_up_time: Uint16Field = Uint16Field("ags_gen_warm_up_time", 286, 1, Mode.RW, units="Minutes", description="AGS Generator Warm Up Time") + self.ags_generator_exercise_mode: EnumUint16Field = EnumUint16Field("ags_generator_exercise_mode", 287, 1, Mode.RW, options=Enum("ags_generator_exercise_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_exercise_start_hour: Uint16Field = Uint16Field("ags_exercise_start_hour", 288, 1, Mode.RW, units="Hour", description="Exercise Start Hour 0-23") + self.ags_exercise_start_minute: Uint16Field = Uint16Field("ags_exercise_start_minute", 289, 1, Mode.RW, units="Minutes", description="Exercise Start Minute 0-59") + self.ags_exercise_day: EnumUint16Field = EnumUint16Field("ags_exercise_day", 290, 1, Mode.RW, options=Enum("ags_exercise_day", [('Fri', 5), ('Mon', 1), ('Sat', 6), ('Sun', 0), ('Thr', 4), ('Tue', 2), ('Wed', 3)]), description="0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thr, 5=Fri, 6=Sat") + self.ags_exercise_period: Uint16Field = Uint16Field("ags_exercise_period", 291, 1, Mode.RW, units="Minutes", description="Exercise Period 1-240 minutes") + self.ags_exercise_interval: Uint16Field = Uint16Field("ags_exercise_interval", 292, 1, Mode.RW, units="Weeks", description="Exercise interval 1-8 Weeks") + self.ags_sell_mode: EnumUint16Field = EnumUint16Field("ags_sell_mode", 293, 1, Mode.RW, options=Enum("ags_sell_mode", [('Selling Disabled', 1), ('Selling Enabled', 0)]), description="Sell During Generator Exercise Period, 0=Selling Enabled, 1=Selling Disabled") + self.ags_2_min_start_mode: EnumUint16Field = EnumUint16Field("ags_2_min_start_mode", 294, 1, Mode.RW, options=Enum("ags_2_min_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_2_hour_start_mode: EnumUint16Field = EnumUint16Field("ags_2_hour_start_mode", 296, 1, Mode.RW, options=Enum("ags_2_hour_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_24_hour_start_mode: EnumUint16Field = EnumUint16Field("ags_24_hour_start_mode", 298, 1, Mode.RW, options=Enum("ags_24_hour_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_load_start_mode: EnumUint16Field = EnumUint16Field("ags_load_start_mode", 300, 1, Mode.RW, options=Enum("ags_load_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_load_start_kw: Uint16Field = Uint16Field("ags_load_start_kw", 301, 1, Mode.RW, units="kWatts", description="Load Start kWatts") + self.ags_load_start_delay: Uint16Field = Uint16Field("ags_load_start_delay", 302, 1, Mode.RW, units="Minutes", description="Load Start Delay") + self.ags_load_stop_kw: Uint16Field = Uint16Field("ags_load_stop_kw", 303, 1, Mode.RW, units="kWatts", description="Load Stop kWatts") + self.ags_load_stop_delay: Uint16Field = Uint16Field("ags_load_stop_delay", 304, 1, Mode.RW, units="Minutes", description="Load Stop Delay") + self.ags_soc_start_mode: EnumUint16Field = EnumUint16Field("ags_soc_start_mode", 305, 1, Mode.RW, options=Enum("ags_soc_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_soc_start_percentage: Uint16Field = Uint16Field("ags_soc_start_percentage", 306, 1, Mode.RW, units="Percent", description="AGS SOC Start Percentage") + self.ags_soc_stop_percentage: Uint16Field = Uint16Field("ags_soc_stop_percentage", 307, 1, Mode.RW, units="Percent", description="AGS SOC Stop Percentage") + self.ags_enable_full_charge_mode: EnumUint16Field = EnumUint16Field("ags_enable_full_charge_mode", 308, 1, Mode.RW, options=Enum("ags_enable_full_charge_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_full_charge_interval: Uint16Field = Uint16Field("ags_full_charge_interval", 309, 1, Mode.RW, units="Days", description="AGS SOC Full Charge Interval") + self.ags_must_run_mode: EnumUint16Field = EnumUint16Field("ags_must_run_mode", 310, 1, Mode.RW, options=Enum("ags_must_run_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_must_run_weekday_start_hour: Uint16Field = Uint16Field("ags_must_run_weekday_start_hour", 311, 1, Mode.RW, units="Hour", description="AGS Must Run Weekday Start Hour 0-23") + self.ags_must_run_weekday_start_minute: Uint16Field = Uint16Field("ags_must_run_weekday_start_minute", 312, 1, Mode.RW, units="Minute", description="AGS Must Run Weekday Start Minute 0-59") + self.ags_must_run_weekday_stop_hour: Uint16Field = Uint16Field("ags_must_run_weekday_stop_hour", 313, 1, Mode.RW, units="Hour", description="AGS Must Run Weekday Stop Hour 0-23") + self.ags_must_run_weekday_stop_minute: Uint16Field = Uint16Field("ags_must_run_weekday_stop_minute", 314, 1, Mode.RW, units="Minute", description="AGS Must Run Weekday Stop Minute 0-59") + self.ags_must_run_weekend_start_hour: Uint16Field = Uint16Field("ags_must_run_weekend_start_hour", 315, 1, Mode.RW, units="Hour", description="AGS Must Run Weekend Start Hour 0-23") + self.ags_must_run_weekend_start_minute: Uint16Field = Uint16Field("ags_must_run_weekend_start_minute", 316, 1, Mode.RW, units="Minute", description="AGS Must Run Weekend Start Minute 0-59") + self.ags_must_run_weekend_stop_hour: Uint16Field = Uint16Field("ags_must_run_weekend_stop_hour", 317, 1, Mode.RW, units="Hour", description="AGS Must Run Weekend Stop Hour 0-23") + self.ags_must_run_weekend_stop_minute: Uint16Field = Uint16Field("ags_must_run_weekend_stop_minute", 318, 1, Mode.RW, units="Minute", description="AGS Must Run Weekend Stop Minute 0-59") + self.ags_quiet_time_mode: EnumUint16Field = EnumUint16Field("ags_quiet_time_mode", 319, 1, Mode.RW, options=Enum("ags_quiet_time_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_quiet_time_weekday_start_hour: Uint16Field = Uint16Field("ags_quiet_time_weekday_start_hour", 320, 1, Mode.RW, units="Hour", description="AGS Quiet Time Weekday Start Hour 0-23") + self.ags_quiet_time_weekday_start_minute: Uint16Field = Uint16Field("ags_quiet_time_weekday_start_minute", 321, 1, Mode.RW, units="Minute", description="AGS Quiet Time Weekday Start Minute 0-59") + self.ags_quiet_time_weekday_stop_hour: Uint16Field = Uint16Field("ags_quiet_time_weekday_stop_hour", 322, 1, Mode.RW, units="Hour", description="AGS Quiet Time Weekday Stop Hour 0-23") + self.ags_quiet_time_weekday_stop_minute: Uint16Field = Uint16Field("ags_quiet_time_weekday_stop_minute", 323, 1, Mode.RW, units="Minute", description="AGS Quiet Time Weekday Stop Minute 0-59") + self.ags_quiet_time_weekend_start_hour: Uint16Field = Uint16Field("ags_quiet_time_weekend_start_hour", 324, 1, Mode.RW, units="Hour", description="AGS Quiet Time Weekend Start Hour 0-23") + self.ags_quiet_time_weekend_start_minute: Uint16Field = Uint16Field("ags_quiet_time_weekend_start_minute", 325, 1, Mode.RW, units="Minute", description="AGS Quiet Time Weekend Start Minute 0-59") + self.ags_quiet_time_weekend_stop_hour: Uint16Field = Uint16Field("ags_quiet_time_weekend_stop_hour", 326, 1, Mode.RW, units="Hour", description="AGS Quiet Time Weekend Stop Hour 0-23") + self.ags_quiet_time_weekend_stop_minute: Uint16Field = Uint16Field("ags_quiet_time_weekend_stop_minute", 327, 1, Mode.RW, units="Minute", description="AGS Quiet Time Weekend Stop Minute 0-59") + self.ags_total_generator_run_time: Uint32Field = Uint32Field("ags_total_generator_run_time", 328, 2, Mode.RW, units="Hours", description="AGS Generator Total Run Time in Seconds") + self.hbx_mode: EnumUint16Field = EnumUint16Field("hbx_mode", 330, 1, Mode.RW, options=Enum("hbx_mode", [('Both', 3), ('Disabled', 0), ('SOC Only', 2), ('Voltage Only', 1)]), description="0=Disabled, 1=Voltage Only, 2=SOC Only, 3=Both") + self.hbx_grid_connect_soc: Uint16Field = Uint16Field("hbx_grid_connect_soc", 335, 1, Mode.RW, units="Percent", description="HBX Grid Connect SOC Percentage") + self.hbx_grid_disconnect_soc: Uint16Field = Uint16Field("hbx_grid_disconnect_soc", 336, 1, Mode.RW, units="Percent", description="HBX Grid Disconnect SOC Percentage") + self.grid_use_interval_1_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_1_mode", 337, 1, Mode.RW, options=Enum("grid_use_interval_1_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.grid_use_interval_1_weekday_start_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekday_start_hour", 338, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekday Start Hour 0-23") + self.grid_use_interval_1_weekday_start_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekday_start_minute", 339, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekday Start Minute 0-59") + self.grid_use_interval_1_weekday_stop_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekday_stop_hour", 340, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekday Stop Hour 0-23") + self.grid_use_interval_1_weekday_stop_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekday_stop_minute", 341, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekday Stop Minute 0-59") + self.grid_use_interval_1_weekend_start_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekend_start_hour", 342, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekend Start Hour 0-23") + self.grid_use_interval_1_weekend_start_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekend_start_minute", 343, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekend Start Minute 0-59") + self.grid_use_interval_1_weekend_stop_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekend_stop_hour", 344, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekend Stop Hour 0-23") + self.grid_use_interval_1_weekend_stop_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekend_stop_minute", 345, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekend Stop Minute 0-59") + self.grid_use_interval_2_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_2_mode", 346, 1, Mode.RW, options=Enum("grid_use_interval_2_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.grid_use_interval_2_weekday_start_hour: Uint16Field = Uint16Field("grid_use_interval_2_weekday_start_hour", 347, 1, Mode.RW, units="Hour", description="Grid Use Interval 2 Weekday Start Hour 0-23") + self.grid_use_interval_2_weekday_start_minute: Uint16Field = Uint16Field("grid_use_interval_2_weekday_start_minute", 348, 1, Mode.RW, units="Hour", description="Grid Use Interval 2 Weekday Start Minute 0-59") + self.grid_use_interval_2_weekday_stop_hour: Uint16Field = Uint16Field("grid_use_interval_2_weekday_stop_hour", 349, 1, Mode.RW, units="Hour", description="Grid Use Interval 2 Weekday Stop Hour 0-23") + self.grid_use_interval_2_weekday_stop_minute: Uint16Field = Uint16Field("grid_use_interval_2_weekday_stop_minute", 350, 1, Mode.RW, units="Hour", description="Grid Use Interval 2 Weekday Stop Minute 0-59") + self.grid_use_interval_3_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_3_mode", 351, 1, Mode.RW, options=Enum("grid_use_interval_3_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.grid_use_interval_3_weekday_start_hour: Uint16Field = Uint16Field("grid_use_interval_3_weekday_start_hour", 352, 1, Mode.RW, units="Hour", description="Grid Use Interval 3 Weekday Start Hour 0-23") + self.grid_use_interval_3_weekday_start_minute: Uint16Field = Uint16Field("grid_use_interval_3_weekday_start_minute", 353, 1, Mode.RW, units="Hour", description="Grid Use Interval 3 Weekday Start Minute 0-59") + self.grid_use_interval_3_weekday_stop_hour: Uint16Field = Uint16Field("grid_use_interval_3_weekday_stop_hour", 354, 1, Mode.RW, units="Hour", description="Grid Use Interval 3 Weekday Stop Hour 0-23") + self.grid_use_interval_3_weekday_stop_minute: Uint16Field = Uint16Field("grid_use_interval_3_weekday_stop_minute", 355, 1, Mode.RW, units="Hour", description="Grid Use Interval 3 Weekday Stop Minute 0-59") + self.load_grid_transfer_mode: EnumUint16Field = EnumUint16Field("load_grid_transfer_mode", 356, 1, Mode.RW, options=Enum("load_grid_transfer_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.load_grid_transfer_connect_delay: Uint16Field = Uint16Field("load_grid_transfer_connect_delay", 358, 1, Mode.RW, units="Seconds", description="Load Grid Transfer Connect Delay Seconds") + self.load_grid_transfer_disconnect_delay: Uint16Field = Uint16Field("load_grid_transfer_disconnect_delay", 359, 1, Mode.RW, units="Seconds", description="Load Grid Transfer Disconnect Delay Seconds") + self.global_charger_control_mode: EnumUint16Field = EnumUint16Field("global_charger_control_mode", 362, 1, Mode.RW, options=Enum("global_charger_control_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.global_charger_control_output_limit: Uint16Field = Uint16Field("global_charger_control_output_limit", 363, 1, Mode.RW, units="Amps", description="Global Charger Output Limit Amps") + self.radian_ac_coupled_control_mode: EnumUint16Field = EnumUint16Field("radian_ac_coupled_control_mode", 364, 1, Mode.RW, options=Enum("radian_ac_coupled_control_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.radian_ac_coupled_aux_port: Uint16Field = Uint16Field("radian_ac_coupled_aux_port", 365, 1, Mode.RW, units="Port", description="Radian Inverter Port Number for AUX Control 0-10") + self.url_update_lock: Uint32Field = Uint32Field("url_update_lock", 366, 2, Mode.W, units="key", description="Unlock Key") + self.web_reporting_base_url: StringField = StringField("web_reporting_base_url", 368, 20, Mode.RW, description="WEB Reporting Base URL") + self.web_user_logged_in_status: EnumUint16Field = EnumUint16Field("web_user_logged_in_status", 388, 1, Mode.RW, options=Enum("web_user_logged_in_status", [('WEB User NOT logged in', 0), ('WEB user logged in', 1)]), description="0=WEB User NOT logged in, 1=WEB user logged in") + self.hub_type: EnumUint16Field = EnumUint16Field("hub_type", 389, 1, Mode.R, options=Enum("hub_type", [('HUB10.3', 10), ('HUB3PH', 11), ('HUB4', 4), ('Legecy HUB', 0)]), description="0=Legecy HUB, 4= HUB4, 10=HUB10.3, 11=HUB3PH") + self.hub_major_firmware_number: Uint16Field = Uint16Field("hub_major_firmware_number", 390, 1, Mode.R, description="HUB Major firmware revision") + self.hub_mid_firmware_number: Uint16Field = Uint16Field("hub_mid_firmware_number", 391, 1, Mode.R, description="HUB Mid firmware revision") + self.hub_minor_firmware_number: Uint16Field = Uint16Field("hub_minor_firmware_number", 392, 1, Mode.R, description="HUB Minor firmware revision") + self.year: Uint16Field = Uint16Field("year", 393, 1, Mode.RW, description="Clock year (4 digit)") + self.month: Uint16Field = Uint16Field("month", 394, 1, Mode.RW, description="Clock Month (1 - 12)") + self.day: Uint16Field = Uint16Field("day", 395, 1, Mode.RW, description="Clock Day (1 - 31)") + self.hour: Uint16Field = Uint16Field("hour", 396, 1, Mode.RW, description="Clock Hour (0 - 23)") + self.minute: Uint16Field = Uint16Field("minute", 397, 1, Mode.RW, description="Clock Minute (0 - 59)") + self.second: Uint16Field = Uint16Field("second", 398, 1, Mode.RW, description="Clock Second (0 - 59)") + self.temp_battery: Int16Field = Int16Field("temp_battery", 399, 1, Mode.R, units="Degrees C", description="Battery temp in degrees C") + self.temp_ambient: Int16Field = Int16Field("temp_ambient", 400, 1, Mode.R, units="Degrees C", description="Ambient temp from temp sensor connected to device, in degrees C") + self.temp_scale_factor: Int16Field = Int16Field("temp_scale_factor", 401, 1, Mode.R, description="Temperature Scale Factor") + self.error: Bit16Field = Bit16Field("error", 402, 1, Mode.R, flags=OutBackErrorFlags, description="Bit field for errors. See Outback_Error Table") + self.status: Bit16Field = Bit16Field("status", 403, 1, Mode.R, flags=OutBackStatusFlags, description="Bit field for status.See Outback_Status Table") + self.update_device_firmware_port: Bit16Field = Bit16Field("update_device_firmware_port", 404, 1, Mode.RW, flags=OutBackUpdateDeviceFirmwarePortFlags, description="Device Firmware update See Device_FW_Update") + self.gateway_type: EnumUint16Field = EnumUint16Field("gateway_type", 405, 1, Mode.R, options=Enum("gateway_type", [('AXS Port', 1), ('MATE3', 2)]), description="1=AXS Port, 2= MATE3") + self.system_voltage: Uint16Field = Uint16Field("system_voltage", 406, 1, Mode.R, units="Volts", description="12, 24, 26, 48 or 60 VDC") + self.ags_ac_reconnect_delay: Uint16Field = Uint16Field("ags_ac_reconnect_delay", 408, 1, Mode.RW, units="Minute", description="AGS AC Reconnect Delay") + self.multi_phase_coordination: EnumUint16Field = EnumUint16Field("multi_phase_coordination", 409, 1, Mode.RW, options=Enum("multi_phase_coordination", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.sched_1_ac_mode: EnumInt16Field = EnumInt16Field("sched_1_ac_mode", 410, 1, Mode.RW, options=Enum("sched_1_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.sched_1_ac_mode_hour: Uint16Field = Uint16Field("sched_1_ac_mode_hour", 411, 1, Mode.RW, units="Hour", description="Start Hour for AC Input Mode schedule 1") + self.sched_1_ac_mode_minute: Uint16Field = Uint16Field("sched_1_ac_mode_minute", 412, 1, Mode.RW, units="Minute", description="Start Minute for AC Input Mode schedule 1") + self.sched_2_ac_mode: EnumInt16Field = EnumInt16Field("sched_2_ac_mode", 413, 1, Mode.RW, options=Enum("sched_2_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.sched_2_ac_mode_hour: Uint16Field = Uint16Field("sched_2_ac_mode_hour", 414, 1, Mode.RW, units="Hour", description="Start Hour for AC Input Mode schedule 2") + self.sched_2_ac_mode_minute: Uint16Field = Uint16Field("sched_2_ac_mode_minute", 415, 1, Mode.RW, units="Minute", description="Start Minute for AC Input Mode schedule 2") + self.sched_3_ac_mode: EnumInt16Field = EnumInt16Field("sched_3_ac_mode", 416, 1, Mode.RW, options=Enum("sched_3_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.sched_3_ac_mode_hour: Uint16Field = Uint16Field("sched_3_ac_mode_hour", 417, 1, Mode.RW, units="Hour", description="Start Hour for AC Input Mode schedule 3") + self.sched_3_ac_mode_minute: Uint16Field = Uint16Field("sched_3_ac_mode_minute", 418, 1, Mode.RW, units="Minute", description="Start Minute for AC Input Mode schedule 3") + self.auto_reboot: EnumUint16Field = EnumUint16Field("auto_reboot", 419, 1, Mode.RW, options=Enum("auto_reboot", [('Disable', 0), ('Enable', 1)]), description="OPTICS auto reboot every 24 hours 0=Disable, 1=Enable") + self.time_zone_scale_factor: Int16Field = Int16Field("time_zone_scale_factor", 420, 1, Mode.R, description="Time Zone scale factor") + self.spare_reg_3: Uint16Field = Uint16Field("spare_reg_3", 421, 1, Mode.RW, description="Spare Register 3") + self.spare_reg_4: Uint16Field = Uint16Field("spare_reg_4", 422, 1, Mode.RW, description="Spare Register 4") + self.set_time_zone: FloatInt16Field = FloatInt16Field("set_time_zone", 272, 1, Mode.RW, units="Hours", scale_factor=self.time_zone_scale_factor, description="Time Zone -12.0 \u2026 +14.0") + self.ags_dc_gen_absorb_voltage: FloatUint16Field = FloatUint16Field("ags_dc_gen_absorb_voltage", 282, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="DC Generator Absorb Voltage") + self.ags_dc_gen_absorb_time: FloatUint16Field = FloatUint16Field("ags_dc_gen_absorb_time", 283, 1, Mode.RW, units="Hour", scale_factor=self.hour_scale_factor, description="DC Generator Absorb Time") + self.ags_2_min_start_voltage: FloatUint16Field = FloatUint16Field("ags_2_min_start_voltage", 295, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Two Minute AGS Start Voltage") + self.ags_2_hour_start_voltage: FloatUint16Field = FloatUint16Field("ags_2_hour_start_voltage", 297, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Two Hour AGS Start Voltage") + self.ags_24_hour_start_voltage: FloatUint16Field = FloatUint16Field("ags_24_hour_start_voltage", 299, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Twenty Four Hour AGS Start Voltage") + self.hbx_grid_connect_voltage: FloatUint16Field = FloatUint16Field("hbx_grid_connect_voltage", 331, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="HBX Grid Connect Voltage") + self.hbx_grid_connect_delay: FloatUint16Field = FloatUint16Field("hbx_grid_connect_delay", 332, 1, Mode.RW, units="Hours", scale_factor=self.hour_scale_factor, description="HBX Grid Connect Delay") + self.hbx_grid_disconnect_voltage: FloatUint16Field = FloatUint16Field("hbx_grid_disconnect_voltage", 333, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="HBX Grid Disconnect Voltage") + self.hbx_grid_disconnect_delay: FloatUint16Field = FloatUint16Field("hbx_grid_disconnect_delay", 334, 1, Mode.RW, units="Hours", scale_factor=self.hour_scale_factor, description="HBX Grid Disconnect Delay") + self.load_grid_transfer_threshold: FloatUint16Field = FloatUint16Field("load_grid_transfer_threshold", 357, 1, Mode.RW, units="kWatts", scale_factor=self.voltage_scale_factor, description="Load Grid Transfer Threshold kW") + self.load_grid_transfer_connect_battery_voltage: FloatUint16Field = FloatUint16Field("load_grid_transfer_connect_battery_voltage", 360, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Load Grid Transfer Low Battery Connect Voltage") + self.load_grid_transfer_re_connect_battery_voltage: FloatUint16Field = FloatUint16Field("load_grid_transfer_re_connect_battery_voltage", 361, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Load Grid Transfer Low Battery Re-Connect Voltage") + self.measured_system_voltage: FloatUint16Field = FloatUint16Field("measured_system_voltage", 407, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="Current system battery voltage computed by gateway") class ChargeControllerModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Basic Charge Controller") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") - voltage_scale_factor: Int16Field = Int16Field("voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") - current_scale_factor: Int16Field = Int16Field("current_scale_factor", 5, 1, Mode.R, description="DC Current Scale Factor") - power_scale_factor: Int16Field = Int16Field("power_scale_factor", 6, 1, Mode.R, description="DC Power Scale Factor") - ah_scale_factor: Int16Field = Int16Field("ah_scale_factor", 7, 1, Mode.R, description="DC Amp Hours Scale Factor") - kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 8, 1, Mode.R, description="DC kWH Scale Factor") - battery_voltage: Uint16Field = Uint16Field("battery_voltage", 9, 1, Mode.R, description="Battery Voltage", units="Volts") - array_voltage: Uint16Field = Uint16Field("array_voltage", 10, 1, Mode.R, description="DC Source Voltage", units="Volts") - battery_current: Uint16Field = Uint16Field("battery_current", 11, 1, Mode.R, description="Battery Current", units="Amps") - array_current: Uint16Field = Uint16Field("array_current", 12, 1, Mode.R, description="DC Source Current", units="Amps") - charger_state: EnumUint16Field = EnumUint16Field("charger_state", 13, 1, Mode.R, description="0 = Silent; 1 = Float; 2 = Bulk; 3 = Absorb; 4 = EQ", options=Enum("charger_state", [('Absorb', 3), ('Bulk', 2), ('EQ', 4), ('Float', 1), ('Silent', 0)])) - watts: Uint16Field = Uint16Field("watts", 14, 1, Mode.R, description="CC Wattage Output", units="Watts") - todays_min_battery_volts: Uint16Field = Uint16Field("todays_min_battery_volts", 15, 1, Mode.R, description="Minimum Voltage for battery today", units="Volts") - todays_max_battery_volts: Uint16Field = Uint16Field("todays_max_battery_volts", 16, 1, Mode.R, description="Maximum Voltage for battery today", units="Volts") - voc: Uint16Field = Uint16Field("voc", 17, 1, Mode.R, description="Last Open Circuit Voltage (array)", units="Volts") - todays_peak_voc: Uint16Field = Uint16Field("todays_peak_voc", 18, 1, Mode.R, description="Highest VOC today", units="Volts") - todays_kwh: Uint16Field = Uint16Field("todays_kwh", 19, 1, Mode.R, description="Daily accumulated Kwatt hours output", units="KWH") - todays_ah: Uint16Field = Uint16Field("todays_ah", 20, 1, Mode.R, description="Daily accumulated amp hours output", units="AH") - lifetime_kwh_hours: Uint16Field = Uint16Field("lifetime_kwh_hours", 21, 1, Mode.R, description="Lifetime Total Kwatt Hours", units="KWH") - lifetime_k_amp_hours: Uint16Field = Uint16Field("lifetime_k_amp_hours", 22, 1, Mode.R, description="Lifetime Total K-Amp Hours", units="Amps") - lifetime_max_watts: Uint16Field = Uint16Field("lifetime_max_watts", 23, 1, Mode.R, description="Lifetime Maximum Wattage", units="Watts") - lifetime_max_battery_volts: Uint16Field = Uint16Field("lifetime_max_battery_volts", 24, 1, Mode.R, description="Lifetime Maximum Battery Voltage", units="Volts") - lifetime_max_voc: Uint16Field = Uint16Field("lifetime_max_voc", 25, 1, Mode.R, description="Lifetime Maximum VOC", units="Volts") - temp_scale_factor: Uint16Field = Uint16Field("temp_scale_factor", 26, 1, Mode.R, description="FM80 Extreme Temperature scale factor") - temp_output_fets: Int16Field = Int16Field("temp_output_fets", 27, 1, Mode.R, description="FM80 Extreme Output FET Temperature", units="Degrees C") - temp_enclosure: Int16Field = Int16Field("temp_enclosure", 28, 1, Mode.R, description="FM80 Extreme Enclosure Temperature", units="Degrees C") - - -ChargeControllerModel.battery_voltage.scale_factor = ChargeControllerModel.voltage_scale_factor -ChargeControllerModel.array_voltage.scale_factor = ChargeControllerModel.voltage_scale_factor -ChargeControllerModel.battery_current.scale_factor = ChargeControllerModel.current_scale_factor -ChargeControllerModel.array_current.scale_factor = ChargeControllerModel.power_scale_factor -ChargeControllerModel.watts.scale_factor = ChargeControllerModel.power_scale_factor -ChargeControllerModel.todays_min_battery_volts.scale_factor = ChargeControllerModel.voltage_scale_factor -ChargeControllerModel.todays_max_battery_volts.scale_factor = ChargeControllerModel.voltage_scale_factor -ChargeControllerModel.voc.scale_factor = ChargeControllerModel.voltage_scale_factor -ChargeControllerModel.todays_kwh.scale_factor = ChargeControllerModel.kwh_scale_factor -ChargeControllerModel.todays_ah.scale_factor = ChargeControllerModel.ah_scale_factor -ChargeControllerModel.lifetime_k_amp_hours.scale_factor = ChargeControllerModel.kwh_scale_factor -ChargeControllerModel.lifetime_max_watts.scale_factor = ChargeControllerModel.power_scale_factor -ChargeControllerModel.lifetime_max_battery_volts.scale_factor = ChargeControllerModel.voltage_scale_factor -ChargeControllerModel.lifetime_max_voc.scale_factor = ChargeControllerModel.voltage_scale_factor -ChargeControllerModel.temp_output_fets.scale_factor = ChargeControllerModel.power_scale_factor -ChargeControllerModel.temp_enclosure.scale_factor = ChargeControllerModel.power_scale_factor -ChargeControllerModel.__model_fields__ = [ChargeControllerModel.did, ChargeControllerModel.length, ChargeControllerModel.port_number, ChargeControllerModel.voltage_scale_factor, ChargeControllerModel.current_scale_factor, ChargeControllerModel.power_scale_factor, ChargeControllerModel.ah_scale_factor, ChargeControllerModel.kwh_scale_factor, ChargeControllerModel.battery_voltage, ChargeControllerModel.array_voltage, ChargeControllerModel.battery_current, ChargeControllerModel.array_current, ChargeControllerModel.charger_state, ChargeControllerModel.watts, ChargeControllerModel.todays_min_battery_volts, ChargeControllerModel.todays_max_battery_volts, ChargeControllerModel.voc, ChargeControllerModel.todays_peak_voc, ChargeControllerModel.todays_kwh, ChargeControllerModel.todays_ah, ChargeControllerModel.lifetime_kwh_hours, ChargeControllerModel.lifetime_k_amp_hours, ChargeControllerModel.lifetime_max_watts, ChargeControllerModel.lifetime_max_battery_volts, ChargeControllerModel.lifetime_max_voc, ChargeControllerModel.temp_scale_factor, ChargeControllerModel.temp_output_fets, ChargeControllerModel.temp_enclosure] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Uniquely identifies this as a SunSpec Basic Charge Controller") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") + self.voltage_scale_factor: Int16Field = Int16Field("voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") + self.current_scale_factor: Int16Field = Int16Field("current_scale_factor", 5, 1, Mode.R, description="DC Current Scale Factor") + self.power_scale_factor: Int16Field = Int16Field("power_scale_factor", 6, 1, Mode.R, description="DC Power Scale Factor") + self.ah_scale_factor: Int16Field = Int16Field("ah_scale_factor", 7, 1, Mode.R, description="DC Amp Hours Scale Factor") + self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 8, 1, Mode.R, description="DC kWH Scale Factor") + self.charger_state: EnumUint16Field = EnumUint16Field("charger_state", 13, 1, Mode.R, options=Enum("charger_state", [('Absorb', 3), ('Bulk', 2), ('EQ', 4), ('Float', 1), ('Silent', 0)]), description="0 = Silent; 1 = Float; 2 = Bulk; 3 = Absorb; 4 = EQ") + self.todays_peak_voc: Uint16Field = Uint16Field("todays_peak_voc", 18, 1, Mode.R, units="Volts", description="Highest VOC today") + self.lifetime_kwh_hours: Uint16Field = Uint16Field("lifetime_kwh_hours", 21, 1, Mode.R, units="KWH", description="Lifetime Total Kwatt Hours") + self.temp_scale_factor: Uint16Field = Uint16Field("temp_scale_factor", 26, 1, Mode.R, description="FM80 Extreme Temperature scale factor") + self.battery_voltage: FloatUint16Field = FloatUint16Field("battery_voltage", 9, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="Battery Voltage") + self.array_voltage: FloatUint16Field = FloatUint16Field("array_voltage", 10, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="DC Source Voltage") + self.battery_current: FloatUint16Field = FloatUint16Field("battery_current", 11, 1, Mode.R, units="Amps", scale_factor=self.current_scale_factor, description="Battery Current") + self.array_current: FloatUint16Field = FloatUint16Field("array_current", 12, 1, Mode.R, units="Amps", scale_factor=self.power_scale_factor, description="DC Source Current") + self.watts: FloatUint16Field = FloatUint16Field("watts", 14, 1, Mode.R, units="Watts", scale_factor=self.power_scale_factor, description="CC Wattage Output") + self.todays_min_battery_volts: FloatUint16Field = FloatUint16Field("todays_min_battery_volts", 15, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="Minimum Voltage for battery today") + self.todays_max_battery_volts: FloatUint16Field = FloatUint16Field("todays_max_battery_volts", 16, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="Maximum Voltage for battery today") + self.voc: FloatUint16Field = FloatUint16Field("voc", 17, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="Last Open Circuit Voltage (array)") + self.todays_kwh: FloatUint16Field = FloatUint16Field("todays_kwh", 19, 1, Mode.R, units="KWH", scale_factor=self.kwh_scale_factor, description="Daily accumulated Kwatt hours output") + self.todays_ah: FloatUint16Field = FloatUint16Field("todays_ah", 20, 1, Mode.R, units="AH", scale_factor=self.ah_scale_factor, description="Daily accumulated amp hours output") + self.lifetime_k_amp_hours: FloatUint16Field = FloatUint16Field("lifetime_k_amp_hours", 22, 1, Mode.R, units="Amps", scale_factor=self.kwh_scale_factor, description="Lifetime Total K-Amp Hours") + self.lifetime_max_watts: FloatUint16Field = FloatUint16Field("lifetime_max_watts", 23, 1, Mode.R, units="Watts", scale_factor=self.power_scale_factor, description="Lifetime Maximum Wattage") + self.lifetime_max_battery_volts: FloatUint16Field = FloatUint16Field("lifetime_max_battery_volts", 24, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="Lifetime Maximum Battery Voltage") + self.lifetime_max_voc: FloatUint16Field = FloatUint16Field("lifetime_max_voc", 25, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="Lifetime Maximum VOC") + self.temp_output_fets: FloatInt16Field = FloatInt16Field("temp_output_fets", 27, 1, Mode.R, units="Degrees C", scale_factor=self.power_scale_factor, description="FM80 Extreme Output FET Temperature") + self.temp_enclosure: FloatInt16Field = FloatInt16Field("temp_enclosure", 28, 1, Mode.R, units="Degrees C", scale_factor=self.power_scale_factor, description="FM80 Extreme Enclosure Temperature") class ChargeControllerConfigurationModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FM Series Charge Controllers") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") - voltage_scale_factor: Int16Field = Int16Field("voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") - current_scale_factor: Int16Field = Int16Field("current_scale_factor", 5, 1, Mode.R, description="DC Current Scale Factor") - hours_scale_factor: Int16Field = Int16Field("hours_scale_factor", 6, 1, Mode.R, description="Time in Hours Scale Factor") - power_scale_factor: Int16Field = Int16Field("power_scale_factor", 7, 1, Mode.R, description="Power Scale Factor") - ah_scale_factor: Int16Field = Int16Field("ah_scale_factor", 8, 1, Mode.R, description="Amp Hours Scale Factor") - kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 9, 1, Mode.R, description="DC kWH Scale Factor") - faults: Bit16Field = Bit16Field("faults", 10, 1, Mode.R, description="CC Error Flags: 0x0080=High VOC, 0x0040=Over Temp, 0x0020=Shorted Battery Temp Sensor, 0x0010=Fault Input Active", flags=CCconfigFaultsFlags) - absorb_volts: Uint16Field = Uint16Field("absorb_volts", 11, 1, Mode.RW, description="Absorb Voltage Target", units="Volts") - absorb_time_hours: Uint16Field = Uint16Field("absorb_time_hours", 12, 1, Mode.RW, description="Absorb Time Hours", units="Hours") - absorb_end_amps: Uint16Field = Uint16Field("absorb_end_amps", 13, 1, Mode.RW, description="Amperage to end Absorbing", units="Amps") - rebulk_volts: Uint16Field = Uint16Field("rebulk_volts", 14, 1, Mode.RW, description="Voltage to re-initiate Bulk charge", units="Volts") - float_volts: Uint16Field = Uint16Field("float_volts", 15, 1, Mode.RW, description="Float Voltage Target", units="Volts") - bulk_current: Uint16Field = Uint16Field("bulk_current", 16, 1, Mode.RW, description="Max Output Current Limit", units="Amps") - eq_volts: Uint16Field = Uint16Field("eq_volts", 17, 1, Mode.RW, description="Target Voltage for Equalize", units="Volts") - eq_time_hours: Uint16Field = Uint16Field("eq_time_hours", 18, 1, Mode.RW, description="EQ Time Hours", units="Hours") - auto_eq_days: Uint16Field = Uint16Field("auto_eq_days", 19, 1, Mode.RW, description="Auto EQ Interval Days", units="Days") - mppt_mode: EnumUint16Field = EnumUint16Field("mppt_mode", 20, 1, Mode.RW, description="0 = Auto; 1 = U-Pick", options=Enum("mppt_mode", [('Auto', 0), ('U-Pick', 1)])) - sweep_width: EnumUint16Field = EnumUint16Field("sweep_width", 21, 1, Mode.RW, description="0 = Full; 1 = Half", options=Enum("sweep_width", [('Full', 0), ('Half', 1)])) - sweep_max_percentage: EnumUint16Field = EnumUint16Field("sweep_max_percentage", 22, 1, Mode.RW, description="0 = 80; 1 = 85; 2 = 90; 3 = 99", options=Enum("sweep_max_percentage", [('80', 0), ('85', 1), ('90', 2), ('99', 3)])) - u_pick_pwm_duty_cycle: Uint16Field = Uint16Field("u_pick_pwm_duty_cycle", 23, 1, Mode.RW, description="Park Duty Cycle (%) (40% - 90%)", units="Percentage") - grid_tie_mode: EnumUint16Field = EnumUint16Field("grid_tie_mode", 24, 1, Mode.RW, description="0 = Grid Tie Mode disabled; 1 = Grid Tie Mode enabled", options=Enum("grid_tie_mode", [('Grid Tie Mode disabled', 0), ('Grid Tie Mode enabled', 1)])) - temp_comp_mode: EnumUint16Field = EnumUint16Field("temp_comp_mode", 25, 1, Mode.RW, description="0 = Wide; 1 = User Limited", options=Enum("temp_comp_mode", [('User Limited', 1), ('Wide', 0)])) - temp_comp_lower_limit_volts: Uint16Field = Uint16Field("temp_comp_lower_limit_volts", 26, 1, Mode.RW, description="RTS compensation lower voltage limit", units="Volts") - temp_comp_upper_limit_volts: Uint16Field = Uint16Field("temp_comp_upper_limit_volts", 27, 1, Mode.RW, description="RTS compensation upper voltage limit", units="Volts") - temp_comp_slope: Uint16Field = Uint16Field("temp_comp_slope", 28, 1, Mode.RW, description="RTS temp compensation Slope 2-6 mV per Degree C", units="Milli Volts") - auto_restart_mode: EnumUint16Field = EnumUint16Field("auto_restart_mode", 29, 1, Mode.RW, description="0 = Off; 1 = Restart every 90 minutes; 2 = Restart every 90 minutes if absorb charging or float charging", options=Enum("auto_restart_mode", [('Off', 0), ('Restart every 90 minutes', 1), ('Restart every 90 minutes if absorb charging or float charging', 2)])) - wakeup_voc: Uint16Field = Uint16Field("wakeup_voc", 30, 1, Mode.RW, description="VOC change which causes Wakeup occurs", units="Volts") - snooze_mode_amps: Uint16Field = Uint16Field("snooze_mode_amps", 31, 1, Mode.RW, description="Snooze Mode Amps", units="Amps") - wakeup_interval: Uint16Field = Uint16Field("wakeup_interval", 32, 1, Mode.RW, description="How often to check for Wakeup condition", units="Mins") - aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 33, 1, Mode.RW, description="0 = Float; 1 = Diversion: Relay; 2 = Diversion: Solid St; 3 = Low Batt Disconnect; 4 = Remote; 5 = Vent Fan; 6 = PV Trigger; 7 = Error Output; 8 = Night Light", options=Enum("aux_mode", [('Diversion: Relay', 1), ('Diversion: Solid St', 2), ('Error Output', 7), ('Float', 0), ('Low Batt Disconnect', 3), ('Night Light', 8), ('PV Trigger', 6), ('Remote', 4), ('Vent Fan', 5)])) - aux_control: EnumUint16Field = EnumUint16Field("aux_control", 34, 1, Mode.RW, description="0 = Off; 1 = Auto; 2 = On", options=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)])) - aux_state: EnumUint16Field = EnumUint16Field("aux_state", 35, 1, Mode.R, description="0 = Disabled; 1 = Enabled", options=Enum("aux_state", [('Disabled', 0), ('Enabled', 1)])) - aux_polarity: EnumUint16Field = EnumUint16Field("aux_polarity", 36, 1, Mode.RW, description="0 = Low; 1 = High", options=Enum("aux_polarity", [('High', 1), ('Low', 0)])) - aux_low_battery_disconnect: Uint16Field = Uint16Field("aux_low_battery_disconnect", 37, 1, Mode.RW, description="Low Battery Disconnect Voltage", units="Volts") - aux_low_battery_reconnect: Uint16Field = Uint16Field("aux_low_battery_reconnect", 38, 1, Mode.RW, description="Low Battery Reconnect Volts", units="Volts") - aux_low_battery_disconnect_delay: Uint16Field = Uint16Field("aux_low_battery_disconnect_delay", 39, 1, Mode.RW, description="Low Battery Disconnect Delay (secs)", units="Secs") - aux_vent_fan_volts: Uint16Field = Uint16Field("aux_vent_fan_volts", 40, 1, Mode.RW, description="Vent Fan Voltage", units="Volts") - aux_pv_limit_volts: Uint16Field = Uint16Field("aux_pv_limit_volts", 41, 1, Mode.RW, description="Voltage at which PV disconnect occurs", units="Volts") - aux_pv_limit_hold_time: Uint16Field = Uint16Field("aux_pv_limit_hold_time", 42, 1, Mode.RW, description="AUX PV Trigger Hold Time", units="Secs") - aux_night_light_thres_volts: Uint16Field = Uint16Field("aux_night_light_thres_volts", 43, 1, Mode.RW, description="Voltage Threshold for AUX Night Light", units="Volts") - night_light_on_hours: Uint16Field = Uint16Field("night_light_on_hours", 44, 1, Mode.RW, description="Night Light ON Time", units="Hours") - night_light_on_hyst_time: Uint16Field = Uint16Field("night_light_on_hyst_time", 45, 1, Mode.RW, description="Night Light ON Hyst Time", units="Mins") - night_light_off_hyst_time: Uint16Field = Uint16Field("night_light_off_hyst_time", 46, 1, Mode.RW, description="Night Light OFF Hyst Time", units="Mins") - aux_error_battery_volts: Uint16Field = Uint16Field("aux_error_battery_volts", 47, 1, Mode.RW, description="Battery voltage at which Aux Error occurs", units="Volts") - aux_divert_hold_time: Uint16Field = Uint16Field("aux_divert_hold_time", 48, 1, Mode.RW, description="AUX Diver Hold Time", units="Seconds") - aux_divert_delay_time: Uint16Field = Uint16Field("aux_divert_delay_time", 49, 1, Mode.RW, description="AUX Divert Delay", units="Secs") - aux_divert_relative_volts: Int16Field = Int16Field("aux_divert_relative_volts", 50, 1, Mode.RW, description="AUX Divert Relative Volts", units="Volts") - aux_divert_hyst_volts: Uint16Field = Uint16Field("aux_divert_hyst_volts", 51, 1, Mode.RW, description="AUX Divert Hyst Volts", units="Volts") - major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 52, 1, Mode.R, description="Charge Controller Major firmware revision") - mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 53, 1, Mode.R, description="Charge Controller Mid firmware revision") - minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 54, 1, Mode.R, description="Charge Controller Minor firmware revision") - set_data_log_day_offset: Uint16Field = Uint16Field("set_data_log_day_offset", 55, 1, Mode.RW, description="Day offset 0-128, 0 =Today, 1 = -1 day \u2026", units="Days") - get_current_data_log_day_offset: Uint16Field = Uint16Field("get_current_data_log_day_offset", 56, 1, Mode.R, description="Current Data Log Day Offset", units="Days") - data_log_daily_ah: Uint16Field = Uint16Field("data_log_daily_ah", 57, 1, Mode.R, description="Data Log AH", units="AH") - data_log_daily_kwh: Uint16Field = Uint16Field("data_log_daily_kwh", 58, 1, Mode.R, description="Data Log kWH", units="KWH") - data_log_daily_max_output_amps: Uint16Field = Uint16Field("data_log_daily_max_output_amps", 59, 1, Mode.R, description="Data Log maximum Output Amps", units="Amps") - data_log_daily_max_output_watts: Uint16Field = Uint16Field("data_log_daily_max_output_watts", 60, 1, Mode.R, description="Data Log maximum Output Wattage", units="Watts") - data_log_daily_absorb_time: Uint16Field = Uint16Field("data_log_daily_absorb_time", 61, 1, Mode.R, description="Data Log Absorb Time Minutes", units="Mins") - data_log_daily_float_time: Uint16Field = Uint16Field("data_log_daily_float_time", 62, 1, Mode.R, description="Data Log Float Time Minutes", units="Mins") - data_log_daily_min_battery_volts: Uint16Field = Uint16Field("data_log_daily_min_battery_volts", 63, 1, Mode.R, description="Data Log minimum daily battery voltage", units="Volts") - data_log_daily_max_battery_volts: Uint16Field = Uint16Field("data_log_daily_max_battery_volts", 64, 1, Mode.R, description="Data Log maximum daily battery voltage", units="Volts") - data_log_daily_max_input_volts: Uint16Field = Uint16Field("data_log_daily_max_input_volts", 65, 1, Mode.R, description="Data Log maximum daily input voltage", units="Volts") - clear_data_log_read: Uint16Field = Uint16Field("clear_data_log_read", 66, 1, Mode.R, description="Read value needed to clear data log") - clear_data_log_write_complement: Uint16Field = Uint16Field("clear_data_log_write_complement", 67, 1, Mode.W, description="Write value's complement to clear data log") - stats_maximum_reset_read: Uint16Field = Uint16Field("stats_maximum_reset_read", 68, 1, Mode.R, description="Read value needed to clear Stats Maximums") - stats_maximum_write_complement: Uint16Field = Uint16Field("stats_maximum_write_complement", 69, 1, Mode.W, description="Write value's complement to clear Stats Maximums") - stats_totals_reset_read: Uint16Field = Uint16Field("stats_totals_reset_read", 70, 1, Mode.R, description="Read value nneded to clear Stats Totals") - stats_totals_write_complement: Uint16Field = Uint16Field("stats_totals_write_complement", 71, 1, Mode.W, description="Write value's complement to clear Stats Totals") - battery_voltage_calibrate_offset: Int16Field = Int16Field("battery_voltage_calibrate_offset", 72, 1, Mode.RW, description="Battery voltage calibration offset", units="DC Volts") - serial_number: StringField = StringField("serial_number", 73, 9, Mode.R, description="Device serial number") - model_number: StringField = StringField("model_number", 82, 9, Mode.R, description="Device model") - - -ChargeControllerConfigurationModel.absorb_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.absorb_time_hours.scale_factor = ChargeControllerConfigurationModel.hours_scale_factor -ChargeControllerConfigurationModel.rebulk_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.float_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.bulk_current.scale_factor = ChargeControllerConfigurationModel.current_scale_factor -ChargeControllerConfigurationModel.eq_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.u_pick_pwm_duty_cycle.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.temp_comp_lower_limit_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.temp_comp_upper_limit_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.wakeup_voc.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.snooze_mode_amps.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.aux_low_battery_disconnect.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.aux_low_battery_reconnect.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.aux_vent_fan_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.aux_pv_limit_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.aux_pv_limit_hold_time.scale_factor = ChargeControllerConfigurationModel.hours_scale_factor -ChargeControllerConfigurationModel.aux_night_light_thres_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.aux_error_battery_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.aux_divert_hold_time.scale_factor = ChargeControllerConfigurationModel.hours_scale_factor -ChargeControllerConfigurationModel.aux_divert_relative_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.aux_divert_hyst_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.data_log_daily_ah.scale_factor = ChargeControllerConfigurationModel.ah_scale_factor -ChargeControllerConfigurationModel.data_log_daily_kwh.scale_factor = ChargeControllerConfigurationModel.kwh_scale_factor -ChargeControllerConfigurationModel.data_log_daily_max_output_amps.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.data_log_daily_max_output_watts.scale_factor = ChargeControllerConfigurationModel.power_scale_factor -ChargeControllerConfigurationModel.data_log_daily_min_battery_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.data_log_daily_max_battery_volts.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.battery_voltage_calibrate_offset.scale_factor = ChargeControllerConfigurationModel.voltage_scale_factor -ChargeControllerConfigurationModel.__model_fields__ = [ChargeControllerConfigurationModel.did, ChargeControllerConfigurationModel.length, ChargeControllerConfigurationModel.port_number, ChargeControllerConfigurationModel.voltage_scale_factor, ChargeControllerConfigurationModel.current_scale_factor, ChargeControllerConfigurationModel.hours_scale_factor, ChargeControllerConfigurationModel.power_scale_factor, ChargeControllerConfigurationModel.ah_scale_factor, ChargeControllerConfigurationModel.kwh_scale_factor, ChargeControllerConfigurationModel.faults, ChargeControllerConfigurationModel.absorb_volts, ChargeControllerConfigurationModel.absorb_time_hours, ChargeControllerConfigurationModel.absorb_end_amps, ChargeControllerConfigurationModel.rebulk_volts, ChargeControllerConfigurationModel.float_volts, ChargeControllerConfigurationModel.bulk_current, ChargeControllerConfigurationModel.eq_volts, ChargeControllerConfigurationModel.eq_time_hours, ChargeControllerConfigurationModel.auto_eq_days, ChargeControllerConfigurationModel.mppt_mode, ChargeControllerConfigurationModel.sweep_width, ChargeControllerConfigurationModel.sweep_max_percentage, ChargeControllerConfigurationModel.u_pick_pwm_duty_cycle, ChargeControllerConfigurationModel.grid_tie_mode, ChargeControllerConfigurationModel.temp_comp_mode, ChargeControllerConfigurationModel.temp_comp_lower_limit_volts, ChargeControllerConfigurationModel.temp_comp_upper_limit_volts, ChargeControllerConfigurationModel.temp_comp_slope, ChargeControllerConfigurationModel.auto_restart_mode, ChargeControllerConfigurationModel.wakeup_voc, ChargeControllerConfigurationModel.snooze_mode_amps, ChargeControllerConfigurationModel.wakeup_interval, ChargeControllerConfigurationModel.aux_mode, ChargeControllerConfigurationModel.aux_control, ChargeControllerConfigurationModel.aux_state, ChargeControllerConfigurationModel.aux_polarity, ChargeControllerConfigurationModel.aux_low_battery_disconnect, ChargeControllerConfigurationModel.aux_low_battery_reconnect, ChargeControllerConfigurationModel.aux_low_battery_disconnect_delay, ChargeControllerConfigurationModel.aux_vent_fan_volts, ChargeControllerConfigurationModel.aux_pv_limit_volts, ChargeControllerConfigurationModel.aux_pv_limit_hold_time, ChargeControllerConfigurationModel.aux_night_light_thres_volts, ChargeControllerConfigurationModel.night_light_on_hours, ChargeControllerConfigurationModel.night_light_on_hyst_time, ChargeControllerConfigurationModel.night_light_off_hyst_time, ChargeControllerConfigurationModel.aux_error_battery_volts, ChargeControllerConfigurationModel.aux_divert_hold_time, ChargeControllerConfigurationModel.aux_divert_delay_time, ChargeControllerConfigurationModel.aux_divert_relative_volts, ChargeControllerConfigurationModel.aux_divert_hyst_volts, ChargeControllerConfigurationModel.major_firmware_number, ChargeControllerConfigurationModel.mid_firmware_number, ChargeControllerConfigurationModel.minor_firmware_number, ChargeControllerConfigurationModel.set_data_log_day_offset, ChargeControllerConfigurationModel.get_current_data_log_day_offset, ChargeControllerConfigurationModel.data_log_daily_ah, ChargeControllerConfigurationModel.data_log_daily_kwh, ChargeControllerConfigurationModel.data_log_daily_max_output_amps, ChargeControllerConfigurationModel.data_log_daily_max_output_watts, ChargeControllerConfigurationModel.data_log_daily_absorb_time, ChargeControllerConfigurationModel.data_log_daily_float_time, ChargeControllerConfigurationModel.data_log_daily_min_battery_volts, ChargeControllerConfigurationModel.data_log_daily_max_battery_volts, ChargeControllerConfigurationModel.data_log_daily_max_input_volts, ChargeControllerConfigurationModel.clear_data_log_read, ChargeControllerConfigurationModel.clear_data_log_write_complement, ChargeControllerConfigurationModel.stats_maximum_reset_read, ChargeControllerConfigurationModel.stats_maximum_write_complement, ChargeControllerConfigurationModel.stats_totals_reset_read, ChargeControllerConfigurationModel.stats_totals_write_complement, ChargeControllerConfigurationModel.battery_voltage_calibrate_offset, ChargeControllerConfigurationModel.serial_number, ChargeControllerConfigurationModel.model_number] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FM Series Charge Controllers") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") + self.voltage_scale_factor: Int16Field = Int16Field("voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") + self.current_scale_factor: Int16Field = Int16Field("current_scale_factor", 5, 1, Mode.R, description="DC Current Scale Factor") + self.hours_scale_factor: Int16Field = Int16Field("hours_scale_factor", 6, 1, Mode.R, description="Time in Hours Scale Factor") + self.power_scale_factor: Int16Field = Int16Field("power_scale_factor", 7, 1, Mode.R, description="Power Scale Factor") + self.ah_scale_factor: Int16Field = Int16Field("ah_scale_factor", 8, 1, Mode.R, description="Amp Hours Scale Factor") + self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 9, 1, Mode.R, description="DC kWH Scale Factor") + self.faults: Bit16Field = Bit16Field("faults", 10, 1, Mode.R, flags=CCconfigFaultsFlags, description="CC Error Flags: 0x0080=High VOC, 0x0040=Over Temp, 0x0020=Shorted Battery Temp Sensor, 0x0010=Fault Input Active") + self.absorb_end_amps: Uint16Field = Uint16Field("absorb_end_amps", 13, 1, Mode.RW, units="Amps", description="Amperage to end Absorbing") + self.eq_time_hours: Uint16Field = Uint16Field("eq_time_hours", 18, 1, Mode.RW, units="Hours", description="EQ Time Hours") + self.auto_eq_days: Uint16Field = Uint16Field("auto_eq_days", 19, 1, Mode.RW, units="Days", description="Auto EQ Interval Days") + self.mppt_mode: EnumUint16Field = EnumUint16Field("mppt_mode", 20, 1, Mode.RW, options=Enum("mppt_mode", [('Auto', 0), ('U-Pick', 1)]), description="0 = Auto; 1 = U-Pick") + self.sweep_width: EnumUint16Field = EnumUint16Field("sweep_width", 21, 1, Mode.RW, options=Enum("sweep_width", [('Full', 0), ('Half', 1)]), description="0 = Full; 1 = Half") + self.sweep_max_percentage: EnumUint16Field = EnumUint16Field("sweep_max_percentage", 22, 1, Mode.RW, options=Enum("sweep_max_percentage", [('80', 0), ('85', 1), ('90', 2), ('99', 3)]), description="0 = 80; 1 = 85; 2 = 90; 3 = 99") + self.grid_tie_mode: EnumUint16Field = EnumUint16Field("grid_tie_mode", 24, 1, Mode.RW, options=Enum("grid_tie_mode", [('Grid Tie Mode disabled', 0), ('Grid Tie Mode enabled', 1)]), description="0 = Grid Tie Mode disabled; 1 = Grid Tie Mode enabled") + self.temp_comp_mode: EnumUint16Field = EnumUint16Field("temp_comp_mode", 25, 1, Mode.RW, options=Enum("temp_comp_mode", [('User Limited', 1), ('Wide', 0)]), description="0 = Wide; 1 = User Limited") + self.temp_comp_slope: Uint16Field = Uint16Field("temp_comp_slope", 28, 1, Mode.RW, units="Milli Volts", description="RTS temp compensation Slope 2-6 mV per Degree C") + self.auto_restart_mode: EnumUint16Field = EnumUint16Field("auto_restart_mode", 29, 1, Mode.RW, options=Enum("auto_restart_mode", [('Off', 0), ('Restart every 90 minutes', 1), ('Restart every 90 minutes if absorb charging or float charging', 2)]), description="0 = Off; 1 = Restart every 90 minutes; 2 = Restart every 90 minutes if absorb charging or float charging") + self.wakeup_interval: Uint16Field = Uint16Field("wakeup_interval", 32, 1, Mode.RW, units="Mins", description="How often to check for Wakeup condition") + self.aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 33, 1, Mode.RW, options=Enum("aux_mode", [('Diversion: Relay', 1), ('Diversion: Solid St', 2), ('Error Output', 7), ('Float', 0), ('Low Batt Disconnect', 3), ('Night Light', 8), ('PV Trigger', 6), ('Remote', 4), ('Vent Fan', 5)]), description="0 = Float; 1 = Diversion: Relay; 2 = Diversion: Solid St; 3 = Low Batt Disconnect; 4 = Remote; 5 = Vent Fan; 6 = PV Trigger; 7 = Error Output; 8 = Night Light") + self.aux_control: EnumUint16Field = EnumUint16Field("aux_control", 34, 1, Mode.RW, options=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") + self.aux_state: EnumUint16Field = EnumUint16Field("aux_state", 35, 1, Mode.R, options=Enum("aux_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.aux_polarity: EnumUint16Field = EnumUint16Field("aux_polarity", 36, 1, Mode.RW, options=Enum("aux_polarity", [('High', 1), ('Low', 0)]), description="0 = Low; 1 = High") + self.aux_low_battery_disconnect_delay: Uint16Field = Uint16Field("aux_low_battery_disconnect_delay", 39, 1, Mode.RW, units="Secs", description="Low Battery Disconnect Delay (secs)") + self.night_light_on_hours: Uint16Field = Uint16Field("night_light_on_hours", 44, 1, Mode.RW, units="Hours", description="Night Light ON Time") + self.night_light_on_hyst_time: Uint16Field = Uint16Field("night_light_on_hyst_time", 45, 1, Mode.RW, units="Mins", description="Night Light ON Hyst Time") + self.night_light_off_hyst_time: Uint16Field = Uint16Field("night_light_off_hyst_time", 46, 1, Mode.RW, units="Mins", description="Night Light OFF Hyst Time") + self.aux_divert_delay_time: Uint16Field = Uint16Field("aux_divert_delay_time", 49, 1, Mode.RW, units="Secs", description="AUX Divert Delay") + self.major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 52, 1, Mode.R, description="Charge Controller Major firmware revision") + self.mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 53, 1, Mode.R, description="Charge Controller Mid firmware revision") + self.minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 54, 1, Mode.R, description="Charge Controller Minor firmware revision") + self.set_data_log_day_offset: Uint16Field = Uint16Field("set_data_log_day_offset", 55, 1, Mode.RW, units="Days", description="Day offset 0-128, 0 =Today, 1 = -1 day \u2026") + self.get_current_data_log_day_offset: Uint16Field = Uint16Field("get_current_data_log_day_offset", 56, 1, Mode.R, units="Days", description="Current Data Log Day Offset") + self.data_log_daily_absorb_time: Uint16Field = Uint16Field("data_log_daily_absorb_time", 61, 1, Mode.R, units="Mins", description="Data Log Absorb Time Minutes") + self.data_log_daily_float_time: Uint16Field = Uint16Field("data_log_daily_float_time", 62, 1, Mode.R, units="Mins", description="Data Log Float Time Minutes") + self.data_log_daily_max_input_volts: Uint16Field = Uint16Field("data_log_daily_max_input_volts", 65, 1, Mode.R, units="Volts", description="Data Log maximum daily input voltage") + self.clear_data_log_read: Uint16Field = Uint16Field("clear_data_log_read", 66, 1, Mode.R, description="Read value needed to clear data log") + self.clear_data_log_write_complement: Uint16Field = Uint16Field("clear_data_log_write_complement", 67, 1, Mode.W, description="Write value's complement to clear data log") + self.stats_maximum_reset_read: Uint16Field = Uint16Field("stats_maximum_reset_read", 68, 1, Mode.R, description="Read value needed to clear Stats Maximums") + self.stats_maximum_write_complement: Uint16Field = Uint16Field("stats_maximum_write_complement", 69, 1, Mode.W, description="Write value's complement to clear Stats Maximums") + self.stats_totals_reset_read: Uint16Field = Uint16Field("stats_totals_reset_read", 70, 1, Mode.R, description="Read value nneded to clear Stats Totals") + self.stats_totals_write_complement: Uint16Field = Uint16Field("stats_totals_write_complement", 71, 1, Mode.W, description="Write value's complement to clear Stats Totals") + self.serial_number: StringField = StringField("serial_number", 73, 9, Mode.R, description="Device serial number") + self.model_number: StringField = StringField("model_number", 82, 9, Mode.R, description="Device model") + self.absorb_volts: FloatUint16Field = FloatUint16Field("absorb_volts", 11, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Absorb Voltage Target") + self.absorb_time_hours: FloatUint16Field = FloatUint16Field("absorb_time_hours", 12, 1, Mode.RW, units="Hours", scale_factor=self.hours_scale_factor, description="Absorb Time Hours") + self.rebulk_volts: FloatUint16Field = FloatUint16Field("rebulk_volts", 14, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Voltage to re-initiate Bulk charge") + self.float_volts: FloatUint16Field = FloatUint16Field("float_volts", 15, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Float Voltage Target") + self.bulk_current: FloatUint16Field = FloatUint16Field("bulk_current", 16, 1, Mode.RW, units="Amps", scale_factor=self.current_scale_factor, description="Max Output Current Limit") + self.eq_volts: FloatUint16Field = FloatUint16Field("eq_volts", 17, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Target Voltage for Equalize") + self.u_pick_pwm_duty_cycle: FloatUint16Field = FloatUint16Field("u_pick_pwm_duty_cycle", 23, 1, Mode.RW, units="Percentage", scale_factor=self.voltage_scale_factor, description="Park Duty Cycle (%) (40% - 90%)") + self.temp_comp_lower_limit_volts: FloatUint16Field = FloatUint16Field("temp_comp_lower_limit_volts", 26, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="RTS compensation lower voltage limit") + self.temp_comp_upper_limit_volts: FloatUint16Field = FloatUint16Field("temp_comp_upper_limit_volts", 27, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="RTS compensation upper voltage limit") + self.wakeup_voc: FloatUint16Field = FloatUint16Field("wakeup_voc", 30, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="VOC change which causes Wakeup occurs") + self.snooze_mode_amps: FloatUint16Field = FloatUint16Field("snooze_mode_amps", 31, 1, Mode.RW, units="Amps", scale_factor=self.voltage_scale_factor, description="Snooze Mode Amps") + self.aux_low_battery_disconnect: FloatUint16Field = FloatUint16Field("aux_low_battery_disconnect", 37, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Low Battery Disconnect Voltage") + self.aux_low_battery_reconnect: FloatUint16Field = FloatUint16Field("aux_low_battery_reconnect", 38, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Low Battery Reconnect Volts") + self.aux_vent_fan_volts: FloatUint16Field = FloatUint16Field("aux_vent_fan_volts", 40, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Vent Fan Voltage") + self.aux_pv_limit_volts: FloatUint16Field = FloatUint16Field("aux_pv_limit_volts", 41, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Voltage at which PV disconnect occurs") + self.aux_pv_limit_hold_time: FloatUint16Field = FloatUint16Field("aux_pv_limit_hold_time", 42, 1, Mode.RW, units="Secs", scale_factor=self.hours_scale_factor, description="AUX PV Trigger Hold Time") + self.aux_night_light_thres_volts: FloatUint16Field = FloatUint16Field("aux_night_light_thres_volts", 43, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Voltage Threshold for AUX Night Light") + self.aux_error_battery_volts: FloatUint16Field = FloatUint16Field("aux_error_battery_volts", 47, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="Battery voltage at which Aux Error occurs") + self.aux_divert_hold_time: FloatUint16Field = FloatUint16Field("aux_divert_hold_time", 48, 1, Mode.RW, units="Seconds", scale_factor=self.hours_scale_factor, description="AUX Diver Hold Time") + self.aux_divert_relative_volts: FloatInt16Field = FloatInt16Field("aux_divert_relative_volts", 50, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="AUX Divert Relative Volts") + self.aux_divert_hyst_volts: FloatUint16Field = FloatUint16Field("aux_divert_hyst_volts", 51, 1, Mode.RW, units="Volts", scale_factor=self.voltage_scale_factor, description="AUX Divert Hyst Volts") + self.data_log_daily_ah: FloatUint16Field = FloatUint16Field("data_log_daily_ah", 57, 1, Mode.R, units="AH", scale_factor=self.ah_scale_factor, description="Data Log AH") + self.data_log_daily_kwh: FloatUint16Field = FloatUint16Field("data_log_daily_kwh", 58, 1, Mode.R, units="KWH", scale_factor=self.kwh_scale_factor, description="Data Log kWH") + self.data_log_daily_max_output_amps: FloatUint16Field = FloatUint16Field("data_log_daily_max_output_amps", 59, 1, Mode.R, units="Amps", scale_factor=self.voltage_scale_factor, description="Data Log maximum Output Amps") + self.data_log_daily_max_output_watts: FloatUint16Field = FloatUint16Field("data_log_daily_max_output_watts", 60, 1, Mode.R, units="Watts", scale_factor=self.power_scale_factor, description="Data Log maximum Output Wattage") + self.data_log_daily_min_battery_volts: FloatUint16Field = FloatUint16Field("data_log_daily_min_battery_volts", 63, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="Data Log minimum daily battery voltage") + self.data_log_daily_max_battery_volts: FloatUint16Field = FloatUint16Field("data_log_daily_max_battery_volts", 64, 1, Mode.R, units="Volts", scale_factor=self.voltage_scale_factor, description="Data Log maximum daily battery voltage") + self.battery_voltage_calibrate_offset: FloatInt16Field = FloatInt16Field("battery_voltage_calibrate_offset", 72, 1, Mode.RW, units="DC Volts", scale_factor=self.voltage_scale_factor, description="Battery voltage calibration offset") class FXInverterRealTimeModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FX Series Inverter Status Block") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") - ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") - ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") - ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 7, 1, Mode.R, description="AC Frequency Scale Factor") - inverter_output_current: Uint16Field = Uint16Field("inverter_output_current", 8, 1, Mode.R, description="Inverter output current", units="Amps") - inverter_charge_current: Uint16Field = Uint16Field("inverter_charge_current", 9, 1, Mode.R, description="Inverter charger current", units="Amps") - inverter_buy_current: Uint16Field = Uint16Field("inverter_buy_current", 10, 1, Mode.R, description="Inverter buy current", units="Amps") - inverter_sell_current: Uint16Field = Uint16Field("inverter_sell_current", 11, 1, Mode.R, description="Inverter sell current", units="Amps") - output_ac_voltage: Uint16Field = Uint16Field("output_ac_voltage", 12, 1, Mode.R, description="Output AC Voltage", units="Volts AC") - inverter_operating_mode: EnumUint16Field = EnumUint16Field("inverter_operating_mode", 13, 1, Mode.R, description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting", options=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)])) - error_flags: Bit16Field = Bit16Field("error_flags", 14, 1, Mode.R, description="Bit field for errors. See FX_Error Table", flags=FXErrorFlags) - warning_flags: Bit16Field = Bit16Field("warning_flags", 15, 1, Mode.R, description="Bit field for warnings See FX_Warning Table", flags=FXWarningFlags) - battery_voltage: Uint16Field = Uint16Field("battery_voltage", 16, 1, Mode.R, description="Battery Voltage", units="Volts DC") - temp_compensated_target_voltage: Uint16Field = Uint16Field("temp_compensated_target_voltage", 17, 1, Mode.R, description="Temperature compensated target battery voltage", units="Volts DC") - aux_output_state: EnumUint16Field = EnumUint16Field("aux_output_state", 18, 1, Mode.R, description="0 = Disabled; 1 = Enabled", options=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)])) - transformer_temperature: Int16Field = Int16Field("transformer_temperature", 19, 1, Mode.R, description="Transformer temp in degrees C", units="Degrees C") - capacitor_temperature: Int16Field = Int16Field("capacitor_temperature", 20, 1, Mode.R, description="Capacitor temp in degrees C", units="Degrees C") - fet_temperature: Int16Field = Int16Field("fet_temperature", 21, 1, Mode.R, description="FET temp in degrees C", units="Degrees C") - ac_input_frequency: Uint16Field = Uint16Field("ac_input_frequency", 22, 1, Mode.R, description="Selected AC Input frequency HZ", units="Hz") - ac_input_voltage: Uint16Field = Uint16Field("ac_input_voltage", 23, 1, Mode.R, description="Selected Input AC Voltage", units="Volts AC") - ac_input_state: EnumUint16Field = EnumUint16Field("ac_input_state", 24, 1, Mode.R, description="1=AC Use, 0=AC_Drop", options=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)])) - minimum_ac_input_voltage: Uint16Field = Uint16Field("minimum_ac_input_voltage", 25, 1, Mode.R, description="Minimum Input AC Voltage (Write to clear value)", units="Volts AC") - maximum_ac_input_voltage: Uint16Field = Uint16Field("maximum_ac_input_voltage", 26, 1, Mode.R, description="Maximum Input AC Voltage (Write to clear value)", units="Volts AC") - sell_status: Bit16Field = Bit16Field("sell_status", 27, 1, Mode.R, description="Bit field for sell status See FX_Sell_Status Table", flags=FXSellStatusFlags) - kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 28, 1, Mode.R, description="AC kWh scale factor") - buy_kwh: Uint16Field = Uint16Field("buy_kwh", 29, 1, Mode.R, description="Daily Buy kWh", units="kWh") - sell_kwh: Uint16Field = Uint16Field("sell_kwh", 30, 1, Mode.R, description="Daily Sell kWh", units="kWh") - output_kwh: Uint16Field = Uint16Field("output_kwh", 31, 1, Mode.R, description="Daily Output kWh", units="kWh") - charger_kwh: Uint16Field = Uint16Field("charger_kwh", 32, 1, Mode.R, description="Daily Charger kWh", units="kWh") - output_kw: Uint16Field = Uint16Field("output_kw", 33, 1, Mode.R, description="Output kW", units="kW") - buy_kw: Uint16Field = Uint16Field("buy_kw", 34, 1, Mode.R, description="Buy kW", units="kW") - sell_kw: Uint16Field = Uint16Field("sell_kw", 35, 1, Mode.R, description="Sell kW", units="kW") - charge_kw: Uint16Field = Uint16Field("charge_kw", 36, 1, Mode.R, description="Charge kW", units="kW") - load_kw: Uint16Field = Uint16Field("load_kw", 37, 1, Mode.R, description="Load kW", units="kW") - ac_couple_kw: Uint16Field = Uint16Field("ac_couple_kw", 38, 1, Mode.R, description="AC Coupled kW", units="kW") - - -FXInverterRealTimeModel.inverter_output_current.scale_factor = FXInverterRealTimeModel.ac_current_scale_factor -FXInverterRealTimeModel.inverter_charge_current.scale_factor = FXInverterRealTimeModel.ac_current_scale_factor -FXInverterRealTimeModel.inverter_buy_current.scale_factor = FXInverterRealTimeModel.ac_current_scale_factor -FXInverterRealTimeModel.inverter_sell_current.scale_factor = FXInverterRealTimeModel.ac_current_scale_factor -FXInverterRealTimeModel.output_ac_voltage.scale_factor = FXInverterRealTimeModel.ac_voltage_scale_factor -FXInverterRealTimeModel.battery_voltage.scale_factor = FXInverterRealTimeModel.dc_voltage_scale_factor -FXInverterRealTimeModel.temp_compensated_target_voltage.scale_factor = FXInverterRealTimeModel.dc_voltage_scale_factor -FXInverterRealTimeModel.ac_input_frequency.scale_factor = FXInverterRealTimeModel.ac_frequency_scale_factor -FXInverterRealTimeModel.ac_input_voltage.scale_factor = FXInverterRealTimeModel.ac_voltage_scale_factor -FXInverterRealTimeModel.minimum_ac_input_voltage.scale_factor = FXInverterRealTimeModel.ac_voltage_scale_factor -FXInverterRealTimeModel.maximum_ac_input_voltage.scale_factor = FXInverterRealTimeModel.ac_voltage_scale_factor -FXInverterRealTimeModel.buy_kwh.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.sell_kwh.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.output_kwh.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.charger_kwh.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.output_kw.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.buy_kw.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.sell_kw.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.charge_kw.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.load_kw.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.ac_couple_kw.scale_factor = FXInverterRealTimeModel.kwh_scale_factor -FXInverterRealTimeModel.__model_fields__ = [FXInverterRealTimeModel.did, FXInverterRealTimeModel.length, FXInverterRealTimeModel.port_number, FXInverterRealTimeModel.dc_voltage_scale_factor, FXInverterRealTimeModel.ac_current_scale_factor, FXInverterRealTimeModel.ac_voltage_scale_factor, FXInverterRealTimeModel.ac_frequency_scale_factor, FXInverterRealTimeModel.inverter_output_current, FXInverterRealTimeModel.inverter_charge_current, FXInverterRealTimeModel.inverter_buy_current, FXInverterRealTimeModel.inverter_sell_current, FXInverterRealTimeModel.output_ac_voltage, FXInverterRealTimeModel.inverter_operating_mode, FXInverterRealTimeModel.error_flags, FXInverterRealTimeModel.warning_flags, FXInverterRealTimeModel.battery_voltage, FXInverterRealTimeModel.temp_compensated_target_voltage, FXInverterRealTimeModel.aux_output_state, FXInverterRealTimeModel.transformer_temperature, FXInverterRealTimeModel.capacitor_temperature, FXInverterRealTimeModel.fet_temperature, FXInverterRealTimeModel.ac_input_frequency, FXInverterRealTimeModel.ac_input_voltage, FXInverterRealTimeModel.ac_input_state, FXInverterRealTimeModel.minimum_ac_input_voltage, FXInverterRealTimeModel.maximum_ac_input_voltage, FXInverterRealTimeModel.sell_status, FXInverterRealTimeModel.kwh_scale_factor, FXInverterRealTimeModel.buy_kwh, FXInverterRealTimeModel.sell_kwh, FXInverterRealTimeModel.output_kwh, FXInverterRealTimeModel.charger_kwh, FXInverterRealTimeModel.output_kw, FXInverterRealTimeModel.buy_kw, FXInverterRealTimeModel.sell_kw, FXInverterRealTimeModel.charge_kw, FXInverterRealTimeModel.load_kw, FXInverterRealTimeModel.ac_couple_kw] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FX Series Inverter Status Block") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") + self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") + self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") + self.ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 7, 1, Mode.R, description="AC Frequency Scale Factor") + self.inverter_operating_mode: EnumUint16Field = EnumUint16Field("inverter_operating_mode", 13, 1, Mode.R, options=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)]), description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting") + self.error_flags: Bit16Field = Bit16Field("error_flags", 14, 1, Mode.R, flags=FXErrorFlags, description="Bit field for errors. See FX_Error Table") + self.warning_flags: Bit16Field = Bit16Field("warning_flags", 15, 1, Mode.R, flags=FXWarningFlags, description="Bit field for warnings See FX_Warning Table") + self.aux_output_state: EnumUint16Field = EnumUint16Field("aux_output_state", 18, 1, Mode.R, options=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.transformer_temperature: Int16Field = Int16Field("transformer_temperature", 19, 1, Mode.R, units="Degrees C", description="Transformer temp in degrees C") + self.capacitor_temperature: Int16Field = Int16Field("capacitor_temperature", 20, 1, Mode.R, units="Degrees C", description="Capacitor temp in degrees C") + self.fet_temperature: Int16Field = Int16Field("fet_temperature", 21, 1, Mode.R, units="Degrees C", description="FET temp in degrees C") + self.ac_input_state: EnumUint16Field = EnumUint16Field("ac_input_state", 24, 1, Mode.R, options=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)]), description="1=AC Use, 0=AC_Drop") + self.sell_status: Bit16Field = Bit16Field("sell_status", 27, 1, Mode.R, flags=FXSellStatusFlags, description="Bit field for sell status See FX_Sell_Status Table") + self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 28, 1, Mode.R, description="AC kWh scale factor") + self.inverter_output_current: FloatUint16Field = FloatUint16Field("inverter_output_current", 8, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter output current") + self.inverter_charge_current: FloatUint16Field = FloatUint16Field("inverter_charge_current", 9, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter charger current") + self.inverter_buy_current: FloatUint16Field = FloatUint16Field("inverter_buy_current", 10, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter buy current") + self.inverter_sell_current: FloatUint16Field = FloatUint16Field("inverter_sell_current", 11, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter sell current") + self.output_ac_voltage: FloatUint16Field = FloatUint16Field("output_ac_voltage", 12, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Output AC Voltage") + self.battery_voltage: FloatUint16Field = FloatUint16Field("battery_voltage", 16, 1, Mode.R, units="Volts DC", scale_factor=self.dc_voltage_scale_factor, description="Battery Voltage") + self.temp_compensated_target_voltage: FloatUint16Field = FloatUint16Field("temp_compensated_target_voltage", 17, 1, Mode.R, units="Volts DC", scale_factor=self.dc_voltage_scale_factor, description="Temperature compensated target battery voltage") + self.ac_input_frequency: FloatUint16Field = FloatUint16Field("ac_input_frequency", 22, 1, Mode.R, units="Hz", scale_factor=self.ac_frequency_scale_factor, description="Selected AC Input frequency HZ") + self.ac_input_voltage: FloatUint16Field = FloatUint16Field("ac_input_voltage", 23, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Selected Input AC Voltage") + self.minimum_ac_input_voltage: FloatUint16Field = FloatUint16Field("minimum_ac_input_voltage", 25, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Minimum Input AC Voltage (Write to clear value)") + self.maximum_ac_input_voltage: FloatUint16Field = FloatUint16Field("maximum_ac_input_voltage", 26, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Maximum Input AC Voltage (Write to clear value)") + self.buy_kwh: FloatUint16Field = FloatUint16Field("buy_kwh", 29, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily Buy kWh") + self.sell_kwh: FloatUint16Field = FloatUint16Field("sell_kwh", 30, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily Sell kWh") + self.output_kwh: FloatUint16Field = FloatUint16Field("output_kwh", 31, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily Output kWh") + self.charger_kwh: FloatUint16Field = FloatUint16Field("charger_kwh", 32, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily Charger kWh") + self.output_kw: FloatUint16Field = FloatUint16Field("output_kw", 33, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Output kW") + self.buy_kw: FloatUint16Field = FloatUint16Field("buy_kw", 34, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Buy kW") + self.sell_kw: FloatUint16Field = FloatUint16Field("sell_kw", 35, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Sell kW") + self.charge_kw: FloatUint16Field = FloatUint16Field("charge_kw", 36, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Charge kW") + self.load_kw: FloatUint16Field = FloatUint16Field("load_kw", 37, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Load kW") + self.ac_couple_kw: FloatUint16Field = FloatUint16Field("ac_couple_kw", 38, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="AC Coupled kW") class FXInverterConfigurationModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FX Series Inverter Configuration Block") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") - ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") - ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") - time_scale_factor: Int16Field = Int16Field("time_scale_factor", 7, 1, Mode.R, description="Time Scale Factor") - major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 8, 1, Mode.R, description="Inverter Major firmware revision") - mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 9, 1, Mode.R, description="Inverter Mid firmware revision") - minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 10, 1, Mode.R, description="Inverter Minor firmware revision") - absorb_volts: Uint16Field = Uint16Field("absorb_volts", 11, 1, Mode.RW, description="Absorb Voltage Target", units="DC Volts") - absorb_time_hours: Uint16Field = Uint16Field("absorb_time_hours", 12, 1, Mode.RW, description="Absorb Time Hours", units="Hours") - float_volts: Uint16Field = Uint16Field("float_volts", 13, 1, Mode.RW, description="Float Voltage Target", units="DC Volts") - float_time_hours: Uint16Field = Uint16Field("float_time_hours", 14, 1, Mode.RW, description="Float Time Hours", units="Hours") - re_float_volts: Uint16Field = Uint16Field("re_float_volts", 15, 1, Mode.RW, description="ReFloat Voltage Target", units="DC Volts") - eq_volts: Uint16Field = Uint16Field("eq_volts", 16, 1, Mode.RW, description="EQ Voltage Target", units="DC Volts") - eq_time_hours: Uint16Field = Uint16Field("eq_time_hours", 17, 1, Mode.RW, description="EQ Time Hours", units="Hours") - search_sensitivity: Uint16Field = Uint16Field("search_sensitivity", 18, 1, Mode.RW, description="Search sensitivity") - search_pulse_length: Uint16Field = Uint16Field("search_pulse_length", 19, 1, Mode.RW, description="Search pulse length", units="Cycles") - search_pulse_spacing: Uint16Field = Uint16Field("search_pulse_spacing", 20, 1, Mode.RW, description="Search pulse spacing", units="Cycles") - ac_input_type: EnumUint16Field = EnumUint16Field("ac_input_type", 21, 1, Mode.RW, description="0=Grid, 1=Gen, 2=Grid Zero", options=Enum("ac_input_type", [('Gen', 1), ('Grid', 0), ('Grid Zero', 2)])) - input_support: EnumUint16Field = EnumUint16Field("input_support", 22, 1, Mode.RW, description="1=Yes, 0=No (only valid if AC Input Type is Gen)", options=Enum("input_support", [('No (only valid if AC Input Type is Gen)', 0), ('Yes', 1)])) - grid_ac_input_current_limit: Uint16Field = Uint16Field("grid_ac_input_current_limit", 23, 1, Mode.RW, description="Grid AC input current limit", units="Amps") - gen_ac_input_current_limit: Uint16Field = Uint16Field("gen_ac_input_current_limit", 24, 1, Mode.RW, description="Gen AC input current limit", units="Amps") - charger_ac_input_current_limit: Uint16Field = Uint16Field("charger_ac_input_current_limit", 25, 1, Mode.RW, description="Charger AC input current limit", units="Amps") - charger_operating_mode: EnumUint16Field = EnumUint16Field("charger_operating_mode", 26, 1, Mode.RW, description="0=Charger Off, 1=Charger Auto, 2=Charger On", options=Enum("charger_operating_mode", [('Charger Auto', 1), ('Charger Off', 0), ('Charger On', 2)])) - grid_lower_input_voltage_limit: Uint16Field = Uint16Field("grid_lower_input_voltage_limit", 27, 1, Mode.RW, description="Grid Input AC voltage lower limit", units="Volts AC") - grid_upper_input_voltage_limit: Uint16Field = Uint16Field("grid_upper_input_voltage_limit", 28, 1, Mode.RW, description="Grid Input AC voltage upper limit", units="Volts AC") - grid_transfer_delay: Uint16Field = Uint16Field("grid_transfer_delay", 29, 1, Mode.RW, description="Grid Input AC connect delay", units="Minutes") - gen_lower_input_voltage_limit: Uint16Field = Uint16Field("gen_lower_input_voltage_limit", 30, 1, Mode.RW, description="Gen Input AC voltage lower limit", units="Volts AC") - gen_upper_input_voltage_limit: Uint16Field = Uint16Field("gen_upper_input_voltage_limit", 31, 1, Mode.RW, description="Gen Input AC voltage upper limit", units="Volts AC") - gen_transfer_delay: Uint16Field = Uint16Field("gen_transfer_delay", 32, 1, Mode.RW, description="Gen Input AC transfer delay", units="Cycles") - gen_connect_delay: Uint16Field = Uint16Field("gen_connect_delay", 33, 1, Mode.RW, description="Gen Input AC connect delay", units="Minutes") - ac_output_voltage: Uint16Field = Uint16Field("ac_output_voltage", 34, 1, Mode.RW, description="AC output Voltage", units="Volts AC") - low_battery_cut_out_voltage: Uint16Field = Uint16Field("low_battery_cut_out_voltage", 35, 1, Mode.RW, description="Battery cut-out voltage", units="DC Volts") - low_battery_cut_in_voltage: Uint16Field = Uint16Field("low_battery_cut_in_voltage", 36, 1, Mode.RW, description="Battery cut-in voltage", units="DC Volts") - aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 37, 1, Mode.RW, description="0=Remote, 1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=Divert DC, 7=Divert AC, 8=AC Drop", options=Enum("aux_mode", [('AC Drop', 8), ('Cool Fan', 5), ('Divert AC', 7), ('Divert DC', 6), ('Fault', 3), ('Gen Alert', 2), ('Load Shed', 1), ('Remote', 0), ('Vent Fan', 4)])) - aux_control: EnumUint16Field = EnumUint16Field("aux_control", 38, 1, Mode.RW, description="0 = Off; 1 = Auto; 2 = On", options=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)])) - aux_load_shed_enable_voltage: Uint16Field = Uint16Field("aux_load_shed_enable_voltage", 39, 1, Mode.RW, description="Load Shed enable voltage", units="DC Volts") - aux_gen_alert_on_voltage: Uint16Field = Uint16Field("aux_gen_alert_on_voltage", 40, 1, Mode.RW, description="Gen Alert On voltage", units="DC Volts") - aux_gen_alert_on_delay: Uint16Field = Uint16Field("aux_gen_alert_on_delay", 41, 1, Mode.RW, description="Gen Alert On delay minutes", units="Minutes") - aux_gen_alert_off_voltage: Uint16Field = Uint16Field("aux_gen_alert_off_voltage", 42, 1, Mode.RW, description="Gen Alert Off voltage", units="DC Volts") - aux_gen_alert_off_delay: Uint16Field = Uint16Field("aux_gen_alert_off_delay", 43, 1, Mode.RW, description="Gen Alert Off delay minutes", units="Minutes") - aux_vent_fan_enable_voltage: Uint16Field = Uint16Field("aux_vent_fan_enable_voltage", 44, 1, Mode.RW, description="Vent Fan enable voltage", units="DC Volts") - aux_vent_fan_off_period: Uint16Field = Uint16Field("aux_vent_fan_off_period", 45, 1, Mode.RW, description="Van Fan Off delay minutes", units="Minutes") - aux_divert_enable_voltage: Uint16Field = Uint16Field("aux_divert_enable_voltage", 46, 1, Mode.RW, description="DC Divert enable voltage", units="DC Volts") - aux_divert_off_delay: Uint16Field = Uint16Field("aux_divert_off_delay", 47, 1, Mode.RW, description="Divert Off delay minutes", units="Minutes") - stacking_mode: EnumUint16Field = EnumUint16Field("stacking_mode", 48, 1, Mode.RW, description="0=1-2phase Master, 1=Classic Slave, 2=OB Slave L1, 3=OB Slave L2, 4=3phase Master, 5=3phase Slave,10=Master, 11=Classic Slave, 12=OB Slave L1, 13=OB Slave L2, 14=3phase OB Slave A, 15=3phase OB Slave B, 16=3phase OB Slave C, 17=3phase Classic B, 18=3phase Classic C, 19=Independent", options=Enum("stacking_mode", [('1-2phase Master', 0), ('3phase Classic B', 17), ('3phase Classic C', 18), ('3phase Master', 4), ('3phase OB Slave A', 14), ('3phase OB Slave B', 15), ('3phase OB Slave C', 16), ('3phase Slave', 5), ('CLASSIC_SLAVE_11', 11), ('Classic Slave', 1), ('Independent', 19), ('Master', 10), ('OB Slave L1', 2), ('OB Slave L2', 3), ('OB_SLAVE_L1_12', 12), ('OB_SLAVE_L2_13', 13)])) - master_power_save_level: Uint16Field = Uint16Field("master_power_save_level", 49, 1, Mode.RW, description="Master inverter power save level") - slave_power_save_level: Uint16Field = Uint16Field("slave_power_save_level", 50, 1, Mode.RW, description="Slave inverter power save level") - sell_volts: Uint16Field = Uint16Field("sell_volts", 51, 1, Mode.RW, description="Sell Voltage Target", units="DC Volts") - grid_tie_window: EnumUint16Field = EnumUint16Field("grid_tie_window", 52, 1, Mode.RW, description="0=IEEE, 1=User", options=Enum("grid_tie_window", [('IEEE', 0), ('User', 1)])) - grid_tie_enable: EnumUint16Field = EnumUint16Field("grid_tie_enable", 53, 1, Mode.RW, description="1=Yes, 0=No", options=Enum("grid_tie_enable", [('No', 0), ('Yes', 1)])) - ac_input_voltage_calibrate_factor: Int16Field = Int16Field("ac_input_voltage_calibrate_factor", 54, 1, Mode.RW, description="AC input voltage calibration factor", units="Volts AC") - ac_output_voltage_calibrate_factor: Int16Field = Int16Field("ac_output_voltage_calibrate_factor", 55, 1, Mode.RW, description="AC output voltage calibration factor", units="Volts AC") - battery_voltage_calibrate_factor: Int16Field = Int16Field("battery_voltage_calibrate_factor", 56, 1, Mode.RW, description="Battery voltage calibration factor", units="DC Volts") - serial_number: StringField = StringField("serial_number", 57, 9, Mode.R, description="Device serial number") - model_number: StringField = StringField("model_number", 66, 9, Mode.R, description="Device model") - - -FXInverterConfigurationModel.absorb_volts.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.absorb_time_hours.scale_factor = FXInverterConfigurationModel.time_scale_factor -FXInverterConfigurationModel.float_volts.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.float_time_hours.scale_factor = FXInverterConfigurationModel.time_scale_factor -FXInverterConfigurationModel.re_float_volts.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.eq_volts.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.eq_time_hours.scale_factor = FXInverterConfigurationModel.time_scale_factor -FXInverterConfigurationModel.grid_ac_input_current_limit.scale_factor = FXInverterConfigurationModel.ac_current_scale_factor -FXInverterConfigurationModel.gen_ac_input_current_limit.scale_factor = FXInverterConfigurationModel.ac_current_scale_factor -FXInverterConfigurationModel.charger_ac_input_current_limit.scale_factor = FXInverterConfigurationModel.ac_current_scale_factor -FXInverterConfigurationModel.grid_lower_input_voltage_limit.scale_factor = FXInverterConfigurationModel.ac_voltage_scale_factor -FXInverterConfigurationModel.grid_upper_input_voltage_limit.scale_factor = FXInverterConfigurationModel.ac_voltage_scale_factor -FXInverterConfigurationModel.gen_lower_input_voltage_limit.scale_factor = FXInverterConfigurationModel.ac_voltage_scale_factor -FXInverterConfigurationModel.gen_upper_input_voltage_limit.scale_factor = FXInverterConfigurationModel.ac_voltage_scale_factor -FXInverterConfigurationModel.gen_connect_delay.scale_factor = FXInverterConfigurationModel.time_scale_factor -FXInverterConfigurationModel.ac_output_voltage.scale_factor = FXInverterConfigurationModel.ac_voltage_scale_factor -FXInverterConfigurationModel.low_battery_cut_out_voltage.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.low_battery_cut_in_voltage.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.aux_load_shed_enable_voltage.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.aux_gen_alert_on_voltage.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.aux_gen_alert_off_voltage.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.aux_vent_fan_enable_voltage.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.aux_divert_enable_voltage.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.sell_volts.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.battery_voltage_calibrate_factor.scale_factor = FXInverterConfigurationModel.dc_voltage_scale_factor -FXInverterConfigurationModel.__model_fields__ = [FXInverterConfigurationModel.did, FXInverterConfigurationModel.length, FXInverterConfigurationModel.port_number, FXInverterConfigurationModel.dc_voltage_scale_factor, FXInverterConfigurationModel.ac_current_scale_factor, FXInverterConfigurationModel.ac_voltage_scale_factor, FXInverterConfigurationModel.time_scale_factor, FXInverterConfigurationModel.major_firmware_number, FXInverterConfigurationModel.mid_firmware_number, FXInverterConfigurationModel.minor_firmware_number, FXInverterConfigurationModel.absorb_volts, FXInverterConfigurationModel.absorb_time_hours, FXInverterConfigurationModel.float_volts, FXInverterConfigurationModel.float_time_hours, FXInverterConfigurationModel.re_float_volts, FXInverterConfigurationModel.eq_volts, FXInverterConfigurationModel.eq_time_hours, FXInverterConfigurationModel.search_sensitivity, FXInverterConfigurationModel.search_pulse_length, FXInverterConfigurationModel.search_pulse_spacing, FXInverterConfigurationModel.ac_input_type, FXInverterConfigurationModel.input_support, FXInverterConfigurationModel.grid_ac_input_current_limit, FXInverterConfigurationModel.gen_ac_input_current_limit, FXInverterConfigurationModel.charger_ac_input_current_limit, FXInverterConfigurationModel.charger_operating_mode, FXInverterConfigurationModel.grid_lower_input_voltage_limit, FXInverterConfigurationModel.grid_upper_input_voltage_limit, FXInverterConfigurationModel.grid_transfer_delay, FXInverterConfigurationModel.gen_lower_input_voltage_limit, FXInverterConfigurationModel.gen_upper_input_voltage_limit, FXInverterConfigurationModel.gen_transfer_delay, FXInverterConfigurationModel.gen_connect_delay, FXInverterConfigurationModel.ac_output_voltage, FXInverterConfigurationModel.low_battery_cut_out_voltage, FXInverterConfigurationModel.low_battery_cut_in_voltage, FXInverterConfigurationModel.aux_mode, FXInverterConfigurationModel.aux_control, FXInverterConfigurationModel.aux_load_shed_enable_voltage, FXInverterConfigurationModel.aux_gen_alert_on_voltage, FXInverterConfigurationModel.aux_gen_alert_on_delay, FXInverterConfigurationModel.aux_gen_alert_off_voltage, FXInverterConfigurationModel.aux_gen_alert_off_delay, FXInverterConfigurationModel.aux_vent_fan_enable_voltage, FXInverterConfigurationModel.aux_vent_fan_off_period, FXInverterConfigurationModel.aux_divert_enable_voltage, FXInverterConfigurationModel.aux_divert_off_delay, FXInverterConfigurationModel.stacking_mode, FXInverterConfigurationModel.master_power_save_level, FXInverterConfigurationModel.slave_power_save_level, FXInverterConfigurationModel.sell_volts, FXInverterConfigurationModel.grid_tie_window, FXInverterConfigurationModel.grid_tie_enable, FXInverterConfigurationModel.ac_input_voltage_calibrate_factor, FXInverterConfigurationModel.ac_output_voltage_calibrate_factor, FXInverterConfigurationModel.battery_voltage_calibrate_factor, FXInverterConfigurationModel.serial_number, FXInverterConfigurationModel.model_number] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FX Series Inverter Configuration Block") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") + self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") + self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") + self.time_scale_factor: Int16Field = Int16Field("time_scale_factor", 7, 1, Mode.R, description="Time Scale Factor") + self.major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 8, 1, Mode.R, description="Inverter Major firmware revision") + self.mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 9, 1, Mode.R, description="Inverter Mid firmware revision") + self.minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 10, 1, Mode.R, description="Inverter Minor firmware revision") + self.search_sensitivity: Uint16Field = Uint16Field("search_sensitivity", 18, 1, Mode.RW, description="Search sensitivity") + self.search_pulse_length: Uint16Field = Uint16Field("search_pulse_length", 19, 1, Mode.RW, units="Cycles", description="Search pulse length") + self.search_pulse_spacing: Uint16Field = Uint16Field("search_pulse_spacing", 20, 1, Mode.RW, units="Cycles", description="Search pulse spacing") + self.ac_input_type: EnumUint16Field = EnumUint16Field("ac_input_type", 21, 1, Mode.RW, options=Enum("ac_input_type", [('Gen', 1), ('Grid', 0), ('Grid Zero', 2)]), description="0=Grid, 1=Gen, 2=Grid Zero") + self.input_support: EnumUint16Field = EnumUint16Field("input_support", 22, 1, Mode.RW, options=Enum("input_support", [('No (only valid if AC Input Type is Gen)', 0), ('Yes', 1)]), description="1=Yes, 0=No (only valid if AC Input Type is Gen)") + self.charger_operating_mode: EnumUint16Field = EnumUint16Field("charger_operating_mode", 26, 1, Mode.RW, options=Enum("charger_operating_mode", [('Charger Auto', 1), ('Charger Off', 0), ('Charger On', 2)]), description="0=Charger Off, 1=Charger Auto, 2=Charger On") + self.grid_transfer_delay: Uint16Field = Uint16Field("grid_transfer_delay", 29, 1, Mode.RW, units="Minutes", description="Grid Input AC connect delay") + self.gen_transfer_delay: Uint16Field = Uint16Field("gen_transfer_delay", 32, 1, Mode.RW, units="Cycles", description="Gen Input AC transfer delay") + self.aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 37, 1, Mode.RW, options=Enum("aux_mode", [('AC Drop', 8), ('Cool Fan', 5), ('Divert AC', 7), ('Divert DC', 6), ('Fault', 3), ('Gen Alert', 2), ('Load Shed', 1), ('Remote', 0), ('Vent Fan', 4)]), description="0=Remote, 1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=Divert DC, 7=Divert AC, 8=AC Drop") + self.aux_control: EnumUint16Field = EnumUint16Field("aux_control", 38, 1, Mode.RW, options=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") + self.aux_gen_alert_on_delay: Uint16Field = Uint16Field("aux_gen_alert_on_delay", 41, 1, Mode.RW, units="Minutes", description="Gen Alert On delay minutes") + self.aux_gen_alert_off_delay: Uint16Field = Uint16Field("aux_gen_alert_off_delay", 43, 1, Mode.RW, units="Minutes", description="Gen Alert Off delay minutes") + self.aux_vent_fan_off_period: Uint16Field = Uint16Field("aux_vent_fan_off_period", 45, 1, Mode.RW, units="Minutes", description="Van Fan Off delay minutes") + self.aux_divert_off_delay: Uint16Field = Uint16Field("aux_divert_off_delay", 47, 1, Mode.RW, units="Minutes", description="Divert Off delay minutes") + self.stacking_mode: EnumUint16Field = EnumUint16Field("stacking_mode", 48, 1, Mode.RW, options=Enum("stacking_mode", [('1-2phase Master', 0), ('3phase Classic B', 17), ('3phase Classic C', 18), ('3phase Master', 4), ('3phase OB Slave A', 14), ('3phase OB Slave B', 15), ('3phase OB Slave C', 16), ('3phase Slave', 5), ('CLASSIC_SLAVE_11', 11), ('Classic Slave', 1), ('Independent', 19), ('Master', 10), ('OB Slave L1', 2), ('OB Slave L2', 3), ('OB_SLAVE_L1_12', 12), ('OB_SLAVE_L2_13', 13)]), description="0=1-2phase Master, 1=Classic Slave, 2=OB Slave L1, 3=OB Slave L2, 4=3phase Master, 5=3phase Slave,10=Master, 11=Classic Slave, 12=OB Slave L1, 13=OB Slave L2, 14=3phase OB Slave A, 15=3phase OB Slave B, 16=3phase OB Slave C, 17=3phase Classic B, 18=3phase Classic C, 19=Independent") + self.master_power_save_level: Uint16Field = Uint16Field("master_power_save_level", 49, 1, Mode.RW, description="Master inverter power save level") + self.slave_power_save_level: Uint16Field = Uint16Field("slave_power_save_level", 50, 1, Mode.RW, description="Slave inverter power save level") + self.grid_tie_window: EnumUint16Field = EnumUint16Field("grid_tie_window", 52, 1, Mode.RW, options=Enum("grid_tie_window", [('IEEE', 0), ('User', 1)]), description="0=IEEE, 1=User") + self.grid_tie_enable: EnumUint16Field = EnumUint16Field("grid_tie_enable", 53, 1, Mode.RW, options=Enum("grid_tie_enable", [('No', 0), ('Yes', 1)]), description="1=Yes, 0=No") + self.ac_input_voltage_calibrate_factor: Int16Field = Int16Field("ac_input_voltage_calibrate_factor", 54, 1, Mode.RW, units="Volts AC", description="AC input voltage calibration factor") + self.ac_output_voltage_calibrate_factor: Int16Field = Int16Field("ac_output_voltage_calibrate_factor", 55, 1, Mode.RW, units="Volts AC", description="AC output voltage calibration factor") + self.serial_number: StringField = StringField("serial_number", 57, 9, Mode.R, description="Device serial number") + self.model_number: StringField = StringField("model_number", 66, 9, Mode.R, description="Device model") + self.absorb_volts: FloatUint16Field = FloatUint16Field("absorb_volts", 11, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Absorb Voltage Target") + self.absorb_time_hours: FloatUint16Field = FloatUint16Field("absorb_time_hours", 12, 1, Mode.RW, units="Hours", scale_factor=self.time_scale_factor, description="Absorb Time Hours") + self.float_volts: FloatUint16Field = FloatUint16Field("float_volts", 13, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Float Voltage Target") + self.float_time_hours: FloatUint16Field = FloatUint16Field("float_time_hours", 14, 1, Mode.RW, units="Hours", scale_factor=self.time_scale_factor, description="Float Time Hours") + self.re_float_volts: FloatUint16Field = FloatUint16Field("re_float_volts", 15, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="ReFloat Voltage Target") + self.eq_volts: FloatUint16Field = FloatUint16Field("eq_volts", 16, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="EQ Voltage Target") + self.eq_time_hours: FloatUint16Field = FloatUint16Field("eq_time_hours", 17, 1, Mode.RW, units="Hours", scale_factor=self.time_scale_factor, description="EQ Time Hours") + self.grid_ac_input_current_limit: FloatUint16Field = FloatUint16Field("grid_ac_input_current_limit", 23, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Grid AC input current limit") + self.gen_ac_input_current_limit: FloatUint16Field = FloatUint16Field("gen_ac_input_current_limit", 24, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Gen AC input current limit") + self.charger_ac_input_current_limit: FloatUint16Field = FloatUint16Field("charger_ac_input_current_limit", 25, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Charger AC input current limit") + self.grid_lower_input_voltage_limit: FloatUint16Field = FloatUint16Field("grid_lower_input_voltage_limit", 27, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Grid Input AC voltage lower limit") + self.grid_upper_input_voltage_limit: FloatUint16Field = FloatUint16Field("grid_upper_input_voltage_limit", 28, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Grid Input AC voltage upper limit") + self.gen_lower_input_voltage_limit: FloatUint16Field = FloatUint16Field("gen_lower_input_voltage_limit", 30, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Gen Input AC voltage lower limit") + self.gen_upper_input_voltage_limit: FloatUint16Field = FloatUint16Field("gen_upper_input_voltage_limit", 31, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Gen Input AC voltage upper limit") + self.gen_connect_delay: FloatUint16Field = FloatUint16Field("gen_connect_delay", 33, 1, Mode.RW, units="Minutes", scale_factor=self.time_scale_factor, description="Gen Input AC connect delay") + self.ac_output_voltage: FloatUint16Field = FloatUint16Field("ac_output_voltage", 34, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="AC output Voltage") + self.low_battery_cut_out_voltage: FloatUint16Field = FloatUint16Field("low_battery_cut_out_voltage", 35, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Battery cut-out voltage") + self.low_battery_cut_in_voltage: FloatUint16Field = FloatUint16Field("low_battery_cut_in_voltage", 36, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Battery cut-in voltage") + self.aux_load_shed_enable_voltage: FloatUint16Field = FloatUint16Field("aux_load_shed_enable_voltage", 39, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Load Shed enable voltage") + self.aux_gen_alert_on_voltage: FloatUint16Field = FloatUint16Field("aux_gen_alert_on_voltage", 40, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Gen Alert On voltage") + self.aux_gen_alert_off_voltage: FloatUint16Field = FloatUint16Field("aux_gen_alert_off_voltage", 42, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Gen Alert Off voltage") + self.aux_vent_fan_enable_voltage: FloatUint16Field = FloatUint16Field("aux_vent_fan_enable_voltage", 44, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Vent Fan enable voltage") + self.aux_divert_enable_voltage: FloatUint16Field = FloatUint16Field("aux_divert_enable_voltage", 46, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="DC Divert enable voltage") + self.sell_volts: FloatUint16Field = FloatUint16Field("sell_volts", 51, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Sell Voltage Target") + self.battery_voltage_calibrate_factor: FloatInt16Field = FloatInt16Field("battery_voltage_calibrate_factor", 56, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Battery voltage calibration factor") class SplitPhaseRadianInverterRealTimeModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack Radian Series Split Phase Inverter Status Block") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") - ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") - ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") - ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 7, 1, Mode.R, description="AC Frequency Scale Factor") - l1_inverter_output_current: Int16Field = Int16Field("l1_inverter_output_current", 8, 1, Mode.R, description="L1 inverter output current", units="Amps") - l1_inverter_charge_current: Int16Field = Int16Field("l1_inverter_charge_current", 9, 1, Mode.R, description="L1 inverter charger current", units="Amps") - l1_inverter_buy_current: Int16Field = Int16Field("l1_inverter_buy_current", 10, 1, Mode.R, description="L1 inverter buy current", units="Amps") - l1_inverter_sell_current: Int16Field = Int16Field("l1_inverter_sell_current", 11, 1, Mode.R, description="L1 inverter sell current", units="Amps") - l1_grid_input_ac_voltage: Int16Field = Int16Field("l1_grid_input_ac_voltage", 12, 1, Mode.R, description="L1 Grid Input AC Voltage", units="Volts AC") - l1_gen_input_ac_voltage: Int16Field = Int16Field("l1_gen_input_ac_voltage", 13, 1, Mode.R, description="L1 Gen Input AC Voltage", units="Volts AC") - l1_output_ac_voltage: Int16Field = Int16Field("l1_output_ac_voltage", 14, 1, Mode.R, description="L1 Output AC Voltage", units="Volts AC") - l2_inverter_output_current: Int16Field = Int16Field("l2_inverter_output_current", 15, 1, Mode.R, description="L2 inverter output current", units="Amps") - l2_inverter_charge_current: Int16Field = Int16Field("l2_inverter_charge_current", 16, 1, Mode.R, description="L2 inverter charger current", units="Amps") - l2_inverter_buy_current: Int16Field = Int16Field("l2_inverter_buy_current", 17, 1, Mode.R, description="L2 inverter buy current", units="Amps") - l2_inverter_sell_current: Int16Field = Int16Field("l2_inverter_sell_current", 18, 1, Mode.R, description="L2 inverter sell current", units="Amps") - l2_grid_input_ac_voltage: Int16Field = Int16Field("l2_grid_input_ac_voltage", 19, 1, Mode.R, description="L2 Grid Input AC Voltage", units="Volts AC") - l2_gen_input_ac_voltage: Int16Field = Int16Field("l2_gen_input_ac_voltage", 20, 1, Mode.R, description="L2 Gen Input AC Voltage", units="Volts AC") - l2_output_ac_voltage: Int16Field = Int16Field("l2_output_ac_voltage", 21, 1, Mode.R, description="L2 Output AC Voltage", units="Volts AC") - inverter_operating_mode: EnumInt16Field = EnumInt16Field("inverter_operating_mode", 22, 1, Mode.R, description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting", options=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)])) - error_flags: Bit16Field = Bit16Field("error_flags", 23, 1, Mode.R, description="Bit field for errors. See GS_Error table", flags=GSSplitErrorFlags) - warning_flags: Bit16Field = Bit16Field("warning_flags", 24, 1, Mode.R, description="Bit field for warnings See GS_Warning table", flags=GSSplitWarningFlags) - battery_voltage: Int16Field = Int16Field("battery_voltage", 25, 1, Mode.R, description="Battery Voltage", units="Volts DC") - temp_compensated_target_voltage: Int16Field = Int16Field("temp_compensated_target_voltage", 26, 1, Mode.R, description="Temperature compensated target battery voltage", units="Volts DC") - aux_output_state: EnumInt16Field = EnumInt16Field("aux_output_state", 27, 1, Mode.R, description="0 = Disabled; 1 = Enabled", options=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)])) - aux_relay_output_state: EnumInt16Field = EnumInt16Field("aux_relay_output_state", 28, 1, Mode.R, description="0 = Disabled; 1 = Enabled", options=Enum("aux_relay_output_state", [('Disabled', 0), ('Enabled', 1)])) - l_module_transformer_temperature: Int16Field = Int16Field("l_module_transformer_temperature", 29, 1, Mode.R, description="Left module transformer temp in degrees C", units="Degrees C") - l_module_capacitor_temperature: Int16Field = Int16Field("l_module_capacitor_temperature", 30, 1, Mode.R, description="Left module capacitor temp in degrees C", units="Degrees C") - l_module_fet_temperature: Int16Field = Int16Field("l_module_fet_temperature", 31, 1, Mode.R, description="Left module FET temp in degrees C", units="Degrees C") - r_module_transformer_temperature: Int16Field = Int16Field("r_module_transformer_temperature", 32, 1, Mode.R, description="Right module transformer temp in degrees C", units="Degrees C") - r_module_capacitor_temperature: Int16Field = Int16Field("r_module_capacitor_temperature", 33, 1, Mode.R, description="Right module capacitor temp in degrees C", units="Degrees C") - r_module_fet_temperature: Int16Field = Int16Field("r_module_fet_temperature", 34, 1, Mode.R, description="Right module FET temp in degrees C", units="Degrees C") - battery_temperature: Int16Field = Int16Field("battery_temperature", 35, 1, Mode.R, description="Battery temp in degrees C", units="Degrees C") - ac_input_selection: EnumInt16Field = EnumInt16Field("ac_input_selection", 36, 1, Mode.R, description="0=Grid, 1=Gen", options=Enum("ac_input_selection", [('Gen', 1), ('Grid', 0)])) - ac_input_frequency: Int16Field = Int16Field("ac_input_frequency", 37, 1, Mode.R, description="Selected AC Input frequency HZ", units="Hz") - ac_input_voltage: Int16Field = Int16Field("ac_input_voltage", 38, 1, Mode.R, description="Selected Input AC Voltage", units="Volts AC") - ac_input_state: EnumInt16Field = EnumInt16Field("ac_input_state", 39, 1, Mode.R, description="1=AC Use, 0=AC_Drop", options=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)])) - minimum_ac_input_voltage: Int16Field = Int16Field("minimum_ac_input_voltage", 40, 1, Mode.R, description="Minimum Input AC Voltage (Write to clear stored value)", units="Volts AC") - maximum_ac_input_voltage: Int16Field = Int16Field("maximum_ac_input_voltage", 41, 1, Mode.R, description="Maximum Input AC Voltage (Write to clear stored value)", units="Volts AC") - sell_status: Bit16Field = Bit16Field("sell_status", 42, 1, Mode.R, description="Bit field for sell status See GS_Sell_Status table", flags=GSSplitSellStatusFlags) - kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 43, 1, Mode.R, description="AC kWh scale factor") - ac1_l1_buy_kwh: Uint16Field = Uint16Field("ac1_l1_buy_kwh", 44, 1, Mode.R, description="Daily AC1 Buy L1 kWh", units="kWh") - ac2_l1_buy_kwh: Uint16Field = Uint16Field("ac2_l1_buy_kwh", 45, 1, Mode.R, description="Daily AC2 Buy L1 kWh", units="kWh") - ac1_l1_sell_kwh: Uint16Field = Uint16Field("ac1_l1_sell_kwh", 46, 1, Mode.R, description="Daily AC1 Sell L1 kWh", units="kWh") - ac2_l1_sell_kwh: Uint16Field = Uint16Field("ac2_l1_sell_kwh", 47, 1, Mode.R, description="Daily AC2 Sell L1 kWh", units="kWh") - l1_output_kwh: Uint16Field = Uint16Field("l1_output_kwh", 48, 1, Mode.R, description="Daily Output L1 kWh", units="kWh") - ac1_l2_buy_kwh: Uint16Field = Uint16Field("ac1_l2_buy_kwh", 49, 1, Mode.R, description="Daily AC1 Buy L2 kWh", units="kWh") - ac2_l2_buy_kwh: Uint16Field = Uint16Field("ac2_l2_buy_kwh", 50, 1, Mode.R, description="Daily AC1 Sell L2 kWh", units="kWh") - ac1_l2_sell_kwh: Uint16Field = Uint16Field("ac1_l2_sell_kwh", 51, 1, Mode.R, description="Daily AC1 Sell L2 kWh", units="kWh") - ac2_l2_sell_kwh: Uint16Field = Uint16Field("ac2_l2_sell_kwh", 52, 1, Mode.R, description="Daily AC2 Sell L2 kWh", units="kWh") - l2_output_kwh: Uint16Field = Uint16Field("l2_output_kwh", 53, 1, Mode.R, description="Daily Output L2 kWh", units="kWh") - charger_kwh: Uint16Field = Uint16Field("charger_kwh", 54, 1, Mode.R, description="Daily Charger kWh", units="kWh") - output_kw: Uint16Field = Uint16Field("output_kw", 55, 1, Mode.R, description="Output kW", units="kW") - buy_kw: Uint16Field = Uint16Field("buy_kw", 56, 1, Mode.R, description="Buy kW", units="kW") - sell_kw: Uint16Field = Uint16Field("sell_kw", 57, 1, Mode.R, description="Sell kW", units="kW") - charge_kw: Uint16Field = Uint16Field("charge_kw", 58, 1, Mode.R, description="Charge kW", units="kW") - load_kw: Uint16Field = Uint16Field("load_kw", 59, 1, Mode.R, description="Load kW", units="kW") - ac_couple_kw: Uint16Field = Uint16Field("ac_couple_kw", 60, 1, Mode.R, description="AC Coupled kW", units="kW") - gt_number: Uint16Field = Uint16Field("gt_number", 61, 1, Mode.R, description="GT Number sent from Inverter to Charge Controller") - - -SplitPhaseRadianInverterRealTimeModel.l1_inverter_output_current.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_current_scale_factor -SplitPhaseRadianInverterRealTimeModel.l1_inverter_charge_current.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_current_scale_factor -SplitPhaseRadianInverterRealTimeModel.l1_inverter_buy_current.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_current_scale_factor -SplitPhaseRadianInverterRealTimeModel.l1_inverter_sell_current.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_current_scale_factor -SplitPhaseRadianInverterRealTimeModel.l1_grid_input_ac_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.l1_gen_input_ac_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.l1_output_ac_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.l2_inverter_output_current.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_current_scale_factor -SplitPhaseRadianInverterRealTimeModel.l2_inverter_charge_current.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_current_scale_factor -SplitPhaseRadianInverterRealTimeModel.l2_inverter_buy_current.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_current_scale_factor -SplitPhaseRadianInverterRealTimeModel.l2_inverter_sell_current.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_current_scale_factor -SplitPhaseRadianInverterRealTimeModel.l2_grid_input_ac_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.l2_gen_input_ac_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.l2_output_ac_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.battery_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.dc_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.temp_compensated_target_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.dc_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac_input_frequency.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_frequency_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac_input_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.minimum_ac_input_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.maximum_ac_input_voltage.scale_factor = SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac1_l1_buy_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac2_l1_buy_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac1_l1_sell_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac2_l1_sell_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.l1_output_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac1_l2_buy_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac2_l2_buy_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac1_l2_sell_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac2_l2_sell_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.l2_output_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.charger_kwh.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.output_kw.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.buy_kw.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.sell_kw.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.charge_kw.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.load_kw.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.ac_couple_kw.scale_factor = SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor -SplitPhaseRadianInverterRealTimeModel.__model_fields__ = [SplitPhaseRadianInverterRealTimeModel.did, SplitPhaseRadianInverterRealTimeModel.length, SplitPhaseRadianInverterRealTimeModel.port_number, SplitPhaseRadianInverterRealTimeModel.dc_voltage_scale_factor, SplitPhaseRadianInverterRealTimeModel.ac_current_scale_factor, SplitPhaseRadianInverterRealTimeModel.ac_voltage_scale_factor, SplitPhaseRadianInverterRealTimeModel.ac_frequency_scale_factor, SplitPhaseRadianInverterRealTimeModel.l1_inverter_output_current, SplitPhaseRadianInverterRealTimeModel.l1_inverter_charge_current, SplitPhaseRadianInverterRealTimeModel.l1_inverter_buy_current, SplitPhaseRadianInverterRealTimeModel.l1_inverter_sell_current, SplitPhaseRadianInverterRealTimeModel.l1_grid_input_ac_voltage, SplitPhaseRadianInverterRealTimeModel.l1_gen_input_ac_voltage, SplitPhaseRadianInverterRealTimeModel.l1_output_ac_voltage, SplitPhaseRadianInverterRealTimeModel.l2_inverter_output_current, SplitPhaseRadianInverterRealTimeModel.l2_inverter_charge_current, SplitPhaseRadianInverterRealTimeModel.l2_inverter_buy_current, SplitPhaseRadianInverterRealTimeModel.l2_inverter_sell_current, SplitPhaseRadianInverterRealTimeModel.l2_grid_input_ac_voltage, SplitPhaseRadianInverterRealTimeModel.l2_gen_input_ac_voltage, SplitPhaseRadianInverterRealTimeModel.l2_output_ac_voltage, SplitPhaseRadianInverterRealTimeModel.inverter_operating_mode, SplitPhaseRadianInverterRealTimeModel.error_flags, SplitPhaseRadianInverterRealTimeModel.warning_flags, SplitPhaseRadianInverterRealTimeModel.battery_voltage, SplitPhaseRadianInverterRealTimeModel.temp_compensated_target_voltage, SplitPhaseRadianInverterRealTimeModel.aux_output_state, SplitPhaseRadianInverterRealTimeModel.aux_relay_output_state, SplitPhaseRadianInverterRealTimeModel.l_module_transformer_temperature, SplitPhaseRadianInverterRealTimeModel.l_module_capacitor_temperature, SplitPhaseRadianInverterRealTimeModel.l_module_fet_temperature, SplitPhaseRadianInverterRealTimeModel.r_module_transformer_temperature, SplitPhaseRadianInverterRealTimeModel.r_module_capacitor_temperature, SplitPhaseRadianInverterRealTimeModel.r_module_fet_temperature, SplitPhaseRadianInverterRealTimeModel.battery_temperature, SplitPhaseRadianInverterRealTimeModel.ac_input_selection, SplitPhaseRadianInverterRealTimeModel.ac_input_frequency, SplitPhaseRadianInverterRealTimeModel.ac_input_voltage, SplitPhaseRadianInverterRealTimeModel.ac_input_state, SplitPhaseRadianInverterRealTimeModel.minimum_ac_input_voltage, SplitPhaseRadianInverterRealTimeModel.maximum_ac_input_voltage, SplitPhaseRadianInverterRealTimeModel.sell_status, SplitPhaseRadianInverterRealTimeModel.kwh_scale_factor, SplitPhaseRadianInverterRealTimeModel.ac1_l1_buy_kwh, SplitPhaseRadianInverterRealTimeModel.ac2_l1_buy_kwh, SplitPhaseRadianInverterRealTimeModel.ac1_l1_sell_kwh, SplitPhaseRadianInverterRealTimeModel.ac2_l1_sell_kwh, SplitPhaseRadianInverterRealTimeModel.l1_output_kwh, SplitPhaseRadianInverterRealTimeModel.ac1_l2_buy_kwh, SplitPhaseRadianInverterRealTimeModel.ac2_l2_buy_kwh, SplitPhaseRadianInverterRealTimeModel.ac1_l2_sell_kwh, SplitPhaseRadianInverterRealTimeModel.ac2_l2_sell_kwh, SplitPhaseRadianInverterRealTimeModel.l2_output_kwh, SplitPhaseRadianInverterRealTimeModel.charger_kwh, SplitPhaseRadianInverterRealTimeModel.output_kw, SplitPhaseRadianInverterRealTimeModel.buy_kw, SplitPhaseRadianInverterRealTimeModel.sell_kw, SplitPhaseRadianInverterRealTimeModel.charge_kw, SplitPhaseRadianInverterRealTimeModel.load_kw, SplitPhaseRadianInverterRealTimeModel.ac_couple_kw, SplitPhaseRadianInverterRealTimeModel.gt_number] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack Radian Series Split Phase Inverter Status Block") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") + self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") + self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") + self.ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 7, 1, Mode.R, description="AC Frequency Scale Factor") + self.inverter_operating_mode: EnumInt16Field = EnumInt16Field("inverter_operating_mode", 22, 1, Mode.R, options=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)]), description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting") + self.error_flags: Bit16Field = Bit16Field("error_flags", 23, 1, Mode.R, flags=GSSplitErrorFlags, description="Bit field for errors. See GS_Error table") + self.warning_flags: Bit16Field = Bit16Field("warning_flags", 24, 1, Mode.R, flags=GSSplitWarningFlags, description="Bit field for warnings See GS_Warning table") + self.aux_output_state: EnumInt16Field = EnumInt16Field("aux_output_state", 27, 1, Mode.R, options=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.aux_relay_output_state: EnumInt16Field = EnumInt16Field("aux_relay_output_state", 28, 1, Mode.R, options=Enum("aux_relay_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.l_module_transformer_temperature: Int16Field = Int16Field("l_module_transformer_temperature", 29, 1, Mode.R, units="Degrees C", description="Left module transformer temp in degrees C") + self.l_module_capacitor_temperature: Int16Field = Int16Field("l_module_capacitor_temperature", 30, 1, Mode.R, units="Degrees C", description="Left module capacitor temp in degrees C") + self.l_module_fet_temperature: Int16Field = Int16Field("l_module_fet_temperature", 31, 1, Mode.R, units="Degrees C", description="Left module FET temp in degrees C") + self.r_module_transformer_temperature: Int16Field = Int16Field("r_module_transformer_temperature", 32, 1, Mode.R, units="Degrees C", description="Right module transformer temp in degrees C") + self.r_module_capacitor_temperature: Int16Field = Int16Field("r_module_capacitor_temperature", 33, 1, Mode.R, units="Degrees C", description="Right module capacitor temp in degrees C") + self.r_module_fet_temperature: Int16Field = Int16Field("r_module_fet_temperature", 34, 1, Mode.R, units="Degrees C", description="Right module FET temp in degrees C") + self.battery_temperature: Int16Field = Int16Field("battery_temperature", 35, 1, Mode.R, units="Degrees C", description="Battery temp in degrees C") + self.ac_input_selection: EnumInt16Field = EnumInt16Field("ac_input_selection", 36, 1, Mode.R, options=Enum("ac_input_selection", [('Gen', 1), ('Grid', 0)]), description="0=Grid, 1=Gen") + self.ac_input_state: EnumInt16Field = EnumInt16Field("ac_input_state", 39, 1, Mode.R, options=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)]), description="1=AC Use, 0=AC_Drop") + self.sell_status: Bit16Field = Bit16Field("sell_status", 42, 1, Mode.R, flags=GSSplitSellStatusFlags, description="Bit field for sell status See GS_Sell_Status table") + self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 43, 1, Mode.R, description="AC kWh scale factor") + self.gt_number: Uint16Field = Uint16Field("gt_number", 61, 1, Mode.R, description="GT Number sent from Inverter to Charge Controller") + self.l1_inverter_output_current: FloatInt16Field = FloatInt16Field("l1_inverter_output_current", 8, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="L1 inverter output current") + self.l1_inverter_charge_current: FloatInt16Field = FloatInt16Field("l1_inverter_charge_current", 9, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="L1 inverter charger current") + self.l1_inverter_buy_current: FloatInt16Field = FloatInt16Field("l1_inverter_buy_current", 10, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="L1 inverter buy current") + self.l1_inverter_sell_current: FloatInt16Field = FloatInt16Field("l1_inverter_sell_current", 11, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="L1 inverter sell current") + self.l1_grid_input_ac_voltage: FloatInt16Field = FloatInt16Field("l1_grid_input_ac_voltage", 12, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="L1 Grid Input AC Voltage") + self.l1_gen_input_ac_voltage: FloatInt16Field = FloatInt16Field("l1_gen_input_ac_voltage", 13, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="L1 Gen Input AC Voltage") + self.l1_output_ac_voltage: FloatInt16Field = FloatInt16Field("l1_output_ac_voltage", 14, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="L1 Output AC Voltage") + self.l2_inverter_output_current: FloatInt16Field = FloatInt16Field("l2_inverter_output_current", 15, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="L2 inverter output current") + self.l2_inverter_charge_current: FloatInt16Field = FloatInt16Field("l2_inverter_charge_current", 16, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="L2 inverter charger current") + self.l2_inverter_buy_current: FloatInt16Field = FloatInt16Field("l2_inverter_buy_current", 17, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="L2 inverter buy current") + self.l2_inverter_sell_current: FloatInt16Field = FloatInt16Field("l2_inverter_sell_current", 18, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="L2 inverter sell current") + self.l2_grid_input_ac_voltage: FloatInt16Field = FloatInt16Field("l2_grid_input_ac_voltage", 19, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="L2 Grid Input AC Voltage") + self.l2_gen_input_ac_voltage: FloatInt16Field = FloatInt16Field("l2_gen_input_ac_voltage", 20, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="L2 Gen Input AC Voltage") + self.l2_output_ac_voltage: FloatInt16Field = FloatInt16Field("l2_output_ac_voltage", 21, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="L2 Output AC Voltage") + self.battery_voltage: FloatInt16Field = FloatInt16Field("battery_voltage", 25, 1, Mode.R, units="Volts DC", scale_factor=self.dc_voltage_scale_factor, description="Battery Voltage") + self.temp_compensated_target_voltage: FloatInt16Field = FloatInt16Field("temp_compensated_target_voltage", 26, 1, Mode.R, units="Volts DC", scale_factor=self.dc_voltage_scale_factor, description="Temperature compensated target battery voltage") + self.ac_input_frequency: FloatInt16Field = FloatInt16Field("ac_input_frequency", 37, 1, Mode.R, units="Hz", scale_factor=self.ac_frequency_scale_factor, description="Selected AC Input frequency HZ") + self.ac_input_voltage: FloatInt16Field = FloatInt16Field("ac_input_voltage", 38, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Selected Input AC Voltage") + self.minimum_ac_input_voltage: FloatInt16Field = FloatInt16Field("minimum_ac_input_voltage", 40, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Minimum Input AC Voltage (Write to clear stored value)") + self.maximum_ac_input_voltage: FloatInt16Field = FloatInt16Field("maximum_ac_input_voltage", 41, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Maximum Input AC Voltage (Write to clear stored value)") + self.ac1_l1_buy_kwh: FloatUint16Field = FloatUint16Field("ac1_l1_buy_kwh", 44, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC1 Buy L1 kWh") + self.ac2_l1_buy_kwh: FloatUint16Field = FloatUint16Field("ac2_l1_buy_kwh", 45, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC2 Buy L1 kWh") + self.ac1_l1_sell_kwh: FloatUint16Field = FloatUint16Field("ac1_l1_sell_kwh", 46, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC1 Sell L1 kWh") + self.ac2_l1_sell_kwh: FloatUint16Field = FloatUint16Field("ac2_l1_sell_kwh", 47, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC2 Sell L1 kWh") + self.l1_output_kwh: FloatUint16Field = FloatUint16Field("l1_output_kwh", 48, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily Output L1 kWh") + self.ac1_l2_buy_kwh: FloatUint16Field = FloatUint16Field("ac1_l2_buy_kwh", 49, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC1 Buy L2 kWh") + self.ac2_l2_buy_kwh: FloatUint16Field = FloatUint16Field("ac2_l2_buy_kwh", 50, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC1 Sell L2 kWh") + self.ac1_l2_sell_kwh: FloatUint16Field = FloatUint16Field("ac1_l2_sell_kwh", 51, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC1 Sell L2 kWh") + self.ac2_l2_sell_kwh: FloatUint16Field = FloatUint16Field("ac2_l2_sell_kwh", 52, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC2 Sell L2 kWh") + self.l2_output_kwh: FloatUint16Field = FloatUint16Field("l2_output_kwh", 53, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily Output L2 kWh") + self.charger_kwh: FloatUint16Field = FloatUint16Field("charger_kwh", 54, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily Charger kWh") + self.output_kw: FloatUint16Field = FloatUint16Field("output_kw", 55, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Output kW") + self.buy_kw: FloatUint16Field = FloatUint16Field("buy_kw", 56, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Buy kW") + self.sell_kw: FloatUint16Field = FloatUint16Field("sell_kw", 57, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Sell kW") + self.charge_kw: FloatUint16Field = FloatUint16Field("charge_kw", 58, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Charge kW") + self.load_kw: FloatUint16Field = FloatUint16Field("load_kw", 59, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Load kW") + self.ac_couple_kw: FloatUint16Field = FloatUint16Field("ac_couple_kw", 60, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="AC Coupled kW") class RadianInverterConfigurationModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack Radian Series Split Phase Inverter Configuration Block") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") - ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") - ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") - time_scale_factor: Int16Field = Int16Field("time_scale_factor", 7, 1, Mode.R, description="Time Scale Factor") - major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 8, 1, Mode.R, description="Inverter Major firmware revision") - mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 9, 1, Mode.R, description="Inverter Mid firmware revision") - minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 10, 1, Mode.R, description="Inverter Minor firmware revision") - absorb_volts: Uint16Field = Uint16Field("absorb_volts", 11, 1, Mode.RW, description="Absorb Voltage Target", units="DC Volts") - absorb_time_hours: Uint16Field = Uint16Field("absorb_time_hours", 12, 1, Mode.RW, description="Absorb Time Hours", units="Hours") - float_volts: Uint16Field = Uint16Field("float_volts", 13, 1, Mode.RW, description="Float Voltage Target", units="DC Volts") - float_time_hours: Uint16Field = Uint16Field("float_time_hours", 14, 1, Mode.RW, description="Float Time Hours", units="Hours") - re_float_volts: Uint16Field = Uint16Field("re_float_volts", 15, 1, Mode.RW, description="ReFloat Voltage Target", units="DC Volts") - eq_volts: Uint16Field = Uint16Field("eq_volts", 16, 1, Mode.RW, description="EQ Voltage Target", units="DC Volts") - eq_time_hours: Uint16Field = Uint16Field("eq_time_hours", 17, 1, Mode.RW, description="EQ Time Hours", units="Hours") - search_sensitivity: Uint16Field = Uint16Field("search_sensitivity", 18, 1, Mode.RW, description="Search sensitivity") - search_pulse_length: Uint16Field = Uint16Field("search_pulse_length", 19, 1, Mode.RW, description="Search pulse length", units="Cycles") - search_pulse_spacing: Uint16Field = Uint16Field("search_pulse_spacing", 20, 1, Mode.RW, description="Search pulse spacing", units="Cycles") - ac_input_select_priority: EnumUint16Field = EnumUint16Field("ac_input_select_priority", 21, 1, Mode.RW, description="0=Grid, 1=Gen", options=Enum("ac_input_select_priority", [('Gen', 1), ('Grid', 0)])) - grid_ac_input_current_limit: Uint16Field = Uint16Field("grid_ac_input_current_limit", 22, 1, Mode.RW, description="Grid AC input current limit", units="Amps") - gen_ac_input_current_limit: Uint16Field = Uint16Field("gen_ac_input_current_limit", 23, 1, Mode.RW, description="Gen AC input current limit", units="Amps") - charger_ac_input_current_limit: Uint16Field = Uint16Field("charger_ac_input_current_limit", 24, 1, Mode.RW, description="Charger AC input current limit", units="Amps") - charger_operating_mode: EnumUint16Field = EnumUint16Field("charger_operating_mode", 25, 1, Mode.RW, description="0=All Inverter Charging Disabled, 1=Bulk and Float Charging Enabled", options=Enum("charger_operating_mode", [('All Inverter Charging Disabled', 0), ('Bulk and Float Charging Enabled', 1)])) - ac_coupled: EnumUint16Field = EnumUint16Field("ac_coupled", 26, 1, Mode.R, description="0=No, 1=Yes", options=Enum("ac_coupled", [('No', 0), ('Yes', 1)])) - grid_input_mode: EnumUint16Field = EnumUint16Field("grid_input_mode", 27, 1, Mode.RW, description="Grid Input Mode: 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero", options=Enum("grid_input_mode", [('Backup', 4), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)])) - grid_lower_input_voltage_limit: Uint16Field = Uint16Field("grid_lower_input_voltage_limit", 28, 1, Mode.RW, description="Grid Input AC voltage lower limit", units="Volts AC") - grid_upper_input_voltage_limit: Uint16Field = Uint16Field("grid_upper_input_voltage_limit", 29, 1, Mode.RW, description="Grid Input AC voltage upper limit", units="Volts AC") - grid_transfer_delay: Uint16Field = Uint16Field("grid_transfer_delay", 30, 1, Mode.RW, description="Grid Input AC transfer delay", units="msecs") - grid_connect_delay: Uint16Field = Uint16Field("grid_connect_delay", 31, 1, Mode.RW, description="Grid Input AC connect delay", units="Minutes") - gen_input_mode: EnumUint16Field = EnumUint16Field("gen_input_mode", 32, 1, Mode.RW, description="Grid Input Mode: 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero", options=Enum("gen_input_mode", [('Backup', 4), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)])) - gen_lower_input_voltage_limit: Uint16Field = Uint16Field("gen_lower_input_voltage_limit", 33, 1, Mode.RW, description="Gen Input AC voltage lower limit", units="Volts AC") - gen_upper_input_voltage_limit: Uint16Field = Uint16Field("gen_upper_input_voltage_limit", 34, 1, Mode.RW, description="Gen Input AC voltage upper limit", units="Volts AC") - gen_transfer_delay: Uint16Field = Uint16Field("gen_transfer_delay", 35, 1, Mode.RW, description="Gen Input AC transfer delay", units="msecs") - gen_connect_delay: Uint16Field = Uint16Field("gen_connect_delay", 36, 1, Mode.RW, description="Gen Input AC connect delay", units="Minutes") - ac_output_voltage: Uint16Field = Uint16Field("ac_output_voltage", 37, 1, Mode.RW, description="AC output Voltage", units="Volts AC") - low_battery_cut_out_voltage: Uint16Field = Uint16Field("low_battery_cut_out_voltage", 38, 1, Mode.RW, description="Battery cut-out voltage", units="DC Volts") - low_battery_cut_in_voltage: Uint16Field = Uint16Field("low_battery_cut_in_voltage", 39, 1, Mode.RW, description="Battery cut-in voltage", units="DC Volts") - aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 40, 1, Mode.RW, description="1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=DC Divert, 7=Grid Limit/IEEE ,8=AC Source Status,9=AC Divert", options=Enum("aux_mode", [('AC Divert', 9), ('AC Source Status', 8), ('Cool Fan', 5), ('DC Divert', 6), ('Fault', 3), ('Gen Alert', 2), ('Grid Limit/IEEE', 7), ('Load Shed', 1), ('Vent Fan', 4)])) - aux_control: EnumUint16Field = EnumUint16Field("aux_control", 41, 1, Mode.RW, description="0 = Off; 1 = Auto; 2 = On", options=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)])) - aux_on_battery_voltage: Uint16Field = Uint16Field("aux_on_battery_voltage", 42, 1, Mode.RW, description="AUX ON battery voltage", units="DC Volts") - aux_on_delay_time: Uint16Field = Uint16Field("aux_on_delay_time", 43, 1, Mode.RW, description="AUX ON Delay", units="Minutes") - aux_off_battery_voltage: Uint16Field = Uint16Field("aux_off_battery_voltage", 44, 1, Mode.RW, description="AUX OFF battery voltage", units="DC Volts") - aux_off_delay_time: Uint16Field = Uint16Field("aux_off_delay_time", 45, 1, Mode.RW, description="AUX OFF Delay", units="Minutes") - aux_relay_mode: EnumUint16Field = EnumUint16Field("aux_relay_mode", 46, 1, Mode.RW, description="1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=DC Divert, 7=Grid Limit/IEEE ,8=AC Source Status,9=AC Divert", options=Enum("aux_relay_mode", [('AC Divert', 9), ('AC Source Status', 8), ('Cool Fan', 5), ('DC Divert', 6), ('Fault', 3), ('Gen Alert', 2), ('Grid Limit/IEEE', 7), ('Load Shed', 1), ('Vent Fan', 4)])) - aux_relay_control: EnumUint16Field = EnumUint16Field("aux_relay_control", 47, 1, Mode.RW, description="0 = Off; 1 = On; 2 = Auto", options=Enum("aux_relay_control", [('Auto', 2), ('Off', 0), ('On', 1)])) - aux_relay_on_battery_voltage: Uint16Field = Uint16Field("aux_relay_on_battery_voltage", 48, 1, Mode.RW, description="AUX Relay ON battery voltage", units="DC Volts") - aux_relay_on_delay_time: Uint16Field = Uint16Field("aux_relay_on_delay_time", 49, 1, Mode.RW, description="AUX Relay ON Delay", units="Minutes") - aux_relay_off_battery_voltage: Uint16Field = Uint16Field("aux_relay_off_battery_voltage", 50, 1, Mode.RW, description="AUX Relay OFF battery voltage", units="DC Volts") - aux_relay_off_delay_time: Uint16Field = Uint16Field("aux_relay_off_delay_time", 51, 1, Mode.RW, description="AUX Relay OFF Delay", units="Minutes") - stacking_mode: EnumUint16Field = EnumUint16Field("stacking_mode", 52, 1, Mode.RW, description="10=Master, 12=Slave, 17=B Phase Master, 18=C Phase Master", options=Enum("stacking_mode", [('B Phase Master', 17), ('C Phase Master', 18), ('Master', 10), ('Slave', 12)])) - master_power_save_level: Uint16Field = Uint16Field("master_power_save_level", 53, 1, Mode.RW, description="Master inverter power save level") - slave_power_save_level: Uint16Field = Uint16Field("slave_power_save_level", 54, 1, Mode.RW, description="Slave inverter power save level") - sell_volts: Uint16Field = Uint16Field("sell_volts", 55, 1, Mode.RW, description="Sell Voltage Target", units="DC Volts") - grid_tie_window: EnumUint16Field = EnumUint16Field("grid_tie_window", 56, 1, Mode.RW, description="0=IEEE, 1=User (GS8048 Only)", options=Enum("grid_tie_window", [('IEEE', 0), ('User (GS8048 Only)', 1)])) - grid_tie_enable: EnumUint16Field = EnumUint16Field("grid_tie_enable", 57, 1, Mode.RW, description="1=Yes, 0=No", options=Enum("grid_tie_enable", [('No', 0), ('Yes', 1)])) - grid_ac_input_voltage_calibrate_factor: Int16Field = Int16Field("grid_ac_input_voltage_calibrate_factor", 58, 1, Mode.RW, description="Grid AC input voltage calibration factor", units="Volts AC") - gen_ac_input_voltage_calibrate_factor: Int16Field = Int16Field("gen_ac_input_voltage_calibrate_factor", 59, 1, Mode.RW, description="Gen AC input voltage calibration factor", units="Volts AC") - ac_output_voltage_calibrate_factor: Int16Field = Int16Field("ac_output_voltage_calibrate_factor", 60, 1, Mode.RW, description="AC output voltage calibration factor", units="Volts AC") - battery_voltage_calibrate_factor: Int16Field = Int16Field("battery_voltage_calibrate_factor", 61, 1, Mode.RW, description="Battery voltage calibration factor", units="DC Volts") - re_bulk_volts: Uint16Field = Uint16Field("re_bulk_volts", 62, 1, Mode.RW, description="ReBulk Voltage Target", units="DC Volts") - mini_grid_lbx_volts: Uint16Field = Uint16Field("mini_grid_lbx_volts", 63, 1, Mode.RW, description="Mini Grid LBX reconnect to Grid Battery Voltage", units="DC Volts") - mini_grid_lbx_delay: Uint16Field = Uint16Field("mini_grid_lbx_delay", 64, 1, Mode.RW, description="Mini Grid LBX reconnect to Grid Delay Time", units="Hours") - grid_zero_do_d_volts: Uint16Field = Uint16Field("grid_zero_do_d_volts", 65, 1, Mode.RW, description="Grid Zero DoD Voltage", units="DC Volts") - grid_zero_do_d_max_offset_ac_amps: Uint16Field = Uint16Field("grid_zero_do_d_max_offset_ac_amps", 66, 1, Mode.RW, description="Grid Zero Maximum Offset AC Amps", units="Amps") - serial_number: StringField = StringField("serial_number", 67, 9, Mode.R, description="Device serial number") - model_number: StringField = StringField("model_number", 76, 9, Mode.R, description="Device model") - module_control: EnumUint16Field = EnumUint16Field("module_control", 85, 1, Mode.RW, description="0=Auto, 1=Left, 2=Right, 3=Both", options=Enum("module_control", [('Auto', 0), ('Both', 3), ('Left', 1), ('Right', 2)])) - model_select: EnumUint16Field = EnumUint16Field("model_select", 86, 1, Mode.RW, description="0=Full, 1=Half", options=Enum("model_select", [('Full', 0), ('Half', 1)])) - low_battery_cut_out_delay: Uint16Field = Uint16Field("low_battery_cut_out_delay", 87, 1, Mode.RW, description="Low Battery Cut Out Delay", units="Seconds xx.x") - high_battery_cut_out_voltage: Uint16Field = Uint16Field("high_battery_cut_out_voltage", 88, 1, Mode.RW, description="High Battery Cut Out Voltage", units="DC Volts") - high_battery_cut_in_voltage: Uint16Field = Uint16Field("high_battery_cut_in_voltage", 89, 1, Mode.RW, description="High Battery Cut In Voltage", units="DC Volts") - high_battery_cut_out_delay: Uint16Field = Uint16Field("high_battery_cut_out_delay", 90, 1, Mode.RW, description="High Battery Cut Out Delay", units="Seconds xx.x") - ee_write_enable: EnumUint16Field = EnumUint16Field("ee_write_enable", 91, 1, Mode.RW, description="EEPROM Write Enable 1= Enable, 0= Disable", options=Enum("ee_write_enable", [('Disable', 0), ('Enable', 1)])) - - -RadianInverterConfigurationModel.absorb_volts.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.absorb_time_hours.scale_factor = RadianInverterConfigurationModel.time_scale_factor -RadianInverterConfigurationModel.float_volts.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.float_time_hours.scale_factor = RadianInverterConfigurationModel.time_scale_factor -RadianInverterConfigurationModel.re_float_volts.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.eq_volts.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.eq_time_hours.scale_factor = RadianInverterConfigurationModel.time_scale_factor -RadianInverterConfigurationModel.grid_ac_input_current_limit.scale_factor = RadianInverterConfigurationModel.ac_current_scale_factor -RadianInverterConfigurationModel.gen_ac_input_current_limit.scale_factor = RadianInverterConfigurationModel.ac_current_scale_factor -RadianInverterConfigurationModel.charger_ac_input_current_limit.scale_factor = RadianInverterConfigurationModel.ac_current_scale_factor -RadianInverterConfigurationModel.grid_lower_input_voltage_limit.scale_factor = RadianInverterConfigurationModel.ac_voltage_scale_factor -RadianInverterConfigurationModel.grid_upper_input_voltage_limit.scale_factor = RadianInverterConfigurationModel.ac_voltage_scale_factor -RadianInverterConfigurationModel.grid_connect_delay.scale_factor = RadianInverterConfigurationModel.time_scale_factor -RadianInverterConfigurationModel.gen_lower_input_voltage_limit.scale_factor = RadianInverterConfigurationModel.ac_voltage_scale_factor -RadianInverterConfigurationModel.gen_upper_input_voltage_limit.scale_factor = RadianInverterConfigurationModel.ac_voltage_scale_factor -RadianInverterConfigurationModel.gen_connect_delay.scale_factor = RadianInverterConfigurationModel.time_scale_factor -RadianInverterConfigurationModel.ac_output_voltage.scale_factor = RadianInverterConfigurationModel.ac_voltage_scale_factor -RadianInverterConfigurationModel.low_battery_cut_out_voltage.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.low_battery_cut_in_voltage.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.aux_on_battery_voltage.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.aux_on_delay_time.scale_factor = RadianInverterConfigurationModel.time_scale_factor -RadianInverterConfigurationModel.aux_off_battery_voltage.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.aux_off_delay_time.scale_factor = RadianInverterConfigurationModel.time_scale_factor -RadianInverterConfigurationModel.aux_relay_on_battery_voltage.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.aux_relay_on_delay_time.scale_factor = RadianInverterConfigurationModel.time_scale_factor -RadianInverterConfigurationModel.aux_relay_off_battery_voltage.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.aux_relay_off_delay_time.scale_factor = RadianInverterConfigurationModel.time_scale_factor -RadianInverterConfigurationModel.sell_volts.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.battery_voltage_calibrate_factor.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.re_bulk_volts.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.mini_grid_lbx_volts.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.grid_zero_do_d_volts.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.grid_zero_do_d_max_offset_ac_amps.scale_factor = RadianInverterConfigurationModel.ac_current_scale_factor -RadianInverterConfigurationModel.low_battery_cut_out_delay.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.high_battery_cut_out_voltage.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.high_battery_cut_in_voltage.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.high_battery_cut_out_delay.scale_factor = RadianInverterConfigurationModel.dc_voltage_scale_factor -RadianInverterConfigurationModel.__model_fields__ = [RadianInverterConfigurationModel.did, RadianInverterConfigurationModel.length, RadianInverterConfigurationModel.port_number, RadianInverterConfigurationModel.dc_voltage_scale_factor, RadianInverterConfigurationModel.ac_current_scale_factor, RadianInverterConfigurationModel.ac_voltage_scale_factor, RadianInverterConfigurationModel.time_scale_factor, RadianInverterConfigurationModel.major_firmware_number, RadianInverterConfigurationModel.mid_firmware_number, RadianInverterConfigurationModel.minor_firmware_number, RadianInverterConfigurationModel.absorb_volts, RadianInverterConfigurationModel.absorb_time_hours, RadianInverterConfigurationModel.float_volts, RadianInverterConfigurationModel.float_time_hours, RadianInverterConfigurationModel.re_float_volts, RadianInverterConfigurationModel.eq_volts, RadianInverterConfigurationModel.eq_time_hours, RadianInverterConfigurationModel.search_sensitivity, RadianInverterConfigurationModel.search_pulse_length, RadianInverterConfigurationModel.search_pulse_spacing, RadianInverterConfigurationModel.ac_input_select_priority, RadianInverterConfigurationModel.grid_ac_input_current_limit, RadianInverterConfigurationModel.gen_ac_input_current_limit, RadianInverterConfigurationModel.charger_ac_input_current_limit, RadianInverterConfigurationModel.charger_operating_mode, RadianInverterConfigurationModel.ac_coupled, RadianInverterConfigurationModel.grid_input_mode, RadianInverterConfigurationModel.grid_lower_input_voltage_limit, RadianInverterConfigurationModel.grid_upper_input_voltage_limit, RadianInverterConfigurationModel.grid_transfer_delay, RadianInverterConfigurationModel.grid_connect_delay, RadianInverterConfigurationModel.gen_input_mode, RadianInverterConfigurationModel.gen_lower_input_voltage_limit, RadianInverterConfigurationModel.gen_upper_input_voltage_limit, RadianInverterConfigurationModel.gen_transfer_delay, RadianInverterConfigurationModel.gen_connect_delay, RadianInverterConfigurationModel.ac_output_voltage, RadianInverterConfigurationModel.low_battery_cut_out_voltage, RadianInverterConfigurationModel.low_battery_cut_in_voltage, RadianInverterConfigurationModel.aux_mode, RadianInverterConfigurationModel.aux_control, RadianInverterConfigurationModel.aux_on_battery_voltage, RadianInverterConfigurationModel.aux_on_delay_time, RadianInverterConfigurationModel.aux_off_battery_voltage, RadianInverterConfigurationModel.aux_off_delay_time, RadianInverterConfigurationModel.aux_relay_mode, RadianInverterConfigurationModel.aux_relay_control, RadianInverterConfigurationModel.aux_relay_on_battery_voltage, RadianInverterConfigurationModel.aux_relay_on_delay_time, RadianInverterConfigurationModel.aux_relay_off_battery_voltage, RadianInverterConfigurationModel.aux_relay_off_delay_time, RadianInverterConfigurationModel.stacking_mode, RadianInverterConfigurationModel.master_power_save_level, RadianInverterConfigurationModel.slave_power_save_level, RadianInverterConfigurationModel.sell_volts, RadianInverterConfigurationModel.grid_tie_window, RadianInverterConfigurationModel.grid_tie_enable, RadianInverterConfigurationModel.grid_ac_input_voltage_calibrate_factor, RadianInverterConfigurationModel.gen_ac_input_voltage_calibrate_factor, RadianInverterConfigurationModel.ac_output_voltage_calibrate_factor, RadianInverterConfigurationModel.battery_voltage_calibrate_factor, RadianInverterConfigurationModel.re_bulk_volts, RadianInverterConfigurationModel.mini_grid_lbx_volts, RadianInverterConfigurationModel.mini_grid_lbx_delay, RadianInverterConfigurationModel.grid_zero_do_d_volts, RadianInverterConfigurationModel.grid_zero_do_d_max_offset_ac_amps, RadianInverterConfigurationModel.serial_number, RadianInverterConfigurationModel.model_number, RadianInverterConfigurationModel.module_control, RadianInverterConfigurationModel.model_select, RadianInverterConfigurationModel.low_battery_cut_out_delay, RadianInverterConfigurationModel.high_battery_cut_out_voltage, RadianInverterConfigurationModel.high_battery_cut_in_voltage, RadianInverterConfigurationModel.high_battery_cut_out_delay, RadianInverterConfigurationModel.ee_write_enable] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack Radian Series Split Phase Inverter Configuration Block") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") + self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") + self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") + self.time_scale_factor: Int16Field = Int16Field("time_scale_factor", 7, 1, Mode.R, description="Time Scale Factor") + self.major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 8, 1, Mode.R, description="Inverter Major firmware revision") + self.mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 9, 1, Mode.R, description="Inverter Mid firmware revision") + self.minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 10, 1, Mode.R, description="Inverter Minor firmware revision") + self.search_sensitivity: Uint16Field = Uint16Field("search_sensitivity", 18, 1, Mode.RW, description="Search sensitivity") + self.search_pulse_length: Uint16Field = Uint16Field("search_pulse_length", 19, 1, Mode.RW, units="Cycles", description="Search pulse length") + self.search_pulse_spacing: Uint16Field = Uint16Field("search_pulse_spacing", 20, 1, Mode.RW, units="Cycles", description="Search pulse spacing") + self.ac_input_select_priority: EnumUint16Field = EnumUint16Field("ac_input_select_priority", 21, 1, Mode.RW, options=Enum("ac_input_select_priority", [('Gen', 1), ('Grid', 0)]), description="0=Grid, 1=Gen") + self.charger_operating_mode: EnumUint16Field = EnumUint16Field("charger_operating_mode", 25, 1, Mode.RW, options=Enum("charger_operating_mode", [('All Inverter Charging Disabled', 0), ('Bulk and Float Charging Enabled', 1)]), description="0=All Inverter Charging Disabled, 1=Bulk and Float Charging Enabled") + self.ac_coupled: EnumUint16Field = EnumUint16Field("ac_coupled", 26, 1, Mode.R, options=Enum("ac_coupled", [('No', 0), ('Yes', 1)]), description="0=No, 1=Yes") + self.grid_input_mode: EnumUint16Field = EnumUint16Field("grid_input_mode", 27, 1, Mode.RW, options=Enum("grid_input_mode", [('Backup', 4), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Grid Input Mode: 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.grid_transfer_delay: Uint16Field = Uint16Field("grid_transfer_delay", 30, 1, Mode.RW, units="msecs", description="Grid Input AC transfer delay") + self.gen_input_mode: EnumUint16Field = EnumUint16Field("gen_input_mode", 32, 1, Mode.RW, options=Enum("gen_input_mode", [('Backup', 4), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Grid Input Mode: 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.gen_transfer_delay: Uint16Field = Uint16Field("gen_transfer_delay", 35, 1, Mode.RW, units="msecs", description="Gen Input AC transfer delay") + self.aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 40, 1, Mode.RW, options=Enum("aux_mode", [('AC Divert', 9), ('AC Source Status', 8), ('Cool Fan', 5), ('DC Divert', 6), ('Fault', 3), ('Gen Alert', 2), ('Grid Limit/IEEE', 7), ('Load Shed', 1), ('Vent Fan', 4)]), description="1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=DC Divert, 7=Grid Limit/IEEE ,8=AC Source Status,9=AC Divert") + self.aux_control: EnumUint16Field = EnumUint16Field("aux_control", 41, 1, Mode.RW, options=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") + self.aux_relay_mode: EnumUint16Field = EnumUint16Field("aux_relay_mode", 46, 1, Mode.RW, options=Enum("aux_relay_mode", [('AC Divert', 9), ('AC Source Status', 8), ('Cool Fan', 5), ('DC Divert', 6), ('Fault', 3), ('Gen Alert', 2), ('Grid Limit/IEEE', 7), ('Load Shed', 1), ('Vent Fan', 4)]), description="1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=DC Divert, 7=Grid Limit/IEEE ,8=AC Source Status,9=AC Divert") + self.aux_relay_control: EnumUint16Field = EnumUint16Field("aux_relay_control", 47, 1, Mode.RW, options=Enum("aux_relay_control", [('Auto', 2), ('Off', 0), ('On', 1)]), description="0 = Off; 1 = On; 2 = Auto") + self.stacking_mode: EnumUint16Field = EnumUint16Field("stacking_mode", 52, 1, Mode.RW, options=Enum("stacking_mode", [('B Phase Master', 17), ('C Phase Master', 18), ('Master', 10), ('Slave', 12)]), description="10=Master, 12=Slave, 17=B Phase Master, 18=C Phase Master") + self.master_power_save_level: Uint16Field = Uint16Field("master_power_save_level", 53, 1, Mode.RW, description="Master inverter power save level") + self.slave_power_save_level: Uint16Field = Uint16Field("slave_power_save_level", 54, 1, Mode.RW, description="Slave inverter power save level") + self.grid_tie_window: EnumUint16Field = EnumUint16Field("grid_tie_window", 56, 1, Mode.RW, options=Enum("grid_tie_window", [('IEEE', 0), ('User (GS8048 Only)', 1)]), description="0=IEEE, 1=User (GS8048 Only)") + self.grid_tie_enable: EnumUint16Field = EnumUint16Field("grid_tie_enable", 57, 1, Mode.RW, options=Enum("grid_tie_enable", [('No', 0), ('Yes', 1)]), description="1=Yes, 0=No") + self.grid_ac_input_voltage_calibrate_factor: Int16Field = Int16Field("grid_ac_input_voltage_calibrate_factor", 58, 1, Mode.RW, units="Volts AC", description="Grid AC input voltage calibration factor") + self.gen_ac_input_voltage_calibrate_factor: Int16Field = Int16Field("gen_ac_input_voltage_calibrate_factor", 59, 1, Mode.RW, units="Volts AC", description="Gen AC input voltage calibration factor") + self.ac_output_voltage_calibrate_factor: Int16Field = Int16Field("ac_output_voltage_calibrate_factor", 60, 1, Mode.RW, units="Volts AC", description="AC output voltage calibration factor") + self.mini_grid_lbx_delay: Uint16Field = Uint16Field("mini_grid_lbx_delay", 64, 1, Mode.RW, units="Hours", description="Mini Grid LBX reconnect to Grid Delay Time") + self.serial_number: StringField = StringField("serial_number", 67, 9, Mode.R, description="Device serial number") + self.model_number: StringField = StringField("model_number", 76, 9, Mode.R, description="Device model") + self.module_control: EnumUint16Field = EnumUint16Field("module_control", 85, 1, Mode.RW, options=Enum("module_control", [('Auto', 0), ('Both', 3), ('Left', 1), ('Right', 2)]), description="0=Auto, 1=Left, 2=Right, 3=Both") + self.model_select: EnumUint16Field = EnumUint16Field("model_select", 86, 1, Mode.RW, options=Enum("model_select", [('Full', 0), ('Half', 1)]), description="0=Full, 1=Half") + self.ee_write_enable: EnumUint16Field = EnumUint16Field("ee_write_enable", 91, 1, Mode.RW, options=Enum("ee_write_enable", [('Disable', 0), ('Enable', 1)]), description="EEPROM Write Enable 1= Enable, 0= Disable") + self.absorb_volts: FloatUint16Field = FloatUint16Field("absorb_volts", 11, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Absorb Voltage Target") + self.absorb_time_hours: FloatUint16Field = FloatUint16Field("absorb_time_hours", 12, 1, Mode.RW, units="Hours", scale_factor=self.time_scale_factor, description="Absorb Time Hours") + self.float_volts: FloatUint16Field = FloatUint16Field("float_volts", 13, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Float Voltage Target") + self.float_time_hours: FloatUint16Field = FloatUint16Field("float_time_hours", 14, 1, Mode.RW, units="Hours", scale_factor=self.time_scale_factor, description="Float Time Hours") + self.re_float_volts: FloatUint16Field = FloatUint16Field("re_float_volts", 15, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="ReFloat Voltage Target") + self.eq_volts: FloatUint16Field = FloatUint16Field("eq_volts", 16, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="EQ Voltage Target") + self.eq_time_hours: FloatUint16Field = FloatUint16Field("eq_time_hours", 17, 1, Mode.RW, units="Hours", scale_factor=self.time_scale_factor, description="EQ Time Hours") + self.grid_ac_input_current_limit: FloatUint16Field = FloatUint16Field("grid_ac_input_current_limit", 22, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Grid AC input current limit") + self.gen_ac_input_current_limit: FloatUint16Field = FloatUint16Field("gen_ac_input_current_limit", 23, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Gen AC input current limit") + self.charger_ac_input_current_limit: FloatUint16Field = FloatUint16Field("charger_ac_input_current_limit", 24, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Charger AC input current limit") + self.grid_lower_input_voltage_limit: FloatUint16Field = FloatUint16Field("grid_lower_input_voltage_limit", 28, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Grid Input AC voltage lower limit") + self.grid_upper_input_voltage_limit: FloatUint16Field = FloatUint16Field("grid_upper_input_voltage_limit", 29, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Grid Input AC voltage upper limit") + self.grid_connect_delay: FloatUint16Field = FloatUint16Field("grid_connect_delay", 31, 1, Mode.RW, units="Minutes", scale_factor=self.time_scale_factor, description="Grid Input AC connect delay") + self.gen_lower_input_voltage_limit: FloatUint16Field = FloatUint16Field("gen_lower_input_voltage_limit", 33, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Gen Input AC voltage lower limit") + self.gen_upper_input_voltage_limit: FloatUint16Field = FloatUint16Field("gen_upper_input_voltage_limit", 34, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Gen Input AC voltage upper limit") + self.gen_connect_delay: FloatUint16Field = FloatUint16Field("gen_connect_delay", 36, 1, Mode.RW, units="Minutes", scale_factor=self.time_scale_factor, description="Gen Input AC connect delay") + self.ac_output_voltage: FloatUint16Field = FloatUint16Field("ac_output_voltage", 37, 1, Mode.RW, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="AC output Voltage") + self.low_battery_cut_out_voltage: FloatUint16Field = FloatUint16Field("low_battery_cut_out_voltage", 38, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Battery cut-out voltage") + self.low_battery_cut_in_voltage: FloatUint16Field = FloatUint16Field("low_battery_cut_in_voltage", 39, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Battery cut-in voltage") + self.aux_on_battery_voltage: FloatUint16Field = FloatUint16Field("aux_on_battery_voltage", 42, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="AUX ON battery voltage") + self.aux_on_delay_time: FloatUint16Field = FloatUint16Field("aux_on_delay_time", 43, 1, Mode.RW, units="Minutes", scale_factor=self.time_scale_factor, description="AUX ON Delay") + self.aux_off_battery_voltage: FloatUint16Field = FloatUint16Field("aux_off_battery_voltage", 44, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="AUX OFF battery voltage") + self.aux_off_delay_time: FloatUint16Field = FloatUint16Field("aux_off_delay_time", 45, 1, Mode.RW, units="Minutes", scale_factor=self.time_scale_factor, description="AUX OFF Delay") + self.aux_relay_on_battery_voltage: FloatUint16Field = FloatUint16Field("aux_relay_on_battery_voltage", 48, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="AUX Relay ON battery voltage") + self.aux_relay_on_delay_time: FloatUint16Field = FloatUint16Field("aux_relay_on_delay_time", 49, 1, Mode.RW, units="Minutes", scale_factor=self.time_scale_factor, description="AUX Relay ON Delay") + self.aux_relay_off_battery_voltage: FloatUint16Field = FloatUint16Field("aux_relay_off_battery_voltage", 50, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="AUX Relay OFF battery voltage") + self.aux_relay_off_delay_time: FloatUint16Field = FloatUint16Field("aux_relay_off_delay_time", 51, 1, Mode.RW, units="Minutes", scale_factor=self.time_scale_factor, description="AUX Relay OFF Delay") + self.sell_volts: FloatUint16Field = FloatUint16Field("sell_volts", 55, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Sell Voltage Target") + self.battery_voltage_calibrate_factor: FloatInt16Field = FloatInt16Field("battery_voltage_calibrate_factor", 61, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Battery voltage calibration factor") + self.re_bulk_volts: FloatUint16Field = FloatUint16Field("re_bulk_volts", 62, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="ReBulk Voltage Target") + self.mini_grid_lbx_volts: FloatUint16Field = FloatUint16Field("mini_grid_lbx_volts", 63, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Mini Grid LBX reconnect to Grid Battery Voltage") + self.grid_zero_do_d_volts: FloatUint16Field = FloatUint16Field("grid_zero_do_d_volts", 65, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Grid Zero DoD Voltage") + self.grid_zero_do_d_max_offset_ac_amps: FloatUint16Field = FloatUint16Field("grid_zero_do_d_max_offset_ac_amps", 66, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Grid Zero Maximum Offset AC Amps") + self.low_battery_cut_out_delay: FloatUint16Field = FloatUint16Field("low_battery_cut_out_delay", 87, 1, Mode.RW, units="Seconds xx.x", scale_factor=self.dc_voltage_scale_factor, description="Low Battery Cut Out Delay") + self.high_battery_cut_out_voltage: FloatUint16Field = FloatUint16Field("high_battery_cut_out_voltage", 88, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="High Battery Cut Out Voltage") + self.high_battery_cut_in_voltage: FloatUint16Field = FloatUint16Field("high_battery_cut_in_voltage", 89, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="High Battery Cut In Voltage") + self.high_battery_cut_out_delay: FloatUint16Field = FloatUint16Field("high_battery_cut_out_delay", 90, 1, Mode.RW, units="Seconds xx.x", scale_factor=self.dc_voltage_scale_factor, description="High Battery Cut Out Delay") class SinglePhaseRadianInverterRealTimeModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack Radian Series Split Phase Inverter Status Block") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") - ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") - ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") - ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 7, 1, Mode.R, description="AC Frequency Scale Factor") - inverter_output_current: Uint16Field = Uint16Field("inverter_output_current", 8, 1, Mode.R, description="Inverter output current", units="Amps") - inverter_charge_current: Uint16Field = Uint16Field("inverter_charge_current", 9, 1, Mode.R, description="Inverter charger current", units="Amps") - inverter_buy_current: Uint16Field = Uint16Field("inverter_buy_current", 10, 1, Mode.R, description="Inverter buy current", units="Amps") - inverter_sell_current: Uint16Field = Uint16Field("inverter_sell_current", 11, 1, Mode.R, description="Inverter sell current", units="Amps") - grid_input_ac_voltage: Uint16Field = Uint16Field("grid_input_ac_voltage", 12, 1, Mode.R, description="Grid Input AC Voltage", units="Volts AC") - gen_input_ac_voltage: Uint16Field = Uint16Field("gen_input_ac_voltage", 13, 1, Mode.R, description="Gen Input AC Voltage", units="Volts AC") - output_ac_voltage: Uint16Field = Uint16Field("output_ac_voltage", 14, 1, Mode.R, description="Output AC Voltage", units="Volts AC") - inverter_operating_mode: EnumUint16Field = EnumUint16Field("inverter_operating_mode", 15, 1, Mode.R, description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting", options=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)])) - error_flags: Bit16Field = Bit16Field("error_flags", 16, 1, Mode.R, description="Bit field for errors. See GS_Error Table", flags=GSSingleErrorFlags) - warning_flags: Bit16Field = Bit16Field("warning_flags", 17, 1, Mode.R, description="Bit field for warnings See GS_Warning Table", flags=GSSingleWarningFlags) - battery_voltage: Uint16Field = Uint16Field("battery_voltage", 18, 1, Mode.R, description="Battery Voltage", units="Volts DC") - temp_compensated_target_voltage: Uint16Field = Uint16Field("temp_compensated_target_voltage", 19, 1, Mode.R, description="Temperature compensated target battery voltage", units="Volts DC") - aux_output_state: EnumUint16Field = EnumUint16Field("aux_output_state", 20, 1, Mode.R, description="0 = Disabled; 1 = Enabled", options=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)])) - aux_relay_output_state: EnumUint16Field = EnumUint16Field("aux_relay_output_state", 21, 1, Mode.R, description="0 = Disabled; 1 = Enabled", options=Enum("aux_relay_output_state", [('Disabled', 0), ('Enabled', 1)])) - l_module_transformer_temperature: Int16Field = Int16Field("l_module_transformer_temperature", 22, 1, Mode.R, description="Left module transformer temp in degrees C", units="Degrees C") - l_module_capacitor_temperature: Int16Field = Int16Field("l_module_capacitor_temperature", 23, 1, Mode.R, description="Left module capacitor temp in degrees C", units="Degrees C") - l_module_fet_temperature: Int16Field = Int16Field("l_module_fet_temperature", 24, 1, Mode.R, description="Left module FET temp in degrees C", units="Degrees C") - r_module_transformer_temperature: Int16Field = Int16Field("r_module_transformer_temperature", 25, 1, Mode.R, description="Right module transformer temp in degrees C", units="Degrees C") - r_module_capacitor_temperature: Int16Field = Int16Field("r_module_capacitor_temperature", 26, 1, Mode.R, description="Right module capacitor temp in degrees C", units="Degrees C") - r_module_fet_temperature: Int16Field = Int16Field("r_module_fet_temperature", 27, 1, Mode.R, description="Right module FET temp in degrees C", units="Degrees C") - battery_temperature: Int16Field = Int16Field("battery_temperature", 28, 1, Mode.R, description="Battery temp in degrees C", units="Degrees C") - ac_input_selection: EnumUint16Field = EnumUint16Field("ac_input_selection", 29, 1, Mode.R, description="0=Grid, 1=Gen", options=Enum("ac_input_selection", [('Gen', 1), ('Grid', 0)])) - ac_input_frequency: Uint16Field = Uint16Field("ac_input_frequency", 30, 1, Mode.R, description="Selected AC Input frequency HZ", units="Hz") - ac_input_voltage: Uint16Field = Uint16Field("ac_input_voltage", 31, 1, Mode.R, description="Selected Input AC Voltage", units="Volts AC") - ac_input_state: EnumUint16Field = EnumUint16Field("ac_input_state", 32, 1, Mode.R, description="1=AC Use, 0=AC_Drop", options=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)])) - minimum_ac_input_voltage: Uint16Field = Uint16Field("minimum_ac_input_voltage", 33, 1, Mode.R, description="Minimum Input AC Voltage (Write to clear value)", units="Volts AC") - maximum_ac_input_voltage: Uint16Field = Uint16Field("maximum_ac_input_voltage", 34, 1, Mode.R, description="Maximum Input AC Voltage (Write to clear value)", units="Volts AC") - sell_status: Bit16Field = Bit16Field("sell_status", 35, 1, Mode.R, description="Bit field for sell status See GS_Sell_Status Table", flags=GSSingleSellStatusFlags) - kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 36, 1, Mode.R, description="AC kWh scale factor") - ac1_buy_kwh: Uint16Field = Uint16Field("ac1_buy_kwh", 37, 1, Mode.R, description="Daily AC1 Buy kWh", units="kWh") - ac2_buy_kwh: Uint16Field = Uint16Field("ac2_buy_kwh", 38, 1, Mode.R, description="Daily AC2 Buy kWh", units="kWh") - ac1_sell_kwh: Uint16Field = Uint16Field("ac1_sell_kwh", 39, 1, Mode.R, description="Daily AC1 Sell kWh", units="kWh") - ac2_sell_kwh: Uint16Field = Uint16Field("ac2_sell_kwh", 40, 1, Mode.R, description="Daily AC2 Sell kWh", units="kWh") - output_kwh: Uint16Field = Uint16Field("output_kwh", 41, 1, Mode.R, description="Daily Output kWh", units="kWh") - charger_kwh: Uint16Field = Uint16Field("charger_kwh", 42, 1, Mode.R, description="Daily Charger kWh", units="kWh") - output_kw: Uint16Field = Uint16Field("output_kw", 43, 1, Mode.R, description="Output kW", units="kW") - buy_kw: Uint16Field = Uint16Field("buy_kw", 44, 1, Mode.R, description="Buy kW", units="kW") - sell_kw: Uint16Field = Uint16Field("sell_kw", 45, 1, Mode.R, description="Sell kW", units="kW") - charge_kw: Uint16Field = Uint16Field("charge_kw", 46, 1, Mode.R, description="Charger kW", units="kW") - load_kw: Uint16Field = Uint16Field("load_kw", 47, 1, Mode.R, description="Load kW", units="kW") - ac_couple_kw: Uint16Field = Uint16Field("ac_couple_kw", 48, 1, Mode.R, description="AC Coupled kW", units="kW") - gt_number: Uint16Field = Uint16Field("gt_number", 49, 1, Mode.R, description="GT Number sent from Inverter to Charge Controller") - - -SinglePhaseRadianInverterRealTimeModel.inverter_output_current.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_current_scale_factor -SinglePhaseRadianInverterRealTimeModel.inverter_charge_current.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_current_scale_factor -SinglePhaseRadianInverterRealTimeModel.inverter_buy_current.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_current_scale_factor -SinglePhaseRadianInverterRealTimeModel.inverter_sell_current.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_current_scale_factor -SinglePhaseRadianInverterRealTimeModel.grid_input_ac_voltage.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SinglePhaseRadianInverterRealTimeModel.gen_input_ac_voltage.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SinglePhaseRadianInverterRealTimeModel.output_ac_voltage.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SinglePhaseRadianInverterRealTimeModel.battery_voltage.scale_factor = SinglePhaseRadianInverterRealTimeModel.dc_voltage_scale_factor -SinglePhaseRadianInverterRealTimeModel.temp_compensated_target_voltage.scale_factor = SinglePhaseRadianInverterRealTimeModel.dc_voltage_scale_factor -SinglePhaseRadianInverterRealTimeModel.ac_input_frequency.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_frequency_scale_factor -SinglePhaseRadianInverterRealTimeModel.ac_input_voltage.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SinglePhaseRadianInverterRealTimeModel.minimum_ac_input_voltage.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SinglePhaseRadianInverterRealTimeModel.maximum_ac_input_voltage.scale_factor = SinglePhaseRadianInverterRealTimeModel.ac_voltage_scale_factor -SinglePhaseRadianInverterRealTimeModel.ac1_buy_kwh.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.ac2_buy_kwh.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.ac1_sell_kwh.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.ac2_sell_kwh.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.output_kwh.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.charger_kwh.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.output_kw.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.buy_kw.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.sell_kw.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.charge_kw.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.load_kw.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.ac_couple_kw.scale_factor = SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor -SinglePhaseRadianInverterRealTimeModel.__model_fields__ = [SinglePhaseRadianInverterRealTimeModel.did, SinglePhaseRadianInverterRealTimeModel.length, SinglePhaseRadianInverterRealTimeModel.port_number, SinglePhaseRadianInverterRealTimeModel.dc_voltage_scale_factor, SinglePhaseRadianInverterRealTimeModel.ac_current_scale_factor, SinglePhaseRadianInverterRealTimeModel.ac_voltage_scale_factor, SinglePhaseRadianInverterRealTimeModel.ac_frequency_scale_factor, SinglePhaseRadianInverterRealTimeModel.inverter_output_current, SinglePhaseRadianInverterRealTimeModel.inverter_charge_current, SinglePhaseRadianInverterRealTimeModel.inverter_buy_current, SinglePhaseRadianInverterRealTimeModel.inverter_sell_current, SinglePhaseRadianInverterRealTimeModel.grid_input_ac_voltage, SinglePhaseRadianInverterRealTimeModel.gen_input_ac_voltage, SinglePhaseRadianInverterRealTimeModel.output_ac_voltage, SinglePhaseRadianInverterRealTimeModel.inverter_operating_mode, SinglePhaseRadianInverterRealTimeModel.error_flags, SinglePhaseRadianInverterRealTimeModel.warning_flags, SinglePhaseRadianInverterRealTimeModel.battery_voltage, SinglePhaseRadianInverterRealTimeModel.temp_compensated_target_voltage, SinglePhaseRadianInverterRealTimeModel.aux_output_state, SinglePhaseRadianInverterRealTimeModel.aux_relay_output_state, SinglePhaseRadianInverterRealTimeModel.l_module_transformer_temperature, SinglePhaseRadianInverterRealTimeModel.l_module_capacitor_temperature, SinglePhaseRadianInverterRealTimeModel.l_module_fet_temperature, SinglePhaseRadianInverterRealTimeModel.r_module_transformer_temperature, SinglePhaseRadianInverterRealTimeModel.r_module_capacitor_temperature, SinglePhaseRadianInverterRealTimeModel.r_module_fet_temperature, SinglePhaseRadianInverterRealTimeModel.battery_temperature, SinglePhaseRadianInverterRealTimeModel.ac_input_selection, SinglePhaseRadianInverterRealTimeModel.ac_input_frequency, SinglePhaseRadianInverterRealTimeModel.ac_input_voltage, SinglePhaseRadianInverterRealTimeModel.ac_input_state, SinglePhaseRadianInverterRealTimeModel.minimum_ac_input_voltage, SinglePhaseRadianInverterRealTimeModel.maximum_ac_input_voltage, SinglePhaseRadianInverterRealTimeModel.sell_status, SinglePhaseRadianInverterRealTimeModel.kwh_scale_factor, SinglePhaseRadianInverterRealTimeModel.ac1_buy_kwh, SinglePhaseRadianInverterRealTimeModel.ac2_buy_kwh, SinglePhaseRadianInverterRealTimeModel.ac1_sell_kwh, SinglePhaseRadianInverterRealTimeModel.ac2_sell_kwh, SinglePhaseRadianInverterRealTimeModel.output_kwh, SinglePhaseRadianInverterRealTimeModel.charger_kwh, SinglePhaseRadianInverterRealTimeModel.output_kw, SinglePhaseRadianInverterRealTimeModel.buy_kw, SinglePhaseRadianInverterRealTimeModel.sell_kw, SinglePhaseRadianInverterRealTimeModel.charge_kw, SinglePhaseRadianInverterRealTimeModel.load_kw, SinglePhaseRadianInverterRealTimeModel.ac_couple_kw, SinglePhaseRadianInverterRealTimeModel.gt_number] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack Radian Series Split Phase Inverter Status Block") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") + self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") + self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") + self.ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 7, 1, Mode.R, description="AC Frequency Scale Factor") + self.inverter_operating_mode: EnumUint16Field = EnumUint16Field("inverter_operating_mode", 15, 1, Mode.R, options=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)]), description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting") + self.error_flags: Bit16Field = Bit16Field("error_flags", 16, 1, Mode.R, flags=GSSingleErrorFlags, description="Bit field for errors. See GS_Error Table") + self.warning_flags: Bit16Field = Bit16Field("warning_flags", 17, 1, Mode.R, flags=GSSingleWarningFlags, description="Bit field for warnings See GS_Warning Table") + self.aux_output_state: EnumUint16Field = EnumUint16Field("aux_output_state", 20, 1, Mode.R, options=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.aux_relay_output_state: EnumUint16Field = EnumUint16Field("aux_relay_output_state", 21, 1, Mode.R, options=Enum("aux_relay_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.l_module_transformer_temperature: Int16Field = Int16Field("l_module_transformer_temperature", 22, 1, Mode.R, units="Degrees C", description="Left module transformer temp in degrees C") + self.l_module_capacitor_temperature: Int16Field = Int16Field("l_module_capacitor_temperature", 23, 1, Mode.R, units="Degrees C", description="Left module capacitor temp in degrees C") + self.l_module_fet_temperature: Int16Field = Int16Field("l_module_fet_temperature", 24, 1, Mode.R, units="Degrees C", description="Left module FET temp in degrees C") + self.r_module_transformer_temperature: Int16Field = Int16Field("r_module_transformer_temperature", 25, 1, Mode.R, units="Degrees C", description="Right module transformer temp in degrees C") + self.r_module_capacitor_temperature: Int16Field = Int16Field("r_module_capacitor_temperature", 26, 1, Mode.R, units="Degrees C", description="Right module capacitor temp in degrees C") + self.r_module_fet_temperature: Int16Field = Int16Field("r_module_fet_temperature", 27, 1, Mode.R, units="Degrees C", description="Right module FET temp in degrees C") + self.battery_temperature: Int16Field = Int16Field("battery_temperature", 28, 1, Mode.R, units="Degrees C", description="Battery temp in degrees C") + self.ac_input_selection: EnumUint16Field = EnumUint16Field("ac_input_selection", 29, 1, Mode.R, options=Enum("ac_input_selection", [('Gen', 1), ('Grid', 0)]), description="0=Grid, 1=Gen") + self.ac_input_state: EnumUint16Field = EnumUint16Field("ac_input_state", 32, 1, Mode.R, options=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)]), description="1=AC Use, 0=AC_Drop") + self.sell_status: Bit16Field = Bit16Field("sell_status", 35, 1, Mode.R, flags=GSSingleSellStatusFlags, description="Bit field for sell status See GS_Sell_Status Table") + self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 36, 1, Mode.R, description="AC kWh scale factor") + self.gt_number: Uint16Field = Uint16Field("gt_number", 49, 1, Mode.R, description="GT Number sent from Inverter to Charge Controller") + self.inverter_output_current: FloatUint16Field = FloatUint16Field("inverter_output_current", 8, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter output current") + self.inverter_charge_current: FloatUint16Field = FloatUint16Field("inverter_charge_current", 9, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter charger current") + self.inverter_buy_current: FloatUint16Field = FloatUint16Field("inverter_buy_current", 10, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter buy current") + self.inverter_sell_current: FloatUint16Field = FloatUint16Field("inverter_sell_current", 11, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter sell current") + self.grid_input_ac_voltage: FloatUint16Field = FloatUint16Field("grid_input_ac_voltage", 12, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Grid Input AC Voltage") + self.gen_input_ac_voltage: FloatUint16Field = FloatUint16Field("gen_input_ac_voltage", 13, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Gen Input AC Voltage") + self.output_ac_voltage: FloatUint16Field = FloatUint16Field("output_ac_voltage", 14, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Output AC Voltage") + self.battery_voltage: FloatUint16Field = FloatUint16Field("battery_voltage", 18, 1, Mode.R, units="Volts DC", scale_factor=self.dc_voltage_scale_factor, description="Battery Voltage") + self.temp_compensated_target_voltage: FloatUint16Field = FloatUint16Field("temp_compensated_target_voltage", 19, 1, Mode.R, units="Volts DC", scale_factor=self.dc_voltage_scale_factor, description="Temperature compensated target battery voltage") + self.ac_input_frequency: FloatUint16Field = FloatUint16Field("ac_input_frequency", 30, 1, Mode.R, units="Hz", scale_factor=self.ac_frequency_scale_factor, description="Selected AC Input frequency HZ") + self.ac_input_voltage: FloatUint16Field = FloatUint16Field("ac_input_voltage", 31, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Selected Input AC Voltage") + self.minimum_ac_input_voltage: FloatUint16Field = FloatUint16Field("minimum_ac_input_voltage", 33, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Minimum Input AC Voltage (Write to clear value)") + self.maximum_ac_input_voltage: FloatUint16Field = FloatUint16Field("maximum_ac_input_voltage", 34, 1, Mode.R, units="Volts AC", scale_factor=self.ac_voltage_scale_factor, description="Maximum Input AC Voltage (Write to clear value)") + self.ac1_buy_kwh: FloatUint16Field = FloatUint16Field("ac1_buy_kwh", 37, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC1 Buy kWh") + self.ac2_buy_kwh: FloatUint16Field = FloatUint16Field("ac2_buy_kwh", 38, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC2 Buy kWh") + self.ac1_sell_kwh: FloatUint16Field = FloatUint16Field("ac1_sell_kwh", 39, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC1 Sell kWh") + self.ac2_sell_kwh: FloatUint16Field = FloatUint16Field("ac2_sell_kwh", 40, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily AC2 Sell kWh") + self.output_kwh: FloatUint16Field = FloatUint16Field("output_kwh", 41, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily Output kWh") + self.charger_kwh: FloatUint16Field = FloatUint16Field("charger_kwh", 42, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Daily Charger kWh") + self.output_kw: FloatUint16Field = FloatUint16Field("output_kw", 43, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Output kW") + self.buy_kw: FloatUint16Field = FloatUint16Field("buy_kw", 44, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Buy kW") + self.sell_kw: FloatUint16Field = FloatUint16Field("sell_kw", 45, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Sell kW") + self.charge_kw: FloatUint16Field = FloatUint16Field("charge_kw", 46, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Charger kW") + self.load_kw: FloatUint16Field = FloatUint16Field("load_kw", 47, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Load kW") + self.ac_couple_kw: FloatUint16Field = FloatUint16Field("ac_couple_kw", 48, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="AC Coupled kW") class FLEXnetDCRealTimeModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FLEXnet DC Battery Monitor Status Block") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") - dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 5, 1, Mode.R, description="DC Current Scale Factor") - time_scale_factor: Int16Field = Int16Field("time_scale_factor", 6, 1, Mode.R, description="Time Scale Factor") - kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 7, 1, Mode.R, description="Kilo Watt Hours Scale Factor") - kw_scale_factor: Int16Field = Int16Field("kw_scale_factor", 8, 1, Mode.R, description="Kilo Watt Scale Factor") - shunt_a_current: Int16Field = Int16Field("shunt_a_current", 9, 1, Mode.R, description="Shunt A current", units="Amps") - shunt_b_current: Int16Field = Int16Field("shunt_b_current", 10, 1, Mode.R, description="Shunt B current", units="Amps") - shunt_c_current: Int16Field = Int16Field("shunt_c_current", 11, 1, Mode.R, description="Shunt C current", units="Amps") - battery_voltage: Uint16Field = Uint16Field("battery_voltage", 12, 1, Mode.R, description="Battery Voltage", units="Volts") - battery_current: Int16Field = Int16Field("battery_current", 13, 1, Mode.R, description="Battery Current", units="Amps") - battery_temperature: Int16Field = Int16Field("battery_temperature", 14, 1, Mode.R, description="Battery Temperature C", units="Degrees C") - status_flags: Bit16Field = Bit16Field("status_flags", 15, 1, Mode.R, description="See FN Status Table", flags=FNStatusFlags) - shunt_a_accumulated_ah: Int16Field = Int16Field("shunt_a_accumulated_ah", 16, 1, Mode.R, description="Shunt A Accumulated_AH", units="AH") - shunt_a_accumulated_kwh: Int16Field = Int16Field("shunt_a_accumulated_kwh", 17, 1, Mode.R, description="Shunt A Accumulated_kWh", units="kWh") - shunt_b_accumulated_ah: Int16Field = Int16Field("shunt_b_accumulated_ah", 18, 1, Mode.R, description="Shunt B Accumulated_AH", units="AH") - shunt_b_accumulated_kwh: Int16Field = Int16Field("shunt_b_accumulated_kwh", 19, 1, Mode.R, description="Shunt B Accumulated_kWh", units="kWh") - shunt_c_accumulated_ah: Int16Field = Int16Field("shunt_c_accumulated_ah", 20, 1, Mode.R, description="Shunt C Accumulated_AH", units="AH") - shunt_c_accumulated_kwh: Int16Field = Int16Field("shunt_c_accumulated_kwh", 21, 1, Mode.R, description="Shunt C Accumulated_kWh", units="kWh") - input_current: Uint16Field = Uint16Field("input_current", 22, 1, Mode.R, description="Total_input_current", units="Amps") - output_current: Uint16Field = Uint16Field("output_current", 23, 1, Mode.R, description="Total_output_current", units="Amps") - input_kw: Uint16Field = Uint16Field("input_kw", 24, 1, Mode.R, description="Total_input_kWatts", units="kW") - output_kw: Uint16Field = Uint16Field("output_kw", 25, 1, Mode.R, description="Total_output_kWatts", units="kW") - net_kw: Int16Field = Int16Field("net_kw", 26, 1, Mode.R, description="Total_net_kWatts", units="kW") - days_since_charge_parameters_met: Uint16Field = Uint16Field("days_since_charge_parameters_met", 27, 1, Mode.R, description="Days Since Charge Parameters Met", units="Days") - state_of_charge: Uint16Field = Uint16Field("state_of_charge", 28, 1, Mode.R, description="Current Battery State of Charge", units="Percent") - todays_minimum_soc: Uint16Field = Uint16Field("todays_minimum_soc", 29, 1, Mode.R, description="Todays minimum SOC", units="Percent") - todays_maximum_soc: Uint16Field = Uint16Field("todays_maximum_soc", 30, 1, Mode.R, description="Todays maximum SOC", units="Percent") - todays_net_input_ah: Uint16Field = Uint16Field("todays_net_input_ah", 31, 1, Mode.R, description="Todays NET input AH", units="AH") - todays_net_input_kwh: Uint16Field = Uint16Field("todays_net_input_kwh", 32, 1, Mode.R, description="Todays NET input kWh", units="kWh") - todays_net_output_ah: Uint16Field = Uint16Field("todays_net_output_ah", 33, 1, Mode.R, description="Todays NET output AH", units="AH") - todays_net_output_kwh: Uint16Field = Uint16Field("todays_net_output_kwh", 34, 1, Mode.R, description="Todays NET output kWh", units="kWh") - todays_net_battery_ah: Int16Field = Int16Field("todays_net_battery_ah", 35, 1, Mode.R, description="Todays NET battery AH", units="AH") - todays_net_battery_kwh: Int16Field = Int16Field("todays_net_battery_kwh", 36, 1, Mode.R, description="Todays NET battery kWh", units="kWh") - charge_factor_corrected_net_battery_ah: Int16Field = Int16Field("charge_factor_corrected_net_battery_ah", 37, 1, Mode.R, description="Charge factor corrected NET battery AH", units="AH") - charge_factor_corrected_net_battery_kwh: Int16Field = Int16Field("charge_factor_corrected_net_battery_kwh", 38, 1, Mode.R, description="Charge factor corrected NET battery kWh", units="kWh") - todays_minimum_battery_voltage: Uint16Field = Uint16Field("todays_minimum_battery_voltage", 39, 1, Mode.R, description="Todays minimum battery voltage", units="Volts") - todays_minimum_battery_time: Uint32Field = Uint32Field("todays_minimum_battery_time", 40, 2, Mode.R, description="Todays minimum battery voltage time UTC", units="Seconds") - todays_maximum_battery_voltage: Uint16Field = Uint16Field("todays_maximum_battery_voltage", 42, 1, Mode.R, description="Todays maximum battery voltage", units="Volts") - todays_maximum_battery_time: Uint32Field = Uint32Field("todays_maximum_battery_time", 43, 2, Mode.R, description="Todays maximum battery voltage time UTC", units="Seconds") - cycle_charge_factor: Uint16Field = Uint16Field("cycle_charge_factor", 45, 1, Mode.R, description="Cycle Charge Factor", units="Percent") - cycle_kwh_charge_efficiency: Uint16Field = Uint16Field("cycle_kwh_charge_efficiency", 46, 1, Mode.R, description="Cycle kWh Charge Efficiency", units="Percent") - total_days_at_100_percent: Uint16Field = Uint16Field("total_days_at_100_percent", 47, 1, Mode.R, description="Total days at 100% charged", units="Days") - lifetime_k_ah_removed: Uint16Field = Uint16Field("lifetime_k_ah_removed", 48, 1, Mode.R, description="Lifetime kAH removed from battery", units="AH") - shunt_a_historical_returned_to_battery_ah: Uint16Field = Uint16Field("shunt_a_historical_returned_to_battery_ah", 49, 1, Mode.R, description="Shunt A historical returned to battery AH", units="AH") - shunt_a_historical_returned_to_battery_kwh: Uint16Field = Uint16Field("shunt_a_historical_returned_to_battery_kwh", 50, 1, Mode.R, description="Shunt A historical returned to battery kWh", units="kWh") - shunt_a_historical_removed_from_battery_ah: Uint16Field = Uint16Field("shunt_a_historical_removed_from_battery_ah", 51, 1, Mode.R, description="Shunt A historical removed from battery AH", units="AH") - shunt_a_historical_removed_from_battery_kwh: Uint16Field = Uint16Field("shunt_a_historical_removed_from_battery_kwh", 52, 1, Mode.R, description="Shunt A historical removed from battery kWh", units="kWh") - shunt_a_maximum_charge_rate: Uint16Field = Uint16Field("shunt_a_maximum_charge_rate", 53, 1, Mode.R, description="Shunt A historical maximum charge rate Amps", units="Amps") - shunt_a_maximum_charge_rate_kw: Uint16Field = Uint16Field("shunt_a_maximum_charge_rate_kw", 54, 1, Mode.R, description="Shunt A historical maximum charge rate kW", units="kW") - shunt_a_maximum_discharge_rate: Int16Field = Int16Field("shunt_a_maximum_discharge_rate", 55, 1, Mode.R, description="Shunt A historical maximum discharge rate Amps", units="Amps") - shunt_a_maximum_discharge_rate_kw: Int16Field = Int16Field("shunt_a_maximum_discharge_rate_kw", 56, 1, Mode.R, description="Shunt A historical maximum discharge rate kW", units="kW") - shunt_b_historical_returned_to_battery_ah: Uint16Field = Uint16Field("shunt_b_historical_returned_to_battery_ah", 57, 1, Mode.R, description="Shunt B historical returned to battery AH", units="AH") - shunt_b_historical_returned_to_battery_kwh: Uint16Field = Uint16Field("shunt_b_historical_returned_to_battery_kwh", 58, 1, Mode.R, description="Shunt B historical returned to battery kWh", units="kWh") - shunt_b_historical_removed_from_battery_ah: Uint16Field = Uint16Field("shunt_b_historical_removed_from_battery_ah", 59, 1, Mode.R, description="Shunt B historical removed from battery AH", units="AH") - shunt_b_historical_removed_from_battery_kwh: Uint16Field = Uint16Field("shunt_b_historical_removed_from_battery_kwh", 60, 1, Mode.R, description="Shunt B historical removed from battery kWh", units="kWh") - shunt_b_maximum_charge_rate: Uint16Field = Uint16Field("shunt_b_maximum_charge_rate", 61, 1, Mode.R, description="Shunt B historical maximum charge rate Amps", units="Amps") - shunt_b_maximum_charge_rate_kw: Uint16Field = Uint16Field("shunt_b_maximum_charge_rate_kw", 62, 1, Mode.R, description="Shunt B historical maximum charge rate kW", units="kW") - shunt_b_maximum_discharge_rate: Int16Field = Int16Field("shunt_b_maximum_discharge_rate", 63, 1, Mode.R, description="Shunt B historical maximum discharge rate Amps", units="Amps") - shunt_b_maximum_discharge_rate_kw: Int16Field = Int16Field("shunt_b_maximum_discharge_rate_kw", 64, 1, Mode.R, description="Shunt B historical maximum discharge rate kW", units="kW") - shunt_c_historical_returned_to_battery_ah: Uint16Field = Uint16Field("shunt_c_historical_returned_to_battery_ah", 65, 1, Mode.R, description="Shunt C historical returned to battery AH", units="AH") - shunt_c_historical_returned_to_battery_kwh: Uint16Field = Uint16Field("shunt_c_historical_returned_to_battery_kwh", 66, 1, Mode.R, description="Shunt C historical returned to battery kWh", units="kWh") - shunt_c_historical_removed_from_battery_ah: Uint16Field = Uint16Field("shunt_c_historical_removed_from_battery_ah", 67, 1, Mode.R, description="Shunt C historical removed from battery AH", units="AH") - shunt_c_historical_removed_from_battery_kwh: Uint16Field = Uint16Field("shunt_c_historical_removed_from_battery_kwh", 68, 1, Mode.R, description="Shunt C historical removed from battery kWh", units="kWh") - shunt_c_maximum_charge_rate: Uint16Field = Uint16Field("shunt_c_maximum_charge_rate", 69, 1, Mode.R, description="Shunt C historical maximum charge rate Amps", units="Amps") - shunt_c_maximum_charge_rate_kw: Uint16Field = Uint16Field("shunt_c_maximum_charge_rate_kw", 70, 1, Mode.R, description="Shunt C historical maximum charge rate kW", units="kW") - shunt_c_maximum_discharge_rate: Int16Field = Int16Field("shunt_c_maximum_discharge_rate", 71, 1, Mode.R, description="Shunt C historical maximum discharge rate Amps", units="Amps") - shunt_c_maximum_discharge_rate_kw: Int16Field = Int16Field("shunt_c_maximum_discharge_rate_kw", 72, 1, Mode.R, description="Shunt C historical maximum discharge rate kW", units="kW") - shunt_a_reset_maximum_data: Uint16Field = Uint16Field("shunt_a_reset_maximum_data", 73, 1, Mode.R, description="Read value needed to reset shunt A maximum data") - shunt_a_reset_maximum_data_write_complement: Uint16Field = Uint16Field("shunt_a_reset_maximum_data_write_complement", 74, 1, Mode.W, description="Write value's complement to reset shunt A maximum data") - shunt_b_reset_maximum_data: Uint16Field = Uint16Field("shunt_b_reset_maximum_data", 75, 1, Mode.R, description="Read value needed to reset shunt B maximum data") - shunt_b_reset_maximum_data_write_complement: Uint16Field = Uint16Field("shunt_b_reset_maximum_data_write_complement", 76, 1, Mode.W, description="Write value's complement to reset shunt B maximum data") - shunt_c_reset_maximum_data: Uint16Field = Uint16Field("shunt_c_reset_maximum_data", 77, 1, Mode.R, description="Read value needed to reset shunt C maximum data") - shunt_c_reset_maximum_data_write_complement: Uint16Field = Uint16Field("shunt_c_reset_maximum_data_write_complement", 78, 1, Mode.W, description="Write value's complement to reset shunt C maximum data") - - -FLEXnetDCRealTimeModel.shunt_a_current.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.shunt_b_current.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.shunt_c_current.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.battery_voltage.scale_factor = FLEXnetDCRealTimeModel.dc_voltage_scale_factor -FLEXnetDCRealTimeModel.battery_current.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.shunt_a_accumulated_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_b_accumulated_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_c_accumulated_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.input_current.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.output_current.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.input_kw.scale_factor = FLEXnetDCRealTimeModel.kw_scale_factor -FLEXnetDCRealTimeModel.output_kw.scale_factor = FLEXnetDCRealTimeModel.kw_scale_factor -FLEXnetDCRealTimeModel.net_kw.scale_factor = FLEXnetDCRealTimeModel.kw_scale_factor -FLEXnetDCRealTimeModel.days_since_charge_parameters_met.scale_factor = FLEXnetDCRealTimeModel.time_scale_factor -FLEXnetDCRealTimeModel.todays_net_input_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.todays_net_output_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.todays_net_battery_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.charge_factor_corrected_net_battery_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.todays_minimum_battery_voltage.scale_factor = FLEXnetDCRealTimeModel.dc_voltage_scale_factor -FLEXnetDCRealTimeModel.todays_maximum_battery_voltage.scale_factor = FLEXnetDCRealTimeModel.dc_voltage_scale_factor -FLEXnetDCRealTimeModel.total_days_at_100_percent.scale_factor = FLEXnetDCRealTimeModel.time_scale_factor -FLEXnetDCRealTimeModel.shunt_a_historical_returned_to_battery_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_a_historical_removed_from_battery_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_a_maximum_charge_rate.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.shunt_a_maximum_charge_rate_kw.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_a_maximum_discharge_rate.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.shunt_a_maximum_discharge_rate_kw.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_b_historical_returned_to_battery_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_b_historical_removed_from_battery_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_b_maximum_charge_rate.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.shunt_b_maximum_charge_rate_kw.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_b_maximum_discharge_rate.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.shunt_b_maximum_discharge_rate_kw.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_c_historical_returned_to_battery_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_c_historical_removed_from_battery_kwh.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_c_maximum_charge_rate.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.shunt_c_maximum_charge_rate_kw.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.shunt_c_maximum_discharge_rate.scale_factor = FLEXnetDCRealTimeModel.dc_current_scale_factor -FLEXnetDCRealTimeModel.shunt_c_maximum_discharge_rate_kw.scale_factor = FLEXnetDCRealTimeModel.kwh_scale_factor -FLEXnetDCRealTimeModel.__model_fields__ = [FLEXnetDCRealTimeModel.did, FLEXnetDCRealTimeModel.length, FLEXnetDCRealTimeModel.port_number, FLEXnetDCRealTimeModel.dc_voltage_scale_factor, FLEXnetDCRealTimeModel.dc_current_scale_factor, FLEXnetDCRealTimeModel.time_scale_factor, FLEXnetDCRealTimeModel.kwh_scale_factor, FLEXnetDCRealTimeModel.kw_scale_factor, FLEXnetDCRealTimeModel.shunt_a_current, FLEXnetDCRealTimeModel.shunt_b_current, FLEXnetDCRealTimeModel.shunt_c_current, FLEXnetDCRealTimeModel.battery_voltage, FLEXnetDCRealTimeModel.battery_current, FLEXnetDCRealTimeModel.battery_temperature, FLEXnetDCRealTimeModel.status_flags, FLEXnetDCRealTimeModel.shunt_a_accumulated_ah, FLEXnetDCRealTimeModel.shunt_a_accumulated_kwh, FLEXnetDCRealTimeModel.shunt_b_accumulated_ah, FLEXnetDCRealTimeModel.shunt_b_accumulated_kwh, FLEXnetDCRealTimeModel.shunt_c_accumulated_ah, FLEXnetDCRealTimeModel.shunt_c_accumulated_kwh, FLEXnetDCRealTimeModel.input_current, FLEXnetDCRealTimeModel.output_current, FLEXnetDCRealTimeModel.input_kw, FLEXnetDCRealTimeModel.output_kw, FLEXnetDCRealTimeModel.net_kw, FLEXnetDCRealTimeModel.days_since_charge_parameters_met, FLEXnetDCRealTimeModel.state_of_charge, FLEXnetDCRealTimeModel.todays_minimum_soc, FLEXnetDCRealTimeModel.todays_maximum_soc, FLEXnetDCRealTimeModel.todays_net_input_ah, FLEXnetDCRealTimeModel.todays_net_input_kwh, FLEXnetDCRealTimeModel.todays_net_output_ah, FLEXnetDCRealTimeModel.todays_net_output_kwh, FLEXnetDCRealTimeModel.todays_net_battery_ah, FLEXnetDCRealTimeModel.todays_net_battery_kwh, FLEXnetDCRealTimeModel.charge_factor_corrected_net_battery_ah, FLEXnetDCRealTimeModel.charge_factor_corrected_net_battery_kwh, FLEXnetDCRealTimeModel.todays_minimum_battery_voltage, FLEXnetDCRealTimeModel.todays_minimum_battery_time, FLEXnetDCRealTimeModel.todays_maximum_battery_voltage, FLEXnetDCRealTimeModel.todays_maximum_battery_time, FLEXnetDCRealTimeModel.cycle_charge_factor, FLEXnetDCRealTimeModel.cycle_kwh_charge_efficiency, FLEXnetDCRealTimeModel.total_days_at_100_percent, FLEXnetDCRealTimeModel.lifetime_k_ah_removed, FLEXnetDCRealTimeModel.shunt_a_historical_returned_to_battery_ah, FLEXnetDCRealTimeModel.shunt_a_historical_returned_to_battery_kwh, FLEXnetDCRealTimeModel.shunt_a_historical_removed_from_battery_ah, FLEXnetDCRealTimeModel.shunt_a_historical_removed_from_battery_kwh, FLEXnetDCRealTimeModel.shunt_a_maximum_charge_rate, FLEXnetDCRealTimeModel.shunt_a_maximum_charge_rate_kw, FLEXnetDCRealTimeModel.shunt_a_maximum_discharge_rate, FLEXnetDCRealTimeModel.shunt_a_maximum_discharge_rate_kw, FLEXnetDCRealTimeModel.shunt_b_historical_returned_to_battery_ah, FLEXnetDCRealTimeModel.shunt_b_historical_returned_to_battery_kwh, FLEXnetDCRealTimeModel.shunt_b_historical_removed_from_battery_ah, FLEXnetDCRealTimeModel.shunt_b_historical_removed_from_battery_kwh, FLEXnetDCRealTimeModel.shunt_b_maximum_charge_rate, FLEXnetDCRealTimeModel.shunt_b_maximum_charge_rate_kw, FLEXnetDCRealTimeModel.shunt_b_maximum_discharge_rate, FLEXnetDCRealTimeModel.shunt_b_maximum_discharge_rate_kw, FLEXnetDCRealTimeModel.shunt_c_historical_returned_to_battery_ah, FLEXnetDCRealTimeModel.shunt_c_historical_returned_to_battery_kwh, FLEXnetDCRealTimeModel.shunt_c_historical_removed_from_battery_ah, FLEXnetDCRealTimeModel.shunt_c_historical_removed_from_battery_kwh, FLEXnetDCRealTimeModel.shunt_c_maximum_charge_rate, FLEXnetDCRealTimeModel.shunt_c_maximum_charge_rate_kw, FLEXnetDCRealTimeModel.shunt_c_maximum_discharge_rate, FLEXnetDCRealTimeModel.shunt_c_maximum_discharge_rate_kw, FLEXnetDCRealTimeModel.shunt_a_reset_maximum_data, FLEXnetDCRealTimeModel.shunt_a_reset_maximum_data_write_complement, FLEXnetDCRealTimeModel.shunt_b_reset_maximum_data, FLEXnetDCRealTimeModel.shunt_b_reset_maximum_data_write_complement, FLEXnetDCRealTimeModel.shunt_c_reset_maximum_data, FLEXnetDCRealTimeModel.shunt_c_reset_maximum_data_write_complement] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FLEXnet DC Battery Monitor Status Block") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on Outback network") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") + self.dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 5, 1, Mode.R, description="DC Current Scale Factor") + self.time_scale_factor: Int16Field = Int16Field("time_scale_factor", 6, 1, Mode.R, description="Time Scale Factor") + self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 7, 1, Mode.R, description="Kilo Watt Hours Scale Factor") + self.kw_scale_factor: Int16Field = Int16Field("kw_scale_factor", 8, 1, Mode.R, description="Kilo Watt Scale Factor") + self.battery_temperature: Int16Field = Int16Field("battery_temperature", 14, 1, Mode.R, units="Degrees C", description="Battery Temperature C") + self.status_flags: Bit16Field = Bit16Field("status_flags", 15, 1, Mode.R, flags=FNStatusFlags, description="See FN Status Table") + self.shunt_a_accumulated_ah: Int16Field = Int16Field("shunt_a_accumulated_ah", 16, 1, Mode.R, units="AH", description="Shunt A Accumulated_AH") + self.shunt_b_accumulated_ah: Int16Field = Int16Field("shunt_b_accumulated_ah", 18, 1, Mode.R, units="AH", description="Shunt B Accumulated_AH") + self.shunt_c_accumulated_ah: Int16Field = Int16Field("shunt_c_accumulated_ah", 20, 1, Mode.R, units="AH", description="Shunt C Accumulated_AH") + self.state_of_charge: Uint16Field = Uint16Field("state_of_charge", 28, 1, Mode.R, units="Percent", description="Current Battery State of Charge") + self.todays_minimum_soc: Uint16Field = Uint16Field("todays_minimum_soc", 29, 1, Mode.R, units="Percent", description="Todays minimum SOC") + self.todays_maximum_soc: Uint16Field = Uint16Field("todays_maximum_soc", 30, 1, Mode.R, units="Percent", description="Todays maximum SOC") + self.todays_net_input_ah: Uint16Field = Uint16Field("todays_net_input_ah", 31, 1, Mode.R, units="AH", description="Todays NET input AH") + self.todays_net_output_ah: Uint16Field = Uint16Field("todays_net_output_ah", 33, 1, Mode.R, units="AH", description="Todays NET output AH") + self.todays_net_battery_ah: Int16Field = Int16Field("todays_net_battery_ah", 35, 1, Mode.R, units="AH", description="Todays NET battery AH") + self.charge_factor_corrected_net_battery_ah: Int16Field = Int16Field("charge_factor_corrected_net_battery_ah", 37, 1, Mode.R, units="AH", description="Charge factor corrected NET battery AH") + self.todays_minimum_battery_time: Uint32Field = Uint32Field("todays_minimum_battery_time", 40, 2, Mode.R, units="Seconds", description="Todays minimum battery voltage time UTC") + self.todays_maximum_battery_time: Uint32Field = Uint32Field("todays_maximum_battery_time", 43, 2, Mode.R, units="Seconds", description="Todays maximum battery voltage time UTC") + self.cycle_charge_factor: Uint16Field = Uint16Field("cycle_charge_factor", 45, 1, Mode.R, units="Percent", description="Cycle Charge Factor") + self.cycle_kwh_charge_efficiency: Uint16Field = Uint16Field("cycle_kwh_charge_efficiency", 46, 1, Mode.R, units="Percent", description="Cycle kWh Charge Efficiency") + self.lifetime_k_ah_removed: Uint16Field = Uint16Field("lifetime_k_ah_removed", 48, 1, Mode.R, units="AH", description="Lifetime kAH removed from battery") + self.shunt_a_historical_returned_to_battery_ah: Uint16Field = Uint16Field("shunt_a_historical_returned_to_battery_ah", 49, 1, Mode.R, units="AH", description="Shunt A historical returned to battery AH") + self.shunt_a_historical_removed_from_battery_ah: Uint16Field = Uint16Field("shunt_a_historical_removed_from_battery_ah", 51, 1, Mode.R, units="AH", description="Shunt A historical removed from battery AH") + self.shunt_b_historical_returned_to_battery_ah: Uint16Field = Uint16Field("shunt_b_historical_returned_to_battery_ah", 57, 1, Mode.R, units="AH", description="Shunt B historical returned to battery AH") + self.shunt_b_historical_removed_from_battery_ah: Uint16Field = Uint16Field("shunt_b_historical_removed_from_battery_ah", 59, 1, Mode.R, units="AH", description="Shunt B historical removed from battery AH") + self.shunt_c_historical_returned_to_battery_ah: Uint16Field = Uint16Field("shunt_c_historical_returned_to_battery_ah", 65, 1, Mode.R, units="AH", description="Shunt C historical returned to battery AH") + self.shunt_c_historical_removed_from_battery_ah: Uint16Field = Uint16Field("shunt_c_historical_removed_from_battery_ah", 67, 1, Mode.R, units="AH", description="Shunt C historical removed from battery AH") + self.shunt_a_reset_maximum_data: Uint16Field = Uint16Field("shunt_a_reset_maximum_data", 73, 1, Mode.R, description="Read value needed to reset shunt A maximum data") + self.shunt_a_reset_maximum_data_write_complement: Uint16Field = Uint16Field("shunt_a_reset_maximum_data_write_complement", 74, 1, Mode.W, description="Write value's complement to reset shunt A maximum data") + self.shunt_b_reset_maximum_data: Uint16Field = Uint16Field("shunt_b_reset_maximum_data", 75, 1, Mode.R, description="Read value needed to reset shunt B maximum data") + self.shunt_b_reset_maximum_data_write_complement: Uint16Field = Uint16Field("shunt_b_reset_maximum_data_write_complement", 76, 1, Mode.W, description="Write value's complement to reset shunt B maximum data") + self.shunt_c_reset_maximum_data: Uint16Field = Uint16Field("shunt_c_reset_maximum_data", 77, 1, Mode.R, description="Read value needed to reset shunt C maximum data") + self.shunt_c_reset_maximum_data_write_complement: Uint16Field = Uint16Field("shunt_c_reset_maximum_data_write_complement", 78, 1, Mode.W, description="Write value's complement to reset shunt C maximum data") + self.shunt_a_current: FloatInt16Field = FloatInt16Field("shunt_a_current", 9, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Shunt A current") + self.shunt_b_current: FloatInt16Field = FloatInt16Field("shunt_b_current", 10, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Shunt B current") + self.shunt_c_current: FloatInt16Field = FloatInt16Field("shunt_c_current", 11, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Shunt C current") + self.battery_voltage: FloatUint16Field = FloatUint16Field("battery_voltage", 12, 1, Mode.R, units="Volts", scale_factor=self.dc_voltage_scale_factor, description="Battery Voltage") + self.battery_current: FloatInt16Field = FloatInt16Field("battery_current", 13, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Battery Current") + self.shunt_a_accumulated_kwh: FloatInt16Field = FloatInt16Field("shunt_a_accumulated_kwh", 17, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Shunt A Accumulated_kWh") + self.shunt_b_accumulated_kwh: FloatInt16Field = FloatInt16Field("shunt_b_accumulated_kwh", 19, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Shunt B Accumulated_kWh") + self.shunt_c_accumulated_kwh: FloatInt16Field = FloatInt16Field("shunt_c_accumulated_kwh", 21, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Shunt C Accumulated_kWh") + self.input_current: FloatUint16Field = FloatUint16Field("input_current", 22, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Total_input_current") + self.output_current: FloatUint16Field = FloatUint16Field("output_current", 23, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Total_output_current") + self.input_kw: FloatUint16Field = FloatUint16Field("input_kw", 24, 1, Mode.R, units="kW", scale_factor=self.kw_scale_factor, description="Total_input_kWatts") + self.output_kw: FloatUint16Field = FloatUint16Field("output_kw", 25, 1, Mode.R, units="kW", scale_factor=self.kw_scale_factor, description="Total_output_kWatts") + self.net_kw: FloatInt16Field = FloatInt16Field("net_kw", 26, 1, Mode.R, units="kW", scale_factor=self.kw_scale_factor, description="Total_net_kWatts") + self.days_since_charge_parameters_met: FloatUint16Field = FloatUint16Field("days_since_charge_parameters_met", 27, 1, Mode.R, units="Days", scale_factor=self.time_scale_factor, description="Days Since Charge Parameters Met") + self.todays_net_input_kwh: FloatUint16Field = FloatUint16Field("todays_net_input_kwh", 32, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Todays NET input kWh") + self.todays_net_output_kwh: FloatUint16Field = FloatUint16Field("todays_net_output_kwh", 34, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Todays NET output kWh") + self.todays_net_battery_kwh: FloatInt16Field = FloatInt16Field("todays_net_battery_kwh", 36, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Todays NET battery kWh") + self.charge_factor_corrected_net_battery_kwh: FloatInt16Field = FloatInt16Field("charge_factor_corrected_net_battery_kwh", 38, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Charge factor corrected NET battery kWh") + self.todays_minimum_battery_voltage: FloatUint16Field = FloatUint16Field("todays_minimum_battery_voltage", 39, 1, Mode.R, units="Volts", scale_factor=self.dc_voltage_scale_factor, description="Todays minimum battery voltage") + self.todays_maximum_battery_voltage: FloatUint16Field = FloatUint16Field("todays_maximum_battery_voltage", 42, 1, Mode.R, units="Volts", scale_factor=self.dc_voltage_scale_factor, description="Todays maximum battery voltage") + self.total_days_at_100_percent: FloatUint16Field = FloatUint16Field("total_days_at_100_percent", 47, 1, Mode.R, units="Days", scale_factor=self.time_scale_factor, description="Total days at 100% charged") + self.shunt_a_historical_returned_to_battery_kwh: FloatUint16Field = FloatUint16Field("shunt_a_historical_returned_to_battery_kwh", 50, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Shunt A historical returned to battery kWh") + self.shunt_a_historical_removed_from_battery_kwh: FloatUint16Field = FloatUint16Field("shunt_a_historical_removed_from_battery_kwh", 52, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Shunt A historical removed from battery kWh") + self.shunt_a_maximum_charge_rate: FloatUint16Field = FloatUint16Field("shunt_a_maximum_charge_rate", 53, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Shunt A historical maximum charge rate Amps") + self.shunt_a_maximum_charge_rate_kw: FloatUint16Field = FloatUint16Field("shunt_a_maximum_charge_rate_kw", 54, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Shunt A historical maximum charge rate kW") + self.shunt_a_maximum_discharge_rate: FloatInt16Field = FloatInt16Field("shunt_a_maximum_discharge_rate", 55, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Shunt A historical maximum discharge rate Amps") + self.shunt_a_maximum_discharge_rate_kw: FloatInt16Field = FloatInt16Field("shunt_a_maximum_discharge_rate_kw", 56, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Shunt A historical maximum discharge rate kW") + self.shunt_b_historical_returned_to_battery_kwh: FloatUint16Field = FloatUint16Field("shunt_b_historical_returned_to_battery_kwh", 58, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Shunt B historical returned to battery kWh") + self.shunt_b_historical_removed_from_battery_kwh: FloatUint16Field = FloatUint16Field("shunt_b_historical_removed_from_battery_kwh", 60, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Shunt B historical removed from battery kWh") + self.shunt_b_maximum_charge_rate: FloatUint16Field = FloatUint16Field("shunt_b_maximum_charge_rate", 61, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Shunt B historical maximum charge rate Amps") + self.shunt_b_maximum_charge_rate_kw: FloatUint16Field = FloatUint16Field("shunt_b_maximum_charge_rate_kw", 62, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Shunt B historical maximum charge rate kW") + self.shunt_b_maximum_discharge_rate: FloatInt16Field = FloatInt16Field("shunt_b_maximum_discharge_rate", 63, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Shunt B historical maximum discharge rate Amps") + self.shunt_b_maximum_discharge_rate_kw: FloatInt16Field = FloatInt16Field("shunt_b_maximum_discharge_rate_kw", 64, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Shunt B historical maximum discharge rate kW") + self.shunt_c_historical_returned_to_battery_kwh: FloatUint16Field = FloatUint16Field("shunt_c_historical_returned_to_battery_kwh", 66, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Shunt C historical returned to battery kWh") + self.shunt_c_historical_removed_from_battery_kwh: FloatUint16Field = FloatUint16Field("shunt_c_historical_removed_from_battery_kwh", 68, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Shunt C historical removed from battery kWh") + self.shunt_c_maximum_charge_rate: FloatUint16Field = FloatUint16Field("shunt_c_maximum_charge_rate", 69, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Shunt C historical maximum charge rate Amps") + self.shunt_c_maximum_charge_rate_kw: FloatUint16Field = FloatUint16Field("shunt_c_maximum_charge_rate_kw", 70, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Shunt C historical maximum charge rate kW") + self.shunt_c_maximum_discharge_rate: FloatInt16Field = FloatInt16Field("shunt_c_maximum_discharge_rate", 71, 1, Mode.R, units="Amps", scale_factor=self.dc_current_scale_factor, description="Shunt C historical maximum discharge rate Amps") + self.shunt_c_maximum_discharge_rate_kw: FloatInt16Field = FloatInt16Field("shunt_c_maximum_discharge_rate_kw", 72, 1, Mode.R, units="kW", scale_factor=self.kwh_scale_factor, description="Shunt C historical maximum discharge rate kW") class FLEXnetDCConfigurationModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FLEXnet-DC Battery Monitor Configuration Block") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on OutBack network") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") - dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 5, 1, Mode.R, description="DC Current Scale Factor") - kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 6, 1, Mode.R, description="Kilo Watt Hours Scale Factor") - major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 7, 1, Mode.R, description="FLEXnet-DC Major firmware revision") - mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 8, 1, Mode.R, description="FLEXnet-DC Mid firmware revision") - minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 9, 1, Mode.R, description="FLEXnet-DC Minor firmware revision") - battery_capacity: Uint16Field = Uint16Field("battery_capacity", 10, 1, Mode.RW, description="Battery AH capacity", units="AH") - charged_volts: Uint16Field = Uint16Field("charged_volts", 11, 1, Mode.RW, description="Battery Charged Voltage", units="DC Volts") - charged_time: Uint16Field = Uint16Field("charged_time", 12, 1, Mode.RW, description="Battery Charged Time Minutes", units="Minutes") - battery_charged_amps: Uint16Field = Uint16Field("battery_charged_amps", 13, 1, Mode.RW, description="Battery Charged Return Amps", units="Amps") - charge_factor: Uint16Field = Uint16Field("charge_factor", 14, 1, Mode.RW, description="Battery Charge Factor", units="Percent") - shunt_a_enabled: EnumUint16Field = EnumUint16Field("shunt_a_enabled", 15, 1, Mode.RW, description="0=Enabled, 1=Disabled", options=Enum("shunt_a_enabled", [('Disabled', 1), ('Enabled', 0)])) - shunt_b_enabled: EnumUint16Field = EnumUint16Field("shunt_b_enabled", 16, 1, Mode.RW, description="0=Enabled, 1=Disabled", options=Enum("shunt_b_enabled", [('Disabled', 1), ('Enabled', 0)])) - shunt_c_enabled: EnumUint16Field = EnumUint16Field("shunt_c_enabled", 17, 1, Mode.RW, description="0=Enabled, 1=Disabled", options=Enum("shunt_c_enabled", [('Disabled', 1), ('Enabled', 0)])) - relay_control: EnumUint16Field = EnumUint16Field("relay_control", 18, 1, Mode.RW, description="0 = Off; 1 = Auto; 2 = On", options=Enum("relay_control", [('Auto', 1), ('Off', 0), ('On', 2)])) - relay_invert_logic: EnumUint16Field = EnumUint16Field("relay_invert_logic", 19, 1, Mode.RW, description="0=Invert Logic,1=Normal", options=Enum("relay_invert_logic", [('Invert Logic', 0), ('Normal', 1)])) - relay_high_voltage: Uint16Field = Uint16Field("relay_high_voltage", 20, 1, Mode.RW, description="Relay high voltage enable", units="DC Volts") - relay_low_voltage: Uint16Field = Uint16Field("relay_low_voltage", 21, 1, Mode.RW, description="Relay low voltage enable", units="DC Volts") - relay_soc_high: Uint16Field = Uint16Field("relay_soc_high", 22, 1, Mode.RW, description="Relay high SOC enable", units="Percent") - relay_soc_low: Uint16Field = Uint16Field("relay_soc_low", 23, 1, Mode.RW, description="Relay low SOC enable", units="Percent") - relay_high_enable_delay: Uint16Field = Uint16Field("relay_high_enable_delay", 24, 1, Mode.RW, description="Relay High Enable Delay", units="Minutes") - relay_low_enable_delay: Uint16Field = Uint16Field("relay_low_enable_delay", 25, 1, Mode.RW, description="Relay Low Enable Delay", units="Minutes") - set_data_log_day_offset: Uint16Field = Uint16Field("set_data_log_day_offset", 26, 1, Mode.RW, description="Day offset 0-400, 0 =Today, 1 = -1 day \u2026", units="Days") - get_current_data_log_day_offset: Uint16Field = Uint16Field("get_current_data_log_day_offset", 27, 1, Mode.R, description="Current Data Log Day Offset", units="Days") - datalog_minimum_soc: Uint16Field = Uint16Field("datalog_minimum_soc", 28, 1, Mode.R, description="Datalog minimum SOC", units="Percent") - datalog_input_ah: Uint16Field = Uint16Field("datalog_input_ah", 29, 1, Mode.R, description="Datalog input AH", units="AH") - datalog_input_kwh: Uint16Field = Uint16Field("datalog_input_kwh", 30, 1, Mode.R, description="Datalog input kWh", units="kWh") - datalog_output_ah: Uint16Field = Uint16Field("datalog_output_ah", 31, 1, Mode.R, description="Datalog output AH", units="AH") - datalog_output_kwh: Uint16Field = Uint16Field("datalog_output_kwh", 32, 1, Mode.R, description="Datalog output kWh", units="kWh") - datalog_net_ah: Uint16Field = Uint16Field("datalog_net_ah", 33, 1, Mode.R, description="Datalog NET AH", units="AH") - datalog_net_kwh: Uint16Field = Uint16Field("datalog_net_kwh", 34, 1, Mode.R, description="Datalog NET kWh", units="kWh") - clear_data_log_read: Uint16Field = Uint16Field("clear_data_log_read", 35, 1, Mode.R, description="Read value needed to clear data log") - clear_data_log_write_complement: Uint16Field = Uint16Field("clear_data_log_write_complement", 36, 1, Mode.W, description="Write value's complement to clear data log") - serial_number: StringField = StringField("serial_number", 37, 9, Mode.R, description="Device serial number") - model_number: StringField = StringField("model_number", 46, 9, Mode.R, description="Device model") - - -FLEXnetDCConfigurationModel.charged_volts.scale_factor = FLEXnetDCConfigurationModel.dc_voltage_scale_factor -FLEXnetDCConfigurationModel.battery_charged_amps.scale_factor = FLEXnetDCConfigurationModel.dc_current_scale_factor -FLEXnetDCConfigurationModel.relay_high_voltage.scale_factor = FLEXnetDCConfigurationModel.dc_voltage_scale_factor -FLEXnetDCConfigurationModel.relay_low_voltage.scale_factor = FLEXnetDCConfigurationModel.dc_voltage_scale_factor -FLEXnetDCConfigurationModel.datalog_input_kwh.scale_factor = FLEXnetDCConfigurationModel.kwh_scale_factor -FLEXnetDCConfigurationModel.datalog_output_kwh.scale_factor = FLEXnetDCConfigurationModel.kwh_scale_factor -FLEXnetDCConfigurationModel.datalog_net_kwh.scale_factor = FLEXnetDCConfigurationModel.kwh_scale_factor -FLEXnetDCConfigurationModel.__model_fields__ = [FLEXnetDCConfigurationModel.did, FLEXnetDCConfigurationModel.length, FLEXnetDCConfigurationModel.port_number, FLEXnetDCConfigurationModel.dc_voltage_scale_factor, FLEXnetDCConfigurationModel.dc_current_scale_factor, FLEXnetDCConfigurationModel.kwh_scale_factor, FLEXnetDCConfigurationModel.major_firmware_number, FLEXnetDCConfigurationModel.mid_firmware_number, FLEXnetDCConfigurationModel.minor_firmware_number, FLEXnetDCConfigurationModel.battery_capacity, FLEXnetDCConfigurationModel.charged_volts, FLEXnetDCConfigurationModel.charged_time, FLEXnetDCConfigurationModel.battery_charged_amps, FLEXnetDCConfigurationModel.charge_factor, FLEXnetDCConfigurationModel.shunt_a_enabled, FLEXnetDCConfigurationModel.shunt_b_enabled, FLEXnetDCConfigurationModel.shunt_c_enabled, FLEXnetDCConfigurationModel.relay_control, FLEXnetDCConfigurationModel.relay_invert_logic, FLEXnetDCConfigurationModel.relay_high_voltage, FLEXnetDCConfigurationModel.relay_low_voltage, FLEXnetDCConfigurationModel.relay_soc_high, FLEXnetDCConfigurationModel.relay_soc_low, FLEXnetDCConfigurationModel.relay_high_enable_delay, FLEXnetDCConfigurationModel.relay_low_enable_delay, FLEXnetDCConfigurationModel.set_data_log_day_offset, FLEXnetDCConfigurationModel.get_current_data_log_day_offset, FLEXnetDCConfigurationModel.datalog_minimum_soc, FLEXnetDCConfigurationModel.datalog_input_ah, FLEXnetDCConfigurationModel.datalog_input_kwh, FLEXnetDCConfigurationModel.datalog_output_ah, FLEXnetDCConfigurationModel.datalog_output_kwh, FLEXnetDCConfigurationModel.datalog_net_ah, FLEXnetDCConfigurationModel.datalog_net_kwh, FLEXnetDCConfigurationModel.clear_data_log_read, FLEXnetDCConfigurationModel.clear_data_log_write_complement, FLEXnetDCConfigurationModel.serial_number, FLEXnetDCConfigurationModel.model_number] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack FLEXnet-DC Battery Monitor Configuration Block") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.port_number: Uint16Field = Uint16Field("port_number", 3, 1, Mode.R, description="Port number on OutBack network") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 4, 1, Mode.R, description="DC Voltage Scale Factor") + self.dc_current_scale_factor: Int16Field = Int16Field("dc_current_scale_factor", 5, 1, Mode.R, description="DC Current Scale Factor") + self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 6, 1, Mode.R, description="Kilo Watt Hours Scale Factor") + self.major_firmware_number: Uint16Field = Uint16Field("major_firmware_number", 7, 1, Mode.R, description="FLEXnet-DC Major firmware revision") + self.mid_firmware_number: Uint16Field = Uint16Field("mid_firmware_number", 8, 1, Mode.R, description="FLEXnet-DC Mid firmware revision") + self.minor_firmware_number: Uint16Field = Uint16Field("minor_firmware_number", 9, 1, Mode.R, description="FLEXnet-DC Minor firmware revision") + self.battery_capacity: Uint16Field = Uint16Field("battery_capacity", 10, 1, Mode.RW, units="AH", description="Battery AH capacity") + self.charged_time: Uint16Field = Uint16Field("charged_time", 12, 1, Mode.RW, units="Minutes", description="Battery Charged Time Minutes") + self.charge_factor: Uint16Field = Uint16Field("charge_factor", 14, 1, Mode.RW, units="Percent", description="Battery Charge Factor") + self.shunt_a_enabled: EnumUint16Field = EnumUint16Field("shunt_a_enabled", 15, 1, Mode.RW, options=Enum("shunt_a_enabled", [('Disabled', 1), ('Enabled', 0)]), description="0=Enabled, 1=Disabled") + self.shunt_b_enabled: EnumUint16Field = EnumUint16Field("shunt_b_enabled", 16, 1, Mode.RW, options=Enum("shunt_b_enabled", [('Disabled', 1), ('Enabled', 0)]), description="0=Enabled, 1=Disabled") + self.shunt_c_enabled: EnumUint16Field = EnumUint16Field("shunt_c_enabled", 17, 1, Mode.RW, options=Enum("shunt_c_enabled", [('Disabled', 1), ('Enabled', 0)]), description="0=Enabled, 1=Disabled") + self.relay_control: EnumUint16Field = EnumUint16Field("relay_control", 18, 1, Mode.RW, options=Enum("relay_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") + self.relay_invert_logic: EnumUint16Field = EnumUint16Field("relay_invert_logic", 19, 1, Mode.RW, options=Enum("relay_invert_logic", [('Invert Logic', 0), ('Normal', 1)]), description="0=Invert Logic,1=Normal") + self.relay_soc_high: Uint16Field = Uint16Field("relay_soc_high", 22, 1, Mode.RW, units="Percent", description="Relay high SOC enable") + self.relay_soc_low: Uint16Field = Uint16Field("relay_soc_low", 23, 1, Mode.RW, units="Percent", description="Relay low SOC enable") + self.relay_high_enable_delay: Uint16Field = Uint16Field("relay_high_enable_delay", 24, 1, Mode.RW, units="Minutes", description="Relay High Enable Delay") + self.relay_low_enable_delay: Uint16Field = Uint16Field("relay_low_enable_delay", 25, 1, Mode.RW, units="Minutes", description="Relay Low Enable Delay") + self.set_data_log_day_offset: Uint16Field = Uint16Field("set_data_log_day_offset", 26, 1, Mode.RW, units="Days", description="Day offset 0-400, 0 =Today, 1 = -1 day \u2026") + self.get_current_data_log_day_offset: Uint16Field = Uint16Field("get_current_data_log_day_offset", 27, 1, Mode.R, units="Days", description="Current Data Log Day Offset") + self.datalog_minimum_soc: Uint16Field = Uint16Field("datalog_minimum_soc", 28, 1, Mode.R, units="Percent", description="Datalog minimum SOC") + self.datalog_input_ah: Uint16Field = Uint16Field("datalog_input_ah", 29, 1, Mode.R, units="AH", description="Datalog input AH") + self.datalog_output_ah: Uint16Field = Uint16Field("datalog_output_ah", 31, 1, Mode.R, units="AH", description="Datalog output AH") + self.datalog_net_ah: Uint16Field = Uint16Field("datalog_net_ah", 33, 1, Mode.R, units="AH", description="Datalog NET AH") + self.clear_data_log_read: Uint16Field = Uint16Field("clear_data_log_read", 35, 1, Mode.R, description="Read value needed to clear data log") + self.clear_data_log_write_complement: Uint16Field = Uint16Field("clear_data_log_write_complement", 36, 1, Mode.W, description="Write value's complement to clear data log") + self.serial_number: StringField = StringField("serial_number", 37, 9, Mode.R, description="Device serial number") + self.model_number: StringField = StringField("model_number", 46, 9, Mode.R, description="Device model") + self.charged_volts: FloatUint16Field = FloatUint16Field("charged_volts", 11, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Battery Charged Voltage") + self.battery_charged_amps: FloatUint16Field = FloatUint16Field("battery_charged_amps", 13, 1, Mode.RW, units="Amps", scale_factor=self.dc_current_scale_factor, description="Battery Charged Return Amps") + self.relay_high_voltage: FloatUint16Field = FloatUint16Field("relay_high_voltage", 20, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Relay high voltage enable") + self.relay_low_voltage: FloatUint16Field = FloatUint16Field("relay_low_voltage", 21, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Relay low voltage enable") + self.datalog_input_kwh: FloatUint16Field = FloatUint16Field("datalog_input_kwh", 30, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Datalog input kWh") + self.datalog_output_kwh: FloatUint16Field = FloatUint16Field("datalog_output_kwh", 32, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Datalog output kWh") + self.datalog_net_kwh: FloatUint16Field = FloatUint16Field("datalog_net_kwh", 34, 1, Mode.R, units="kWh", scale_factor=self.kwh_scale_factor, description="Datalog NET kWh") class OutBackSystemControlModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack System Control Block") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of block in 16-bit registers", units="Registers") - dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 3, 1, Mode.R, description="DC Voltage Scale Factor") - ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 4, 1, Mode.R, description="AC Current Scale Factor") - time_scale_factor: Int16Field = Int16Field("time_scale_factor", 5, 1, Mode.R, description="Charge Time Scale Factor") - bulk_charge_enable_disable: EnumUint16Field = EnumUint16Field("bulk_charge_enable_disable", 6, 1, Mode.W, description="1=Start Bulk, 2=Stop Bulk, 3=Start EQ Charge, 4= Stop EQ Charge", options=Enum("bulk_charge_enable_disable", [('Start Bulk', 1), ('Start EQ Charge', 3), ('Stop Bulk', 2), ('Stop EQ Charge', 4)])) - inverter_ac_drop_use: EnumUint16Field = EnumUint16Field("inverter_ac_drop_use", 7, 1, Mode.W, description="1=Use, 2=Drop", options=Enum("inverter_ac_drop_use", [('Drop', 2), ('Use', 1)])) - set_inverter_mode: EnumUint16Field = EnumUint16Field("set_inverter_mode", 8, 1, Mode.W, description="1=Off, 2=Search, 3=On", options=Enum("set_inverter_mode", [('Off', 1), ('On', 3), ('Search', 2)])) - grid_tie_mode: EnumUint16Field = EnumUint16Field("grid_tie_mode", 9, 1, Mode.W, description="1=Enable, 2=Disable", options=Enum("grid_tie_mode", [('Disable', 2), ('Enable', 1)])) - set_inverter_charger_mode: EnumUint16Field = EnumUint16Field("set_inverter_charger_mode", 10, 1, Mode.W, description="1=Off, 2=Auto, 3=On", options=Enum("set_inverter_charger_mode", [('Auto', 2), ('Off', 1), ('On', 3)])) - control_status: Bit16Field = Bit16Field("control_status", 11, 1, Mode.R, description="Bit field for status. See OB_Control_Status Table", flags=OBControlStatusFlags) - set_sell_voltage: Uint16Field = Uint16Field("set_sell_voltage", 12, 1, Mode.RW, description="Global Sell Voltage", units="Volts") - set_radian_inverter_sell_current_limit: Uint16Field = Uint16Field("set_radian_inverter_sell_current_limit", 13, 1, Mode.RW, description="Radian Inverter Sell Current Limit", units="Amps") - set_absorb_voltage: Uint16Field = Uint16Field("set_absorb_voltage", 14, 1, Mode.RW, description="Global Absorb Voltage", units="Volts") - set_absorb_time: Uint16Field = Uint16Field("set_absorb_time", 15, 1, Mode.RW, description="Time in tenths of hour", units="Hours") - set_float_voltage: Uint16Field = Uint16Field("set_float_voltage", 16, 1, Mode.RW, description="Global Float Voltage", units="Volts") - set_float_time: Uint16Field = Uint16Field("set_float_time", 17, 1, Mode.RW, description="Time in tenths of hour", units="Hours") - set_inverter_charger_current_limit: Uint16Field = Uint16Field("set_inverter_charger_current_limit", 18, 1, Mode.RW, description="Inverter Charger Current Limit", units="Amps") - set_inverter_ac1_current_limit: Uint16Field = Uint16Field("set_inverter_ac1_current_limit", 19, 1, Mode.RW, description="Inverter AC1 input Current Limit", units="Amps") - set_inverter_ac2_current_limit: Uint16Field = Uint16Field("set_inverter_ac2_current_limit", 20, 1, Mode.RW, description="Inverter AC2 input Current Limit", units="Amps") - set_ags_op_mode: EnumUint16Field = EnumUint16Field("set_ags_op_mode", 21, 1, Mode.RW, description="AGS Operating Mode: 0=Off, 1=On, 2=Auto", options=Enum("set_ags_op_mode", [('Auto', 2), ('Off', 0), ('On', 1)])) - ags_operational_state: EnumUint16Field = EnumUint16Field("ags_operational_state", 22, 1, Mode.R, description="GEN_STOP=0, GEN_STARTING=1, GEN_RUNNING=2, GEN_WARMUP=3, GEN_COOLDOWN=4, GEN_AWAITING_AC=5", options=Enum("ags_operational_state", [(' GEN_AWAITING_AC', 5), (' GEN_COOLDOWN', 4), (' GEN_RUNNING', 2), (' GEN_STARTING', 1), (' GEN_WARMUP', 3), ('GEN_STOP', 0)])) - ags_operational_state_timer: Uint16Field = Uint16Field("ags_operational_state_timer", 23, 1, Mode.R, description="Number of seconds that OB_AGS_Operational_State has been in current state. If Operational State is 0 then timer=0", units="Seconds") - gen_last_run_start_time_gmt: Uint32Field = Uint32Field("gen_last_run_start_time_gmt", 24, 2, Mode.R, description="Generator last start time in GMT seconds", units="Seconds") - gen_last_start_run_duration: Uint32Field = Uint32Field("gen_last_start_run_duration", 26, 2, Mode.R, description="Last Generator Start Run Duration Seconds", units="Seconds") - - -OutBackSystemControlModel.set_sell_voltage.scale_factor = OutBackSystemControlModel.dc_voltage_scale_factor -OutBackSystemControlModel.set_radian_inverter_sell_current_limit.scale_factor = OutBackSystemControlModel.ac_current_scale_factor -OutBackSystemControlModel.set_absorb_voltage.scale_factor = OutBackSystemControlModel.dc_voltage_scale_factor -OutBackSystemControlModel.set_absorb_time.scale_factor = OutBackSystemControlModel.time_scale_factor -OutBackSystemControlModel.set_float_voltage.scale_factor = OutBackSystemControlModel.dc_voltage_scale_factor -OutBackSystemControlModel.set_float_time.scale_factor = OutBackSystemControlModel.time_scale_factor -OutBackSystemControlModel.set_inverter_charger_current_limit.scale_factor = OutBackSystemControlModel.ac_current_scale_factor -OutBackSystemControlModel.set_inverter_ac1_current_limit.scale_factor = OutBackSystemControlModel.ac_current_scale_factor -OutBackSystemControlModel.set_inverter_ac2_current_limit.scale_factor = OutBackSystemControlModel.ac_current_scale_factor -OutBackSystemControlModel.__model_fields__ = [OutBackSystemControlModel.did, OutBackSystemControlModel.length, OutBackSystemControlModel.dc_voltage_scale_factor, OutBackSystemControlModel.ac_current_scale_factor, OutBackSystemControlModel.time_scale_factor, OutBackSystemControlModel.bulk_charge_enable_disable, OutBackSystemControlModel.inverter_ac_drop_use, OutBackSystemControlModel.set_inverter_mode, OutBackSystemControlModel.grid_tie_mode, OutBackSystemControlModel.set_inverter_charger_mode, OutBackSystemControlModel.control_status, OutBackSystemControlModel.set_sell_voltage, OutBackSystemControlModel.set_radian_inverter_sell_current_limit, OutBackSystemControlModel.set_absorb_voltage, OutBackSystemControlModel.set_absorb_time, OutBackSystemControlModel.set_float_voltage, OutBackSystemControlModel.set_float_time, OutBackSystemControlModel.set_inverter_charger_current_limit, OutBackSystemControlModel.set_inverter_ac1_current_limit, OutBackSystemControlModel.set_inverter_ac2_current_limit, OutBackSystemControlModel.set_ags_op_mode, OutBackSystemControlModel.ags_operational_state, OutBackSystemControlModel.ags_operational_state_timer, OutBackSystemControlModel.gen_last_run_start_time_gmt, OutBackSystemControlModel.gen_last_start_run_duration] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Vendor Extension for OutBack System Control Block") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of block in 16-bit registers") + self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 3, 1, Mode.R, description="DC Voltage Scale Factor") + self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 4, 1, Mode.R, description="AC Current Scale Factor") + self.time_scale_factor: Int16Field = Int16Field("time_scale_factor", 5, 1, Mode.R, description="Charge Time Scale Factor") + self.bulk_charge_enable_disable: EnumUint16Field = EnumUint16Field("bulk_charge_enable_disable", 6, 1, Mode.W, options=Enum("bulk_charge_enable_disable", [('Start Bulk', 1), ('Start EQ Charge', 3), ('Stop Bulk', 2), ('Stop EQ Charge', 4)]), description="1=Start Bulk, 2=Stop Bulk, 3=Start EQ Charge, 4= Stop EQ Charge") + self.inverter_ac_drop_use: EnumUint16Field = EnumUint16Field("inverter_ac_drop_use", 7, 1, Mode.W, options=Enum("inverter_ac_drop_use", [('Drop', 2), ('Use', 1)]), description="1=Use, 2=Drop") + self.set_inverter_mode: EnumUint16Field = EnumUint16Field("set_inverter_mode", 8, 1, Mode.W, options=Enum("set_inverter_mode", [('Off', 1), ('On', 3), ('Search', 2)]), description="1=Off, 2=Search, 3=On") + self.grid_tie_mode: EnumUint16Field = EnumUint16Field("grid_tie_mode", 9, 1, Mode.W, options=Enum("grid_tie_mode", [('Disable', 2), ('Enable', 1)]), description="1=Enable, 2=Disable") + self.set_inverter_charger_mode: EnumUint16Field = EnumUint16Field("set_inverter_charger_mode", 10, 1, Mode.W, options=Enum("set_inverter_charger_mode", [('Auto', 2), ('Off', 1), ('On', 3)]), description="1=Off, 2=Auto, 3=On") + self.control_status: Bit16Field = Bit16Field("control_status", 11, 1, Mode.R, flags=OBControlStatusFlags, description="Bit field for status. See OB_Control_Status Table") + self.set_ags_op_mode: EnumUint16Field = EnumUint16Field("set_ags_op_mode", 21, 1, Mode.RW, options=Enum("set_ags_op_mode", [('Auto', 2), ('Off', 0), ('On', 1)]), description="AGS Operating Mode: 0=Off, 1=On, 2=Auto") + self.ags_operational_state: EnumUint16Field = EnumUint16Field("ags_operational_state", 22, 1, Mode.R, options=Enum("ags_operational_state", [(' GEN_AWAITING_AC', 5), (' GEN_COOLDOWN', 4), (' GEN_RUNNING', 2), (' GEN_STARTING', 1), (' GEN_WARMUP', 3), ('GEN_STOP', 0)]), description="GEN_STOP=0, GEN_STARTING=1, GEN_RUNNING=2, GEN_WARMUP=3, GEN_COOLDOWN=4, GEN_AWAITING_AC=5") + self.ags_operational_state_timer: Uint16Field = Uint16Field("ags_operational_state_timer", 23, 1, Mode.R, units="Seconds", description="Number of seconds that OB_AGS_Operational_State has been in current state. If Operational State is 0 then timer=0") + self.gen_last_run_start_time_gmt: Uint32Field = Uint32Field("gen_last_run_start_time_gmt", 24, 2, Mode.R, units="Seconds", description="Generator last start time in GMT seconds") + self.gen_last_start_run_duration: Uint32Field = Uint32Field("gen_last_start_run_duration", 26, 2, Mode.R, units="Seconds", description="Last Generator Start Run Duration Seconds") + self.set_sell_voltage: FloatUint16Field = FloatUint16Field("set_sell_voltage", 12, 1, Mode.RW, units="Volts", scale_factor=self.dc_voltage_scale_factor, description="Global Sell Voltage") + self.set_radian_inverter_sell_current_limit: FloatUint16Field = FloatUint16Field("set_radian_inverter_sell_current_limit", 13, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Radian Inverter Sell Current Limit") + self.set_absorb_voltage: FloatUint16Field = FloatUint16Field("set_absorb_voltage", 14, 1, Mode.RW, units="Volts", scale_factor=self.dc_voltage_scale_factor, description="Global Absorb Voltage") + self.set_absorb_time: FloatUint16Field = FloatUint16Field("set_absorb_time", 15, 1, Mode.RW, units="Hours", scale_factor=self.time_scale_factor, description="Time in tenths of hour") + self.set_float_voltage: FloatUint16Field = FloatUint16Field("set_float_voltage", 16, 1, Mode.RW, units="Volts", scale_factor=self.dc_voltage_scale_factor, description="Global Float Voltage") + self.set_float_time: FloatUint16Field = FloatUint16Field("set_float_time", 17, 1, Mode.RW, units="Hours", scale_factor=self.time_scale_factor, description="Time in tenths of hour") + self.set_inverter_charger_current_limit: FloatUint16Field = FloatUint16Field("set_inverter_charger_current_limit", 18, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter Charger Current Limit") + self.set_inverter_ac1_current_limit: FloatUint16Field = FloatUint16Field("set_inverter_ac1_current_limit", 19, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter AC1 input Current Limit") + self.set_inverter_ac2_current_limit: FloatUint16Field = FloatUint16Field("set_inverter_ac2_current_limit", 20, 1, Mode.RW, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter AC2 input Current Limit") class OPTICSPacketStatisticsModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="OPTICS Packet Stats DID") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Length of OPTICS Packet Status Block", units="Registers") - bt_min: Uint16Field = Uint16Field("bt_min", 3, 1, Mode.R, description="Boot packet minimum time", units="msecs") - bt_max: Uint16Field = Uint16Field("bt_max", 4, 1, Mode.R, description="Boot packet maximum time", units="msecs") - bt_ave: Uint16Field = Uint16Field("bt_ave", 5, 1, Mode.R, description="Boot packet average time", units="msecs") - bt_attempts: Uint16Field = Uint16Field("bt_attempts", 6, 1, Mode.R, description="Boot packet number of attempts") - bt_errors: Uint16Field = Uint16Field("bt_errors", 7, 1, Mode.R, description="Boot packet error returned from server count") - bt_timeouts: Uint16Field = Uint16Field("bt_timeouts", 8, 1, Mode.R, description="Boot packet timeout from server count") - bt_packet_timeout: Uint16Field = Uint16Field("bt_packet_timeout", 9, 1, Mode.R, description="Boot packet current gateway timeout", units="secs") - mp_min: Uint16Field = Uint16Field("mp_min", 10, 1, Mode.R, description="Map packet minimum time", units="msecs") - mp_max: Uint16Field = Uint16Field("mp_max", 11, 1, Mode.R, description="Map packet maximum time", units="msecs") - mp_ave: Uint16Field = Uint16Field("mp_ave", 12, 1, Mode.R, description="Map packet average time", units="msecs") - mp_attempts: Uint16Field = Uint16Field("mp_attempts", 13, 1, Mode.R, description="Map packet number of attempts") - mp_errors: Uint16Field = Uint16Field("mp_errors", 14, 1, Mode.R, description="Map packet error returned from server count") - mp_timeouts: Uint16Field = Uint16Field("mp_timeouts", 15, 1, Mode.R, description="Map packet timeout from server count") - mp_packet_timeout: Uint16Field = Uint16Field("mp_packet_timeout", 16, 1, Mode.R, description="Map packet current gateway timeout", units="secs") - cu_min: Uint16Field = Uint16Field("cu_min", 17, 1, Mode.R, description="Config packet minimum time", units="msecs") - cu_max: Uint16Field = Uint16Field("cu_max", 18, 1, Mode.R, description="Config packet maximum time", units="msecs") - cu_ave: Uint16Field = Uint16Field("cu_ave", 19, 1, Mode.R, description="Config packet average time", units="msecs") - cu_attempts: Uint16Field = Uint16Field("cu_attempts", 20, 1, Mode.R, description="Config packet number of attempts") - cu_errors: Uint16Field = Uint16Field("cu_errors", 21, 1, Mode.R, description="Config packet error returned from server count") - cu_timeouts: Uint16Field = Uint16Field("cu_timeouts", 22, 1, Mode.R, description="Config packet timeout from server count") - cu_packet_timeout: Uint16Field = Uint16Field("cu_packet_timeout", 23, 1, Mode.R, description="Config packet current gateway timeout", units="secs") - su_min: Uint16Field = Uint16Field("su_min", 24, 1, Mode.R, description="Status packet minimum time", units="msecs") - su_max: Uint16Field = Uint16Field("su_max", 25, 1, Mode.R, description="Status packet maximum time", units="msecs") - su_ave: Uint16Field = Uint16Field("su_ave", 26, 1, Mode.R, description="Status packet average time", units="msecs") - su_attempts: Uint16Field = Uint16Field("su_attempts", 27, 1, Mode.R, description="Status packet number of attempts") - su_errors: Uint16Field = Uint16Field("su_errors", 28, 1, Mode.R, description="Status packet error returned from server count") - su_timeouts: Uint16Field = Uint16Field("su_timeouts", 29, 1, Mode.R, description="Status packet timeout from server count") - su_packet_timeout: Uint16Field = Uint16Field("su_packet_timeout", 30, 1, Mode.R, description="Status packet current gateway timeout", units="secs") - pg_min: Uint16Field = Uint16Field("pg_min", 31, 1, Mode.R, description="Ping packet minimum time", units="msecs") - pg_max: Uint16Field = Uint16Field("pg_max", 32, 1, Mode.R, description="Ping packet maximum time", units="msecs") - pg_ave: Uint16Field = Uint16Field("pg_ave", 33, 1, Mode.R, description="Ping packet average time", units="msecs") - pg_attempts: Uint16Field = Uint16Field("pg_attempts", 34, 1, Mode.R, description="Ping packet number of attempts") - pg_errors: Uint16Field = Uint16Field("pg_errors", 35, 1, Mode.R, description="Ping packet error returned from server count") - pg_timeouts: Uint16Field = Uint16Field("pg_timeouts", 36, 1, Mode.R, description="Ping packet timeout from server count") - pg_packet_timeout: Uint16Field = Uint16Field("pg_packet_timeout", 37, 1, Mode.R, description="Ping packet current gateway timeout", units="secs") - mb_min: Uint16Field = Uint16Field("mb_min", 38, 1, Mode.R, description="Modbus packet minimum time", units="msecs") - mb_max: Uint16Field = Uint16Field("mb_max", 39, 1, Mode.R, description="Modbus packet maximum time", units="msecs") - mb_ave: Uint16Field = Uint16Field("mb_ave", 40, 1, Mode.R, description="Modbus packet average time", units="msecs") - mb_attempts: Uint16Field = Uint16Field("mb_attempts", 41, 1, Mode.R, description="Modbus packet number of attempts") - mb_errors: Uint16Field = Uint16Field("mb_errors", 42, 1, Mode.R, description="Modbus packet error returned from server count") - mb_timeouts: Uint16Field = Uint16Field("mb_timeouts", 43, 1, Mode.R, description="Modbus packet timeout from server count") - mb_packet_timeout: Uint16Field = Uint16Field("mb_packet_timeout", 44, 1, Mode.R, description="Modbus packet current gateway timeout", units="secs") - fu_min: Uint16Field = Uint16Field("fu_min", 45, 1, Mode.R, description="File IO packet minimum time", units="msecs") - fu_max: Uint16Field = Uint16Field("fu_max", 46, 1, Mode.R, description="File IO packet maximum time", units="msecs") - fu_ave: Uint16Field = Uint16Field("fu_ave", 47, 1, Mode.R, description="File IO packet average time", units="msecs") - fu_attempts: Uint16Field = Uint16Field("fu_attempts", 48, 1, Mode.R, description="File IO packet number of attempts") - fu_errors: Uint16Field = Uint16Field("fu_errors", 49, 1, Mode.R, description="File IO packet error returned from server count") - fu_timeouts: Uint16Field = Uint16Field("fu_timeouts", 50, 1, Mode.R, description="File IO packet timeout from server count") - fu_packet_timeout: Uint16Field = Uint16Field("fu_packet_timeout", 51, 1, Mode.R, description="File IO packet current gateway timeout", units="secs") - ev_min: Uint16Field = Uint16Field("ev_min", 52, 1, Mode.R, description="Event packet minimum time", units="msecs") - ev_max: Uint16Field = Uint16Field("ev_max", 53, 1, Mode.R, description="Event packet maximum time", units="msecs") - ev_ave: Uint16Field = Uint16Field("ev_ave", 54, 1, Mode.R, description="Event packet average time", units="msecs") - ev_attempts: Uint16Field = Uint16Field("ev_attempts", 55, 1, Mode.R, description="Event packet number of attempts") - ev_errors: Uint16Field = Uint16Field("ev_errors", 56, 1, Mode.R, description="Event packet error returned from server count") - ev_timeouts: Uint16Field = Uint16Field("ev_timeouts", 57, 1, Mode.R, description="Event packet timeout from server count") - ev_packet_timeout: Uint16Field = Uint16Field("ev_packet_timeout", 58, 1, Mode.R, description="Event packet current gateway timeout", units="secs") - - -OPTICSPacketStatisticsModel.__model_fields__ = [OPTICSPacketStatisticsModel.did, OPTICSPacketStatisticsModel.length, OPTICSPacketStatisticsModel.bt_min, OPTICSPacketStatisticsModel.bt_max, OPTICSPacketStatisticsModel.bt_ave, OPTICSPacketStatisticsModel.bt_attempts, OPTICSPacketStatisticsModel.bt_errors, OPTICSPacketStatisticsModel.bt_timeouts, OPTICSPacketStatisticsModel.bt_packet_timeout, OPTICSPacketStatisticsModel.mp_min, OPTICSPacketStatisticsModel.mp_max, OPTICSPacketStatisticsModel.mp_ave, OPTICSPacketStatisticsModel.mp_attempts, OPTICSPacketStatisticsModel.mp_errors, OPTICSPacketStatisticsModel.mp_timeouts, OPTICSPacketStatisticsModel.mp_packet_timeout, OPTICSPacketStatisticsModel.cu_min, OPTICSPacketStatisticsModel.cu_max, OPTICSPacketStatisticsModel.cu_ave, OPTICSPacketStatisticsModel.cu_attempts, OPTICSPacketStatisticsModel.cu_errors, OPTICSPacketStatisticsModel.cu_timeouts, OPTICSPacketStatisticsModel.cu_packet_timeout, OPTICSPacketStatisticsModel.su_min, OPTICSPacketStatisticsModel.su_max, OPTICSPacketStatisticsModel.su_ave, OPTICSPacketStatisticsModel.su_attempts, OPTICSPacketStatisticsModel.su_errors, OPTICSPacketStatisticsModel.su_timeouts, OPTICSPacketStatisticsModel.su_packet_timeout, OPTICSPacketStatisticsModel.pg_min, OPTICSPacketStatisticsModel.pg_max, OPTICSPacketStatisticsModel.pg_ave, OPTICSPacketStatisticsModel.pg_attempts, OPTICSPacketStatisticsModel.pg_errors, OPTICSPacketStatisticsModel.pg_timeouts, OPTICSPacketStatisticsModel.pg_packet_timeout, OPTICSPacketStatisticsModel.mb_min, OPTICSPacketStatisticsModel.mb_max, OPTICSPacketStatisticsModel.mb_ave, OPTICSPacketStatisticsModel.mb_attempts, OPTICSPacketStatisticsModel.mb_errors, OPTICSPacketStatisticsModel.mb_timeouts, OPTICSPacketStatisticsModel.mb_packet_timeout, OPTICSPacketStatisticsModel.fu_min, OPTICSPacketStatisticsModel.fu_max, OPTICSPacketStatisticsModel.fu_ave, OPTICSPacketStatisticsModel.fu_attempts, OPTICSPacketStatisticsModel.fu_errors, OPTICSPacketStatisticsModel.fu_timeouts, OPTICSPacketStatisticsModel.fu_packet_timeout, OPTICSPacketStatisticsModel.ev_min, OPTICSPacketStatisticsModel.ev_max, OPTICSPacketStatisticsModel.ev_ave, OPTICSPacketStatisticsModel.ev_attempts, OPTICSPacketStatisticsModel.ev_errors, OPTICSPacketStatisticsModel.ev_timeouts, OPTICSPacketStatisticsModel.ev_packet_timeout] + + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="OPTICS Packet Stats DID") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, units="Registers", description="Length of OPTICS Packet Status Block") + self.bt_min: Uint16Field = Uint16Field("bt_min", 3, 1, Mode.R, units="msecs", description="Boot packet minimum time") + self.bt_max: Uint16Field = Uint16Field("bt_max", 4, 1, Mode.R, units="msecs", description="Boot packet maximum time") + self.bt_ave: Uint16Field = Uint16Field("bt_ave", 5, 1, Mode.R, units="msecs", description="Boot packet average time") + self.bt_attempts: Uint16Field = Uint16Field("bt_attempts", 6, 1, Mode.R, description="Boot packet number of attempts") + self.bt_errors: Uint16Field = Uint16Field("bt_errors", 7, 1, Mode.R, description="Boot packet error returned from server count") + self.bt_timeouts: Uint16Field = Uint16Field("bt_timeouts", 8, 1, Mode.R, description="Boot packet timeout from server count") + self.bt_packet_timeout: Uint16Field = Uint16Field("bt_packet_timeout", 9, 1, Mode.R, units="secs", description="Boot packet current gateway timeout") + self.mp_min: Uint16Field = Uint16Field("mp_min", 10, 1, Mode.R, units="msecs", description="Map packet minimum time") + self.mp_max: Uint16Field = Uint16Field("mp_max", 11, 1, Mode.R, units="msecs", description="Map packet maximum time") + self.mp_ave: Uint16Field = Uint16Field("mp_ave", 12, 1, Mode.R, units="msecs", description="Map packet average time") + self.mp_attempts: Uint16Field = Uint16Field("mp_attempts", 13, 1, Mode.R, description="Map packet number of attempts") + self.mp_errors: Uint16Field = Uint16Field("mp_errors", 14, 1, Mode.R, description="Map packet error returned from server count") + self.mp_timeouts: Uint16Field = Uint16Field("mp_timeouts", 15, 1, Mode.R, description="Map packet timeout from server count") + self.mp_packet_timeout: Uint16Field = Uint16Field("mp_packet_timeout", 16, 1, Mode.R, units="secs", description="Map packet current gateway timeout") + self.cu_min: Uint16Field = Uint16Field("cu_min", 17, 1, Mode.R, units="msecs", description="Config packet minimum time") + self.cu_max: Uint16Field = Uint16Field("cu_max", 18, 1, Mode.R, units="msecs", description="Config packet maximum time") + self.cu_ave: Uint16Field = Uint16Field("cu_ave", 19, 1, Mode.R, units="msecs", description="Config packet average time") + self.cu_attempts: Uint16Field = Uint16Field("cu_attempts", 20, 1, Mode.R, description="Config packet number of attempts") + self.cu_errors: Uint16Field = Uint16Field("cu_errors", 21, 1, Mode.R, description="Config packet error returned from server count") + self.cu_timeouts: Uint16Field = Uint16Field("cu_timeouts", 22, 1, Mode.R, description="Config packet timeout from server count") + self.cu_packet_timeout: Uint16Field = Uint16Field("cu_packet_timeout", 23, 1, Mode.R, units="secs", description="Config packet current gateway timeout") + self.su_min: Uint16Field = Uint16Field("su_min", 24, 1, Mode.R, units="msecs", description="Status packet minimum time") + self.su_max: Uint16Field = Uint16Field("su_max", 25, 1, Mode.R, units="msecs", description="Status packet maximum time") + self.su_ave: Uint16Field = Uint16Field("su_ave", 26, 1, Mode.R, units="msecs", description="Status packet average time") + self.su_attempts: Uint16Field = Uint16Field("su_attempts", 27, 1, Mode.R, description="Status packet number of attempts") + self.su_errors: Uint16Field = Uint16Field("su_errors", 28, 1, Mode.R, description="Status packet error returned from server count") + self.su_timeouts: Uint16Field = Uint16Field("su_timeouts", 29, 1, Mode.R, description="Status packet timeout from server count") + self.su_packet_timeout: Uint16Field = Uint16Field("su_packet_timeout", 30, 1, Mode.R, units="secs", description="Status packet current gateway timeout") + self.pg_min: Uint16Field = Uint16Field("pg_min", 31, 1, Mode.R, units="msecs", description="Ping packet minimum time") + self.pg_max: Uint16Field = Uint16Field("pg_max", 32, 1, Mode.R, units="msecs", description="Ping packet maximum time") + self.pg_ave: Uint16Field = Uint16Field("pg_ave", 33, 1, Mode.R, units="msecs", description="Ping packet average time") + self.pg_attempts: Uint16Field = Uint16Field("pg_attempts", 34, 1, Mode.R, description="Ping packet number of attempts") + self.pg_errors: Uint16Field = Uint16Field("pg_errors", 35, 1, Mode.R, description="Ping packet error returned from server count") + self.pg_timeouts: Uint16Field = Uint16Field("pg_timeouts", 36, 1, Mode.R, description="Ping packet timeout from server count") + self.pg_packet_timeout: Uint16Field = Uint16Field("pg_packet_timeout", 37, 1, Mode.R, units="secs", description="Ping packet current gateway timeout") + self.mb_min: Uint16Field = Uint16Field("mb_min", 38, 1, Mode.R, units="msecs", description="Modbus packet minimum time") + self.mb_max: Uint16Field = Uint16Field("mb_max", 39, 1, Mode.R, units="msecs", description="Modbus packet maximum time") + self.mb_ave: Uint16Field = Uint16Field("mb_ave", 40, 1, Mode.R, units="msecs", description="Modbus packet average time") + self.mb_attempts: Uint16Field = Uint16Field("mb_attempts", 41, 1, Mode.R, description="Modbus packet number of attempts") + self.mb_errors: Uint16Field = Uint16Field("mb_errors", 42, 1, Mode.R, description="Modbus packet error returned from server count") + self.mb_timeouts: Uint16Field = Uint16Field("mb_timeouts", 43, 1, Mode.R, description="Modbus packet timeout from server count") + self.mb_packet_timeout: Uint16Field = Uint16Field("mb_packet_timeout", 44, 1, Mode.R, units="secs", description="Modbus packet current gateway timeout") + self.fu_min: Uint16Field = Uint16Field("fu_min", 45, 1, Mode.R, units="msecs", description="File IO packet minimum time") + self.fu_max: Uint16Field = Uint16Field("fu_max", 46, 1, Mode.R, units="msecs", description="File IO packet maximum time") + self.fu_ave: Uint16Field = Uint16Field("fu_ave", 47, 1, Mode.R, units="msecs", description="File IO packet average time") + self.fu_attempts: Uint16Field = Uint16Field("fu_attempts", 48, 1, Mode.R, description="File IO packet number of attempts") + self.fu_errors: Uint16Field = Uint16Field("fu_errors", 49, 1, Mode.R, description="File IO packet error returned from server count") + self.fu_timeouts: Uint16Field = Uint16Field("fu_timeouts", 50, 1, Mode.R, description="File IO packet timeout from server count") + self.fu_packet_timeout: Uint16Field = Uint16Field("fu_packet_timeout", 51, 1, Mode.R, units="secs", description="File IO packet current gateway timeout") + self.ev_min: Uint16Field = Uint16Field("ev_min", 52, 1, Mode.R, units="msecs", description="Event packet minimum time") + self.ev_max: Uint16Field = Uint16Field("ev_max", 53, 1, Mode.R, units="msecs", description="Event packet maximum time") + self.ev_ave: Uint16Field = Uint16Field("ev_ave", 54, 1, Mode.R, units="msecs", description="Event packet average time") + self.ev_attempts: Uint16Field = Uint16Field("ev_attempts", 55, 1, Mode.R, description="Event packet number of attempts") + self.ev_errors: Uint16Field = Uint16Field("ev_errors", 56, 1, Mode.R, description="Event packet error returned from server count") + self.ev_timeouts: Uint16Field = Uint16Field("ev_timeouts", 57, 1, Mode.R, description="Event packet timeout from server count") + self.ev_packet_timeout: Uint16Field = Uint16Field("ev_packet_timeout", 58, 1, Mode.R, units="secs", description="Event packet current gateway timeout") MODEL_DEVICE_IDS = { diff --git a/mate3/sunspec/scripts/code_generator.py b/mate3/sunspec/scripts/code_generator.py index bc7ad3e..91fd90a 100644 --- a/mate3/sunspec/scripts/code_generator.py +++ b/mate3/sunspec/scripts/code_generator.py @@ -152,77 +152,32 @@ def python_name(self): def generate_definition(self, bitfields): class_name = self.python_name - code = f"class {class_name}Model(Model):\n" - afters = [] - names = [] - for row in self.rows: - name, defn, after = self._generate_field(row=row, class_name=class_name, bitfields=bitfields) - if name: - names.append(name) - code += defn - afters += after - # add the names: - names = ", ".join([f"{class_name}Model.{name}" for name in names]) - afters.append(f"{class_name}Model.__model_fields__ = [{names}]") - if afters: - code += "\n\n" - for after in afters: - code += after - code += "\n" - return code + code = f"""class {class_name}Model(Model): + + def __init__(self): +""" - def generate_values(self): - class_name = self.python_name - code = f"@dataclass\nclass {class_name}Values(ModelValues):\n" - # code += f" __definition__ = models.{class_name}Model\n" + # Process rows: + processed = [] for row in self.rows: - name = row.python_name - if name in ("sun_spec_did", "sun_spec_length"): - name = name.replace("sun_spec_", "") - code += f" {name}: FieldValue\n" + processed.append(self._generate_field(row=row, class_name=class_name, bitfields=bitfields)) + + # Sort them so scale factors come at the end: + processed = sorted(processed, key=lambda x: x[2]) + for name, defn, scale_factor in processed: + code += defn return code - @lru_cache() - def _get_scale_factor_python_name(self, scale_factor): - rows = [r for r in self.rows if r.name == scale_factor] - if len(rows) != 1: - raise RuntimeError(f"Expected to find a single scale_factor '{scale_factor}' but found {len(rows)}") - return rows[0].python_name - - def _generate_base_field(self, row): - for field_name in Field.__dataclass_fields__: - # ignore the name: - if field_name == "name": - continue - value = getattr(row, field_name) - # ignore none description as that's the default: - if field_name == "description" and value is None: - continue - # Mode -> enum - if field_name == "mode": - value = Mode(row.mode.lower().replace("/", "")) - # strings: - if isinstance(value, str): - value = '"' + value + '"' - if field_name in ("start", "size", "mode"): - yield f"{value}" - else: - yield f"{field_name}={value}" - - def _generate_integer_field(self, row, python_name, class_name): - # Units: - if row.units: - yield False, f'units="{row.units}"' - # Find the scale factor: - scale_factor = row.scale_factor - if scale_factor: - scale_factor = self._get_scale_factor_python_name(scale_factor) - yield True, f"{class_name}Model.{python_name}.scale_factor = {class_name}Model.{scale_factor}\n" - # else: - # yield False, "" - - def _generate_bit_field(self, row, bitfields): - yield f"flags={bitfields[row.name]}" + # def generate_values(self): + # class_name = self.python_name + # code = f"@dataclass\nclass {class_name}Values(ModelValues):\n" + # # code += f" __definition__ = models.{class_name}Model\n" + # for row in self.rows: + # name = row.python_name + # if name in ("sun_spec_did", "sun_spec_length"): + # name = name.replace("sun_spec_", "") + # code += f" {name}: FieldValue\n" + # return code def _generate_enumerated_field(self, row): # ok, generate always seems to following the form 1=..., 2=..., etc. or ...=1, ...=2, So let's look for that @@ -287,8 +242,8 @@ def _generate_field(self, row, class_name, bitfields): if name in ("sun_spec_did", "sun_spec_length"): name = name.replace("sun_spec_", "") field_type = None - field_args = list(self._generate_base_field(row)) - afters = [] + field_args = [f'"{name}"', f"{row.start}", f"{row.size}", f"{Mode(row.mode.lower().replace('/', ''))}"] + has_scale_factor = False if row.type in ("uint16", "int16", "uint32", "int32"): int_field = True units = row.units.lower().strip() if row.units is not None else None @@ -297,9 +252,9 @@ def _generate_field(self, row, class_name, bitfields): # if we don't know about that bitfield, skip it - generally these are ones kept for future use if row.name not in bitfields: logger.warning(f"skipping {row.name} as unknown bitfield. Row: {row}") - return "", "", [] + return "", "", has_scale_factor field_type = f"Bit{16 * row.size}" - field_args += list(self._generate_bit_field(row, bitfields)) + field_args.append(f"flags={bitfields[row.name]}") elif units == "enumerated" or ( row.description is not None and re.match(r"^\s*0\s*=\s*Disabled\s*[,;]\s*1\s*=\s*Enabled\s*$", row.description) @@ -320,17 +275,30 @@ def _generate_field(self, row, class_name, bitfields): field_type = "Address" if int_field: - for after, args in self._generate_integer_field(row, name, class_name): - if after: - afters.append(args) - else: - field_args.append(args) + if row.units: + field_args.append(f'units="{row.units}"') field_type = row.type.title() + if row.scale_factor is not None: + scale_factors = [r for r in self.rows if r.name == row.scale_factor] + if len(scale_factors) != 1: + raise RuntimeError("Couldn't get scale factors!") + field_args.append(f"scale_factor=self.{scale_factors[0].python_name}") + field_type = f"Float{field_type}" + has_scale_factor = True elif row.type.startswith("string"): field_type = "String" else: raise ValueError(f"Don't know what to do with type {row.type}") - return name, f" {name}: {field_type}Field = {field_type}Field(\"{name}\", {', '.join(field_args)})\n", afters + + # Add description at the end + if row.description: + field_args.append(f'description="{row.description}"') + + return ( + name, + f" self.{name}: {field_type}Field = {field_type}Field({', '.join(field_args)})\n", + has_scale_factor, + ) class BitfieldTable: @@ -368,7 +336,7 @@ def _sanitise_rows(self, rows): for row in off_by_name.values(): logger.warning( ( - f"{row.name} has an on value ({on_by_name[row.name].description}), and an off {row.description}. " + f"{row.name} has an on value ({on_by_name[row.name].description}), and an off ({row.description}). " "Assuming these are opposites, so ignoring the off value so we have a proper bitfield." ) ) @@ -521,6 +489,9 @@ def main(): Int16Field, Uint16Field, Uint32Field, + FloatInt16Field, + FloatUint16Field, + FloatUint32Field, EnumUint16Field, EnumInt16Field, Bit16Field, @@ -540,26 +511,23 @@ def main(): code += "\n\n" code += f"""class SunSpecHeaderModel(Model): - did: Uint32Field = Uint32Field("did", 1, 2, Mode.R) - model_id: Uint16Field = Uint16Field("model_id", 3, 1, Mode.R) - length: Uint16Field = Uint16Field("length", 4, 1, Mode.R) - manufacturer: StringField = StringField("manufacturer", 5, 16, Mode.R) - model: StringField = StringField("model", 21, 16, Mode.R) - options: StringField = StringField("options", 37, 8, Mode.R) - version: StringField = StringField("version", 45, 8, Mode.R) - serial_number: StringField = StringField("serial_number", 53, 16, Mode.R) - - -SunSpecHeaderModel.__model_fields__ = [SunSpecHeaderModel.did, SunSpecHeaderModel.model_id, SunSpecHeaderModel.length, SunSpecHeaderModel.manufacturer, SunSpecHeaderModel.model, SunSpecHeaderModel.options, SunSpecHeaderModel.version, SunSpecHeaderModel.serial_number] + def __init__(self): + self.did: Uint32Field = Uint32Field("did", 1, 2, Mode.R) + self.model_id: Uint16Field = Uint16Field("model_id", 3, 1, Mode.R) + self.length: Uint16Field = Uint16Field("length", 4, 1, Mode.R) + self.manufacturer: StringField = StringField("manufacturer", 5, 16, Mode.R) + self.model: StringField = StringField("model", 21, 16, Mode.R) + self.options: StringField = StringField("options", 37, 8, Mode.R) + self.version: StringField = StringField("version", 45, 8, Mode.R) + self.serial_number: StringField = StringField("serial_number", 53, 16, Mode.R) class SunSpecEndModel(Model): - did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Should be {0xFFFF}") - length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Should be 0") + def __init__(self): + self.did: Uint16Field = Uint16Field("did", 1, 1, Mode.R, description="Should be {0xFFFF}") + self.length: Uint16Field = Uint16Field("length", 2, 1, Mode.R, description="Should be 0") -SunSpecEndModel.__model_fields__ = [SunSpecEndModel.did, SunSpecEndModel.length] -\n """ model_tables = read_models(wb) model_tables = sorted(model_tables, key=lambda x: x.did) @@ -578,47 +546,48 @@ class SunSpecEndModel(Model): with open(str(MODELS_MODULE), "w") as f: f.write(code) - # now values: - code = f'''"""{WARNING}""" -from dataclasses import dataclass +# # now values: +# code = f'''"""{WARNING}""" -from mate3.field_values import FieldValue, ModelValues -from mate3.sunspec import models +# from dataclasses import dataclass +# from mate3.field_values import FieldValue, ModelValues +# from mate3.sunspec import models -@dataclass -class SunSpecHeaderValues(ModelValues): - did: FieldValue - model_id: FieldValue - length: FieldValue - manufacturer: FieldValue - model: FieldValue - options: FieldValue - version: FieldValue - serial_number: FieldValue +# @dataclass +# class SunSpecHeaderValues(ModelValues): +# did: FieldValue +# model_id: FieldValue +# length: FieldValue +# manufacturer: FieldValue +# model: FieldValue +# options: FieldValue +# version: FieldValue +# serial_number: FieldValue -@dataclass -class SunSpecEndValues(ModelValues): - did: FieldValue - length: FieldValue +# @dataclass +# class SunSpecEndValues(ModelValues): +# did: FieldValue +# length: FieldValue -''' - for table in model_tables: - code += table.generate_values() - code += "\n\n" - code += "MODELS_TO_VALUES = {\n" - code += " models.SunSpecHeaderModel: SunSpecHeaderValues,\n" - code += " models.SunSpecEndModel: SunSpecEndValues,\n" - for table in model_tables: - code += f" models.{table.python_name}Model: {table.python_name}Values,\n" - code += "}\n" +# ''' +# for table in model_tables: +# code += table.generate_values() +# code += "\n\n" - with open(str(VALUES_MODULE), "w") as f: - f.write(code) +# code += "MODELS_TO_VALUES = {\n" +# code += " models.SunSpecHeaderModel: SunSpecHeaderValues,\n" +# code += " models.SunSpecEndModel: SunSpecEndValues,\n" +# for table in model_tables: +# code += f" models.{table.python_name}Model: {table.python_name}Values,\n" +# code += "}\n" + +# with open(str(VALUES_MODULE), "w") as f: +# f.write(code) if __name__ == "__main__": From 5eb6d262338883f43394a0dc6f9b75c1e09b7ca9 Mon Sep 17 00:00:00 2001 From: kodonnell Date: Sun, 17 Jan 2021 07:13:44 +1300 Subject: [PATCH 02/10] more progress ... phew --- mate3/api.py | 247 +++++- mate3/devices.py | 374 ++------- mate3/field_values.py | 206 ----- mate3/main.py | 15 +- mate3/read.py | 61 -- mate3/sunspec/fields.py | 199 +++-- mate3/sunspec/model_base.py | 6 +- mate3/sunspec/scripts/code_generator.py | 54 -- mate3/sunspec/values.py | 999 ------------------------ 9 files changed, 419 insertions(+), 1742 deletions(-) delete mode 100644 mate3/field_values.py delete mode 100644 mate3/read.py delete mode 100644 mate3/sunspec/values.py diff --git a/mate3/api.py b/mate3/api.py index 8ffa032..2234496 100644 --- a/mate3/api.py +++ b/mate3/api.py @@ -1,16 +1,33 @@ from dataclasses import dataclass from datetime import datetime -from typing import Iterable, List +from typing import Dict, Iterable, List, Optional from loguru import logger from pymodbus.constants import Defaults, Endian from pymodbus.payload import BinaryPayloadDecoder -from mate3.devices import DeviceValues +from mate3.devices import ( + DEVICE_IDS, + ChargeControllerDevice, + FNDCDevice, + FXInverterDevice, + Mate3Device, + OPTICSDevice, + SinglePhaseRadianInverterDevice, + SplitPhaseRadianInverterDevice, +) from mate3.modbus_client import CachingModbusClient, ModbusTcpClient, NonCachingModbusClient -from mate3.read import AllModelReads, ModelRead -from mate3.sunspec.fields import Field, FieldRead, Mode, Uint16Field, Uint32Field -from mate3.sunspec.models import MODEL_DEVICE_IDS, SunSpecEndModel, SunSpecHeaderModel +from mate3.sunspec.fields import Field, FieldRead, Mode +from mate3.sunspec.model_base import Model +from mate3.sunspec.models import ( + ChargeControllerConfigurationModel, + FLEXnetDCConfigurationModel, + FXInverterConfigurationModel, + OutBackSystemControlModel, + RadianInverterConfigurationModel, + SunSpecEndModel, + SunSpecHeaderModel, +) @dataclass(frozen=False) @@ -54,7 +71,15 @@ def __init__( self._cache_only: bool = cache_only self._cache_writeable: bool = cache_writeable self._client: ModbusTcpClient = None - self._devices: DeviceValues = None + + # Set up devices + self.mate3s: Dict[None, Mate3Device] = {} + self.charge_controllers: Dict[int, ChargeControllerDevice] = {} + self.fndcs: Dict[int, FNDCDevice] = {} + self.fx_inverters: Dict[int, FXInverterDevice] = {} + self.single_phase_radian_inverters: Dict[int, SinglePhaseRadianInverterDevice] = {} + self.split_phase_radian_inverters: Dict[int, SplitPhaseRadianInverterDevice] = {} + self.opticses: Dict[int, OPTICSDevice] = {} def connect(self): """ @@ -71,9 +96,8 @@ def connect(self): else: self._client = NonCachingModbusClient(self.host, self.port) - # Now read everything. Why? Because most use of the API assumes fields have already been read (e.g. to get - # the devices, or the addresses of fields, etc.) - self.read_all() + # Now read everything and initialise with the devices. NB - yes, this should only happen once on connection. + self._read_all_devices_and_initialise() def close(self): """ @@ -88,11 +112,91 @@ def __enter__(self): def __exit__(self, exc_type, exc_val, exc_tb): self.close() + def _get_single_device(self, name: str) -> Model: + """ + Helper function so that e.g. if there's only one charge controller in self.charge_controllers, you can call + self.charge_controller to get it. + """ + devices = getattr(self, f"{name}es" if name.endswith("s") else f"{name}s") + if len(devices) != 1: + raise RuntimeError( + ( + f"Must be one, and only one, {name} device to be able to use `{name}` attribute - but there are " + f"{len(devices)}" + ) + ) + return list(devices.values())[0] + + @property + def connected_devices(self) -> Iterable[Model]: + # First ones which should only have a single device: + yield self.mate3 + + # And those without a config, but per port: + if self.opticses: + yield from self.opticses.values() + + # Now those with device and config. (NB: we're explicit here as opposed to relying on hasattr(device, 'config') + # just in case a model actually had a 'config' field.) + for d in ( + "charge_controllers", + "fndcs", + "fx_inverters", + "single_phase_radian_inverters", + "split_phase_radian_inverters", + ): + for device in getattr(self, d).values(): + yield device + yield device.config + + @property + def mate3(self) -> Mate3Device: + """ + Return the mate3. + """ + return self._get_single_device("mate3") + + @property + def charge_controller(self) -> ChargeControllerDevice: + """ + Return the charge controller if there's only one. + """ + return self._get_single_device("charge_controller") + + @property + def fndc(self) -> FNDCDevice: + """ + Return the FNDC if there's only one. + """ + return self._get_single_device("fndc") + @property - def devices(self) -> DeviceValues: - if self._devices is None: - raise RuntimeError("Can't access devices until after first read") - return self._devices + def fx_inverter(self) -> FXInverterDevice: + """ + Return the FX inverter if there's only one. + """ + return self._get_single_device("fx_inverter") + + @property + def single_phase_radian_inverter(self) -> SinglePhaseRadianInverterDevice: + """ + Return the single phase radian inverter if there's only one. + """ + return self._get_single_device("single_phase_radian_inverter") + + @property + def split_phase_radian_inverter(self) -> SplitPhaseRadianInverterDevice: + """ + Return the split phase radian inverter if there's only one. + """ + return self._get_single_device("split_phase_radian_inverter") + + @property + def optics(self) -> OPTICSDevice: + """ + Return the OPTICS if there's only one. + """ + return self._get_single_device("optics") def _read_contiguous_fields(self, address: int, fields: Iterable[Field]): @@ -102,7 +206,6 @@ def _read_contiguous_fields(self, address: int, fields: Iterable[Field]): read_time = datetime.now() # Now use the decoder to decode the fields: - decoder = BinaryPayloadDecoder.fromRegisters(registers=registers, byteorder=Endian.Big, wordorder=Endian.Big) registers_pointer = 0 for field in fields: end_register_pointer = registers_pointer + field.size @@ -130,12 +233,12 @@ def _read_model(self, device_address: int, first: bool): else: device_id = decoder.decode_16bit_uint() - if device_id not in MODEL_DEVICE_IDS: + if device_id not in DEVICE_IDS: logger.warning(f"Unknown model type with device ID {device_id}") return None # Instantiate the model: - model = MODEL_DEVICE_IDS[device_id]() + model = DEVICE_IDS[device_id]() # TODO: Make sure we don't read past the end of length (as reported by device). This shouldn't happen except in # e.g. a case where the (old) device model firmware returns only 10 fields, and then 'new' one (whatever we're @@ -163,22 +266,20 @@ def _read_model(self, device_address: int, first: bool): block_fields.append(field) block_size += field.size - # Get registers in large ranges, as this drastically improves performance and isn't so demanding of the mate3 + # Now read: for block_fields in blocks: start_address = device_address + block_fields[0].start - 1 # -1 as starts are 1-indexed in fields count = sum(f.size for f in fields) logger.debug(f"Reading block of {len(block_fields)} fields from {start_address} (count={count})") self._read_contiguous_fields(address=start_address, fields=block_fields) - # TODO: scale factors - return model - def read_all(self): + def _read_all_devices_and_initialise(self): """ - Read all values from all devices. If you want to read only specified fields use e.g. - client.devices.mate3.system_name.read() - This method, however, is optimised for reading everything. + On set up, read all devices so we know about them. In general, you should only do this once, and afterward read/ + write on each individual field. If, for some reason, you want to re-read everything (e.g. you just plugged in a + new device), then you should just re-create a new Mate3Client. """ register = self.sunspec_register max_models = 30 @@ -206,12 +307,102 @@ def read_all(self): # registers) and there's a model ID field (1 register) and length (1 register) register += model.length.value + (4 if isinstance(model, SunSpecHeaderModel) else 2) - # create devices if needed: - if self._devices is None: - self._devices = DeviceValues(client=self) + # OK, now assign everything: + self._update_device(models, self.mate3s, Mate3Device, OutBackSystemControlModel) + self._update_device(models, self.charge_controllers, ChargeControllerDevice, ChargeControllerConfigurationModel) + self._update_device(models, self.fndcs, FNDCDevice, FLEXnetDCConfigurationModel) + self._update_device(models, self.fx_inverters, FXInverterDevice, FXInverterConfigurationModel) + self._update_device( + models, + self.single_phase_radian_inverters, + SinglePhaseRadianInverterDevice, + RadianInverterConfigurationModel, + ) + self._update_device( + models, self.split_phase_radian_inverters, SplitPhaseRadianInverterDevice, RadianInverterConfigurationModel + ) + self._update_device(models, self.opticses, OPTICSDevice, None) + + def _update_device( + self, + models: List[Model], + devices_per_port_attr: Dict[int, Model], + model_class: Model, + config_class: Optional[Model], + ) -> None: + + # Since we're starting from scratch, ensure there are no current devices: + if devices_per_port_attr: + raise RuntimeError(f"devices_by_port should be empty!") + + devices_per_port = self._get_models_per_port(models, model_class) + + # If config_class is None, then the class has no config, so easy: + if config_class is None: + for port, device in devices_per_port.items(): + devices_per_port_attr[port] = device + return + + configs_per_port = self._get_models_per_port(models, config_class) + + # OK, there's a few options around whether the above variables contain anything. + # - Both present, then we're good - continue. All devices should have a configuration class. + # - Device isn't present - this means the device itself wasn't detected, so ignore. Note that usually this would + # imply the config class is null (since the config shouldn't be there if the device isn't) except in the case + # of Radian inverters, as the same config class is shared across both single and split phase devices (so that + # if only one type is present, the other will have empty model values and non-empty config). + # - Both are missing - this is covered by the above. + # So, the short summary is we only care about devices where the devices are present, and in all other cases + # there *should* be config field values too. + if not devices_per_port: + return + else: + if not configs_per_port: + logger.warning( + ( + f"Only model ({model_class}) field values and no config ({config_class}) fields were read. This" + f" is undefined behaviour, so ignoring {model_class}." + ) + ) + return + + # Check model and config have the same ports: + if set(devices_per_port).symmetric_difference(set(configs_per_port)): + raise RuntimeError("Config and models have different ports!") + + # Assign any devices for the given ports: + for port in devices_per_port: + + # Fail if it already exists ... since we're starting from scratch there shouldn't be anything in there. + if port in devices_per_port_attr: + raise RuntimeError(f"Device already at port {port}!") + + device = devices_per_port_attr[port] = devices_per_port[port] + device.config = configs_per_port[port] + + def _get_models_per_port(self, models: List[Model], model_class: Model): + """ + Generally there are multiple devices for a given model (e.g. multiple FX inverters), and the way we delineate + them is by the port (which they are plugged into the Hub with). So it's pretty common to want to get, for each + model, the models in a dict : . + """ - # update: - self._devices.update(models) + # Filter to only the model we care about: + models_per_port = {} + ports = [] + for model in models: + if isinstance(model, model_class): + port = None + if hasattr(model, "port_number"): + port = model.port_number.value + models_per_port[port] = model + ports.append(port) + + # Check we don't have multiple devices with the same port: + if len(ports) > len(set(ports)): + raise RuntimeError(f"Multiple {model_class} models have the same port!") + + return models_per_port # def read_all_modbus_values_unparsed(self): # """ diff --git a/mate3/devices.py b/mate3/devices.py index 4e70e4d..a16eaf9 100644 --- a/mate3/devices.py +++ b/mate3/devices.py @@ -1,358 +1,78 @@ -import dataclasses as dc -from typing import Dict, Iterable, List, Optional +from abc import ABCMeta, abstractmethod +from copy import deepcopy +from typing import Optional -from loguru import logger - -from mate3.field_values import FieldValue, ModelValues -from mate3.read import AllModelReads -from mate3.sunspec.fields import IntegerField -from mate3.sunspec.model_base import Model from mate3.sunspec.models import ( + MODEL_DEVICE_IDS, ChargeControllerConfigurationModel, ChargeControllerModel, FLEXnetDCConfigurationModel, FLEXnetDCRealTimeModel, FXInverterConfigurationModel, FXInverterRealTimeModel, + OPTICSPacketStatisticsModel, OutBackModel, OutBackSystemControlModel, RadianInverterConfigurationModel, SinglePhaseRadianInverterRealTimeModel, SplitPhaseRadianInverterRealTimeModel, ) -from mate3.sunspec.values import ( - ChargeControllerConfigurationValues, - ChargeControllerValues, - FLEXnetDCConfigurationValues, - FLEXnetDCRealTimeValues, - FXInverterConfigurationValues, - FXInverterRealTimeValues, - OPTICSPacketStatisticsValues, - OutBackSystemControlValues, - OutBackValues, - RadianInverterConfigurationValues, - SinglePhaseRadianInverterRealTimeValues, - SplitPhaseRadianInverterRealTimeValues, -) -@dc.dataclass -class ChargeControllerDeviceValues(ChargeControllerValues): - """ - Simple wrapper to combine the value and config models. - """ +class Mate3Device(OutBackModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.config: Optional[OutBackSystemControlModel] = None - config: ChargeControllerConfigurationValues = dc.field(metadata={"field": False}) +class ChargeControllerDevice(ChargeControllerModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.config: Optional[ChargeControllerConfigurationModel] = None -@dc.dataclass -class FNDCDeviceValues(FLEXnetDCRealTimeValues): - """ - Simple wrapper to combine the real-time and config models. - """ - config: FLEXnetDCConfigurationValues = dc.field(metadata={"field": False}) +class FNDCDevice(FLEXnetDCRealTimeModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.config: Optional[FLEXnetDCConfigurationModel] = None -@dc.dataclass -class FXInverterDeviceValues(FXInverterRealTimeValues): - """ - Simple wrapper to combine the real-time and config models. - """ +class FXInverterDevice(FXInverterRealTimeModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.config: Optional[FXInverterConfigurationModel] = None - config: FXInverterConfigurationValues = dc.field(metadata={"field": False}) +class SinglePhaseRadianInverterDevice(SinglePhaseRadianInverterRealTimeModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.config: Optional[RadianInverterConfigurationModel] = None -@dc.dataclass -class SinglePhaseRadianInverterDeviceValues(SinglePhaseRadianInverterRealTimeValues): - """ - Simple wrapper to combine the real-time and config models. - """ - config: RadianInverterConfigurationValues = dc.field(metadata={"field": False}) +class SplitPhaseRadianInverterDevice(SplitPhaseRadianInverterRealTimeModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.config: Optional[RadianInverterConfigurationModel] = None -@dc.dataclass -class SplitPhaseRadianInverterDeviceValues(SplitPhaseRadianInverterRealTimeValues): +class OPTICSDevice(OPTICSPacketStatisticsModel): """ - Simple wrapper to combine the real-time and config models. + No config ... """ - config: RadianInverterConfigurationValues = dc.field(metadata={"field": False}) - - -@dc.dataclass -class Mate3DeviceValues(OutBackValues): - """ - Simple wrapper to combine the value and config models. - """ - - config: OutBackSystemControlValues = dc.field(metadata={"field": False}) - - -class DeviceValues: - """ - This is basically a way for storing state (i.e. current values) about all devices. It's the main interface for users - to access values etc. - """ - - def __init__(self, client): - self._client = client - self.mate3s: Dict[None, Mate3DeviceValues] = {} - self.charge_controllers: Dict[int, ChargeControllerDeviceValues] = {} - self.fndcs: Dict[int, FNDCDeviceValues] = {} - self.fx_inverters: Dict[int, FXInverterDeviceValues] = {} - self.single_phase_radian_inverters: Dict[int, SinglePhaseRadianInverterDeviceValues] = {} - self.split_phase_radian_inverters: Dict[int, SplitPhaseRadianInverterDeviceValues] = {} - self.optics: Optional[OPTICSPacketStatisticsValues] = None - - @property - def connected_devices(self) -> Iterable[ModelValues]: - # First ones with only a single device: - for d in ("mate3", "optics"): - device = getattr(self, d) - if device: - yield device - - # Now those with device and config. (NB: we're explicit here as opposed to relying on hasattr(device, 'config') - # just in case a model actually had a 'config' field.) - for d in ( - "charge_controllers", - "fndcs", - "fx_inverters", - "single_phase_radian_inverters", - "split_phase_radian_inverters", - ): - for device in getattr(self, d).values(): - yield device - yield device.config - - def _get_single_device(self, name: str) -> ModelValues: - """ - Helper function so that e.g. if there's only one charge controller in self.charge_controllers, you can call - self.charge_controller to get it. - """ - devices = getattr(self, f"{name}s") - if len(devices) != 1: - raise RuntimeError( - ( - f"Must be one, and only one, {name} device to be able to use `{name}` attribute - but there are " - f"{len(devices)}" - ) - ) - return list(devices.values())[0] - - @property - def mate3(self) -> Mate3DeviceValues: - """ - Return the mate3. - """ - return self._get_single_device("mate3") - - @property - def charge_controller(self) -> ChargeControllerDeviceValues: - """ - Return the charge controller if there's only one. - """ - return self._get_single_device("charge_controller") - - @property - def fndc(self) -> FNDCDeviceValues: - """ - Return the FNDC if there's only one. - """ - return self._get_single_device("fndc") - - @property - def fx_inverter(self) -> FXInverterDeviceValues: - """ - Return the FX inverter if there's only one. - """ - return self._get_single_device("fx_inverter") - - @property - def single_phase_radian_inverter(self) -> SinglePhaseRadianInverterDeviceValues: - """ - Return the single phase radian inverter if there's only one. - """ - return self._get_single_device("single_phase_radian_inverter") - - @property - def split_phase_radian_inverter(self) -> SplitPhaseRadianInverterDeviceValues: - """ - Return the split phase radian inverter if there's only one. - """ - return self._get_single_device("split_phase_radian_inverter") - - def update(self, models: List[Model]) -> None: - - for model in models: - if isinstance(model, OutBackModel): - self.mate3s[None] = model - - return - - # Update mate: - self._update_model_and_config( - all_reads=all_reads, - model_class=OutBackModel, - config_class=OutBackSystemControlModel, - config_values_class=OutBackSystemControlValues, - device_values=self.mate3s, - device_class=Mate3DeviceValues, - ) - - # Charge controller - self._update_model_and_config( - all_reads=all_reads, - model_class=ChargeControllerModel, - config_class=ChargeControllerConfigurationModel, - config_values_class=ChargeControllerConfigurationValues, - device_values=self.charge_controllers, - device_class=ChargeControllerDeviceValues, - ) - - # FNDCs - self._update_model_and_config( - all_reads=all_reads, - model_class=FLEXnetDCRealTimeModel, - config_class=FLEXnetDCConfigurationModel, - config_values_class=FLEXnetDCConfigurationValues, - device_values=self.fndcs, - device_class=FNDCDeviceValues, - ) - - # FX inverters - self._update_model_and_config( - all_reads=all_reads, - model_class=FXInverterRealTimeModel, - config_class=FXInverterConfigurationModel, - config_values_class=FXInverterConfigurationValues, - device_values=self.fx_inverters, - device_class=FXInverterDeviceValues, - ) - - # Single phase radian inverters - self._update_model_and_config( - all_reads=all_reads, - model_class=SinglePhaseRadianInverterRealTimeModel, - config_class=RadianInverterConfigurationModel, - config_values_class=RadianInverterConfigurationValues, - device_values=self.single_phase_radian_inverters, - device_class=SinglePhaseRadianInverterDeviceValues, - ) - - # Split phase radian inverters - self._update_model_and_config( - all_reads=all_reads, - model_class=SplitPhaseRadianInverterRealTimeModel, - config_class=RadianInverterConfigurationModel, - config_values_class=RadianInverterConfigurationValues, - device_values=self.split_phase_radian_inverters, - device_class=SplitPhaseRadianInverterDeviceValues, - ) - - def _update_model_and_config( - self, - all_reads: AllModelReads, - model_class: Model, - config_class: Model, - config_values_class: ModelValues, - device_values: Dict[int, ModelValues], - device_class: ModelValues, - ) -> None: - - model_field_reads_per_port = all_reads.get_reads_per_model_by_port(model_class) - config_field_reads_per_port = all_reads.get_reads_per_model_by_port(config_class) - - # OK, there's a few options around whether the above variables contain anything. - # - Both present, then we're good - continue. All devices should have a configuration class. - # - Model isn't present - this means the device itself wasn't detected, so ignore. Note that usually this would - # imply the config class is null (since the config shouldn't be there if the device isn't) except in the case - # of Radian inverters, as the same config class is shared across both single and split phase devices (so that - # if only one type is present, the other will have empty model values and non-empty config). - # - Both are missing - this is covered by the above. - # So, the short summary is we only care about devices where the model field values are present, and in all other - # cases there *should* be config field values too. - if model_field_reads_per_port is None: - return - else: - if config_field_reads_per_port is None: - logger.warning( - ( - f"Only model ({model_class}) field values and no config ({config_class}) fields were read. This" - f" is undefined behaviour, so ignoring {model_class}." - ) - ) - return - - # Check model and config have the same ports: - if set(model_field_reads_per_port).symmetric_difference(set(config_field_reads_per_port)): - raise RuntimeError("Config and models have different ports!") - - # Create/update any devices for the given ports: - for port in model_field_reads_per_port: - model_reads_this_port = model_field_reads_per_port[port] - config_reads_this_port = config_field_reads_per_port[port] - if port not in device_values: - # OK, it's new - create it: - config_values = self._create_new_model_values( - model=config_class, - values_class=config_values_class, - device_address=config_reads_this_port["did"].address, - ) - device_values[port] = self._create_new_model_values( - model=model_class, - values_class=device_class, - device_address=model_reads_this_port["did"].address, - config=config_values, - ) - - # Either way, update the field values: - for reads, device_val in ( - (model_reads_this_port, device_values[port]), - (config_reads_this_port, device_values[port].config), - ): - for field_name, field_read in reads.items(): - field_value = getattr(device_val, field_name) - field_value._raw_value = field_read.raw_value - field_value._registers = field_read.registers - field_value._implemented = field_read.implemented - field_value._last_read = field_read.time - - # If there are any ports that were used for this device, but are no longer, remove them: - old_device_ports = set(list(device_values.keys())) - set(model_field_reads_per_port.keys()) - for port in old_device_ports: - logger.warning( - f"Device(s) of model {model_class} on ports {old_device_ports} have disappeared. These will be ignored." - ) - del device_values[port] - - def _create_new_model_values( - self, model: Model, values_class: ModelValues, device_address: int, config: Optional[ModelValues] = None - ): - - # Create empty FieldValues - field_values = {} - scale_factors = {} - for field in model.fields(): - address = device_address + field.start - 1 - field_values[field.name] = FieldValue( - client=self._client, - field=field, - address=address, - registers=[], - scale_factor=None, - raw_value=None, - implemented=True, - read_time=None, - ) - if isinstance(field, IntegerField) and field.scale_factor is not None: - scale_factors[field.name] = field.scale_factor.name - - # Now assign scale factors: - for field, scale_factor in scale_factors.items(): - field_values[field]._scale_factor = field_values[scale_factor] - - kwargs = {"model": model, "address": device_address, **field_values} - return values_class(**kwargs) if config is None else values_class(config=config, **kwargs) + pass + + +DEVICE_IDS = deepcopy(MODEL_DEVICE_IDS) +reverse_models_device_ids = {v: k for k, v in MODEL_DEVICE_IDS.items()} +for (model, device) in ( + (OutBackModel, Mate3Device), + (ChargeControllerModel, ChargeControllerDevice), + (FLEXnetDCRealTimeModel, FNDCDevice), + (FXInverterRealTimeModel, FXInverterDevice), + (SinglePhaseRadianInverterRealTimeModel, SinglePhaseRadianInverterDevice), + (SplitPhaseRadianInverterRealTimeModel, SplitPhaseRadianInverterDevice), + (OPTICSPacketStatisticsModel, OPTICSDevice), +): + did = reverse_models_device_ids[model] + DEVICE_IDS[did] = device diff --git a/mate3/field_values.py b/mate3/field_values.py deleted file mode 100644 index c0b5cee..0000000 --- a/mate3/field_values.py +++ /dev/null @@ -1,206 +0,0 @@ -import dataclasses as dc -from datetime import datetime -from typing import Any, Iterable, Optional, Tuple - -from loguru import logger - -from mate3.sunspec.fields import Field, Mode -from mate3.sunspec.model_base import Model - - -class FieldValue: - """ - A FieldValue is really just a container to store values read from a particular Field, with nice utilities like - automatically applying scale factors, and marking things as dirty etc. - """ - - def __init__( - self, - client, # TODO: Can't type it to Mate3Client as circular imports suck ... - field: Field, - scale_factor: Optional["FieldValue"], - address: int, - registers: Iterable[int], - raw_value: Any, - implemented: bool, - read_time: datetime, - ): - self._client = client - self.field = field - self._scale_factor = scale_factor - self._address = address - self._registers = tuple(registers) # immutability is nice - self._raw_value = raw_value - self._implemented = implemented - self._last_read = read_time - - @property - def name(self) -> str: - # Just the field name ... - return self.field.name - - def __repr__(self): - ss = [f"FieldValue[{self.field.name}]"] - ss.append(f"{self.field.mode}") - ss.append("Implemented" if self._implemented else "Not implemented") - if self._scale_factor is not None: - ss.append(f"Scale factor: {self._scale_factor.value}") - ss.append(f"Unscaled value: {self._raw_value}") - if self._implemented: - ss.append(f"Value: {self.value}") - ss.append(f"Read @ {self.last_read}") - return " | ".join(ss) - - @property - def implemented(self) -> bool: - return self._implemented - - @property - def last_read(self) -> datetime: - return self._last_read - - @property - def scale_factor(self) -> Optional[int]: - if self._scale_factor is None: - return None - - # Sense check the scale factor - if not self._scale_factor.implemented: - raise RuntimeError(f"Scale factor {self._scale_factor} should be implemented.") - if self._scale_factor.scale_factor is not None: - raise RuntimeError(f"Scale factor {self._scale_factor} shouldn't have it's own scale factor!") - if self._scale_factor.value is None: - raise RuntimeError(f"Scale factor {self._scale_factor} should not be None.") - if not isinstance(self._scale_factor.value, int): - raise RuntimeError(f"Scale factor {self._scale_factor} should be an integer.") - if self._scale_factor.value < -10 or self._scale_factor.value > 10: - raise RuntimeError(f"Scale factor {self._scale_factor} should be between -10 and 10.") - return self._scale_factor - - @property - def address(self) -> int: - return self._address - - @property - def registers(self) -> Tuple[int]: - return self._registers - - @property - def raw_value(self) -> Any: - if self.field.mode not in (Mode.R, Mode.RW): - raise RuntimeError("Can't read from this field!") - return self._raw_value - - @property - def _should_be_scaled(self): - return self._scale_factor is not None - - @property - def value(self) -> Any: - if self.field.mode not in (Mode.R, Mode.RW): - raise RuntimeError("Can't read from this field!") - if not self._implemented: - return None - if not self._should_be_scaled: - return self._raw_value - # OK, should be scaled, so let's scale it: - scale_factor = self._scale_factor.value - value = self._raw_value * 10 ** scale_factor - # Round it to what it should be after scaling: - return round(value, -scale_factor if scale_factor < 0 else 0) - - def write(self, value): - """ - Warning: - - Ensure you have read the LICENSE file before using this feature. Note the - section which begins: - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED - - Specifically, it is quite possible that you can cause damage to your equipment - through use of this feature. Be careful! - """ - logger.debug(f"Attempting to write {value} to {self.name}") - # TODO: ensure the type of value is correct - if self.field.mode not in (Mode.W, Mode.RW): - raise RuntimeError("Can't write to this field!") - if not self._implemented: - raise RuntimeError("This field is marked as not implemented, so you shouldn't write to it!") - # Scale if needed: - scaled_value = value - if self._should_be_scaled: - # TODO: Time limit on scale_factor being applicable? - # Scale it: - scaled_value = value / 10 ** self._scale_factor.value - # Round it to what it should be after scaling: - # TODO: raise error if too many digits specified - scaled_value = int(round(scaled_value, 0)) - - # OK, now convert to registers: - registers = self.field.to_registers(scaled_value) - logger.debug(f"Writing {scaled_value} to {self.name} as registers {registers} at address {self._address}") - - # Do the write - self._client._client.write_registers(self._address, registers) - - # Now read it and check the value is what we intended: - self.read() - if value != self.value: - raise RuntimeError( - f"Write 'succeeded' but after re-reading to check, the current value is {self.value} and not {value}" - ) - - def read(self): - if self.field.mode not in (Mode.R, Mode.RW): - raise RuntimeError("Can't read from this field!") - - # First, read the scale factor if needed: - if self._should_be_scaled: - self.scale_factor.read() - - # OK, read the appropriate registers: - logger.debug(f"Reading {self.name} from address {self._address}") - read_time = datetime.now() - registers = self._client._client.read_holding_registers(address=self._address, count=self.field.size) - logger.debug(f"Read {registers} for {self.name} from {self._address}") - - self._implemented, self._raw_value = self.field.from_registers(registers) - self._last_read = read_time - - def to_dict(self): - return { - "implemented": self.implemented, - "scale_factor": self.scale_factor.value if self.scale_factor is not None else None, - "address": self.address, - "registers": self.registers, - "raw_value": self.raw_value - if self.raw_value is None or isinstance(self.raw_value, (str, int, float)) - else repr(self.raw_value), - "value": self.value - if self.value is None or isinstance(self.value, (str, int, float)) - else repr(self.value), - } - - -@dc.dataclass -class ModelValues: - """ - A base dataclass to extend with all the actual FieldValues for a given Model. - """ - - model: Model = dc.field(metadata={"field": False}) - address: Optional[int] = dc.field(metadata={"field": False}) - - def fields(self, modes: Optional[Iterable[Mode]] = None) -> Iterable[FieldValue]: - """ - Often we want to loop through all the fields for a model - ignoring those that aren't 'real' fields such as - _address above, or the 'config' field that often gets added when a device has the 'realtime' and 'config' - models. - """ - for field in dc.fields(self): - if field.metadata.get("field", True): - field_ = getattr(self, field.name) - if modes is None or field_.field.mode in modes: - yield field_ diff --git a/mate3/main.py b/mate3/main.py index 4dce9e4..9eab149 100644 --- a/mate3/main.py +++ b/mate3/main.py @@ -16,24 +16,19 @@ def read(client, args): if args.format == "text": - for device in client.devices.connected_devices: + for device in client.connected_devices: # name: name = device.__class__.__name__ if hasattr(device, "port"): name = f"{name} on port {device.port_number.value}" print(name) + print() # values: - print("\t" + " | ".join(["name".ljust(50), "impl", "sf", "unscaled", "value".ljust(20)])) - print("\t" + " | ".join(["-" * 50, "----", "--", "--------", "-" * 20])) + print("\t" + " | ".join(["name".ljust(50), "implemented", "value".ljust(20)])) + print("\t" + " | ".join(["-" * 50, "-" * 11, "-" * 20])) for field in device.fields([Mode.R, Mode.RW]): ss = [f"\t{field.name.ljust(50)}"] - ss.append("Y".rjust(4) if field.implemented else "N".rjust(4)) - # if field.scale_factor is not None: - # ss.append(f"{value.scale_factor.value}".rjust(2)) - # ss.append(f"{value.raw_value}".rjust(8)) - # else: - ss.append(" -") - ss.append(" " * 7 + "-") + ss.append("Y".ljust(11) if field.implemented else "N".ljust(11)) ss.append(f"{repr(field.value)}".ljust(20) if field.implemented else "-".ljust(20)) print(" | ".join(ss)) print() diff --git a/mate3/read.py b/mate3/read.py deleted file mode 100644 index a4c0eca..0000000 --- a/mate3/read.py +++ /dev/null @@ -1,61 +0,0 @@ -import dataclasses as dc -from datetime import datetime -from typing import Any, List - - -@dc.dataclass -class FieldRead: - raw_value: Any - implemented: bool - address: int - time: datetime - registers: List[int] - - -class ModelRead(dict): - """ - A class for storing all the reads for a given model for a given device. - """ - - def add(self, field_name, registers, raw_value, implemented, address, time): - self[field_name] = FieldRead( - registers=registers, raw_value=raw_value, implemented=implemented, address=address, time=time - ) - - -class AllModelReads(dict): - """ - A class for storing all the reads for all models. It's basically just a dict - Dict[, List[ModelRead]] - I.e. for each model class, a list of all the (full) reads of that model type (which can be multiple e.g. if there - are two of the same inverter.) - """ - - def add(self, model, model_read: ModelRead): - self.setdefault(model, []) - self[model].append(model_read) - - def get_reads_per_model_by_port(self, model): - """ - Generally there are multiple devices for a given model (e.g. multiple FX inverters), and the way we delineate - them is by the port (which they are plugged into the Hub with). So it's pretty common to want to get, for each - model, the ModelReads in a dict : . - """ - if model not in self: - return None - - # Read per port - using port=None if no port_number field - reads_per_port = {} - ports = [] - for model_reads in self[model]: - port = None - if "port_number" in model_reads: - port = model_reads["port_number"].raw_value - reads_per_port[port] = model_reads - ports.append(port) - - # Check we don't have multiple devices with the same port: - if len(ports) > len(reads_per_port): - raise RuntimeError("Multiple devices have the same port!") - - return reads_per_port diff --git a/mate3/sunspec/fields.py b/mate3/sunspec/fields.py index 769e940..3b8265d 100644 --- a/mate3/sunspec/fields.py +++ b/mate3/sunspec/fields.py @@ -6,8 +6,8 @@ from enum import Enum, IntFlag from functools import wraps from typing import Any, Optional, Tuple -from uuid import uuid4 +from loguru import logger from pymodbus.constants import Endian from pymodbus.payload import BinaryPayloadBuilder, BinaryPayloadDecoder @@ -23,7 +23,6 @@ class FieldRead: address: int time: datetime registers: Tuple[int] - guid: int = dc.field(default_factory=lambda: uuid4().int) def has_been_read(f): @@ -46,8 +45,9 @@ def __init__(self, name: str, start: int, size: int, mode: Mode, description: Op # Internal state (all None until read) self._last_read: Optional[FieldRead] = None - self._value = None - self._implemented = None + self._can_reuse_cached: bool = False + self._cached_value = None + self._cached_implemented = None @property def end(self): @@ -57,40 +57,133 @@ def end(self): def last_read(self): return self._last_read + def __repr__(self): + name = f"Field[{self.field.name}]" + if self._last_read is None: + return f"{name} (Unread)" + ss = [name] + ss.append(f"{self.field.mode}") + ss.append("Implemented" if self.implemented else "Not implemented") + ss.append(f"Value: {self.value}") + return " | ".join(ss) + + @property + @has_been_read + def address(self) -> int: + return self._last_read.address + + @property + def registers(self) -> Tuple[int]: + return self._last_read.registers + @last_read.setter def last_read(self, read: FieldRead): self._last_read = read + self._can_reuse_cached = False + self._cached_value = None + self._cached_implemented = None - @property - @has_been_read - def value(self): + def _decode(self): """ OK, we get a bit clever here in that we only decode fields lazily. This is for two reasons - firstly, it can save decoding everything on the first run (when you're getting devices etc.) and secondly it resolves some inter-field dependency (e.g. to read a scaled field we first need to read the scale factor ... and you say we - could do that, but reading sequential fields can be nicer for the mate3) + could do that, but reading sequential fields can be nicer for the mate3, and scale factors often aren't + sequential with their field.). Put another way, it allows us to decouple reading fields (i.e. hitting modbus) + from the decoding into pretty python types etc. So, if the _last_read is something we've seen before, just reuse + cached decoding from last time. Otherwise, decode and then cache. This way we only decode when needed, but are + also speedy about it if it's done multiple time. """ if self.mode not in (Mode.R, Mode.RW): raise RuntimeError("Can't read from this field!") - if not self.implemented: - return None + if self._can_reuse_cached: + return + + # OK, not cached - let's read and decode: decoder = BinaryPayloadDecoder.fromRegisters( registers=self._last_read.registers, byteorder=Endian.Big, wordorder=Endian.Big ) + self._cached_value, self._cached_implemented = self.decode_from_registers(decoder) - return self.decode_from_registers(decoder) + @property + @has_been_read + def value(self): + self._decode() + return self._cached_value + + @property + def implemented(self) -> bool: + self._decode() + return self._cached_implemented @abstractmethod - def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Any: + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[Any, bool]: + """ + Returns: pretty python value, and whether ir implemented + """ pass @abstractmethod - def encode_to_payload(self, value: Any, encoder: BinaryPayloadBuilder): + def encode_to_payload(self, value: Any, encoder: BinaryPayloadBuilder) -> None: pass - @property - def implemented(self) -> bool: - return self._implemented + def to_dict(self): + return { + "implemented": self.implemented, + "address": self.address, + "registers": self.registers, + "value": self.value + if self.value is None or isinstance(self.value, (str, int, float)) + else repr(self.value), + } + + def write(self, value): + """ + Warning: + + Ensure you have read the LICENSE file before using this feature. Note the + section which begins: + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED + + Specifically, it is quite possible that you can cause damage to your equipment + through use of this feature. Be careful! + """ + logger.debug(f"Attempting to write {value} to {self.name}") + + if self.field.mode not in (Mode.W, Mode.RW): + raise RuntimeError("Can't write to this field!") + + if not self.implemented: + raise RuntimeError("This field is marked as not implemented, so you shouldn't write to it!") + + # OK, now convert to registers: + encoder = BinaryPayloadBuilder(registers=self._last_read.registers, byteorder=Endian.Big, wordorder=Endian.Big) + self.encode_to_payload(value, encoder) + registers = encoder.build() + logger.debug(f"Writing {self.value} to {self.name} as registers {registers} at address {self.address}") + + # Do the write + self._client._client.write_registers(self.address, registers) + + # Now read it and check the value is what we intended: + self.read() + if value != self.value: + raise RuntimeError( + f"Write 'succeeded' but after re-reading to check, the current value is {self.value} and not {value}" + ) + + def read(self): + if self.field.mode not in (Mode.R, Mode.RW): + raise RuntimeError("Can't read from this field!") + + # OK, read the appropriate registers: + logger.debug(f"Reading {self.name} from address {self.address}") + read_time = datetime.now() + registers = self._client._client.read_holding_registers(address=self.address, count=self.field.size) + logger.debug(f"Read {registers} for {self.name} from {self.address}") + self.last_read = FieldRead(address=self.address, time=read_time, registers=registers) class IntegerField(Field): @@ -118,17 +211,15 @@ def _not_implemented_value(self) -> Any: """ pass - def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> int: - return getattr(decoder, "decode_" + self._modbus_decode_type)() + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[int, bool]: + value = getattr(decoder, "decode_" + self._modbus_decode_type)() + implemented = value != self._not_implemented_value + return value if implemented else None, implemented - def encode_to_payload(self, value: int, encoder: BinaryPayloadBuilder): + def encode_to_payload(self, value: int, encoder: BinaryPayloadBuilder) -> None: if not isinstance(value, int): raise TypeError("value needs to be an int!") - return getattr(encoder, "add_" + self._modbus_decode_type)(value) - - @property - def implemented(self) -> bool: - return self.value != self._not_implemented_value + getattr(encoder, "add_" + self._modbus_decode_type)(value) class Uint16Field(IntegerField): @@ -158,11 +249,9 @@ class FloatField(IntegerField): def __init__( self, *args, - scale_factor: int, + scale_factor: IntegerField, **kwargs, ): - if not isinstance(scale_factor, int): - raise TypeError("scale_factor should be an int!") self._scale_factor = scale_factor super().__init__(*args, **kwargs) @@ -171,10 +260,10 @@ def scale_factor(self) -> Optional[int]: return self._scale_factor def _check_scale_factor(self): + if not isinstance(self._scale_factor, IntegerField): + raise RuntimeError(f"Scale factor {self._scale_factor} should be an IntegerField.") if not self._scale_factor.implemented: raise RuntimeError(f"Scale factor {self._scale_factor} should be implemented.") - if self._scale_factor.scale_factor is not None: - raise RuntimeError(f"Scale factor {self._scale_factor} shouldn't have it's own scale factor!") if self._scale_factor.value is None: raise RuntimeError(f"Scale factor {self._scale_factor} should not be None.") sf = self.scale_factor.value @@ -184,16 +273,18 @@ def _check_scale_factor(self): raise RuntimeError(f"Scale factor {self._scale_factor} should be between -10 and 10.") return sf - def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> float: + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[float, bool]: # First get our scale factor: sf = self._check_scale_factor() - # Sweet. Now get the integer value and scale it: - value = super().decode_from_registers(decoder) + # Sweet. Now get the integer value the integer way: + value, implemented = super().decode_from_registers(decoder) + if not implemented: + return None, implemented + # OK, scale it and round it to what it should be after scaling: value *= 10 ** sf - # Round it to what it should be after scaling: - return round(value, -sf if sf < 0 else 0) + return round(value, -sf if sf < 0 else 0), True def encode_to_payload(self, value: float, encoder: BinaryPayloadBuilder) -> None: if not isinstance(value, float): @@ -208,7 +299,12 @@ def encode_to_payload(self, value: float, encoder: BinaryPayloadBuilder) -> None # TODO: raise error if too many digits specified scaled_value = int(round(scaled_value, 0)) - return super().encode_to_payload(value, encoder) + super().encode_to_payload(value, encoder) + + def read(self, *args, **kwargs): + # First, read the scale factor, then do the normal read: + self.scale_factor.read() + return super().read(*args, **kwargs) class FloatInt16Field(FloatField, Int16Field): @@ -228,16 +324,12 @@ class FloatUint32Field(FloatField, Uint32Field): class StringField(Field): - def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> str: + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[str, bool]: bites = decoder.decode_string(size=self.size * 2) # Size * 2 as size is in 16 bit units, i.e. 2 bytes. - return bites.rstrip(b"\x00") - - @property - @has_been_read - def implemented(self) -> bool: - return self.last_read.value != "\x00" * self.size * 2 + implemented = bites != b"\x00" * self.size * 2 + return bites.rstrip(b"\x00") if implemented else None, implemented - def encode_to_payload(self, value: str, encoder: BinaryPayloadBuilder): + def encode_to_payload(self, value: str, encoder: BinaryPayloadBuilder) -> None: if not isinstance(value, str): raise ValueError("Expected str!") if len(value) > self.size * 2: @@ -247,7 +339,7 @@ def encode_to_payload(self, value: str, encoder: BinaryPayloadBuilder): # Encode to ascii: value = value.encode("ascii") # Finally, do it: - return encoder.add_string(value) + encoder.add_string(value) class BitfieldMixin: @@ -347,18 +439,15 @@ class EnumInt16Field(EnumMixin, Int16Field): class AddressField(Uint32Field): - def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> str: - uint32 = super().decode_from_registers(decoder) - return socket.inet_ntoa(struct.pack("!I", uint32)) - - @property - @has_been_read - def implemented(self) -> bool: - # Not implemented if raw value is 0, which equates to 0.0.0.0 when inet_ntoa'd - return self._last_read.value != "0.0.0.0" + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[str, bool]: + uint32, _ = super().decode_from_registers(decoder) + if uint32 == 0: + return None, False + return socket.inet_ntoa(struct.pack("!I", uint32)), True - # def encode_to_payload(self, value: int, encoder: BinaryPayloadBuilder): - # return getattr(encoder, "add_" + self._modbus_decode_type)(value) + def encode_to_payload(self, value: int, encoder: BinaryPayloadBuilder): + raise NotImplementedError() + getattr(encoder, "add_" + self._modbus_decode_type)(value) class DescribedIntFlag(IntFlag): diff --git a/mate3/sunspec/model_base.py b/mate3/sunspec/model_base.py index 5875463..14584bc 100644 --- a/mate3/sunspec/model_base.py +++ b/mate3/sunspec/model_base.py @@ -15,5 +15,7 @@ def fields(self, modes: Optional[Iterable[Mode]] = None) -> Iterable[Field]: models. """ for field in vars(self).values(): - if modes is None or field.mode in modes: - yield field + # Only iterate Fields - that way, when other things get put on (such as .config) we're OK: + if isinstance(field, Field): + if modes is None or field.mode in modes: + yield field diff --git a/mate3/sunspec/scripts/code_generator.py b/mate3/sunspec/scripts/code_generator.py index 91fd90a..06aff9a 100644 --- a/mate3/sunspec/scripts/code_generator.py +++ b/mate3/sunspec/scripts/code_generator.py @@ -168,17 +168,6 @@ def __init__(self): code += defn return code - # def generate_values(self): - # class_name = self.python_name - # code = f"@dataclass\nclass {class_name}Values(ModelValues):\n" - # # code += f" __definition__ = models.{class_name}Model\n" - # for row in self.rows: - # name = row.python_name - # if name in ("sun_spec_did", "sun_spec_length"): - # name = name.replace("sun_spec_", "") - # code += f" {name}: FieldValue\n" - # return code - def _generate_enumerated_field(self, row): # ok, generate always seems to following the form 1=..., 2=..., etc. or ...=1, ...=2, So let's look for that starts_number = list(re.finditer(r"(\-?[0-9]+)\s?=\s?(.*?)(?=\-?[0-9]+\s?=|$)", row.description)) @@ -547,48 +536,5 @@ def __init__(self): f.write(code) -# # now values: -# code = f'''"""{WARNING}""" - -# from dataclasses import dataclass - -# from mate3.field_values import FieldValue, ModelValues -# from mate3.sunspec import models - - -# @dataclass -# class SunSpecHeaderValues(ModelValues): -# did: FieldValue -# model_id: FieldValue -# length: FieldValue -# manufacturer: FieldValue -# model: FieldValue -# options: FieldValue -# version: FieldValue -# serial_number: FieldValue - - -# @dataclass -# class SunSpecEndValues(ModelValues): -# did: FieldValue -# length: FieldValue - - -# ''' -# for table in model_tables: -# code += table.generate_values() -# code += "\n\n" - -# code += "MODELS_TO_VALUES = {\n" -# code += " models.SunSpecHeaderModel: SunSpecHeaderValues,\n" -# code += " models.SunSpecEndModel: SunSpecEndValues,\n" -# for table in model_tables: -# code += f" models.{table.python_name}Model: {table.python_name}Values,\n" -# code += "}\n" - -# with open(str(VALUES_MODULE), "w") as f: -# f.write(code) - - if __name__ == "__main__": main() diff --git a/mate3/sunspec/values.py b/mate3/sunspec/values.py deleted file mode 100644 index fd635d8..0000000 --- a/mate3/sunspec/values.py +++ /dev/null @@ -1,999 +0,0 @@ -"""This file is auto generated, do not edit. The generation code can be found in code_generator.py""" - -from dataclasses import dataclass - -from mate3.field_values import FieldValue, ModelValues -from mate3.sunspec import models - - -@dataclass -class SunSpecHeaderValues(ModelValues): - did: FieldValue - model_id: FieldValue - length: FieldValue - manufacturer: FieldValue - model: FieldValue - options: FieldValue - version: FieldValue - serial_number: FieldValue - - -@dataclass -class SunSpecEndValues(ModelValues): - did: FieldValue - length: FieldValue - - -@dataclass -class SunSpecCommonValues(ModelValues): - did: FieldValue - length: FieldValue - manufacturer: FieldValue - model: FieldValue - options: FieldValue - version: FieldValue - serial_number: FieldValue - device_address: FieldValue - - -@dataclass -class SunSpecInverterSinglePhaseValues(ModelValues): - did: FieldValue - length: FieldValue - ac_current: FieldValue - ac_current_a: FieldValue - ac_current_b: FieldValue - ac_current_c: FieldValue - ac_current_scale_factor: FieldValue - ac_voltage_ab: FieldValue - ac_voltage_bc: FieldValue - ac_voltage_ca: FieldValue - ac_voltage_an: FieldValue - ac_voltage_bn: FieldValue - ac_voltage_cn: FieldValue - ac_voltage_scale_factor: FieldValue - ac_power: FieldValue - ac_power_scale_factor: FieldValue - ac_frequency: FieldValue - ac_frequency_scale_factor: FieldValue - ac_va: FieldValue - ac_va_scale_factor: FieldValue - ac_var: FieldValue - ac_var_scale_factor: FieldValue - ac_pf: FieldValue - ac_pf_scale_factor: FieldValue - ac_energy_wh: FieldValue - ac_energy_wh_scale_factor: FieldValue - dc_current: FieldValue - dc_current_scale_factor: FieldValue - dc_voltage: FieldValue - dc_voltage_scale_factor: FieldValue - dc_power: FieldValue - dc_power_scale_factor: FieldValue - temp_cab: FieldValue - temp_sink: FieldValue - temp_trans: FieldValue - temp_other: FieldValue - temp_scale_factor: FieldValue - status: FieldValue - status_vendor: FieldValue - event_1: FieldValue - event_2: FieldValue - event_1_vendor: FieldValue - event_2_vendor: FieldValue - event_3_vendor: FieldValue - event_4_vendor: FieldValue - - -@dataclass -class SunSpecInverterSplitPhaseValues(ModelValues): - did: FieldValue - length: FieldValue - ac_current: FieldValue - ac_current_a: FieldValue - ac_current_b: FieldValue - ac_current_c: FieldValue - ac_current_scale_factor: FieldValue - ac_voltage_ab: FieldValue - ac_voltage_bc: FieldValue - ac_voltage_ca: FieldValue - ac_voltage_an: FieldValue - ac_voltage_bn: FieldValue - ac_voltage_cn: FieldValue - ac_voltage_scale_factor: FieldValue - ac_power: FieldValue - ac_power_scale_factor: FieldValue - ac_frequency: FieldValue - ac_frequency_scale_factor: FieldValue - ac_va: FieldValue - ac_va_scale_factor: FieldValue - ac_var: FieldValue - ac_var_scale_factor: FieldValue - ac_pf: FieldValue - ac_pf_scale_factor: FieldValue - ac_energy_wh: FieldValue - ac_energy_wh_scale_factor: FieldValue - dc_current: FieldValue - dc_current_scale_factor: FieldValue - dc_voltage: FieldValue - dc_voltage_scale_factor: FieldValue - dc_power: FieldValue - dc_power_scale_factor: FieldValue - temp_cab: FieldValue - temp_sink: FieldValue - temp_trans: FieldValue - temp_other: FieldValue - temp_scale_factor: FieldValue - status: FieldValue - status_vendor: FieldValue - event_1: FieldValue - event_2: FieldValue - event_1_vendor: FieldValue - event_2_vendor: FieldValue - event_3_vendor: FieldValue - event_4_vendor: FieldValue - - -@dataclass -class SunSpecInverterThreePhaseValues(ModelValues): - did: FieldValue - length: FieldValue - ac_current: FieldValue - ac_current_a: FieldValue - ac_current_b: FieldValue - ac_current_c: FieldValue - ac_current_scale_factor: FieldValue - ac_voltage_ab: FieldValue - ac_voltage_bc: FieldValue - ac_voltage_ca: FieldValue - ac_voltage_an: FieldValue - ac_voltage_bn: FieldValue - ac_voltage_cn: FieldValue - ac_voltage_scale_factor: FieldValue - ac_power: FieldValue - ac_power_scale_factor: FieldValue - ac_frequency: FieldValue - ac_frequency_scale_factor: FieldValue - ac_va: FieldValue - ac_va_scale_factor: FieldValue - ac_var: FieldValue - ac_var_scale_factor: FieldValue - ac_pf: FieldValue - ac_pf_scale_factor: FieldValue - ac_energy_wh: FieldValue - ac_energy_wh_scale_factor: FieldValue - dc_current: FieldValue - dc_current_scale_factor: FieldValue - dc_voltage: FieldValue - dc_voltage_scale_factor: FieldValue - dc_power: FieldValue - dc_power_scale_factor: FieldValue - temp_cab: FieldValue - temp_sink: FieldValue - temp_trans: FieldValue - temp_other: FieldValue - temp_scale_factor: FieldValue - status: FieldValue - status_vendor: FieldValue - event_1: FieldValue - event_2: FieldValue - event_1_vendor: FieldValue - event_2_vendor: FieldValue - event_3_vendor: FieldValue - event_4_vendor: FieldValue - - -@dataclass -class OutBackValues(ModelValues): - did: FieldValue - length: FieldValue - major_firmware_number: FieldValue - mid_firmware_number: FieldValue - minor_firmware_number: FieldValue - encryption_key: FieldValue - mac_address: FieldValue - write_password: FieldValue - enable_dhcp: FieldValue - tcpip_address: FieldValue - tcpip_gateway_msw: FieldValue - tcpip_netmask_msw: FieldValue - tcpip_dns_1_msw: FieldValue - tcpip_dns_2_msw: FieldValue - modbus_port: FieldValue - smtp_server_name: FieldValue - smtp_account_name: FieldValue - smtp_ssl_enable: FieldValue - smtp_email_password: FieldValue - smtp_email_user_name: FieldValue - status_email_interval: FieldValue - status_email_status_time: FieldValue - status_email_subject_line: FieldValue - status_email_to_address_1: FieldValue - status_email_to_address_2: FieldValue - alarm_email_enable: FieldValue - system_name: FieldValue - alarm_email_to_address_1: FieldValue - alarm_email_to_address_2: FieldValue - ftp_password: FieldValue - telnet_password: FieldValue - sd_card_data_log_write_interval: FieldValue - sd_card_data_log_retain_days: FieldValue - sd_card_data_logging_mode: FieldValue - time_server_name: FieldValue - enable_time_server: FieldValue - set_time_zone: FieldValue - enable_float_coordination: FieldValue - enable_fndc_charge_termination: FieldValue - enable_fndc_grid_tie_control: FieldValue - voltage_scale_factor: FieldValue - hour_scale_factor: FieldValue - ags_mode: FieldValue - ags_port: FieldValue - ags_port_type: FieldValue - ags_generator_type: FieldValue - ags_dc_gen_absorb_voltage: FieldValue - ags_dc_gen_absorb_time: FieldValue - ags_fault_time: FieldValue - ags_gen_cool_down_time: FieldValue - ags_gen_warm_up_time: FieldValue - ags_generator_exercise_mode: FieldValue - ags_exercise_start_hour: FieldValue - ags_exercise_start_minute: FieldValue - ags_exercise_day: FieldValue - ags_exercise_period: FieldValue - ags_exercise_interval: FieldValue - ags_sell_mode: FieldValue - ags_2_min_start_mode: FieldValue - ags_2_min_start_voltage: FieldValue - ags_2_hour_start_mode: FieldValue - ags_2_hour_start_voltage: FieldValue - ags_24_hour_start_mode: FieldValue - ags_24_hour_start_voltage: FieldValue - ags_load_start_mode: FieldValue - ags_load_start_kw: FieldValue - ags_load_start_delay: FieldValue - ags_load_stop_kw: FieldValue - ags_load_stop_delay: FieldValue - ags_soc_start_mode: FieldValue - ags_soc_start_percentage: FieldValue - ags_soc_stop_percentage: FieldValue - ags_enable_full_charge_mode: FieldValue - ags_full_charge_interval: FieldValue - ags_must_run_mode: FieldValue - ags_must_run_weekday_start_hour: FieldValue - ags_must_run_weekday_start_minute: FieldValue - ags_must_run_weekday_stop_hour: FieldValue - ags_must_run_weekday_stop_minute: FieldValue - ags_must_run_weekend_start_hour: FieldValue - ags_must_run_weekend_start_minute: FieldValue - ags_must_run_weekend_stop_hour: FieldValue - ags_must_run_weekend_stop_minute: FieldValue - ags_quiet_time_mode: FieldValue - ags_quiet_time_weekday_start_hour: FieldValue - ags_quiet_time_weekday_start_minute: FieldValue - ags_quiet_time_weekday_stop_hour: FieldValue - ags_quiet_time_weekday_stop_minute: FieldValue - ags_quiet_time_weekend_start_hour: FieldValue - ags_quiet_time_weekend_start_minute: FieldValue - ags_quiet_time_weekend_stop_hour: FieldValue - ags_quiet_time_weekend_stop_minute: FieldValue - ags_total_generator_run_time: FieldValue - hbx_mode: FieldValue - hbx_grid_connect_voltage: FieldValue - hbx_grid_connect_delay: FieldValue - hbx_grid_disconnect_voltage: FieldValue - hbx_grid_disconnect_delay: FieldValue - hbx_grid_connect_soc: FieldValue - hbx_grid_disconnect_soc: FieldValue - grid_use_interval_1_mode: FieldValue - grid_use_interval_1_weekday_start_hour: FieldValue - grid_use_interval_1_weekday_start_minute: FieldValue - grid_use_interval_1_weekday_stop_hour: FieldValue - grid_use_interval_1_weekday_stop_minute: FieldValue - grid_use_interval_1_weekend_start_hour: FieldValue - grid_use_interval_1_weekend_start_minute: FieldValue - grid_use_interval_1_weekend_stop_hour: FieldValue - grid_use_interval_1_weekend_stop_minute: FieldValue - grid_use_interval_2_mode: FieldValue - grid_use_interval_2_weekday_start_hour: FieldValue - grid_use_interval_2_weekday_start_minute: FieldValue - grid_use_interval_2_weekday_stop_hour: FieldValue - grid_use_interval_2_weekday_stop_minute: FieldValue - grid_use_interval_3_mode: FieldValue - grid_use_interval_3_weekday_start_hour: FieldValue - grid_use_interval_3_weekday_start_minute: FieldValue - grid_use_interval_3_weekday_stop_hour: FieldValue - grid_use_interval_3_weekday_stop_minute: FieldValue - load_grid_transfer_mode: FieldValue - load_grid_transfer_threshold: FieldValue - load_grid_transfer_connect_delay: FieldValue - load_grid_transfer_disconnect_delay: FieldValue - load_grid_transfer_connect_battery_voltage: FieldValue - load_grid_transfer_re_connect_battery_voltage: FieldValue - global_charger_control_mode: FieldValue - global_charger_control_output_limit: FieldValue - radian_ac_coupled_control_mode: FieldValue - radian_ac_coupled_aux_port: FieldValue - url_update_lock: FieldValue - web_reporting_base_url: FieldValue - web_user_logged_in_status: FieldValue - hub_type: FieldValue - hub_major_firmware_number: FieldValue - hub_mid_firmware_number: FieldValue - hub_minor_firmware_number: FieldValue - year: FieldValue - month: FieldValue - day: FieldValue - hour: FieldValue - minute: FieldValue - second: FieldValue - temp_battery: FieldValue - temp_ambient: FieldValue - temp_scale_factor: FieldValue - error: FieldValue - status: FieldValue - update_device_firmware_port: FieldValue - gateway_type: FieldValue - system_voltage: FieldValue - measured_system_voltage: FieldValue - ags_ac_reconnect_delay: FieldValue - multi_phase_coordination: FieldValue - sched_1_ac_mode: FieldValue - sched_1_ac_mode_hour: FieldValue - sched_1_ac_mode_minute: FieldValue - sched_2_ac_mode: FieldValue - sched_2_ac_mode_hour: FieldValue - sched_2_ac_mode_minute: FieldValue - sched_3_ac_mode: FieldValue - sched_3_ac_mode_hour: FieldValue - sched_3_ac_mode_minute: FieldValue - auto_reboot: FieldValue - time_zone_scale_factor: FieldValue - spare_reg_3: FieldValue - spare_reg_4: FieldValue - - -@dataclass -class ChargeControllerValues(ModelValues): - did: FieldValue - length: FieldValue - port_number: FieldValue - voltage_scale_factor: FieldValue - current_scale_factor: FieldValue - power_scale_factor: FieldValue - ah_scale_factor: FieldValue - kwh_scale_factor: FieldValue - battery_voltage: FieldValue - array_voltage: FieldValue - battery_current: FieldValue - array_current: FieldValue - charger_state: FieldValue - watts: FieldValue - todays_min_battery_volts: FieldValue - todays_max_battery_volts: FieldValue - voc: FieldValue - todays_peak_voc: FieldValue - todays_kwh: FieldValue - todays_ah: FieldValue - lifetime_kwh_hours: FieldValue - lifetime_k_amp_hours: FieldValue - lifetime_max_watts: FieldValue - lifetime_max_battery_volts: FieldValue - lifetime_max_voc: FieldValue - temp_scale_factor: FieldValue - temp_output_fets: FieldValue - temp_enclosure: FieldValue - - -@dataclass -class ChargeControllerConfigurationValues(ModelValues): - did: FieldValue - length: FieldValue - port_number: FieldValue - voltage_scale_factor: FieldValue - current_scale_factor: FieldValue - hours_scale_factor: FieldValue - power_scale_factor: FieldValue - ah_scale_factor: FieldValue - kwh_scale_factor: FieldValue - faults: FieldValue - absorb_volts: FieldValue - absorb_time_hours: FieldValue - absorb_end_amps: FieldValue - rebulk_volts: FieldValue - float_volts: FieldValue - bulk_current: FieldValue - eq_volts: FieldValue - eq_time_hours: FieldValue - auto_eq_days: FieldValue - mppt_mode: FieldValue - sweep_width: FieldValue - sweep_max_percentage: FieldValue - u_pick_pwm_duty_cycle: FieldValue - grid_tie_mode: FieldValue - temp_comp_mode: FieldValue - temp_comp_lower_limit_volts: FieldValue - temp_comp_upper_limit_volts: FieldValue - temp_comp_slope: FieldValue - auto_restart_mode: FieldValue - wakeup_voc: FieldValue - snooze_mode_amps: FieldValue - wakeup_interval: FieldValue - aux_mode: FieldValue - aux_control: FieldValue - aux_state: FieldValue - aux_polarity: FieldValue - aux_low_battery_disconnect: FieldValue - aux_low_battery_reconnect: FieldValue - aux_low_battery_disconnect_delay: FieldValue - aux_vent_fan_volts: FieldValue - aux_pv_limit_volts: FieldValue - aux_pv_limit_hold_time: FieldValue - aux_night_light_thres_volts: FieldValue - night_light_on_hours: FieldValue - night_light_on_hyst_time: FieldValue - night_light_off_hyst_time: FieldValue - aux_error_battery_volts: FieldValue - aux_divert_hold_time: FieldValue - aux_divert_delay_time: FieldValue - aux_divert_relative_volts: FieldValue - aux_divert_hyst_volts: FieldValue - major_firmware_number: FieldValue - mid_firmware_number: FieldValue - minor_firmware_number: FieldValue - set_data_log_day_offset: FieldValue - get_current_data_log_day_offset: FieldValue - data_log_daily_ah: FieldValue - data_log_daily_kwh: FieldValue - data_log_daily_max_output_amps: FieldValue - data_log_daily_max_output_watts: FieldValue - data_log_daily_absorb_time: FieldValue - data_log_daily_float_time: FieldValue - data_log_daily_min_battery_volts: FieldValue - data_log_daily_max_battery_volts: FieldValue - data_log_daily_max_input_volts: FieldValue - clear_data_log_read: FieldValue - clear_data_log_write_complement: FieldValue - stats_maximum_reset_read: FieldValue - stats_maximum_write_complement: FieldValue - stats_totals_reset_read: FieldValue - stats_totals_write_complement: FieldValue - battery_voltage_calibrate_offset: FieldValue - serial_number: FieldValue - model_number: FieldValue - - -@dataclass -class FXInverterRealTimeValues(ModelValues): - did: FieldValue - length: FieldValue - port_number: FieldValue - dc_voltage_scale_factor: FieldValue - ac_current_scale_factor: FieldValue - ac_voltage_scale_factor: FieldValue - ac_frequency_scale_factor: FieldValue - inverter_output_current: FieldValue - inverter_charge_current: FieldValue - inverter_buy_current: FieldValue - inverter_sell_current: FieldValue - output_ac_voltage: FieldValue - inverter_operating_mode: FieldValue - error_flags: FieldValue - warning_flags: FieldValue - battery_voltage: FieldValue - temp_compensated_target_voltage: FieldValue - aux_output_state: FieldValue - transformer_temperature: FieldValue - capacitor_temperature: FieldValue - fet_temperature: FieldValue - ac_input_frequency: FieldValue - ac_input_voltage: FieldValue - ac_input_state: FieldValue - minimum_ac_input_voltage: FieldValue - maximum_ac_input_voltage: FieldValue - sell_status: FieldValue - kwh_scale_factor: FieldValue - buy_kwh: FieldValue - sell_kwh: FieldValue - output_kwh: FieldValue - charger_kwh: FieldValue - output_kw: FieldValue - buy_kw: FieldValue - sell_kw: FieldValue - charge_kw: FieldValue - load_kw: FieldValue - ac_couple_kw: FieldValue - - -@dataclass -class FXInverterConfigurationValues(ModelValues): - did: FieldValue - length: FieldValue - port_number: FieldValue - dc_voltage_scale_factor: FieldValue - ac_current_scale_factor: FieldValue - ac_voltage_scale_factor: FieldValue - time_scale_factor: FieldValue - major_firmware_number: FieldValue - mid_firmware_number: FieldValue - minor_firmware_number: FieldValue - absorb_volts: FieldValue - absorb_time_hours: FieldValue - float_volts: FieldValue - float_time_hours: FieldValue - re_float_volts: FieldValue - eq_volts: FieldValue - eq_time_hours: FieldValue - search_sensitivity: FieldValue - search_pulse_length: FieldValue - search_pulse_spacing: FieldValue - ac_input_type: FieldValue - input_support: FieldValue - grid_ac_input_current_limit: FieldValue - gen_ac_input_current_limit: FieldValue - charger_ac_input_current_limit: FieldValue - charger_operating_mode: FieldValue - grid_lower_input_voltage_limit: FieldValue - grid_upper_input_voltage_limit: FieldValue - grid_transfer_delay: FieldValue - gen_lower_input_voltage_limit: FieldValue - gen_upper_input_voltage_limit: FieldValue - gen_transfer_delay: FieldValue - gen_connect_delay: FieldValue - ac_output_voltage: FieldValue - low_battery_cut_out_voltage: FieldValue - low_battery_cut_in_voltage: FieldValue - aux_mode: FieldValue - aux_control: FieldValue - aux_load_shed_enable_voltage: FieldValue - aux_gen_alert_on_voltage: FieldValue - aux_gen_alert_on_delay: FieldValue - aux_gen_alert_off_voltage: FieldValue - aux_gen_alert_off_delay: FieldValue - aux_vent_fan_enable_voltage: FieldValue - aux_vent_fan_off_period: FieldValue - aux_divert_enable_voltage: FieldValue - aux_divert_off_delay: FieldValue - stacking_mode: FieldValue - master_power_save_level: FieldValue - slave_power_save_level: FieldValue - sell_volts: FieldValue - grid_tie_window: FieldValue - grid_tie_enable: FieldValue - ac_input_voltage_calibrate_factor: FieldValue - ac_output_voltage_calibrate_factor: FieldValue - battery_voltage_calibrate_factor: FieldValue - serial_number: FieldValue - model_number: FieldValue - - -@dataclass -class SplitPhaseRadianInverterRealTimeValues(ModelValues): - did: FieldValue - length: FieldValue - port_number: FieldValue - dc_voltage_scale_factor: FieldValue - ac_current_scale_factor: FieldValue - ac_voltage_scale_factor: FieldValue - ac_frequency_scale_factor: FieldValue - l1_inverter_output_current: FieldValue - l1_inverter_charge_current: FieldValue - l1_inverter_buy_current: FieldValue - l1_inverter_sell_current: FieldValue - l1_grid_input_ac_voltage: FieldValue - l1_gen_input_ac_voltage: FieldValue - l1_output_ac_voltage: FieldValue - l2_inverter_output_current: FieldValue - l2_inverter_charge_current: FieldValue - l2_inverter_buy_current: FieldValue - l2_inverter_sell_current: FieldValue - l2_grid_input_ac_voltage: FieldValue - l2_gen_input_ac_voltage: FieldValue - l2_output_ac_voltage: FieldValue - inverter_operating_mode: FieldValue - error_flags: FieldValue - warning_flags: FieldValue - battery_voltage: FieldValue - temp_compensated_target_voltage: FieldValue - aux_output_state: FieldValue - aux_relay_output_state: FieldValue - l_module_transformer_temperature: FieldValue - l_module_capacitor_temperature: FieldValue - l_module_fet_temperature: FieldValue - r_module_transformer_temperature: FieldValue - r_module_capacitor_temperature: FieldValue - r_module_fet_temperature: FieldValue - battery_temperature: FieldValue - ac_input_selection: FieldValue - ac_input_frequency: FieldValue - ac_input_voltage: FieldValue - ac_input_state: FieldValue - minimum_ac_input_voltage: FieldValue - maximum_ac_input_voltage: FieldValue - sell_status: FieldValue - kwh_scale_factor: FieldValue - ac1_l1_buy_kwh: FieldValue - ac2_l1_buy_kwh: FieldValue - ac1_l1_sell_kwh: FieldValue - ac2_l1_sell_kwh: FieldValue - l1_output_kwh: FieldValue - ac1_l2_buy_kwh: FieldValue - ac2_l2_buy_kwh: FieldValue - ac1_l2_sell_kwh: FieldValue - ac2_l2_sell_kwh: FieldValue - l2_output_kwh: FieldValue - charger_kwh: FieldValue - output_kw: FieldValue - buy_kw: FieldValue - sell_kw: FieldValue - charge_kw: FieldValue - load_kw: FieldValue - ac_couple_kw: FieldValue - gt_number: FieldValue - - -@dataclass -class RadianInverterConfigurationValues(ModelValues): - did: FieldValue - length: FieldValue - port_number: FieldValue - dc_voltage_scale_factor: FieldValue - ac_current_scale_factor: FieldValue - ac_voltage_scale_factor: FieldValue - time_scale_factor: FieldValue - major_firmware_number: FieldValue - mid_firmware_number: FieldValue - minor_firmware_number: FieldValue - absorb_volts: FieldValue - absorb_time_hours: FieldValue - float_volts: FieldValue - float_time_hours: FieldValue - re_float_volts: FieldValue - eq_volts: FieldValue - eq_time_hours: FieldValue - search_sensitivity: FieldValue - search_pulse_length: FieldValue - search_pulse_spacing: FieldValue - ac_input_select_priority: FieldValue - grid_ac_input_current_limit: FieldValue - gen_ac_input_current_limit: FieldValue - charger_ac_input_current_limit: FieldValue - charger_operating_mode: FieldValue - ac_coupled: FieldValue - grid_input_mode: FieldValue - grid_lower_input_voltage_limit: FieldValue - grid_upper_input_voltage_limit: FieldValue - grid_transfer_delay: FieldValue - grid_connect_delay: FieldValue - gen_input_mode: FieldValue - gen_lower_input_voltage_limit: FieldValue - gen_upper_input_voltage_limit: FieldValue - gen_transfer_delay: FieldValue - gen_connect_delay: FieldValue - ac_output_voltage: FieldValue - low_battery_cut_out_voltage: FieldValue - low_battery_cut_in_voltage: FieldValue - aux_mode: FieldValue - aux_control: FieldValue - aux_on_battery_voltage: FieldValue - aux_on_delay_time: FieldValue - aux_off_battery_voltage: FieldValue - aux_off_delay_time: FieldValue - aux_relay_mode: FieldValue - aux_relay_control: FieldValue - aux_relay_on_battery_voltage: FieldValue - aux_relay_on_delay_time: FieldValue - aux_relay_off_battery_voltage: FieldValue - aux_relay_off_delay_time: FieldValue - stacking_mode: FieldValue - master_power_save_level: FieldValue - slave_power_save_level: FieldValue - sell_volts: FieldValue - grid_tie_window: FieldValue - grid_tie_enable: FieldValue - grid_ac_input_voltage_calibrate_factor: FieldValue - gen_ac_input_voltage_calibrate_factor: FieldValue - ac_output_voltage_calibrate_factor: FieldValue - battery_voltage_calibrate_factor: FieldValue - re_bulk_volts: FieldValue - mini_grid_lbx_volts: FieldValue - mini_grid_lbx_delay: FieldValue - grid_zero_do_d_volts: FieldValue - grid_zero_do_d_max_offset_ac_amps: FieldValue - serial_number: FieldValue - model_number: FieldValue - module_control: FieldValue - model_select: FieldValue - low_battery_cut_out_delay: FieldValue - high_battery_cut_out_voltage: FieldValue - high_battery_cut_in_voltage: FieldValue - high_battery_cut_out_delay: FieldValue - ee_write_enable: FieldValue - - -@dataclass -class SinglePhaseRadianInverterRealTimeValues(ModelValues): - did: FieldValue - length: FieldValue - port_number: FieldValue - dc_voltage_scale_factor: FieldValue - ac_current_scale_factor: FieldValue - ac_voltage_scale_factor: FieldValue - ac_frequency_scale_factor: FieldValue - inverter_output_current: FieldValue - inverter_charge_current: FieldValue - inverter_buy_current: FieldValue - inverter_sell_current: FieldValue - grid_input_ac_voltage: FieldValue - gen_input_ac_voltage: FieldValue - output_ac_voltage: FieldValue - inverter_operating_mode: FieldValue - error_flags: FieldValue - warning_flags: FieldValue - battery_voltage: FieldValue - temp_compensated_target_voltage: FieldValue - aux_output_state: FieldValue - aux_relay_output_state: FieldValue - l_module_transformer_temperature: FieldValue - l_module_capacitor_temperature: FieldValue - l_module_fet_temperature: FieldValue - r_module_transformer_temperature: FieldValue - r_module_capacitor_temperature: FieldValue - r_module_fet_temperature: FieldValue - battery_temperature: FieldValue - ac_input_selection: FieldValue - ac_input_frequency: FieldValue - ac_input_voltage: FieldValue - ac_input_state: FieldValue - minimum_ac_input_voltage: FieldValue - maximum_ac_input_voltage: FieldValue - sell_status: FieldValue - kwh_scale_factor: FieldValue - ac1_buy_kwh: FieldValue - ac2_buy_kwh: FieldValue - ac1_sell_kwh: FieldValue - ac2_sell_kwh: FieldValue - output_kwh: FieldValue - charger_kwh: FieldValue - output_kw: FieldValue - buy_kw: FieldValue - sell_kw: FieldValue - charge_kw: FieldValue - load_kw: FieldValue - ac_couple_kw: FieldValue - gt_number: FieldValue - - -@dataclass -class FLEXnetDCRealTimeValues(ModelValues): - did: FieldValue - length: FieldValue - port_number: FieldValue - dc_voltage_scale_factor: FieldValue - dc_current_scale_factor: FieldValue - time_scale_factor: FieldValue - kwh_scale_factor: FieldValue - kw_scale_factor: FieldValue - shunt_a_current: FieldValue - shunt_b_current: FieldValue - shunt_c_current: FieldValue - battery_voltage: FieldValue - battery_current: FieldValue - battery_temperature: FieldValue - status_flags: FieldValue - shunt_a_accumulated_ah: FieldValue - shunt_a_accumulated_kwh: FieldValue - shunt_b_accumulated_ah: FieldValue - shunt_b_accumulated_kwh: FieldValue - shunt_c_accumulated_ah: FieldValue - shunt_c_accumulated_kwh: FieldValue - input_current: FieldValue - output_current: FieldValue - input_kw: FieldValue - output_kw: FieldValue - net_kw: FieldValue - days_since_charge_parameters_met: FieldValue - state_of_charge: FieldValue - todays_minimum_soc: FieldValue - todays_maximum_soc: FieldValue - todays_net_input_ah: FieldValue - todays_net_input_kwh: FieldValue - todays_net_output_ah: FieldValue - todays_net_output_kwh: FieldValue - todays_net_battery_ah: FieldValue - todays_net_battery_kwh: FieldValue - charge_factor_corrected_net_battery_ah: FieldValue - charge_factor_corrected_net_battery_kwh: FieldValue - todays_minimum_battery_voltage: FieldValue - todays_minimum_battery_time: FieldValue - todays_maximum_battery_voltage: FieldValue - todays_maximum_battery_time: FieldValue - cycle_charge_factor: FieldValue - cycle_kwh_charge_efficiency: FieldValue - total_days_at_100_percent: FieldValue - lifetime_k_ah_removed: FieldValue - shunt_a_historical_returned_to_battery_ah: FieldValue - shunt_a_historical_returned_to_battery_kwh: FieldValue - shunt_a_historical_removed_from_battery_ah: FieldValue - shunt_a_historical_removed_from_battery_kwh: FieldValue - shunt_a_maximum_charge_rate: FieldValue - shunt_a_maximum_charge_rate_kw: FieldValue - shunt_a_maximum_discharge_rate: FieldValue - shunt_a_maximum_discharge_rate_kw: FieldValue - shunt_b_historical_returned_to_battery_ah: FieldValue - shunt_b_historical_returned_to_battery_kwh: FieldValue - shunt_b_historical_removed_from_battery_ah: FieldValue - shunt_b_historical_removed_from_battery_kwh: FieldValue - shunt_b_maximum_charge_rate: FieldValue - shunt_b_maximum_charge_rate_kw: FieldValue - shunt_b_maximum_discharge_rate: FieldValue - shunt_b_maximum_discharge_rate_kw: FieldValue - shunt_c_historical_returned_to_battery_ah: FieldValue - shunt_c_historical_returned_to_battery_kwh: FieldValue - shunt_c_historical_removed_from_battery_ah: FieldValue - shunt_c_historical_removed_from_battery_kwh: FieldValue - shunt_c_maximum_charge_rate: FieldValue - shunt_c_maximum_charge_rate_kw: FieldValue - shunt_c_maximum_discharge_rate: FieldValue - shunt_c_maximum_discharge_rate_kw: FieldValue - shunt_a_reset_maximum_data: FieldValue - shunt_a_reset_maximum_data_write_complement: FieldValue - shunt_b_reset_maximum_data: FieldValue - shunt_b_reset_maximum_data_write_complement: FieldValue - shunt_c_reset_maximum_data: FieldValue - shunt_c_reset_maximum_data_write_complement: FieldValue - - -@dataclass -class FLEXnetDCConfigurationValues(ModelValues): - did: FieldValue - length: FieldValue - port_number: FieldValue - dc_voltage_scale_factor: FieldValue - dc_current_scale_factor: FieldValue - kwh_scale_factor: FieldValue - major_firmware_number: FieldValue - mid_firmware_number: FieldValue - minor_firmware_number: FieldValue - battery_capacity: FieldValue - charged_volts: FieldValue - charged_time: FieldValue - battery_charged_amps: FieldValue - charge_factor: FieldValue - shunt_a_enabled: FieldValue - shunt_b_enabled: FieldValue - shunt_c_enabled: FieldValue - relay_control: FieldValue - relay_invert_logic: FieldValue - relay_high_voltage: FieldValue - relay_low_voltage: FieldValue - relay_soc_high: FieldValue - relay_soc_low: FieldValue - relay_high_enable_delay: FieldValue - relay_low_enable_delay: FieldValue - set_data_log_day_offset: FieldValue - get_current_data_log_day_offset: FieldValue - datalog_minimum_soc: FieldValue - datalog_input_ah: FieldValue - datalog_input_kwh: FieldValue - datalog_output_ah: FieldValue - datalog_output_kwh: FieldValue - datalog_net_ah: FieldValue - datalog_net_kwh: FieldValue - clear_data_log_read: FieldValue - clear_data_log_write_complement: FieldValue - serial_number: FieldValue - model_number: FieldValue - - -@dataclass -class OutBackSystemControlValues(ModelValues): - did: FieldValue - length: FieldValue - dc_voltage_scale_factor: FieldValue - ac_current_scale_factor: FieldValue - time_scale_factor: FieldValue - bulk_charge_enable_disable: FieldValue - inverter_ac_drop_use: FieldValue - set_inverter_mode: FieldValue - grid_tie_mode: FieldValue - set_inverter_charger_mode: FieldValue - control_status: FieldValue - set_sell_voltage: FieldValue - set_radian_inverter_sell_current_limit: FieldValue - set_absorb_voltage: FieldValue - set_absorb_time: FieldValue - set_float_voltage: FieldValue - set_float_time: FieldValue - set_inverter_charger_current_limit: FieldValue - set_inverter_ac1_current_limit: FieldValue - set_inverter_ac2_current_limit: FieldValue - set_ags_op_mode: FieldValue - ags_operational_state: FieldValue - ags_operational_state_timer: FieldValue - gen_last_run_start_time_gmt: FieldValue - gen_last_start_run_duration: FieldValue - - -@dataclass -class OPTICSPacketStatisticsValues(ModelValues): - did: FieldValue - length: FieldValue - bt_min: FieldValue - bt_max: FieldValue - bt_ave: FieldValue - bt_attempts: FieldValue - bt_errors: FieldValue - bt_timeouts: FieldValue - bt_packet_timeout: FieldValue - mp_min: FieldValue - mp_max: FieldValue - mp_ave: FieldValue - mp_attempts: FieldValue - mp_errors: FieldValue - mp_timeouts: FieldValue - mp_packet_timeout: FieldValue - cu_min: FieldValue - cu_max: FieldValue - cu_ave: FieldValue - cu_attempts: FieldValue - cu_errors: FieldValue - cu_timeouts: FieldValue - cu_packet_timeout: FieldValue - su_min: FieldValue - su_max: FieldValue - su_ave: FieldValue - su_attempts: FieldValue - su_errors: FieldValue - su_timeouts: FieldValue - su_packet_timeout: FieldValue - pg_min: FieldValue - pg_max: FieldValue - pg_ave: FieldValue - pg_attempts: FieldValue - pg_errors: FieldValue - pg_timeouts: FieldValue - pg_packet_timeout: FieldValue - mb_min: FieldValue - mb_max: FieldValue - mb_ave: FieldValue - mb_attempts: FieldValue - mb_errors: FieldValue - mb_timeouts: FieldValue - mb_packet_timeout: FieldValue - fu_min: FieldValue - fu_max: FieldValue - fu_ave: FieldValue - fu_attempts: FieldValue - fu_errors: FieldValue - fu_timeouts: FieldValue - fu_packet_timeout: FieldValue - ev_min: FieldValue - ev_max: FieldValue - ev_ave: FieldValue - ev_attempts: FieldValue - ev_errors: FieldValue - ev_timeouts: FieldValue - ev_packet_timeout: FieldValue - - -MODELS_TO_VALUES = { - models.SunSpecHeaderModel: SunSpecHeaderValues, - models.SunSpecEndModel: SunSpecEndValues, - models.SunSpecCommonModel: SunSpecCommonValues, - models.SunSpecInverterSinglePhaseModel: SunSpecInverterSinglePhaseValues, - models.SunSpecInverterSplitPhaseModel: SunSpecInverterSplitPhaseValues, - models.SunSpecInverterThreePhaseModel: SunSpecInverterThreePhaseValues, - models.OutBackModel: OutBackValues, - models.ChargeControllerModel: ChargeControllerValues, - models.ChargeControllerConfigurationModel: ChargeControllerConfigurationValues, - models.FXInverterRealTimeModel: FXInverterRealTimeValues, - models.FXInverterConfigurationModel: FXInverterConfigurationValues, - models.SplitPhaseRadianInverterRealTimeModel: SplitPhaseRadianInverterRealTimeValues, - models.RadianInverterConfigurationModel: RadianInverterConfigurationValues, - models.SinglePhaseRadianInverterRealTimeModel: SinglePhaseRadianInverterRealTimeValues, - models.FLEXnetDCRealTimeModel: FLEXnetDCRealTimeValues, - models.FLEXnetDCConfigurationModel: FLEXnetDCConfigurationValues, - models.OutBackSystemControlModel: OutBackSystemControlValues, - models.OPTICSPacketStatisticsModel: OPTICSPacketStatisticsValues, -} From b1d04e38ae1572a0229f8fbb1ec8d98e9e11cfca Mon Sep 17 00:00:00 2001 From: kodonnell Date: Sun, 17 Jan 2021 07:33:17 +1300 Subject: [PATCH 03/10] some more progress --- mate3/api.py | 4 ++++ mate3/sunspec/fields.py | 30 +++++++++++++++++------------- mate3/sunspec/model_base.py | 4 ++++ mate3/tests/test_io.py | 12 ++++++------ mate3/tests/test_known_systems.py | 6 +++--- 5 files changed, 34 insertions(+), 22 deletions(-) diff --git a/mate3/api.py b/mate3/api.py index 2234496..5c7237b 100644 --- a/mate3/api.py +++ b/mate3/api.py @@ -240,6 +240,10 @@ def _read_model(self, device_address: int, first: bool): # Instantiate the model: model = DEVICE_IDS[device_id]() + # Assign client to all fields: + for field in model.fields(): + field._client = self + # TODO: Make sure we don't read past the end of length (as reported by device). This shouldn't happen except in # e.g. a case where the (old) device model firmware returns only 10 fields, and then 'new' one (whatever we're # using in our spec) specifies 11, then we'd accidentally try to read one more. diff --git a/mate3/sunspec/fields.py b/mate3/sunspec/fields.py index 3b8265d..53dfdab 100644 --- a/mate3/sunspec/fields.py +++ b/mate3/sunspec/fields.py @@ -49,6 +49,9 @@ def __init__(self, name: str, start: int, size: int, mode: Mode, description: Op self._cached_value = None self._cached_implemented = None + # And client gets set later as a convenience so we can do self.read() without specifying a client context. + self._client = None + @property def end(self): return self.start + self.size @@ -58,11 +61,11 @@ def last_read(self): return self._last_read def __repr__(self): - name = f"Field[{self.field.name}]" + name = f"Field[{self.name}]" if self._last_read is None: return f"{name} (Unread)" ss = [name] - ss.append(f"{self.field.mode}") + ss.append(f"{self.mode}") ss.append("Implemented" if self.implemented else "Not implemented") ss.append(f"Value: {self.value}") return " | ".join(ss) @@ -105,6 +108,9 @@ def _decode(self): ) self._cached_value, self._cached_implemented = self.decode_from_registers(decoder) + # Mark as usable in cache: + self._can_reuse_cached = True + @property @has_been_read def value(self): @@ -152,16 +158,16 @@ def write(self, value): """ logger.debug(f"Attempting to write {value} to {self.name}") - if self.field.mode not in (Mode.W, Mode.RW): + if self.mode not in (Mode.W, Mode.RW): raise RuntimeError("Can't write to this field!") if not self.implemented: raise RuntimeError("This field is marked as not implemented, so you shouldn't write to it!") # OK, now convert to registers: - encoder = BinaryPayloadBuilder(registers=self._last_read.registers, byteorder=Endian.Big, wordorder=Endian.Big) + encoder = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) self.encode_to_payload(value, encoder) - registers = encoder.build() + registers = encoder.to_registers() logger.debug(f"Writing {self.value} to {self.name} as registers {registers} at address {self.address}") # Do the write @@ -175,13 +181,13 @@ def write(self, value): ) def read(self): - if self.field.mode not in (Mode.R, Mode.RW): + if self.mode not in (Mode.R, Mode.RW): raise RuntimeError("Can't read from this field!") # OK, read the appropriate registers: logger.debug(f"Reading {self.name} from address {self.address}") read_time = datetime.now() - registers = self._client._client.read_holding_registers(address=self.address, count=self.field.size) + registers = self._client._client.read_holding_registers(address=self.address, count=self.size) logger.debug(f"Read {registers} for {self.name} from {self.address}") self.last_read = FieldRead(address=self.address, time=read_time, registers=registers) @@ -329,15 +335,13 @@ def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[str, boo implemented = bites != b"\x00" * self.size * 2 return bites.rstrip(b"\x00") if implemented else None, implemented - def encode_to_payload(self, value: str, encoder: BinaryPayloadBuilder) -> None: - if not isinstance(value, str): - raise ValueError("Expected str!") + def encode_to_payload(self, value: bytes, encoder: BinaryPayloadBuilder) -> None: + if not isinstance(value, bytes): + raise ValueError("Expected bytes!") if len(value) > self.size * 2: raise ValueError(f"String must be less than {self.size * 2} characters") # Pad with "\0" if needed: - value = value.ljust(self.size * 2, "\0") - # Encode to ascii: - value = value.encode("ascii") + value = value.ljust(self.size * 2, b"\0") # Finally, do it: encoder.add_string(value) diff --git a/mate3/sunspec/model_base.py b/mate3/sunspec/model_base.py index 14584bc..1b6f8fa 100644 --- a/mate3/sunspec/model_base.py +++ b/mate3/sunspec/model_base.py @@ -8,6 +8,10 @@ class Model: Base model for Sunspec models - which are really just containers for Fields. """ + @property + def address(self): + return self.did.address + def fields(self, modes: Optional[Iterable[Mode]] = None) -> Iterable[Field]: """ Often we want to loop through all the fields for a model - ignoring those that aren't 'real' fields such as diff --git a/mate3/tests/test_io.py b/mate3/tests/test_io.py index fad02de..4ec2489 100644 --- a/mate3/tests/test_io.py +++ b/mate3/tests/test_io.py @@ -11,13 +11,13 @@ def test_individual_reads_work(subtests): """ with Mate3Client(host=None, cache_path=CACHE_PATH, cache_only=True) as client: - field = client.devices.mate3.system_name + field = client.mate3.system_name first_read_time = field.last_read with subtests.test("Reading doesn't fail"): field.read() with subtests.test("Reading updates the last_read time"): - assert field.last_read > first_read_time + assert field.last_read.time > first_read_time.time def test_individual_writes_work(subtests): @@ -26,9 +26,9 @@ def test_individual_writes_work(subtests): """ with Mate3Client(host=None, cache_path=CACHE_PATH, cache_only=True) as client: - field = client.devices.mate3.system_name - first_read_time = field.last_read + field = client.mate3.system_name + first_read_time = field.last_read.time with subtests.test("Writing doesn't fail"): - field.write("Test") + field.write(b"Test") with subtests.test("A read occurs after writing (i.e. there's an updated last_read time)"): - assert field.last_read > first_read_time + assert field.last_read.time > first_read_time diff --git a/mate3/tests/test_known_systems.py b/mate3/tests/test_known_systems.py index 8946084..5d6ace4 100644 --- a/mate3/tests/test_known_systems.py +++ b/mate3/tests/test_known_systems.py @@ -13,11 +13,11 @@ def _test_read_gives_expected_results(client, system_dir): # Get the values for this client: read_devices = [] - for device in client.devices.connected_devices: + for device in client.connected_devices: name = device.__class__.__name__ values = {} for value in device.fields([Mode.R, Mode.RW]): - values[value.field.name] = value.to_dict() + values[value.name] = value.to_dict() read_devices.append({"name": name, "address": device.address, "values": values}) # Compare them with what we expect: @@ -38,7 +38,7 @@ def test_known_system(subtests, system_dir): with subtests.test("Writing the same values back gives the same results"): # ... 'cos if that isn't the case, it implies we're serialising/deserialising incorrectly. cache = {k: v for k, v in client._client._cache.items()} - for device in client.devices.connected_devices: + for device in client.connected_devices: # NB: ignoring Mode.W as we can't read the value to be able to write it back i.e. we don't know what to # write. for value in device.fields(modes=[Mode.RW]): From 323a8b31924b2774cee260f1455fcc5e155f06ae Mon Sep 17 00:00:00 2001 From: kodonnell Date: Sun, 17 Jan 2021 09:54:30 +1300 Subject: [PATCH 04/10] looking good --- mate3/api.py | 73 +- mate3/main.py | 8 +- mate3/sunspec/fields.py | 186 +- mate3/sunspec/models.py | 192 +- mate3/sunspec/scripts/code_generator.py | 2 +- .../known_systems/chinezbrun/expected.json | 5846 +++++++---------- mate3/tests/test_cli.py | 2 +- mate3/tests/test_known_systems.py | 2 + 8 files changed, 2666 insertions(+), 3645 deletions(-) diff --git a/mate3/api.py b/mate3/api.py index 5c7237b..98a3d58 100644 --- a/mate3/api.py +++ b/mate3/api.py @@ -408,39 +408,40 @@ def _get_models_per_port(self, models: List[Model], model_class: Model): return models_per_port - # def read_all_modbus_values_unparsed(self): - # """ - # This method just reads all of the values from the modbus devices, with no care about parsing them. All it - # assumes is the standard structure of two registers (DID + length), except for the header. - # """ - # register = self.sunspec_register - # max_models = 30 - # first = True - # reads = {} - # for _ in range(max_models): - # # Data starts generally at 3rd register, except for start (SunSpecHeaderModel) where it starts at 5th - # data_offset = 4 if first else 2 - # registers = self._client.read_holding_registers(address=register, count=data_offset) - # # The length is the last register (i.e. the one before data) - # _, length = Uint16Field._from_registers(None, registers[-1:]) - - # # We're done when length == 0 i.e. SunSpecEndModel - # if length == 0: - # break - - # # Now read everything (in maximum bunches of 100) - # batch = 100 - # for start_offset in range(0, length, batch): - # count = min(batch, length - start_offset) - # registers = self._client.read_holding_registers( - # address=register + data_offset + start_offset, count=count - # ) - # addresses = [register + i for i in range(count)] - # for addr, bites in zip(addresses, registers): - # reads[addr] = bites - - # # See comment in self.read re the increment of 2 or 4 - # register += length + (4 if first else 2) - # first = False - - # return reads + def read_all_modbus_values_unparsed(self): + """ + This method just reads all of the values from the modbus devices, with no care about parsing them. All it + assumes is the standard structure of two registers (DID + length), except for the header. + """ + register = self.sunspec_register + max_models = 30 + first = True + reads = {} + for _ in range(max_models): + # Data starts generally at 3rd register, except for start (SunSpecHeaderModel) where it starts at 5th + data_offset = 4 if first else 2 + registers = self._client.read_holding_registers(address=register, count=data_offset) + # The length is the last register (i.e. the one before data) + decoder = BinaryPayloadDecoder.fromRegisters(registers[-1:], byteorder=Endian.Big, wordorder=Endian.Big) + length = decoder.decode_16bit_uint() + + # We're done when length == 0 i.e. SunSpecEndModel + if length == 0: + break + + # Now read everything (in maximum bunches of 100) + batch = 100 + for start_offset in range(0, length, batch): + count = min(batch, length - start_offset) + registers = self._client.read_holding_registers( + address=register + data_offset + start_offset, count=count + ) + addresses = [register + i for i in range(count)] + for addr, bites in zip(addresses, registers): + reads[addr] = bites + + # See comment in self.read re the increment of 2 or 4 + register += length + (4 if first else 2) + first = False + + return reads diff --git a/mate3/main.py b/mate3/main.py index 9eab149..55fb109 100644 --- a/mate3/main.py +++ b/mate3/main.py @@ -35,11 +35,11 @@ def read(client, args): elif args.format in ("json", "prettyjson"): devices = [] - for device in client.devices.connected_devices: + for device in client.connected_devices: name = device.__class__.__name__ values = {} for value in device.fields([Mode.R, Mode.RW]): - values[value.field.name] = value.to_dict() + values[value.name] = value.to_dict() devices.append({"name": name, "address": device.address, "values": values}) indent = None if args.format == "json" else 4 print(json.dumps(devices, indent=indent)) @@ -63,7 +63,7 @@ def get_field(field, paths: List[Tuple[str]]): for set_arg in args.set: path, value = set_arg.split("=") - field = get_field(client.devices, attr_idx_pattern.findall(path)) + field = get_field(client, attr_idx_pattern.findall(path)) value = eval(value, globals(), locals()) # TODO: get rid of eval! field.write(value) @@ -71,7 +71,7 @@ def get_field(field, paths: List[Tuple[str]]): def list_devices(client): print("name".ljust(50), "address".ljust(10), "port") print("----".ljust(50), "-------".ljust(10), "----") - for device in client.devices.connected_devices: + for device in client.connected_devices: name = device.__class__.__name__.replace("DeviceValues", "").replace("Values", "") port = device.port_number.value if hasattr(device, "port_number") else None print(name.ljust(50), str(device.address).ljust(10), port) diff --git a/mate3/sunspec/fields.py b/mate3/sunspec/fields.py index 53dfdab..8e8bce5 100644 --- a/mate3/sunspec/fields.py +++ b/mate3/sunspec/fields.py @@ -5,7 +5,7 @@ from datetime import datetime from enum import Enum, IntFlag from functools import wraps -from typing import Any, Optional, Tuple +from typing import Any, Optional, Tuple, Type from loguru import logger from pymodbus.constants import Endian @@ -61,7 +61,7 @@ def last_read(self): return self._last_read def __repr__(self): - name = f"Field[{self.name}]" + name = f"{self.__class__.__name__}[{self.name}]" if self._last_read is None: return f"{name} (Unread)" ss = [name] @@ -293,9 +293,12 @@ def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[float, b return round(value, -sf if sf < 0 else 0), True def encode_to_payload(self, value: float, encoder: BinaryPayloadBuilder) -> None: - if not isinstance(value, float): + # Must be float or int (int can happen when sf >= 0) + if not isinstance(value, (int, float)): raise TypeError("value must be a Float") + # TODO: check value doesn't have extra decimal places/significant figures + # Get our scale factor: sf = self._check_scale_factor() @@ -305,7 +308,7 @@ def encode_to_payload(self, value: float, encoder: BinaryPayloadBuilder) -> None # TODO: raise error if too many digits specified scaled_value = int(round(scaled_value, 0)) - super().encode_to_payload(value, encoder) + super().encode_to_payload(scaled_value, encoder) def read(self, *args, **kwargs): # First, read the scale factor, then do the normal read: @@ -346,102 +349,6 @@ def encode_to_payload(self, value: bytes, encoder: BinaryPayloadBuilder) -> None encoder.add_string(value) -class BitfieldMixin: - """ - This would have been simpler if they were normal on/off flags, however Outback has specified different meaning to - "on" and "off", unfortunately. - """ - - def __init__(self, *args, flags: IntFlag, **kwargs): - self.flags = flags - super().__init__(*args, **kwargs) - - def _get_flags(self, value, mx, not_implemented): - # TODO: as per spec ... "if the most significant bit in a bitfield is set, all other bits shall be ignored" - if value == not_implemented: - # As per sunspec, this is "not implemented" - return False, None - elif value < 0 or value > mx: - raise ValueError(f"{self.__class__.__name__} should be between 0 and {mx}") - return True, self.flags(value) - - def _set_flags(self, flags): - if not isinstance(flags, self.flags): - raise ValueError("Should be a flag of type {self.flags}") - return flags.value - - -class Bit16Field(BitfieldMixin, Uint16Field): - """ - The actual IntFlags are in the flags attr, and this is a basic wrapper that e.g. checks the value is implemented - before using the flags, etc. - """ - - def _from_registers(self, registers): - implemented, value = super()._from_registers(registers) - if not implemented: - return False, None - return self._get_flags(value, mx=0x7FFF, not_implemented=0xFFFF) - - def _to_registers(self, flags): - value = self._set_flags(flags) - return super()._to_registers(value) - - -class Bit32Field(BitfieldMixin, Uint32Field): - """ - The actual IntFlags are in the flags attr, and this is a basic wrapper that e.g. checks the value is implemented - before using the flags, etc. - - NB: According to the spec this shouldn't exist. But Outback have created it anyway. We'll assume it's just meant to - be a bit16 for now ... - """ - - def _from_registers(self, registers): - implemented, value = super()._from_registers(registers) - if not implemented: - return False, None - return self._get_flags(value, mx=0x7FFFFFFF, not_implemented=0xFFFFFFFF) - - def _to_registers(self, flags): - value = self._set_flags(flags) - return super()._to_registers(value) - - -class EnumMixin: - def __init__(self, *args, options: Enum, **kwargs): - self.options = options - super().__init__(*args, **kwargs) - - def _get_option(self, val): - if val is None: - return None - return self.options(val) - - def _set_option(self, val): - if not isinstance(val, self.options): - raise ValueError(f"Expected {self.options}") - return val.value - - def _from_registers(self, registers): - implemented, val = super()._from_registers(registers) - if not implemented: - return False, None - return True, self._get_option(val) - - def _to_registers(self, value): - value = self._set_option(value) - return super()._to_registers(value) - - -class EnumUint16Field(EnumMixin, Uint16Field): - pass - - -class EnumInt16Field(EnumMixin, Int16Field): - pass - - class AddressField(Uint32Field): def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[str, bool]: uint32, _ = super().decode_from_registers(decoder) @@ -449,9 +356,10 @@ def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[str, boo return None, False return socket.inet_ntoa(struct.pack("!I", uint32)), True - def encode_to_payload(self, value: int, encoder: BinaryPayloadBuilder): - raise NotImplementedError() - getattr(encoder, "add_" + self._modbus_decode_type)(value) + def encode_to_payload(self, value: str, encoder: BinaryPayloadBuilder): + bites = socket.inet_aton(value) + num = struct.unpack("!I", bites)[0] + super().encode_to_payload(num, encoder) class DescribedIntFlag(IntFlag): @@ -487,3 +395,75 @@ def get_set_flags(self): if flag.value & self.value == flag.value: flags.append(flag) return flags + + +class BitfieldMixin(metaclass=ABCMeta): + """ + This would have been simpler if they were normal on/off flags, however Outback has specified different meaning to + "on" and "off", unfortunately. The actual IntFlags are in the flags attr, and this is a basic wrapper that e.g. + checks the value is implemented before using the flags, etc. + """ + + def __init__(self, *args, flags: DescribedIntFlag, **kwargs): + self.flags = flags + super().__init__(*args, **kwargs) + + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[int, bool]: + value, implemented = super().decode_from_registers(decoder) + if not implemented: + return None, False + # TODO: as per spec ... "if the most significant bit in a bitfield is set, all other bits shall be ignored" + return self.flags(value), True + + def encode_to_payload(self, value: DescribedIntFlag, encoder: BinaryPayloadBuilder) -> None: + if not isinstance(value, self.flags): + raise TypeError(f"value must be of type {self.flags}") + return super().encode_to_payload(value.value, encoder) + + +class Bit16Field(BitfieldMixin, Uint16Field): + pass + + +class Bit32Field(BitfieldMixin, Uint32Field): + """ + NB: According to the spec this shouldn't exist. But Outback have created it anyway. We'll assume it's just meant to + be a bit16 for now ... + """ + + pass + + +class EnumMixin: + def __init__(self, *args, enum: Enum, **kwargs): + self.enum = enum + super().__init__(*args, **kwargs) + + def decode_from_registers(self, decoder: BinaryPayloadDecoder) -> Tuple[int, bool]: + value, implemented = super().decode_from_registers(decoder) + if not implemented: + return None, False + try: + value = self.enum(value) + except ValueError: + logger.warning( + ( + f"{value} is not a valid value for enum {self.enum} with options {list(self.enum)} so setting as " + "not implemented" + ) + ) + return None, False + return value, True + + def encode_to_payload(self, value: Enum, encoder: BinaryPayloadBuilder) -> None: + if not isinstance(value, self.enum): + raise TypeError(f"value should be an instance of {self.enum}") + return super().encode_to_payload(value.value, encoder) + + +class EnumUint16Field(EnumMixin, Uint16Field): + pass + + +class EnumInt16Field(EnumMixin, Int16Field): + pass diff --git a/mate3/sunspec/models.py b/mate3/sunspec/models.py index e354f7f..451000c 100644 --- a/mate3/sunspec/models.py +++ b/mate3/sunspec/models.py @@ -380,7 +380,7 @@ def __init__(self): self.encryption_key: Uint16Field = Uint16Field("encryption_key", 6, 1, Mode.R, description="Encryption key for current session (0 = Encryption not enabled)") self.mac_address: StringField = StringField("mac_address", 7, 7, Mode.R, description="Ethernet MAC address") self.write_password: StringField = StringField("write_password", 14, 8, Mode.W, description="Password required to write to any register") - self.enable_dhcp: EnumUint16Field = EnumUint16Field("enable_dhcp", 22, 1, Mode.RW, options=Enum("enable_dhcp", [('DHCP Disabled, use configured network parameter', 0), ('DHCP Enabled', 1)]), description="0 = DHCP Disabled, use configured network parameter; 1 = DHCP Enabled") + self.enable_dhcp: EnumUint16Field = EnumUint16Field("enable_dhcp", 22, 1, Mode.RW, enum=Enum("enable_dhcp", [('DHCP Disabled, use configured network parameter', 0), ('DHCP Enabled', 1)]), description="0 = DHCP Disabled, use configured network parameter; 1 = DHCP Enabled") self.tcpip_address: AddressField = AddressField("tcpip_address", 23, 2, Mode.RW, description="TCP/IP Address xxx.xxx.xxx.xxx") self.tcpip_gateway_msw: AddressField = AddressField("tcpip_gateway_msw", 25, 2, Mode.RW, description="TCP/IP Gateway xxx.xxx.xxx.xxx") self.tcpip_netmask_msw: AddressField = AddressField("tcpip_netmask_msw", 27, 2, Mode.RW, description="TCP/IP Netmask xxx.xxx.xxx.xxx") @@ -389,7 +389,7 @@ def __init__(self): self.modbus_port: Uint16Field = Uint16Field("modbus_port", 33, 1, Mode.RW, description="Outback MODBUS IP port, default 502") self.smtp_server_name: StringField = StringField("smtp_server_name", 34, 20, Mode.RW, description="Email server name") self.smtp_account_name: StringField = StringField("smtp_account_name", 54, 16, Mode.RW, description="Email account name") - self.smtp_ssl_enable: EnumUint16Field = EnumUint16Field("smtp_ssl_enable", 70, 1, Mode.RW, options=Enum("smtp_ssl_enable", [('SSL Disabled', 0), ('SSL Enabled (not implemented)', 1)]), description="0 = SSL Disabled; 1 = SSL Enabled (not implemented)") + self.smtp_ssl_enable: EnumUint16Field = EnumUint16Field("smtp_ssl_enable", 70, 1, Mode.RW, enum=Enum("smtp_ssl_enable", [('SSL Disabled', 0), ('SSL Enabled (not implemented)', 1)]), description="0 = SSL Disabled; 1 = SSL Enabled (not implemented)") self.smtp_email_password: StringField = StringField("smtp_email_password", 71, 8, Mode.W, description="Email account password") self.smtp_email_user_name: StringField = StringField("smtp_email_user_name", 79, 20, Mode.RW, description="Email account User Name") self.status_email_interval: Uint16Field = Uint16Field("status_email_interval", 99, 1, Mode.RW, description="0 = Status Email Disabled, 1-23 Status Email every n hours") @@ -397,7 +397,7 @@ def __init__(self): self.status_email_subject_line: StringField = StringField("status_email_subject_line", 101, 25, Mode.RW, description="Status Email Subject Line") self.status_email_to_address_1: StringField = StringField("status_email_to_address_1", 126, 20, Mode.RW, description="Status Email to Address 1") self.status_email_to_address_2: StringField = StringField("status_email_to_address_2", 146, 20, Mode.RW, description="Status Email to Address 2") - self.alarm_email_enable: EnumUint16Field = EnumUint16Field("alarm_email_enable", 166, 1, Mode.RW, options=Enum("alarm_email_enable", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.alarm_email_enable: EnumUint16Field = EnumUint16Field("alarm_email_enable", 166, 1, Mode.RW, enum=Enum("alarm_email_enable", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") self.system_name: StringField = StringField("system_name", 167, 30, Mode.RW, description="OutBack System Name") self.alarm_email_to_address_1: StringField = StringField("alarm_email_to_address_1", 197, 15, Mode.RW, description="Status Alarm to Address 1") self.alarm_email_to_address_2: StringField = StringField("alarm_email_to_address_2", 212, 20, Mode.RW, description="Status Alarm to Address 2") @@ -405,42 +405,42 @@ def __init__(self): self.telnet_password: StringField = StringField("telnet_password", 240, 8, Mode.W, description="Telnet password (not implemented)") self.sd_card_data_log_write_interval: Uint16Field = Uint16Field("sd_card_data_log_write_interval", 248, 1, Mode.RW, description="0 = SD-Card Data Logging disabled, 1-60 seconds") self.sd_card_data_log_retain_days: Uint16Field = Uint16Field("sd_card_data_log_retain_days", 249, 1, Mode.RW, description="0 = Log until SD-Card is full then erase oldest, 1-731 Number of days to retain data logs") - self.sd_card_data_logging_mode: EnumUint16Field = EnumUint16Field("sd_card_data_logging_mode", 250, 1, Mode.RW, options=Enum("sd_card_data_logging_mode", [('Compact Format', 2), ('Disabled', 0), ('Excel Format', 1)]), description="0 = Disabled; 1 = Excel Format; 2 = Compact Format") + self.sd_card_data_logging_mode: EnumUint16Field = EnumUint16Field("sd_card_data_logging_mode", 250, 1, Mode.RW, enum=Enum("sd_card_data_logging_mode", [('Compact Format', 2), ('Disabled', 0), ('Excel Format', 1)]), description="0 = Disabled; 1 = Excel Format; 2 = Compact Format") self.time_server_name: StringField = StringField("time_server_name", 251, 20, Mode.RW, description="Timeserver domain name") - self.enable_time_server: EnumUint16Field = EnumUint16Field("enable_time_server", 271, 1, Mode.RW, options=Enum("enable_time_server", [('Time Server Enabled', 1), ('Time Server Disabled, use configured time parameters', 0)]), description="0 = Time Server Disabled, use configured time parameters; 1 = Time Server Enabled") - self.enable_float_coordination: EnumUint16Field = EnumUint16Field("enable_float_coordination", 273, 1, Mode.RW, options=Enum("enable_float_coordination", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") - self.enable_fndc_charge_termination: EnumUint16Field = EnumUint16Field("enable_fndc_charge_termination", 274, 1, Mode.RW, options=Enum("enable_fndc_charge_termination", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") - self.enable_fndc_grid_tie_control: EnumUint16Field = EnumUint16Field("enable_fndc_grid_tie_control", 275, 1, Mode.RW, options=Enum("enable_fndc_grid_tie_control", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.enable_time_server: EnumUint16Field = EnumUint16Field("enable_time_server", 271, 1, Mode.RW, enum=Enum("enable_time_server", [('Time Server Enabled', 1), ('Time Server Disabled, use configured time parameters', 0)]), description="0 = Time Server Disabled, use configured time parameters; 1 = Time Server Enabled") + self.enable_float_coordination: EnumUint16Field = EnumUint16Field("enable_float_coordination", 273, 1, Mode.RW, enum=Enum("enable_float_coordination", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.enable_fndc_charge_termination: EnumUint16Field = EnumUint16Field("enable_fndc_charge_termination", 274, 1, Mode.RW, enum=Enum("enable_fndc_charge_termination", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.enable_fndc_grid_tie_control: EnumUint16Field = EnumUint16Field("enable_fndc_grid_tie_control", 275, 1, Mode.RW, enum=Enum("enable_fndc_grid_tie_control", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.voltage_scale_factor: Int16Field = Int16Field("voltage_scale_factor", 276, 1, Mode.R, description="DC Voltage Scale Factor") self.hour_scale_factor: Int16Field = Int16Field("hour_scale_factor", 277, 1, Mode.R, description="Hours Scale Factor") - self.ags_mode: EnumUint16Field = EnumUint16Field("ags_mode", 278, 1, Mode.RW, options=Enum("ags_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_mode: EnumUint16Field = EnumUint16Field("ags_mode", 278, 1, Mode.RW, enum=Enum("ags_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.ags_port: Uint16Field = Uint16Field("ags_port", 279, 1, Mode.RW, description="AGS device port number 0-10") - self.ags_port_type: EnumUint16Field = EnumUint16Field("ags_port_type", 280, 1, Mode.RW, options=Enum("ags_port_type", [('Radian AUX Output', 1), ('Radian AUX Relay', 0)]), description="0=Radian AUX Relay, 1=Radian AUX Output") - self.ags_generator_type: EnumUint16Field = EnumUint16Field("ags_generator_type", 281, 1, Mode.RW, options=Enum("ags_generator_type", [('AC Gen', 0), ('DC Gen', 1), ('No Gen', 2)]), description="0=AC Gen, 1=DC Gen, 2=No Gen") + self.ags_port_type: EnumUint16Field = EnumUint16Field("ags_port_type", 280, 1, Mode.RW, enum=Enum("ags_port_type", [('Radian AUX Output', 1), ('Radian AUX Relay', 0)]), description="0=Radian AUX Relay, 1=Radian AUX Output") + self.ags_generator_type: EnumUint16Field = EnumUint16Field("ags_generator_type", 281, 1, Mode.RW, enum=Enum("ags_generator_type", [('AC Gen', 0), ('DC Gen', 1), ('No Gen', 2)]), description="0=AC Gen, 1=DC Gen, 2=No Gen") self.ags_fault_time: Uint16Field = Uint16Field("ags_fault_time", 284, 1, Mode.RW, units="Minutes", description="AGS Generator fault time delay") self.ags_gen_cool_down_time: Uint16Field = Uint16Field("ags_gen_cool_down_time", 285, 1, Mode.RW, units="Minutes", description="AGS Generator Cool Down Time") self.ags_gen_warm_up_time: Uint16Field = Uint16Field("ags_gen_warm_up_time", 286, 1, Mode.RW, units="Minutes", description="AGS Generator Warm Up Time") - self.ags_generator_exercise_mode: EnumUint16Field = EnumUint16Field("ags_generator_exercise_mode", 287, 1, Mode.RW, options=Enum("ags_generator_exercise_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_generator_exercise_mode: EnumUint16Field = EnumUint16Field("ags_generator_exercise_mode", 287, 1, Mode.RW, enum=Enum("ags_generator_exercise_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.ags_exercise_start_hour: Uint16Field = Uint16Field("ags_exercise_start_hour", 288, 1, Mode.RW, units="Hour", description="Exercise Start Hour 0-23") self.ags_exercise_start_minute: Uint16Field = Uint16Field("ags_exercise_start_minute", 289, 1, Mode.RW, units="Minutes", description="Exercise Start Minute 0-59") - self.ags_exercise_day: EnumUint16Field = EnumUint16Field("ags_exercise_day", 290, 1, Mode.RW, options=Enum("ags_exercise_day", [('Fri', 5), ('Mon', 1), ('Sat', 6), ('Sun', 0), ('Thr', 4), ('Tue', 2), ('Wed', 3)]), description="0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thr, 5=Fri, 6=Sat") + self.ags_exercise_day: EnumUint16Field = EnumUint16Field("ags_exercise_day", 290, 1, Mode.RW, enum=Enum("ags_exercise_day", [('Fri', 5), ('Mon', 1), ('Sat', 6), ('Sun', 0), ('Thr', 4), ('Tue', 2), ('Wed', 3)]), description="0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thr, 5=Fri, 6=Sat") self.ags_exercise_period: Uint16Field = Uint16Field("ags_exercise_period", 291, 1, Mode.RW, units="Minutes", description="Exercise Period 1-240 minutes") self.ags_exercise_interval: Uint16Field = Uint16Field("ags_exercise_interval", 292, 1, Mode.RW, units="Weeks", description="Exercise interval 1-8 Weeks") - self.ags_sell_mode: EnumUint16Field = EnumUint16Field("ags_sell_mode", 293, 1, Mode.RW, options=Enum("ags_sell_mode", [('Selling Disabled', 1), ('Selling Enabled', 0)]), description="Sell During Generator Exercise Period, 0=Selling Enabled, 1=Selling Disabled") - self.ags_2_min_start_mode: EnumUint16Field = EnumUint16Field("ags_2_min_start_mode", 294, 1, Mode.RW, options=Enum("ags_2_min_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") - self.ags_2_hour_start_mode: EnumUint16Field = EnumUint16Field("ags_2_hour_start_mode", 296, 1, Mode.RW, options=Enum("ags_2_hour_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") - self.ags_24_hour_start_mode: EnumUint16Field = EnumUint16Field("ags_24_hour_start_mode", 298, 1, Mode.RW, options=Enum("ags_24_hour_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") - self.ags_load_start_mode: EnumUint16Field = EnumUint16Field("ags_load_start_mode", 300, 1, Mode.RW, options=Enum("ags_load_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_sell_mode: EnumUint16Field = EnumUint16Field("ags_sell_mode", 293, 1, Mode.RW, enum=Enum("ags_sell_mode", [('Selling Disabled', 1), ('Selling Enabled', 0)]), description="Sell During Generator Exercise Period, 0=Selling Enabled, 1=Selling Disabled") + self.ags_2_min_start_mode: EnumUint16Field = EnumUint16Field("ags_2_min_start_mode", 294, 1, Mode.RW, enum=Enum("ags_2_min_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_2_hour_start_mode: EnumUint16Field = EnumUint16Field("ags_2_hour_start_mode", 296, 1, Mode.RW, enum=Enum("ags_2_hour_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_24_hour_start_mode: EnumUint16Field = EnumUint16Field("ags_24_hour_start_mode", 298, 1, Mode.RW, enum=Enum("ags_24_hour_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_load_start_mode: EnumUint16Field = EnumUint16Field("ags_load_start_mode", 300, 1, Mode.RW, enum=Enum("ags_load_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.ags_load_start_kw: Uint16Field = Uint16Field("ags_load_start_kw", 301, 1, Mode.RW, units="kWatts", description="Load Start kWatts") self.ags_load_start_delay: Uint16Field = Uint16Field("ags_load_start_delay", 302, 1, Mode.RW, units="Minutes", description="Load Start Delay") self.ags_load_stop_kw: Uint16Field = Uint16Field("ags_load_stop_kw", 303, 1, Mode.RW, units="kWatts", description="Load Stop kWatts") self.ags_load_stop_delay: Uint16Field = Uint16Field("ags_load_stop_delay", 304, 1, Mode.RW, units="Minutes", description="Load Stop Delay") - self.ags_soc_start_mode: EnumUint16Field = EnumUint16Field("ags_soc_start_mode", 305, 1, Mode.RW, options=Enum("ags_soc_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_soc_start_mode: EnumUint16Field = EnumUint16Field("ags_soc_start_mode", 305, 1, Mode.RW, enum=Enum("ags_soc_start_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.ags_soc_start_percentage: Uint16Field = Uint16Field("ags_soc_start_percentage", 306, 1, Mode.RW, units="Percent", description="AGS SOC Start Percentage") self.ags_soc_stop_percentage: Uint16Field = Uint16Field("ags_soc_stop_percentage", 307, 1, Mode.RW, units="Percent", description="AGS SOC Stop Percentage") - self.ags_enable_full_charge_mode: EnumUint16Field = EnumUint16Field("ags_enable_full_charge_mode", 308, 1, Mode.RW, options=Enum("ags_enable_full_charge_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_enable_full_charge_mode: EnumUint16Field = EnumUint16Field("ags_enable_full_charge_mode", 308, 1, Mode.RW, enum=Enum("ags_enable_full_charge_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.ags_full_charge_interval: Uint16Field = Uint16Field("ags_full_charge_interval", 309, 1, Mode.RW, units="Days", description="AGS SOC Full Charge Interval") - self.ags_must_run_mode: EnumUint16Field = EnumUint16Field("ags_must_run_mode", 310, 1, Mode.RW, options=Enum("ags_must_run_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_must_run_mode: EnumUint16Field = EnumUint16Field("ags_must_run_mode", 310, 1, Mode.RW, enum=Enum("ags_must_run_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.ags_must_run_weekday_start_hour: Uint16Field = Uint16Field("ags_must_run_weekday_start_hour", 311, 1, Mode.RW, units="Hour", description="AGS Must Run Weekday Start Hour 0-23") self.ags_must_run_weekday_start_minute: Uint16Field = Uint16Field("ags_must_run_weekday_start_minute", 312, 1, Mode.RW, units="Minute", description="AGS Must Run Weekday Start Minute 0-59") self.ags_must_run_weekday_stop_hour: Uint16Field = Uint16Field("ags_must_run_weekday_stop_hour", 313, 1, Mode.RW, units="Hour", description="AGS Must Run Weekday Stop Hour 0-23") @@ -449,7 +449,7 @@ def __init__(self): self.ags_must_run_weekend_start_minute: Uint16Field = Uint16Field("ags_must_run_weekend_start_minute", 316, 1, Mode.RW, units="Minute", description="AGS Must Run Weekend Start Minute 0-59") self.ags_must_run_weekend_stop_hour: Uint16Field = Uint16Field("ags_must_run_weekend_stop_hour", 317, 1, Mode.RW, units="Hour", description="AGS Must Run Weekend Stop Hour 0-23") self.ags_must_run_weekend_stop_minute: Uint16Field = Uint16Field("ags_must_run_weekend_stop_minute", 318, 1, Mode.RW, units="Minute", description="AGS Must Run Weekend Stop Minute 0-59") - self.ags_quiet_time_mode: EnumUint16Field = EnumUint16Field("ags_quiet_time_mode", 319, 1, Mode.RW, options=Enum("ags_quiet_time_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.ags_quiet_time_mode: EnumUint16Field = EnumUint16Field("ags_quiet_time_mode", 319, 1, Mode.RW, enum=Enum("ags_quiet_time_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.ags_quiet_time_weekday_start_hour: Uint16Field = Uint16Field("ags_quiet_time_weekday_start_hour", 320, 1, Mode.RW, units="Hour", description="AGS Quiet Time Weekday Start Hour 0-23") self.ags_quiet_time_weekday_start_minute: Uint16Field = Uint16Field("ags_quiet_time_weekday_start_minute", 321, 1, Mode.RW, units="Minute", description="AGS Quiet Time Weekday Start Minute 0-59") self.ags_quiet_time_weekday_stop_hour: Uint16Field = Uint16Field("ags_quiet_time_weekday_stop_hour", 322, 1, Mode.RW, units="Hour", description="AGS Quiet Time Weekday Stop Hour 0-23") @@ -459,10 +459,10 @@ def __init__(self): self.ags_quiet_time_weekend_stop_hour: Uint16Field = Uint16Field("ags_quiet_time_weekend_stop_hour", 326, 1, Mode.RW, units="Hour", description="AGS Quiet Time Weekend Stop Hour 0-23") self.ags_quiet_time_weekend_stop_minute: Uint16Field = Uint16Field("ags_quiet_time_weekend_stop_minute", 327, 1, Mode.RW, units="Minute", description="AGS Quiet Time Weekend Stop Minute 0-59") self.ags_total_generator_run_time: Uint32Field = Uint32Field("ags_total_generator_run_time", 328, 2, Mode.RW, units="Hours", description="AGS Generator Total Run Time in Seconds") - self.hbx_mode: EnumUint16Field = EnumUint16Field("hbx_mode", 330, 1, Mode.RW, options=Enum("hbx_mode", [('Both', 3), ('Disabled', 0), ('SOC Only', 2), ('Voltage Only', 1)]), description="0=Disabled, 1=Voltage Only, 2=SOC Only, 3=Both") + self.hbx_mode: EnumUint16Field = EnumUint16Field("hbx_mode", 330, 1, Mode.RW, enum=Enum("hbx_mode", [('Both', 3), ('Disabled', 0), ('SOC Only', 2), ('Voltage Only', 1)]), description="0=Disabled, 1=Voltage Only, 2=SOC Only, 3=Both") self.hbx_grid_connect_soc: Uint16Field = Uint16Field("hbx_grid_connect_soc", 335, 1, Mode.RW, units="Percent", description="HBX Grid Connect SOC Percentage") self.hbx_grid_disconnect_soc: Uint16Field = Uint16Field("hbx_grid_disconnect_soc", 336, 1, Mode.RW, units="Percent", description="HBX Grid Disconnect SOC Percentage") - self.grid_use_interval_1_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_1_mode", 337, 1, Mode.RW, options=Enum("grid_use_interval_1_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.grid_use_interval_1_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_1_mode", 337, 1, Mode.RW, enum=Enum("grid_use_interval_1_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.grid_use_interval_1_weekday_start_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekday_start_hour", 338, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekday Start Hour 0-23") self.grid_use_interval_1_weekday_start_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekday_start_minute", 339, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekday Start Minute 0-59") self.grid_use_interval_1_weekday_stop_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekday_stop_hour", 340, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekday Stop Hour 0-23") @@ -471,27 +471,27 @@ def __init__(self): self.grid_use_interval_1_weekend_start_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekend_start_minute", 343, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekend Start Minute 0-59") self.grid_use_interval_1_weekend_stop_hour: Uint16Field = Uint16Field("grid_use_interval_1_weekend_stop_hour", 344, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekend Stop Hour 0-23") self.grid_use_interval_1_weekend_stop_minute: Uint16Field = Uint16Field("grid_use_interval_1_weekend_stop_minute", 345, 1, Mode.RW, units="Hour", description="Grid Use Interval 1 Weekend Stop Minute 0-59") - self.grid_use_interval_2_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_2_mode", 346, 1, Mode.RW, options=Enum("grid_use_interval_2_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.grid_use_interval_2_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_2_mode", 346, 1, Mode.RW, enum=Enum("grid_use_interval_2_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.grid_use_interval_2_weekday_start_hour: Uint16Field = Uint16Field("grid_use_interval_2_weekday_start_hour", 347, 1, Mode.RW, units="Hour", description="Grid Use Interval 2 Weekday Start Hour 0-23") self.grid_use_interval_2_weekday_start_minute: Uint16Field = Uint16Field("grid_use_interval_2_weekday_start_minute", 348, 1, Mode.RW, units="Hour", description="Grid Use Interval 2 Weekday Start Minute 0-59") self.grid_use_interval_2_weekday_stop_hour: Uint16Field = Uint16Field("grid_use_interval_2_weekday_stop_hour", 349, 1, Mode.RW, units="Hour", description="Grid Use Interval 2 Weekday Stop Hour 0-23") self.grid_use_interval_2_weekday_stop_minute: Uint16Field = Uint16Field("grid_use_interval_2_weekday_stop_minute", 350, 1, Mode.RW, units="Hour", description="Grid Use Interval 2 Weekday Stop Minute 0-59") - self.grid_use_interval_3_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_3_mode", 351, 1, Mode.RW, options=Enum("grid_use_interval_3_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.grid_use_interval_3_mode: EnumUint16Field = EnumUint16Field("grid_use_interval_3_mode", 351, 1, Mode.RW, enum=Enum("grid_use_interval_3_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.grid_use_interval_3_weekday_start_hour: Uint16Field = Uint16Field("grid_use_interval_3_weekday_start_hour", 352, 1, Mode.RW, units="Hour", description="Grid Use Interval 3 Weekday Start Hour 0-23") self.grid_use_interval_3_weekday_start_minute: Uint16Field = Uint16Field("grid_use_interval_3_weekday_start_minute", 353, 1, Mode.RW, units="Hour", description="Grid Use Interval 3 Weekday Start Minute 0-59") self.grid_use_interval_3_weekday_stop_hour: Uint16Field = Uint16Field("grid_use_interval_3_weekday_stop_hour", 354, 1, Mode.RW, units="Hour", description="Grid Use Interval 3 Weekday Stop Hour 0-23") self.grid_use_interval_3_weekday_stop_minute: Uint16Field = Uint16Field("grid_use_interval_3_weekday_stop_minute", 355, 1, Mode.RW, units="Hour", description="Grid Use Interval 3 Weekday Stop Minute 0-59") - self.load_grid_transfer_mode: EnumUint16Field = EnumUint16Field("load_grid_transfer_mode", 356, 1, Mode.RW, options=Enum("load_grid_transfer_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.load_grid_transfer_mode: EnumUint16Field = EnumUint16Field("load_grid_transfer_mode", 356, 1, Mode.RW, enum=Enum("load_grid_transfer_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.load_grid_transfer_connect_delay: Uint16Field = Uint16Field("load_grid_transfer_connect_delay", 358, 1, Mode.RW, units="Seconds", description="Load Grid Transfer Connect Delay Seconds") self.load_grid_transfer_disconnect_delay: Uint16Field = Uint16Field("load_grid_transfer_disconnect_delay", 359, 1, Mode.RW, units="Seconds", description="Load Grid Transfer Disconnect Delay Seconds") - self.global_charger_control_mode: EnumUint16Field = EnumUint16Field("global_charger_control_mode", 362, 1, Mode.RW, options=Enum("global_charger_control_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.global_charger_control_mode: EnumUint16Field = EnumUint16Field("global_charger_control_mode", 362, 1, Mode.RW, enum=Enum("global_charger_control_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.global_charger_control_output_limit: Uint16Field = Uint16Field("global_charger_control_output_limit", 363, 1, Mode.RW, units="Amps", description="Global Charger Output Limit Amps") - self.radian_ac_coupled_control_mode: EnumUint16Field = EnumUint16Field("radian_ac_coupled_control_mode", 364, 1, Mode.RW, options=Enum("radian_ac_coupled_control_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.radian_ac_coupled_control_mode: EnumUint16Field = EnumUint16Field("radian_ac_coupled_control_mode", 364, 1, Mode.RW, enum=Enum("radian_ac_coupled_control_mode", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") self.radian_ac_coupled_aux_port: Uint16Field = Uint16Field("radian_ac_coupled_aux_port", 365, 1, Mode.RW, units="Port", description="Radian Inverter Port Number for AUX Control 0-10") self.url_update_lock: Uint32Field = Uint32Field("url_update_lock", 366, 2, Mode.W, units="key", description="Unlock Key") self.web_reporting_base_url: StringField = StringField("web_reporting_base_url", 368, 20, Mode.RW, description="WEB Reporting Base URL") - self.web_user_logged_in_status: EnumUint16Field = EnumUint16Field("web_user_logged_in_status", 388, 1, Mode.RW, options=Enum("web_user_logged_in_status", [('WEB User NOT logged in', 0), ('WEB user logged in', 1)]), description="0=WEB User NOT logged in, 1=WEB user logged in") - self.hub_type: EnumUint16Field = EnumUint16Field("hub_type", 389, 1, Mode.R, options=Enum("hub_type", [('HUB10.3', 10), ('HUB3PH', 11), ('HUB4', 4), ('Legecy HUB', 0)]), description="0=Legecy HUB, 4= HUB4, 10=HUB10.3, 11=HUB3PH") + self.web_user_logged_in_status: EnumUint16Field = EnumUint16Field("web_user_logged_in_status", 388, 1, Mode.RW, enum=Enum("web_user_logged_in_status", [('WEB User NOT logged in', 0), ('WEB user logged in', 1)]), description="0=WEB User NOT logged in, 1=WEB user logged in") + self.hub_type: EnumUint16Field = EnumUint16Field("hub_type", 389, 1, Mode.R, enum=Enum("hub_type", [('HUB10.3', 10), ('HUB3PH', 11), ('HUB4', 4), ('Legecy HUB', 0)]), description="0=Legecy HUB, 4= HUB4, 10=HUB10.3, 11=HUB3PH") self.hub_major_firmware_number: Uint16Field = Uint16Field("hub_major_firmware_number", 390, 1, Mode.R, description="HUB Major firmware revision") self.hub_mid_firmware_number: Uint16Field = Uint16Field("hub_mid_firmware_number", 391, 1, Mode.R, description="HUB Mid firmware revision") self.hub_minor_firmware_number: Uint16Field = Uint16Field("hub_minor_firmware_number", 392, 1, Mode.R, description="HUB Minor firmware revision") @@ -507,20 +507,20 @@ def __init__(self): self.error: Bit16Field = Bit16Field("error", 402, 1, Mode.R, flags=OutBackErrorFlags, description="Bit field for errors. See Outback_Error Table") self.status: Bit16Field = Bit16Field("status", 403, 1, Mode.R, flags=OutBackStatusFlags, description="Bit field for status.See Outback_Status Table") self.update_device_firmware_port: Bit16Field = Bit16Field("update_device_firmware_port", 404, 1, Mode.RW, flags=OutBackUpdateDeviceFirmwarePortFlags, description="Device Firmware update See Device_FW_Update") - self.gateway_type: EnumUint16Field = EnumUint16Field("gateway_type", 405, 1, Mode.R, options=Enum("gateway_type", [('AXS Port', 1), ('MATE3', 2)]), description="1=AXS Port, 2= MATE3") + self.gateway_type: EnumUint16Field = EnumUint16Field("gateway_type", 405, 1, Mode.R, enum=Enum("gateway_type", [('AXS Port', 1), ('MATE3', 2)]), description="1=AXS Port, 2= MATE3") self.system_voltage: Uint16Field = Uint16Field("system_voltage", 406, 1, Mode.R, units="Volts", description="12, 24, 26, 48 or 60 VDC") self.ags_ac_reconnect_delay: Uint16Field = Uint16Field("ags_ac_reconnect_delay", 408, 1, Mode.RW, units="Minute", description="AGS AC Reconnect Delay") - self.multi_phase_coordination: EnumUint16Field = EnumUint16Field("multi_phase_coordination", 409, 1, Mode.RW, options=Enum("multi_phase_coordination", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") - self.sched_1_ac_mode: EnumInt16Field = EnumInt16Field("sched_1_ac_mode", 410, 1, Mode.RW, options=Enum("sched_1_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.multi_phase_coordination: EnumUint16Field = EnumUint16Field("multi_phase_coordination", 409, 1, Mode.RW, enum=Enum("multi_phase_coordination", [('Disabled', 0), ('Enabled', 1)]), description="0=Disabled, 1=Enabled") + self.sched_1_ac_mode: EnumInt16Field = EnumInt16Field("sched_1_ac_mode", 410, 1, Mode.RW, enum=Enum("sched_1_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") self.sched_1_ac_mode_hour: Uint16Field = Uint16Field("sched_1_ac_mode_hour", 411, 1, Mode.RW, units="Hour", description="Start Hour for AC Input Mode schedule 1") self.sched_1_ac_mode_minute: Uint16Field = Uint16Field("sched_1_ac_mode_minute", 412, 1, Mode.RW, units="Minute", description="Start Minute for AC Input Mode schedule 1") - self.sched_2_ac_mode: EnumInt16Field = EnumInt16Field("sched_2_ac_mode", 413, 1, Mode.RW, options=Enum("sched_2_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.sched_2_ac_mode: EnumInt16Field = EnumInt16Field("sched_2_ac_mode", 413, 1, Mode.RW, enum=Enum("sched_2_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") self.sched_2_ac_mode_hour: Uint16Field = Uint16Field("sched_2_ac_mode_hour", 414, 1, Mode.RW, units="Hour", description="Start Hour for AC Input Mode schedule 2") self.sched_2_ac_mode_minute: Uint16Field = Uint16Field("sched_2_ac_mode_minute", 415, 1, Mode.RW, units="Minute", description="Start Minute for AC Input Mode schedule 2") - self.sched_3_ac_mode: EnumInt16Field = EnumInt16Field("sched_3_ac_mode", 416, 1, Mode.RW, options=Enum("sched_3_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.sched_3_ac_mode: EnumInt16Field = EnumInt16Field("sched_3_ac_mode", 416, 1, Mode.RW, enum=Enum("sched_3_ac_mode", [('Backup', 4), ('Disable', -1), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Scheduled Input Mode: -1=Disable, 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") self.sched_3_ac_mode_hour: Uint16Field = Uint16Field("sched_3_ac_mode_hour", 417, 1, Mode.RW, units="Hour", description="Start Hour for AC Input Mode schedule 3") self.sched_3_ac_mode_minute: Uint16Field = Uint16Field("sched_3_ac_mode_minute", 418, 1, Mode.RW, units="Minute", description="Start Minute for AC Input Mode schedule 3") - self.auto_reboot: EnumUint16Field = EnumUint16Field("auto_reboot", 419, 1, Mode.RW, options=Enum("auto_reboot", [('Disable', 0), ('Enable', 1)]), description="OPTICS auto reboot every 24 hours 0=Disable, 1=Enable") + self.auto_reboot: EnumUint16Field = EnumUint16Field("auto_reboot", 419, 1, Mode.RW, enum=Enum("auto_reboot", [('Disable', 0), ('Enable', 1)]), description="OPTICS auto reboot every 24 hours 0=Disable, 1=Enable") self.time_zone_scale_factor: Int16Field = Int16Field("time_zone_scale_factor", 420, 1, Mode.R, description="Time Zone scale factor") self.spare_reg_3: Uint16Field = Uint16Field("spare_reg_3", 421, 1, Mode.RW, description="Spare Register 3") self.spare_reg_4: Uint16Field = Uint16Field("spare_reg_4", 422, 1, Mode.RW, description="Spare Register 4") @@ -551,7 +551,7 @@ def __init__(self): self.power_scale_factor: Int16Field = Int16Field("power_scale_factor", 6, 1, Mode.R, description="DC Power Scale Factor") self.ah_scale_factor: Int16Field = Int16Field("ah_scale_factor", 7, 1, Mode.R, description="DC Amp Hours Scale Factor") self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 8, 1, Mode.R, description="DC kWH Scale Factor") - self.charger_state: EnumUint16Field = EnumUint16Field("charger_state", 13, 1, Mode.R, options=Enum("charger_state", [('Absorb', 3), ('Bulk', 2), ('EQ', 4), ('Float', 1), ('Silent', 0)]), description="0 = Silent; 1 = Float; 2 = Bulk; 3 = Absorb; 4 = EQ") + self.charger_state: EnumUint16Field = EnumUint16Field("charger_state", 13, 1, Mode.R, enum=Enum("charger_state", [('Absorb', 3), ('Bulk', 2), ('EQ', 4), ('Float', 1), ('Silent', 0)]), description="0 = Silent; 1 = Float; 2 = Bulk; 3 = Absorb; 4 = EQ") self.todays_peak_voc: Uint16Field = Uint16Field("todays_peak_voc", 18, 1, Mode.R, units="Volts", description="Highest VOC today") self.lifetime_kwh_hours: Uint16Field = Uint16Field("lifetime_kwh_hours", 21, 1, Mode.R, units="KWH", description="Lifetime Total Kwatt Hours") self.temp_scale_factor: Uint16Field = Uint16Field("temp_scale_factor", 26, 1, Mode.R, description="FM80 Extreme Temperature scale factor") @@ -589,18 +589,18 @@ def __init__(self): self.absorb_end_amps: Uint16Field = Uint16Field("absorb_end_amps", 13, 1, Mode.RW, units="Amps", description="Amperage to end Absorbing") self.eq_time_hours: Uint16Field = Uint16Field("eq_time_hours", 18, 1, Mode.RW, units="Hours", description="EQ Time Hours") self.auto_eq_days: Uint16Field = Uint16Field("auto_eq_days", 19, 1, Mode.RW, units="Days", description="Auto EQ Interval Days") - self.mppt_mode: EnumUint16Field = EnumUint16Field("mppt_mode", 20, 1, Mode.RW, options=Enum("mppt_mode", [('Auto', 0), ('U-Pick', 1)]), description="0 = Auto; 1 = U-Pick") - self.sweep_width: EnumUint16Field = EnumUint16Field("sweep_width", 21, 1, Mode.RW, options=Enum("sweep_width", [('Full', 0), ('Half', 1)]), description="0 = Full; 1 = Half") - self.sweep_max_percentage: EnumUint16Field = EnumUint16Field("sweep_max_percentage", 22, 1, Mode.RW, options=Enum("sweep_max_percentage", [('80', 0), ('85', 1), ('90', 2), ('99', 3)]), description="0 = 80; 1 = 85; 2 = 90; 3 = 99") - self.grid_tie_mode: EnumUint16Field = EnumUint16Field("grid_tie_mode", 24, 1, Mode.RW, options=Enum("grid_tie_mode", [('Grid Tie Mode disabled', 0), ('Grid Tie Mode enabled', 1)]), description="0 = Grid Tie Mode disabled; 1 = Grid Tie Mode enabled") - self.temp_comp_mode: EnumUint16Field = EnumUint16Field("temp_comp_mode", 25, 1, Mode.RW, options=Enum("temp_comp_mode", [('User Limited', 1), ('Wide', 0)]), description="0 = Wide; 1 = User Limited") + self.mppt_mode: EnumUint16Field = EnumUint16Field("mppt_mode", 20, 1, Mode.RW, enum=Enum("mppt_mode", [('Auto', 0), ('U-Pick', 1)]), description="0 = Auto; 1 = U-Pick") + self.sweep_width: EnumUint16Field = EnumUint16Field("sweep_width", 21, 1, Mode.RW, enum=Enum("sweep_width", [('Full', 0), ('Half', 1)]), description="0 = Full; 1 = Half") + self.sweep_max_percentage: EnumUint16Field = EnumUint16Field("sweep_max_percentage", 22, 1, Mode.RW, enum=Enum("sweep_max_percentage", [('80', 0), ('85', 1), ('90', 2), ('99', 3)]), description="0 = 80; 1 = 85; 2 = 90; 3 = 99") + self.grid_tie_mode: EnumUint16Field = EnumUint16Field("grid_tie_mode", 24, 1, Mode.RW, enum=Enum("grid_tie_mode", [('Grid Tie Mode disabled', 0), ('Grid Tie Mode enabled', 1)]), description="0 = Grid Tie Mode disabled; 1 = Grid Tie Mode enabled") + self.temp_comp_mode: EnumUint16Field = EnumUint16Field("temp_comp_mode", 25, 1, Mode.RW, enum=Enum("temp_comp_mode", [('User Limited', 1), ('Wide', 0)]), description="0 = Wide; 1 = User Limited") self.temp_comp_slope: Uint16Field = Uint16Field("temp_comp_slope", 28, 1, Mode.RW, units="Milli Volts", description="RTS temp compensation Slope 2-6 mV per Degree C") - self.auto_restart_mode: EnumUint16Field = EnumUint16Field("auto_restart_mode", 29, 1, Mode.RW, options=Enum("auto_restart_mode", [('Off', 0), ('Restart every 90 minutes', 1), ('Restart every 90 minutes if absorb charging or float charging', 2)]), description="0 = Off; 1 = Restart every 90 minutes; 2 = Restart every 90 minutes if absorb charging or float charging") + self.auto_restart_mode: EnumUint16Field = EnumUint16Field("auto_restart_mode", 29, 1, Mode.RW, enum=Enum("auto_restart_mode", [('Off', 0), ('Restart every 90 minutes', 1), ('Restart every 90 minutes if absorb charging or float charging', 2)]), description="0 = Off; 1 = Restart every 90 minutes; 2 = Restart every 90 minutes if absorb charging or float charging") self.wakeup_interval: Uint16Field = Uint16Field("wakeup_interval", 32, 1, Mode.RW, units="Mins", description="How often to check for Wakeup condition") - self.aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 33, 1, Mode.RW, options=Enum("aux_mode", [('Diversion: Relay', 1), ('Diversion: Solid St', 2), ('Error Output', 7), ('Float', 0), ('Low Batt Disconnect', 3), ('Night Light', 8), ('PV Trigger', 6), ('Remote', 4), ('Vent Fan', 5)]), description="0 = Float; 1 = Diversion: Relay; 2 = Diversion: Solid St; 3 = Low Batt Disconnect; 4 = Remote; 5 = Vent Fan; 6 = PV Trigger; 7 = Error Output; 8 = Night Light") - self.aux_control: EnumUint16Field = EnumUint16Field("aux_control", 34, 1, Mode.RW, options=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") - self.aux_state: EnumUint16Field = EnumUint16Field("aux_state", 35, 1, Mode.R, options=Enum("aux_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") - self.aux_polarity: EnumUint16Field = EnumUint16Field("aux_polarity", 36, 1, Mode.RW, options=Enum("aux_polarity", [('High', 1), ('Low', 0)]), description="0 = Low; 1 = High") + self.aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 33, 1, Mode.RW, enum=Enum("aux_mode", [('Diversion: Relay', 1), ('Diversion: Solid St', 2), ('Error Output', 7), ('Float', 0), ('Low Batt Disconnect', 3), ('Night Light', 8), ('PV Trigger', 6), ('Remote', 4), ('Vent Fan', 5)]), description="0 = Float; 1 = Diversion: Relay; 2 = Diversion: Solid St; 3 = Low Batt Disconnect; 4 = Remote; 5 = Vent Fan; 6 = PV Trigger; 7 = Error Output; 8 = Night Light") + self.aux_control: EnumUint16Field = EnumUint16Field("aux_control", 34, 1, Mode.RW, enum=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") + self.aux_state: EnumUint16Field = EnumUint16Field("aux_state", 35, 1, Mode.R, enum=Enum("aux_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.aux_polarity: EnumUint16Field = EnumUint16Field("aux_polarity", 36, 1, Mode.RW, enum=Enum("aux_polarity", [('High', 1), ('Low', 0)]), description="0 = Low; 1 = High") self.aux_low_battery_disconnect_delay: Uint16Field = Uint16Field("aux_low_battery_disconnect_delay", 39, 1, Mode.RW, units="Secs", description="Low Battery Disconnect Delay (secs)") self.night_light_on_hours: Uint16Field = Uint16Field("night_light_on_hours", 44, 1, Mode.RW, units="Hours", description="Night Light ON Time") self.night_light_on_hyst_time: Uint16Field = Uint16Field("night_light_on_hyst_time", 45, 1, Mode.RW, units="Mins", description="Night Light ON Hyst Time") @@ -662,14 +662,14 @@ def __init__(self): self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") self.ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 7, 1, Mode.R, description="AC Frequency Scale Factor") - self.inverter_operating_mode: EnumUint16Field = EnumUint16Field("inverter_operating_mode", 13, 1, Mode.R, options=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)]), description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting") + self.inverter_operating_mode: EnumUint16Field = EnumUint16Field("inverter_operating_mode", 13, 1, Mode.R, enum=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)]), description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting") self.error_flags: Bit16Field = Bit16Field("error_flags", 14, 1, Mode.R, flags=FXErrorFlags, description="Bit field for errors. See FX_Error Table") self.warning_flags: Bit16Field = Bit16Field("warning_flags", 15, 1, Mode.R, flags=FXWarningFlags, description="Bit field for warnings See FX_Warning Table") - self.aux_output_state: EnumUint16Field = EnumUint16Field("aux_output_state", 18, 1, Mode.R, options=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.aux_output_state: EnumUint16Field = EnumUint16Field("aux_output_state", 18, 1, Mode.R, enum=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") self.transformer_temperature: Int16Field = Int16Field("transformer_temperature", 19, 1, Mode.R, units="Degrees C", description="Transformer temp in degrees C") self.capacitor_temperature: Int16Field = Int16Field("capacitor_temperature", 20, 1, Mode.R, units="Degrees C", description="Capacitor temp in degrees C") self.fet_temperature: Int16Field = Int16Field("fet_temperature", 21, 1, Mode.R, units="Degrees C", description="FET temp in degrees C") - self.ac_input_state: EnumUint16Field = EnumUint16Field("ac_input_state", 24, 1, Mode.R, options=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)]), description="1=AC Use, 0=AC_Drop") + self.ac_input_state: EnumUint16Field = EnumUint16Field("ac_input_state", 24, 1, Mode.R, enum=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)]), description="1=AC Use, 0=AC_Drop") self.sell_status: Bit16Field = Bit16Field("sell_status", 27, 1, Mode.R, flags=FXSellStatusFlags, description="Bit field for sell status See FX_Sell_Status Table") self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 28, 1, Mode.R, description="AC kWh scale factor") self.inverter_output_current: FloatUint16Field = FloatUint16Field("inverter_output_current", 8, 1, Mode.R, units="Amps", scale_factor=self.ac_current_scale_factor, description="Inverter output current") @@ -711,22 +711,22 @@ def __init__(self): self.search_sensitivity: Uint16Field = Uint16Field("search_sensitivity", 18, 1, Mode.RW, description="Search sensitivity") self.search_pulse_length: Uint16Field = Uint16Field("search_pulse_length", 19, 1, Mode.RW, units="Cycles", description="Search pulse length") self.search_pulse_spacing: Uint16Field = Uint16Field("search_pulse_spacing", 20, 1, Mode.RW, units="Cycles", description="Search pulse spacing") - self.ac_input_type: EnumUint16Field = EnumUint16Field("ac_input_type", 21, 1, Mode.RW, options=Enum("ac_input_type", [('Gen', 1), ('Grid', 0), ('Grid Zero', 2)]), description="0=Grid, 1=Gen, 2=Grid Zero") - self.input_support: EnumUint16Field = EnumUint16Field("input_support", 22, 1, Mode.RW, options=Enum("input_support", [('No (only valid if AC Input Type is Gen)', 0), ('Yes', 1)]), description="1=Yes, 0=No (only valid if AC Input Type is Gen)") - self.charger_operating_mode: EnumUint16Field = EnumUint16Field("charger_operating_mode", 26, 1, Mode.RW, options=Enum("charger_operating_mode", [('Charger Auto', 1), ('Charger Off', 0), ('Charger On', 2)]), description="0=Charger Off, 1=Charger Auto, 2=Charger On") + self.ac_input_type: EnumUint16Field = EnumUint16Field("ac_input_type", 21, 1, Mode.RW, enum=Enum("ac_input_type", [('Gen', 1), ('Grid', 0), ('Grid Zero', 2)]), description="0=Grid, 1=Gen, 2=Grid Zero") + self.input_support: EnumUint16Field = EnumUint16Field("input_support", 22, 1, Mode.RW, enum=Enum("input_support", [('No (only valid if AC Input Type is Gen)', 0), ('Yes', 1)]), description="1=Yes, 0=No (only valid if AC Input Type is Gen)") + self.charger_operating_mode: EnumUint16Field = EnumUint16Field("charger_operating_mode", 26, 1, Mode.RW, enum=Enum("charger_operating_mode", [('Charger Auto', 1), ('Charger Off', 0), ('Charger On', 2)]), description="0=Charger Off, 1=Charger Auto, 2=Charger On") self.grid_transfer_delay: Uint16Field = Uint16Field("grid_transfer_delay", 29, 1, Mode.RW, units="Minutes", description="Grid Input AC connect delay") self.gen_transfer_delay: Uint16Field = Uint16Field("gen_transfer_delay", 32, 1, Mode.RW, units="Cycles", description="Gen Input AC transfer delay") - self.aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 37, 1, Mode.RW, options=Enum("aux_mode", [('AC Drop', 8), ('Cool Fan', 5), ('Divert AC', 7), ('Divert DC', 6), ('Fault', 3), ('Gen Alert', 2), ('Load Shed', 1), ('Remote', 0), ('Vent Fan', 4)]), description="0=Remote, 1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=Divert DC, 7=Divert AC, 8=AC Drop") - self.aux_control: EnumUint16Field = EnumUint16Field("aux_control", 38, 1, Mode.RW, options=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") + self.aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 37, 1, Mode.RW, enum=Enum("aux_mode", [('AC Drop', 8), ('Cool Fan', 5), ('Divert AC', 7), ('Divert DC', 6), ('Fault', 3), ('Gen Alert', 2), ('Load Shed', 1), ('Remote', 0), ('Vent Fan', 4)]), description="0=Remote, 1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=Divert DC, 7=Divert AC, 8=AC Drop") + self.aux_control: EnumUint16Field = EnumUint16Field("aux_control", 38, 1, Mode.RW, enum=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") self.aux_gen_alert_on_delay: Uint16Field = Uint16Field("aux_gen_alert_on_delay", 41, 1, Mode.RW, units="Minutes", description="Gen Alert On delay minutes") self.aux_gen_alert_off_delay: Uint16Field = Uint16Field("aux_gen_alert_off_delay", 43, 1, Mode.RW, units="Minutes", description="Gen Alert Off delay minutes") self.aux_vent_fan_off_period: Uint16Field = Uint16Field("aux_vent_fan_off_period", 45, 1, Mode.RW, units="Minutes", description="Van Fan Off delay minutes") self.aux_divert_off_delay: Uint16Field = Uint16Field("aux_divert_off_delay", 47, 1, Mode.RW, units="Minutes", description="Divert Off delay minutes") - self.stacking_mode: EnumUint16Field = EnumUint16Field("stacking_mode", 48, 1, Mode.RW, options=Enum("stacking_mode", [('1-2phase Master', 0), ('3phase Classic B', 17), ('3phase Classic C', 18), ('3phase Master', 4), ('3phase OB Slave A', 14), ('3phase OB Slave B', 15), ('3phase OB Slave C', 16), ('3phase Slave', 5), ('CLASSIC_SLAVE_11', 11), ('Classic Slave', 1), ('Independent', 19), ('Master', 10), ('OB Slave L1', 2), ('OB Slave L2', 3), ('OB_SLAVE_L1_12', 12), ('OB_SLAVE_L2_13', 13)]), description="0=1-2phase Master, 1=Classic Slave, 2=OB Slave L1, 3=OB Slave L2, 4=3phase Master, 5=3phase Slave,10=Master, 11=Classic Slave, 12=OB Slave L1, 13=OB Slave L2, 14=3phase OB Slave A, 15=3phase OB Slave B, 16=3phase OB Slave C, 17=3phase Classic B, 18=3phase Classic C, 19=Independent") + self.stacking_mode: EnumUint16Field = EnumUint16Field("stacking_mode", 48, 1, Mode.RW, enum=Enum("stacking_mode", [('1-2phase Master', 0), ('3phase Classic B', 17), ('3phase Classic C', 18), ('3phase Master', 4), ('3phase OB Slave A', 14), ('3phase OB Slave B', 15), ('3phase OB Slave C', 16), ('3phase Slave', 5), ('CLASSIC_SLAVE_11', 11), ('Classic Slave', 1), ('Independent', 19), ('Master', 10), ('OB Slave L1', 2), ('OB Slave L2', 3), ('OB_SLAVE_L1_12', 12), ('OB_SLAVE_L2_13', 13)]), description="0=1-2phase Master, 1=Classic Slave, 2=OB Slave L1, 3=OB Slave L2, 4=3phase Master, 5=3phase Slave,10=Master, 11=Classic Slave, 12=OB Slave L1, 13=OB Slave L2, 14=3phase OB Slave A, 15=3phase OB Slave B, 16=3phase OB Slave C, 17=3phase Classic B, 18=3phase Classic C, 19=Independent") self.master_power_save_level: Uint16Field = Uint16Field("master_power_save_level", 49, 1, Mode.RW, description="Master inverter power save level") self.slave_power_save_level: Uint16Field = Uint16Field("slave_power_save_level", 50, 1, Mode.RW, description="Slave inverter power save level") - self.grid_tie_window: EnumUint16Field = EnumUint16Field("grid_tie_window", 52, 1, Mode.RW, options=Enum("grid_tie_window", [('IEEE', 0), ('User', 1)]), description="0=IEEE, 1=User") - self.grid_tie_enable: EnumUint16Field = EnumUint16Field("grid_tie_enable", 53, 1, Mode.RW, options=Enum("grid_tie_enable", [('No', 0), ('Yes', 1)]), description="1=Yes, 0=No") + self.grid_tie_window: EnumUint16Field = EnumUint16Field("grid_tie_window", 52, 1, Mode.RW, enum=Enum("grid_tie_window", [('IEEE', 0), ('User', 1)]), description="0=IEEE, 1=User") + self.grid_tie_enable: EnumUint16Field = EnumUint16Field("grid_tie_enable", 53, 1, Mode.RW, enum=Enum("grid_tie_enable", [('No', 0), ('Yes', 1)]), description="1=Yes, 0=No") self.ac_input_voltage_calibrate_factor: Int16Field = Int16Field("ac_input_voltage_calibrate_factor", 54, 1, Mode.RW, units="Volts AC", description="AC input voltage calibration factor") self.ac_output_voltage_calibrate_factor: Int16Field = Int16Field("ac_output_voltage_calibrate_factor", 55, 1, Mode.RW, units="Volts AC", description="AC output voltage calibration factor") self.serial_number: StringField = StringField("serial_number", 57, 9, Mode.R, description="Device serial number") @@ -768,11 +768,11 @@ def __init__(self): self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") self.ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 7, 1, Mode.R, description="AC Frequency Scale Factor") - self.inverter_operating_mode: EnumInt16Field = EnumInt16Field("inverter_operating_mode", 22, 1, Mode.R, options=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)]), description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting") + self.inverter_operating_mode: EnumInt16Field = EnumInt16Field("inverter_operating_mode", 22, 1, Mode.R, enum=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)]), description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting") self.error_flags: Bit16Field = Bit16Field("error_flags", 23, 1, Mode.R, flags=GSSplitErrorFlags, description="Bit field for errors. See GS_Error table") self.warning_flags: Bit16Field = Bit16Field("warning_flags", 24, 1, Mode.R, flags=GSSplitWarningFlags, description="Bit field for warnings See GS_Warning table") - self.aux_output_state: EnumInt16Field = EnumInt16Field("aux_output_state", 27, 1, Mode.R, options=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") - self.aux_relay_output_state: EnumInt16Field = EnumInt16Field("aux_relay_output_state", 28, 1, Mode.R, options=Enum("aux_relay_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.aux_output_state: EnumInt16Field = EnumInt16Field("aux_output_state", 27, 1, Mode.R, enum=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.aux_relay_output_state: EnumInt16Field = EnumInt16Field("aux_relay_output_state", 28, 1, Mode.R, enum=Enum("aux_relay_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") self.l_module_transformer_temperature: Int16Field = Int16Field("l_module_transformer_temperature", 29, 1, Mode.R, units="Degrees C", description="Left module transformer temp in degrees C") self.l_module_capacitor_temperature: Int16Field = Int16Field("l_module_capacitor_temperature", 30, 1, Mode.R, units="Degrees C", description="Left module capacitor temp in degrees C") self.l_module_fet_temperature: Int16Field = Int16Field("l_module_fet_temperature", 31, 1, Mode.R, units="Degrees C", description="Left module FET temp in degrees C") @@ -780,8 +780,8 @@ def __init__(self): self.r_module_capacitor_temperature: Int16Field = Int16Field("r_module_capacitor_temperature", 33, 1, Mode.R, units="Degrees C", description="Right module capacitor temp in degrees C") self.r_module_fet_temperature: Int16Field = Int16Field("r_module_fet_temperature", 34, 1, Mode.R, units="Degrees C", description="Right module FET temp in degrees C") self.battery_temperature: Int16Field = Int16Field("battery_temperature", 35, 1, Mode.R, units="Degrees C", description="Battery temp in degrees C") - self.ac_input_selection: EnumInt16Field = EnumInt16Field("ac_input_selection", 36, 1, Mode.R, options=Enum("ac_input_selection", [('Gen', 1), ('Grid', 0)]), description="0=Grid, 1=Gen") - self.ac_input_state: EnumInt16Field = EnumInt16Field("ac_input_state", 39, 1, Mode.R, options=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)]), description="1=AC Use, 0=AC_Drop") + self.ac_input_selection: EnumInt16Field = EnumInt16Field("ac_input_selection", 36, 1, Mode.R, enum=Enum("ac_input_selection", [('Gen', 1), ('Grid', 0)]), description="0=Grid, 1=Gen") + self.ac_input_state: EnumInt16Field = EnumInt16Field("ac_input_state", 39, 1, Mode.R, enum=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)]), description="1=AC Use, 0=AC_Drop") self.sell_status: Bit16Field = Bit16Field("sell_status", 42, 1, Mode.R, flags=GSSplitSellStatusFlags, description="Bit field for sell status See GS_Sell_Status table") self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 43, 1, Mode.R, description="AC kWh scale factor") self.gt_number: Uint16Field = Uint16Field("gt_number", 61, 1, Mode.R, description="GT Number sent from Inverter to Charge Controller") @@ -840,31 +840,31 @@ def __init__(self): self.search_sensitivity: Uint16Field = Uint16Field("search_sensitivity", 18, 1, Mode.RW, description="Search sensitivity") self.search_pulse_length: Uint16Field = Uint16Field("search_pulse_length", 19, 1, Mode.RW, units="Cycles", description="Search pulse length") self.search_pulse_spacing: Uint16Field = Uint16Field("search_pulse_spacing", 20, 1, Mode.RW, units="Cycles", description="Search pulse spacing") - self.ac_input_select_priority: EnumUint16Field = EnumUint16Field("ac_input_select_priority", 21, 1, Mode.RW, options=Enum("ac_input_select_priority", [('Gen', 1), ('Grid', 0)]), description="0=Grid, 1=Gen") - self.charger_operating_mode: EnumUint16Field = EnumUint16Field("charger_operating_mode", 25, 1, Mode.RW, options=Enum("charger_operating_mode", [('All Inverter Charging Disabled', 0), ('Bulk and Float Charging Enabled', 1)]), description="0=All Inverter Charging Disabled, 1=Bulk and Float Charging Enabled") - self.ac_coupled: EnumUint16Field = EnumUint16Field("ac_coupled", 26, 1, Mode.R, options=Enum("ac_coupled", [('No', 0), ('Yes', 1)]), description="0=No, 1=Yes") - self.grid_input_mode: EnumUint16Field = EnumUint16Field("grid_input_mode", 27, 1, Mode.RW, options=Enum("grid_input_mode", [('Backup', 4), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Grid Input Mode: 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.ac_input_select_priority: EnumUint16Field = EnumUint16Field("ac_input_select_priority", 21, 1, Mode.RW, enum=Enum("ac_input_select_priority", [('Gen', 1), ('Grid', 0)]), description="0=Grid, 1=Gen") + self.charger_operating_mode: EnumUint16Field = EnumUint16Field("charger_operating_mode", 25, 1, Mode.RW, enum=Enum("charger_operating_mode", [('All Inverter Charging Disabled', 0), ('Bulk and Float Charging Enabled', 1)]), description="0=All Inverter Charging Disabled, 1=Bulk and Float Charging Enabled") + self.ac_coupled: EnumUint16Field = EnumUint16Field("ac_coupled", 26, 1, Mode.R, enum=Enum("ac_coupled", [('No', 0), ('Yes', 1)]), description="0=No, 1=Yes") + self.grid_input_mode: EnumUint16Field = EnumUint16Field("grid_input_mode", 27, 1, Mode.RW, enum=Enum("grid_input_mode", [('Backup', 4), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Grid Input Mode: 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") self.grid_transfer_delay: Uint16Field = Uint16Field("grid_transfer_delay", 30, 1, Mode.RW, units="msecs", description="Grid Input AC transfer delay") - self.gen_input_mode: EnumUint16Field = EnumUint16Field("gen_input_mode", 32, 1, Mode.RW, options=Enum("gen_input_mode", [('Backup', 4), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Grid Input Mode: 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") + self.gen_input_mode: EnumUint16Field = EnumUint16Field("gen_input_mode", 32, 1, Mode.RW, enum=Enum("gen_input_mode", [('Backup', 4), ('Generator', 0), ('Grid Tied', 2), ('Grid Zero', 6), ('Mini Grid', 5), ('Support', 1), ('UPS', 3)]), description="Grid Input Mode: 0=Generator, 1=Support, 2=Grid Tied, 3=UPS, 4=Backup, 5=Mini Grid, 6=Grid Zero") self.gen_transfer_delay: Uint16Field = Uint16Field("gen_transfer_delay", 35, 1, Mode.RW, units="msecs", description="Gen Input AC transfer delay") - self.aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 40, 1, Mode.RW, options=Enum("aux_mode", [('AC Divert', 9), ('AC Source Status', 8), ('Cool Fan', 5), ('DC Divert', 6), ('Fault', 3), ('Gen Alert', 2), ('Grid Limit/IEEE', 7), ('Load Shed', 1), ('Vent Fan', 4)]), description="1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=DC Divert, 7=Grid Limit/IEEE ,8=AC Source Status,9=AC Divert") - self.aux_control: EnumUint16Field = EnumUint16Field("aux_control", 41, 1, Mode.RW, options=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") - self.aux_relay_mode: EnumUint16Field = EnumUint16Field("aux_relay_mode", 46, 1, Mode.RW, options=Enum("aux_relay_mode", [('AC Divert', 9), ('AC Source Status', 8), ('Cool Fan', 5), ('DC Divert', 6), ('Fault', 3), ('Gen Alert', 2), ('Grid Limit/IEEE', 7), ('Load Shed', 1), ('Vent Fan', 4)]), description="1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=DC Divert, 7=Grid Limit/IEEE ,8=AC Source Status,9=AC Divert") - self.aux_relay_control: EnumUint16Field = EnumUint16Field("aux_relay_control", 47, 1, Mode.RW, options=Enum("aux_relay_control", [('Auto', 2), ('Off', 0), ('On', 1)]), description="0 = Off; 1 = On; 2 = Auto") - self.stacking_mode: EnumUint16Field = EnumUint16Field("stacking_mode", 52, 1, Mode.RW, options=Enum("stacking_mode", [('B Phase Master', 17), ('C Phase Master', 18), ('Master', 10), ('Slave', 12)]), description="10=Master, 12=Slave, 17=B Phase Master, 18=C Phase Master") + self.aux_mode: EnumUint16Field = EnumUint16Field("aux_mode", 40, 1, Mode.RW, enum=Enum("aux_mode", [('AC Divert', 9), ('AC Source Status', 8), ('Cool Fan', 5), ('DC Divert', 6), ('Fault', 3), ('Gen Alert', 2), ('Grid Limit/IEEE', 7), ('Load Shed', 1), ('Vent Fan', 4)]), description="1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=DC Divert, 7=Grid Limit/IEEE ,8=AC Source Status,9=AC Divert") + self.aux_control: EnumUint16Field = EnumUint16Field("aux_control", 41, 1, Mode.RW, enum=Enum("aux_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") + self.aux_relay_mode: EnumUint16Field = EnumUint16Field("aux_relay_mode", 46, 1, Mode.RW, enum=Enum("aux_relay_mode", [('AC Divert', 9), ('AC Source Status', 8), ('Cool Fan', 5), ('DC Divert', 6), ('Fault', 3), ('Gen Alert', 2), ('Grid Limit/IEEE', 7), ('Load Shed', 1), ('Vent Fan', 4)]), description="1=Load Shed, 2=Gen Alert, 3=Fault, 4=Vent Fan, 5=Cool Fan, 6=DC Divert, 7=Grid Limit/IEEE ,8=AC Source Status,9=AC Divert") + self.aux_relay_control: EnumUint16Field = EnumUint16Field("aux_relay_control", 47, 1, Mode.RW, enum=Enum("aux_relay_control", [('Auto', 2), ('Off', 0), ('On', 1)]), description="0 = Off; 1 = On; 2 = Auto") + self.stacking_mode: EnumUint16Field = EnumUint16Field("stacking_mode", 52, 1, Mode.RW, enum=Enum("stacking_mode", [('B Phase Master', 17), ('C Phase Master', 18), ('Master', 10), ('Slave', 12)]), description="10=Master, 12=Slave, 17=B Phase Master, 18=C Phase Master") self.master_power_save_level: Uint16Field = Uint16Field("master_power_save_level", 53, 1, Mode.RW, description="Master inverter power save level") self.slave_power_save_level: Uint16Field = Uint16Field("slave_power_save_level", 54, 1, Mode.RW, description="Slave inverter power save level") - self.grid_tie_window: EnumUint16Field = EnumUint16Field("grid_tie_window", 56, 1, Mode.RW, options=Enum("grid_tie_window", [('IEEE', 0), ('User (GS8048 Only)', 1)]), description="0=IEEE, 1=User (GS8048 Only)") - self.grid_tie_enable: EnumUint16Field = EnumUint16Field("grid_tie_enable", 57, 1, Mode.RW, options=Enum("grid_tie_enable", [('No', 0), ('Yes', 1)]), description="1=Yes, 0=No") + self.grid_tie_window: EnumUint16Field = EnumUint16Field("grid_tie_window", 56, 1, Mode.RW, enum=Enum("grid_tie_window", [('IEEE', 0), ('User (GS8048 Only)', 1)]), description="0=IEEE, 1=User (GS8048 Only)") + self.grid_tie_enable: EnumUint16Field = EnumUint16Field("grid_tie_enable", 57, 1, Mode.RW, enum=Enum("grid_tie_enable", [('No', 0), ('Yes', 1)]), description="1=Yes, 0=No") self.grid_ac_input_voltage_calibrate_factor: Int16Field = Int16Field("grid_ac_input_voltage_calibrate_factor", 58, 1, Mode.RW, units="Volts AC", description="Grid AC input voltage calibration factor") self.gen_ac_input_voltage_calibrate_factor: Int16Field = Int16Field("gen_ac_input_voltage_calibrate_factor", 59, 1, Mode.RW, units="Volts AC", description="Gen AC input voltage calibration factor") self.ac_output_voltage_calibrate_factor: Int16Field = Int16Field("ac_output_voltage_calibrate_factor", 60, 1, Mode.RW, units="Volts AC", description="AC output voltage calibration factor") self.mini_grid_lbx_delay: Uint16Field = Uint16Field("mini_grid_lbx_delay", 64, 1, Mode.RW, units="Hours", description="Mini Grid LBX reconnect to Grid Delay Time") self.serial_number: StringField = StringField("serial_number", 67, 9, Mode.R, description="Device serial number") self.model_number: StringField = StringField("model_number", 76, 9, Mode.R, description="Device model") - self.module_control: EnumUint16Field = EnumUint16Field("module_control", 85, 1, Mode.RW, options=Enum("module_control", [('Auto', 0), ('Both', 3), ('Left', 1), ('Right', 2)]), description="0=Auto, 1=Left, 2=Right, 3=Both") - self.model_select: EnumUint16Field = EnumUint16Field("model_select", 86, 1, Mode.RW, options=Enum("model_select", [('Full', 0), ('Half', 1)]), description="0=Full, 1=Half") - self.ee_write_enable: EnumUint16Field = EnumUint16Field("ee_write_enable", 91, 1, Mode.RW, options=Enum("ee_write_enable", [('Disable', 0), ('Enable', 1)]), description="EEPROM Write Enable 1= Enable, 0= Disable") + self.module_control: EnumUint16Field = EnumUint16Field("module_control", 85, 1, Mode.RW, enum=Enum("module_control", [('Auto', 0), ('Both', 3), ('Left', 1), ('Right', 2)]), description="0=Auto, 1=Left, 2=Right, 3=Both") + self.model_select: EnumUint16Field = EnumUint16Field("model_select", 86, 1, Mode.RW, enum=Enum("model_select", [('Full', 0), ('Half', 1)]), description="0=Full, 1=Half") + self.ee_write_enable: EnumUint16Field = EnumUint16Field("ee_write_enable", 91, 1, Mode.RW, enum=Enum("ee_write_enable", [('Disable', 0), ('Enable', 1)]), description="EEPROM Write Enable 1= Enable, 0= Disable") self.absorb_volts: FloatUint16Field = FloatUint16Field("absorb_volts", 11, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Absorb Voltage Target") self.absorb_time_hours: FloatUint16Field = FloatUint16Field("absorb_time_hours", 12, 1, Mode.RW, units="Hours", scale_factor=self.time_scale_factor, description="Absorb Time Hours") self.float_volts: FloatUint16Field = FloatUint16Field("float_volts", 13, 1, Mode.RW, units="DC Volts", scale_factor=self.dc_voltage_scale_factor, description="Float Voltage Target") @@ -914,11 +914,11 @@ def __init__(self): self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 5, 1, Mode.R, description="AC Current Scale Factor") self.ac_voltage_scale_factor: Int16Field = Int16Field("ac_voltage_scale_factor", 6, 1, Mode.R, description="AC Voltage Scale Factor") self.ac_frequency_scale_factor: Int16Field = Int16Field("ac_frequency_scale_factor", 7, 1, Mode.R, description="AC Frequency Scale Factor") - self.inverter_operating_mode: EnumUint16Field = EnumUint16Field("inverter_operating_mode", 15, 1, Mode.R, options=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)]), description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting") + self.inverter_operating_mode: EnumUint16Field = EnumUint16Field("inverter_operating_mode", 15, 1, Mode.R, enum=Enum("inverter_operating_mode", [('Charger Off', 7), ('Charging', 3), ('EQ', 6), ('Float', 5), ('Inverting', 2), ('Off', 0), ('Offsetting', 14), ('Pass through', 10), ('Searching', 1), ('Selling', 9), ('Silent', 4), ('Support', 8)]), description="0=Off, 1=Searching, 2=Inverting, 3=Charging, 4=Silent, 5=Float, 6=EQ, 7=Charger Off, 8=Support, 9=Selling, 10=Pass through, 14=Offsetting") self.error_flags: Bit16Field = Bit16Field("error_flags", 16, 1, Mode.R, flags=GSSingleErrorFlags, description="Bit field for errors. See GS_Error Table") self.warning_flags: Bit16Field = Bit16Field("warning_flags", 17, 1, Mode.R, flags=GSSingleWarningFlags, description="Bit field for warnings See GS_Warning Table") - self.aux_output_state: EnumUint16Field = EnumUint16Field("aux_output_state", 20, 1, Mode.R, options=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") - self.aux_relay_output_state: EnumUint16Field = EnumUint16Field("aux_relay_output_state", 21, 1, Mode.R, options=Enum("aux_relay_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.aux_output_state: EnumUint16Field = EnumUint16Field("aux_output_state", 20, 1, Mode.R, enum=Enum("aux_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") + self.aux_relay_output_state: EnumUint16Field = EnumUint16Field("aux_relay_output_state", 21, 1, Mode.R, enum=Enum("aux_relay_output_state", [('Disabled', 0), ('Enabled', 1)]), description="0 = Disabled; 1 = Enabled") self.l_module_transformer_temperature: Int16Field = Int16Field("l_module_transformer_temperature", 22, 1, Mode.R, units="Degrees C", description="Left module transformer temp in degrees C") self.l_module_capacitor_temperature: Int16Field = Int16Field("l_module_capacitor_temperature", 23, 1, Mode.R, units="Degrees C", description="Left module capacitor temp in degrees C") self.l_module_fet_temperature: Int16Field = Int16Field("l_module_fet_temperature", 24, 1, Mode.R, units="Degrees C", description="Left module FET temp in degrees C") @@ -926,8 +926,8 @@ def __init__(self): self.r_module_capacitor_temperature: Int16Field = Int16Field("r_module_capacitor_temperature", 26, 1, Mode.R, units="Degrees C", description="Right module capacitor temp in degrees C") self.r_module_fet_temperature: Int16Field = Int16Field("r_module_fet_temperature", 27, 1, Mode.R, units="Degrees C", description="Right module FET temp in degrees C") self.battery_temperature: Int16Field = Int16Field("battery_temperature", 28, 1, Mode.R, units="Degrees C", description="Battery temp in degrees C") - self.ac_input_selection: EnumUint16Field = EnumUint16Field("ac_input_selection", 29, 1, Mode.R, options=Enum("ac_input_selection", [('Gen', 1), ('Grid', 0)]), description="0=Grid, 1=Gen") - self.ac_input_state: EnumUint16Field = EnumUint16Field("ac_input_state", 32, 1, Mode.R, options=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)]), description="1=AC Use, 0=AC_Drop") + self.ac_input_selection: EnumUint16Field = EnumUint16Field("ac_input_selection", 29, 1, Mode.R, enum=Enum("ac_input_selection", [('Gen', 1), ('Grid', 0)]), description="0=Grid, 1=Gen") + self.ac_input_state: EnumUint16Field = EnumUint16Field("ac_input_state", 32, 1, Mode.R, enum=Enum("ac_input_state", [('AC Use', 1), ('AC_Drop', 0)]), description="1=AC Use, 0=AC_Drop") self.sell_status: Bit16Field = Bit16Field("sell_status", 35, 1, Mode.R, flags=GSSingleSellStatusFlags, description="Bit field for sell status See GS_Sell_Status Table") self.kwh_scale_factor: Int16Field = Int16Field("kwh_scale_factor", 36, 1, Mode.R, description="AC kWh scale factor") self.gt_number: Uint16Field = Uint16Field("gt_number", 49, 1, Mode.R, description="GT Number sent from Inverter to Charge Controller") @@ -1054,11 +1054,11 @@ def __init__(self): self.battery_capacity: Uint16Field = Uint16Field("battery_capacity", 10, 1, Mode.RW, units="AH", description="Battery AH capacity") self.charged_time: Uint16Field = Uint16Field("charged_time", 12, 1, Mode.RW, units="Minutes", description="Battery Charged Time Minutes") self.charge_factor: Uint16Field = Uint16Field("charge_factor", 14, 1, Mode.RW, units="Percent", description="Battery Charge Factor") - self.shunt_a_enabled: EnumUint16Field = EnumUint16Field("shunt_a_enabled", 15, 1, Mode.RW, options=Enum("shunt_a_enabled", [('Disabled', 1), ('Enabled', 0)]), description="0=Enabled, 1=Disabled") - self.shunt_b_enabled: EnumUint16Field = EnumUint16Field("shunt_b_enabled", 16, 1, Mode.RW, options=Enum("shunt_b_enabled", [('Disabled', 1), ('Enabled', 0)]), description="0=Enabled, 1=Disabled") - self.shunt_c_enabled: EnumUint16Field = EnumUint16Field("shunt_c_enabled", 17, 1, Mode.RW, options=Enum("shunt_c_enabled", [('Disabled', 1), ('Enabled', 0)]), description="0=Enabled, 1=Disabled") - self.relay_control: EnumUint16Field = EnumUint16Field("relay_control", 18, 1, Mode.RW, options=Enum("relay_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") - self.relay_invert_logic: EnumUint16Field = EnumUint16Field("relay_invert_logic", 19, 1, Mode.RW, options=Enum("relay_invert_logic", [('Invert Logic', 0), ('Normal', 1)]), description="0=Invert Logic,1=Normal") + self.shunt_a_enabled: EnumUint16Field = EnumUint16Field("shunt_a_enabled", 15, 1, Mode.RW, enum=Enum("shunt_a_enabled", [('Disabled', 1), ('Enabled', 0)]), description="0=Enabled, 1=Disabled") + self.shunt_b_enabled: EnumUint16Field = EnumUint16Field("shunt_b_enabled", 16, 1, Mode.RW, enum=Enum("shunt_b_enabled", [('Disabled', 1), ('Enabled', 0)]), description="0=Enabled, 1=Disabled") + self.shunt_c_enabled: EnumUint16Field = EnumUint16Field("shunt_c_enabled", 17, 1, Mode.RW, enum=Enum("shunt_c_enabled", [('Disabled', 1), ('Enabled', 0)]), description="0=Enabled, 1=Disabled") + self.relay_control: EnumUint16Field = EnumUint16Field("relay_control", 18, 1, Mode.RW, enum=Enum("relay_control", [('Auto', 1), ('Off', 0), ('On', 2)]), description="0 = Off; 1 = Auto; 2 = On") + self.relay_invert_logic: EnumUint16Field = EnumUint16Field("relay_invert_logic", 19, 1, Mode.RW, enum=Enum("relay_invert_logic", [('Invert Logic', 0), ('Normal', 1)]), description="0=Invert Logic,1=Normal") self.relay_soc_high: Uint16Field = Uint16Field("relay_soc_high", 22, 1, Mode.RW, units="Percent", description="Relay high SOC enable") self.relay_soc_low: Uint16Field = Uint16Field("relay_soc_low", 23, 1, Mode.RW, units="Percent", description="Relay low SOC enable") self.relay_high_enable_delay: Uint16Field = Uint16Field("relay_high_enable_delay", 24, 1, Mode.RW, units="Minutes", description="Relay High Enable Delay") @@ -1090,14 +1090,14 @@ def __init__(self): self.dc_voltage_scale_factor: Int16Field = Int16Field("dc_voltage_scale_factor", 3, 1, Mode.R, description="DC Voltage Scale Factor") self.ac_current_scale_factor: Int16Field = Int16Field("ac_current_scale_factor", 4, 1, Mode.R, description="AC Current Scale Factor") self.time_scale_factor: Int16Field = Int16Field("time_scale_factor", 5, 1, Mode.R, description="Charge Time Scale Factor") - self.bulk_charge_enable_disable: EnumUint16Field = EnumUint16Field("bulk_charge_enable_disable", 6, 1, Mode.W, options=Enum("bulk_charge_enable_disable", [('Start Bulk', 1), ('Start EQ Charge', 3), ('Stop Bulk', 2), ('Stop EQ Charge', 4)]), description="1=Start Bulk, 2=Stop Bulk, 3=Start EQ Charge, 4= Stop EQ Charge") - self.inverter_ac_drop_use: EnumUint16Field = EnumUint16Field("inverter_ac_drop_use", 7, 1, Mode.W, options=Enum("inverter_ac_drop_use", [('Drop', 2), ('Use', 1)]), description="1=Use, 2=Drop") - self.set_inverter_mode: EnumUint16Field = EnumUint16Field("set_inverter_mode", 8, 1, Mode.W, options=Enum("set_inverter_mode", [('Off', 1), ('On', 3), ('Search', 2)]), description="1=Off, 2=Search, 3=On") - self.grid_tie_mode: EnumUint16Field = EnumUint16Field("grid_tie_mode", 9, 1, Mode.W, options=Enum("grid_tie_mode", [('Disable', 2), ('Enable', 1)]), description="1=Enable, 2=Disable") - self.set_inverter_charger_mode: EnumUint16Field = EnumUint16Field("set_inverter_charger_mode", 10, 1, Mode.W, options=Enum("set_inverter_charger_mode", [('Auto', 2), ('Off', 1), ('On', 3)]), description="1=Off, 2=Auto, 3=On") + self.bulk_charge_enable_disable: EnumUint16Field = EnumUint16Field("bulk_charge_enable_disable", 6, 1, Mode.W, enum=Enum("bulk_charge_enable_disable", [('Start Bulk', 1), ('Start EQ Charge', 3), ('Stop Bulk', 2), ('Stop EQ Charge', 4)]), description="1=Start Bulk, 2=Stop Bulk, 3=Start EQ Charge, 4= Stop EQ Charge") + self.inverter_ac_drop_use: EnumUint16Field = EnumUint16Field("inverter_ac_drop_use", 7, 1, Mode.W, enum=Enum("inverter_ac_drop_use", [('Drop', 2), ('Use', 1)]), description="1=Use, 2=Drop") + self.set_inverter_mode: EnumUint16Field = EnumUint16Field("set_inverter_mode", 8, 1, Mode.W, enum=Enum("set_inverter_mode", [('Off', 1), ('On', 3), ('Search', 2)]), description="1=Off, 2=Search, 3=On") + self.grid_tie_mode: EnumUint16Field = EnumUint16Field("grid_tie_mode", 9, 1, Mode.W, enum=Enum("grid_tie_mode", [('Disable', 2), ('Enable', 1)]), description="1=Enable, 2=Disable") + self.set_inverter_charger_mode: EnumUint16Field = EnumUint16Field("set_inverter_charger_mode", 10, 1, Mode.W, enum=Enum("set_inverter_charger_mode", [('Auto', 2), ('Off', 1), ('On', 3)]), description="1=Off, 2=Auto, 3=On") self.control_status: Bit16Field = Bit16Field("control_status", 11, 1, Mode.R, flags=OBControlStatusFlags, description="Bit field for status. See OB_Control_Status Table") - self.set_ags_op_mode: EnumUint16Field = EnumUint16Field("set_ags_op_mode", 21, 1, Mode.RW, options=Enum("set_ags_op_mode", [('Auto', 2), ('Off', 0), ('On', 1)]), description="AGS Operating Mode: 0=Off, 1=On, 2=Auto") - self.ags_operational_state: EnumUint16Field = EnumUint16Field("ags_operational_state", 22, 1, Mode.R, options=Enum("ags_operational_state", [(' GEN_AWAITING_AC', 5), (' GEN_COOLDOWN', 4), (' GEN_RUNNING', 2), (' GEN_STARTING', 1), (' GEN_WARMUP', 3), ('GEN_STOP', 0)]), description="GEN_STOP=0, GEN_STARTING=1, GEN_RUNNING=2, GEN_WARMUP=3, GEN_COOLDOWN=4, GEN_AWAITING_AC=5") + self.set_ags_op_mode: EnumUint16Field = EnumUint16Field("set_ags_op_mode", 21, 1, Mode.RW, enum=Enum("set_ags_op_mode", [('Auto', 2), ('Off', 0), ('On', 1)]), description="AGS Operating Mode: 0=Off, 1=On, 2=Auto") + self.ags_operational_state: EnumUint16Field = EnumUint16Field("ags_operational_state", 22, 1, Mode.R, enum=Enum("ags_operational_state", [(' GEN_AWAITING_AC', 5), (' GEN_COOLDOWN', 4), (' GEN_RUNNING', 2), (' GEN_STARTING', 1), (' GEN_WARMUP', 3), ('GEN_STOP', 0)]), description="GEN_STOP=0, GEN_STARTING=1, GEN_RUNNING=2, GEN_WARMUP=3, GEN_COOLDOWN=4, GEN_AWAITING_AC=5") self.ags_operational_state_timer: Uint16Field = Uint16Field("ags_operational_state_timer", 23, 1, Mode.R, units="Seconds", description="Number of seconds that OB_AGS_Operational_State has been in current state. If Operational State is 0 then timer=0") self.gen_last_run_start_time_gmt: Uint32Field = Uint32Field("gen_last_run_start_time_gmt", 24, 2, Mode.R, units="Seconds", description="Generator last start time in GMT seconds") self.gen_last_start_run_duration: Uint32Field = Uint32Field("gen_last_start_run_duration", 26, 2, Mode.R, units="Seconds", description="Last Generator Start Run Duration Seconds") diff --git a/mate3/sunspec/scripts/code_generator.py b/mate3/sunspec/scripts/code_generator.py index 06aff9a..67e354c 100644 --- a/mate3/sunspec/scripts/code_generator.py +++ b/mate3/sunspec/scripts/code_generator.py @@ -222,7 +222,7 @@ def _generate_enumerated_field(self, row): unique_options[v] = k enum = f'Enum("{row.python_name}", {str(list(sorted(unique_options.items())))})' - yield f"options={enum}" + yield f"enum={enum}" def _generate_field(self, row, class_name, bitfields): """Generate a single Field definition for a table Model class""" diff --git a/mate3/tests/known_systems/chinezbrun/expected.json b/mate3/tests/known_systems/chinezbrun/expected.json index d5fcde8..db509d2 100644 --- a/mate3/tests/known_systems/chinezbrun/expected.json +++ b/mate3/tests/known_systems/chinezbrun/expected.json @@ -1,71 +1,58 @@ [ { - "name": "Mate3DeviceValues", + "name": "Mate3Device", "address": 40069, "values": { "did": { "implemented": true, - "scale_factor": null, "address": 40069, "registers": [ 64110 ], - "raw_value": 64110, "value": 64110 }, "length": { "implemented": true, - "scale_factor": null, "address": 40070, "registers": [ 420 ], - "raw_value": 420, "value": 420 }, "major_firmware_number": { "implemented": true, - "scale_factor": null, "address": 40071, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "mid_firmware_number": { "implemented": true, - "scale_factor": null, "address": 40072, "registers": [ 4 ], - "raw_value": 4, "value": 4 }, "minor_firmware_number": { "implemented": true, - "scale_factor": null, "address": 40073, "registers": [ 2 ], - "raw_value": 2, "value": 2 }, "encryption_key": { "implemented": true, - "scale_factor": null, "address": 40074, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "mac_address": { "implemented": true, - "scale_factor": null, "address": 40075, "registers": [ 12336, @@ -76,87 +63,71 @@ 17970, 17664 ], - "raw_value": "0090EA-E09F2E", - "value": "0090EA-E09F2E" + "value": "b'0090EA-E09F2E'" }, "enable_dhcp": { "implemented": true, - "scale_factor": null, "address": 40090, "registers": [ 1 ], - "raw_value": "", "value": "" }, "tcpip_address": { "implemented": true, - "scale_factor": null, "address": 40091, "registers": [ 49320, 150 ], - "raw_value": "192.168.0.150", "value": "192.168.0.150" }, "tcpip_gateway_msw": { "implemented": true, - "scale_factor": null, "address": 40093, "registers": [ 49320, 1 ], - "raw_value": "192.168.0.1", "value": "192.168.0.1" }, "tcpip_netmask_msw": { "implemented": true, - "scale_factor": null, "address": 40095, "registers": [ 65535, 65280 ], - "raw_value": "255.255.255.0", "value": "255.255.255.0" }, "tcpip_dns_1_msw": { "implemented": true, - "scale_factor": null, "address": 40097, "registers": [ 49320, 1 ], - "raw_value": "192.168.0.1", "value": "192.168.0.1" }, "tcpip_dns_2_msw": { "implemented": false, - "scale_factor": null, "address": 40099, "registers": [ 0, 0 ], - "raw_value": null, "value": null }, "modbus_port": { "implemented": true, - "scale_factor": null, "address": 40101, "registers": [ 502 ], - "raw_value": 502, "value": 502 }, "smtp_server_name": { "implemented": false, - "scale_factor": null, "address": 40102, "registers": [ 0, @@ -180,12 +151,10 @@ 0, 0 ], - "raw_value": null, "value": null }, "smtp_account_name": { "implemented": false, - "scale_factor": null, "address": 40122, "registers": [ 0, @@ -205,22 +174,18 @@ 0, 0 ], - "raw_value": null, "value": null }, "smtp_ssl_enable": { "implemented": false, - "scale_factor": null, "address": 40138, "registers": [ 65535 ], - "raw_value": null, "value": null }, "smtp_email_user_name": { "implemented": false, - "scale_factor": null, "address": 40147, "registers": [ 0, @@ -244,32 +209,26 @@ 0, 0 ], - "raw_value": null, "value": null }, "status_email_interval": { "implemented": false, - "scale_factor": null, "address": 40167, "registers": [ 65535 ], - "raw_value": null, "value": null }, "status_email_status_time": { "implemented": false, - "scale_factor": null, "address": 40168, "registers": [ 65535 ], - "raw_value": null, "value": null }, "status_email_subject_line": { "implemented": false, - "scale_factor": null, "address": 40169, "registers": [ 0, @@ -298,12 +257,10 @@ 0, 0 ], - "raw_value": null, "value": null }, "status_email_to_address_1": { "implemented": false, - "scale_factor": null, "address": 40194, "registers": [ 0, @@ -327,12 +284,10 @@ 0, 0 ], - "raw_value": null, "value": null }, "status_email_to_address_2": { "implemented": false, - "scale_factor": null, "address": 40214, "registers": [ 0, @@ -356,22 +311,18 @@ 0, 0 ], - "raw_value": null, "value": null }, "alarm_email_enable": { "implemented": false, - "scale_factor": null, "address": 40234, "registers": [ 65535 ], - "raw_value": null, "value": null }, "system_name": { "implemented": true, - "scale_factor": null, "address": 40235, "registers": [ 20341, @@ -405,12 +356,10 @@ 0, 0 ], - "raw_value": "OutBack Power Technologies", - "value": "OutBack Power Technologies" + "value": "b'OutBack Power Technologies'" }, "alarm_email_to_address_1": { "implemented": false, - "scale_factor": null, "address": 40265, "registers": [ 0, @@ -429,12 +378,10 @@ 0, 0 ], - "raw_value": null, "value": null }, "alarm_email_to_address_2": { "implemented": false, - "scale_factor": null, "address": 40280, "registers": [ 0, @@ -458,42 +405,34 @@ 0, 0 ], - "raw_value": null, "value": null }, "sd_card_data_log_write_interval": { "implemented": true, - "scale_factor": null, "address": 40316, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "sd_card_data_log_retain_days": { "implemented": true, - "scale_factor": null, "address": 40317, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "sd_card_data_logging_mode": { "implemented": true, - "scale_factor": null, "address": 40318, "registers": [ 1 ], - "raw_value": "", "value": "" }, "time_server_name": { "implemented": true, - "scale_factor": null, "address": 40319, "registers": [ 28783, @@ -517,953 +456,659 @@ 0, 0 ], - "raw_value": "pool.ntp.org", - "value": "pool.ntp.org" + "value": "b'pool.ntp.org'" }, "enable_time_server": { "implemented": true, - "scale_factor": null, "address": 40339, "registers": [ 1 ], - "raw_value": "", "value": "" }, - "set_time_zone": { - "implemented": true, - "scale_factor": -2, - "address": 40340, - "registers": [ - 200 - ], - "raw_value": 200, - "value": 2.0 - }, "enable_float_coordination": { "implemented": true, - "scale_factor": null, "address": 40341, "registers": [ 1 ], - "raw_value": "", "value": "" }, "enable_fndc_charge_termination": { "implemented": true, - "scale_factor": null, "address": 40342, "registers": [ 1 ], - "raw_value": "", "value": "" }, "enable_fndc_grid_tie_control": { "implemented": true, - "scale_factor": null, "address": 40343, "registers": [ 0 ], - "raw_value": "", "value": "" }, "voltage_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40344, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "hour_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40345, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "ags_mode": { "implemented": true, - "scale_factor": null, "address": 40346, "registers": [ 0 ], - "raw_value": "", "value": "" }, "ags_port": { "implemented": true, - "scale_factor": null, "address": 40347, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "ags_port_type": { "implemented": false, - "scale_factor": null, "address": 40348, "registers": [ 65535 ], - "raw_value": null, "value": null }, "ags_generator_type": { "implemented": true, - "scale_factor": null, "address": 40349, "registers": [ 0 ], - "raw_value": "", "value": "" }, - "ags_dc_gen_absorb_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40350, - "registers": [ - 760 - ], - "raw_value": 760, - "value": 76.0 - }, - "ags_dc_gen_absorb_time": { - "implemented": true, - "scale_factor": -1, - "address": 40351, - "registers": [ - 10 - ], - "raw_value": 10, - "value": 1.0 - }, "ags_fault_time": { "implemented": true, - "scale_factor": null, "address": 40352, "registers": [ 17 ], - "raw_value": 17, "value": 17 }, "ags_gen_cool_down_time": { "implemented": true, - "scale_factor": null, "address": 40353, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_gen_warm_up_time": { "implemented": true, - "scale_factor": null, "address": 40354, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_generator_exercise_mode": { "implemented": true, - "scale_factor": null, "address": 40355, "registers": [ 0 ], - "raw_value": "", "value": "" }, "ags_exercise_start_hour": { "implemented": true, - "scale_factor": null, "address": 40356, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_exercise_start_minute": { "implemented": true, - "scale_factor": null, "address": 40357, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_exercise_day": { "implemented": true, - "scale_factor": null, "address": 40358, "registers": [ 0 ], - "raw_value": "", "value": "" }, "ags_exercise_period": { "implemented": true, - "scale_factor": null, "address": 40359, "registers": [ 15 ], - "raw_value": 15, "value": 15 }, "ags_exercise_interval": { "implemented": true, - "scale_factor": null, "address": 40360, "registers": [ 2 ], - "raw_value": 2, "value": 2 }, "ags_sell_mode": { "implemented": true, - "scale_factor": null, "address": 40361, "registers": [ 1 ], - "raw_value": "", "value": "" }, "ags_2_min_start_mode": { "implemented": true, - "scale_factor": null, "address": 40362, "registers": [ 0 ], - "raw_value": "", "value": "" }, - "ags_2_min_start_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40363, - "registers": [ - 440 - ], - "raw_value": 440, - "value": 44.0 - }, "ags_2_hour_start_mode": { "implemented": true, - "scale_factor": null, "address": 40364, "registers": [ 0 ], - "raw_value": "", "value": "" }, - "ags_2_hour_start_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40365, - "registers": [ - 472 - ], - "raw_value": 472, - "value": 47.2 - }, "ags_24_hour_start_mode": { "implemented": true, - "scale_factor": null, "address": 40366, "registers": [ 0 ], - "raw_value": "", "value": "" }, - "ags_24_hour_start_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40367, - "registers": [ - 488 - ], - "raw_value": 488, - "value": 48.8 - }, "ags_load_start_mode": { "implemented": true, - "scale_factor": null, "address": 40368, "registers": [ 0 ], - "raw_value": "", "value": "" }, "ags_load_start_kw": { "implemented": true, - "scale_factor": null, "address": 40369, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_load_start_delay": { "implemented": true, - "scale_factor": null, "address": 40370, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "ags_load_stop_kw": { "implemented": true, - "scale_factor": null, "address": 40371, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_load_stop_delay": { "implemented": true, - "scale_factor": null, "address": 40372, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "ags_soc_start_mode": { "implemented": true, - "scale_factor": null, "address": 40373, "registers": [ 0 ], - "raw_value": "", "value": "" }, "ags_soc_start_percentage": { "implemented": true, - "scale_factor": null, "address": 40374, "registers": [ 60 ], - "raw_value": 60, "value": 60 }, "ags_soc_stop_percentage": { "implemented": true, - "scale_factor": null, "address": 40375, "registers": [ 90 ], - "raw_value": 90, "value": 90 }, "ags_enable_full_charge_mode": { "implemented": true, - "scale_factor": null, "address": 40376, "registers": [ 0 ], - "raw_value": "", "value": "" }, "ags_full_charge_interval": { "implemented": true, - "scale_factor": null, "address": 40377, "registers": [ 14 ], - "raw_value": 14, "value": 14 }, "ags_must_run_mode": { "implemented": true, - "scale_factor": null, "address": 40378, "registers": [ 0 ], - "raw_value": "", "value": "" }, "ags_must_run_weekday_start_hour": { "implemented": true, - "scale_factor": null, "address": 40379, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_must_run_weekday_start_minute": { "implemented": true, - "scale_factor": null, "address": 40380, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_must_run_weekday_stop_hour": { "implemented": true, - "scale_factor": null, "address": 40381, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_must_run_weekday_stop_minute": { "implemented": true, - "scale_factor": null, "address": 40382, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_must_run_weekend_start_hour": { "implemented": true, - "scale_factor": null, "address": 40383, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_must_run_weekend_start_minute": { "implemented": true, - "scale_factor": null, "address": 40384, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_must_run_weekend_stop_hour": { "implemented": true, - "scale_factor": null, "address": 40385, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_must_run_weekend_stop_minute": { "implemented": true, - "scale_factor": null, "address": 40386, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_quiet_time_mode": { "implemented": true, - "scale_factor": null, "address": 40387, "registers": [ 0 ], - "raw_value": "", "value": "" }, "ags_quiet_time_weekday_start_hour": { "implemented": true, - "scale_factor": null, "address": 40388, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_quiet_time_weekday_start_minute": { "implemented": true, - "scale_factor": null, "address": 40389, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_quiet_time_weekday_stop_hour": { "implemented": true, - "scale_factor": null, "address": 40390, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_quiet_time_weekday_stop_minute": { "implemented": true, - "scale_factor": null, "address": 40391, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_quiet_time_weekend_start_hour": { "implemented": true, - "scale_factor": null, "address": 40392, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_quiet_time_weekend_start_minute": { "implemented": true, - "scale_factor": null, "address": 40393, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_quiet_time_weekend_stop_hour": { "implemented": true, - "scale_factor": null, "address": 40394, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_quiet_time_weekend_stop_minute": { "implemented": true, - "scale_factor": null, "address": 40395, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ags_total_generator_run_time": { "implemented": true, - "scale_factor": null, "address": 40396, "registers": [ 0, 0 ], - "raw_value": 0, "value": 0 }, "hbx_mode": { "implemented": true, - "scale_factor": null, "address": 40398, "registers": [ 0 ], - "raw_value": "", "value": "" }, - "hbx_grid_connect_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40399, - "registers": [ - 492 - ], - "raw_value": 492, - "value": 49.2 - }, - "hbx_grid_connect_delay": { - "implemented": true, - "scale_factor": -1, - "address": 40400, - "registers": [ - 1 - ], - "raw_value": 1, - "value": 0.1 - }, - "hbx_grid_disconnect_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40401, - "registers": [ - 548 - ], - "raw_value": 548, - "value": 54.8 - }, - "hbx_grid_disconnect_delay": { - "implemented": true, - "scale_factor": -1, - "address": 40402, - "registers": [ - 1 - ], - "raw_value": 1, - "value": 0.1 - }, "hbx_grid_connect_soc": { "implemented": true, - "scale_factor": null, "address": 40403, "registers": [ 75 ], - "raw_value": 75, "value": 75 }, "hbx_grid_disconnect_soc": { "implemented": true, - "scale_factor": null, "address": 40404, "registers": [ 97 ], - "raw_value": 97, "value": 97 }, "grid_use_interval_1_mode": { "implemented": true, - "scale_factor": null, "address": 40405, "registers": [ 0 ], - "raw_value": "", "value": "" }, "grid_use_interval_1_weekday_start_hour": { "implemented": true, - "scale_factor": null, "address": 40406, "registers": [ 22 ], - "raw_value": 22, "value": 22 }, "grid_use_interval_1_weekday_start_minute": { "implemented": true, - "scale_factor": null, "address": 40407, "registers": [ 30 ], - "raw_value": 30, "value": 30 }, "grid_use_interval_1_weekday_stop_hour": { "implemented": true, - "scale_factor": null, "address": 40408, "registers": [ 22 ], - "raw_value": 22, "value": 22 }, "grid_use_interval_1_weekday_stop_minute": { "implemented": true, - "scale_factor": null, "address": 40409, "registers": [ 5 ], - "raw_value": 5, "value": 5 }, "grid_use_interval_1_weekend_start_hour": { "implemented": true, - "scale_factor": null, "address": 40410, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "grid_use_interval_1_weekend_start_minute": { "implemented": true, - "scale_factor": null, "address": 40411, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "grid_use_interval_1_weekend_stop_hour": { "implemented": true, - "scale_factor": null, "address": 40412, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "grid_use_interval_1_weekend_stop_minute": { "implemented": true, - "scale_factor": null, "address": 40413, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "grid_use_interval_2_mode": { "implemented": true, - "scale_factor": null, "address": 40414, "registers": [ 0 ], - "raw_value": "", "value": "" }, "grid_use_interval_2_weekday_start_hour": { "implemented": true, - "scale_factor": null, "address": 40415, "registers": [ 22 ], - "raw_value": 22, "value": 22 }, "grid_use_interval_2_weekday_start_minute": { "implemented": true, - "scale_factor": null, "address": 40416, "registers": [ 30 ], - "raw_value": 30, "value": 30 }, "grid_use_interval_2_weekday_stop_hour": { "implemented": true, - "scale_factor": null, "address": 40417, "registers": [ 22 ], - "raw_value": 22, "value": 22 }, "grid_use_interval_2_weekday_stop_minute": { "implemented": true, - "scale_factor": null, "address": 40418, "registers": [ 5 ], - "raw_value": 5, "value": 5 }, "grid_use_interval_3_mode": { "implemented": true, - "scale_factor": null, "address": 40419, "registers": [ 0 ], - "raw_value": "", "value": "" }, "grid_use_interval_3_weekday_start_hour": { "implemented": true, - "scale_factor": null, "address": 40420, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "grid_use_interval_3_weekday_start_minute": { "implemented": true, - "scale_factor": null, "address": 40421, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "grid_use_interval_3_weekday_stop_hour": { "implemented": true, - "scale_factor": null, "address": 40422, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "grid_use_interval_3_weekday_stop_minute": { "implemented": true, - "scale_factor": null, "address": 40423, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "load_grid_transfer_mode": { "implemented": true, - "scale_factor": null, "address": 40424, "registers": [ 0 ], - "raw_value": "", "value": "" }, - "load_grid_transfer_threshold": { - "implemented": true, - "scale_factor": -1, - "address": 40425, - "registers": [ - 10 - ], - "raw_value": 10, - "value": 1.0 - }, "load_grid_transfer_connect_delay": { "implemented": true, - "scale_factor": null, "address": 40426, "registers": [ 5 ], - "raw_value": 5, "value": 5 }, "load_grid_transfer_disconnect_delay": { "implemented": true, - "scale_factor": null, "address": 40427, "registers": [ 10 ], - "raw_value": 10, "value": 10 }, - "load_grid_transfer_connect_battery_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40428, - "registers": [ - 492 - ], - "raw_value": 492, - "value": 49.2 - }, - "load_grid_transfer_re_connect_battery_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40429, - "registers": [ - 548 - ], - "raw_value": 548, - "value": 54.8 - }, "global_charger_control_mode": { "implemented": true, - "scale_factor": null, "address": 40430, "registers": [ 0 ], - "raw_value": "", "value": "" }, "global_charger_control_output_limit": { "implemented": true, - "scale_factor": null, "address": 40431, "registers": [ 75 ], - "raw_value": 75, "value": 75 }, "radian_ac_coupled_control_mode": { "implemented": true, - "scale_factor": null, "address": 40432, "registers": [ 0 ], - "raw_value": "", "value": "" }, "radian_ac_coupled_aux_port": { "implemented": true, - "scale_factor": null, "address": 40433, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "web_reporting_base_url": { "implemented": true, - "scale_factor": null, "address": 40436, "registers": [ 65535, @@ -1487,3490 +1132,3326 @@ 65535, 65535 ], - "raw_value": "\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff", - "value": "\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff" + "value": "b'\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff'" }, "web_user_logged_in_status": { "implemented": true, - "scale_factor": null, "address": 40456, "registers": [ 0 ], - "raw_value": "", "value": "" }, "hub_type": { "implemented": true, - "scale_factor": null, "address": 40457, "registers": [ 10 ], - "raw_value": "", "value": "" }, "hub_major_firmware_number": { "implemented": true, - "scale_factor": null, "address": 40458, "registers": [ 3 ], - "raw_value": 3, "value": 3 }, "hub_mid_firmware_number": { "implemented": true, - "scale_factor": null, "address": 40459, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "hub_minor_firmware_number": { "implemented": true, - "scale_factor": null, "address": 40460, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "year": { "implemented": true, - "scale_factor": null, "address": 40461, "registers": [ 2020 ], - "raw_value": 2020, "value": 2020 }, "month": { "implemented": true, - "scale_factor": null, "address": 40462, "registers": [ 12 ], - "raw_value": 12, "value": 12 }, "day": { "implemented": true, - "scale_factor": null, "address": 40463, "registers": [ 31 ], - "raw_value": 31, "value": 31 }, "hour": { "implemented": true, - "scale_factor": null, "address": 40464, "registers": [ 9 ], - "raw_value": 9, "value": 9 }, "minute": { "implemented": true, - "scale_factor": null, "address": 40465, "registers": [ 24 ], - "raw_value": 24, "value": 24 }, "second": { "implemented": true, - "scale_factor": null, "address": 40466, "registers": [ 18 ], - "raw_value": 18, "value": 18 }, "temp_battery": { "implemented": true, - "scale_factor": null, "address": 40467, "registers": [ 12 ], - "raw_value": 12, "value": 12 }, "temp_ambient": { "implemented": false, - "scale_factor": null, "address": 40468, "registers": [ 32768 ], - "raw_value": null, "value": null }, "temp_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40469, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "error": { "implemented": true, - "scale_factor": null, "address": 40470, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "status": { "implemented": true, - "scale_factor": null, "address": 40471, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "update_device_firmware_port": { "implemented": true, - "scale_factor": null, "address": 40472, "registers": [ 255 ], - "raw_value": 255, "value": 255 }, "gateway_type": { "implemented": false, - "scale_factor": null, "address": 40473, - "registers": [], - "raw_value": null, + "registers": [ + 3 + ], "value": null }, "system_voltage": { "implemented": true, - "scale_factor": null, "address": 40474, "registers": [ 48 ], - "raw_value": 48, "value": 48 }, - "measured_system_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40475, - "registers": [ - 506 - ], - "raw_value": 506, - "value": 50.6 - }, "ags_ac_reconnect_delay": { "implemented": true, - "scale_factor": null, "address": 40476, "registers": [ 3 ], - "raw_value": 3, "value": 3 }, "multi_phase_coordination": { "implemented": true, - "scale_factor": null, "address": 40477, "registers": [ 0 ], - "raw_value": "", "value": "" }, "sched_1_ac_mode": { "implemented": true, - "scale_factor": null, "address": 40478, "registers": [ 5 ], - "raw_value": "", "value": "" }, "sched_1_ac_mode_hour": { "implemented": true, - "scale_factor": null, "address": 40479, "registers": [ 8 ], - "raw_value": 8, "value": 8 }, "sched_1_ac_mode_minute": { "implemented": true, - "scale_factor": null, "address": 40480, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "sched_2_ac_mode": { "implemented": true, - "scale_factor": null, "address": 40481, "registers": [ 4 ], - "raw_value": "", "value": "" }, "sched_2_ac_mode_hour": { "implemented": true, - "scale_factor": null, "address": 40482, "registers": [ 13 ], - "raw_value": 13, "value": 13 }, "sched_2_ac_mode_minute": { "implemented": true, - "scale_factor": null, "address": 40483, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "sched_3_ac_mode": { "implemented": true, - "scale_factor": null, "address": 40484, "registers": [ 65535 ], - "raw_value": "", "value": "" }, "sched_3_ac_mode_hour": { "implemented": true, - "scale_factor": null, "address": 40485, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "sched_3_ac_mode_minute": { "implemented": true, - "scale_factor": null, "address": 40486, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "auto_reboot": { "implemented": true, - "scale_factor": null, "address": 40487, "registers": [ 0 ], - "raw_value": "", "value": "" }, "time_zone_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40488, "registers": [ 65534 ], - "raw_value": -2, "value": -2 }, "spare_reg_3": { "implemented": true, - "scale_factor": null, "address": 40489, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "spare_reg_4": { "implemented": true, - "scale_factor": null, "address": 40490, "registers": [ 0 ], - "raw_value": 0, "value": 0 - } - } - }, - { - "name": "ChargeControllerDeviceValues", - "address": 40908, - "values": { - "did": { + }, + "set_time_zone": { "implemented": true, - "scale_factor": null, - "address": 40908, + "address": 40340, "registers": [ - 64111 + 200 ], - "raw_value": 64111, - "value": 64111 + "value": 2.0 }, - "length": { + "ags_dc_gen_absorb_voltage": { "implemented": true, - "scale_factor": null, - "address": 40909, + "address": 40350, "registers": [ - 26 + 760 ], - "raw_value": 26, - "value": 26 + "value": 76.0 }, - "port_number": { + "ags_dc_gen_absorb_time": { "implemented": true, - "scale_factor": null, - "address": 40910, + "address": 40351, "registers": [ - 3 + 10 ], - "raw_value": 3, - "value": 3 + "value": 1.0 }, - "voltage_scale_factor": { + "ags_2_min_start_voltage": { "implemented": true, - "scale_factor": null, - "address": 40911, + "address": 40363, "registers": [ - 65535 + 440 ], - "raw_value": -1, - "value": -1 + "value": 44.0 }, - "current_scale_factor": { + "ags_2_hour_start_voltage": { "implemented": true, - "scale_factor": null, - "address": 40912, + "address": 40365, "registers": [ - 65535 + 472 ], - "raw_value": -1, - "value": -1 + "value": 47.2 }, - "power_scale_factor": { + "ags_24_hour_start_voltage": { "implemented": true, - "scale_factor": null, - "address": 40913, + "address": 40367, "registers": [ - 0 + 488 ], - "raw_value": 0, - "value": 0 + "value": 48.8 }, - "ah_scale_factor": { + "hbx_grid_connect_voltage": { "implemented": true, - "scale_factor": null, - "address": 40914, + "address": 40399, "registers": [ - 0 + 492 ], - "raw_value": 0, - "value": 0 + "value": 49.2 }, - "kwh_scale_factor": { + "hbx_grid_connect_delay": { "implemented": true, - "scale_factor": null, - "address": 40915, + "address": 40400, "registers": [ - 65535 + 1 ], - "raw_value": -1, - "value": -1 + "value": 0.1 }, - "battery_voltage": { + "hbx_grid_disconnect_voltage": { "implemented": true, - "scale_factor": -1, - "address": 40916, + "address": 40401, "registers": [ - 507 + 548 ], - "raw_value": 507, - "value": 50.7 + "value": 54.8 }, - "array_voltage": { + "hbx_grid_disconnect_delay": { "implemented": true, - "scale_factor": -1, - "address": 40917, + "address": 40402, "registers": [ - 872 + 1 ], - "raw_value": 872, - "value": 87.2 + "value": 0.1 }, - "battery_current": { + "load_grid_transfer_threshold": { "implemented": true, - "scale_factor": -1, - "address": 40918, + "address": 40425, "registers": [ - 79 + 10 ], - "raw_value": 79, - "value": 7.9 + "value": 1.0 }, - "array_current": { + "load_grid_transfer_connect_battery_voltage": { "implemented": true, - "scale_factor": 0, - "address": 40919, + "address": 40428, "registers": [ - 4 + 492 ], - "raw_value": 4, - "value": 4 + "value": 49.2 }, - "charger_state": { + "load_grid_transfer_re_connect_battery_voltage": { "implemented": true, - "scale_factor": null, - "address": 40920, + "address": 40429, "registers": [ - 2 + 548 ], - "raw_value": "", - "value": "" + "value": 54.8 }, - "watts": { + "measured_system_voltage": { "implemented": true, - "scale_factor": 0, - "address": 40921, + "address": 40475, "registers": [ - 400 + 506 ], - "raw_value": 400, - "value": 400 - }, - "todays_min_battery_volts": { + "value": 50.6 + } + } + }, + { + "name": "OPTICSDevice", + "address": 40572, + "values": { + "did": { "implemented": true, - "scale_factor": -1, - "address": 40922, + "address": 40572, "registers": [ - 495 + 64255 ], - "raw_value": 495, - "value": 49.5 + "value": 64255 }, - "todays_max_battery_volts": { + "length": { "implemented": true, - "scale_factor": -1, - "address": 40923, + "address": 40573, "registers": [ - 519 + 56 ], - "raw_value": 519, - "value": 51.9 + "value": 56 }, - "voc": { + "bt_min": { "implemented": true, - "scale_factor": -1, - "address": 40924, + "address": 40574, "registers": [ - 1101 + 0 ], - "raw_value": 1101, - "value": 110.1 + "value": 0 }, - "todays_peak_voc": { + "bt_max": { "implemented": true, - "scale_factor": null, - "address": 40925, + "address": 40575, "registers": [ - 110 + 0 ], - "raw_value": 110, - "value": 110 + "value": 0 }, - "todays_kwh": { + "bt_ave": { "implemented": true, - "scale_factor": -1, - "address": 40926, + "address": 40576, "registers": [ - 1 + 0 ], - "raw_value": 1, - "value": 0.1 + "value": 0 }, - "todays_ah": { + "bt_attempts": { "implemented": true, - "scale_factor": 0, - "address": 40927, + "address": 40577, "registers": [ - 3 + 0 ], - "raw_value": 3, - "value": 3 + "value": 0 }, - "lifetime_kwh_hours": { + "bt_errors": { "implemented": true, - "scale_factor": null, - "address": 40928, + "address": 40578, "registers": [ - 6109 + 0 ], - "raw_value": 6109, - "value": 6109 + "value": 0 }, - "lifetime_k_amp_hours": { + "bt_timeouts": { "implemented": true, - "scale_factor": -1, - "address": 40929, + "address": 40579, "registers": [ - 1096 + 0 ], - "raw_value": 1096, - "value": 109.6 + "value": 0 }, - "lifetime_max_watts": { + "bt_packet_timeout": { "implemented": true, - "scale_factor": 0, - "address": 40930, + "address": 40580, "registers": [ - 4096 + 15 ], - "raw_value": 4096, - "value": 4096 + "value": 15 }, - "lifetime_max_battery_volts": { + "mp_min": { "implemented": true, - "scale_factor": -1, - "address": 40931, + "address": 40581, "registers": [ - 644 + 0 ], - "raw_value": 644, - "value": 64.4 + "value": 0 }, - "lifetime_max_voc": { + "mp_max": { "implemented": true, - "scale_factor": -1, - "address": 40932, + "address": 40582, "registers": [ - 1384 + 0 ], - "raw_value": 1384, - "value": 138.4 + "value": 0 }, - "temp_scale_factor": { + "mp_ave": { "implemented": true, - "scale_factor": null, - "address": 40933, + "address": 40583, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "temp_output_fets": { - "implemented": false, - "scale_factor": 0, - "address": 40934, + "mp_attempts": { + "implemented": true, + "address": 40584, "registers": [ - 32768 + 0 ], - "raw_value": null, - "value": null + "value": 0 }, - "temp_enclosure": { - "implemented": false, - "scale_factor": 0, - "address": 40935, + "mp_errors": { + "implemented": true, + "address": 40585, "registers": [ - 32768 + 0 ], - "raw_value": null, - "value": null - } - } - }, - { - "name": "ChargeControllerConfigurationValues", - "address": 40936, - "values": { - "did": { + "value": 0 + }, + "mp_timeouts": { "implemented": true, - "scale_factor": null, - "address": 40936, + "address": 40586, "registers": [ - 64112 + 0 ], - "raw_value": 64112, - "value": 64112 + "value": 0 }, - "length": { + "mp_packet_timeout": { "implemented": true, - "scale_factor": null, - "address": 40937, + "address": 40587, "registers": [ - 88 + 15 ], - "raw_value": 88, - "value": 88 + "value": 15 }, - "port_number": { + "cu_min": { "implemented": true, - "scale_factor": null, - "address": 40938, + "address": 40588, "registers": [ - 3 + 600 ], - "raw_value": 3, - "value": 3 + "value": 600 }, - "voltage_scale_factor": { + "cu_max": { "implemented": true, - "scale_factor": null, - "address": 40939, + "address": 40589, "registers": [ - 65535 + 623 ], - "raw_value": -1, - "value": -1 + "value": 623 }, - "current_scale_factor": { + "cu_ave": { "implemented": true, - "scale_factor": null, - "address": 40940, + "address": 40590, "registers": [ - 65535 + 609 ], - "raw_value": -1, - "value": -1 + "value": 609 }, - "hours_scale_factor": { + "cu_attempts": { "implemented": true, - "scale_factor": null, - "address": 40941, + "address": 40591, "registers": [ - 65535 + 3 ], - "raw_value": -1, - "value": -1 + "value": 3 }, - "power_scale_factor": { + "cu_errors": { "implemented": true, - "scale_factor": null, - "address": 40942, + "address": 40592, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "ah_scale_factor": { + "cu_timeouts": { "implemented": true, - "scale_factor": null, - "address": 40943, + "address": 40593, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "kwh_scale_factor": { + "cu_packet_timeout": { "implemented": true, - "scale_factor": null, - "address": 40944, + "address": 40594, "registers": [ - 65535 + 15 ], - "raw_value": -1, - "value": -1 + "value": 15 }, - "faults": { + "su_min": { "implemented": true, - "scale_factor": null, - "address": 40945, + "address": 40595, "registers": [ - 0 + 687 ], - "raw_value": 0, - "value": 0 + "value": 687 }, - "absorb_volts": { + "su_max": { "implemented": true, - "scale_factor": -1, - "address": 40946, + "address": 40596, "registers": [ - 588 + 687 ], - "raw_value": 588, - "value": 58.8 + "value": 687 }, - "absorb_time_hours": { + "su_ave": { "implemented": true, - "scale_factor": -1, - "address": 40947, + "address": 40597, "registers": [ - 30 + 687 ], - "raw_value": 30, - "value": 3.0 + "value": 687 }, - "absorb_end_amps": { + "su_attempts": { "implemented": true, - "scale_factor": null, - "address": 40948, + "address": 40598, + "registers": [ + 1 + ], + "value": 1 + }, + "su_errors": { + "implemented": true, + "address": 40599, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "rebulk_volts": { + "su_timeouts": { "implemented": true, - "scale_factor": -1, - "address": 40949, + "address": 40600, "registers": [ - 480 + 0 ], - "raw_value": 480, - "value": 48.0 + "value": 0 }, - "float_volts": { + "su_packet_timeout": { "implemented": true, - "scale_factor": -1, - "address": 40950, + "address": 40601, "registers": [ - 552 + 15 ], - "raw_value": 552, - "value": 55.2 + "value": 15 }, - "bulk_current": { + "pg_min": { "implemented": true, - "scale_factor": -1, - "address": 40951, + "address": 40602, "registers": [ - 600 + 642 ], - "raw_value": 600, - "value": 60.0 + "value": 642 }, - "eq_volts": { + "pg_max": { "implemented": true, - "scale_factor": -1, - "address": 40952, + "address": 40603, "registers": [ - 636 + 2386 ], - "raw_value": 636, - "value": 63.6 + "value": 2386 }, - "eq_time_hours": { + "pg_ave": { "implemented": true, - "scale_factor": null, - "address": 40953, + "address": 40604, "registers": [ - 1 + 752 ], - "raw_value": 1, - "value": 1 + "value": 752 }, - "auto_eq_days": { + "pg_attempts": { "implemented": true, - "scale_factor": null, - "address": 40954, + "address": 40605, "registers": [ - 0 + 49 ], - "raw_value": 0, - "value": 0 + "value": 49 }, - "mppt_mode": { + "pg_errors": { "implemented": true, - "scale_factor": null, - "address": 40955, + "address": 40606, "registers": [ 0 ], - "raw_value": "", - "value": "" + "value": 0 }, - "sweep_width": { + "pg_timeouts": { "implemented": true, - "scale_factor": null, - "address": 40956, + "address": 40607, "registers": [ - 1 + 0 ], - "raw_value": "", - "value": "" + "value": 0 }, - "sweep_max_percentage": { + "pg_packet_timeout": { "implemented": true, - "scale_factor": null, - "address": 40957, + "address": 40608, "registers": [ - 2 + 15 ], - "raw_value": "", - "value": "" + "value": 15 }, - "u_pick_pwm_duty_cycle": { + "mb_min": { "implemented": true, - "scale_factor": -1, - "address": 40958, + "address": 40609, "registers": [ - 770 + 0 ], - "raw_value": 770, - "value": 77.0 + "value": 0 }, - "grid_tie_mode": { + "mb_max": { "implemented": true, - "scale_factor": null, - "address": 40959, + "address": 40610, "registers": [ 0 ], - "raw_value": "", - "value": "" + "value": 0 }, - "temp_comp_mode": { + "mb_ave": { "implemented": true, - "scale_factor": null, - "address": 40960, + "address": 40611, "registers": [ - 1 + 0 ], - "raw_value": "", - "value": "" + "value": 0 }, - "temp_comp_lower_limit_volts": { + "mb_attempts": { "implemented": true, - "scale_factor": -1, - "address": 40961, + "address": 40612, "registers": [ - 530 + 0 ], - "raw_value": 530, - "value": 53.0 + "value": 0 }, - "temp_comp_upper_limit_volts": { + "mb_errors": { "implemented": true, - "scale_factor": -1, - "address": 40962, + "address": 40613, "registers": [ - 630 + 0 ], - "raw_value": 630, - "value": 63.0 + "value": 0 }, - "temp_comp_slope": { - "implemented": false, - "scale_factor": null, - "address": 40963, + "mb_timeouts": { + "implemented": true, + "address": 40614, "registers": [ - 65535 + 0 ], - "raw_value": null, - "value": null + "value": 0 }, - "auto_restart_mode": { + "mb_packet_timeout": { "implemented": true, - "scale_factor": null, - "address": 40964, + "address": 40615, "registers": [ - 2 + 15 ], - "raw_value": "", - "value": "" + "value": 15 }, - "wakeup_voc": { + "fu_min": { "implemented": true, - "scale_factor": -1, - "address": 40965, + "address": 40616, "registers": [ - 60 + 0 ], - "raw_value": 60, - "value": 6.0 + "value": 0 }, - "snooze_mode_amps": { + "fu_max": { "implemented": true, - "scale_factor": -1, - "address": 40966, + "address": 40617, "registers": [ - 6 + 0 ], - "raw_value": 6, - "value": 0.6 + "value": 0 }, - "wakeup_interval": { + "fu_ave": { "implemented": true, - "scale_factor": null, - "address": 40967, + "address": 40618, "registers": [ - 5 + 0 ], - "raw_value": 5, - "value": 5 + "value": 0 }, - "aux_mode": { + "fu_attempts": { "implemented": true, - "scale_factor": null, - "address": 40968, + "address": 40619, "registers": [ - 2 + 0 ], - "raw_value": "", - "value": "" + "value": 0 }, - "aux_control": { + "fu_errors": { "implemented": true, - "scale_factor": null, - "address": 40969, + "address": 40620, "registers": [ - 2 + 0 ], - "raw_value": "", - "value": "" + "value": 0 }, - "aux_state": { + "fu_timeouts": { "implemented": true, - "scale_factor": null, - "address": 40970, + "address": 40621, "registers": [ 0 ], - "raw_value": "", - "value": "" + "value": 0 }, - "aux_polarity": { + "fu_packet_timeout": { "implemented": true, - "scale_factor": null, - "address": 40971, + "address": 40622, "registers": [ - 0 + 60 ], - "raw_value": "", - "value": "" + "value": 60 }, - "aux_low_battery_disconnect": { + "ev_min": { "implemented": true, - "scale_factor": -1, - "address": 40972, + "address": 40623, "registers": [ - 544 + 0 ], - "raw_value": 544, - "value": 54.4 + "value": 0 }, - "aux_low_battery_reconnect": { + "ev_max": { "implemented": true, - "scale_factor": -1, - "address": 40973, + "address": 40624, "registers": [ - 576 + 0 ], - "raw_value": 576, - "value": 57.6 + "value": 0 }, - "aux_low_battery_disconnect_delay": { + "ev_ave": { "implemented": true, - "scale_factor": null, - "address": 40974, + "address": 40625, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "aux_vent_fan_volts": { + "ev_attempts": { "implemented": true, - "scale_factor": -1, - "address": 40975, + "address": 40626, "registers": [ - 560 + 0 ], - "raw_value": 560, - "value": 56.0 + "value": 0 }, - "aux_pv_limit_volts": { + "ev_errors": { "implemented": true, - "scale_factor": -1, - "address": 40976, + "address": 40627, "registers": [ - 1400 + 0 ], - "raw_value": 1400, - "value": 140.0 + "value": 0 }, - "aux_pv_limit_hold_time": { + "ev_timeouts": { "implemented": true, - "scale_factor": -1, - "address": 40977, + "address": 40628, "registers": [ 0 ], - "raw_value": 0, - "value": 0.0 + "value": 0 }, - "aux_night_light_thres_volts": { + "ev_packet_timeout": { "implemented": true, - "scale_factor": -1, - "address": 40978, + "address": 40629, "registers": [ - 100 + 15 ], - "raw_value": 100, - "value": 10.0 - }, - "night_light_on_hours": { + "value": 15 + } + } + }, + { + "name": "ChargeControllerDevice", + "address": 40908, + "values": { + "did": { "implemented": true, - "scale_factor": null, - "address": 40979, + "address": 40908, "registers": [ - 4 + 64111 ], - "raw_value": 4, - "value": 4 + "value": 64111 }, - "night_light_on_hyst_time": { + "length": { "implemented": true, - "scale_factor": null, - "address": 40980, + "address": 40909, "registers": [ - 1 + 26 ], - "raw_value": 1, - "value": 1 + "value": 26 }, - "night_light_off_hyst_time": { + "port_number": { "implemented": true, - "scale_factor": null, - "address": 40981, + "address": 40910, "registers": [ - 1 + 3 ], - "raw_value": 1, - "value": 1 + "value": 3 }, - "aux_error_battery_volts": { + "voltage_scale_factor": { "implemented": true, - "scale_factor": -1, - "address": 40982, + "address": 40911, "registers": [ - 460 + 65535 ], - "raw_value": 460, - "value": 46.0 + "value": -1 }, - "aux_divert_hold_time": { + "current_scale_factor": { "implemented": true, - "scale_factor": -1, - "address": 40983, + "address": 40912, "registers": [ - 50 + 65535 ], - "raw_value": 50, - "value": 5.0 + "value": -1 }, - "aux_divert_delay_time": { + "power_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 40984, + "address": 40913, "registers": [ - 8 + 0 ], - "raw_value": 8, - "value": 8 + "value": 0 }, - "aux_divert_relative_volts": { + "ah_scale_factor": { "implemented": true, - "scale_factor": -1, - "address": 40985, + "address": 40914, "registers": [ 0 ], - "raw_value": 0, - "value": 0.0 + "value": 0 }, - "aux_divert_hyst_volts": { + "kwh_scale_factor": { "implemented": true, - "scale_factor": -1, - "address": 40986, + "address": 40915, "registers": [ - 0 + 65535 ], - "raw_value": 0, - "value": 0.0 + "value": -1 }, - "major_firmware_number": { + "charger_state": { "implemented": true, - "scale_factor": null, - "address": 40987, + "address": 40920, "registers": [ - 3 + 2 ], - "raw_value": 3, - "value": 3 + "value": "" }, - "mid_firmware_number": { + "todays_peak_voc": { "implemented": true, - "scale_factor": null, - "address": 40988, + "address": 40925, "registers": [ - 3 + 110 ], - "raw_value": 3, - "value": 3 + "value": 110 }, - "minor_firmware_number": { + "lifetime_kwh_hours": { "implemented": true, - "scale_factor": null, - "address": 40989, + "address": 40928, "registers": [ - 0 + 6109 ], - "raw_value": 0, - "value": 0 + "value": 6109 }, - "set_data_log_day_offset": { + "temp_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 40990, + "address": 40933, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "get_current_data_log_day_offset": { + "battery_voltage": { "implemented": true, - "scale_factor": null, - "address": 40991, + "address": 40916, "registers": [ - 0 + 507 ], - "raw_value": 0, - "value": 0 + "value": 50.7 }, - "data_log_daily_ah": { + "array_voltage": { "implemented": true, - "scale_factor": 0, - "address": 40992, + "address": 40917, "registers": [ - 3 + 872 ], - "raw_value": 3, - "value": 3 + "value": 87.2 }, - "data_log_daily_kwh": { + "battery_current": { "implemented": true, - "scale_factor": -1, - "address": 40993, + "address": 40918, "registers": [ - 1 + 79 ], - "raw_value": 1, - "value": 0.1 + "value": 7.9 }, - "data_log_daily_max_output_amps": { + "array_current": { "implemented": true, - "scale_factor": -1, - "address": 40994, + "address": 40919, "registers": [ - 88 + 4 ], - "raw_value": 88, - "value": 8.8 + "value": 4 }, - "data_log_daily_max_output_watts": { + "watts": { "implemented": true, - "scale_factor": 0, - "address": 40995, + "address": 40921, "registers": [ - 447 + 400 ], - "raw_value": 447, - "value": 447 + "value": 400 }, - "data_log_daily_absorb_time": { + "todays_min_battery_volts": { "implemented": true, - "scale_factor": null, - "address": 40996, + "address": 40922, "registers": [ - 0 + 495 ], - "raw_value": 0, - "value": 0 + "value": 49.5 }, - "data_log_daily_float_time": { + "todays_max_battery_volts": { "implemented": true, - "scale_factor": null, - "address": 40997, + "address": 40923, "registers": [ - 0 + 519 ], - "raw_value": 0, - "value": 0 + "value": 51.9 }, - "data_log_daily_min_battery_volts": { + "voc": { "implemented": true, - "scale_factor": -1, - "address": 40998, + "address": 40924, "registers": [ - 495 + 1101 ], - "raw_value": 495, - "value": 49.5 + "value": 110.1 }, - "data_log_daily_max_battery_volts": { + "todays_kwh": { "implemented": true, - "scale_factor": -1, - "address": 40999, + "address": 40926, "registers": [ - 519 + 1 ], - "raw_value": 519, - "value": 51.9 + "value": 0.1 }, - "data_log_daily_max_input_volts": { + "todays_ah": { "implemented": true, - "scale_factor": null, - "address": 41000, + "address": 40927, "registers": [ - 110 + 3 ], - "raw_value": 110, - "value": 110 + "value": 3 }, - "clear_data_log_read": { + "lifetime_k_amp_hours": { "implemented": true, - "scale_factor": null, - "address": 41001, + "address": 40929, "registers": [ - 1059 + 1096 ], - "raw_value": 1059, - "value": 1059 + "value": 109.6 }, - "stats_maximum_reset_read": { + "lifetime_max_watts": { "implemented": true, - "scale_factor": null, - "address": 41003, + "address": 40930, "registers": [ - 14969 + 4096 ], - "raw_value": 14969, - "value": 14969 + "value": 4096 }, - "stats_totals_reset_read": { + "lifetime_max_battery_volts": { "implemented": true, - "scale_factor": null, - "address": 41005, + "address": 40931, "registers": [ - 16391 + 644 ], - "raw_value": 16391, - "value": 16391 + "value": 64.4 }, - "battery_voltage_calibrate_offset": { + "lifetime_max_voc": { "implemented": true, - "scale_factor": -1, - "address": 41007, + "address": 40932, "registers": [ - 0 + 1384 ], - "raw_value": 0, - "value": 0.0 + "value": 138.4 }, - "serial_number": { + "temp_output_fets": { "implemented": false, - "scale_factor": null, - "address": 41008, + "address": 40934, "registers": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 + 32768 ], - "raw_value": null, "value": null }, - "model_number": { - "implemented": true, - "scale_factor": null, - "address": 41017, + "temp_enclosure": { + "implemented": false, + "address": 40935, "registers": [ - 17997, - 13872, - 11569, - 13616, - 22084, - 17152, - 0, - 0, - 0 + 32768 ], - "raw_value": "FM60-150VDC", - "value": "FM60-150VDC" + "value": null } } }, { - "name": "ChargeControllerDeviceValues", - "address": 41026, + "name": "ChargeControllerConfigurationModel", + "address": 40936, "values": { "did": { "implemented": true, - "scale_factor": null, - "address": 41026, + "address": 40936, "registers": [ - 64111 + 64112 ], - "raw_value": 64111, - "value": 64111 + "value": 64112 }, "length": { "implemented": true, - "scale_factor": null, - "address": 41027, + "address": 40937, "registers": [ - 26 + 88 ], - "raw_value": 26, - "value": 26 + "value": 88 }, "port_number": { "implemented": true, - "scale_factor": null, - "address": 41028, + "address": 40938, "registers": [ - 4 + 3 ], - "raw_value": 4, - "value": 4 + "value": 3 }, "voltage_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 41029, + "address": 40939, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "current_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 41030, + "address": 40940, + "registers": [ + 65535 + ], + "value": -1 + }, + "hours_scale_factor": { + "implemented": true, + "address": 40941, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "power_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 41031, + "address": 40942, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ah_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 41032, + "address": 40943, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "kwh_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 41033, + "address": 40944, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, - "battery_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 41034, - "registers": [ - 507 - ], - "raw_value": 507, - "value": 50.7 - }, - "array_voltage": { + "faults": { "implemented": true, - "scale_factor": -1, - "address": 41035, + "address": 40945, "registers": [ - 831 + 0 ], - "raw_value": 831, - "value": 83.1 + "value": 0 }, - "battery_current": { + "absorb_end_amps": { "implemented": true, - "scale_factor": -1, - "address": 41036, + "address": 40948, "registers": [ - 55 + 0 ], - "raw_value": 55, - "value": 5.5 + "value": 0 }, - "array_current": { + "eq_time_hours": { "implemented": true, - "scale_factor": 0, - "address": 41037, + "address": 40953, "registers": [ - 3 + 1 ], - "raw_value": 3, - "value": 3 + "value": 1 }, - "charger_state": { + "auto_eq_days": { "implemented": true, - "scale_factor": null, - "address": 41038, + "address": 40954, "registers": [ - 2 + 0 ], - "raw_value": "", - "value": "" + "value": 0 }, - "watts": { + "mppt_mode": { "implemented": true, - "scale_factor": 0, - "address": 41039, + "address": 40955, "registers": [ - 278 + 0 ], - "raw_value": 278, - "value": 278 + "value": "" }, - "todays_min_battery_volts": { + "sweep_width": { "implemented": true, - "scale_factor": -1, - "address": 41040, + "address": 40956, "registers": [ - 496 + 1 ], - "raw_value": 496, - "value": 49.6 + "value": "" }, - "todays_max_battery_volts": { + "sweep_max_percentage": { "implemented": true, - "scale_factor": -1, - "address": 41041, + "address": 40957, "registers": [ - 521 + 2 ], - "raw_value": 521, - "value": 52.1 + "value": "" }, - "voc": { + "grid_tie_mode": { "implemented": true, - "scale_factor": -1, - "address": 41042, + "address": 40959, "registers": [ - 1009 + 0 ], - "raw_value": 1009, - "value": 100.9 + "value": "" }, - "todays_peak_voc": { + "temp_comp_mode": { "implemented": true, - "scale_factor": null, - "address": 41043, + "address": 40960, "registers": [ - 100 + 1 ], - "raw_value": 100, - "value": 100 + "value": "" }, - "todays_kwh": { - "implemented": true, - "scale_factor": -1, - "address": 41044, + "temp_comp_slope": { + "implemented": false, + "address": 40963, "registers": [ - 1 + 65535 ], - "raw_value": 1, - "value": 0.1 + "value": null }, - "todays_ah": { + "auto_restart_mode": { "implemented": true, - "scale_factor": 0, - "address": 41045, + "address": 40964, "registers": [ - 3 + 2 ], - "raw_value": 3, - "value": 3 + "value": "" }, - "lifetime_kwh_hours": { + "wakeup_interval": { "implemented": true, - "scale_factor": null, - "address": 41046, + "address": 40967, "registers": [ - 6230 + 5 ], - "raw_value": 6230, - "value": 6230 + "value": 5 }, - "lifetime_k_amp_hours": { + "aux_mode": { "implemented": true, - "scale_factor": -1, - "address": 41047, + "address": 40968, "registers": [ - 1120 + 2 ], - "raw_value": 1120, - "value": 112.0 + "value": "" }, - "lifetime_max_watts": { + "aux_control": { "implemented": true, - "scale_factor": 0, - "address": 41048, + "address": 40969, "registers": [ - 3072 + 2 ], - "raw_value": 3072, - "value": 3072 + "value": "" }, - "lifetime_max_battery_volts": { + "aux_state": { "implemented": true, - "scale_factor": -1, - "address": 41049, + "address": 40970, "registers": [ - 646 + 0 ], - "raw_value": 646, - "value": 64.6 + "value": "" }, - "lifetime_max_voc": { + "aux_polarity": { "implemented": true, - "scale_factor": -1, - "address": 41050, + "address": 40971, "registers": [ - 1384 + 0 ], - "raw_value": 1384, - "value": 138.4 + "value": "" }, - "temp_scale_factor": { + "aux_low_battery_disconnect_delay": { "implemented": true, - "scale_factor": null, - "address": 41051, + "address": 40974, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "temp_output_fets": { - "implemented": false, - "scale_factor": 0, - "address": 41052, + "night_light_on_hours": { + "implemented": true, + "address": 40979, "registers": [ - 32768 + 4 ], - "raw_value": null, - "value": null + "value": 4 }, - "temp_enclosure": { - "implemented": false, - "scale_factor": 0, - "address": 41053, - "registers": [ - 32768 - ], - "raw_value": null, - "value": null - } - } - }, - { - "name": "ChargeControllerConfigurationValues", - "address": 41054, - "values": { - "did": { + "night_light_on_hyst_time": { "implemented": true, - "scale_factor": null, - "address": 41054, + "address": 40980, "registers": [ - 64112 + 1 ], - "raw_value": 64112, - "value": 64112 + "value": 1 }, - "length": { + "night_light_off_hyst_time": { "implemented": true, - "scale_factor": null, - "address": 41055, + "address": 40981, "registers": [ - 88 + 1 ], - "raw_value": 88, - "value": 88 + "value": 1 }, - "port_number": { + "aux_divert_delay_time": { "implemented": true, - "scale_factor": null, - "address": 41056, + "address": 40984, "registers": [ - 4 + 8 ], - "raw_value": 4, - "value": 4 + "value": 8 }, - "voltage_scale_factor": { + "major_firmware_number": { "implemented": true, - "scale_factor": null, - "address": 41057, + "address": 40987, "registers": [ - 65535 + 3 ], - "raw_value": -1, - "value": -1 + "value": 3 }, - "current_scale_factor": { + "mid_firmware_number": { "implemented": true, - "scale_factor": null, - "address": 41058, + "address": 40988, "registers": [ - 65535 + 3 ], - "raw_value": -1, - "value": -1 + "value": 3 }, - "hours_scale_factor": { + "minor_firmware_number": { "implemented": true, - "scale_factor": null, - "address": 41059, + "address": 40989, "registers": [ - 65535 + 0 ], - "raw_value": -1, - "value": -1 + "value": 0 }, - "power_scale_factor": { + "set_data_log_day_offset": { "implemented": true, - "scale_factor": null, - "address": 41060, + "address": 40990, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "ah_scale_factor": { + "get_current_data_log_day_offset": { "implemented": true, - "scale_factor": null, - "address": 41061, + "address": 40991, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "kwh_scale_factor": { + "data_log_daily_absorb_time": { "implemented": true, - "scale_factor": null, - "address": 41062, + "address": 40996, "registers": [ - 65535 + 0 ], - "raw_value": -1, - "value": -1 + "value": 0 }, - "faults": { + "data_log_daily_float_time": { "implemented": true, - "scale_factor": null, - "address": 41063, + "address": 40997, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "absorb_volts": { + "data_log_daily_max_input_volts": { "implemented": true, - "scale_factor": -1, - "address": 41064, + "address": 41000, "registers": [ - 588 + 110 ], - "raw_value": 588, - "value": 58.8 + "value": 110 }, - "absorb_time_hours": { + "clear_data_log_read": { "implemented": true, - "scale_factor": -1, - "address": 41065, + "address": 41001, "registers": [ - 30 + 1059 ], - "raw_value": 30, - "value": 3.0 + "value": 1059 }, - "absorb_end_amps": { + "stats_maximum_reset_read": { "implemented": true, - "scale_factor": null, - "address": 41066, + "address": 41003, "registers": [ - 0 + 14969 ], - "raw_value": 0, - "value": 0 + "value": 14969 }, - "rebulk_volts": { + "stats_totals_reset_read": { "implemented": true, - "scale_factor": -1, - "address": 41067, + "address": 41005, "registers": [ - 480 + 16391 ], - "raw_value": 480, - "value": 48.0 + "value": 16391 }, - "float_volts": { - "implemented": true, - "scale_factor": -1, - "address": 41068, + "serial_number": { + "implemented": false, + "address": 41008, "registers": [ - 552 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ], - "raw_value": 552, - "value": 55.2 + "value": null }, - "bulk_current": { + "model_number": { "implemented": true, - "scale_factor": -1, - "address": 41069, + "address": 41017, "registers": [ - 800 + 17997, + 13872, + 11569, + 13616, + 22084, + 17152, + 0, + 0, + 0 ], - "raw_value": 800, - "value": 80.0 + "value": "b'FM60-150VDC'" }, - "eq_volts": { + "absorb_volts": { "implemented": true, - "scale_factor": -1, - "address": 41070, + "address": 40946, "registers": [ - 636 + 588 ], - "raw_value": 636, - "value": 63.6 + "value": 58.8 }, - "eq_time_hours": { + "absorb_time_hours": { "implemented": true, - "scale_factor": null, - "address": 41071, + "address": 40947, "registers": [ - 1 + 30 ], - "raw_value": 1, - "value": 1 + "value": 3.0 }, - "auto_eq_days": { + "rebulk_volts": { "implemented": true, - "scale_factor": null, - "address": 41072, + "address": 40949, "registers": [ - 0 + 480 ], - "raw_value": 0, - "value": 0 + "value": 48.0 }, - "mppt_mode": { + "float_volts": { "implemented": true, - "scale_factor": null, - "address": 41073, + "address": 40950, "registers": [ - 0 + 552 ], - "raw_value": "", - "value": "" + "value": 55.2 }, - "sweep_width": { + "bulk_current": { "implemented": true, - "scale_factor": null, - "address": 41074, + "address": 40951, "registers": [ - 1 + 600 ], - "raw_value": "", - "value": "" + "value": 60.0 }, - "sweep_max_percentage": { + "eq_volts": { "implemented": true, - "scale_factor": null, - "address": 41075, + "address": 40952, "registers": [ - 2 + 636 ], - "raw_value": "", - "value": "" + "value": 63.6 }, "u_pick_pwm_duty_cycle": { "implemented": true, - "scale_factor": -1, - "address": 41076, + "address": 40958, "registers": [ 770 ], - "raw_value": 770, "value": 77.0 }, - "grid_tie_mode": { - "implemented": true, - "scale_factor": null, - "address": 41077, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, - "temp_comp_mode": { - "implemented": true, - "scale_factor": null, - "address": 41078, - "registers": [ - 1 - ], - "raw_value": "", - "value": "" - }, "temp_comp_lower_limit_volts": { "implemented": true, - "scale_factor": -1, - "address": 41079, + "address": 40961, "registers": [ 530 ], - "raw_value": 530, "value": 53.0 }, "temp_comp_upper_limit_volts": { "implemented": true, - "scale_factor": -1, - "address": 41080, + "address": 40962, "registers": [ 630 ], - "raw_value": 630, "value": 63.0 }, - "temp_comp_slope": { - "implemented": false, - "scale_factor": null, - "address": 41081, - "registers": [ - 65535 - ], - "raw_value": null, - "value": null - }, - "auto_restart_mode": { - "implemented": true, - "scale_factor": null, - "address": 41082, - "registers": [ - 2 - ], - "raw_value": "", - "value": "" - }, "wakeup_voc": { "implemented": true, - "scale_factor": -1, - "address": 41083, + "address": 40965, "registers": [ 60 ], - "raw_value": 60, "value": 6.0 }, "snooze_mode_amps": { "implemented": true, - "scale_factor": -1, - "address": 41084, + "address": 40966, "registers": [ 6 ], - "raw_value": 6, "value": 0.6 }, - "wakeup_interval": { - "implemented": true, - "scale_factor": null, - "address": 41085, - "registers": [ - 5 - ], - "raw_value": 5, - "value": 5 - }, - "aux_mode": { - "implemented": true, - "scale_factor": null, - "address": 41086, - "registers": [ - 2 - ], - "raw_value": "", - "value": "" - }, - "aux_control": { - "implemented": true, - "scale_factor": null, - "address": 41087, - "registers": [ - 2 - ], - "raw_value": "", - "value": "" - }, - "aux_state": { - "implemented": true, - "scale_factor": null, - "address": 41088, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, - "aux_polarity": { - "implemented": true, - "scale_factor": null, - "address": 41089, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, "aux_low_battery_disconnect": { "implemented": true, - "scale_factor": -1, - "address": 41090, + "address": 40972, "registers": [ 544 ], - "raw_value": 544, "value": 54.4 }, "aux_low_battery_reconnect": { "implemented": true, - "scale_factor": -1, - "address": 41091, + "address": 40973, "registers": [ 576 ], - "raw_value": 576, "value": 57.6 }, - "aux_low_battery_disconnect_delay": { - "implemented": true, - "scale_factor": null, - "address": 41092, - "registers": [ - 1 - ], - "raw_value": 1, - "value": 1 - }, "aux_vent_fan_volts": { "implemented": true, - "scale_factor": -1, - "address": 41093, + "address": 40975, "registers": [ - 576 + 560 ], - "raw_value": 576, - "value": 57.6 + "value": 56.0 }, "aux_pv_limit_volts": { "implemented": true, - "scale_factor": -1, - "address": 41094, + "address": 40976, "registers": [ 1400 ], - "raw_value": 1400, "value": 140.0 }, "aux_pv_limit_hold_time": { "implemented": true, - "scale_factor": -1, - "address": 41095, + "address": 40977, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "aux_night_light_thres_volts": { "implemented": true, - "scale_factor": -1, - "address": 41096, + "address": 40978, "registers": [ 100 ], - "raw_value": 100, "value": 10.0 }, - "night_light_on_hours": { - "implemented": true, - "scale_factor": null, - "address": 41097, - "registers": [ - 4 - ], - "raw_value": 4, - "value": 4 - }, - "night_light_on_hyst_time": { - "implemented": true, - "scale_factor": null, - "address": 41098, - "registers": [ - 1 - ], - "raw_value": 1, - "value": 1 - }, - "night_light_off_hyst_time": { - "implemented": true, - "scale_factor": null, - "address": 41099, - "registers": [ - 1 - ], - "raw_value": 1, - "value": 1 - }, "aux_error_battery_volts": { "implemented": true, - "scale_factor": -1, - "address": 41100, + "address": 40982, "registers": [ 460 ], - "raw_value": 460, "value": 46.0 }, "aux_divert_hold_time": { "implemented": true, - "scale_factor": -1, - "address": 41101, + "address": 40983, "registers": [ 50 ], - "raw_value": 50, "value": 5.0 }, - "aux_divert_delay_time": { - "implemented": true, - "scale_factor": null, - "address": 41102, - "registers": [ - 8 - ], - "raw_value": 8, - "value": 8 - }, "aux_divert_relative_volts": { "implemented": true, - "scale_factor": -1, - "address": 41103, + "address": 40985, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "aux_divert_hyst_volts": { "implemented": true, - "scale_factor": -1, - "address": 41104, + "address": 40986, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, - "major_firmware_number": { + "data_log_daily_ah": { "implemented": true, - "scale_factor": null, - "address": 41105, + "address": 40992, "registers": [ 3 ], - "raw_value": 3, "value": 3 }, - "mid_firmware_number": { + "data_log_daily_kwh": { "implemented": true, - "scale_factor": null, - "address": 41106, + "address": 40993, "registers": [ - 3 + 1 ], - "raw_value": 3, - "value": 3 + "value": 0.1 }, - "minor_firmware_number": { + "data_log_daily_max_output_amps": { "implemented": true, - "scale_factor": null, - "address": 41107, + "address": 40994, "registers": [ - 0 + 88 ], - "raw_value": 0, - "value": 0 + "value": 8.8 }, - "set_data_log_day_offset": { + "data_log_daily_max_output_watts": { "implemented": true, - "scale_factor": null, - "address": 41108, + "address": 40995, "registers": [ - 0 + 447 ], - "raw_value": 0, - "value": 0 + "value": 447 }, - "get_current_data_log_day_offset": { + "data_log_daily_min_battery_volts": { "implemented": true, - "scale_factor": null, - "address": 41109, + "address": 40998, + "registers": [ + 495 + ], + "value": 49.5 + }, + "data_log_daily_max_battery_volts": { + "implemented": true, + "address": 40999, + "registers": [ + 519 + ], + "value": 51.9 + }, + "battery_voltage_calibrate_offset": { + "implemented": true, + "address": 41007, "registers": [ 0 ], - "raw_value": 0, - "value": 0 + "value": 0.0 + } + } + }, + { + "name": "ChargeControllerDevice", + "address": 41026, + "values": { + "did": { + "implemented": true, + "address": 41026, + "registers": [ + 64111 + ], + "value": 64111 }, - "data_log_daily_ah": { + "length": { "implemented": true, - "scale_factor": 0, - "address": 41110, + "address": 41027, "registers": [ - 3 + 26 ], - "raw_value": 3, - "value": 3 + "value": 26 }, - "data_log_daily_kwh": { + "port_number": { "implemented": true, - "scale_factor": -1, - "address": 41111, + "address": 41028, "registers": [ - 1 + 4 ], - "raw_value": 1, - "value": 0.1 + "value": 4 }, - "data_log_daily_max_output_amps": { + "voltage_scale_factor": { "implemented": true, - "scale_factor": -1, - "address": 41112, + "address": 41029, "registers": [ - 59 + 65535 ], - "raw_value": 59, - "value": 5.9 + "value": -1 }, - "data_log_daily_max_output_watts": { + "current_scale_factor": { "implemented": true, - "scale_factor": 0, - "address": 41113, + "address": 41030, "registers": [ - 304 + 65535 ], - "raw_value": 304, - "value": 304 + "value": -1 }, - "data_log_daily_absorb_time": { + "power_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 41114, + "address": 41031, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "data_log_daily_float_time": { + "ah_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 41115, + "address": 41032, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "data_log_daily_min_battery_volts": { + "kwh_scale_factor": { "implemented": true, - "scale_factor": -1, - "address": 41116, + "address": 41033, "registers": [ - 496 + 65535 ], - "raw_value": 496, - "value": 49.6 + "value": -1 }, - "data_log_daily_max_battery_volts": { + "charger_state": { "implemented": true, - "scale_factor": -1, - "address": 41117, + "address": 41038, "registers": [ - 521 + 2 ], - "raw_value": 521, - "value": 52.1 + "value": "" }, - "data_log_daily_max_input_volts": { + "todays_peak_voc": { "implemented": true, - "scale_factor": null, - "address": 41118, + "address": 41043, "registers": [ 100 ], - "raw_value": 100, "value": 100 }, - "clear_data_log_read": { + "lifetime_kwh_hours": { "implemented": true, - "scale_factor": null, - "address": 41119, + "address": 41046, "registers": [ - 41149 + 6230 ], - "raw_value": 41149, - "value": 41149 + "value": 6230 }, - "stats_maximum_reset_read": { + "temp_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 41121, + "address": 41051, "registers": [ - 59435 + 0 ], - "raw_value": 59435, - "value": 59435 + "value": 0 }, - "stats_totals_reset_read": { + "battery_voltage": { "implemented": true, - "scale_factor": null, - "address": 41123, + "address": 41034, "registers": [ - 59713 + 507 ], - "raw_value": 59713, - "value": 59713 + "value": 50.7 }, - "battery_voltage_calibrate_offset": { + "array_voltage": { "implemented": true, - "scale_factor": -1, - "address": 41125, + "address": 41035, "registers": [ - 0 + 831 ], - "raw_value": 0, - "value": 0.0 + "value": 83.1 }, - "serial_number": { - "implemented": false, - "scale_factor": null, - "address": 41126, + "battery_current": { + "implemented": true, + "address": 41036, "registers": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 + 55 ], - "raw_value": null, - "value": null + "value": 5.5 }, - "model_number": { + "array_current": { "implemented": true, - "scale_factor": null, - "address": 41135, + "address": 41037, "registers": [ - 17997, - 14384, - 11569, - 13616, - 22084, - 17152, - 0, - 0, - 0 + 3 ], - "raw_value": "FM80-150VDC", - "value": "FM80-150VDC" - } - } - }, - { - "name": "FNDCDeviceValues", - "address": 41144, - "values": { - "did": { + "value": 3 + }, + "watts": { "implemented": true, - "scale_factor": null, - "address": 41144, + "address": 41039, "registers": [ - 64118 + 278 ], - "raw_value": 64118, - "value": 64118 + "value": 278 }, - "length": { + "todays_min_battery_volts": { "implemented": true, - "scale_factor": null, - "address": 41145, + "address": 41040, "registers": [ - 76 + 496 ], - "raw_value": 76, - "value": 76 + "value": 49.6 }, - "port_number": { + "todays_max_battery_volts": { "implemented": true, - "scale_factor": null, - "address": 41146, + "address": 41041, + "registers": [ + 521 + ], + "value": 52.1 + }, + "voc": { + "implemented": true, + "address": 41042, + "registers": [ + 1009 + ], + "value": 100.9 + }, + "todays_kwh": { + "implemented": true, + "address": 41044, + "registers": [ + 1 + ], + "value": 0.1 + }, + "todays_ah": { + "implemented": true, + "address": 41045, + "registers": [ + 3 + ], + "value": 3 + }, + "lifetime_k_amp_hours": { + "implemented": true, + "address": 41047, + "registers": [ + 1120 + ], + "value": 112.0 + }, + "lifetime_max_watts": { + "implemented": true, + "address": 41048, + "registers": [ + 3072 + ], + "value": 3072 + }, + "lifetime_max_battery_volts": { + "implemented": true, + "address": 41049, + "registers": [ + 646 + ], + "value": 64.6 + }, + "lifetime_max_voc": { + "implemented": true, + "address": 41050, + "registers": [ + 1384 + ], + "value": 138.4 + }, + "temp_output_fets": { + "implemented": false, + "address": 41052, + "registers": [ + 32768 + ], + "value": null + }, + "temp_enclosure": { + "implemented": false, + "address": 41053, + "registers": [ + 32768 + ], + "value": null + } + } + }, + { + "name": "ChargeControllerConfigurationModel", + "address": 41054, + "values": { + "did": { + "implemented": true, + "address": 41054, + "registers": [ + 64112 + ], + "value": 64112 + }, + "length": { + "implemented": true, + "address": 41055, + "registers": [ + 88 + ], + "value": 88 + }, + "port_number": { + "implemented": true, + "address": 41056, + "registers": [ + 4 + ], + "value": 4 + }, + "voltage_scale_factor": { + "implemented": true, + "address": 41057, + "registers": [ + 65535 + ], + "value": -1 + }, + "current_scale_factor": { + "implemented": true, + "address": 41058, + "registers": [ + 65535 + ], + "value": -1 + }, + "hours_scale_factor": { + "implemented": true, + "address": 41059, + "registers": [ + 65535 + ], + "value": -1 + }, + "power_scale_factor": { + "implemented": true, + "address": 41060, + "registers": [ + 0 + ], + "value": 0 + }, + "ah_scale_factor": { + "implemented": true, + "address": 41061, + "registers": [ + 0 + ], + "value": 0 + }, + "kwh_scale_factor": { + "implemented": true, + "address": 41062, + "registers": [ + 65535 + ], + "value": -1 + }, + "faults": { + "implemented": true, + "address": 41063, + "registers": [ + 0 + ], + "value": 0 + }, + "absorb_end_amps": { + "implemented": true, + "address": 41066, + "registers": [ + 0 + ], + "value": 0 + }, + "eq_time_hours": { + "implemented": true, + "address": 41071, + "registers": [ + 1 + ], + "value": 1 + }, + "auto_eq_days": { + "implemented": true, + "address": 41072, + "registers": [ + 0 + ], + "value": 0 + }, + "mppt_mode": { + "implemented": true, + "address": 41073, + "registers": [ + 0 + ], + "value": "" + }, + "sweep_width": { + "implemented": true, + "address": 41074, + "registers": [ + 1 + ], + "value": "" + }, + "sweep_max_percentage": { + "implemented": true, + "address": 41075, + "registers": [ + 2 + ], + "value": "" + }, + "grid_tie_mode": { + "implemented": true, + "address": 41077, + "registers": [ + 0 + ], + "value": "" + }, + "temp_comp_mode": { + "implemented": true, + "address": 41078, + "registers": [ + 1 + ], + "value": "" + }, + "temp_comp_slope": { + "implemented": false, + "address": 41081, + "registers": [ + 65535 + ], + "value": null + }, + "auto_restart_mode": { + "implemented": true, + "address": 41082, + "registers": [ + 2 + ], + "value": "" + }, + "wakeup_interval": { + "implemented": true, + "address": 41085, + "registers": [ + 5 + ], + "value": 5 + }, + "aux_mode": { + "implemented": true, + "address": 41086, + "registers": [ + 2 + ], + "value": "" + }, + "aux_control": { + "implemented": true, + "address": 41087, + "registers": [ + 2 + ], + "value": "" + }, + "aux_state": { + "implemented": true, + "address": 41088, + "registers": [ + 0 + ], + "value": "" + }, + "aux_polarity": { + "implemented": true, + "address": 41089, + "registers": [ + 0 + ], + "value": "" + }, + "aux_low_battery_disconnect_delay": { + "implemented": true, + "address": 41092, + "registers": [ + 1 + ], + "value": 1 + }, + "night_light_on_hours": { + "implemented": true, + "address": 41097, + "registers": [ + 4 + ], + "value": 4 + }, + "night_light_on_hyst_time": { + "implemented": true, + "address": 41098, + "registers": [ + 1 + ], + "value": 1 + }, + "night_light_off_hyst_time": { + "implemented": true, + "address": 41099, + "registers": [ + 1 + ], + "value": 1 + }, + "aux_divert_delay_time": { + "implemented": true, + "address": 41102, + "registers": [ + 8 + ], + "value": 8 + }, + "major_firmware_number": { + "implemented": true, + "address": 41105, + "registers": [ + 3 + ], + "value": 3 + }, + "mid_firmware_number": { + "implemented": true, + "address": 41106, + "registers": [ + 3 + ], + "value": 3 + }, + "minor_firmware_number": { + "implemented": true, + "address": 41107, + "registers": [ + 0 + ], + "value": 0 + }, + "set_data_log_day_offset": { + "implemented": true, + "address": 41108, + "registers": [ + 0 + ], + "value": 0 + }, + "get_current_data_log_day_offset": { + "implemented": true, + "address": 41109, + "registers": [ + 0 + ], + "value": 0 + }, + "data_log_daily_absorb_time": { + "implemented": true, + "address": 41114, + "registers": [ + 0 + ], + "value": 0 + }, + "data_log_daily_float_time": { + "implemented": true, + "address": 41115, + "registers": [ + 0 + ], + "value": 0 + }, + "data_log_daily_max_input_volts": { + "implemented": true, + "address": 41118, + "registers": [ + 100 + ], + "value": 100 + }, + "clear_data_log_read": { + "implemented": true, + "address": 41119, + "registers": [ + 41149 + ], + "value": 41149 + }, + "stats_maximum_reset_read": { + "implemented": true, + "address": 41121, + "registers": [ + 59435 + ], + "value": 59435 + }, + "stats_totals_reset_read": { + "implemented": true, + "address": 41123, + "registers": [ + 59713 + ], + "value": 59713 + }, + "serial_number": { + "implemented": false, + "address": 41126, + "registers": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "value": null + }, + "model_number": { + "implemented": true, + "address": 41135, + "registers": [ + 17997, + 14384, + 11569, + 13616, + 22084, + 17152, + 0, + 0, + 0 + ], + "value": "b'FM80-150VDC'" + }, + "absorb_volts": { + "implemented": true, + "address": 41064, + "registers": [ + 588 + ], + "value": 58.8 + }, + "absorb_time_hours": { + "implemented": true, + "address": 41065, + "registers": [ + 30 + ], + "value": 3.0 + }, + "rebulk_volts": { + "implemented": true, + "address": 41067, + "registers": [ + 480 + ], + "value": 48.0 + }, + "float_volts": { + "implemented": true, + "address": 41068, + "registers": [ + 552 + ], + "value": 55.2 + }, + "bulk_current": { + "implemented": true, + "address": 41069, + "registers": [ + 800 + ], + "value": 80.0 + }, + "eq_volts": { + "implemented": true, + "address": 41070, + "registers": [ + 636 + ], + "value": 63.6 + }, + "u_pick_pwm_duty_cycle": { + "implemented": true, + "address": 41076, + "registers": [ + 770 + ], + "value": 77.0 + }, + "temp_comp_lower_limit_volts": { + "implemented": true, + "address": 41079, + "registers": [ + 530 + ], + "value": 53.0 + }, + "temp_comp_upper_limit_volts": { + "implemented": true, + "address": 41080, + "registers": [ + 630 + ], + "value": 63.0 + }, + "wakeup_voc": { + "implemented": true, + "address": 41083, + "registers": [ + 60 + ], + "value": 6.0 + }, + "snooze_mode_amps": { + "implemented": true, + "address": 41084, + "registers": [ + 6 + ], + "value": 0.6 + }, + "aux_low_battery_disconnect": { + "implemented": true, + "address": 41090, + "registers": [ + 544 + ], + "value": 54.4 + }, + "aux_low_battery_reconnect": { + "implemented": true, + "address": 41091, + "registers": [ + 576 + ], + "value": 57.6 + }, + "aux_vent_fan_volts": { + "implemented": true, + "address": 41093, + "registers": [ + 576 + ], + "value": 57.6 + }, + "aux_pv_limit_volts": { + "implemented": true, + "address": 41094, + "registers": [ + 1400 + ], + "value": 140.0 + }, + "aux_pv_limit_hold_time": { + "implemented": true, + "address": 41095, + "registers": [ + 0 + ], + "value": 0.0 + }, + "aux_night_light_thres_volts": { + "implemented": true, + "address": 41096, + "registers": [ + 100 + ], + "value": 10.0 + }, + "aux_error_battery_volts": { + "implemented": true, + "address": 41100, + "registers": [ + 460 + ], + "value": 46.0 + }, + "aux_divert_hold_time": { + "implemented": true, + "address": 41101, + "registers": [ + 50 + ], + "value": 5.0 + }, + "aux_divert_relative_volts": { + "implemented": true, + "address": 41103, + "registers": [ + 0 + ], + "value": 0.0 + }, + "aux_divert_hyst_volts": { + "implemented": true, + "address": 41104, + "registers": [ + 0 + ], + "value": 0.0 + }, + "data_log_daily_ah": { + "implemented": true, + "address": 41110, + "registers": [ + 3 + ], + "value": 3 + }, + "data_log_daily_kwh": { + "implemented": true, + "address": 41111, + "registers": [ + 1 + ], + "value": 0.1 + }, + "data_log_daily_max_output_amps": { + "implemented": true, + "address": 41112, + "registers": [ + 59 + ], + "value": 5.9 + }, + "data_log_daily_max_output_watts": { + "implemented": true, + "address": 41113, + "registers": [ + 304 + ], + "value": 304 + }, + "data_log_daily_min_battery_volts": { + "implemented": true, + "address": 41116, + "registers": [ + 496 + ], + "value": 49.6 + }, + "data_log_daily_max_battery_volts": { + "implemented": true, + "address": 41117, + "registers": [ + 521 + ], + "value": 52.1 + }, + "battery_voltage_calibrate_offset": { + "implemented": true, + "address": 41125, + "registers": [ + 0 + ], + "value": 0.0 + } + } + }, + { + "name": "FNDCDevice", + "address": 41144, + "values": { + "did": { + "implemented": true, + "address": 41144, + "registers": [ + 64118 + ], + "value": 64118 + }, + "length": { + "implemented": true, + "address": 41145, + "registers": [ + 76 + ], + "value": 76 + }, + "port_number": { + "implemented": true, + "address": 41146, "registers": [ 5 ], - "raw_value": 5, "value": 5 }, "dc_voltage_scale_factor": { "implemented": true, - "scale_factor": null, "address": 41147, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "dc_current_scale_factor": { "implemented": true, - "scale_factor": null, "address": 41148, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "time_scale_factor": { "implemented": true, - "scale_factor": null, "address": 41149, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "kwh_scale_factor": { "implemented": true, - "scale_factor": null, - "address": 41150, + "address": 41150, + "registers": [ + 65534 + ], + "value": -2 + }, + "kw_scale_factor": { + "implemented": true, + "address": 41151, + "registers": [ + 65534 + ], + "value": -2 + }, + "battery_temperature": { + "implemented": true, + "address": 41157, + "registers": [ + 12 + ], + "value": 12 + }, + "status_flags": { + "implemented": true, + "address": 41158, + "registers": [ + 0 + ], + "value": 0 + }, + "shunt_a_accumulated_ah": { + "implemented": true, + "address": 41159, + "registers": [ + 7 + ], + "value": 7 + }, + "shunt_b_accumulated_ah": { + "implemented": true, + "address": 41161, + "registers": [ + 65514 + ], + "value": -22 + }, + "shunt_c_accumulated_ah": { + "implemented": true, + "address": 41163, + "registers": [ + 2 + ], + "value": 2 + }, + "state_of_charge": { + "implemented": true, + "address": 41171, + "registers": [ + 96 + ], + "value": 96 + }, + "todays_minimum_soc": { + "implemented": true, + "address": 41172, + "registers": [ + 96 + ], + "value": 96 + }, + "todays_maximum_soc": { + "implemented": true, + "address": 41173, + "registers": [ + 100 + ], + "value": 100 + }, + "todays_net_input_ah": { + "implemented": true, + "address": 41174, + "registers": [ + 9 + ], + "value": 9 + }, + "todays_net_output_ah": { + "implemented": true, + "address": 41176, + "registers": [ + 21 + ], + "value": 21 + }, + "todays_net_battery_ah": { + "implemented": true, + "address": 41178, + "registers": [ + 65524 + ], + "value": -12 + }, + "charge_factor_corrected_net_battery_ah": { + "implemented": true, + "address": 41180, + "registers": [ + 65523 + ], + "value": -13 + }, + "todays_minimum_battery_time": { + "implemented": true, + "address": 41183, + "registers": [ + 29725, + 24557 + ], + "value": 1948082157 + }, + "todays_maximum_battery_time": { + "implemented": true, + "address": 41186, + "registers": [ + 63585, + 24556 + ], + "value": 4167131116 + }, + "cycle_charge_factor": { + "implemented": true, + "address": 41188, + "registers": [ + 0 + ], + "value": 0 + }, + "cycle_kwh_charge_efficiency": { + "implemented": true, + "address": 41189, + "registers": [ + 10 + ], + "value": 10 + }, + "lifetime_k_ah_removed": { + "implemented": true, + "address": 41191, + "registers": [ + 200 + ], + "value": 200 + }, + "shunt_a_historical_returned_to_battery_ah": { + "implemented": true, + "address": 41192, + "registers": [ + 7 + ], + "value": 7 + }, + "shunt_a_historical_removed_from_battery_ah": { + "implemented": true, + "address": 41194, + "registers": [ + 0 + ], + "value": 0 + }, + "shunt_b_historical_returned_to_battery_ah": { + "implemented": true, + "address": 41200, + "registers": [ + 0 + ], + "value": 0 + }, + "shunt_b_historical_removed_from_battery_ah": { + "implemented": true, + "address": 41202, + "registers": [ + 22 + ], + "value": 22 + }, + "shunt_c_historical_returned_to_battery_ah": { + "implemented": true, + "address": 41208, + "registers": [ + 2 + ], + "value": 2 + }, + "shunt_c_historical_removed_from_battery_ah": { + "implemented": true, + "address": 41210, + "registers": [ + 0 + ], + "value": 0 + }, + "shunt_a_reset_maximum_data": { + "implemented": true, + "address": 41216, + "registers": [ + 17519 + ], + "value": 17519 + }, + "shunt_b_reset_maximum_data": { + "implemented": true, + "address": 41218, "registers": [ - 65534 + 6149 ], - "raw_value": -2, - "value": -2 + "value": 6149 }, - "kw_scale_factor": { + "shunt_c_reset_maximum_data": { "implemented": true, - "scale_factor": null, - "address": 41151, + "address": 41220, "registers": [ - 65534 + 16147 ], - "raw_value": -2, - "value": -2 + "value": 16147 }, "shunt_a_current": { "implemented": true, - "scale_factor": -1, "address": 41152, "registers": [ 128 ], - "raw_value": 128, "value": 12.8 }, "shunt_b_current": { "implemented": true, - "scale_factor": -1, "address": 41153, "registers": [ 65370 ], - "raw_value": -166, "value": -16.6 }, "shunt_c_current": { "implemented": true, - "scale_factor": -1, "address": 41154, "registers": [ 1 ], - "raw_value": 1, "value": 0.1 }, "battery_voltage": { "implemented": true, - "scale_factor": -1, "address": 41155, "registers": [ 506 ], - "raw_value": 506, "value": 50.6 }, "battery_current": { "implemented": true, - "scale_factor": -1, "address": 41156, "registers": [ 65499 ], - "raw_value": -37, "value": -3.7 }, - "battery_temperature": { - "implemented": true, - "scale_factor": null, - "address": 41157, - "registers": [ - 12 - ], - "raw_value": 12, - "value": 12 - }, - "status_flags": { - "implemented": true, - "scale_factor": null, - "address": 41158, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "shunt_a_accumulated_ah": { - "implemented": true, - "scale_factor": null, - "address": 41159, - "registers": [ - 7 - ], - "raw_value": 7, - "value": 7 - }, "shunt_a_accumulated_kwh": { "implemented": true, - "scale_factor": -2, "address": 41160, "registers": [ 40 ], - "raw_value": 40, "value": 0.4 }, - "shunt_b_accumulated_ah": { - "implemented": true, - "scale_factor": null, - "address": 41161, - "registers": [ - 65514 - ], - "raw_value": -22, - "value": -22 - }, "shunt_b_accumulated_kwh": { "implemented": true, - "scale_factor": -2, "address": 41162, "registers": [ 65420 ], - "raw_value": -116, "value": -1.16 }, - "shunt_c_accumulated_ah": { - "implemented": true, - "scale_factor": null, - "address": 41163, - "registers": [ - 2 - ], - "raw_value": 2, - "value": 2 - }, "shunt_c_accumulated_kwh": { "implemented": true, - "scale_factor": -2, "address": 41164, "registers": [ 15 ], - "raw_value": 15, "value": 0.15 }, "input_current": { "implemented": true, - "scale_factor": -1, "address": 41165, "registers": [ 129 ], - "raw_value": 129, "value": 12.9 }, "output_current": { "implemented": true, - "scale_factor": -1, "address": 41166, "registers": [ 166 ], - "raw_value": 166, "value": 16.6 }, "input_kw": { "implemented": true, - "scale_factor": -2, "address": 41167, "registers": [ 66 ], - "raw_value": 66, "value": 0.66 }, "output_kw": { "implemented": true, - "scale_factor": -2, "address": 41168, "registers": [ 84 ], - "raw_value": 84, "value": 0.84 }, "net_kw": { "implemented": true, - "scale_factor": -2, "address": 41169, "registers": [ 65518 ], - "raw_value": -18, "value": -0.18 }, "days_since_charge_parameters_met": { "implemented": true, - "scale_factor": -1, "address": 41170, "registers": [ 7 ], - "raw_value": 7, "value": 0.7 }, - "state_of_charge": { - "implemented": true, - "scale_factor": null, - "address": 41171, - "registers": [ - 96 - ], - "raw_value": 96, - "value": 96 - }, - "todays_minimum_soc": { - "implemented": true, - "scale_factor": null, - "address": 41172, - "registers": [ - 96 - ], - "raw_value": 96, - "value": 96 - }, - "todays_maximum_soc": { - "implemented": true, - "scale_factor": null, - "address": 41173, - "registers": [ - 100 - ], - "raw_value": 100, - "value": 100 - }, - "todays_net_input_ah": { - "implemented": true, - "scale_factor": null, - "address": 41174, - "registers": [ - 9 - ], - "raw_value": 9, - "value": 9 - }, "todays_net_input_kwh": { "implemented": true, - "scale_factor": -2, "address": 41175, "registers": [ 47 ], - "raw_value": 47, "value": 0.47 }, - "todays_net_output_ah": { - "implemented": true, - "scale_factor": null, - "address": 41176, - "registers": [ - 21 - ], - "raw_value": 21, - "value": 21 - }, "todays_net_output_kwh": { "implemented": true, - "scale_factor": -2, "address": 41177, "registers": [ 108 ], - "raw_value": 108, "value": 1.08 }, - "todays_net_battery_ah": { - "implemented": true, - "scale_factor": null, - "address": 41178, - "registers": [ - 65524 - ], - "raw_value": -12, - "value": -12 - }, "todays_net_battery_kwh": { "implemented": true, - "scale_factor": -2, "address": 41179, "registers": [ 65475 ], - "raw_value": -61, "value": -0.61 }, - "charge_factor_corrected_net_battery_ah": { - "implemented": true, - "scale_factor": null, - "address": 41180, - "registers": [ - 65523 - ], - "raw_value": -13, - "value": -13 - }, "charge_factor_corrected_net_battery_kwh": { "implemented": true, - "scale_factor": -2, "address": 41181, "registers": [ 65472 ], - "raw_value": -64, "value": -0.64 }, "todays_minimum_battery_voltage": { "implemented": true, - "scale_factor": -1, "address": 41182, "registers": [ 498 ], - "raw_value": 498, "value": 49.8 }, - "todays_minimum_battery_time": { - "implemented": true, - "scale_factor": null, - "address": 41183, - "registers": [ - 29725, - 24557 - ], - "raw_value": 1948082157, - "value": 1948082157 - }, "todays_maximum_battery_voltage": { "implemented": true, - "scale_factor": -1, "address": 41185, "registers": [ 520 ], - "raw_value": 520, "value": 52.0 }, - "todays_maximum_battery_time": { - "implemented": true, - "scale_factor": null, - "address": 41186, - "registers": [ - 63585, - 24556 - ], - "raw_value": 4167131116, - "value": 4167131116 - }, - "cycle_charge_factor": { - "implemented": true, - "scale_factor": null, - "address": 41188, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "cycle_kwh_charge_efficiency": { - "implemented": true, - "scale_factor": null, - "address": 41189, - "registers": [ - 10 - ], - "raw_value": 10, - "value": 10 - }, "total_days_at_100_percent": { "implemented": true, - "scale_factor": -1, "address": 41190, "registers": [ 2469 ], - "raw_value": 2469, "value": 246.9 }, - "lifetime_k_ah_removed": { - "implemented": true, - "scale_factor": null, - "address": 41191, - "registers": [ - 200 - ], - "raw_value": 200, - "value": 200 - }, - "shunt_a_historical_returned_to_battery_ah": { - "implemented": true, - "scale_factor": null, - "address": 41192, - "registers": [ - 7 - ], - "raw_value": 7, - "value": 7 - }, "shunt_a_historical_returned_to_battery_kwh": { "implemented": true, - "scale_factor": -2, "address": 41193, "registers": [ 40 ], - "raw_value": 40, "value": 0.4 }, - "shunt_a_historical_removed_from_battery_ah": { - "implemented": true, - "scale_factor": null, - "address": 41194, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, "shunt_a_historical_removed_from_battery_kwh": { "implemented": true, - "scale_factor": -2, "address": 41195, "registers": [ 1 ], - "raw_value": 1, "value": 0.01 }, "shunt_a_maximum_charge_rate": { "implemented": true, - "scale_factor": -1, "address": 41196, "registers": [ 141 ], - "raw_value": 141, "value": 14.1 }, "shunt_a_maximum_charge_rate_kw": { "implemented": true, - "scale_factor": -2, "address": 41197, "registers": [ 72 ], - "raw_value": 72, "value": 0.72 }, "shunt_a_maximum_discharge_rate": { "implemented": true, - "scale_factor": -1, "address": 41198, "registers": [ 65532 ], - "raw_value": -4, "value": -0.4 }, "shunt_a_maximum_discharge_rate_kw": { "implemented": true, - "scale_factor": -2, "address": 41199, "registers": [ 65534 ], - "raw_value": -2, "value": -0.02 }, - "shunt_b_historical_returned_to_battery_ah": { - "implemented": true, - "scale_factor": null, - "address": 41200, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, "shunt_b_historical_returned_to_battery_kwh": { "implemented": true, - "scale_factor": -2, "address": 41201, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, - "shunt_b_historical_removed_from_battery_ah": { - "implemented": true, - "scale_factor": null, - "address": 41202, - "registers": [ - 22 - ], - "raw_value": 22, - "value": 22 - }, "shunt_b_historical_removed_from_battery_kwh": { "implemented": true, - "scale_factor": -2, "address": 41203, "registers": [ 116 ], - "raw_value": 116, "value": 1.16 }, "shunt_b_maximum_charge_rate": { "implemented": true, - "scale_factor": -1, "address": 41204, "registers": [ 1 ], - "raw_value": 1, "value": 0.1 }, "shunt_b_maximum_charge_rate_kw": { "implemented": true, - "scale_factor": -2, "address": 41205, "registers": [ 1 ], - "raw_value": 1, "value": 0.01 }, "shunt_b_maximum_discharge_rate": { "implemented": true, - "scale_factor": -1, "address": 41206, "registers": [ 65169 ], - "raw_value": -367, "value": -36.7 }, "shunt_b_maximum_discharge_rate_kw": { "implemented": true, - "scale_factor": -2, "address": 41207, "registers": [ 65353 ], - "raw_value": -183, "value": -1.83 }, - "shunt_c_historical_returned_to_battery_ah": { - "implemented": true, - "scale_factor": null, - "address": 41208, - "registers": [ - 2 - ], - "raw_value": 2, - "value": 2 - }, "shunt_c_historical_returned_to_battery_kwh": { "implemented": true, - "scale_factor": -2, "address": 41209, "registers": [ 15 ], - "raw_value": 15, "value": 0.15 }, - "shunt_c_historical_removed_from_battery_ah": { - "implemented": true, - "scale_factor": null, - "address": 41210, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, "shunt_c_historical_removed_from_battery_kwh": { "implemented": true, - "scale_factor": -2, "address": 41211, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "shunt_c_maximum_charge_rate": { "implemented": true, - "scale_factor": -1, "address": 41212, "registers": [ 3 ], - "raw_value": 3, "value": 0.3 }, "shunt_c_maximum_charge_rate_kw": { "implemented": true, - "scale_factor": -2, "address": 41213, "registers": [ 2 ], - "raw_value": 2, "value": 0.02 }, "shunt_c_maximum_discharge_rate": { "implemented": true, - "scale_factor": -1, "address": 41214, "registers": [ 65535 ], - "raw_value": -1, "value": -0.1 }, "shunt_c_maximum_discharge_rate_kw": { "implemented": true, - "scale_factor": -2, "address": 41215, "registers": [ 65535 ], - "raw_value": -1, "value": -0.01 - }, - "shunt_a_reset_maximum_data": { - "implemented": true, - "scale_factor": null, - "address": 41216, - "registers": [ - 17519 - ], - "raw_value": 17519, - "value": 17519 - }, - "shunt_b_reset_maximum_data": { - "implemented": true, - "scale_factor": null, - "address": 41218, - "registers": [ - 6149 - ], - "raw_value": 6149, - "value": 6149 - }, - "shunt_c_reset_maximum_data": { - "implemented": true, - "scale_factor": null, - "address": 41220, - "registers": [ - 16147 - ], - "raw_value": 16147, - "value": 16147 } } }, { - "name": "FLEXnetDCConfigurationValues", + "name": "FLEXnetDCConfigurationModel", "address": 41222, "values": { "did": { "implemented": true, - "scale_factor": null, "address": 41222, "registers": [ 64119 ], - "raw_value": 64119, "value": 64119 }, "length": { "implemented": true, - "scale_factor": null, "address": 41223, "registers": [ 52 ], - "raw_value": 52, "value": 52 }, "port_number": { "implemented": true, - "scale_factor": null, "address": 41224, "registers": [ 5 ], - "raw_value": 5, "value": 5 }, "dc_voltage_scale_factor": { "implemented": true, - "scale_factor": null, "address": 41225, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "dc_current_scale_factor": { "implemented": true, - "scale_factor": null, "address": 41226, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "kwh_scale_factor": { "implemented": true, - "scale_factor": null, "address": 41227, "registers": [ 65534 ], - "raw_value": -2, "value": -2 }, "major_firmware_number": { "implemented": true, - "scale_factor": null, "address": 41228, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "mid_firmware_number": { "implemented": true, - "scale_factor": null, "address": 41229, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "minor_firmware_number": { "implemented": true, - "scale_factor": null, "address": 41230, "registers": [ 71 ], - "raw_value": 71, "value": 71 }, "battery_capacity": { "implemented": true, - "scale_factor": null, "address": 41231, "registers": [ 380 ], - "raw_value": 380, "value": 380 }, - "charged_volts": { - "implemented": true, - "scale_factor": -1, - "address": 41232, - "registers": [ - 572 - ], - "raw_value": 572, - "value": 57.2 - }, "charged_time": { "implemented": true, - "scale_factor": null, "address": 41233, "registers": [ 30 ], - "raw_value": 30, "value": 30 }, - "battery_charged_amps": { - "implemented": true, - "scale_factor": -1, - "address": 41234, - "registers": [ - 55 - ], - "raw_value": 55, - "value": 5.5 - }, "charge_factor": { "implemented": true, - "scale_factor": null, "address": 41235, "registers": [ 95 ], - "raw_value": 95, "value": 95 }, "shunt_a_enabled": { "implemented": true, - "scale_factor": null, "address": 41236, "registers": [ 0 ], - "raw_value": "", "value": "" }, "shunt_b_enabled": { "implemented": true, - "scale_factor": null, "address": 41237, "registers": [ 0 ], - "raw_value": "", "value": "" }, "shunt_c_enabled": { "implemented": true, - "scale_factor": null, "address": 41238, "registers": [ 0 ], - "raw_value": "", "value": "" }, "relay_control": { "implemented": true, - "scale_factor": null, "address": 41239, "registers": [ 1 ], - "raw_value": "", "value": "" }, "relay_invert_logic": { "implemented": true, - "scale_factor": null, "address": 41240, "registers": [ 1 ], - "raw_value": "", "value": "" }, - "relay_high_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 41241, - "registers": [ - 600 - ], - "raw_value": 600, - "value": 60.0 - }, - "relay_low_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 41242, - "registers": [ - 576 - ], - "raw_value": 576, - "value": 57.6 - }, "relay_soc_high": { "implemented": true, - "scale_factor": null, "address": 41243, "registers": [ 99 ], - "raw_value": 99, "value": 99 }, "relay_soc_low": { "implemented": true, - "scale_factor": null, "address": 41244, "registers": [ 80 ], - "raw_value": 80, "value": 80 }, "relay_high_enable_delay": { "implemented": true, - "scale_factor": null, "address": 41245, "registers": [ 5 ], - "raw_value": 5, "value": 5 }, "relay_low_enable_delay": { "implemented": true, - "scale_factor": null, "address": 41246, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "set_data_log_day_offset": { "implemented": true, - "scale_factor": null, "address": 41247, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "get_current_data_log_day_offset": { "implemented": true, - "scale_factor": null, "address": 41248, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "datalog_minimum_soc": { "implemented": true, - "scale_factor": null, "address": 41249, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "datalog_input_ah": { "implemented": true, - "scale_factor": null, "address": 41250, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "datalog_input_kwh": { - "implemented": true, - "scale_factor": -2, - "address": 41251, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0.0 - }, "datalog_output_ah": { "implemented": true, - "scale_factor": null, "address": 41252, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "datalog_output_kwh": { - "implemented": true, - "scale_factor": -2, - "address": 41253, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0.0 - }, "datalog_net_ah": { "implemented": true, - "scale_factor": null, "address": 41254, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "datalog_net_kwh": { - "implemented": true, - "scale_factor": -2, - "address": 41255, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0.0 - }, "clear_data_log_read": { "implemented": true, - "scale_factor": null, "address": 41256, "registers": [ 28937 ], - "raw_value": 28937, "value": 28937 }, "serial_number": { "implemented": false, - "scale_factor": null, "address": 41258, "registers": [ 0, @@ -4983,12 +4464,10 @@ 0, 0 ], - "raw_value": null, "value": null }, "model_number": { "implemented": true, - "scale_factor": null, "address": 41267, "registers": [ 17996, @@ -5001,2543 +4480,2102 @@ 0, 0 ], - "raw_value": "FLEXnet DC", - "value": "FLEXnet DC" + "value": "b'FLEXnet DC'" + }, + "charged_volts": { + "implemented": true, + "address": 41232, + "registers": [ + 572 + ], + "value": 57.2 + }, + "battery_charged_amps": { + "implemented": true, + "address": 41234, + "registers": [ + 55 + ], + "value": 5.5 + }, + "relay_high_voltage": { + "implemented": true, + "address": 41241, + "registers": [ + 600 + ], + "value": 60.0 + }, + "relay_low_voltage": { + "implemented": true, + "address": 41242, + "registers": [ + 576 + ], + "value": 57.6 + }, + "datalog_input_kwh": { + "implemented": true, + "address": 41251, + "registers": [ + 0 + ], + "value": 0.0 + }, + "datalog_output_kwh": { + "implemented": true, + "address": 41253, + "registers": [ + 0 + ], + "value": 0.0 + }, + "datalog_net_kwh": { + "implemented": true, + "address": 41255, + "registers": [ + 0 + ], + "value": 0.0 } } }, { - "name": "SinglePhaseRadianInverterDeviceValues", + "name": "SinglePhaseRadianInverterDevice", "address": 40630, "values": { "did": { "implemented": true, - "scale_factor": null, "address": 40630, "registers": [ 64117 ], - "raw_value": 64117, "value": 64117 }, "length": { "implemented": true, - "scale_factor": null, "address": 40631, "registers": [ 46 ], - "raw_value": 46, "value": 46 }, "port_number": { "implemented": true, - "scale_factor": null, "address": 40632, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, "dc_voltage_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40633, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "ac_current_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40634, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ac_voltage_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40635, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ac_frequency_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40636, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, - "inverter_output_current": { - "implemented": true, - "scale_factor": 0, - "address": 40637, - "registers": [ - 3 - ], - "raw_value": 3, - "value": 3 - }, - "inverter_charge_current": { - "implemented": true, - "scale_factor": 0, - "address": 40638, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "inverter_buy_current": { - "implemented": true, - "scale_factor": 0, - "address": 40639, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "inverter_sell_current": { - "implemented": true, - "scale_factor": 0, - "address": 40640, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "grid_input_ac_voltage": { - "implemented": true, - "scale_factor": 0, - "address": 40641, - "registers": [ - 214 - ], - "raw_value": 214, - "value": 214 - }, - "gen_input_ac_voltage": { - "implemented": true, - "scale_factor": 0, - "address": 40642, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "output_ac_voltage": { - "implemented": true, - "scale_factor": 0, - "address": 40643, - "registers": [ - 236 - ], - "raw_value": 236, - "value": 236 - }, "inverter_operating_mode": { "implemented": true, - "scale_factor": null, "address": 40644, "registers": [ 2 ], - "raw_value": "", "value": "" }, "error_flags": { "implemented": true, - "scale_factor": null, "address": 40645, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "warning_flags": { "implemented": true, - "scale_factor": null, "address": 40646, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "battery_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40647, - "registers": [ - 508 - ], - "raw_value": 508, - "value": 50.8 - }, - "temp_compensated_target_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40648, - "registers": [ - 492 - ], - "raw_value": 492, - "value": 49.2 - }, "aux_output_state": { "implemented": true, - "scale_factor": null, "address": 40649, "registers": [ 1 ], - "raw_value": "", "value": "" }, "aux_relay_output_state": { "implemented": false, - "scale_factor": null, "address": 40650, "registers": [ 65535 ], - "raw_value": null, "value": null }, "l_module_transformer_temperature": { "implemented": true, - "scale_factor": null, "address": 40651, "registers": [ 40 ], - "raw_value": 40, "value": 40 }, "l_module_capacitor_temperature": { "implemented": true, - "scale_factor": null, "address": 40652, "registers": [ 33 ], - "raw_value": 33, "value": 33 }, "l_module_fet_temperature": { "implemented": true, - "scale_factor": null, "address": 40653, "registers": [ 39 ], - "raw_value": 39, "value": 39 }, "r_module_transformer_temperature": { "implemented": false, - "scale_factor": null, "address": 40654, "registers": [ 32768 ], - "raw_value": null, "value": null }, "r_module_capacitor_temperature": { "implemented": false, - "scale_factor": null, "address": 40655, "registers": [ 32768 ], - "raw_value": null, "value": null }, "r_module_fet_temperature": { "implemented": false, - "scale_factor": null, "address": 40656, "registers": [ 32768 ], - "raw_value": null, "value": null }, "battery_temperature": { "implemented": true, - "scale_factor": null, "address": 40657, "registers": [ 12 ], - "raw_value": 12, "value": 12 }, "ac_input_selection": { "implemented": true, - "scale_factor": null, "address": 40658, "registers": [ - 0 + 0 + ], + "value": "" + }, + "ac_input_state": { + "implemented": true, + "address": 40661, + "registers": [ + 0 + ], + "value": "" + }, + "sell_status": { + "implemented": true, + "address": 40664, + "registers": [ + 80 + ], + "value": 80 + }, + "kwh_scale_factor": { + "implemented": true, + "address": 40665, + "registers": [ + 65535 + ], + "value": -1 + }, + "gt_number": { + "implemented": true, + "address": 40678, + "registers": [ + 64116 + ], + "value": 64116 + }, + "inverter_output_current": { + "implemented": true, + "address": 40637, + "registers": [ + 3 + ], + "value": 3 + }, + "inverter_charge_current": { + "implemented": true, + "address": 40638, + "registers": [ + 0 + ], + "value": 0 + }, + "inverter_buy_current": { + "implemented": true, + "address": 40639, + "registers": [ + 0 + ], + "value": 0 + }, + "inverter_sell_current": { + "implemented": true, + "address": 40640, + "registers": [ + 0 + ], + "value": 0 + }, + "grid_input_ac_voltage": { + "implemented": true, + "address": 40641, + "registers": [ + 214 + ], + "value": 214 + }, + "gen_input_ac_voltage": { + "implemented": true, + "address": 40642, + "registers": [ + 0 + ], + "value": 0 + }, + "output_ac_voltage": { + "implemented": true, + "address": 40643, + "registers": [ + 236 + ], + "value": 236 + }, + "battery_voltage": { + "implemented": true, + "address": 40647, + "registers": [ + 508 + ], + "value": 50.8 + }, + "temp_compensated_target_voltage": { + "implemented": true, + "address": 40648, + "registers": [ + 492 ], - "raw_value": "", - "value": "" + "value": 49.2 }, "ac_input_frequency": { "implemented": true, - "scale_factor": -1, "address": 40659, "registers": [ 500 ], - "raw_value": 500, "value": 50.0 }, "ac_input_voltage": { "implemented": true, - "scale_factor": 0, "address": 40660, "registers": [ 214 ], - "raw_value": 214, "value": 214 }, - "ac_input_state": { - "implemented": true, - "scale_factor": null, - "address": 40661, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, "minimum_ac_input_voltage": { "implemented": true, - "scale_factor": 0, "address": 40662, "registers": [ 210 ], - "raw_value": 210, "value": 210 }, "maximum_ac_input_voltage": { "implemented": true, - "scale_factor": 0, "address": 40663, "registers": [ 240 ], - "raw_value": 240, "value": 240 }, - "sell_status": { - "implemented": true, - "scale_factor": null, - "address": 40664, - "registers": [ - 80 - ], - "raw_value": 80, - "value": 80 - }, - "kwh_scale_factor": { - "implemented": true, - "scale_factor": null, - "address": 40665, - "registers": [ - 65535 - ], - "raw_value": -1, - "value": -1 - }, "ac1_buy_kwh": { "implemented": true, - "scale_factor": -1, "address": 40666, "registers": [ 20 ], - "raw_value": 20, "value": 2.0 }, "ac2_buy_kwh": { "implemented": true, - "scale_factor": -1, "address": 40667, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "ac1_sell_kwh": { "implemented": true, - "scale_factor": -1, "address": 40668, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "ac2_sell_kwh": { "implemented": true, - "scale_factor": -1, "address": 40669, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "output_kwh": { "implemented": true, - "scale_factor": -1, "address": 40670, "registers": [ 8 ], - "raw_value": 8, "value": 0.8 }, "charger_kwh": { "implemented": true, - "scale_factor": -1, "address": 40671, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "output_kw": { "implemented": true, - "scale_factor": -1, "address": 40672, "registers": [ 7 ], - "raw_value": 7, "value": 0.7 }, "buy_kw": { "implemented": true, - "scale_factor": -1, "address": 40673, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "sell_kw": { "implemented": true, - "scale_factor": -1, "address": 40674, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "charge_kw": { "implemented": true, - "scale_factor": -1, "address": 40675, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "load_kw": { "implemented": true, - "scale_factor": -1, "address": 40676, "registers": [ 7 ], - "raw_value": 7, "value": 0.7 }, "ac_couple_kw": { "implemented": true, - "scale_factor": -1, "address": 40677, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 - }, - "gt_number": { - "implemented": true, - "scale_factor": null, - "address": 40678, - "registers": [ - 64116 - ], - "raw_value": 64116, - "value": 64116 } } }, { - "name": "RadianInverterConfigurationValues", + "name": "RadianInverterConfigurationModel", "address": 40678, "values": { "did": { "implemented": true, - "scale_factor": null, "address": 40678, "registers": [ 64116 ], - "raw_value": 64116, "value": 64116 }, "length": { "implemented": true, - "scale_factor": null, "address": 40679, "registers": [ 89 ], - "raw_value": 89, "value": 89 }, "port_number": { "implemented": true, - "scale_factor": null, "address": 40680, "registers": [ - 1 + 1 + ], + "value": 1 + }, + "dc_voltage_scale_factor": { + "implemented": true, + "address": 40681, + "registers": [ + 65535 + ], + "value": -1 + }, + "ac_current_scale_factor": { + "implemented": true, + "address": 40682, + "registers": [ + 65535 + ], + "value": -1 + }, + "ac_voltage_scale_factor": { + "implemented": true, + "address": 40683, + "registers": [ + 0 + ], + "value": 0 + }, + "time_scale_factor": { + "implemented": true, + "address": 40684, + "registers": [ + 65535 + ], + "value": -1 + }, + "major_firmware_number": { + "implemented": true, + "address": 40685, + "registers": [ + 1 + ], + "value": 1 + }, + "mid_firmware_number": { + "implemented": true, + "address": 40686, + "registers": [ + 6 + ], + "value": 6 + }, + "minor_firmware_number": { + "implemented": true, + "address": 40687, + "registers": [ + 15 + ], + "value": 15 + }, + "search_sensitivity": { + "implemented": true, + "address": 40695, + "registers": [ + 30 + ], + "value": 30 + }, + "search_pulse_length": { + "implemented": true, + "address": 40696, + "registers": [ + 8 + ], + "value": 8 + }, + "search_pulse_spacing": { + "implemented": true, + "address": 40697, + "registers": [ + 60 + ], + "value": 60 + }, + "ac_input_select_priority": { + "implemented": true, + "address": 40698, + "registers": [ + 0 + ], + "value": "" + }, + "charger_operating_mode": { + "implemented": true, + "address": 40702, + "registers": [ + 0 + ], + "value": "" + }, + "ac_coupled": { + "implemented": true, + "address": 40703, + "registers": [ + 0 + ], + "value": "" + }, + "grid_input_mode": { + "implemented": true, + "address": 40704, + "registers": [ + 5 + ], + "value": "" + }, + "grid_transfer_delay": { + "implemented": true, + "address": 40707, + "registers": [ + 1000 + ], + "value": 1000 + }, + "gen_input_mode": { + "implemented": true, + "address": 40709, + "registers": [ + 0 + ], + "value": "" + }, + "gen_transfer_delay": { + "implemented": true, + "address": 40712, + "registers": [ + 1000 + ], + "value": 1000 + }, + "aux_mode": { + "implemented": true, + "address": 40717, + "registers": [ + 1 + ], + "value": "" + }, + "aux_control": { + "implemented": true, + "address": 40718, + "registers": [ + 1 + ], + "value": "" + }, + "aux_relay_mode": { + "implemented": false, + "address": 40723, + "registers": [ + 65535 + ], + "value": null + }, + "aux_relay_control": { + "implemented": false, + "address": 40724, + "registers": [ + 65535 + ], + "value": null + }, + "stacking_mode": { + "implemented": true, + "address": 40729, + "registers": [ + 10 + ], + "value": "" + }, + "master_power_save_level": { + "implemented": true, + "address": 40730, + "registers": [ + 0 + ], + "value": 0 + }, + "slave_power_save_level": { + "implemented": true, + "address": 40731, + "registers": [ + 1 + ], + "value": 1 + }, + "grid_tie_window": { + "implemented": false, + "address": 40733, + "registers": [ + 65535 + ], + "value": null + }, + "grid_tie_enable": { + "implemented": true, + "address": 40734, + "registers": [ + 1 + ], + "value": "" + }, + "grid_ac_input_voltage_calibrate_factor": { + "implemented": true, + "address": 40735, + "registers": [ + 0 + ], + "value": 0 + }, + "gen_ac_input_voltage_calibrate_factor": { + "implemented": false, + "address": 40736, + "registers": [ + 32768 ], - "raw_value": 1, - "value": 1 + "value": null }, - "dc_voltage_scale_factor": { + "ac_output_voltage_calibrate_factor": { "implemented": true, - "scale_factor": null, - "address": 40681, + "address": 40737, "registers": [ - 65535 + 0 ], - "raw_value": -1, - "value": -1 + "value": 0 }, - "ac_current_scale_factor": { + "mini_grid_lbx_delay": { "implemented": true, - "scale_factor": null, - "address": 40682, + "address": 40741, "registers": [ - 65535 + 5 ], - "raw_value": -1, - "value": -1 + "value": 5 }, - "ac_voltage_scale_factor": { + "serial_number": { "implemented": true, - "scale_factor": null, - "address": 40683, + "address": 40744, "registers": [ + 21328, + 16722, + 17696, + 18008, + 20992, + 0, + 0, + 0, 0 ], - "raw_value": 0, - "value": 0 + "value": "b'SPARE FXR'" }, - "time_scale_factor": { + "model_number": { "implemented": true, - "scale_factor": null, - "address": 40684, + "address": 40753, "registers": [ - 65535 + 22086, + 22610, + 13104, + 13368, + 17664, + 0, + 0, + 0, + 0 ], - "raw_value": -1, - "value": -1 + "value": "b'VFXR3048E'" }, - "major_firmware_number": { - "implemented": true, - "scale_factor": null, - "address": 40685, + "module_control": { + "implemented": false, + "address": 40762, "registers": [ - 1 + 65535 ], - "raw_value": 1, - "value": 1 + "value": null }, - "mid_firmware_number": { + "model_select": { "implemented": true, - "scale_factor": null, - "address": 40686, + "address": 40763, "registers": [ - 6 + 0 ], - "raw_value": 6, - "value": 6 + "value": "" }, - "minor_firmware_number": { - "implemented": true, - "scale_factor": null, - "address": 40687, + "ee_write_enable": { + "implemented": false, + "address": 40768, "registers": [ - 15 + 65535 ], - "raw_value": 15, - "value": 15 + "value": null }, "absorb_volts": { "implemented": true, - "scale_factor": -1, "address": 40688, "registers": [ 576 ], - "raw_value": 576, "value": 57.6 }, "absorb_time_hours": { "implemented": true, - "scale_factor": -1, "address": 40689, "registers": [ 20 ], - "raw_value": 20, "value": 2.0 }, "float_volts": { "implemented": true, - "scale_factor": -1, "address": 40690, "registers": [ 544 ], - "raw_value": 544, "value": 54.4 }, "float_time_hours": { "implemented": true, - "scale_factor": -1, "address": 40691, "registers": [ 10 ], - "raw_value": 10, "value": 1.0 }, "re_float_volts": { "implemented": true, - "scale_factor": -1, "address": 40692, "registers": [ 500 ], - "raw_value": 500, "value": 50.0 }, "eq_volts": { "implemented": true, - "scale_factor": -1, "address": 40693, "registers": [ 636 ], - "raw_value": 636, "value": 63.6 }, "eq_time_hours": { "implemented": true, - "scale_factor": -1, "address": 40694, "registers": [ 10 ], - "raw_value": 10, "value": 1.0 }, - "search_sensitivity": { - "implemented": true, - "scale_factor": null, - "address": 40695, - "registers": [ - 30 - ], - "raw_value": 30, - "value": 30 - }, - "search_pulse_length": { - "implemented": true, - "scale_factor": null, - "address": 40696, - "registers": [ - 8 - ], - "raw_value": 8, - "value": 8 - }, - "search_pulse_spacing": { - "implemented": true, - "scale_factor": null, - "address": 40697, - "registers": [ - 60 - ], - "raw_value": 60, - "value": 60 - }, - "ac_input_select_priority": { - "implemented": true, - "scale_factor": null, - "address": 40698, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, "grid_ac_input_current_limit": { "implemented": true, - "scale_factor": -1, "address": 40699, "registers": [ 300 ], - "raw_value": 300, "value": 30.0 }, "gen_ac_input_current_limit": { "implemented": true, - "scale_factor": -1, "address": 40700, "registers": [ 300 ], - "raw_value": 300, "value": 30.0 }, "charger_ac_input_current_limit": { "implemented": true, - "scale_factor": -1, "address": 40701, "registers": [ 75 ], - "raw_value": 75, "value": 7.5 }, - "charger_operating_mode": { - "implemented": true, - "scale_factor": null, - "address": 40702, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, - "ac_coupled": { - "implemented": true, - "scale_factor": null, - "address": 40703, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, - "grid_input_mode": { - "implemented": true, - "scale_factor": null, - "address": 40704, - "registers": [ - 5 - ], - "raw_value": "", - "value": "" - }, "grid_lower_input_voltage_limit": { "implemented": true, - "scale_factor": 0, "address": 40705, "registers": [ 204 ], - "raw_value": 204, "value": 204 }, "grid_upper_input_voltage_limit": { "implemented": true, - "scale_factor": 0, "address": 40706, "registers": [ 252 ], - "raw_value": 252, "value": 252 }, - "grid_transfer_delay": { - "implemented": true, - "scale_factor": null, - "address": 40707, - "registers": [ - 1000 - ], - "raw_value": 1000, - "value": 1000 - }, "grid_connect_delay": { "implemented": true, - "scale_factor": -1, "address": 40708, "registers": [ 20 ], - "raw_value": 20, "value": 2.0 }, - "gen_input_mode": { - "implemented": true, - "scale_factor": null, - "address": 40709, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, "gen_lower_input_voltage_limit": { "implemented": true, - "scale_factor": 0, "address": 40710, "registers": [ 204 ], - "raw_value": 204, "value": 204 }, "gen_upper_input_voltage_limit": { "implemented": true, - "scale_factor": 0, "address": 40711, "registers": [ 252 ], - "raw_value": 252, "value": 252 }, - "gen_transfer_delay": { - "implemented": true, - "scale_factor": null, - "address": 40712, - "registers": [ - 1000 - ], - "raw_value": 1000, - "value": 1000 - }, "gen_connect_delay": { "implemented": true, - "scale_factor": -1, "address": 40713, "registers": [ 20 ], - "raw_value": 20, "value": 2.0 }, "ac_output_voltage": { "implemented": true, - "scale_factor": 0, "address": 40714, "registers": [ 230 ], - "raw_value": 230, "value": 230 }, "low_battery_cut_out_voltage": { "implemented": true, - "scale_factor": -1, "address": 40715, "registers": [ 468 ], - "raw_value": 468, "value": 46.8 }, "low_battery_cut_in_voltage": { "implemented": true, - "scale_factor": -1, "address": 40716, "registers": [ 500 ], - "raw_value": 500, "value": 50.0 }, - "aux_mode": { - "implemented": true, - "scale_factor": null, - "address": 40717, - "registers": [ - 1 - ], - "raw_value": "", - "value": "" - }, - "aux_control": { - "implemented": true, - "scale_factor": null, - "address": 40718, - "registers": [ - 1 - ], - "raw_value": "", - "value": "" - }, "aux_on_battery_voltage": { "implemented": true, - "scale_factor": -1, "address": 40719, "registers": [ 520 ], - "raw_value": 520, "value": 52.0 }, "aux_on_delay_time": { "implemented": true, - "scale_factor": -1, "address": 40720, "registers": [ 5 ], - "raw_value": 5, "value": 0.5 }, "aux_off_battery_voltage": { "implemented": true, - "scale_factor": -1, "address": 40721, "registers": [ 460 ], - "raw_value": 460, "value": 46.0 }, "aux_off_delay_time": { "implemented": true, - "scale_factor": -1, "address": 40722, "registers": [ 50 ], - "raw_value": 50, "value": 5.0 }, - "aux_relay_mode": { - "implemented": false, - "scale_factor": null, - "address": 40723, - "registers": [ - 65535 - ], - "raw_value": null, - "value": null - }, - "aux_relay_control": { - "implemented": false, - "scale_factor": null, - "address": 40724, - "registers": [ - 65535 - ], - "raw_value": null, - "value": null - }, "aux_relay_on_battery_voltage": { "implemented": false, - "scale_factor": -1, "address": 40725, "registers": [ 65535 ], - "raw_value": null, "value": null }, "aux_relay_on_delay_time": { "implemented": false, - "scale_factor": -1, "address": 40726, "registers": [ 65535 ], - "raw_value": null, "value": null }, "aux_relay_off_battery_voltage": { "implemented": false, - "scale_factor": -1, "address": 40727, "registers": [ 65535 ], - "raw_value": null, "value": null }, "aux_relay_off_delay_time": { "implemented": false, - "scale_factor": -1, "address": 40728, "registers": [ 65535 ], - "raw_value": null, "value": null }, - "stacking_mode": { - "implemented": true, - "scale_factor": null, - "address": 40729, - "registers": [ - 10 - ], - "raw_value": "", - "value": "" - }, - "master_power_save_level": { - "implemented": true, - "scale_factor": null, - "address": 40730, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "slave_power_save_level": { - "implemented": true, - "scale_factor": null, - "address": 40731, - "registers": [ - 1 - ], - "raw_value": 1, - "value": 1 - }, "sell_volts": { "implemented": true, - "scale_factor": -1, "address": 40732, "registers": [ 528 ], - "raw_value": 528, - "value": 52.8 - }, - "grid_tie_window": { - "implemented": false, - "scale_factor": null, - "address": 40733, - "registers": [ - 65535 - ], - "raw_value": null, - "value": null - }, - "grid_tie_enable": { - "implemented": true, - "scale_factor": null, - "address": 40734, - "registers": [ - 1 - ], - "raw_value": "", - "value": "" - }, - "grid_ac_input_voltage_calibrate_factor": { - "implemented": true, - "scale_factor": null, - "address": 40735, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "gen_ac_input_voltage_calibrate_factor": { - "implemented": false, - "scale_factor": null, - "address": 40736, - "registers": [ - 32768 - ], - "raw_value": null, - "value": null - }, - "ac_output_voltage_calibrate_factor": { - "implemented": true, - "scale_factor": null, - "address": 40737, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 + "value": 52.8 }, "battery_voltage_calibrate_factor": { "implemented": true, - "scale_factor": -1, "address": 40738, "registers": [ 4 ], - "raw_value": 4, "value": 0.4 }, "re_bulk_volts": { "implemented": true, - "scale_factor": -1, "address": 40739, "registers": [ 480 ], - "raw_value": 480, "value": 48.0 }, "mini_grid_lbx_volts": { "implemented": true, - "scale_factor": -1, "address": 40740, "registers": [ 488 ], - "raw_value": 488, "value": 48.8 }, - "mini_grid_lbx_delay": { - "implemented": true, - "scale_factor": null, - "address": 40741, - "registers": [ - 5 - ], - "raw_value": 5, - "value": 5 - }, "grid_zero_do_d_volts": { "implemented": true, - "scale_factor": -1, "address": 40742, "registers": [ 528 ], - "raw_value": 528, "value": 52.8 }, "grid_zero_do_d_max_offset_ac_amps": { "implemented": true, - "scale_factor": -1, "address": 40743, "registers": [ 50 ], - "raw_value": 50, "value": 5.0 }, - "serial_number": { - "implemented": true, - "scale_factor": null, - "address": 40744, - "registers": [ - 21328, - 16722, - 17696, - 18008, - 20992, - 0, - 0, - 0, - 0 - ], - "raw_value": "SPARE FXR", - "value": "SPARE FXR" - }, - "model_number": { - "implemented": true, - "scale_factor": null, - "address": 40753, - "registers": [ - 22086, - 22610, - 13104, - 13368, - 17664, - 0, - 0, - 0, - 0 - ], - "raw_value": "VFXR3048E", - "value": "VFXR3048E" - }, - "module_control": { - "implemented": false, - "scale_factor": null, - "address": 40762, - "registers": [ - 65535 - ], - "raw_value": null, - "value": null - }, - "model_select": { - "implemented": true, - "scale_factor": null, - "address": 40763, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, "low_battery_cut_out_delay": { "implemented": false, - "scale_factor": -1, "address": 40764, "registers": [ 65535 ], - "raw_value": null, "value": null }, "high_battery_cut_out_voltage": { "implemented": false, - "scale_factor": -1, "address": 40765, "registers": [ 65535 ], - "raw_value": null, "value": null }, "high_battery_cut_in_voltage": { "implemented": false, - "scale_factor": -1, "address": 40766, "registers": [ 65535 ], - "raw_value": null, "value": null }, "high_battery_cut_out_delay": { "implemented": false, - "scale_factor": -1, "address": 40767, "registers": [ 65535 ], - "raw_value": null, - "value": null - }, - "ee_write_enable": { - "implemented": false, - "scale_factor": null, - "address": 40768, - "registers": [ - 65535 - ], - "raw_value": null, "value": null } } }, { - "name": "SinglePhaseRadianInverterDeviceValues", + "name": "SinglePhaseRadianInverterDevice", "address": 40769, "values": { "did": { "implemented": true, - "scale_factor": null, "address": 40769, "registers": [ 64117 ], - "raw_value": 64117, "value": 64117 }, "length": { "implemented": true, - "scale_factor": null, "address": 40770, "registers": [ 46 ], - "raw_value": 46, "value": 46 }, "port_number": { "implemented": true, - "scale_factor": null, "address": 40771, "registers": [ 2 ], - "raw_value": 2, "value": 2 }, "dc_voltage_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40772, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "ac_current_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40773, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ac_voltage_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40774, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "ac_frequency_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40775, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, - "inverter_output_current": { - "implemented": true, - "scale_factor": 0, - "address": 40776, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "inverter_charge_current": { - "implemented": true, - "scale_factor": 0, - "address": 40777, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "inverter_buy_current": { - "implemented": true, - "scale_factor": 0, - "address": 40778, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "inverter_sell_current": { - "implemented": true, - "scale_factor": 0, - "address": 40779, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "grid_input_ac_voltage": { - "implemented": true, - "scale_factor": 0, - "address": 40780, - "registers": [ - 214 - ], - "raw_value": 214, - "value": 214 - }, - "gen_input_ac_voltage": { - "implemented": true, - "scale_factor": 0, - "address": 40781, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "output_ac_voltage": { - "implemented": true, - "scale_factor": 0, - "address": 40782, - "registers": [ - 234 - ], - "raw_value": 234, - "value": 234 - }, "inverter_operating_mode": { "implemented": true, - "scale_factor": null, "address": 40783, "registers": [ 0 ], - "raw_value": "", "value": "" }, "error_flags": { "implemented": true, - "scale_factor": null, "address": 40784, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "warning_flags": { "implemented": true, - "scale_factor": null, "address": 40785, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, - "battery_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40786, - "registers": [ - 508 - ], - "raw_value": 508, - "value": 50.8 - }, - "temp_compensated_target_voltage": { - "implemented": true, - "scale_factor": -1, - "address": 40787, - "registers": [ - 492 - ], - "raw_value": 492, - "value": 49.2 - }, "aux_output_state": { "implemented": true, - "scale_factor": null, "address": 40788, "registers": [ 1 ], - "raw_value": "", "value": "" }, "aux_relay_output_state": { "implemented": false, - "scale_factor": null, "address": 40789, "registers": [ 65535 ], - "raw_value": null, "value": null }, "l_module_transformer_temperature": { "implemented": true, - "scale_factor": null, "address": 40790, "registers": [ 16 ], - "raw_value": 16, "value": 16 }, "l_module_capacitor_temperature": { "implemented": true, - "scale_factor": null, "address": 40791, "registers": [ 18 ], - "raw_value": 18, "value": 18 }, "l_module_fet_temperature": { "implemented": true, - "scale_factor": null, "address": 40792, "registers": [ 21 ], - "raw_value": 21, "value": 21 }, "r_module_transformer_temperature": { "implemented": false, - "scale_factor": null, "address": 40793, "registers": [ 32768 ], - "raw_value": null, "value": null }, "r_module_capacitor_temperature": { "implemented": false, - "scale_factor": null, "address": 40794, "registers": [ 32768 ], - "raw_value": null, "value": null }, "r_module_fet_temperature": { "implemented": false, - "scale_factor": null, "address": 40795, "registers": [ 32768 ], - "raw_value": null, "value": null }, "battery_temperature": { "implemented": true, - "scale_factor": null, "address": 40796, "registers": [ 12 ], - "raw_value": 12, "value": 12 }, "ac_input_selection": { "implemented": true, - "scale_factor": null, "address": 40797, "registers": [ 0 ], - "raw_value": "", "value": "" }, - "ac_input_frequency": { + "ac_input_state": { "implemented": true, - "scale_factor": -1, - "address": 40798, + "address": 40800, "registers": [ - 500 + 0 ], - "raw_value": 500, - "value": 50.0 + "value": "" }, - "ac_input_voltage": { + "sell_status": { "implemented": true, - "scale_factor": 0, - "address": 40799, + "address": 40803, + "registers": [ + 80 + ], + "value": 80 + }, + "kwh_scale_factor": { + "implemented": true, + "address": 40804, + "registers": [ + 65535 + ], + "value": -1 + }, + "gt_number": { + "implemented": true, + "address": 40817, + "registers": [ + 64116 + ], + "value": 64116 + }, + "inverter_output_current": { + "implemented": true, + "address": 40776, + "registers": [ + 0 + ], + "value": 0 + }, + "inverter_charge_current": { + "implemented": true, + "address": 40777, + "registers": [ + 0 + ], + "value": 0 + }, + "inverter_buy_current": { + "implemented": true, + "address": 40778, + "registers": [ + 0 + ], + "value": 0 + }, + "inverter_sell_current": { + "implemented": true, + "address": 40779, + "registers": [ + 0 + ], + "value": 0 + }, + "grid_input_ac_voltage": { + "implemented": true, + "address": 40780, "registers": [ 214 ], - "raw_value": 214, "value": 214 }, - "ac_input_state": { + "gen_input_ac_voltage": { "implemented": true, - "scale_factor": null, - "address": 40800, + "address": 40781, "registers": [ 0 ], - "raw_value": "", - "value": "" + "value": 0 }, - "minimum_ac_input_voltage": { + "output_ac_voltage": { "implemented": true, - "scale_factor": 0, - "address": 40801, + "address": 40782, "registers": [ - 210 + 234 ], - "raw_value": 210, - "value": 210 + "value": 234 }, - "maximum_ac_input_voltage": { + "battery_voltage": { "implemented": true, - "scale_factor": 0, - "address": 40802, + "address": 40786, "registers": [ - 240 + 508 ], - "raw_value": 240, - "value": 240 + "value": 50.8 }, - "sell_status": { + "temp_compensated_target_voltage": { "implemented": true, - "scale_factor": null, - "address": 40803, + "address": 40787, "registers": [ - 80 + 492 + ], + "value": 49.2 + }, + "ac_input_frequency": { + "implemented": true, + "address": 40798, + "registers": [ + 500 + ], + "value": 50.0 + }, + "ac_input_voltage": { + "implemented": true, + "address": 40799, + "registers": [ + 214 + ], + "value": 214 + }, + "minimum_ac_input_voltage": { + "implemented": true, + "address": 40801, + "registers": [ + 210 ], - "raw_value": 80, - "value": 80 + "value": 210 }, - "kwh_scale_factor": { + "maximum_ac_input_voltage": { "implemented": true, - "scale_factor": null, - "address": 40804, + "address": 40802, "registers": [ - 65535 + 240 ], - "raw_value": -1, - "value": -1 + "value": 240 }, "ac1_buy_kwh": { "implemented": true, - "scale_factor": -1, "address": 40805, "registers": [ 23 ], - "raw_value": 23, "value": 2.3 }, "ac2_buy_kwh": { "implemented": true, - "scale_factor": -1, "address": 40806, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "ac1_sell_kwh": { "implemented": true, - "scale_factor": -1, "address": 40807, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "ac2_sell_kwh": { "implemented": true, - "scale_factor": -1, "address": 40808, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "output_kwh": { "implemented": true, - "scale_factor": -1, "address": 40809, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "charger_kwh": { "implemented": true, - "scale_factor": -1, "address": 40810, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "output_kw": { "implemented": true, - "scale_factor": -1, "address": 40811, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "buy_kw": { "implemented": true, - "scale_factor": -1, "address": 40812, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "sell_kw": { "implemented": true, - "scale_factor": -1, "address": 40813, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "charge_kw": { "implemented": true, - "scale_factor": -1, "address": 40814, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "load_kw": { "implemented": true, - "scale_factor": -1, "address": 40815, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 }, "ac_couple_kw": { "implemented": true, - "scale_factor": -1, "address": 40816, "registers": [ 0 ], - "raw_value": 0, "value": 0.0 - }, - "gt_number": { - "implemented": true, - "scale_factor": null, - "address": 40817, - "registers": [ - 64116 - ], - "raw_value": 64116, - "value": 64116 } } }, { - "name": "RadianInverterConfigurationValues", + "name": "RadianInverterConfigurationModel", "address": 40817, "values": { "did": { "implemented": true, - "scale_factor": null, "address": 40817, "registers": [ 64116 ], - "raw_value": 64116, "value": 64116 }, "length": { "implemented": true, - "scale_factor": null, "address": 40818, "registers": [ 89 ], - "raw_value": 89, "value": 89 }, "port_number": { "implemented": true, - "scale_factor": null, "address": 40819, "registers": [ 2 ], - "raw_value": 2, "value": 2 }, "dc_voltage_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40820, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "ac_current_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40821, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "ac_voltage_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40822, "registers": [ 0 ], - "raw_value": 0, "value": 0 }, "time_scale_factor": { "implemented": true, - "scale_factor": null, "address": 40823, "registers": [ 65535 ], - "raw_value": -1, "value": -1 }, "major_firmware_number": { "implemented": true, - "scale_factor": null, "address": 40824, "registers": [ 1 ], - "raw_value": 1, "value": 1 }, - "mid_firmware_number": { + "mid_firmware_number": { + "implemented": true, + "address": 40825, + "registers": [ + 6 + ], + "value": 6 + }, + "minor_firmware_number": { + "implemented": true, + "address": 40826, + "registers": [ + 15 + ], + "value": 15 + }, + "search_sensitivity": { + "implemented": true, + "address": 40834, + "registers": [ + 30 + ], + "value": 30 + }, + "search_pulse_length": { + "implemented": true, + "address": 40835, + "registers": [ + 8 + ], + "value": 8 + }, + "search_pulse_spacing": { + "implemented": true, + "address": 40836, + "registers": [ + 60 + ], + "value": 60 + }, + "ac_input_select_priority": { + "implemented": true, + "address": 40837, + "registers": [ + 0 + ], + "value": "" + }, + "charger_operating_mode": { + "implemented": true, + "address": 40841, + "registers": [ + 0 + ], + "value": "" + }, + "ac_coupled": { + "implemented": true, + "address": 40842, + "registers": [ + 0 + ], + "value": "" + }, + "grid_input_mode": { + "implemented": true, + "address": 40843, + "registers": [ + 5 + ], + "value": "" + }, + "grid_transfer_delay": { + "implemented": true, + "address": 40846, + "registers": [ + 1000 + ], + "value": 1000 + }, + "gen_input_mode": { + "implemented": true, + "address": 40848, + "registers": [ + 0 + ], + "value": "" + }, + "gen_transfer_delay": { + "implemented": true, + "address": 40851, + "registers": [ + 1000 + ], + "value": 1000 + }, + "aux_mode": { + "implemented": true, + "address": 40856, + "registers": [ + 1 + ], + "value": "" + }, + "aux_control": { + "implemented": true, + "address": 40857, + "registers": [ + 1 + ], + "value": "" + }, + "aux_relay_mode": { + "implemented": false, + "address": 40862, + "registers": [ + 65535 + ], + "value": null + }, + "aux_relay_control": { + "implemented": false, + "address": 40863, + "registers": [ + 65535 + ], + "value": null + }, + "stacking_mode": { + "implemented": true, + "address": 40868, + "registers": [ + 12 + ], + "value": "" + }, + "master_power_save_level": { + "implemented": true, + "address": 40869, + "registers": [ + 0 + ], + "value": 0 + }, + "slave_power_save_level": { + "implemented": true, + "address": 40870, + "registers": [ + 1 + ], + "value": 1 + }, + "grid_tie_window": { + "implemented": false, + "address": 40872, + "registers": [ + 65535 + ], + "value": null + }, + "grid_tie_enable": { + "implemented": true, + "address": 40873, + "registers": [ + 1 + ], + "value": "" + }, + "grid_ac_input_voltage_calibrate_factor": { + "implemented": true, + "address": 40874, + "registers": [ + 0 + ], + "value": 0 + }, + "gen_ac_input_voltage_calibrate_factor": { + "implemented": false, + "address": 40875, + "registers": [ + 32768 + ], + "value": null + }, + "ac_output_voltage_calibrate_factor": { + "implemented": true, + "address": 40876, + "registers": [ + 0 + ], + "value": 0 + }, + "mini_grid_lbx_delay": { + "implemented": true, + "address": 40880, + "registers": [ + 5 + ], + "value": 5 + }, + "serial_number": { + "implemented": true, + "address": 40883, + "registers": [ + 21328, + 16722, + 17696, + 18008, + 20992, + 0, + 0, + 0, + 0 + ], + "value": "b'SPARE FXR'" + }, + "model_number": { + "implemented": true, + "address": 40892, + "registers": [ + 22086, + 22610, + 13104, + 13368, + 17664, + 0, + 0, + 0, + 0 + ], + "value": "b'VFXR3048E'" + }, + "module_control": { + "implemented": false, + "address": 40901, + "registers": [ + 65535 + ], + "value": null + }, + "model_select": { "implemented": true, - "scale_factor": null, - "address": 40825, + "address": 40902, "registers": [ - 6 + 0 ], - "raw_value": 6, - "value": 6 + "value": "" }, - "minor_firmware_number": { - "implemented": true, - "scale_factor": null, - "address": 40826, + "ee_write_enable": { + "implemented": false, + "address": 40907, "registers": [ - 15 + 65535 ], - "raw_value": 15, - "value": 15 + "value": null }, "absorb_volts": { "implemented": true, - "scale_factor": -1, "address": 40827, "registers": [ 576 ], - "raw_value": 576, "value": 57.6 }, "absorb_time_hours": { "implemented": true, - "scale_factor": -1, "address": 40828, "registers": [ 20 ], - "raw_value": 20, "value": 2.0 }, "float_volts": { "implemented": true, - "scale_factor": -1, "address": 40829, "registers": [ 544 ], - "raw_value": 544, "value": 54.4 }, "float_time_hours": { "implemented": true, - "scale_factor": -1, "address": 40830, "registers": [ 10 ], - "raw_value": 10, "value": 1.0 }, "re_float_volts": { "implemented": true, - "scale_factor": -1, "address": 40831, "registers": [ 500 ], - "raw_value": 500, "value": 50.0 }, "eq_volts": { "implemented": true, - "scale_factor": -1, "address": 40832, "registers": [ 636 ], - "raw_value": 636, "value": 63.6 }, "eq_time_hours": { "implemented": true, - "scale_factor": -1, "address": 40833, "registers": [ 10 ], - "raw_value": 10, "value": 1.0 }, - "search_sensitivity": { - "implemented": true, - "scale_factor": null, - "address": 40834, - "registers": [ - 30 - ], - "raw_value": 30, - "value": 30 - }, - "search_pulse_length": { - "implemented": true, - "scale_factor": null, - "address": 40835, - "registers": [ - 8 - ], - "raw_value": 8, - "value": 8 - }, - "search_pulse_spacing": { - "implemented": true, - "scale_factor": null, - "address": 40836, - "registers": [ - 60 - ], - "raw_value": 60, - "value": 60 - }, - "ac_input_select_priority": { - "implemented": true, - "scale_factor": null, - "address": 40837, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, "grid_ac_input_current_limit": { "implemented": true, - "scale_factor": -1, "address": 40838, "registers": [ 300 ], - "raw_value": 300, "value": 30.0 }, "gen_ac_input_current_limit": { "implemented": true, - "scale_factor": -1, "address": 40839, "registers": [ 300 ], - "raw_value": 300, "value": 30.0 }, "charger_ac_input_current_limit": { "implemented": true, - "scale_factor": -1, "address": 40840, "registers": [ 75 ], - "raw_value": 75, "value": 7.5 }, - "charger_operating_mode": { - "implemented": true, - "scale_factor": null, - "address": 40841, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, - "ac_coupled": { - "implemented": true, - "scale_factor": null, - "address": 40842, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, - "grid_input_mode": { - "implemented": true, - "scale_factor": null, - "address": 40843, - "registers": [ - 5 - ], - "raw_value": "", - "value": "" - }, "grid_lower_input_voltage_limit": { "implemented": true, - "scale_factor": 0, "address": 40844, "registers": [ 204 ], - "raw_value": 204, "value": 204 }, "grid_upper_input_voltage_limit": { "implemented": true, - "scale_factor": 0, "address": 40845, "registers": [ 252 ], - "raw_value": 252, "value": 252 }, - "grid_transfer_delay": { - "implemented": true, - "scale_factor": null, - "address": 40846, - "registers": [ - 1000 - ], - "raw_value": 1000, - "value": 1000 - }, "grid_connect_delay": { "implemented": true, - "scale_factor": -1, "address": 40847, "registers": [ 20 ], - "raw_value": 20, "value": 2.0 }, - "gen_input_mode": { - "implemented": true, - "scale_factor": null, - "address": 40848, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, "gen_lower_input_voltage_limit": { "implemented": true, - "scale_factor": 0, "address": 40849, "registers": [ 204 ], - "raw_value": 204, "value": 204 }, "gen_upper_input_voltage_limit": { "implemented": true, - "scale_factor": 0, "address": 40850, "registers": [ 252 ], - "raw_value": 252, "value": 252 }, - "gen_transfer_delay": { - "implemented": true, - "scale_factor": null, - "address": 40851, - "registers": [ - 1000 - ], - "raw_value": 1000, - "value": 1000 - }, "gen_connect_delay": { "implemented": true, - "scale_factor": -1, "address": 40852, "registers": [ 20 ], - "raw_value": 20, "value": 2.0 }, "ac_output_voltage": { "implemented": true, - "scale_factor": 0, "address": 40853, "registers": [ 230 ], - "raw_value": 230, "value": 230 }, "low_battery_cut_out_voltage": { "implemented": true, - "scale_factor": -1, "address": 40854, "registers": [ 468 ], - "raw_value": 468, "value": 46.8 }, "low_battery_cut_in_voltage": { "implemented": true, - "scale_factor": -1, "address": 40855, "registers": [ 500 ], - "raw_value": 500, "value": 50.0 }, - "aux_mode": { - "implemented": true, - "scale_factor": null, - "address": 40856, - "registers": [ - 1 - ], - "raw_value": "", - "value": "" - }, - "aux_control": { - "implemented": true, - "scale_factor": null, - "address": 40857, - "registers": [ - 1 - ], - "raw_value": "", - "value": "" - }, "aux_on_battery_voltage": { "implemented": true, - "scale_factor": -1, "address": 40858, "registers": [ 520 ], - "raw_value": 520, "value": 52.0 }, "aux_on_delay_time": { "implemented": true, - "scale_factor": -1, "address": 40859, "registers": [ 5 ], - "raw_value": 5, "value": 0.5 }, "aux_off_battery_voltage": { "implemented": true, - "scale_factor": -1, "address": 40860, "registers": [ 460 ], - "raw_value": 460, "value": 46.0 }, "aux_off_delay_time": { "implemented": true, - "scale_factor": -1, "address": 40861, "registers": [ 50 ], - "raw_value": 50, "value": 5.0 }, - "aux_relay_mode": { - "implemented": false, - "scale_factor": null, - "address": 40862, - "registers": [ - 65535 - ], - "raw_value": null, - "value": null - }, - "aux_relay_control": { - "implemented": false, - "scale_factor": null, - "address": 40863, - "registers": [ - 65535 - ], - "raw_value": null, - "value": null - }, "aux_relay_on_battery_voltage": { "implemented": false, - "scale_factor": -1, "address": 40864, "registers": [ 65535 ], - "raw_value": null, "value": null }, "aux_relay_on_delay_time": { "implemented": false, - "scale_factor": -1, "address": 40865, "registers": [ 65535 ], - "raw_value": null, "value": null }, "aux_relay_off_battery_voltage": { "implemented": false, - "scale_factor": -1, "address": 40866, "registers": [ 65535 ], - "raw_value": null, "value": null }, "aux_relay_off_delay_time": { "implemented": false, - "scale_factor": -1, "address": 40867, "registers": [ 65535 ], - "raw_value": null, "value": null }, - "stacking_mode": { - "implemented": true, - "scale_factor": null, - "address": 40868, - "registers": [ - 12 - ], - "raw_value": "", - "value": "" - }, - "master_power_save_level": { - "implemented": true, - "scale_factor": null, - "address": 40869, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "slave_power_save_level": { - "implemented": true, - "scale_factor": null, - "address": 40870, - "registers": [ - 1 - ], - "raw_value": 1, - "value": 1 - }, "sell_volts": { "implemented": true, - "scale_factor": -1, "address": 40871, "registers": [ 528 ], - "raw_value": 528, "value": 52.8 }, - "grid_tie_window": { - "implemented": false, - "scale_factor": null, - "address": 40872, - "registers": [ - 65535 - ], - "raw_value": null, - "value": null - }, - "grid_tie_enable": { - "implemented": true, - "scale_factor": null, - "address": 40873, - "registers": [ - 1 - ], - "raw_value": "", - "value": "" - }, - "grid_ac_input_voltage_calibrate_factor": { - "implemented": true, - "scale_factor": null, - "address": 40874, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, - "gen_ac_input_voltage_calibrate_factor": { - "implemented": false, - "scale_factor": null, - "address": 40875, - "registers": [ - 32768 - ], - "raw_value": null, - "value": null - }, - "ac_output_voltage_calibrate_factor": { - "implemented": true, - "scale_factor": null, - "address": 40876, - "registers": [ - 0 - ], - "raw_value": 0, - "value": 0 - }, "battery_voltage_calibrate_factor": { "implemented": true, - "scale_factor": -1, "address": 40877, "registers": [ 4 ], - "raw_value": 4, "value": 0.4 }, "re_bulk_volts": { "implemented": true, - "scale_factor": -1, "address": 40878, "registers": [ 480 ], - "raw_value": 480, "value": 48.0 }, "mini_grid_lbx_volts": { "implemented": true, - "scale_factor": -1, "address": 40879, "registers": [ 488 ], - "raw_value": 488, "value": 48.8 }, - "mini_grid_lbx_delay": { - "implemented": true, - "scale_factor": null, - "address": 40880, - "registers": [ - 5 - ], - "raw_value": 5, - "value": 5 - }, "grid_zero_do_d_volts": { "implemented": true, - "scale_factor": -1, "address": 40881, "registers": [ 528 ], - "raw_value": 528, "value": 52.8 }, "grid_zero_do_d_max_offset_ac_amps": { "implemented": true, - "scale_factor": -1, "address": 40882, "registers": [ 50 ], - "raw_value": 50, "value": 5.0 }, - "serial_number": { - "implemented": true, - "scale_factor": null, - "address": 40883, - "registers": [ - 21328, - 16722, - 17696, - 18008, - 20992, - 0, - 0, - 0, - 0 - ], - "raw_value": "SPARE FXR", - "value": "SPARE FXR" - }, - "model_number": { - "implemented": true, - "scale_factor": null, - "address": 40892, - "registers": [ - 22086, - 22610, - 13104, - 13368, - 17664, - 0, - 0, - 0, - 0 - ], - "raw_value": "VFXR3048E", - "value": "VFXR3048E" - }, - "module_control": { - "implemented": false, - "scale_factor": null, - "address": 40901, - "registers": [ - 65535 - ], - "raw_value": null, - "value": null - }, - "model_select": { - "implemented": true, - "scale_factor": null, - "address": 40902, - "registers": [ - 0 - ], - "raw_value": "", - "value": "" - }, "low_battery_cut_out_delay": { "implemented": false, - "scale_factor": -1, "address": 40903, "registers": [ 65535 ], - "raw_value": null, "value": null }, "high_battery_cut_out_voltage": { "implemented": false, - "scale_factor": -1, "address": 40904, "registers": [ 65535 ], - "raw_value": null, "value": null }, "high_battery_cut_in_voltage": { "implemented": false, - "scale_factor": -1, "address": 40905, "registers": [ 65535 ], - "raw_value": null, "value": null }, "high_battery_cut_out_delay": { "implemented": false, - "scale_factor": -1, "address": 40906, "registers": [ 65535 ], - "raw_value": null, - "value": null - }, - "ee_write_enable": { - "implemented": false, - "scale_factor": null, - "address": 40907, - "registers": [ - 65535 - ], - "raw_value": null, "value": null } } diff --git a/mate3/tests/test_cli.py b/mate3/tests/test_cli.py index 0f7221c..318233b 100644 --- a/mate3/tests/test_cli.py +++ b/mate3/tests/test_cli.py @@ -20,6 +20,6 @@ def test_devices(script_runner): def test_write(script_runner): ret = script_runner.run( - "mate3", "write", f"--cache-path={CACHE_PATH}", "--cache-only", '--set=mate3.system_name="testing"' + "mate3", "write", f"--cache-path={CACHE_PATH}", "--cache-only", '--set=mate3.system_name=b"testing"' ) assert ret.success diff --git a/mate3/tests/test_known_systems.py b/mate3/tests/test_known_systems.py index 5d6ace4..6daad51 100644 --- a/mate3/tests/test_known_systems.py +++ b/mate3/tests/test_known_systems.py @@ -19,10 +19,12 @@ def _test_read_gives_expected_results(client, system_dir): for value in device.fields([Mode.R, Mode.RW]): values[value.name] = value.to_dict() read_devices.append({"name": name, "address": device.address, "values": values}) + read_devices = sorted(read_devices, key=lambda x: x["address"]) # Compare them with what we expect: with open(system_dir / "expected.json") as f: expected_devices = json.load(f) + expected_devices = sorted(expected_devices, key=lambda x: x["address"]) assert check_objects(expected_devices, read_devices) From de0a0dd14597a3248d6ad6dcb2726421e51556d4 Mon Sep 17 00:00:00 2001 From: kodonnell Date: Sun, 17 Jan 2021 10:33:37 +1300 Subject: [PATCH 05/10] more updates --- examples/getting_started.py | 14 ++++++------- mate3/api.py | 26 +++---------------------- mate3/devices.py | 1 - mate3/modbus_client.py | 8 +------- mate3/sunspec/fields.py | 10 ++++------ mate3/sunspec/payload.py | 13 +++++++++++++ mate3/sunspec/scripts/code_generator.py | 3 +-- 7 files changed, 29 insertions(+), 46 deletions(-) create mode 100644 mate3/sunspec/payload.py diff --git a/examples/getting_started.py b/examples/getting_started.py index 51892b8..877da90 100644 --- a/examples/getting_started.py +++ b/examples/getting_started.py @@ -3,7 +3,7 @@ from loguru import logger from mate3.api import Mate3Client -CACHE_PATH = Path(__file__).parent.parent / "tests" / "known_systems" / "chinezbrun" / "modbus.json" +CACHE_PATH = Path(__file__).parent.parent / "mate3" / "tests" / "known_systems" / "chinezbrun" / "modbus.json" if __name__ == "__main__": import sys @@ -18,13 +18,13 @@ # writes first!) just replace the line below with `with Mate3Client("") as client:` with Mate3Client(host=None, cache_path=CACHE_PATH, cache_only=True) as client: print("# What's the system name?") - mate = client.devices.mate3 + mate = client.mate3 print(mate.system_name) print("# Get the battery voltage. Note that it's auto-scaled appropriately.") - fndc = client.devices.fndc + fndc = client.fndc print(fndc.battery_voltage) print("# Get the (raw) values for the same device type on different ports.") - inverters = client.devices.single_phase_radian_inverters + inverters = client.single_phase_radian_inverters for port, inverter in inverters.items(): print(f"Output KW for inverter on port {port} is {inverter.output_kw.value}") print( @@ -40,10 +40,10 @@ print("# Nice. Modbus fields that aren't implemented are easy to identify:") print("Implemented?", mate.alarm_email_enable.implemented) print("# We can write new values to the device too. Note that we don't need to worry about scaling etc.") - mate.system_name.write("New system name") + mate.system_name.write(b"New system name") print("After write: ", mate.system_name) print("# All the fields and options are well defined so e.g. for enums you can see valid options e.g:") - print(list(mate.ags_generator_type.field.options)) + print(list(mate.ags_generator_type.enum)) print("# In this case these are normal python Enums, so you can access them as expected, and assign them:") - mate.ags_generator_type.write(mate.ags_generator_type.field.options["DC Gen"]) + mate.ags_generator_type.write(mate.ags_generator_type.enum["DC Gen"]) print(mate.ags_generator_type.value) diff --git a/mate3/api.py b/mate3/api.py index 98a3d58..381f870 100644 --- a/mate3/api.py +++ b/mate3/api.py @@ -1,9 +1,8 @@ -from dataclasses import dataclass from datetime import datetime from typing import Dict, Iterable, List, Optional from loguru import logger -from pymodbus.constants import Defaults, Endian +from pymodbus.constants import Defaults from pymodbus.payload import BinaryPayloadDecoder from mate3.devices import ( @@ -28,26 +27,7 @@ SunSpecEndModel, SunSpecHeaderModel, ) - - -@dataclass(frozen=False) -class ReadingRange: - """ - Mate's work better reading a contiguous range of values at once as opposed to indivudally. This is a simple wrapper - for such a contiguous range. - """ - - fields: List[Field] - start: int - size: int - - @property - def end(self): - return self.start + self.size - - def extend(self, field: Field): - self.fields.append(field) - self.size += field.size +from mate3.sunspec.payload import get_decoder class Mate3Client: @@ -225,7 +205,7 @@ def _read_model(self, device_address: int, first: bool): """ # Read the first register for the device ID: registers = self._client.read_holding_registers(address=device_address, count=2) - decoder = BinaryPayloadDecoder.fromRegisters(registers, byteorder=Endian.Big, wordorder=Endian.Big) + decoder = get_decoder(registers) # If first, then this is the SunSpecHeaderModel, which has a device ID of Uint32 type not Uint16 like the rest. if first: diff --git a/mate3/devices.py b/mate3/devices.py index a16eaf9..a0651d8 100644 --- a/mate3/devices.py +++ b/mate3/devices.py @@ -1,4 +1,3 @@ -from abc import ABCMeta, abstractmethod from copy import deepcopy from typing import Optional diff --git a/mate3/modbus_client.py b/mate3/modbus_client.py index af247f6..3522288 100644 --- a/mate3/modbus_client.py +++ b/mate3/modbus_client.py @@ -1,15 +1,9 @@ import json -from datetime import datetime from hashlib import md5 from pathlib import Path -from typing import Iterable from loguru import logger from pymodbus.client.sync import ModbusTcpClient -from pymodbus.constants import Endian -from pymodbus.payload import BinaryPayloadDecoder - -from mate3.sunspec.fields import Field, FieldRead class NonCachingModbusClient(ModbusTcpClient): @@ -51,7 +45,7 @@ def __init__(self, cache_path: str, *args, cache_only: bool = False, writeable: self._original_cache_hash = self._hash() else: if self._cache_only: - raise RuntimeError("Cache doesn't exist!") + raise RuntimeError(f"Cache doesn't exist at '{self._cache_path}'") self._cache_only = cache_only if not self._cache_only: super().__init__(*args, **kwargs) diff --git a/mate3/sunspec/fields.py b/mate3/sunspec/fields.py index 8e8bce5..09d94e1 100644 --- a/mate3/sunspec/fields.py +++ b/mate3/sunspec/fields.py @@ -5,10 +5,10 @@ from datetime import datetime from enum import Enum, IntFlag from functools import wraps -from typing import Any, Optional, Tuple, Type +from typing import Any, Optional, Tuple from loguru import logger -from pymodbus.constants import Endian +from mate3.sunspec.payload import get_decoder, get_encoder from pymodbus.payload import BinaryPayloadBuilder, BinaryPayloadDecoder @@ -103,9 +103,7 @@ def _decode(self): return # OK, not cached - let's read and decode: - decoder = BinaryPayloadDecoder.fromRegisters( - registers=self._last_read.registers, byteorder=Endian.Big, wordorder=Endian.Big - ) + decoder = get_decoder(self._last_read.registers) self._cached_value, self._cached_implemented = self.decode_from_registers(decoder) # Mark as usable in cache: @@ -165,7 +163,7 @@ def write(self, value): raise RuntimeError("This field is marked as not implemented, so you shouldn't write to it!") # OK, now convert to registers: - encoder = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) + encoder = get_encoder() self.encode_to_payload(value, encoder) registers = encoder.to_registers() logger.debug(f"Writing {self.value} to {self.name} as registers {registers} at address {self.address}") diff --git a/mate3/sunspec/payload.py b/mate3/sunspec/payload.py new file mode 100644 index 0000000..fa6fe61 --- /dev/null +++ b/mate3/sunspec/payload.py @@ -0,0 +1,13 @@ +from pymodbus.constants import Endian +from pymodbus.payload import BinaryPayloadBuilder, BinaryPayloadDecoder + +BYTEORDER = Endian.Big +WORDORDER = Endian.Big + + +def get_decoder(registers): + return BinaryPayloadDecoder.fromRegisters(registers=registers, byteorder=BYTEORDER, wordorder=WORDORDER) + + +def get_encoder(): + return BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big) diff --git a/mate3/sunspec/scripts/code_generator.py b/mate3/sunspec/scripts/code_generator.py index 67e354c..427eb94 100644 --- a/mate3/sunspec/scripts/code_generator.py +++ b/mate3/sunspec/scripts/code_generator.py @@ -1,11 +1,10 @@ import re from collections import OrderedDict from dataclasses import dataclass -from functools import lru_cache from pathlib import Path from loguru import logger -from mate3.sunspec.fields import Field, Mode +from mate3.sunspec.fields import Mode from openpyxl import load_workbook ROOT = Path(__file__).parent.parent From 97a8acd93e80f1cb9415b1fbf70ed8efe50400c7 Mon Sep 17 00:00:00 2001 From: kodonnell Date: Sun, 17 Jan 2021 12:35:17 +1300 Subject: [PATCH 06/10] update docs and stuff --- CONTRIBUTING.md | 15 +- README.md | 137 +++--------------- doc/general.md | 27 ++++ doc/troubleshooting.md | 30 ++++ examples/getting_started.py | 42 ++---- .../postgress_monitoring/constraints.txt | 0 mate3/modbus_client.py | 2 +- mate3/sunspec/fields.py | 6 + 8 files changed, 113 insertions(+), 146 deletions(-) create mode 100644 doc/general.md create mode 100644 doc/troubleshooting.md rename constraints.txt => examples/postgress_monitoring/constraints.txt (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 938ccf8..abda22b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,21 +1,24 @@ # Contributing +## General design decisions + +- Keep it simple for now - both for developers and for users. Don't worry too much about weird edge cases that could arise, unless they're likely to occur (i.e. someone reports it). +- General Intellisense behaviour is important since we've got so many fields. And having a type annotation on them is even better for auto-completion etc. Since we're using dynamically generated models, it'd be tempting (and probably cleaner) to make liberal use of `__getattr__`, but we don't, 'cos that'd mess with Intellisense. +- Documentation and tests come when there's time/users. Tests are best for now, as they serve as documentation too. + ## Brief overview of the code ... The key things to note are: -- All the modbus information about devices/fields/etc. is auto-generated from `./sunspec/doc/OutBack.Power.SunSpec.Map.xlsx`. +- Stuff related to SunSpec should go in `./sunspec`. +- `./sunspec/models.py` includes the field definitions, and is auto-generated from `./sunspec/scripts/code_generator.py`. - All the other code for reading/interacting then utilises these definitions. -- If it seems weird that e.g. we have `Field`s and `FieldValue`s, this is why. The `Field` is the pure things parsed from the specification provided by Outback, which we want to keep clean and separate. The `FieldValue` is then the thing you actually interact with (and references an underlying `Field`). Maybe there's a nicer way of doing it, but for now this works. -- Typing is handy. -- General focus is on simple usage for the majority of use cases. - There are some basic tests - it'd be nice to have more! - Using the caching options in `Mate3Client` or the CLI are best for developing, as it avoids bricking your device. ## Code contributions -If you wish to edit the mate3 source (contributions are gladly received!), -then you can get the project directly from GitHub: +If you wish to edit the mate3 source (contributions are gladly received!), then you can get the project directly from GitHub: ```sh # Install poetry if you don't have it already (if you're unsure, you don't have it) diff --git a/README.md b/README.md index 831b263..da6ee9d 100644 --- a/README.md +++ b/README.md @@ -22,96 +22,24 @@ pip install mate3 After this you should be able to run the `mate3` command. To access your Mate it must be connected to your local network using its ethernet port. -## Background info you probably should know ... +## Quickstart -Reading this will help you understand this libary and how to interact with your Mate. - -### Modbus - -Hopefully, you don't need to worry about Modbus at all - this library should abstract that away for you. The key thing to note is that Modbus is a communication protocol, and this library works by interacting with the Mate3 physical devices using synchronous messages. So: - -- The information isn't 'live' - it's only the latest state since we last read the values. Generally, you should be calling `read` or `write` before/after any operation you make. -- Don't over-communicate! If you start doing too many `read`s or `write`s you might brick the Modbus interface of your Mate (requiring a reboot to fix). As a rule of thumb, you probably don't want to be reading more frequently than once per second (and even then, preferably only specific fields, and not the whole lot). Since it's a communication protocol (and it's not actually clear what the latency is inherent in the Mate), there's not much point reading faster that this anyway. -- Given the above, you might want to use the caching options in the `Mate3Client`, which can allow you to completely avoid interacting with/bricking your Mate while you're developing code etc. It's really tedious having to restart it every time your have a bug in your code. -- Weird things happen when encoding stuff into Modbus. Hopefully you'll never notice this, but if you see things where your `-1` is appearing as `65535` then yeh, that may be it. - -### SunSpec & Outback & Modbus - -You can check out the details of how Outback implements Modbus in [./mate3/sunspec/doc](./mate3/sunspec/doc), but the key things to note are: - -- SunSpec is a generic Modbus implementation for distributed energy systems include e.g. solar. There's a bunch of existing definitions for what e.g. charge controllers, inverters, etc. should be. -- Outback use these, but they have their own additional information they include - which they refer to as 'configuration' definitions (generally as that's where the writeable fields live i.e. things you can change). Generally, when you're using this library you might see e.g. `charge_controller.config.absorb_volts`. Here the `charge_controller` is the SunSpec block, and we add on a special `config` field which is actually a pointer to the Outback configuration block. This is to try to abstract away the implementation details so you don't have to worry about their being multiple charge controller things, etc. - -### Pseudo-glossary - -Words are confusing. For now, take the below as a rough guide: - - `Field` - this is a definition of a field e.g. `absorb_volts` is `Uint16` with units of `"Volts"` etc. - - `Model` - This is generally referring to a specific Modbus 'block' - which is really just a collection of fields that are generally aligned to a specific device e.g. an inverter model will have an output KWH field, which a charge controller model won't. (Again, it's confusing here as Outback generally have two models per device.) In the case above `charge_controller` represents one (SunSpec) model, and `charge_controller.config` another (Outback) model. - - `Device` - this is meant to represent a physical device and is basically our way of wrapping the Outback config model with the SunSpec one. - - `FieldValue` - this is kind of like a `Field` but with data (read from Modbus) included i.e. "the value of the field". It includes some nice things too like auto-scaling variables ('cos floats aren't a thing) and simple `read` or `write` APIs. - -## More documentation? - -At this stage, it doesn't exist - the best documentation is the code and [the examples](./examples), though this only works well for those who know Python. A few other quick tips: - -- Turn intellisense on! There's a bunch of typing in this library, so it'll make your life much easier e.g. for finding all the fields accessible from your charge controller, etc. -- [./mate3/sunspec/models.py](./mate3/sunspec/models.py) has all of the key definitions for every model, including all the fields (each of which has name/units/description/etc.). Error flags and enums are properly defined there too. - -## Using the library - -More documentation is needed (see above), but you can get a pretty code idea from [./examples/getting_started.py](./examples/getting_started.py), copied (somewhat) below. +Here's how you'd update a value and then read the battery voltage every second in Python: ```python -# Creating a client allows you to interface with the Mate. It also does a read of all devices connected to it (via the -# hub) on initialisation: -with Mate3Client("...") as client: - # What's the system name? - mate = client.devices.mate3 - print(mate.system_name) - # >>> FieldValue[system_name] | Mode.RW | Implemented | Value: OutBack Power Technologies | Read @ 2021-01-01 17:50:54.373077 - - # Get the battery voltage. Note that it's auto-scaled appropriately. - fndc = client.devices.fndc - print(fndc.battery_voltage) - # >>> FieldValue[battery_voltage] | Mode.R | Implemented | Scale factor: -1 | Unscaled value: 506 | Value: 50.6 | ... - Read @ 2021-01-01 17:50:54.378941 - - # Get the (raw) values for the same device type on different ports. - inverters = client.devices.single_phase_radian_inverters - for port, inverter in inverters.items(): - print(f"Output KW for inverter on port {port} is {inverter.output_kw.value}") - # >>> Output KW for inverter on port 1 is 0.7 - # >>> Output KW for inverter on port 2 is 0.0 - - # Values aren't 'live' - they're only updated whenever you initialise the client, call client.update_all() or - # re-read a particular value. Here's how we re-read the battery voltage. Note the change in the last_read field - time.sleep(0.1) - fndc.battery_voltage.read() - print(fndc.battery_voltage) - # >>> FieldValue[battery_voltage] | Mode.R | Implemented | Scale factor: -1 | Unscaled value: 506 | Value: 50.6 | Read @ 2021-01-01 17:50:54.483401 - - # Nice. Modbus fields that aren't implemented are easy to identify: - print(mate.alarm_email_enable.implemented) - # >>> False - - # We can write new values to the device too. Note that we don't need to worry about scaling etc. - # WARNING: this will actually write stuff to your mate - see the warning below! - mate.system_name.write("New system name") - print(mate.system_name) - # >>> FieldValue[system_name] | Mode.RW | Implemented | Value: New system name | Read @ 2021-01-01 17:50:54.483986 - - # All the fields and options are well defined so e.g. for enums you can see valid options e.g: - print(list(mate.ags_generator_type.field.options)) - # >>> [, , ] - - # In this case these are normal python Enums, so you can access them as expected, and assign them: - mate.ags_generator_type.write(mate.ags_generator_type.field.options["DC Gen"]) - # >>> ags_generator_type.DC Gen +with Mate3Client(host="") as client: + # Rename the system 'cos why not? + mate.system_name.write(b"New system name") + # Now monitor the battery voltage: + voltage = client.fndc.battery_voltage + while True: + print(f"Battery voltage is {voltage.value} {voltage.units}") + if voltage < 48: + # Panic stations! + # ... ``` -## Using the command line interface (CLI) - -A simple CLI is available, with four main sub-commands: +You can also use the CLI, which has four main sub-commands: - `read` - reads all of the values from the Mate3 and prints to stdout in a variety of formats. - `write` - writes values to the Mate3. (If you're doing anything serious you should use the python API.) @@ -120,6 +48,16 @@ A simple CLI is available, with four main sub-commands: For each you can access the help (i.e. `mate3 -h`) for more information. +## More documentation? + +At this stage, it's not really complete, but there are a few avenues: + +- [./doc/general.md](./doc/general.md) has a dicussion about modbus/SunSpec/etc. and some other potentially useful things. +- The best documentation is the code and [the examples](./examples), especially [./examples/getting_started.py](./examples/getting_started.py). However this only works well for those who know Python. +- Turn intellisense on! There's a bunch of typing in this library, so it'll make your life much easier e.g. for finding all the fields accessible from your charge controller, etc. +- [./mate3/sunspec/models.py](./mate3/sunspec/models.py) has all of the key definitions for every model, including all the fields (each of which has name/units/description/etc.). Error flags and enums are properly defined there too. +- [./mate3/sunspec/doc](./mate3/sunspec/doc) has more detailed vendor information about modbus/SunSpec/OutBack details, though this is unlikely to be useful to you unless you're developing the library. + ## Warnings First, the big one: @@ -130,34 +68,7 @@ In addition, there are other edges cases that may cause problems, mostly related ## Troubleshooting -Some ideas (which can be helpful for issues) - -### Set log-level to DEBUG - -See `mate3 -h` for the CLI, otherwise the following (or similar) for python code: - -```python -from loguru import logger -logger.remove() -logger.add(sys.stderr, level="DEBUG") -``` - -### List the devices - -```sh -$ mate3 devices --host ... -name address port ----- ------- ---- -Mate3 40069 None -ChargeController 40986 4 -ChargeControllerConfiguration 41014 4 -... -``` -Are they all there? - -### Create a dump of the raw modbus values - -See `mate3 dump -h`. You can send the resulting JSON file to someone to help debug. (Just note that it includes all the data about the Mate, e.g. any passwords etc.) +See [./doc/troubleshooting.md](./doc/troubleshooting.md). ## Writing data to Postgres diff --git a/doc/general.md b/doc/general.md new file mode 100644 index 0000000..2dfdb18 --- /dev/null +++ b/doc/general.md @@ -0,0 +1,27 @@ +# Generally useful information + +Reading this will help you understand this libary and how to interact with your Mate. + +### Modbus + +Hopefully, you don't need to worry about Modbus at all - this library should abstract that away for you. The key thing to note is that Modbus is a communication protocol, and this library works by interacting with the Mate3 physical devices using synchronous messages. So: + +- The information isn't 'live' - it's only the latest state since we last read the values. When you create a client, it reads everything from all of your devices once, but then you should be calling `read` or `write` on a field as required. +- Don't over-communicate! If you start doing too many `read`s or `write`s you might brick the Modbus interface of your Mate (requiring a reboot to fix). As a rule of thumb, you probably don't want to be doing a full read more frequently than once per second (and even then, preferably only specific fields, and not the whole lot). Since it's a communication protocol (and it's not actually clear what the latency is inherent in the Mate), there's not much point reading faster that this anyway. +- Given the above, you might want to use the caching options in the `Mate3Client`, which can allow you to completely avoid interacting with/bricking your Mate while you're developing code etc. It's really tedious having to restart it every time your have a bug in your code. +- Weird things happen when encoding stuff into Modbus. Hopefully you'll never notice this, but if you see things where your `-1` is appearing as `65535` then yeh, that may be it. + +### SunSpec & Outback & Modbus + +You can check out the details of how Outback implements Modbus in [./mate3/sunspec/doc](./mate3/sunspec/doc), but the key things to note are: + +- SunSpec is a generic Modbus implementation for distributed energy systems include e.g. solar. There's a bunch of existing definitions for what e.g. charge controllers, inverters, etc. should be. +- Outback use these, but they also have their own additional information they include - which they refer to as 'configuration' definitions (generally as that's where the writeable fields live i.e. things you can change). Generally, when you're using this library you might see e.g. `charge_controller.config.absorb_volts`. Here the `charge_controller` is the SunSpec ChargeController block, and we add on a special `config` field which is actually a pointer to the Outback configuration block. This is to try to abstract away the implementation details so you don't have to worry about their being multiple charge controller things, etc. + +### Pseudo-glossary + +For now, take the below as a rough glossary: + + - `Field` - this is a definition of a field e.g. `absorb_volts` is `Uint16` with units of `"Volts"` etc. It includes nice APIs for doing things like `read` and `write` and getting additional info about a field's value. + - `Model` - This is generally referring to a specific Modbus 'block' - which is really just a collection of fields that are generally aligned to a specific device e.g. an inverter model will have an output KWH field, which a charge controller model won't. + - `Device` - this is meant to represent a physical device and is basically our way of adding the 'config' model (e.g. `ChargeControllerConfigurationModel`) with the 'main' model (e.g. `ChargeControllerModel`) via a `.config` attribute. \ No newline at end of file diff --git a/doc/troubleshooting.md b/doc/troubleshooting.md new file mode 100644 index 0000000..9181254 --- /dev/null +++ b/doc/troubleshooting.md @@ -0,0 +1,30 @@ +# Troubleshooting + +Some ideas (which can be helpful for issues) + +## Set log-level to DEBUG + +See `mate3 -h` for the CLI, otherwise the following (or similar) for python code: + +```python +from loguru import logger +logger.remove() +logger.add(sys.stderr, level="DEBUG") +``` + +## List the devices + +```sh +$ mate3 devices --host ... +name address port +---- ------- ---- +Mate3 40069 None +ChargeController 40986 4 +ChargeControllerConfiguration 41014 4 +... +``` +Are they all there? + +## Create a dump of the raw modbus values + +See `mate3 dump -h`. You can send the resulting JSON file to someone to help debug. (Just note that it includes all the data about the Mate, e.g. any passwords etc.) \ No newline at end of file diff --git a/examples/getting_started.py b/examples/getting_started.py index 877da90..a0e753b 100644 --- a/examples/getting_started.py +++ b/examples/getting_started.py @@ -12,38 +12,28 @@ logger.remove() logger.add(sys.stderr, level="INFO") - # Creating a client allows you to interface with the Mate. It also does a read of all devices connected to it (via the - # hub) on initialisation. The following works on a cached file so you can see how things work without actually + # Creating a client allows you to interface with the Mate. It also does a read of all devices connected to it (via + # the hub) on initialisation. The following works on a cached file so you can see how things work without actually # accessing/affecting a real Mate3. If you want to try it on your own system (in which case you should remove the # writes first!) just replace the line below with `with Mate3Client("") as client:` with Mate3Client(host=None, cache_path=CACHE_PATH, cache_only=True) as client: - print("# What's the system name?") - mate = client.mate3 - print(mate.system_name) - print("# Get the battery voltage. Note that it's auto-scaled appropriately.") - fndc = client.fndc - print(fndc.battery_voltage) - print("# Get the (raw) values for the same device type on different ports.") + # What's the battery voltage? (For those who know about Modbus/SunSpec, it's auto-scaled to a float.) + voltage = client.fndc.battery_voltage + print(f"Battery voltage is {voltage.value} {voltage.units}") + # What about when there are multiple devices (on different ports)? inverters = client.single_phase_radian_inverters for port, inverter in inverters.items(): - print(f"Output KW for inverter on port {port} is {inverter.output_kw.value}") - print( - ( - "# Values aren't 'live' - they're only updated whenever you initialise the client, call" - " client.update_all() or re-read a particular value. Here's how we re-read the battery voltage. Note" - " the change in the last_read field" - ) - ) + print(f"Output for inverter on port {port} is {inverter.output_kw.value} {inverter.output_kw.units}") + # Values aren't 'live' - they're only updated whenever you initialise the client, or re-read a particular value. + # Here's how we re-read the battery voltage. Note the change in the read time + print(f"Time battery voltage was read: {voltage.read_time:%H:%M:%S.%f}") time.sleep(0.1) - fndc.battery_voltage.read() - print(fndc.battery_voltage) - print("# Nice. Modbus fields that aren't implemented are easy to identify:") - print("Implemented?", mate.alarm_email_enable.implemented) - print("# We can write new values to the device too. Note that we don't need to worry about scaling etc.") + voltage.read() + print(f"Time battery voltage was read (after second read): {voltage.read_time:%H:%M:%S.%f}") + # We can write new values to the device too. Note that we don't need to worry about scaling etc. + mate = client.mate3 mate.system_name.write(b"New system name") - print("After write: ", mate.system_name) - print("# All the fields and options are well defined so e.g. for enums you can see valid options e.g:") + # All the fields and options are well defined so e.g. for enums you can see valid options e.g: print(list(mate.ags_generator_type.enum)) - print("# In this case these are normal python Enums, so you can access them as expected, and assign them:") + # In this case these are normal python Enums, so you can access them as expected, and assign them: mate.ags_generator_type.write(mate.ags_generator_type.enum["DC Gen"]) - print(mate.ags_generator_type.value) diff --git a/constraints.txt b/examples/postgress_monitoring/constraints.txt similarity index 100% rename from constraints.txt rename to examples/postgress_monitoring/constraints.txt diff --git a/mate3/modbus_client.py b/mate3/modbus_client.py index 3522288..2192824 100644 --- a/mate3/modbus_client.py +++ b/mate3/modbus_client.py @@ -64,7 +64,7 @@ def _write_cache(self): # Only write to disk if writeable if not self._writeable: - logger.info("Not persisting any changes to cache on client close as writeable is False") + logger.debug("Not persisting any changes to cache on client close as writeable is False") else: with open(self._cache_path, "w") as f: json.dump(self._cache, f, indent=2) diff --git a/mate3/sunspec/fields.py b/mate3/sunspec/fields.py index 09d94e1..3c0c367 100644 --- a/mate3/sunspec/fields.py +++ b/mate3/sunspec/fields.py @@ -76,9 +76,15 @@ def address(self) -> int: return self._last_read.address @property + @has_been_read def registers(self) -> Tuple[int]: return self._last_read.registers + @property + @has_been_read + def read_time(self) -> datetime: + return self._last_read.time + @last_read.setter def last_read(self, read: FieldRead): self._last_read = read From 510d99e79e21c5976ea5e25fe0734cf0cd3df1d8 Mon Sep 17 00:00:00 2001 From: kodonnell Date: Tue, 1 Mar 2022 07:01:01 +1300 Subject: [PATCH 07/10] fix endian not imported --- mate3/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mate3/api.py b/mate3/api.py index 381f870..b026bff 100644 --- a/mate3/api.py +++ b/mate3/api.py @@ -2,7 +2,7 @@ from typing import Dict, Iterable, List, Optional from loguru import logger -from pymodbus.constants import Defaults +from pymodbus.constants import Defaults, Endian from pymodbus.payload import BinaryPayloadDecoder from mate3.devices import ( From 2fdef47851c14a9d5de9b7d1c7c36d03ec23829b Mon Sep 17 00:00:00 2001 From: kodonnell Date: Tue, 1 Mar 2022 07:14:11 +1300 Subject: [PATCH 08/10] bump versions etc. --- poetry.lock | 1123 ++++++++++++++++++++++++++++-------------------- pyproject.toml | 14 +- 2 files changed, 657 insertions(+), 480 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2dbd11b..225e43f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,37 +1,54 @@ [[package]] name = "aiohttp" -version = "3.7.3" +version = "3.8.1" description = "Async http client/server framework (asyncio)" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -async-timeout = ">=3.0,<4.0" +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +asynctest = {version = "0.13.0", markers = "python_version < \"3.8\""} attrs = ">=17.3.0" -chardet = ">=2.0,<4.0" +charset-normalizer = ">=2.0,<3.0" +frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -typing-extensions = ">=3.6.5" +typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} yarl = ">=1.0,<2.0" [package.extras] -speedups = ["aiodns", "brotlipy", "cchardet"] +speedups = ["aiodns", "brotli", "cchardet"] [[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +name = "aiosignal" +version = "1.2.0" +description = "aiosignal: a list of registered asynchronous callbacks" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" + +[package.dependencies] +frozenlist = ">=1.1.0" [[package]] name = "async-timeout" -version = "3.0.1" +version = "4.0.2" description = "Timeout context manager for asyncio programs" category = "dev" optional = false -python-versions = ">=3.5.3" +python-versions = ">=3.6" + +[package.dependencies] +typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} + +[[package]] +name = "asynctest" +version = "0.13.0" +description = "Enhance the standard unittest package with features for testing asyncio libraries" +category = "dev" +optional = false +python-versions = ">=3.5" [[package]] name = "atomicwrites" @@ -43,43 +60,44 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "attrs" -version = "20.3.0" +version = "21.4.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] [[package]] name = "black" -version = "20.8b1" +version = "22.1.0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.2" [package.dependencies] -appdirs = "*" -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" -regex = ">=2020.1.8" -toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = ">=1.1.0" +typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "cerberus" -version = "1.3.2" +version = "1.3.4" description = "Lightweight, extensible schema and data validation tool for Python dictionaries." category = "dev" optional = false @@ -87,27 +105,34 @@ python-versions = ">=2.7" [[package]] name = "certifi" -version = "2020.12.5" +version = "2021.10.8" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = "*" [[package]] -name = "chardet" -version = "3.0.4" -description = "Universal encoding detector for Python 2 and 3" +name = "charset-normalizer" +version = "2.0.12" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "7.1.2" +version = "8.0.4" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" @@ -311,21 +336,21 @@ packaging = "*" [[package]] name = "dictdiffer" -version = "0.8.1" +version = "0.9.0" description = "Dictdiffer is a library that helps you to diff and patch dictionaries." category = "dev" optional = false python-versions = "*" [package.extras] -all = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)", "numpy (>=1.11.0)"] -docs = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)"] -numpy = ["numpy (>=1.11.0)"] -tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)"] +all = ["Sphinx (>=3)", "sphinx-rtd-theme (>=0.2)", "check-manifest (>=0.42)", "mock (>=1.3.0)", "pytest-cov (>=2.10.1)", "pytest-isort (>=1.2.0)", "sphinx (>=3)", "tox (>=3.7.0)", "numpy (>=1.13.0)", "numpy (>=1.15.0)", "numpy (>=1.18.0)", "pytest (==5.4.3)", "pytest-pycodestyle (>=2)", "pytest-pydocstyle (>=2)", "pytest (>=6)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2.2.0)", "numpy (>=1.20.0)"] +docs = ["Sphinx (>=3)", "sphinx-rtd-theme (>=0.2)"] +numpy = ["numpy (>=1.13.0)", "numpy (>=1.15.0)", "numpy (>=1.18.0)", "numpy (>=1.20.0)"] +tests = ["check-manifest (>=0.42)", "mock (>=1.3.0)", "pytest-cov (>=2.10.1)", "pytest-isort (>=1.2.0)", "sphinx (>=3)", "tox (>=3.7.0)", "pytest (==5.4.3)", "pytest-pycodestyle (>=2)", "pytest-pydocstyle (>=2)", "pytest (>=6)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2.2.0)"] [[package]] name = "docutils" -version = "0.16" +version = "0.18.1" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false @@ -333,37 +358,45 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "et-xmlfile" -version = "1.0.1" +version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "flake8" -version = "3.8.4" +version = "4.0.1" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.6" [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.6.0a1,<2.7.0" -pyflakes = ">=2.2.0,<2.3.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "frozenlist" +version = "1.3.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "dev" +optional = false +python-versions = ">=3.7" [[package]] name = "idna" -version = "2.10" +version = "3.3" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "3.3.0" +version = "4.2.0" description = "Read metadata from Python packages" category = "dev" optional = false @@ -374,8 +407,8 @@ typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -385,27 +418,19 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "jdcal" -version = "1.4.1" -description = "Julian dates from proleptic Gregorian and Julian calendars." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "jinja2" -version = "2.11.2" +version = "3.0.3" description = "A very fast and expressive template engine." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] -MarkupSafe = ">=0.23" +MarkupSafe = ">=2.0" [package.extras] -i18n = ["Babel (>=0.8)"] +i18n = ["Babel (>=2.7)"] [[package]] name = "loguru" @@ -436,11 +461,11 @@ mistune = "*" [[package]] name = "markupsafe" -version = "1.1.1" +version = "2.1.0" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = ">=3.7" [[package]] name = "mccabe" @@ -452,8 +477,8 @@ python-versions = "*" [[package]] name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" +version = "2.0.2" +description = "A sane Markdown parser with useful plugins and renderers" category = "dev" optional = false python-versions = "*" @@ -473,11 +498,11 @@ test = ["pytest (<5.4)", "pytest-cov"] [[package]] name = "multidict" -version = "5.1.0" +version = "6.0.2" description = "multidict implementation" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "mypy-extensions" @@ -489,34 +514,33 @@ python-versions = "*" [[package]] name = "openpyxl" -version = "3.0.5" +version = "3.0.9" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" category = "dev" optional = false -python-versions = ">=3.6," +python-versions = ">=3.6" [package.dependencies] et-xmlfile = "*" -jdcal = "*" [[package]] name = "packaging" -version = "20.8" +version = "21.3" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] -pyparsing = ">=2.0.2" +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.8.1" +version = "0.9.0" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pexpect" @@ -529,19 +553,32 @@ python-versions = "*" [package.dependencies] ptyprocess = ">=0.5" +[[package]] +name = "platformdirs" +version = "2.5.1" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + [[package]] name = "pluggy" -version = "0.13.1" +version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "ptyprocess" @@ -553,23 +590,23 @@ python-versions = "*" [[package]] name = "py" -version = "1.10.0" +version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pycodestyle" -version = "2.6.0" +version = "2.8.0" description = "Python style guide checker" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pyflakes" -version = "2.2.0" +version = "2.4.0" description = "passive checker of Python programs" category = "dev" optional = false @@ -577,11 +614,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pymodbus" -version = "2.4.0" +version = "2.5.3" description = "A fully featured modbus protocol stack in python" category = "main" optional = false -python-versions = "*" +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" [package.dependencies] pyserial = ">=3.4" @@ -590,17 +627,20 @@ six = ">=1.15.0" [package.extras] documents = ["sphinx (>=1.1.3)", "sphinx-rtd-theme", "humanfriendly"] quality = ["coverage (>=3.5.3)", "nose (>=1.2.1)", "mock (>=1.0.0)", "pep8 (>=1.3.3)"] -repl = ["click (>=7.0)", "prompt-toolkit (==2.0.4)", "pygments (==2.2.0)"] +repl = ["click (>=7.0)", "prompt-toolkit (==2.0.4)", "pygments (>=2.2.0)", "click (>=7.0)", "prompt-toolkit (>=3.0.8)", "pygments (>=2.2.0)", "aiohttp (>=3.7.3)", "pyserial-asyncio (>=0.5)"] tornado = ["tornado (==4.5.3)"] -twisted = ["twisted (>=20.3.0)", "pyasn1 (>=0.1.4)"] +twisted = ["Twisted[conch,serial] (>=20.3.0)", "Twisted[conch] (>=20.3.0)"] [[package]] name = "pyparsing" -version = "2.4.7" +version = "3.0.7" description = "Python parsing module" category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyserial" @@ -615,7 +655,7 @@ cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "6.2.1" +version = "7.0.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -628,20 +668,20 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<1.0.0a1" +pluggy = ">=0.12,<2.0" py = ">=1.8.2" -toml = "*" +tomli = ">=1.0.0" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-console-scripts" -version = "1.1.0" +version = "1.3" description = "Pytest plugin for testing console scripts" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.dependencies] mock = ">=2.0.0" @@ -660,51 +700,43 @@ dictdiffer = "*" [[package]] name = "pytest-subtests" -version = "0.4.0" +version = "0.7.0" description = "unittest subTest() support and subtests fixture" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.dependencies] -pytest = ">=5.3.0" - -[[package]] -name = "regex" -version = "2020.11.13" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = "*" +pytest = ">=7.0" [[package]] name = "requests" -version = "2.25.1" +version = "2.27.1" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<5" -idna = ">=2.5,<3" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} urllib3 = ">=1.21.1,<1.27" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "ruamel.yaml" -version = "0.16.12" +version = "0.17.21" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3" [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.9\""} +"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""} [package.extras] docs = ["ryd"] @@ -712,15 +744,15 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel.yaml.clib" -version = "0.2.2" +version = "0.2.6" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" [[package]] name = "shellingham" -version = "1.3.2" +version = "1.4.0" description = "Tool to Detect Surrounding Shell" category = "dev" optional = false @@ -728,47 +760,55 @@ python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" [[package]] name = "six" -version = "1.15.0" +version = "1.16.0" description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" +name = "termcolor" +version = "1.1.0" +description = "ANSII Color formatting for output in terminal." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.7.0" +version = "0.10.0" description = "Style preserving TOML library" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6,<4.0" [[package]] name = "typed-ast" -version = "1.4.2" +version = "1.5.2" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "typing-extensions" -version = "3.7.4.3" -description = "Backported and Experimental Type Hints for Python 3.5+" +version = "4.1.1" +description = "Backported and Experimental Type Hints for Python 3.6+" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "urllib3" -version = "1.26.2" +version = "1.26.8" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false @@ -781,7 +821,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "win32-setctime" -version = "1.0.3" +version = "1.1.0" description = "A small Python utility to set file creation time on Windows" category = "main" optional = false @@ -792,7 +832,7 @@ dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] [[package]] name = "yarl" -version = "1.6.3" +version = "1.7.2" description = "Yet another URL library" category = "dev" optional = false @@ -805,102 +845,166 @@ typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [[package]] name = "yaspin" -version = "1.2.0" +version = "2.1.0" description = "Yet Another Terminal Spinner" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6.2,<4.0.0" + +[package.dependencies] +termcolor = ">=1.1.0,<2.0.0" [[package]] name = "zipp" -version = "3.4.0" +version = "3.7.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "7913d2d56e8c4596ba12d84828da16215b97ba8c524b42e2ac79c0fd1eb4e59a" +content-hash = "3f67cb33247d340bd07a520fe6051f695c31fcea5482712604e088e79f3ccba7" [metadata.files] aiohttp = [ - {file = "aiohttp-3.7.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:328b552513d4f95b0a2eea4c8573e112866107227661834652a8984766aa7656"}, - {file = "aiohttp-3.7.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c733ef3bdcfe52a1a75564389bad4064352274036e7e234730526d155f04d914"}, - {file = "aiohttp-3.7.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2858b2504c8697beb9357be01dc47ef86438cc1cb36ecb6991796d19475faa3e"}, - {file = "aiohttp-3.7.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:d2cfac21e31e841d60dc28c0ec7d4ec47a35c608cb8906435d47ef83ffb22150"}, - {file = "aiohttp-3.7.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:3228b7a51e3ed533f5472f54f70fd0b0a64c48dc1649a0f0e809bec312934d7a"}, - {file = "aiohttp-3.7.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:dcc119db14757b0c7bce64042158307b9b1c76471e655751a61b57f5a0e4d78e"}, - {file = "aiohttp-3.7.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:7d9b42127a6c0bdcc25c3dcf252bb3ddc70454fac593b1b6933ae091396deb13"}, - {file = "aiohttp-3.7.3-cp36-cp36m-win32.whl", hash = "sha256:df48a623c58180874d7407b4d9ec06a19b84ed47f60a3884345b1a5099c1818b"}, - {file = "aiohttp-3.7.3-cp36-cp36m-win_amd64.whl", hash = "sha256:0b795072bb1bf87b8620120a6373a3c61bfcb8da7e5c2377f4bb23ff4f0b62c9"}, - {file = "aiohttp-3.7.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:0d438c8ca703b1b714e82ed5b7a4412c82577040dadff479c08405e2a715564f"}, - {file = "aiohttp-3.7.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8389d6044ee4e2037dca83e3f6994738550f6ee8cfb746762283fad9b932868f"}, - {file = "aiohttp-3.7.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3ea8c252d8df5e9166bcf3d9edced2af132f4ead8ac422eac723c5781063709a"}, - {file = "aiohttp-3.7.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:78e2f18a82b88cbc37d22365cf8d2b879a492faedb3f2975adb4ed8dfe994d3a"}, - {file = "aiohttp-3.7.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:df3a7b258cc230a65245167a202dd07320a5af05f3d41da1488ba0fa05bc9347"}, - {file = "aiohttp-3.7.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:f326b3c1bbfda5b9308252ee0dcb30b612ee92b0e105d4abec70335fab5b1245"}, - {file = "aiohttp-3.7.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5e479df4b2d0f8f02133b7e4430098699450e1b2a826438af6bec9a400530957"}, - {file = "aiohttp-3.7.3-cp37-cp37m-win32.whl", hash = "sha256:6d42debaf55450643146fabe4b6817bb2a55b23698b0434107e892a43117285e"}, - {file = "aiohttp-3.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9c58b0b84055d8bc27b7df5a9d141df4ee6ff59821f922dd73155861282f6a3"}, - {file = "aiohttp-3.7.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f411cb22115cb15452d099fec0ee636b06cf81bfb40ed9c02d30c8dc2bc2e3d1"}, - {file = "aiohttp-3.7.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1e0920909d916d3375c7a1fdb0b1c78e46170e8bb42792312b6eb6676b2f87f"}, - {file = "aiohttp-3.7.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:59d11674964b74a81b149d4ceaff2b674b3b0e4d0f10f0be1533e49c4a28408b"}, - {file = "aiohttp-3.7.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:41608c0acbe0899c852281978492f9ce2c6fbfaf60aff0cefc54a7c4516b822c"}, - {file = "aiohttp-3.7.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:16a3cb5df5c56f696234ea9e65e227d1ebe9c18aa774d36ff42f532139066a5f"}, - {file = "aiohttp-3.7.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:6ccc43d68b81c424e46192a778f97da94ee0630337c9bbe5b2ecc9b0c1c59001"}, - {file = "aiohttp-3.7.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:d03abec50df423b026a5aa09656bd9d37f1e6a49271f123f31f9b8aed5dc3ea3"}, - {file = "aiohttp-3.7.3-cp38-cp38-win32.whl", hash = "sha256:39f4b0a6ae22a1c567cb0630c30dd082481f95c13ca528dc501a7766b9c718c0"}, - {file = "aiohttp-3.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:c68fdf21c6f3573ae19c7ee65f9ff185649a060c9a06535e9c3a0ee0bbac9235"}, - {file = "aiohttp-3.7.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:710376bf67d8ff4500a31d0c207b8941ff4fba5de6890a701d71680474fe2a60"}, - {file = "aiohttp-3.7.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2406dc1dda01c7f6060ab586e4601f18affb7a6b965c50a8c90ff07569cf782a"}, - {file = "aiohttp-3.7.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:2a7b7640167ab536c3cb90cfc3977c7094f1c5890d7eeede8b273c175c3910fd"}, - {file = "aiohttp-3.7.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:684850fb1e3e55c9220aad007f8386d8e3e477c4ec9211ae54d968ecdca8c6f9"}, - {file = "aiohttp-3.7.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:1edfd82a98c5161497bbb111b2b70c0813102ad7e0aa81cbeb34e64c93863005"}, - {file = "aiohttp-3.7.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:77149002d9386fae303a4a162e6bce75cc2161347ad2ba06c2f0182561875d45"}, - {file = "aiohttp-3.7.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:756ae7efddd68d4ea7d89c636b703e14a0c686688d42f588b90778a3c2fc0564"}, - {file = "aiohttp-3.7.3-cp39-cp39-win32.whl", hash = "sha256:3b0036c978cbcc4a4512278e98e3e6d9e6b834dc973206162eddf98b586ef1c6"}, - {file = "aiohttp-3.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:e1b95972a0ae3f248a899cdbac92ba2e01d731225f566569311043ce2226f5e7"}, - {file = "aiohttp-3.7.3.tar.gz", hash = "sha256:9c1a81af067e72261c9cbe33ea792893e83bc6aa987bfbd6fdc1e5e7b22777c4"}, -] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"}, + {file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"}, + {file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"}, + {file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"}, + {file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"}, + {file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"}, + {file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"}, + {file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"}, + {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, + {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, +] +aiosignal = [ + {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, + {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, ] async-timeout = [ - {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, - {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] +asynctest = [ + {file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"}, + {file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"}, ] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, + {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, + {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, + {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, + {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, + {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, + {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, + {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, + {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, + {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, + {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, + {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, + {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, + {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, + {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, + {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, + {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, + {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, + {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, + {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, + {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, + {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, + {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, + {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, ] cerberus = [ - {file = "Cerberus-1.3.2.tar.gz", hash = "sha256:302e6694f206dd85cb63f13fd5025b31ab6d38c99c50c6d769f8fa0b0f299589"}, + {file = "Cerberus-1.3.4.tar.gz", hash = "sha256:d1b21b3954b2498d9a79edf16b3170a3ac1021df88d197dc2ce5928ba519237c"}, ] certifi = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] -chardet = [ - {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, - {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, +charset-normalizer = [ + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, + {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, + {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -963,39 +1067,97 @@ dephell-versioning = [ {file = "dephell_versioning-0.1.2.tar.gz", hash = "sha256:9ba7636704af7bd64af5a64ab8efb482c8b0bf4868699722f5e2647763edf8e5"}, ] dictdiffer = [ - {file = "dictdiffer-0.8.1-py2.py3-none-any.whl", hash = "sha256:d79d9a39e459fe33497c858470ca0d2e93cb96621751de06d631856adfd9c390"}, - {file = "dictdiffer-0.8.1.tar.gz", hash = "sha256:1adec0d67cdf6166bda96ae2934ddb5e54433998ceab63c984574d187cc563d2"}, + {file = "dictdiffer-0.9.0-py2.py3-none-any.whl", hash = "sha256:442bfc693cfcadaf46674575d2eba1c53b42f5e404218ca2c2ff549f2df56595"}, + {file = "dictdiffer-0.9.0.tar.gz", hash = "sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578"}, ] docutils = [ - {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, - {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, ] et-xmlfile = [ - {file = "et_xmlfile-1.0.1.tar.gz", hash = "sha256:614d9722d572f6246302c4491846d2c393c199cfa4edc9af593437691683335b"}, + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, ] flake8 = [ - {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, - {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] +frozenlist = [ + {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3"}, + {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b"}, + {file = "frozenlist-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d"}, + {file = "frozenlist-1.3.0-cp310-cp310-win32.whl", hash = "sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d"}, + {file = "frozenlist-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c"}, + {file = "frozenlist-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846"}, + {file = "frozenlist-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468"}, + {file = "frozenlist-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3"}, + {file = "frozenlist-1.3.0-cp38-cp38-win32.whl", hash = "sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07"}, + {file = "frozenlist-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b"}, + {file = "frozenlist-1.3.0-cp39-cp39-win32.whl", hash = "sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08"}, + {file = "frozenlist-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab"}, + {file = "frozenlist-1.3.0.tar.gz", hash = "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b"}, ] idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] importlib-metadata = [ - {file = "importlib_metadata-3.3.0-py3-none-any.whl", hash = "sha256:bf792d480abbd5eda85794e4afb09dd538393f7d6e6ffef6e9f03d2014cf9450"}, - {file = "importlib_metadata-3.3.0.tar.gz", hash = "sha256:5c5a2720817414a6c41f0a49993908068243ae02c1635a228126519b509c8aed"}, + {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, + {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] -jdcal = [ - {file = "jdcal-1.4.1-py2.py3-none-any.whl", hash = "sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba"}, - {file = "jdcal-1.4.1.tar.gz", hash = "sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8"}, -] jinja2 = [ - {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, - {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, ] loguru = [ {file = "loguru-0.5.3-py3-none-any.whl", hash = "sha256:f8087ac396b5ee5f67c963b495d615ebbceac2796379599820e324419d53667c"}, @@ -1005,347 +1167,362 @@ m2r = [ {file = "m2r-0.2.1.tar.gz", hash = "sha256:bf90bad66cda1164b17e5ba4a037806d2443f2a4d5ddc9f6a5554a0322aaed99"}, ] markupsafe = [ - {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, - {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3028252424c72b2602a323f70fbf50aa80a5d3aa616ea6add4ba21ae9cc9da4c"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:290b02bab3c9e216da57c1d11d2ba73a9f73a614bbdcc027d299a60cdfabb11a"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e104c0c2b4cd765b4e83909cde7ec61a1e313f8a75775897db321450e928cce"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24c3be29abb6b34052fd26fc7a8e0a49b1ee9d282e3665e8ad09a0a68faee5b3"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204730fd5fe2fe3b1e9ccadb2bd18ba8712b111dcabce185af0b3b5285a7c989"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d3b64c65328cb4cd252c94f83e66e3d7acf8891e60ebf588d7b493a55a1dbf26"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:96de1932237abe0a13ba68b63e94113678c379dca45afa040a17b6e1ad7ed076"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75bb36f134883fdbe13d8e63b8675f5f12b80bb6627f7714c7d6c5becf22719f"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-win32.whl", hash = "sha256:4056f752015dfa9828dce3140dbadd543b555afb3252507348c493def166d454"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:d4e702eea4a2903441f2735799d217f4ac1b55f7d8ad96ab7d4e25417cb0827c"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f0eddfcabd6936558ec020130f932d479930581171368fd728efcfb6ef0dd357"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddea4c352a488b5e1069069f2f501006b1a4362cb906bee9a193ef1245a7a61"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09c86c9643cceb1d87ca08cdc30160d1b7ab49a8a21564868921959bd16441b8"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0a0abef2ca47b33fb615b491ce31b055ef2430de52c5b3fb19a4042dbc5cadb"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:736895a020e31b428b3382a7887bfea96102c529530299f426bf2e636aacec9e"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:679cbb78914ab212c49c67ba2c7396dc599a8479de51b9a87b174700abd9ea49"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:84ad5e29bf8bab3ad70fd707d3c05524862bddc54dc040982b0dbcff36481de7"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-win32.whl", hash = "sha256:8da5924cb1f9064589767b0f3fc39d03e3d0fb5aa29e0cb21d43106519bd624a"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:454ffc1cbb75227d15667c09f164a0099159da0c1f3d2636aa648f12675491ad"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:142119fb14a1ef6d758912b25c4e803c3ff66920635c44078666fe7cc3f8f759"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b2a5a856019d2833c56a3dcac1b80fe795c95f401818ea963594b345929dffa7"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d1fb9b2eec3c9714dd936860850300b51dbaa37404209c8d4cb66547884b7ed"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62c0285e91414f5c8f621a17b69fc0088394ccdaa961ef469e833dbff64bd5ea"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc3150f85e2dbcf99e65238c842d1cfe69d3e7649b19864c1cc043213d9cd730"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f02cf7221d5cd915d7fa58ab64f7ee6dd0f6cddbb48683debf5d04ae9b1c2cc1"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5653619b3eb5cbd35bfba3c12d575db2a74d15e0e1c08bf1db788069d410ce8"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d2f5d97fcbd004c03df8d8fe2b973fe2b14e7bfeb2cfa012eaa8759ce9a762f"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-win32.whl", hash = "sha256:3cace1837bc84e63b3fd2dfce37f08f8c18aeb81ef5cf6bb9b51f625cb4e6cd8"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:fabbe18087c3d33c5824cb145ffca52eccd053061df1d79d4b66dafa5ad2a5ea"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:023af8c54fe63530545f70dd2a2a7eed18d07a9a77b94e8bf1e2ff7f252db9a3"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d66624f04de4af8bbf1c7f21cc06649c1c69a7f84109179add573ce35e46d448"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c532d5ab79be0199fa2658e24a02fce8542df196e60665dd322409a03db6a52c"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ec74fada3841b8c5f4c4f197bea916025cb9aa3fe5abf7d52b655d042f956"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c653fde75a6e5eb814d2a0a89378f83d1d3f502ab710904ee585c38888816c"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:961eb86e5be7d0973789f30ebcf6caab60b844203f4396ece27310295a6082c7"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:598b65d74615c021423bd45c2bc5e9b59539c875a9bdb7e5f2a6b92dfcfc268d"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:599941da468f2cf22bf90a84f6e2a65524e87be2fce844f96f2dd9a6c9d1e635"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-win32.whl", hash = "sha256:e6f7f3f41faffaea6596da86ecc2389672fa949bd035251eab26dc6697451d05"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:b8811d48078d1cf2a6863dafb896e68406c5f513048451cd2ded0473133473c7"}, + {file = "MarkupSafe-2.1.0.tar.gz", hash = "sha256:80beaf63ddfbc64a0452b841d8036ca0611e049650e20afcb882f5d3c266d65f"}, ] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, + {file = "mistune-2.0.2-py2.py3-none-any.whl", hash = "sha256:6bab6c6abd711c4604206c7d8cad5cd48b28f072b4bb75797d74146ba393a049"}, + {file = "mistune-2.0.2.tar.gz", hash = "sha256:6fc88c3cb49dba8b16687b41725e661cf85784c12e8974a29b9d336dd596c3a1"}, ] mock = [ {file = "mock-4.0.3-py3-none-any.whl", hash = "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62"}, {file = "mock-4.0.3.tar.gz", hash = "sha256:7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc"}, ] multidict = [ - {file = "multidict-5.1.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f"}, - {file = "multidict-5.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf"}, - {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281"}, - {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d"}, - {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d"}, - {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da"}, - {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224"}, - {file = "multidict-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26"}, - {file = "multidict-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6"}, - {file = "multidict-5.1.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76"}, - {file = "multidict-5.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a"}, - {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f"}, - {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348"}, - {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93"}, - {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9"}, - {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37"}, - {file = "multidict-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5"}, - {file = "multidict-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632"}, - {file = "multidict-5.1.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952"}, - {file = "multidict-5.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79"}, - {file = "multidict-5.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456"}, - {file = "multidict-5.1.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7"}, - {file = "multidict-5.1.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635"}, - {file = "multidict-5.1.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a"}, - {file = "multidict-5.1.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea"}, - {file = "multidict-5.1.0-cp38-cp38-win32.whl", hash = "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656"}, - {file = "multidict-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3"}, - {file = "multidict-5.1.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93"}, - {file = "multidict-5.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647"}, - {file = "multidict-5.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d"}, - {file = "multidict-5.1.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8"}, - {file = "multidict-5.1.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1"}, - {file = "multidict-5.1.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841"}, - {file = "multidict-5.1.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda"}, - {file = "multidict-5.1.0-cp39-cp39-win32.whl", hash = "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80"}, - {file = "multidict-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359"}, - {file = "multidict-5.1.0.tar.gz", hash = "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, + {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, + {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, + {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, + {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, + {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, + {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, + {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, + {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, + {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, + {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] openpyxl = [ - {file = "openpyxl-3.0.5-py2.py3-none-any.whl", hash = "sha256:f7d666b569f729257082cf7ddc56262431878f602dcc2bc3980775c59439cdab"}, - {file = "openpyxl-3.0.5.tar.gz", hash = "sha256:18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b"}, + {file = "openpyxl-3.0.9-py2.py3-none-any.whl", hash = "sha256:8f3b11bd896a95468a4ab162fc4fcd260d46157155d1f8bfaabb99d88cfcf79f"}, + {file = "openpyxl-3.0.9.tar.gz", hash = "sha256:40f568b9829bf9e446acfffce30250ac1fa39035124d55fc024025c41481c90f"}, ] packaging = [ - {file = "packaging-20.8-py2.py3-none-any.whl", hash = "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858"}, - {file = "packaging-20.8.tar.gz", hash = "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093"}, + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pexpect = [ {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, ] +platformdirs = [ + {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, + {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, +] pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] ptyprocess = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, ] py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pycodestyle = [ - {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, - {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, ] pyflakes = [ - {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, - {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] pymodbus = [ - {file = "pymodbus-2.4.0-py2.py3-none-any.whl", hash = "sha256:25d2a50bd4651e8092afb8aa1aa6878d4550fbb5ad2a032109fe56fd1d6bf02b"}, - {file = "pymodbus-2.4.0.tar.gz", hash = "sha256:24ff600245b7cc9f4e299d7099eda5f35d000707bec3429f7bd6690637c22cd5"}, + {file = "pymodbus-2.5.3-py2.py3-none-any.whl", hash = "sha256:6f91403294a73b5a1616a11309f93c0b782115c09379438ef7ebc5bdf86182e9"}, + {file = "pymodbus-2.5.3.tar.gz", hash = "sha256:5ef68c1a109bdb467c830ef003ef2db6494349a5248e4af946fe21c9eefe7e74"}, ] pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, + {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, + {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] pyserial = [ {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, ] pytest = [ - {file = "pytest-6.2.1-py3-none-any.whl", hash = "sha256:1969f797a1a0dbd8ccf0fecc80262312729afea9c17f1d70ebf85c5e76c6f7c8"}, - {file = "pytest-6.2.1.tar.gz", hash = "sha256:66e419b1899bc27346cb2c993e12c5e5e8daba9073c1fbce33b9807abc95c306"}, + {file = "pytest-7.0.1-py3-none-any.whl", hash = "sha256:9ce3ff477af913ecf6321fe337b93a2c0dcf2a0a1439c43f5452112c1e4280db"}, + {file = "pytest-7.0.1.tar.gz", hash = "sha256:e30905a0c131d3d94b89624a1cc5afec3e0ba2fbdb151867d8e0ebd49850f171"}, ] pytest-console-scripts = [ - {file = "pytest-console-scripts-1.1.0.tar.gz", hash = "sha256:c1344853e80d8096403e36b270254a094071d0c4f1533e94a91d7386f0f1ccfd"}, + {file = "pytest-console-scripts-1.3.tar.gz", hash = "sha256:c3cadbf67cfb30a1eb1cc1e9e69cb6de44c3a648426f1b9bf63e85d97357fc7f"}, ] pytest-dictsdiff = [ {file = "pytest-dictsdiff-0.5.8.tar.gz", hash = "sha256:3fca5c706232ab723ab2a06b41c195a6abf1f0df56fb3bf67d6bc83a305dd659"}, {file = "pytest_dictsdiff-0.5.8-py2.py3-none-any.whl", hash = "sha256:8e3f4247a3610b67ddd32d2fbe31e955e55460f7b44974f31eacf0d8c326b84f"}, ] pytest-subtests = [ - {file = "pytest-subtests-0.4.0.tar.gz", hash = "sha256:8d9e2c1d1dce11f7b7d2c9d09202ebfc7757b7ff0cac9b72ad328edfe7ee037b"}, - {file = "pytest_subtests-0.4.0-py3-none-any.whl", hash = "sha256:3755a42b7416b99d90bb3cb2bd1ac4767d5e4b93b8853cb3565200a4e3a10b7e"}, -] -regex = [ - {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, - {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, - {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, - {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, - {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, - {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, - {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, - {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, - {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, - {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, - {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, - {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, - {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, + {file = "pytest-subtests-0.7.0.tar.gz", hash = "sha256:95c44c77e3fbede9848bb88ca90b384815fcba8090ef9a9f55659ab163b1681c"}, + {file = "pytest_subtests-0.7.0-py3-none-any.whl", hash = "sha256:2e3691caedea0c464fe96ffffd14bf872df1406b88d1930971dafe1966095bad"}, ] requests = [ - {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, - {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, + {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, + {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, ] "ruamel.yaml" = [ - {file = "ruamel.yaml-0.16.12-py2.py3-none-any.whl", hash = "sha256:012b9470a0ea06e4e44e99e7920277edf6b46eee0232a04487ea73a7386340a5"}, - {file = "ruamel.yaml-0.16.12.tar.gz", hash = "sha256:076cc0bc34f1966d920a49f18b52b6ad559fbe656a0748e3535cf7b3f29ebf9e"}, + {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"}, + {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"}, ] "ruamel.yaml.clib" = [ - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"}, - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:daf21aa33ee9b351f66deed30a3d450ab55c14242cfdfcd377798e2c0d25c9f1"}, - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win32.whl", hash = "sha256:30dca9bbcbb1cc858717438218d11eafb78666759e5094dd767468c0d577a7e7"}, - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win_amd64.whl", hash = "sha256:f6061a31880c1ed6b6ce341215336e2f3d0c1deccd84957b6fa8ca474b41e89f"}, - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"}, - {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"}, - {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"}, - {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1236df55e0f73cd138c0eca074ee086136c3f16a97c2ac719032c050f7e0622f"}, - {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"}, - {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"}, - {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"}, - {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"}, - {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2fd336a5c6415c82e2deb40d08c222087febe0aebe520f4d21910629018ab0f3"}, - {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"}, - {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"}, - {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"}, - {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"}, - {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:75f0ee6839532e52a3a53f80ce64925ed4aed697dd3fa890c4c918f3304bd4f4"}, - {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"}, - {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"}, - {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"}, - {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"}, - {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8be05be57dc5c7b4a0b24edcaa2f7275866d9c907725226cdde46da09367d923"}, - {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"}, - {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"}, - {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6ac7e45367b1317e56f1461719c853fd6825226f45b835df7436bb04031fd8a"}, - {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b4b0d31f2052b3f9f9b5327024dc629a253a83d8649d4734ca7f35b60ec3e9e5"}, - {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1f8c0a4577c0e6c99d208de5c4d3fd8aceed9574bb154d7a2b21c16bb924154c"}, - {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-win32.whl", hash = "sha256:46d6d20815064e8bb023ea8628cfb7402c0f0e83de2c2227a88097e239a7dffd"}, - {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6c0a5dc52fc74eb87c67374a4e554d4761fd42a4d01390b7e868b30d21f4b8bb"}, - {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, + {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, ] shellingham = [ - {file = "shellingham-1.3.2-py2.py3-none-any.whl", hash = "sha256:7f6206ae169dc1a03af8a138681b3f962ae61cc93ade84d0585cca3aaf770044"}, - {file = "shellingham-1.3.2.tar.gz", hash = "sha256:576c1982bea0ba82fb46c36feb951319d7f42214a82634233f58b40d858a751e"}, + {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, + {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, ] six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +termcolor = [ + {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, ] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, - {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, + {file = "tomlkit-0.10.0-py3-none-any.whl", hash = "sha256:cac4aeaff42f18fef6e07831c2c2689a51df76cf2ede07a6a4fa5fcb83558870"}, + {file = "tomlkit-0.10.0.tar.gz", hash = "sha256:d99946c6aed3387c98b89d91fb9edff8f901bf9255901081266a84fb5604adcd"}, ] typed-ast = [ - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, - {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, - {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, - {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, - {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, - {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, - {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, - {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, - {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, - {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, + {file = "typed_ast-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266"}, + {file = "typed_ast-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596"}, + {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc2542e83ac8399752bc16e0b35e038bdb659ba237f4222616b4e83fb9654985"}, + {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76"}, + {file = "typed_ast-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a"}, + {file = "typed_ast-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837"}, + {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:963a0ccc9a4188524e6e6d39b12c9ca24cc2d45a71cfdd04a26d883c922b4b78"}, + {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e"}, + {file = "typed_ast-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d"}, + {file = "typed_ast-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd"}, + {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7407cfcad702f0b6c0e0f3e7ab876cd1d2c13b14ce770e412c0c4b9728a0f88"}, + {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f30ddd110634c2d7534b2d4e0e22967e88366b0d356b24de87419cc4410c41b7"}, + {file = "typed_ast-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30"}, + {file = "typed_ast-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90904d889ab8e81a956f2c0935a523cc4e077c7847a836abee832f868d5c26a4"}, + {file = "typed_ast-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bbebc31bf11762b63bf61aaae232becb41c5bf6b3461b80a4df7e791fabb3aca"}, + {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29dd9a3a9d259c9fa19d19738d021632d673f6ed9b35a739f48e5f807f264fb"}, + {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b"}, + {file = "typed_ast-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:da0a98d458010bf4fe535f2d1e367a2e2060e105978873c04c04212fb20543f7"}, + {file = "typed_ast-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098"}, + {file = "typed_ast-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344"}, + {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e"}, + {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f290617f74a610849bd8f5514e34ae3d09eafd521dceaa6cf68b3f4414266d4e"}, + {file = "typed_ast-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:df05aa5b241e2e8045f5f4367a9f6187b09c4cdf8578bb219861c4e27c443db5"}, + {file = "typed_ast-1.5.2.tar.gz", hash = "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27"}, ] typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, + {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, + {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, ] urllib3 = [ - {file = "urllib3-1.26.2-py2.py3-none-any.whl", hash = "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473"}, - {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, + {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, + {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, ] win32-setctime = [ - {file = "win32_setctime-1.0.3-py3-none-any.whl", hash = "sha256:dc925662de0a6eb987f0b01f599c01a8236cb8c62831c22d9cada09ad958243e"}, - {file = "win32_setctime-1.0.3.tar.gz", hash = "sha256:4e88556c32fdf47f64165a2180ba4552f8bb32c1103a2fafd05723a0bd42bd4b"}, + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, ] yarl = [ - {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, - {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, - {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, - {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, - {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, - {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, - {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, - {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, - {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, - {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, - {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, - {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, - {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72"}, + {file = "yarl-1.7.2-cp310-cp310-win32.whl", hash = "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c"}, + {file = "yarl-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265"}, + {file = "yarl-1.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d"}, + {file = "yarl-1.7.2-cp36-cp36m-win32.whl", hash = "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1"}, + {file = "yarl-1.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913"}, + {file = "yarl-1.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b"}, + {file = "yarl-1.7.2-cp37-cp37m-win32.whl", hash = "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1"}, + {file = "yarl-1.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b"}, + {file = "yarl-1.7.2-cp38-cp38-win32.whl", hash = "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef"}, + {file = "yarl-1.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8"}, + {file = "yarl-1.7.2-cp39-cp39-win32.whl", hash = "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d"}, + {file = "yarl-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58"}, + {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, ] yaspin = [ - {file = "yaspin-1.2.0-py2.py3-none-any.whl", hash = "sha256:2742b0648ce0d56d5c6fd950453f474c712cb88f161e54b40e987ba53a19b845"}, - {file = "yaspin-1.2.0.tar.gz", hash = "sha256:72e9cdbc0e797ef886c373fef2bcd6526a704a470696f9d78d0bb27951fe659a"}, + {file = "yaspin-2.1.0-py3-none-any.whl", hash = "sha256:d574cbfaf0a349df466c91f7f81b22460ae5ebb15ecb8bf9411d6049923aee8d"}, + {file = "yaspin-2.1.0.tar.gz", hash = "sha256:c8d34eca9fda3f4dfbe59f57f3cf0f3641af3eefbf1544fbeb9b3bacf82c580a"}, ] zipp = [ - {file = "zipp-3.4.0-py3-none-any.whl", hash = "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108"}, - {file = "zipp-3.4.0.tar.gz", hash = "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb"}, + {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, + {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, ] diff --git a/pyproject.toml b/pyproject.toml index 6022d00..7692a8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,13 +18,13 @@ loguru = "^0.5.3" [tool.poetry.dev-dependencies] dephell = ">=0.7.6" -pytest = "^6.2.1" -pytest-dictsdiff = "^0.5.8" -pytest-subtests = "^0.4.0" -pytest-console-scripts = "^1.1.0" -openpyxl = "^3.0.5" -flake8 = "^3.8.4" -black = {version = "^20.8b1", allow-prereleases = true} +pytest = ">=6.2.1" +pytest-dictsdiff = ">=0.5.8" +pytest-subtests = ">=0.4.0" +pytest-console-scripts = ">=1.1.0" +openpyxl = ">=3.0.5" +flake8 = ">=3.8.4" +black = {version = ">=22", allow-prereleases = true} [tool.poetry.scripts] mate3 = 'mate3.main:main' From 89f1d5641f89f80b2274b247a3cefcf233aa00bd Mon Sep 17 00:00:00 2001 From: kodonnell Date: Tue, 1 Mar 2022 07:18:37 +1300 Subject: [PATCH 09/10] fix mistune bug from incorrectversoins --- poetry.lock | 12 ++++++------ pyproject.toml | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 225e43f..2e2f5bf 100644 --- a/poetry.lock +++ b/poetry.lock @@ -477,8 +477,8 @@ python-versions = "*" [[package]] name = "mistune" -version = "2.0.2" -description = "A sane Markdown parser with useful plugins and renderers" +version = "0.8.4" +description = "The fastest markdown parser in pure Python" category = "dev" optional = false python-versions = "*" @@ -629,7 +629,7 @@ documents = ["sphinx (>=1.1.3)", "sphinx-rtd-theme", "humanfriendly"] quality = ["coverage (>=3.5.3)", "nose (>=1.2.1)", "mock (>=1.0.0)", "pep8 (>=1.3.3)"] repl = ["click (>=7.0)", "prompt-toolkit (==2.0.4)", "pygments (>=2.2.0)", "click (>=7.0)", "prompt-toolkit (>=3.0.8)", "pygments (>=2.2.0)", "aiohttp (>=3.7.3)", "pyserial-asyncio (>=0.5)"] tornado = ["tornado (==4.5.3)"] -twisted = ["Twisted[conch,serial] (>=20.3.0)", "Twisted[conch] (>=20.3.0)"] +twisted = ["Twisted[serial,conch] (>=20.3.0)", "Twisted[conch] (>=20.3.0)"] [[package]] name = "pyparsing" @@ -869,7 +869,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "3f67cb33247d340bd07a520fe6051f695c31fcea5482712604e088e79f3ccba7" +content-hash = "832bab0ba8f1ef13b1ab048737bb2befe837269fe4505814eac545fd49418bff" [metadata.files] aiohttp = [ @@ -1213,8 +1213,8 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] mistune = [ - {file = "mistune-2.0.2-py2.py3-none-any.whl", hash = "sha256:6bab6c6abd711c4604206c7d8cad5cd48b28f072b4bb75797d74146ba393a049"}, - {file = "mistune-2.0.2.tar.gz", hash = "sha256:6fc88c3cb49dba8b16687b41725e661cf85784c12e8974a29b9d336dd596c3a1"}, + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, ] mock = [ {file = "mock-4.0.3-py3-none-any.whl", hash = "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62"}, diff --git a/pyproject.toml b/pyproject.toml index 7692a8b..d695308 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ pytest-console-scripts = ">=1.1.0" openpyxl = ">=3.0.5" flake8 = ">=3.8.4" black = {version = ">=22", allow-prereleases = true} +mistune = "^0.8.4" [tool.poetry.scripts] mate3 = 'mate3.main:main' From 86cef728fd32cfdbb8aa447fb960a7c9d9f4ef23 Mon Sep 17 00:00:00 2001 From: kodonnell Date: Tue, 1 Mar 2022 07:21:49 +1300 Subject: [PATCH 10/10] don't format fields --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 86b12f4..8cfaafd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: poetry run flake8 mate3/sunspec/models.py --ignore=E501 --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Check black has been run (excluding auto-generated code) run: | - poetry run black . --check --exclude='setup.py|models.py' + poetry run black . --check --exclude='setup.py|fields.py|models.py' - name: Test with pytest run: | poetry run pytest