├── .gitignore ├── .DS_Store ├── site ├── assets │ ├── javascripts │ │ └── lunr │ │ │ └── min │ │ │ ├── lunr.jp.min.js │ │ │ ├── lunr.vi.min.js │ │ │ ├── lunr.multi.min.js │ │ │ ├── lunr.th.min.js │ │ │ ├── lunr.hy.min.js │ │ │ ├── lunr.te.min.js │ │ │ ├── lunr.ta.min.js │ │ │ ├── lunr.zh.min.js │ │ │ ├── lunr.ja.min.js │ │ │ ├── lunr.hi.min.js │ │ │ ├── lunr.kn.min.js │ │ │ ├── lunr.sa.min.js │ │ │ ├── lunr.stemmer.support.min.js │ │ │ ├── lunr.ko.min.js │ │ │ ├── lunr.sv.min.js │ │ │ ├── lunr.da.min.js │ │ │ ├── lunr.no.min.js │ │ │ ├── lunr.he.min.js │ │ │ ├── lunr.nl.min.js │ │ │ ├── lunr.de.min.js │ │ │ ├── lunr.du.min.js │ │ │ ├── lunr.ru.min.js │ │ │ └── lunr.fi.min.js │ ├── images │ │ └── favicon.png │ └── stylesheets │ │ └── palette.06af60db.min.css.map ├── sitemap.xml.gz ├── ahc │ └── images │ │ ├── temps.png │ │ ├── holiday.png │ │ ├── persons.png │ │ ├── presence.png │ │ ├── valves.png │ │ ├── no_persons.png │ │ ├── scheduler.png │ │ ├── presence_sensor.png │ │ ├── heating_scheduler.png │ │ ├── presence_scheduler.png │ │ └── presence_with_scheduler.png ├── sitemap.xml └── search │ └── search_index.json ├── docs_src ├── .DS_Store ├── ahc │ ├── .DS_Store │ ├── hints │ │ ├── images │ │ │ ├── d_key.png │ │ │ ├── entity_dialog.png │ │ │ ├── entity_dialog_2.png │ │ │ └── configuration_section.png │ │ └── keywords.md │ └── sections │ │ ├── images │ │ ├── .DS_Store │ │ ├── temps.png │ │ ├── holiday.png │ │ ├── persons.png │ │ ├── valves.png │ │ ├── no_persons.png │ │ ├── presence.png │ │ ├── scheduler.png │ │ ├── presence_sensor.png │ │ ├── ahc │ │ │ ├── heating_scheduler.png │ │ │ └── presence_scheduler.png │ │ └── presence_with_scheduler.png │ │ ├── thermostats_sensors.md │ │ ├── proximity.md │ │ ├── adjustments_heating_plan.md │ │ ├── persons.md │ │ ├── windows_doors.md │ │ ├── temperatures.md │ │ ├── presence_detection.md │ │ ├── force_comfort_eco.md │ │ ├── temperature_tweaks.md │ │ ├── away_mode.md │ │ ├── aggressive_mode.md │ │ ├── schedules.md │ │ ├── calibration.md │ │ └── dynamic_valve_positioning.md ├── style.css └── index.md ├── rounded ├── .DS_Store ├── images │ ├── .DS_Store │ ├── cards │ │ ├── .DS_Store │ │ ├── alarm.png │ │ ├── base.png │ │ ├── graph.png │ │ ├── light.png │ │ ├── media.png │ │ ├── pill.png │ │ ├── room.png │ │ ├── scene.png │ │ ├── titel.png │ │ ├── calendar.png │ │ ├── caption.png │ │ ├── person.png │ │ ├── script.png │ │ ├── sensor.png │ │ ├── mini_graph.png │ │ ├── input_number.png │ │ ├── pill_weather.png │ │ ├── radial_info.png │ │ ├── titel_badge.png │ │ └── light_dimmable.png │ └── screenshots │ │ ├── .DS_Store │ │ ├── header.png │ │ ├── screen1.png │ │ ├── screen2.png │ │ ├── screen3.png │ │ └── screen4.png └── templates │ ├── input_boolean.yaml │ ├── button_light.yaml │ ├── base │ ├── button_single.yaml │ ├── extra_status.yaml │ ├── languages │ │ └── de-de.yaml │ ├── background_color.yaml │ ├── pill.yaml │ ├── base.yaml │ └── state_engine.yaml │ ├── scene.yaml │ ├── back_button.yaml │ ├── button_script.yaml │ ├── title_card.yaml │ ├── graph.yaml │ ├── caption.yaml │ ├── person.yaml │ ├── nina_warnings.yaml │ ├── media_player.yaml │ ├── button_light_slider.yaml │ ├── title_card_badge.yaml │ ├── brightness.yaml │ ├── sensor.yaml │ ├── input_number.yaml │ ├── weather_pill.yaml │ ├── calendar.yaml │ ├── party_mode.yaml │ ├── alarm.yaml │ ├── conditions.yaml │ └── room.yaml ├── .vscode └── settings.json ├── snippets ├── ahc_latest_version_sensor.yaml ├── ahc_local_version_sensor.yaml └── ahc_template_sensor.yaml ├── README.md ├── .github └── workflows │ └── jekyll-gh-pages.yml ├── blueprints ├── automation │ └── panhans │ │ ├── heating_control.md │ │ ├── binary_sensor_notification.yaml │ │ └── scene_based_theatre_mode.yaml └── script │ ├── scene_toggle.yaml │ └── intelligent_vacuum_cleaning.yaml └── mkdocs.yml /.gitignore: -------------------------------------------------------------------------------- 1 | **/.vscode/ -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/.DS_Store -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.jp.min.js: -------------------------------------------------------------------------------- 1 | module.exports=require("./lunr.ja"); -------------------------------------------------------------------------------- /docs_src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/.DS_Store -------------------------------------------------------------------------------- /rounded/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/.DS_Store -------------------------------------------------------------------------------- /site/sitemap.xml.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/sitemap.xml.gz -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "*.yaml": "home-assistant" 4 | } 5 | } -------------------------------------------------------------------------------- /docs_src/ahc/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/.DS_Store -------------------------------------------------------------------------------- /rounded/images/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/.DS_Store -------------------------------------------------------------------------------- /site/ahc/images/temps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/temps.png -------------------------------------------------------------------------------- /site/ahc/images/holiday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/holiday.png -------------------------------------------------------------------------------- /site/ahc/images/persons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/persons.png -------------------------------------------------------------------------------- /site/ahc/images/presence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/presence.png -------------------------------------------------------------------------------- /site/ahc/images/valves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/valves.png -------------------------------------------------------------------------------- /rounded/images/cards/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/.DS_Store -------------------------------------------------------------------------------- /rounded/images/cards/alarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/alarm.png -------------------------------------------------------------------------------- /rounded/images/cards/base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/base.png -------------------------------------------------------------------------------- /rounded/images/cards/graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/graph.png -------------------------------------------------------------------------------- /rounded/images/cards/light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/light.png -------------------------------------------------------------------------------- /rounded/images/cards/media.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/media.png -------------------------------------------------------------------------------- /rounded/images/cards/pill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/pill.png -------------------------------------------------------------------------------- /rounded/images/cards/room.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/room.png -------------------------------------------------------------------------------- /rounded/images/cards/scene.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/scene.png -------------------------------------------------------------------------------- /rounded/images/cards/titel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/titel.png -------------------------------------------------------------------------------- /site/ahc/images/no_persons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/no_persons.png -------------------------------------------------------------------------------- /site/ahc/images/scheduler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/scheduler.png -------------------------------------------------------------------------------- /site/assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/assets/images/favicon.png -------------------------------------------------------------------------------- /rounded/images/cards/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/calendar.png -------------------------------------------------------------------------------- /rounded/images/cards/caption.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/caption.png -------------------------------------------------------------------------------- /rounded/images/cards/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/person.png -------------------------------------------------------------------------------- /rounded/images/cards/script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/script.png -------------------------------------------------------------------------------- /rounded/images/cards/sensor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/sensor.png -------------------------------------------------------------------------------- /docs_src/ahc/hints/images/d_key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/hints/images/d_key.png -------------------------------------------------------------------------------- /rounded/images/cards/mini_graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/mini_graph.png -------------------------------------------------------------------------------- /site/ahc/images/presence_sensor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/presence_sensor.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/.DS_Store -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/temps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/temps.png -------------------------------------------------------------------------------- /rounded/images/cards/input_number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/input_number.png -------------------------------------------------------------------------------- /rounded/images/cards/pill_weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/pill_weather.png -------------------------------------------------------------------------------- /rounded/images/cards/radial_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/radial_info.png -------------------------------------------------------------------------------- /rounded/images/cards/titel_badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/titel_badge.png -------------------------------------------------------------------------------- /rounded/images/screenshots/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/screenshots/.DS_Store -------------------------------------------------------------------------------- /rounded/images/screenshots/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/screenshots/header.png -------------------------------------------------------------------------------- /rounded/images/screenshots/screen1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/screenshots/screen1.png -------------------------------------------------------------------------------- /rounded/images/screenshots/screen2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/screenshots/screen2.png -------------------------------------------------------------------------------- /rounded/images/screenshots/screen3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/screenshots/screen3.png -------------------------------------------------------------------------------- /rounded/images/screenshots/screen4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/screenshots/screen4.png -------------------------------------------------------------------------------- /site/ahc/images/heating_scheduler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/heating_scheduler.png -------------------------------------------------------------------------------- /site/ahc/images/presence_scheduler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/presence_scheduler.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/holiday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/holiday.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/persons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/persons.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/valves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/valves.png -------------------------------------------------------------------------------- /rounded/images/cards/light_dimmable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/rounded/images/cards/light_dimmable.png -------------------------------------------------------------------------------- /docs_src/ahc/hints/images/entity_dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/hints/images/entity_dialog.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/no_persons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/no_persons.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/presence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/presence.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/scheduler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/scheduler.png -------------------------------------------------------------------------------- /site/ahc/images/presence_with_scheduler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/site/ahc/images/presence_with_scheduler.png -------------------------------------------------------------------------------- /docs_src/ahc/hints/images/entity_dialog_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/hints/images/entity_dialog_2.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/presence_sensor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/presence_sensor.png -------------------------------------------------------------------------------- /rounded/templates/input_boolean.yaml: -------------------------------------------------------------------------------- 1 | input_boolean: 2 | template: base 3 | variables: 4 | active_color: orange 5 | tap_action: 6 | action: toggle -------------------------------------------------------------------------------- /docs_src/ahc/hints/images/configuration_section.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/hints/images/configuration_section.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/ahc/heating_scheduler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/ahc/heating_scheduler.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/ahc/presence_scheduler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/ahc/presence_scheduler.png -------------------------------------------------------------------------------- /docs_src/ahc/sections/images/presence_with_scheduler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhans/HomeAssistant/HEAD/docs_src/ahc/sections/images/presence_with_scheduler.png -------------------------------------------------------------------------------- /docs_src/style.css: -------------------------------------------------------------------------------- 1 | .center-table { 2 | text-align: center; 3 | } 4 | .md-typeset .center-table :is(td,th):not([align]) { 5 | text-align: initial; /* Reset alignment for table cells */ 6 | } -------------------------------------------------------------------------------- /rounded/templates/button_light.yaml: -------------------------------------------------------------------------------- 1 | button_light: 2 | template: base 3 | tap_action: 4 | action: toggle 5 | haptic: medium 6 | hold_action: 7 | action: more-info 8 | haptic: medium -------------------------------------------------------------------------------- /docs_src/index.md: -------------------------------------------------------------------------------- 1 | # Welcome to my Blueprint and Snippet Collection 2 | 3 | !!! danger "Under construction!" 4 | 5 | This is currently under construction! 6 | The contents are therefore to be enjoyed with caution 7 | and can still change at any time. -------------------------------------------------------------------------------- /rounded/templates/base/button_single.yaml: -------------------------------------------------------------------------------- 1 | button_single: 2 | variables: 3 | color: blue 4 | aspect_ratio: 1/1 5 | styles: 6 | card: 7 | - border-radius: 30% 8 | - background-color: "[[[ return 'var(--' + variables.color + ')'; ]]]" 9 | icon: 10 | - color: var(--black) -------------------------------------------------------------------------------- /rounded/templates/scene.yaml: -------------------------------------------------------------------------------- 1 | scene: 2 | template: button_single 3 | icon: "[[[ return states[variables.scene].attributes.icon; ]]]" 4 | tap_action: 5 | action: call-service 6 | service: scene.turn_on 7 | haptic: medium 8 | service_data: 9 | entity_id: "[[[ return variables.scene; ]]]" -------------------------------------------------------------------------------- /rounded/templates/back_button.yaml: -------------------------------------------------------------------------------- 1 | back_button: 2 | template: button_single 3 | icon: mdi:arrow-left 4 | variables: 5 | color: yellow 6 | styles: 7 | card: 8 | - border-radius: 12px 9 | tap_action: 10 | action: navigate 11 | navigation_path: "[[[ return variables.navigation_path; ]]]" -------------------------------------------------------------------------------- /rounded/templates/button_script.yaml: -------------------------------------------------------------------------------- 1 | button_script: 2 | template: base 3 | show_state: false 4 | variables: 5 | active_color: orange 6 | show_last_triggered: true 7 | tap_action: 8 | action: toggle 9 | haptic: medium 10 | hold_action: 11 | action: more-info 12 | haptic: medium 13 | -------------------------------------------------------------------------------- /rounded/templates/base/extra_status.yaml: -------------------------------------------------------------------------------- 1 | extra_status: 2 | custom_fields: 3 | es: > 4 | [[[ 5 | const unit = states[variables.extra_status].attributes.unit_of_measurement; 6 | let state = states[variables.extra_status].state; 7 | state = state == null ? '-' : state; 8 | 9 | if (unit == null) return state; 10 | 11 | return state + ' ' + unit; 12 | ]]] -------------------------------------------------------------------------------- /snippets/ahc_latest_version_sensor.yaml: -------------------------------------------------------------------------------- 1 | sensor: 2 | unique_id: "ahc_blueprint_version_latest" 3 | command: "curl https://raw.githubusercontent.com/panhans/HomeAssistant/refs/heads/main/blueprints/automation/panhans/advanced_heating_control.yaml" 4 | name: "AHC Blueprint Latest Version" 5 | value_template: "{{ value | regex_findall('\\*\\*Version\\*\\*:(.+\\d+.\\d+.\\d+)', '\\1') | first | trim }}" 6 | scan_interval: 3600 # every hour 7 | 8 | -------------------------------------------------------------------------------- /rounded/templates/title_card.yaml: -------------------------------------------------------------------------------- 1 | title_card: 2 | show_icon: false 3 | styles: 4 | grid: 5 | - grid-template-areas: "'n' 'l'" 6 | - grid-template-columns: "1fr" 7 | - grid-template-rows: "min-content min-content" 8 | card: 9 | - background: none 10 | - padding: 16px 0 11 | - '--mdc-ripple-press-opacity': 0 12 | name: 13 | - font-size: 32px 14 | - color: var(--contrast20) 15 | label: 16 | - font-weight: "bold" 17 | - font-size: "1rem" 18 | - opacity: "0.4" -------------------------------------------------------------------------------- /rounded/templates/base/languages/de-de.yaml: -------------------------------------------------------------------------------- 1 | de-de: 2 | variables: 3 | lang_on: "An" 4 | lang_off: "Aus" 5 | lang_not_home: "Unterwegs" 6 | lang_home: "Zu Hause" 7 | lang_paused: "Pausiert" 8 | lang_playing: "Spielt ab" 9 | lang_stopped: "Gestoppt" 10 | lang_heat: "Heizt" 11 | lang_armed_night: "Nacht" 12 | lang_armed_custom_bypass: "Stiller Alarm" 13 | lang_arming: "Aktiviere Alarm" 14 | lang_armed_away: "Außer Haus" 15 | lang_disarmed: "Aus" 16 | 17 | date_format: 'de-DE' 18 | time_unit: ' Uhr' 19 | -------------------------------------------------------------------------------- /snippets/ahc_local_version_sensor.yaml: -------------------------------------------------------------------------------- 1 | # You may need to put the blueprint directory to the allow list in your configuration 2 | # 3 | # homeassistant: 4 | # allowlist_external_dirs: 5 | # - /config/blueprints/automation/panhans 6 | 7 | sensor: 8 | unique_id: "ahc_blueprint_version_local" 9 | command: "cat /config/blueprints/automation/panhans/advanced_heating_control.yaml" 10 | name: "AHC Blueprint Local Version" 11 | value_template: "{{ value | regex_findall('\\*\\*Version\\*\\*:(.+\\d+.\\d+.\\d+)', '\\1') | first | trim }}" 12 | scan_interval: 3600 # every hour 13 | -------------------------------------------------------------------------------- /rounded/templates/graph.yaml: -------------------------------------------------------------------------------- 1 | graph: 2 | show_state: false 3 | show_icon: false 4 | show_label: false 5 | show_name: false 6 | custom_fields: 7 | graph: 8 | card: 9 | type: 'sensor' 10 | hours_to_show: 24 11 | height: 100 12 | detail: 1 13 | graph: line 14 | entity: "[[[ return entity.entity_id; ]]]" 15 | icon: none 16 | card_mod: 17 | class: graph 18 | styles: 19 | grid: 20 | - grid-template-areas: '"graph"' 21 | - grid-template-columns: 1fr 22 | - grid-template-rows: 1fr 23 | card: 24 | - background: var(--contrast2) 25 | - '--mdc-ripple-press-opacity': 0 26 | 27 | -------------------------------------------------------------------------------- /rounded/templates/caption.yaml: -------------------------------------------------------------------------------- 1 | caption: 2 | show_icon: false 3 | show_label: true 4 | styles: 5 | card: 6 | - border-radius: 0px 7 | - background: none 8 | - box-shadow: none 9 | - padding: 0px 0px 0px 0px 10 | - '--mdc-ripple-press-opacity': 0 11 | grid: 12 | - grid-template-areas: "'s1' 'n' 'l' 's2'" 13 | - grid-template-columns: "1fr" 14 | - grid-template-rows: "min-content min-content" 15 | name: 16 | - justify-self: start 17 | - font-size: 28px 18 | - color: var(--contrast15) 19 | - margin-top: -6px 20 | label: 21 | - justify-self: "start" 22 | - font-weight: "bold" 23 | - font-size: "1rem" 24 | - opacity: "0.4" -------------------------------------------------------------------------------- /site/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://panhans.github.io/HomeAssistant/ 5 | 2024-12-22 6 | 7 | 8 | https://panhans.github.io/HomeAssistant/ahc/adjustments_heating_plan/ 9 | 2024-12-22 10 | 11 | 12 | https://panhans.github.io/HomeAssistant/ahc/temperatures/ 13 | 2024-12-22 14 | 15 | 16 | https://panhans.github.io/HomeAssistant/ahc/thermostats_sensors/ 17 | 2024-12-22 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Home Assistant 2 | 3 | - Blueprints 4 | - Automations 5 | - [Binary Sensor Notification](blueprints/automation/panhans/binary_sensor_notification.yaml) 6 | - [Persistent entity state notification](blueprints/automation/panhans/entity_state_persistent_notification.yaml) 7 | - [Heating Control](blueprints/automation/panhans/advanced_heating_control.yaml) 8 | - [Theatre Mode](blueprints/automation/panhans/theatre_mode.yaml) 9 | - [Zone Notification Extended](blueprints/automation/panhans/zone_notification_extended.yaml) 10 | - Scripts 11 | - [Simple Scene Toggle](blueprints/script/scene_toggle.yaml) 12 | 13 | If you appreciate my work and support: 14 | 15 | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/Q5Q3QEH52) 16 | -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.vi.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}}); -------------------------------------------------------------------------------- /docs_src/ahc/sections/thermostats_sensors.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🔘 Thermostats & Sensors 6 | 7 | ## 🔥 Thermostats / Climates 8 | 9 | In the first step, you need to specify your thermostats or the climate entities that your new AHC automation should control. 10 | 11 | ## 🎛️ Operation / HVAC Mode 12 | 13 | Here you select the manual heating mode of your thermostats so that AHC can take full control. Usually, the manual HVAC mode is *heat*. However, for some thermostats this mode also stands for the boost mode and another mode like *auto* must be selected. 14 | 15 | ## 🌡️ Room Temperature Sensor 16 | 17 | The sensor of your room temperature is useful for many features: It ensures the accurate calibration of your thermostats and can be used for functions that are described in other sections here. -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.multi.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),i=t.join("-"),r="",n=[],s=[],p=0;p> $GITHUB_ENV 21 | - uses: actions/cache@v4 22 | with: 23 | key: mkdocs-material-${{ env.cache_id }} 24 | path: .cache 25 | restore-keys: | 26 | mkdocs-material- 27 | - run: pip install mkdocs-material mkdocs-awesome-pages-plugin mkdocs-glightbox 28 | - run: mkdocs gh-deploy --force 29 | -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.th.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[฀-๿]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}}); -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.hy.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z԰-֏ff-ﭏ]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}}); -------------------------------------------------------------------------------- /docs_src/ahc/sections/proximity.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # ↔️ Proximity 6 | 7 | You can setup home assistants proximity integration and provide the generated device here. Combined with a specified ditance and the travel direction comfort heating can be triggered. 8 | 9 | | Mode | Distance | Direction | 10 | | --------------- | ------------------------- | ------------------ | 11 | | **Comfort** | within the distance | arrived | 12 | | | | towards | 13 | | **Eco** | outside the distance | - | 14 | | | within the distance | away_from | 15 | | | | stationary | 16 | 17 | ## ↔️ Proximity 18 | 19 | Specify your proximity entity here. 20 | 21 | ## ⏰ Proximity Duration 22 | 23 | The duration a person must be at home or moving within the distance to your home for the comfort temperature to be set. 24 | 25 | ## ↔️ Proximity Distance 26 | 27 | The maximum distance that persons can be from your home for the comfort temperature to be set. -------------------------------------------------------------------------------- /blueprints/automation/panhans/heating_control.md: -------------------------------------------------------------------------------- 1 | #

