pertamina / app.py
Dayat555's picture
Update app.py
f1002e2 verified
import gradio as gr
import pyrebase
import pandas as pd
import torch
import matplotlib.pyplot as plt
from chronos import ChronosPipeline
# 1. Identitas Model & Konfigurasi Firebase
# Pastikan data ini sesuai dengan project Firebase Pertamina lo
model_id = "amazon/chronos-t5-tiny"
config = {
"apiKey": "AIzaSyApZpMn8lNOVMLO7bUAoe3sIpRR7C9Te90",
"authDomain": "pertamina-power-optimizer.firebaseapp.com",
"databaseURL": "https://pertamina-power-optimizer-default-rtdb.asia-southeast1.firebasedatabase.app",
"storageBucket": "pertamina-power-optimizer.appspot.com"
}
# Inisialisasi Firebase & Model Amazon Chronos
firebase = pyrebase.initialize_app(config)
auth = firebase.auth()
db = firebase.database()
pipeline = ChronosPipeline.from_pretrained(model_id, device_map="cpu", dtype=torch.float32)
# Login Session menggunakan kredensial yang telah ditentukan
user_session = auth.sign_in_with_email_and_password("user@pertamina.com", "Pertamina45_")
# 2. Fungsi Utama Analisis & Forecasting
def analyze_energy(safe_limit):
try:
# Mengambil data dari Firebase menggunakan token aktif
token = user_session['idToken']
data = db.child("data_efisiensi").get(token).val()
if not data:
return "Menunggu data dari ESP32...", None, 0
# Konversi data ke DataFrame Pandas
df = pd.DataFrame(list(data.values()))
# Mengambil 50 data poin terakhir untuk konteks AI
# Logika: Konteks data membantu Chronos memahami tren historis
context = torch.tensor(df['w'].tail(50).values)
# Prediksi 12 langkah ke depan menggunakan model Chronos
forecast = pipeline.predict(context, prediction_length=12)
forecast_median = forecast[0].median(dim=0).values
# Visualisasi Grafik Real-Time
plt.figure(figsize=(10, 5))
plt.plot(df['w'].tail(50).values, label="Daya Aktual (W)", color="#0047AB", linewidth=2)
plt.plot(range(50, 62), forecast_median, color='#FF0000', linestyle='--', label="Prediksi AI")
# Garis bantu batas aman dari input user
plt.axhline(y=safe_limit, color='green', linestyle=':', label="Batas Aman User")
plt.title("Integrated Terminal Semarang - Live Energy Forecast")
plt.xlabel("Urutan Data")
plt.ylabel("Daya (Watt)")
plt.legend()
plt.grid(True, alpha=0.3)
plot_path = "energy_live.png"
plt.savefig(plot_path)
plt.close()
# --- LOGIKA BATAS AMAN DINAMIS ---
last_w = df['w'].iloc[-1]
next_w = float(forecast_median[0])
# Status ditentukan berdasarkan perbandingan Prediksi vs Batas Input User
if next_w > safe_limit:
status = "⚠️ BAHAYA: PREDIKSI MELEBIHI BATAS AMAN"
else:
status = "✅ OPERASIONAL STABIL"
report = (f"📊 LIVE AI ANALYSIS\n"
f"----------------------------------\n"
f"Daya Sekarang : {last_w:.2f} W\n"
f"Batas Aman User: {safe_limit:.2f} W\n"
f"Prediksi AI : {next_w:.2f} W\n"
f"Status Sistem : {status}\n"
f"Update Terakhir: {pd.Timestamp.now().strftime('%H:%M:%S')}")
return report, plot_path, round(last_w, 2)
except Exception as e:
return f"Koneksi/Error: {str(e)}", None, 0
# 3. Antarmuka Dashboard Gradio
with gr.Blocks() as demo:
gr.Markdown("# ⚡ Pertamina Power Optimizer")
gr.Markdown("Monitoring Otomatis berbasis AI")
with gr.Row():
with gr.Column(scale=1):
# Input untuk menentukan batas daya secara manual
input_limit = gr.Number(label="SET BATAS AMAN (WATT)", value=3500)
# Menampilkan angka Watt secara menonjol
watt_display = gr.Number(label="DAYA SAAT INI (WATT)")
output_text = gr.Textbox(label="Status Analisis (Auto-update 5s)", lines=10)
with gr.Column(scale=2):
output_plot = gr.Image(label="Grafik Tren Efisiensi")
# Menggunakan gr.Timer untuk update otomatis setiap 5 detik
timer = gr.Timer(5)
# Hubungkan input_limit ke fungsi analyze_energy
timer.tick(
fn=analyze_energy,
inputs=[input_limit],
outputs=[output_text, output_plot, watt_display]
)
# Jalankan sekali saat aplikasi pertama kali dimuat
demo.load(
fn=analyze_energy,
inputs=[input_limit],
outputs=[output_text, output_plot, watt_display]
)
# 4. Launch Aplikasi
if __name__ == "__main__":
# Menjalankan aplikasi dengan tema Soft agar terlihat profesional
demo.queue().launch(theme=gr.themes.Soft())