diff --git a/README b/README new file mode 100644 index 000000000..91df05525 --- /dev/null +++ b/README @@ -0,0 +1,2 @@ +# AquaClense +A Website which is a game changing solution diff --git a/__pycache__/auth.cpython-310.pyc b/__pycache__/auth.cpython-310.pyc new file mode 100644 index 000000000..99ff905df Binary files /dev/null and b/__pycache__/auth.cpython-310.pyc differ diff --git a/__pycache__/database.cpython-310.pyc b/__pycache__/database.cpython-310.pyc new file mode 100644 index 000000000..0c4481547 Binary files /dev/null and b/__pycache__/database.cpython-310.pyc differ diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/app/__pycache__/__init__.cpython-310.pyc b/app/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 000000000..1bd7be0af Binary files /dev/null and b/app/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/__pycache__/routes.cpython-310.pyc b/app/__pycache__/routes.cpython-310.pyc new file mode 100644 index 000000000..c771aaf8b Binary files /dev/null and b/app/__pycache__/routes.cpython-310.pyc differ diff --git a/app/routes.py b/app/routes.py new file mode 100644 index 000000000..20d20debe --- /dev/null +++ b/app/routes.py @@ -0,0 +1,422 @@ +# c:\proj1\app\routes.py +from flask import render_template, request, redirect, url_for, session, flash, jsonify +from functools import wraps +import random +import pandas as pd +import math +import os +import logging +from datetime import datetime +import tensorflow as tf +import numpy as np +from PIL import Image +import smtplib +from email.mime.text import MIMEText + +from datetime import datetime +import random + +# Suppress TensorFlow oneDNN warning +os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0' + +# Logging setup +logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +# Gmail configuration (replace with real credentials) +GMAIL_EMAIL = "abhinavdev34532@gmail.com" +GMAIL_PASSWORD = "jwea jzvn dqxu fbgx" + + +from database import get_users_collection, get_admins_collection, get_canal_data_collection +users_collection = get_users_collection() +admins_collection = get_admins_collection() +canal_data_collection = get_canal_data_collection() + +# Load CNN model +cnn_model = tf.keras.models.load_model('c:/proj1/waste_cnn_model.h5') +cnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) +waste_types = ["plastic", "metal", "biomedical", "shoes"] + +# Load CSV file +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # C:\proj1\app +CSV_PATH = os.path.join(BASE_DIR, 'static', 'water_quality.csv') # C:\proj1\app\static\water_quality.csv +if not os.path.exists(CSV_PATH): + raise FileNotFoundError(f"CSV file not found at {CSV_PATH}. Please ensure it exists.") +df = pd.read_csv(CSV_PATH) + +# Utility functions +def send_price_email(to_email, product_name, price): + subject = f"{product_name} Price Quote" + body = f"Thank you for your interest in {product_name}! The price is {price} per unit. Contact us for more details!" + msg = MIMEText(body) + msg['Subject'] = subject + msg['From'] = GMAIL_EMAIL + msg['To'] = to_email + try: + with smtplib.SMTP('smtp.gmail.com', 587) as server: + server.starttls() + server.login(GMAIL_EMAIL, GMAIL_PASSWORD) + server.send_message(msg) + return True + except Exception as e: + logger.error(f"Email sending failed: {e}") + return False + +def estimate_d5(d0, temperature): + decay_rate = 0.1 + (temperature / 100) # Simplified without chlorophyll/ph + return d0 * math.exp(-decay_rate * 5) + +def calculate_bod(d0, d5): + return d0 - d5 if d0 > d5 else 0 + +def predict_diseases(bod): + if bod <= 3: + category = "Low BOD (Clean Water)" + health_risk = "Minimal" + diseases = ["None (if free from other contaminants)"] + solutions = ["Water is generally safe for drinking and recreation. Regular monitoring recommended."] + elif 3 < bod <= 5: + category = "Moderate BOD (Slightly Polluted Water)" + health_risk = "Moderate" + diseases = ["Gastroenteritis (Stomach Flu)", "Skin Infections & Rashes"] + solutions = ["Boil water before drinking or use a water purifier. Treat with chlorine if needed.", + "Avoid prolonged skin contact; wash with clean water after exposure."] + elif 5 < bod <= 10: + category = "High BOD (Heavily Polluted Water)" + health_risk = "High" + diseases = ["Cholera", "Typhoid Fever", "Hepatitis A & E"] + solutions = ["Seek medical help if symptoms like severe diarrhea appear. Use ORS and antibiotics (e.g., doxycycline) under doctor supervision.", + "Do not drink untreated water; boil or filter thoroughly.", + "Get vaccinated for Hepatitis A if possible; consult a doctor for symptoms like jaundice."] + else: + category = "Very High BOD (Severely Polluted Water)" + health_risk = "Extremely High (Life-threatening)" + diseases = ["Dysentery", "Polio", "Leptospirosis", "Arsenic Poisoning", "Blue Baby Syndrome"] + solutions = ["Immediate medical attention for bloody diarrhea or fever. Antibiotics (e.g., metronidazole) may be needed.", + "Vaccinate against polio; avoid all contact with water.", + "Seek treatment for fever or muscle aches; avoid floodwater exposure.", + "Test for heavy metals; consult a specialist for long-term exposure symptoms.", + "Use nitrate-free water for infants; seek pediatric care if blue skin appears."] + return category, health_risk, diseases, solutions + +# Authentication (assuming auth.py exists; otherwise, define here) +from auth import authenticate, is_authenticated + +# Decorators +def login_required(f): + @wraps(f) + def decorated_function(*args, **kwargs): + if not is_authenticated(): + return redirect(url_for('login')) + return f(*args, **kwargs) + return decorated_function + +def admin_required(f): + @wraps(f) + def decorated_function(*args, **kwargs): + if 'admin' not in session: + return redirect(url_for('admin_login')) + return f(*args, **kwargs) + return decorated_function + +# Routes +def init_routes(app): + @app.route('/', methods=['GET', 'POST']) + def login(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + if authenticate(username, password, users_collection): + session['user'] = {'username': username} + return redirect(url_for('dashboard')) + else: + flash('Invalid user credentials. Please sign up or try again.') + return redirect(url_for('signup')) + signup_url = url_for('signup') + admin_login_url = url_for('admin_login') + return render_template('login.html', signup_url=signup_url, admin_login_url=admin_login_url) + + @app.route('/signup', methods=['GET', 'POST']) + def signup(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + if users_collection.find_one({'username': username}): + flash('Username already exists. Please log in.') + return redirect(url_for('login')) + users_collection.insert_one({'username': username, 'password': password}) + flash('Signup successful! Please log in.') + return redirect(url_for('login')) + return render_template('signup.html') + + @app.route('/admin_login', methods=['GET', 'POST']) + def admin_login(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + if authenticate(username, password, admins_collection): + session['admin'] = {'username': username} # Use 'admin' key for admin session + return redirect(url_for('admin_home')) + else: + flash('Invalid admin credentials. Please sign up or try again.') + return redirect(url_for('admin_signup')) + admin_signup_url = url_for('admin_signup') + return render_template('admin_login.html', admin_signup_url=admin_signup_url) + + @app.route('/admin_signup', methods=['GET', 'POST']) + def admin_signup(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + if admins_collection.find_one({'username': username}): + flash('Admin username already exists. Please log in.') + return redirect(url_for('admin_login')) + admins_collection.insert_one({'username': username, 'password': password}) + flash('Admin signup successful! Please log in.') + return redirect(url_for('admin_login')) + return render_template('admin_signup.html') + + @app.route('/logout') + def logout(): + session.pop('user', None) + session.pop('admin', None) + return redirect(url_for('login')) + + @app.route('/buy_sell') + @login_required + def buy_sell(): + return render_template('buy_sell.html') + + @app.route('/sell', methods=['GET', 'POST']) + @login_required + def sell(): + if request.method == 'POST': + return render_template('sell.html', show_message=True) + return render_template('sell.html', show_message=False) + + @app.route('/buy', methods=['GET', 'POST']) + @login_required + def buy(): + if request.method == 'POST': + waste_kg = request.form.get('waste_kg', type=int) + if waste_kg is None or waste_kg < 0: + message = "Please enter a valid amount of waste!" + else: + message = f"Simulated purchase of {waste_kg} kg of waste!" + return render_template('buy.html', message=message) + return render_template('buy.html') + + @app.route('/dashboard') + @login_required + def dashboard(): + data = list(users_collection.find({}, {"_id": 0})) + today = datetime.now().strftime("%Y-%m-%d") + return render_template('dashboard.html', today=today) + + @app.route('/upload_waste_images', methods=['POST']) + @login_required + def upload_waste_images(): + if 'images' not in request.files or not request.form.get('date') or not request.form.get('canal'): + flash("Please provide date, canal, and at least one image!") + return redirect(url_for('dashboard')) + + date_str = request.form['date'] + canal_name = request.form['canal'] + uploaded_files = request.files.getlist("images") + + if not uploaded_files or all(f.filename == '' for f in uploaded_files): + flash("No images uploaded!") + return redirect(url_for('dashboard')) + + waste_counts = {"plastic": 0, "metal": 0, "biomedical": 0, "shoes": 0} + for file in uploaded_files: + if file.filename != '': + image = Image.open(file.stream).resize((224, 224)) + image_array = np.array(image) / 255.0 + image_array = np.expand_dims(image_array, axis=0) + prediction = cnn_model.predict(image_array)[0] + for i, prob in enumerate(prediction): + if prob > 0.5: + waste_counts[waste_types[i]] += 1 + + canal_data_collection.update_one( + {"date": date_str, "canal": canal_name}, + {"$set": {"waste_counts": waste_counts}}, + upsert=True + ) + flash(f"Waste images for {canal_name} on {date_str} uploaded and classified successfully!") + return redirect(url_for('dashboard')) + + @app.route('/product1', methods=['GET', 'POST']) + def product1(): + if request.method == 'POST': + email = request.form.get('email') + if email and '@' in email: + if send_price_email(email, "AquaClense 1.0", "$100,000"): + flash(f"Price details for AquaClense 1.0 sent to {email}!") + else: + flash("Failed to send price details. Please try again.") + return redirect(url_for('product1')) + else: + flash("Please enter a valid email address!") + return render_template('product1.html') + + @app.route('/product2', methods=['GET', 'POST']) + def product2(): + if request.method == 'POST': + email = request.form.get('email') + if email and '@' in email: + if send_price_email(email, "AquaClense 2.0", "$130,000"): + flash(f"Price details for AquaClense 2.0 sent to {email}!") + else: + flash("Failed to send price details. Please try again.") + return redirect(url_for('product2')) + else: + flash("Please enter a valid email address!") + return render_template('product2.html') + + @app.route('/product3', methods=['GET', 'POST']) + def product3(): + if request.method == 'POST': + email = request.form.get('email') + if email and '@' in email: + if send_price_email(email, "AquaClense 3.0", "90,000 INR (starting price, depends on canal size)"): + flash(f"Price details for AquaClense 3.0 sent to {email}!") + else: + flash("Failed to send price details. Please try again.") + return redirect(url_for('product3')) + else: + flash("Please enter a valid email address!") + return render_template('product3.html') + + @app.route('/product4', methods=['GET', 'POST']) + def product4(): + if request.method == 'POST': + email = request.form.get('email') + if email and '@' in email: + if send_price_email(email, "AquaClense 4.0", "1.7 lakh INR (depending on canal length)"): + flash(f"Price details for AquaClense 4.0 sent to {email}!") + else: + flash("Failed to send price details. Please try again.") + return redirect(url_for('product4')) + else: + flash("Please enter a valid email address!") + return render_template('product4.html') + + @app.route('/reports', methods=['GET', 'POST']) + @login_required + def reports(): + if request.method == 'POST': + selected_date = request.form['date'] + canals = ["Canal A", "Canal B", "Canal C"] + canal_data = {} + for canal in canals: + data = canal_data_collection.find_one({"date": selected_date, "canal": canal}) + canal_data[canal] = data["waste_counts"] if data and "waste_counts" in data else {} + return render_template('reports.html', date=selected_date, canal_data=canal_data) + return render_template('select_date_canal.html') + + @app.route('/recycling_measures') + @login_required + def recycling_measures(): + return render_template('recycling_measures.html') + + @app.route('/get_waste_data//', methods=['GET']) + @login_required + def get_waste_data(date, canal): + report = canal_data_collection.find_one({"date": date, "canal": canal}) + if report and "waste_counts" in report: + return jsonify(report["waste_counts"]) + return jsonify({}), 404 + + @app.route('/admin_home') + @admin_required + def admin_home(): + data = list(admins_collection.find({}, {"_id": 0})) + return render_template('admin_home.html') + + + + @app.route('/wdp', methods=['GET', 'POST']) + @login_required + def wdp(): + logger.debug("Entering /wdp route") + today_date = datetime.now().strftime("%Y-%m-%d") # Default to today + + if not os.path.exists(CSV_PATH): + logger.error(f"CSV file not found at {CSV_PATH}") + flash(f"Error: CSV file not found at {CSV_PATH}") + return render_template('wdp.html', today_date=today_date) + + try: + logger.debug(f"Loading CSV from {CSV_PATH}") + if df.empty: + logger.error("CSV file is empty") + flash("Error: CSV file is empty") + return render_template('wdp.html', today_date=today_date) + + selected_date = request.form.get('selected_date', today_date) if request.method == 'POST' else today_date + logger.debug(f"Selected date: {selected_date}") + + # Seed random with the selected date for consistent randomness per date + date_seed = int(''.join(filter(str.isdigit, selected_date))) # e.g., "2025-03-08" -> 20250308 + random.seed(date_seed) + + logger.debug(f"CSV columns: {df.columns.tolist()}") + # Randomly sample one row with date-specific seed + random_data = df.sample(n=1, random_state=date_seed).iloc[0] + logger.debug(f"Randomly selected row for {selected_date}: {random_data.to_dict()}") + + # Extract data using your CSV's column names + sample_id = random_data.get("Sample ID", "N/A") + ph = float(random_data.get("pH", 7.0)) if not pd.isna(random_data.get("pH")) else 7.0 + temperature = float(random_data.get("Temperature (°C)", 20.0)) if not pd.isna(random_data.get("Temperature (°C)")) else 20.0 + turbidity = float(random_data.get("Turbidity (NTU)", 0.0)) if not pd.isna(random_data.get("Turbidity (NTU)")) else 0.0 + d0 = float(random_data.get("Dissolved Oxygen (mg/L)", 0.0)) if not pd.isna(random_data.get("Dissolved Oxygen (mg/L)")) else 0.0 + conductivity = float(random_data.get("Conductivity (µS/cm)", 0.0)) if not pd.isna(random_data.get("Conductivity (µS/cm)")) else 0.0 + + logger.debug(f"Extracted: sample_id={sample_id}, ph={ph}, temp={temperature}, turbidity={turbidity}, d0={d0}, conductivity={conductivity}") + + if d0 <= 0: + logger.error("Invalid dissolved oxygen value (D0 <= 0)") + flash("Error: Dissolved oxygen value is invalid (must be > 0)") + return render_template('wdp.html', + selected_date=selected_date, + today_date=today_date, + sample_id=sample_id, + d0=d0, + d5=0.0, + temperature=temperature, + turbidity=turbidity, + ph=ph, + conductivity=conductivity, + bod=0.0, + category="Invalid Data", + health_risk="N/A", + diseases=["N/A"], + solutions=["Check data source for valid DO values."]) + + d5 = estimate_d5(d0, temperature) + bod = calculate_bod(d0, d5) + category, health_risk, diseases, solutions = predict_diseases(bod) + + return render_template('wdp.html', + selected_date=selected_date, + today_date=today_date, + sample_id=sample_id, + d0=d0, + d5=d5, + temperature=temperature, + turbidity=turbidity, + ph=ph, + conductivity=conductivity, + bod=bod, + category=category, + health_risk=health_risk, + diseases=diseases, + solutions=solutions) + except Exception as e: + logger.error(f"Error in /wdp: {str(e)}") + flash(f"Error processing water quality data: {str(e)}") + return render_template('wdp.html', today_date=today_date) \ No newline at end of file diff --git a/app/running.py b/app/running.py new file mode 100644 index 000000000..53ac42fb7 --- /dev/null +++ b/app/running.py @@ -0,0 +1,43 @@ +import matplotlib.pyplot as plt +import os + +# Ensure the static directory exists +static_dir = 'c:/proj1/static/' +if not os.path.exists(static_dir): + os.makedirs(static_dir) + +# Waste Trends 2024 +months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] +plastic = [8, 9, 10, 11, 12, 13, 14, 15, 14, 13, 12, 11] +shoes = [5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 6] +metal = [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8] + +plt.figure(figsize=(10, 6)) +plt.plot(months, plastic, label='Plastic (tons)', marker='o') +plt.plot(months, shoes, label='Shoes (tons)', marker='o') +plt.plot(months, metal, label='Metal (tons)', marker='o') +plt.title('Monthly Waste Generation Trends (2024)') +plt.xlabel('Month') +plt.ylabel('Waste (tons)') +plt.legend() +plt.grid(True) +plt.savefig('c:/proj1/static/waste_trends_2024.jpg') +plt.close() + +# Waste Reduction Impact +categories = ['Plastic', 'Shoes', 'Metal'] +before = [12, 9, 8] +after = [9, 7, 6] + +x = range(len(categories)) +plt.figure(figsize=(8, 6)) +plt.bar(x, before, width=0.4, label='Before', align='center') +plt.bar([i + 0.4 for i in x], after, width=0.4, label='After', align='center') +plt.xticks([i + 0.2 for i in x], categories) +plt.title('Impact of Recycling Measures (2024)') +plt.ylabel('Waste (tons)') +plt.legend() +plt.savefig('c:/proj1/static/waste_reduction_2024.jpg') +plt.close() + +print("Graphs saved successfully to c:/proj1/static/") \ No newline at end of file diff --git a/app/static/aqua_video.mp4 b/app/static/aqua_video.mp4 new file mode 100644 index 000000000..238656985 Binary files /dev/null and b/app/static/aqua_video.mp4 differ diff --git a/app/static/aquaclense_1.1.jpg b/app/static/aquaclense_1.1.jpg new file mode 100644 index 000000000..beb11ae7c Binary files /dev/null and b/app/static/aquaclense_1.1.jpg differ diff --git a/app/static/aquaclense_2.0.jpg b/app/static/aquaclense_2.0.jpg new file mode 100644 index 000000000..68f988b8b Binary files /dev/null and b/app/static/aquaclense_2.0.jpg differ diff --git a/app/static/aquaclense_3.0.jpg b/app/static/aquaclense_3.0.jpg new file mode 100644 index 000000000..732ee5723 Binary files /dev/null and b/app/static/aquaclense_3.0.jpg differ diff --git a/app/static/aquaclense_4.0.jpg b/app/static/aquaclense_4.0.jpg new file mode 100644 index 000000000..29c4609a2 Binary files /dev/null and b/app/static/aquaclense_4.0.jpg differ diff --git a/app/static/aquaclense_tech.jpg b/app/static/aquaclense_tech.jpg new file mode 100644 index 000000000..bb44e352a Binary files /dev/null and b/app/static/aquaclense_tech.jpg differ diff --git a/app/static/css/login.css b/app/static/css/login.css new file mode 100644 index 000000000..79a214c93 --- /dev/null +++ b/app/static/css/login.css @@ -0,0 +1,160 @@ +/* Darkest Black Background */ +.background { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100vh; + background: #000000; + transition: background 1s ease-in-out; + overflow: hidden; +} + +/* Admin Background */ +.admin-active .background { + background: #333333; +} + +/* Wrapper and Containers */ +body { + margin: 0; + padding: 0; + overflow-x: hidden; + font-family: 'Montserrat', sans-serif; +} + +.login-wrapper { + display: flex; + width: 200%; + height: 100vh; + transition: transform 0.5s ease-in-out; + position: relative; + z-index: 1; +} + +.login-container, +.admin-container { + width: 50%; + display: flex; + justify-content: center; + align-items: center; +} + +.admin-active .login-wrapper { + transform: translateX(-50%); +} + +/* Card Styling */ +.card { + background-image: linear-gradient(163deg, #00ff75 10%, #3700ff 100%); + border-radius: 20px; + padding: 0.1rem; + transition: all 1.2s; + width: 60%; + max-width: 450px; + box-shadow: 0 0 1px #0a0000; +} + +.card2 { + border-radius: 18px; + background: #171717; + padding: 1.5rem; + transition: all 0.2s; +} + +.card2:hover { + transform: scale(0.98); + border-radius: 20px; +} + +.card:hover { + box-shadow: 0 0 4px #ffffff; +} + +/* Form Elements */ +.form { + display: flex; + flex-direction: column; + gap: 10px; +} + +#heading { + text-align: center; + margin: 1.5em 0; + color: #ffffff; + font-size: 1.5em; + font-weight: 700; +} + +.field { + display: flex; + align-items: center; + gap: 0.5em; + border-radius: 25px; + padding: 0.6em; + background-color: #252525; + box-shadow: inset 2px 5px 10px rgba(0, 0, 0, 0.5); +} + +.input-icon { + height: 1.3em; + width: 1.3em; + fill: white; +} + +.input-field { + background: none; + border: none; + outline: none; + width: 100%; + color: #d3d3d3; + font-size: 1em; + font-family: 'Montserrat', sans-serif; + font-weight: 400; +} + +.btn { + display: flex; + justify-content: center; + gap: 0.5em; + margin-top: 2em; +} + +.button1, .button2, .button3 { + padding: 0.5em 1.5em; + border-radius: 5px; + border: none; + outline: none; + transition: all 0.4s ease-in-out; + background-color: #252525; + color: white; + font-family: 'Montserrat', sans-serif; + font-weight: 500; +} + +.button1:hover { + background-color: black; + color: white; +} + +.button2:hover { + background-color: black; + color: white; +} + +.button3 { + margin: 1.5em auto; +} + +.button3:hover { + background-color: red; + color: white; +} + +.error { + color: red; + text-align: center; + margin: 0.5em 0; + font-family: 'Montserrat', sans-serif; + font-weight: 400; +} \ No newline at end of file diff --git a/app/static/js/login.js b/app/static/js/login.js new file mode 100644 index 000000000..d56b67b8d --- /dev/null +++ b/app/static/js/login.js @@ -0,0 +1,3 @@ +function toggleAdmin() { + document.body.classList.toggle('admin-active'); + } diff --git a/app/static/waste_reduction_2024 copy.jpg b/app/static/waste_reduction_2024 copy.jpg new file mode 100644 index 000000000..a20102a11 Binary files /dev/null and b/app/static/waste_reduction_2024 copy.jpg differ diff --git a/app/static/waste_reduction_2024.jpg b/app/static/waste_reduction_2024.jpg new file mode 100644 index 000000000..ab484c54a Binary files /dev/null and b/app/static/waste_reduction_2024.jpg differ diff --git a/app/static/waste_trends_2024 copy.jpg b/app/static/waste_trends_2024 copy.jpg new file mode 100644 index 000000000..7a6c1f7d2 Binary files /dev/null and b/app/static/waste_trends_2024 copy.jpg differ diff --git a/app/static/waste_trends_2024.jpg b/app/static/waste_trends_2024.jpg new file mode 100644 index 000000000..5590d4921 Binary files /dev/null and b/app/static/waste_trends_2024.jpg differ diff --git a/app/static/water_quality.csv b/app/static/water_quality.csv new file mode 100644 index 000000000..28348cf64 --- /dev/null +++ b/app/static/water_quality.csv @@ -0,0 +1,501 @@ +Sample ID,pH,Temperature (°C),Turbidity (NTU),Dissolved Oxygen (mg/L),Conductivity (µS/cm) +1,7.25,23.1,4.5,7.8,342 +2,7.11,22.3,5.1,6.2,335 +3,7.03,21.5,3.9,8.3,356 +4,7.38,22.9,3.2,9.5,327 +5,7.45,20.7,3.8,8.1,352 +6,6.89,23.6,4.6,7.2,320 +7,7.19,21.2,4.2,8.8,350 +8,6.98,22.1,3.7,6.9,325 +9,7.31,20.4,4.1,8.4,360 +10,7.02,22.7,4.8,7.5,330 +11,7.24,22.4,4.3,8.6,347 +12,7.17,21.6,3.6,7.1,328 +13,6.95,22.3,4.1,6.4,341 +14,7.06,23.5,3.7,9.2,355 +15,7.48,20.8,3.4,7.9,329 +16,6.92,21.4,4.9,6.8,362 +17,7.11,22,4.4,8.1,336 +18,7.3,23.2,3.5,9.6,351 +19,7.13,21.1,4,7.5,319 +20,7.01,23,4.7,8.9,330 +21,6.83,22.5,3.3,6.1,348 +22,7.34,20.3,4.2,8,365 +23,7.16,23.4,4.5,7.7,326 +24,7.25,22.6,3.9,9.1,355 +25,7.39,21.9,4.1,7.4,317 +26,7.02,22.2,4.6,6.6,339 +27,7.27,21.8,3.7,8.7,354 +28,7.09,23.3,5,7,324 +29,7.15,20.6,4.4,8.5,358 +30,7.07,22.8,3.8,6.9,332 +31,7.22,22.5,4.3,8.9,345 +32,6.92,21.7,4.7,6.3,363 +33,7.13,23.1,3.6,8.2,347 +34,7.31,20.9,4,7.6,316 +35,7.03,22.6,4.9,7.9,331 +36,7.21,21.8,3.8,8.5,346 +37,7.13,22.5,4.2,7.7,321 +38,7.09,23.1,4.4,7.2,335 +39,7.35,21.6,3.9,9.2,357 +40,7.02,22,3.2,8.8,318 +41,7.28,23.5,3.7,9.5,353 +42,7.14,20.9,4.3,8.1,330 +43,6.96,22.9,4.8,6.5,344 +44,7.24,22.7,4.1,8,327 +45,7.37,21.5,4.5,9.3,361 +46,7.08,23.3,3.6,7.8,338 +47,7.16,21.1,4.4,7.3,352 +48,7.03,22.4,4,8.3,319 +49,7.32,23.2,4.5,8.9,346 +50,7.19,20.8,3.9,9.1,331 +51,7.12,22.1,4.6,6.8,340 +52,7.26,22.2,3.3,9.4,356 +53,7.04,21.6,3.8,8.4,322 +54,7.41,23,4.2,7.1,364 +55,7.08,21.7,4.1,8.6,337 +56,7.25,22.8,3.5,9.7,349 +57,7.17,20.6,4.7,7.6,328 +58,7.01,23.4,3.6,6.9,333 +59,6.9,22.5,4.2,6,357 +60,7.29,21.9,4.8,7.9,320 +61,7.19,23.1,3.9,9,342 +62,7.01,21.3,4.3,7.4,326 +63,7.15,22.6,4.5,8.2,355 +64,7.12,22,3.7,8.7,334 +65,6.94,23.2,4,6.6,348 +66,7.36,22.4,4.5,9.4,362 +67,7.02,20.7,3.8,8.2,323 +68,7.26,23.5,4.6,7.5,350 +69,7.08,21.4,3.3,9.1,330 +70,7.14,22.9,4.4,7.1,341 +71,7.31,21.2,3.6,8.8,329 +72,7.03,23,4.8,6.7,345 +73,7.18,22.5,3.5,9.3,358 +74,7.24,20.9,4.6,7.9,332 +75,7.14,22.8,4.2,8.5,347 +76,7.06,22.1,3.9,8,321 +77,7.29,23.3,3.4,9.5,351 +78,7.12,21.7,4.7,7.4,330 +79,7.01,22.6,3.2,8.2,339 +80,7.35,22.1,4.5,9.2,359 +81,7.04,23.1,4,6.4,324 +82,7.16,21.3,3.8,7.7,346 +83,7.22,22.3,4.3,8.9,329 +84,7.13,20.7,4.1,8.4,337 +85,7.25,23,3.9,9.6,354 +86,7.09,22.2,4.4,7,333 +87,7.19,21.1,3.3,9,348 +88,7.08,22.7,4.6,7.8,331 +89,7.37,22.4,3.7,9.1,362 +90,7.12,21.8,4.5,8.6,340 +91,7.27,23.4,4.2,7.2,327 +92,7.04,21.5,4.8,6.8,342 +93,7.15,23.1,4.4,8.1,355 +94,7.21,22.5,3.6,8.7,338 +95,6.98,21.9,4,8.9,328 +96,7.34,23.2,4.6,8.3,365 +97,7.02,21,3.9,7.5,332 +98,7.26,22.8,3.2,9.2,358 +99,7.09,23,4.3,7.3,327 +100,7.13,21.6,4.7,7.8,350 +101,7.16,22.2,3.3,8.9,331 +102,7.21,21.4,4.2,7.4,347 +103,7.32,23.3,4.1,9.5,366 +104,7.05,20.9,3.7,8.1,339 +105,7.13,22.5,4.3,7.9,326 +106,7.25,21.9,3.5,9.3,350 +107,7.08,23.1,4.5,6.5,319 +108,7.19,22,4.7,7.8,343 +109,7.01,20.8,3.6,8.4,330 +110,7.33,22.4,4.8,9,360 +111,7.07,23.2,3.5,7.7,327 +112,7.17,21.6,4.5,8.5,345 +113,7.23,22.9,3.6,9.1,352 +114,7.14,20.5,4.4,7.6,334 +115,7.26,23.4,3.3,9.4,357 +116,7.09,22.1,4.1,7,329 +117,7.2,21.3,4.4,8.2,346 +118,7.05,22.7,4.7,7.2,335 +119,7.38,21.5,3.9,9.6,364 +120,7.11,22.6,4.2,8.8,341 +121,7.28,20.7,3.8,9.2,353 +122,7.03,23.3,4.3,6.9,322 +123,7.15,21.2,3.4,8,344 +124,7.21,22.4,4.6,8.6,326 +125,7.12,23,3.1,9.4,356 +126,7,22.3,4.5,6.3,328 +127,7.34,21.1,3.7,9.1,361 +128,7.02,22.9,4.1,7.5,338 +129,7.24,21.8,4.4,8.3,347 +130,7.1,23.4,4.8,7.7,331 +131,7.16,20.4,3.8,8.7,329 +132,7.29,22.3,4.2,9.3,357 +133,7.01,21.6,4.3,7.2,326 +134,7.18,23.1,3.7,9,348 +135,7.13,21.3,4.5,8.1,335 +136,7.24,22.5,3.9,9.5,353 +137,7.05,20.8,4.6,7.6,329 +138,7.2,23.4,4.1,8.8,342 +139,7.1,22.6,3.8,8.3,336 +140,7.33,21.2,4.4,9.7,365 +141,7.07,23,3.4,7.9,324 +142,7.21,21.7,4.5,8.7,349 +143,7.23,22.1,3.6,9.4,356 +144,7.16,20.6,4.2,7.8,331 +145,7.28,23.3,3.4,9.1,358 +146,7.09,21.9,4.8,7.3,332 +147,7.22,20.5,4.6,8.4,344 +148,7.04,22.8,3.5,8.2,336 +149,7.35,21.4,3.9,9.8,367 +150,7.08,22.2,4.3,7.5,327 +151,7.26,21,3.8,9.3,354 +152,7.03,23.2,4.1,6.8,323 +153,7.15,21.1,4.7,7.7,345 +154,7.19,22.5,3.1,9.6,351 +155,7.11,22.9,4.4,8,339 +156,7.01,20.9,4.8,6.9,328 +157,7.31,21.6,3.6,9.2,359 +158,7.02,22.2,4.5,7.4,337 +159,7.25,21.8,4.2,8.9,346 +160,7.12,23.5,4.6,7.9,333 +161,7.17,21.4,3.9,8.5,331 +162,7.29,20.8,4.7,9.6,363 +163,7.01,22.3,4.5,7.8,328 +164,7.18,23,4.1,8.9,347 +165,7.14,20.5,3.6,8,333 +166,7.25,21.3,4.4,9.4,352 +167,7.05,22.6,3.9,7.3,325 +168,7.2,21.2,4.6,8.6,345 +169,7.1,22.9,3.7,8.1,335 +170,7.33,23.4,4.5,9.9,370 +171,7.07,20.6,3.5,7.7,329 +172,7.21,22.1,4.2,8.8,350 +173,7.23,23.3,4.6,9.7,359 +174,7.16,21.8,4,8.3,339 +175,7.28,20.9,4.3,9.2,360 +176,7.09,22.2,3.7,7.9,331 +177,7.22,23.1,4.4,8.5,355 +178,7.04,20.8,4.1,7.5,332 +179,7.35,22.5,3.8,9.8,370 +180,7.08,21.7,4.6,7.4,330 +181,7.26,23,3.9,9.5,357 +182,7.03,20.7,4.4,7.1,327 +183,7.15,22.1,3.8,8.1,342 +184,7.19,23.2,4.3,9,351 +185,7.11,21.3,4.5,7.9,334 +186,7.01,22,3.6,7.1,327 +187,7.31,21.5,4.7,9.4,364 +188,7.02,23.1,4.1,6.8,322 +189,7.25,20.7,4.6,8.7,346 +190,7.12,22.4,3.5,8.2,338 +191,7.09,21.9,4.2,8.2,336 +192,7.16,22.5,3.9,8.4,340 +193,7.2,21.7,4.1,8.6,347 +194,7.08,23.5,3.8,7.8,330 +195,7.32,20.5,4.2,9.8,369 +196,7.14,21.2,4.3,8.1,340 +197,7.05,22.8,3.6,7.4,328 +198,7.25,23.2,4.4,9.3,357 +199,7.19,21.6,4.6,8.7,344 +200,7.1,22.7,3.5,7.9,335 +201,7.16,21.8,4.2,8.4,342 +202,7.29,23.1,3.8,9.3,357 +203,7.01,21.3,4.3,7.9,328 +204,7.18,22.2,3.9,8.5,347 +205,7.14,23.4,4.7,8.8,353 +206,7.25,20.6,4.5,9.2,349 +207,7.05,22.5,3.7,7.5,330 +208,7.2,21.9,4.6,8.1,341 +209,7.1,23,4.1,9,356 +210,7.33,20.9,4.4,9.7,366 +211,7.07,22.1,3.8,7.7,331 +212,7.21,23.3,4.3,8.9,358 +213,7.23,20.8,4.2,8.6,345 +214,7.16,22.6,3.6,9.1,335 +215,7.28,21.2,4.5,8.3,348 +216,7.09,22.9,3.9,9.4,362 +217,7.22,20.5,4.6,8.2,344 +218,7.04,23,3.7,7.8,330 +219,7.35,21.6,4.4,9.5,369 +220,7.08,22.3,3.8,8,333 +221,7.26,23.2,4.3,9.6,359 +222,7.03,21.1,4.2,7.6,324 +223,7.15,22.7,3.9,8.9,347 +224,7.19,21.4,4.5,7.8,336 +225,7.11,23.5,3.6,9.2,355 +226,7.01,20.7,4.7,7.2,331 +227,7.31,22.4,4.4,8.7,348 +228,7.02,23,3.8,9.3,361 +229,7.25,21.8,4.6,7.5,335 +230,7.12,22.3,4.1,8.8,343 +231,7.16,20.8,3.9,8.3,339 +232,7.29,22.7,4.5,9.4,364 +233,7.01,21.4,4.2,7.7,327 +234,7.18,23.2,3.6,9.1,351 +235,7.14,20.9,4.4,7.9,336 +236,7.25,22.6,3.8,8.4,344 +237,7.05,21.1,4.7,8.2,333 +238,7.2,23.4,4.3,9.5,360 +239,7.1,21.9,3.9,8.7,342 +240,7.33,22.5,4.6,9.9,370 +241,7.07,23.3,3.8,8,345 +242,7.21,20.8,4.5,9.3,359 +243,7.23,22.3,4.1,8.9,355 +244,7.16,21.6,4.4,8.1,338 +245,7.28,23.1,3.7,9.6,367 +246,7.09,20.4,4.6,7.5,329 +247,7.22,22,4.3,8.6,347 +248,7.04,23.2,3.9,7.8,332 +249,7.35,21.5,4.7,9.7,366 +250,7.08,22.6,3.8,8.2,340 +251,7.26,21.3,4.5,9.2,358 +252,7.03,22.2,4.2,7.6,329 +253,7.15,23,3.6,9.1,353 +254,7.19,20.6,4.4,8.5,342 +255,7.11,22.5,3.9,9.4,363 +256,7.01,21.2,4.6,7.8,328 +257,7.31,23.3,4.1,9.2,362 +258,7.02,20.9,4.5,8.7,337 +259,7.25,22.8,3.8,9.5,359 +260,7.12,21.4,4.3,7.9,336 +261,7.16,22.1,3.9,8.3,342 +262,7.29,20.8,4.6,9.2,355 +263,7.01,22.3,4.3,7.7,329 +264,7.18,23,3.7,9.1,352 +265,7.14,20.5,4.5,7.9,334 +266,7.25,21.3,4.2,8.4,346 +267,7.05,22.6,3.8,7.5,328 +268,7.2,21.2,4.7,8.1,341 +269,7.1,22.9,3.9,8.7,348 +270,7.33,23.4,4.6,9.8,368 +271,7.07,20.6,3.8,7.7,331 +272,7.21,22.1,4.5,8.9,355 +273,7.23,23.3,4.2,8.6,351 +274,7.16,20.8,4.3,8,332 +275,7.28,23,3.6,9.4,362 +276,7.09,21.9,4.5,7.8,338 +277,7.22,20.5,4.4,8.5,345 +278,7.04,22.8,3.7,8.2,333 +279,7.35,21.4,4.6,9.7,370 +280,7.08,22.2,3.9,7.9,335 +281,7.26,21,4.5,9.3,359 +282,7.03,23.2,4.2,7.6,327 +283,7.15,21.1,4.1,8.3,342 +284,7.19,22.5,4.3,9,351 +285,7.11,22.9,3.8,8,339 +286,7.01,20.9,4.6,7.2,328 +287,7.31,21.6,3.9,9.2,358 +288,7.02,22.2,4.4,7.4,337 +289,7.25,21.8,4.1,8.9,345 +290,7.12,23.5,4.5,7.9,333 +291,7.16,21.3,4,8.3,341 +292,7.29,22.4,4.7,9.2,360 +293,7.01,21,4.5,7.7,328 +294,7.18,23.2,3.9,9.1,353 +295,7.14,20.9,4.4,7.9,336 +296,7.25,22.5,3.8,8.4,343 +297,7.05,21.1,4.3,7.5,330 +298,7.2,22.9,4.6,8.1,346 +299,7.1,21.8,3.9,8.7,342 +300,7.33,23.1,4.5,9.8,366 +301,7.07,20.7,3.8,7.7,331 +302,7.21,22.6,4.5,8.9,356 +303,7.23,21.2,4.2,8.6,344 +304,7.16,23,3.6,9.1,354 +305,7.28,20.8,4.5,9.5,361 +306,7.09,22.3,3.9,9.4,363 +307,7.22,23.2,4.3,8.5,350 +308,7.04,20.6,4.4,7.8,335 +309,7.35,22.1,3.7,9.7,368 +310,7.08,23.4,4.6,8.2,349 +311,7.26,21.3,3.9,9.2,359 +312,7.03,22,4.2,7.6,328 +313,7.15,23.1,3.6,8.9,352 +314,7.19,21.4,4.3,7.8,336 +315,7.11,22.7,4.5,8.3,347 +316,7.01,20.8,4.6,7.1,327 +317,7.31,22.5,3.8,9.4,362 +318,7.02,21.2,4.7,7.5,334 +319,7.25,23,3.9,8.7,358 +320,7.12,20.9,4.4,8.2,339 +321,7.16,21.7,4.1,8.3,344 +322,7.29,22.8,4.8,9.2,361 +323,7.01,21.4,4.6,7.7,329 +324,7.18,23.1,4,9.1,354 +325,7.14,20.7,4.4,7.9,336 +326,7.25,22.3,3.8,8.4,344 +327,7.05,21,4.3,7.5,329 +328,7.2,22.9,4.7,8.1,347 +329,7.1,21.8,4,8.7,343 +330,7.33,23.2,4.6,9.8,367 +331,7.07,20.8,3.8,7.7,332 +332,7.21,22.4,4.5,8.9,356 +333,7.23,21.2,4.2,8.6,343 +334,7.16,23,3.6,9.1,354 +335,7.28,20.9,4.5,9.5,362 +336,7.09,22.5,3.9,9.4,363 +337,7.22,23.3,4.3,8.5,350 +338,7.04,20.7,4.4,7.8,335 +339,7.35,22.6,3.7,9.7,369 +340,7.08,21.3,4.6,8.2,340 +341,7.26,23.1,3.9,9.2,360 +342,7.03,22,4.2,7.6,330 +343,7.15,23.2,3.6,8.9,353 +344,7.19,21.4,4.3,7.8,336 +345,7.11,22.7,4.5,8.3,347 +346,7.01,20.8,4.6,7.1,327 +347,7.31,22.5,3.8,9.4,361 +348,7.02,21.2,4.7,7.5,334 +349,7.25,23,3.9,8.7,359 +350,7.12,20.9,4.4,8.2,339 +351,7.16,21.7,4.1,8.3,344 +352,7.29,22.8,4.8,9.2,361 +353,7.01,21.4,4.6,7.7,329 +354,7.18,23.1,4,9.1,354 +355,7.14,20.7,4.4,7.9,336 +356,7.25,22.3,3.8,8.4,344 +357,7.05,21,4.3,7.5,329 +358,7.2,22.9,4.7,8.1,347 +359,7.1,21.8,4,8.7,343 +360,7.33,23.2,4.6,9.8,367 +361,7.07,20.8,3.8,7.7,332 +362,7.21,22.4,4.5,8.9,356 +363,7.23,21.2,4.2,8.6,343 +364,7.16,23,3.6,9.1,354 +365,7.28,20.9,4.5,9.5,362 +366,7.09,22.5,3.9,9.4,363 +367,7.22,23.3,4.3,8.5,350 +368,7.04,20.7,4.4,7.8,335 +369,7.35,22.6,3.7,9.7,369 +370,7.08,21.3,4.6,8.2,340 +371,7.26,23.1,3.9,9.2,360 +372,7.03,22,4.2,7.6,330 +373,7.15,23.2,3.6,8.9,353 +374,7.19,21.4,4.3,7.8,336 +375,7.11,22.7,4.5,8.3,347 +376,7.01,20.8,4.6,7.1,327 +377,7.31,22.5,3.8,9.4,361 +378,7.02,21.2,4.7,7.5,334 +379,7.25,23,3.9,8.7,359 +380,7.12,20.9,4.4,8.2,339 +381,7.16,21.7,4.1,8.3,344 +382,7.29,22.8,4.8,9.2,361 +383,7.01,21.4,4.6,7.7,329 +384,7.18,23.1,4,9.1,354 +385,7.14,20.7,4.4,7.9,336 +386,7.25,22.3,3.8,8.4,344 +387,7.05,21,4.3,7.5,329 +388,7.2,22.9,4.7,8.1,347 +389,7.1,21.8,4,8.7,343 +390,7.33,23.2,4.6,9.8,367 +391,7.07,20.8,3.8,7.7,332 +392,7.21,22.4,4.5,8.9,356 +393,7.23,21.2,4.2,8.6,343 +394,7.16,23,3.6,9.1,354 +395,7.28,20.9,4.5,9.5,362 +396,7.09,22.5,3.9,9.4,363 +397,7.22,23.3,4.3,8.5,350 +398,7.04,20.7,4.4,7.8,335 +399,7.35,22.6,3.7,9.7,369 +400,7.08,21.3,4.6,8.2,340 +401,7.26,23.1,3.9,9.2,360 +402,7.03,22,4.2,7.6,330 +403,7.15,23.2,3.6,8.9,353 +404,7.19,21.4,4.3,7.8,336 +405,7.11,22.7,4.5,8.3,347 +406,7.01,20.8,4.6,7.1,327 +407,7.31,22.5,3.8,9.4,361 +408,7.02,21.2,4.7,7.5,334 +409,7.25,23,3.9,8.7,359 +410,7.12,20.9,4.4,8.2,339 +411,7.16,21.7,4.1,8.3,344 +412,7.29,22.8,4.8,9.2,361 +413,7.01,21.4,4.6,7.7,329 +414,7.18,23.1,4,9.1,354 +415,7.14,20.7,4.4,7.9,336 +416,7.25,22.3,3.8,8.4,344 +417,7.05,21,4.3,7.5,329 +418,7.2,22.9,4.7,8.1,347 +419,7.1,21.8,4,8.7,343 +420,7.33,23.2,4.6,9.8,367 +421,7.07,20.8,3.8,7.7,332 +422,7.21,22.4,4.5,8.9,356 +423,7.23,21.2,4.2,8.6,343 +424,7.16,23,3.6,9.1,354 +425,7.28,20.9,4.5,9.5,362 +426,7.09,22.5,3.9,9.4,363 +427,7.22,23.3,4.3,8.5,350 +428,7.04,20.7,4.4,7.8,335 +429,7.35,22.6,3.7,9.7,369 +430,7.08,21.3,4.6,8.2,340 +431,7.26,23.1,3.9,9.2,360 +432,7.03,22,4.2,7.6,330 +433,7.15,23.2,3.6,8.9,353 +434,7.19,21.4,4.3,7.8,336 +435,7.11,22.7,4.5,8.3,347 +436,7.01,20.8,4.6,7.1,327 +437,7.31,22.5,3.8,9.4,361 +438,7.02,21.2,4.7,7.5,334 +439,7.25,23,3.9,8.7,359 +440,7.12,20.9,4.4,8.2,339 +441,7.16,21.7,4.1,8.3,344 +442,7.29,22.8,4.8,9.2,361 +443,7.01,21.4,4.6,7.7,329 +444,7.18,23.1,4,9.1,354 +445,7.14,20.7,4.4,7.9,336 +446,7.25,22.3,3.8,8.4,344 +447,7.05,21,4.3,7.5,329 +448,7.2,22.9,4.7,8.1,347 +449,7.1,21.8,4,8.7,343 +450,7.33,23.2,4.6,9.8,367 +451,7.07,20.8,3.8,7.7,332 +452,7.21,22.4,4.5,8.9,356 +453,7.23,21.2,4.2,8.6,343 +454,7.16,23,3.6,9.1,354 +455,7.28,20.9,4.5,9.5,362 +456,7.09,22.5,3.9,9.4,363 +457,7.22,23.3,4.3,8.5,350 +458,7.04,20.7,4.4,7.8,335 +459,7.35,22.6,3.7,9.7,369 +460,7.08,21.3,4.6,8.2,340 +461,7.26,23.1,3.9,9.2,360 +462,7.03,22,4.2,7.6,330 +463,7.15,23.2,3.6,8.9,353 +464,7.19,21.4,4.3,7.8,336 +465,7.11,22.7,4.5,8.3,347 +466,7.01,20.8,4.6,7.1,327 +467,7.31,22.5,3.8,9.4,361 +468,7.02,21.2,4.7,7.5,334 +469,7.25,23,3.9,8.7,359 +470,7.12,20.9,4.4,8.2,339 +471,7.16,21.7,4.1,8.3,344 +472,7.29,22.8,4.8,9.2,361 +473,7.01,21.4,4.6,7.7,329 +474,7.18,23.1,4,9.1,354 +475,7.14,20.7,4.4,7.9,336 +476,7.25,22.3,3.8,8.4,344 +477,7.05,21,4.3,7.5,329 +478,7.2,22.9,4.7,8.1,347 +479,7.1,21.8,4,8.7,343 +480,7.33,23.2,4.6,9.8,367 +481,7.07,20.8,3.8,7.7,332 +482,7.21,22.4,4.5,8.9,356 +483,7.23,21.2,4.2,8.6,343 +484,7.16,23,3.6,9.1,354 +485,7.28,20.9,4.5,9.5,362 +486,7.09,22.5,3.9,9.4,363 +487,7.22,23.3,4.3,8.5,350 +488,7.04,20.7,4.4,7.8,335 +489,7.35,22.6,3.7,9.7,369 +490,7.08,21.3,4.6,8.2,340 +491,7.26,23.1,3.9,9.2,360 +492,7.03,22,4.2,7.6,330 +493,7.15,23.2,3.6,8.9,353 +494,7.19,21.4,4.3,7.8,336 +495,7.11,22.7,4.5,8.3,347 +496,7.01,20.8,4.6,7.1,327 +497,7.31,22.5,3.8,9.4,361 +498,7.02,21.2,4.7,7.5,334 +499,7.25,23,3.9,8.7,359 +500,7.12,20.9,4.4,8.2,339 diff --git a/app/train_cnn.py b/app/train_cnn.py new file mode 100644 index 000000000..9e10096c0 --- /dev/null +++ b/app/train_cnn.py @@ -0,0 +1,144 @@ +import tensorflow as tf +from tensorflow.keras.models import Model +from tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout, Input +from tensorflow.keras.applications import ResNet50 +from tensorflow.keras.preprocessing.image import ImageDataGenerator +from tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping +import matplotlib.pyplot as plt +import numpy as np + +# Parameters +IMG_HEIGHT, IMG_WIDTH = 224, 224 +NUM_CLASSES = 4 # plastic, metal, biomedical, shoes +BATCH_SIZE = 32 # Increased for stability +EPOCHS = 30 +DATASET_DIR = 'c:/proj1/dataset/' + +# Custom multi-label generator wrapper +def convert_to_multilabel(generator): + while True: + images, labels = next(generator) + # Convert one-hot to multi-label (soften labels) + labels = np.where(labels > 0.5, 1, labels * 0.5) # Allow partial multi-label + yield images, labels + +# Data generator with balanced augmentation +datagen = ImageDataGenerator( + rescale=1./255, + validation_split=0.2, + rotation_range=20, # Reduced to avoid excessive distortion + width_shift_range=0.2, + height_shift_range=0.2, + shear_range=0.2, + zoom_range=0.2, + horizontal_flip=True, + fill_mode='nearest' +) + +train_generator_base = datagen.flow_from_directory( + DATASET_DIR, + target_size=(IMG_HEIGHT, IMG_WIDTH), + batch_size=BATCH_SIZE, + class_mode='categorical', + subset='training', + classes=['plastic', 'metal', 'biomedical', 'shoes'], + shuffle=True +) + +validation_generator_base = datagen.flow_from_directory( + DATASET_DIR, + target_size=(IMG_HEIGHT, IMG_WIDTH), + batch_size=BATCH_SIZE, + class_mode='categorical', + subset='validation', + classes=['plastic', 'metal', 'biomedical', 'shoes'], + shuffle=True # Shuffle validation too +) + +# Wrap generators for multi-label +train_generator = convert_to_multilabel(train_generator_base) +validation_generator = convert_to_multilabel(validation_generator_base) + +# Build model with ResNet50 +base_model = ResNet50(weights='imagenet', include_top=False, input_tensor=Input(shape=(IMG_HEIGHT, IMG_WIDTH, 3))) +x = base_model.output +x = GlobalAveragePooling2D()(x) +x = Dense(512, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.001))(x) # Reduced L2 +x = Dropout(0.3)(x) # Reduced dropout +predictions = Dense(NUM_CLASSES, activation='sigmoid')(x) + +model = Model(inputs=base_model.input, outputs=predictions) + +# Freeze fewer layers initially +for layer in base_model.layers[:-50]: # Unfreeze more early + layer.trainable = False + +# Compile with balanced learning rate +model.compile( + optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), + loss='binary_crossentropy', + metrics=['accuracy', tf.keras.metrics.AUC(multi_label=True)] +) + +# Callbacks +reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3, min_lr=1e-6, verbose=1) +early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True, verbose=1) + +# Train initial layers +history = model.fit( + train_generator, + steps_per_epoch=max(1, train_generator_base.samples // BATCH_SIZE), + epochs=15, + validation_data=validation_generator, + validation_steps=max(1, validation_generator_base.samples // BATCH_SIZE), + callbacks=[reduce_lr, early_stopping] +) + +# Unfreeze more layers +for layer in base_model.layers[-70:]: # Unfreeze more for fine-tuning + layer.trainable = True + +# Recompile +model.compile( + optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001), + loss='binary_crossentropy', + metrics=['accuracy', tf.keras.metrics.AUC(multi_label=True)] +) + +# Fine-tune +history_fine = model.fit( + train_generator, + steps_per_epoch=max(1, train_generator_base.samples // BATCH_SIZE), + epochs=EPOCHS, + validation_data=validation_generator, + validation_steps=max(1, validation_generator_base.samples // BATCH_SIZE), + initial_epoch=history.epoch[-1] + 1, + callbacks=[reduce_lr, early_stopping] +) + +# Save the model +model.save('c:/proj1/waste_cnn_model.h5') +print("Model saved as 'c:/proj1/waste_cnn_model.h5'") + +# Plot accuracy and AUC +plt.plot(history.history['accuracy'] + history_fine.history['accuracy'], label='Training Accuracy') +plt.plot(history.history['val_accuracy'] + history_fine.history['val_accuracy'], label='Validation Accuracy') +plt.title('Model Accuracy') +plt.xlabel('Epoch') +plt.ylabel('Accuracy') +plt.legend() +plt.show() + +plt.plot(history.history['auc'] + history_fine.history['auc'], label='Training AUC') +plt.plot(history.history['val_auc'] + history_fine.history['val_auc'], label='Validation AUC') +plt.title('Model AUC') +plt.xlabel('Epoch') +plt.ylabel('AUC') +plt.legend() +plt.show() + +# Evaluate +val_loss, val_accuracy, val_auc = model.evaluate(validation_generator_base) # Use base for evaluation +print(f"Validation Loss: {val_loss}") +print(f"Validation Accuracy: {val_accuracy}") +print(f"Validation AUC: {val_auc}") \ No newline at end of file diff --git a/auth.py b/auth.py new file mode 100644 index 000000000..cfaa90ff8 --- /dev/null +++ b/auth.py @@ -0,0 +1,15 @@ +from flask import session + +def authenticate(username, password, users_collection): # Pass collection as parameter + user = users_collection.find_one({'username': username, 'password': password}) + if user: + session["user"] = username + session["role"] = user.get("role", "user") + return True + return False + +def is_authenticated(): + return "user" in session + +def get_role(): + return session.get("role", "user") \ No newline at end of file diff --git a/check.py b/check.py new file mode 100644 index 000000000..71afb91e8 --- /dev/null +++ b/check.py @@ -0,0 +1,11 @@ +from pymongo import MongoClient + +# Replace with your actual connection string +MONGO_URI = "mongodb+srv://flaskuser9249:9249@flask1.w9mtn.mongodb.net/?retryWrites=true&w=majority&appName=Flask1" + +try: + client = MongoClient(MONGO_URI) + db = client.list_database_names() + print("Connected to MongoDB! Databases:", db) +except Exception as e: + print("Error:", e) \ No newline at end of file diff --git a/database.py b/database.py new file mode 100644 index 000000000..7ffd54467 --- /dev/null +++ b/database.py @@ -0,0 +1,27 @@ +from pymongo import MongoClient + +# Your friend's exact URI with database name specified +MONGO_URI = "mongodb+srv://flaskuser9249:9249@flask1.w9mtn.mongodb.net/?retryWrites=true&w=majority&appName=Flask1" + +# Initialize MongoDB client +client = MongoClient(MONGO_URI) +db = client["sample_mflix"] # ✅ Correct database name +collection = db["embedded_movies"] # Collection name + +# Sample data (run once, then comment out) +sample_users = [ + {"username": "user1", "password": "pass123", "role": "user"}, + {"username": "admin1", "password": "admin123", "role": "admin"} +] +# users_collection.insert_many(sample_users) # Uncomment to seed data, then re-comment +users_collection = db["users"] +admins_collection = db["admins"] +canal_data_collection = db["canal_data"] +def get_users_collection(): + return users_collection +def get_admins_collection(): + return admins_collection +def get_canal_data_collection(): + return canal_data_collection +def get_subscribe_collection(): + return db["subscribe"] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..e69de29bb diff --git a/run.py b/run.py new file mode 100644 index 000000000..dfeab3d27 --- /dev/null +++ b/run.py @@ -0,0 +1,11 @@ +from flask import Flask +from app.routes import init_routes # We'll define this function in routes.py + +app = Flask(__name__, template_folder='app/templates') +app.secret_key = "your-secret-key" # Set a secret key for session management (use env variable in production) + +# Initialize routes +init_routes(app) + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file diff --git a/templates/admin_home.html b/templates/admin_home.html new file mode 100644 index 000000000..411aa6955 --- /dev/null +++ b/templates/admin_home.html @@ -0,0 +1,80 @@ +{% extends 'base.html' %} +{% block head %} + +{% endblock %} +{% block content %} +
+
+

