{"id":44786443,"url":"https://github.com/klejejs/python-thermia-online-api","last_synced_at":"2026-02-16T09:39:48.457Z","repository":{"id":45684664,"uuid":"441712981","full_name":"klejejs/python-thermia-online-api","owner":"klejejs","description":"A Python API for Thermia heat pumps using https://online.thermia.se","archived":false,"fork":false,"pushed_at":"2025-02-24T21:43:51.000Z","size":169,"stargazers_count":33,"open_issues_count":4,"forks_count":14,"subscribers_count":13,"default_branch":"main","last_synced_at":"2025-09-21T04:56:51.508Z","etag":null,"topics":["api","heat-pump","thermia"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/klejejs.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2021-12-25T16:05:55.000Z","updated_at":"2025-09-20T08:39:26.000Z","dependencies_parsed_at":"2023-10-16T12:33:13.093Z","dependency_job_id":"fad643f4-7f99-45a5-86ca-9911b60b8f95","html_url":"https://github.com/klejejs/python-thermia-online-api","commit_stats":null,"previous_names":[],"tags_count":65,"template":false,"template_full_name":null,"purl":"pkg:github/klejejs/python-thermia-online-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klejejs%2Fpython-thermia-online-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klejejs%2Fpython-thermia-online-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klejejs%2Fpython-thermia-online-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klejejs%2Fpython-thermia-online-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/klejejs","download_url":"https://codeload.github.com/klejejs/python-thermia-online-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klejejs%2Fpython-thermia-online-api/sbom","scorecard":{"id":563297,"data":{"date":"2025-08-11","repo":{"name":"github.com/klejejs/python-thermia-online-api","commit":"bcf2092f5764de6ea8bd03b42b37a78478a40420"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/21 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/automated-api-test.yaml:1","Warn: no topLevel permission defined: .github/workflows/package_assets.yaml:1","Warn: no topLevel permission defined: .github/workflows/publish-release-to-pypi.yaml:1","Warn: no topLevel permission defined: .github/workflows/test.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-api-test.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/klejejs/python-thermia-online-api/automated-api-test.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-api-test.yaml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/klejejs/python-thermia-online-api/automated-api-test.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package_assets.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/klejejs/python-thermia-online-api/package_assets.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package_assets.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/klejejs/python-thermia-online-api/package_assets.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release-to-pypi.yaml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/klejejs/python-thermia-online-api/publish-release-to-pypi.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release-to-pypi.yaml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/klejejs/python-thermia-online-api/publish-release-to-pypi.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yaml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/klejejs/python-thermia-online-api/test.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/klejejs/python-thermia-online-api/test.yaml/main?enable=pin","Warn: pipCommand not pinned by hash: scripts/setup.sh:10","Warn: pipCommand not pinned by hash: .github/workflows/automated-api-test.yaml:21","Warn: pipCommand not pinned by hash: .github/workflows/automated-api-test.yaml:22","Warn: pipCommand not pinned by hash: .github/workflows/automated-api-test.yaml:23","Warn: pipCommand not pinned by hash: .github/workflows/publish-release-to-pypi.yaml:26","Warn: pipCommand not pinned by hash: .github/workflows/publish-release-to-pypi.yaml:27","Warn: pipCommand not pinned by hash: .github/workflows/test.yaml:23","Warn: pipCommand not pinned by hash: .github/workflows/test.yaml:24","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   8 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 6.3.1 not signed: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/188246565","Warn: release artifact 6.3.0 not signed: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/188241034","Warn: release artifact 6.2.0 not signed: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/187914649","Warn: release artifact 6.1.0 not signed: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/180545909","Warn: release artifact 6.0.0 not signed: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/178585763","Warn: release artifact 6.3.1 does not have provenance: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/188246565","Warn: release artifact 6.3.0 does not have provenance: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/188241034","Warn: release artifact 6.2.0 does not have provenance: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/187914649","Warn: release artifact 6.1.0 does not have provenance: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/180545909","Warn: release artifact 6.0.0 does not have provenance: https://api.github.com/repos/klejejs/python-thermia-online-api/releases/178585763"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 16 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T14:16:04.966Z","repository_id":45684664,"created_at":"2025-08-20T14:16:04.966Z","updated_at":"2025-08-20T14:16:04.966Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29505059,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-16T09:05:14.864Z","status":"ssl_error","status_checked_at":"2026-02-16T08:55:59.364Z","response_time":115,"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":["api","heat-pump","thermia"],"created_at":"2026-02-16T09:39:47.867Z","updated_at":"2026-02-16T09:39:48.451Z","avatar_url":"https://github.com/klejejs.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Thermia Online API\n### A Python API for Thermia heat pumps using https://online.thermia.se\n\n## Confirmed Thermia models that API supports:\nIt is hard for me to keep track of all models that I have added feature support for in the past, so, to understand if your model is supported, please try running the example file and see if it works. If it does not, please submit a bug report.\n\n### Regarding unsupported models\nI am willing to do my best to support them, but as there turns out to be many different Thermia models and configurations, it is hard for me to implement all functionalities and test them thoroughly.\nThus, I have created a `debug()` function that runs when `example.py` is executed and creates a `debug.txt` file which has data about your heat pump and all its supported features. If you want to submit a bug or feature request, please include the debug file as it will make my development much easier.\n\n## Common issues\n\n### Logging in throws an error\n\nSometimes Thermia updates their privacy policy which causes the Thermia API to throw errors when logging in. To fix the issue, please visit [https://online.thermia.se](https://online.thermia.se), log in, accept the privacy agreement and then try using the API again to see if it has fixed the issue. If not, please create a new bug report.\n\n## How to use api:\nSee [example.py](https://github.com/klejejs/python-thermia-online-api/blob/main/example.py) file for examples.\n\nTo execute the example file, first run `pip install -r requirements.txt` to install the required dependencies, then run `python3 example.py` to execute the example file. You will be prompted to enter your username and password, and then the example file will run. If do not want to manually enter your credentials every time, you can make a copy of `.env.example`, save it as a `.env` file, and add your credentials there.\n\n## Available functions in Thermia class:\n| Function | Description |\n| --- | --- |\n| `fetch_heat_pumps()` | Fetches all heat pumps from Thermia Online API and their data |\n| `update_data()` | Updates all heat pump data |\n\n## Available properties within ThermiaHeatPump class:\n| Property | Description |\n| --- | --- |\n| `name` | Name of the Heat Pump |\n| `id` | Unique ID of the Heat Pump Thermia generates |\n| `is_online` | Boolean value indicating if the Heat Pump is online or not |\n| `model` | Model of the Heat Pump |\n| `last_online` | DateTime string indicating the last time the Heat Pump was online |\n| `has_indoor_temperature_sensor` | Boolean value indicating if the Heat Pump has an indoor temperature sensor |\n| `indoor_temperature` | Indoor temperature in Celsius, if `has_indoor_temperature_sensor` is False, this value is the same as `heat_temperature` |\n| `is_outdoor_temp_sensor_functioning` | Boolean value indicating if the Heat Pump has an outdoor temperature sensor |\n| `outdoor_temperature` | Outdoor temperature in Celsius |\n| `is_hot_water_active` | Boolean value indicating if the Heat Pump is heating water |\n| `hot_water_temperature` | Hot water temperature in Celsius |\n| `heat_temperature` | Heat Pump heating target temperature in Celsius |\n| `heat_min_temperature_value` | Minimum temperature value possible for Heat Pump to set |\n| `heat_max_temperature_value` | Maximum temperature value possible for Heat Pump to set |\n| `heat_temperature_step` | Step value for temperature setting |\n| --- | --- |\n| Other temperatures | |\n| `supply_line_temperature` | Supply line temperature in Celsius |\n| `buffer_tank_temperature` | Buffer tank temperature in Celsius |\n| `desired_supply_line_temperature` | Desired supply line temperature in Celsius |\n| `return_line_temperature` | Return line temperature in Celsius |\n| `brine_out_temperature` | Brine out temperature in Celsius |\n| `brine_in_temperature` | Brine in temperature in Celsius |\n| `cooling_tank_temperature` | Cooling tank temperature in Celsius |\n| `cooling_supply_line_temperature` | Cooling supply line temperature in Celsius |\n| --- | --- |\n| Operational status | |\n| `running_operational_statuses` | List of running operational statuses of the Heat Pump  |\n| `available_operational_statuses` | List of available operational statuses |\n| `available_operational_statuses_map` | Dictionary mapping operational status names to their values |\n| `running_power_statuses` | List of running power statuses of the Heat Pump |\n| `available_power_statuses` | List of available power statuses |\n| `available_power_statuses_map` | Dictionary mapping power status names to their values |\n| `operational_status_integral` | Integral |\n| `operational_status_pid` | PID |\n| --- | --- |\n| Operational Times | |\n| `compressor_operational_time` | Compressor operational time in hours |\n| `heating_operation_time` | Heating operational time in hours |\n| `hot_water_operational_time` | Hot water operational time in hours |\n| `auxiliary_heater_1_operational_time` | Auxiliary heater 1 operational time in hours |\n| `auxiliary_heater_2_operational_time` | Auxiliary heater 2 operational time in hours |\n| `auxiliary_heater_3_operational_time` | Auxiliary heater 3 operational time in hours |\n| --- | --- |\n| Alarms data | |\n| `active_alarm_count` | Number of active alarms on the Heat Pump |\n| `active_alarms` | List of titles of active alarms on the Heat Pump |\n| --- | --- |\n| Operation Mode data | |\n| `operation_mode` | Current operation mode of the Heat Pump |\n| `available_operation_modes` | List of available operation modes for the Heat Pump |\n| `available_operation_mode_map` | Dictionary mapping operation mode names to their values |\n| `is_operation_mode_read_only` | Boolean value indicating if the Heat Pump operation mode is read-only |\n| --- | --- |\n| Hot Water data | |\n| `hot_water_switch_state` | Int value indicating the Heat Pump hot water switch state (0 or 1) or None if not available |\n| `hot_water_boost_switch_state` | Int value indicating the Heat Pump hot water boost switch state (0 or 1) or None if not available |\n| --- | --- |\n| Historical data | |\n| `historical_data_registers` | List of available registers to use for historical data fetching |\n\n## Available functions within ThermiaHeatPump class:\n| Function | Description |\n| --- | --- |\n| `update_data()` | Refetch all data from Thermia for Heat Pump |\n| --- | --- |\n| `get_all_available_register_groups()` | Return a list of all available register groups for the heat pump |\n| `get_available_registers_for_group(register_group)` | Return a list of all available registers for specified register group |\n| `get_register_data_by_register_group_and_name(register_group, register_name)` | Return data for specified register group and name |\n| `set_register_data_by_register_group_and_name(register_group, register_name, value)` | Set register value for specified register group and name |\n| --- | --- |\n| Change heat pump state | |\n| `set_temperature()` | Set the target temperature for the Heat Pump |\n| `set_operation_mode()` | Set the operation mode for the Heat Pump |\n| `set_hot_water_switch_state()` | Set the hot water switch state to 0 (off) or 1 (on) for the Heat Pump |\n| `set_hot_water_boost_switch_state()` | Set the hot water boost switch state to 0 (off) or 1 (on) for the Heat Pump |\n| --- | --- |\n| Fetch historical data | |\n| `get_historical_data_for_register()` | Fetch historical data by using register name from `historical_data_registers` together with start_time and end_time of the data in Python datatime format. Returns list of dictionaries which contains data in format `{ \"time\": datetime, \"value\": int }` |\n| --- | --- |\n| Fetch debug data | |\n| `debug()` | Fetch debug data from Thermia API and save it to `debug.txt` file |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklejejs%2Fpython-thermia-online-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fklejejs%2Fpython-thermia-online-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklejejs%2Fpython-thermia-online-api/lists"}