Repository navigation
Releases
v1.3.0 — Guards for unseen manual stops
The door can be operated by a remote or the wall button, which never touch the toggle switch — so a mid-travel stop by those is invisible (no switch event, and the contacts don't change while the door sits between them). Two guards handle it:
- Learning guard — a travel that takes more than 2× the already-learned time is discarded, so a paused-then-resumed run can't inflate the open/close average.
- Stuck guard — once a move overruns ~2.5× its expected duration, the door is assumed stopped mid-travel and reported stopped, with the direction remembered. That hidden stop also advances the opener's own single-button toggle, so keeping the direction in sync means the next press the integration can see (the HA switch) reverses correctly — a paused open becomes a close.
The two contact sensors remain the source of truth: if the door actually reaches an endpoint, that event supersedes the guess. Normal opens/closes by remote, wall button, or HA are all tracked as before.
Update via HACS, then reload the integration (or restart Home Assistant).
v1.2.0 — Best-effort set position
New
- Set position (best-effort). The cover now advertises
SET_POSITION, so the Home Assistant frontend shows and controls the door's open percentage (thedevice_class: garagecover is kept). Because the opener has a single button, the target is reached by timing: the door is started in the right direction and the button is pressed again to stop it once the door's interpolated position — derived from the learned travel time — reaches the target. On a door that takes 14 s to open, asking for 50 % from closed stops it about 7 s in.
Notes
- The stop is judged from the moment the sensors confirm the door actually moved, so the press-to-move delay doesn't skew it — but it's intentionally not perfectly accurate (overshoot is bounded by the 0.5 s tick).
- Needs a learned open/close duration to be meaningful; until the door has done a clean full run each way it uses a default estimate.
- Full open (100 %) and full close (0 %) skip the timing and let the opener's own limit switch stop the door.
- Timed partial moves are excluded from duration learning (they're interrupted runs).
Update via HACS, then reload the integration (or restart Home Assistant).
v1.1.0 — Battery guards, health sensors & position %
New
- Battery / offline sensor guards. These are battery contact sensors — a contact that goes
unavailable/unknown(dead battery) is now never acted on, so it can't change the door state or corrupt the learned open/close timings. The door holds its last known state until the contact reports again. An impossible reading (top open while bottom closed) is treated as a faulty sensor the same way. - Sensor status sensor (text) —
OK, or a warning such as "Top door sensor is not reporting - check its battery". Use it directly as a notification body. - Sensor problem binary sensor (device class problem) —
onwhenever a contact isn't reporting or reads an impossible state; the clean trigger for a notification, with the detail in itsmessageattribute. - Position sensor (0–100%) — a
device_class: garagecover is shown as open/closed by the HA frontend and doesn't render a percentage, so the learned position is now exposed as its own value for dashboards and templates. (The cover still carries it ascurrent_position.)
Example: notify when a sensor stops reporting
automation:
- alias: Garage sensor not reporting
trigger:
- platform: state
entity_id: binary_sensor.garage_door_sensor_problem
to: "on"
for: "00:05:00"
action:
- service: notify.mobile_app_your_phone
data:
title: Garage door
message: "{{ state_attr('binary_sensor.garage_door_sensor_problem', 'message') }}"Update via HACS, then reload the integration (or restart Home Assistant).
v1.0.0 — Home Assistant integration
First release of Garage Door Monitor as a Home Assistant custom integration — a rebuild of the original AppDaemon GarageMonitor app.
Highlights
- UI setup (config flow): pick the two contact sensors (top / bottom) and the single toggle switch. No
input_selecthelper or template cover needed — the integration provides its own cover entity. - Inferred door state: open / closed / opening / closing / stopped, from the two contacts plus button-press stop/reverse, matching the original app's logic.
- Learned position: times clean endpoint-to-endpoint runs to learn open and close durations, then reports a live position %. Any mid-run stop/reverse is discarded so partial travels never skew the estimate. Learned times persist across restarts and adapt over time.
- Entities: cover (open/close/stop + position), Top/Bottom contact binary sensors, a door-state enum sensor, learned open/close duration sensors, and a raw Press button.
Install (HACS custom repository)
- HACS → ⋮ → Custom repositories → add
https://github.com/dgaust/monitorgarage, category Integration. - Install, then restart Home Assistant.
- Settings → Devices & Services → Add Integration → Garage Door Monitor.
Migrating from the AppDaemon app
top_sensor → Top sensor, lower_sensor → Bottom sensor, toggle_switch → Toggle switch. The input_select helper and the cover.garage_template can be removed once the integration's cover is in use. The old AppDaemon app remains available in the git history.
Notes
- Cover open/close/stop each issue a single guarded press (the opener is a single button).
- The first open and first close each need one clean full run to calibrate; until then a default travel time is used.