Files
home_control/README.md
T
2026-08-26 18:17:03 +02:00

81 lines
3.4 KiB
Markdown

# home_control
Detects an arrival when an iPhone reconnects to a Zyxel EX5601-T1. The service
logs into the router's encrypted web API and polls its active LAN clients.
1. Install dependencies: `python -m pip install -r requirements.txt`
2. Fill in the router login and the iPhone Wi-Fi MAC address under
`arrival_detection` in `service.yaml`.
3. Test connectivity: `python service.py --once`
4. Run continuously: `python service.py`
Check any MAC address directly through the Zyxel client with:
```bash
python lib/_zyxel.py --mac AA:BB:CC:DD:EE:FF
```
Omit `--mac` to check the first entry in `arrival_detection.devices` from
`service.yaml`. Arrival detection supports one to three devices and tracks each
device independently.
Set `arrival_detection.zyxel.debug` to `true` to log every Zyxel HTTP/DAL call
and MAC presence result. Under systemd, view these messages with
`journalctl -u home-control.service -f`.
An arrival is logged after the phone was confirmed absent and then present. It
also calls `send_notification()` from `lib/_notify.py`; its message, ntfy topic,
and timeout are configured under the top-level `notify` section. Set
`arrival_detection.enabled` to `false` to disable this function.
Plugins emit dictionaries containing `sender`, `event`, `id`, and `text`. The
controller routes each sender to one or more actions through `controller.plugins`.
For example, `_arrival_detection` emits an `arrived` event and can be routed to
both actions through `on_event: [_notify, _cloud_logger]`. A single action name
such as `on_event: _notify` remains supported.
Arrival detection emits `arrived` and `departed` for individual device IDs. It
also emits `empty` with ID `house` after the last present device departs, and
`first_arrival` with the arriving device ID when an empty house becomes occupied.
Initial startup state never generates these transition events.
Plugin modules, factories, configuration sections, and event actions are all
declared under `controller`. The controller contains no plugin-specific imports
or startup logic. A plugin module exposes a configured factory (normally
`create`), and an action module exposes a configured handler (normally
`on_event`).
The `_notify` action can filter by event or ID under `notify.filter`. Empty
`accept` lists allow all values; populated lists act as allow-lists. Values in
`ignore` are always rejected, even when also accepted.
On the iPhone, open **Settings > Wi-Fi**, tap the info button beside the home
network, and copy **Wi-Fi Address**. If Private Wi-Fi Address is enabled, that
per-network address is the correct one to configure.
## Install as a systemd service
The included unit expects the project and its virtual environment at
`/opt/home_control`, owned by a dedicated `home-control` system user:
```bash
sudo useradd --system --home-dir /opt/home_control --shell /usr/sbin/nologin home-control
sudo chown -R home-control:home-control /opt/home_control
sudo chmod 600 /opt/home_control/service.yaml
sudo install -d -o home-control -g home-control -m 750 /log
sudo cp /opt/home_control/home-control.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now home-control.service
```
Check its state and follow its logs with:
```bash
sudo systemctl status home-control.service
sudo journalctl -u home-control.service -f
```
Confirmed arrival notifications are also appended to
`/log/detect-arrivals.txt`. The path is configurable as
`arrival_detection.event_log`.