AsecurityDumptruckModel/app/Console/Commands/FetchFirebaseData.php

281 lines
11 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Kreait\Firebase\Factory;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Event;
use App\Events\ReportUpdated;
class FetchFirebaseData extends Command
{
protected $signature = 'firebase:fetch';
protected $description = 'Ambil data dari Firebase jika ada perubahan';
public function handle()
{
try {
// Inisialisasi Firebase
$firebase = (new Factory)
->withServiceAccount(storage_path('app/smartcab-8bb42-firebase-adminsdk-fbsvc-de33a8e45b.json'))
->withDatabaseUri(env('FIREBASE_DATABASE_URL'))
->createDatabase();
// Ambil data terbaru dari Firebase
$securityData = $firebase->getReference('security')->getValue() ?? [];
$smartcabData = $firebase->getReference('smartcab')->getValue() ?? [];
$dht11Data = $firebase->getReference('dht11')->getValue() ?? [];
$controlData = $firebase->getReference('control')->getValue() ?? [];
$deviceData = $firebase->getReference('device')->getValue() ?? [];
$logsData = $firebase->getReference('logs')->getValue() ?? [];
// Baca history data yang sudah ada
$historyData = [];
if (Storage::exists('reports.json')) {
$historyData = json_decode(Storage::get('reports.json'), true) ?: [];
if (!is_array($historyData)) {
$historyData = [];
}
}
// Ambil data terakhir jika ada
$lastEntry = !empty($historyData) ? end($historyData) : null;
// Cek perubahan pada setiap kategori data
$securityChanged = false;
$smartcabChanged = false;
$controlChanged = false;
$logsChanged = false;
$dht11Changed = false;
$deviceChanged = false;
$hasChanges = false;
if ($lastEntry === null) {
// Jika belum ada data, anggap semua kategori berubah (kecuali yang dikecualikan)
$securityChanged = !empty($securityData);
$smartcabChanged = !empty($smartcabData);
$controlChanged = !empty($controlData);
$logsChanged = !empty($logsData);
// Untuk DHT11 dan Device, kita hanya anggap berubah jika ada data selain yang dikecualikan
$dht11Changed = !empty($dht11Data) && $this->hasNonTrivialDHT11Data($dht11Data);
$deviceChanged = !empty($deviceData) && $this->hasNonTrivialDeviceData($deviceData);
$hasChanges = $securityChanged || $smartcabChanged || $controlChanged ||
$logsChanged || $dht11Changed || $deviceChanged;
} else {
// Cek perubahan pada setiap kategori
$securityChanged = $this->hasDataChanged($lastEntry['security'] ?? [], $securityData);
$smartcabChanged = $this->hasDataChanged($lastEntry['smartcab'] ?? [], $smartcabData);
$controlChanged = $this->hasDataChanged($lastEntry['control'] ?? [], $controlData);
$logsChanged = $this->hasDataChanged($lastEntry['logs'] ?? [], $logsData);
// Untuk dht11 dan device kita periksa secara khusus, mengabaikan field yang sering berubah
$dht11Changed = $this->hasNonTrivialDHT11Changes($lastEntry['dht11'] ?? [], $dht11Data);
$deviceChanged = $this->hasNonTrivialDeviceChanges($lastEntry['device'] ?? [], $deviceData);
$hasChanges = $securityChanged || $smartcabChanged || $controlChanged ||
$logsChanged || $dht11Changed || $deviceChanged;
}
// Proses setiap perubahan secara terpisah
$changesMade = false;
// Buat template data lengkap
$fullData = [
'security' => $securityData,
'smartcab' => $smartcabData,
'control' => $controlData,
'logs' => $logsData,
'dht11' => $dht11Data,
'device' => $deviceData
];
// Simpan setiap perubahan secara terpisah dengan data lengkap
if ($securityChanged && !empty($securityData)) {
$newEntry = $fullData;
$newEntry['id'] = Str::uuid()->toString();
$newEntry['timestamp'] = now()->toIso8601String();
$newEntry['change_type'] = 'security'; // Tambahkan informasi apa yang berubah
$historyData[] = $newEntry;
event(new ReportUpdated($newEntry, 'security'));
$this->info('Perubahan terdeteksi pada security, ID: ' . $newEntry['id']);
$changesMade = true;
}
if ($smartcabChanged && !empty($smartcabData)) {
$newEntry = $fullData;
$newEntry['id'] = Str::uuid()->toString();
$newEntry['timestamp'] = now()->toIso8601String();
$newEntry['change_type'] = 'smartcab';
$historyData[] = $newEntry;
event(new ReportUpdated($newEntry, 'smartcab'));
$this->info('Perubahan terdeteksi pada smartcab, ID: ' . $newEntry['id']);
$changesMade = true;
}
if ($controlChanged && !empty($controlData)) {
$newEntry = $fullData;
$newEntry['id'] = Str::uuid()->toString();
$newEntry['timestamp'] = now()->toIso8601String();
$newEntry['change_type'] = 'control';
$historyData[] = $newEntry;
event(new ReportUpdated($newEntry, 'control'));
$this->info('Perubahan terdeteksi pada control, ID: ' . $newEntry['id']);
$changesMade = true;
}
if ($logsChanged && !empty($logsData)) {
$newEntry = $fullData;
$newEntry['id'] = Str::uuid()->toString();
$newEntry['timestamp'] = now()->toIso8601String();
$newEntry['change_type'] = 'logs';
$historyData[] = $newEntry;
event(new ReportUpdated($newEntry, 'logs'));
$this->info('Perubahan terdeteksi pada logs, ID: ' . $newEntry['id']);
$changesMade = true;
}
if ($dht11Changed && !empty($dht11Data)) {
$newEntry = $fullData;
$newEntry['id'] = Str::uuid()->toString();
$newEntry['timestamp'] = now()->toIso8601String();
$newEntry['change_type'] = 'dht11';
$historyData[] = $newEntry;
event(new ReportUpdated($newEntry, 'dht11'));
$this->info('Perubahan signifikan terdeteksi pada dht11, ID: ' . $newEntry['id']);
$changesMade = true;
}
if ($deviceChanged && !empty($deviceData)) {
$newEntry = $fullData;
$newEntry['id'] = Str::uuid()->toString();
$newEntry['timestamp'] = now()->toIso8601String();
$newEntry['change_type'] = 'device';
$historyData[] = $newEntry;
event(new ReportUpdated($newEntry, 'device'));
$this->info('Perubahan signifikan terdeteksi pada device, ID: ' . $newEntry['id']);
$changesMade = true;
}
// Jika ada perubahan yang disimpan, update file
if ($changesMade) {
Storage::put('reports.json', json_encode($historyData, JSON_PRETTY_PRINT));
$this->info('Semua perubahan berhasil disimpan.');
} else {
$this->info('Tidak ada perubahan signifikan pada data, data tidak disimpan');
}
} catch (\Exception $e) {
$this->error('Error: ' . $e->getMessage());
}
}
private function hasDataChanged($oldData, $newData)
{
$oldJson = json_encode($oldData);
$newJson = json_encode($newData);
return $oldJson !== $newJson;
}
/**
* Memeriksa perubahan pada data dht11 selain humidity dan temperature
*/
private function hasNonTrivialDHT11Changes($oldData, $newData)
{
// Buat salinan data untuk perbandingan
$oldDataCompare = is_array($oldData) ? $oldData : [];
$newDataCompare = is_array($newData) ? $newData : [];
// Hapus field yang sering berubah
if (isset($oldDataCompare['humidity'])) {
unset($oldDataCompare['humidity']);
}
if (isset($oldDataCompare['temperature'])) {
unset($oldDataCompare['temperature']);
}
if (isset($newDataCompare['humidity'])) {
unset($newDataCompare['humidity']);
}
if (isset($newDataCompare['temperature'])) {
unset($newDataCompare['temperature']);
}
// Bandingkan data yang tersisa
return json_encode($oldDataCompare) !== json_encode($newDataCompare);
}
/**
* Memeriksa apakah DHT11 data memiliki field selain yang dikecualikan
*/
private function hasNonTrivialDHT11Data($data)
{
$dataCopy = is_array($data) ? $data : [];
// Hapus field yang sering berubah
if (isset($dataCopy['humidity'])) {
unset($dataCopy['humidity']);
}
if (isset($dataCopy['temperature'])) {
unset($dataCopy['temperature']);
}
// Periksa apakah masih ada data lain
return !empty($dataCopy);
}
/**
* Memeriksa perubahan pada data device selain lastActive dan lastActiveWemos
*/
private function hasNonTrivialDeviceChanges($oldData, $newData)
{
// Buat salinan data untuk perbandingan
$oldDataCompare = is_array($oldData) ? $oldData : [];
$newDataCompare = is_array($newData) ? $newData : [];
// Hapus field yang sering berubah
if (isset($oldDataCompare['lastActive'])) {
unset($oldDataCompare['lastActive']);
}
if (isset($oldDataCompare['lastActiveWemos'])) {
unset($oldDataCompare['lastActiveWemos']);
}
if (isset($newDataCompare['lastActive'])) {
unset($newDataCompare['lastActive']);
}
if (isset($newDataCompare['lastActiveWemos'])) {
unset($newDataCompare['lastActiveWemos']);
}
// Bandingkan data yang tersisa
return json_encode($oldDataCompare) !== json_encode($newDataCompare);
}
/**
* Memeriksa apakah Device data memiliki field selain yang dikecualikan
*/
private function hasNonTrivialDeviceData($data)
{
$dataCopy = is_array($data) ? $data : [];
// Hapus field yang sering berubah
if (isset($dataCopy['lastActive'])) {
unset($dataCopy['lastActive']);
}
if (isset($dataCopy['lastActiveWemos'])) {
unset($dataCopy['lastActiveWemos']);
}
// Periksa apakah masih ada data lain
return !empty($dataCopy);
}
}