This commit is contained in:
suaveolent 2023-11-20 11:28:57 +01:00
parent 2d42c2f9bc
commit a41144e367
4 changed files with 18 additions and 15 deletions

View File

@ -0,0 +1,5 @@
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

View File

@ -1,13 +1,11 @@
import socket import socket
import struct import struct
from hoymiles_wifi import logger
from hoymiles_wifi.protos.RealData_pb2 import RealDataResDTO, HMSStateResponse from hoymiles_wifi.protos.RealData_pb2 import RealDataResDTO, HMSStateResponse
import crcmod import crcmod
import logging
from datetime import datetime from datetime import datetime
import time import time
logging.basicConfig(level=logging.INFO)
INVERTER_PORT = 10081 INVERTER_PORT = 10081
class NetworkState: class NetworkState:
@ -24,7 +22,7 @@ class Inverter:
def set_state(self, new_state): def set_state(self, new_state):
if self.state != new_state: if self.state != new_state:
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): def update_state(self):
self.sequence = (self.sequence + 1) & 0xFFFF self.sequence = (self.sequence + 1) & 0xFFFF
@ -46,7 +44,7 @@ class Inverter:
len_bytes = struct.pack('>H', len(request_as_bytes) + 10) 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) ip = socket.gethostbyname(self.host)
address = (ip, INVERTER_PORT) address = (ip, INVERTER_PORT)
@ -56,7 +54,7 @@ class Inverter:
stream.sendall(message) stream.sendall(message)
buf = stream.recv(1024) buf = stream.recv(1024)
except socket.error as e: except socket.error as e:
logging.debug(str(e)) logger.error(str(e))
self.set_state(NetworkState.Offline) self.set_state(NetworkState.Offline)
return None return None
@ -64,7 +62,7 @@ class Inverter:
parsed = HMSStateResponse.FromString(buf[10:10 + read_length]) parsed = HMSStateResponse.FromString(buf[10:10 + read_length])
if parsed is None: if parsed is None:
logging.debug("Error parsing response") logger.error("Error parsing response")
self.set_state(NetworkState.Offline) self.set_state(NetworkState.Offline)
return None return None

View File

@ -34,13 +34,13 @@ message PortState {
} }
message HMSStateResponse { message HMSStateResponse {
bytes dtu_sn = 1; // serial string dtu_sn = 1; // serial
int32 time = 2; // epoch int32 time = 2; // epoch
int32 device_nub = 3; int32 device_nub = 3;
int32 pv_nub = 4; // repeats cp field from request int32 pv_nub = 4; // repeats cp field from request
int32 package_nub = 5; int32 package_nub = 5;
repeated InverterState inverter_state = 9; repeated InverterState inverter_state = 9;
repeated PortState port_state = 11; repeated PortState port_state = 11;
int32 pv_current_power = 12; // [W], factor 0.1 int32 pv_current_power = 12; // [W], factor 0.1
int32 pv_daily_yield = 13; // [Wh] int32 pv_daily_yield = 13; // [Wh]
} }

View File

@ -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() _globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)