TKK_E32211537/app/Http/Controllers/SensorLaravel.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'));
}
}