Skip to content

Commit

Permalink
난방 노멀 쿼리 패킷 길이 다른 환경에 대한 대응 (thermo_len_per_dev)
Browse files Browse the repository at this point in the history
  • Loading branch information
YOGYUI committed Mar 8, 2024
1 parent 5ebdb76 commit fae4491
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 2 deletions.
7 changes: 7 additions & 0 deletions Hillstate-Gwanggyosan/Include/Home.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,12 @@ def loadRS485Config(self, node: ET.Element):
writeLog(f"Failed to read <ew11>-<port> node ({e})", self)
cfg.socket_port = 8899

try:
thermo_len_per_dev = int(cnode.find('thermo_len_per_dev').text)
except Exception as e:
writeLog(f"Failed to read <thermo_len_per_dev> node ({e})", self)
thermo_len_per_dev = 3

cfg.enable = enable
cfg.comm_type = RS485HwType(hwtype)
cfg.check_connection = check
Expand All @@ -324,6 +330,7 @@ def loadRS485Config(self, node: ET.Element):
rs485.sig_connected.connect(self.onRS485SubPhoneConnected)
parser = PacketParser(rs485, name, index, ParserType(packettype))
parser.setBufferSize(buffsize)
parser.thermo_len_per_dev = thermo_len_per_dev
parser.sig_parse_result.connect(lambda x: self.queue_parse_result.put(x))
self.rs485_info_list.append(RS485Info(rs485, cfg, parser, index))
writeLog(f"Create RS485 Instance (name: {name})")
Expand Down
6 changes: 4 additions & 2 deletions Hillstate-Gwanggyosan/Include/RS485/PacketParser.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ class PacketParser:

log_send_result: bool = True

thermo_len_per_dev: int = 3 # 난방 노멀 쿼리 > 각 기기당 바이트 수는 3 혹은 8?

# for debugging (todo: remove or refactoring)
enable_store_packet_header_18: bool = False
enable_store_packet_header_19: bool = False
Expand Down Expand Up @@ -397,9 +399,9 @@ def handleThermostat(self, packet: bytearray):
pass
elif packet[4] == 0x04: # 상태 응답
if room_idx == 0: # 일반 쿼리 (존재하는 모든 디바이스)
thermostat_count = (len(packet) - 10) // 3
thermostat_count = (len(packet) - 10) // self.thermo_len_per_dev
for idx in range(thermostat_count):
dev_packet = packet[8 + idx * 3: 8 + (idx + 1) * 3]
dev_packet = packet[8 + idx * self.thermo_len_per_dev: 8 + (idx + 1) * self.thermo_len_per_dev]
if dev_packet[0] != 0x00: # 0이면 존재하지 않는 디바이스
state = 0 if dev_packet[0] == 0x04 else 1
temp_current = dev_packet[1] # 현재 온도
Expand Down
1 change: 1 addition & 0 deletions Hillstate-Gwanggyosan/config_default.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
</ew11>
<check>1</check>
<buffsize>64</buffsize>
<thermo_len_per_dev>3</thermo_len_per_dev>
</port>
</rs485>
<mqtt>
Expand Down

0 comments on commit fae4491

Please sign in to comment.