Lstm_prediction/lstm_prediction/app/Http/Controllers/SensorController.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);
}
}
}