Welcome, Admin {{ session['user'] }}!

+

You have successfully logged in to the admin dashboard.

+ {% if heatmap_url %} +

Admin Activity Heatmap

+ Heatmap + {% else %} +

No data available for heatmap.

+ {% endif %} +

Admin Functions:

+
    +
  • View all users (future feature).
  • +
  • Manage permissions (future feature).
  • +
+ Logout +
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/admin_login.html b/templates/admin_login.html new file mode 100644 index 000000000..ef24c1465 --- /dev/null +++ b/templates/admin_login.html @@ -0,0 +1,40 @@ +{% extends 'base.html' %} +{% block head %} + + +{% endblock %} +{% block content %} +
+ +
+{% endblock %} \ No newline at end of file diff --git a/templates/admin_signup.html b/templates/admin_signup.html new file mode 100644 index 000000000..1bb5fe16c --- /dev/null +++ b/templates/admin_signup.html @@ -0,0 +1,39 @@ +{% extends 'base.html' %} +{% block head %} + + +{% endblock %} +{% block content %} +
+ +
+{% endblock %} diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 000000000..e69de29bb diff --git a/templates/buy.html b/templates/buy.html new file mode 100644 index 000000000..e69de29bb diff --git a/templates/buy_sell.html b/templates/buy_sell.html new file mode 100644 index 000000000..e69de29bb diff --git a/templates/dashboard.html b/templates/dashboard.html new file mode 100644 index 000000000..9dfbad6c1 --- /dev/null +++ b/templates/dashboard.html @@ -0,0 +1,849 @@ + + + + + + + Aquaclense Dashboard + + + + + + + +
+
+
+

