TKK_E32222628/hydrop_web/app/Http/Controllers/FirebaseController.php

277 lines
7.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Services\FirebaseService;
use App\Models\Sensor;
use App\Models\Actuator;
use App\Models\UmurTanaman;
use Illuminate\Support\Facades\Log;
class FirebaseController extends Controller
{
protected $firebaseService;
public function __construct(FirebaseService $firebaseService)
{
$this->firebaseService = $firebaseService;
}
/**
* Test koneksi Firebase
*/
public function testConnection()
{
$result = $this->firebaseService->testConnection();
return response()->json([
'success' => $result,
'message' => $result ? 'Firebase connection successful' : 'Firebase connection failed'
]);
}
/**
* Endpoint untuk menerima data sensor dari IoT device
*/
public function receiveSensorData(Request $request)
{
$request->validate([
'temperature' => 'required|numeric',
'humidity' => 'required|numeric',
'ph' => 'required|numeric',
'tds' => 'required|numeric'
]);
$temperature = $request->temperature;
$humidity = $request->humidity;
$ph = $request->ph;
$tds = $request->tds;
// Simpan ke database lokal
$sensor = Sensor::create([
'temperature' => $temperature,
'humidity' => $humidity,
'ph' => $ph,
'tds' => $tds,
'waktu' => now()
]);
// Simpan ke Firebase
$firebaseKey = $this->firebaseService->saveSensorData($temperature, $humidity, $ph, $tds);
return response()->json([
'success' => true,
'message' => 'Data sensor berhasil disimpan',
'local_id' => $sensor->id,
'firebase_key' => $firebaseKey
]);
}
/**
* Endpoint untuk menerima data actuator dari IoT device
*/
public function receiveActuatorData(Request $request)
{
$request->validate([
'nama' => 'required|string',
'status' => 'required|string'
]);
$nama = $request->nama;
$status = $request->status;
// Simpan ke database lokal
$actuator = Actuator::create([
'nama' => $nama,
'status' => $status,
'waktu_aktif' => now()
]);
// Simpan ke Firebase
$firebaseKey = $this->firebaseService->saveActuatorData($nama, $status);
return response()->json([
'success' => true,
'message' => 'Data actuator berhasil disimpan',
'local_id' => $actuator->id,
'firebase_key' => $firebaseKey
]);
}
/**
* Terima data umur tanaman dari IoT device
*/
public function receiveUmurTanamanData(Request $request)
{
$request->validate([
'jenis_tanaman' => 'required|string',
'tanggal_tanam' => 'required|date',
'umur_hari' => 'required|integer|min:0',
'status' => 'sometimes|string'
]);
try {
// Simpan ke database lokal
$umurTanaman = UmurTanaman::create([
'nama' => $request->jenis_tanaman,
'tanggal_tanam' => $request->tanggal_tanam,
'umur_hari' => $request->umur_hari,
'status' => $request->status ?? 'aktif'
]);
// Simpan ke Firebase
$firebaseKey = $this->firebaseService->saveUmurTanamanData(
$request->jenis_tanaman,
$request->tanggal_tanam,
$request->umur_hari,
$request->status ?? 'aktif'
);
if ($firebaseKey) {
return response()->json([
'success' => true,
'message' => 'Data umur tanaman berhasil disimpan',
'local_id' => $umurTanaman->id,
'firebase_key' => $firebaseKey
]);
} else {
return response()->json([
'success' => false,
'message' => 'Data berhasil disimpan ke database lokal, tapi gagal ke Firebase',
'local_id' => $umurTanaman->id
], 206);
}
} catch (\Exception $e) {
Log::error('Error receiving umur tanaman data: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Gagal menyimpan data umur tanaman',
'error' => $e->getMessage()
], 500);
}
}
/**
* Ambil data real-time dari Firebase
*/
public function getRealtimeData()
{
$data = $this->firebaseService->getRealtimeData();
return response()->json([
'success' => true,
'data' => $data
]);
}
/**
* Update status actuator
*/
public function updateActuatorStatus(Request $request)
{
$request->validate([
'firebase_key' => 'required|string',
'status' => 'required|string'
]);
$result = $this->firebaseService->updateActuatorStatus(
$request->firebase_key,
$request->status
);
return response()->json([
'success' => $result,
'message' => $result ? 'Status actuator berhasil diupdate' : 'Gagal mengupdate status actuator'
]);
}
/**
* Sync data dari Firebase ke database lokal
*/
public function syncFromFirebase()
{
// Ambil data sensor dari Firebase
$sensorData = $this->firebaseService->getLatestSensorData(50);
$syncedSensor = 0;
foreach ($sensorData as $data) {
if (isset($data['temperature']) && isset($data['humidity']) && isset($data['ph']) && isset($data['tds']) && isset($data['timestamp'])) {
Sensor::firstOrCreate([
'temperature' => $data['temperature'],
'humidity' => $data['humidity'],
'ph' => $data['ph'],
'tds' => $data['tds'],
'waktu' => $data['timestamp']
]);
$syncedSensor++;
}
}
// Ambil data actuator dari Firebase
$actuatorData = $this->firebaseService->getLatestActuatorData(50);
$syncedActuator = 0;
foreach ($actuatorData as $data) {
if (isset($data['nama']) && isset($data['status']) && isset($data['timestamp'])) {
Actuator::firstOrCreate([
'nama' => $data['nama'],
'status' => $data['status'],
'waktu_aktif' => $data['timestamp']
]);
$syncedActuator++;
}
}
return response()->json([
'success' => true,
'message' => 'Data berhasil disinkronisasi',
'synced_sensor' => $syncedSensor,
'synced_actuator' => $syncedActuator
]);
}
/**
* Get Firebase sensor data for testing
*/
public function getFirebaseSensorData()
{
$data = $this->firebaseService->getAllSensorData();
return response()->json([
'success' => true,
'count' => count($data),
'data' => $data
]);
}
/**
* Get Firebase actuator data for testing
*/
public function getFirebaseActuatorData()
{
$data = $this->firebaseService->getAllActuatorData();
return response()->json([
'success' => true,
'count' => count($data),
'data' => $data
]);
}
/**
* Get Firebase umur tanaman data for testing
*/
public function getFirebaseUmurTanamanData()
{
$data = $this->firebaseService->getAllUmurTanamanData();
return response()->json([
'success' => true,
'count' => count($data),
'data' => $data
]);
}
}