updating configuration

This commit is contained in:
Your Name
2026-03-21 18:29:48 +00:00
parent 9498a076ee
commit d3d9a3919d
8 changed files with 70 additions and 87 deletions
@@ -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
+30
View File
@@ -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):
@@ -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