Pump Curves - Ulka E5 and Fluid-o-Tech 1106

The Ulka E5 and Fluid-o-Tech 1106 are solenoid pump (aka vibration pump) models commonly used in domestic espresso machines. A pump curve reflects the achievable discharge pressure at a given flowrate, which is limited by pump power and influenced by pump speed and efficiency.

1. Setup

Import Statements


In [1]:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

In [2]:
%matplotlib inline
# Turn interactive plotting off
plt.ioff()

Conversion Factors


In [3]:
mL_per_US_gallon = 3785.41
mL_per_L = 1000.0

sec_per_min = 60.0
sec_per_hr = 60.0 * sec_per_min

2. Pump curve data

Import the data


In [4]:
FluidOTech = pd.read_csv(r'https://github.com/DIYCoffeeGuy/data/raw/master/Fluidotech%201106%20Pump%20Curve.csv')
Ulka = pd.read_csv(r'https://github.com/DIYCoffeeGuy/data/raw/master/Ulka%20E5%20Pump%20Curve.csv')

Standardise the units.


In [5]:
FluidOTech['Volumetric Flowrate (mL/s)'] = FluidOTech['Volumetric Flowrate (L/h)'] * mL_per_L / sec_per_hr
Ulka['Volumetric Flowrate (mL/s)'] = Ulka['Volumetric Flowrate (mL / min)'] / sec_per_min

Take a look at the data.


In [6]:
FluidOTech[['Discharge Pressure (barg)','Volumetric Flowrate (mL/s)']]


Out[6]:
Discharge Pressure (barg) Volumetric Flowrate (mL/s)
0 11.93 0.233333
1 11.67 0.363889
2 11.44 0.705556
3 11.23 0.966667
4 10.98 1.288889
5 10.73 1.513889
6 10.52 1.780556
7 10.33 1.894444
8 10.19 2.119444
9 10.00 2.136111
10 9.71 2.552778
11 9.49 2.716667
12 9.30 2.905556
13 9.11 3.055556
14 8.90 3.261111
15 8.69 3.452778
16 8.45 3.630556
17 8.21 3.841667
18 8.00 4.041667
19 7.79 4.236111
20 7.57 4.380556
21 7.36 4.516667
22 7.12 4.744444
23 6.89 4.861111
24 6.67 5.097222
25 6.43 5.161111
26 6.20 5.377778
27 5.94 5.594444
28 5.72 5.758333
29 5.54 5.805556
30 5.34 5.980556
31 5.08 6.122222
32 4.86 6.294444
33 4.61 6.483333
34 4.32 6.636111
35 4.06 6.797222
36 3.83 6.969444
37 3.57 7.175000
38 3.31 7.222222
39 3.10 7.380556
40 2.89 7.550000
41 2.65 7.683333
42 2.44 7.877778
43 2.22 8.008333
44 2.01 8.258333
45 1.83 8.466667
46 1.64 8.636111
47 1.42 8.947222
48 1.21 9.250000
49 1.01 9.497222
50 0.82 9.886111
51 0.62 10.252778
52 0.42 10.783333
53 0.22 11.347222
54 0.07 11.797222

In [7]:
Ulka[['Discharge Pressure (barg)','Volumetric Flowrate (mL/s)']]


Out[7]:
Discharge Pressure (barg) Volumetric Flowrate (mL/s)
0 14.954373 0.025157
1 14.646388 0.226415
2 14.338403 0.452830
3 13.961977 0.654088
4 13.722433 0.880503
5 13.414449 1.056604
6 13.106464 1.207547
7 12.901141 1.383648
8 12.695817 1.584906
9 12.490494 1.761006
10 12.387833 1.962264
11 12.182510 2.138365
12 11.977186 2.289308
13 11.737643 2.440252
14 11.429658 2.566038
15 11.190114 2.641509
16 10.984791 2.767296
17 10.745247 2.968553
18 10.539924 3.194969
19 10.300380 3.371069
20 10.060837 3.672956
21 9.787072 3.849057
22 9.444867 4.025157
23 9.136882 4.276730
24 8.760456 4.503145
25 8.418251 4.704403
26 8.076046 4.955975
27 7.733840 5.132075
28 7.357414 5.283019
29 6.946768 5.433962
30 6.570342 5.610063
31 6.262357 5.786164
32 5.885932 5.962264
33 5.577947 6.188679
34 5.269962 6.389937
35 4.927757 6.641509
36 4.551331 6.817610
37 4.311787 6.993711
38 4.003802 7.220126
39 3.695817 7.496855
40 3.422053 7.798742
41 3.114068 8.000000
42 2.840304 8.352201
43 2.498099 8.553459
44 2.224335 8.805031
45 1.984791 9.106918
46 1.711027 9.333333
47 1.437262 9.584906
48 1.129278 9.861635
49 0.889734 10.088050
50 0.615970 10.314465
51 0.376426 10.515723
52 0.136882 10.691824

3. Plotting the Curves


In [8]:
fig, axes = plt.subplots(figsize=(12,8));

Add the pump curve data


In [9]:
FluidOTech.plot(
    kind='line',
    x='Discharge Pressure (barg)',
    y='Volumetric Flowrate (mL/s)',
    ax=axes,
    xlim=(0,15),
    legend=True,
    linestyle='dashed',
    color='b');

In [10]:
Ulka.plot(
    kind='line',
    ax=axes,
    x='Discharge Pressure (barg)',
    xlim=(0,15),
    y='Volumetric Flowrate (mL/s)',
    linestyle='solid',
    color='r');

Configure the plot layout and labels


In [11]:
#Configure the legend
lines, labels = axes.get_legend_handles_labels()[0], ['Fluid-o-Tech 1106','Ulka E5']
axes.legend(lines, labels, loc='best');
axes.set_title('Comparison of Vibration Pump Curves', fontsize=20)


Out[11]:
<matplotlib.text.Text at 0x23638cf1e48>

In [12]:
#Add ticks to the x-axes
axes.set_xticks(range(0,16));

In [13]:
#Configure LH y-axes
axes.set_yticks(range(0,13))
axes.set_ylabel('Volumetric Flowrate (mL/s)');

In [14]:
#Add and configure RH y-axis
axes2 = axes.twinx()
axes2.set_yticks(np.arange(0.0,0.251,0.025))
axes2.set_ylim(0,60*15/mL_per_US_gallon)
axes2.set_ylabel('Volumetric Flowrate (US gal/min)');

Display chart


In [15]:
fig.tight_layout()

In [16]:
plt.show()