Skip to main content

Scanning for Supported Packets

danger

Packet scanning involves sending an excessive number of packets to a heat pump. Some of these commands may cause undefined or unexpected behavior. This may break things, possibly badly.

Using ESPHome over Network

If hardware is already in place, it's probably easiest to use a component like esphome-stream-server to expose the heat pump's UART to the network. A sample configuration for this is below. Note that the stream server cannot coexist with the mitsubishi_itp component.

external_components:
- source: github://oxan/esphome-stream-server

uart:
- id: hp_uart
baud_rate: 2400
parity: EVEN
rx_pin:
number: GPIO5
tx_pin:
number: GPIO17

stream_server:
- uart_id: hp_uart

This can then be used with a brute force script, like below:

import socket
import datetime
import time

HP_HOST = "10.0.2.123"
HP_PORT = 6638

def gen_packet(packet_type, command_type):
pkt = [0xFC, packet_type, 0x01, 0x30, 0x01, command_type]

# checksum
checksum = ((0xFC - sum(pkt)) & 0xFF)

pkt += [checksum]

return bytearray(pkt)


def pprint_packet(data):
preamble = '.'.join([f"{b:02X}" for b in data[0:5]])
checksum = f"{data[-1]:02X}"
body = '.'.join([f"{b:02X}" for b in data[5:-1]])

return f"[{preamble}] {body} {checksum}"


def try_packet(sock, ptype, ctype):
assembled_bytes = gen_packet(ptype, ctype)

sock.send(assembled_bytes)

try:
recv_bytes = sock.recv(24)
print(f"[!] PKT 0x{ptype:02X} 0x{ctype:02X} -> {pprint_packet(recv_bytes)}")
except socket.timeout:
pass


with socket.socket() as sock:
sock.connect((HP_HOST, HP_PORT))
sock.settimeout(2)

print("Socket connected")

for ctype in range(0x00, 0xFF + 1):
scan = [0x41, 0x42]

if 0xC0 <= ctype <= 0xDF:
scan += [0x5B]

for ptype in scan:
print(f"Testing 0x{ptype:02X} 0x{ctype:02X}\r", end='', flush=True)
try_packet(sock, ptype, ctype)

This script will print all packets that the heat pump responds to, which can be used for diagnostics and development purposes. The above script will attempt to send "safe" commands with no set flags, but this may not be foolproof.