Files
ha-freshharvest/CHANGELOG.md
T
flan 551d3240a2
Validate / hassfest (push) Failing after 6s
Validate / pytest (push) Failing after 8s
Validate / HACS (push) Failing after 1m8s
Add control entities: box to-do list, skip switch, donate button, subscriptions
The to-do list exists so Home Assistant's own conversation agent can manage the
order through HassListAddItem rather than through anything bespoke. Skip is a
switch because skipped/not-skipped is state worth reading back; donate is a
button because it cannot be undone. Un-skip raises rather than guessing at an
endpoint that has never been observed.

Fixes subscription parsing, which matched the heading row and so reported zero
on an account that has one.
2026-08-03 20:13:32 +00:00

119 lines
5.4 KiB
Markdown

# Changelog
All notable changes to this project are documented here.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- `actions.py`: the write layer — skip a delivery, donate a box, add/remove cart
items, subscribe/unsubscribe with a frequency, and add a vacation hold over a
date range (distinct from skipping: three weeks away is one hold, not three
skips). Parsers for current subscriptions and scheduled holds.
- `tools/compat.py` plus a daily `compat.yml` workflow: records every assumption
this integration makes about freshharvest.com and asserts it against the live
site, refreshing the matrix in README and opening an issue on drift.
- `FreshHarvestClient.async_fetch`, restored as the shared authenticated-fetch
primitive that both the snapshot read and every write action build on.
- `todo.fresh_harvest_box`: the order as a to-do list, so Home Assistant's own
conversation agent can add and remove items with no bespoke voice code.
Adding resolves the name against the site's search index first.
- `switch.fresh_harvest_skip_next_order` (a switch, not a button, so the state
is readable and reversible) and `button.fresh_harvest_donate_next_order`
(a button, because donating cannot be undone).
- `sensor.fresh_harvest_subscriptions` and `sensor.fresh_harvest_vacation_holds`,
each listing the detail in attributes.
- A `freshharvest_action` event fired after every write action, carrying
action/success/target/detail so automations can notify on the outcome.
### Fixed
- Subscription parsing matched `.account-item-multi-fields`, which is the
heading row, so an account with a live subscription reported zero. Cells are
now picked by semantic class. Regression covered in `tests/test_actions.py`.
### Known gaps
- Un-skip raises rather than guessing: the portal's restore control only
appears once an order is skipped, so its endpoint has never been observed.
- Entities are deliberately NOT exposed to the conversation agent yet.
### Notes
- Actions default to `dry_run=True` and report exactly what they would submit.
Nothing has been executed against a live account yet.
## [0.3.0] - 2026-08-03
Prepared for public release as a HACS custom repository.
### Added
- Every cost component is now its own entity rather than an attribute:
subtotal, box price, add-ons, tax, and delivery fee for the next delivery,
plus a total and free-delivery-remaining for the open order.
- `binary_sensor.fresh_harvest_order_open`, which turns off when the cutoff
passes — the last moment to change the box.
- `sensor.fresh_harvest_delivery_day`.
- Parsing for the driver tip, potential Bounty savings, and the free-delivery
threshold, with the threshold carried across orders because the progress bar
only renders on carts below it.
- `LICENSE` (MIT), `hacs.json`, and a CI workflow running hassfest, the HACS
action, and the test suite.
- `tests/test_translations.py`, which cross-checks every entity's
`translation_key` against both translation files and fails on an orphan or a
missing name.
### Changed
- Entities share a `FreshHarvestEntity` base and declare a `scope`
(`account`, `next_order`, `open_order`), so a description states only the
field it reads instead of repeating None handling.
- `manifest.json` documentation and issue-tracker URLs now point at GitHub;
they previously pointed at a private forge that no installer could reach.
- Fixture cart identifiers replaced with placeholders.
## [0.2.0] - 2026-08-03
### Added
- `sensor.fresh_harvest_next_delivery_add_ons`, the combined cost of the
add-ons excluding the produce box.
- `add_ons_total` and `box_price` attributes on the item-count sensor.
- A test asserting `add_ons_total + box_price` equals the portal's own
subtotal, so a mis-parsed price cannot pass silently.
### Changed
- `add_ons` attribute entries now carry quantity, unit, and extended price
(`4 Complete Recovery Smoothie 15.2 fl oz — $17.96`) rather than a bare name.
Templates reading these strings will need updating.
- The test fixture's totals are now internally consistent, so the subtotal
reconciliation is a real invariant rather than copied numbers.
## [0.1.0] - 2026-08-03
### Added
- Config flow taking freshharvest.com portal credentials.
- Session client implementing the two-step login handshake against
`/s/popup/login` and `/s/submit/login`, including the per-session
`LoginSecurity` and `SubmitToken` anti-replay fields, with one automatic
re-authentication when a session lapses.
- Dashboard parser reading delivery day, next arrival date, both upcoming
carts, produce-box contents, add-ons, and order totals from a single
`GET /p/dashboard/details`.
- Update coordinator polling every 6 hours, surfacing auth failures as
`ConfigEntryAuthFailed` so Home Assistant prompts for re-authentication.
- Five sensors: next delivery date, next delivery total, next delivery item
count, open order delivery date, and shopping window.
- Parser tests covering totals, contents, the locked/open distinction, money
parsing, and year rollover on undated cart tabs.
- English translations under `translations/en.json`, which is where custom
integrations read entity and config-flow strings from.
- Example dashboard view under `examples/dashboard-view.yaml`: a three-section
tab with a delivery countdown, order tiles, and the full box contents.