diff --git a/.DS_Store b/.DS_Store
index f2549b6..5041aa3 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/Arduino to Pi Testing/.DS_Store b/Arduino to Pi Testing/.DS_Store
new file mode 100644
index 0000000..a7abc18
Binary files /dev/null and b/Arduino to Pi Testing/.DS_Store differ
diff --git a/Engine/.DS_Store b/Engine/.DS_Store
index 3ac1632..6e3b06a 100644
Binary files a/Engine/.DS_Store and b/Engine/.DS_Store differ
diff --git a/InfluxDB Testing/Dashboard_TEST_Data.ipynb b/InfluxDB Testing/Dashboard_TEST_Data.ipynb
new file mode 100644
index 0000000..3a5da40
--- /dev/null
+++ b/InfluxDB Testing/Dashboard_TEST_Data.ipynb
@@ -0,0 +1,502 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import time\n",
+ "from datetime import datetime\n",
+ "import random\n",
+ "from influxdb_client import InfluxDBClient, Point\n",
+ "from influxdb_client.client.write_api import SYNCHRONOUS\n",
+ "import certifi\n",
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Database Connection"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# InfluxDB configuration\n",
+ "token = '8Kph_oFbnNqTvgUfERhTJveJpw1A08-HDsnhftEIYj8HRSUJSmKIdoPZdaIbNeIkG4likhDrOtr5FgyF5W03hg=='\n",
+ "org = \"Ethan\"\n",
+ "bucket = \"DashboardTest\" # Use \"bucket\" instead of \"database\" in influxdb-client\n",
+ "url = \"https://us-east-1-1.aws.cloud2.influxdata.com\"\n",
+ "\n",
+ "# Create InfluxDB client\n",
+ "client = InfluxDBClient(url=url, token=token, org=org, ssl_ca_cert=certifi.where())\n",
+ "write_api = client.write_api(write_options=SYNCHRONOUS)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Original data templates\n",
+ "dht_sensor_data_template = [\n",
+ " {\"Zone\": \"Zone 1\", \"Temp_C\": 20.5, \"Temp_F\": 68.9, \"Humidity\": 55},\n",
+ " {\"Zone\": \"Zone 2\", \"Temp_C\": 21.0, \"Temp_F\": 69.8, \"Humidity\": 60},\n",
+ " {\"Zone\": \"Zone 3\", \"Temp_C\": 19.8, \"Temp_F\": 67.6, \"Humidity\": 58},\n",
+ "]\n",
+ "\n",
+ "water_sensor_data_template = {\"RTD\": 20.97, \"pH\": 7.38, \"EC\": 1430}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Helper function to generate random values within a margin of error\n",
+ "def randomize_value(value, margin=0.15):\n",
+ " error = value * margin\n",
+ " return round(random.uniform(value - error, value + error), 2)\n",
+ "\n",
+ "# Function to generate randomized data\n",
+ "def generate_dht_data():\n",
+ " return [\n",
+ " {\n",
+ " \"Zone\": entry[\"Zone\"],\n",
+ " \"Temp_C\": randomize_value(entry[\"Temp_C\"]),\n",
+ " \"Temp_F\": randomize_value(entry[\"Temp_F\"]),\n",
+ " \"Humidity\": randomize_value(entry[\"Humidity\"]),\n",
+ " }\n",
+ " for entry in dht_sensor_data_template\n",
+ " ]\n",
+ "\n",
+ "def generate_water_data():\n",
+ " return {\n",
+ " \"RTD\": randomize_value(water_sensor_data_template[\"RTD\"]),\n",
+ " \"pH\": randomize_value(water_sensor_data_template[\"pH\"]),\n",
+ " \"EC\": randomize_value(water_sensor_data_template[\"EC\"]),\n",
+ " }\n",
+ "\n",
+ "# Function to upload DHT sensor data\n",
+ "def upload_dht_data(data):\n",
+ " for entry in data:\n",
+ " point = (\n",
+ " Point(\"dht_sensors\")\n",
+ " .tag(\"Zone\", entry[\"Zone\"])\n",
+ " .field(\"Temp_C\", entry[\"Temp_C\"])\n",
+ " .field(\"Temp_F\", entry[\"Temp_F\"])\n",
+ " .field(\"Humidity\", entry[\"Humidity\"])\n",
+ " )\n",
+ " write_api.write(bucket=bucket, org=org, record=point)\n",
+ "\n",
+ "# Function to upload water sensor data\n",
+ "def upload_water_data(data):\n",
+ " point = (\n",
+ " Point(\"water_sensors\")\n",
+ " .field(\"RTD\", data[\"RTD\"])\n",
+ " .field(\"pH\", data[\"pH\"])\n",
+ " .field(\"EC\", data[\"EC\"])\n",
+ " )\n",
+ " write_api.write(bucket=bucket, org=org, record=point)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Uploaded Minute [1]\n",
+ "Uploaded Minute [2]\n",
+ "Uploaded Minute [3]\n",
+ "Uploaded Minute [4]\n",
+ "Uploaded Minute [5]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Main loop to run at the top of every minute for 5 minutes\n",
+ "for i in range(1, 6):\n",
+ " # Wait until the top of the next minute\n",
+ " now = time.time()\n",
+ " sleep_time = 60 - (now % 60)\n",
+ " time.sleep(sleep_time)\n",
+ "\n",
+ " # Generate and upload data\n",
+ " dht_data = generate_dht_data()\n",
+ " water_data = generate_water_data()\n",
+ "\n",
+ " upload_dht_data(dht_data)\n",
+ " upload_water_data(water_data)\n",
+ "\n",
+ " print(f\"Uploaded Minute [{i}]\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "datetime.datetime(2024, 10, 18, 11, 39, 35, 408072)"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "datetime.now()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Sample Queries"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Return All DHT Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " time | \n",
+ " sensor | \n",
+ " Humidity | \n",
+ " Temp_C | \n",
+ " Temp_F | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 2024-09-09 14:41:03.937043-04:00 | \n",
+ " DHT17 | \n",
+ " 55.0 | \n",
+ " 20.5 | \n",
+ " 68.9 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 2024-09-09 14:41:05.114432-04:00 | \n",
+ " DHT18 | \n",
+ " 60.0 | \n",
+ " 21.0 | \n",
+ " 69.8 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 2024-09-09 14:41:06.189103-04:00 | \n",
+ " DHT22 | \n",
+ " 58.0 | \n",
+ " 19.8 | \n",
+ " 67.6 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " time sensor Humidity Temp_C Temp_F\n",
+ "0 2024-09-09 14:41:03.937043-04:00 DHT17 55.0 20.5 68.9\n",
+ "1 2024-09-09 14:41:05.114432-04:00 DHT18 60.0 21.0 69.8\n",
+ "2 2024-09-09 14:41:06.189103-04:00 DHT22 58.0 19.8 67.6"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Query\n",
+ "querier = client.query_api()\n",
+ "tables = querier.query(f'''\n",
+ "from(bucket: \"{bucket}\")\n",
+ " |> range(start: -1y)\n",
+ " |> filter(fn: (r) => r[\"_measurement\"] == \"dht_sensors\")''', #DHT Data \n",
+ " org=org)\n",
+ "\n",
+ "# Data Extraction\n",
+ "records = []\n",
+ "for table in tables:\n",
+ " for record in table.records:\n",
+ " records.append({\n",
+ " 'time': record.get_time(),\n",
+ " 'sensor': record.values['sensor'],\n",
+ " record.get_field(): record.get_value()\n",
+ " })\n",
+ "\n",
+ "# Convert to Pandas DataFrame\n",
+ "df = pd.DataFrame(records)\n",
+ "df = df.pivot_table(index=['time', 'sensor'], values=['Temp_C', 'Temp_F', 'Humidity'], aggfunc='first').reset_index() # Convert to fields\n",
+ "df['time'] = pd.to_datetime(df['time']).dt.tz_convert('US/Eastern') # Adjust 'time' to EST\n",
+ "\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Return All Water Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " time | \n",
+ " sensor | \n",
+ " EC | \n",
+ " RTD | \n",
+ " pH | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 2024-09-09 14:41:07.772529-04:00 | \n",
+ " water_sensor | \n",
+ " 1.1 | \n",
+ " 0.98 | \n",
+ " 6.5 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 2024-09-09 14:41:08.943115-04:00 | \n",
+ " water_sensor | \n",
+ " 1.2 | \n",
+ " 0.95 | \n",
+ " 6.6 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 2024-09-09 14:41:10.043278-04:00 | \n",
+ " water_sensor | \n",
+ " 1.3 | \n",
+ " 0.99 | \n",
+ " 6.4 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " time sensor EC RTD pH\n",
+ "0 2024-09-09 14:41:07.772529-04:00 water_sensor 1.1 0.98 6.5\n",
+ "1 2024-09-09 14:41:08.943115-04:00 water_sensor 1.2 0.95 6.6\n",
+ "2 2024-09-09 14:41:10.043278-04:00 water_sensor 1.3 0.99 6.4"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Query\n",
+ "querier = client.query_api()\n",
+ "tables = querier.query(f'''\n",
+ "from(bucket: \"{bucket}\")\n",
+ " |> range(start: -1y)\n",
+ " |> filter(fn: (r) => r[\"_measurement\"] == \"water_sensors\")''', #Water data\n",
+ " org=org)\n",
+ "\n",
+ "# Data Extraction\n",
+ "records = []\n",
+ "for table in tables:\n",
+ " for record in table.records:\n",
+ " records.append({\n",
+ " 'time': record.get_time(),\n",
+ " 'sensor': record.values['sensor'],\n",
+ " record.get_field(): record.get_value()\n",
+ " })\n",
+ "\n",
+ "# Convert to Pandas DataFrame\n",
+ "df = pd.DataFrame(records)\n",
+ "df = df.pivot_table(index=['time', 'sensor'], values=['EC', 'pH', 'RTD'], aggfunc='first').reset_index() # Convert to fields\n",
+ "df['time'] = pd.to_datetime(df['time']).dt.tz_convert('US/Eastern') # Adjust 'time' to EST\n",
+ "\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Return Specific DHT Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " time | \n",
+ " sensor | \n",
+ " Humidity | \n",
+ " Temp_C | \n",
+ " Temp_F | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 2024-09-09 14:41:03.937043-04:00 | \n",
+ " DHT17 | \n",
+ " 55.0 | \n",
+ " 20.5 | \n",
+ " 68.9 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " time sensor Humidity Temp_C Temp_F\n",
+ "0 2024-09-09 14:41:03.937043-04:00 DHT17 55.0 20.5 68.9"
+ ]
+ },
+ "execution_count": 39,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Query\n",
+ "querier = client.query_api()\n",
+ "tables = querier.query(f'''\n",
+ "from(bucket: \"{bucket}\")\n",
+ " |> range(start: -1y)\n",
+ " |> filter(fn: (r) => r[\"_measurement\"] == \"dht_sensors\")\n",
+ " |> filter(fn: (r) => r[\"sensor\"] == \"DHT17\")''', # DHT17 Data\n",
+ " org=org)\n",
+ "\n",
+ "# Data Extraction\n",
+ "records = []\n",
+ "for table in tables:\n",
+ " for record in table.records:\n",
+ " records.append({\n",
+ " 'time': record.get_time(),\n",
+ " 'sensor': record.values['sensor'],\n",
+ " record.get_field(): record.get_value()\n",
+ " })\n",
+ "\n",
+ "# Convert to Pandas DataFrame\n",
+ "df = pd.DataFrame(records)\n",
+ "df = df.pivot_table(index=['time', 'sensor'], values=['Temp_C', 'Temp_F', 'Humidity'], aggfunc='first').reset_index() # Convert to fields\n",
+ "df['time'] = pd.to_datetime(df['time']).dt.tz_convert('US/Eastern') # Adjust 'time' to EST\n",
+ "\n",
+ "df"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/InfluxDB Testing/InfluxDB_Test.ipynb b/InfluxDB Testing/InfluxDB_Test.ipynb
index c560d81..2b24569 100644
--- a/InfluxDB Testing/InfluxDB_Test.ipynb
+++ b/InfluxDB Testing/InfluxDB_Test.ipynb
@@ -29,7 +29,7 @@
"# InfluxDB configuration\n",
"token = '8Kph_oFbnNqTvgUfERhTJveJpw1A08-HDsnhftEIYj8HRSUJSmKIdoPZdaIbNeIkG4likhDrOtr5FgyF5W03hg=='\n",
"org = \"Ethan\"\n",
- "bucket = \"Test2\" # Use \"bucket\" instead of \"database\" in influxdb-client\n",
+ "bucket = \"DashboardTest\" # Use \"bucket\" instead of \"database\" in influxdb-client\n",
"url = \"https://us-east-1-1.aws.cloud2.influxdata.com\"\n",
"\n",
"# Create InfluxDB client\n",
@@ -52,9 +52,9 @@
"source": [
"# Example sensor data (hardcoded)\n",
"dht_sensor_data = [\n",
- " {\"sensor\": \"DHT17\", \"Temp_C\": 20.5, \"Temp_F\": 68.9, \"Humidity\": 55},\n",
- " {\"sensor\": \"DHT18\", \"Temp_C\": 21.0, \"Temp_F\": 69.8, \"Humidity\": 60},\n",
- " {\"sensor\": \"DHT22\", \"Temp_C\": 19.8, \"Temp_F\": 67.6, \"Humidity\": 58},\n",
+ " {\"Zone\": \"DHT17\", \"Temp_C\": 20.5, \"Temp_F\": 68.9, \"Humidity\": 55},\n",
+ " {\"Zone\": \"DHT18\", \"Temp_C\": 21.0, \"Temp_F\": 69.8, \"Humidity\": 60},\n",
+ " {\"Zone\": \"DHT22\", \"Temp_C\": 19.8, \"Temp_F\": 67.6, \"Humidity\": 58},\n",
"]\n",
"\n",
"water_sensor_data = [\n",
@@ -82,7 +82,7 @@
" for entry in data:\n",
" point = (\n",
" Point(\"dht_sensors\") # Measurement for DHT sensors\n",
- " .tag(\"sensor\", entry[\"sensor\"]) # Tag for sensor type\n",
+ " .tag(\"Zone\", entry[\"Zone\"]) # Tag for sensor type\n",
" .field(\"Temp_C\", entry[\"Temp_C\"]) # Temperature in Celsius\n",
" .field(\"Temp_F\", entry[\"Temp_F\"]) # Temperature in Fahrenheit\n",
" .field(\"Humidity\", entry[\"Humidity\"]) # Humidity level\n",
@@ -96,7 +96,6 @@
" for entry in data:\n",
" point = (\n",
" Point(\"water_sensors\") # Measurement for water sensors\n",
- " .tag(\"sensor\", entry[\"sensor\"]) # Tag for sensor type\n",
" .field(\"RTD\", entry[\"RTD\"]) # RTD value\n",
" .field(\"pH\", entry[\"pH\"]) # pH value\n",
" .field(\"EC\", entry[\"EC\"]) # Electrical conductivity\n",
diff --git a/Pump Control Testing/.DS_Store b/Pump Control Testing/.DS_Store
index 70f4f45..d9faa87 100644
Binary files a/Pump Control Testing/.DS_Store and b/Pump Control Testing/.DS_Store differ
diff --git a/Sensor Calibration/.DS_Store b/Sensor Calibration/.DS_Store
new file mode 100644
index 0000000..c5a59cd
Binary files /dev/null and b/Sensor Calibration/.DS_Store differ