🔥 Advanced Heating Control 🔥

2 | 3 | ## ⏲️ Thermostats and 🌡️ Temperatures 4 | 5 | ### 🔥 Thermostats / Climates 6 | 7 | ### 🌱 Eco Temperature 8 | 9 | ### 🛋️ Comfort Temperature 10 | 11 | ## 🎛️ Heating Schedule Adjustments 12 | 13 | ## 👥 People and ↔️ Proximity 14 | 15 | ### 👥 People 16 | 17 | #### 🏠 Enter Home Duration 18 | 19 | #### 💨 Leaving Home Duration 20 | 21 | ### ↔️ Proximity 22 | 23 | ### ↔️ Proximity Device 24 | 25 | #### ⏰ Proximity Duration 26 | 27 | #### ↔️ Proximity Distance 28 | 29 | ## 🗓️ Scheduling 30 | 31 | ### 🗓️ Scheduler 32 | 33 | ### ☝🏻 Scheduler Selector 34 | 35 | ## 🚶 Presence Detection 36 | 37 | ### 🚶 Presence Sensor 38 | 39 | #### ⏲️ Presence Sensor Scheduler 40 | 41 | ### ⏳ Presence Reaction On Time 42 | 43 | ### ⌛ Presence Reaction Off Time 44 | 45 | ## 🎈 Party mode 46 | 47 | ## 🤝 Guest mode 48 | 49 | ## 🪟 Windows & Doors 50 | 51 | ### ⏳ Window & Door Reaction Time Open 52 | 53 | ### ⌛ Window & Door Reaction Time Close 54 | 55 | ## ❄️ Frost Protection 56 | 57 | ### ❄️ Frost Protection Fallback Duration 58 | 59 | ## 🌡️ Calibration Temperature Sensor -------------------------------------------------------------------------------- /rounded/templates/base/background_color.yaml: -------------------------------------------------------------------------------- 1 | background_color: 2 | styles: 3 | card: 4 | - background: > 5 | [[[ 6 | if(variables.background_color) { 7 | return 'var(--'+variables.background_color+')'; 8 | } 9 | 10 | let colors = ['purple','red', 'blue', 'green', 'yellow','orange']; 11 | let colorCount = Math.floor(Math.random() * colors.length); 12 | return 'var(--'+colors[colorCount]+')'; 13 | ]]] 14 | icon: 15 | - color: "[[[ return variables.background_color && variables.background_color.includes('tint') ? 'var(--white5)' : 'var(--black)'; ]]] " 16 | name: 17 | - color: "[[[ return variables.background_color && variables.background_color.includes('tint') ? 'var(--white5)' : 'var(--black)'; ]]] " 18 | label: 19 | - color: "var(--darker60)" 20 | custom_fields: 21 | cs: 22 | - color: "[[[ return variables.background_color && variables.background_color.includes('tint') ? 'var(--white5)' : 'var(--black)'; ]]] " 23 | es: 24 | - color: "[[[ return variables.background_color && variables.background_color.includes('tint') ? 'var(--white5)' : 'var(--black)'; ]]] " -------------------------------------------------------------------------------- /docs_src/ahc/sections/adjustments_heating_plan.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🎛️ Adjustments / Heating Plan 6 | 7 | In the adjustments, you can set your temperatures or enable/disable the calibration of your thermostats. 8 | You can set these settings for a specific time, but also specify that they only apply on certain days or only when a specific schedule is active. The time is a mandatory field. 9 | 10 | ## Modifier and Filter 11 | 12 | | Modifier | Values | Example | Description | 13 | | --------------- | ------- | ------- |------- | 14 | | 🕔 Time | HH:MM | 21:30 | The time when the adjustment should take place. | 15 | | 📆 Days | Mon, Tue, Wed, Thu, Fri, Sat, Sun | ['Mon','Fri'] | Filter if the adjustment should only take place on certain days. | 16 | | 🗓️ Scheduler | friendly name | Heating Schedule | Filter if the adjustment should only be set when a specific schedule is active. | 17 | | 🛋️ Comfort | 0-100 | 24 | Modifier that changes the comfort temperature to a different value at the specified time. | 18 | | 🌱 Eco | 0-100 | 17 | Modifier that changes the eco temperature to a different value at the specified time. | 19 | | 🧭 Calibration | on/off | on | Modifier that can turn the calibration on or off. | -------------------------------------------------------------------------------- /docs_src/ahc/sections/persons.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 👥 Persons 6 | 7 | Persons are used as triggers to set the comfort temperature. If one of the defined persons is at home, the comfort temperature is set. 8 | For example, if schedules or presence sensors are also defined, they are evaluated together with the persons in a logic. 9 | 10 | !!! warning "An overview explaining the logic will follow later in the documentation." 11 | 12 | ## 👥 Persons 13 | 14 | Here you specify the persons who usually occupy the room to be heated. 15 | 16 | ## 🏠 Enter Home Duration 17 | 18 | Sometimes you just need to be in the apartment briefly without heating. Therefore, a time tolerance can be specified for how long a person must be at home before the heating starts. 19 | 20 | ## 💨 Leaving Home Duration 21 | 22 | Sometimes you just leave the house for a few minutes. To avoid unnecessarily draining the batteries of the thermostats, you can prevent setting the eco temperature by also setting a time tolerance here. 23 | 24 | ## 🤝 Guest Mode 25 | 26 | If you have guests in the house but you are not at home, you can specify a boolean entity here that you can manually trigger. Even if you do not use the person integration, you can specify a boolean entity here that has its own logic to simulate persons being at home. -------------------------------------------------------------------------------- /docs_src/ahc/sections/windows_doors.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🪟 Windows & Doors Detection 6 | 7 | To ensure your thermostats deactivate or lower the temperature when your doors or windows are open, you need to add your contact sensors here. 8 | 9 | !!! info "Thermostats that do not support the *off* mode are automatically set to their minimum temperature." 10 | 11 | ## 🪟 Windows & Doors 12 | 13 | Füge hier deine Türen und Fenster hinzu, auf die deine Automation reagieren soll. 14 | 15 | ## ⏳ Window & Door Reaction Time Open 16 | 17 | Here you can set a time that your windows or doors must be open before your thermostats are lowered. This prevents the thermostats from lowering just because you briefly open the door, for example, to leave the house. 18 | 19 | ## ⌛ Window & Door Reaction Time Close 20 | 21 | If your window briefly slams shut due to the wind or you want to wait a while until your room acclimatizes, you can set a duration here that the window must be closed before your thermostats are reset to their original state. 22 | 23 | ## 🌡️ Window Open Temperature 24 | 25 | If you only want to lower your thermostats slightly when the window is open, for example, to save battery or because it is so cold that the pipes might freeze, you can set a temperature here that will be applied in this case. -------------------------------------------------------------------------------- /docs_src/ahc/hints/keywords.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🔑 Keywords 6 | 7 | To find the keywords for calibration or valve position, this guide should serve as a help. 8 | 9 | ## Navigate to device section 10 | 11 | Press the *D-Key* on your keyboard anywhere in Home Assistant and type the name of your thermostat. Select it and press *Enter*. 12 | 13 |
14 | ![Image title](images/d_key.png) 15 |
Device dialog
16 |
17 | 18 | ## Watch out your entity 19 | 20 | Look in the configuration section for your calibration or valve opening entity. Also described in the docs of your integration (z2m,zha, ect.). 21 | 22 |
23 | ![Image title](images/configuration_section.png) 24 |
Configuration section
25 |
26 | 27 | ## Find out the entity_id 28 | 29 | Click on the corresponding entity and then click on the gear icon in the next window. 30 | 31 |
32 | ![Image title](images/entity_dialog.png) 33 |
Entity dialog
34 |
35 | 36 | Copy a relevant general part of the entity id and set it as your keyword. 37 | 38 |
39 | ![Image title](images/entity_dialog_2.png) 40 |
Entity dialog - Entity ID
41 |
42 | -------------------------------------------------------------------------------- /docs_src/ahc/sections/temperatures.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🌡️ Temperatures 6 | 7 | ## 🛋️ Static Comfort Temperature 8 | 9 | The comfort temperature is the temperature that is set when you might be at home or your presence sensor is triggered or your heating schedule is *on*. 10 | This temperature setting serves as a fallback temperature. If a static temperature is sufficient for you and you do not want to adjust it further via the UI, this setting is sufficient. 11 | However, temporal temperature adjustments can be made via the adjustments. 12 | 13 | ## 🌱 Static Eco Temperature 14 | 15 | The eco temperature is the temperature that is set when you are not at home, for example, or your schedule does not prescribe heating to the comfort temperature. 16 | This temperature setting serves as a fallback temperature. If a static temperature is sufficient for you and you do not want to adjust it further via the UI, this setting is sufficient. 17 | However, temporal temperature adjustments can be made via the adjustments. 18 | 19 | ## 🛋️ Comfort Temperature 20 | 21 | If you want to control the comfort temperature via the UI, you can specify an input number helper here. This overrides the static comfort temperature. 22 | 23 | ## 🌱 Eco Temperature 24 | 25 | If you want to control the eco temperature via the UI, you can specify an input number helper here. This overrides the static eco temperature. -------------------------------------------------------------------------------- /rounded/templates/nina_warnings.yaml: -------------------------------------------------------------------------------- 1 | nina_warning: 2 | template: base 3 | name: '[[[ return entity.attributes.headline ]]]' 4 | variables: 5 | active_color: red 6 | show_name: true 7 | show_label: false 8 | custom_fields: 9 | cs: '[[[ return entity.attributes.sender ]]]' 10 | styles: 11 | # grid: 12 | # - grid-template-areas: "'i n' 'i l'" 13 | # - grid-template-columns: "min-content auto" 14 | # - grid-template-rows: "min-content" 15 | # name: 16 | # - align-self: "start" 17 | # - justify-self: "start" 18 | # - font-weight: "bold" 19 | # - font-size: "14px" 20 | # - margin-left: "12px" 21 | card: 22 | - background: "var(--white)" 23 | tap_action: 24 | action: fire-dom-event 25 | browser_mod: 26 | service: browser_mod.popup 27 | data: 28 | title: " " 29 | content: > 30 | [[[ 31 | const head = entity.attributes.headline; 32 | 33 | const startDate = new Date(entity.attributes.start); 34 | const endDate = new Date(entity.attributes.expires); 35 | 36 | const startDay = startDate.toLocaleString()+' Uhr'; 37 | const endDay = endDate.toLocaleString()+' Uhr'; 38 | 39 | return '

' + head + '

Von: ' + startDay + '
Bis: '+ endDay +'

