133 lines
4.8 KiB
PHP
133 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Prediction;
|
|
use App\Models\SensorData;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Facades\DB;
|
|
use GuzzleHttp\Client;
|
|
use GuzzleHttp\Exception\RequestException;
|
|
|
|
class SensorController extends Controller
|
|
{
|
|
// Menampilkan halaman dashboard
|
|
public function index()
|
|
{
|
|
return view('dashboard');
|
|
}
|
|
|
|
// Menyimpan data sensor ke database
|
|
public function storeSensorData(Request $request)
|
|
{
|
|
//Log::info("Data diterima:", $request->all());
|
|
$request->validate([
|
|
'temperature' => 'required|numeric',
|
|
'humidity' => 'required|numeric'
|
|
]);
|
|
|
|
$sensorData = SensorData::create([
|
|
'temperature' => $request->temperature,
|
|
'humidity' => $request->humidity
|
|
]);
|
|
Log::info("Data diterima:", $request->all());
|
|
|
|
return response()->json(['message' => 'Data sensor berhasil disimpan', 'data' => $sensorData], 201);
|
|
}
|
|
|
|
// Mengambil 10 data sensor terbaru
|
|
public function getLatestSensorData()
|
|
{
|
|
$sensorData = SensorData::orderByDesc('created_at') // Urutkan dari terbaru ke terlama
|
|
->take(50) // Ambil 10 data terbaru
|
|
->get()
|
|
->map(function ($data) {
|
|
return [
|
|
'temperature' => $data->temperature,
|
|
'humidity' => $data->humidity,
|
|
'created_at' => Carbon::parse($data->created_at)
|
|
->timezone('Asia/Jakarta')
|
|
->format('Y-m-d H:i:s'), // Format waktu yang lebih mudah dibaca
|
|
];
|
|
});
|
|
|
|
return response()->json($sensorData);
|
|
}
|
|
|
|
// Mengambil 10 prediksi terbaru
|
|
public function getLatestPredictions()
|
|
{
|
|
$predictions = Prediction::orderByDesc('prediction_datetime') // Urutkan dari terbaru ke terlama
|
|
->take(50) // Ambil 10 data terbaru
|
|
->get()
|
|
->map(function ($data) {
|
|
return [
|
|
'predicted_suhu' => $data->predicted_suhu,
|
|
'predicted_kelembaban' => $data->predicted_kelembaban,
|
|
'prediction_datetime' => Carbon::parse($data->prediction_datetime)
|
|
->timezone('Asia/Jakarta')
|
|
->format('Y-m-d H:i:s'), // Format ke waktu yang lebih mudah dibaca
|
|
];
|
|
});
|
|
|
|
return response()->json($predictions);
|
|
}
|
|
|
|
// Mengirim 30 data terakhir ke Flask untuk prediksi
|
|
public function predict()
|
|
{
|
|
// Ambil 30 data sensor terakhir
|
|
$sensorData = SensorData::orderBy('created_at', 'desc')->take(30)->get();
|
|
|
|
// Pastikan jumlah data cukup
|
|
if ($sensorData->count() < 30) {
|
|
return response()->json(['error' => 'Jumlah data kurang dari 30'], 400);
|
|
}
|
|
|
|
// 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: " . json_encode($dataToSend));
|
|
|
|
try {
|
|
$client = new Client(['timeout' => 60]);
|
|
$response = $client->post('http://192.168.38.96:5000/predict', [ //gunakan ip laptop
|
|
'json' => $dataToSend,
|
|
'headers' => ['Content-Type' => 'application/json']
|
|
]);
|
|
|
|
$body = json_decode($response->getBody()->getContents(), true);
|
|
|
|
if (!isset($body['predicted_suhu'], $body['predicted_kelembaban'], $body['prediction_datetime'])) {
|
|
return response()->json(['error' => 'Respons Flask tidak valid'], 500);
|
|
}
|
|
|
|
// Simpan hasil prediksi ke database
|
|
$prediction = Prediction::create([
|
|
'predicted_suhu' => $body['predicted_suhu'],
|
|
'predicted_kelembaban' => $body['predicted_kelembaban'],
|
|
'prediction_datetime' => $body['prediction_datetime'],
|
|
]);
|
|
|
|
Log::info("✅ Prediksi berhasil disimpan: " . json_encode($prediction));
|
|
|
|
return response()->json($prediction, 201);
|
|
} catch (RequestException $e) {
|
|
//Log::error("❌ Error menghubungi Flask: " . $e->getMessage());
|
|
return response()->json(['error' => 'Gagal menghubungi Flask'], 500);
|
|
} catch (\Exception $e) {
|
|
//Log::error("❌ Terjadi kesalahan: " . $e->getMessage());
|
|
return Response()->json(['error' => 'Terjadi kesalahan pada server'], 500);
|
|
}
|
|
}
|
|
}
|