{"id":31397800,"url":"https://github.com/toringer/home-assistant-thermostat-setback","last_synced_at":"2026-02-14T11:18:41.464Z","repository":{"id":314320155,"uuid":"1054224631","full_name":"toringer/home-assistant-thermostat-setback","owner":"toringer","description":"A Home Assistant custom component that automatically controls climate devices based on schedule devices, implementing temperature setback functionality.","archived":false,"fork":false,"pushed_at":"2026-01-11T10:52:17.000Z","size":745,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-11T15:33:02.864Z","etag":null,"topics":["climate","custom-integration","home-assistant","temperature-setback"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/toringer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2025-09-10T14:35:33.000Z","updated_at":"2026-01-11T10:52:20.000Z","dependencies_parsed_at":"2025-09-11T21:14:43.778Z","dependency_job_id":"e090ffb1-fbe5-43ba-aa93-70658661e1ee","html_url":"https://github.com/toringer/home-assistant-thermostat-setback","commit_stats":null,"previous_names":["toringer/home-assistant-thermostat-setback"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/toringer/home-assistant-thermostat-setback","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toringer%2Fhome-assistant-thermostat-setback","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toringer%2Fhome-assistant-thermostat-setback/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toringer%2Fhome-assistant-thermostat-setback/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toringer%2Fhome-assistant-thermostat-setback/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/toringer","download_url":"https://codeload.github.com/toringer/home-assistant-thermostat-setback/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toringer%2Fhome-assistant-thermostat-setback/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28972574,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T06:46:42.625Z","status":"ssl_error","status_checked_at":"2026-02-01T06:44:56.173Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["climate","custom-integration","home-assistant","temperature-setback"],"created_at":"2025-09-29T14:01:00.349Z","updated_at":"2026-02-14T11:18:41.442Z","avatar_url":"https://github.com/toringer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![GitHub Release][releases-shield]][releases]\n[![Total downloads][total-downloads-shield]][total-downloads]\n[![Latest release downloads][latest-release-downloads-shield]][latest-release-downloads]\n\n\u003cp align=\"right\"\u003e\n\u003cimg width=\"250\" alt=\"Logo\" src=\"https://raw.githubusercontent.com/toringer/home-assistant-thermostat-setback/master/assets/icon.png\"\u003e\n\u003c/p\u003e\n\n# Thermostat Setback Controller\n\n**Simple, automated thermostat setback control without complex automation setup.**\n\nStop wrestling with complex Home Assistant automations for your thermostat! This controller makes temperature setback management effortless - just set it up once and it handles everything automatically.\n\n## Why Choose This Controller?\n\n- **No Complex Automation Required**: Forget about writing YAML automations or dealing with complex logic\n- **One-Time Setup**: Configure once through the UI and it works forever\n- **Smart \u0026 Automatic**: Seamlessly switches between normal and setback temperatures based on your schedule\n- **Manual Control When Needed**: Override anytime with simple controls\n- **Skip Setback Feature**: Temporarily skip the next setback cycle when you need normal temperature\n- **Invert Schedule**: Flip schedule logic when your schedule defines \"home\" instead of \"away\"\n- **External Integration**: Works with any binary sensor or switch for additional control\n\n\u003cp align=\"center\"\u003e\n\u003cimg width=\"350\" alt=\"Thermostat Setback Controller\" src=\"https://raw.githubusercontent.com/toringer/home-assistant-thermostat-setback/master/assets/device.png\"\u003e\n\u003c/p\u003e\n\n\n## Sensors Created\n\nThe integration creates two sensors for monitoring:\n\n### 1. Setback Status Sensor\n- **Name**: \"Setback Status\" (or your custom name)\n- **Value**: `on` when setback is active, `off` when normal temperature is active\n- **Attributes**:\n  - `climate_device`: The controlled thermostat entity\n  - `schedule_device`: The schedule helper entity\n  - `binary_input_device`: Optional binary input that monitors any binary sensor or switch to activate forced setback. For example, monitor a house mode helper and force setback when vacation mode is active.\n\n### 2. Recovery Time Sensor\nTracks how long it takes for temperature to reach normal after setback ends\n\n- **Name**: \"Recovery Time\"\n- **Value**: Time in seconds it took for the last recovery from setback to normal temperature\n- **Unit**: Seconds (s)\n- **Attributes**:\n  - `is_recovering`: `true` when currently recovering from setback, `false` otherwise\n\n\n## Controls Created\n\nThe integration creates four switches for manual control:\n\n### 1. Force Setback Switch\nManually override to force setback mode on or off, regardless of schedule or other conditions.\n\n- **Name**: \"Force Setback\"\n- **State**: `on` when forced setback is active, `off` when not forced\n- **Usage**: Turn on to manually enable setback, turn off to return to automatic control\n\n### 2. Controller Active Switch\nEnable or disable the entire controller.\n\n- **Name**: \"Controller Active\"\n- **State**: `on` when controller is active, `off` when disabled\n- **Usage**: Turn off to completely disable temperature control, turn on to re-enable\n\n### 3. Skip Setback Switch\nSkip the next scheduled setback cycle.\n\n- **Name**: \"Skip Setback\"\n- **State**: `on` when skip is active, `off` when not skipping\n- **Usage**:\n  - Turn on to skip the next setback cycle when your schedule becomes active\n  - If currently in setback, turning this on will immediately return to normal temperature\n  - The flag automatically resets after the next setback cycle is skipped\n  - Useful for temporarily preventing setback when you know you'll be home or need normal temperature\n\n### 4. Invert Schedule Switch\nFlip the schedule logic so setback is active when the schedule is *inactive* instead of active.\n\n- **Name**: \"Invert Schedule\"\n- **State**: `on` when inverted, `off` when using normal logic\n- **Usage**:\n  - Turn on when your schedule defines \"when you're home\" (e.g., 9am–5pm) instead of \"when you're away\"\n  - **Normal** (`off`): schedule active → setback on; schedule inactive → setback off\n  - **Inverted** (`on`): schedule active → setback off; schedule inactive → setback on\n  - Useful when your schedule helper represents \"home\" or \"occupied\" periods rather than \"away\" periods\n\n\n## Installation\n\n### Method 1: HACS (Recommended)\n\n1. Add this repository to HACS as a custom repository\n2. Install \"Thermostat Setback Controller\" from HACS\n3. Restart Home Assistant\n\n### Method 2: Manual Installation\n\n1. Copy the `custom_components/thermostat_setback` folder to your Home Assistant `custom_components` directory\n2. Restart Home Assistant\n3. Add the integration through the UI\n\n## Quick Setup (2 Minutes!)\n\n### Step 1: Add the Integration\n\n1. Go to **Settings** \u003e **Devices \u0026 Services**\n2. Click **Add Integration**\n3. Search for \"Thermostat Setback Controller\"\n4. Fill in these simple settings:\n   - **Name**: Give it a friendly name (e.g., \"Living Room Setback\")\n   - **Climate Device**: Pick your thermostat (e.g., `climate.living_room_thermostat`)\n   - **Schedule Device**: Choose your schedule helper (defines when setback is active)\n   - **Forced Setback Monitoring Sensor**: Optional - monitors any binary sensor or switch to activate forced setback. For example, monitor a house mode helper and force setback when vacation mode is active.\n\n### Step 2: That's It!\n\nThe controller immediately starts working:\n- ✅ **Automatically** switches to setback temperature when your schedule is active\n- ✅ **Automatically** returns to normal temperature when schedule is inactive\n- ✅ **No YAML needed** - everything is handled through the UI\n- ✅ **Works forever** - set it and forget it!\n\n\n## Development\n\nThis project uses a dev container for development. To get started:\n\n1. Open the project in VS Code\n2. Reopen in Dev Container when prompted\n3. The container will automatically install Python dependencies\n\n### Project Structure\n\n```\ncustom_components/thermostat_setback/\n├── __init__.py          # Main integration setup\n├── climate.py           # Climate entity implementation\n├── config_flow.py       # Configuration flow\n├── const.py            # Constants and configuration keys\n├── manifest.json       # Integration manifest\n├── services.py         # Service implementations\n└── services.yaml       # Service definitions\n```\n\n## Troubleshooting\n\n### Debugging\n\nEnable debug logging by adding this to your `configuration.yaml`:\n\n```yaml\nlogger:\n  logs:\n    custom_components.thermostat_setback: debug\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Test thoroughly\n5. Submit a pull request\n\n## License\n\nThis project is licensed under the MIT License - see the LICENSE file for details.\n\n## Support\n\nFor support, please open an issue on the GitHub repository.\n\n\n[releases-shield]: https://img.shields.io/github/v/release/toringer/home-assistant-thermostat-setback?style=flat-square\n[releases]: https://github.com/toringer/home-assistant-thermostat-setback/releases\n[total-downloads-shield]: https://img.shields.io/github/downloads/toringer/home-assistant-thermostat-setback/total?style=flat-square\n[total-downloads]: https://github.com/toringer/home-assistant-thermostat-setback\n[latest-release-downloads-shield]: https://img.shields.io/github/downloads/toringer/home-assistant-thermostat-setback/latest/total?style=flat-square\n[latest-release-downloads]: https://github.com/toringer/home-assistant-thermostat-setback","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoringer%2Fhome-assistant-thermostat-setback","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftoringer%2Fhome-assistant-thermostat-setback","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoringer%2Fhome-assistant-thermostat-setback/lists"}