65 lines
2.2 KiB
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());
|
|
}
|
|
}
|
|
}
|