This sound's perfectly doable.
My own HA (running as a VM) has two network interfaces:
- Primary (wired, default route, internet access, this is the IP I use for the webUI) - enp1s0, 192.168.10.10/24
- Secondary (wireless, access to various devices that can be discovered over Wifi) - wlp12s0u1, 192.168.172.126/24
Ultimately HA is a linux box and follows standard linux network principles:
IP allocation (only some shown):
# ip a sh
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 02:15:c1:46:73:e9 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.10/24 brd 192.168.10.255 scope global noprefixroute enp1s0
valid_lft forever preferred_lft forever
inet6 2406:xxxx:x:f110::10/64 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::cf7f:95e:e994:a579/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: wlp12s0u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 6c:1f:f7:7f:94:0b brd ff:ff:ff:ff:ff:ff
inet 192.168.172.126/24 brd 192.168.172.255 scope global dynamic noprefixroute wlp12s0u1
valid_lft 3154sec preferred_lft 3154sec
inet6 fdb5:1752:6c12:2:7634:f225:1980:780e/64 scope global dynamic noprefixroute
valid_lft 3575sec preferred_lft 3575sec
inet6 2406:xxxx:x:f102:7a6f:c16f:43be:d0d6/64 scope global dynamic noprefixroute
valid_lft 3575sec preferred_lft 3575sec
inet6 fe80::3655:162e:8d48:a4b8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
...
Routing (only the relevant interfaces shown):
# ip r sh
default via 192.168.10.1 dev enp1s0 proto static metric 100
default via 192.168.172.1 dev wlp12s0u1 proto dhcp src 192.168.172.126 metric 600
192.168.10.0/24 dev enp1s0 proto kernel scope link src 192.168.10.10 metric 100
192.168.172.0/24 dev wlp12s0u1 proto kernel scope link src 192.168.172.126 metric 600
(the default route via wifi has a higher metric, so is not used)
Binding to sockets for listening can be useful to troubleshoot some issues, in case a particular component doesn't listen on the 0.0.0.0 (any IPv4) or * (any IPv4 or IPv6) address.
# ss -ltp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 0 192.168.172.126:netbios-ssn 0.0.0.0:* users:(("smbd",pid=4098,fd=31))
LISTEN 0 0 192.168.172.126:445 0.0.0.0:* users:(("smbd",pid=4098,fd=30))
LISTEN 0 0 0.0.0.0:8884 0.0.0.0:* users:(("docker-proxy",pid=2469,fd=8))
LISTEN 0 0 0.0.0.0:8883 0.0.0.0:* users:(("docker-proxy",pid=2442,fd=8))
LISTEN 0 0 192.168.10.10:5357 0.0.0.0:* users:(("python3",pid=4092,fd=11))
LISTEN 0 0 172.30.32.1:63849 0.0.0.0:* users:(("esphome-device-",pid=4024,fd=19))
LISTEN 0 0 192.168.10.10:44825 0.0.0.0:* users:(("python3",pid=399837,fd=68))
LISTEN 0 0 0.0.0.0:4357 0.0.0.0:* users:(("docker-proxy",pid=1173,fd=8))
LISTEN 0 0 127.0.0.1:5580 0.0.0.0:* users:(("MainThread",pid=3521,fd=39))
LISTEN 0 0 0.0.0.0:sunrpc 0.0.0.0:* users:(("rpcbind",pid=483,fd=5),("systemd",pid=1,fd=37))
LISTEN 0 0 0.0.0.0:ssh 0.0.0.0:* users:(("sshd",pid=4040,fd=6))
LISTEN 0 0 192.168.10.10:445 0.0.0.0:* users:(("smbd",pid=4098,fd=26))
LISTEN 0 0 192.168.172.126:46209 0.0.0.0:* users:(("python3",pid=399837,fd=67))
LISTEN 0 0 0.0.0.0:8123 0.0.0.0:* users:(("python3",pid=399837,fd=8))
LISTEN 0 0 192.168.172.126:5357 0.0.0.0:* users:(("python3",pid=4092,fd=15))
LISTEN 0 0 0.0.0.0:1884 0.0.0.0:* users:(("docker-proxy",pid=2416,fd=8))
LISTEN 0 0 0.0.0.0:1883 0.0.0.0:* users:(("docker-proxy",pid=2390,fd=8))
LISTEN 0 0 192.168.10.10:netbios-ssn 0.0.0.0:* users:(("smbd",pid=4098,fd=27))
LISTEN 0 0 172.30.32.1:5580 0.0.0.0:* users:(("MainThread",pid=3521,fd=38))
LISTEN 0 0 127.0.0.1:netbios-ssn 0.0.0.0:* users:(("smbd",pid=4098,fd=33))
LISTEN 0 0 127.0.0.1:18554 0.0.0.0:* users:(("go2rtc",pid=399904,fd=7))
LISTEN 0 0 127.0.0.1:445 0.0.0.0:* users:(("smbd",pid=4098,fd=32))
LISTEN 0 0 0.0.0.0:hostmon 0.0.0.0:* users:(("systemd-resolve",pid=458,fd=12))
LISTEN 0 0 172.30.32.1:tproxy 0.0.0.0:* users:(("otbr-agent",pid=3414,fd=20))
LISTEN 0 0 172.30.32.1:65309 0.0.0.0:* users:(("ttyd",pid=4041,fd=14))
LISTEN 0 0 127.0.0.1:63849 0.0.0.0:* users:(("esphome-device-",pid=4024,fd=18))
LISTEN 0 0 [fe80::3655:162e:8d48:a4b8]:5357 *:* users:(("python3",pid=4092,fd=23))
LISTEN 0 0 *:8884 *:* users:(("docker-proxy",pid=2474,fd=8))
LISTEN 0 0 *:8883 *:* users:(("docker-proxy",pid=2447,fd=8))
LISTEN 0 0 *:60021 *:* users:(("MainThread",pid=3521,fd=32))
LISTEN 0 0 [::1]:netbios-ssn *:* users:(("smbd",pid=4098,fd=35))
LISTEN 0 0 *:4357 *:* users:(("docker-proxy",pid=1179,fd=8))
LISTEN 0 0 [::1]:445 *:* users:(("smbd",pid=4098,fd=34))
LISTEN 0 0 *:18555 *:* users:(("go2rtc",pid=399904,fd=6))
LISTEN 0 0 *:sunrpc *:* users:(("rpcbind",pid=483,fd=7),("systemd",pid=1,fd=39))
LISTEN 0 0 *:ssh *:* users:(("sshd",pid=4040,fd=7))
LISTEN 0 0 [fe80::cf7f:95e:e994:a579]:5357 *:* users:(("python3",pid=4092,fd=19))
LISTEN 0 0 *:8123 *:* users:(("python3",pid=399837,fd=9))
LISTEN 0 0 *:1884 *:* users:(("docker-proxy",pid=2423,fd=8))
LISTEN 0 0 *:1883 *:* users:(("docker-proxy",pid=2396,fd=8))
LISTEN 0 0 *:hostmon *:* users:(("systemd-resolve",pid=458,fd=14))
All that configuration was done via the standard webUI and works well.
One thing to remember that even though HA is not a router it will route packets sent to it