SIH2024 / app.py
Neurolingua's picture
Update app.py
b87e94a verified
raw
history blame
8.01 kB
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"shh/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)