Skip to content
Merged
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
e33bd21
Inheco Incubator Shaker integration v1
BioCam Jun 13, 2025
9fd5320
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Jun 29, 2025
972e941
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Jul 29, 2025
c4f2003
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Aug 27, 2025
fe499fc
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Sep 6, 2025
52f1ed8
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Sep 29, 2025
fec83e5
updating docs example
BioCam Sep 30, 2025
e08ba6d
update integration location
BioCam Sep 30, 2025
91cea42
Updating to io
BioCam Oct 1, 2025
e89b24b
make InhecoIncubatorShakerBackend an Incubator
BioCam Oct 3, 2025
44a1a70
weekend work + creating infographics
BioCam Oct 5, 2025
a6b9c9e
Enable multiple stack usage via direct port declaration
BioCam Oct 6, 2025
904b022
Consistent docs headers
BioCam Oct 6, 2025
f139233
next batch of firmware commands
BioCam Oct 7, 2025
f141d60
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Oct 8, 2025
f9411f8
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Oct 24, 2025
eb8c063
update master infographic, fix initialisation status request bug
BioCam Oct 24, 2025
f5b7b0a
introduce error handling + name change to stack_index
BioCam Oct 24, 2025
7475dad
start temperature integration
BioCam Oct 24, 2025
f4618a9
add set and stop temperature
BioCam Oct 24, 2025
4a541a5
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Oct 28, 2025
1bcad7e
error handling expansion
BioCam Oct 29, 2025
3c4cca3
massive docs update for Inheco Incubator (Shaker)
BioCam Oct 29, 2025
3b52e4e
shaking feature updates
BioCam Oct 29, 2025
ec591c7
add shake (tested on orbital shaking atm)
BioCam Oct 29, 2025
4bc9479
goodnight
BioCam Oct 29, 2025
8eb8eef
build module, create detailed docs, fix shaking patterns
BioCam Oct 30, 2025
947097a
run docs completely
BioCam Oct 30, 2025
8d5020e
testing alternatives
BioCam Oct 31, 2025
9c3b9b5
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Nov 4, 2025
563e502
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Nov 11, 2025
047166b
created backend, unit, frontend distinction
BioCam Nov 12, 2025
ad4cbaa
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Nov 18, 2025
f30323c
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Nov 21, 2025
df8717e
Merge branch 'PyLabRobot:main' into Inheco-Incubator-Shaker-Integration
BioCam Nov 23, 2025
6101d69
polish docs tutorial
BioCam Nov 24, 2025
f711745
add self-test & fix isort
BioCam Nov 25, 2025
61f2e8b
remove caching in backend - too unstable
BioCam Nov 25, 2025
bce5a8e
remove logging tests - up to user
BioCam Nov 25, 2025
46dfbc4
remove @property size_x/y/z
BioCam Nov 26, 2025
40f1af4
make incubator parameter dicts private
BioCam Nov 26, 2025
079e57b
keep logging.getLogger("pylabrobot.io.serial")
BioCam Nov 26, 2025
c9fcc1d
fix logger overwriting
BioCam Nov 26, 2025
902f840
start type check fixing
BioCam Nov 26, 2025
4224253
Merge branch 'main' into Inheco-Incubator-Shaker-Integration
BioCam Nov 26, 2025
a46cfd6
fixing requires_incubator_shaker decorator
BioCam Nov 26, 2025
da1c3b2
introduce `Concatenate`
BioCam Nov 26, 2025
544caac
just one `cast`
BioCam Nov 26, 2025
879cfb2
make into a MachineBackend
BioCam Nov 26, 2025
63266a4
fix missing return in unit
BioCam Nov 26, 2025
be300e2
set minimal self.number_of_connected_units
BioCam Nov 26, 2025
6ff43cb
fix missing range
BioCam Nov 26, 2025
db5d635
maintain correct Machine inheritance pattern
BioCam Nov 26, 2025
ba8efdd
fix requires_incubator_shaker
BioCam Nov 26, 2025
631b827
fix frontend location type assertion
BioCam Nov 26, 2025
7bca761
move vid:pid-based autodetection into pylabrobot.io.Serial
BioCam Nov 26, 2025
8662a47
fix casting
BioCam Nov 27, 2025
9656828
make vid:pid str:str
BioCam Nov 27, 2025
91fc035
fix Serial logger transfer
BioCam Nov 27, 2025
cb44d87
fix decorator cast
BioCam Nov 27, 2025
4cac153
polish docs tutorial
BioCam Nov 27, 2025
9670cc5
initialize io on backend init
rickwierenga Nov 28, 2025
cbf1819
format docstring indentation
rickwierenga Nov 28, 2025
f8dfcb2
fix typos
rickwierenga Nov 29, 2025
12f07ba
load incubator_type once on setup; delete self.write
rickwierenga Nov 29, 2025
bffdede
use logger
rickwierenga Dec 1, 2025
2e008ab
use _send_command_lock
rickwierenga Dec 1, 2025
7b78e14
fix linting
BioCam Dec 1, 2025
c453417
DrawerStatus
rickwierenga Dec 1, 2025
93b7a38
perform_self_test returns dict
rickwierenga Dec 1, 2025
cac339b
fix
rickwierenga Dec 1, 2025
383dcd7
use list, property for units
rickwierenga Dec 1, 2025
6cd04a3
format
rickwierenga Dec 1, 2025
c4e06e2
more format
rickwierenga Dec 1, 2025
17f09d1
Update pylabrobot/storage/inheco/incubator_shaker.py
rickwierenga Dec 1, 2025
ccf0018
smol
rickwierenga Dec 1, 2025
3d7509c
correct output for self test
rickwierenga Dec 2, 2025
9448c89
use stack_index in request_thermal_calibration_date
rickwierenga Dec 2, 2025
91a4cc6
Merge branch 'main' into Inheco-Incubator-Shaker-Integration
BioCam Dec 2, 2025
a757f93
fix image rendering
BioCam Dec 2, 2025
458ebeb
Merge branch 'main' into Inheco-Incubator-Shaker-Integration
BioCam Dec 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,9 @@
"source": [
"# Inheco Incubator (Shaker)\n",
"\n",
"<table style=\"width:100%; border-collapse:collapse;\">\n",
"<tr>\n",
"<td style=\"width:60%; font-size:15px; line-height:1.7; vertical-align:top; padding-right:15px;\">\n",
"\n",
"<ul style=\"margin-top:0;\">\n",
" <li><a href=\"https://www.inheco.com/incubator-shaker.html\" target=\"_blank\"><b>OEM Link</b></a></li>\n",
" <li><b>Communication Protocol / Hardware:</b> Serial (FTDI) / USB-A</li>\n",
" <li><b>Communication Level:</b> Firmware (documentation shared by OEM)</li>\n",
" <li>Same command set for:\n",
" <ul>\n",
" <li>Incubator “MP”</li>\n",
" <li>Incubator “DWP”</li>\n",
" <li>Incubator Shaker “MP”</li>\n",
" <li>Incubator Shaker “DWP”</li>\n",
" </ul>\n",
" </li>\n",
" <li><b>Incubator Shaker “MP”</b> VID:PID <code>0403:6001</code></li>\n",
" <li>Takes in a single plate via a loading tray, heats it to the set temperature, and shakes it to the set RPM.</li>\n",
"</ul>\n",
"\n",
"</td>\n",
"\n",
"<td style=\"width:40%; text-align:center; vertical-align:middle;\">\n",
" <img src=\"img/inheco_incubator_shaker_mp_dwp.png\" width=\"500\"/><br>\n",
" <i>Figure: Inheco Incubator Shaker MP & DWP models</i>\n",
"</td>\n",
"</tr>\n",
"</table>"
"| Summary | Image |\n",
"|------------|--------|\n",
"| <ul style=\"font-size:15px; line-height:1.6; margin-top:0;\"> <li><a href=\"https://www.inheco.com/incubator-shaker.html\" target=\"_blank\"><b>OEM Link</b></a></li> <li><b>Communication Protocol / Hardware:</b> Serial / USB-A/B</li> <li><b>Communication Level:</b> Firmware (documentation shared by OEM)</li> <li>Same command set for: <ul> <li>Incubator “MP”</li> <li>Incubator “DWP”</li> <li>Incubator Shaker “MP”</li> <li>Incubator Shaker “DWP”</li> </ul></li> <li>VID:PID <code>0403:6001</code></li> <li>Takes in a single plate via a loading tray, heats it to the set temperature, and shakes it to the set RPM.</li> </ul> | <div style=\"width:320px; text-align:center;\"> ![shaker](img/inheco_incubator_shaker_mp_dwp.png) <br><i>Figure: Inheco Incubator Shaker MP & DWP models</i> </div> |\n"
]
},
{
Expand Down Expand Up @@ -76,19 +51,10 @@
},
{
"cell_type": "markdown",
"id": "95e39b36-c441-499d-bfaa-327d49d5cc04",
"id": "38dcc34a",
"metadata": {},
"source": [
"<!-- ![quadrants](img/inheco_incubator_shaker_physical_setup_overview.png) -->\n",
"<table style=\"width:100%; border-collapse:collapse; margin-top:10px;\">\n",
"<tr>\n",
"<td style=\"text-align:center; vertical-align:middle;\">\n",
" <img src=\"img/inheco_incubator_shaker_physical_setup_overview.png\" width=\"950\" style=\"border-radius:8px;\"/>\n",
" <br>\n",
" <i>Figure: Physical setup overview of the Inheco Incubator Shaker system</i>\n",
"</td>\n",
"</tr>\n",
"</table>\n"
"![copy-me](img/inheco_incubator_shaker_physical_setup_overview.png)"
]
},
{
Expand Down Expand Up @@ -123,43 +89,12 @@
},
{
"cell_type": "markdown",
"id": "40f8dcb4-7779-4c51-9bdf-bf8d05f46c46",
"id": "69f8951f",
"metadata": {},
"source": [
"<table>\n",
"<tr>\n",
"<td style=\"font-size:15px; line-height:1.6; width:60%; vertical-align:top; padding-right:10px;\">\n",
"\n",
"To connect an <code>InhecoIncubatorShakerStackBackend</code> you have to specify the <b>DIP switch identifier</b>:\n",
"<ul style=\"margin-left: 20px;\">\n",
"<li>located on the back of the bottom machine,<br>\n",
"<li>it defines the DIP switch configuration for the entire stack above it.</li>\n",
"\n",
"</ul>\n",
"\n",
"<h3>Setting the DIP switch to generate a machine address</h3>\n",
"\n",
"The DIP switch at the back of each machine has to be set manually and consists of 4 pins that can be set into an <code>UP</code> / <code>0</code> or a <code>DOWN</code> / <code>1</code> position.\n",
"\n",
"(<i>Note:</b> There are two more pins to the left of the DIP switch pins. They are not involved in setting the DIP switch address, and should be left in their <code>DOWN</code> position.</i>)</li>\n",
"\n",
"This represents <i>binary encoding</i>:\n",
"<ul>\n",
"<li>All pins at <code>0</code> → DIP switch is set to address binary <code>0 0 0 0</code> -> decimal <code>0</code></li>\n",
"<li>All pins at <code>1</code> → DIP switch is set to address binary <code>1 1 1 1</code> -> decimal <code>15</code> (2<sup>4</sup>-1)</li>\n",
"</ul>\n",
"\n",
"This information is crucial for creating the correct commands to communicate with the machine stack.\n",
"\n",
"</td>\n",
"\n",
"<td style=\"width:40%; text-align:center; vertical-align:middle;\">\n",
"<img src=\"img/inheco_incubator_shaker_dip_switch_addressing.png\" width=\"500\"/><br>\n",
"<i>Figure: DIP switch layout to generate different identifiers/addresses</i>\n",
"</td>\n",
"</tr>\n",
"\n",
"</table>"
"| Explanation | Image |\n",
"|------------|--------|\n",
"| <div style=\"font-size:15px; line-height:1.6; margin-top:0;\"> To connect an <code>InhecoIncubatorShakerStackBackend</code> you must set the <b>DIP switch identifier</b> on the back of the bottom machine: <ul style=\"margin-left:20px;\"> <li>located on the back of the bottom machine,</li> <li>defines the DIP switch configuration for the entire stack.</li> </ul> <h3>Setting the DIP switch to generate a machine address</h3> Each machine has a 4-pin DIP switch. Each pin can be <code>UP</code> (<code>0</code>) or <code>DOWN</code> (<code>1</code>). <br><br> <i>Note:</i> the two pins to the left of the DIP switch are not part of the addressing and should remain in the <code>DOWN</code> position. <br><br> This forms a <i>4-bit binary address</i>: <ul> <li>All pins at <code>0</code> → binary <code>0 0 0 0</code> → decimal <code>0</code></li> <li>All pins at <code>1</code> → binary <code>1 1 1 1</code> → decimal <code>15</code> (<code>2<sup>4</sup>-1</code>)</li> </ul> This address is crucial for generating valid communication commands for your Inheco stack. </div> | <div style=\"width:320px; text-align:center;\"> ![dip switches](img/inheco_incubator_shaker_dip_switch_addressing.png) <br><i>Figure: DIP switch layout to generate different identifiers/addresses</i> </div> |\n"
]
},
{
Expand Down Expand Up @@ -501,38 +436,9 @@
"id": "438e19d7-714d-46f3-8a9e-f00798ca9893",
"metadata": {},
"source": [
"<table style=\"width:100%; border-collapse:collapse;\">\n",
" <tr>\n",
" <td style=\"width:60%; font-size:15px; line-height:1.7; vertical-align:top; padding-right:20px;\">\n",
" <p style=\"margin-top:0;\">The Inheco Incubator (Shaker) contains three independent temperature sensors:</p>\n",
" <ol style=\"margin-top:0; margin-bottom:10px; padding-left:20px;\">\n",
" <li>main sensor — close to the door/front, inside the machine</li>\n",
" <li>validation sensor — back, inside the machine</li>\n",
" <li>boost sensor — on heating foil, inside the machine</li>\n",
" </ol>\n",
" <p>\n",
" By default, <code>iis_stack[0].get_temperature()</code>’s argument is set to\n",
" <code>sensor=\"main\"</code>. \n",
" This can be changed to any of the following:\n",
" </p>\n",
" <ul style=\"margin-top:0; padding-left:20px;\">\n",
" <li><code>\"main\"</code></li>\n",
" <li><code>\"dif\"</code></li>\n",
" <li><code>\"boost\"</code></li>\n",
" <li><code>\"mean\"</code> - takes all three sensors’ measurements and returns their geometric mean</li>\n",
" </ul>\n",
" </td>\n",
" <td style=\"width:40%; text-align:center; vertical-align:middle;\">\n",
" <img src=\"img/inheco_incubator_shaker_t_sensor_positioning.png\"\n",
" alt=\"Inheco Incubator Shaker sensor positions\"\n",
" style=\"width:300px; border-radius:6px; margin-bottom:8px;\"/>\n",
" <br>\n",
" <i style=\"font-size:13px; color:#6c757d;\">\n",
" Figure: Inheco Incubator Shaker Temperature Sensor Positioning\n",
" </i>\n",
" </td>\n",
" </tr>\n",
"</table>\n"
"| Explanation | Image |\n",
"|------------|--------|\n",
"| <div style=\"font-size:15px; line-height:1.7; margin-top:0; padding-right:20px;\"> <p>The Inheco Incubator (Shaker) contains three independent temperature sensors:</p> <ol style=\"margin-top:0; margin-bottom:10px; padding-left:20px;\"> <li>main sensor — close to the door/front, inside the machine</li> <li>validation sensor — back, inside the machine</li> <li>boost sensor — on heating foil, inside the machine</li> </ol> <p>By default, <code>iis_stack[0].get_temperature()</code>’s argument is set to <code>sensor=\"main\"</code>.<br> This can be changed to any of the following:</p> <ul style=\"margin-top:0; padding-left:20px;\"> <li><code>\"main\"</code></li> <li><code>\"dif\"</code></li> <li><code>\"boost\"</code></li> <li><code>\"mean\"</code> — takes all three sensors’ measurements and returns their geometric mean</li> </ul> </div> | <div style=\"width:280px; text-align:center;\"> ![sensor positions](img/inheco_incubator_shaker_t_sensor_positioning.png) <br><i style=\"font-size:13px; color:#6c757d;\">Figure: Inheco Incubator Shaker Temperature Sensor Positioning</i> </div> |\n"
]
},
{
Expand Down Expand Up @@ -951,19 +857,19 @@
{
"data": {
"text/plain": [
"{\n",
" \"drawer_error\": False,\n",
" \"homogeneity_sensor_3_vs_1_error\": False,\n",
" \"homogeneity_sensor_2_vs_1_error\": False,\n",
" \"sensor_1_target_temp_error\": False,\n",
" \"y_amplitude_shaker_error\": False,\n",
" \"x_amplitude_shaker_error\": False,\n",
" \"phase_shift_shaker_error\": False,\n",
" \"y_frequency_shaker_error\": False,\n",
" \"x_frequency_shaker_error\": False,\n",
" \"line_boost_heater_broken\": False,\n",
" \"line_main_heater_broken\": False,\n",
"}\n"
"{\n",
" \"drawer_error\": False,\n",
" \"homogeneity_sensor_3_vs_1_error\": False,\n",
" \"homogeneity_sensor_2_vs_1_error\": False,\n",
" \"sensor_1_target_temp_error\": False,\n",
" \"y_amplitude_shaker_error\": False,\n",
" \"x_amplitude_shaker_error\": False,\n",
" \"phase_shift_shaker_error\": False,\n",
" \"y_frequency_shaker_error\": False,\n",
" \"x_frequency_shaker_error\": False,\n",
" \"line_boost_heater_broken\": False,\n",
" \"line_main_heater_broken\": False,\n",
"}\n"
]
},
"execution_count": 19,
Expand Down Expand Up @@ -1276,7 +1182,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"display_name": "plr",
"language": "python",
"name": "python3"
},
Expand Down