diff --git a/pioreactor/automations/temperature/thermostat.py b/pioreactor/automations/temperature/thermostat.py index 73e8c0fa..0ab9bb11 100644 --- a/pioreactor/automations/temperature/thermostat.py +++ b/pioreactor/automations/temperature/thermostat.py @@ -7,6 +7,7 @@ from pioreactor.utils import clamp from pioreactor.utils import is_pio_job_running from pioreactor.utils.streaming_calculations import PID +from pioreactor.whoami import get_pioreactor_model from pioreactor.whoami import get_pioreactor_version @@ -15,9 +16,10 @@ class Thermostat(TemperatureAutomationJob): Uses a PID controller to change the DC% to match a target temperature. """ - if get_pioreactor_version() == (1, 0): + if get_pioreactor_model() == "pioreactor_20ml" and get_pioreactor_version() == (1, 0): MAX_TARGET_TEMP = 50 else: + # made from pccf MAX_TARGET_TEMP = 70 automation_name = "thermostat" diff --git a/pioreactor/background_jobs/monitor.py b/pioreactor/background_jobs/monitor.py index ef45330e..c2158b1b 100644 --- a/pioreactor/background_jobs/monitor.py +++ b/pioreactor/background_jobs/monitor.py @@ -76,10 +76,10 @@ def off(): # functions don't take any arguments, nothing is passed in """ - if whoami.get_pioreactor_version() == (1, 0): + if whoami.get_pioreactor_model() == "pioreactor_20ml" and whoami.get_pioreactor_version() == (1, 0): # made from PLA MAX_TEMP_TO_SHUTDOWN = 66.0 - elif whoami.get_pioreactor_version() >= (1, 1): + else: # made from PC-CF MAX_TEMP_TO_SHUTDOWN = 85.0 # risk damaging PCB components diff --git a/pioreactor/background_jobs/temperature_automation.py b/pioreactor/background_jobs/temperature_automation.py index 0ef1a439..0d65059c 100644 --- a/pioreactor/background_jobs/temperature_automation.py +++ b/pioreactor/background_jobs/temperature_automation.py @@ -46,7 +46,7 @@ class TemperatureAutomationJob(AutomationJob): INFERENCE_SAMPLES_EVERY_T_SECONDS: float = 5.0 - if whoami.get_pioreactor_version() == (1, 0): + if whoami.get_pioreactor_model() == "pioreactor_20ml" and whoami.get_pioreactor_version() == (1, 0): # made from PLA MAX_TEMP_TO_REDUCE_HEATING = 63.0 MAX_TEMP_TO_DISABLE_HEATING = 65.0 # probably okay, but can't stay here for too long @@ -54,8 +54,8 @@ class TemperatureAutomationJob(AutomationJob): INFERENCE_N_SAMPLES: int = 29 INFERENCE_EVERY_N_SECONDS: float = 225.0 - elif whoami.get_pioreactor_version() >= (1, 1): - # made from PC-CF + else: + # made from PC-CF - this is true for 40ml and 20ml v1.1 MAX_TEMP_TO_REDUCE_HEATING = 78.0 MAX_TEMP_TO_DISABLE_HEATING = 80.0 MAX_TEMP_TO_SHUTDOWN = 85.0 # risk damaging PCB components @@ -409,10 +409,14 @@ def infer_temperature(self) -> None: self.logger.debug(f"{features=}") try: - if whoami.get_pioreactor_version() == (1, 0): - inferred_temperature = self.approximate_temperature_1_0(features) - elif whoami.get_pioreactor_version() >= (1, 1): - inferred_temperature = self.approximate_temperature_2_0(features) + if whoami.get_pioreactor_model() == "pioreactor_20ml": + if whoami.get_pioreactor_version() == (1, 0): + inferred_temperature = self.approximate_temperature_20_1_0(features) + elif whoami.get_pioreactor_version() >= (1, 1): + inferred_temperature = self.approximate_temperature_20_2_0(features) + elif whoami.get_pioreactor_model() == "pioreactor_40ml": + inferred_temperature = self.approximate_temperature_40_1_0(features) + raise ValueError("Unknown Pioreactor model. See config.") self.temperature = Temperature( temperature=round(inferred_temperature, 2), @@ -425,7 +429,11 @@ def infer_temperature(self) -> None: self.logger.error(e) @staticmethod - def approximate_temperature_1_0(features: dict[str, Any]) -> float: + def approximate_temperature_40_1_0(features: dict[str, Any]) -> float: + raise NotImplementedError("This model has not been implemented yet.") + + @staticmethod + def approximate_temperature_20_1_0(features: dict[str, Any]) -> float: """ models @@ -528,7 +536,7 @@ def approximate_temperature_1_0(features: dict[str, Any]) -> float: # return float(room_temp + alpha * (exp(beta * n) - 1)/(beta * n)) @staticmethod - def approximate_temperature_2_0(features: dict[str, Any]) -> float: + def approximate_temperature_20_2_0(features: dict[str, Any]) -> float: """ This uses linear regression from historical data """ diff --git a/pioreactor/cluster_management/__init__.py b/pioreactor/cluster_management/__init__.py index cd3c6783..99ee1297 100644 --- a/pioreactor/cluster_management/__init__.py +++ b/pioreactor/cluster_management/__init__.py @@ -52,8 +52,6 @@ def add_worker(hostname: str, password: str, version: str, model: str) -> None: """ import socket - assert model == "pioreactor_20ml" - logger = create_logger( "add_pioreactor", unit=whoami.get_unit_name(), diff --git a/pioreactor/tests/test_temperature_approximation_1_0.py b/pioreactor/tests/test_temperature_approximation_1_0.py index 2baf80fd..a824c6ba 100644 --- a/pioreactor/tests/test_temperature_approximation_1_0.py +++ b/pioreactor/tests/test_temperature_approximation_1_0.py @@ -34,7 +34,7 @@ def test_temperature_approximation_if_less_than_hardcoded_room_temp(self) -> Non 19.5, ], } - assert 19.0 <= self.t.approximate_temperature_1_0(features) <= 20.0 + assert 19.0 <= self.t.approximate_temperature_20_1_0(features) <= 20.0 def test_temperature_approximation_if_constant(self) -> None: for temp in range(20, 45): @@ -43,7 +43,7 @@ def test_temperature_approximation_if_constant(self) -> None: "previous_heater_dc": 17, "time_series_of_temp": 30 * [float(temp)], } - assert abs(temp - self.t.approximate_temperature_1_0(features)) < 0.30 + assert abs(temp - self.t.approximate_temperature_20_1_0(features)) < 0.30 def test_temperature_approximation_even_if_very_tiny_heat_source(self) -> None: import numpy as np @@ -56,7 +56,7 @@ def test_temperature_approximation_even_if_very_tiny_heat_source(self) -> None: ), } - assert (32 * np.exp(-0.008 * 17)) < self.t.approximate_temperature_1_0(features) < 32 + assert (32 * np.exp(-0.008 * 17)) < self.t.approximate_temperature_20_1_0(features) < 32 def test_temperature_approximation_even_if_very_large_heat_source(self) -> None: import numpy as np @@ -69,12 +69,12 @@ def test_temperature_approximation_even_if_very_large_heat_source(self) -> None: ), } - assert (24 * np.exp(-0.008 * 17)) < self.t.approximate_temperature_1_0(features) < 25 + assert (24 * np.exp(-0.008 * 17)) < self.t.approximate_temperature_20_1_0(features) < 25 def test_temperature_approximation_if_dc_is_nil(self) -> None: features = {"previous_heater_dc": 0, "time_series_of_temp": [37.8125, 32.1875]} - assert self.t.approximate_temperature_1_0(features) == 32.1875 + assert self.t.approximate_temperature_20_1_0(features) == 32.1875 # this is all real data measured insitu, the gold standard. def test_temperature_approximation1(self) -> None: @@ -114,7 +114,7 @@ def test_temperature_approximation1(self) -> None: ], } - assert 33.389 <= self.t.approximate_temperature_1_0(features) <= 33.830 + assert 33.389 <= self.t.approximate_temperature_20_1_0(features) <= 33.830 def test_temperature_approximation_heating_vial1(self) -> None: features = { @@ -153,7 +153,7 @@ def test_temperature_approximation_heating_vial1(self) -> None: ], } - assert 33.525 <= self.t.approximate_temperature_1_0(features) <= 34.00 + assert 33.525 <= self.t.approximate_temperature_20_1_0(features) <= 34.00 def test_temperature_approximation_heating_vial2(self) -> None: features = { @@ -192,7 +192,7 @@ def test_temperature_approximation_heating_vial2(self) -> None: ], } - assert 33.695 <= self.t.approximate_temperature_1_0(features) <= 34.170 + assert 33.695 <= self.t.approximate_temperature_20_1_0(features) <= 34.170 def test_temperature_approximation_heating_vial3(self) -> None: features = { @@ -231,7 +231,7 @@ def test_temperature_approximation_heating_vial3(self) -> None: ], } - assert 33.898 <= self.t.approximate_temperature_1_0(features) <= 34.339 + assert 33.898 <= self.t.approximate_temperature_20_1_0(features) <= 34.339 def test_temperature_approximation_heating_vial4(self) -> None: features = { @@ -270,7 +270,7 @@ def test_temperature_approximation_heating_vial4(self) -> None: ], } - assert 34.068 <= self.t.approximate_temperature_1_0(features) <= 34.577 + assert 34.068 <= self.t.approximate_temperature_20_1_0(features) <= 34.577 def test_temperature_approximation_heating_vial5(self) -> None: features = { @@ -309,7 +309,7 @@ def test_temperature_approximation_heating_vial5(self) -> None: ], } - assert 34.305 <= self.t.approximate_temperature_1_0(features) <= 34.814 + assert 34.305 <= self.t.approximate_temperature_20_1_0(features) <= 34.814 def test_temperature_approximation6(self) -> None: features = { @@ -348,7 +348,7 @@ def test_temperature_approximation6(self) -> None: ], } - assert 34.475 <= self.t.approximate_temperature_1_0(features) <= 35.018 + assert 34.475 <= self.t.approximate_temperature_20_1_0(features) <= 35.018 def test_temperature_approximation7(self) -> None: features = { @@ -387,7 +387,7 @@ def test_temperature_approximation7(self) -> None: ], } - assert 34.644 <= self.t.approximate_temperature_1_0(features) <= 35.153 + assert 34.644 <= self.t.approximate_temperature_20_1_0(features) <= 35.153 def test_temperature_approximation8(self) -> None: features = { @@ -426,7 +426,7 @@ def test_temperature_approximation8(self) -> None: ], } - assert 34.746 <= self.t.approximate_temperature_1_0(features) <= 35.289 + assert 34.746 <= self.t.approximate_temperature_20_1_0(features) <= 35.289 def test_temperature_approximation9(self) -> None: features = { @@ -464,7 +464,7 @@ def test_temperature_approximation9(self) -> None: 35.5, ], } - assert 34.848 <= self.t.approximate_temperature_1_0(features) <= 35.391 + assert 34.848 <= self.t.approximate_temperature_20_1_0(features) <= 35.391 def test_temperature_approximation10(self) -> None: features = { @@ -503,7 +503,7 @@ def test_temperature_approximation10(self) -> None: ], } - assert 34.950 <= self.t.approximate_temperature_1_0(features) <= 35.493 + assert 34.950 <= self.t.approximate_temperature_20_1_0(features) <= 35.493 def test_temperature_approximation20(self) -> None: features = { @@ -542,7 +542,7 @@ def test_temperature_approximation20(self) -> None: ], } - assert 34.950 <= self.t.approximate_temperature_1_0(features) <= 35.493 + assert 34.950 <= self.t.approximate_temperature_20_1_0(features) <= 35.493 @pytest.mark.xfail def test_temperature_approximation_cooling1(self) -> None: @@ -582,7 +582,7 @@ def test_temperature_approximation_cooling1(self) -> None: ], } - assert 32.169 <= self.t.approximate_temperature_1_0(features) + assert 32.169 <= self.t.approximate_temperature_20_1_0(features) def test_temperature_approximation_cooling2(self) -> None: features = { @@ -621,7 +621,7 @@ def test_temperature_approximation_cooling2(self) -> None: ], } - assert 31.118 <= self.t.approximate_temperature_1_0(features) + assert 31.118 <= self.t.approximate_temperature_20_1_0(features) def test_temperature_approximation11(self) -> None: features = { @@ -660,7 +660,7 @@ def test_temperature_approximation11(self) -> None: ], } - assert 29.628 <= self.t.approximate_temperature_1_0(features) <= 30.136 + assert 29.628 <= self.t.approximate_temperature_20_1_0(features) <= 30.136 def test_temperature_approximation12(self) -> None: features = { @@ -699,7 +699,7 @@ def test_temperature_approximation12(self) -> None: ], } - assert 28.476 <= self.t.approximate_temperature_1_0(features) <= 28.747 + assert 28.476 <= self.t.approximate_temperature_20_1_0(features) <= 28.747 def test_temperature_approximation13(self) -> None: features = { @@ -738,7 +738,7 @@ def test_temperature_approximation13(self) -> None: ], } - assert 28.374 <= self.t.approximate_temperature_1_0(features) <= 28.645 + assert 28.374 <= self.t.approximate_temperature_20_1_0(features) <= 28.645 def test_temperature_approximation14(self) -> None: features = { @@ -777,7 +777,7 @@ def test_temperature_approximation14(self) -> None: ], } - assert 28.374 <= self.t.approximate_temperature_1_0(features) <= 28.578 + assert 28.374 <= self.t.approximate_temperature_20_1_0(features) <= 28.578 def test_temperature_approximation15(self) -> None: features = { @@ -815,7 +815,7 @@ def test_temperature_approximation15(self) -> None: 29.3125, ], } - assert 28.815 <= self.t.approximate_temperature_1_0(features) <= 29.119 + assert 28.815 <= self.t.approximate_temperature_20_1_0(features) <= 29.119 @pytest.mark.xfail def test_temperature_approximation16(self) -> None: @@ -855,7 +855,7 @@ def test_temperature_approximation16(self) -> None: ], } - assert 25.261 <= self.t.approximate_temperature_1_0(features) <= 25.430 + assert 25.261 <= self.t.approximate_temperature_20_1_0(features) <= 25.430 @pytest.mark.xfail def test_temperature_approximation17(self) -> None: @@ -895,7 +895,7 @@ def test_temperature_approximation17(self) -> None: ], } - assert 25.295 <= self.t.approximate_temperature_1_0(features) <= 25.430 + assert 25.295 <= self.t.approximate_temperature_20_1_0(features) <= 25.430 def test_temperature_approximation21(self) -> None: # this was real data from a user @@ -934,7 +934,7 @@ def test_temperature_approximation21(self) -> None: with pytest.raises(ValueError): features = {"previous_heater_dc": 25.0, "room_temp": 22.0, "time_series_of_temp": ts_of_temps} - self.t.approximate_temperature_1_0(features) + self.t.approximate_temperature_20_1_0(features) better_room_temp = 20 features = { @@ -943,7 +943,7 @@ def test_temperature_approximation21(self) -> None: "time_series_of_temp": ts_of_temps, } - assert better_room_temp < self.t.approximate_temperature_1_0(features) <= 25 + assert better_room_temp < self.t.approximate_temperature_20_1_0(features) <= 25 def test_temperature_approximation19(self) -> None: # this was real data from a user @@ -983,7 +983,7 @@ def test_temperature_approximation19(self) -> None: ], } - assert 55.5 <= self.t.approximate_temperature_1_0(features) <= 56.5 + assert 55.5 <= self.t.approximate_temperature_20_1_0(features) <= 56.5 def test_temperature_approximation50(self) -> None: # this was real data from a bheit @@ -1025,7 +1025,7 @@ def test_temperature_approximation50(self) -> None: } with pytest.raises(ValueError): - assert 20 <= self.t.approximate_temperature_1_0(features) <= 30 + assert 20 <= self.t.approximate_temperature_20_1_0(features) <= 30 features = { "previous_heater_dc": 1.3, @@ -1063,4 +1063,4 @@ def test_temperature_approximation50(self) -> None: ], } - assert 20 <= self.t.approximate_temperature_1_0(features) <= 30 + assert 20 <= self.t.approximate_temperature_20_1_0(features) <= 30 diff --git a/pioreactor/tests/test_temperature_approximation_2_0.py b/pioreactor/tests/test_temperature_approximation_2_0.py index 4972ed1b..95c854d5 100644 --- a/pioreactor/tests/test_temperature_approximation_2_0.py +++ b/pioreactor/tests/test_temperature_approximation_2_0.py @@ -17,7 +17,7 @@ def test_temperature_approximation_if_constant(self) -> None: "previous_heater_dc": 0.001, # should be nonzero to not short circuit the if previous_heater_dc == 0 line. "time_series_of_temp": 21 * [float(temp)], } - assert abs(temp - self.t.approximate_temperature_2_0(features)) < 0.30 + assert abs(temp - self.t.approximate_temperature_20_2_0(features)) < 0.30 def test_temperature_approximation1(self) -> None: features = { @@ -47,7 +47,7 @@ def test_temperature_approximation1(self) -> None: 38.1875, ], } - assert abs(38.9 - self.t.approximate_temperature_2_0(features)) < 0.5 + assert abs(38.9 - self.t.approximate_temperature_20_2_0(features)) < 0.5 def test_temperature_approximation2(self) -> None: features = { @@ -77,7 +77,7 @@ def test_temperature_approximation2(self) -> None: 31.822916666666668, ], } - assert abs(31.85 - self.t.approximate_temperature_2_0(features)) < 0.5 + assert abs(31.85 - self.t.approximate_temperature_20_2_0(features)) < 0.5 def test_temperature_approximation3(self) -> None: features = { @@ -107,7 +107,7 @@ def test_temperature_approximation3(self) -> None: 38.1875, ], } - assert abs(38.94220102733567 - self.t.approximate_temperature_2_0(features)) < 0.5 + assert abs(38.94220102733567 - self.t.approximate_temperature_20_2_0(features)) < 0.5 def test_temperature_approximation4(self) -> None: features = { @@ -137,7 +137,7 @@ def test_temperature_approximation4(self) -> None: 34.625, ], } - assert abs(34.1204 - self.t.approximate_temperature_2_0(features)) < 0.5 + assert abs(34.1204 - self.t.approximate_temperature_20_2_0(features)) < 0.5 def test_temperature_approximation5(self) -> None: features = { @@ -167,4 +167,4 @@ def test_temperature_approximation5(self) -> None: 31.395833333333332, ], } - assert abs(30.94587 - self.t.approximate_temperature_2_0(features)) < 0.5 + assert abs(30.94587 - self.t.approximate_temperature_20_2_0(features)) < 0.5