SIH2024 / app.py
Neurolingua's picture
Update app.py
9e1ff6c verified
from mistralai import Mistral
import numpy as np
import os
import time
import requests
import folium
from flask import Flask, render_template, jsonify, request, redirect, url_for, session
from twilio.rest import Client
import firebase_admin
import pickle
from firebase_admin import credentials, firestore
# Twilio Configuration
ACCOUNT_SID = 'AC7f8c344c6593572a0c925ab4c1b66cc6'
AUTH_TOKEN = 'e5f750f99a87e84ca5b87ddd0c421560'
FROM_PHONE = '+13613093564'
TO_PHONE = '+919080522395'
# Firebase Configuration
FIREBASE_CREDENTIALS_PATH = r"snippetscript-37175-firebase-adminsdk-cf1z8-7d509b09fd.json"
THINGSPEAK_API_KEY = "PIA8Z5BWH2DW6WLF"
CHANNEL_ID = "2785999"
# Global variable to track the last entry ID
last_entry_id = None
# with open(r'C:\Users\tiruv\Desktop\SIH\model.pkl', 'rb') as f:
# loaded_model = pickle.load(f)
def predict_conc(pdiff):
# Reverse log transformation
return pdiff
# Initialize Firebase
cred = credentials.Certificate(FIREBASE_CREDENTIALS_PATH)
firebase_admin.initialize_app(cred)
db = firestore.client()
# Initialize Flask app
app = Flask(__name__)
app.secret_key = os.urandom(24) # For session management
# Function to send SMS using Twilio
def send_msg(doc_id, field1):
try:
field1 = (field1)
# Fetch the document with the given doc_id
doc_ref = db.collection('thingspeak_data').document(doc_id)
doc = doc_ref.get()
if doc.exists:
data = doc.to_dict()
msg_status = data.get('msg_status', 0)
# Check if the message status is 0
if msg_status == 0:
concen=predict_conc(field1)
client = Client(ACCOUNT_SID, AUTH_TOKEN)
if concen!=0:
sugges="You may heat your water to eradicate the bacteria."
else:
sugges="Your water is safe.It can be used for drinking purpose!."
# Send the message
message = client.messages.create(
from_=FROM_PHONE,
body=f"""E.coli Level: {concen} CFU/mL\nStatus: Safe\nSuggestions:\n{sugges}\n--Ministry of Jal Shakthi.""",
to=TO_PHONE
)
print(f"Message sent successfully! SID: {message.sid}")
# Update the msg_status to 1
doc_ref.update({'msg_status': 1})
print("Message status updated to 1 in Firestore.")
else:
print("Message already sent for this entry. Skipping...")
else:
print(f"No document found with ID: {doc_id}")
except Exception as e:
print(f"Failed to send message or update status: {e}")
# Firestore Listener for new data
def on_snapshot(doc_snapshot, changes, read_time):
for change in changes:
if change.type.name == 'ADDED':
new_data = change.document.to_dict()
print(f"New data detected: {new_data}") # Debugging info
field1 = new_data.get('field1', 'N/A')
try:
field1 = float(field1) # Convert field1 to float
print(f"Field1 as float: {field1}")
send_msg(change.document.id, field1)
except ValueError:
print(f"Invalid field1 value: {field1}. Must be numeric.")
# Firestore Listener Initialization
def start_firestore_listener():
thingspeak_ref = db.collection('thingspeak_data')
thingspeak_ref.on_snapshot(on_snapshot)
print("Listening for new data in Firestore...")
# Fetch data from ThingSpeak
def fetch_thingspeak_data():
global last_entry_id
try:
url = f"https://api.thingspeak.com/channels/{CHANNEL_ID}/feeds.json?api_key={THINGSPEAK_API_KEY}"
response = requests.get(url)
response.raise_for_status()
data = response.json()
if not data.get('feeds'):
print("No new feeds found.")
return None
latest_feed = data['feeds'][-1]
current_entry_id = latest_feed.get('entry_id')
if current_entry_id != last_entry_id:
last_entry_id = current_entry_id
return latest_feed
print("No new entries since last check.")
return None
except requests.RequestException as e:
print(f"ThingSpeak data fetch error: {e}")
return None
# Store data in Firestore
def store_data_in_firestore(data):
try:
if not data:
print("No data to store.")
return
doc_data = {
'field1': data.get('field1'),
'field2': data.get('field2'),
'entry_id': data.get('entry_id'),
'msg_status':0,
'timestamp': firestore.SERVER_TIMESTAMP
}
db.collection('thingspeak_data').add(doc_data)
print("New data successfully stored in Firestore")
except Exception as e:
print(f"Firestore storage error: {e}")
# Flask Routes
@app.route('/')
def index():
return render_template('index.html')
@app.route('/user-dashboard.html')
def user_dashboard():
return render_template('user-dashboard.html')
@app.route('/get-previous-results', methods=['GET'])
def get_previous_results():
try:
# Simulate ThingSpeak API call or shared data
data = fetch_thingspeak_data()
return jsonify({"status": "success", "data": data})
except Exception as e:
return jsonify({"status": "error", "message": str(e)})
@app.route('/admin.html')
def admin():
delhi_coordinates = [28.6139, 77.2090]
folium_map = folium.Map(location=delhi_coordinates, zoom_start=12)
markers = [
{"name": "India Gate", "coordinates": [28.6129, 77.2295]},
{"name": "Red Fort", "coordinates": [28.6562, 77.2410]},
{"name": "Qutub Minar", "coordinates": [28.5245, 77.1855]},
]
for marker in markers:
folium.Marker(
location=marker["coordinates"],
popup=marker["name"],
icon=folium.Icon(color="blue", icon="info-sign"),
).add_to(folium_map)
folium.TileLayer('OpenStreetMap').add_to(folium_map)
folium.LayerControl().add_to(folium_map)
map_html = folium_map._repr_html_()
return render_template('admin.html', map=map_html)
@app.route('/logout')
def logout():
session.pop('user_phone', None)
return redirect(url_for('index'))
# Main Function for Continuous Data Fetching
def main():
try:
start_firestore_listener()
while True:
thingspeak_data = fetch_thingspeak_data()
if thingspeak_data:
store_data_in_firestore(thingspeak_data)
time.sleep(5)
except KeyboardInterrupt:
print("Process interrupted by user.")
except Exception as e:
print(f"Unexpected error: {e}")
API_KEY = 'xQ2Zhfsp4cLar4lvBRDWZKljvp0Ej427'
MODEL = "mistral-large-latest"
client = Mistral(api_key=API_KEY)
@app.route('/chat', methods=['POST'])
def chat():
data = request.json
user_query = data.get("query", "")
if not user_query:
return jsonify({"error": "Query cannot be empty"}), 400
try:
chat_response = client.chat.complete(
model=MODEL,
messages=[
{"role": "user", "content": user_query+"You are the best assistant. Provide the precise response within 2 to 3 sentence.Greet the user if user greets.Your response must be rural area people."},
]
)
response_content = chat_response.choices[0].message.content
return jsonify({"response": response_content})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
from threading import Thread
# Run the main data-fetching loop in a separate thread
data_thread = Thread(target=main, daemon=True)
data_thread.start()
# Run Flask app in the main thread with debugging enabled
app.run(host='0.0.0.0', port=7860, debug=True)