Use with a different MQTT broker

Since your last message, I’ve tried quite a few things - it’s a bit tough to describe succinctly. I’ve tried the instructions from your previous message as well as cloning the Pioreactor GitHub repository and running the Python functions locally. This is after pointing to the appropriate config file through the GLOBAL_CONFIG env variable, and I’ve tested on both Windows and WSL2. I’ve also tried mimicking the MQTT messages that I observe from the web client that I’d normally observe when running per the normal instructions (i.e., communication over same network, e.g., through running Python via ssh’ing into the Pioreactor or using the UI).

Before I dive in further, I wanted to check - were you able to verify that stirring could be started from a separate network (e.g., the MQTT web client I linked to earlier)? I’m clearly seeing traffic on the broker I’m using (see details at end), I’m just not able to observe any effect on the actual Pioreactor.

When I run the following script from a local clone in WSL2:

from pioreactor.background_jobs.stirring import Stirrer, RpmFromFrequency

unit = "pioreactor1"
experiment = "test"

st = Stirrer(
    target_rpm=300,
    unit=unit,
    experiment=experiment,
    rpm_calculator=RpmFromFrequency()
)

st.start_stirring()

st.block_until_disconnected() # pauses the execution, but stirring continues

I get:

2024-03-04T17:06:28-0500 DEBUG  [stirring] Init.
2024-03-04T17:06:28-0500 DEBUG  [stirring] Operating with RPM feedback loop.
2024-03-04T17:06:29-0500 DEBUG  [PWM@GPIO-17] Initialized GPIO-17 using software-timing, initial frequency = 75.0 hz.
2024-03-04T17:06:29-0500 INFO   [stirring] Ready.
2024-03-04T17:06:29-0500 DEBUG  [stirring] Starting stirring with 300.0 RPM.
2024-03-04T17:06:30-0500 DEBUG  [stirring] stirring is blocking until disconnected.
2024-03-04T17:06:38-0500 WARNING [stirring] Stirring RPM is 0 - attempting to restart it automatically. It may be a temporary stall, target RPM may be too low, or not reading sensor correctly.
2024-03-04T17:06:38-0500 DEBUG  [stirring] Kicking stirring

All the while, I’m getting plenty of MQTT traffic from running and stopping the Python script:

