[ evia, infrastructure, house ] Posted on August 23, 2023

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

plt.style.use('dark_background')
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

rainfallData = rawRainfallData[1:len(rawRainfallData) - 2]
#plt.rcParams['font.family'] = 'monospace'
#plt.rcParams['font.size'] = 13
fig=plt.figure()
months = np.arange(1, 13)
plt.xticks(range(1, len(months) + 1), range(1, len(months) + 1))

plt.plot(months, list(map(lambda x: x[1], rainfallData)), marker='s', label='rainfall (mm)')
plt.xlabel('Month')
plt.ylabel('mm/sqm')
plt.legend(loc='upper left')

ax2 = plt.twinx()
ax2.plot(months, list(map(lambda x: x[2], rainfallData)), marker='s', color='orange', label='rainfall (days)')

ax2.set_ylabel('Days/month')
ax2.grid(False)
plt.legend(loc='upper right')

fig.tight_layout()

#fname = 'images/rainfall.png'
#plt.savefig(fname, dpi=125, transparent=True)  # Adjust dpi as needed for quality
fname = 'images/rainfall.svg'
plt.savefig(fname, bbox_inches=0, transparent=True)
fname

3.3 Rainfall Collection Capacity by Roof Size

Assuming

  • usage of 100 liters per day (2 people)
  • tank capacity of 15k liters
roofSize = 100 # sqm
usage = 100 # liters per day
tankCapacity = 15000
totalSupply = 7000 # starting value

ret = []
i = 1

roofSizes = list(range(20,250,20))

for roofSize in roofSizes:
    totalSupply = 7000 # starting value
    rawData = data[1:len(data)-2]
    for row in rawData:
        currentSupply = roofSize * row[1]
        currentUsage = usage * 30

        change = currentSupply - currentUsage
        totalSupply += change

        # tank is overflowing
        if totalSupply > tankCapacity:
            totalSupply = tankCapacity
            # tank is totally empty
        if totalSupply < 0:
            totalSupply = 0

        ret.append([i] + [currentSupply, currentUsage, change, totalSupply, roofSize])
        i += 1
        if i > 12:
            i=1

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
rainfallData = rawRainfallData[1:len(rawRainfallData) - 2]
supplyData = rawSupplyData[1:len(rawSupplyData)]

field = {
  'index': 0,
  'supply': 1,
  'usage': 2,
  'change': 3,
  'stored': 4,
  'roofSize': 5
}

roofSizes = list(set(list(map(lambda x: x[field['roofSize']], supplyData))))
roofSizes.sort()

fig=plt.figure()
months = np.arange(1, 13)
plt.xticks(range(1, len(months) + 1), range(1, len(months) + 1))


def filterRoof(roofsize):
    return [row for row in supplyData if row[field['roofSize']] == roofsize]

plt.xlabel('Month')
plt.ylabel('liters')

for roofSize in roofSizes:
    plt.plot(months, list(map(lambda x: x[field['supply']], filterRoof(roofSize))),  label=str(roofSize).zfill(3))

plt.legend(loc='upper right')

plt.plot(months, list(map(lambda x: x[field['usage']], filterRoof(100))), color="red", linestyle="--")
fig.tight_layout()

fname = 'images/rainfall_roof_collection.svg'
plt.savefig(fname, bbox_inches=0, transparent=True)
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

rainfallData = rawRainfallData[1:len(rawRainfallData) - 2]
supplyData = rawSupplyData[1:len(rawSupplyData)]

roofSizes = list(set(list(map(lambda x: x[field['roofSize']], supplyData))))
roofSizes.sort()

fig=plt.figure()
months = np.arange(1, 13)
plt.xticks(range(1, len(months) + 1), range(1, len(months) + 1))

def filterRoof(roofsize):
    return [row for row in supplyData if row[field['roofSize']] == roofsize]

plt.plot(months, list(map(lambda x: x[field['usage']], filterRoof(100))), color="red", linestyle="--")

plt.xlabel('Month')
plt.ylabel('liters')

for roofSize in roofSizes:
    plt.plot(months, list(map(lambda x: x[field['stored']], filterRoof(roofSize))),  label=str(roofSize).zfill(3))

#plt.legend(loc='upper left', bbox_to_anchor=(1.0, 1.0))
plt.legend(loc='upper right')

fig.tight_layout()

fname = 'images/rainfall_roof_storage.svg'
plt.savefig(fname, bbox_inches=0, transparent=True)
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.


rainfallData = rawRainfallData[1:len(rawRainfallData) - 2]
supplyData = rawSupplyData[1:len(rawSupplyData)]

roofSizes = list(set(list(map(lambda x: x[field['roofSize']], supplyData))))
roofSizes.sort()

fig=plt.figure()
months = np.arange(1, 13)

plt.xticks(range(1, len(months) + 1), range(1, len(months) + 1))

def filterRoof(roofsize):
    return [row for row in supplyData if row[field['roofSize']] == roofsize]

data = filterRoof(100)
plt.plot(months, 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.xlabel('Month')
plt.ylabel('Liters')

plt.legend(loc='upper right')
plt.plot(months, np.full((12), 0), color="red", linestyle="-")

plt.plot(months, list(map(lambda x: x[field['usage']], filterRoof(100))), color="red", linestyle="--")
fig.tight_layout()

fname = 'images/rainfall_roof100.svg'
plt.savefig(fname, transparent=True)
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

check https://100r.co/site/off_the_grid.html

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

5.1.8 FEL

https://feliksnavis.lt/en/products/new-generation-fel-type-biological-domestic-wasterwater-treatment-system.htm