' + entity.attributes.description; 40 | ]]] -------------------------------------------------------------------------------- /rounded/templates/media_player.yaml: -------------------------------------------------------------------------------- 1 | media_player: 2 | template: base 3 | variables: 4 | on_state: "[[[ return states[entity.entity_id].attributes.entity_picture != null ? '' : 'playing'; ]]]" 5 | custom_fields: 6 | bg: | 7 | [[[ 8 | return " " 9 | ]]] 10 | styles: 11 | custom_fields: 12 | bg: 13 | - background: center center/cover no-repeat 14 | - height: 100% 15 | - width: 100% 16 | - left: 20px 17 | - position: absolute 18 | - z-index: 0 19 | - transition: all 2s ease-out 20 | - margin-left: -20px 21 | state: 22 | - operator: template 23 | value: "[[[ return entity.state == 'playing' && states[entity.entity_id].attributes.entity_picture == null; ]]]" 24 | custom_fields: 25 | cs: "[[[ return states[entity.entity_id].attributes.media_title; ]]]" 26 | - operator: template 27 | value: "[[[ return entity.state == 'playing' && states[entity.entity_id].attributes.entity_picture != null; ]]]" 28 | custom_fields: 29 | cs: "[[[ return states[entity.entity_id].attributes.media_title; ]]]" 30 | styles: 31 | custom_fields: 32 | bg: 33 | - filter: blur(3px) brightness(0.4) grayscale(50%) 34 | - background-image: "[[[ return 'url('+states[entity.entity_id].attributes.entity_picture+')'; ]]]" 35 | cs: 36 | - color: var(--white) 37 | - margin-right: 16px 38 | - overflow: hidden -------------------------------------------------------------------------------- /rounded/templates/button_light_slider.yaml: -------------------------------------------------------------------------------- 1 | button_light_slider: 2 | template: base 3 | custom_fields: 4 | cs: 5 | card: 6 | type: custom:my-slider-v2 7 | entity: "[[[ return entity.entity_id; ]]]" 8 | colorMode: brightness 9 | styles: 10 | container: 11 | - background: none 12 | - border-radius: 100px 13 | - overflow: visible 14 | card: 15 | - height: 16px 16 | - padding: 0 8px 17 | - background: | 18 | [[[ 19 | if (entity.state == "on") return "linear-gradient(90deg, rgba(255,255,255, 0.3) 0%, rgba(255,255,255, 1) 100%)"; 20 | else return "var(--contrast4)"; 21 | ]]] 22 | track: 23 | - overflow: visible 24 | - background: none 25 | progress: 26 | - background: none 27 | thumb: 28 | - background: | 29 | [[[ 30 | if (entity.state == "on") return "var(--black)"; 31 | if (entity.state == "off") return "var(--contrast20)"; 32 | else return "var(--contrast8)"; 33 | ]]] 34 | - top: 2px 35 | - right: '-6px' 36 | - height: 12px 37 | - width: 12px 38 | - border-radius: 100px 39 | styles: 40 | custom_fields: 41 | cs: 42 | - justify-self: normal -------------------------------------------------------------------------------- /rounded/templates/title_card_badge.yaml: -------------------------------------------------------------------------------- 1 | title_card_badge: 2 | #name: Title here 3 | show_icon: false 4 | custom_fields: 5 | badge: 6 | card: 7 | type: custom:button-card 8 | name: '[[[ return variables.badge_name; ]]]' 9 | label: >- 10 | [[[ return variables.badge_label; ]]] 11 | show_label: true 12 | show_icon: false 13 | entity: '[[[ return entity.entity_id; ]]]' 14 | tap_action: 15 | action: more-info 16 | haptic: medium 17 | styles: 18 | grid: 19 | - grid-template-areas: '"n gutter l"' 20 | - grid-template-columns: min-content 5px min-content 21 | - grid-template-rows: min-content 22 | card: 23 | - padding: 6px 10px 24 | - font-size: 12px 25 | - line-height: 18px 26 | - font-weight: 500 27 | - background: var(--contrast20) 28 | name: 29 | - color: var(--contrast1) 30 | label: 31 | - color: var(--contrast12) 32 | styles: 33 | grid: 34 | - grid-template-areas: '"n" "badge"' 35 | card: 36 | - background: none 37 | - padding: 16px 0 38 | - '--mdc-ripple-press-opacity': 0 39 | name: 40 | - font-size: 32px 41 | - color: var(--contrast20) 42 | custom_fields: 43 | badge: 44 | - margin: 16px auto 0 auto 45 | - '--mdc-ripple-press-opacity': 0.5 -------------------------------------------------------------------------------- /rounded/templates/brightness.yaml: -------------------------------------------------------------------------------- 1 | brightness: 2 | # name: Helderheid 3 | show_icon: false 4 | custom_fields: 5 | slider: 6 | card: 7 | type: custom:my-slider-v2 8 | entity: "[[[ return entity.entity_id; ]]]" 9 | colorMode: brightness 10 | styles: 11 | container: 12 | - border-radius: 100px 13 | - overflow: visible 14 | - background: none 15 | card: 16 | - height: 40px 17 | - padding: 0 20px 18 | - background: var(--brightness) 19 | track: 20 | - overflow: visible 21 | - background: none 22 | progress: 23 | - background: none 24 | thumb: 25 | - background: var(--black) 26 | - top: 2px 27 | - right: '-18px' 28 | - height: 36px 29 | - width: 36px 30 | - border-radius: 100px 31 | styles: 32 | grid: 33 | - grid-template-areas: '"n" "slider"' 34 | - grid-template-columns: 1fr 35 | - grid-template-rows: 1fr min-content min-content 36 | card: 37 | # - font-family: In case of a custom font, otherwise you can remove this line 38 | - background: var(--brightness-tint) 39 | - padding: 16px 40 | - '--mdc-ripple-press-opacity': 0 41 | name: 42 | - justify-self: start 43 | - font-size: 14px 44 | - margin: 4px 0 12px 0 45 | - color: var(--contrast20) -------------------------------------------------------------------------------- /docs_src/ahc/sections/presence_detection.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🚶 Presence Detection 6 | 7 | With presence detection, you can set the comfort temperature if presence or movement is detected. Furthermore, you can also integrate your own binary sensors and use them as presence sensors. 8 | 9 | !!! warning "An overview explaining the logic will follow later in the documentation." 10 | 11 | ## 🚶 Presence Sensor 12 | 13 | Here you can specify your presence entity. This can be an *input boolean* or a *binary sensor*. 14 | 15 | !!! info "Some presence sensors need to be debounced since they are triggering too often. Have a look in the Helpful Snippet Section." 16 | 17 | ## ⏲️ Presence Sensor Schedule 18 | 19 | Mit einem Präsenz Schedule kannst du zeitliche Bereiche festlegen, an denen die Präsenzerkennung zum tragen kommen darf. 20 | 21 |
22 | ![Image title](images/ahc/presence_scheduler.png){ width="300" } 23 |
Example Presence Schedule - Blue means presence could be detected
24 |
25 | 26 | ## ⏳ Presence Reaction On Time 27 | 28 | To prevent the comfort temperature from being set if you only briefly enter the room, you can set a time tolerance here. The sensor must continuously detect presence for this period for the comfort temperature to be set. 29 | 30 | ## ⌛ Presence Reaction Off Time 31 | 32 | To prevent the eco temperature from being set immediately when you briefly leave the room, you can set a period here during which no presence must be detected for the temperature to fall back to the eco temperature. -------------------------------------------------------------------------------- /docs_src/ahc/sections/force_comfort_eco.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🤜 Force Comfort / Eco Mode 6 | 7 | ## 🎈 Party Mode 8 | 9 | The party mode activates the comfort mode and thus overrides schedules or presence sensors. Here you can use binary entities or timers. 10 | If you append a number to the end of the friendly name, it will be interpreted as a temperature and set accordingly. 11 | When the windows are opened, the thermostats are still turned off or down. 12 | 13 | | Type | Example | 14 | | --------------- | ------------------- | 15 | | binary_sensor | binary_sensor.party | 16 | | input_boolean | input_boolean.party | 17 | | timer | timer.party | 18 | 19 | !!! info "NOTE" 20 | 21 | If you name your entity like *Party Mode 25* the target temperature is set to 25° if the entity is enabled / running. 22 | 23 | ## 🥵 Force Max Temperature 24 | 25 | Force Max temperature sets all thermostats to their maximum. Even if the windows are open, the thermostats remain at the highest level. 26 | This function is to be used, for example, during the maintenance of the central heating system. 27 | 28 | ## 🌱 Force Eco Temperature 29 | 30 | This setting suppresses the comfort mode and sets the eco mode. The window detection still works. 31 | 32 | ## 🔄 Legacy Restore 33 | 34 | The restoration of temperatures is realized through temporary scenes. Some thermostats have problems with this method and do not return to the previous setting. 35 | In this case this option can be activated. The temperature is determined by the automation but may differ from the previous one if the thermostat was manually adjusted. -------------------------------------------------------------------------------- /docs_src/ahc/sections/temperature_tweaks.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🎚️ Temperature Tweaks 6 | 7 | ## 🛑 Off Instead Of Eco 8 | 9 | If your heating schedule is *off* or nobody triggers your presence sensor the automation sets the eco temperature. Enable this option to turn off the climates instead. 10 | 11 | ## ⬇️ Min Instead Of Off 12 | 13 | If the automation detects open windows or the winter mode is turned *off* the automation sets the thermostats to *off*. Enable this option to set the eco temperature instead. 14 | 15 | ## 🇫 Fahrenheit 16 | 17 | If Fahrenheit is your unit enable this option. 18 | 19 | !!! warning "Experimental" 20 | 21 | This feature is still untested. If you experience any issues, please let me know. 22 | 23 | ## ↩️ Reset Temperature 24 | 25 | Enable this option to reset your temperature entities after a switch between eco and comfort temperature. 26 | 27 | ``` mermaid 28 | sequenceDiagram 29 | autonumber 30 | ECO->>COMFORT: Eco Temperature Reset 31 | COMFORT-->>ECO: Comfort Temperature Reset 32 | ``` 33 | 34 | ## ↕️ Off If Above / Below Room Temperature 35 | 36 | If the room temperature hits the target temperature your climates get turned *off*. For HVAC Mode *Cool* the room temperature must be lower or equal before the climates get turned *off*. 37 | 38 | 39 | ## 🧪 Physical Temperature Change / Sync 40 | 41 | If you want to synchronize a manually set temperature with your other thermostats or temperature entities, you can activate this option. 42 | 43 | !!! warning "Experimental" 44 | 45 | This feature has several side effects. It's not recommended to enable this option in a combination with generic calibration or aggressive mode. -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.te.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="ఀ-ఄఅ-ఔక-హా-ౌౕ-ౖౘ-ౚౠ-ౡౢ-ౣ౦-౯౸-౿఼ఽ్ౝ౷౤౥",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("అందరూ అందుబాటులో అడగండి అడగడం అడ్డంగా అనుగుణంగా అనుమతించు అనుమతిస్తుంది అయితే ఇప్పటికే ఉన్నారు ఎక్కడైనా ఎప్పుడు ఎవరైనా ఎవరో ఏ ఏదైనా ఏమైనప్పటికి ఒక ఒకరు కనిపిస్తాయి కాదు కూడా గా గురించి చుట్టూ చేయగలిగింది తగిన తర్వాత దాదాపు దూరంగా నిజంగా పై ప్రకారం ప్రక్కన మధ్య మరియు మరొక మళ్ళీ మాత్రమే మెచ్చుకో వద్ద వెంట వేరుగా వ్యతిరేకంగా సంబంధం".split(" ")),e.te.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.te.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}}); -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.ta.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="஀-உஊ-ஏஐ-ஙச-ட஠-னப-யர-ஹ஺-ிீ-௉ொ-௏ௐ-௙௚-௟௠-௩௪-௯௰-௹௺-௿a-zA-Za-zA-Z0-90-9",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("அங்கு அங்கே அது அதை அந்த அவர் அவர்கள் அவள் அவன் அவை ஆக ஆகவே ஆகையால் ஆதலால் ஆதலினால் ஆனாலும் ஆனால் இங்கு இங்கே இது இதை இந்த இப்படி இவர் இவர்கள் இவள் இவன் இவை இவ்வளவு உனக்கு உனது உன் உன்னால் எங்கு எங்கே எது எதை எந்த எப்படி எவர் எவர்கள் எவள் எவன் எவை எவ்வளவு எனக்கு எனது எனவே என் என்ன என்னால் ஏது ஏன் தனது தன்னால் தானே தான் நாங்கள் நாம் நான் நீ நீங்கள்".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}}); -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.zh.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 為 以 于 於 上 他 而 后 後 之 来 來 及 了 因 下 可 到 由 这 這 与 與 也 此 但 并 並 个 個 其 已 无 無 小 我 们 們 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 當 从 從 得 打 凡 儿 兒 尔 爾 该 該 各 给 給 跟 和 何 还 還 即 几 幾 既 看 据 據 距 靠 啦 另 么 麽 每 嘛 拿 哪 您 凭 憑 且 却 卻 让 讓 仍 啥 如 若 使 谁 誰 虽 雖 随 隨 同 所 她 哇 嗡 往 些 向 沿 哟 喲 用 咱 则 則 怎 曾 至 致 着 著 诸 諸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}}); -------------------------------------------------------------------------------- /rounded/templates/sensor.yaml: -------------------------------------------------------------------------------- 1 | sensor: 2 | variables: 3 | max_height: false 4 | template: 5 | - base 6 | show_name: true 7 | show_icon: false 8 | show_state: false 9 | state: 10 | - operator: template 11 | value: "[[[ return variables.extra_entity != null; ]]]" 12 | custom_fields: 13 | es: "[[[ return states[variables.extra_entity].state + (states[variables.extra_entity].attributes.unit_of_measurement != null ? states[variables.extra_entity].attributes.unit_of_measurement : ''); ]]]" 14 | custom_fields: 15 | unit: "[[[ return states[entity.entity_id].attributes.unit_of_measurement; ]]]" 16 | styles: 17 | grid: 18 | - grid-template-areas: '"es es" "cs unit" "cs unit" "n n"' 19 | - grid-template-columns: min-content 1fr 20 | - grid-template-rows: 1fr min-content min-content min-content 21 | name: 22 | - justify-self: start 23 | - align-self: start 24 | - font-size: 12px 25 | - margin: 0px 26 | card: 27 | - height: "[[[ return variables.max_height ? '100%' : '100px';]]]" 28 | custom_fields: 29 | es: 30 | - line-height: 16px 31 | - align-self: start 32 | - min-width: 12px 33 | - z-index: 5 34 | - justify-self: end 35 | - font-size: 12px 36 | - height: "16px" 37 | - border-radius: 16px 38 | - background: 'var(--darker)' 39 | - margin-bottom: 4px 40 | cs: 41 | - margin: 0px 42 | - line-height: 18px 43 | - font-size: 18px 44 | - justify-self: start 45 | - align-self: end 46 | unit: 47 | - margin: 0px 48 | - justify-self: start 49 | - align-self: end 50 | - line-height: 15px 51 | - font-size: 12px 52 | - color: "[[[ return states[entity.entity_id].state == 'on' ? 'var(--black)' : 'var(--contrast10)'; ]]]" 53 | - padding-left: 2px -------------------------------------------------------------------------------- /rounded/templates/input_number.yaml: -------------------------------------------------------------------------------- 1 | input_number: 2 | template: base 3 | tap_action: 4 | action: none 5 | haptic: medium 6 | hold_action: 7 | action: more-info 8 | haptic: medium 9 | custom_fields: 10 | cs: "[[[ return states[entity.entity_id].state ]]]" 11 | inc: 12 | card: 13 | type: "custom:button-card" 14 | entity: "[[[ return entity.entity_id ]]]" 15 | icon: 'mdi:plus' 16 | template: button_single 17 | show_name: false 18 | styles: 19 | grid: 20 | - grid-template-areas: '"i"' 21 | card: 22 | - padding: 0px 23 | - margin: 0px 24 | - border-radius: 8px 25 | tap_action: 26 | action: "call-service" 27 | service: "input_number.increment" 28 | service_data: 29 | entity_id: "[[[ return entity.entity_id ]]]" 30 | dec: 31 | card: 32 | type: "custom:button-card" 33 | entity: "[[[ return entity.entity_id ]]]" 34 | icon: 'mdi:minus' 35 | template: button_single 36 | show_name: false 37 | styles: 38 | grid: 39 | - grid-template-areas: '"i"' 40 | card: 41 | - padding: 0px 42 | - margin: 0px 43 | - border-radius: 8px 44 | tap_action: 45 | action: "call-service" 46 | service: "input_number.decrement" 47 | service_data: 48 | entity_id: "[[[ return entity.entity_id ]]]" 49 | styles: 50 | custom_fields: 51 | inc: 52 | - width: 32px 53 | - width: 32px 54 | - margin-right: 24px 55 | dec: 56 | - width: 32px 57 | - width: 32px 58 | grid: 59 | - grid-template-areas: '"i i i" "n inc dec" "cs inc dec"' 60 | - grid-template-columns: 1fr min-content min-content 61 | - grid-template-rows: 1fr min-content min-content 62 | -------------------------------------------------------------------------------- /docs_src/ahc/sections/away_mode.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🏃 Away Mode 6 | 7 | The away mode lowers the temperature if comfort is set and you briefly leave the house or room. You have several options for this. 8 | 9 | ## 🏃 Away Temperature Offset 10 | 11 | The offset that is subtracted from the current comfort temperature if the away mode is triggered. *0* means off. 12 | 13 | ## ⏲️ Schedule Away Mode 14 | 15 | If this option is activated, the away mode is activated as soon as the active schedule is *on* but no one is at home. If the schedule is *off* and no one is at home, the eco temperature is set as usual. 16 | 17 | ## 🚶 Presence Away Mode 18 | 19 | If someone is at home but no presence is detected, the away mode is activated. 20 | 21 | | Presence | Person | Presence Schedule | Mode | 22 | | --------------- | -------- |------------------ | --------- | 23 | | Detected | home | not set | Comfort | 24 | | Not Detected | home | not set | Away Mode | 25 | | - | not home | no matter | Eco | 26 | | Detected | home | on | Comfort | 27 | | Not Detected | home | on | Away Mode | 28 | | Detected | home | off | Eco | 29 | | Not Detected | home | off | Eco | 30 | 31 | 32 | ## 🚶 Ignore People For Presence Away Mode 33 | 34 | If you want to ignore persons for the away mode enable this option. 35 | 36 | | Presence | Presence Schedule | Mode | 37 | | --------------- |------------------ | --------- | 38 | | Detected | not set | Comfort | 39 | | Not Detected | not set | Eco | 40 | | Detected | on | Comfort | 41 | | Not Detected | on | Away Mode | 42 | | Detected | off | Eco | 43 | | Not Detected | off | Eco | -------------------------------------------------------------------------------- /rounded/templates/weather_pill.yaml: -------------------------------------------------------------------------------- 1 | weather_pill: 2 | template: pill 3 | show_icon: true 4 | show_name: true 5 | name: '[[[ return states[entity.entity_id].attributes.temperature + "°C" ]]]' 6 | label: '[[[ return states[entity.entity_id].attributes.humidity + "%" ]]]' 7 | styles: 8 | card: 9 | - background: "[[[ return variables.flash_warning ? 'var(--red)' : 'var(--contrast20)'; ]]]" 10 | state: 11 | - operator: '==' 12 | value: clear-night 13 | icon: mdi:weather-night 14 | - operator: '==' 15 | value: cloudy 16 | icon: mdi:weather-cloudy 17 | - operator: '==' 18 | value: fog 19 | icon: mdi:weather-fog 20 | - operator: '==' 21 | value: hail 22 | icon: mdi:weather-hail 23 | - operator: '==' 24 | value: lightning 25 | icon: mdi:weather-lightning 26 | - operator: '==' 27 | value: lightning-rainy 28 | icon: mdi:weather-lightning-rainy 29 | - operator: '==' 30 | value: partlycloudy 31 | icon: "[[[ return states['sun.sun'].state == 'above_horizon' ? 'mdi:weather-partly-cloudy' : 'mdi:weather-night-partly-cloudy'; ]]]" 32 | - operator: '==' 33 | value: pouring 34 | icon: mdi:weather-pouring 35 | - operator: '==' 36 | value: rainy 37 | icon: mdi:weather-rainy 38 | styles: 39 | icon: 40 | - color: 'var(--blue)' 41 | - operator: '==' 42 | value: snowy 43 | icon: mdi:weather-snowy 44 | - operator: '==' 45 | value: snowy-rainy 46 | icon: mdi:weather-snowy-rainy 47 | - operator: '==' 48 | value: sunny 49 | icon: mdi:weather-sunny 50 | styles: 51 | icon: 52 | - color: 'var(--yellow)' 53 | - operator: '==' 54 | value: windy 55 | icon: mdi:weather-windy 56 | - operator: '==' 57 | value: windy-variant 58 | icon: mdi:weather-windy-variant 59 | - operator: '==' 60 | value: exceptional 61 | icon: mdi:weather-cloudy-alert 62 | styles: 63 | icon: 64 | - color: 'var(--red)' -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.ja.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n 10 | | Target temperature | Room temperature | heating | 11 | | ------------------ | ---------------- | ------- | 12 | | 21° | 20° | no | 13 | | 21° | 20.5 | no | 14 | | 21° | 19.5° | yes | 15 | 16 | *Normal behavior without Aggressive Mode* 17 | 18 | 19 | To counteract this, you can deliberately choose the target temperature to be higher or lower to cause heating or closing of the valve. You can dynamically implement this behavior with the *Aggressive Mode*. 20 | 21 | ``` mermaid 22 | packet-beta 23 | title Example: Target temperature = 20°, Range = 0.2°, Offset = 2° 24 | 0-13: "Below the range: target temperature + offset" 25 | 14-17: "Range: 19.8°-20.2°" 26 | 18-31: "Above the range: target temperature - offset" 27 | ``` 28 | 29 | ## 😡 Aggressive Range 30 | 31 | You can set a range around your target temperature within which the actual temperature is set. This means: If the room temperature is within this range, the normal target temperature is set. However, if it is higher or lower, an offset is added. 32 | 33 | ## ↕ Aggressive Offset 34 | 35 | The offset indicates how many degrees are added to make your thermostat start heating. This is then added to the target temperature if the room temperature is outside the range you defined. 36 | 37 | !!! info "Remember that the target temperature is modified and no longer corresponds to the actual target temperature." 38 | 39 | ## 🌡️ Aggressive Calibration 40 | 41 | If your thermostat is calibrated natively, i.e., via a special entity, the Aggressive Mode can also be modulated to the calibration. This has the advantage that your thermostat always displays the correct target temperature. However, the locally measured temperature may then differ. -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.hi.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Za-zA-Z0-90-9",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}}); -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.kn.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.kn=function(){this.pipeline.reset(),this.pipeline.add(e.kn.trimmer,e.kn.stopWordFilter,e.kn.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.kn.stemmer))},e.kn.wordCharacters="ಀ-಄ಅ-ಔಕ-ಹಾ-ೌ಼-ಽೕ-ೖೝ-ೞೠ-ೡೢ-ೣ೤೥೦-೯ೱ-ೳ",e.kn.trimmer=e.trimmerSupport.generateTrimmer(e.kn.wordCharacters),e.Pipeline.registerFunction(e.kn.trimmer,"trimmer-kn"),e.kn.stopWordFilter=e.generateStopWordFilter("ಮತ್ತು ಈ ಒಂದು ರಲ್ಲಿ ಹಾಗೂ ಎಂದು ಅಥವಾ ಇದು ರ ಅವರು ಎಂಬ ಮೇಲೆ ಅವರ ತನ್ನ ಆದರೆ ತಮ್ಮ ನಂತರ ಮೂಲಕ ಹೆಚ್ಚು ನ ಆ ಕೆಲವು ಅನೇಕ ಎರಡು ಹಾಗು ಪ್ರಮುಖ ಇದನ್ನು ಇದರ ಸುಮಾರು ಅದರ ಅದು ಮೊದಲ ಬಗ್ಗೆ ನಲ್ಲಿ ರಂದು ಇತರ ಅತ್ಯಂತ ಹೆಚ್ಚಿನ ಸಹ ಸಾಮಾನ್ಯವಾಗಿ ನೇ ಹಲವಾರು ಹೊಸ ದಿ ಕಡಿಮೆ ಯಾವುದೇ ಹೊಂದಿದೆ ದೊಡ್ಡ ಅನ್ನು ಇವರು ಪ್ರಕಾರ ಇದೆ ಮಾತ್ರ ಕೂಡ ಇಲ್ಲಿ ಎಲ್ಲಾ ವಿವಿಧ ಅದನ್ನು ಹಲವು ರಿಂದ ಕೇವಲ ದ ದಕ್ಷಿಣ ಗೆ ಅವನ ಅತಿ ನೆಯ ಬಹಳ ಕೆಲಸ ಎಲ್ಲ ಪ್ರತಿ ಇತ್ಯಾದಿ ಇವು ಬೇರೆ ಹೀಗೆ ನಡುವೆ ಇದಕ್ಕೆ ಎಸ್ ಇವರ ಮೊದಲು ಶ್ರೀ ಮಾಡುವ ಇದರಲ್ಲಿ ರೀತಿಯ ಮಾಡಿದ ಕಾಲ ಅಲ್ಲಿ ಮಾಡಲು ಅದೇ ಈಗ ಅವು ಗಳು ಎ ಎಂಬುದು ಅವನು ಅಂದರೆ ಅವರಿಗೆ ಇರುವ ವಿಶೇಷ ಮುಂದೆ ಅವುಗಳ ಮುಂತಾದ ಮೂಲ ಬಿ ಮೀ ಒಂದೇ ಇನ್ನೂ ಹೆಚ್ಚಾಗಿ ಮಾಡಿ ಅವರನ್ನು ಇದೇ ಯ ರೀತಿಯಲ್ಲಿ ಜೊತೆ ಅದರಲ್ಲಿ ಮಾಡಿದರು ನಡೆದ ಆಗ ಮತ್ತೆ ಪೂರ್ವ ಆತ ಬಂದ ಯಾವ ಒಟ್ಟು ಇತರೆ ಹಿಂದೆ ಪ್ರಮಾಣದ ಗಳನ್ನು ಕುರಿತು ಯು ಆದ್ದರಿಂದ ಅಲ್ಲದೆ ನಗರದ ಮೇಲಿನ ಏಕೆಂದರೆ ರಷ್ಟು ಎಂಬುದನ್ನು ಬಾರಿ ಎಂದರೆ ಹಿಂದಿನ ಆದರೂ ಆದ ಸಂಬಂಧಿಸಿದ ಮತ್ತೊಂದು ಸಿ ಆತನ ".split(" ")),e.kn.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.kn.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var n=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(n).split("|")},e.Pipeline.registerFunction(e.kn.stemmer,"stemmer-kn"),e.Pipeline.registerFunction(e.kn.stopWordFilter,"stopWordFilter-kn")}}); -------------------------------------------------------------------------------- /docs_src/ahc/sections/schedules.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🕑 Scheduling 6 | 7 | Mit Schedules kannst du einen einfachen Heizplan erstellen mit dem du zwischen der Eco und der Comfort Temperatur wechseln kannst. Weiterhin kannst du mit den Heating Adjustments und auch mit Personen Einfluss auf das Verhalten und auf die Temperaturen nehmen. 8 | 9 | !!! warning "An overview explaining the logic will follow later in the documentation." 10 | 11 | ## 🕑 Schedules 12 | 13 | Here you can add your schedules. Schedules are helpers that you can easily create in your Home Assistant. 14 | 15 |
16 | ![Image title](images/ahc/heating_scheduler.png){ width="300" } 17 |
Example Heating Schedule - Blue means comfort mode
18 |
19 | 20 | You can set as many schedules as you like. To select a schedule, you can do it by providing a Schedule Selector. 21 | 22 | ## 👆 Schedule Selector 23 | 24 | Here you can specify an entity that determines the selection of the active schedule. If you only have one schedule, you can ignore this point. 25 | If you want to switch between two schedules, a binary entity is sufficient. However, you can also specify entities whose status is a number, thus activating the respective scheduler. Entities that hold text as status are also possible. The value is then matched with the friendly name of the respective schedule. It only needs to partially match. 26 | 27 | | Type | Possible Values | Example | Description | 28 | | --------------- | ------------------------- | ------------------ | ------------------------------------------------------------------------------------ | 29 | | binary_sensor | on, off | *on* | Selects the 2nd of max two schedules | 30 | | input_boolean | on, off | *off* | Selects the 1st of max two schedules | 31 | | input_text | *custom text*, *integers* | *Holiday* | Selects the first schedule that contains the word *Holiday* in its friendly name | 32 | | input_number | *integers* | *3* | Selects the 3rd schedule | 33 | | input_select | *custom text*, *integers* | *Workday Schedule* | Selects the first schedule that contains the *Workday Schedule* in its friendly name | -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.sa.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sa=function(){this.pipeline.reset(),this.pipeline.add(e.sa.trimmer,e.sa.stopWordFilter,e.sa.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sa.stemmer))},e.sa.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿ꣠-꣱ꣲ-ꣷ꣸-ꣻ꣼-ꣽꣾ-ꣿᆰ0-ᆰ9",e.sa.trimmer=e.trimmerSupport.generateTrimmer(e.sa.wordCharacters),e.Pipeline.registerFunction(e.sa.trimmer,"trimmer-sa"),e.sa.stopWordFilter=e.generateStopWordFilter('तथा अयम्‌ एकम्‌ इत्यस्मिन्‌ तथा तत्‌ वा अयम्‌ इत्यस्य ते आहूत उपरि तेषाम्‌ किन्तु तेषाम्‌ तदा इत्यनेन अधिकः इत्यस्य तत्‌ केचन बहवः द्वि तथा महत्वपूर्णः अयम्‌ अस्य विषये अयं अस्ति तत्‌ प्रथमः विषये इत्युपरि इत्युपरि इतर अधिकतमः अधिकः अपि सामान्यतया ठ इतरेतर नूतनम्‌ द न्यूनम्‌ कश्चित्‌ वा विशालः द सः अस्ति तदनुसारम् तत्र अस्ति केवलम्‌ अपि अत्र सर्वे विविधाः तत्‌ बहवः यतः इदानीम्‌ द दक्षिण इत्यस्मै तस्य उपरि नथ अतीव कार्यम्‌ सर्वे एकैकम्‌ इत्यादि। एते सन्ति उत इत्थम्‌ मध्ये एतदर्थं . स कस्य प्रथमः श्री. करोति अस्मिन् प्रकारः निर्मिता कालः तत्र कर्तुं समान अधुना ते सन्ति स एकः अस्ति सः अर्थात् तेषां कृते . स्थितम् विशेषः अग्रिम तेषाम्‌ समान स्रोतः ख म समान इदानीमपि अधिकतया करोतु ते समान इत्यस्य वीथी सह यस्मिन् कृतवान्‌ धृतः तदा पुनः पूर्वं सः आगतः किम्‌ कुल इतर पुरा मात्रा स विषये उ अतएव अपि नगरस्य उपरि यतः प्रतिशतं कतरः कालः साधनानि भूत तथापि जात सम्बन्धि अन्यत्‌ ग अतः अस्माकं स्वकीयाः अस्माकं इदानीं अन्तः इत्यादयः भवन्तः इत्यादयः एते एताः तस्य अस्य इदम् एते तेषां तेषां तेषां तान् तेषां तेषां तेषां समानः सः एकः च तादृशाः बहवः अन्ये च वदन्ति यत् कियत् कस्मै कस्मै यस्मै यस्मै यस्मै यस्मै न अतिनीचः किन्तु प्रथमं सम्पूर्णतया ततः चिरकालानन्तरं पुस्तकं सम्पूर्णतया अन्तः किन्तु अत्र वा इह इव श्रद्धाय अवशिष्यते परन्तु अन्ये वर्गाः सन्ति ते सन्ति शक्नुवन्ति सर्वे मिलित्वा सर्वे एकत्र"'.split(" ")),e.sa.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.sa.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.sa.stemmer,"stemmer-sa"),e.Pipeline.registerFunction(e.sa.stopWordFilter,"stopWordFilter-sa")}}); -------------------------------------------------------------------------------- /rounded/templates/calendar.yaml: -------------------------------------------------------------------------------- 1 | calendar: 2 | template: title_card 3 | variables: 4 | active_color: 'red' 5 | show_label: true 6 | name: '[[[ return entity.attributes.message ]]]' 7 | label: | 8 | [[[ 9 | const startDate = new Date(states[entity.entity_id].attributes.start_time); 10 | const endDate = new Date(states[entity.entity_id].attributes.end_time); 11 | 12 | const startDay = startDate.toLocaleDateString(); 13 | const endDay = endDate.toLocaleDateString(); 14 | const today = (new Date()).toLocaleDateString(); 15 | 16 | if (states[entity.entity_id].attributes.all_day) { 17 | if(startDay == endDay) { 18 | return startDay; 19 | } 20 | 21 | return startDay +' - '+ endDay; 22 | } 23 | 24 | const startTime = startDate.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); 25 | const endTime = endDate.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); 26 | 27 | if(startDay == endDay) { 28 | if (startDay == today) { 29 | return startTime + ' - ' + endTime; 30 | } 31 | 32 | return startDay + ' ' + startTime + ' - ' + endTime; 33 | } 34 | 35 | return startDay + ' ' + startTime + ' - ' + endDay + ' ' + endTime; 36 | ]]] 37 | styles: 38 | grid: 39 | - grid-template-areas: '"n" "l"' 40 | - grid-template-columns: "1fr" 41 | - grid-template-rows: "min-content min-content" 42 | name: 43 | - color: var(--contrast20) 44 | - font-size: "32px" 45 | - color: > 46 | [[[ 47 | const startDate = new Date(states[entity.entity_id].attributes.start_time); 48 | const endDate = new Date(states[entity.entity_id].attributes.end_time); 49 | const today = new Date(); 50 | 51 | if (startDate <= today && today <= endDate) { 52 | return 'var(--' + variables.active_color + ')'; 53 | } 54 | 55 | return 'var(--contrast20)'; 56 | ]]] 57 | label: 58 | - font-weight: "bold" 59 | - font-size: "1rem" 60 | - opacity: "0.4" 61 | tap_action: 62 | action: fire-dom-event 63 | browser_mod: 64 | service: browser_mod.popup 65 | data: 66 | title: "[[[ return states[entity.entity_id].attributes.friendly_name; ]]]" 67 | content: 68 | type: "custom:atomic-calendar-revive" 69 | maxDaysToShow: 14 70 | showMonth: true 71 | showWeekDay: true 72 | entities: 73 | - entity: calendar.familie 74 | name: "[[[ return states[entity.entity_id].attributes.friendly_name; ]]]" 75 | -------------------------------------------------------------------------------- /rounded/templates/base/pill.yaml: -------------------------------------------------------------------------------- 1 | pill: 2 | variables: 3 | warning: false 4 | icon_color: contrast1 5 | show_label: true 6 | show_icon: false 7 | show_name: true 8 | size: 100% 9 | name: "[[[ return entity == null ? '' : states[entity.entity_id].state; ]]]" 10 | label: > 11 | [[[ 12 | return (entity == null || states[entity.entity_id].attributes.unit_of_measurement == '' || states[entity.entity_id].attributes.unit_of_measurement == null ? '' : '' + states[entity.entity_id].attributes.unit_of_measurement); 13 | ]]] 14 | tap_action: 15 | action: more-info 16 | haptic: medium 17 | custom_fields: 18 | alert: > 19 | [[[ 20 | return ''; 21 | ]]] 22 | # - opacity: "[[[ return variables.ulm_card_card_panhans_room_entity_4 ? (variables.ulm_card_card_panhans_room_entity_4_on == true ? '100%' : '20%') : '0%'; ]]]" 23 | styles: 24 | grid: 25 | - grid-template-areas: '"i n l"' 26 | - grid-template-columns: min-content min-content min-content 27 | - grid-template-rows: min-content 28 | card: 29 | - padding: 6px 10px 30 | - font-size: 18px 31 | - line-height: 18px 32 | - font-weight: 500 33 | - background: var(--contrast20) 34 | - width: auto 35 | img_cell: 36 | - place-self: center 37 | - width: 18px 38 | - height: 18px 39 | - line-height: 18px 40 | - margin-top: -2px 41 | - margin-right: 4px 42 | # - transform: translateY(-1px) 43 | - border-radius: 0% 44 | icon: 45 | - line-height: 16px 46 | - color: "[[[return 'var(--'+variables.icon_color+')';]]]" 47 | - animation: "[[[ return variables.flash_warning ? 'blink 2s ease infinite' : 'none'; ]]]" 48 | name: 49 | - line-height: 18px 50 | - font-size: 12px 51 | - color: var(--contrast1) 52 | - animation: "[[[ return variables.flash_warning ? 'blink 2s ease infinite' : 'none'; ]]]" 53 | label: 54 | - line-height: 18px 55 | - font-size: 12px 56 | - margin-left: "[[[ return '4px'; ]]]" 57 | - color: var(--contrast12) 58 | - animation: "[[[ return variables.flash_warning ? 'blink 2s ease infinite' : 'none'; ]]]" 59 | custom_fields: 60 | alert: 61 | - border-radius: 50% 62 | - position: absolute 63 | - height: 14px 64 | - width: 14px 65 | - line-height: 14px 66 | - margin-left: 8px 67 | - margin-top: -4px 68 | - justify-self: start 69 | - align-self: start 70 | - border-radius: "50%" 71 | - background-color: "var(--white)" 72 | - color: "var(--red)" 73 | - display: "[[[ return variables.alert ? 'block' : 'none'; ]]]" 74 | - animation: blink 2s ease infinite -------------------------------------------------------------------------------- /rounded/templates/base/base.yaml: -------------------------------------------------------------------------------- 1 | base: 2 | show_state: false 3 | template: 4 | - state_engine 5 | variables: 6 | active_color: orange 7 | max_height: false 8 | on_state: '' 9 | styles: 10 | grid: 11 | - grid-template-areas: '"i es" "n n" "space space" "cs cs"' 12 | - grid-template-columns: 1fr min-content 13 | - grid-template-rows: min-content min-content 1fr min-content 14 | card: 15 | - z-index: 0 16 | - background: "[[[ return states[entity.entity_id].state == 'on' || states[entity.entity_id].state == variables.on_state ? 'var(--' + variables.active_color + ')' : 'var(--contrast6)'; ]]]" 17 | - padding: 16px 18 | - '--mdc-ripple-press-opacity': 0 19 | - height: "[[[ return variables.max_height ? '100%' : '100px'; ]]]" 20 | img_cell: 21 | - z-index: 1 22 | - justify-self: start 23 | - width: 24px 24 | - height: 24px 25 | - line-height: 24px 26 | - border-radius: 8px 27 | icon: 28 | - z-index: 2 29 | - width: 24px 30 | - height: 24px 31 | - line-height: 24px 32 | - color: "[[[ return states[entity.entity_id].state == 'on' || states[entity.entity_id].state == variables.on_state ? 'var(--black)' : 'var(--contrast18)'; ]]]" 33 | name: 34 | - z-index: 3 35 | - text-align: start 36 | - white-space: no-wrap 37 | - font-weight: 50 38 | - justify-self: start 39 | - font-size: 12px 40 | - margin: 6px 0 2px 0 41 | - color: "[[[ return states[entity.entity_id].state == 'on' || states[entity.entity_id].state == variables.on_state ? 'var(--black)' : 'var(--contrast18)'; ]]]" 42 | - text-overflow: ellipsis 43 | custom_fields: 44 | cs: 45 | - text-align: left 46 | - white-space: "[[[ return variables.max_height ? 'normal' : 'no_wrap'; ]]]" 47 | - z-index: 4 48 | - justify-self: start 49 | - font-size: 12px 50 | - font-weight: 900 51 | - line-height: 16px 52 | - width: 100% 53 | - color: "[[[ return states[entity.entity_id].state == 'on' || states[entity.entity_id].state == variables.on_state ? 'var(--black)' : 'var(--contrast10)'; ]]]" 54 | es: 55 | - min-width: 12px 56 | - z-index: 5 57 | - justify-self: end 58 | - font-size: 12px 59 | - height: "16px" 60 | - border-radius: 16px 61 | - padding: 2px 4px 2px 4px 62 | - background: var(--darker) 63 | - color: "[[[ return states[entity.entity_id].state == 'on' || states[entity.entity_id].state == variables.on_state ? 'var(--black)' : 'var(--contrast10)'; ]]]" 64 | style: | 65 | ha-card { 66 | transition: 300ms !important; 67 | } -------------------------------------------------------------------------------- /snippets/ahc_template_sensor.yaml: -------------------------------------------------------------------------------- 1 | template: 2 | - trigger: 3 | - trigger: event 4 | event_type: ahc_event 5 | event_data: 6 | automation: automation.ahc # edit this to your automation id 7 | binary_sensor: 8 | - name: "AHC Test Room Data" # give the sensor a name 9 | unique_id: AHC Test Room # and ofcourse an ID 10 | state: "{{ trigger.event.data.state }}" 11 | attributes: 12 | mode: "{{ trigger.event.data.mode }}" 13 | automation: "{{ trigger.event.data.automation }}" 14 | is_person_defined: "{{ trigger.event.data.is_person_defined }}" 15 | is_proximity_defined: "{{ trigger.event.data.is_proximity_defined }}" 16 | is_anybody_home: "{{ trigger.event.data.is_anybody_home }}" 17 | is_guest_mode: "{{ trigger.event.data.is_guest_mode }}" 18 | active_scheduler: "{{ trigger.event.data.active_scheduler }}" 19 | state_scheduler: "{{ trigger.event.data.state_scheduler }}" 20 | state_presence_sensor: "{{ trigger.event.data.state_presence_sensor }}" 21 | state_presence_scheduler: "{{ trigger.event.data.state_presence_scheduler }}" 22 | state_presence: "{{ trigger.event.data.state_presence }}" 23 | state_proximity_arrived: "{{ trigger.event.data.state_proximity_arrived }}" 24 | state_proximity_way_home: "{{ trigger.event.data.state_proximity_way_home }}" 25 | is_force_max_temperature: "{{ trigger.event.data.is_force_max_temperature }}" 26 | active_party_entity: "{{ trigger.event.data.active_party_entity }}" 27 | party_temp: "{{ trigger.event.data.party_temp }}" 28 | is_away: "{{ trigger.event.data.is_away }}" 29 | state_window: "{{ trigger.event.data.state_window }}" 30 | is_frost_protection: "{{ trigger.event.data.is_frost_protection }}" 31 | is_liming_protection: "{{ trigger.event.data.is_liming_protection }}" 32 | state_outside_temp: "{{ trigger.event.data.state_outside_temp }}" 33 | entry_time: "{{ trigger.event.data.entry_time }}" 34 | thermostats: "{{ trigger.event.data.thermostats }}" 35 | hvac_mode: "{{ trigger.event.data.hvac_mode }}" 36 | temperature_comfort: "{{ trigger.event.data.temperature_comfort }}" 37 | temperature_eco: "{{ trigger.event.data.temperature_eco}}" 38 | target_temperature: "{{ trigger.event.data.target_temperature}}" 39 | set_max_temperature: "{{ trigger.event.data.set_max_temperature}}" 40 | last_trigger_id: "{{ trigger.event.data.last_trigger_id}}" 41 | last_calibration: "{{ iif(trigger.event.data.calibration_trigger, now(), this.attributes.last_calibration)}}" 42 | last_temperature_change: "{{ iif(trigger.event.data.change_trigger, now(), this.attributes.last_temperature_change)}}" -------------------------------------------------------------------------------- /rounded/templates/party_mode.yaml: -------------------------------------------------------------------------------- 1 | party_mode: 2 | template: input_number 3 | triggers_update: all 4 | custom_fields: 5 | cs: > 6 | [[[ 7 | if (states[entity.entity_id].state == 'on') { 8 | let minutes = states[variables.party_input_number].state * 60; 9 | let last_changed = new Date(states[entity.entity_id].last_changed); 10 | let party_off_date = new Date(last_changed.getTime() + minutes*60000); 11 | 12 | return "bis " + party_off_date.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) + ' Uhr'; 13 | } 14 | 15 | return "Aus"; 16 | ]]] 17 | party: 18 | card: 19 | type: "custom:button-card" 20 | template: button_single 21 | entity: "[[[ return entity.entity_id; ]]]" 22 | show_name: false 23 | icon: mdi:power 24 | styles: 25 | grid: 26 | - grid-template-areas: '"i"' 27 | card: 28 | - padding: 0px 29 | - margin: 0px 30 | - border-radius: 8px 31 | tap_action: 32 | action: toggle 33 | haptic: medium 34 | inc: 35 | card: 36 | type: "custom:button-card" 37 | icon: 'mdi:plus' 38 | template: button_single 39 | show_name: false 40 | styles: 41 | grid: 42 | - grid-template-areas: '"i"' 43 | card: 44 | - padding: 0px 45 | - margin: 0px 46 | - border-radius: 8px 47 | tap_action: 48 | action: "call-service" 49 | service: "input_number.increment" 50 | service_data: 51 | entity_id: "[[[ return variables.party_input_number; ]]]" 52 | dec: 53 | card: 54 | type: "custom:button-card" 55 | entity: "[[[ return variables.party_input_number; ]]]" 56 | icon: 'mdi:minus' 57 | template: button_single 58 | show_name: false 59 | styles: 60 | grid: 61 | - grid-template-areas: '"i"' 62 | card: 63 | - padding: 0px 64 | - margin: 0px 65 | - border-radius: 8px 66 | tap_action: 67 | action: "call-service" 68 | service: "input_number.decrement" 69 | service_data: 70 | entity_id: "[[[ return variables.party_input_number ]]]" 71 | styles: 72 | custom_fields: 73 | party: 74 | - width: 32px 75 | - width: 32px 76 | - margin-right: 24px 77 | inc: 78 | - width: 32px 79 | - width: 32px 80 | - margin-right: 24px 81 | dec: 82 | - width: 32px 83 | - width: 32px 84 | grid: 85 | - grid-template-areas: '"i i i i" "n party inc dec" "cs party inc dec"' 86 | - grid-template-columns: 1fr min-content min-content min-content 87 | - grid-template-rows: 1fr min-content min-content -------------------------------------------------------------------------------- /rounded/templates/alarm.yaml: -------------------------------------------------------------------------------- 1 | alarm: 2 | template: base 3 | icon: 'mdi:shield-lock' 4 | variables: 5 | active_color: red 6 | state: 7 | - value: 'disarmed' 8 | icon: 'mdi:shield-home' 9 | custom_fields: 10 | cs: Inaktiv 11 | styles: 12 | card: 13 | - background: "var(--contrast6)" 14 | icon: 15 | - color: "var(--contrast18)" 16 | name: 17 | - color: "var(--contrast18)" 18 | custom_fields: 19 | cs: 20 | - color: "var(--contrast18)" 21 | es: 22 | - color: "var(--contrast18)" 23 | - value: 'armed_night' 24 | custom_fields: 25 | cs: Nacht 26 | - value: 'armed_custom_bypass' 27 | custom_fields: 28 | cs: Stiller Alarm 29 | - value: 'arming' 30 | styles: 31 | icon: 32 | - animation: blink 2s ease infinite 33 | custom_fields: 34 | cs: Aktiviere Alarm 35 | - value: 'armed_away' 36 | custom_fields: 37 | cs: Außer Haus 38 | - value: 'disarmed' 39 | custom_fields: 40 | cs: Aus 41 | styles: 42 | grid: 43 | - grid-template-areas: '"i i" "n ec" "cs ec"' 44 | - grid-template-columns: 1fr min-content 45 | - grid-template-rows: 1fr min-content min-content min-content 46 | custom_fields: 47 | ec: 48 | - justify-self: start 49 | - justify-content: center 50 | cs: 51 | - color: var(--black) 52 | es: 53 | - color: var(--black) 54 | card: 55 | - background: "[[[ return 'var(--' + variables.active_color + ')';]]]" 56 | icon: 57 | - color: var(--black) 58 | name: 59 | - color: var(--black) 60 | custom_fields: 61 | ec: 62 | card: 63 | type: tile 64 | entity: "[[[ return entity.entity_id; ]]]" 65 | color: red 66 | features: 67 | - type: "alarm-modes" 68 | modes: 69 | - armed_away 70 | - armed_night 71 | - armed_custom_bypass 72 | - disarmed 73 | card_mod: 74 | style: 75 | .: > 76 | .tile { 77 | display: none; 78 | } 79 | ha-card { 80 | width: 200px; 81 | background: transparent; 82 | border-radius: 0px; 83 | } 84 | ha-card.active { 85 | height: 40px; 86 | } 87 | .features hui-alarm-modes-tile-feature $: | 88 | .container { 89 | padding: 0px !important; 90 | } 91 | .features hui-alarm-modes-tile-feature $ .container ha-control-select $ .container: | 92 | .option { 93 | background-color: transparent !important; 94 | border-radius: 13px !important; 95 | } 96 | .option.selected { 97 | --control-select-color: var(--yellow) !important; 98 | } 99 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Panhans | Blueprints and Snippets 2 | site_url: https://panhans.github.io/HomeAssistant/ 3 | 4 | nav: 5 | - 🏠 Home: "index.md" 6 | - 🔥 Advanced Heating Control: 7 | - 📖 Sections & Inputs: 8 | - 🔘 Thermostats & Sensors: "ahc/sections/thermostats_sensors.md" 9 | - 🌡️ Temperatures: "ahc/sections/temperatures.md" 10 | - 🎛️ Adjustements & Heating Plan: "ahc/sections/adjustments_heating_plan.md" 11 | - 🤜 Force Comfort/Eco Mode: "ahc/sections/force_comfort_eco.md" 12 | - 🎚️ Temperature Tweaks: "ahc/sections/temperature_tweaks.md" 13 | - 👥 Persons: "ahc/sections/persons.md" 14 | - 🕑 Scheduling: "ahc/sections/schedules.md" 15 | - 🚶 Presence Detection: "ahc/sections/presence_detection.md" 16 | - ↔️ Proximity: "ahc/sections/proximity.md" 17 | - 🏃 Away Mode: "ahc/sections/away_mode.md" 18 | - 🪟 Windows & Doors: "ahc/sections/windows_doors.md" 19 | - 🧭 Calibration: "ahc/sections/calibration.md" 20 | - 😡 Aggressive Mode: "ahc/sections/aggressive_mode.md" 21 | - ⌖ Dynamic Valve Positioning: "ahc/sections/dynamic_valve_positioning.md" 22 | - 👆 Hints: 23 | - 🔑 Keywords: "ahc/hints/keywords.md" 24 | 25 | docs_dir: docs_src 26 | edit_uri: edit/main/src/ 27 | site_dir: docs 28 | 29 | extra_css: 30 | - style.css 31 | 32 | theme: 33 | name: "material" 34 | language: "en" 35 | font: false 36 | # logo: "assets/logos/website_logo.png" 37 | # favicon: "assets/logos/favicon/favicon-32x32.png" 38 | # custom_dir: "docs/assets/overrides" 39 | palette: 40 | - media: "(prefers-color-scheme: light)" 41 | primary: "white" 42 | toggle: 43 | icon: "material/weather-night" 44 | name: "Dark mode" 45 | - media: "(prefers-color-scheme: dark)" 46 | scheme: "slate" 47 | toggle: 48 | icon: "material/weather-sunny" 49 | name: "Light mode" 50 | features: 51 | - "navigation.instant" 52 | - "navigation.tracking" 53 | - "navigation.top" 54 | - "navigation.tabs" 55 | - "navigation.indexes" 56 | - "search.suggest" 57 | - "search.highlight" 58 | - "search.share" 59 | - "content.code.annotate" 60 | - "content.tabs.link" 61 | 62 | markdown_extensions: 63 | - "meta" 64 | - "pymdownx.superfences" 65 | - pymdownx.emoji: 66 | emoji_index: !!python/name:material.extensions.emoji.twemoji 67 | emoji_generator: !!python/name:material.extensions.emoji.to_svg 68 | - "admonition" 69 | - "pymdownx.details" 70 | - "pymdownx.inlinehilite" 71 | # - pymdownx.snippets: 72 | # base_path: [".", "custom_components/ui_lovelace_minimalist"] 73 | # check_paths: true 74 | - "pymdownx.critic" 75 | - "pymdownx.caret" 76 | - "pymdownx.keys" 77 | - "pymdownx.tilde" 78 | - pymdownx.blocks.caption 79 | - pymdownx.magiclink: 80 | repo_url_shorthand: true 81 | user: "Panhans" 82 | repo: "HomeAssistant" 83 | - pymdownx.superfences: 84 | custom_fences: 85 | - name: mermaid 86 | class: mermaid 87 | format: !!python/name:pymdownx.superfences.fence_code_format 88 | - "tables" 89 | - "footnotes" 90 | - "attr_list" 91 | - "md_in_html" 92 | - "def_list" 93 | - toc: 94 | permalink: true 95 | 96 | plugins: 97 | - "search" 98 | - "awesome-pages" 99 | - "glightbox" -------------------------------------------------------------------------------- /docs_src/ahc/sections/calibration.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # 🧭 Calibration 6 | 7 | If you have specified a room thermometer and your thermostats support native calibration, it is automatically active. Here you can fine-tune the calibration. 8 | 9 | ## ⏳ Calibration Timeout 10 | 11 | To prevent your calibration from being triggered too frequently, you can set a timeout here. This time is a minimum interval between two calibration calls. 12 | 13 | !!! info "This setting does not apply to Danfoss, Popp & Hive thermostats, as they need to be triggered more frequently to prevent the calibration value from being lost." 14 | 15 | ## ↔️ Calibration Delta 16 | 17 | To prevent calibration from being triggered by the slightest temperature change, you can specify a minimum distance here that must lie between the old calibration value and the new one for the calibration to be triggered. 18 | 19 | ### Example 20 | 21 | | Room Temperature | Thermostat Temperature | Difference | Calibration Delta | Calibration | 22 | | ---------------- | ---------------------- | ---------- | ----------------- | ----------- | 23 | | 20° | 20.5° | 0.5° | 1° | No | 24 | | 20° | 21° | 1° | 1° | Yes | 25 | 26 | ## 🗝️ Calibration Entity Key Word 27 | 28 | Your thermostat usually has an entity for calibration. You can find this in the device overview in Home Assistant. All entities are named according to a specific schema. To ensure the automation selects the correct entity, you must specify the correct keyword here. 29 | 30 | ### Example 31 | 32 | | Possible Entity ID | Suggested Keyword | 33 | | ---------------------------------------------------- | ----------------------------- | 34 | | number.room_thermostat_local_temperature_calibration | local_temperature_calibration | 35 | | number.room_thermostat_external_calibration | external_calibration | 36 | | number.room_thermostat_temperature_offset | offset | 37 | 38 | 39 | ## 🦶 Step Size 40 | 41 | Usually, the step size, i.e., the minimum adjustment of your calibration entities, is automatically determined. However, there are exceptions where the entity only accepts whole or smaller values than specified. Here you can override the automatic detection. Please pay attention to the Home Assistant log if this causes errors. 42 | 43 | ## 🧭 Generic Calibration 44 | 45 | If your thermostat does not support native calibration, you can enable Generic Calibration. In this case, the offset is added to the target temperature of your thermostat. 46 | 47 | !!! info "Your thermostat will no longer display the actual temperature but a corrected one." 48 | 49 | | Room Temperature | Thermostat Temperature | Difference | Target Temperature | Calibrated Target Temperature | 50 | | ---------------- | ---------------------- | ---------- | ------------------ | ----------------------------- | 51 | | 20° | 22° | 2° | 20° | 22° | 52 | | 22° | 20° | 2° | 20° | 18° | 53 | 54 | ## ↕️ Generic Calibration Offset 55 | 56 | If the calculated offset is too high for you, you can limit it with this option. -------------------------------------------------------------------------------- /site/assets/stylesheets/palette.06af60db.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["src/templates/assets/stylesheets/palette/_scheme.scss","../../../../src/templates/assets/stylesheets/palette.scss","src/templates/assets/stylesheets/palette/_accent.scss","src/templates/assets/stylesheets/palette/_primary.scss","src/templates/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"AA2BA,cAGE,6BAME,sDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CACA,mDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CAGA,mDAAA,CACA,gDAAA,CAGA,0BAAA,CACA,mCAAA,CAGA,iCAAA,CACA,kCAAA,CACA,mCAAA,CACA,mCAAA,CACA,kCAAA,CACA,iCAAA,CACA,+CAAA,CACA,6DAAA,CACA,gEAAA,CACA,4DAAA,CACA,4DAAA,CACA,6DAAA,CAGA,6CAAA,CAGA,+CAAA,CAGA,uDAAA,CACA,6DAAA,CACA,2DAAA,CAGA,iCAAA,CAGA,yDAAA,CACA,iEAAA,CAGA,mDAAA,CACA,mDAAA,CAGA,qDAAA,CACA,uDAAA,CAGA,8DAAA,CAKA,8DAAA,CAKA,0DAAA,CAvEA,iBCeF,CD6DE,kHAEE,YC3DJ,CDkFE,yDACE,4BChFJ,CD+EE,2DACE,4BC7EJ,CD4EE,gEACE,4BC1EJ,CDyEE,2DACE,4BCvEJ,CDsEE,yDACE,4BCpEJ,CDmEE,0DACE,4BCjEJ,CDgEE,gEACE,4BC9DJ,CD6DE,0DACE,4BC3DJ,CD0DE,2OACE,4BC/CJ,CDsDA,+FAGE,iCCpDF,CACF,CC/CE,2BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD2CN,CCrDE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDkDN,CC5DE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDyDN,CCnEE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDgEN,CC1EE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDuEN,CCjFE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD8EN,CCxFE,kCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDqFN,CC/FE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD4FN,CCtGE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDmGN,CC7GE,6BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD0GN,CCpHE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDiHN,CC3HE,4BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCD2HN,CClIE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDkIN,CCzIE,6BACE,yBAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDyIN,CChJE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDgJN,CCvJE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDoJN,CEzJE,4BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsJN,CEjKE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8JN,CEzKE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsKN,CEjLE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8KN,CEzLE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsLN,CEjME,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8LN,CEzME,mCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsMN,CEjNE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8MN,CEzNE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsNN,CEjOE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8NN,CEzOE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsON,CEjPE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFiPN,CEzPE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFyPN,CEjQE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFiQN,CEzQE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFyQN,CEjRE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8QN,CEzRE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsRN,CEjSE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BF0RN,CE1SE,kCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BFmSN,CEpRE,sEACE,4BFuRJ,CExRE,+DACE,4BF2RJ,CE5RE,iEACE,4BF+RJ,CEhSE,gEACE,4BFmSJ,CEpSE,iEACE,4BFuSJ,CE9RA,8BACE,mDAAA,CACA,4DAAA,CACA,0DAAA,CACA,oDAAA,CACA,2DAAA,CAGA,4BF+RF,CE5RE,yCACE,+BF8RJ,CE3RI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCF+RN,CG3MI,mCD1EA,+CACE,8CFwRJ,CErRI,qDACE,8CFuRN,CElRE,iEACE,mCFoRJ,CACF,CGtNI,sCDvDA,uCACE,oCFgRJ,CACF,CEvQA,8BACE,kDAAA,CACA,4DAAA,CACA,wDAAA,CACA,oDAAA,CACA,6DAAA,CAGA,4BFwQF,CErQE,yCACE,+BFuQJ,CEpQI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCFwQN,CEjQE,yCACE,6CFmQJ,CG5NI,0CDhCA,8CACE,gDF+PJ,CACF,CGjOI,0CDvBA,iFACE,6CF2PJ,CACF,CGzPI,sCDKA,uCACE,6CFuPJ,CACF","file":"palette.css"} -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.stemmer.support.min.js: -------------------------------------------------------------------------------- 1 | !function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.ko.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ko=function(){this.pipeline.reset(),this.pipeline.add(e.ko.trimmer,e.ko.stopWordFilter)},e.ko.wordCharacters="[A-Za-z가-힣]",e.ko.trimmer=e.trimmerSupport.generateTrimmer(e.ko.wordCharacters),e.Pipeline.registerFunction(e.ko.trimmer,"trimmer-ko"),e.ko.stopWordFilter=e.generateStopWordFilter("아 휴 아이구 아이쿠 아이고 어 나 우리 저희 따라 의해 을 를 에 의 가 으로 로 에게 뿐이다 의거하여 근거하여 입각하여 기준으로 예하면 예를 들면 예를 들자면 저 소인 소생 저희 지말고 하지마 하지마라 다른 물론 또한 그리고 비길수 없다 해서는 안된다 뿐만 아니라 만이 아니다 만은 아니다 막론하고 관계없이 그치지 않다 그러나 그런데 하지만 든간에 논하지 않다 따지지 않다 설사 비록 더라도 아니면 만 못하다 하는 편이 낫다 불문하고 향하여 향해서 향하다 쪽으로 틈타 이용하여 타다 오르다 제외하고 이 외에 이 밖에 하여야 비로소 한다면 몰라도 외에도 이곳 여기 부터 기점으로 따라서 할 생각이다 하려고하다 이리하여 그리하여 그렇게 함으로써 하지만 일때 할때 앞에서 중에서 보는데서 으로써 로써 까지 해야한다 일것이다 반드시 할줄알다 할수있다 할수있어 임에 틀림없다 한다면 등 등등 제 겨우 단지 다만 할뿐 딩동 댕그 대해서 대하여 대하면 훨씬 얼마나 얼마만큼 얼마큼 남짓 여 얼마간 약간 다소 좀 조금 다수 몇 얼마 지만 하물며 또한 그러나 그렇지만 하지만 이외에도 대해 말하자면 뿐이다 다음에 반대로 반대로 말하자면 이와 반대로 바꾸어서 말하면 바꾸어서 한다면 만약 그렇지않으면 까악 툭 딱 삐걱거리다 보드득 비걱거리다 꽈당 응당 해야한다 에 가서 각 각각 여러분 각종 각자 제각기 하도록하다 와 과 그러므로 그래서 고로 한 까닭에 하기 때문에 거니와 이지만 대하여 관하여 관한 과연 실로 아니나다를가 생각한대로 진짜로 한적이있다 하곤하였다 하 하하 허허 아하 거바 와 오 왜 어째서 무엇때문에 어찌 하겠는가 무슨 어디 어느곳 더군다나 하물며 더욱이는 어느때 언제 야 이봐 어이 여보시오 흐흐 흥 휴 헉헉 헐떡헐떡 영차 여차 어기여차 끙끙 아야 앗 아야 콸콸 졸졸 좍좍 뚝뚝 주룩주룩 솨 우르르 그래도 또 그리고 바꾸어말하면 바꾸어말하자면 혹은 혹시 답다 및 그에 따르는 때가 되어 즉 지든지 설령 가령 하더라도 할지라도 일지라도 지든지 몇 거의 하마터면 인젠 이젠 된바에야 된이상 만큼\t어찌됏든 그위에 게다가 점에서 보아 비추어 보아 고려하면 하게될것이다 일것이다 비교적 좀 보다더 비하면 시키다 하게하다 할만하다 의해서 연이서 이어서 잇따라 뒤따라 뒤이어 결국 의지하여 기대여 통하여 자마자 더욱더 불구하고 얼마든지 마음대로 주저하지 않고 곧 즉시 바로 당장 하자마자 밖에 안된다 하면된다 그래 그렇지 요컨대 다시 말하자면 바꿔 말하면 즉 구체적으로 말하자면 시작하여 시초에 이상 허 헉 허걱 바와같이 해도좋다 해도된다 게다가 더구나 하물며 와르르 팍 퍽 펄렁 동안 이래 하고있었다 이었다 에서 로부터 까지 예하면 했어요 해요 함께 같이 더불어 마저 마저도 양자 모두 습니다 가까스로 하려고하다 즈음하여 다른 다른 방면으로 해봐요 습니까 했어요 말할것도 없고 무릎쓰고 개의치않고 하는것만 못하다 하는것이 낫다 매 매번 들 모 어느것 어느 로써 갖고말하자면 어디 어느쪽 어느것 어느해 어느 년도 라 해도 언젠가 어떤것 어느것 저기 저쪽 저것 그때 그럼 그러면 요만한걸 그래 그때 저것만큼 그저 이르기까지 할 줄 안다 할 힘이 있다 너 너희 당신 어찌 설마 차라리 할지언정 할지라도 할망정 할지언정 구토하다 게우다 토하다 메쓰겁다 옆사람 퉤 쳇 의거하여 근거하여 의해 따라 힘입어 그 다음 버금 두번째로 기타 첫번째로 나머지는 그중에서 견지에서 형식으로 쓰여 입장에서 위해서 단지 의해되다 하도록시키다 뿐만아니라 반대로 전후 전자 앞의것 잠시 잠깐 하면서 그렇지만 다음에 그러한즉 그런즉 남들 아무거나 어찌하든지 같다 비슷하다 예컨대 이럴정도로 어떻게 만약 만일 위에서 서술한바와같이 인 듯하다 하지 않는다면 만약에 무엇 무슨 어느 어떤 아래윗 조차 한데 그럼에도 불구하고 여전히 심지어 까지도 조차도 하지 않도록 않기 위하여 때 시각 무렵 시간 동안 어때 어떠한 하여금 네 예 우선 누구 누가 알겠는가 아무도 줄은모른다 줄은 몰랏다 하는 김에 겸사겸사 하는바 그런 까닭에 한 이유는 그러니 그러니까 때문에 그 너희 그들 너희들 타인 것 것들 너 위하여 공동으로 동시에 하기 위하여 어찌하여 무엇때문에 붕붕 윙윙 나 우리 엉엉 휘익 윙윙 오호 아하 어쨋든 만 못하다\t하기보다는 차라리 하는 편이 낫다 흐흐 놀라다 상대적으로 말하자면 마치 아니라면 쉿 그렇지 않으면 그렇지 않다면 안 그러면 아니었다면 하든지 아니면 이라면 좋아 알았어 하는것도 그만이다 어쩔수 없다 하나 일 일반적으로 일단 한켠으로는 오자마자 이렇게되면 이와같다면 전부 한마디 한항목 근거로 하기에 아울러 하지 않도록 않기 위해서 이르기까지 이 되다 로 인하여 까닭으로 이유만으로 이로 인하여 그래서 이 때문에 그러므로 그런 까닭에 알 수 있다 결론을 낼 수 있다 으로 인하여 있다 어떤것 관계가 있다 관련이 있다 연관되다 어떤것들 에 대해 이리하여 그리하여 여부 하기보다는 하느니 하면 할수록 운운 이러이러하다 하구나 하도다 다시말하면 다음으로 에 있다 에 달려 있다 우리 우리들 오히려 하기는한데 어떻게 어떻해 어찌됏어 어때 어째서 본대로 자 이 이쪽 여기 이것 이번 이렇게말하자면 이런 이러한 이와 같은 요만큼 요만한 것 얼마 안 되는 것 이만큼 이 정도의 이렇게 많은 것 이와 같다 이때 이렇구나 것과 같이 끼익 삐걱 따위 와 같은 사람들 부류의 사람들 왜냐하면 중의하나 오직 오로지 에 한하다 하기만 하면 도착하다 까지 미치다 도달하다 정도에 이르다 할 지경이다 결과에 이르다 관해서는 여러분 하고 있다 한 후 혼자 자기 자기집 자신 우에 종합한것과같이 총적으로 보면 총적으로 말하면 총적으로 대로 하다 으로서 참 그만이다 할 따름이다 쿵 탕탕 쾅쾅 둥둥 봐 봐라 아이야 아니 와아 응 아이 참나 년 월 일 령 영 일 이 삼 사 오 육 륙 칠 팔 구 이천육 이천칠 이천팔 이천구 하나 둘 셋 넷 다섯 여섯 일곱 여덟 아홉 령 영".split(" ")),e.Pipeline.registerFunction(e.ko.stopWordFilter,"stopWordFilter-ko"),e.ko.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.ko.stemmer,"stemmer-ko")}}); -------------------------------------------------------------------------------- /site/search/search_index.json: -------------------------------------------------------------------------------- 1 | {"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to my Blueprint and Snippet Collection","text":"

