Lstm_prediction/lstm_prediction/app/Console/Commands/SendSensorDataToFlask.php

65 lines
2.2 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\Prediction;
use Illuminate\Console\Command;
use App\Models\SensorData;
use Carbon\Carbon;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class SendSensorDataToFlask extends Command
{
protected $signature = 'sensor:send-to-flask'; // Perintah Artisan
protected $description = 'Mengirimkan 30 data sensor terbaru ke Flask setiap 5 menit';
public function handle()
{
// Ambil 30 data terakhir
$sensorData = SensorData::orderBy('created_at', 'desc')->take(30)->get();
// Pastikan jumlah data cukup
if ($sensorData->count() < 30) {
Log::warning("❌ Tidak cukup data (kurang dari 30). Pengiriman dibatalkan.");
return;
}
// Format data untuk dikirim ke Flask
$dataToSend = [
'sensor_data' => $sensorData->map(fn($item) => [
'suhu' => $item->temperature,
'kelembaban' => $item->humidity,
'datetime' => $item->created_at ? Carbon::parse($item->created_at)->setTimezone('Asia/Jakarta')->format('Y-m-d H:i:s')
: null,
])->toArray()
];
Log::info("🚀 Mengirim data ke Flask...");
try {
// Kirim data ke Flask
$response = Http::timeout(30)->post('http://192.168.38.96:5000/predict', $dataToSend); //gunakan ip laptop
if ($response->successful()) {
Log::info("✅ Prediksi diterima dari Flask!");
$prediction = $response->json();
// Simpan hasil prediksi ke database
Prediction::create([
'predicted_suhu' => $prediction['predicted_suhu'],
'predicted_kelembaban' => $prediction['predicted_kelembaban'],
'prediction_datetime' => $prediction['prediction_datetime'],
]);
Log::info("✅ Hasil prediksi berhasil disimpan ke database.");
} else {
Log::error("❌ Flask menolak request: " . $response->body());
}
} catch (\Exception $e) {
Log::error("❌ Error mengirim data ke Flask: " . $e->getMessage());
}
}
}