From 35118e8c201a8acf3c447ff605f1b6b52c5b5943 Mon Sep 17 00:00:00 2001 From: caliskanbi Date: Wed, 10 May 2023 16:04:19 +0200 Subject: [PATCH] NEW FILES ADDED --- .idea/dataSources.xml | 24 +++ requirements.txt | 1 + software/backend/backend_database.db | Bin 16384 -> 16384 bytes ...database_and_test.py => createdatabase.py} | 14 +- software/backend/data_functions.py | 46 ++++-- software/backend/main.py | 10 +- software/backend/plantdatabase.py | 144 ++++++++++++------ software/backend/tests/test_database.db | Bin 0 -> 16384 bytes software/backend/tests/test_plantdatabase.py | 50 ++++++ software/defines.py | 10 +- 10 files changed, 224 insertions(+), 75 deletions(-) rename software/backend/{createdatabase_and_test.py => createdatabase.py} (58%) create mode 100644 software/backend/tests/test_database.db create mode 100644 software/backend/tests/test_plantdatabase.py diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 36085a8..b6b05a6 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -8,5 +8,29 @@ jdbc:sqlite:$PROJECT_DIR$/software/backend/backend_database.db $ProjectFileDir$ + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:C:\Users\bcali\Documents\Uni\BEI6\Projektarbeit\projektarbeit_duelger_waldhauser_caliskan\software\backend\tests\backend_database.db + $ProjectFileDir$ + + + file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.40.1/sqlite-jdbc-3.40.1.jar + + + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:C:\Users\bcali\Documents\Uni\BEI6\Projektarbeit\projektarbeit_duelger_waldhauser_caliskan\software\backend\tests\test_database.db + $ProjectFileDir$ + + + file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.40.1/sqlite-jdbc-3.40.1.jar + + + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 24e9b00..c983847 100644 --- a/requirements.txt +++ b/requirements.txt @@ -29,3 +29,4 @@ urllib3==1.26.14 Werkzeug==2.2.3 zipp==3.15.0 python-ev3dev2==2.1.0.post1 +pytest \ No newline at end of file diff --git a/software/backend/backend_database.db b/software/backend/backend_database.db index cb236c6dba473c54d1fba40347ae6d40075cc065..b38b3c6c66a2b61c1c80fb98626efe92b16f1ecb 100644 GIT binary patch delta 301 zcmZo@U~Fh$oFFa8!oa`)!Z5%xQO8)Ag+VXeix()w%*V;VKb_x|k8`u4z;s@&CQD{^ zaYIAK7TL*XdBd1IT_&sX1=I)RB<7WPx+r-1g}A!A2I(j`W)_8{<`$$DC6<&Hr78ru zI{N4U#XL%LGgC54Dj@>F`I$Ms`I*HCB~C?|=@}(?sl~+*6>k1PuAc6G3f``f3K~#L zG=p5-T!UQwoLz$z3PAQ2E3iT2CY$nybEY%0i%Uu}Hfm0u%CF82)dO^-vM8ACmzbNX a5aJpUq6zXHgTQ7%h12{KC+M@`+ab7BytDIAe(L7Cejn$lby@P~m-Sny#b~p82`=r1= z33`a=JO6XeZ%=2O z<|dz_%eXz#qe?ns;udf z+J!wdv*@kov4^j72Ye!~4G04LN-!F17TxuYwyuywXXo`K^4hQ_hqXvgo1{xYU8YIs z{Cu{gU}vwYv?=@7gp`iXXp2q<`<1J% zLEyb>{IMmKBqnCXvH{)1b!%6MdM$TMNTFSP>(6#Om-9`sBxw}^mx5_iB zh7|4@jU{18mFZHutv#%zps0xLBe9h6A>(&0CBe+eB-WSa*TEfK8W#EWVw~Pjhm2LN z(Y?6|U1iWTdWW8)JMDHWlMMPsZ%{x01V8`;KmY_l00ck)1V8`;KmY{( zJAr)8U}uvLa>S2=nCGyDA~t@Az!cs8o3jrw=swzqJjj&&m{y>G00@8p2!H?xfB*=9 z00@8p2!O!f5pbC^83${zSTZc-W#x`#WtH@U?N!dQ3a4YGnT%C0KDeYWn|xXjoD;}B zOokRVWz9c3Mn)#~6hEuF=`yA3ZXy#o(;KIEUL)hqZPlC2I(cmk3B$$5$?1T6=HgMt zWlY!INZyW**b2`rB(EN3UfDG4Bj*Qq54@>aP4<6%^x$(p<1(b{ZXi>0Z?)W2bIFVR z{(Tu!)#Q`<@W98K3No_m$YFE2$Hk@V&XM=ZkI2CO?d0X?Qnh<+A-Olt+puVI19^Mu x*q86lkE>YPJ@a>Tqj3yeq!` bool: + try: + self.cur.execute(f"INSERT INTO measurement_values (PlantID, AirTemperature, AirHumidity," + f"SoilMoisture, Brightness) VALUES " + f"({plant_id}, {sensordata_temp}, {sensordata_humidity}, {sensordata_soil_moisture}" + f", {sensordata_brightness})") + self.conn.commit() + return True + except (sqlite3.NotSupportedError, sqlite3.Warning) as e: + return e - def get_latest_data(self, plant_id) -> dict: + def get_latest_data(self, plant_name: Optional[str] = None, plant_id: Optional[int] = None): """ Gets the newest parameter of specific plant and returns all parameters in json format :param plant_id: + :param plant_name: :return: """ - self.cur.execute(f"SELECT * FROM measurement_values where plant_ID = {plant_id} ORDER BY Timestamp DESC LIMIT 1") - data = self.cur.fetchone() - self.cur.execute(f"SELECT plantName FROM plants where plant_ID = {plant_id}") - name = self.cur.fetchone() - print(data) - print(name[0]) - json_file = { - "MeasurementID": data[0], - "PlantID": data[2], - "Timestamp": data[1], - "AirTemperature": data[3], - "AirHumidity": data[4], - "SoilMoisture": data[5], - "Brightness": data[6], - "PlantName": name - } - return json_file + try: + if plant_name is not None and plant_id is None: + self.cur.execute("SELECT PlantID FROM plants where PlantName = ?", (plant_name,)) + plant_id = self.cur.fetchone()[0] + elif (plant_id is not None and plant_name is not None) or (plant_id is None and plant_name is None): + raise TypeError("Can't pass plant_id and plant_name to the function. Just one allowed !") + + self.cur.execute("SELECT * FROM measurement_values where PlantID = ? ORDER BY Timestamp DESC LIMIT 1", + (plant_id,)) + data = self.cur.fetchone() + json_file = { + "MeasurementID": data[0], + "PlantID": data[2], + "Timestamp": data[1], + "AirTemperature": data[3], + "AirHumidity": data[4], + "SoilMoisture": data[5], + "Brightness": data[6], + "PlantName": plant_name + } + return json_file + except (sqlite3.Warning, TypeError) as e: + return e def delete_data(self, table_name): - self.cur.execute(f"DELETE FROM {table_name}") + self.cur.execute(f'DELETE FROM {table_name}') self.conn.commit() + return True # TODO: Kemals Scheiß implementieren - def delete_plant(self, plant_id): - self.cur.execute('DELETE FROM plants WHERE plant_ID = ?', (plant_id,)) - self.conn.commit() + def plant_count(self) -> int: + """ + returns the number of plants registered in the database + :return: + """ + self.cur.execute("SELECT COUNT(*) FROM plants") + return self.cur.fetchone()[0] + + def __del__(self): + self.conn.close() diff --git a/software/backend/tests/test_database.db b/software/backend/tests/test_database.db new file mode 100644 index 0000000000000000000000000000000000000000..d38a441576b6de3bf15f72fc692859383da61c95 GIT binary patch literal 16384 zcmeI&zi!h&90zcpU7EHuF)UOWkZxdT)D+oH-4su8+G`s~(%`r%5kq9)+FFW}Hg=Gh z5QryWL9p@;yaTU*cm+1txg;(97h5nP(D#(s@!fszclm55x%sf_N1X2W`hgeGf^N}N*8yW;4009U<00Izz00bZa z0SNp}f!Ftx)Pk;)H@742NrwmA3kQ91>qhP8UT46=t36Ze4zpcGUAtUm^y)ZWJl9v* zpq0AIwwOa3PNil$E&719sJ-j%RO(`(8mqf`*AI9YdBG9g5DUAN8lxL*)84JRbbZ%x z#FX~1v+3HkM!wPUy3yIPd20K8mj_3@??qzkRBW!A7k%4xT5#5Y08@>4l{w(i+Ky#~pE^ zZioDMz`IZRrAOt0*`>k7t{3pUNahYmY9X5?uX3X$#}&s{`N9I1_VOFVjp6R=q7HT0 zBR4lZn-leiBtB>mfB*y_009U<00Izz00bZa0SNq00<*FrWy`!D9eTs_zpQ?h)bHYg z1_1~_00Izz00bZa0SG_<0uX?}KPPZYR&;Xi6^xS?Ip*hxk|pCe2d0PT|M_%BQa`J2 z)yL|c%(u*^%*)Jn=4Sd!`lA>?g8&2|009U<00Izz00bZafj<^7=Vzn>Nu^T6(2T;e zW-jX*)eXxiS}Ut^X?1_pN_(yMqJ1dk#s$je^_ZAp=_?7bx!9PdCB$YY$MiL8rI-+# ziHVt3p^y+u#l$qr)DvRUu`we_^4jE>R no message needed -# GETALLDATA -> no message needed +GETALLDATA = { + "PlantNames": [] +} # endregion