diff --git a/thermostat.py b/thermostat.py index a14b5a0..0fa3261 100644 --- a/thermostat.py +++ b/thermostat.py @@ -254,87 +254,87 @@ def thermostat_loop(): today_awake_time = current_date.replace(hour=int(awake_hour.split(':')[0]), minute=int(awake_hour.split(':')[1]), second=0, microsecond=0) today_sleep_time = current_date.replace(hour=int(sleep_hour.split(':')[0]), minute=int(sleep_hour.split(':')[1]), second=0, microsecond=0) forced_mode = get_forced_mode() -# if forced_mode is not None and forced_mode in targets: -# if target_name != forced_mode: -# target_name = forced_mode -# logging.info("Switch to "+forced_mode) -# else: -# if forced_mode == "long_absence": -# if target_name != "target_frost_protection" or first_loop: -# target_name = "target_frost_protection" -# logging.info("Switch to "+target_name) -# elif forced_mode == "short_absence" or first_loop: -# if target_name != "target_sleep_temperature": -# target_name = "target_sleep_temperature" -# logging.info("Switch to "+target_name) -# elif current_date > today_awake_time and current_date < today_sleep_time: -# if target_name != "target_unconfirmed_awake_temperature" and target_name != "target_awake_temperature": -# target_name = "target_unconfirmed_awake_temperature" -# logging.info("Switch to unconfirmed awake mode.") -# elif current_date < today_awake_time or current_date > today_sleep_time: -# if target_name != "target_unconfirmed_sleep_temperature" and target_name != "target_sleep_temperature": -# target_name = "target_unconfirmed_sleep_temperature" -# logging.info("Switch to unconfirmed sleep mode.") -# -# first_loop = False -# -# # Load shedder -# current_load = get_metric("Modane_elec_main_power", current_time, load_shedder_interval) -# if current_load is None: -# time.sleep(load_shedder_interval) -# continue -# elif max_load - current_load < load_margin: -# logging.warning("Load too high: "+str(current_load)+"VA") -# total_shedded = 0 -# for room in shedding_order: -# current_state = relay_state(rooms_settings[room]["relays"]) -# if current_state != "Failed": -# logging.debug("Got relay_state: '"+current_state+"'") -# if current_state == "1": -# result = set_relay(rooms_settings[room]["relays"], "off") -# if result == "OK": -# total_shedded += relays_load[rooms_settings[room]["relays"]] -# if max_load - current_load - total_shedded < load_margin: -# logging.info("Load should be back to normal.") -# break -# -# # Thermostat -# if last_control_time is None or current_time - last_control_time > relay_control_interval: -# last_control_time = current_time -# for room in rooms_settings: -# if not rooms_settings[room]["enabled"]: -# continue -# target = rooms_settings[room][target_name] -# logging.debug("Target: "+str(target)) -# temperature = get_metric(rooms_settings[room]["metric"], current_time, relay_control_interval) -# if temperature is None: -# continue -# logging.debug(room+": "+str(temperature)) -# current_state = relay_state(rooms_settings[room]["relays"]) -# if current_state != "Failed": -# logging.debug("Got relay_state: '"+current_state+"'") -# if temperature < target - hysteresis: -# if current_state == "0": -# logging.info(room+": Target temperature is "+str(target)) -# logging.info(room+": Current temperature is "+str(temperature)) -# if current_load + relays_load[rooms_settings[room]["relays"]] + load_margin > max_load: -# logging.warning(room+": Load too high cannot start heaters.") -# else: -# logging.info(room+": Starting heaters.") + if forced_mode is not None and forced_mode in targets: + if target_name != forced_mode: + target_name = forced_mode + logging.info("Switch to "+forced_mode) + else: + if forced_mode == "long_absence": + if target_name != "target_frost_protection" or first_loop: + target_name = "target_frost_protection" + logging.info("Switch to "+target_name) + elif forced_mode == "short_absence" or first_loop: + if target_name != "target_sleep_temperature": + target_name = "target_sleep_temperature" + logging.info("Switch to "+target_name) + elif current_date > today_awake_time and current_date < today_sleep_time: + if target_name != "target_unconfirmed_awake_temperature" and target_name != "target_awake_temperature": + target_name = "target_unconfirmed_awake_temperature" + logging.info("Switch to unconfirmed awake mode.") + elif current_date < today_awake_time or current_date > today_sleep_time: + if target_name != "target_unconfirmed_sleep_temperature" and target_name != "target_sleep_temperature": + target_name = "target_unconfirmed_sleep_temperature" + logging.info("Switch to unconfirmed sleep mode.") + + first_loop = False + + # Load shedder + current_load = get_metric("Modane_elec_main_power", current_time, load_shedder_interval) + if current_load is None: + time.sleep(load_shedder_interval) + continue + elif max_load - current_load < load_margin: + logging.warning("Load too high: "+str(current_load)+"VA") + total_shedded = 0 + for room in shedding_order: + current_state = relay_state(rooms_settings[room]["relays"]) + if current_state != "Failed": + logging.debug("Got relay_state: '"+current_state+"'") + if current_state == "1": + result = set_relay(rooms_settings[room]["relays"], "off") + if result == "OK": + total_shedded += relays_load[rooms_settings[room]["relays"]] + if max_load - current_load - total_shedded < load_margin: + logging.info("Load should be back to normal.") + break + + # Thermostat + if last_control_time is None or current_time - last_control_time > relay_control_interval: + last_control_time = current_time + for room in rooms_settings: + if not rooms_settings[room]["enabled"]: + continue + target = rooms_settings[room][target_name] + logging.debug("Target: "+str(target)) + temperature = get_metric(rooms_settings[room]["metric"], current_time, relay_control_interval) + if temperature is None: + continue + logging.debug(room+": "+str(temperature)) + current_state = relay_state(rooms_settings[room]["relays"]) + if current_state != "Failed": + logging.debug("Got relay_state: '"+current_state+"'") + if temperature < target - hysteresis: + if current_state == "0": + logging.info(room+": Target temperature is "+str(target)) + logging.info(room+": Current temperature is "+str(temperature)) + if current_load + relays_load[rooms_settings[room]["relays"]] + load_margin > max_load: + logging.warning(room+": Load too high cannot start heaters.") + else: + logging.info(room+": Starting heaters.") # set_relay(rooms_settings[room]["relays"], "on") -# sys.stdout.flush() -# else: -# logging.debug("Relay already on.") -# -# elif temperature > target + hysteresis: -# if current_state == "1": -# logging.info(room+": Target temperature is "+str(target)) -# logging.info(room+": Current temperature is "+str(temperature)) -# logging.info(room+": Stopping heaters.") -# sys.stdout.flush() + sys.stdout.flush() + else: + logging.debug("Relay already on.") + + elif temperature > target + hysteresis: + if current_state == "1": + logging.info(room+": Target temperature is "+str(target)) + logging.info(room+": Current temperature is "+str(temperature)) + logging.info(room+": Stopping heaters.") + sys.stdout.flush() # set_relay(rooms_settings[room]["relays"], "off") -# else: -# logging.debug("Relay already off.") + else: + logging.debug("Relay already off.") time.sleep(load_shedder_interval) t1 = Thread(target=thermostat_loop)