A custom Home Assistant integration for local control of Exalus Home roller blinds via the TR7 control unit — no cloud needed for day-to-day operation.
For initial setup: the TR7 must have been configured via the Exalus Home app at least once, and the blinds must be paired.
For daily use: no. After setup, everything works locally. The TR7 can be blocked from internet access entirely.
- TR7 Exalus control unit (connected via LAN)
- EX-BIDI or SSR-BIDI roller motors (868 MHz bidirectional)
- Home Assistant instance on the same network
Designed for EX-BIDI motors. SSR-BIDI likely works too. Unidirectional 433 MHz motors are not compatible.
Router admin: look under Connected devices / DHCP clients for TR7 or Exalus.
Network scan:
nmap -p 81 192.168.1.0/24Tip: assign a static DHCP reservation so the IP never changes.
- Wrong IP — try
ping <TR7_IP> - Port blocked — try
nc -zv <TR7_IP> 81 - Different network segment — HA and TR7 must be on the same subnet (or routed)
- TR7 offline — check the LAN cable and restart the device
The integration uses the installator account, not your Exalus cloud account. You only need the serial number and PIN from the label on the TR7 device. The integration derives the credentials automatically — you never enter an email or password.
Not for daily use. The TR7 must have been provisioned once with the Exalus Home app, but after that the integration operates entirely locally using the installator account (serial + PIN).
Yes — Home Assistant stores config entry data encrypted. The serial number and PIN are not written in plain text anywhere.
- Open (100%) / Close (0%)
- Set position to any value 0–100%
- Stop
- Real-time status (position, state, battery, signal strength)
WebSocket push means command-to-motor latency is typically under 1 second. Status updates arrive immediately after movement.
Yes — add multiple instances of the integration, each with its own IP.
Use Home Assistant's built-in cover group:
cover:
- platform: group
name: "Ground floor blinds"
entities:
- cover.living_room_blind
- cover.kitchen_blindautomation:
- alias: "Battery warning"
trigger:
- platform: template
value_template: >
{{ state_attr('cover.living_room_blind', 'battery_level') | int < 20 }}
action:
- service: notify.notify
data:
message: "Blind battery low!"template:
- sensor:
- name: "Living room blind battery"
state: "{{ state_attr('cover.living_room_blind', 'battery_level') | int }}"
unit_of_measurement: "%"
device_class: batteryautomation:
- alias: "Open blinds at 7:00"
trigger:
- platform: time
at: "07:00:00"
action:
- service: cover.open_cover
target:
entity_id: cover.bedroom_blindNo. All commands go directly from Home Assistant to the TR7 on your LAN. The integration never contacts any external server.
After initial provisioning you can firewall the TR7 completely:
- Router firewall: block outbound traffic from the TR7's IP to WAN
- VLAN isolation: put the TR7 on an IoT VLAN with no internet route
- Pi-hole: block
*.tr7.pl
ping <TR7_IP>
nc -zv <TR7_IP> 81If ping works but port 81 is refused: restart the TR7 (unplug, wait 10 s, replug).
- Verify serial number and PIN on the TR7 device label
- Serial number is used uppercase; PIN is numeric only
- Run
python scripts/smoke_test.pyfrom the repo root for a detailed diagnostic
- Check that blinds are paired in the Exalus Home app
- Reload the integration: Settings → Devices & Services → TR7 Exalus → ⋮ → Reload
- Check logs: Settings → Logs
- Assign a static IP to the TR7 (DHCP reservation)
- Check DHCP lease time: increase to 86400 s (24 h) if it's short
- Verify network stability:
ping -c 600 <TR7_IP>— packet loss should be 0%
Via HACS: HACS → Integrations → TR7 Exalus Local → Update → restart HA.
Manually: replace custom_components/tr7_exalus_local/ with the new version → restart HA.
Config entries and device assignments are preserved across updates.