293 lines
10 KiB
PHP
293 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\MSensor;
|
|
use Twilio\Rest\Client;
|
|
use App\Models\MSensordua;
|
|
use App\Models\MSensortiga;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
|
|
|
class SensorLaravel extends Controller
|
|
{
|
|
public function bacasuhusatu()
|
|
{
|
|
// Baca data suhu terbaru dari database
|
|
$nilaisensor = MSensor::orderBy('updated_at', 'desc')->latest()->first();
|
|
|
|
// Kembalikan respons JSON dengan data suhu dan updated_at
|
|
return response()->json([
|
|
'suhu' => $nilaisensor->suhu ?? 0,
|
|
'updated_at' => $nilaisensor->updated_at ?? null
|
|
]);
|
|
}
|
|
|
|
public function bacakelembabansatu()
|
|
{
|
|
// Baca data kelembaban terbaru dari database
|
|
$nilaisensor = MSensor::orderBy('updated_at', 'desc')->latest()->first();
|
|
|
|
// Kembalikan respons JSON dengan data kelembaban dan updated_at
|
|
return response()->json([
|
|
'kelembaban' => $nilaisensor->kelembaban ?? 0,
|
|
'updated_at' => $nilaisensor->updated_at ?? null
|
|
]);
|
|
}
|
|
|
|
public function simpansensorsatu(Request $request)
|
|
{
|
|
// Simpan data suhu dan kelembaban yang diterima dari permintaan
|
|
MSensor::create([
|
|
'suhu' => $request->nilaisuhu,
|
|
'kelembaban' => $request->nilaikelembaban
|
|
]);
|
|
|
|
return response()->json(['message' => 'Data sensor berhasil disimpan.']);
|
|
}
|
|
|
|
public function bacasuhudua()
|
|
{
|
|
// Baca data suhu terbaru dari database
|
|
$nilaisensor = MSensordua::orderBy('updated_at', 'desc')->latest()->first();
|
|
|
|
// Kembalikan respons JSON dengan data suhu dan updated_at
|
|
return response()->json([
|
|
'suhu2' => $nilaisensor->suhu ?? 0,
|
|
'updated_at' => $nilaisensor->updated_at ?? null
|
|
]);
|
|
}
|
|
|
|
public function bacakelembabandua()
|
|
{
|
|
// Baca data kelembaban terbaru dari database
|
|
$nilaisensor = MSensordua::orderBy('updated_at', 'desc')->latest()->first();
|
|
|
|
// Kembalikan respons JSON dengan data kelembaban dan updated_at
|
|
return response()->json([
|
|
'kelembaban2' => $nilaisensor->kelembaban ?? 0,
|
|
'updated_at' => $nilaisensor->updated_at ?? null
|
|
]);
|
|
}
|
|
|
|
public function simpansensordua(Request $request)
|
|
{
|
|
// Simpan data suhu dan kelembaban yang diterima dari permintaan
|
|
MSensordua::create([
|
|
'suhu' => $request->nilaisuhu,
|
|
'kelembaban' => $request->nilaikelembaban
|
|
]);
|
|
|
|
return response()->json(['message' => 'Data sensor berhasil disimpan.']);
|
|
}
|
|
|
|
public function bacasuhutiga()
|
|
{
|
|
// Baca data suhu terbaru dari database
|
|
$nilaisensor =MSensortiga::orderBy('updated_at', 'desc')->latest()->first();
|
|
|
|
// Kembalikan respons JSON dengan data suhu dan updated_at
|
|
return response()->json([
|
|
'suhu3' => $nilaisensor->suhu ?? 0,
|
|
'updated_at' => $nilaisensor->updated_at ?? null
|
|
]);
|
|
}
|
|
|
|
public function bacakelembabantiga()
|
|
{
|
|
// Baca data kelembaban terbaru dari database
|
|
$nilaisensor =MSensortiga::orderBy('updated_at', 'desc')->latest()->first();
|
|
|
|
// Kembalikan respons JSON dengan data kelembaban dan updated_at
|
|
return response()->json([
|
|
'kelembaban3' => $nilaisensor->kelembaban ?? 0,
|
|
'updated_at' => $nilaisensor->updated_at ?? null
|
|
]);
|
|
}
|
|
|
|
public function simpansensortiga(Request $request)
|
|
{
|
|
// Simpan data suhu dan kelembaban yang diterima dari permintaan
|
|
MSensortiga::create([
|
|
'suhu' => $request->nilaisuhu,
|
|
'kelembaban' => $request->nilaikelembaban
|
|
]);
|
|
|
|
return response()->json(['message' => 'Data sensor berhasil disimpan.']);
|
|
}
|
|
|
|
public function cekdata()
|
|
{
|
|
// Ambil data terbaru dari tabel sensor (sisi barat)
|
|
$latestDataSatu = MSensor::latest()->first();
|
|
|
|
// Periksa apakah nilai suhu melebihi 32 atau nilai kelembaban melebihi 70, atau jika suhu kurang dari 25 dan kelembaban kurang dari 50
|
|
if ($latestDataSatu->suhu >= 32 || $latestDataSatu->kelembaban >= 70 || $latestDataSatu->suhu < 25 || $latestDataSatu->kelembaban < 50) {
|
|
// Periksa waktu terakhir notifikasi dikirim
|
|
$lastNotificationTime = Cache::get('last_notification_time');
|
|
|
|
// Jika waktu terakhir notifikasi belum diset atau sudah lebih dari 1 menit
|
|
if (!$lastNotificationTime || now()->diffInMinutes($lastNotificationTime) >= 1) {
|
|
// Panggil metode untuk mengirim notifikasi WhatsApp
|
|
$this->kirimNotifikasiWhatsApp($latestDataSatu->suhu, $latestDataSatu->kelembaban, 'Sisi Depan');
|
|
|
|
// Simpan waktu terakhir notifikasi dikirim
|
|
Cache::put('last_notification_time', now());
|
|
}
|
|
}
|
|
}
|
|
|
|
public function cekdatadua()
|
|
{
|
|
// Ambil data terbaru dari tabel sensor (sisi utara)
|
|
$latestDataDua = MSensordua::latest()->first();
|
|
|
|
// Periksa apakah nilai suhu melebihi 32 atau nilai kelembaban melebihi 70, atau jika suhu kurang dari 25 dan kelembaban kurang dari 50
|
|
if ($latestDataDua->suhu >= 32 || $latestDataDua->kelembaban >= 70 || $latestDataDua->suhu < 25 || $latestDataDua->kelembaban < 50) {
|
|
// Periksa waktu terakhir notifikasi dikirim
|
|
$lastNotificationTime = Cache::get('last_notification_time_dua');
|
|
|
|
// Jika waktu terakhir notifikasi belum diset atau sudah lebih dari 1 menit
|
|
if (!$lastNotificationTime || now()->diffInMinutes($lastNotificationTime) >= 1) {
|
|
// Panggil metode untuk mengirim notifikasi WhatsApp
|
|
$this->kirimNotifikasiWhatsApp($latestDataDua->suhu, $latestDataDua->kelembaban, 'Sisi Belakang');
|
|
|
|
// Simpan waktu terakhir notifikasi dikirim
|
|
Cache::put('last_notification_time_dua', now());
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
private function kirimNotifikasiWhatsApp($suhu, $kelembaban, $sisi)
|
|
{
|
|
// Konfigurasi API Twilio
|
|
$sid = "AC998e7144f7a4bf43b06e5ffc94b72ae2";
|
|
$token = "d2f0e597a1075b667fb7ea86c6646151";
|
|
|
|
// Inisialisasi Client Twilio
|
|
$twilio = new Client($sid, $token);
|
|
|
|
// Nomor pengirim dan penerima
|
|
$from = "whatsapp:+14155238886";
|
|
$to = "whatsapp:+6282329551945";
|
|
|
|
// Isi pesan
|
|
$body = "Kondisi Lingkungan Gudang Sedang Tidak Optimal dari {$sisi}. \nSuhu: {$suhu}°C \nKelembaban: {$kelembaban}%";
|
|
|
|
// Kirim pesan menggunakan API Twilio
|
|
try {
|
|
$message = $twilio->messages->create($to, [
|
|
"from" => $from,
|
|
"body" => $body
|
|
]);
|
|
|
|
return response()->json(['message' => 'Whatsapp message sent successfully', 'sid' => $message->sid]);
|
|
} catch (\Exception $e) {
|
|
return response()->json(['error' => $e->getMessage()], 500);
|
|
}
|
|
}
|
|
|
|
public function riwayatData(Request $request)
|
|
{
|
|
$region = $request->input('region', 'Depan'); // Default to 'Barat' if no region is selected
|
|
$start_date = $request->input('start_date');
|
|
$end_date = $request->input('end_date');
|
|
|
|
// Determine which model to use based on the region
|
|
switch ($region) {
|
|
case 'Depan':
|
|
$model = new MSensor();
|
|
break;
|
|
case 'Belakang':
|
|
$model = new MSensordua();
|
|
break;
|
|
}
|
|
|
|
// Build the query
|
|
$query = $model::selectRaw('
|
|
DATE(created_at) as tanggal,
|
|
AVG(suhu) as rata_suhu,
|
|
AVG(kelembaban) as rata_kelembaban,
|
|
MAX(suhu) as tertinggi_suhu,
|
|
MAX(kelembaban) as tertinggi_kelembaban,
|
|
MIN(suhu) as terendah_suhu,
|
|
MIN(kelembaban) as terendah_kelembaban
|
|
')
|
|
->whereNotNull('created_at');
|
|
|
|
// Apply date filter if provided
|
|
if ($start_date && $end_date) {
|
|
$query->whereDate('created_at', '>=', $start_date)
|
|
->whereDate('created_at', '<=', $end_date);
|
|
}
|
|
|
|
// Group and order the results by date
|
|
$riwayatData = $query->groupByRaw('DATE(created_at)')
|
|
->orderByRaw('DATE(created_at) DESC')
|
|
->get();
|
|
|
|
// Fetch the corresponding timestamps for each data point
|
|
foreach ($riwayatData as $data) {
|
|
$data->waktu_tertinggi_suhu = $model::whereDate('created_at', $data->tanggal)
|
|
->where('suhu', $data->tertinggi_suhu)
|
|
->value('created_at');
|
|
|
|
$data->waktu_tertinggi_kelembaban = $model::whereDate('created_at', $data->tanggal)
|
|
->where('kelembaban', $data->tertinggi_kelembaban)
|
|
->value('created_at');
|
|
|
|
$data->waktu_terendah_suhu = $model::whereDate('created_at', $data->tanggal)
|
|
->where('suhu', $data->terendah_suhu)
|
|
->value('created_at');
|
|
|
|
$data->waktu_terendah_kelembaban = $model::whereDate('created_at', $data->tanggal)
|
|
->where('kelembaban', $data->terendah_kelembaban)
|
|
->value('created_at');
|
|
}
|
|
|
|
// Return view and pass the data and selected region
|
|
return view('riwayat_data', compact('riwayatData', 'region', 'start_date', 'end_date'));
|
|
}
|
|
|
|
public function riwayatDataDua(Request $request)
|
|
{
|
|
$region = $request->input('region', 'Depan');
|
|
$date = $request->input('date');
|
|
|
|
switch ($region) {
|
|
case 'Depan':
|
|
$model = new MSensor();
|
|
break;
|
|
case 'Belakang':
|
|
$model = new MSensordua();
|
|
break;
|
|
}
|
|
|
|
$data = $model::select('created_at', 'suhu', 'kelembaban')
|
|
->whereDate('created_at', $date)
|
|
->orderBy('created_at')
|
|
->get();
|
|
|
|
$filteredData = collect(); // Pastikan ini adalah koleksi
|
|
if ($data->isNotEmpty()) {
|
|
$start = strtotime($data->first()->created_at);
|
|
$end = strtotime($data->last()->created_at);
|
|
$interval = 5 * 60;
|
|
$nextTime = $start + $interval;
|
|
|
|
while ($start <= $end) {
|
|
$nearest = $data->firstWhere('created_at', '>=', date('Y-m-d H:i:s', $start));
|
|
if ($nearest) {
|
|
$filteredData->push($nearest);
|
|
}
|
|
$start = $nextTime;
|
|
$nextTime += $interval;
|
|
}
|
|
}
|
|
|
|
return view('riwayat_datadua', compact('filteredData', 'region', 'date'));
|
|
}
|
|
}
|