Under construction!

This is currently under construction! The contents are therefore to be enjoyed with caution and can still change at any time.

"},{"location":"ahc/adjustments_heating_plan/","title":"\ud83c\udf9b\ufe0f Adjustments / Heating Plan","text":"

In the adjustments, you can set your temperatures or enable/disable the calibration of your thermostats. You can set these settings for a specific time, but also specify that they only apply on certain days or only when a specific schedule is active. The time is a mandatory field.

"},{"location":"ahc/adjustments_heating_plan/#modifier-and-filter","title":"Modifier and Filter","text":"Modifier Values Example Description \ud83d\udd54 Time HH:MM 21:30 The time when the adjustment should take place. \ud83d\udcc6 Days Mon, Tue, Wed, Thu, Fri, Sat, Sun ['Mon','Fri'] Filter if the adjustment should only take place on certain days. \ud83d\uddd3\ufe0f Scheduler friendly name Heating Schedule Filter if the adjustment should only be set when a specific schedule is active. \ud83d\udecb\ufe0f Comfort 0-100 24 Modifier that changes the comfort temperature to a different value at the specified time. \ud83c\udf31 Eco 0-100 17 Modifier that changes the eco temperature to a different value at the specified time. \ud83e\udded Calibration on/off on Modifier that can turn the calibration on or off."},{"location":"ahc/temperatures/","title":"\ud83c\udf21\ufe0f Temperatures","text":""},{"location":"ahc/temperatures/#static-comfort-temperature","title":"\ud83d\udecb\ufe0f Static Comfort Temperature","text":"

