├── .github ├── FUNDING.yml └── workflows │ ├── add_archive_to_release.yml │ ├── hacs.yml │ ├── hassfest.yml │ ├── pre-commit.yml │ └── pytest.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .prettierignore ├── .yamllint ├── CONTRIBUTING.md ├── CREDITS.md ├── LICENSE ├── README.md ├── custom_components ├── __init__.py └── thermal_comfort │ ├── __init__.py │ ├── config_flow.py │ ├── const.py │ ├── manifest.json │ ├── sensor.py │ ├── services.yaml │ └── translations │ ├── ca.json │ ├── cs.json │ ├── da.json │ ├── de.json │ ├── el.json │ ├── en.json │ ├── es.json │ ├── et.json │ ├── fr.json │ ├── hu.json │ ├── it.json │ ├── ja.json │ ├── nb.json │ ├── nl.json │ ├── pl.json │ ├── pt-BR.json │ ├── pt.json │ ├── ro.json │ ├── ru.json │ ├── sensor.et.json │ ├── sk.json │ ├── sv.json │ ├── uk.json │ ├── ur.json │ └── zh-Hans.json ├── documentation ├── config_flow.md ├── sensors.md └── yaml.md ├── hacs.json ├── icons ├── ATTRIBUTION.md ├── LICENCE.md ├── icon.png ├── icon.svg ├── icon@2x.png ├── logo.png ├── logo.svg └── logo@2x.png ├── project.inlang.json ├── project.inlang ├── project_id └── settings.json ├── pyproject.toml ├── requirements_test.txt ├── requirements_test_pre_commit.txt ├── screenshots ├── absolute_humidity.png ├── config_dashboard.png ├── config_devices_thermal_comfort.png ├── config_integrations.png ├── config_integrations_search.png ├── config_options_thermal_comfort.png ├── config_thermal_comfort.png ├── dew_point.png ├── heat_index.png ├── living_room.png ├── outside.png └── perception.png └── tests ├── __init__.py ├── bandit.yaml ├── conftest.py ├── const.py ├── test_config_flow.py ├── test_init.py └── test_sensor.py /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: dolezsa # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ['https://paypal.me/dolezsa'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/workflows/add_archive_to_release.yml: -------------------------------------------------------------------------------- 1 | name: Publish archive 2 | 3 | # yamllint disable-line rule:truthy 4 | on: 5 | release: 6 | types: [published] 7 | 8 | jobs: 9 | build: 10 | name: Publish archive 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | 16 | - name: "Set package name" 17 | working-directory: ./custom_components 18 | run: echo "package=$(ls -F | grep \/$ | sed -n "s/\///g;1p")" >> $GITHUB_ENV 19 | 20 | - name: "Set variables" 21 | working-directory: ./custom_components 22 | run: | 23 | echo "archive=${{ env.package }}.zip" >> $GITHUB_ENV 24 | echo "basedir=$(pwd)/${{ env.package }}" >> $GITHUB_ENV 25 | 26 | - name: "Adjust version number" 27 | shell: bash 28 | run: | 29 | version="${{ github.event.release.tag_name }}" 30 | version="${version,,}" 31 | version="${version#v}" 32 | yq e -P -o=json \ 33 | -i ".version = \"${version}\"" \ 34 | "./custom_components/${{ env.package }}/manifest.json" 35 | 36 | - name: "Zip component dir" 37 | working-directory: ./custom_components/${{ env.package }} 38 | run: zip ${{ env.archive }} -r ./ 39 | 40 | - name: Upload binaries to release 41 | uses: svenstaro/upload-release-action@v2 42 | with: 43 | repo_token: ${{ secrets.GITHUB_TOKEN }} 44 | file: ./custom_components/${{ env.package }}/${{ env.archive }} 45 | asset_name: ${{ env.archive }} 46 | tag: ${{ github.ref }} 47 | overwrite: true 48 | -------------------------------------------------------------------------------- /.github/workflows/hacs.yml: -------------------------------------------------------------------------------- 1 | name: Validate with HACS 2 | 3 | # yamllint disable-line rule:truthy 4 | on: 5 | push: 6 | pull_request: 7 | schedule: 8 | - cron: "0 0 * * *" 9 | 10 | jobs: 11 | hacs: 12 | name: HACS Action 13 | runs-on: "ubuntu-latest" 14 | steps: 15 | - uses: "actions/checkout@v3" 16 | - name: HACS Action 17 | uses: "hacs/action@main" 18 | with: 19 | category: "integration" 20 | -------------------------------------------------------------------------------- /.github/workflows/hassfest.yml: -------------------------------------------------------------------------------- 1 | name: Validate with hassfest 2 | 3 | # yamllint disable-line rule:truthy 4 | on: 5 | push: 6 | pull_request: 7 | schedule: 8 | - cron: "0 0 * * *" 9 | 10 | jobs: 11 | validate: 12 | runs-on: "ubuntu-latest" 13 | steps: 14 | - uses: "actions/checkout@v2" 15 | - uses: home-assistant/actions/hassfest@master 16 | -------------------------------------------------------------------------------- /.github/workflows/pre-commit.yml: -------------------------------------------------------------------------------- 1 | name: Run pre-commit Check 2 | 3 | # yamllint disable-line rule:truthy 4 | on: 5 | pull_request: 6 | 7 | jobs: 8 | pre-commit: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v3 12 | - uses: actions/setup-python@v4 13 | - uses: pre-commit/action@v3.0.0 14 | -------------------------------------------------------------------------------- /.github/workflows/pytest.yml: -------------------------------------------------------------------------------- 1 | name: Run PyTest Unit Tests 2 | 3 | # yamllint disable-line rule:truthy 4 | on: 5 | push: 6 | pull_request: 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | strategy: 12 | matrix: 13 | python-version: ["3.11"] 14 | 15 | steps: 16 | - uses: actions/checkout@v4 17 | - name: Set up Python ${{ matrix.python-version }} 18 | uses: actions/setup-python@v5 19 | with: 20 | python-version: ${{ matrix.python-version }} 21 | - name: Install dependencies 22 | run: | 23 | python -m pip install --upgrade pip 24 | pip install pytest 25 | if [ -f requirements_test.txt ]; then pip install -r requirements_test.txt; fi 26 | - name: Test with pytest 27 | run: | 28 | pytest 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | pythonenv* 3 | venv 4 | .venv 5 | .coverage 6 | .idea 7 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/astral-sh/ruff-pre-commit 3 | rev: v0.0.285 4 | hooks: 5 | - id: ruff 6 | args: 7 | - --fix 8 | - repo: https://github.com/psf/black-pre-commit-mirror 9 | rev: 23.7.0 10 | hooks: 11 | - id: black 12 | args: 13 | - --quiet 14 | files: ^((homeassistant|pylint|script|tests)/.+)?[^/]+\.py$ 15 | - repo: https://github.com/codespell-project/codespell 16 | rev: v2.2.2 17 | hooks: 18 | - id: codespell 19 | args: 20 | - --ignore-words-list=additionals,alle,alot,bund,currenty,datas,farenheit,falsy,fo,haa,hass,iif,incomfort,ines,ist,nam,nd,pres,pullrequests,resset,rime,ser,serie,te,technik,ue,unsecure,withing,zar 21 | - --skip="./.*,*.csv,*.json,*.ambr" 22 | - --quiet-level=2 23 | exclude_types: [csv, json] 24 | exclude: ^tests/fixtures/|homeassistant/generated/ 25 | - repo: https://github.com/pre-commit/pre-commit-hooks 26 | rev: v4.4.0 27 | hooks: 28 | - id: check-executables-have-shebangs 29 | stages: [manual] 30 | - id: check-json 31 | exclude: (.vscode|.devcontainer) 32 | - id: no-commit-to-branch 33 | args: 34 | - --branch=dev 35 | - --branch=master 36 | - --branch=rc 37 | - repo: https://github.com/adrienverge/yamllint.git 38 | rev: v1.32.0 39 | hooks: 40 | - id: yamllint 41 | - repo: https://github.com/pre-commit/mirrors-prettier 42 | rev: v2.7.1 43 | hooks: 44 | - id: prettier 45 | - repo: https://github.com/cdce8p/python-typing-update 46 | rev: v0.6.0 47 | hooks: 48 | # Run `python-typing-update` hook manually from time to time 49 | # to update python typing syntax. 50 | # Will require manual work, before submitting changes! 51 | # pre-commit run --hook-stage manual python-typing-update --all-files 52 | - id: python-typing-update 53 | stages: [manual] 54 | args: 55 | - --py311-plus 56 | - --force 57 | - --keep-updates 58 | files: ^(homeassistant|tests|script)/.+\.py$ 59 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.md 2 | FUNDING.yml 3 | -------------------------------------------------------------------------------- /.yamllint: -------------------------------------------------------------------------------- 1 | ignore: | 2 | azure-*.yml 3 | rules: 4 | braces: 5 | level: error 6 | min-spaces-inside: 0 7 | max-spaces-inside: 1 8 | min-spaces-inside-empty: -1 9 | max-spaces-inside-empty: -1 10 | brackets: 11 | level: error 12 | min-spaces-inside: 0 13 | max-spaces-inside: 0 14 | min-spaces-inside-empty: -1 15 | max-spaces-inside-empty: -1 16 | colons: 17 | level: error 18 | max-spaces-before: 0 19 | max-spaces-after: 1 20 | commas: 21 | level: error 22 | max-spaces-before: 0 23 | min-spaces-after: 1 24 | max-spaces-after: 1 25 | comments: 26 | level: error 27 | require-starting-space: true 28 | min-spaces-from-content: 1 29 | comments-indentation: 30 | level: error 31 | document-end: 32 | level: error 33 | present: false 34 | document-start: 35 | level: error 36 | present: false 37 | empty-lines: 38 | level: error 39 | max: 1 40 | max-start: 0 41 | max-end: 1 42 | hyphens: 43 | level: error 44 | max-spaces-after: 1 45 | indentation: 46 | level: error 47 | spaces: 2 48 | indent-sequences: true 49 | check-multi-line-strings: false 50 | key-duplicates: 51 | level: error 52 | line-length: disable 53 | new-line-at-end-of-file: 54 | level: error 55 | new-lines: 56 | level: error 57 | type: unix 58 | trailing-spaces: 59 | level: error 60 | truthy: 61 | level: error 62 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Thermal Comfort 2 | Everybody is invited and welcome to contribute to Thermal Comfort. 3 | 4 | ## Report bugs using Github's [issues](https://github.com/dolezsa/thermal_comfort/issues) 5 | We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/dolezsa/thermal_comfort/issues/new/choose). 6 | 7 | ## Write bug reports with detail, background, and sample code 8 | 9 | **Great Bug Reports** tend to have: 10 | 11 | - A quick summary and/or background 12 | - Steps to reproduce 13 | - Be specific! 14 | - Give sample code if you can. 15 | - What you expected would happen 16 | - What actually happens 17 | - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) 18 | 19 | People *love* thorough bug reports. I'm not even kidding. 20 | 21 | ## Pull Requests 22 | 1. Fork the repo and create your branch from `master`. 23 | 2. Make sure you have pre-commit installed and run `pre-commit install`. 24 | 3. If you've added code that should be tested, add tests. 25 | 4. If you've changed APIs, update the documentation. 26 | 5. Ensure the [test suite](#test-suite) passes. 27 | 6. Make sure your code [lints](#style-guideline). 28 | 7. Issue that pull request! 29 | 30 | ## Test Suite 31 | 1. Setup local tests: 32 | ```bash 33 | python -m venv venv 34 | source venv/bin/activate 35 | pip install -r requirements.test.txt 36 | ``` 37 | 2. Run local tests: 38 | ```bash 39 | source venv/bin/activate 40 | pytest 41 | ``` 42 | 43 | ## Style Guideline 44 | We use [home assistants style guideline](https://developers.home-assistant.io/docs/development_guidelines). 45 | 46 | ## Contributor Credits 47 | You can add yourself to [CREDITS.md](CREDITS.md) in your PR. Otherwise you will be added before our next release. 48 | -------------------------------------------------------------------------------- /CREDITS.md: -------------------------------------------------------------------------------- 1 | # Creator and Maintainer 2 | [ @dolezsa](https://github.com/dolezsa) 3 | 4 | 5 | # Co-Maintainer 6 | [ @rautesamtr](https://github.com/rautesamtr) 7 | 8 | 9 | # Contributors 10 | [ @IATkachenko](https://github.com/IATkachenko) 11 | * Support Config Flow configuration. 12 | 13 | [ @johnboiles](https://github.com/johnboiles) 14 | * Support fahrenheit temperature sensors 15 | 16 | [ @d3m3trius](https://github.com/d3m3trius) 17 | * Possibility to create only some of the sensors 18 | 19 | [ @papo-o](https://github.com/papo-o) 20 | * Original frost point and frost risk sensor [implementation](https://github.com/papo-o/home-assistant-frost-risks) and support at porting it upstream. 21 | 22 | [ @lymanepp](https://github.com/lymanepp) 23 | * Original simmer index and simmer zone [implementation](https://github.com/lymanepp/thermal_comfort). 24 | 25 | [ @ahmadtawakol](https://github.com/ahmadtawakol) 26 | * Upstream port of simmer index and simmer zone. Implementing tests for it. 27 | 28 | [ @ejpenney](https://github.com/ejpenney) 29 | * Fix deprecated converter 30 | 31 | 32 | # Translators 33 | 34 | **Brazilian Portuguese:** 35 | [ 36 | @cvroque](https://github.com/cvroque) 37 | 38 | **Czech:** 39 | [ 40 | @mstefany](https://github.com/mstefany) 41 | 42 | **Catalan:** 43 | [ 44 | @eretna](https://github.com/eretna) 45 | 46 | **Danish:** 47 | [ 48 | @Tntdruid](https://github.com/Tntdruid) 49 | 50 | **Dutch:** 51 | [ 52 | @rdwdm](https://github.com/rdwdm) 53 | [ 54 | @BebeMischa](https://github.com/BebeMischa) 55 | 56 | **French:** 57 | [ 58 | @papo-o](https://github.com/papo-o) 59 | [ 60 | @landaisbenj](https://github.com/landaisbenj) 61 | 62 | **German:** 63 | [ 64 | @rautesamtr](https://github.com/rautesamtr) 65 | [ 66 | @vwccvr6](https://github.com/vwccvr6) 67 | 68 | **Greek:** 69 | [ 70 | @ChriZathens](https://github.com/ChriZathens) 71 | 72 | **Hungarian:** 73 | [ 74 | @dolezsa](https://github.com/dolezsa) 75 | 76 | **Portuguese:** 77 | [ 78 | @FragMenthor](https://github.com/FragMenthor) 79 | [ 80 | @ivanbibas](https://github.com/ivanbibas) 81 | 82 | **Italian:** 83 | [ 84 | @mario-tux](https://github.com/mario-tux) 85 | [ 86 | @rautesamtr](https://github.com/rautesamtr) 87 | [ 88 | @wlady75](https://github.com/wlady75) 89 | [ 90 | @ovimano](https://github.com/ovimano) 91 | [ 92 | @uroh](https://github.com/uroh) 93 | 94 | **Norwegian:** 95 | [ 96 | @kongjudas](https://github.com/kongjudas) 97 | 98 | **Polish:** 99 | [ 100 | @pejotigrek](https://github.com/pejotigrek) 101 | [ 102 | @marcin77](https://github.com/marcin77) 103 | 104 | **Romanian:** 105 | [ 106 | @ovimano](https://github.com/ovimano) 107 | 108 | **Russian:** 109 | [ 110 | @drts-sv](https://github.com/drts-sv) 111 | [ 112 | @MoonlightGuest](https://github.com/MoonlightGuest) 113 | [ @IATkachenko](https://github.com/IATkachenko) 114 | 115 | **Slovak:** 116 | [ 117 | @dolezsa](https://github.com/dolezsa) 118 | [ 119 | @misa1515](https://github.com/misa1515) 120 | 121 | **Spanish:** 122 | [ 123 | @RaulVKoNe](https://github.com/RaulVKoNe) 124 | [ 125 | @alceasan](https://github.com/alceasan) 126 | [ 127 | @eretna](https://github.com/eretna) 128 | 129 | **Swedish:** 130 | [ 131 | @filikun](https://github.com/filikun) 132 | 133 | **Ukrainian:** 134 | [ 135 | @splin777](https://github.com/splin777) 136 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 dolezsa 4 | Moist Air Enthalpy (c) 2019-2020, Federico Tartarini 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [![thermal_comfort](https://raw.githubusercontent.com/dolezsa/thermal_comfort/master/icons/logo.png)](https://github.com/dolezsa/thermal_comfort) 2 | [![hacs_badge](https://img.shields.io/badge/HACS-Default-41BDF5.svg?style=for-the-badge)](https://github.com/hacs/integration) 3 | ![GitHub release (latest by date)](https://img.shields.io/github/downloads/dolezsa/thermal_comfort/latest/total?style=for-the-badge&color=f55041) 4 | 5 | Thermal Comfort provides a variety of thermal indices and thermal perceptions including feels like temperatures in numeric and textual representation for Home Assistant. 6 | 7 | ## Sensors: 8 | 9 | **Full list 10 | [2.2](https://github.com/dolezsa/thermal_comfort/blob/2.2/documentation/sensors.md) / 11 | [1.5](https://github.com/dolezsa/thermal_comfort/blob/1.5/documentation/sensors.md) / 12 | [master](https://github.com/dolezsa/thermal_comfort/blob/master/documentation/sensors.md)** 13 | 14 | ### Numeric Indices 15 | 16 | Thermal Comfort provides numerical indices like `dew point`, `frost point`, `absolute humidity` and `moist air enthalpy` that are numeric values usable for further automations but also human readable. e.g. dew point tells the temperature to which air must be cooled to produce dew on a surface. 17 | 18 | ### Bio Indices / Perception 19 | 20 | Thermal Comfort also provides a variety of bio indices like `humidex` or `heat index` giving numeric values of human perceived temperatures (feels like temperature). In addition we also provide textual perception sensors that describe the range of an index in human readable form e.g. comfortable or uncomfortable. 21 | 22 | ![Custom Icons](https://raw.githubusercontent.com/dolezsa/thermal_comfort/master/screenshots/outside.png) 23 | 24 | ## Usage 25 | To use Thermal Comfort check the documentation for your preferred way to setup 26 | sensors. 27 | 28 | **UI/Frontend (Config Flow) 29 | [2.2](https://github.com/dolezsa/thermal_comfort/blob/2.2/documentation/config_flow.md) / 30 | [1.5](https://github.com/dolezsa/thermal_comfort/blob/1.5/documentation/config_flow.md) / 31 | [master](https://github.com/dolezsa/thermal_comfort/blob/master/documentation/config_flow.md)** 32 | 33 | **YAML 34 | [2.2](https://github.com/dolezsa/thermal_comfort/blob/2.2/documentation/yaml.md) / 35 | [1.5](https://github.com/dolezsa/thermal_comfort/blob/1.5/documentation/yaml.md) / 36 | [master](https://github.com/dolezsa/thermal_comfort/blob/master/documentation/yaml.md)** 37 | 38 | ## Installation 39 | 40 | ### Requirements 41 | 42 | #### 2.2 43 | Home Assistant >= 2023.12.0 44 | 45 | #### 1.5 46 | Home Assistant >= 2021.12.0 47 | 48 | #### master 49 | Home Assistant >= 2023.12.0 50 | 51 | ### Using [HACS](https://hacs.xyz/) (recommended) 52 | 53 | This integration can be installed using HACS. To do it search for Thermal Comfort in the integrations section. 54 | 55 | ### Manual 56 | 57 | To install this integration manually you can either 58 | 59 | * Use git: 60 | 61 | ```sh 62 | git clone https://github.com/dolezsa/thermal_comfort.git 63 | cd thermal_comfort 64 | # if you want a specific version checkout its tag 65 | # e.g. git checkout 1.0.0 66 | 67 | # replace $hacs_config_folder with your home assistant config folder path 68 | cp -r custom_components $hacs_config_folder 69 | ``` 70 | 71 | * Download the source release and extract the custom_components folder into your home assistant config folder. 72 | 73 | Finally you need to restart home assistant before you can use it. 74 | 75 | ### Custom Icons 76 | [Install](https://github.com/rautesamtr/thermal_comfort_icons#install) Thermal Comforts icon pack. 77 | 78 | Enable the custom icons options for your sensor in the 79 | [frontend](https://github.com/dolezsa/thermal_comfort/blob/master/documentation/config_flow.md#configuration-options) 80 | or in [yaml](https://github.com/dolezsa/thermal_comfort/blob/master/documentation/yaml.md#sensor-configuration-variables). 81 | 82 | ## Localization 🌎🗺 83 | Contribute translations directly with PRs or via inlang's web-editor. 84 | 85 | [![translation badge](https://inlang.com/badge?url=github.com/dolezsa/thermal_comfort)](https://inlang.com/editor/github.com/dolezsa/thermal_comfort?ref=badge) 86 | -------------------------------------------------------------------------------- /custom_components/__init__.py: -------------------------------------------------------------------------------- 1 | """Custom components module.""" 2 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/__init__.py: -------------------------------------------------------------------------------- 1 | """Custom integration to integrate thermal_comfort with Home Assistant. 2 | 3 | For more details about this integration, please refer to 4 | https://github.com/dolezsa/thermal_comfort 5 | """ 6 | from __future__ import annotations 7 | 8 | import logging 9 | 10 | import voluptuous as vol 11 | 12 | from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN 13 | from homeassistant.config_entries import ConfigEntry 14 | from homeassistant.const import CONF_NAME, SERVICE_RELOAD 15 | from homeassistant.core import Event, HomeAssistant, ServiceCall 16 | from homeassistant.exceptions import ConfigValidationError, ServiceValidationError 17 | from homeassistant.helpers import config_validation as cv, discovery 18 | from homeassistant.helpers.entity_registry import RegistryEntry, async_migrate_entries 19 | from homeassistant.helpers.reload import ( 20 | async_integration_yaml_config, 21 | async_reload_integration_platforms, 22 | ) 23 | from homeassistant.helpers.service import async_register_admin_service 24 | from homeassistant.helpers.typing import ConfigType 25 | 26 | from .config_flow import get_value 27 | from .const import DOMAIN, PLATFORMS, UPDATE_LISTENER 28 | from .sensor import ( 29 | CONF_CUSTOM_ICONS, 30 | CONF_ENABLED_SENSORS, 31 | CONF_HUMIDITY_SENSOR, 32 | CONF_POLL, 33 | CONF_SCAN_INTERVAL, 34 | CONF_TEMPERATURE_SENSOR, 35 | SENSOR_OPTIONS_SCHEMA, 36 | SENSOR_SCHEMA, 37 | LegacySensorType, 38 | SensorType, 39 | ) 40 | 41 | _LOGGER = logging.getLogger(__name__) 42 | 43 | 44 | async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: 45 | """Set up entry configured from user interface.""" 46 | hass.data.setdefault(DOMAIN, {}) 47 | hass.data[DOMAIN][entry.entry_id] = { 48 | CONF_NAME: get_value(entry, CONF_NAME), 49 | CONF_TEMPERATURE_SENSOR: get_value(entry, CONF_TEMPERATURE_SENSOR), 50 | CONF_HUMIDITY_SENSOR: get_value(entry, CONF_HUMIDITY_SENSOR), 51 | CONF_POLL: get_value(entry, CONF_POLL), 52 | CONF_SCAN_INTERVAL: get_value(entry, CONF_SCAN_INTERVAL), 53 | CONF_CUSTOM_ICONS: get_value(entry, CONF_CUSTOM_ICONS), 54 | } 55 | if get_value(entry, CONF_ENABLED_SENSORS): 56 | hass.data[DOMAIN][entry.entry_id][CONF_ENABLED_SENSORS] = get_value( 57 | entry, CONF_ENABLED_SENSORS 58 | ) 59 | data = dict(entry.data) 60 | data.pop(CONF_ENABLED_SENSORS) 61 | hass.config_entries.async_update_entry(entry, data=data) 62 | 63 | if entry.unique_id is None: 64 | # We have no unique_id yet, let's use backup. 65 | hass.config_entries.async_update_entry(entry, unique_id=entry.entry_id) 66 | 67 | await hass.async_create_task( 68 | hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) 69 | ) 70 | update_listener = entry.add_update_listener(async_update_options) 71 | hass.data[DOMAIN][entry.entry_id][UPDATE_LISTENER] = update_listener 72 | return True 73 | 74 | 75 | async def async_update_options(hass: HomeAssistant, entry: ConfigEntry) -> None: 76 | """Update options from user interface.""" 77 | await hass.config_entries.async_reload(entry.entry_id) 78 | 79 | 80 | async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: 81 | """Remove entry via user interface.""" 82 | unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) 83 | if unload_ok: 84 | update_listener = hass.data[DOMAIN][entry.entry_id][UPDATE_LISTENER] 85 | update_listener() 86 | hass.data[DOMAIN].pop(entry.entry_id) 87 | return unload_ok 88 | 89 | 90 | async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry): 91 | """Migrate old entry.""" 92 | _LOGGER.debug("Migrating from version %s", config_entry.version) 93 | 94 | if config_entry.version == 1: 95 | 96 | def update_unique_id(entry: RegistryEntry): 97 | """Update unique_id of changed sensor names.""" 98 | if LegacySensorType.THERMAL_PERCEPTION in entry.unique_id: 99 | return {"new_unique_id": entry.unique_id.replace(LegacySensorType.THERMAL_PERCEPTION, SensorType.DEW_POINT_PERCEPTION)} 100 | if LegacySensorType.SIMMER_INDEX in entry.unique_id: 101 | return {"new_unique_id": entry.unique_id.replace(LegacySensorType.SIMMER_INDEX, SensorType.SUMMER_SIMMER_INDEX)} 102 | if LegacySensorType.SIMMER_ZONE in entry.unique_id: 103 | return {"new_unique_id": entry.unique_id.replace(LegacySensorType.SIMMER_ZONE, SensorType.SUMMER_SIMMER_PERCEPTION)} 104 | 105 | await async_migrate_entries(hass, config_entry.entry_id, update_unique_id) 106 | config_entry.version = 2 107 | 108 | _LOGGER.info("Migration to version %s successful", config_entry.version) 109 | 110 | return True 111 | 112 | 113 | OPTIONS_SCHEMA = vol.Schema({}).extend( 114 | SENSOR_OPTIONS_SCHEMA.schema, 115 | extra=vol.REMOVE_EXTRA, 116 | ) 117 | 118 | COMBINED_SCHEMA = vol.Schema( 119 | { 120 | vol.Optional(SENSOR_DOMAIN): vol.All( 121 | cv.ensure_list, [SENSOR_SCHEMA] 122 | ), 123 | } 124 | ).extend(OPTIONS_SCHEMA.schema) 125 | 126 | CONFIG_SCHEMA = vol.Schema( 127 | { 128 | vol.Optional(DOMAIN): vol.All( 129 | cv.ensure_list, 130 | [COMBINED_SCHEMA], 131 | ) 132 | }, 133 | extra=vol.ALLOW_EXTRA, 134 | ) 135 | 136 | async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: 137 | """Set up the thermal_comfort integration.""" 138 | if DOMAIN in config: 139 | await _process_config(hass, config) 140 | 141 | async def _reload_config(call: Event | ServiceCall) -> None: 142 | """Reload top-level + platforms.""" 143 | try: 144 | config_yaml = await async_integration_yaml_config(hass, DOMAIN, raise_on_failure=True) 145 | except ConfigValidationError as ex: 146 | raise ServiceValidationError( 147 | str(ex), 148 | translation_domain=ex.translation_domain, 149 | translation_key=ex.translation_key, 150 | translation_placeholders=ex.translation_placeholders, 151 | ) from ex 152 | 153 | if config_yaml is None: 154 | return 155 | 156 | await async_reload_integration_platforms(hass, DOMAIN, PLATFORMS) 157 | 158 | if DOMAIN in config_yaml: 159 | await _process_config(hass, config_yaml) 160 | 161 | hass.bus.async_fire(f"event_{DOMAIN}_reloaded", context=call.context) 162 | 163 | async_register_admin_service(hass, DOMAIN, SERVICE_RELOAD, _reload_config) 164 | 165 | return True 166 | 167 | 168 | async def _process_config(hass: HomeAssistant, hass_config: ConfigType) -> None: 169 | """Process config.""" 170 | for conf_section in hass_config[DOMAIN]: 171 | for platform_domain in PLATFORMS: 172 | if platform_domain in conf_section: 173 | hass.async_create_task( 174 | discovery.async_load_platform( 175 | hass, 176 | platform_domain, 177 | DOMAIN, 178 | { 179 | "devices": conf_section[platform_domain], 180 | "options": OPTIONS_SCHEMA(conf_section), 181 | }, 182 | hass_config, 183 | ) 184 | ) 185 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/const.py: -------------------------------------------------------------------------------- 1 | """General thermal_comfort constants.""" 2 | from homeassistant.const import Platform 3 | 4 | DOMAIN = "thermal_comfort" 5 | PLATFORMS = [Platform.SENSOR] 6 | CONF_TEMPERATURE_SENSOR = "temperature_sensor" 7 | CONF_HUMIDITY_SENSOR = "humidity_sensor" 8 | CONF_POLL = "poll" 9 | 10 | DEFAULT_NAME = "Thermal Comfort" 11 | UPDATE_LISTENER = "update_listener" 12 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "domain": "thermal_comfort", 3 | "name": "Thermal Comfort", 4 | "codeowners": ["@dolezsa"], 5 | "config_flow": true, 6 | "documentation": "https://github.com/dolezsa/thermal_comfort/blob/master/README.md", 7 | "iot_class": "calculated", 8 | "issue_tracker": "https://github.com/dolezsa/thermal_comfort/issues", 9 | "version": "0.0.0" 10 | } 11 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/services.yaml: -------------------------------------------------------------------------------- 1 | reload: 2 | name: Reload 3 | description: Reload all Thermal Comfort entities. 4 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/ca.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "No s'ha trobat el sensor de temperatura", 5 | "humidity_not_found": "No s'ha trobat el sensor d'humitat" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Configuració de Thermal Comfort", 10 | "data": { 11 | "temperature_sensor": "Sensor de temperatura", 12 | "humidity_sensor": "Sensor d'humitat", 13 | "poll": "Activar la consulta recurrent de les dades", 14 | "scan_interval": "Interval de consulta (segons)", 15 | "custom_icons": "Utilitzar el paquet d'icones personalitzat" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Aquesta combinació de sensors de temperatura i humitat ja està configurada.", 23 | "no_sensors": "No s'han trobat sensors de temperatura o humitat. Torna-ho a provar en mode avançat.", 24 | "no_sensors_advanced": "No s'han trobat sensors de temperatura o humitat." 25 | }, 26 | "error": { 27 | "temperature_not_found": "No s'ha trobat el sensor de temperatura", 28 | "humidity_not_found": "No s'ha trobat el sensor d'humitat" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Configuració de Thermal Comfort", 33 | "data": { 34 | "name": "Nom", 35 | "temperature_sensor": "Sensor de temperatura", 36 | "humidity_sensor": "Sensor d'humitat", 37 | "poll": "Activar la consulta recurrent de les dades", 38 | "scan_interval": "Interval de consulta (segons)", 39 | "custom_icons": "Utilitzar el paquet d'icones personalitzat", 40 | "enabled_sensors": "Sensors activats" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "dew_point_perception": { 48 | "state": { 49 | "dry": "Una mica sec per a alguns", 50 | "very_comfortable": "Molt còmode", 51 | "comfortable": "Còmode", 52 | "ok_but_humid": "Bé per a la majoria, però humit", 53 | "somewhat_uncomfortable": "Una mica incòmode", 54 | "quite_uncomfortable": "Molt humit, bastant incòmode", 55 | "extremely_uncomfortable": "Extremadament incòmode, aclaparador", 56 | "severely_high": "Molt alt, fins i tot mortal per a persones amb malalties relacionades amb l'asma" 57 | } 58 | }, 59 | "frost_risk": { 60 | "state": { 61 | "no_risk": "Sense risc", 62 | "unlikely": "Poc probable", 63 | "probable": "Probable", 64 | "high": "Alta probabilitat" 65 | } 66 | }, 67 | "humidex_perception": { 68 | "state": { 69 | "comfortable": "Còmode", 70 | "noticable_discomfort": "Una mica incòmode", 71 | "evident_discomfort": "Bastant incòmode", 72 | "great_discomfort": "Molt incòmode, evitar esforços", 73 | "dangerous_discomfort": "Malestar perillós", 74 | "heat_stroke": "Possible cop de calor" 75 | } 76 | }, 77 | "relative_strain_perception": { 78 | "state": { 79 | "outside_calculable_range": "Fora de l'interval calculable", 80 | "comfortable": "Còmode", 81 | "slight_discomfort": "Una mica incòmode", 82 | "discomfort": "Incòmode", 83 | "significant_discomfort": "Bastant incòmode", 84 | "extreme_discomfort": "Molt incòmode" 85 | } 86 | }, 87 | "summer_scharlau_perception": { 88 | "state": { 89 | "outside_calculable_range": "Fora de l'interval calculable", 90 | "comfortable": "Còmode", 91 | "slightly_uncomfortable": "Una mica incòmode", 92 | "moderately_uncomfortable": "Bastant incòmode", 93 | "highly_uncomfortable": "Molt incòmode" 94 | } 95 | }, 96 | "winter_scharlau_perception": { 97 | "state": { 98 | "outside_calculable_range": "Fora de l'interval calculable", 99 | "comfortable": "Còmode", 100 | "slightly_uncomfortable": "Una mica incòmode", 101 | "moderately_uncomfortable": "Bastant incòmode", 102 | "highly_uncomfortable": "Molt incòmode" 103 | } 104 | }, 105 | "summer_simmer_perception": { 106 | "state": { 107 | "cool": "Fred", 108 | "slightly_cool": "Una mica fred", 109 | "comfortable": "Còmode", 110 | "slightly_warm": "Una mica càlid", 111 | "increasing_discomfort": "Càlid i incòmode", 112 | "extremely_warm": "Extremadament càlid", 113 | "danger_of_heatstroke": "Perill de cop de calor", 114 | "extreme_danger_of_heatstroke": "Perill extrem de cop de calor", 115 | "circulatory_collapse_imminent": "Colapse circulatori imminent" 116 | } 117 | }, 118 | "thoms_discomfort_perception": { 119 | "state": { 120 | "no_discomfort": "No és incòmode", 121 | "less_than_half": "Menys de la meitat de la població sent malestar", 122 | "more_than_half": "Més de la meitat de la població sent malestar", 123 | "most": "La majoria de les persones senten malestar i deteriorament de les condicions psicofísiques", 124 | "everyone": "Tothom sent un malestar important", 125 | "dangerous": "Perill, malestar molt fort que pot provocar cops de calor" 126 | } 127 | } 128 | } 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Snímač teploty nenalezen", 5 | "humidity_not_found": "Čidlo vlhkosti nenalezeno" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Nastavení tepelné pohody", 10 | "data": { 11 | "temperature_sensor": "Senzor teploty", 12 | "humidity_sensor": "Senzor vlhkosti", 13 | "poll": "Povolit hlasování", 14 | "scan_interval": "Interval dotazování (v sekundách)", 15 | "custom_icons": "Použijte vlastní sadu ikon" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Tato kombinace snímačů teploty a vlhkosti je již nakonfigurována", 23 | "no_sensors": "Nebyla nalezena žádná čidla teploty nebo vlhkosti. Zkuste to znovu v pokročilém režimu.", 24 | "no_sensors_advanced": "Nebyla nalezena žádná čidla teploty nebo vlhkosti." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Snímač teploty nenalezen", 28 | "humidity_not_found": "Čidlo vlhkosti nenalezeno" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Nastavení tepelné pohody", 33 | "data": { 34 | "name": "název", 35 | "temperature_sensor": "Senzor teploty", 36 | "humidity_sensor": "Senzor vlhkosti", 37 | "poll": "Povolit hlasování", 38 | "scan_interval": "Interval dotazování (v sekundách)", 39 | "custom_icons": "Použijte vlastní sadu ikon", 40 | "enabled_sensors": "Aktivované senzory" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Absolutní vlhkost" 49 | }, 50 | "dew_point": { 51 | "name": "rosný bod" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Vnímání rosného bodu", 55 | "state": { 56 | "dry": "Pro někoho sucho", 57 | "very_comfortable": "Velmi přijemně", 58 | "comfortable": "Příjemně", 59 | "ok_but_humid": "OK pro většinu, ale vlhko", 60 | "somewhat_uncomfortable": "Poněkud nepříjemně", 61 | "quite_uncomfortable": "Velmi vlhko, docela nepříjemně", 62 | "extremely_uncomfortable": "Extrémně nepříjemně, tísnivě", 63 | "severely_high": "Velmi vysoká vlhkost, dokonce smrtelná pro jedince s nemocemi související s astmatem" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Bod mrazu" 68 | }, 69 | "frost_risk": { 70 | "name": "Riziko mrazu", 71 | "state": { 72 | "no_risk": "Žádné riziko", 73 | "unlikely": "Nepravděpodobné", 74 | "probable": "Pravděpodobné", 75 | "high": "Vysoce pravděpodobné" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Tepelný index" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Vnímání Humidexu", 86 | "state": { 87 | "comfortable": "Komfortní", 88 | "noticable_discomfort": "Znatelné nepohodlí", 89 | "evident_discomfort": "Evidentní nepohodlí", 90 | "great_discomfort": "Velké nepohodlí, vyhněte se námaze", 91 | "dangerous_discomfort": "Nebezpečné nepohodlí", 92 | "heat_stroke": "Úpal možný" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Entalpie vlhkého vzduchu" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Vnímání relativní zátěže", 100 | "state": { 101 | "outside_calculable_range": "Mimo vypočítatelný rozsah", 102 | "comfortable": "Komfortní", 103 | "slight_discomfort": "Mírné nepohodlí", 104 | "discomfort": "Nepohodlí", 105 | "significant_discomfort": "Výrazné nepohodlí", 106 | "extreme_discomfort": "Extrémní nepohodlí" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Letní vnímání scharlau", 111 | "state": { 112 | "outside_calculable_range": "Mimo vypočítatelný rozsah", 113 | "comfortable": "Komfortní", 114 | "slightly_uncomfortable": "Mírně nepohodlné", 115 | "moderately_uncomfortable": "Středně nepohodlné", 116 | "highly_uncomfortable": "Vysoce nepohodlné" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Zimní vnímání scharlau", 121 | "state": { 122 | "outside_calculable_range": "Mimo vypočítatelný rozsah", 123 | "comfortable": "Komfortní", 124 | "slightly_uncomfortable": "Mírně nepohodlné", 125 | "moderately_uncomfortable": "Středně nepohodlné", 126 | "highly_uncomfortable": "Vysoce nepohodlné" 127 | } 128 | }, 129 | "summer_simmer_perception": { 130 | "name": "Vnímání letního dusna", 131 | "state": { 132 | "cool": "Chladno", 133 | "slightly_cool": "Mírně chladno", 134 | "comfortable": "Příjemně", 135 | "slightly_warm": "Mírně teplo", 136 | "increasing_discomfort": "Narůstající nepohodlí", 137 | "extremely_warm": "Extrémně teplo", 138 | "danger_of_heatstroke": "Nebezpečí úpalu", 139 | "extreme_danger_of_heatstroke": "Extrémní nebezpečí úpalu", 140 | "circulatory_collapse_imminent": "Hrozící kolaps krevního oběhu" 141 | } 142 | }, 143 | "thoms_discomfort_perception": { 144 | "name": "Thomovo vnímání nepohodlí", 145 | "state": { 146 | "no_discomfort": "Žádné nepohodlí", 147 | "less_than_half": "Méně než polovina populace pociťuje nepohodlí", 148 | "more_than_half": "Více než polovina populace pociťuje nepohodlí", 149 | "most": "Většina jedinců pociťuje nepohodlí a zhoršení psychofyzického stavu", 150 | "everyone": "Každý pociťuje značné nepohodlí", 151 | "dangerous": "Nebezpečné, velmi silné nepohodlí, které může způsobit úpal" 152 | } 153 | } 154 | } 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/da.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Temperatursensor ikke fundet", 5 | "humidity_not_found": "Fugtighedssensor ikke fundet" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Termiske komfortindstillinger", 10 | "data": { 11 | "temperature_sensor": "Temperatursensor", 12 | "humidity_sensor": "Fugtighedssensor", 13 | "poll": "Aktiver polling", 14 | "scan_interval": "Poll interval (sekunder)", 15 | "custom_icons": "Brug tilpasset ikonpakke" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Denne kombination af temperatur og fugtighedssensorer er allerede konfigureret", 23 | "no_sensors": "Ingen temperatur eller fugtighedssensorer fundet. Prøv igen i avanceret tilstand.", 24 | "no_sensors_advanced": "Ingen temperatur eller fugtighedssensorer fundet." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Temperatursensor ikke fundet", 28 | "humidity_not_found": "Fugtighedssensor ikke fundet" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Termiske komfortindstillinger", 33 | "data": { 34 | "name": "Name", 35 | "temperature_sensor": "Temperatursensor", 36 | "humidity_sensor": "Fugtighedssensor", 37 | "poll": "Aktiver polling", 38 | "scan_interval": "Poll interval (sekunder)", 39 | "custom_icons": "Brug tilpasset ikonpakke", 40 | "enabled_sensors": "Aktiverede sensorer" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Absolut luftfugtighed" 49 | }, 50 | "dew_point": { 51 | "name": "Dugpunkt" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Opfattelse af dugpunkt", 55 | "state": { 56 | "dry": "Lidt tørt for nogle", 57 | "very_comfortable": "Meget behagelig", 58 | "comfortable": "Komfortabel", 59 | "ok_but_humid": "OK for de fleste, men fugtigt", 60 | "somewhat_uncomfortable": "Noget ubehageligt", 61 | "quite_uncomfortable": "Meget fugtigt, ret ubehageligt", 62 | "extremely_uncomfortable": "Ekstremt ubehageligt, undertrykkende", 63 | "severely_high": "Alvorligt høj, endda dødelig for astmarelaterede sygdomme" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Frostpunkt" 68 | }, 69 | "frost_risk": { 70 | "name": "Risiko for frost", 71 | "state": { 72 | "no_risk": "Ingen risiko", 73 | "unlikely": "Usandsynlig", 74 | "probable": "Sandsynlig", 75 | "high": "Høj sandsynlighed" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "varmeindeks" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Humidex opfattelse", 86 | "state": { 87 | "comfortable": "Komfortabel", 88 | "noticable_discomfort": "Mærkbart ubehag", 89 | "evident_discomfort": "Tydeligt ubehag", 90 | "great_discomfort": "Stort ubehag, undgå anstrengelse", 91 | "dangerous_discomfort": "Farligt ubehag", 92 | "heat_stroke": "Hedeslag muligt" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Entalpi for fugtig luft" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Opfattelse af relativ belastning", 100 | "state": { 101 | "outside_calculable_range": "Uden for det beregnelige område", 102 | "comfortable": "Komfortabel", 103 | "slight_discomfort": "Let ubehag", 104 | "discomfort": "Ubehag", 105 | "significant_discomfort": "Betydeligt ubehag", 106 | "extreme_discomfort": "Ekstremt ubehag" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "state": { 111 | "outside_calculable_range": "Uden for det beregnelige område", 112 | "comfortable": "Komfortabel", 113 | "slightly_uncomfortable": "Lidt ubehageligt", 114 | "moderately_uncomfortable": "Moderat ubehageligt", 115 | "highly_uncomfortable": "Meget ubehageligt" 116 | } 117 | }, 118 | "winter_scharlau_perception": { 119 | "state": { 120 | "outside_calculable_range": "Uden for det beregnelige område", 121 | "comfortable": "Komfortabel", 122 | "slightly_uncomfortable": "Lidt ubehageligt", 123 | "moderately_uncomfortable": "Moderat ubehageligt", 124 | "highly_uncomfortable": "Meget ubehageligt" 125 | } 126 | }, 127 | "summer_simmer_perception": { 128 | "state": { 129 | "cool": "Køligt", 130 | "slightly_cool": "Lidt køligt", 131 | "comfortable": "Komfortabel", 132 | "slightly_warm": "Lidt varm", 133 | "increasing_discomfort": "Stigende ubehag", 134 | "extremely_warm": "Ekstremt varmt", 135 | "danger_of_heatstroke": "Fare for hedeslag", 136 | "extreme_danger_of_heatstroke": "Ekstrem fare for hedeslag", 137 | "circulatory_collapse_imminent": "Kredsløbskollaps nært forestående" 138 | } 139 | }, 140 | "thoms_discomfort_perception": { 141 | "state": { 142 | "no_discomfort": "Intet ubehag", 143 | "less_than_half": "Mindre end halvdelen af befolkningen føler ubehag", 144 | "more_than_half": "Mere end halvdelen af befolkningen føler ubehag", 145 | "most": "De fleste individer føler ubehag og forværring af psykofysiske tilstande", 146 | "everyone": "Alle føler betydeligt ubehag", 147 | "dangerous": "Farligt, meget stærkt ubehag, som kan forårsage hedeslag" 148 | } 149 | } 150 | } 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Temperatursensor konnte nicht gefunden werden", 5 | "humidity_not_found": "Feuchtigkeitssensor konnte nicht gefunden werden" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Thermal Comfort Einstellungen", 10 | "data": { 11 | "temperature_sensor": "Temperatursensor", 12 | "humidity_sensor": "Feuchtigkeitssensor", 13 | "poll": "Polling verwenden", 14 | "scan_interval": "Poll Intervall (Sekunden)", 15 | "custom_icons": "Benutzerdefinierte Icons verwenden" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Diese Kombination aus Temperatur- und Feuchtigkeitssensor wird bereits verwendet", 23 | "no_sensors": "Es wurde kein Temperatur- oder Feuchtigkeitssensor gefunden. Versuche es im erweiterten Modus erneut.", 24 | "no_sensors_advanced": "Es wurde kein Temperatur- oder Feuchtigkeitssensor gefunden." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Temperatursensor konnte nicht gefunden werden", 28 | "humidity_not_found": "Feuchtigkeitssensor konnte nicht gefunden werden" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Thermal Comfort Einstellungen", 33 | "data": { 34 | "name": "Name", 35 | "temperature_sensor": "Temperatursensor", 36 | "humidity_sensor": "Feuchtigkeitssensor", 37 | "poll": "Polling verwenden", 38 | "scan_interval": "Poll Intervall (Sekunden)", 39 | "custom_icons": "Benutzerdefinierte Icons verwenden", 40 | "enabled_sensors": "Aktivierte Sensoren" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Absolute Luftfeuchtigkeit" 49 | }, 50 | "dew_point": { 51 | "name": "Taupunkt" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Taupunkt gefühlt", 55 | "state": { 56 | "dry": "Etwas trocken", 57 | "very_comfortable": "Sehr angenehm", 58 | "comfortable": "Angenehm", 59 | "ok_but_humid": "Angenehm aber schwül", 60 | "somewhat_uncomfortable": "Etwas unangenehm", 61 | "quite_uncomfortable": "Unangenehm und sehr schwül", 62 | "extremely_uncomfortable": "Äußerst unangenehm und drückend", 63 | "severely_high": "Extrem hoch, tödlich für asthmabedingte Erkrankungen" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Frostpunkt" 68 | }, 69 | "frost_risk": { 70 | "name": "Frostgefahr", 71 | "state": { 72 | "no_risk": "Kein Risiko", 73 | "unlikely": "Unwahrscheinlich", 74 | "probable": "Wahrscheinlich", 75 | "high": "Sehr wahrscheinlich" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Hitzeindex" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Humidex gefühlt", 86 | "state": { 87 | "comfortable": "Angenehm", 88 | "noticable_discomfort": "Spürbares Unbehagen", 89 | "evident_discomfort": "Offensichtliches Unbehagen", 90 | "great_discomfort": "Großes Unbehagen, Anstrengung vermeiden", 91 | "dangerous_discomfort": "Gefährliches Unbehagen", 92 | "heat_stroke": "Hitzschlag möglich" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Enthalpie feuchter Luft" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Gefühlte relative Belastung", 100 | "state": { 101 | "outside_calculable_range": "Außerhalb des berechenbaren Bereichs", 102 | "comfortable": "Angenehm", 103 | "slight_discomfort": "Etwas unbehaglich", 104 | "discomfort": "Unbehaglich", 105 | "significant_discomfort": "Erhebliches Unbehagen", 106 | "extreme_discomfort": "Extremes Unbehagen" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Sommer Scharlau gefühlt", 111 | "state": { 112 | "outside_calculable_range": "Außerhalb des berechenbaren Bereichs", 113 | "comfortable": "Angenehm", 114 | "slightly_uncomfortable": "Leicht unangenehm", 115 | "moderately_uncomfortable": "Unangenehm", 116 | "highly_uncomfortable": "Sehr unangenehm" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Winter Scharlau gefühlt", 121 | "state": { 122 | "outside_calculable_range": "Außerhalb des berechenbaren Bereichs", 123 | "comfortable": "Angenehm", 124 | "slightly_uncomfortable": "Leicht unangenehm", 125 | "moderately_uncomfortable": "Unangenehm", 126 | "highly_uncomfortable": "Sehr unangenehm" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Sommer Simmer Index" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Sommer Simmer gefühlt", 134 | "state": { 135 | "cool": "Kühl", 136 | "slightly_cool": "Etwas kühl", 137 | "comfortable": "Angenehm", 138 | "slightly_warm": "Etwas warm", 139 | "increasing_discomfort": "Zunehmend unbehaglich", 140 | "extremely_warm": "Äußerst warm", 141 | "danger_of_heatstroke": "Hitzschlaggefahr", 142 | "extreme_danger_of_heatstroke": "Extreme Hitzschlaggefahr", 143 | "circulatory_collapse_imminent": "Drohender Kreislaufkollaps" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Thoms Discomfort gefühlt", 148 | "state": { 149 | "no_discomfort": "Kein Unbehagen", 150 | "less_than_half": "Weniger als die Hälfte der Bevölkerung fühlt sich unwohl", 151 | "more_than_half": "Mehr als die Hälfte der Bevölkerung fühlt sich unwohl", 152 | "most": "Die meisten Menschen fühlen sich unwohl und empfinden einen verschlechterten psychophysischen Zustand", 153 | "everyone": "Jeder fühlt sich unwohl", 154 | "dangerous": "Gefährlich, sehr starke Beschwerden die zu Hitzschlägen führen können" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/el.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Δεν βρέθηκε αισθητήρας θερμοκρασίας", 5 | "humidity_not_found": "Δεν βρέθηκε αισθητήρας υγρασίας" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Ρυθμίσεις θερμικής άνεσης", 10 | "data": { 11 | "temperature_sensor": "Αισθητήρας θερμοκρασίας", 12 | "humidity_sensor": "Αισθητήρας υγρασίας", 13 | "poll": "Ενεργοποίηση ανανέωσης", 14 | "scan_interval": "Ρυθμός ανανέωσης (δευτερόλεπτα)", 15 | "custom_icons": "Χρήση προσαρμοσμένου πακέτου εικονιδίων" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Αυτός ο συνδιασμός αισθητήρων θερμοκρασίας και υγρασίας είναι ήδη διαμορφωμένος", 23 | "no_sensors": "Δεν βρέθηκε κανένας αισθητήρας θερμοκρασίας ή υγρασίας. Δοκιμάστε πάλι σε προχωρημένη λειτουργία.", 24 | "no_sensors_advanced": "Δεν βρέθηκε κανένας αισθητήρας θερμοκρασίας ή υγρασίας." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Δεν βρέθηκε αισθητήρας θερμοκρασίας", 28 | "humidity_not_found": "Δεν βρέθηκε αισθητήρας υγρασίας" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Ρυθμίσεις θερμικής άνεσης", 33 | "data": { 34 | "name": "Όνομα", 35 | "temperature_sensor": "Αισθητήρας θερμοκρασίας", 36 | "humidity_sensor": "Αισθητήρας υγρασίας", 37 | "poll": "Ενεργοποίηση ανανέωσης", 38 | "scan_interval": "Ρυθμός ανανέωσης (δευτερόλεπτα)", 39 | "custom_icons": "Χρησιμοποίηση προσαρμοσμένης ομάδας εικονιδίων", 40 | "enabled_sensors": "Ενεργοποιημένοι αισθητήρες" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Απόλυτη υγρασία" 49 | }, 50 | "dew_point": { 51 | "name": "Σημείο δρόσου" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Αντίληψη σημείου δρόσου", 55 | "state": { 56 | "dry": "Λίγο ξηρή για κάποιους", 57 | "very_comfortable": "Πολύ άνετη", 58 | "comfortable": "Άνετη", 59 | "ok_but_humid": "OK για κάποιους , αλλά με υγρασία", 60 | "somewhat_uncomfortable": "Κάπως άβολη", 61 | "quite_uncomfortable": "Πολύ υγρό, αρκετά άβολη", 62 | "extremely_uncomfortable": "Εξαιρετικά άβολα, καταπιεστική", 63 | "severely_high": "Σοβαρά υψηλή, ακόμη και θανατηφόρα για ασθένειες που σχετίζονται με το άσθμα" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Σημείο παγετού" 68 | }, 69 | "frost_risk": { 70 | "name": "Κίνδυνος παγετού", 71 | "state": { 72 | "no_risk": "Κανένας κίνδυνος", 73 | "unlikely": "Απίθανο", 74 | "probable": "Πιθανό", 75 | "high": "Μεγάλη πιθανότητα" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Δείκτης θερμότητας" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Αντίληψη Humidex", 86 | "state": { 87 | "comfortable": "Άνετη", 88 | "noticable_discomfort": "Αισθητή δυσφορία", 89 | "evident_discomfort": "Εμφανής δυσφορία", 90 | "great_discomfort": "Μεγάλη δυσφορία, αποφύγετε την άσκηση", 91 | "dangerous_discomfort": "Επικίνδυνη δυσφορία", 92 | "heat_stroke": "Πιθανή θερμοπληξία" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Ενθαλπία υγρού αέρα" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Σχετική αντίληψη καταπόνησης", 100 | "state": { 101 | "outside_calculable_range": "Εκτός του υπολογίσιμου εύρους", 102 | "comfortable": "Άνετη", 103 | "slight_discomfort": "Ελαφρά δυσφορία", 104 | "discomfort": "Δυσφορία", 105 | "significant_discomfort": "Σημαντική δυσφορία", 106 | "extreme_discomfort": "Ακραία δυσφορία" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Summer Scharlau αντίληψη", 111 | "state": { 112 | "outside_calculable_range": "Εκτός του υπολογίσιμου εύρους", 113 | "comfortable": "Άνετη", 114 | "slightly_uncomfortable": "Ελαφρώς άβολη", 115 | "moderately_uncomfortable": "Μέτρια άβολη", 116 | "highly_uncomfortable": "Ιδιαίτερα άβολη" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Αντίληψη Winter Scharlau", 121 | "state": { 122 | "outside_calculable_range": "Εκτός του υπολογίσιμου εύρους", 123 | "comfortable": "Άνετη", 124 | "slightly_uncomfortable": "Ελαφρώς άβολη", 125 | "moderately_uncomfortable": "Μέτρια άβολη", 126 | "highly_uncomfortable": "Ιδιαίτερα άβολη" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Δείκτης Summer Simmer" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Καλοκαίρι Αντίληψη σιγοβρασμού", 134 | "state": { 135 | "cool": "Δροσερή", 136 | "slightly_cool": "Ελαφρώς δροσερή", 137 | "comfortable": "Άνετη", 138 | "slightly_warm": "Ελαφρώς ζεστή", 139 | "increasing_discomfort": "Αυξανόμενη δυσφορία", 140 | "extremely_warm": "Εξαιρετικά ζεστή", 141 | "danger_of_heatstroke": "Κίνδυνος θερμοπληξίας", 142 | "extreme_danger_of_heatstroke": "Ακραίος κίνδυνος θερμοπληξίας", 143 | "circulatory_collapse_imminent": "Επικείμενη κυκλοφορική κατάρρευση" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Αντίληψη δυσφορίας Thoms", 148 | "state": { 149 | "no_discomfort": "Καμία ενόχληση", 150 | "less_than_half": "Λιγότερο από το ήμισυ του πληθυσμού αισθάνεται δυσφορία", 151 | "more_than_half": "Περισσότερο από το ήμισυ του πληθυσμού αισθάνεται δυσφορία", 152 | "most": "Τα περισσότερα άτομα αισθάνονται δυσφορία και επιδείνωση των ψυχοφυσικών συνθηκών", 153 | "everyone": "Όλοι αισθάνονται σημαντική δυσφορία", 154 | "dangerous": "Επικίνδυνη, πολύ έντονη δυσφορία που μπορεί να προκαλέσει θερμοπληξία" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Temperature sensor not found", 5 | "humidity_not_found": "Humidity sensor not found" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Thermal comfort settings", 10 | "data": { 11 | "temperature_sensor": "Temperature sensor", 12 | "humidity_sensor": "Humidity sensor", 13 | "poll": "Enable Polling", 14 | "scan_interval": "Poll interval (seconds)", 15 | "custom_icons": "Use custom icons pack" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "This combination of temperature and humidity sensors is already configured", 23 | "no_sensors": "No temperature or humidity sensors found. Try again in advanced mode.", 24 | "no_sensors_advanced": "No temperature or humidity sensors found." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Temperature sensor not found", 28 | "humidity_not_found": "Humidity sensor not found" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Thermal comfort settings", 33 | "data": { 34 | "name": "Name", 35 | "temperature_sensor": "Temperature sensor", 36 | "humidity_sensor": "Humidity sensor", 37 | "poll": "Enable Polling", 38 | "scan_interval": "Poll interval (seconds)", 39 | "custom_icons": "Use custom icons pack", 40 | "enabled_sensors": "Enabled sensors" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Absolute humidity" 49 | }, 50 | "dew_point": { 51 | "name": "Dew point" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Dew point perception", 55 | "state": { 56 | "dry": "A bit dry for some", 57 | "very_comfortable": "Very comfortable", 58 | "comfortable": "Comfortable", 59 | "ok_but_humid": "OK for most, but humid", 60 | "somewhat_uncomfortable": "Somewhat uncomfortable", 61 | "quite_uncomfortable": "Very humid, quite uncomfortable", 62 | "extremely_uncomfortable": "Extremely uncomfortable, oppressive", 63 | "severely_high": "Severely high, even deadly for asthma related illnesses" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Frost point" 68 | }, 69 | "frost_risk": { 70 | "name": "Frost risk", 71 | "state": { 72 | "no_risk": "No risk", 73 | "unlikely": "Unlikely", 74 | "probable": "Probable", 75 | "high": "High probability" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Heat index" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Humidex perception", 86 | "state": { 87 | "comfortable": "Comfortable", 88 | "noticable_discomfort": "Noticeable discomfort", 89 | "evident_discomfort": "Evident discomfort", 90 | "great_discomfort": "Great discomfort, avoid exertion", 91 | "dangerous_discomfort": "Dangerous discomfort", 92 | "heat_stroke": "Heat stroke possible" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Moist air enthalpy" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Relative strain perception", 100 | "state": { 101 | "outside_calculable_range": "Outside of the calculable range", 102 | "comfortable": "Comfortable", 103 | "slight_discomfort": "Slight discomfort", 104 | "discomfort": "Discomfort", 105 | "significant_discomfort": "Significant discomfort", 106 | "extreme_discomfort": "Extreme discomfort" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Summer Scharlau perception", 111 | "state": { 112 | "outside_calculable_range": "Outside of the calculable range", 113 | "comfortable": "Comfortable", 114 | "slightly_uncomfortable": "Slightly uncomfortable", 115 | "moderately_uncomfortable": "Moderately uncomfortable", 116 | "highly_uncomfortable": "Highly uncomfortable" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Winter Scharlau perception", 121 | "state": { 122 | "outside_calculable_range": "Outside of the calculable range", 123 | "comfortable": "Comfortable", 124 | "slightly_uncomfortable": "Slightly uncomfortable", 125 | "moderately_uncomfortable": "Moderately uncomfortable", 126 | "highly_uncomfortable": "Highly uncomfortable" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Summer Simmer index" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Summer Simmer perception", 134 | "state": { 135 | "cool": "Cool", 136 | "slightly_cool": "Slightly cool", 137 | "comfortable": "Comfortable", 138 | "slightly_warm": "Slightly warm", 139 | "increasing_discomfort": "Increasing discomfort", 140 | "extremely_warm": "Extremely warm", 141 | "danger_of_heatstroke": "Danger of heatstroke", 142 | "extreme_danger_of_heatstroke": "Extreme danger of heatstroke", 143 | "circulatory_collapse_imminent": "Circulatory collapse imminent" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Thoms discomfort perception", 148 | "state": { 149 | "no_discomfort": "No discomfort", 150 | "less_than_half": "Less than half of the population feels discomfort", 151 | "more_than_half": "More than half of the population feels discomfort", 152 | "most": "Most individuals feel discomfort and deterioration of psychophysical conditions", 153 | "everyone": "Everyone feels significant discomfort", 154 | "dangerous": "Dangerous, very strong discomfort which may cause heat strokes" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "No se ha encontrado el sensor de temperatura", 5 | "humidity_not_found": "No se ha encontrado el sensor de humedad" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Ajustes de Thermal Comfort", 10 | "data": { 11 | "temperature_sensor": "Sensor de temperatura", 12 | "humidity_sensor": "Sensor de humedad", 13 | "poll": "Habilitar el modo 'Polling' o lectura periódica", 14 | "scan_interval": "Intervalo de consulta (segundos)", 15 | "custom_icons": "Usar paquete de iconos personalizado" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Esta combinación de sensores de temperatura y humedad ya ha sido configurada.", 23 | "no_sensors": "No se han encontrado los sensores de temperatura o humedad. Prueba de nuevo en modo avanzado.", 24 | "no_sensors_advanced": "No se han encontrado los sensores de temperatura o humedad." 25 | }, 26 | "error": { 27 | "temperature_not_found": "No se han encontrado el sensor de temperatura", 28 | "humidity_not_found": "No se han encontrado el sensor de humedad" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Ajustes de Thermal Comfort", 33 | "data": { 34 | "name": "Nombre", 35 | "temperature_sensor": "Sensor de temperatura", 36 | "humidity_sensor": "Sensor de humedad", 37 | "poll": "Habilitar el modo 'Polling' o lectura periódica", 38 | "scan_interval": "Intervalo de consulta (segundos)", 39 | "custom_icons": "Usar paquete de iconos personalizado", 40 | "enabled_sensors": "Sensores habilitados" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Humedad absoluta" 49 | }, 50 | "dew_point": { 51 | "name": "Punto de Rocío" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Sensación de humedad ambiental", 55 | "state": { 56 | "dry": "Un poco seco para algunos", 57 | "very_comfortable": "Muy cómodo", 58 | "comfortable": "Cómodo", 59 | "ok_but_humid": "Cómodo para la mayoria, pero algo húmedo", 60 | "somewhat_uncomfortable": "Algo incómodo", 61 | "quite_uncomfortable": "Muy húmedo, bastante incómodo", 62 | "extremely_uncomfortable": "Extremadamente incómodo, agobiante", 63 | "severely_high": "Riesgo alto, incluso mortal para enfermedades relacionadas con el asma" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Punto de escarcha" 68 | }, 69 | "frost_risk": { 70 | "name": "Riesgo de escarcha", 71 | "state": { 72 | "no_risk": "Sin riesgo", 73 | "unlikely": "Poco probable", 74 | "probable": "Probable", 75 | "high": "Muy probable" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Temperatura de Bochorno" 80 | }, 81 | "humidex": { 82 | "name": "Humidex " 83 | }, 84 | "humidex_perception": { 85 | "name": "Índice de Humidex", 86 | "state": { 87 | "comfortable": "Cómodo", 88 | "noticable_discomfort": "Algo incómodo", 89 | "evident_discomfort": "Bastante incómodo", 90 | "great_discomfort": "Muy incómodo, evitar esfuerzos", 91 | "dangerous_discomfort": "Peligroso", 92 | "heat_stroke": "Golpe de calor bastante probable" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Entalpía del aire húmedo" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Índice de confort térmico relativo", 100 | "state": { 101 | "outside_calculable_range": "Fuera del rango calculable", 102 | "comfortable": "Cómodo", 103 | "slight_discomfort": "Un poco incómodo", 104 | "discomfort": "Incómodo", 105 | "significant_discomfort": "Bastante incómodo", 106 | "extreme_discomfort": "Muy incómodo" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Índice de verano de Scharlau", 111 | "state": { 112 | "outside_calculable_range": "Fuera del rango calculable", 113 | "comfortable": "Cómodo", 114 | "slightly_uncomfortable": "Un poco incómodo", 115 | "moderately_uncomfortable": "Bastante incómodo", 116 | "highly_uncomfortable": "Muy incómodo" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Índice de invierno de Scharlau", 121 | "state": { 122 | "outside_calculable_range": "Fuera del rango calculable", 123 | "comfortable": "Cómodo", 124 | "slightly_uncomfortable": "Un poco incómodo", 125 | "moderately_uncomfortable": "Bastante incómodo", 126 | "highly_uncomfortable": "Muy incómodo" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Índice de calor Simmer (verano)" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Sensación índice de calor Simmer (verano)", 134 | "state": { 135 | "cool": "Fresco", 136 | "slightly_cool": "Ligeramente fresco", 137 | "comfortable": "Cómodo", 138 | "slightly_warm": "Ligeramente caluroso", 139 | "increasing_discomfort": "Caluroso e incómodo", 140 | "extremely_warm": "Extremadamente caluroso", 141 | "danger_of_heatstroke": "Riesgo de golpe de calor", 142 | "extreme_danger_of_heatstroke": "Riesgo extremo de golpe de calor", 143 | "circulatory_collapse_imminent": "Colapso circulatorio inminente" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Índice de malestar de Thom", 148 | "state": { 149 | "no_discomfort": "Sin molestias", 150 | "less_than_half": "Menos de la mitad de la población siente malestar", 151 | "more_than_half": "Más de la mitad de la población siente malestar", 152 | "most": "La mayoría de personas sienten malestar y deterioro de las condiciones psicofísicas", 153 | "everyone": "Todos sienten malestar significativo", 154 | "dangerous": "Peligro, malestar muy fuerte que puede provocar golpes de calor" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/et.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Temperatuuriandurit ei leitud", 5 | "humidity_not_found": "Niiskuseandurit ei leitud" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Soojusliku mugavustunde seaded", 10 | "data": { 11 | "temperature_sensor": "Temperatuuriandur", 12 | "humidity_sensor": "Niiskusandur", 13 | "poll": "Luba küsitlus", 14 | "scan_interval": "Küsitluse intervall (sekundites)", 15 | "custom_icons": "Kasuta kohandatud pisipiltide paketti" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "See temperatuuri- ja niiskusandurite kombinatsioon on juba seadistatud", 23 | "no_sensors": "Temperatuuri- ega niiskusandureid ei leitud. Proovi uuesti täiustatud režiimis.", 24 | "no_sensors_advanced": "Temperatuuri- ega niiskusandureid ei leitud." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Temperatuuriandurit ei leitud", 28 | "humidity_not_found": "Niiskusandurit ei leitud" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Soojusliku mugavuse seaded", 33 | "data": { 34 | "name": "Nimi", 35 | "temperature_sensor": "Temperatuuriandur", 36 | "humidity_sensor": "Niiskuse andur", 37 | "poll": "Luba küsitlus", 38 | "scan_interval": "Küsitluse intervall (sekundites)", 39 | "custom_icons": "Kasuta kohandatud pisipiltide paketti", 40 | "enabled_sensors": "Lubatud andurid" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Absoluutne niiskus" 49 | }, 50 | "dew_point": { 51 | "name": "Kastepunkt" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Tajutav kastepunkt", 55 | "state": { 56 | "dry": "Mõne jaoks natuke kuiv", 57 | "very_comfortable": "Väga mugav", 58 | "comfortable": "Mugav", 59 | "ok_but_humid": "Enamiku jaoks OK kuid niiske", 60 | "somewhat_uncomfortable": "Mõnevõrra ebamugav", 61 | "quite_uncomfortable": "Väga niiske, üsna ebamugav", 62 | "extremely_uncomfortable": "Äärmiselt ebamugav, rõhuv", 63 | "severely_high": "Tõsiselt kõrge, isegi surmav astmaga seotud haiguste puhul" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Külmumispunkt" 68 | }, 69 | "frost_risk": { 70 | "name": "Külmaoht", 71 | "state": { 72 | "no_risk": "Ei mingit riski", 73 | "unlikely": "Ebatõenäoline", 74 | "probable": "Tõenäoline", 75 | "high": "Suure tõenäosusega" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Kuumaindeks" 80 | }, 81 | "humidex": { 82 | "name": "Niiskusindeks" 83 | }, 84 | "humidex_perception": { 85 | "name": "Niiskuse tajumine", 86 | "state": { 87 | "comfortable": "Mugav", 88 | "noticable_discomfort": "Märgatav ebamugavustunne", 89 | "evident_discomfort": "Ilmne ebamugavustunne", 90 | "great_discomfort": "Suur ebamugavustunne, väldi pingutust", 91 | "dangerous_discomfort": "Ohtlik ebamugavustunne", 92 | "heat_stroke": "Võimalik kuumarabandus" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Niiske õhu entalpia" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Suhtelise pinge tajumine", 100 | "state": { 101 | "outside_calculable_range": "Väljaspool arvutatavat vahemikku", 102 | "comfortable": "Mugav", 103 | "slight_discomfort": "Kerge ebamugavustunne", 104 | "discomfort": "Ebamugavustunne", 105 | "significant_discomfort": "Märkimisväärne ebamugavustunne", 106 | "extreme_discomfort": "Äärmuslik ebamugavustunne" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Suvine mugavustaju", 111 | "state": { 112 | "outside_calculable_range": "Väljaspool arvutatavat vahemikku", 113 | "comfortable": "Mugav", 114 | "slightly_uncomfortable": "Veidi ebamugav", 115 | "moderately_uncomfortable": "Mõõdukalt ebamugav", 116 | "highly_uncomfortable": "Väga ebamugav" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Talvine mugavusindeks", 121 | "state": { 122 | "outside_calculable_range": "Väljaspool arvutatavat vahemikku", 123 | "comfortable": "Mugav", 124 | "slightly_uncomfortable": "Veidi ebamugav", 125 | "moderately_uncomfortable": "Mõõdukalt ebamugav", 126 | "highly_uncomfortable": "Väga ebamugav" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Suvine mugavusindeks" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Suvine mugavustaju", 134 | "state": { 135 | "cool": "Jahe", 136 | "slightly_cool": "Kergelt jahe", 137 | "comfortable": "Mugav", 138 | "slightly_warm": "Kergelt soe", 139 | "increasing_discomfort": "Kasvav ebamugavustunne", 140 | "extremely_warm": "Ülimalt palav", 141 | "danger_of_heatstroke": "Kuumarabanduse oht", 142 | "extreme_danger_of_heatstroke": "Suur kuumarabanduse oht", 143 | "circulatory_collapse_imminent": "Vereringe häire oht" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Vaimne ebamugavustunne", 148 | "state": { 149 | "no_discomfort": "Ei mingit ebamugavust", 150 | "less_than_half": "Vähem kui pool elanikkonnast tunneb ebamugavust", 151 | "more_than_half": "Rohkem kui pool elanikkonnast tunneb ebamugavust", 152 | "most": "Enamik inimesi tunneb ebamugavust ja psühhofüüsiliste seisundite halvenemist", 153 | "everyone": "Igaüks tunneb märkimisväärset ebamugavust", 154 | "dangerous": "Ohtlik, väga tugev ebamugavustunne, mis võib põhjustada kuumarabandust" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Le capteur de température n'a pas été trouvé", 5 | "humidity_not_found": "Le capteur d'humidité n'a pas été trouvé" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Paramètres de Thermal comfort", 10 | "data": { 11 | "temperature_sensor": "Capteur de température", 12 | "humidity_sensor": "Capteur d'humidité", 13 | "poll": "Activer le polling", 14 | "scan_interval": "Intervalle de polling (en secondes)", 15 | "custom_icons": "Utiliser un pack d'icônes personnalisé" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Cette combinaison de capteurs de température et d'humidité est déjà configurée", 23 | "no_sensors": "Aucun capteur de température ou d'humidité n'a été trouvé. Réessayez en mode avancé.", 24 | "no_sensors_advanced": "Aucun capteur de température ou d'humidité n'a été trouvé." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Capteur de température introuvable", 28 | "humidity_not_found": "Capteur d'humidité introuvable" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Paramètres de Thermal comfort", 33 | "data": { 34 | "name": "Nom", 35 | "temperature_sensor": "Capteur de température", 36 | "humidity_sensor": "Capteur d'humidité", 37 | "poll": "Activer le polling", 38 | "scan_interval": "Intervalle de polling (en secondes)", 39 | "custom_icons": "Utiliser un pack d'icônes personnalisé", 40 | "enabled_sensors": "Capteurs activés" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Humidité absolue" 49 | }, 50 | "dew_point": { 51 | "name": "Point de rosée" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Sensation point de rosée", 55 | "state": { 56 | "dry": "Un peu sec pour certains", 57 | "very_comfortable": "Très confortable", 58 | "comfortable": "Confortable", 59 | "ok_but_humid": "OK pour la plupart, mais humide", 60 | "somewhat_uncomfortable": "Un peu inconfortable", 61 | "quite_uncomfortable": "Très humide, assez inconfortable", 62 | "extremely_uncomfortable": "Extrêmement inconfortable, oppressant", 63 | "severely_high": "Gravement élevé, voire mortel pour les maladies liées à l'asthme" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Point de gelée" 68 | }, 69 | "frost_risk": { 70 | "name": "Risque de gelée", 71 | "state": { 72 | "no_risk": "Aucun risque", 73 | "unlikely": "Peu probable", 74 | "probable": "Plausible", 75 | "high": "Haute probabilité" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Indice de Chaleur" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Sensation Humidex", 86 | "state": { 87 | "comfortable": "Confortable", 88 | "noticable_discomfort": "Inconfortable", 89 | "evident_discomfort": "Très désagréable. Ralentir l'effort physique", 90 | "great_discomfort": "Malaise généralisé. Danger. Réduire considérablement l'effort physique", 91 | "dangerous_discomfort": "Danger extrême. Arrêter tout effort physique", 92 | "heat_stroke": "Coup de chaleur, danger de mort" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Enthalpie Spécifique" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Confort Thermique Relatif", 100 | "state": { 101 | "outside_calculable_range": "En dehors de la plage calculable", 102 | "comfortable": "Confortable", 103 | "slight_discomfort": "Légèrement inconfortable", 104 | "discomfort": "Inconfortable", 105 | "significant_discomfort": "Inconfort important", 106 | "extreme_discomfort": "Inconfort extrême" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Sensation indice d'été de Scharlau", 111 | "state": { 112 | "outside_calculable_range": "En dehors de la plage calculable", 113 | "comfortable": "Confortable", 114 | "slightly_uncomfortable": "Légèrement inconfortable", 115 | "moderately_uncomfortable": "Modérément inconfortable", 116 | "highly_uncomfortable": "Très inconfortable" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Sensation indice d'hiver de Scharlau", 121 | "state": { 122 | "outside_calculable_range": "En dehors de la plage calculable", 123 | "comfortable": "Confortable", 124 | "slightly_uncomfortable": "Légèrement inconfortable", 125 | "moderately_uncomfortable": "Modérément inconfortable", 126 | "highly_uncomfortable": "Très inconfortable" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Indice d'été Simmer" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Sensation indice d'été Simmer", 134 | "state": { 135 | "cool": "Froid", 136 | "slightly_cool": "Légèrement froid", 137 | "comfortable": "Confortable", 138 | "slightly_warm": "Légèrement chaud", 139 | "increasing_discomfort": "Chaud", 140 | "extremely_warm": "Très chaud", 141 | "danger_of_heatstroke": "Extrêmement chaud", 142 | "extreme_danger_of_heatstroke": "Danger extrême de coup de chaleur", 143 | "circulatory_collapse_imminent": "Arrêt cardiaque imminent" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Indice de Thom (THI)", 148 | "state": { 149 | "no_discomfort": "Pas de gêne", 150 | "less_than_half": "Moins de la moitié de la population ressent un inconfort", 151 | "more_than_half": "Plus de la moitié de la population ressent un inconfort", 152 | "most": "La plupart des individus ressentent un inconfort et une détérioration des conditions psychophysiques", 153 | "everyone": "Tout le monde ressent un inconfort important", 154 | "dangerous": "Dangereux, inconfort très important qui peut causer des coups de chaleur" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Hőmérséklet szenzor nem található", 5 | "humidity_not_found": "Páratartalom szenzor nem található" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Hőkomfort beállítások", 10 | "data": { 11 | "temperature_sensor": "Hőmérséklet szenzor", 12 | "humidity_sensor": "Páratartalom szenzor", 13 | "poll": "Állapotlekérdezés (polling) engedélyezése", 14 | "scan_interval": "Lekérdezési időköz (polling) (másodpercekben)", 15 | "custom_icons": "Egyedi ikonkészlet használata" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Ez a hőmérséklet- és páratartalom-szenzor kombináció már konfigurálva van", 23 | "no_sensors": "Nem található hőmérséklet- vagy páratartalom-szenzor. Próbáld újra a haladó (advanced) módban.", 24 | "no_sensors_advanced": "Nem található hőmérséklet- vagy páratartalom-szenzor." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Hőmérséklet szenzor nem található.", 28 | "humidity_not_found": "Páratartalom szenzor nem található." 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Hőkomfort beállítások", 33 | "data": { 34 | "name": "Név", 35 | "temperature_sensor": "Hőmérséklet szenzor", 36 | "humidity_sensor": "Páratartalom szenzor", 37 | "poll": "Állapotlekérdezés (polling) engedélyezése", 38 | "scan_interval": "Lekérdezési időköz (polling) (másodpercekben)", 39 | "custom_icons": "Egyedi ikonkészlet használata", 40 | "enabled_sensors": "Engedélyezett szenzorok" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Abszolút páratartalom" 49 | }, 50 | "dew_point": { 51 | "name": "Harmatpont" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Harmatpont érzékelés", 55 | "state": { 56 | "dry": "Egyeseknek kissé száraz", 57 | "very_comfortable": "Nagyon kellemes", 58 | "comfortable": "Kellemes", 59 | "ok_but_humid": "A többségnek megfelelő, de párás", 60 | "somewhat_uncomfortable": "Kicsit kellemetlen", 61 | "quite_uncomfortable": "Nagyon nedves, eléggé kellemetlen", 62 | "extremely_uncomfortable": "Rendkívül kellemetlen, nyomasztó", 63 | "severely_high": "Különösen magas, az asztmás betegségek számára életveszélyes" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Fagypont" 68 | }, 69 | "frost_risk": { 70 | "name": "Fagyveszély", 71 | "state": { 72 | "no_risk": "Nincs kockázat", 73 | "unlikely": "Nem valószínű", 74 | "probable": "Valószínű", 75 | "high": "Nagyon valószínű" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Hő index" 80 | }, 81 | "humidex": { 82 | "name": "Páratartalom index" 83 | }, 84 | "humidex_perception": { 85 | "name": "Páratartalom index \n\n\nérzékelés", 86 | "state": { 87 | "comfortable": "Kellemes", 88 | "noticable_discomfort": "Érezhető kellemetlenség", 89 | "evident_discomfort": "Kellemetlen", 90 | "great_discomfort": "Rendkívül kellemetlen, kerüld a megterhelést", 91 | "dangerous_discomfort": "Veszélyesen kellemetlen", 92 | "heat_stroke": "Napszúrás lehetséges" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Páradús levegő entalpia" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Relatív feszültség érzékelése", 100 | "state": { 101 | "outside_calculable_range": "A számolható tartományon kívül\n", 102 | "comfortable": "Kellemes", 103 | "slight_discomfort": "Enyhén kellemetlen", 104 | "discomfort": "Kellemetlen", 105 | "significant_discomfort": "Jelentős kellemetlenség", 106 | "extreme_discomfort": "Extrém kellemetlenség" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Nyári Scharlau érzékelés", 111 | "state": { 112 | "outside_calculable_range": "A számolható tartományon kívül", 113 | "comfortable": "Kellemes", 114 | "slightly_uncomfortable": "Kissé kényelmetlen", 115 | "moderately_uncomfortable": "Mérsékelten kényelmetlen", 116 | "highly_uncomfortable": "Nagyon kényelmetlen" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Téli scharlau felfogás", 121 | "state": { 122 | "outside_calculable_range": "A számolható tartományon kívül", 123 | "comfortable": "Kellemes", 124 | "slightly_uncomfortable": "Kissé kényelmetlen", 125 | "moderately_uncomfortable": "Mérsékelten kényelmetlen", 126 | "highly_uncomfortable": "Nagyon kényelmetlen" 127 | } 128 | }, 129 | "summer_simmer_perception": { 130 | "name": "Nyári forrongás érzékelése", 131 | "state": { 132 | "cool": "Hideg", 133 | "slightly_cool": "Enyhén hűvös", 134 | "comfortable": "Kellemes", 135 | "slightly_warm": "Enyhén meleg", 136 | "increasing_discomfort": "Fokozódó diszkomfort", 137 | "extremely_warm": "Rendkívül meleg", 138 | "danger_of_heatstroke": "Napszúrásveszély", 139 | "extreme_danger_of_heatstroke": "Rendkívüli napszúrásveszély", 140 | "circulatory_collapse_imminent": "Keringési összeomlás veszélye" 141 | } 142 | }, 143 | "thoms_discomfort_perception": { 144 | "name": "Thoms kellemetlen érzés", 145 | "state": { 146 | "no_discomfort": "Nincs kellemetlen érzés", 147 | "less_than_half": "A lakosság kevesebb mint fele érez kényelmetlenséget", 148 | "more_than_half": "A lakosság több mint fele kellemetlenül érzi magát", 149 | "most": "A legtöbb ember kényelmetlenséget és pszichofizikai állapotának romlását érzi", 150 | "everyone": "Mindenki jelentős kényelmetlenséget érez", 151 | "dangerous": "Veszélyes, nagyon erős kényelmetlenség, amely hőgutát okozhat" 152 | } 153 | } 154 | } 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Sensore di temperatura non trovato", 5 | "humidity_not_found": "Sensore di umidità non trovato" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Impostazioni di comfort termico", 10 | "data": { 11 | "temperature_sensor": "Sensore di temperatura", 12 | "humidity_sensor": "Sensore di umidità", 13 | "poll": "Abilita polling", 14 | "scan_interval": "Intervallo di polling (secondi)", 15 | "custom_icons": "Usa il pacchetto di icone personalizzate" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Questa combinazione di sensori di temperatura e umidità è già configurata", 23 | "no_sensors": "Nessun sensore di temperatura o umidità trovato. Riprova in modalità avanzata.", 24 | "no_sensors_advanced": "Nessun sensore di temperatura o umidità trovato." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Sensore di temperatura non trovato", 28 | "humidity_not_found": "Sensore di umidità non trovato" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Impostazioni di comfort termico", 33 | "data": { 34 | "name": "Nome", 35 | "temperature_sensor": "Sensore di temperatura", 36 | "humidity_sensor": "Sensore di umidità", 37 | "poll": "Abilita polling", 38 | "scan_interval": "Intervallo di polling (secondi)", 39 | "custom_icons": "Usa pacchetto icone personalizzato", 40 | "enabled_sensors": "Sensori abilitati" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Umidità assoluta" 49 | }, 50 | "dew_point": { 51 | "name": "Punto di rugiada" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Percezione del punto di rugiada", 55 | "state": { 56 | "dry": "Secco per qualcuno", 57 | "very_comfortable": "Molto confortevole", 58 | "comfortable": "Confortevole", 59 | "ok_but_humid": "Confortevole ma umido", 60 | "somewhat_uncomfortable": "Leggero disagio", 61 | "quite_uncomfortable": "Significativo disagio, molto umido", 62 | "extremely_uncomfortable": "Forte disagio, opprimente", 63 | "severely_high": "Estremo disagio, rischioso per malattie correlate all'asma" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Punto di gelo" 68 | }, 69 | "frost_risk": { 70 | "name": "Rischio di gelo", 71 | "state": { 72 | "no_risk": "Nessun rischio", 73 | "unlikely": "Improbabile", 74 | "probable": "Probabile", 75 | "high": "Alta probabilità" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Indice di calore" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Percezione dell'humidex", 86 | "state": { 87 | "comfortable": "Confortevole", 88 | "noticable_discomfort": "Disagio", 89 | "evident_discomfort": "Disagio significativo", 90 | "great_discomfort": "Disagio enorme, evitare affaticamenti", 91 | "dangerous_discomfort": "Disagio pericoloso", 92 | "heat_stroke": "Probabile colpo di calore" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Entalpia dell'aria umida" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Percezione della tenzione relativa", 100 | "state": { 101 | "outside_calculable_range": "Fuori scala", 102 | "comfortable": "Confortevole", 103 | "slight_discomfort": "Disagio leggero", 104 | "discomfort": "Disagio", 105 | "significant_discomfort": "Disagio significativo", 106 | "extreme_discomfort": "Disagio estremo" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Percezione dell'indice di Scharlau estivo", 111 | "state": { 112 | "outside_calculable_range": "Fuori scala", 113 | "comfortable": "Confortevole", 114 | "slightly_uncomfortable": "Leggero disagio", 115 | "moderately_uncomfortable": "Moderato disagio", 116 | "highly_uncomfortable": "Forte disagio" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Percezione dell'indice di Scharlau invernale", 121 | "state": { 122 | "outside_calculable_range": "Fuori scala", 123 | "comfortable": "Confortevole", 124 | "slightly_uncomfortable": "Leggero disagio", 125 | "moderately_uncomfortable": "Moderato disagio", 126 | "highly_uncomfortable": "Forte disagio" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Indice di Simmer estivo" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Percezione dell'indice di Simmer estivo", 134 | "state": { 135 | "cool": "Freddo", 136 | "slightly_cool": "Leggermente freddo", 137 | "comfortable": "Confortevole", 138 | "slightly_warm": "Leggermente caldo", 139 | "increasing_discomfort": "Aumento del disagio", 140 | "extremely_warm": "Estremamente caldo", 141 | "danger_of_heatstroke": "Pericolo colpo di calore", 142 | "extreme_danger_of_heatstroke": "Probabile colpo di calore", 143 | "circulatory_collapse_imminent": "Imminente colasso circolatorio" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Percezione di disagio di Thoms", 148 | "state": { 149 | "no_discomfort": "Confortevole", 150 | "less_than_half": "Meno della metà della popolazione avverte disagio", 151 | "more_than_half": "Più della metà della popolazione avverte disagio", 152 | "most": "La maggior parte delle persone avverte disagio e deterioramento delle condizioni psicofisiche", 153 | "everyone": "Forte disagio per chiunque", 154 | "dangerous": "Stato di emergenza medica, disagio molto forte che può causare colpi di calore" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "温度センサーが見つかりません", 5 | "humidity_not_found": "湿度センサーが見つかりません" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Thermal comfortの設定", 10 | "data": { 11 | "temperature_sensor": "温度センサー", 12 | "humidity_sensor": "湿度センサー", 13 | "poll": "ポーリングを有効にする", 14 | "scan_interval": "ポーリング周期(秒)", 15 | "custom_icons": "custom icons packを使用する" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "この温度センサーと湿度センサーの組み合わせは既に構成されています", 23 | "no_sensors": "温度または湿度センサーが見つかりません。詳細モードで再試行してください。", 24 | "no_sensors_advanced": "温度または湿度センサーが見つかりません。" 25 | }, 26 | "error": { 27 | "temperature_not_found": "温度センサーが見つかりません", 28 | "humidity_not_found": "湿度センサーが見つかりません" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Thermal comfortの設定", 33 | "data": { 34 | "name": "名前", 35 | "temperature_sensor": "温度センサー", 36 | "humidity_sensor": "湿度センサー", 37 | "poll": "ポーリングを有効にする", 38 | "scan_interval": "ポーリング周期(秒)", 39 | "custom_icons": "custom icons packを使用する", 40 | "enabled_sensors": "センサーを有効にする" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "絶対湿度" 49 | }, 50 | "dew_point": { 51 | "name": "露点" 52 | }, 53 | "dew_point_perception": { 54 | "name": "露点知覚", 55 | "state": { 56 | "dry": "一部の人にとっては少し乾燥", 57 | "very_comfortable": "とても快適", 58 | "comfortable": "快適", 59 | "ok_but_humid": "おおむね問題なし、ただし湿度が高い", 60 | "somewhat_uncomfortable": "やや不快", 61 | "quite_uncomfortable": "湿度が高くかなり不快", 62 | "extremely_uncomfortable": "非常に不快で抑圧的", 63 | "severely_high": "非常に高く、喘息関連疾患では致死的" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "霜点" 68 | }, 69 | "frost_risk": { 70 | "name": "霜の危険性", 71 | "state": { 72 | "no_risk": "ノーリスク", 73 | "unlikely": "なさそう", 74 | "probable": "ありそう", 75 | "high": "高確率" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "暑さ指数" 80 | }, 81 | "humidex": { 82 | "name": "湿度指数" 83 | }, 84 | "humidex_perception": { 85 | "name": "湿度指数知覚", 86 | "state": { 87 | "comfortable": "快適", 88 | "noticable_discomfort": "顕著な不快感", 89 | "evident_discomfort": "明らかな不快感", 90 | "great_discomfort": "極度の不快感、運動を避ける", 91 | "dangerous_discomfort": "危険な不快感", 92 | "heat_stroke": "熱中症の可能性あり" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "湿った空気のエンタルピー" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "相対的な調子の知覚", 100 | "state": { 101 | "outside_calculable_range": "計算範囲外", 102 | "comfortable": "快適", 103 | "slight_discomfort": "わずかな不快感", 104 | "discomfort": "不快感", 105 | "significant_discomfort": "著しい不快感", 106 | "extreme_discomfort": "極度の不快感" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Summer Scharlau指数", 111 | "state": { 112 | "outside_calculable_range": "計算範囲外", 113 | "comfortable": "快適", 114 | "slightly_uncomfortable": "わずかな不快感", 115 | "moderately_uncomfortable": "中程度に不快", 116 | "highly_uncomfortable": "非常に不快" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Winter Scharlau指数", 121 | "state": { 122 | "outside_calculable_range": "計算範囲外", 123 | "comfortable": "快適", 124 | "slightly_uncomfortable": "わずかな不快感", 125 | "moderately_uncomfortable": "中程度に不快", 126 | "highly_uncomfortable": "非常に不快" 127 | } 128 | }, 129 | "summer_simmer_perception": { 130 | "name": "Summer Simmer指数", 131 | "state": { 132 | "cool": "涼しい", 133 | "slightly_cool": "やや涼しい", 134 | "comfortable": "快適", 135 | "slightly_warm": "やや暖かい", 136 | "increasing_discomfort": "不快感の増大", 137 | "extremely_warm": "非常に暖かい", 138 | "danger_of_heatstroke": "熱中症になる危険性あり", 139 | "extreme_danger_of_heatstroke": "熱中症になる危険性が極めて高い", 140 | "circulatory_collapse_imminent": "循環器系の破綻が近い" 141 | } 142 | }, 143 | "thoms_discomfort_perception": { 144 | "name": "Thoms discomfort指数", 145 | "state": { 146 | "no_discomfort": "不快感なし", 147 | "less_than_half": "不快感を感じている人は半数以下", 148 | "more_than_half": "不快感を感じている人が半数以上", 149 | "most": "多数の人が違和感を覚え精神的にも物理的にも状態が悪化", 150 | "everyone": "誰もが大きな違和感を覚える", 151 | "dangerous": "熱中症になりそうなほど強い不快感" 152 | } 153 | } 154 | } 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/nb.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Temperatursensor ikke funnet", 5 | "humidity_not_found": "Fuktighetssensor ikke funnet" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Termiske komfortinnstillinger", 10 | "data": { 11 | "temperature_sensor": "Temperatursensor", 12 | "humidity_sensor": "Fuktighetssensor", 13 | "poll": "Aktiver spørring", 14 | "scan_interval": "Spørringsintervall (sekunder)", 15 | "custom_icons": "Bruk tilpasset ikonpakke" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Denne kombinasjonen av temperatur- og fuktighetssensorer er allerede konfigurert", 23 | "no_sensors": "Fant ingen temperatur- eller fuktighetssensorer. Prøv igjen i avansert modus.", 24 | "no_sensors_advanced": "Fant ingen temperatur- eller fuktighetssensorer." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Temperatursensor ikke funnet", 28 | "humidity_not_found": "Fuktighetssensor ikke funnet" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Termiske komfortinnstillinger", 33 | "data": { 34 | "name": "Navn", 35 | "temperature_sensor": "Temperatursensor", 36 | "humidity_sensor": "Fuktighetssensor", 37 | "poll": "Aktiver spørring", 38 | "scan_interval": "Spørringsintervall (sekunder)", 39 | "custom_icons": "Bruk tilpasset ikonpakke", 40 | "enabled_sensors": "Aktiverte sensorer" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Absolutt fuktighet" 49 | }, 50 | "dew_point": { 51 | "name": "Duggpunkt" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Duggpunktoppfatning", 55 | "state": { 56 | "dry": "Litt tørt for noen", 57 | "very_comfortable": "Veldig behagelig", 58 | "comfortable": "Komfortabelt", 59 | "ok_but_humid": "OK for de fleste, men fuktig", 60 | "somewhat_uncomfortable": "Noe ubehagelig", 61 | "quite_uncomfortable": "Veldig fuktig, ganske ubehagelig", 62 | "extremely_uncomfortable": "Ekstremt ubehagelig, undertrykkende", 63 | "severely_high": "Alvorlig høy, til og med dødelig for astma-relaterte sykdommer" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Frostpunkt" 68 | }, 69 | "frost_risk": { 70 | "name": "Frostrisiko", 71 | "state": { 72 | "no_risk": "Ingen risiko", 73 | "unlikely": "Usannsynlig", 74 | "probable": "Sannsynlig", 75 | "high": "Høy sannsynlighet" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Varmeindeks" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Humidex oppfatning", 86 | "state": { 87 | "comfortable": "Komfortabel", 88 | "noticable_discomfort": "Merkbart ubehag", 89 | "evident_discomfort": "Tydelig ubehag", 90 | "great_discomfort": "Stort ubehag, unngå anstrengelse", 91 | "dangerous_discomfort": "Farlig ubehag", 92 | "heat_stroke": "Mulig heteslag" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Entalpi av fuktig luft" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Relativ belastningsoppfatning", 100 | "state": { 101 | "outside_calculable_range": "Utenfor det kalkulerbare området", 102 | "comfortable": "Komfortabel", 103 | "slight_discomfort": "Lett ubehag", 104 | "discomfort": "Ubehag", 105 | "significant_discomfort": "Betydelig ubehag", 106 | "extreme_discomfort": "Ekstremt ubehag" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Sommer Scharlau oppfatning", 111 | "state": { 112 | "outside_calculable_range": "Utenfor det kalkulerbare området", 113 | "comfortable": "Komfortabel", 114 | "slightly_uncomfortable": "Litt ubehagelig", 115 | "moderately_uncomfortable": "Middels ubehagelig", 116 | "highly_uncomfortable": "Svært ubehagelig" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Vinter Scharlau oppfatning", 121 | "state": { 122 | "outside_calculable_range": "Utenfor det kalkulerbare området", 123 | "comfortable": "Komfortabel", 124 | "slightly_uncomfortable": "Litt ubehagelig", 125 | "moderately_uncomfortable": "Middels ubehagelig", 126 | "highly_uncomfortable": "Svært ubehagelig" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Sommer Simmer-indeks" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Sommer Simmer oppfatning", 134 | "state": { 135 | "cool": "Kjølig", 136 | "slightly_cool": "Litt kjølig", 137 | "comfortable": "Komfortabelt", 138 | "slightly_warm": "Litt varm", 139 | "increasing_discomfort": "Økende ubehag", 140 | "extremely_warm": "Ekstremt varmt", 141 | "danger_of_heatstroke": "Fare for heteslag", 142 | "extreme_danger_of_heatstroke": "Ekstrem fare for heteslag", 143 | "circulatory_collapse_imminent": "Sirkulasjonssvikt nært forestående" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Thoms ubehag oppfatning", 148 | "state": { 149 | "no_discomfort": "Ingen ubehag", 150 | "less_than_half": "Mindre enn halvparten av befolkningen føler ubehag", 151 | "more_than_half": "Mer enn halvparten av befolkningen føler ubehag", 152 | "most": "De fleste individer føler ubehag og forverring av psykofysiske tilstander", 153 | "everyone": "Alle føler betydelig ubehag", 154 | "dangerous": "Farlig, veldig sterkt ubehag som kan forårsake heteslag" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Temperatuursensor niet gevonden", 5 | "humidity_not_found": "Luchtvochtigheidssensor niet gevonden" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Instellingen Thermal comfort", 10 | "data": { 11 | "temperature_sensor": "Temperatuursensor", 12 | "humidity_sensor": "Luchtvochtigheidssensor", 13 | "poll": "Inschakelen polling", 14 | "scan_interval": "Poll interval (seconden)", 15 | "custom_icons": "Gebruikerspecifieke iconen" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Deze combinatie van temperatuur- en luchtvochtigheidssensoren is al geconfigureerd", 23 | "no_sensors": "Geen temperatuur- of luchtvochtigheidssensoren gevonden. Probeer opnieuw in geadvanceerde modus.", 24 | "no_sensors_advanced": "Geen temperatuur- of luchtvochtigheidssensoren gevonden." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Temperatuursensor niet gevonden", 28 | "humidity_not_found": "Luchtvochtigheidssensor niet gevonden" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Instellingen Thermal comfort", 33 | "data": { 34 | "name": "Naam", 35 | "temperature_sensor": "Temperatuursensor", 36 | "humidity_sensor": "Luchtvochtigheidssensor", 37 | "poll": "Inschakelen polling", 38 | "scan_interval": "Poll interval (seconden)", 39 | "custom_icons": "Gebruikerspecifieke iconen", 40 | "enabled_sensors": "Ingeschakelde sensoren" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Absolute luchtvochtigheid" 49 | }, 50 | "dew_point": { 51 | "name": "Dauwpunt" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Dauwpunt beleving", 55 | "state": { 56 | "dry": "Een beetje droog voor sommigen", 57 | "very_comfortable": "Zeer comfortabel", 58 | "comfortable": "Comfortabel", 59 | "ok_but_humid": "Aangenaam maar wel vochtig", 60 | "somewhat_uncomfortable": "Ietwat ongemakkelijk", 61 | "quite_uncomfortable": "Zeer vochtig, behoorlijk ongemakkelijk", 62 | "extremely_uncomfortable": "Extreem ongemakkelijk, drukkend", 63 | "severely_high": "Zeer hoog, zelfs levensgevaarlijk bij astmatische klachten" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Rijptemperatuur" 68 | }, 69 | "frost_risk": { 70 | "name": "Risico op rijp", 71 | "state": { 72 | "no_risk": "Geen risico", 73 | "unlikely": "Onwaarschijnlijk", 74 | "probable": "Waarschijnlijk", 75 | "high": "Hoogstwaarschijnlijk" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Hitte-index" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Humidex beleving", 86 | "state": { 87 | "comfortable": "Comfortabel", 88 | "noticable_discomfort": "Merkbaar ongemakkelijk", 89 | "evident_discomfort": "Duidelijk ongemakkelijk", 90 | "great_discomfort": "Groot ongemak, vermijd inspanning", 91 | "dangerous_discomfort": "Gevaarlijk ongemakkelijk", 92 | "heat_stroke": "Kans op hitteberoerte" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Energie van de vochtige lucht (enthalpie)" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Temperatuurbeleving bij lichte inspanning", 100 | "state": { 101 | "outside_calculable_range": "Buiten het berekenbare bereik", 102 | "comfortable": "Comfortabel", 103 | "slight_discomfort": "Licht ongemakkelijk", 104 | "discomfort": "Ongemakkelijk", 105 | "significant_discomfort": "Aanzienlijk ongemakkelijk", 106 | "extreme_discomfort": "Extreem ongemakkelijk" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Temperatuurbeleving volgens Scharlau (zomer)", 111 | "state": { 112 | "outside_calculable_range": "Buiten het berekenbare bereik", 113 | "comfortable": "Comfortabel", 114 | "slightly_uncomfortable": "Licht ongemakkelijk", 115 | "moderately_uncomfortable": "Matig ongemakkelijk", 116 | "highly_uncomfortable": "Zeer ongemakkelijk" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Temperatuurbeleving volgens Scharlau (winter)", 121 | "state": { 122 | "outside_calculable_range": "Buiten het berekenbare bereik", 123 | "comfortable": "Comfortabel", 124 | "slightly_uncomfortable": "Licht ongemakkelijk", 125 | "moderately_uncomfortable": "Matig ongemakkelijk", 126 | "highly_uncomfortable": "Zeer ongemakkelijk" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Temperatuurindex volgens Simmer" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Temperatuurbeleving volgens Simmer (zomer)", 134 | "state": { 135 | "cool": "Koel", 136 | "slightly_cool": "Enigszins koel", 137 | "comfortable": "Comfortabel", 138 | "slightly_warm": "Enigszins warm", 139 | "increasing_discomfort": "Toenemend ongemak", 140 | "extremely_warm": "Extreem warm", 141 | "danger_of_heatstroke": "Gevaar voor hitteberoerte", 142 | "extreme_danger_of_heatstroke": "Extreem gevaar voor hitteberoerte", 143 | "circulatory_collapse_imminent": "Direct gevaar voor flauwvallen, circulatoir collaps" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Temperatuurbeleving volgens Thoms", 148 | "state": { 149 | "no_discomfort": "Niet ongemakkelijk", 150 | "less_than_half": "Minder dan de helft van de mensen voelt zich ongemakkelijk", 151 | "more_than_half": "Meer dan de helft van de mensen voelt zich ongemakkelijk", 152 | "most": "De meeste mensen voelen zich ongemakkelijk, verslechtering van psychofysische omstandigheden", 153 | "everyone": "Iedereen ervaart aanzienlijk ongemak", 154 | "dangerous": "Gevaarlijk, zeer sterk ongemak dat een hitteberoerte kan veroorzaken" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Nie znaleziono czujnika temperatury", 5 | "humidity_not_found": "Nie znaleziono czujnika wilgotności" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Ustawienia komfortu cieplnego", 10 | "data": { 11 | "temperature_sensor": "Czujnik temperatury", 12 | "humidity_sensor": "Czujnik wilgotności", 13 | "poll": "Włącz odpytywanie", 14 | "scan_interval": "Interwał odpytywania (sekundy)", 15 | "custom_icons": "Użyj niestandardowego pakietu ikon" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Ta kombinacja czujników temperatury i wilgotności jest już skonfigurowana", 23 | "no_sensors": "Nie znaleziono czujników temperatury ani wilgotności. Spróbuj ponownie w trybie zaawansowanym.", 24 | "no_sensors_advanced": "Nie znaleziono czujników temperatury ani wilgotności." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Nie znaleziono czujnika temperatury", 28 | "humidity_not_found": "Nie znaleziono czujnika wilgotności" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Ustawienia komfortu cieplnego", 33 | "data": { 34 | "name": "Nazwa", 35 | "temperature_sensor": "Czujnik temperatury", 36 | "humidity_sensor": "Czujnik wilgotności", 37 | "poll": "Włącz odpytywanie", 38 | "scan_interval": "Interwał odpytywania (sekundy)", 39 | "custom_icons": "Użyj niestandardowego pakietu ikon", 40 | "enabled_sensors": "Włączone czujniki" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Wilgotność bezwzględna" 49 | }, 50 | "dew_point": { 51 | "name": "Punkt rosy" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Odczucie punktu rosy", 55 | "state": { 56 | "dry": "Dla niektórych może być sucho", 57 | "very_comfortable": "Bardzo komfortowe", 58 | "comfortable": "Komfortowe", 59 | "ok_but_humid": "OK dla większości, ale wilgotno", 60 | "somewhat_uncomfortable": "Trochę niekomfortowe", 61 | "quite_uncomfortable": "Bardzo wilgotno, całkiem niekomfortowe", 62 | "extremely_uncomfortable": "Bardzo niekomfortowe, uciążliwe", 63 | "severely_high": "Wysoce niebezpieczne dla astmatyków, bardzo uciążliwe" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Punkt zamarzania" 68 | }, 69 | "frost_risk": { 70 | "name": "Ryzyko zamarazania", 71 | "state": { 72 | "no_risk": "Brak", 73 | "unlikely": "Małe", 74 | "probable": "Możliwe", 75 | "high": "Wysokie" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Wskaźnik ciepła" 80 | }, 81 | "humidex": { 82 | "name": "Wskaźnik upału" 83 | }, 84 | "humidex_perception": { 85 | "name": "Odczucie upału", 86 | "state": { 87 | "comfortable": "Komfortowo", 88 | "noticable_discomfort": "Lekki dyskomfort", 89 | "evident_discomfort": "Wyraźny dyskomfort", 90 | "great_discomfort": "Duży dyskomfort, unikaj wysiłku", 91 | "dangerous_discomfort": "Niebezpieczny dyskomfort", 92 | "heat_stroke": "Możliwy udar cieplny" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Pojemność cieplna wilgotnego powietrza" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Odczucie względnego obciążenia", 100 | "state": { 101 | "outside_calculable_range": "Poza obliczalnym zakresem", 102 | "comfortable": "Komfortowo", 103 | "slight_discomfort": "Lekki dyskomfort", 104 | "discomfort": "Dyskomfort", 105 | "significant_discomfort": "Znaczący dyskomfort", 106 | "extreme_discomfort": "Ekstremalny dyskomfort" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "state": { 111 | "outside_calculable_range": "Poza obliczalnym zakresem", 112 | "comfortable": "Komfortowo", 113 | "slightly_uncomfortable": "Lekki dyskomfort", 114 | "moderately_uncomfortable": "Dyskomfort", 115 | "highly_uncomfortable": "Wysoki dyskomfort" 116 | } 117 | }, 118 | "winter_scharlau_perception": { 119 | "state": { 120 | "outside_calculable_range": "Poza obliczalnym zakresem", 121 | "comfortable": "Komfortowo", 122 | "slightly_uncomfortable": "Lekki dyskomfort", 123 | "moderately_uncomfortable": "Dyskomfort", 124 | "highly_uncomfortable": "Wysoki dyskomfort" 125 | } 126 | }, 127 | "summer_simmer_perception": { 128 | "state": { 129 | "cool": "Zimno", 130 | "slightly_cool": "Chłodnawo", 131 | "comfortable": "Komfortowo", 132 | "slightly_warm": "Ciepło", 133 | "increasing_discomfort": "Trochę za ciepło", 134 | "extremely_warm": "Bardzo ciepło", 135 | "danger_of_heatstroke": "Możliwy udar cieplny", 136 | "extreme_danger_of_heatstroke": "Wysokie niebezpieczeństwo udaru", 137 | "circulatory_collapse_imminent": "Zdecydowane problemy z krążeniem, zapaść" 138 | } 139 | }, 140 | "thoms_discomfort_perception": { 141 | "state": { 142 | "no_discomfort": "Brak dyskomfortu", 143 | "less_than_half": "Mniej niż połowa populacji odczuwa dyskomfort", 144 | "more_than_half": "Ponad połowa populacji odczuwa dyskomfort", 145 | "most": "Większość osób odczuwa dyskomfort i pogorszenie warunków psychofizycznych", 146 | "everyone": "Wszyscy odczuwają znaczny dyskomfort", 147 | "dangerous": "Niebezpieczny, bardzo silny dyskomfort, który może powodować udary cieplne" 148 | } 149 | } 150 | } 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/pt-BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Sensor de temperatura não foi localizado", 5 | "humidity_not_found": "Sensor de umidade não foi localizado" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Configurações do Conforto Térmico", 10 | "data": { 11 | "temperature_sensor": "Sensor de Temperatura", 12 | "humidity_sensor": "Sensor de Umidade", 13 | "poll": "Ativar Atualização Periódica", 14 | "scan_interval": "Intervalo de atualização (segundos)", 15 | "custom_icons": "Usar ícones personalizados" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Esta combinação de sensores de temperatura e umidade já foram utilizadas.", 23 | "no_sensors": "Não foram localizados os sensores de temperatura e/ou umidade. Tente novamente no modo avançado.", 24 | "no_sensors_advanced": "Não foram localizados sensores de temperatura e/ou umidade." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Sensor de temperatura não foi localizado", 28 | "humidity_not_found": "Sensor de umidade não foi localizado" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Definições do Conforto Térmico", 33 | "data": { 34 | "name": "Nome", 35 | "temperature_sensor": "Sensor de Temperatura", 36 | "humidity_sensor": "Sensor de Umidade", 37 | "poll": "Ativar Atualizaçãov Periódica", 38 | "scan_interval": "Intervalo de atualização (segundos)", 39 | "custom_icons": "Usar ícones personalizados", 40 | "enabled_sensors": "Sensores ligados" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Umidade absoluta" 49 | }, 50 | "dew_point": { 51 | "name": "Ponto de orvalho" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Percepção do ponto de orvalho", 55 | "state": { 56 | "dry": "Um pouco seco para alguns", 57 | "very_comfortable": "Muito confortável", 58 | "comfortable": "Confortável", 59 | "ok_but_humid": "Confortável para a maioria, porém úmido", 60 | "somewhat_uncomfortable": "Um pouco desconfortável", 61 | "quite_uncomfortable": "Muito úmido, bastante desconfortável", 62 | "extremely_uncomfortable": "Extremamente desconfortável", 63 | "severely_high": "Extremamente alto, pode até ser mortal para portadores de asma" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Ponto de congelamento" 68 | }, 69 | "frost_risk": { 70 | "name": "Risco de congelamento", 71 | "state": { 72 | "no_risk": "Sem risco", 73 | "unlikely": "Improvável", 74 | "probable": "Provável", 75 | "high": "Alta probabilidade" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Índice de calor" 80 | }, 81 | "humidex": { 82 | "name": "Índice de Umidade (humidex)" 83 | }, 84 | "humidex_perception": { 85 | "name": "Percepção ao Índice de Umidade", 86 | "state": { 87 | "comfortable": "Confortável", 88 | "noticable_discomfort": "Desconforto Perceptível", 89 | "evident_discomfort": "Desconforto evidente", 90 | "great_discomfort": "Grande desconforto, evite esforço físico", 91 | "dangerous_discomfort": "Desconforto perigoso", 92 | "heat_stroke": "Alto risco de insolação" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Entalpia específica do vapor úmido" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Conforto Térmico Relativo", 100 | "state": { 101 | "outside_calculable_range": "Fora do interválo de cálculo", 102 | "comfortable": "Confortável", 103 | "slight_discomfort": "Leve desconforto", 104 | "discomfort": "Desconforto", 105 | "significant_discomfort": "Desconforto significativo", 106 | "extreme_discomfort": "Desconforto extremo" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Índice de Verão de Scharlau", 111 | "state": { 112 | "outside_calculable_range": "Fora do interválo de cálculo", 113 | "comfortable": "Confortável", 114 | "slightly_uncomfortable": "Ligeiramente desconfortável", 115 | "moderately_uncomfortable": "Desconforto moderado", 116 | "highly_uncomfortable": "Muito desconfortáve" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Percepção de Inverno de Scharlau", 121 | "state": { 122 | "outside_calculable_range": "Fora do interválo de cálculo", 123 | "comfortable": "Confortável", 124 | "slightly_uncomfortable": "Ligeiramente desconfortável", 125 | "moderately_uncomfortable": "Desconforto moderado", 126 | "highly_uncomfortable": "Muito desconfortável" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Índice de Verão de Simmer" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Percepção de Verão de Simmer", 134 | "state": { 135 | "cool": "Frio", 136 | "slightly_cool": "Um pouco frio", 137 | "comfortable": "Confortável", 138 | "slightly_warm": "Um pouco quente", 139 | "increasing_discomfort": "Desconforto crescente", 140 | "extremely_warm": "Extremamente quente", 141 | "danger_of_heatstroke": "Perigo de insolação", 142 | "extreme_danger_of_heatstroke": "Perigo extremo de insolação", 143 | "circulatory_collapse_imminent": "Colapso circulatório iminente" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Percepção de Desconforto de Thoms", 148 | "state": { 149 | "no_discomfort": "Sem desconforto", 150 | "less_than_half": "Menos de metade da população sente desconforto", 151 | "more_than_half": "Mais de metade da população sente desconforto", 152 | "most": " maioria dos indivíduos sente desconforto e deterioração da condição física e psicológica", 153 | "everyone": "Todo mundo sente um importante desconforto", 154 | "dangerous": "Perigoso, desconforto muito forte que pode causar insolações" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Sensor de temperatura não encontrado", 5 | "humidity_not_found": "Sensor de humidade não encontrado" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Definições de Conforto Térmico", 10 | "data": { 11 | "temperature_sensor": "Sensor de Temperatura", 12 | "humidity_sensor": "Sensor de Humidade", 13 | "poll": "Ativar Atualização", 14 | "scan_interval": "Intervalo de atualização (segundos)", 15 | "custom_icons": "Usar ícones personalizados" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Esta combinação de sensores de humidade e temperatura já está configurada.", 23 | "no_sensors": "Não foram encontrados sensores de humidade e/ou temperatura. Tente de novo no modo avançado.", 24 | "no_sensors_advanced": "Não foram encontrados sensores de humidade e/ou temperatura." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Sensor de temperatura não encontrado", 28 | "humidity_not_found": "Sensor de humidade não encontrado" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Definições de Conforto Térmico", 33 | "data": { 34 | "name": "Nome", 35 | "temperature_sensor": "Sensor de Temperatura", 36 | "humidity_sensor": "Sensor de Humidade", 37 | "poll": "Ativar Atualização", 38 | "scan_interval": "Intervalo de atualização (segundos)", 39 | "custom_icons": "Usar ícones personalizados", 40 | "enabled_sensors": "Sensores ligados" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Humidade absoluta" 49 | }, 50 | "dew_point": { 51 | "name": "Ponto de orvalho" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Percepção do ponto de orvalho", 55 | "state": { 56 | "dry": "Um pouco seco para alguns", 57 | "very_comfortable": "Muito confortável", 58 | "comfortable": "Confortável", 59 | "ok_but_humid": "Confortável para a maioria, mas húmido", 60 | "somewhat_uncomfortable": "Um pouco desconfortável", 61 | "quite_uncomfortable": "Muito húmido e bastante desconfortável", 62 | "extremely_uncomfortable": "Extremamente desconfortável, opressivo", 63 | "severely_high": "Extremamente alto, até mortal para doenças relacionadas com asma" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Ponto de congelamento" 68 | }, 69 | "frost_risk": { 70 | "name": "Risco de congelamento", 71 | "state": { 72 | "no_risk": "Sem risco", 73 | "unlikely": "Improvável", 74 | "probable": "Provável", 75 | "high": "Alta probabilidade" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Índice de calor" 80 | }, 81 | "humidex": { 82 | "name": "Índice de Humidade (humidex)" 83 | }, 84 | "humidex_perception": { 85 | "name": "Percepção ao Índice de Humidade", 86 | "state": { 87 | "comfortable": "Confortável", 88 | "noticable_discomfort": "Algum desconforto", 89 | "evident_discomfort": "Desconforto evidente", 90 | "great_discomfort": "Grande desconforto, evitar esforços", 91 | "dangerous_discomfort": "Desconforto perigoso", 92 | "heat_stroke": "Posibilidade de insolação" 93 | } 94 | }, 95 | "relative_strain_perception": { 96 | "state": { 97 | "outside_calculable_range": "Fora do intervalo de cálculo", 98 | "comfortable": "Confortável", 99 | "slight_discomfort": "Ligeiro desconforto", 100 | "discomfort": "Desconforto", 101 | "significant_discomfort": "Desconforto significativo", 102 | "extreme_discomfort": "Extremo desconforto" 103 | } 104 | }, 105 | "summer_scharlau_perception": { 106 | "state": { 107 | "outside_calculable_range": "Fora do intervalo de cálculo", 108 | "comfortable": "Confortável", 109 | "slightly_uncomfortable": "Ligeiramente desconfortável", 110 | "moderately_uncomfortable": "Desconforto moderado", 111 | "highly_uncomfortable": "Muito desconfortável" 112 | } 113 | }, 114 | "winter_scharlau_perception": { 115 | "state": { 116 | "outside_calculable_range": "Fora do intervalo de cálculo", 117 | "comfortable": "Confortável", 118 | "slightly_uncomfortable": "Ligeiramente desconfortável", 119 | "moderately_uncomfortable": "Desconforto moderado", 120 | "highly_uncomfortable": "Muito desconfortável" 121 | } 122 | }, 123 | "summer_simmer_perception": { 124 | "state": { 125 | "cool": "Frio", 126 | "slightly_cool": "Ligeiramente fresco", 127 | "comfortable": "Confortável", 128 | "slightly_warm": "Ligeiramente quente", 129 | "increasing_discomfort": "Desconforto crescente", 130 | "extremely_warm": "Extremamente quente", 131 | "danger_of_heatstroke": "Perigo de insolação", 132 | "extreme_danger_of_heatstroke": "Perigo extremo de insolação", 133 | "circulatory_collapse_imminent": "Colapso circulatório eminente" 134 | } 135 | }, 136 | "thoms_discomfort_perception": { 137 | "state": { 138 | "no_discomfort": "Sem desconforto", 139 | "less_than_half": "Menos de metade da população sente desconforto", 140 | "more_than_half": "Mais de metade da população sente desconforto", 141 | "most": "A maioria dos indivíduos sente desconforto e deterioração da condição psíquica e física", 142 | "everyone": "Todos sentem desconforto significativo", 143 | "dangerous": "Perigoso, desconforto muito forte que pode causar insolações" 144 | } 145 | } 146 | } 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/ro.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Senzorul de temperatură nu a fost găsit", 5 | "humidity_not_found": "Senzorul de umiditate nu a fost găsit" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Setări de confort termic", 10 | "data": { 11 | "temperature_sensor": "Senzor de temperatura", 12 | "humidity_sensor": "Senzor de umiditate", 13 | "poll": "Activați sondajul", 14 | "scan_interval": "Interval de sondaj (secunde)", 15 | "custom_icons": "Utilizați pachetul de pictograme personalizate" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Această combinație de senzori de temperatură și umiditate este deja configurată", 23 | "no_sensors": "Nu s-au găsit senzori de temperatură sau umiditate. Încercați din nou în modul avansat.", 24 | "no_sensors_advanced": "Nu s-au găsit senzori de temperatură sau umiditate." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Senzorul de temperatură nu a fost găsit", 28 | "humidity_not_found": "Senzorul de umiditate nu a fost găsit" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Setări de confort termic", 33 | "data": { 34 | "name": "Nume", 35 | "temperature_sensor": "Senzor de temperatura", 36 | "humidity_sensor": "Senzor de umiditate", 37 | "poll": "Activați sondajul", 38 | "scan_interval": "Interval de sondaj (secunde)", 39 | "custom_icons": "Utilizați pachetul de pictograme personalizate", 40 | "enabled_sensors": "Senzori activați" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Umiditate absolută" 49 | }, 50 | "dew_point": { 51 | "name": "Punct de rouă" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Punct de rouă perceput", 55 | "state": { 56 | "dry": "Cam uscat pentru unii", 57 | "very_comfortable": "Foarte confortabil", 58 | "comfortable": "Confortabil", 59 | "ok_but_humid": "OK pentru majoritatea, dar umed", 60 | "somewhat_uncomfortable": "Oarecum inconfortabil", 61 | "quite_uncomfortable": "Foarte umed, destul de inconfortabil", 62 | "extremely_uncomfortable": "Extrem de inconfortabil, opresiv", 63 | "severely_high": "Sever ridicat, chiar mortal pentru bolile legate de astm" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Punct de îngheț" 68 | }, 69 | "frost_risk": { 70 | "name": "Risc de îngheț", 71 | "state": { 72 | "no_risk": "Niciun risc", 73 | "unlikely": "Improbabil", 74 | "probable": "Probabil", 75 | "high": "Probabilitate mare" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Indice termic" 80 | }, 81 | "humidex": { 82 | "name": "Indice de umezeală" 83 | }, 84 | "humidex_perception": { 85 | "name": "Indice de umezeală perceput", 86 | "state": { 87 | "comfortable": "Confortabil", 88 | "noticable_discomfort": "Disconfort perceptibil", 89 | "evident_discomfort": "Disconfort evident", 90 | "great_discomfort": "Disconfort mare, evitați eforturile", 91 | "dangerous_discomfort": "Disconfort periculos", 92 | "heat_stroke": "Posibil accident vascular cerebral cauzat de căldură excesivă" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Entalpia aerului umed" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Discomfort termic", 100 | "state": { 101 | "outside_calculable_range": "În afara intervalului calculabil", 102 | "comfortable": "Confortabil", 103 | "slight_discomfort": "Ușor disconfort", 104 | "discomfort": "Disconfort", 105 | "significant_discomfort": "Disconfort semnificativ", 106 | "extreme_discomfort": "Disconfort extrem" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Percepție Scharlau (Vara)", 111 | "state": { 112 | "outside_calculable_range": "În afara intervalului calculabil", 113 | "comfortable": "Confortabil", 114 | "slightly_uncomfortable": "Ușor inconfortabil", 115 | "moderately_uncomfortable": "Moderat inconfortabil", 116 | "highly_uncomfortable": "Foarte inconfortabil" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Percepție Scharlau (Iarna)", 121 | "state": { 122 | "outside_calculable_range": "În afara intervalului calculabil", 123 | "comfortable": "Confortabil", 124 | "slightly_uncomfortable": "Ușor inconfortabil", 125 | "moderately_uncomfortable": "Moderat inconfortabil", 126 | "highly_uncomfortable": "Foarte inconfortabil" 127 | } 128 | }, 129 | "summer_simmer_perception": { 130 | "name": "Discomfort termic (Vara)", 131 | "state": { 132 | "cool": "Rece", 133 | "slightly_cool": "Ușor rece", 134 | "comfortable": "Confortabil", 135 | "slightly_warm": "Ușor cald", 136 | "increasing_discomfort": "Creșterea disconfortului", 137 | "extremely_warm": "Extrem de cald", 138 | "danger_of_heatstroke": "Pericol de insolație", 139 | "extreme_danger_of_heatstroke": "Pericol extrem de insolație", 140 | "circulatory_collapse_imminent": "Colapsul circulator iminent" 141 | } 142 | }, 143 | "thoms_discomfort_perception": { 144 | "name": "Percepție Thoms", 145 | "state": { 146 | "no_discomfort": "Niciun disconfort", 147 | "less_than_half": "Mai puțin de jumătate din populație simte disconfort", 148 | "more_than_half": "Mai mult de jumătate din populație simte disconfort", 149 | "most": "Majoritatea persoanelor simt disconfort și deteriorarea condițiilor psihofizice", 150 | "everyone": "Toată lumea simte disconfort semnificativ", 151 | "dangerous": "Disconfort periculos, foarte puternic, care poate provoca epuizare termică" 152 | } 153 | } 154 | } 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Датчик температуры не найден", 5 | "humidity_not_found": "Датчик влажности не найден" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Настройки теплового комфорта", 10 | "data": { 11 | "temperature_sensor": "Датчик температуры", 12 | "humidity_sensor": "Датчик влажности", 13 | "poll": "Включить опрос датчиков", 14 | "scan_interval": "Интервал опроса (секунды)", 15 | "custom_icons": "Использовать иконки от интеграции (требуется установка Thermal Comfort Icons)" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Эта комбинация датчиков температуры и влажности уже настроена.", 23 | "no_sensors": "Не найдено ни одного подходящего датчика температуры или влажности. Попробуйте настройку в Расширеном режиме.", 24 | "no_sensors_advanced": "Не найдено ни одного датчика температуры или влажности." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Датчик температуры не найден", 28 | "humidity_not_found": "Датчик влажности не найден" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Настройки теплового комфорта", 33 | "data": { 34 | "name": "Название", 35 | "temperature_sensor": "Датчик температуры", 36 | "humidity_sensor": "Датчик влажности", 37 | "poll": "Включить опрос датчиков", 38 | "scan_interval": "Интервал опроса (секунды)", 39 | "custom_icons": "Использовать иконки от интеграции (требуется установка Thermal Comfort Icons)", 40 | "enabled_sensors": "Активировать следующие датчики" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Абсолютная влажность" 49 | }, 50 | "dew_point": { 51 | "name": "Точка росы" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Ощущение точки росы", 55 | "state": { 56 | "dry": "Сухо", 57 | "very_comfortable": "Очень комфортно", 58 | "comfortable": "Комфортно", 59 | "ok_but_humid": "Нормально, но сыровато", 60 | "somewhat_uncomfortable": "Слегка некомфортно", 61 | "quite_uncomfortable": "Довольно влажно, некомфортно", 62 | "extremely_uncomfortable": "Очень влажно, угнетающе", 63 | "severely_high": "Очень высокая влажность, опасно для астматиков" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Точка замерзания" 68 | }, 69 | "frost_risk": { 70 | "name": "Риск заморозков", 71 | "state": { 72 | "no_risk": "Не опасно", 73 | "unlikely": "Маловероятно", 74 | "probable": "Вероятно", 75 | "high": "Очень вероятно" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Индекс тепла" 80 | }, 81 | "humidex": { 82 | "name": "Индекс температуры и влажности" 83 | }, 84 | "humidex_perception": { 85 | "name": "Восприятие температуры и влажности", 86 | "state": { 87 | "comfortable": "Комфортно", 88 | "noticable_discomfort": "Заметный дискомфорт", 89 | "evident_discomfort": "Дискомфотно", 90 | "great_discomfort": "Серьезный дискомфорт, избегайте физических нагрузок", 91 | "dangerous_discomfort": "Опасный дискомфорт", 92 | "heat_stroke": "Возможен тепловой удар" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Энтальпия влажного воздуха" 97 | }, 98 | "relative_strain_perception": { 99 | "state": { 100 | "outside_calculable_range": "Значения датчиков вне допустимого диапазона", 101 | "comfortable": "Комфортно", 102 | "slight_discomfort": "Слегка некомфортно", 103 | "discomfort": "Некомфортно", 104 | "significant_discomfort": "Очень некомфортно", 105 | "extreme_discomfort": "Черезвычайно некомфортно" 106 | } 107 | }, 108 | "summer_scharlau_perception": { 109 | "name": "Индекс летнего Шарлау", 110 | "state": { 111 | "outside_calculable_range": "Значения датчиков вне допустимого диапазона", 112 | "comfortable": "Комфортно", 113 | "slightly_uncomfortable": "Слегка некомфортно", 114 | "moderately_uncomfortable": "Некомфортно", 115 | "highly_uncomfortable": "Очень некомфортно" 116 | } 117 | }, 118 | "winter_scharlau_perception": { 119 | "name": "Зимний индекс Шарлау", 120 | "state": { 121 | "outside_calculable_range": "Значения датчиков вне допустимого диапазона", 122 | "comfortable": "Комфортно", 123 | "slightly_uncomfortable": "Слегка некомфортно", 124 | "moderately_uncomfortable": "Некомфортно", 125 | "highly_uncomfortable": "Очень некомфортно" 126 | } 127 | }, 128 | "summer_simmer_index": { 129 | "name": "Индекс летнего стресса" 130 | }, 131 | "summer_simmer_perception": { 132 | "name": "Восприятие летнего дискомфорта", 133 | "state": { 134 | "cool": "Холодно", 135 | "slightly_cool": "Прохладно", 136 | "comfortable": "Комфортно", 137 | "slightly_warm": "Тепло", 138 | "increasing_discomfort": "Жарко", 139 | "extremely_warm": "Очень жарко", 140 | "danger_of_heatstroke": "Риск теплового удара", 141 | "extreme_danger_of_heatstroke": "Серьёзный риск теплового удара", 142 | "circulatory_collapse_imminent": "Возможны сосудистые нарушения" 143 | } 144 | }, 145 | "thoms_discomfort_perception": { 146 | "name": "Индекс дискомфорта Тома", 147 | "state": { 148 | "no_discomfort": "Нет дискомфорта", 149 | "less_than_half": "Менее половины населения испытывает дискомфорт", 150 | "more_than_half": "Больше половины населения испытывает дискомфорт", 151 | "most": "Большинство испытывает дискомфорт и ухудшение психофизического состояния", 152 | "everyone": "Все испытывают существенный дискомфорт", 153 | "dangerous": "Опасно, очень сильный дискомфорт, который может вызвать тепловой удар" 154 | } 155 | } 156 | } 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/sensor.et.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "_": { 4 | "dry": "Natuke liiga kuiv", 5 | "very_comfortable": "Väga mugav :-)", 6 | "comfortable": "Mugav", 7 | "ok_but_humid": "Talutav kuid veidi niiske", 8 | "somewhat_uncomfortable": "Veidi ebamugav", 9 | "quite_uncomfortable": "Väga niiske ja ebamugav", 10 | "extremely_uncomfortable": "Ülimalt ebamugav ja rõhuv niiskus", 11 | "severely_high": "Ülikõrge niiskus, ohtlik astmaatikutele" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/sk.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Teplotný snímač nenájdený", 5 | "humidity_not_found": "Snímač vlhkosti nenájdený" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "Nastavenia tepelnej pohody", 10 | "data": { 11 | "temperature_sensor": "Teplotný snímač", 12 | "humidity_sensor": "Snímač vlhkosti", 13 | "poll": "Povoliť dotazovanie", 14 | "scan_interval": "Interval dotazovania (sekundy)", 15 | "custom_icons": "Používanie vlastného balíka ikon" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "Táto kombinácia snímačov teploty a vlhkosti je už nakonfigurovaná", 23 | "no_sensors": "Nenašli sa žiadne snímače teploty alebo vlhkosti. Skúste to znova v rozšírenom režime.", 24 | "no_sensors_advanced": "Nenašli sa žiadne snímače teploty alebo vlhkosti." 25 | }, 26 | "error": { 27 | "temperature_not_found": "Teplotný snímač nenájdený", 28 | "humidity_not_found": "Snímač vlhkosti nenájdený" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "Nastavenia tepelnej pohody", 33 | "data": { 34 | "name": "Názov", 35 | "temperature_sensor": "Teplotný snímač", 36 | "humidity_sensor": "Snímač vlhkosti", 37 | "poll": "Povoliť dotazovanie", 38 | "scan_interval": "Interval dotazovania (sekundy)", 39 | "custom_icons": "Používanie vlastného balíka ikon", 40 | "enabled_sensors": "Povolené senzory" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "Absolútna vlhkosť" 49 | }, 50 | "dew_point": { 51 | "name": "Rosný bod" 52 | }, 53 | "dew_point_perception": { 54 | "name": "Rosný bod predpoveď", 55 | "state": { 56 | "dry": "Pre niekoho suché", 57 | "very_comfortable": "Veľmi komfortné", 58 | "comfortable": "Príjemné", 59 | "ok_but_humid": "Pre vǎčšinu OK, ale vlhké", 60 | "somewhat_uncomfortable": "Trochu nepríjemné", 61 | "quite_uncomfortable": "Veľmi vlhké, dosť nepríjemné", 62 | "extremely_uncomfortable": "Extrémne nekomfortné, tiesnivé", 63 | "severely_high": "Veľmi vysoká, pre astmatikov smrteľná vlhkosť" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "Bod mrznutia" 68 | }, 69 | "frost_risk": { 70 | "name": "Riziko zamrznutia", 71 | "state": { 72 | "no_risk": "Žiadne riziko", 73 | "unlikely": "Nepravdepodobné", 74 | "probable": "Pravdepodobné", 75 | "high": "Vysoká pravdepodobnosť" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "Teplotný index" 80 | }, 81 | "humidex": { 82 | "name": "Humidex" 83 | }, 84 | "humidex_perception": { 85 | "name": "Humidex predpoveď", 86 | "state": { 87 | "comfortable": "Príjemne", 88 | "noticable_discomfort": "Znateľné nepohodlie", 89 | "evident_discomfort": "Evidentné nepohodlie", 90 | "great_discomfort": "Veľké nepohodlie, vyhýbajte sa námahe", 91 | "dangerous_discomfort": "Nebezpečné nepohodlie", 92 | "heat_stroke": "Úpal možný" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "Entalpia vlhkého vzduchu" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "Vnímanie relatívnej záťaže", 100 | "state": { 101 | "outside_calculable_range": "Mimo vypočítateľného rozsahu", 102 | "comfortable": "Príjemne", 103 | "slight_discomfort": "Mierne nepohodlie", 104 | "discomfort": "Diskomfort", 105 | "significant_discomfort": "Významný diskomfort", 106 | "extreme_discomfort": "Extrémny discomfort" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "Vnímanie letného scharlau", 111 | "state": { 112 | "outside_calculable_range": "Mimo vypočítateľného rozsahu", 113 | "comfortable": "Príjemne", 114 | "slightly_uncomfortable": "Mierny diskomfort", 115 | "moderately_uncomfortable": "Stredne nepríjemné", 116 | "highly_uncomfortable": "Veľmi nepríjemné" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "Zimné vnímanie scharlau", 121 | "state": { 122 | "outside_calculable_range": "Mimo vypočítateľného rozsahu", 123 | "comfortable": "Príjemne", 124 | "slightly_uncomfortable": "Mierny diskomfort", 125 | "moderately_uncomfortable": "Stredne nepríjemné", 126 | "highly_uncomfortable": "Veľmi nepríjemné" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "Letný Simmer index" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "Vnímanie letného varu", 134 | "state": { 135 | "cool": "Chladno", 136 | "slightly_cool": "Mierne chladno", 137 | "comfortable": "Príjemne", 138 | "slightly_warm": "Mierne teplo", 139 | "increasing_discomfort": "Stupňujúce sa nepohodlie", 140 | "extremely_warm": "Extrémne teplo", 141 | "danger_of_heatstroke": "Nebezpečenstvo úpalu", 142 | "extreme_danger_of_heatstroke": "Extrémne nebezpečenstvo úpalu", 143 | "circulatory_collapse_imminent": "Hroziaci kolaps krvného obehu" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "Vnímanie nepohodlia podľa Thoma", 148 | "state": { 149 | "no_discomfort": "Žiadne nepohodlie", 150 | "less_than_half": "Menej ako polovica populácie pociťuje nepríjemné pocity", 151 | "more_than_half": "Viac ako polovica populácie pociťuje nepohodlie", 152 | "most": "Väčšina jednotlivcov pociťuje nepohodlie a zhoršenie psychofyzických podmienok", 153 | "everyone": "Každý pociťuje výrazné nepohodlie", 154 | "dangerous": "Nebezpečné, veľmi silné nepohodlie, ktoré môže spôsobiť úpal" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "Temperatursensor hittas inte", 5 | "humidity_not_found": "Fuktsensor hittas inte" 6 | }, 7 | "step": { 8 | "init": { 9 | "data": { 10 | "temperature_sensor": "Temperatursensor", 11 | "humidity_sensor": "Fuktighetssensor", 12 | "poll": "Aktivera polling", 13 | "scan_interval": "Poll intervall (sekunder)" 14 | } 15 | } 16 | } 17 | }, 18 | "config": { 19 | "abort": { 20 | "no_sensors": "Ingen temperatur eller fuktighetssensor hittad. Försök igen i avancerat läge.", 21 | "no_sensors_advanced": "Ingen temperatur eller fuktighetssensor hittad." 22 | }, 23 | "error": { 24 | "temperature_not_found": "Temperatursensor hittat inte", 25 | "humidity_not_found": "Fuktighetssensor hittas inte" 26 | }, 27 | "step": { 28 | "user": { 29 | "data": { 30 | "name": "Namn", 31 | "temperature_sensor": "Temperatursensor", 32 | "humidity_sensor": "Fuktighetssensor", 33 | "poll": "Aktivera polling", 34 | "scan_interval": "Poll intervall (sekunder)", 35 | "enabled_sensors": "Aktivera sensorer" 36 | } 37 | } 38 | } 39 | }, 40 | "entity": { 41 | "sensor": { 42 | "absolute_humidity": { 43 | "name": "Absolut fuktighet" 44 | }, 45 | "dew_point": { 46 | "name": "Dagg punkt" 47 | }, 48 | "dew_point_perception": { 49 | "state": { 50 | "dry": "Lite torrt", 51 | "very_comfortable": "Väldigt bekväm", 52 | "comfortable": "Bekvämt", 53 | "ok_but_humid": "Ok, något fuktigt", 54 | "somewhat_uncomfortable": "Något obekvämt", 55 | "quite_uncomfortable": "Väldigt fuktigt, ganska obekvämt", 56 | "extremely_uncomfortable": "Tryckande, extremt obekvämt", 57 | "severely_high": "Allvarligt högt, kan vara dödlig för astmarelaterade sjukdomar" 58 | } 59 | }, 60 | "frost_risk": { 61 | "name": "Frost risk", 62 | "state": { 63 | "no_risk": "Ingen risk", 64 | "unlikely": "Osannolikt", 65 | "probable": "Sannolikt", 66 | "high": "Stor risk" 67 | } 68 | }, 69 | "heat_index": { 70 | "name": "Värme index" 71 | }, 72 | "humidex": { 73 | "name": "Fuktighetsindex" 74 | }, 75 | "humidex_perception": { 76 | "state": { 77 | "comfortable": "Komfortabel", 78 | "noticable_discomfort": "Märkbart obehagligt", 79 | "evident_discomfort": "Tydligt obehag", 80 | "dangerous_discomfort": "Farligt obehagligt", 81 | "heat_stroke": "Värmeslag möjligt" 82 | } 83 | }, 84 | "relative_strain_perception": { 85 | "state": { 86 | "comfortable": "Komfortabel", 87 | "slight_discomfort": "Lätt obehag", 88 | "discomfort": "Obehag", 89 | "extreme_discomfort": "Extremt obehag" 90 | } 91 | }, 92 | "summer_simmer_perception": { 93 | "state": { 94 | "cool": "Svalt", 95 | "slightly_cool": "Ganska svalt", 96 | "comfortable": "Bekvämt", 97 | "slightly_warm": "Ganska varmt", 98 | "increasing_discomfort": "Börjar bli obekvämt", 99 | "extremely_warm": "Extremt varmt", 100 | "danger_of_heatstroke": "Risk för värmeslag", 101 | "extreme_danger_of_heatstroke": "Extrem risk för värmeslag", 102 | "circulatory_collapse_imminent": "Allvarlig fara för kollaps" 103 | } 104 | } 105 | } 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/uk.json: -------------------------------------------------------------------------------- 1 | { 2 | "entity": { 3 | "sensor": { 4 | "dew_point_perception": { 5 | "state": { 6 | "dry": "Сухо", 7 | "very_comfortable": "Дуже комфортно", 8 | "comfortable": "Комфортно", 9 | "ok_but_humid": "Нормально, але волого", 10 | "somewhat_uncomfortable": "Трохи некомфортно", 11 | "quite_uncomfortable": "Досить волого, некомфортно", 12 | "extremely_uncomfortable": "Дуже волого, гнітюче", 13 | "severely_high": "Дуже висока вологість, може бути смертельною для для астматиків" 14 | } 15 | }, 16 | "frost_risk": { 17 | "state": { 18 | "no_risk": "Безпечно", 19 | "unlikely": "Малоймовірно", 20 | "probable": "Ймовірно", 21 | "high": "Висока ймовірність" 22 | } 23 | }, 24 | "summer_simmer_perception": { 25 | "state": { 26 | "cool": "Холодно", 27 | "slightly_cool": "Прохолодно", 28 | "comfortable": "Комфортно", 29 | "slightly_warm": "Тепло", 30 | "increasing_discomfort": "Жарко", 31 | "extremely_warm": "Дуже жарко", 32 | "danger_of_heatstroke": "Ризик теплового удару", 33 | "extreme_danger_of_heatstroke": "Серйозний ризик теплового удару", 34 | "circulatory_collapse_imminent": "Можливі судинні розлади" 35 | } 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/ur.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "درجہ حرارت کا سینسر نہیں ملا", 5 | "humidity_not_found": "نمی کا سینسر نہیں ملا" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "تھرمل آرام کی ترتیبات", 10 | "data": { 11 | "temperature_sensor": "درجہ حرارت کا سینسر", 12 | "humidity_sensor": "نمی کا سینسر", 13 | "poll": "پولنگ کو فعال کریں۔", 14 | "scan_interval": "پول کا وقفہ (سیکنڈ)", 15 | "custom_icons": "اپنی مرضی کے مطابق آئیکون پیک استعمال کریں۔" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "درجہ حرارت اور نمی کے سینسرز کا یہ امتزاج پہلے سے ہی ترتیب دیا گیا ہے۔", 23 | "no_sensors": "درجہ حرارت یا نمی کے کوئی سینسر نہیں ملے۔ ایڈوانس موڈ میں دوبارہ کوشش کریں۔", 24 | "no_sensors_advanced": "درجہ حرارت یا نمی کے کوئی سینسر نہیں ملے۔" 25 | }, 26 | "error": { 27 | "temperature_not_found": "درجہ حرارت کا سینسر نہیں ملا", 28 | "humidity_not_found": "نمی کا سینسر نہیں ملا" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "تھرمل سکون کی ترتیبات", 33 | "data": { 34 | "name": "نام", 35 | "temperature_sensor": "درجہ حرارت سینسر", 36 | "humidity_sensor": "نمی کا سینسر", 37 | "poll": "پولنگ کو فعال کریں۔", 38 | "scan_interval": "رائے شماری کا وقفہ (سیکنڈز)", 39 | "custom_icons": "اپنی مرضی کے مطابق آئیکون پیک استعمال کریں۔", 40 | "enabled_sensors": "فعال سینسرز" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "absolute_humidity": { 48 | "name": "مطلق نمی" 49 | }, 50 | "dew_point": { 51 | "name": "شبنم کا نقطہ" 52 | }, 53 | "dew_point_perception": { 54 | "name": "اوس پوائنٹ کا ادراک", 55 | "state": { 56 | "dry": "کچھ کے لیے تھوڑا سا خشک", 57 | "very_comfortable": "بہت آرام دہ ہے۔", 58 | "comfortable": "آرام دہ ہے۔", 59 | "ok_but_humid": "زیادہ تر کے لیے ٹھیک ہے، لیکن مرطوب ہے۔", 60 | "somewhat_uncomfortable": "کچھ غیر آرام دہ", 61 | "quite_uncomfortable": "بہت مرطوب، کافی غیر آرام دہ", 62 | "extremely_uncomfortable": "انتہائی غیر آرام دہ، جابرانہ", 63 | "severely_high": "بہت زیادہ، یہاں تک کہ دمہ سے متعلق بیماریوں کے لیے جان لیوا بھی" 64 | } 65 | }, 66 | "frost_point": { 67 | "name": "ٹھنڈ کا نقطہ" 68 | }, 69 | "frost_risk": { 70 | "name": "ٹھنڈ کا خطرہ ۔", 71 | "state": { 72 | "no_risk": "کوئی خطرہ نہیں ہے۔", 73 | "unlikely": "امکان نہیں ہے۔", 74 | "probable": "ممکنہ", 75 | "high": "زیادہ امکان" 76 | } 77 | }, 78 | "heat_index": { 79 | "name": "حرارت کا اشاریہ" 80 | }, 81 | "humidex": { 82 | "name": "ہیومیڈیکس" 83 | }, 84 | "humidex_perception": { 85 | "name": "Humidex تاثر", 86 | "state": { 87 | "comfortable": "آرام دہ ہے۔", 88 | "noticable_discomfort": "نمایاں تکلیف", 89 | "evident_discomfort": "واضح تکلیف", 90 | "great_discomfort": "بڑی تکلیف، مشقت سے گریز کریں۔", 91 | "dangerous_discomfort": "خطرناک تکلیف ۔", 92 | "heat_stroke": "ہیٹ سٹروک کا امکان ہے۔" 93 | } 94 | }, 95 | "moist_air_enthalpy": { 96 | "name": "نم ہوا انتھالپی" 97 | }, 98 | "relative_strain_perception": { 99 | "name": "رشتہ دار تناؤ کا ادراک", 100 | "state": { 101 | "outside_calculable_range": "Outside of the calculable range", 102 | "comfortable": "آرام دہ ہے۔", 103 | "slight_discomfort": "ہلکی سی تکلیف", 104 | "discomfort": "بے آرامی", 105 | "significant_discomfort": "نمایاں تکلیف", 106 | "extreme_discomfort": "شدید تکلیف" 107 | } 108 | }, 109 | "summer_scharlau_perception": { 110 | "name": "سمر Scharlau خیال", 111 | "state": { 112 | "outside_calculable_range": "قابل حساب حد سے باہر", 113 | "comfortable": "آرام دہ ہے۔", 114 | "slightly_uncomfortable": "قدرے غیر آرام دہ", 115 | "moderately_uncomfortable": "اعتدال پسند غیر آرام دہ", 116 | "highly_uncomfortable": "انتہائی غیر آرام دہ" 117 | } 118 | }, 119 | "winter_scharlau_perception": { 120 | "name": "موسم سرما کے Scharlau تاثر", 121 | "state": { 122 | "outside_calculable_range": "قابل حساب حد سے باہر", 123 | "comfortable": "آرام دہ", 124 | "slightly_uncomfortable": "قدرے غیر آرام دہ", 125 | "moderately_uncomfortable": "اعتدال پسند غیر آرام دہ", 126 | "highly_uncomfortable": "انتہائی غیر آرام دہ" 127 | } 128 | }, 129 | "summer_simmer_index": { 130 | "name": "موسم گرما سمر اشاریہ" 131 | }, 132 | "summer_simmer_perception": { 133 | "name": "موسم گرما میں سمر تاثر", 134 | "state": { 135 | "cool": "ٹھنڈا", 136 | "slightly_cool": "تھوڑا سا ٹھنڈا", 137 | "comfortable": "آرام دہ", 138 | "slightly_warm": "قدرے گرم", 139 | "increasing_discomfort": "بڑھتی ہوئی تکلیف", 140 | "extremely_warm": "انتہائی گرم", 141 | "danger_of_heatstroke": "ہیٹ اسٹروک کا خطرہ", 142 | "extreme_danger_of_heatstroke": "ہیٹ اسٹروک کا انتہائی خطرہ", 143 | "circulatory_collapse_imminent": "گردش کا خاتمہ آسنن ہے۔" 144 | } 145 | }, 146 | "thoms_discomfort_perception": { 147 | "name": "تھامس کی تکلیف کا تاثر", 148 | "state": { 149 | "no_discomfort": "کوئی تکلیف نہیں۔", 150 | "less_than_half": "آبادی کا نصف سے بھی کم حصہ تکلیف محسوس کرتا ہے۔", 151 | "more_than_half": "نصف سے زیادہ آبادی تکلیف محسوس کرتی ہے۔", 152 | "most": "زیادہ تر افراد تکلیف اور نفسیاتی حالات کی خرابی محسوس کرتے ہیں۔", 153 | "everyone": "ہر ایک کو نمایاں تکلیف محسوس ہوتی ہے۔", 154 | "dangerous": "خطرناک، بہت مضبوط تکلیف جو ہیٹ سٹروک کا سبب بن سکتی ہے۔" 155 | } 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /custom_components/thermal_comfort/translations/zh-Hans.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": { 3 | "error": { 4 | "temperature_not_found": "未找到温度传感器", 5 | "humidity_not_found": "未找到湿度传感器" 6 | }, 7 | "step": { 8 | "init": { 9 | "title": "热舒适设置", 10 | "data": { 11 | "temperature_sensor": "温度传感器", 12 | "humidity_sensor": "湿度传感器", 13 | "poll": "启用轮询", 14 | "scan_interval": "轮询间隔(秒)", 15 | "custom_icons": "使用自定义图标包" 16 | } 17 | } 18 | } 19 | }, 20 | "config": { 21 | "abort": { 22 | "already_configured": "此温度和湿度传感器组合已配置", 23 | "no_sensors": "未找到温度或湿度传感器。请在高级模式下重试。", 24 | "no_sensors_advanced": "未找到温度或湿度传感器。" 25 | }, 26 | "error": { 27 | "temperature_not_found": "未找到温度传感器", 28 | "humidity_not_found": "未找到湿度传感器" 29 | }, 30 | "step": { 31 | "user": { 32 | "title": "热舒适设置", 33 | "data": { 34 | "name": "名称", 35 | "temperature_sensor": "温度传感器", 36 | "humidity_sensor": "湿度传感器", 37 | "poll": "启用轮询", 38 | "scan_interval": "轮询间隔(秒)", 39 | "custom_icons": "使用自定义图标包", 40 | "enabled_sensors": "已启用的传感器" 41 | } 42 | } 43 | } 44 | }, 45 | "entity": { 46 | "sensor": { 47 | "dew_point_perception": { 48 | "state": { 49 | "dry": "有点干燥", 50 | "very_comfortable": "非常舒适", 51 | "comfortable": "舒适", 52 | "ok_but_humid": "对大多数人来说还可以,但湿度较高", 53 | "somewhat_uncomfortable": "有些不舒服", 54 | "quite_uncomfortable": "非常潮湿,相当不舒服", 55 | "extremely_uncomfortable": "极其不舒服,令人压抑", 56 | "severely_high": "极高,对哮喘等疾病有致命风险" 57 | } 58 | }, 59 | "frost_risk": { 60 | "state": { 61 | "no_risk": "无风险", 62 | "unlikely": "风险较小", 63 | "probable": "风险较大", 64 | "high": "大概率" 65 | } 66 | }, 67 | "humidex_perception": { 68 | "state": { 69 | "comfortable": "舒适", 70 | "noticable_discomfort": "明显不适", 71 | "evident_discomfort": "明显不适", 72 | "great_discomfort": "极度不适,请避免运动", 73 | "dangerous_discomfort": "不适且危险", 74 | "heat_stroke": "可能发生中暑" 75 | } 76 | }, 77 | "relative_strain_perception": { 78 | "state": { 79 | "outside_calculable_range": "超出可计算范围", 80 | "comfortable": "舒适", 81 | "slight_discomfort": "轻微不适", 82 | "discomfort": "不适", 83 | "significant_discomfort": "明显不适", 84 | "extreme_discomfort": "极度不适" 85 | } 86 | }, 87 | "summer_scharlau_perception": { 88 | "state": { 89 | "outside_calculable_range": "超出可计算范围", 90 | "comfortable": "舒适", 91 | "slightly_uncomfortable": "稍微不舒服", 92 | "moderately_uncomfortable": "相当不舒服", 93 | "highly_uncomfortable": "极不舒服" 94 | } 95 | }, 96 | "winter_scharlau_perception": { 97 | "state": { 98 | "outside_calculable_range": "超出可计算范围", 99 | "comfortable": "舒适", 100 | "slightly_uncomfortable": "稍微不舒服", 101 | "moderately_uncomfortable": "相当不舒服", 102 | "highly_uncomfortable": "极不舒服" 103 | } 104 | }, 105 | "summer_simmer_perception": { 106 | "state": { 107 | "cool": "凉爽", 108 | "slightly_cool": "稍微凉爽", 109 | "comfortable": "舒适", 110 | "slightly_warm": "稍微温暖", 111 | "increasing_discomfort": "不适感增加", 112 | "extremely_warm": "极度温暖", 113 | "danger_of_heatstroke": "有中暑的危险", 114 | "extreme_danger_of_heatstroke": "极度中暑的危险", 115 | "circulatory_collapse_imminent": "循环系统即将崩溃" 116 | } 117 | }, 118 | "thoms_discomfort_perception": { 119 | "state": { 120 | "no_discomfort": "无不适", 121 | "less_than_half": "不到一半的人感到不适", 122 | "more_than_half": "超过一半的人感到不适", 123 | "most": "大多数人感到不适", 124 | "everyone": "每个人都感到明显不适", 125 | "dangerous": "危险,可能导致中暑" 126 | } 127 | } 128 | } 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /documentation/config_flow.md: -------------------------------------------------------------------------------- 1 | # Initial Configuration 2 | ## In your Home Assistant UI go to "Configuration", then click "Devices & Services" 3 | 4 | ![Config Dashboard](https://raw.githubusercontent.com/dolezsa/thermal_comfort/master/screenshots/config_dashboard.png) 5 | 6 | ## Make sure Integrations is selected and click the "+" button in the bottom right corner 7 | 8 | ![Config Integrations](https://raw.githubusercontent.com/dolezsa/thermal_comfort/master/screenshots/config_integrations.png) 9 | 10 | ## Search for or scroll down to find "Thermal Comfort" and select it 11 | 12 | ![Config Integrations Search](https://raw.githubusercontent.com/dolezsa/thermal_comfort/master/screenshots/config_integrations_search.png) 13 | 14 | ## Name your virtual device and select the temperature and humidity sensor you want to use 15 | 16 | *Note: Enable [advanced mode](https://www.home-assistant.io/blog/2019/07/17/release-96/#advanced-mode) 17 | in your user profile if you want additional options. 18 | We filter the sensors to include only those who have the correct device class. 19 | If you want to select other make sure to enable 20 | [advanced mode](https://www.home-assistant.io/blog/2019/07/17/release-96/#advanced-mode)* 21 | 22 | ![Config Thermal Comfort](https://raw.githubusercontent.com/dolezsa/thermal_comfort/master/screenshots/config_thermal_comfort.png) 23 | 24 | ## A virtual device is created to manage your calculated sensors 25 | 26 | ![Config Virtual Device](https://raw.githubusercontent.com/dolezsa/thermal_comfort/master/screenshots/config_devices_thermal_comfort.png) 27 | 28 | # Configuration Options 29 | 30 | ## Click configure on the configuration to set additional options 31 | 32 | ![Config Virtual Device](https://raw.githubusercontent.com/dolezsa/thermal_comfort/master/screenshots/config_options_thermal_comfort.png) 33 | 34 |
35 |
Enable Polling boolean
36 |
37 | Enable this if you want the sensors to be polled. This can avoid double 38 | calculated values if your input sensors split change updates for humidity 39 | and temperature. 40 |
41 |
Use custom icons pack boolean
42 |
43 | Enable this if you have the custom icon pack 44 | installed and want to use it as default icons for the sensors 45 |
46 |
47 | -------------------------------------------------------------------------------- /documentation/sensors.md: -------------------------------------------------------------------------------- 1 | # Sensors: 2 | 3 |
4 |
Absolute Humidity absolute_humidity
5 |
6 | Absolute humidity is a measure of the actual amount of water vapor 7 | (moisture) in the air. 8 |
9 |
Heat Index heat_index
10 |
11 | The heat index combines air temperature and relative humidity to posit a 12 | human-perceived equivalent temperature. 13 |
14 |
Humidex + Perception humidex humidex_perception
15 |
16 | The humidex (humidity index) describes how hot the weather feels to an average person as a result of the combined effect of heat and humidity. It is calculated from the dew point. 17 |
18 |
Dew Point + Perception dew_point dew_point_perception
19 |
20 | The dew point is the temperature to which air must be cooled to become 21 | saturated with water vapor and dew forms on surfaces. 22 |
23 |
Frost Point frost_point
24 |
25 | Frost point, temperature, below 0° C (32° F), at which moisture in the air 26 | will condense as a layer of frost on any exposed surface. 27 |
28 |
Frost Risk frost_risk
29 |
30 | Risk of Frost based on current temperature, frost point and absolute humidity. 31 |
32 |
Relative Strain Perception relative_strain_perception
33 |
34 | A measure of discomfort resulting from the combined effect of temperature and humidity. It assumes a person dressed in a light business suit, walking at a moderate pace in a very light air motion. It is applicable to assess heat stress of manual workers under shelter at various metabolic rates. Valid for temperatures between 26 and 35°C (79 to 95°F). 35 |
36 |
Summer Simmer Index + Perception summer_simmer_index summer_simmer_perception
37 |
38 | Provides a proven indicator of heat stress concerns and discomfort using meaningful equivalent temperature values for general public acceptance and awareness. 39 |
40 |
Moist Air Enthalpy moist_air_enthalpy
41 |
42 | The enthalpy of moist air is the sum of the enthalpy of the dry air and the enthalpy of the water vapour. Enthalpy is the total energy of a thermodynamic system. 43 |
44 |
Summer Scharlau Perception summer_scharlau_perception
45 |
46 | The summer Scharlau index describes a bioclimatic thermal comfort when temperature values are higher than 0°C. Valid for temperatures 17° to 39°C (63° to 102°F) and humidity >= 30%. 47 |
48 |
Winter Scharlau Perception winter_scharlau_perception
49 |
50 | Reflects the level of human discomfort caused by cooling. Valid for: temperatures -5 to +6°C (23 to 43°F) and humidity >= 40%. 51 |
52 |
Thoms discomfort Perception thoms_discomfort_perception
53 |
54 | Indicates the level of discomfort as a result of high temperature and the combined effect with relative humidity. 55 |
56 |
57 | -------------------------------------------------------------------------------- /documentation/yaml.md: -------------------------------------------------------------------------------- 1 | # YAML Configuration 2 | 3 | To use, add according to the following example to your `configuration.yaml` file: 4 | 5 | ```yaml 6 | thermal_comfort: 7 | - custom_icons: true # global option for the entry 8 | sensor: 9 | - name: Living Room 10 | temperature_sensor: sensor.temperature_livingroom 11 | humidity_sensor: sensor.humidity_livingroom 12 | custom_icons: false # override entry option for sensor 13 | unique_id: 2f842c63-051a-4c49-9da2-4f04ee677514 14 | - name: Bathroom 15 | poll: true 16 | temperature_sensor: sensor.temperature_bathroom 17 | humidity_sensor: sensor.humidity_bathroom 18 | sensor_types: 19 | - absolute_humidity 20 | - heat_index 21 | - dew_point_perception 22 | unique_id: 11adccb5-5029-4d26-bbec-c1b45910c27c 23 | - name: Bedroom 24 | … 25 | ``` 26 | ### Sensor Configuration Variables 27 | 28 | #### Sensor Options 29 |
30 |
sensor_types list (optional)
31 |
32 | A list of sensors to create. If omitted all will be created. 33 | Available sensors 34 |
35 |
poll boolean (optional, default: false)
36 |
37 | Set to true if you want the sensors to be polled. This can avoid double 38 | calculated values if your input sensors split change updates for humidity 39 | and temperature. 40 |
41 |
scan_interval boolean (optional, default: 30)
42 |
43 | If polling is enabled this sets the interval in seconds. 44 |
45 |
custom_icons boolean (optional, default: false)
46 |
Set to true if you have the custom icon pack 47 | installed and want to use it as default icons for the sensors. 48 |
49 |
50 | 51 | #### Sensor Configuration 52 |
53 |
name string (optional)
54 |
55 | Name of the sensor will be used both for the friendly name and entity id 56 | combined with the sensor type. e.g. Kitchen would get your 57 | `sensor.kitchen_absolutehumidity` and Kichten Absolute Humidity.
58 |
temperature_sensor string REQUIRED
59 |
ID of temperature sensor entity to be used for calculations.
60 |
humidity_sensor string REQUIRED
61 |
ID of humidity sensor entity to be used for calculations..
62 |
icon_template template (optional)
63 |
Defines a template for the icon of the sensor.
64 |
entity_picture_template template (optional)
65 |
Defines a template for the entity picture of the sensor.
66 |
unique_id string REQUIRED
67 |
68 | An ID that uniquely identifies the sensors. Set this to a unique value to 69 | allow customization through the UI. 70 |

