- 1 TODO River Pumping/Redirection
- 2 Drilling
- 3 Rainfall Collection
- 4 Input Systems
- 4.1 TODO independant prioritized inputs? (river / storage / etc)
- 4.2 TODO some particle pre-filters? - 20 micron then 5 micron or something - research more
- 4.3 TODO probably will need an ORP Sensor and a dosing pump for tank sterilization? any other way?
- 4.4 TODO is there an easier way for all this?
- 4.5 TODO would be good to add EC Sensor as well just to monitor the tank (detect like a dead frog or something)
- 4.6 TODO system pressurization pump?
- 4.7 TODO a reverse osmosis + UV filters for drinking water
- 5 Output Systems
1 TODO River Pumping/Redirection
1.1 Water collection from a higher attitude
fetching river above involves placing a pipe underground
1.1.1 TODO Research option for power generation
1.1.2 TODO Find a river
1.1.3 TODO Check if river is available throughout the whole year
1.2 Below
1.2.1 TODO Research Pumps
2 Drilling
12 meters underground (aparently)
2.0.1 TODO Get drilling info and offers
which pump also? river is 200 meters away
2.0.2 TODO Research Pumps
3 Rainfall Collection
3.1 Data download
Configure py graphing env
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
'dark_background')
plt.style.use(= {
cool_dark_style 'lines.linewidth': 0.75,
'lines.markersize' : 2,
'figure.facecolor': '#1E1E1E', # Dark background color
'axes.facecolor': '#1E1E1E', # Dark background color for axes
'axes.edgecolor': 'gray', # Color of axes borders
'axes.labelcolor': 'white', # Color of axis labels
'axes.grid': True, # Enable gridlines
'axes.linewidth': 1,
'grid.color': '#333', # Color of gridlines
'grid.linestyle': '--', # Style of gridlines
'xtick.color': 'white', # Color of x-axis ticks
'ytick.color': 'white', # Color of y-axis ticks
'text.color': 'white', # Color of text
'legend.facecolor': '#1E1E1E', # Dark background color for legend
'legend.edgecolor': 'none', # Color of legend border
'legend.fancybox': False,
'legend.frameon': True,
'legend.facecolor': 'inherit',
'legend.labelspacing': 0.25, # Spacing between legend labels
'legend.framealpha': 0.8,
# 'figure.dpi': 100,
'axes.titlepad': 20 , # Spacing for title,
'ytick.labelright': False,
'ytick.right': False,
'ytick.major.pad': 3.5,
'ytick.direction': 'in',
'xtick.top': False,
'xtick.major.pad': 3.5,
'xtick.direction': 'in',
'axes.autolimit_mode': 'data',
'axes.xmargin': 0.02,
'axes.ymargin': 0.02,
'font.family': 'Terminus (TTF)',
'font.style': 'normal',
'font.variant': 'normal',
'font.weight': 'normal',
'font.stretch': 'normal',
'font.size': 14
}
# Apply the custom style
plt.style.use(cool_dark_style)
Month | mm or L/Month | Days |
---|---|---|
Jan | 62 | 9 |
Feb | 37 | 9 |
Mar | 37 | 8 |
Apr | 23 | 7 |
May | 23 | 5 |
Jun | 14 | 2 |
Jul | 6 | 1 |
Aug | 7 | 2 |
Sep | 15 | 4 |
Oct | 51 | 6 |
Nov | 56 | 9 |
Dec | 71 | 12 |
Total | 402 | 74 |
^ | x | y |
Downloaded an average rainfall data for last 10 years from some legit looking site
3.2 Data graph
= rawRainfallData[1:len(rawRainfallData) - 2]
rainfallData #plt.rcParams['font.family'] = 'monospace'
#plt.rcParams['font.size'] = 13
=plt.figure()
fig= np.arange(1, 13)
months range(1, len(months) + 1), range(1, len(months) + 1))
plt.xticks(
list(map(lambda x: x[1], rainfallData)), marker='s', label='rainfall (mm)')
plt.plot(months, 'Month')
plt.xlabel('mm/sqm')
plt.ylabel(='upper left')
plt.legend(loc
= plt.twinx()
ax2 list(map(lambda x: x[2], rainfallData)), marker='s', color='orange', label='rainfall (days)')
ax2.plot(months,
'Days/month')
ax2.set_ylabel(False)
ax2.grid(='upper right')
plt.legend(loc
fig.tight_layout()
#fname = 'images/rainfall.png'
#plt.savefig(fname, dpi=125, transparent=True) # Adjust dpi as needed for quality
= 'images/rainfall.svg'
fname =0, transparent=True)
plt.savefig(fname, bbox_inches fname
3.3 Rainfall Collection Capacity by Roof Size
Assuming
- usage of 100 liters per day (2 people)
- tank capacity of 15k liters
= 100 # sqm
roofSize = 100 # liters per day
usage = 15000
tankCapacity = 7000 # starting value
totalSupply
= []
ret = 1
i
= list(range(20,250,20))
roofSizes
for roofSize in roofSizes:
= 7000 # starting value
totalSupply = data[1:len(data)-2]
rawData for row in rawData:
= roofSize * row[1]
currentSupply = usage * 30
currentUsage
= currentSupply - currentUsage
change += change
totalSupply
# tank is overflowing
if totalSupply > tankCapacity:
= tankCapacity
totalSupply # tank is totally empty
if totalSupply < 0:
= 0
totalSupply
+ [currentSupply, currentUsage, change, totalSupply, roofSize])
ret.append([i] += 1
i if i > 12:
=1
i
return([["index", "Supply", "Usage", "Change", "Total supply", "roofSize"]] + ret)
index | Supply | Usage | Change | Total supply | roofSize |
---|---|---|---|---|---|
1 | 1240 | 3000 | -1760 | 5240 | 20 |
2 | 740 | 3000 | -2260 | 2980 | 20 |
3 | 740 | 3000 | -2260 | 720 | 20 |
4 | 460 | 3000 | -2540 | 0 | 20 |
5 | 460 | 3000 | -2540 | 0 | 20 |
6 | 280 | 3000 | -2720 | 0 | 20 |
7 | 120 | 3000 | -2880 | 0 | 20 |
8 | 140 | 3000 | -2860 | 0 | 20 |
9 | 300 | 3000 | -2700 | 0 | 20 |
10 | 1020 | 3000 | -1980 | 0 | 20 |
11 | 1120 | 3000 | -1880 | 0 | 20 |
12 | 1420 | 3000 | -1580 | 0 | 20 |
1 | 2480 | 3000 | -520 | 6480 | 40 |
2 | 1480 | 3000 | -1520 | 4960 | 40 |
3 | 1480 | 3000 | -1520 | 3440 | 40 |
4 | 920 | 3000 | -2080 | 1360 | 40 |
5 | 920 | 3000 | -2080 | 0 | 40 |
6 | 560 | 3000 | -2440 | 0 | 40 |
7 | 240 | 3000 | -2760 | 0 | 40 |
8 | 280 | 3000 | -2720 | 0 | 40 |
9 | 600 | 3000 | -2400 | 0 | 40 |
10 | 2040 | 3000 | -960 | 0 | 40 |
11 | 2240 | 3000 | -760 | 0 | 40 |
12 | 2840 | 3000 | -160 | 0 | 40 |
1 | 3720 | 3000 | 720 | 7720 | 60 |
2 | 2220 | 3000 | -780 | 6940 | 60 |
3 | 2220 | 3000 | -780 | 6160 | 60 |
4 | 1380 | 3000 | -1620 | 4540 | 60 |
5 | 1380 | 3000 | -1620 | 2920 | 60 |
6 | 840 | 3000 | -2160 | 760 | 60 |
7 | 360 | 3000 | -2640 | 0 | 60 |
8 | 420 | 3000 | -2580 | 0 | 60 |
9 | 900 | 3000 | -2100 | 0 | 60 |
10 | 3060 | 3000 | 60 | 60 | 60 |
11 | 3360 | 3000 | 360 | 420 | 60 |
12 | 4260 | 3000 | 1260 | 1680 | 60 |
1 | 4960 | 3000 | 1960 | 8960 | 80 |
2 | 2960 | 3000 | -40 | 8920 | 80 |
3 | 2960 | 3000 | -40 | 8880 | 80 |
4 | 1840 | 3000 | -1160 | 7720 | 80 |
5 | 1840 | 3000 | -1160 | 6560 | 80 |
6 | 1120 | 3000 | -1880 | 4680 | 80 |
7 | 480 | 3000 | -2520 | 2160 | 80 |
8 | 560 | 3000 | -2440 | 0 | 80 |
9 | 1200 | 3000 | -1800 | 0 | 80 |
10 | 4080 | 3000 | 1080 | 1080 | 80 |
11 | 4480 | 3000 | 1480 | 2560 | 80 |
12 | 5680 | 3000 | 2680 | 5240 | 80 |
1 | 6200 | 3000 | 3200 | 10200 | 100 |
2 | 3700 | 3000 | 700 | 10900 | 100 |
3 | 3700 | 3000 | 700 | 11600 | 100 |
4 | 2300 | 3000 | -700 | 10900 | 100 |
5 | 2300 | 3000 | -700 | 10200 | 100 |
6 | 1400 | 3000 | -1600 | 8600 | 100 |
7 | 600 | 3000 | -2400 | 6200 | 100 |
8 | 700 | 3000 | -2300 | 3900 | 100 |
9 | 1500 | 3000 | -1500 | 2400 | 100 |
10 | 5100 | 3000 | 2100 | 4500 | 100 |
11 | 5600 | 3000 | 2600 | 7100 | 100 |
12 | 7100 | 3000 | 4100 | 11200 | 100 |
1 | 7440 | 3000 | 4440 | 11440 | 120 |
2 | 4440 | 3000 | 1440 | 12880 | 120 |
3 | 4440 | 3000 | 1440 | 14320 | 120 |
4 | 2760 | 3000 | -240 | 14080 | 120 |
5 | 2760 | 3000 | -240 | 13840 | 120 |
6 | 1680 | 3000 | -1320 | 12520 | 120 |
7 | 720 | 3000 | -2280 | 10240 | 120 |
8 | 840 | 3000 | -2160 | 8080 | 120 |
9 | 1800 | 3000 | -1200 | 6880 | 120 |
10 | 6120 | 3000 | 3120 | 10000 | 120 |
11 | 6720 | 3000 | 3720 | 13720 | 120 |
12 | 8520 | 3000 | 5520 | 15000 | 120 |
1 | 8680 | 3000 | 5680 | 12680 | 140 |
2 | 5180 | 3000 | 2180 | 14860 | 140 |
3 | 5180 | 3000 | 2180 | 15000 | 140 |
4 | 3220 | 3000 | 220 | 15000 | 140 |
5 | 3220 | 3000 | 220 | 15000 | 140 |
6 | 1960 | 3000 | -1040 | 13960 | 140 |
7 | 840 | 3000 | -2160 | 11800 | 140 |
8 | 980 | 3000 | -2020 | 9780 | 140 |
9 | 2100 | 3000 | -900 | 8880 | 140 |
10 | 7140 | 3000 | 4140 | 13020 | 140 |
11 | 7840 | 3000 | 4840 | 15000 | 140 |
12 | 9940 | 3000 | 6940 | 15000 | 140 |
1 | 9920 | 3000 | 6920 | 13920 | 160 |
2 | 5920 | 3000 | 2920 | 15000 | 160 |
3 | 5920 | 3000 | 2920 | 15000 | 160 |
4 | 3680 | 3000 | 680 | 15000 | 160 |
5 | 3680 | 3000 | 680 | 15000 | 160 |
6 | 2240 | 3000 | -760 | 14240 | 160 |
7 | 960 | 3000 | -2040 | 12200 | 160 |
8 | 1120 | 3000 | -1880 | 10320 | 160 |
9 | 2400 | 3000 | -600 | 9720 | 160 |
10 | 8160 | 3000 | 5160 | 14880 | 160 |
11 | 8960 | 3000 | 5960 | 15000 | 160 |
12 | 11360 | 3000 | 8360 | 15000 | 160 |
1 | 11160 | 3000 | 8160 | 15000 | 180 |
2 | 6660 | 3000 | 3660 | 15000 | 180 |
3 | 6660 | 3000 | 3660 | 15000 | 180 |
4 | 4140 | 3000 | 1140 | 15000 | 180 |
5 | 4140 | 3000 | 1140 | 15000 | 180 |
6 | 2520 | 3000 | -480 | 14520 | 180 |
7 | 1080 | 3000 | -1920 | 12600 | 180 |
8 | 1260 | 3000 | -1740 | 10860 | 180 |
9 | 2700 | 3000 | -300 | 10560 | 180 |
10 | 9180 | 3000 | 6180 | 15000 | 180 |
11 | 10080 | 3000 | 7080 | 15000 | 180 |
12 | 12780 | 3000 | 9780 | 15000 | 180 |
1 | 12400 | 3000 | 9400 | 15000 | 200 |
2 | 7400 | 3000 | 4400 | 15000 | 200 |
3 | 7400 | 3000 | 4400 | 15000 | 200 |
4 | 4600 | 3000 | 1600 | 15000 | 200 |
5 | 4600 | 3000 | 1600 | 15000 | 200 |
6 | 2800 | 3000 | -200 | 14800 | 200 |
7 | 1200 | 3000 | -1800 | 13000 | 200 |
8 | 1400 | 3000 | -1600 | 11400 | 200 |
9 | 3000 | 3000 | 0 | 11400 | 200 |
10 | 10200 | 3000 | 7200 | 15000 | 200 |
11 | 11200 | 3000 | 8200 | 15000 | 200 |
12 | 14200 | 3000 | 11200 | 15000 | 200 |
1 | 13640 | 3000 | 10640 | 15000 | 220 |
2 | 8140 | 3000 | 5140 | 15000 | 220 |
3 | 8140 | 3000 | 5140 | 15000 | 220 |
4 | 5060 | 3000 | 2060 | 15000 | 220 |
5 | 5060 | 3000 | 2060 | 15000 | 220 |
6 | 3080 | 3000 | 80 | 15000 | 220 |
7 | 1320 | 3000 | -1680 | 13320 | 220 |
8 | 1540 | 3000 | -1460 | 11860 | 220 |
9 | 3300 | 3000 | 300 | 12160 | 220 |
10 | 11220 | 3000 | 8220 | 15000 | 220 |
11 | 12320 | 3000 | 9320 | 15000 | 220 |
12 | 15620 | 3000 | 12620 | 15000 | 220 |
1 | 14880 | 3000 | 11880 | 15000 | 240 |
2 | 8880 | 3000 | 5880 | 15000 | 240 |
3 | 8880 | 3000 | 5880 | 15000 | 240 |
4 | 5520 | 3000 | 2520 | 15000 | 240 |
5 | 5520 | 3000 | 2520 | 15000 | 240 |
6 | 3360 | 3000 | 360 | 15000 | 240 |
7 | 1440 | 3000 | -1560 | 13440 | 240 |
8 | 1680 | 3000 | -1320 | 12120 | 240 |
9 | 3600 | 3000 | 600 | 12720 | 240 |
10 | 12240 | 3000 | 9240 | 15000 | 240 |
11 | 13440 | 3000 | 10440 | 15000 | 240 |
12 | 17040 | 3000 | 14040 | 15000 | 240 |
= rawRainfallData[1:len(rawRainfallData) - 2]
rainfallData = rawSupplyData[1:len(rawSupplyData)]
supplyData
= {
field 'index': 0,
'supply': 1,
'usage': 2,
'change': 3,
'stored': 4,
'roofSize': 5
}
= list(set(list(map(lambda x: x[field['roofSize']], supplyData))))
roofSizes
roofSizes.sort()
=plt.figure()
fig= np.arange(1, 13)
months range(1, len(months) + 1), range(1, len(months) + 1))
plt.xticks(
def filterRoof(roofsize):
return [row for row in supplyData if row[field['roofSize']] == roofsize]
'Month')
plt.xlabel('liters')
plt.ylabel(
for roofSize in roofSizes:
list(map(lambda x: x[field['supply']], filterRoof(roofSize))), label=str(roofSize).zfill(3))
plt.plot(months,
='upper right')
plt.legend(loc
list(map(lambda x: x[field['usage']], filterRoof(100))), color="red", linestyle="--")
plt.plot(months,
fig.tight_layout()
= 'images/rainfall_roof_collection.svg'
fname =0, transparent=True)
plt.savefig(fname, bbox_inches fname
Almost all reasonable roof sizes don’t produce enough water for almost half a year
3.4 15k liter tank yearly water levels by roof size
= rawRainfallData[1:len(rawRainfallData) - 2]
rainfallData = rawSupplyData[1:len(rawSupplyData)]
supplyData
= list(set(list(map(lambda x: x[field['roofSize']], supplyData))))
roofSizes
roofSizes.sort()
=plt.figure()
fig= np.arange(1, 13)
months range(1, len(months) + 1), range(1, len(months) + 1))
plt.xticks(
def filterRoof(roofsize):
return [row for row in supplyData if row[field['roofSize']] == roofsize]
list(map(lambda x: x[field['usage']], filterRoof(100))), color="red", linestyle="--")
plt.plot(months,
'Month')
plt.xlabel('liters')
plt.ylabel(
for roofSize in roofSizes:
list(map(lambda x: x[field['stored']], filterRoof(roofSize))), label=str(roofSize).zfill(3))
plt.plot(months,
#plt.legend(loc='upper left', bbox_to_anchor=(1.0, 1.0))
='upper right')
plt.legend(loc
fig.tight_layout()
= 'images/rainfall_roof_storage.svg'
fname =0, transparent=True)
plt.savefig(fname, bbox_inches fname
3.5 100 sqm roof details
the first one that doesn’t dip until the bottom of the tank, gives about one month of backup water in the worst case.
= rawRainfallData[1:len(rawRainfallData) - 2]
rainfallData = rawSupplyData[1:len(rawSupplyData)]
supplyData
= list(set(list(map(lambda x: x[field['roofSize']], supplyData))))
roofSizes
roofSizes.sort()
=plt.figure()
fig= np.arange(1, 13)
months
range(1, len(months) + 1), range(1, len(months) + 1))
plt.xticks(
def filterRoof(roofsize):
return [row for row in supplyData if row[field['roofSize']] == roofsize]
= filterRoof(100)
data list(map(lambda x: x[field['stored']], data)), marker='o', label="total stored")
plt.plot(months, list(map(lambda x: x[field['change']], data)), marker='x', label="change liters")
plt.plot(months, list(map(lambda x: x[field['supply']], data)), marker='s', label="collected liters")
plt.plot(months,
'Month')
plt.xlabel('Liters')
plt.ylabel(
='upper right')
plt.legend(loc12), 0), color="red", linestyle="-")
plt.plot(months, np.full((
list(map(lambda x: x[field['usage']], filterRoof(100))), color="red", linestyle="--")
plt.plot(months,
fig.tight_layout()
= 'images/rainfall_roof100.svg'
fname =True)
plt.savefig(fname, transparent fname
This looks fairly stable and like a minimum sustainable roof size for full year 2 people.
3.6 DONE Conclusions
- generally seems viable with a 100 sqm rooftop
3.6.1 TODO check variance of the rainfall distribution
3.6.2 TODO check longer term climate change projections
3.6.3 TODO 15k liters recomended as a comfy min (15 sqm), check pricing for this
4 Input Systems
4.1 TODO independant prioritized inputs? (river / storage / etc)
4.2 TODO some particle pre-filters? - 20 micron then 5 micron or something - research more
4.3 TODO probably will need an ORP Sensor and a dosing pump for tank sterilization? any other way?
4.4 TODO is there an easier way for all this?
at least design a low power low complexity low maitenance manual backup
4.5 TODO would be good to add EC Sensor as well just to monitor the tank (detect like a dead frog or something)
4.6 TODO system pressurization pump?
4.7 TODO a reverse osmosis + UV filters for drinking water
5 Output Systems
5.1 Research
5.1.1 TODO ideally we re-use gray water
5.1.2 TODO research gray water vs black water treatments
5.1.3 TODO research prefab blackwater systems
EU small scale water treatment statistics
Criteria:
- BOD (Biochemical Oxygen Demand), Nitrogen and Phosphorus removal efficiencies
- Shutdown / Startup procedure for prolonged periods without usage?
- Maitenance
- Electricity usage?
- Env Temperature tolerances?
- Price
5.1.4 TODO what would it take to have a system that recycles water?
- showers, washing, (everything?) etc
- can we filter shower/washing machine water without degradation?
- filter maitenance?
5.1.5 biorock
has greek distributors (https://biorock.gr/) https://biorock.com/
- doesn’t seem to treat nitrogen?
- seems best since no power needed
monoblock seems good,
https://villagewaters.eu/945?equip_id=10&users=4 https://biorock.com/products/biorock-monoblock-systems/monoblock
5.1.6 TODO what are the negatives?
others don’t use kwhs of power for no reason..), compare with villagwaters more
5.1.7 Graf one2clean
https://www.graf.info/en-gb/wastewater-treatment/wastewater-treatment-systems/one2clean.html needs power, idk about the rest