The comfort temperature is the temperature that is set when you might be at home or your presence sensor is triggered or your heating schedule is on. This temperature setting serves as a fallback temperature. If a static temperature is sufficient for you and you do not want to adjust it further via the UI, this setting is sufficient. However, temporal temperature adjustments can be made via the adjustments.

"},{"location":"ahc/temperatures/#static-eco-temperature","title":"\ud83c\udf31 Static Eco Temperature","text":"

The eco temperature is the temperature that is set when you are not at home, for example, or your schedule does not prescribe heating to the comfort temperature. This temperature setting serves as a fallback temperature. If a static temperature is sufficient for you and you do not want to adjust it further via the UI, this setting is sufficient. However, temporal temperature adjustments can be made via the adjustments.

"},{"location":"ahc/temperatures/#comfort-temperature","title":"\ud83d\udecb\ufe0f Comfort Temperature","text":"

If you want to control the comfort temperature via the UI, you can specify an input number helper here. This overrides the static comfort temperature.

"},{"location":"ahc/temperatures/#eco-temperature","title":"\ud83c\udf31 Eco Temperature","text":"

If you want to control the eco temperature via the UI, you can specify an input number helper here. This overrides the static eco temperature.

"},{"location":"ahc/thermostats_sensors/","title":"\ud83d\udd18 Thermostats & Sensors","text":""},{"location":"ahc/thermostats_sensors/#thermostats-climates","title":"\ud83d\udd25 Thermostats / Climates","text":"