Make sure this is a unique value. Home assistant uses this internally and you 71 | will not see it in the frontend. 72 | A good tool to get a unique value is the `uuidgen` command line tool or your can 73 | use a online uuid generator

74 | Internally we add the sensor type name to the unique id you set for each sensor. 75 | e.g. with a unique id of `0ee4d8a7-c610-4afa-855d-0b2c2c265e11` for a absolute humidity 76 | sensor you would get `0ee4d8a7-c610-4afa-855d-0b2c2c265e11absolute_humidity`. 77 |
78 |
79 | -------------------------------------------------------------------------------- /hacs.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Thermal Comfort", 3 | "homeassistant": "2023.12.0", 4 | "render_readme": true, 5 | "filename": "thermal_comfort.zip" 6 | } 7 | -------------------------------------------------------------------------------- /icons/ATTRIBUTION.md: -------------------------------------------------------------------------------- 1 | # Attribution 2 | ## Icon is based on:a 3 | * Material Design Icons: 4 | * https://materialdesignicons.com/icon/weather-sunset-down by Austin Andrews @Templarian 5 | * https://materialdesignicons.com/icon/snowflake by Google -------------------------------------------------------------------------------- /icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/icons/icon.png -------------------------------------------------------------------------------- /icons/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 14 | 32 | 34 | 38 | 39 | -------------------------------------------------------------------------------- /icons/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/icons/icon@2x.png -------------------------------------------------------------------------------- /icons/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/icons/logo.png -------------------------------------------------------------------------------- /icons/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 18 | 39 | 43 | 47 | 50 | 54 | 55 | logo 57 | 59 | 62 | 65 | 72 | 73 | 80 | 83 | 84 | 85 | 87 | 88 | 90 | logo 91 | 92 | 93 | 94 | ThermalComfort 113 | 117 | 118 | -------------------------------------------------------------------------------- /icons/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/icons/logo@2x.png -------------------------------------------------------------------------------- /project.inlang.json: -------------------------------------------------------------------------------- 1 | { 2 | "sourceLanguageTag": "en", 3 | "languageTags": [ 4 | "ca", 5 | "cs", 6 | "da", 7 | "de", 8 | "el", 9 | "en", 10 | "es", 11 | "fr", 12 | "hu", 13 | "it", 14 | "ja", 15 | "nb", 16 | "nl", 17 | "pl", 18 | "pt-BR", 19 | "pt", 20 | "ro", 21 | "ru", 22 | "sk", 23 | "sv", 24 | "uk", 25 | "zh-Hans" 26 | ], 27 | "modules": [ 28 | "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-empty-pattern/dist/index.js", 29 | "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-identical-pattern/dist/index.js", 30 | "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-without-source/dist/index.js", 31 | "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-missing-translation/dist/index.js", 32 | "https://cdn.jsdelivr.net/npm/@inlang/plugin-json@4/dist/index.js" 33 | ], 34 | "settings": { 35 | "plugin.inlang.json": { 36 | "pathPattern": "./custom_components/thermal_comfort/translations/{languageTag}.json", 37 | "ignore": [], 38 | "variableReferencePattern": ["{", "}"] 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /project.inlang/project_id: -------------------------------------------------------------------------------- 1 | 35cba07981a8e77b9e9a81a476d2e77e91b96f83be1956f27b9abd95acc83746 -------------------------------------------------------------------------------- /project.inlang/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://inlang.com/schema/project-settings", 3 | "sourceLanguageTag": "en", 4 | "languageTags": [ 5 | "en", 6 | "ca", 7 | "cs", 8 | "da", 9 | "de", 10 | "el", 11 | "es", 12 | "et", 13 | "fr", 14 | "hu", 15 | "it", 16 | "ja", 17 | "nb", 18 | "nl", 19 | "pl", 20 | "pt", 21 | "pt-BR", 22 | "ro", 23 | "ru", 24 | "sk", 25 | "sv", 26 | "uk", 27 | "ur", 28 | "zh-Hans" 29 | ], 30 | "modules": [ 31 | "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-empty-pattern/dist/index.js", 32 | "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-identical-pattern/dist/index.js", 33 | "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-without-source/dist/index.js", 34 | "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-missing-translation/dist/index.js", 35 | "https://cdn.jsdelivr.net/npm/@inlang/plugin-json@4/dist/index.js" 36 | ], 37 | "plugin.inlang.json": { 38 | "pathPattern": "./custom_components/thermal_comfort/translations/{languageTag}.json", 39 | "ignore": [], 40 | "variableReferencePattern": [ 41 | "{", 42 | "}" 43 | ] 44 | } 45 | } -------------------------------------------------------------------------------- /requirements_test.txt: -------------------------------------------------------------------------------- 1 | # Strictly for tests 2 | pytest-homeassistant-custom-component>=0.13.52 3 | -------------------------------------------------------------------------------- /requirements_test_pre_commit.txt: -------------------------------------------------------------------------------- 1 | black==24.3.0 2 | codespell==2.2.2 3 | ruff==0.0.285 4 | yamllint==1.32.0 5 | -------------------------------------------------------------------------------- /screenshots/absolute_humidity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/absolute_humidity.png -------------------------------------------------------------------------------- /screenshots/config_dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/config_dashboard.png -------------------------------------------------------------------------------- /screenshots/config_devices_thermal_comfort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/config_devices_thermal_comfort.png -------------------------------------------------------------------------------- /screenshots/config_integrations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/config_integrations.png -------------------------------------------------------------------------------- /screenshots/config_integrations_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/config_integrations_search.png -------------------------------------------------------------------------------- /screenshots/config_options_thermal_comfort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/config_options_thermal_comfort.png -------------------------------------------------------------------------------- /screenshots/config_thermal_comfort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/config_thermal_comfort.png -------------------------------------------------------------------------------- /screenshots/dew_point.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/dew_point.png -------------------------------------------------------------------------------- /screenshots/heat_index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/heat_index.png -------------------------------------------------------------------------------- /screenshots/living_room.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/living_room.png -------------------------------------------------------------------------------- /screenshots/outside.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/outside.png -------------------------------------------------------------------------------- /screenshots/perception.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dolezsa/thermal_comfort/d7a81bbcd38110742124d46e7c0d2a7e5d011831/screenshots/perception.png -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | """Tests for Thermal Comfort component.""" 2 | -------------------------------------------------------------------------------- /tests/bandit.yaml: -------------------------------------------------------------------------------- 1 | # https://bandit.readthedocs.io/en/latest/config.html 2 | 3 | tests: 4 | - B103 5 | - B108 6 | - B306 7 | - B307 8 | - B313 9 | - B314 10 | - B315 11 | - B316 12 | - B317 13 | - B318 14 | - B319 15 | - B320 16 | - B325 17 | - B601 18 | - B602 19 | - B604 20 | - B608 21 | - B609 22 | -------------------------------------------------------------------------------- /tests/conftest.py: -------------------------------------------------------------------------------- 1 | """template conftest.""" 2 | import pytest 3 | from pytest_homeassistant_custom_component.common import ( 4 | assert_setup_component, 5 | async_mock_service, 6 | ) 7 | 8 | from homeassistant.setup import async_setup_component 9 | 10 | pytest_plugins = "pytest_homeassistant_custom_component" 11 | 12 | 13 | @pytest.fixture(autouse=True) 14 | def auto_enable_custom_integrations(enable_custom_integrations): 15 | """Auto enable custom integration.""" 16 | yield 17 | 18 | 19 | @pytest.fixture 20 | def calls(hass): 21 | """Track calls to a mock service.""" 22 | return async_mock_service(hass, "test", "automation") 23 | 24 | 25 | @pytest.fixture 26 | async def start_ha(hass, domains, config, caplog): 27 | """Do setup of integration.""" 28 | for domain, count in domains: 29 | with assert_setup_component(count, domain): 30 | assert await async_setup_component( 31 | hass, 32 | domain, 33 | config, 34 | ) 35 | await hass.async_block_till_done() 36 | await hass.async_start() 37 | await hass.async_block_till_done() 38 | 39 | 40 | @pytest.fixture 41 | async def caplog_setup_text(caplog): 42 | """Return setup log of integration.""" 43 | yield caplog.text 44 | -------------------------------------------------------------------------------- /tests/const.py: -------------------------------------------------------------------------------- 1 | """General test constants.""" 2 | from custom_components.thermal_comfort.const import ( 3 | CONF_HUMIDITY_SENSOR, 4 | CONF_POLL, 5 | CONF_TEMPERATURE_SENSOR, 6 | ) 7 | from custom_components.thermal_comfort.sensor import ( 8 | CONF_CUSTOM_ICONS, 9 | CONF_ENABLED_SENSORS, 10 | CONF_SCAN_INTERVAL, 11 | ) 12 | from homeassistant.const import CONF_NAME 13 | 14 | USER_INPUT = { 15 | CONF_NAME: "New name", 16 | CONF_TEMPERATURE_SENSOR: "sensor.test_temperature_sensor", 17 | CONF_HUMIDITY_SENSOR: "sensor.test_humidity_sensor", 18 | CONF_POLL: False, 19 | CONF_CUSTOM_ICONS: False, 20 | CONF_SCAN_INTERVAL: 30, 21 | } 22 | 23 | ADVANCED_USER_INPUT = { 24 | **USER_INPUT, 25 | CONF_NAME: "test_thermal_comfort", 26 | CONF_ENABLED_SENSORS: [], 27 | } 28 | -------------------------------------------------------------------------------- /tests/test_config_flow.py: -------------------------------------------------------------------------------- 1 | """Test integration_blueprint config flow.""" 2 | 3 | import json 4 | from unittest.mock import MagicMock, patch 5 | 6 | import pytest 7 | from pytest_homeassistant_custom_component.common import MockConfigEntry 8 | import voluptuous as vol 9 | 10 | from custom_components.thermal_comfort.const import ( 11 | CONF_HUMIDITY_SENSOR, 12 | CONF_TEMPERATURE_SENSOR, 13 | DOMAIN, 14 | ) 15 | from homeassistant import config_entries 16 | from homeassistant.const import CONF_NAME 17 | from homeassistant.data_entry_flow import FlowResultType 18 | 19 | from .const import ADVANCED_USER_INPUT, USER_INPUT 20 | from .test_sensor import DEFAULT_TEST_SENSORS 21 | 22 | 23 | @pytest.fixture(autouse=True) 24 | def bypass_setup_fixture(): 25 | """Prevent setup.""" 26 | with patch( 27 | "custom_components.thermal_comfort.async_setup_entry", 28 | return_value=True, 29 | ): 30 | yield 31 | 32 | 33 | async def _flow_init(hass, advanced_options=True): 34 | return await hass.config_entries.flow.async_init( 35 | DOMAIN, 36 | context={ 37 | "source": config_entries.SOURCE_USER, 38 | "show_advanced_options": advanced_options, 39 | }, 40 | ) 41 | 42 | 43 | async def _flow_configure(hass, r, _input=ADVANCED_USER_INPUT): 44 | with patch( 45 | "homeassistant.helpers.entity_registry.EntityRegistry.async_get", 46 | return_value=MagicMock(unique_id="foo"), 47 | ): 48 | return await hass.config_entries.flow.async_configure( 49 | r["flow_id"], user_input=_input 50 | ) 51 | 52 | 53 | @pytest.mark.parametrize(*DEFAULT_TEST_SENSORS) 54 | async def test_successful_config_flow(hass, start_ha): 55 | """Test a successful config flow.""" 56 | # Initialize a config flow 57 | result = await _flow_init(hass) 58 | 59 | # Check that the config flow shows the user form as the first step 60 | assert result["type"] == FlowResultType.FORM 61 | assert result["step_id"] == "user" 62 | 63 | result = await _flow_configure(hass, result) 64 | 65 | assert result["type"] == FlowResultType.CREATE_ENTRY 66 | 67 | assert result["title"] == ADVANCED_USER_INPUT[CONF_NAME] 68 | assert result["data"] == ADVANCED_USER_INPUT 69 | assert result["result"] 70 | 71 | 72 | @pytest.mark.parametrize(*DEFAULT_TEST_SENSORS) 73 | async def test_failed_config_flow(hass, start_ha): 74 | """Config flow should fail if ...""" 75 | 76 | # We try to set up second instance for same temperature and humidity sensors 77 | for _ in [0, 1]: 78 | result = await _flow_init(hass) 79 | result = await _flow_configure(hass, result) 80 | 81 | assert result["type"] == FlowResultType.ABORT 82 | assert result["reason"] == "already_configured" 83 | 84 | 85 | @pytest.mark.parametrize(*DEFAULT_TEST_SENSORS) 86 | async def test_options_flow(hass, start_ha): 87 | """Test flow for options changes.""" 88 | # setup entry 89 | entry = MockConfigEntry(domain=DOMAIN, data=ADVANCED_USER_INPUT, entry_id="test") 90 | entry.add_to_hass(hass) 91 | 92 | # Initialize an options flow for entry 93 | result = await hass.config_entries.options.async_init( 94 | entry.entry_id, context={"show_advanced_options": True} 95 | ) 96 | 97 | # Verify that the first options step is a user form 98 | assert result["type"] == FlowResultType.FORM 99 | assert result["step_id"] == "init" 100 | 101 | # Enter some data into the form 102 | result = await hass.config_entries.options.async_configure( 103 | result["flow_id"], 104 | user_input=USER_INPUT, 105 | ) 106 | 107 | # Verify that the flow finishes 108 | assert result["type"] == FlowResultType.CREATE_ENTRY 109 | assert result["title"] == "" 110 | 111 | # Verify that the options were updated 112 | 113 | assert entry.options == USER_INPUT 114 | 115 | 116 | async def test_config_flow_enabled(): 117 | """Test is manifest.json have 'config_flow': true.""" 118 | with open("custom_components/thermal_comfort/manifest.json") as f: 119 | manifest = json.load(f) 120 | assert manifest.get("config_flow") is True 121 | 122 | 123 | #@pytest.mark.parametrize(*DEFAULT_TEST_SENSORS) 124 | #@pytest.mark.parametrize("sensor", [CONF_TEMPERATURE_SENSOR, CONF_HUMIDITY_SENSOR]) 125 | #async def test_missed_sensors(hass, sensor, start_ha): 126 | # """Test is we show message if sensor missed.""" 127 | # 128 | # result = await _flow_init(hass) 129 | # 130 | # # Check that the config flow shows the user form as the first step 131 | # assert result["type"] == FlowResultType.FORM 132 | # assert result["step_id"] == "user" 133 | # 134 | # no_sensor = dict(ADVANCED_USER_INPUT) 135 | # no_sensor[sensor] = "foo" 136 | # with pytest.raises(vol.error.MultipleInvalid): 137 | # result = await _flow_configure(hass, result, no_sensor) 138 | # 139 | # assert result["type"] == FlowResultType.FORM 140 | -------------------------------------------------------------------------------- /tests/test_init.py: -------------------------------------------------------------------------------- 1 | """Test setup process.""" 2 | from unittest.mock import AsyncMock, patch 3 | 4 | from pytest_homeassistant_custom_component.common import MockConfigEntry 5 | 6 | from custom_components.thermal_comfort import ( 7 | async_setup_entry, 8 | async_unload_entry, 9 | async_update_options, 10 | ) 11 | from custom_components.thermal_comfort.const import DOMAIN, PLATFORMS 12 | 13 | from .const import ADVANCED_USER_INPUT 14 | 15 | 16 | async def test_setup_update_unload_entry(hass): 17 | """Test entry setup and unload.""" 18 | 19 | hass.config_entries.async_forward_entry_setups = AsyncMock() 20 | with patch.object(hass.config_entries, "async_update_entry") as p: 21 | config_entry = MockConfigEntry( 22 | domain=DOMAIN, data=ADVANCED_USER_INPUT, entry_id="test", unique_id=None 23 | ) 24 | await hass.config_entries.async_add(config_entry) 25 | assert p.called 26 | 27 | assert await async_setup_entry(hass, config_entry) 28 | assert DOMAIN in hass.data and config_entry.entry_id in hass.data[DOMAIN] 29 | 30 | # check user input is in config 31 | for key in ADVANCED_USER_INPUT: 32 | if key in hass.data[DOMAIN][config_entry.entry_id]: 33 | assert ( 34 | hass.data[DOMAIN][config_entry.entry_id][key] 35 | == ADVANCED_USER_INPUT[key] 36 | ) 37 | 38 | hass.config_entries.async_forward_entry_setups.assert_called_with( 39 | config_entry, PLATFORMS 40 | ) 41 | 42 | # ToDo test hass.data[DOMAIN][config_entry.entry_id][UPDATE_LISTENER] 43 | 44 | hass.config_entries.async_reload = AsyncMock() 45 | assert await async_update_options(hass, config_entry) is None 46 | hass.config_entries.async_reload.assert_called_with(config_entry.entry_id) 47 | 48 | # Unload the entry and verify that the data has been removed 49 | assert await async_unload_entry(hass, config_entry) 50 | assert config_entry.entry_id not in hass.data[DOMAIN] 51 | --------------------------------------------------------------------------------