diff --git a/hoymiles_wifi/__init__.py b/hoymiles_wifi/__init__.py index e69de29..b8d20bd 100644 --- a/hoymiles_wifi/__init__.py +++ b/hoymiles_wifi/__init__.py @@ -0,0 +1,5 @@ +import logging + +logging.basicConfig(level=logging.INFO) + +logger = logging.getLogger(__name__) \ No newline at end of file diff --git a/hoymiles_wifi/inverter.py b/hoymiles_wifi/inverter.py index 6f7af77..554a813 100644 --- a/hoymiles_wifi/inverter.py +++ b/hoymiles_wifi/inverter.py @@ -1,13 +1,11 @@ import socket import struct +from hoymiles_wifi import logger from hoymiles_wifi.protos.RealData_pb2 import RealDataResDTO, HMSStateResponse import crcmod -import logging from datetime import datetime import time -logging.basicConfig(level=logging.INFO) - INVERTER_PORT = 10081 class NetworkState: @@ -24,7 +22,7 @@ class Inverter: def set_state(self, new_state): if self.state != new_state: self.state = new_state - logging.info(f"Inverter is {new_state}") + logger.info(f"Inverter is {new_state}") def update_state(self): self.sequence = (self.sequence + 1) & 0xFFFF @@ -46,7 +44,7 @@ class Inverter: len_bytes = struct.pack('>H', len(request_as_bytes) + 10) - message = header + struct.pack('>HHH', self.sequence, crc16, len(request_as_bytes)) + request_as_bytes + message = header + struct.pack('>HHH', self.sequence, crc16, len_bytes) + request_as_bytes ip = socket.gethostbyname(self.host) address = (ip, INVERTER_PORT) @@ -56,7 +54,7 @@ class Inverter: stream.sendall(message) buf = stream.recv(1024) except socket.error as e: - logging.debug(str(e)) + logger.error(str(e)) self.set_state(NetworkState.Offline) return None @@ -64,7 +62,7 @@ class Inverter: parsed = HMSStateResponse.FromString(buf[10:10 + read_length]) if parsed is None: - logging.debug("Error parsing response") + logger.error("Error parsing response") self.set_state(NetworkState.Offline) return None diff --git a/hoymiles_wifi/protos/RealData.proto b/hoymiles_wifi/protos/RealData.proto index 7f0448e..c97346b 100644 --- a/hoymiles_wifi/protos/RealData.proto +++ b/hoymiles_wifi/protos/RealData.proto @@ -34,13 +34,13 @@ message PortState { } message HMSStateResponse { - bytes dtu_sn = 1; // serial - int32 time = 2; // epoch - int32 device_nub = 3; - int32 pv_nub = 4; // repeats cp field from request - int32 package_nub = 5; + string dtu_sn = 1; // serial + int32 time = 2; // epoch + int32 device_nub = 3; + int32 pv_nub = 4; // repeats cp field from request + int32 package_nub = 5; repeated InverterState inverter_state = 9; repeated PortState port_state = 11; - int32 pv_current_power = 12; // [W], factor 0.1 - int32 pv_daily_yield = 13; // [Wh] + int32 pv_current_power = 12; // [W], factor 0.1 + int32 pv_daily_yield = 13; // [Wh] } \ No newline at end of file diff --git a/hoymiles_wifi/protos/RealData_pb2.py b/hoymiles_wifi/protos/RealData_pb2.py index 2039008..3d4fc2f 100644 --- a/hoymiles_wifi/protos/RealData_pb2.py +++ b/hoymiles_wifi/protos/RealData_pb2.py @@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0eRealData.proto\"]\n\x0eRealDataResDTO\x12\x0f\n\x07ymd_hms\x18\x01 \x01(\t\x12\n\n\x02\x63p\x18\x02 \x01(\x05\x12\x10\n\x08\x65rr_code\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\x05 \x01(\x05\"\xe3\x01\n\rInverterState\x12\x0e\n\x06inv_id\x18\x01 \x01(\x03\x12\x0f\n\x07port_id\x18\x02 \x01(\x05\x12\x14\n\x0cgrid_voltage\x18\x03 \x01(\x05\x12\x11\n\tgrid_freq\x18\x04 \x01(\x05\x12\x18\n\x10pv_current_power\x18\x05 \x01(\x05\x12\x10\n\x08unknown1\x18\x07 \x01(\x05\x12\x10\n\x08unknown2\x18\x08 \x01(\x05\x12\x13\n\x0btemperature\x18\t \x01(\x05\x12\x10\n\x08unknown3\x18\n \x01(\x05\x12\x10\n\x08unknown4\x18\x0c \x01(\x05\x12\x11\n\tbit_field\x18\x14 \x01(\x05\"\xa0\x01\n\tPortState\x12\r\n\x05pv_sn\x18\x01 \x01(\x03\x12\x0f\n\x07pv_port\x18\x02 \x01(\x05\x12\x0e\n\x06pv_vol\x18\x03 \x01(\x05\x12\x0e\n\x06pv_cur\x18\x04 \x01(\x05\x12\x10\n\x08pv_power\x18\x05 \x01(\x05\x12\x17\n\x0fpv_energy_total\x18\x06 \x01(\x05\x12\x16\n\x0epv_daily_yield\x18\x07 \x01(\x05\x12\x10\n\x08\x62itfield\x18\x08 \x01(\x05\"\xe3\x01\n\x10HMSStateResponse\x12\x0e\n\x06\x64tu_sn\x18\x01 \x01(\x0c\x12\x0c\n\x04time\x18\x02 \x01(\x05\x12\x12\n\ndevice_nub\x18\x03 \x01(\x05\x12\x0e\n\x06pv_nub\x18\x04 \x01(\x05\x12\x13\n\x0bpackage_nub\x18\x05 \x01(\x05\x12&\n\x0einverter_state\x18\t \x03(\x0b\x32\x0e.InverterState\x12\x1e\n\nport_state\x18\x0b \x03(\x0b\x32\n.PortState\x12\x18\n\x10pv_current_power\x18\x0c \x01(\x05\x12\x16\n\x0epv_daily_yield\x18\r \x01(\x05\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0eRealData.proto\"]\n\x0eRealDataResDTO\x12\x0f\n\x07ymd_hms\x18\x01 \x01(\t\x12\n\n\x02\x63p\x18\x02 \x01(\x05\x12\x10\n\x08\x65rr_code\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\x05 \x01(\x05\"\xe3\x01\n\rInverterState\x12\x0e\n\x06inv_id\x18\x01 \x01(\x03\x12\x0f\n\x07port_id\x18\x02 \x01(\x05\x12\x14\n\x0cgrid_voltage\x18\x03 \x01(\x05\x12\x11\n\tgrid_freq\x18\x04 \x01(\x05\x12\x18\n\x10pv_current_power\x18\x05 \x01(\x05\x12\x10\n\x08unknown1\x18\x07 \x01(\x05\x12\x10\n\x08unknown2\x18\x08 \x01(\x05\x12\x13\n\x0btemperature\x18\t \x01(\x05\x12\x10\n\x08unknown3\x18\n \x01(\x05\x12\x10\n\x08unknown4\x18\x0c \x01(\x05\x12\x11\n\tbit_field\x18\x14 \x01(\x05\"\xa0\x01\n\tPortState\x12\r\n\x05pv_sn\x18\x01 \x01(\x03\x12\x0f\n\x07pv_port\x18\x02 \x01(\x05\x12\x0e\n\x06pv_vol\x18\x03 \x01(\x05\x12\x0e\n\x06pv_cur\x18\x04 \x01(\x05\x12\x10\n\x08pv_power\x18\x05 \x01(\x05\x12\x17\n\x0fpv_energy_total\x18\x06 \x01(\x05\x12\x16\n\x0epv_daily_yield\x18\x07 \x01(\x05\x12\x10\n\x08\x62itfield\x18\x08 \x01(\x05\"\xe3\x01\n\x10HMSStateResponse\x12\x0e\n\x06\x64tu_sn\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x05\x12\x12\n\ndevice_nub\x18\x03 \x01(\x05\x12\x0e\n\x06pv_nub\x18\x04 \x01(\x05\x12\x13\n\x0bpackage_nub\x18\x05 \x01(\x05\x12&\n\x0einverter_state\x18\t \x03(\x0b\x32\x0e.InverterState\x12\x1e\n\nport_state\x18\x0b \x03(\x0b\x32\n.PortState\x12\x18\n\x10pv_current_power\x18\x0c \x01(\x05\x12\x16\n\x0epv_daily_yield\x18\r \x01(\x05\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)