{"source": "app", "message": "Disconnected successfully from MQTT.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:09:02.529828Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590142805
{"source": "app", "message": "Disconnected.", "level": "INFO", "task": "stirring", "timestamp": "2024-03-04T22:09:02.386056Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590142786
pioreactor/pioreactor1/test/stirring/state/$unit
0	1709590142753
pioreactor/pioreactor1/test/stirring/duty_cycle/$settable
0	1709590142738
pioreactor/pioreactor1/test/stirring/measured_rpm/$unit
0	1709590142707
pioreactor/pioreactor1/test/stirring/measured_rpm/$datatype
0	1709590142690
pioreactor/pioreactor1/test/stirring/target_rpm/$datatype
0	1709590142658
pioreactor/pioreactor1/test/stirring/target_rpm/$settable
0	1709590142628
pioreactor/pioreactor1/test/stirring/target_rpm
0	1709590142617
pioreactor/pioreactor1/test/stirring/state/$datatype
0	1709590142606
pioreactor/pioreactor1/test/stirring/state/$settable
0	1709590142596
pioreactor/pioreactor1/test/stirring/duty_cycle/$unit
0	1709590142586
pioreactor/pioreactor1/test/stirring/duty_cycle/$datatype
0	1709590142574
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590142563
pioreactor/pioreactor1/test/stirring/measured_rpm/$settable
0	1709590142551
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709590142541
pioreactor/pioreactor1/test/stirring/target_rpm/$unit
0	1709590142510
pioreactor/pioreactor1/test/stirring/$properties
0	1709590142487
disconnected	
pioreactor/pioreactor1/test/stirring/$state
0	1709590141591
{"source": "app", "message": "Cleaned up GPIO-17.", "level": "DEBUG", "task": "PWM@GPIO-17", "timestamp": "2024-03-04T22:09:01.404261Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590141573
{}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590141465
{"source": "app", "message": "Exiting caused by signal Interrupt.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:09:01.323681Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590141425
{"17": 57.5}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590137227
57.5	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590137205
{"setpoint": 300.0, "output_limits_lb": -7.5, "output_limits_ub": 7.5, "Kd": 0.0, "Ki": 0.0, "Kp": 10.0, "integral": 0.0, "proportional": 3000.0, "derivative": 0.0, "latest_input": 0.0, "latest_output": 7.5, "job_name": "stirring", "target_name": "rpm"}	
pioreactor/pioreactor1/test/pid_log/rpm
0	1709590137177
{"17": 50.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590137141
50	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590137104
4	
pioreactor/pioreactor1/test/monitor/flicker_led_with_error_code
0	1709590137002
100	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590136986
{"source": "app", "message": "Kicking stirring", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:08:56.729396Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590136961
{"source": "app", "message": "Stirring RPM is 0 - attempting to restart it automatically. It may be a temporary stall, target RPM may be too low, or not reading sensor correctly.", "level": "WARNING", "task": "stirring", "timestamp": "2024-03-04T22:08:56.706303Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590136910
{"17": 100.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590136861
{"measured_rpm":0.0,"timestamp":"2024-03-04T22:08:56.704400Z"}	
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709590136813
{"17": 57.5}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590114241
57.5	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590114189
{"setpoint": 300.0, "output_limits_lb": -7.5, "output_limits_ub": 7.5, "Kd": 0.0, "Ki": 0.0, "Kp": 10.0, "integral": 0.0, "proportional": 3000.0, "derivative": 0.0, "latest_input": 0.0, "latest_output": 7.5, "job_name": "stirring", "target_name": "rpm"}	
pioreactor/pioreactor1/test/pid_log/rpm
0	1709590114137
{"17": 50.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590114114
50	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590114088
4	
pioreactor/pioreactor1/test/monitor/flicker_led_with_error_code
0	1709590113979
100	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590113951
{"source": "app", "message": "Kicking stirring", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:08:33.724260Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590113928
{"source": "app", "message": "Stirring RPM is 0 - attempting to restart it automatically. It may be a temporary stall, target RPM may be too low, or not reading sensor correctly.", "level": "WARNING", "task": "stirring", "timestamp": "2024-03-04T22:08:33.704909Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590113906
{"17": 100.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590113871
{"measured_rpm":0.0,"timestamp":"2024-03-04T22:08:33.704028Z"}	
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709590113847
{"17": 57.5}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590091261
57.5	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590091234
{"setpoint": 300.0, "output_limits_lb": -7.5, "output_limits_ub": 7.5, "Kd": 0.0, "Ki": 0.0, "Kp": 10.0, "integral": 0.0, "proportional": 3000.0, "derivative": 0.0, "latest_input": 0.0, "latest_output": 7.5, "job_name": "stirring", "target_name": "rpm"}	
pioreactor/pioreactor1/test/pid_log/rpm
0	1709590091142
{"17": 50.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590091117
50	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590091088
4	
pioreactor/pioreactor1/test/monitor/flicker_led_with_error_code
0	1709590091037
100	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590091012
{"source": "app", "message": "Kicking stirring", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:08:10.725132Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590090978
{"source": "app", "message": "Stirring RPM is 0 - attempting to restart it automatically. It may be a temporary stall, target RPM may be too low, or not reading sensor correctly.", "level": "WARNING", "task": "stirring", "timestamp": "2024-03-04T22:08:10.704999Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590090932
{"17": 100.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590090837
{"measured_rpm":0.0,"timestamp":"2024-03-04T22:08:10.704391Z"}	
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709590090808
{"17": 57.5}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590068241
57.5	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590068215
{"setpoint": 300.0, "output_limits_lb": -7.5, "output_limits_ub": 7.5, "Kd": 0.0, "Ki": 0.0, "Kp": 10.0, "integral": 0.0, "proportional": 3000.0, "derivative": 0.0, "latest_input": 0.0, "latest_output": 7.5, "job_name": "stirring", "target_name": "rpm"}	
pioreactor/pioreactor1/test/pid_log/rpm
0	1709590068180
{"17": 50.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590068159
50	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590068134
4	
pioreactor/pioreactor1/test/monitor/flicker_led_with_error_code
0	1709590067978
100	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590067948
{"source": "app", "message": "Kicking stirring", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:07:47.729647Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590067930
{"source": "app", "message": "Stirring RPM is 0 - attempting to restart it automatically. It may be a temporary stall, target RPM may be too low, or not reading sensor correctly.", "level": "WARNING", "task": "stirring", "timestamp": "2024-03-04T22:07:47.707061Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590067907
{"17": 100.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590067865
{"measured_rpm":0.0,"timestamp":"2024-03-04T22:07:47.704848Z"}	
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709590067813
{"17": 57.5}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590045229
57.5	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590045199
{"setpoint": 300.0, "output_limits_lb": -7.5, "output_limits_ub": 7.5, "Kd": 0.0, "Ki": 0.0, "Kp": 10.0, "integral": 0.0, "proportional": 3000.0, "derivative": 0.0, "latest_input": 0.0, "latest_output": 7.5, "job_name": "stirring", "target_name": "rpm"}	
pioreactor/pioreactor1/test/pid_log/rpm
0	1709590045152
{"17": 50.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590045126
50	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590045099
4	
pioreactor/pioreactor1/test/monitor/flicker_led_with_error_code
0	1709590044971
100	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590044953
{"source": "app", "message": "Kicking stirring", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:07:24.729276Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590044937
{"source": "app", "message": "Stirring RPM is 0 - attempting to restart it automatically. It may be a temporary stall, target RPM may be too low, or not reading sensor correctly.", "level": "WARNING", "task": "stirring", "timestamp": "2024-03-04T22:07:24.705525Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590044906
{"17": 100.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590044848
{"measured_rpm":0.0,"timestamp":"2024-03-04T22:07:24.704074Z"}	
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709590044806
{"17": 57.5}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590022246
57.5	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590022223
{"setpoint": 300.0, "output_limits_lb": -7.5, "output_limits_ub": 7.5, "Kd": 0.0, "Ki": 0.0, "Kp": 10.0, "integral": 0.0, "proportional": 3000.0, "derivative": 0.0, "latest_input": 0.0, "latest_output": 7.5, "job_name": "stirring", "target_name": "rpm"}	
pioreactor/pioreactor1/test/pid_log/rpm
0	1709590022172
{"17": 50.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590022146
50	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590022121
4	
pioreactor/pioreactor1/test/monitor/flicker_led_with_error_code
0	1709590021970
100	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709590021956
{"source": "app", "message": "Kicking stirring", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:07:01.735922Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590021942
{"source": "app", "message": "Stirring RPM is 0 - attempting to restart it automatically. It may be a temporary stall, target RPM may be too low, or not reading sensor correctly.", "level": "WARNING", "task": "stirring", "timestamp": "2024-03-04T22:07:01.708595Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709590021909
{"17": 100.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709590021872
{"measured_rpm":0.0,"timestamp":"2024-03-04T22:07:01.704971Z"}	
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709590021809
{"17": 57.5}	
pioreactor/pioreactor1/test/pwms/dc
0	1709589999227
57.5	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709589999207
{"setpoint": 300.0, "output_limits_lb": -7.5, "output_limits_ub": 7.5, "Kd": 0.0, "Ki": 0.0, "Kp": 10.0, "integral": 0.0, "proportional": 3000.0, "derivative": 0.0, "latest_input": 0.0, "latest_output": 7.5, "job_name": "stirring", "target_name": "rpm"}	
pioreactor/pioreactor1/test/pid_log/rpm
0	1709589999159
{"17": 50.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709589999128
50	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709589999104
4	
pioreactor/pioreactor1/test/monitor/flicker_led_with_error_code
0	1709589998946
100	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709589998936
{"source": "app", "message": "Kicking stirring", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:06:38.730002Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589998929
{"source": "app", "message": "Stirring RPM is 0 - attempting to restart it automatically. It may be a temporary stall, target RPM may be too low, or not reading sensor correctly.", "level": "WARNING", "task": "stirring", "timestamp": "2024-03-04T22:06:38.709941Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589998910
{"17": 100.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709589998853
{"measured_rpm":0.0,"timestamp":"2024-03-04T22:06:38.704485Z"}	
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709589998810
{"source": "app", "message": "stirring is blocking until disconnected.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:06:30.304400Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589990407
{"17": 60.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709589989900
60.0	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709589989875
{"source": "app", "message": "Starting stirring with 300.0 RPM.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:06:29.552764Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589989767
{"source": "app", "message": "Ready.", "level": "INFO", "task": "stirring", "timestamp": "2024-03-04T22:06:29.551499Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589989753
{"17": 100.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709589989669
ready	
pioreactor/pioreactor1/test/stirring/$state
0	1709589989652
60.0	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709589989366
300.0	
pioreactor/pioreactor1/test/stirring/target_rpm
0	1709589989267
{"source": "app", "message": "Operating with RPM feedback loop.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:06:28.380097Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589988616
True	
pioreactor/pioreactor1/test/stirring/duty_cycle/$settable
0	1709589988589
RPM	
pioreactor/pioreactor1/test/stirring/measured_rpm/$unit
0	1709589988581
MeasuredRPM	
pioreactor/pioreactor1/test/stirring/measured_rpm/$datatype
0	1709589988574
float	
pioreactor/pioreactor1/test/stirring/target_rpm/$datatype
0	1709589988566
True	
pioreactor/pioreactor1/test/stirring/target_rpm/$settable
0	1709589988560
string	
pioreactor/pioreactor1/test/stirring/state/$datatype
0	1709589988552
True	
pioreactor/pioreactor1/test/stirring/state/$settable
0	1709589988540
%	
pioreactor/pioreactor1/test/stirring/duty_cycle/$unit
0	1709589988534
float	
pioreactor/pioreactor1/test/stirring/duty_cycle/$datatype
0	1709589988522
False	
pioreactor/pioreactor1/test/stirring/measured_rpm/$settable
0	1709589988514
RPM	
pioreactor/pioreactor1/test/stirring/target_rpm/$unit
0	1709589988503
target_rpm,measured_rpm,duty_cycle,state	
pioreactor/pioreactor1/test/stirring/$properties
0	1709589988496
{"source": "app", "message": "Init.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:06:28.373431Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589988485
init	
pioreactor/pioreactor1/test/stirring/$state
0	1709589988476
{"source": "app", "message": "Disconnected successfully from MQTT.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:06:08.285138Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589968620
{"source": "app", "message": "Disconnected.", "level": "INFO", "task": "stirring", "timestamp": "2024-03-04T22:06:08.133735Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589968609
pioreactor/pioreactor1/test/stirring/state/$unit
0	1709589968600
pioreactor/pioreactor1/test/stirring/duty_cycle/$settable
0	1709589968595
pioreactor/pioreactor1/test/stirring/measured_rpm/$unit
0	1709589968576
pioreactor/pioreactor1/test/stirring/state/$datatype
0	1709589968568
pioreactor/pioreactor1/test/stirring/state/$settable
0	1709589968563
pioreactor/pioreactor1/test/stirring/duty_cycle/$unit
0	1709589968552
pioreactor/pioreactor1/test/stirring/duty_cycle/$datatype
0	1709589968545
pioreactor/pioreactor1/test/stirring/measured_rpm/$datatype
0	1709589968538
pioreactor/pioreactor1/test/stirring/target_rpm/$datatype
0	1709589968529
pioreactor/pioreactor1/test/stirring/target_rpm/$settable
0	1709589968522
pioreactor/pioreactor1/test/stirring/target_rpm
0	1709589968515
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709589968447
pioreactor/pioreactor1/test/stirring/measured_rpm/$settable
0	1709589968427
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709589968401
pioreactor/pioreactor1/test/stirring/target_rpm/$unit
0	1709589968246
pioreactor/pioreactor1/test/stirring/$properties
0	1709589968234
disconnected	
pioreactor/pioreactor1/test/stirring/$state
0	1709589967290
{"source": "app", "message": "Cleaned up GPIO-17.", "level": "DEBUG", "task": "PWM@GPIO-17", "timestamp": "2024-03-04T22:06:07.169059Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589967271
{}	
pioreactor/pioreactor1/test/pwms/dc
0	1709589967213
{"source": "app", "message": "Exiting caused by signal Interrupt.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:06:07.080500Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709589967182

EDIT: Here’s an example of traffic when running the Python script via SSH over the same network:

27.48362	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709591446519
{"17": 27.48362}	
pioreactor/pioreactor1/test/pwms/dc
0	1709591446262
{"measured_rpm":801.82,"timestamp":"2024-03-04T22:30:46.872577Z"}	
pioreactor/pioreactor1/test/stirring/measured_rpm
0	1709591446246
{"setpoint": 300.0, "output_limits_lb": -7.5, "output_limits_ub": 7.5, "Kd": 0.0, "Ki": 0.0, "Kp": 0.009, "integral": -0.0, "proportional": -4.51638, "derivative": 0.0, "latest_input": 801.82, "latest_output": -4.51638, "job_name": "stirring", "target_name": "rpm"}	
pioreactor/pioreactor1/test/pid_log/rpm
0	1709591446235
{"source": "app", "message": "stirring is blocking until disconnected.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:30:38.473562Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709591437852
{"17": 32.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709591437423
{"source": "app", "message": "Starting stirring with 300.0 RPM.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:30:37.725053Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709591437389
32.0	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709591437372
{"17": 100.0}	
pioreactor/pioreactor1/test/pwms/dc
0	1709591437106
{"source": "app", "message": "Ready.", "level": "INFO", "task": "stirring", "timestamp": "2024-03-04T22:30:37.722432Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709591437096
ready	
pioreactor/pioreactor1/test/stirring/$state
0	1709591437082
32.0	
pioreactor/pioreactor1/test/stirring/duty_cycle
0	1709591436110
300.0	
pioreactor/pioreactor1/test/stirring/target_rpm
0	1709591435839
string	
pioreactor/pioreactor1/test/stirring/state/$datatype
0	1709591433844
True	
pioreactor/pioreactor1/test/stirring/state/$settable
0	1709591433818
%	
pioreactor/pioreactor1/test/stirring/duty_cycle/$unit
0	1709591433806
float	
pioreactor/pioreactor1/test/stirring/duty_cycle/$datatype
0	1709591433795
False	
pioreactor/pioreactor1/test/stirring/measured_rpm/$settable
0	1709591433779
RPM	
pioreactor/pioreactor1/test/stirring/target_rpm/$unit
0	1709591433766
target_rpm,measured_rpm,duty_cycle,state	
pioreactor/pioreactor1/test/stirring/$properties
0	1709591433760
True	
pioreactor/pioreactor1/test/stirring/duty_cycle/$settable
0	1709591433752
RPM	
pioreactor/pioreactor1/test/stirring/measured_rpm/$unit
0	1709591433747
MeasuredRPM	
pioreactor/pioreactor1/test/stirring/measured_rpm/$datatype
0	1709591433743
float	
pioreactor/pioreactor1/test/stirring/target_rpm/$datatype
0	1709591433735
True	
pioreactor/pioreactor1/test/stirring/target_rpm/$settable
0	1709591433729
{"source": "app", "message": "Operating with RPM feedback loop.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:30:34.121096Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709591433722
{"source": "app", "message": "Init.", "level": "DEBUG", "task": "stirring", "timestamp": "2024-03-04T22:30:34.031626Z"}	
pioreactor/pioreactor1/test/logs/app
0	1709591433424
init	
pioreactor/pioreactor1/test/stirring/$state
0	1709591433401

The stirring proceeds as expected in this case.

EDIT: I noticed New Pioreactor release: 24.3.4 (hotfix patch), I will update and try again, though it would be great if you could still give it a go verifying the stirring activation on your end. Thanks again for all your help on this.