Welcome to Aquaclense

+

Revolutionizing water purification with innovative solutions for a cleaner, sustainable future.

+ Learn More +
+
+ Aquaclense Technology +
+
+
+
+ +
+
+

What's Aquaclense

+

Aquaclense is an innovative water purification solution designed to provide clean, safe drinking water for households and communities.

+
+ +
+
+
+ +
+
+

Advanced Filtration

+

Using cutting-edge technology to remove impurities and contaminants, ensuring every drop is pure and refreshing.

+
+
+ +
+
+ +
+
+

Eco-Friendly

+

Sustainable solutions that protect our environment while providing clean water for generations to come.

+
+
+ +
+
+ +
+
+

Global Impact

+

Join our mission to make clean water accessible to communities around the world.

+
+
+
+ +
+

Upload Waste Images

+ {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + {% endwith %} + +
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + Drag & drop files or click to browse + +
+
+ + +
+
+
+ +
+
+

Our Vision and Mission

+
+ +
+
+
+ +
+
+

Vision

+

To create a world where everyone has access to clean, sustainable water resources, fostering health and well-being for generations to come.

+
+
+ +
+
+ +
+
+

Mission

+

We are committed to developing cutting-edge water purification technologies, promoting environmental stewardship, and empowering communities through education and innovation.

+
+
+
+
+ +
+
+
+

Waste Marketplace

+

AquaClense is not just a waste management platform—we are revolutionizing the way waste is bought and sold!

+
+ +
+
+
+ +
+
+

Buy Waste

+

Find quality recyclable materials for your business needs. Direct transactions with verified sellers.

+ Explore Marketplace +
+
+ +
+
+ +
+
+

Sell Waste

+

Turn your waste into profit. Connect with buyers looking for your recyclable materials.

+ Start Selling +
+
+ +
+
+ +
+
+

Recycling Measures

+

Track your environmental impact and contribute to a cleaner future with our advanced metrics.

+ View Metrics +
+
+
+
+
+ + + + diff --git a/templates/home.html b/templates/home.html new file mode 100644 index 000000000..e69de29bb diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 000000000..e69de29bb diff --git a/templates/product1.html b/templates/product1.html new file mode 100644 index 000000000..6bfdd4aaf --- /dev/null +++ b/templates/product1.html @@ -0,0 +1,380 @@ + + + + + + AquaClense 1.0 - The Beginning + + + + + + + +
+

AquaClense 1.0 - The Beginning

+

+ A revolutionary solution for effective and affordable waste management in water bodies and canals +

+
+ +
+

Revolutionizing Waste Management

+

+ AquaClense 1.0 marks the dawn of a revolutionary era in waste management, targeting the heart of the problem—canals and water bodies. These neglected arteries of our planet are where waste accumulates most aggressively, choking ecosystems and threatening communities. Our solution is engineered to tackle this crisis head-on, focusing on efficiency, innovation, and affordability. +

+ +
+
+
+

A Game-Changer for Canals and Water Bodies

+

+ AquaClense 1.0 is not just a product—it's a vision brought to life. Designed specifically for canals and water bodies, it addresses the rampant waste buildup that traditional methods fail to manage. At its core is a powerful suction pump that effortlessly extracts waste—plastic, shoes, metal, and more—depositing it into a sturdy holding bin. From there, our cost-effective removal system kicks in: a simple shovel clears the bin, ensuring operational simplicity without breaking the bank. For height adjustments, a manual pulley system offers precision and control, adaptable to any canal depth. +

+
+
+ +
+
+

Evolving to AquaClense 1.1

+

+ Looking ahead, AquaClense 1.1 takes innovation further. For regions where manual pulleys prove labor-intensive, we introduce a conveyor belt system paired with a motorized, sensor-controlled automatic pulley. This upgrade minimizes human effort, maximizes efficiency, and ensures waste removal is seamless, even in the most challenging environments. Imagine a system so intuitive it anticipates waste levels and adjusts itself— that's the future we're building. +

+
+
+
+ +
+ AquaClense 1.1 +

AquaClense 1.1: The Next Evolution in Waste Management

+
+ +

Global Impact, Local Solutions

+

+ In countries like Malaysia, where canals and rivers such as the Klang River and Malacca River drown under heaps of waste, AquaClense shines as a beacon of hope. With electricity costs in these regions being remarkably low, our solution leverages this advantage to deliver unmatched efficiency. The suction pump and motorized pulley operate at minimal expense, making AquaClense a financially viable choice for governments and businesses alike. This isn't just a product—it's a lifeline for communities suffocating under waste, transforming polluted waterways into thriving ecosystems once more. +

+ +
+
+

The AquaClense Advantage

+

+ Investing in AquaClense 1.0 and its 1.1 evolution isn't just a financial decision—it's a stake in the future. By replacing backbreaking manual labor with a smart, automated system, we slash operational costs by up to 60% compared to traditional methods. The suction pump's relentless efficiency clears waste faster than any human crew, while the bin-and-shovel approach—or the advanced conveyor belt—ensures scalability without complexity. In regions plagued by canal waste, AquaClense delivers results that speak louder than promises: cleaner water, healthier communities, and a profitable return on investment. This is your chance to back a product that doesn't just solve a problem—it redefines the industry. +

+
+
+ +
+

Request Your Personalized Quote

+
+ {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + {% endwith %} +
+
+ + +
+ +
+

You'll receive a comprehensive quote with pricing details, implementation timeline, and ROI analysis.

+
+
+
+ + diff --git a/templates/product2.html b/templates/product2.html new file mode 100644 index 000000000..c0add19aa --- /dev/null +++ b/templates/product2.html @@ -0,0 +1,166 @@ + + + + + + AquaClense 2.0 - The Revolution + + + + + + +
+

AquaClense 2.0 - The Revolution

+

+ AquaClense 2.0 heralds a groundbreaking revolution in oceanic waste management. Unlike any other solution, this product harnesses the natural power of ocean waves to collect waste efficiently. As waves crash against our shores, they bring with them a tide of debris—plastic, metal, and more. AquaClense 2.0 turns this relentless force into an ally, capturing waste where it’s most abundant and most destructive: our oceans. +

+ +

Why Oceans Matter—And Why You Should Act Now

+

+ Oceans cover over 70% of our planet, yet they’re drowning in pollution. Every year, millions of tons of waste wash into these vital ecosystems, threatening marine life, disrupting food chains, and poisoning the very water we depend on. AquaClense 2.0 isn’t just a product—it’s a desperate call to action. Consider these urgent questions: +

+
+

Q: How much waste enters our oceans daily?
A: Over 20 million pounds—enough to fill 1,000 garbage trucks every single day.

+

Q: What happens if we don’t act?
A: By 2050, plastic could outweigh fish in the ocean, leaving ecosystems in ruins and seafood unsafe.

+

Q: Can we afford to wait?
A: No. Every minute lost is another wave of waste crashing in—there’s no time left for hesitation.

+
+

+ With oceans spiraling into chaos, AquaClense 2.0 is the lifeline we can’t ignore. It’s not just a solution—it’s the only way forward. +

+ +

The Comeback Solution to Problems

+

+ AquaClense 2.0 redefines efficiency with a setup so ingenious, it needs no motor for suction. Waves hit a spring-based flap mechanism, which opens effortlessly to let waste fall into a filter-like bin below. From there, a conveyor belt—powered by a low-energy, electricity-sipping motor—lifts the debris into a collection bin above. This minimalist design slashes power costs and maintenance, making it ever-lasting and supremely efficient. We’ve widened the setup to capture more waste with every wave, ensuring maximum collection without compromise. +

+
+ AquaClense 2.0 +

AquaClense 2.0: Harnessing Waves to Clean Oceans

+
+ +

A Lifeline for Our Oceans

+

+ Oceans aren’t just water—they’re the heartbeat of life on Earth. They regulate climate, feed billions, and sustain biodiversity. Yet, they’re under siege, choked by waste that manual efforts can’t keep up with. AquaClense 2.0 changes that. Its wave-powered, low-energy design delivers unmatched efficiency, clearing vast swathes of debris without the heavy footprint of traditional systems. This isn’t just a product—it’s a revolution that restores our oceans, protects our future, and turns a global crisis into an opportunity for renewal. +

+ +
+

Get Your Quote Today

+ {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +

{{ message }}

+ {% endfor %} + {% endif %} + {% endwith %} +
+ + + +
+

Note: Price details will be emailed to you.

+
+
+ + \ No newline at end of file diff --git a/templates/product3.html b/templates/product3.html new file mode 100644 index 000000000..9faa07a4d --- /dev/null +++ b/templates/product3.html @@ -0,0 +1,151 @@ + + + + + + AquaClense 3.0 - More with Physics + + + + + + +
+

AquaClense 3.0 - More with Physics

+

+ AquaClense 3.0 redefines waste management in stagnant water bodies by harnessing the power of physics. Designed for canals and rivers where water stands still, this product uses mathematical precision to induce flow, turning idle waters into efficient waste collection zones. +

+ +

Physics: Solving Real-World Problems

+

+ Physics isn’t just theory—it’s the backbone of practical solutions. From bridges to rockets, it shapes our world by solving complex challenges with elegant precision. AquaClense 3.0 is a shining example: by applying fluid dynamics and mathematical calculations, we transform stagnant water into a flowing system that captures waste effortlessly. In a world drowning in pollution, physics offers a lifeline—precise, predictable, and powerful—making seemingly impossible problems solvable. +

+ +

Features of AquaClense 3.0

+

+ Placed at the center of a canal, AquaClense 3.0 is custom-built to match the canal’s dimensions, ensuring optimal flow production. Using a tapering design, it channels water to accelerate flow toward a collection bin. No motors, no complexity—just pure physics at work. The system’s dimensions are calculated to maximize velocity and refresh rate, ensuring waste is swept into the bin efficiently, ready for removal. +

+
+ AquaClense 3.0 +

AquaClense 3.0: Physics-Driven Waste Management

+
+ +

Case Study: Klang River Implementation

+

+ Consider the Klang River in Malaysia, a waterway choked with 55 tons of plastic waste daily. For a customer here, we tailored AquaClense 3.0 to its specifics. The flow rate, defined as A*V (area × velocity), was calculated precisely. Near the collection bin, the area is 2m × 1.5m = 3m². At the tapering position, velocity reaches approximately 50m³/s (or 800 cuft/s). The channeling section’s area is 20m × 10m × 0.6m = 32m². With a flow rate of 800 cuft/s, the refresh rate cycles at 0.08 Hz—enough to fill the product efficiently. This outflow rate far exceeds the inflow of 55 tons/day, proving AquaClense 3.0’s effectiveness in managing plastic and microplastic pollution, as studied in UiTM-CMT 581 (Environmental Impact of Plastics at Juri and Klang). +

+ +
+

Get Your Quote Now

+ {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +

{{ message }}

+ {% endfor %} + {% endif %} + {% endwith %} +
+ + + +
+

Note: Price details will be emailed to you.

+
+
+ + \ No newline at end of file diff --git a/templates/product4.html b/templates/product4.html new file mode 100644 index 000000000..e9eb69a76 --- /dev/null +++ b/templates/product4.html @@ -0,0 +1,161 @@ + + + + + + AquaClense 4.0 - Stagnant Solutions + + + + + + +
+

AquaClense 4.0 - Stagnant Solutions

+

+ AquaClense 4.0 is engineered for the toughest challenge: water bodies with no natural flow. In stagnant canals, ponds, and reservoirs, waste accumulates relentlessly, choking ecosystems. Our solution uses innovative suction and filtration to clear debris where water refuses to move, offering a lifeline to neglected aquatic environments. +

+ +

Why Stagnant Water Needs AquaClense 4.0

+

+ Stagnant water is a silent crisis—waste sits, festers, and multiplies, turning vital resources into health hazards. AquaClense 4.0 steps in where nature stalls, deploying a low-energy suction system tailored to canal lengths. But why should you care? Here’s why: +

+
+

Q: What happens in stagnant water without intervention?
A: Plastic and organic waste pile up, breeding bacteria and releasing toxins—up to 80% of urban stagnant water bodies are polluted beyond recovery.

+

Q: Can’t we just wait for rain or flow?
A: No—stagnation persists in dry seasons, and waiting means losing ecosystems. Every day counts!

+

Q: Why choose AquaClense 4.0?
A: It’s the only system designed for zero-flow zones, clearing waste fast and efficiently—before it’s too late.

+
+

+ Don’t let stagnation win. AquaClense 4.0 is your answer—act now, or watch your water turn to waste. +

+ +

Features That Deliver

+

+ AquaClense 4.0 adapts to any canal length with a modular suction array, pulling waste into a high-capacity filtration bin. Powered by a minimal-energy pump, it’s built for efficiency and durability. Customizable to your site, it ensures no corner of stagnant water stays untouched. From plastic bottles to microplastics, it captures it all—silently, relentlessly, and without relying on flow. +

+
+ AquaClense 4.0 +

AquaClense 4.0: Conquering Stagnation

+
+ +
+

Get Your Quote Now

+ {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +

{{ message }}

+ {% endfor %} + {% endif %} + {% endwith %} +
+ + + +
+

Note: Price details will be emailed to you.

+
+
+ + \ No newline at end of file diff --git a/templates/recycling_measures.html b/templates/recycling_measures.html new file mode 100644 index 000000000..caf2c806b --- /dev/null +++ b/templates/recycling_measures.html @@ -0,0 +1,134 @@ + + + + + + Recycling Measures - AquaClense + + + + + +
+

Recycling Measures: A Path to Sustainability

+

+ At AquaClense, we believe that waste is not the end—it’s the beginning of a new cycle. Our mission extends beyond purification to empowering communities with the knowledge and tools to manage recyclable waste effectively. This report delves into the recyclability of common waste types—plastic, shoes, and metal—and offers actionable insights based on past data to address high waste generation. Together, we can transform waste into a resource for a cleaner, greener future. +

+ +

The Recyclable Trio: Plastic, Shoes, and Metal

+

+ Waste management begins with understanding what we discard. Plastic, shoes, and metal are among the most prevalent waste categories, each with unique recycling potential. Plastic, omnipresent in modern life, can be melted and reshaped into new products, from packaging to furniture. Shoes, often discarded prematurely, contain recyclable materials like rubber and leather that can be repurposed into playground surfaces or insulation. Metal, a durable and infinitely recyclable resource, powers industries when reclaimed, reducing the need for virgin ore mining. +

+

+ Yet, their potential remains untapped when waste generation outpaces recycling efforts. Our past data reveals alarming trends in these categories, urging immediate action to curb their environmental impact. +

+ +

Past Waste Data: A Wake-Up Call

+

+ Historical data from AquaClense’s waste tracking system highlights the scale of the challenge. In 2024 alone, our platform recorded a 35% increase in plastic waste generation compared to 2023, with an average of 12 tons collected monthly across monitored canals. Shoe waste spiked by 20%, reflecting seasonal disposal patterns, while metal waste remained steady but substantial at 8 tons monthly. These figures underscore the urgency of proactive recycling measures. +

+
+ Waste Trends 2024 +

Figure 1: Monthly Waste Generation Trends (2024)

+
+ +

Awareness and Action: What to Do

+

+ High generation of plastic, shoes, and metal waste signals a need for both individual and collective responsibility. Here’s what we recommend based on our survey insights: +

+
    +
  • Plastic Overload: If plastic waste exceeds sustainable levels (e.g., >5 tons/month in a community), prioritize reduction by switching to reusable alternatives like cloth bags and stainless steel bottles. Recycle diligently—separate plastics by type (PET, HDPE) to maximize repurposing efficiency.
  • +
  • Shoe Surplus: For high shoe waste, launch donation drives before disposal—many discarded pairs are still wearable. For non-usable shoes, partner with recycling programs to extract rubber and fabric, reducing landfill burden.
  • +
  • Metal Excess: When metal waste peaks (e.g., >8 tons/month), establish local scrap collection points. Encourage businesses to sell excess metal through AquaClense’s marketplace, turning waste into profit while conserving resources.
  • +
+

+ These measures aren’t just suggestions—they’re imperatives. Our data shows that communities adopting such strategies reduced waste accumulation by up to 25% within six months. +

+
+ Waste Reduction Impact +

Figure 2: Impact of Recycling Measures on Waste Reduction (2024)

+
+ +

Join the Recycling Revolution

+

+ AquaClense isn’t just about managing waste—it’s about reimagining it. By understanding the recyclability of plastic, shoes, and metal, and acting on data-driven insights, we can turn a growing problem into a thriving opportunity. Whether you’re reducing, reusing, or recycling, every step counts. Let’s build a sustainable tomorrow, one waste item at a time. +

+
+ + \ No newline at end of file diff --git a/templates/reports.html b/templates/reports.html new file mode 100644 index 000000000..d2dcc8013 --- /dev/null +++ b/templates/reports.html @@ -0,0 +1,62 @@ + + + + + Waste Report for {{ date }} + + + + +

Waste Report for {{ date }}

+
+
+
+ Back to Selection + + + + \ No newline at end of file diff --git a/templates/select_date_canal.html b/templates/select_date_canal.html new file mode 100644 index 000000000..3ca19c48a --- /dev/null +++ b/templates/select_date_canal.html @@ -0,0 +1,48 @@ + + + + + Select Date and Canal + + + + + + +

Select a Date and Canal

+ {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +

{{ message }}

+ {% endfor %} + {% endif %} + {% endwith %} +
+
+ + + +
+ Back to Dashboard + + + + \ No newline at end of file diff --git a/templates/signup.html b/templates/signup.html new file mode 100644 index 000000000..c272d5d79 --- /dev/null +++ b/templates/signup.html @@ -0,0 +1,39 @@ +{% extends 'base.html' %} +{% block head %} + + +{% endblock %} +{% block content %} +
+ +
+{% endblock %} \ No newline at end of file diff --git a/templates/upload_waste.html b/templates/upload_waste.html new file mode 100644 index 000000000..53d18655b --- /dev/null +++ b/templates/upload_waste.html @@ -0,0 +1,28 @@ + + + + + Upload Waste Images + + +

Upload Waste Images

+ {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +

{{ message }}

+ {% endfor %} + {% endif %} + {% endwith %} +
+ +

+

+ +
+ Back to Dashboard + + \ No newline at end of file diff --git a/templates/wdp.html b/templates/wdp.html new file mode 100644 index 000000000..a5fd4e379 --- /dev/null +++ b/templates/wdp.html @@ -0,0 +1,56 @@ + + + + + + + Water Data Processing - Aquaclense + + + +
+

Water Data Processing

+ {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +

{{ message }}

+ {% endfor %} + {% endif %} + {% endwith %} +
+
+ + + +
+
+ {% if sample_id is defined %} + + + + + + + + + + + + + +
Sample ID{{ sample_id }}
Dissolved Oxygen (D0, mg/L){{ d0 }}
D5 (mg/L){{ d5 }}
Temperature (°C){{ temperature }}
Turbidity (NTU){{ turbidity }}
pH{{ ph }}
Conductivity (µS/cm){{ conductivity }}
BOD (mg/L){{ bod }}
Category{{ category }}
Health Risk{{ health_risk }}
Possible Diseases{{ diseases|join(', ') }}
Solutions{{ solutions|join('
')|safe }}
+ {% endif %} +

Back to Dashboard

+
+ + \ No newline at end of file