From d3d9a3919d0f2acab6992cc13c21c9691e243665 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 21 Mar 2026 18:29:48 +0000 Subject: [PATCH] updating configuration --- .../settings/apps/climate/breaser_control.py | 70 ++----------------- appdaemon/settings/apps/climate/cover.py | 30 ++++++++ appdaemon/settings/apps/climate/cover.yaml | 7 ++ appdaemon/settings/apps/router/keenetic.py | 3 +- hass/settings/.ha_run.lock | 2 +- hass/settings/packages/alice_intents.yaml | 2 +- .../packages/power/power_cost_templates.yaml | 22 ++++++ .../packages/power/power_counter.yaml | 21 ------ 8 files changed, 70 insertions(+), 87 deletions(-) create mode 100644 hass/settings/packages/power/power_cost_templates.yaml diff --git a/appdaemon/settings/apps/climate/breaser_control.py b/appdaemon/settings/apps/climate/breaser_control.py index 7718a5f..2f3c98b 100644 --- a/appdaemon/settings/apps/climate/breaser_control.py +++ b/appdaemon/settings/apps/climate/breaser_control.py @@ -61,17 +61,17 @@ class BreaserControl(hass.Hass): elif not self.time_is_between(self.datetime(), self.args["on_time"], self.args["off_time"]): self.set_mode_by_co2(co2_level, True) -def set_mode_by_co2(self, co2_level, is_night): + def set_mode_by_co2(self, co2_level, is_night): self.heat_mode_by_time() # === Настраиваемые коэффициенты === CFG = { 'co2_auto_threshold': 600, # Ниже этого значения — auto_mode - 'co2_min_control': 700, # Начало плавного роста скорости - 'co2_max_control': 1200, # Максимальная скорость достигается здесь - 'speed_min': 30, # Мин. скорость вентиляции + 'co2_min_control': 600, # Начало плавного роста скорости + 'co2_max_control': 1000, # Максимальная скорость достигается здесь + 'speed_min': 1, # Мин. скорость вентиляции 'speed_max': 100, # Макс. скорость вентиляции - 'night_speed_factor': 0.75, # Коэффициент снижения скорости ночью + 'night_speed_factor': 0.7, # Коэффициент снижения скорости ночью 'transition_smoothness': 0.3, # Плавность перехода (0-1) } @@ -103,68 +103,12 @@ def set_mode_by_co2(self, co2_level, is_night): # === Плавный расчёт скорости === speed = calculate_speed(co2_level, CFG, is_night) - # Определение уровня для лога - if co2_level < CFG['co2_min_control']: - level_desc = 'good' - elif co2_level < CFG['co2_max_control'] * 0.7: - level_desc = 'moderate' - elif co2_level < CFG['co2_max_control']: - level_desc = 'high' - else: - level_desc = 'extremely high' - period = 'Night' if is_night else 'Day' - self.log('{}, CO2 is {}: {}. Set speed to {}.'.format( - period, level_desc, co2_level, speed)) + self.log('{}, CO2 is {}. Set speed to {}.'.format( + period, co2_level, speed)) self.set_speed(speed) - # def set_mode_by_co2(self, co2_level, is_night): - # self.heat_mode_by_time() - # if co2_level < 500: - # self.log('CO2 is fine: {}. Set auto mode.'.format(co2_level)) - # self.auto_mode() - # if co2_level > 500 and co2_level < 800: - # if is_night: - # self.log('CO2 is normal: {}. Set night mode'.format(co2_level)) - # self.night_mode() - # else: - # self.log('CO2 is normal: {}. Set auto mode.'.format(co2_level)) - # self.auto_mode() - # return - # if co2_level > 800 and co2_level < 900: - # if is_night: - # self.log('Night, CO2 is high: {}. Set speed to 45.'.format(co2_level)) - # self.set_speed(45) - # else: - # self.log('Day, CO2 is high: {}. Set speed to 65.'.format(co2_level)) - # self.set_speed(65) - # return - # if co2_level > 900 and co2_level < 1000: - # if is_night: - # self.log('Night, CO2 is high: {}. Set speed to 65.'.format(co2_level)) - # self.set_speed(65) - # else: - # self.log('Day, CO2 is high: {}. Set speed to 80.'.format(co2_level)) - # self.set_speed(80) - # return - # if co2_level > 1000 and co2_level < 1200: - # if is_night: - # self.log('Night, CO2 is extremely high: {}. Set speed to 80.'.format(co2_level)) - # self.set_speed(80) - # else: - # self.log('Day, CO2 is extremely high: {}. Set speed to 100.'.format(co2_level)) - # self.set_speed(100) - # return - # if co2_level > 1200: - # if is_night: - # self.log('Night, CO2 is extremely high: {}. Set speed to 100.'.format(co2_level)) - # self.set_speed(100) - # else: - # self.log('Day, CO2 is extremely high: {}. Set speed to 100.'.format(co2_level)) - # self.set_speed(100) - # return - def set_speed(self, speed): if 'constraint' in self.args and not self.constrain_input_boolean(self.args['constraint']): return diff --git a/appdaemon/settings/apps/climate/cover.py b/appdaemon/settings/apps/climate/cover.py index b86f9d6..11ede11 100644 --- a/appdaemon/settings/apps/climate/cover.py +++ b/appdaemon/settings/apps/climate/cover.py @@ -16,6 +16,7 @@ class CoverByPresence(hass.Hass): if 'covers' not in self.args: self.error("Please provide covers in config!") return + self.log("Initializing CoverByPresence with covers: {}".format(self.args.get("covers"))) self.listen_event(self.away_mode, "away_mode") self.listen_event(self.return_home_mode, "return_home_mode") @@ -24,6 +25,27 @@ class CoverByPresence(hass.Hass): sunset_offset = int(self.args.get('sunset_offset', '0')) self.run_at_sunset(self.run_at_sunset_func, offset=sunset_offset) + # Prepare cover door sensors mapping (optional) + self.cover_door_sensors = self.args.get("cover_door_sensors", {}) + self.log("Cover door sensors mapping: {}".format(self.cover_door_sensors)) + + def is_cover_blocked(self, entity_id): + """ + Returns True if the cover has at least one associated door sensor + that is currently in 'on' (open) state. + """ + sensors = self.cover_door_sensors.get(entity_id, []) + if not sensors: + self.log("No door sensors configured for cover {}, treat as not blocked".format(entity_id)) + return False + for sensor in sensors: + state = self.get_state(sensor) + self.log("Door sensor {} for cover {} state: {}".format(sensor, entity_id, state)) + if state == "on": + self.log("Skip moving cover {} because door sensor {} is open".format(entity_id, sensor)) + return True + return False + def run_at_sunrise_func(self, kwargs): if 'constraint' in self.args and not self.constrain_input_boolean(self.args['constraint']): self.log('execution is disabled.') @@ -38,6 +60,8 @@ class CoverByPresence(hass.Hass): return for entity_id in self.args["open_at_sunrise"]: + if self.is_cover_blocked(entity_id): + continue self.log('opening cover {} at sunrise'.format(entity_id)) self.turn_on_custom(entity_id) @@ -49,6 +73,8 @@ class CoverByPresence(hass.Hass): self.log('no covers to close at sunset.') return for entity_id in self.args["close_at_sunset"]: + if self.is_cover_blocked(entity_id): + continue self.log('closing cover {} at sunset'.format(entity_id)) self.turn_off_custom(entity_id) @@ -57,6 +83,8 @@ class CoverByPresence(hass.Hass): self.log('execution is disabled.') return for entity_id in self.args["covers"]: + if self.is_cover_blocked(entity_id): + continue self.turn_off_custom(entity_id) def return_home_mode(self, event_id, event_args, kwargs): @@ -68,6 +96,8 @@ class CoverByPresence(hass.Hass): return entities = self.args["covers"] for entity_id in entities: + if self.is_cover_blocked(entity_id): + continue self.turn_on_custom(entity_id) def turn_on_custom(self, entity_id): diff --git a/appdaemon/settings/apps/climate/cover.yaml b/appdaemon/settings/apps/climate/cover.yaml index fb8377e..7851d8a 100644 --- a/appdaemon/settings/apps/climate/cover.yaml +++ b/appdaemon/settings/apps/climate/cover.yaml @@ -24,6 +24,13 @@ cover_action: open_at_sunrise: - cover.curtain_kitchen - cover.curtain_mainroom + cover_door_sensors: + cover.curtain_bedroom: + - binary_sensor.door_bedroom_big_window_contact + cover.curtain_bedroom_balcony: + - binary_sensor.door_balcony_contact + cover.curtain_bedroom_bobbinet_balcony: + - binary_sensor.door_balcony_contact global_dependencies: - globals diff --git a/appdaemon/settings/apps/router/keenetic.py b/appdaemon/settings/apps/router/keenetic.py index d6fb4c3..5ce6709 100644 --- a/appdaemon/settings/apps/router/keenetic.py +++ b/appdaemon/settings/apps/router/keenetic.py @@ -63,8 +63,9 @@ class TelegramInternetControl(hass.Hass): text = event_args['text'] room = event_args['room'] alice = event_args['entity_id'] - if text == self.block_command: + if text.lower() == self.block_command.lower(): self.handle_block_command('Monster1025') + self.say(alice, 'Интернет в детской отключен.') def say(self, entity_id, command): self.log('command = {}'.format(command)) diff --git a/hass/settings/.ha_run.lock b/hass/settings/.ha_run.lock index 642bdda..65a874a 100644 --- a/hass/settings/.ha_run.lock +++ b/hass/settings/.ha_run.lock @@ -1 +1 @@ -{"pid": 106582, "version": 1, "ha_version": "2026.2.3", "start_ts": 1773083280.3675456} \ No newline at end of file +{"pid": 67, "version": 1, "ha_version": "2026.2.3", "start_ts": 1774117247.3266375} \ No newline at end of file diff --git a/hass/settings/packages/alice_intents.yaml b/hass/settings/packages/alice_intents.yaml index 80eaece..f1b143c 100644 --- a/hass/settings/packages/alice_intents.yaml +++ b/hass/settings/packages/alice_intents.yaml @@ -1,7 +1,7 @@ yandex_station_intents: intents: Как дела: Все хорошо - Коля наказан: Отключаю интернет в детской + Коля наказан: Пробую отключить интернет в детской Включи вентилятор: execute_command: Поставь режим вентиляции на кондиционере в комнате {{ event.room }} Выключи вентилятор: diff --git a/hass/settings/packages/power/power_cost_templates.yaml b/hass/settings/packages/power/power_cost_templates.yaml new file mode 100644 index 0000000..b3a73c7 --- /dev/null +++ b/hass/settings/packages/power/power_cost_templates.yaml @@ -0,0 +1,22 @@ +template: + - sensor: + - unit_of_measurement: kWh + state: "{{ states('sensor.power_total') | float - 7072.7 | round(2) }}" + name: power_main_total + # 7072.7 - разница показаний. + + - unit_of_measurement: ₽ + state: "{{ states('sensor.power_monthly_t1') | float * 8.23 | round(2) }}" + name: power_monthly_cost_t1 + + - unit_of_measurement: ₽ + state: "{{ states('sensor.power_monthly_t2') | float * 2.62 | round(2) }}" + name: power_monthly_cost_t2 + + - unit_of_measurement: ₽ + state: "{{ states('sensor.power_monthly_t3') | float * 5.66 | round(2) }}" + name: power_monthly_cost_t3 + + - unit_of_measurement: ₽ + state: "{{ (states('sensor.power_monthly_cost_t1') | float) + (states('sensor.power_monthly_cost_t2') | float) + (states('sensor.power_monthly_cost_t3') | float) | round(2) }}" + name: power_monthly_cost_total diff --git a/hass/settings/packages/power/power_counter.yaml b/hass/settings/packages/power/power_counter.yaml index b6f2669..5575f63 100644 --- a/hass/settings/packages/power/power_counter.yaml +++ b/hass/settings/packages/power/power_counter.yaml @@ -97,27 +97,6 @@ modbus: scale: 0.01 unit_of_measurement: 'Hz' -sensor: - - platform: template - sensors: - power_main_total: - unit_of_measurement: 'kWh' - value_template: "{{ states('sensor.power_total') | float - 7072.7 | round(2) }}" - #7072.7 - разница показаний. - - power_monthly_cost_t1: - unit_of_measurement: '₽' - value_template: "{{ states('sensor.power_monthly_t1') | float * 8.23 | round(2) }}" - power_monthly_cost_t2: - unit_of_measurement: '₽' - value_template: "{{ states('sensor.power_monthly_t2') | float * 2.62 | round(2) }}" - power_monthly_cost_t3: - unit_of_measurement: '₽' - value_template: "{{ states('sensor.power_monthly_t3') | float * 5.66 | round(2) }}" - power_monthly_cost_total: - unit_of_measurement: '₽' - value_template: "{{ states('sensor.power_monthly_cost_t1') | float + states('sensor.power_monthly_cost_t2') | float + states('sensor.power_monthly_cost_t3') | float | round(2) }}" - utility_meter: power_hourly: source: sensor.power_total