In the first step, you need to specify your thermostats or the climate entities that your new AHC automation should control.

"},{"location":"ahc/thermostats_sensors/#operation-hvac-mode","title":"\ud83c\udf9b\ufe0f Operation / HVAC Mode","text":"

Here you select the manual heating mode of your thermostats so that AHC can take full control. Usually, the manual HVAC mode is heat. However, for some thermostats this mode also stands for the boost mode and another mode like auto must be selected.

"},{"location":"ahc/thermostats_sensors/#room-temperature-sensor","title":"\ud83c\udf21\ufe0f Room Temperature Sensor","text":"

The sensor of your room temperature is useful for many features: It ensures the accurate calibration of your thermostats and can be used for functions that are described in other sections here.

"}]} -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.sv.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Swedish` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); -------------------------------------------------------------------------------- /blueprints/automation/panhans/binary_sensor_notification.yaml: -------------------------------------------------------------------------------- 1 | blueprint: 2 | name: "Binary Sensor Notification" 3 | description: 'Send a notification or trigger a custom action depending on the state switch of a binary_sensor' 4 | source_url: https://github.com/panhans/homeassistant/blob/main/blueprints/automation/panhans/binary_sensor_notification.yaml 5 | domain: automation 6 | input: 7 | sensor_entity: 8 | name: "Sensor" 9 | description: "Sensor which triggers the notification." 10 | selector: 11 | entity: 12 | domain: binary_sensor 13 | 14 | from: 15 | name: "From" 16 | description: "State which triggers the notification" 17 | default: 'on' 18 | selector: 19 | select: 20 | options: 21 | - 'on' 22 | - 'off' 23 | 24 | to: 25 | name: "To" 26 | description: "State which triggers the notification" 27 | default: 'off' 28 | selector: 29 | select: 30 | options: 31 | - 'on' 32 | - 'off' 33 | 34 | debounce_duration: 35 | name: "Debounce duration" 36 | description: "Duration time the notification won't be sent again after sensor changed its state." 37 | default: 10 38 | selector: 39 | number: 40 | min: 0 41 | max: 100 42 | unit_of_measurement: "s" 43 | mode: slider 44 | step: 1 45 | 46 | notify_device: 47 | name: "Device to notify" 48 | description: Device which gets a notification. 49 | default: false 50 | selector: 51 | device: 52 | integration: mobile_app 53 | 54 | notify_group: 55 | name: Notification Group 56 | description: "The name of the notification group to call. ('notify' for all devices)" 57 | default: "" 58 | 59 | title: 60 | name: "Title" 61 | description: "Notification title" 62 | message: 63 | name: "Message" 64 | description: "Message to be sent" 65 | 66 | tag: 67 | name: "Tag" 68 | description: "If you want to do something in another automation" 69 | default: "tag-{{ trigger.entity_id }}" 70 | 71 | status_bar_icon: 72 | name: "Status bar icon" 73 | description: "Sets the status bar icon. (Android only)" 74 | default: mdi:home-assistant 75 | selector: 76 | icon: 77 | placeholder: mdi:home-assistant 78 | 79 | custom_action: 80 | name: "Custom Action" 81 | description: "An action which can be processed if notification is triggered" 82 | default: [] 83 | selector: 84 | action: {} 85 | 86 | variables: 87 | to: !input to 88 | message: !input message 89 | title: !input title 90 | sensor_entity: !input sensor_entity 91 | debounce_duration: !input debounce_duration 92 | group_target: !input notify_group 93 | custom_action: !input custom_action 94 | notify_device: !input notify_device 95 | 96 | trigger: 97 | - platform: state 98 | entity_id: !input 'sensor_entity' 99 | to: !input to 100 | from: !input from 101 | 102 | condition: 103 | condition: template 104 | value_template: >- 105 | {{ iif(this.attributes.last_triggered == None, 9999, as_timestamp(now()) - as_timestamp(this.attributes.last_triggered, default=0) ) >= (debounce_duration | int) }} 106 | 107 | action: 108 | - choose: 109 | - conditions: "{{ not group_target }}" 110 | sequence: 111 | - service: 'notify.mobile_app_{{ device_attr(notify_device, "name") | slugify }}' 112 | data: 113 | title: "{{ title }}" 114 | message: "{{ message }}" 115 | data: 116 | ttl: 0 117 | priority: high 118 | notification_icon: !input 'status_bar_icon' 119 | tag: !input tag 120 | - conditions: "{{ group_target is defined }}" 121 | sequence: 122 | - service: notify.{{ group_target }} 123 | data: 124 | title: "{{ title }} | {{ states('sensor.time') }}" 125 | message: "{{ message }}" 126 | data: 127 | ttl: 0 128 | priority: high 129 | notification_icon: !input 'status_bar_icon' 130 | tag: !input tag 131 | - choose: 132 | - conditions: 133 | - '{{ custom_action is defined }}' 134 | sequence: !input 'custom_action' 135 | -------------------------------------------------------------------------------- /docs_src/ahc/sections/dynamic_valve_positioning.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - toc 4 | --- 5 | # ⌖ Dynamic Valve Positioning 6 | 7 | Usually, the valves of your thermostats are always 100% open, except the target temperature is reached. To prevent your thermostat from behaving like a relay, i.e., only opening and closing, you can dynamically influence the valve position here. 8 | 9 | !!! info "Your thermostat must support this and the respective integration must provide an entity for the valve opening." 10 | 11 | ## ⌖ Valve Positioning Mode 12 | 13 | The positioning mode determines when and how much the valve is closed or opened. This depends on your rooms, the heating surface, the flow temperature, etc. 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 48 | 64 | 80 | 81 |
RegularOptimisitcPessimistic
This is the default setting and should be chosen if the radiators and flow temperature are ideally matched to your room.Here the valve closes faster at the beginning because your radiators still have enough heat to heat the room or the flow temperature for the said room is set too high.Here the valve closes faster at the beginning because your radiators still have enough heat to heat the room or the flow temperature for the said room is set too high.
33 | ``` mermaid 34 | --- 35 | config: 36 | themeVariables: 37 | xyChart: 38 | plotColorPalette: "#e52000" 39 | xAxisTitleColor: "#e52000" 40 | --- 41 | xychart-beta 42 | title "Regular" 43 | x-axis "Temperature (in °C)" 15 --> 20 44 | y-axis "Valve Opening (in %)" 0 --> 100 45 | line [100, 100, 100, 87.5, 75, 62.5, 50, 37.5, 25, 12.5, 0] 46 | ``` 47 | 49 | ``` mermaid 50 | --- 51 | config: 52 | themeVariables: 53 | xyChart: 54 | plotColorPalette: "#e52000" 55 | xAxisTitleColor: "#e52000" 56 | --- 57 | xychart-beta 58 | title "Optimistic" 59 | x-axis "Temperature (in °C)" 15 --> 20 60 | y-axis "Valve Opening (in %)" 0 --> 100 61 | line [100, 100, 100, 76, 56, 39, 25, 14, 6, 1.5, 0] 62 | ``` 63 | 65 | ``` mermaid 66 | --- 67 | config: 68 | themeVariables: 69 | xyChart: 70 | plotColorPalette: "#e52000" 71 | xAxisTitleColor: "#e52000" 72 | --- 73 | xychart-beta 74 | title "Pessimistic" 75 | x-axis "Temperature (in °C)" 15 --> 20 76 | y-axis "Valve Opening (in %)" 0 --> 100 77 | line [100, 100, 100, 93.5, 86.6, 79.05, 70.71, 61.24, 50, 35.5, 0] 78 | ``` 79 |
82 | 83 | ## ↔️ Positioning Temperature Difference 84 | 85 | Here you can specify when the automation should modulate the valve opening depending on your target temperature. 86 | In the graphs shown above, the target temperature is 20°. Modulation starts at 16°. So, a *Positioning Temperature Difference* of 4° is set here. 87 | 88 | ## 🦶 Valve Positioning Step Size 89 | 90 | The *Step Size* indicates the steps in which modulation occurs. The smaller the value, the more precise but also more frequent the valve position adjustment. You can choose from *5%*, *10%*, or *20%*. 91 | 92 | ## ⏱️ Valve Positioning Timeout 93 | 94 | If you have strong temperature fluctuations or have set a small *Step Size*, you can reduce the frequency of adjustments by setting a timeout here that must elapse between two adjustments before the automation adjusts the valve position again. 95 | 96 | ## 🗝️ Positioning Entity Keyword 97 | 98 | Your thermostat must support valve positioning. If this is the case, you can find the respective entity in the overview of your thermostat. 99 | Open the settings for the entity and look at the Entity ID. The keyword must partially match the Entity ID. 100 | 101 | | Possible Entity ID | Suggested Keyword | 102 | | ---------------------------------------------------- | ----------------------------- | 103 | | number.room_thermostat_links_valve_opening_degree | valve_opening_degree | -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.da.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Danish` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=f.cursor+3;if(d=f.limit,0<=r&&r<=f.limit){for(a=r;;){if(e=f.cursor,f.in_grouping(w,97,248)){f.cursor=e;break}if(f.cursor=e,e>=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.no.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Norwegian` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); -------------------------------------------------------------------------------- /blueprints/script/scene_toggle.yaml: -------------------------------------------------------------------------------- 1 | blueprint: 2 | name: Scene Toggle 3 | description: > 4 | 5 | ## Features 6 | 7 | - toggle through scenes by order or last activated timestamp 8 | 9 | - define a transition time 10 | 11 | - select scenes by area and/or include/exclude specific scenes 12 | 13 | - timeout for beginning at start if using static order 14 | 15 | 16 | **Help & FAQ**: [Simple Scene Toggle](https://community.home-assistant.io/t/simple-scene-toggle) 17 | 18 | 19 | **Version**: 3.2 20 | 21 | 22 | If you like my work and support feel free to support me. 23 | 24 | 25 | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/Q5Q3QEH52) 26 | 27 | source_url: https://github.com/panhans/homeassistant/blob/main/blueprints/script/scene_toggle.yaml 28 | domain: script 29 | 30 | input: 31 | area: 32 | name: Name of area 33 | description: Name of the area where you want to toggle scenes 34 | default: "" 35 | selector: 36 | area: 37 | 38 | included_scenes: 39 | name: Included Scenes 40 | description: Additional scenes to be included 41 | default: [] 42 | selector: 43 | entity: 44 | filter: 45 | domain: scene 46 | multiple: true 47 | 48 | excluded_scenes: 49 | name: Excluded Scenes 50 | description: Scenes to be excluded 51 | default: [] 52 | selector: 53 | entity: 54 | filter: 55 | domain: scene 56 | multiple: true 57 | 58 | transition: 59 | name: Transition time 60 | description: Transition time when switching between scenes 61 | default: 1 62 | selector: 63 | number: 64 | min: 0 65 | max: 10 66 | step: 0.1 67 | unit_of_measurement: s 68 | 69 | use_static_order: 70 | name: "Static order" 71 | description: "This automation is based on timestamps of the activation of the scenes. If this option is enabled a static order will be used instead of the dynamic one." 72 | default: false 73 | selector: 74 | boolean: 75 | 76 | reset_after: 77 | name: Reset After 78 | description: If the static order is activated, a timeout can be set after which the order is reset to the first scene. If 0 is set the timeout is disabled. 79 | default: 0 80 | selector: 81 | number: 82 | min: 0 83 | max: 120 84 | step: 1 85 | unit_of_measurement: s 86 | 87 | mode: queued 88 | 89 | variables: 90 | area: !input "area" 91 | included_scenes: !input "included_scenes" 92 | excluded_scenes: !input "excluded_scenes" 93 | reset_after: !input "reset_after" 94 | use_static_order: !input use_static_order 95 | last_triggered: "{{ as_timestamp(iif(state_attr(this.entity_id,'last_triggered') == none, now(), state_attr(this.entity_id,'last_triggered'))) }}" 96 | 97 | sequence: 98 | - service: scene.turn_on 99 | data_template: 100 | transition: !input transition 101 | entity_id: > 102 | {% set area_scenes = states.scene | selectattr('entity_id', 'in', area_entities(area)) | map(attribute='entity_id') | list %} 103 | {% set all_scenes = (area_scenes | reject('in', excluded_scenes) | list) + included_scenes %} 104 | 105 | {% if use_static_order == true %} 106 | 107 | {% set is_reset = reset_after > 0 and (as_timestamp(now()) - last_triggered >= reset_after) %} 108 | 109 | {% if is_reset == true %} 110 | {{ all_scenes[0] }} 111 | {% else %} 112 | 113 | {% set unknown_scenes = expand(all_scenes) | selectattr('state', 'eq', 'unknown') | map(attribute='entity_id') | list %} 114 | {% set scenes_sorted_by_activation = expand(all_scenes) | sort(attribute='state', reverse = true) | map(attribute='entity_id') | reject('in', unknown_scenes) | list %} 115 | {% set last_activated_scene = scenes_sorted_by_activation[0] %} 116 | {% set index_of_last_activated_scene = all_scenes.index(last_activated_scene) %} 117 | {% set new_index = index_of_last_activated_scene + 1 %} 118 | 119 | {% if new_index == all_scenes | count %} 120 | {{ all_scenes[0] }} 121 | {% else %} 122 | {{ all_scenes[new_index] }} 123 | {% endif %} 124 | {% endif %} 125 | {% else %} 126 | {% set unknown_scenes = expand(all_scenes) | selectattr('state', 'eq', 'unknown') | map(attribute='entity_id') | list %} 127 | {% if unknown_scenes | count > 0 %} 128 | {{ unknown_scenes[0] }} 129 | {% else %} 130 | {% set known_scenes = expand(all_scenes) | sort(attribute='state', reverse = false) | map(attribute='entity_id') | list %} 131 | {{ known_scenes[0] }} 132 | {% endif %} 133 | {% endif %} 134 | -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.he.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.he=function(){this.pipeline.reset(),this.pipeline.add(e.he.trimmer,e.he.stopWordFilter,e.he.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.he.stemmer))},e.he.wordCharacters="֑-״א-תa-zA-Za-zA-Z0-90-9",e.he.trimmer=e.trimmerSupport.generateTrimmer(e.he.wordCharacters),e.Pipeline.registerFunction(e.he.trimmer,"trimmer-he"),e.he.stemmer=function(){var e=this;return e.result=!1,e.preRemoved=!1,e.sufRemoved=!1,e.pre={pre1:"ה ו י ת",pre2:"ב כ ל מ ש כש",pre3:"הב הכ הל המ הש בש לכ",pre4:"וב וכ ול ומ וש",pre5:"מה שה כל",pre6:"מב מכ מל ממ מש",pre7:"בה בו בי בת כה כו כי כת לה לו לי לת",pre8:"ובה ובו ובי ובת וכה וכו וכי וכת ולה ולו ולי ולת"},e.suf={suf1:"ך כ ם ן נ",suf2:"ים ות וך וכ ום ון ונ הם הן יכ יך ינ ים",suf3:"תי תך תכ תם תן תנ",suf4:"ותי ותך ותכ ותם ותן ותנ",suf5:"נו כם כן הם הן",suf6:"ונו וכם וכן והם והן",suf7:"תכם תכן תנו תהם תהן",suf8:"הוא היא הם הן אני אתה את אנו אתם אתן",suf9:"ני נו כי כו כם כן תי תך תכ תם תן",suf10:"י ך כ ם ן נ ת"},e.patterns=JSON.parse('{"hebrewPatterns": [{"pt1": [{"c": "ה", "l": 0}]}, {"pt2": [{"c": "ו", "l": 0}]}, {"pt3": [{"c": "י", "l": 0}]}, {"pt4": [{"c": "ת", "l": 0}]}, {"pt5": [{"c": "מ", "l": 0}]}, {"pt6": [{"c": "ל", "l": 0}]}, {"pt7": [{"c": "ב", "l": 0}]}, {"pt8": [{"c": "כ", "l": 0}]}, {"pt9": [{"c": "ש", "l": 0}]}, {"pt10": [{"c": "כש", "l": 0}]}, {"pt11": [{"c": "בה", "l": 0}]}, {"pt12": [{"c": "וב", "l": 0}]}, {"pt13": [{"c": "וכ", "l": 0}]}, {"pt14": [{"c": "ול", "l": 0}]}, {"pt15": [{"c": "ומ", "l": 0}]}, {"pt16": [{"c": "וש", "l": 0}]}, {"pt17": [{"c": "הב", "l": 0}]}, {"pt18": [{"c": "הכ", "l": 0}]}, {"pt19": [{"c": "הל", "l": 0}]}, {"pt20": [{"c": "המ", "l": 0}]}, {"pt21": [{"c": "הש", "l": 0}]}, {"pt22": [{"c": "מה", "l": 0}]}, {"pt23": [{"c": "שה", "l": 0}]}, {"pt24": [{"c": "כל", "l": 0}]}]}'),e.execArray=["cleanWord","removeDiacritics","removeStopWords","normalizeHebrewCharacters"],e.stem=function(){var r=0;for(e.result=!1,e.preRemoved=!1,e.sufRemoved=!1;r=0)return!0},e.normalizeHebrewCharacters=function(){return e.word=e.word.replace("ך","כ"),e.word=e.word.replace("ם","מ"),e.word=e.word.replace("ן","נ"),e.word=e.word.replace("ף","פ"),e.word=e.word.replace("ץ","צ"),!1},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}}(),e.Pipeline.registerFunction(e.he.stemmer,"stemmer-he"),e.he.stopWordFilter=e.generateStopWordFilter("אבל או אולי אותו אותי אותך אותם אותן אותנו אז אחר אחרות אחרי אחריכן אחרים אחרת אי איזה איך אין איפה אל אלה אלו אם אנחנו אני אף אפשר את אתה אתכם אתכן אתם אתן באיזה באיזו בגלל בין בלבד בעבור בעזרת בכל בכן בלי במידה במקום שבו ברוב בשביל בשעה ש בתוך גם דרך הוא היא היה היי היכן היתה היתי הם הן הנה הסיבה שבגללה הרי ואילו ואת זאת זה זות יהיה יוכל יוכלו יותר מדי יכול יכולה יכולות יכולים יכל יכלה יכלו יש כאן כאשר כולם כולן כזה כי כיצד כך כל כלל כמו כן כפי כש לא לאו לאיזותך לאן לבין לה להיות להם להן לו לזה לזות לי לך לכם לכן למה למעלה למעלה מ למטה למטה מ למעט למקום שבו למרות לנו לעבר לעיכן לפיכך לפני מאד מאחורי מאיזו סיבה מאין מאיפה מבלי מבעד מדוע מה מהיכן מול מחוץ מי מידע מכאן מכל מכן מלבד מן מנין מסוגל מעט מעטים מעל מצד מקום בו מתחת מתי נגד נגר נו עד עז על עלי עליו עליה עליהם עליך עלינו עם עצמה עצמהם עצמהן עצמו עצמי עצמם עצמן עצמנו פה רק שוב של שלה שלהם שלהן שלו שלי שלך שלכה שלכם שלכן שלנו שם תהיה תחת".split(" ")),e.Pipeline.registerFunction(e.he.stopWordFilter,"stopWordFilter-he")}}); -------------------------------------------------------------------------------- /blueprints/script/intelligent_vacuum_cleaning.yaml: -------------------------------------------------------------------------------- 1 | blueprint: 2 | name: Intelligent Vacuum Cleaning 3 | description: This script starts a cleaning process of a vacuum cleaner robot depending on a device and its status. For this, the device must remain in a defined status for a certain time. Furthermore, a time period can be defined in which the process can start and the status must be fulfilled. In addition, an air cleaner can be defined for the cleaning process. 4 | source_url: https://github.com/panhans/homeassistant/blob/main/blueprints/script/intelligent_vacuum_cleaning.yaml 5 | domain: script 6 | 7 | input: 8 | # V A C U U M 9 | vacuum: 10 | name: Vacuum 11 | description: Target vacuum robot 12 | selector: 13 | entity: 14 | domain: vacuum 15 | 16 | # T R I G G E R 17 | trigger_device: 18 | name: Trigger entity 19 | description: Entity whose state starts the cleaning process. 20 | selector: 21 | entity: 22 | trigger_state: 23 | name: Entity state 24 | description: Entity state waited for to start the process. 25 | trigger_state_time: 26 | name: Entity state time 27 | description: Time the entity must be in the state for the cleaning process to start. 28 | default: 10 29 | selector: 30 | number: 31 | min: 0 32 | max: 60 33 | unit_of_measurement: Minutes 34 | step: 1 35 | mode: slider 36 | trigger_timeout: 37 | name: Trigger timeout 38 | description: Time to wait for the status of the trigger entity before cancelling the cleaning process. 39 | default: 3 40 | selector: 41 | number: 42 | min: 0 43 | max: 24 44 | unit_of_measurement: Hours 45 | step: 1 46 | mode: slider 47 | 48 | # F A N 49 | fan: 50 | name: Air purifier (optional) 51 | description: Purifier that cleans the air during the cleaning process. 52 | default: 53 | selector: 54 | entity: 55 | domain: fan 56 | fan_speed: 57 | name: Fan speed 58 | description: Speed of the purifier. 59 | default: 10 60 | selector: 61 | number: 62 | min: 0 63 | max: 100 64 | unit_of_measurement: Percent 65 | step: 1 66 | mode: slider 67 | fan_after_cleaning_time: 68 | name: Purifier overrun time 69 | description: Time the air purifier should run after. 70 | default: 2 71 | selector: 72 | number: 73 | min: 0 74 | max: 10 75 | unit_of_measurement: Minutes 76 | step: 1 77 | mode: slider 78 | fan_turn_off: 79 | name: Turn off purifier after cleaning process 80 | description: If switched off the purifier will be set to mode auto. Otherwise, it will be turned off after the cleaning process. 81 | default: true 82 | selector: 83 | boolean: 84 | estimated_cleaning_time: 85 | name: Estimated cleaning time 86 | description: Time the air purifier waits for the end of the cleaning process until it switches itself off. 87 | default: 2 88 | selector: 89 | number: 90 | min: 0 91 | max: 10 92 | unit_of_measurement: Hours 93 | step: 1 94 | mode: slider 95 | 96 | mode: single 97 | 98 | variables: 99 | vacuum: !input vacuum 100 | trigger_device: !input trigger_device 101 | trigger_state: !input trigger_state 102 | trigger_state_time: !input trigger_state_time 103 | trigger_timeout: !input trigger_timeout 104 | fan: !input fan 105 | fan_speed: !input fan_speed 106 | fan_after_cleaning_time: !input fan_after_cleaning_time 107 | estimated_cleaning_time: !input estimated_cleaning_time 108 | fan_turn_off: !input fan_turn_off 109 | 110 | sequence: 111 | - wait_template: >- 112 | {{ states[trigger_device].state == trigger_state and ((as_timestamp(now()) - as_timestamp(states[trigger_device].last_changed | default(0)) | int ) / 60) >= (trigger_state_time | int) }} 113 | timeout: 114 | hours: "{{ trigger_timeout }}" 115 | - service: vacuum.start 116 | target: 117 | entity_id: "{{ vacuum }}" 118 | - wait_template: '{{ states[vacuum].state == "cleaning" }}' 119 | timeout: '00:02:00' 120 | continue_on_timeout: false 121 | - choose: 122 | - conditions: 123 | - '{{ fan != none }}' 124 | sequence: 125 | - service: fan.turn_on 126 | data: 127 | percentage: "{{ fan_speed }}" 128 | preset_mode: Favorite 129 | entity_id: "{{ fan }}" 130 | - wait_template: '{{ states[trigger_device].state != "cleaning" }}' 131 | timeout: 132 | hours: "{{ estimated_cleaning_time }}" 133 | continue_on_timeout: true 134 | - delay: 135 | minutes: "{{ fan_after_cleaning_time }}" 136 | - service: fan.turn_on 137 | data: 138 | preset_mode: Auto 139 | target: 140 | entity_id: "{{ fan }}" 141 | - choose: 142 | - conditions: 143 | - "{{ fan_turn_off == true }}" 144 | sequence: 145 | - service: fan.turn_off 146 | data: 147 | entity_id: "{{ fan }}" 148 | -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.nl.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Dutch` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(r,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.nl=function(){this.pipeline.reset(),this.pipeline.add(r.nl.trimmer,r.nl.stopWordFilter,r.nl.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.nl.stemmer))},r.nl.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.nl.trimmer=r.trimmerSupport.generateTrimmer(r.nl.wordCharacters),r.Pipeline.registerFunction(r.nl.trimmer,"trimmer-nl"),r.nl.stemmer=function(){var e=r.stemmerSupport.Among,i=r.stemmerSupport.SnowballProgram,n=new function(){function r(){for(var r,e,i,o=C.cursor;;){if(C.bra=C.cursor,r=C.find_among(b,11))switch(C.ket=C.cursor,r){case 1:C.slice_from("a");continue;case 2:C.slice_from("e");continue;case 3:C.slice_from("i");continue;case 4:C.slice_from("o");continue;case 5:C.slice_from("u");continue;case 6:if(C.cursor>=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(e=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=e);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=e;else if(n(e))break}else if(n(e))break}function n(r){return C.cursor=r,r>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,d=_,t()||(_=C.cursor,_<3&&(_=3),t()||(d=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var r;;)if(C.bra=C.cursor,r=C.find_among(p,3))switch(C.ket=C.cursor,r){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return d<=C.cursor}function a(){var r=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-r,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var r;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.slice_del(),w=!0,a())))}function m(){var r;u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.eq_s_b(3,"gem")||(C.cursor=C.limit-r,C.slice_del(),a())))}function f(){var r,e,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,r=C.find_among_b(h,5))switch(C.bra=C.cursor,r){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(j,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(e=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-e,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,r=C.find_among_b(k,6))switch(C.bra=C.cursor,r){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(z,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var d,_,w,b=[new e("",-1,6),new e("á",0,1),new e("ä",0,1),new e("é",0,2),new e("ë",0,2),new e("í",0,3),new e("ï",0,3),new e("ó",0,4),new e("ö",0,4),new e("ú",0,5),new e("ü",0,5)],p=[new e("",-1,3),new e("I",0,2),new e("Y",0,1)],g=[new e("dd",-1,-1),new e("kk",-1,-1),new e("tt",-1,-1)],h=[new e("ene",-1,2),new e("se",-1,3),new e("en",-1,2),new e("heden",2,1),new e("s",-1,3)],k=[new e("end",-1,1),new e("ig",-1,2),new e("ing",-1,1),new e("lijk",-1,3),new e("baar",-1,4),new e("bar",-1,5)],v=[new e("aa",-1,-1),new e("ee",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(r){C.setCurrent(r)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var e=C.cursor;return r(),C.cursor=e,o(),C.limit_backward=e,C.cursor=C.limit,f(),C.cursor=C.limit_backward,s(),!0}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.de.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `German` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!v.eq_s(1,e)||(v.ket=v.cursor,!v.in_grouping(p,97,252)))&&(v.slice_from(r),v.cursor=n,!0)}function i(){for(var r,n,i,s,t=v.cursor;;)if(r=v.cursor,v.bra=r,v.eq_s(1,"ß"))v.ket=v.cursor,v.slice_from("ss");else{if(r>=v.limit)break;v.cursor=r+1}for(v.cursor=t;;)for(n=v.cursor;;){if(i=v.cursor,v.in_grouping(p,97,252)){if(s=v.cursor,v.bra=s,e("u","U",i))break;if(v.cursor=s,e("y","Y",i))break}if(i>=v.limit)return void(v.cursor=n);v.cursor=i+1}}function s(){for(;!v.in_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}for(;!v.out_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}return!1}function t(){m=v.limit,l=m;var e=v.cursor+3;0<=e&&e<=v.limit&&(d=e,s()||(m=v.cursor,m=v.limit)return;v.cursor++}}}function c(){return m<=v.cursor}function u(){return l<=v.cursor}function a(){var e,r,n,i,s=v.limit-v.cursor;if(v.ket=v.cursor,(e=v.find_among_b(w,7))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:v.slice_del(),v.ket=v.cursor,v.eq_s_b(1,"s")&&(v.bra=v.cursor,v.eq_s_b(3,"nis")&&v.slice_del());break;case 3:v.in_grouping_b(g,98,116)&&v.slice_del()}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(f,4))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:if(v.in_grouping_b(k,98,116)){var t=v.cursor-3;v.limit_backward<=t&&t<=v.limit&&(v.cursor=t,v.slice_del())}}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(_,8))&&(v.bra=v.cursor,u()))switch(e){case 1:v.slice_del(),v.ket=v.cursor,v.eq_s_b(2,"ig")&&(v.bra=v.cursor,r=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-r,u()&&v.slice_del()));break;case 2:n=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-n,v.slice_del());break;case 3:if(v.slice_del(),v.ket=v.cursor,i=v.limit-v.cursor,!v.eq_s_b(2,"er")&&(v.cursor=v.limit-i,!v.eq_s_b(2,"en")))break;v.bra=v.cursor,c()&&v.slice_del();break;case 4:v.slice_del(),v.ket=v.cursor,e=v.find_among_b(b,2),e&&(v.bra=v.cursor,u()&&1==e&&v.slice_del())}}var d,l,m,h=[new r("",-1,6),new r("U",0,2),new r("Y",0,1),new r("ä",0,3),new r("ö",0,4),new r("ü",0,5)],w=[new r("e",-1,2),new r("em",-1,1),new r("en",-1,2),new r("ern",-1,1),new r("er",-1,1),new r("s",-1,3),new r("es",5,2)],f=[new r("en",-1,1),new r("er",-1,1),new r("st",-1,2),new r("est",2,1)],b=[new r("ig",-1,1),new r("lich",-1,1)],_=[new r("end",-1,1),new r("ig",-1,2),new r("ung",-1,1),new r("lich",-1,3),new r("isch",-1,2),new r("ik",-1,2),new r("heit",-1,3),new r("keit",-1,4)],p=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],g=[117,30,5],k=[117,30,4],v=new n;this.setCurrent=function(e){v.setCurrent(e)},this.getCurrent=function(){return v.getCurrent()},this.stem=function(){var e=v.cursor;return i(),v.cursor=e,t(),v.limit_backward=e,v.cursor=v.limit,a(),v.cursor=v.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.du.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Dutch` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e,r,i,o=C.cursor;;){if(C.bra=C.cursor,e=C.find_among(b,11))switch(C.ket=C.cursor,e){case 1:C.slice_from("a");continue;case 2:C.slice_from("e");continue;case 3:C.slice_from("i");continue;case 4:C.slice_from("o");continue;case 5:C.slice_from("u");continue;case 6:if(C.cursor>=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(r=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=r);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=r;else if(n(r))break}else if(n(r))break}function n(e){return C.cursor=e,e>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,f=_,t()||(_=C.cursor,_<3&&(_=3),t()||(f=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var e;;)if(C.bra=C.cursor,e=C.find_among(p,3))switch(C.ket=C.cursor,e){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return f<=C.cursor}function a(){var e=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-e,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var e;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.slice_del(),w=!0,a())))}function m(){var e;u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.eq_s_b(3,"gem")||(C.cursor=C.limit-e,C.slice_del(),a())))}function d(){var e,r,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,e=C.find_among_b(h,5))switch(C.bra=C.cursor,e){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(z,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(r=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-r,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,e=C.find_among_b(k,6))switch(C.bra=C.cursor,e){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(j,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var f,_,w,b=[new r("",-1,6),new r("á",0,1),new r("ä",0,1),new r("é",0,2),new r("ë",0,2),new r("í",0,3),new r("ï",0,3),new r("ó",0,4),new r("ö",0,4),new r("ú",0,5),new r("ü",0,5)],p=[new r("",-1,3),new r("I",0,2),new r("Y",0,1)],g=[new r("dd",-1,-1),new r("kk",-1,-1),new r("tt",-1,-1)],h=[new r("ene",-1,2),new r("se",-1,3),new r("en",-1,2),new r("heden",2,1),new r("s",-1,3)],k=[new r("end",-1,1),new r("ig",-1,2),new r("ing",-1,1),new r("lijk",-1,3),new r("baar",-1,4),new r("bar",-1,5)],v=[new r("aa",-1,-1),new r("ee",-1,-1),new r("oo",-1,-1),new r("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(e){C.setCurrent(e)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var r=C.cursor;return e(),C.cursor=r,o(),C.limit_backward=r,C.cursor=C.limit,d(),C.cursor=C.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); -------------------------------------------------------------------------------- /blueprints/automation/panhans/scene_based_theatre_mode.yaml: -------------------------------------------------------------------------------- 1 | blueprint: 2 | name: 🎬 Scene Based Theatre Mode 3 | description: " 4 | 5 | **Features** 6 | 7 | 8 | 🎬 activates scenes depending on media player states and content types 9 | 10 | 🔁 automatic caching and restoring of the states of the entities of the Playing Scene 11 | 12 | 🌇 transition time for switching scenes 13 | 14 | 15 | **Help & FAQ**: [Scene based theatre mode](https://community.home-assistant.io/t/scene-based-theatre-mode) 16 | 17 | 18 | **Version**: 2.1 19 | 20 | 21 | If you like my work and support feel free to support me. 22 | 23 | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/Q5Q3QEH52) 24 | " 25 | 26 | source_url: "https://github.com/panhans/HomeAssistant/blob/main/blueprints/automation/panhans/scene_based_theatre_mode.yaml" 27 | domain: automation 28 | input: 29 | 30 | media_player: 31 | name: 📻 Media Player 32 | description: > 33 | `media player` 34 | 35 | 36 | Media Player, which commands the automation. 37 | selector: 38 | entity: 39 | filter: 40 | domain: media_player 41 | 42 | content_type: 43 | name: 📺 Content Type 44 | description: > 45 | `content_type` 46 | 47 | 48 | Type of content streamed to the media player. 49 | Can be used if you want to differentiate scenes 50 | based on the content streamed to the media player. 51 | default: "all" 52 | selector: 53 | select: 54 | mode: dropdown 55 | options: 56 | - "all" 57 | - "music" 58 | - "video" 59 | 60 | scene_playing: 61 | name: ▶️ Playing 62 | description: > 63 | `scene` 64 | 65 | 66 | Scene to be activated when the player is playing. 67 | selector: 68 | entity: 69 | filter: 70 | domain: scene 71 | 72 | scene_paused: 73 | name: ⏸️ Paused 74 | description: > 75 | `scene` 76 | 77 | 78 | Scene to be activated when the player is paused. 79 | selector: 80 | entity: 81 | filter: 82 | domain: scene 83 | 84 | reaction_time: 85 | name: ⏱️ Reaction time 86 | description: > 87 | `reaction` `for time` 88 | 89 | 90 | The time period in which the media player must remain in a state. 91 | default: 2 92 | selector: 93 | number: 94 | unit_of_measurement: s 95 | min: 1 96 | max: 10 97 | step: 1 98 | mode: slider 99 | 100 | transition: 101 | name: ↕ Transition 102 | description: > 103 | `transition` 104 | 105 | 106 | Transition time during the scene change. 107 | default: 1 108 | selector: 109 | number: 110 | min: 1 111 | max: 10 112 | step: 1 113 | mode: slider 114 | 115 | input_custom_condition: 116 | name: ☑️ Custom Condition 117 | description: > 118 | `optional` 119 | 120 | 121 | Block (False) / Allow (True) theatre mode. 122 | default: "{{ 1 == 1 }}" 123 | selector: 124 | condition: 125 | 126 | trigger: 127 | 128 | - trigger: state 129 | entity_id: !input media_player 130 | for: 131 | seconds: !input reaction_time 132 | 133 | variables: 134 | 135 | media_player: !input media_player 136 | content_type: !input content_type 137 | 138 | scene_playing: !input scene_playing 139 | scene_paused: !input scene_paused 140 | scene_entities: "{{ state_attr(scene_playing,'entity_id') }}" 141 | 142 | scene_init_state: "{{ 'scene.' + this.entity_id | replace('automation.','') | replace('.','_') + '_tm' }}" 143 | 144 | from_state: "{{ trigger.from_state.state }}" 145 | from_content_type: "{{ trigger.from_state.attributes.media_content_type | default('from_init', true) }}" 146 | to_state: "{{ trigger.to_state.state }}" 147 | to_content_type: "{{ trigger.to_state.attributes.media_content_type | default('to_init', true) }}" 148 | 149 | is_relevant_content: "{{ to_content_type == content_type or to_content_type == 'all' or to_content_type == 'to_init' }}" 150 | 151 | is_start: > 152 | {{ 153 | to_state == 'playing' and 154 | from_state not in [ "paused"] and 155 | from_content_type != to_content_type 156 | }} 157 | 158 | is_end: > 159 | {{ 160 | to_state in ["idle", 161 | "off", 162 | "stopped", 163 | "standby", 164 | "unknown", 165 | "unavailable"] 166 | }} 167 | 168 | is_paused: "{{ from_state == 'playing' and to_state == 'paused' }}" 169 | is_resume: "{{ from_state == 'paused' and to_state == 'playing' }}" 170 | 171 | scene_to_apply: > 172 | {% if is_start or is_resume %} 173 | {{ scene_playing }} 174 | {% elif is_paused %} 175 | {{ scene_paused }} 176 | {% elif is_end %} 177 | {{ scene_init_state }} 178 | {% endif %} 179 | 180 | conditions: 181 | - condition: template 182 | value_template: "{{ is_resume or is_paused or is_end or is_start }}" 183 | - condition: template 184 | value_template: "{{ is_relevant_content }}" 185 | - condition: and 186 | conditions: !input input_custom_condition 187 | 188 | action: 189 | - if: 190 | - condition: template 191 | value_template: "{{ is_start }}" 192 | then: 193 | - action: scene.create 194 | data: 195 | scene_id: "{{ scene_init_state.split('.')[1] }}" 196 | snapshot_entities: "{{ scene_entities }}" 197 | - delay: 198 | seconds: 2 199 | 200 | - if: 201 | - condition: template 202 | value_template: "{{ states[scene_to_apply] != none }}" 203 | then: 204 | - action: scene.turn_on 205 | data: 206 | transition: !input transition 207 | target: 208 | entity_id: "{{ scene_to_apply }}" 209 | 210 | mode: queued 211 | -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.ru.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Russian` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,t=new function(){function e(){for(;!W.in_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function t(){for(;!W.out_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function w(){b=W.limit,_=b,e()&&(b=W.cursor,t()&&e()&&t()&&(_=W.cursor))}function i(){return _<=W.cursor}function u(e,n){var r,t;if(W.ket=W.cursor,r=W.find_among_b(e,n)){switch(W.bra=W.cursor,r){case 1:if(t=W.limit-W.cursor,!W.eq_s_b(1,"а")&&(W.cursor=W.limit-t,!W.eq_s_b(1,"я")))return!1;case 2:W.slice_del()}return!0}return!1}function o(){return u(h,9)}function s(e,n){var r;return W.ket=W.cursor,!!(r=W.find_among_b(e,n))&&(W.bra=W.cursor,1==r&&W.slice_del(),!0)}function c(){return s(g,26)}function m(){return!!c()&&(u(C,8),!0)}function f(){return s(k,2)}function l(){return u(P,46)}function a(){s(v,36)}function p(){var e;W.ket=W.cursor,(e=W.find_among_b(F,2))&&(W.bra=W.cursor,i()&&1==e&&W.slice_del())}function d(){var e;if(W.ket=W.cursor,e=W.find_among_b(q,4))switch(W.bra=W.cursor,e){case 1:if(W.slice_del(),W.ket=W.cursor,!W.eq_s_b(1,"н"))break;W.bra=W.cursor;case 2:if(!W.eq_s_b(1,"н"))break;case 3:W.slice_del()}}var _,b,h=[new n("в",-1,1),new n("ив",0,2),new n("ыв",0,2),new n("вши",-1,1),new n("ивши",3,2),new n("ывши",3,2),new n("вшись",-1,1),new n("ившись",6,2),new n("ывшись",6,2)],g=[new n("ее",-1,1),new n("ие",-1,1),new n("ое",-1,1),new n("ые",-1,1),new n("ими",-1,1),new n("ыми",-1,1),new n("ей",-1,1),new n("ий",-1,1),new n("ой",-1,1),new n("ый",-1,1),new n("ем",-1,1),new n("им",-1,1),new n("ом",-1,1),new n("ым",-1,1),new n("его",-1,1),new n("ого",-1,1),new n("ему",-1,1),new n("ому",-1,1),new n("их",-1,1),new n("ых",-1,1),new n("ею",-1,1),new n("ою",-1,1),new n("ую",-1,1),new n("юю",-1,1),new n("ая",-1,1),new n("яя",-1,1)],C=[new n("ем",-1,1),new n("нн",-1,1),new n("вш",-1,1),new n("ивш",2,2),new n("ывш",2,2),new n("щ",-1,1),new n("ющ",5,1),new n("ующ",6,2)],k=[new n("сь",-1,1),new n("ся",-1,1)],P=[new n("ла",-1,1),new n("ила",0,2),new n("ыла",0,2),new n("на",-1,1),new n("ена",3,2),new n("ете",-1,1),new n("ите",-1,2),new n("йте",-1,1),new n("ейте",7,2),new n("уйте",7,2),new n("ли",-1,1),new n("или",10,2),new n("ыли",10,2),new n("й",-1,1),new n("ей",13,2),new n("уй",13,2),new n("л",-1,1),new n("ил",16,2),new n("ыл",16,2),new n("ем",-1,1),new n("им",-1,2),new n("ым",-1,2),new n("н",-1,1),new n("ен",22,2),new n("ло",-1,1),new n("ило",24,2),new n("ыло",24,2),new n("но",-1,1),new n("ено",27,2),new n("нно",27,1),new n("ет",-1,1),new n("ует",30,2),new n("ит",-1,2),new n("ыт",-1,2),new n("ют",-1,1),new n("уют",34,2),new n("ят",-1,2),new n("ны",-1,1),new n("ены",37,2),new n("ть",-1,1),new n("ить",39,2),new n("ыть",39,2),new n("ешь",-1,1),new n("ишь",-1,2),new n("ю",-1,2),new n("ую",44,2)],v=[new n("а",-1,1),new n("ев",-1,1),new n("ов",-1,1),new n("е",-1,1),new n("ие",3,1),new n("ье",3,1),new n("и",-1,1),new n("еи",6,1),new n("ии",6,1),new n("ами",6,1),new n("ями",6,1),new n("иями",10,1),new n("й",-1,1),new n("ей",12,1),new n("ией",13,1),new n("ий",12,1),new n("ой",12,1),new n("ам",-1,1),new n("ем",-1,1),new n("ием",18,1),new n("ом",-1,1),new n("ям",-1,1),new n("иям",21,1),new n("о",-1,1),new n("у",-1,1),new n("ах",-1,1),new n("ях",-1,1),new n("иях",26,1),new n("ы",-1,1),new n("ь",-1,1),new n("ю",-1,1),new n("ию",30,1),new n("ью",30,1),new n("я",-1,1),new n("ия",33,1),new n("ья",33,1)],F=[new n("ост",-1,1),new n("ость",-1,1)],q=[new n("ейше",-1,1),new n("н",-1,2),new n("ейш",-1,1),new n("ь",-1,3)],S=[33,65,8,232],W=new r;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){return w(),W.cursor=W.limit,!(W.cursor 144 | [[[ 145 | return ``; 146 | ]]] 147 | item1: > 148 | [[[ 149 | let icon = variables.entity_1_icon ? variables.entity_1_icon : ''; 150 | let value = variables.entity_1_value ? variables.entity_1_value : ''; 151 | 152 | let result = ''; 153 | if (icon != '') { 154 | result += `` 155 | } 156 | 157 | if (value != '') { 158 | result += `${value ? value : ''}` 159 | } 160 | return result; 161 | ]]] 162 | item2: > 163 | [[[ 164 | let icon = variables.entity_2_icon ? variables.entity_2_icon : ''; 165 | let value = variables.entity_2_value ? variables.entity_2_value : ''; 166 | 167 | let result = ''; 168 | if (icon != '') { 169 | result += `` 170 | } 171 | 172 | if (value != '') { 173 | result += `${value ? value : ''}` 174 | } 175 | return result; 176 | ]]] 177 | item3: > 178 | [[[ 179 | let icon = variables.entity_3_icon ? variables.entity_3_icon : ''; 180 | let value = variables.entity_3_value ? variables.entity_3_value : ''; 181 | 182 | let result = ''; 183 | if (icon != '') { 184 | result += `` 185 | } 186 | 187 | if (value != '') { 188 | result += `${value ? value : ''}` 189 | } 190 | return result; 191 | ]]] 192 | item4: > 193 | [[[ 194 | let icon = variables.entity_4_icon ? variables.entity_4_icon : ''; 195 | let value = variables.entity_4_value ? variables.entity_4_value : ''; 196 | 197 | let result = ''; 198 | if (icon != '') { 199 | result += `` 200 | } 201 | 202 | if (value != '') { 203 | result += `${value ? value : ''}` 204 | } 205 | return result; 206 | ]]] 207 | spacer11: ' ' 208 | spacer12: ' ' 209 | spacer21: ' ' 210 | spacer22: ' ' 211 | spacer31: ' ' 212 | spacer32: ' ' 213 | spacer41: ' ' 214 | spacer42: ' ' -------------------------------------------------------------------------------- /rounded/templates/base/state_engine.yaml: -------------------------------------------------------------------------------- 1 | state_engine: 2 | template: 3 | - de-de 4 | variables: 5 | round: -1 6 | multiplier: 1 7 | show_last_changed: false 8 | force_date: false 9 | show_unit: false 10 | has_time: "[[[ return states[entity.entity_id].attributes.has_time != null && states[entity.entity_id].attributes.has_time; ]]]" 11 | has_date: "[[[ return states[entity.entity_id].attributes.has_date != null && states[entity.entity_id].attributes.has_date; ]]]" 12 | custom_fields: 13 | cs: > 14 | [[[ 15 | let state = states[entity.entity_id].state; 16 | 17 | if(!isNaN(state)) { 18 | state = state * variables.multiplier; 19 | 20 | let unit = variables.show_unit ? states[entity.entity_id].attributes.unit_of_measurement : ''; 21 | 22 | if(variables.round >= 0) { 23 | let exp = Math.pow(10,variables.round); 24 | state = Math.round(state * exp) / exp; 25 | } 26 | 27 | return state + ' ' + unit; 28 | } 29 | 30 | if ((variables.has_time || variables.has_date) || variables.show_last_changed || variables.show_last_triggered || variables.force_date) { 31 | 32 | let has_date = variables.has_date; 33 | let has_time = variables.has_time; 34 | 35 | let d = ''; 36 | 37 | if (variables.show_last_changed) { 38 | d = new Date(states[entity.entity_id].last_changed); 39 | } else if (variables.show_last_triggered) { 40 | d = new Date(states[entity.entity_id].attributes.last_triggered); 41 | } else { 42 | d = new Date(state); 43 | } 44 | 45 | d = variables.force_date ? new Date(d) : d; 46 | 47 | if (!has_date && has_time) { 48 | return d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) + 'Uhr'; 49 | } else if (!has_time && has_date) { 50 | return d.toLocaleString(variables.date_format,{day:'numeric', month:'short', year:'numeric'}); 51 | } else { 52 | let d_date = d.toLocaleString(variables.date_format,{day:'numeric', month:'short', year:'numeric'}); 53 | let today = (new Date()).toLocaleString(variables.date_format,{day:'numeric', month:'short', year:'numeric'}); 54 | 55 | if(d_date == today) { 56 | let time = d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); 57 | return time + variables.time_unit; 58 | } 59 | 60 | return d_date; 61 | } 62 | } 63 | 64 | var lang = { 65 | "on": variables.lang_on, 66 | "off": variables.lang_off, 67 | "not_home": variables.lang_not_home, 68 | "home": variables.lang_home, 69 | "paused": variables.lang_paused, 70 | "playing": variables.lang_playing, 71 | "stopped": variables.lang_stopped, 72 | "heat": variables.lang_heat, 73 | "night": variables.lang_armed_night, 74 | "armed_custom_bypass": variables.lang_armed_custom_bypass, 75 | "arming": variables.lang_arming, 76 | "armed_away": variables.lang_armed_away, 77 | "disarmed": variables.lang_disarmed 78 | }; 79 | 80 | let trans_state = lang[state]; 81 | 82 | return trans_state != null ? trans_state : state; 83 | ]]] 84 | es: > 85 | [[[ 86 | if ((variables.has_time || variables.has_date) || variables.show_last_changed || variables.show_last_triggered || variables.force_date) { 87 | let state = states[entity.entity_id].state; 88 | 89 | let has_time = variables.has_time; 90 | let has_date = variables.has_date; 91 | 92 | let d = ''; 93 | 94 | if (variables.show_last_changed) { 95 | d = new Date(states[entity.entity_id].last_changed); 96 | } else if (variables.show_last_triggered) { 97 | d = new Date(states[entity.entity_id].attributes.last_triggered); 98 | } else { 99 | d = new Date(state); 100 | } 101 | 102 | d = variables.force_date ? new Date(d) : d; 103 | 104 | let d_date = d.toLocaleString('de-de',{day:'numeric', month:'short', year:'numeric'}); 105 | let today = (new Date()).toLocaleString('de-de',{day:'numeric', month:'short', year:'numeric'}); 106 | 107 | if(d_date != today) { 108 | let time = d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); 109 | return time + variables.time_unit; 110 | } 111 | } 112 | ]]] 113 | # state: 114 | # # IF stat is a number 115 | # - operator: template 116 | # value: "[[[ return !isNaN(states[entity.entity_id].state); ]]]" 117 | # custom_fields: 118 | # cs: > 119 | # [[[ 120 | # let state = states[entity.entity_id].state * variables.multiplier; 121 | # let unit = variables.show_unit ? states[entity.entity_id].attributes.unit_of_measurement : ''; 122 | 123 | # if(variables.round >= 0) { 124 | # let exp = Math.pow(10,variables.round); 125 | # state = Math.round(state * exp) / exp; 126 | # } 127 | 128 | # return state + ' ' + unit; 129 | # ]]] 130 | # # IF state is date 131 | # - operator: template 132 | # value: "[[[ return (variables.has_time || variables.has_date) || variables.show_last_changed || variables.show_last_triggered || variables.force_date; ]]]" 133 | # custom_fields: 134 | # cs: > 135 | # [[[ 136 | # let state = states[entity.entity_id].state; 137 | # let has_date = variables.has_date; 138 | # let has_time = variables.has_time; 139 | 140 | # let d = ''; 141 | 142 | # if (variables.show_last_changed) { 143 | # d = new Date(states[entity.entity_id].last_changed); 144 | # } else if (variables.show_last_triggered) { 145 | # d = new Date(states[entity.entity_id].attributes.last_triggered); 146 | # } else { 147 | # d = new Date(state); 148 | # } 149 | 150 | # d = variables.force_date ? new Date(d) : d; 151 | 152 | # if (!has_date && has_time) { 153 | # return d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) + 'Uhr'; 154 | # } else if (!has_time && has_date) { 155 | # return d.toLocaleString(variables.date_format,{day:'numeric', month:'short', year:'numeric'}); 156 | # } else { 157 | # let d_date = d.toLocaleString(variables.date_format,{day:'numeric', month:'short', year:'numeric'}); 158 | # let today = (new Date()).toLocaleString(variables.date_format,{day:'numeric', month:'short', year:'numeric'}); 159 | 160 | # if(d_date == today) { 161 | # let time = d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); 162 | # return time + variables.time_unit; 163 | # } 164 | 165 | # return d_date; 166 | # } 167 | # ]]] 168 | # es: > 169 | # [[[ 170 | # let state = states[entity.entity_id].state; 171 | 172 | # let has_time = variables.has_time; 173 | # let has_date = variables.has_date; 174 | 175 | # let d = ''; 176 | 177 | # if (variables.show_last_changed) { 178 | # d = new Date(states[entity.entity_id].last_changed); 179 | # } else if (variables.show_last_triggered) { 180 | # d = new Date(states[entity.entity_id].attributes.last_triggered); 181 | # } else { 182 | # d = new Date(state); 183 | # } 184 | 185 | # d = variables.force_date ? new Date(d) : d; 186 | 187 | # let d_date = d.toLocaleString('de-de',{day:'numeric', month:'short', year:'numeric'}); 188 | # let today = (new Date()).toLocaleString('de-de',{day:'numeric', month:'short', year:'numeric'}); 189 | 190 | # if(d_date != today) { 191 | # let time = d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); 192 | # return time + variables.time_unit; 193 | # } 194 | # ]]] 195 | -------------------------------------------------------------------------------- /site/assets/javascripts/lunr/min/lunr.fi.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lunr languages, `Finnish` language 3 | * https://github.com/MihaiValentin/lunr-languages 4 | * 5 | * Copyright 2014, Mihai Valentin 6 | * http://www.mozilla.org/MPL/ 7 | */ 8 | /*! 9 | * based on 10 | * Snowball JavaScript Library v0.3 11 | * http://code.google.com/p/urim/ 12 | * http://snowball.tartarus.org/ 13 | * 14 | * Copyright 2010, Oleg Mazko 15 | * http://www.mozilla.org/MPL/ 16 | */ 17 | 18 | !function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=function(){var e=i.stemmerSupport.Among,r=i.stemmerSupport.SnowballProgram,n=new function(){function i(){f=A.limit,d=f,n()||(f=A.cursor,n()||(d=A.cursor))}function n(){for(var i;;){if(i=A.cursor,A.in_grouping(W,97,246))break;if(A.cursor=i,i>=A.limit)return!0;A.cursor++}for(A.cursor=i;!A.out_grouping(W,97,246);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}function t(){return d<=A.cursor}function s(){var i,e;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(h,10)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.in_grouping_b(x,97,246))return;break;case 2:if(!t())return}A.slice_del()}else A.limit_backward=e}function o(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(v,9))switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"k")||(A.cursor=A.limit-r,A.slice_del());break;case 2:A.slice_del(),A.ket=A.cursor,A.eq_s_b(3,"kse")&&(A.bra=A.cursor,A.slice_from("ksi"));break;case 3:A.slice_del();break;case 4:A.find_among_b(p,6)&&A.slice_del();break;case 5:A.find_among_b(g,6)&&A.slice_del();break;case 6:A.find_among_b(j,2)&&A.slice_del()}else A.limit_backward=e}function l(){return A.find_among_b(q,7)}function a(){return A.eq_s_b(1,"i")&&A.in_grouping_b(L,97,246)}function u(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(C,30)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.eq_s_b(1,"a"))return;break;case 2:case 9:if(!A.eq_s_b(1,"e"))return;break;case 3:if(!A.eq_s_b(1,"i"))return;break;case 4:if(!A.eq_s_b(1,"o"))return;break;case 5:if(!A.eq_s_b(1,"ä"))return;break;case 6:if(!A.eq_s_b(1,"ö"))return;break;case 7:if(r=A.limit-A.cursor,!l()&&(A.cursor=A.limit-r,!A.eq_s_b(2,"ie"))){A.cursor=A.limit-r;break}if(A.cursor=A.limit-r,A.cursor<=A.limit_backward){A.cursor=A.limit-r;break}A.cursor--,A.bra=A.cursor;break;case 8:if(!A.in_grouping_b(W,97,246)||!A.out_grouping_b(W,97,246))return}A.slice_del(),k=!0}else A.limit_backward=e}function c(){var i,e,r;if(A.cursor>=d)if(e=A.limit_backward,A.limit_backward=d,A.ket=A.cursor,i=A.find_among_b(P,14)){if(A.bra=A.cursor,A.limit_backward=e,1==i){if(r=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-r}A.slice_del()}else A.limit_backward=e}function m(){var i;A.cursor>=f&&(i=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.find_among_b(F,2)?(A.bra=A.cursor,A.limit_backward=i,A.slice_del()):A.limit_backward=i)}function w(){var i,e,r,n,t,s;if(A.cursor>=f){if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.eq_s_b(1,"t")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.in_grouping_b(W,97,246)&&(A.cursor=A.limit-r,A.slice_del(),A.limit_backward=e,n=A.limit-A.cursor,A.cursor>=d&&(A.cursor=d,t=A.limit_backward,A.limit_backward=A.cursor,A.cursor=A.limit-n,A.ket=A.cursor,i=A.find_among_b(S,2))))){if(A.bra=A.cursor,A.limit_backward=t,1==i){if(s=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-s}return void A.slice_del()}A.limit_backward=e}}function _(){var i,e,r,n;if(A.cursor>=f){for(i=A.limit_backward,A.limit_backward=f,e=A.limit-A.cursor,l()&&(A.cursor=A.limit-e,A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.in_grouping_b(y,97,228)&&(A.bra=A.cursor,A.out_grouping_b(W,97,246)&&A.slice_del()),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"j")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.eq_s_b(1,"o")?A.slice_del():(A.cursor=A.limit-r,A.eq_s_b(1,"u")&&A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"o")&&(A.bra=A.cursor,A.eq_s_b(1,"j")&&A.slice_del()),A.cursor=A.limit-e,A.limit_backward=i;;){if(n=A.limit-A.cursor,A.out_grouping_b(W,97,246)){A.cursor=A.limit-n;break}if(A.cursor=A.limit-n,A.cursor<=A.limit_backward)return;A.cursor--}A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,b=A.slice_to(),A.eq_v_b(b)&&A.slice_del())}}var k,b,d,f,h=[new e("pa",-1,1),new e("sti",-1,2),new e("kaan",-1,1),new e("han",-1,1),new e("kin",-1,1),new e("hän",-1,1),new e("kään",-1,1),new e("ko",-1,1),new e("pä",-1,1),new e("kö",-1,1)],p=[new e("lla",-1,-1),new e("na",-1,-1),new e("ssa",-1,-1),new e("ta",-1,-1),new e("lta",3,-1),new e("sta",3,-1)],g=[new e("llä",-1,-1),new e("nä",-1,-1),new e("ssä",-1,-1),new e("tä",-1,-1),new e("ltä",3,-1),new e("stä",3,-1)],j=[new e("lle",-1,-1),new e("ine",-1,-1)],v=[new e("nsa",-1,3),new e("mme",-1,3),new e("nne",-1,3),new e("ni",-1,2),new e("si",-1,1),new e("an",-1,4),new e("en",-1,6),new e("än",-1,5),new e("nsä",-1,3)],q=[new e("aa",-1,-1),new e("ee",-1,-1),new e("ii",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1),new e("ää",-1,-1),new e("öö",-1,-1)],C=[new e("a",-1,8),new e("lla",0,-1),new e("na",0,-1),new e("ssa",0,-1),new e("ta",0,-1),new e("lta",4,-1),new e("sta",4,-1),new e("tta",4,9),new e("lle",-1,-1),new e("ine",-1,-1),new e("ksi",-1,-1),new e("n",-1,7),new e("han",11,1),new e("den",11,-1,a),new e("seen",11,-1,l),new e("hen",11,2),new e("tten",11,-1,a),new e("hin",11,3),new e("siin",11,-1,a),new e("hon",11,4),new e("hän",11,5),new e("hön",11,6),new e("ä",-1,8),new e("llä",22,-1),new e("nä",22,-1),new e("ssä",22,-1),new e("tä",22,-1),new e("ltä",26,-1),new e("stä",26,-1),new e("ttä",26,9)],P=[new e("eja",-1,-1),new e("mma",-1,1),new e("imma",1,-1),new e("mpa",-1,1),new e("impa",3,-1),new e("mmi",-1,1),new e("immi",5,-1),new e("mpi",-1,1),new e("impi",7,-1),new e("ejä",-1,-1),new e("mmä",-1,1),new e("immä",10,-1),new e("mpä",-1,1),new e("impä",12,-1)],F=[new e("i",-1,-1),new e("j",-1,-1)],S=[new e("mma",-1,1),new e("imma",0,-1)],y=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],W=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],x=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],A=new r;this.setCurrent=function(i){A.setCurrent(i)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return i(),k=!1,A.limit_backward=e,A.cursor=A.limit,s(),A.cursor=A.limit,o(),A.cursor=A.limit,u(),A.cursor=A.limit,c(),A.cursor=A.limit,k?(m(),A.cursor=A.limit):(A.cursor=A.limit,w(),A.cursor=A.limit),_(),!0}};return function(i){return"function"==typeof i.update?i.update(function(i){return n.setCurrent(i),n.stem(),n.getCurrent()}):(n.setCurrent(i),n.stem(),n.getCurrent())}}(),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); --------------------------------------------------------------------------------