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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
timesensorHumidityTemp_CTemp_F
02024-09-09 14:41:03.937043-04:00DHT1755.020.568.9
12024-09-09 14:41:05.114432-04:00DHT1860.021.069.8
22024-09-09 14:41:06.189103-04:00DHT2258.019.867.6
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
timesensorECRTDpH
02024-09-09 14:41:07.772529-04:00water_sensor1.10.986.5
12024-09-09 14:41:08.943115-04:00water_sensor1.20.956.6
22024-09-09 14:41:10.043278-04:00water_sensor1.30.996.4
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
timesensorHumidityTemp_CTemp_F
02024-09-09 14:41:03.937043-04:00DHT1755.020.568.9
\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