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); } } }