277 lines
7.9 KiB
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
|
|
]);
|
|
}
|
|
}
|