· 5 years ago · Jun 03, 2020, 02:02 PM
1"""
2library
3"""
4import sys
5import tkinter
6import tkinter as tk
7import matplotlib.pyplot as plt
8import sqlite3
9import json
10import time
11"""
12 From library
13"""
14from tkinter import *
15from tkinter import font as tkfont
16from urllib.request import urlopen
17from random import uniform
18from tkinter import messagebox
19
20"""
21- function message box ext window
22"""
23def exit_window():
24 sys.exit()
25
26# Mebuat windows object
27window = tkinter.Tk()
28window.title("Smart System - IoT")
29
30# Buat menu dari aplikasi
31menubar = tkinter.Menu(window)
32
33# Menu langsung keluar
34menubar.add_command(label = "Exit", command = exit_window)
35# Informasikan menunya yang mana
36window.config(menu = menubar)
37
38# Membuat ukuran Tkinter GUI
39window.geometry("420x700")
40
41# Create Database
42network = sqlite3.connect("database.db")
43# Create cursor
44instruction_cursor = network.cursor()
45
46# Create Table
47instruction_cursor.execute("""CREATE TABLE IF NOT EXISTS tabel_tanaman(
48 pohon INTEGER PRIMARY KEY,lat REAL,lon REAL,
49 id_date TEXT,suhu_udara FLOAT,
50 kelembapan_udara FLOAT,curah_hujan FLOAT,
51
52 sinar_uv FLOAT,suhu_tanah FLOAT,
53 kelembapan_tanah FLOAT,pH_tanah FLOAT,
54
55 pH_N FLOAT,ph_P FLOAT,pH_K FLOAT
56 )""")
57
58
59# Mebuat Submit Function Untuk Database
60def record_database():
61 """
62 - for bagian pertama ambil data dari tree,sensor_type,value,date from API
63 - for bagian kedua untuk ambil latitude secara random pakai library uniform
64 - for bagian ketiga untuk ambil longitude secara random pakai library uniform
65 """
66 tree = id_tree.get()
67
68 data_sensor = []
69
70 repeat = 10
71 for sensor_type in range(repeat):
72 alamat = f"https://belajar-python-unsyiah.an.r.appspot.com/sensor/read?npm=1904105010067&id_tree={tree}&sensor_type={sensor_type}"
73
74 # Buka koneksi ke URL
75 url = urlopen(alamat)
76 # Ambil/baca dokumen
77 dokumen = url.read().decode("utf-8")
78 # Proses mengambil dan tampilkan dokumen
79 data = json.loads(dokumen)
80
81 # Mengambil data dari alamat per data
82 data_tree = f"{data['id_tree']}"
83 # Mengambil data dari alamat per data
84 data_when = f"{data['when']}"
85
86 # Tambahkan value pada data sensor
87 data_sensor.append(data['value'])
88
89 """
90 - Perulangan antara range(1,20)
91 - Ambil angka random uniform
92 """
93 for coordinate_x in range(1,20):
94 coordinate_x = uniform(10, 80)
95 """
96 - Perulangan antara range(1,20)
97 - Ambil angka random uniform
98 """
99 for coordinate_y in range(1,20):
100 coordinate_y = uniform(10, 80)
101
102 """
103 -Tampilkan Hasil coordinate lat x dan lat y
104 """
105 print(f"{coordinate_x}")
106 print(f"{coordinate_y}")
107
108 # Create Database
109 network = sqlite3.connect("database.db")
110 # Create cursor
111 instruction_cursor = network.cursor()
112
113 # Insert Into Table
114 instruction_cursor.execute("INSERT INTO tabel_tanaman VALUES (:id_tree, :coordinate_x, :coordinate_y, :id_when, :suhu_udara, :kelembapan_udara, :curah_hujan, :sinar_uv, :suhu_tanah, :kelembapan_tanah, :pH_tanah, :pH_N, :pH_P, :pH_K)",
115 {
116 'id_tree' : data_tree,'coordinate_x' : coordinate_x,
117 'coordinate_y' : coordinate_y,'id_when' : data_when,
118
119 'suhu_udara' : data_sensor[0],'kelembapan_udara' : data_sensor[1],
120 'curah_hujan' : data_sensor[2],'sinar_uv' : data_sensor[3],
121 'suhu_tanah' : data_sensor[4],'kelembapan_tanah' : data_sensor[5],
122 'pH_tanah' : data_sensor[6],'pH_N' : data_sensor[7],
123 'pH_P' : data_sensor[8],'pH_K' : data_sensor[9]
124 })
125
126 # Commit changes
127 network.commit()
128 # Close network
129 network.close()
130
131 # Clear The Text Boxes
132 id_tree.delete(0,END)
133
134 """
135 - messagebox after record database your input
136 """
137 show = messagebox.showinfo("Smart System - IoT","Save To Database")
138
139
140# Membuat Execute Function untuk hasil database
141def show_database():
142 """
143 - Ambil data tabel_tanaman dari data yang sudah disimpan
144 - Tampilkan data menggunakan perulangan for dari data yang sudah diambil dari record_database
145 - Tampilkan hasil database di new window(khusus database)
146 """
147
148 # Create Database
149 network = sqlite3.connect("database.db")
150 # Create cursor
151 instruction_cursor = network.cursor()
152
153 # Execute the database
154 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
155 records = instruction_cursor.fetchall()
156
157 show_database = ''
158 for record in records:
159 # tampilkan data yang sudah diambil dari record_database
160 show_database = show_database + f"\n\n Id : {record[0]} | lat : -{record[1]} | lon : {record[2]} \n Date : {record[3]} \n\n | Suhu_udara : {record[4]:.2f} K | Kelembapan_udara : {record[5]:.2f} | curah_hujan : {record[6]:.2f} % | \n | Sinar_uv : {record[7]:.2f} mm | Suhu_tanah : {record[8]:.9f} nm | \n | kelembapan_tanah: {record[9]:.2f} C | pH Tanah : {record[10]:.2f} % \n | pH N : {record[11]:.2f} | pH P : {record[12]:.2f} | pH K : {record[13]:.2f} | "
161
162 # Mebuat windows object
163 window = Tk()
164 window.title("Final Database - IoT")
165
166
167 # Buat menu dari aplikasi
168 menubar = tkinter.Menu(window)
169
170 # Menu operasi
171 menu_operasi = tkinter.Menu(menubar, tearoff=0)
172 # Tempel menu_operasi pada menubar
173 menubar.add_cascade(label = " database ")
174 window.config(menu = menubar)
175
176 # Mmebuat ukuran Tkinter GUI
177 window.geometry("850x750")
178 # Mmebuat type fonts
179 database_fonts = tkfont.Font(family = "Times New Roman", size = 9, weight = "bold")
180 # membuat label nama
181 database_labels = Label(window, text="database", font = database_fonts)
182 # membuat jarak
183 database_labels.grid(row = 0, column = 1 ,columnspan = 1,ipadx = 400)
184
185 # database box
186 database_box = Label(window, text = show_database)
187 database_box.grid(row = 2 ,column = 1,columnspan = 1)
188
189 # Commit changes
190 network.commit()
191 # Close network
192 network.close()
193
194 """
195 - messagebox show database your in record database
196 - input selang waktu 1 detik
197 """
198 time.sleep(1)
199 show = messagebox.showinfo("Smart System - IoT","Show Database")
200
201
202
203def delete_database():
204 """
205 - delete id dari database(yang kita ingin hapus)
206 - delete id di box,setelah delete id
207 """
208 # Create Database
209 network = sqlite3.connect("database.db")
210 # Create cursor
211 instruction_cursor = network.cursor()
212 # Delete menggunakan id tanaman yang ingin kalian delele
213 instruction_cursor.execute("DELETE from tabel_tanaman WHERE oid = " + delete_box.get())
214 # bersihkan box dri data yang sudah diinput
215 delete_box.delete(0, END)
216 # Commit save
217 network.commit()
218 # Close network
219 network.close()
220
221def delete_all_database():
222
223 exit = messagebox.askquestion("Smart Sysem - Iot ","Are you sure to delete all database?")
224 if exit == 'yes':
225
226 # Create Database
227 network = sqlite3.connect("database.db")
228 # Create cursor
229 instruction_cursor = network.cursor()
230
231 # Drop table tabel tanaman yang ingin dihapus
232 instruction_cursor.execute("DROP TABLE IF EXISTS tabel_tanaman;")
233 instruction_cursor.execute("""CREATE TABLE IF NOT EXISTS tabel_tanaman(
234 pohon INTEGER PRIMARY KEY,lat REAL,lon REAL,
235 id_date TEXT,suhu_udara FLOAT,
236 kelembapan_udara FLOAT,curah_hujan FLOAT,
237 sinar_uv FLOAT,suhu_tanah FLOAT,
238 kelembapan_tanah FLOAT,pH_tanah FLOAT,
239 pH_N FLOAT,ph_P FLOAT,pH_K FLOAT
240 )""")
241
242 # Commit save
243 network.commit()
244 # Close network
245 network.close()
246
247 else :
248 """
249 - Membuat message box info
250 """
251 tk.messagebox.showinfo("Smart System - IoT", "Return to the database screen")
252
253
254
255def suhu_udara():
256 # Create Database
257 network = sqlite3.connect("database.db")
258 # Create cursor
259 instruction_cursor = network.cursor()
260
261 # Execute the database
262 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
263 records = instruction_cursor.fetchall()
264
265 x = []
266 y = []
267 for suhu_udara in records:
268 # x ambil data index 4 dalam records
269 x.append(suhu_udara[4])
270 # x ambil data index 3 dalam records
271 y.append(suhu_udara[3])
272
273 plt.plot(x,y, '-o','blue')
274 plt.show()
275
276 # Close network
277 network.close()
278
279def kelembapan_udara():
280 network = sqlite3.connect("database.db")
281 # Create cursor
282 instruction_cursor = network.cursor()
283
284 # Execute the database
285 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
286 records = instruction_cursor.fetchall()
287
288 x = []
289 y = []
290 for kelembapan_udara in records:
291 # x ambil data index 5 dalam records
292 x.append(kelembapan_udara[5])
293 # x ambil data index 3 dalam records
294 y.append(kelembapan_udara[3])
295
296 plt.plot(x, y, '-o')
297 plt.show()
298
299 # Close network
300 network.close()
301
302
303def curah_hujan():
304 """
305 -
306 """
307 network = sqlite3.connect("database.db")
308 # Create cursor
309 instruction_cursor = network.cursor()
310
311 # Execute the database
312 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
313 records = instruction_cursor.fetchall()
314
315 x = []
316 y = []
317 for curah_hujan in records:
318 # x ambil data index 6 dalam records
319 x.append(curah_hujan[6])
320 # x ambil data index 3 dalam records
321 y.append(curah_hujan[3])
322
323 plt.plot(x, y, '-o')
324 plt.show()
325
326 # Close network
327 network.close()
328
329def sinar_uv():
330 """
331 -
332 """
333 network = sqlite3.connect("database.db")
334 # Create cursor
335 instruction_cursor = network.cursor()
336
337 # Execute the database
338 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
339 records = instruction_cursor.fetchall()
340
341 x = []
342 y = []
343 for sinar_uv in records:
344 # x ambil data index 7 dalam records
345 x.append(sinar_uv[7])
346 # x ambil data index 3 dalam records
347 y.append(sinar_uv[3])
348
349 plt.plot(x, y, '-o')
350 plt.show()
351
352 # Close network
353 network.close()
354
355def suhu_tanah():
356 """
357 -
358 """
359 network = sqlite3.connect("database.db")
360 # Create cursor
361 instruction_cursor = network.cursor()
362
363 # Execute the database
364 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
365 records = instruction_cursor.fetchall()
366
367 x = []
368 y = []
369 for suhu_tanah in records:
370 # x ambil data index 8 dalam records
371 x.append(suhu_tanah[8])
372 # x ambil data index 3 dalam records
373 y.append(suhu_tanah[3])
374
375 plt.plot(x, y, '-o')
376 plt.show()
377
378 # Close network
379 network.close()
380
381
382def kelembapan_tanah():
383 """
384 -
385 """
386 network = sqlite3.connect("database.db")
387 # Create cursor
388 instruction_cursor = network.cursor()
389
390 # Execute the database
391 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
392 records = instruction_cursor.fetchall()
393
394 x = []
395 y = []
396 for kelembapan_tanah in records:
397 # x ambil data index 9 dalam records
398 x.append(kelembapan_tanah[9])
399 # x ambil data index 3 dalam records
400 y.append(kelembapan_tanah[3])
401
402 plt.plot(x, y, '-o')
403 plt.show()
404
405 # Close network
406 network.close()
407
408
409def pH_tanah():
410 """
411 -
412 """
413 network = sqlite3.connect("database.db")
414 # Create cursor
415 instruction_cursor = network.cursor()
416
417 # Execute the database
418 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
419 records = instruction_cursor.fetchall()
420
421 x = []
422 y = []
423 for pH_tanah in records:
424 # x ambil data index 10 dalam records
425 x.append(pH_tanah[10])
426 # x ambil data index 3 dalam records
427 y.append(pH_tanah[3])
428
429 plt.plot(x, y, '-o')
430 plt.show()
431
432 # Close network
433 network.close()
434
435
436def pH_Nitrogen():
437 """
438 -fungsi ph Nitrogen
439 """
440 # buka jaringan koneksi
441 network = sqlite3.connect("database.db")
442 # Create cursor
443 instruction_cursor = network.cursor()
444
445 # Execute the database
446 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
447
448 records = instruction_cursor.fetchall()
449
450 x = []
451 y = []
452 for pH_Nitrogen in records:
453 # x ambil data index 11 dalam records
454 x.append(pH_Nitrogen[11])
455 # y ambil data index 3 dalam records
456 y.append(pH_Nitrogen[3])
457
458 plt.plot(x, y, '-o')
459 plt.show()
460
461 # Close network
462 network.close()
463
464
465def pH_fosfor():
466 """
467 -
468 """
469 network = sqlite3.connect("database.db")
470 # Create cursor
471 instruction_cursor = network.cursor()
472
473 # Execute the database
474 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
475 records = instruction_cursor.fetchall()
476
477 x = []
478 y = []
479 for pH_posfor in records:
480 # x ambil data index 12 dalam records
481 x.append(pH_posfor[12])
482 # y ambil data index 3 dalam records
483 y.append(pH_posfor[3])
484
485 plt.plot(x, y, '-o')
486 plt.show()
487
488 # Close network
489 network.close()
490
491
492def pH_Kalium():
493 """
494 -
495 """
496 network = sqlite3.connect("database.db")
497 # Create cursor
498 instruction_cursor = network.cursor()
499
500 # Execute the database
501 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
502 records = instruction_cursor.fetchall()
503
504 x = []
505 y = []
506 for pH_kalium in records:
507 # x ambil data index 13 dalam records
508 x.append(pH_kalium[13])
509 # x ambil data index 3 dalam records
510 y.append(pH_kalium[3])
511
512
513 plt.plot(x, y, '-o')
514 # Tampilkan grafik
515 plt.show()
516
517 # Close network
518 network.close()
519
520
521def All_grafik():
522 """
523 - fungsi tampilkan semua grafik
524 -
525 """
526 # Create Database
527 network = sqlite3.connect("database.db")
528 # Create cursor
529 instruction_cursor = network.cursor()
530
531 # Execute the database
532 instruction_cursor.execute("SELECT *, oid FROM tabel_tanaman")
533 records = instruction_cursor.fetchall()
534
535 mulai = 4
536 for one_tipe in range(0,10):
537 x = []
538 y = []
539 for row in records:
540 # x ambil data index 0 dalam records
541 x.append(row[0])
542 # x tambah data index baru yaitu 4 dari bukan keluaran records
543 y.append(row[mulai])
544
545 print(x)
546 print(y)
547 mulai += 1
548
549 # membuat koordinat x dan y
550 plt.plot(x, y, '-o')
551 plt.title("All Grafik")
552 plt.xlabel("Id Tanaman")
553 plt.ylabel("Time")
554 #tambahkan keterangan dalam python legend
555 plt.legend(["Suhu Udara", "Kelembapan Udara", "Curah Hujan", "Sinar UV", "Suhu Tanah", "kelembapanTanah", "pH Tanah","pH Nitrogen", "pH Fosfor", " pH Kalium"])
556
557 plt.show()
558
559 # Close network
560 network.close()
561
562
563# Create Text Boxes
564"""
565- Create Text Box
566- Using type design : Background
567"""
568id_tree = Entry(window, width = 19)
569id_tree.configure(background = "gainsboro")
570id_tree.grid(row = 4,column = 1,columnspan = 2,pady = 20,ipady = 3)
571
572delete_box = Entry(window, width = 18)
573delete_box.configure(background = "gainsboro")
574delete_box.grid(row = 7,column = 1,columnspan = 2,ipady = 3)
575
576
577# Create Text Box Labels Names
578"""
579- Create Label Names for Textbox
580- take library tkfont from tkinter library
581- Using type : font family, size, weight(type_text)
582"""
583id_tree_fonts = tkfont.Font(family = "Times New Roman", size = 11, weight = "bold")
584id_tree_labels = Label(window, text=" Coffe Id", font = id_tree_fonts)
585id_tree_labels.grid(row = 4, column = 0, columnspan = 1,pady = 20,padx =30)
586
587delete_box_fonts = tkfont.Font(family = "Times New Roman", size = 11, weight = "bold")
588delete_box_labels = Label(window, text="Delete Id", fg = "darkred",font = delete_box_fonts)
589delete_box_labels.grid(row = 7, column = 0, columnspan = 1,ipady = 20)
590
591
592
593# Create Button
594"""
595- Create Add Record Database To get data from database
596- Create Button To execute data that has been saved from Record Database
597"""
598# Create button fonts
599submit_button_fonts = tkfont.Font(family = "Times New Roman", size = 10, weight = "bold")
600# Create record button
601submit_button = Button(window, text = "Add Record To Database", fg = "darkgreen", font = submit_button_fonts, command = record_database)
602submit_button.grid(row = 6, column = 0, columnspan = 2, pady = 20, padx = 20, ipadx = 100, ipady = 10)
603
604# Create Show Button
605execute_button = Button(window, text = "Show Database",fg = "darkgreen",command = show_database, font = submit_button_fonts)
606
607execute_button.grid(row = 9,column = 0,ipadx = 20,pady = 20,ipady = 3)
608
609# Create Delete Button
610delete_button = Button(window, text = "Delete Database", fg = "darkred", command = delete_database, font = submit_button_fonts)
611
612delete_button.grid(row = 9,column = 1,ipadx = 15,pady = 10,ipady = 3)
613
614# Delete all database
615delete_all_button = Button(window, text = "Delete All Database",fg = "darkred",command = delete_all_database, font = submit_button_fonts)
616
617
618delete_all_button.grid(row = 15,column = 1,ipadx = 7,pady = 10,ipady = 3)
619
620# suhu_udara Button
621suhu_udara_button = Button(window, text = "Suhu udara", command = suhu_udara, font = submit_button_fonts)
622suhu_udara_button.grid(row = 10,column = 0,ipadx = 22,pady = 5,ipady = 3)
623"""
624"""
625
626
627# Kelembapan_udara Button
628kelembapan_udara_button = Button(window, text = "Kelembapan udara", command = kelembapan_udara, font = submit_button_fonts)
629kelembapan_udara_button.grid(row = 10,column = 1,ipadx = 1,pady = 10,ipady = 3)
630"""
631"""
632
633# curah_hujan Button
634curah_hujan_button = Button(window, text = "Curah Hujan", command = curah_hujan, font = submit_button_fonts)
635curah_hujan_button.grid(row = 11,column = 0,ipadx = 20,pady = 5,ipady = 3)
636"""
637"""
638
639# sinar_uv Button
640sinar_uv_button = Button(window, text = "Sinar UV", command = sinar_uv, font = submit_button_fonts)
641sinar_uv_button.grid(row = 11,column = 1,ipadx = 25,pady = 10,ipady = 3)
642"""
643"""
644
645# suhu_tanah Button
646suhu_tanah_button = Button(window, text = "Suhu Tanah", command = suhu_tanah, font = submit_button_fonts)
647suhu_tanah_button.grid(row = 12,column = 0,ipadx = 23,pady = 5,ipady = 3)
648"""
649"""
650
651# kelembapan_tanah Button
652kelembapan_tanah_button = Button(window, text = "kelembapan Tanah", command = kelembapan_tanah, font = submit_button_fonts)
653kelembapan_tanah_button.grid(row = 12,column = 1,ipadx = 1,pady = 10,ipady = 3)
654"""
655"""
656
657# pH_tanah
658pH_tanah_button = Button(window, text = "pH Tanah", command = pH_tanah, font = submit_button_fonts)
659pH_tanah_button.grid(row = 13,column = 0,ipadx = 28,pady = 5,ipady = 3)
660"""
661"""
662
663# pH_Nitrogen tanah
664pH_nitrogen_tanah_button = Button(window, text = "pH Nitrogen Tanah", command = pH_Nitrogen, font = submit_button_fonts)
665pH_nitrogen_tanah_button.grid(row = 13,column = 1,ipadx = 1,pady = 10,ipady = 3)
666"""
667"""
668
669# pH_fosfor_tanah_button
670pH_fosfor_tanah_button = Button(window, text = "pH Fospor Tanah", command = pH_fosfor, font = submit_button_fonts)
671pH_fosfor_tanah_button.grid(row = 14,column = 0,ipadx = 8,pady = 5,ipady = 3)
672"""
673"""
674
675# pH_kalium
676pH_kalium_tanah_button = Button(window, text = "pH Kalium Tanah", command = pH_Kalium, font = submit_button_fonts)
677pH_kalium_tanah_button.grid(row = 14,column = 1,ipadx = 5,pady = 10,ipady = 3)
678"""
679"""
680
681
682# A sensor suhu
683semua_suhu_sensor = Button(window, text = "All Suhu Grafik", fg = "darkgreen", font = submit_button_fonts, command = All_grafik)
684semua_suhu_sensor.grid(row = 15, column = 0, ipadx = 20, pady = 20, ipady = 3)
685"""
686"""
687
688# Commit Changes
689network.commit()
690
691instruction_cursor.execute("SELECT * FROM tabel_tanaman")
692for row in instruction_cursor.fetchall():
693 print(row)
694
695
696#Close network
697network.close()
698
699window.mainloop()