From d1e4ca8b97ce31122f3fe2aa6761ebfbfac4165c Mon Sep 17 00:00:00 2001 From: jeanGaston Date: Wed, 1 May 2024 23:03:07 +0200 Subject: [PATCH] Updates --- Program/__pycache__/mail.cpython-311.pyc | Bin 0 -> 4142 bytes Program/datascraper.py | 5 +- Program/mail.py | 95 +++++++++++++++++++++++ Program/main.py | 4 +- Program/templates/admin.html | 2 +- Program/templates/history.html | 2 +- Program/templates/index.html | 2 +- 7 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 Program/__pycache__/mail.cpython-311.pyc create mode 100644 Program/mail.py diff --git a/Program/__pycache__/mail.cpython-311.pyc b/Program/__pycache__/mail.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d55802b08d0e27e0b0db4e4f4f0a20773fb90fa2 GIT binary patch literal 4142 zcmb^!U2GFade$DV*MD&mLLfchwgnN)g@gcCatP83v6HyuPqvR9IofFPZW4p-HM?UH zg58=5scFOst~x}d3e`^>r}QMQI_Y@5mWO*>SFUP}6bb3XL#2DLgesvv-8bv_FM-oN z-0bY^H#6V&&G*gB_p^WUc$^4I`Y*@kz5wW7tWzzPP2j}`0Nh71lDRlaa5EgoU`yPR zu+CUb*c!((7{;t|+l5^IQ<*Ib2`Uj;tfrS#!@jQNwPgoXJkPU ziIPYunnco?BC2!Zjj)o`RV^z@x~M5qbU~5D8|S5XR{Z*LRFsH#BN9s}VIn0`*|@xDYkQr+L%(Cg@>;d-WPe;*ZYW6$Kji`k?LNv9#3$6GHWM{arH{?a8{EXoQTLozhmy3rKck-5Lgl;2Eutms1+>V4z76|d=iMwP zSf?Y5_OspjpRlXkea_{7J4Gm9Lb5I@2`LuW#l;v|5D6ICoEnd-i?QUqC~5QQ1YCao zl!?wrj) zp$2Sb^tx%}qM8Kpq80H>VjW~t#Dug2R0~OPNfaQxiGktS{;t@?vP)kHz_Dm%e zQHm=XVLYiloW68fi4q^Cj+(=ve8sg;E4UNtsJRhpOU0#Fa(Q=vZ5R`chjnyQ@=Cw;Bd5uS)l&rVN;A`~+aBwzzUKNTu7@A)-$ z^C%D7l8^}HB|^ZtY0PA)T~ClyJa&l+pqxfXT&K3UIv-2I0IbKvq7F%))rkhj2lB#) zP)A@Xs-#FvO;UU{9V0#u_12V~HBX<~6O|LA&doCd)iq{DnujfnQ>sR&i!DE^E7~DPxUlO}D?j=A7Sx2&mj;}^_Y{d;1#s3( z%D!n$o!6v9AJeBdb)DKw88sj9*bT3K9{fuV{n&xrJ9GYx_Rie7jU8{~#y7mXa%0b( zyFTr^-Ip6KweQOfukbg|m0Eue0KOS4?L3k{Z|pn*6$TtPC(Ar?@3=F#I+&k&GV)KS z@xlDcV8OLebS>okC2arX-H+e>{n8psi8B&1L&KRoc|>HX29v+ zXMJjE_jg&JcGzI#X_t+S?6WfXWM{x*jRH}v*a2cU_{CRnN)QPfV!`Da+!zC!yd9kN80PMK*Ylk^B^Lx*P=3qk^>n#>8N9Ea@_k`j-7Sf*KqWbt~!pq zEzZD>GW*+Bn)PS79^`7)$>siVU_3A!5f6(ap{WTLB_PrAOGFZ4R2#gb+uVI!9$UFr3;fbY5*j}hfKwMW%t5_~S@{bxsl z;{nP?(;6&5?aGo8O%sI*a|($rs7ZzL6GOk99SfPJPaUDaaBw;pn2b>OL?9d<8V$@w z0u$4aL;{uxIjiG9^9JZkZPB=@D?Wi@wkqYK)D@R>G7J8XIV*0KIVq+d#Vlw*3t1+$ zENHp_?rOjN&V#oLuD6P=x4?}E z?y8C9hQRV|{3pSWgGS3x0iP}6vj#p}YTt4H@Mnkr(DTQh+_`7=_A+wWjy~%?RuB%X za4T=$J+aoYrseyYuWG$_aP`c}nGJW_J>P?ik4`-9e9}>H4;I~nhFMD<@4Z8-@2|XH z!I*i}@#xxPQgELxx=$PK(=UGnf7D{M^cIA^qR?jueM}$+b8|PxZ;j{7=LKkinhcs< zc+;Ri1fbcVx0@PiFx|_wbg?nXl`UUdn^U$|oAE0zC!So6?*G3O=Tu5bijf8Qb&w&C zfOu}6t~kVUgNV;Ud5Ey{3fxjzQW9#?XRBN&2Qf)lc;ze98oL41W=7;cBkkAFtK65) zP&ye*R*+^VUKOyW%37h z&^{X^A?z6HSIX-{*pB;=`c^YB0m#uixNKxrxPmEdQc0)EQ@jaIy4Y?Ij)3y zjpkZH2aM)gLM=J-DWO)QTAv|r&U{L!&8XHg=38;jU2fr9aL!q7?dCemsMdtIU0hok Y)tX}#Zj>vdhF0LXUqKGBtugoRKg3+fhyVZp literal 0 HcmV?d00001 diff --git a/Program/datascraper.py b/Program/datascraper.py index 550d653..65a6614 100644 --- a/Program/datascraper.py +++ b/Program/datascraper.py @@ -1,3 +1,4 @@ +from mail import * import schedule import threading import time @@ -23,13 +24,13 @@ def BltDataScrap(): Bat = int(value[20:22], 16) #print(f"Temp : {temp} °c \n HR : {HR} % , \n Batterie : {Bat} %") add_sensor_data(DBFILE, sensor_dict[device.addr], time.strftime("%Y-%m-%d %H:%M:%S"), temp, HR, Bat) - if temp > MAX_TEMP : + """if temp > MAX_TEMP : email(RECIPIENT, MESSAGE_TEMP, temp, sensor_dict[device.addr], time.strftime("%Y-%m-%d %H:%M:%S") ) print("mail sent for temp max") elif temp > MAX_HR : email(RECIPIENT, MESSAGE_HR, HR, sensor_dict[device.addr], time.strftime("%Y-%m-%d %H:%M:%S") ) - print("mail sent for HR max") + print("mail sent for HR max") """ return 0 diff --git a/Program/mail.py b/Program/mail.py new file mode 100644 index 0000000..690db63 --- /dev/null +++ b/Program/mail.py @@ -0,0 +1,95 @@ +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +import sqlite3 +import threading + +import schedule +from env import * + +MESSAGE_TEMP = """ + +Hi {recipient}, + +The temperature of {Sensor} as reached {Val} °c at {TimeStamp}. + +""" +MESSAGE_HR = """ + +Hi {recipient}, + +The HR of {Sensor} as reached {Val} percent at {TimeStamp}. + +""" + +def email(recipient_email, message, ReachedVal, Sensor, TimeStamp): + + """ + Sends emails with the following arguments: + - Recipient's email address + - Message body + - Reached value either for temp or HR + - The sensor on wich the values are maxed out + - the time stamp + """ + port = SMTP_PORT # For SSL + smtp_server = SMTP + sender_email = SMTP_ID # Enter your address + password = SMTP_PWD + # Create a MIME message + msg = MIMEMultipart() + msg['From'] = sender_email + msg['To'] = recipient_email + msg['Subject'] = f"One alert on {Sensor}" # Update with your email subject + + # Add message body + body = message.format(recipient=recipient_email, Sensor=Sensor, Val=ReachedVal, TimeStamp=TimeStamp) + msg.attach(MIMEText(body, 'plain')) + + try: + # Start a TLS encrypted connection + server = smtplib.SMTP(smtp_server, port) + server.starttls() + + # Login to the SMTP server + server.login(sender_email, password) + + # Send the email + server.sendmail(sender_email, recipient_email, msg.as_string()) + print("Email sent successfully!") + except Exception as e: + print(f"Failed to send email. Error: {e}") + finally: + # Close the connection + server.quit() + +def check_and_send_email(): + # Connect to the database + conn = sqlite3.connect(DBFILE) + c = conn.cursor() + + # Retrieve the last record from SensorData table + c.execute("SELECT * FROM SensorData ORDER BY Id DESC LIMIT 1") + last_record = c.fetchone() + + if last_record: + # Extract HR and Temp values from the last record + _, sensor, time, temp, hr, _ = last_record + + # Check if HR or Temp exceed set values + if temp > MAX_HR: + email(RECIPIENT, MESSAGE_TEMP, temp, sensor, time) + elif hr > MAX_TEMP: + email(RECIPIENT, MESSAGE_HR, temp, sensor, time) + + else: + print("No data found in the database.") + + # Close database connection + conn.close() + +def RunInThread_MailAlerts(): + print("######################################################################\nOpen Thread mail check Alert") + threading.Thread(target=check_and_send_email, daemon=True).start() + +def ScheduleMailAlerts(): + schedule.every(2).minutes.do(RunInThread_MailAlerts) #run every 2 minutes \ No newline at end of file diff --git a/Program/main.py b/Program/main.py index b2dc1a0..8ac0017 100644 --- a/Program/main.py +++ b/Program/main.py @@ -1,14 +1,14 @@ -import smtplib -import ssl from database import * from datascraper import * from Webserver import RunInThread_WebServer +from mail import ScheduleMailAlerts from env import * import schedule check_database(DBFILE) RunInThread_WebServer() ScheduleDataScrap() +ScheduleMailAlerts() while True: diff --git a/Program/templates/admin.html b/Program/templates/admin.html index d41d527..3e13a48 100644 --- a/Program/templates/admin.html +++ b/Program/templates/admin.html @@ -4,7 +4,7 @@ Sensor Data Dashboard - +