From d20a595ffadd16ddd89c5952f8e08fb43dbb97e8 Mon Sep 17 00:00:00 2001 From: KubMakCZ Date: Wed, 18 Mar 2026 09:40:20 +0100 Subject: [PATCH] WIP --- 13_sqlite_python/01_sqlite_zaklad.py | 37 +++++++++++++++++++ 13_sqlite_python/02_serial_to_sqlite.py | 0 13_sqlite_python/03_sql_dotazy.py | 37 +++++++++++++++++++ 13_sqlite_python/04_demo_generator.py | 45 ++++++++++++++++++++++++ 13_sqlite_python/05_print.py | 12 +++++++ 13_sqlite_python/iot_data.db | 0 13_sqlite_python/iot_data.sqlite | Bin 0 -> 20480 bytes 13_sqlite_python/poznamky.txt | 6 ++++ 8 files changed, 137 insertions(+) create mode 100644 13_sqlite_python/01_sqlite_zaklad.py create mode 100644 13_sqlite_python/02_serial_to_sqlite.py create mode 100644 13_sqlite_python/03_sql_dotazy.py create mode 100644 13_sqlite_python/04_demo_generator.py create mode 100644 13_sqlite_python/05_print.py create mode 100644 13_sqlite_python/iot_data.db create mode 100644 13_sqlite_python/iot_data.sqlite create mode 100644 13_sqlite_python/poznamky.txt diff --git a/13_sqlite_python/01_sqlite_zaklad.py b/13_sqlite_python/01_sqlite_zaklad.py new file mode 100644 index 0000000..b754b75 --- /dev/null +++ b/13_sqlite_python/01_sqlite_zaklad.py @@ -0,0 +1,37 @@ +import sqlite3 + +conn = sqlite3.connect("iot_data.sqlite") +cursor = conn.cursor() + +cursor.execute(""" + CREATE TABLE IF NOT EXISTS mereni ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + cas TEXT NOT NULL, + teplota REAL NOT NULL, + vlhkost REAL NOT NULL + ) +""") +conn.commit() +print("Tabulka mereni vytovřena (nebo již existuje).☺") + +testovaci_data = [ + ("2026-03-18 08:00:00", 22.5,45.0), + ("2026-03-18 08:05:00", 23.5,48.0), + ("2026-03-18 08:10:00", 23.2,44.0), + ("2026-03-18 08:15:00", 22.8,49.0), + ("2026-03-18 08:20:00", 25.2,60.0), +] +cursor.executemany( + "INSERT INTO mereni (cas, teplota, vlhkost) VALUES (?, ?, ?)", + testovaci_data +) +conn.commit() +print(f"Vloženo {len(testovaci_data)} záznamů") + +print("--- Všechna měření ---") +cursor.execute("SELECT * FROM mereni") +for radek in cursor.fetchall(): + print(radek) + +conn.close() +print("\nHotovo! Soubor iot_data.db vytvořen") \ No newline at end of file diff --git a/13_sqlite_python/02_serial_to_sqlite.py b/13_sqlite_python/02_serial_to_sqlite.py new file mode 100644 index 0000000..e69de29 diff --git a/13_sqlite_python/03_sql_dotazy.py b/13_sqlite_python/03_sql_dotazy.py new file mode 100644 index 0000000..9b81c66 --- /dev/null +++ b/13_sqlite_python/03_sql_dotazy.py @@ -0,0 +1,37 @@ +import sqlite3 + +conn = sqlite3.connect("iot_data.sqlite") +cursor = conn.cursor() + +# Počet záznamů +cursor.execute("SELECT COUNT(*) FROM mereni") +pocet = cursor.fetchone()[0] +print(f"Celkem záznamů v databázi: {pocet}\n") + +if pocet == 0: + print("Databaze je prázdná! spusťte nejdřív 01 nebo 04") + conn.close() + exit() + +# Pruměrná teplota a vlhkost +cursor.execute("SELECT AVG(teplota), AVG(vlhkost) FROM mereni") +avg_t, avg_v = cursor.fetchone() +print(f"Průmerná teplota: {avg_t:.1f}°C") +print(f"Průmerná vlhkost: {avg_v:.1f}%") + +#Maximalní a minimální hodnoty +cursor.execute("SELECT MAX(teplota), MIN(teplota) FROM mereni") +max_t, min_t = cursor.fetchone() +print(f"Maximální teplota: {max_t:.1f}°C") +print(f"Minimální teplota: {min_t:.1f}°C") + +cursor.execute("SELECT MAX(vlhkost), MIN(vlhkost) FROM mereni") +max_v, min_v = cursor.fetchone() +print(f"Maximální vlhkost: {max_v:.1f}°C") +print(f"Minimální vlhkost: {min_v:.1f}°C") + +#Měření s teploutou nad 25°C +cursor.execute("SELECT COUNT(*) FROM mereni WHERE teplota > 25") +nad_25 = cursor.fetchone()[0] +print(f"\nPočet měření s teplotou > 25°C: {nad_25}x") + diff --git a/13_sqlite_python/04_demo_generator.py b/13_sqlite_python/04_demo_generator.py new file mode 100644 index 0000000..ccc5be6 --- /dev/null +++ b/13_sqlite_python/04_demo_generator.py @@ -0,0 +1,45 @@ +import sqlite3 +import random +from datetime import datetime, timedelta + +DB_FILE = "iot_data.sqlite" +POCET_MERENI = 50 + +conn = sqlite3.connect(DB_FILE) +cursor = conn.cursor() + +cursor.execute(""" + CREATE TABLE IF NOT EXISTS mereni ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + cas TEXT NOT NULL, + teplota REAL NOT NULL, + vlhkost REAL NOT NULL + ) +""") +conn.commit() +print("Tabulka mereni vytovřena (nebo již existuje).☺") + +#Generovani dat - začínáme od aktualního času, měření probíha každých 5 vteřin +cas_start = datetime.now() - timedelta(seconds=POCET_MERENI*5) +zakladni_teplota = 22.0 #píšeme .0 z důvodu toho aby se počítalo s FLOAT dat.typem +zakladni_vlhkost = 50.0 + +data= [] +for i in range(POCET_MERENI): + cas = cas_start + timedelta(seconds=i*5) + #Simulace realistickych hodnot s mírným kolísáním + teplota = round(zakladni_teplota + random.uniform(-3.0,5.0),1) + vlhkost = round(zakladni_vlhkost + random.uniform(-20.0,15.0),1) + data.append((cas.strftime("%Y-%m-%d %H:%M:%S"),teplota,vlhkost)) + +cursor.executemany( + "INSERT INTO mereni (cas, teplota, vlhkost) VALUES (?, ?, ?)", + data +) +conn.commit() +print(f"Vygenerováno {POCET_MERENI} měření do {DB_FILE}") +print(f"Časový rozsah: {data[0][0]} - {data[-1][0]}") +print(f"Ukázka prvních 5 záznamů:") +for cas, t, v in data[:5]: + print(f"{cas} | {t}°C | {v}%") +conn.close() \ No newline at end of file diff --git a/13_sqlite_python/05_print.py b/13_sqlite_python/05_print.py new file mode 100644 index 0000000..3fb0072 --- /dev/null +++ b/13_sqlite_python/05_print.py @@ -0,0 +1,12 @@ +import sqlite3 + +conn = sqlite3.connect("iot_data.sqlite") +cursor = conn.cursor() + +print("--- Všechna měření ---") +cursor.execute("SELECT * FROM mereni") +for radek in cursor.fetchall(): + print(radek) + +conn.close() +print("\nHotovo! Soubor iot_data.sqlite přečtený (možná vytvořený prázdný)") \ No newline at end of file diff --git a/13_sqlite_python/iot_data.db b/13_sqlite_python/iot_data.db new file mode 100644 index 0000000..e69de29 diff --git a/13_sqlite_python/iot_data.sqlite b/13_sqlite_python/iot_data.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..7b026e6242a55767fa20bccdc7b67580e9e1fb42 GIT binary patch literal 20480 zcmeI3OKe+37sq}5h~r0W9wn^{AHA2-Fny$-eeZRgdx7>ijgvUG<1|en;n@&u8j+^Z z1P}|P(#5xcB9=gb1wxb!LWu5IRfxxeMu-JSAhBS9#R4IqAQoM~nTMU?%!t+ZEk4aC z$#v}CJ#*%N=8osyGjrr{b!n|(Hcy^9v9M-3folSW5dhN+1Oj3Fjo@#)82Ey|*Dmz` ze=6a?{^z#zAr(x0A4nJQk1kpPt$q$_!Etl#qNJYhh|E}*^)V19I2MfE|#n;oM`OBGj~5bW<*Xmt zw^o{(-Pgev7go*L(%h^$Rmb0>)#}DaYmLX2Pp&PP=x|l?@srEPA3eFc_V-6UP$=5?kWG#6OL{9$$@@<2z!%$3Ba_5qm0Di|vdBdcW#@r}s?n zT<`wgaP*t#d(ju7i&2R7_x#xNVb9AwD?Ot<+ao_mK8d^*ITfi#c7?BmzX-n_ekOb* zygT$~=*!Uip%+8Tp^?zG;7`Gig6D#d1;>In8NV8z8*dqBj5#B3Bm&4GoF(X*GZtXmII(&(~j`*{z%DkJug z`(?%uL1QgmZFPVht^1HPx*fEA*Sira)G_qzUb!(Bjd21hyk6@bxo3_C1y)-#Pv+&u z92XpJ1P<{dnUj;Y2M#v|wd5r%>*Q_)>B0~NF0DiLYu=Q*3e>MiC5nU#|mV*i3e3rz4c$PoqULP6ACxy;TWGcqzqLp;O)v?*#otROKs7Z?iT z=b4|@G$p&cO%5Xs!@@tSj>x9YfQZ`Jn z#s;sIlBjk>PSQwoTX2vIN{R{+8!h^ES=aT|aqJog zPfgJl3Gz+_i8iZ(CklXjugCk}}C*$NUJ6t%a9i=3Ry6*>b;Nyw8` zkalNGE(`MCax#lTwpg2?#tu!gUqRa7b0MKE`5=;;;^+AJ!d8F*W{vEV8AAkxY%v1r z8QS`DWUrjWNEa@!dSUW1JCZ#L(r(WnU_=B5r)ZnzFFD7@fP2E`w5XjZNEEV46}_p?+$eVmW7~FqLa4i4L2hVP=9-a=oW$7X zIRRCsN0V$*kk|(WSrIn3%1MlEdw80h$BPQDs(uA|)%7RBaf6J+Nn4@QTgQ1g$QA`@ zgX^%;Zjp68CA-IDoRM`xTp-uUjp4BE(tdo^_usX05-;ZVTyd<$d)74ya${5+Niy3c zEhlNfc~D^5<3gqsq}>VQ*m-t})kn$AjmChBkv2<`a$~s-2dkHvl2$@)3?uFG%V`gZ z%Z+6>hQo;q%ovHuNSw6cFjHlEKt<@%t01x4P&r;X2gS4O3=)--G{n4C7~!PVL&c1uy1GmY!*D$0_P4ZEJ1R4iio?VoE4HG%!-(N?X!XsB+IObdzq|d z$Pi{_h$$aFMsxE<`nLf7=%N+S3TOqi0$KsBfL1^&pcT*xXa%$aS^=%V|B(W5Ba|`t z!h|Jy|9=eA=jm_LAEaN>`G46;0iFN9dg+Ai>-;}`kf-zixQ-_0+dBVGA0_MjfAnCbk#q}$+10iFM+3k^=Q2O5L){y&y_HIV)){Z9H!dJb3rCsIG8KE}6n z(F$kb&g4->Jn31MO8giF#W35>K5B1CZ0q?_d5_6~dDoYE% s6g}Yfz(oa#p3yA@m|U6wrZ;&=PSU;8ybaLaW4fRqF_q10g$i%dUk$00{Qv*} literal 0 HcmV?d00001 diff --git a/13_sqlite_python/poznamky.txt b/13_sqlite_python/poznamky.txt new file mode 100644 index 0000000..33dc4fa --- /dev/null +++ b/13_sqlite_python/poznamky.txt @@ -0,0 +1,6 @@ +mkdir 13_sqlite_python +cd 13_sqlite_python +python -m venv .venv +.venv\Scripts\activate +pip install pyserial +code . \ No newline at end of file