projectTA/app/Http/Controllers/SensorController.php

126 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class SensorController extends Controller
{
/**
* Menerima data sensor dari ESP8266/ESP32
*/
public function update(Request $request)
{
$validated = $request->validate([
'suhu' => 'nullable|numeric',
'kelembaban' => 'nullable|numeric',
'cahaya' => 'nullable|numeric',
]);
// Simpan data sensor ke database
DB::table('sensor_logs')->insert([
'suhu' => $validated['suhu'] ?? null,
'kelembaban' => $validated['kelembaban'] ?? null,
'cahaya' => $validated['cahaya'] ?? null,
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
]);
// Update status koneksi
$this->updateConnectionStatus(true);
return response()->json([
'success' => true,
'message' => 'Data sensor berhasil disimpan'
]);
}
/**
* Mendapatkan data sensor terbaru
*/
public function latest()
{
// Ambil data sensor terbaru
$latestData = DB::table('sensor_logs')
->latest('created_at')
->first();
// Periksa status koneksi
$connectionStatus = $this->getConnectionStatus();
return response()->json([
'suhu' => $latestData->suhu ?? null,
'kelembaban' => $latestData->kelembaban ?? null,
'cahaya' => $latestData->cahaya ?? null,
'timestamp' => $latestData ? Carbon::parse($latestData->created_at)->format('Y-m-d H:i:s') : null,
'connected' => $connectionStatus
]);
}
/**
* Mendapatkan riwayat data sensor
*/
public function history(Request $request)
{
$limit = $request->input('limit', 24);
$page = $request->input('page', 1);
$offset = ($page - 1) * $limit;
// Ambil data riwayat
$logs = DB::table('sensor_logs')
->orderBy('created_at', 'desc')
->skip($offset)
->take($limit)
->get();
// Hitung total data
$total = DB::table('sensor_logs')->count();
return response()->json([
'data' => $logs,
'pagination' => [
'total' => $total,
'per_page' => $limit,
'current_page' => $page,
'last_page' => ceil($total / $limit)
]
]);
}
/**
* Update status koneksi ESP8266/ESP32
*/
private function updateConnectionStatus($connected)
{
DB::table('device_status')->updateOrInsert(
['device' => 'esp32'],
[
'connected' => $connected,
'last_seen' => Carbon::now(),
'updated_at' => Carbon::now()
]
);
}
/**
* Cek status koneksi ESP8266/ESP32
*/
private function getConnectionStatus()
{
$status = DB::table('device_status')
->where('device', 'esp32')
->first();
if (!$status) {
return false;
}
// Jika terakhir update > 1 menit, anggap terputus
$lastSeen = Carbon::parse($status->last_seen);
$now = Carbon::now();
return $status->connected && $lastSeen->diffInMinutes($now) < 1;
}
}