{"id":50797826,"url":"https://github.com/theicelandicguy/price_watch","last_synced_at":"2026-06-12T16:01:41.038Z","repository":{"id":363684265,"uuid":"1254703320","full_name":"TheIcelandicguy/price_watch","owner":"TheIcelandicguy","description":"Track product prices across retailers in Home Assistant — multi-store listings, price history, on-sale alerts, and AI-assisted discovery.","archived":false,"fork":false,"pushed_at":"2026-06-09T23:03:34.000Z","size":1928,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-10T00:18:14.908Z","etag":null,"topics":["custom-components","hacs","home-assistant","home-assistant-integration","homeassistant","price-monitoring","price-tracker"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TheIcelandicguy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-30T22:47:28.000Z","updated_at":"2026-06-09T23:03:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/TheIcelandicguy/price_watch","commit_stats":null,"previous_names":["theicelandicguy/price_watch"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/TheIcelandicguy/price_watch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheIcelandicguy%2Fprice_watch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheIcelandicguy%2Fprice_watch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheIcelandicguy%2Fprice_watch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheIcelandicguy%2Fprice_watch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TheIcelandicguy","download_url":"https://codeload.github.com/TheIcelandicguy/price_watch/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheIcelandicguy%2Fprice_watch/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34251773,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["custom-components","hacs","home-assistant","home-assistant-integration","homeassistant","price-monitoring","price-tracker"],"created_at":"2026-06-12T16:01:39.467Z","updated_at":"2026-06-12T16:01:41.031Z","avatar_url":"https://github.com/TheIcelandicguy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"custom_components/price_watch/brand/logo.png\" alt=\"Price Watch\" width=\"540\"\u003e\n\u003c/p\u003e\n\n# Price Watch for Home Assistant\n\n[![hacs_badge](https://img.shields.io/badge/HACS-Custom-orange.svg)](https://github.com/hacs/integration)\n[![GitHub Release](https://img.shields.io/github/release/TheIcelandicguy/price_watch.svg)](https://github.com/TheIcelandicguy/price_watch/releases)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n\u003e Track product prices across the web from inside Home Assistant. Paste a URL, get sensors and a price history. Works **free** on most major retailers (no API key) — with an optional AI fallback for the tricky ones.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/panel.png\" alt=\"The Price Watch panel: product cards with price, history, listings and priced alternatives\" width=\"900\"\u003e\n\u003c/p\u003e\n\n\u003e [!NOTE]\n\u003e **This is a beta looking for testers.** It works well on a wide range of retailers, but the web is messy — some shops block automated requests or hide prices behind \"add to cart\". Bug reports, retailer reports (works / doesn't work), and ideas are very welcome — please [open an issue](https://github.com/TheIcelandicguy/price_watch/issues).\n\n## What it does\n\n- **Track any product page** — paste a URL and get a device with price, lowest/highest seen, target diff, and stock sensors, plus a rolling price history.\n- **Free by default** — reads price/stock from a page's Schema.org / Open Graph data, which most major retailers expose. No account, no key, no cost.\n- **A dedicated sidebar panel** — add, search, compare and manage everything from one Price Watch screen (no YAML, no dashboard wiring).\n- **Compare across retailers** — track the same product at several shops as separate \"listings\" under one product, and convert every price into your home currency.\n- **Find it cheaper** — a built-in discovery search (\"Search \u0026 add\") looks the product up across the web, prices the results it can, and lets you add any of them with one click.\n- **Region-aware** — flags listings that won't ship to your country and can hide them.\n- **Smart alerts** — fire Home Assistant events on price drops, target hits, new lows, restocks, and \"now on sale\".\n\n## Extraction modes\n\nPick per install (changeable anytime in the panel's ⚙ settings):\n\n| Mode | Needs | Good for |\n|---|---|---|\n| **Free** (default) | nothing | Any site with Schema.org `Product` / Open Graph price data — most major retailers. |\n| **Custom parser** | a CSS selector / regex you point at the price | Sites that show the price but don't expose structured data (also free). |\n| **AI** — Anthropic (Claude) or any OpenAI-compatible endpoint (incl. **Ollama**, LM Studio, Groq, OpenRouter) | a key, or a local model | A universal fallback for pages free mode can't read, and smarter \"find alternatives\" discovery. |\n\nYou can run **fully free**, or add AI only as a fallback for the pages that need it.\n\n## Installation\n\n### HACS (custom repository)\n\n1. HACS → ⋮ (top right) → **Custom repositories**\n2. Repository: `https://github.com/TheIcelandicguy/price_watch` — Category: **Integration**\n3. Install **Price Watch**, then **restart Home Assistant**\n4. Settings → Devices \u0026 Services → **Add Integration** → **Price Watch**\n5. Choose a mode (Free is fine to start) and finish. A **Price Watch** item appears in the sidebar.\n\n### Manual\n\nCopy `custom_components/price_watch/` into your HA `config/custom_components/` directory and restart.\n\n**Minimum Home Assistant version:** 2024.10.0\n\n## Quick start\n\n1. Open **Price Watch** in the sidebar.\n2. **Add product** → paste a product URL (or use **Search \u0026 add** to find one).\n3. The page is fetched and a preview appears; confirm to start tracking.\n4. Set a **target price** to get notified when it drops below.\n\nTo compare retailers, open a product's card and **Add listing** (another shop's URL for the same item), or add one straight from a **Search \u0026 add** result.\n\n## Sensors per product\n\n| Entity | Description |\n|---|---|\n| `sensor.\u003cslug\u003e_price` | Current price (main sensor) |\n| `sensor.\u003cslug\u003e_price_local` | Price converted to your home currency |\n| `sensor.\u003cslug\u003e_lowest_seen` | Lowest price since tracking began |\n| `sensor.\u003cslug\u003e_highest_seen` | Highest price since tracking began |\n| `sensor.\u003cslug\u003e_target_diff` | Current minus target (negative = at/below target) |\n| `sensor.\u003cslug\u003e_stock_count` | Units in stock, where the retailer exposes it |\n| `binary_sensor.\u003cslug\u003e_in_stock` | Stock availability |\n| `binary_sensor.\u003cslug\u003e_discontinued` | Product looks discontinued |\n| `image.\u003cslug\u003e_photo` | Product photo |\n| `button.\u003cslug\u003e_refresh_now` | Refresh this product now |\n\nThe price sensor carries useful attributes: `product_url`, `image_url`, `retailer`, `currency`, `last_check`, `price_history`, all-time low / \"is at low\", typical price, and (where available) a per-unit price (e.g. kr/m) and per-store stock.\n\n## Events\n\nBuild automations on these `event` triggers:\n\n| Event | Fires when |\n|---|---|\n| `price_watch_price_drop` | Price decreased |\n| `price_watch_target_hit` | Price reached/crossed your target |\n| `price_watch_new_low` | New all-time low |\n| `price_watch_back_in_stock` | Came back in stock |\n| `price_watch_discount` | The retailer's own sale/strikethrough appeared |\n| `price_watch_discontinued` | The product looks discontinued |\n\n```yaml\nalias: Notify on target hit\ntriggers:\n  - trigger: event\n    event_type: price_watch_target_hit\nactions:\n  - action: notify.notify\n    data:\n      title: \"💰 Target hit: {{ trigger.event.data.title }}\"\n      message: \"{{ trigger.event.data.price }} {{ trigger.event.data.currency }} (target {{ trigger.event.data.target }})\"\n      data:\n        url: \"{{ trigger.event.data.url }}\"\n```\n\nEvent data includes: `entry_id`, `listing_id`, `title`, `url`, `retailer`, `price`, `currency`, `previous_price`, `target`, `image_url` (plus `original_price` / `discount_percent` on `price_watch_discount`).\n\nThe panel also has a 🔔 dialog that writes these automations for you.\n\n## Services\n\n| Service | Purpose |\n|---|---|\n| `price_watch.track_product` | Create a tracked product from a URL |\n| `price_watch.add_listing` / `remove_listing` | Add/remove a retailer listing under a product |\n| `price_watch.edit_listing` | Set a custom parser, cookies, currency, unit price, or swap a listing's URL |\n| `price_watch.set_target` | Update the target price |\n| `price_watch.set_variant` | Pick a variant (size/length) on supported pages |\n| `price_watch.set_paused` | Pause/resume polling (keeps the last price) |\n| `price_watch.find_alternatives` | Run a discovery search for one or all products |\n| `price_watch.refresh_now` | Force an immediate refresh |\n| `price_watch.reset_history` | Wipe a product's price history |\n\n## Cost\n\nFree mode and custom parsers cost **nothing**. If you add an Anthropic key, typical usage is roughly **$0.50–$2/month** for ~10 products (content-hash skipping + prompt caching keep calls down, and there are daily/monthly budget caps). A local Ollama model is free.\n\n\u003e [!IMPORTANT]\n\u003e An API key you enter is stored in Home Assistant's `.storage` in plain text (like other HA integrations). On a trusted home network that's normal; just be aware of it. A local Ollama endpoint avoids storing any secret.\n\n## Known limitations\n\nHonest expectations for testers:\n\n- **Some big retailers actively block bots** (e.g. Amazon, Best Buy, Home Depot, Lowe's, MediaMarkt sometimes). Price Watch impersonates a real browser and gets many of them, but not all — and never guaranteed, since their defenses change. Where a site loads but hides structured data, a one-click **custom price selector** in the panel usually fixes it.\n- **\"See price in cart\" / MAP pricing** (some US retailers) can't be read — the price genuinely isn't on the page.\n- **Discovery quality depends on the search source.** AI search finds real product pages; the free DuckDuckGo path is weaker for niche items. The integration filters out review/category pages either way.\n\n## A store isn't working?\n\n1. **Try a custom selector.** Open the product's **✎** editor in the panel, point it at the price (CSS / regex), hit **Test on live page**, and save. Most \"Price unknown\" cases are fixable this way.\n2. **Check [issue #1 — Retailer compatibility](https://github.com/TheIcelandicguy/price_watch/issues/1).** It lists what's confirmed working / hard, so you might find the answer (or add a one-line report).\n3. **File a report with diagnostics.** Settings → Devices \u0026 Services → Price Watch → the product's **⋮ → Download diagnostics** — it's a redacted JSON (your API key and cookies are stripped) showing exactly what the integration extracted. Attach it to a [retailer report](https://github.com/TheIcelandicguy/price_watch/issues/new?template=retailer_report.md) or [bug report](https://github.com/TheIcelandicguy/price_watch/issues/new?template=bug_report.md). That one file usually tells us the whole story.\n\n## Development\n\n```bash\n# Backend tests\npip install -r requirements_test.txt\npytest tests/\n\n# Panel (Lit + Rollup)\ncd panel \u0026\u0026 npm install \u0026\u0026 npm run build   # outputs custom_components/price_watch/frontend/price-watch-panel.js\n```\n\nCI runs hassfest, HACS validation, pytest (3.12 + 3.13), and ruff on every push.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheicelandicguy%2Fprice_watch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheicelandicguy%2Fprice_watch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheicelandicguy%2Fprice_watch/lists"}