From 13e245a1b65e8e03ad5cfe61f6e085cb340e74ef Mon Sep 17 00:00:00 2001 From: Ethan Lewis Date: Fri, 18 Oct 2024 13:04:55 -0400 Subject: [PATCH] Created 'DashboardTest' playground --- .DS_Store | Bin 8196 -> 10244 bytes Arduino to Pi Testing/.DS_Store | Bin 0 -> 6148 bytes Engine/.DS_Store | Bin 6148 -> 6148 bytes InfluxDB Testing/Dashboard_TEST_Data.ipynb | 502 +++++++++++++++++++++ InfluxDB Testing/InfluxDB_Test.ipynb | 11 +- Pump Control Testing/.DS_Store | Bin 6148 -> 8196 bytes Sensor Calibration/.DS_Store | Bin 0 -> 6148 bytes 7 files changed, 507 insertions(+), 6 deletions(-) create mode 100644 Arduino to Pi Testing/.DS_Store create mode 100644 InfluxDB Testing/Dashboard_TEST_Data.ipynb create mode 100644 Sensor Calibration/.DS_Store diff --git a/.DS_Store b/.DS_Store index f2549b6e682bedd3b74d1266da9ee19521c98ca2..5041aa377d670132e22f85a4b2a18d30021553ef 100644 GIT binary patch literal 10244 zcmeHM&ubGw6n>k=HlbBRX~m1MB1jLVravf1FG-q;#R{P*7HOqTnwSPRyCK;$#Zm|! z_2kiu|A2xAFWx)|p2dR~{{?S?APD-+%(mUxH0iFO)i6_b-|o(P^W%Hpdy|$tX=`x2#IFO;deP2q**;0tx|zfI{G3K>%wu zE0IAV)mD zRCBf%nlQ(A-O)=pvL&Q2C(YS>Xim?XvqRB%?`U7=>ZB!vRCk4dLZBT1ws#NH1eK^v zwzPi_WmqU3)>W)@I&WBcd}E>Zd@c7rDc2Xe)>pS(X9I(qFr@)XQjNA~8-4FkanZ20 zoE})uto4bXyf9@t%e4#CfVN2%@`KIq87g}$U-`GpH|tfW&o}w1QLfwZ_$MvY7e3QJ z5E+OJM($;|t!CEF*^PQCS6gFmE0$&C51w=RJLO_?BQ`Q`nRc#h7Hiy~Tqr_ieYI>B ztY*q;n1wpG&5DXhG!os2UEJH7nvIX^(=${1BcoTY%`I;{Fe;|? zn9rUxC-DIXxjeyZ7i@O2HPf)n60}$gqn%L%qAOISI&ftOmprH@VeR%ufR=g$K!ZNPp&5n|8k3_08C)uAX&%F4!{dRRZI`%EYqfKhV9Z#Kf zWIt5f{NRa+7%jp__YnsT+6A{$CvchNc{i6&w3p}o`YG&Bv~gqc@y3_Scf~62!|sT` zLF{DAJ_yW~z}pgj71&glxvPEmV9-x4U3tDk@1QHyyXQvK8c8iVes;Ct_H!p4dCYM( z<_kQl>D;3>vQrJ7En@sS%_B>h{A~;GW%ee|Da2N0w_iulR)Z?Yi3ip;+OxouuDOo? zUUKJ4-|h5B%=@0N%#)M>{C(TX9HPar$ngQ}kKzRV2DX>E$8(JDzCHOTO3PR!lE^%_ zAt%7N!U@bA_N=_~SkKuio(DhK>V6En`D){4rLQ)6gpt1HDzkCy2Uy|D&dtQH=|`Vm ztnzH;)AopkL2YFQW-wfT^vtN*%FeQLx-C~{-u8g bbUj0mS7f#S{}0bYrM(J HnZpbKIKn2F diff --git a/Arduino to Pi Testing/.DS_Store b/Arduino to Pi Testing/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a7abc1800ffddfaf61e0823433d74926a6624da2 GIT binary patch literal 6148 zcmeHK-EPw`82!9vEM)@qVv}}*6vXW`x^9{T++?A-sC_PYJbKjVd;_wrHZ^@cA+t;2a7T$Fpk^Qd2R8yk;#lJ}yd zKa_+h?4!%^izo?s;qg%tW|HeGhh4Yp-Nx2<+&XA(JA3=B$+k0o&_a2C?_e^i+ne|9 zKYG@E6Au#pPRY)2E=jwk@dDnXFr80)y6d0tL8_fz)i>bnww@~v!SZ44=@+5Plsn+z zZ~f_6HMTq!r`)&xFo}6`ig;q28&psv*CM1Y<;0Oklt}E*5&6`i9ZKnZZk;}YTV1Ek zYs6_Sip1{BMQSXFlwwR>j6{xSb|g%wS{=!i{8{B!zkz=xr@A5^J|ExJD{>9q&z1TU z-hvgxFqgpe-muq~U@m3~MggP1-&H`I4-S$*S7WJA9v#T!698zTSsKdnjsrTP0qANh z6`}>k6cwnbOg}N0emO8jhu_uxONEL~Onw=0^p}}_p)mdMV2KV;0 literal 0 HcmV?d00001 diff --git a/Engine/.DS_Store b/Engine/.DS_Store index 3ac16327904d730b64dac664b177b903a7d391ed..6e3b06a38a374e30489ea376129fe57c346d3c16 100644 GIT binary patch delta 159 zcmZoMXfc=|#>B!ku~2NHo+2aX#(>?7i!U%UF>-F^VOqv0kdtm0oSdIqzyJnn>nHDG zk`l?ycX3I|$xi}`aV-DJq46!?m?Kmo1*-&qK?brh29tL(NpIf7yp(Y>I|n}p(E7~> YnZGkn<`;3~U}Rum0@<}WLSzjy0BBJxX#fBK delta 68 zcmZoMXfc=|#>B)qu~2NHo+2ab#(>?7jI5h^Se7wvPGVcixUpda(`I%Keh#3T&4L`? WnJ4p$IC3xm0V4wg%jO7?HOv5RBM@l- 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 70f4f455cadae86650d317fc81cbc4191563e9c4..d9faa87e4093c225d56e2ff77c33db20e7ab3435 100644 GIT binary patch delta 673 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aMAD77(QH}hr%jz7$c**Q2SHn1>C zP3B=St>lBwRs>YqKE7cjn3bBA%1| dc{n&2A?c1`ay-w}$-XRdn-{aC05!HU0s!0fjL851 delta 125 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50$jG%ZU^g=(*JL{ZvB_3Ke3K0X z1SdZf$eH|BFlX~mp_0@ MtYg?5&ohS^065baJpcdz diff --git a/Sensor Calibration/.DS_Store b/Sensor Calibration/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c5a59cd1e5c3a065539819de411837fb0b3e43cd GIT binary patch literal 6148 zcmeHKOHRWu5FMvM1hJq?Hb^-DLMkT+C6&sSasbp;f<>Za!#;;$&k5La8g?82-h7Da zv|S+~gk~iBIrFi{&rTc@QJ6lhCq!c+%1{`SBUC$t?Oe7bG0h1ua39O6S)$FIU75|{ zZ!^Gam(Yx^Z>nZBSig%;5t)GaR1cHIs;OI@(&6iOY~7Tl#qvgZexJYb`b$jRtoPd5 z$IbqD+aRW;`5>1U=;K`A6X$Zkdskuyxt#a8AZCzDWZRL;h;HeQ$~c>FHps@j;(XFe zc$p>6sLMW-o!+|1&(OLfD|GDQ3^)VMzz-R~naz?ND|+n=I0Mc=&j5cPaumkGuv3&z z2P(M&08^+%(3bx=V9p9)Vc01`0|^=m)X-p8jG*Dr=jK-!c8VHKK}JSDHgd2VN|4c^ z&&8cWq3E?U;0(kJjP!BL=l=}v@}B#D9OO^VfHUx~7zk;(D5sc`ovmAw