diff --git a/config.ini b/config.ini index 2e3a77cc..13a47cfa 100644 --- a/config.ini +++ b/config.ini @@ -42,7 +42,9 @@ pioreactor1=192.168.0.1 # a 1 means available, and a 0 means not available. # See docs: https://github.com/Pioreactor/pioreactor/wiki/Leaders,-workers-and-inventory pioreactor1=1 - +pioreactor2=1 +pioreactor3=1 +pioreactor4=0 [dashboard.settings] # changing these requires a power cycle of the leader unit. @@ -51,6 +53,8 @@ raw_od_lookback_minutes=240 log_display_count=65 [dashboard.charts] +# show/hide charts on the PioreactorUI dashboard +# 1 is show, 0 is hide implied_growth_rate=1 fraction_of_volume_that_is_alternative_media=1 normalized_135_optical_density=1 @@ -66,6 +70,10 @@ Kp=5 Ki=0 Kd=0 +[pid_turbidostat] +Kp=3 +Ki=0.1 +Kd=0.1 [watchdog] email_alerts_to=cam.davidson.pilon@gmail.com diff --git a/pioreactor/actions/add_alt_media.py b/pioreactor/actions/add_alt_media.py index d4e827ce..d8daab4a 100644 --- a/pioreactor/actions/add_alt_media.py +++ b/pioreactor/actions/add_alt_media.py @@ -104,6 +104,9 @@ def cleanUpGPIO(): help="who is calling this function - data goes into database and MQTT", ) def click_add_alt_media(ml, duration, duty_cycle, source_of_event): + """ + Add alt. media to unit + """ unit = get_unit_name() experiment = get_latest_experiment_name() diff --git a/pioreactor/actions/add_media.py b/pioreactor/actions/add_media.py index e9f2b50d..fb929212 100644 --- a/pioreactor/actions/add_media.py +++ b/pioreactor/actions/add_media.py @@ -106,6 +106,9 @@ def cleanUpGPIO(): help="who is calling this function - data goes into database and MQTT", ) def click_add_media(ml, duration, duty_cycle, source_of_event): + """ + Add media to unit + """ unit = get_unit_name() experiment = get_latest_experiment_name() diff --git a/pioreactor/actions/od_normalization.py b/pioreactor/actions/od_normalization.py index 7bed4052..206b611c 100644 --- a/pioreactor/actions/od_normalization.py +++ b/pioreactor/actions/od_normalization.py @@ -96,6 +96,9 @@ def yield_from_mqtt(): """, ) def click_od_normalization(od_angle_channel): + """ + Compute statistics about the OD timeseries + """ unit = get_unit_name() experiment = get_latest_experiment_name() od_normalization(od_angle_channel, unit, experiment) diff --git a/pioreactor/actions/remove_waste.py b/pioreactor/actions/remove_waste.py index 1273ab97..8983462f 100644 --- a/pioreactor/actions/remove_waste.py +++ b/pioreactor/actions/remove_waste.py @@ -105,7 +105,9 @@ def cleanUpGPIO(): help="who is calling this function - data goes into database and MQTT", ) def click_remove_waste(ml, duration, duty_cycle, source_of_event): - + """ + Remove waste/media from unit + """ unit = get_unit_name() experiment = get_latest_experiment_name() signal.signal(signal.SIGTERM, cleanUpGPIO) diff --git a/pioreactor/background_jobs/io_controlling.py b/pioreactor/background_jobs/io_controlling.py index 36f9d2b6..79524486 100644 --- a/pioreactor/background_jobs/io_controlling.py +++ b/pioreactor/background_jobs/io_controlling.py @@ -353,10 +353,14 @@ def __init__(self, target_od=None, volume=None, **kwargs): self.volume = float(volume) # PID%20controller%20turbidostat.ipynb + Kp = config.getFloat("pid_turbidostat", "Kp") + Ki = config.getFloat("pid_turbidostat", "Ki") + Kd = config.getFloat("pid_turbidostat", "Kd") + self.pid = PID( - -3.0, - -0.1, - -0.1, + -Kp, + -Ki, + -Kd, setpoint=self.target_od, output_limits=(0, 1), sample_time=None, diff --git a/pioreactor/background_jobs/monitor.py b/pioreactor/background_jobs/monitor.py index 45b9bcc4..57262136 100644 --- a/pioreactor/background_jobs/monitor.py +++ b/pioreactor/background_jobs/monitor.py @@ -38,7 +38,7 @@ def get_and_publish_disk_space(self): @click.command(name="monitor") def click_monitor(): """ - Start the watchdog on a unit. Reports back to the leader. + Monitor and report metadata on the unit. """ heidi = Monitor(unit=get_unit_name(), exp=UNIVERSAL_EXPERIMENT) # noqa: F841 diff --git a/pioreactor/command_line_worker.py b/pioreactor/pio_cli.py similarity index 67% rename from pioreactor/command_line_worker.py rename to pioreactor/pio_cli.py index 32d3e62e..77dfa1ca 100644 --- a/pioreactor/command_line_worker.py +++ b/pioreactor/pio_cli.py @@ -7,7 +7,7 @@ > pio log """ import click -from pioreactor.whoami import am_I_leader +from pioreactor.whoami import am_I_leader, am_I_active_worker from pioreactor.config import config from pioreactor import background_jobs as jobs from pioreactor import actions @@ -50,21 +50,22 @@ def kill(process): pass -@pio.group() -def run(short_help="run a job"): +@pio.group(short_help="run a job") +def run(): pass -run.add_command(jobs.growth_rate_calculating.click_growth_rate_calculating) -run.add_command(jobs.stirring.click_stirring) -run.add_command(jobs.od_reading.click_od_reading) -run.add_command(jobs.io_controlling.click_io_controlling) -run.add_command(jobs.monitor.click_monitor) +if am_I_active_worker(): + run.add_command(jobs.growth_rate_calculating.click_growth_rate_calculating) + run.add_command(jobs.stirring.click_stirring) + run.add_command(jobs.od_reading.click_od_reading) + run.add_command(jobs.io_controlling.click_io_controlling) + run.add_command(jobs.monitor.click_monitor) -run.add_command(actions.add_alt_media.click_add_alt_media) -run.add_command(actions.add_media.click_add_media) -run.add_command(actions.remove_waste.click_remove_waste) -run.add_command(actions.od_normalization.click_od_normalization) + run.add_command(actions.add_alt_media.click_add_alt_media) + run.add_command(actions.add_media.click_add_media) + run.add_command(actions.remove_waste.click_remove_waste) + run.add_command(actions.od_normalization.click_od_normalization) if am_I_leader(): run.add_command(jobs.log_aggregating.click_log_aggregating) diff --git a/pioreactor/command_line_leader.py b/pioreactor/pios_cli.py similarity index 100% rename from pioreactor/command_line_leader.py rename to pioreactor/pios_cli.py diff --git a/pioreactor/whoami.py b/pioreactor/whoami.py index a497584b..30393045 100644 --- a/pioreactor/whoami.py +++ b/pioreactor/whoami.py @@ -48,4 +48,10 @@ def get_unit_name(): def am_I_leader(): from pioreactor.config import leader_hostname - return get_hostname() == leader_hostname + return get_unit_name() == leader_hostname + + +def am_I_active_worker(): + from pioreactor.config import get_active_worker_units_and_ips + + return get_unit_name() in get_active_worker_units_and_ips().keys() diff --git a/setup.py b/setup.py index 3a9ff534..3a2139cc 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ packages=find_packages(exclude=["*.tests", "*.tests.*", "*benchmarks*"]), entry_points=""" [console_scripts] - pio=pioreactor.command_line_worker:pio - pios=pioreactor.command_line_leader:pios + pio=pioreactor.pio_cli:pio + pios=pioreactor.pios_cli:pios """, )