Spaces:
Sleeping
Sleeping
File size: 8,006 Bytes
b87e94a 5bda095 95b65a4 ef44cec 4c5bc9a 95b65a4 09a71ce e16d77a 09a71ce e33f692 95b65a4 b87e94a 95b65a4 9e1ff6c b87e94a 95b65a4 b87e94a 96a710d b87e94a 95b65a4 4c5bc9a bd088af 4c5bc9a 95b65a4 b87e94a 95b65a4 b87e94a 95b65a4 96a710d 95b65a4 96a710d 95b65a4 b87e94a 95b65a4 b87e94a 95b65a4 ef44cec 95b65a4 4f0ef76 4c5bc9a 4f0ef76 4c5bc9a 95b65a4 4c5bc9a ef44cec 2feef86 ef44cec 2feef86 ef44cec 2feef86 ef44cec 2feef86 4c5bc9a 4f0ef76 ef44cec 2feef86 95b65a4 b87e94a 2feef86 b87e94a 95b65a4 4c5bc9a 2ca70b1 b87e94a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
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)
|