upload project flutter

This commit is contained in:
Kharisma 2026-07-02 13:55:02 +07:00
parent 036a3543ed
commit 6a2f130e3a
1 changed files with 61 additions and 31 deletions

View File

@ -81,6 +81,10 @@ function toDate(value) {
} }
function normalizeKandangKey(kandangId, kandangNama) { function normalizeKandangKey(kandangId, kandangNama) {
const name = String(kandangNama || '').toLowerCase();
if (name.includes('kandang 1') || name.includes('kandang1') || name.includes('kandang_1')) return 'kandang1';
if (name.includes('kandang 2') || name.includes('kandang2') || name.includes('kandang_2')) return 'kandang2';
const rawId = String(kandangId || '').toLowerCase(); const rawId = String(kandangId || '').toLowerCase();
const rawNama = String(kandangNama || '').toLowerCase(); const rawNama = String(kandangNama || '').toLowerCase();
const merged = `${rawId} ${rawNama}`; const merged = `${rawId} ${rawNama}`;
@ -136,27 +140,53 @@ function resolveTargetKandangIds(jadwal, kandangMap) {
} }
function detectJenisPanen(jadwal, jadwalOrder) { function detectJenisPanen(jadwal, jadwalOrder) {
// jadwalOrder 0 = urutan pertama = PAGI
// jadwalOrder 1+ = urutan selanjutnya = SORE (atau sesuai jam) // Prioritas 1: baca langsung dari Firebase
const tipe = String(
jadwal.tipeJadwal ||
jadwal.tipe_jadwal ||
jadwal.keterangan ||
''
)
.toLowerCase()
.trim();
if (tipe.includes('pagi')) {
return 'pagi';
}
if (tipe.includes('sore')) {
return 'sore';
}
// Fallback untuk data lama
if (jadwalOrder === 0) { if (jadwalOrder === 0) {
return 'pagi'; return 'pagi';
} }
// Untuk jadwal ke-2+, check jam: < 12 = pagi, >= 12 = sore return 'sore';
const jam = String(jadwal.jam || '09:00');
const hour = Number(jam.split(':')[0] || 9);
return hour < 12 ? 'pagi' : 'sore';
} }
function resolveInfraPath(kandangId, kandangData) { function resolveInfraPath(kandangId, kandangData) {
if (kandangData && kandangData.infraPath) { if (kandangData && kandangData.infraPath) {
return String(kandangData.infraPath); const path = String(kandangData.infraPath).toLowerCase();
if (path.includes('2')) return 'infra2';
if (path.includes('1')) return 'infra1';
return path;
}
if (kandangData && kandangData.nama) {
const nama = String(kandangData.nama).toLowerCase();
if (nama.includes('2') || nama.includes('dua')) return 'infra2';
if (nama.includes('1') || nama.includes('satu')) return 'infra1';
} }
const id = String(kandangId || '').toLowerCase(); const id = String(kandangId || '').toLowerCase();
if (id.includes('1')) return 'infra1'; if (id.length < 15) {
if (id.includes('2')) return 'infra2'; if (id.includes('2')) return 'infra2';
if (id.includes('1')) return 'infra1';
}
return 'infra1'; return 'infra1';
} }
@ -211,11 +241,11 @@ async function updateRiwayatSummary({ kandangId, kandangNama, jumlahTelur, dateK
}); });
} }
async function resetSensorAfterEvening(todayKey) { async function resetSensorAfterEvening(todayKey, nowHHMM) {
const lockKey = 'evening_sensor_reset'; const lockKey = `evening_sensor_reset_${nowHHMM.replace(':', '')}`;
const gotLock = await acquireRunLock(todayKey, lockKey); const gotLock = await acquireRunLock(todayKey, lockKey);
if (!gotLock) { if (!gotLock) {
console.log('[skip] Sensor reset sudah dieksekusi hari ini'); console.log('[skip] Sensor & snapshot reset sudah dieksekusi untuk menit ini');
return; return;
} }
@ -225,7 +255,14 @@ async function resetSensorAfterEvening(todayKey) {
last_reset_by_scheduler: new Date().toISOString(), last_reset_by_scheduler: new Date().toISOString(),
}); });
console.log('[ok] Sensor infra1/infra2 di-reset otomatis setelah jadwal sore'); // PERINTAH RESET KE ESP32
await admin.database().ref('kontrol').update({
reset_counter: true
});
await admin.database().ref(`panen_snapshot/${todayKey}`).remove();
console.log('[ok] Sensor infra1/infra2 dan snapshot panen di-reset otomatis setelah jadwal sore');
} }
async function writeRiwayat({ async function writeRiwayat({
@ -523,10 +560,10 @@ async function runForSchedule(jadwalId, jadwal, dataSensor, kandangMap, todayKey
} }
for (const kandangId of targetKandangIds) { for (const kandangId of targetKandangIds) {
const lockKey = `${jenisPanen}_${kandangId}`; const lockKey = `${jenisPanen}_${kandangId}_${jam.replace(/:/g, '')}`;
const gotLock = await acquireRunLock(todayKey, lockKey); const gotLock = await acquireRunLock(todayKey, lockKey);
if (!gotLock) { if (!gotLock) {
console.log(`[skip] ${jadwalId}/${kandangId}: slot ${jenisPanen} sudah dieksekusi hari ini`); console.log(`[skip] ${jadwalId}/${kandangId}: slot ${jenisPanen} pada jam ${jam} sudah dieksekusi hari ini`);
continue; continue;
} }
@ -562,7 +599,7 @@ async function runForSchedule(jadwalId, jadwal, dataSensor, kandangMap, todayKey
const pagiSnapRef = admin.database().ref(`panen_snapshot/${todayKey}/pagi/${kandangId}`); const pagiSnapRef = admin.database().ref(`panen_snapshot/${todayKey}/pagi/${kandangId}`);
const pagiSnap = await pagiSnapRef.get(); const pagiSnap = await pagiSnapRef.get();
const nilaiPagi = pagiSnap.exists() ? Number(pagiSnap.val() || 0) : 0; const nilaiPagi = pagiSnap.exists() ? Number(pagiSnap.val() || 0) : 0;
const delta = Math.max(sensorValue - nilaiPagi, 0); const delta = sensorValue >= nilaiPagi ? (sensorValue - nilaiPagi) : sensorValue;
await admin.database().ref(`panen_snapshot/${todayKey}/sore`).update({ await admin.database().ref(`panen_snapshot/${todayKey}/sore`).update({
[kandangId]: sensorValue, [kandangId]: sensorValue,
@ -584,13 +621,6 @@ async function runForSchedule(jadwalId, jadwal, dataSensor, kandangMap, todayKey
console.log(`[ok] Sore ${kandangNama}: ${delta} telur (${sensorValue}-${nilaiPagi})`); console.log(`[ok] Sore ${kandangNama}: ${delta} telur (${sensorValue}-${nilaiPagi})`);
} }
// Jika ini jadwal terakhir, reset snapshot untuk hari ini
if (jadwalOrder === totalJadwal - 1) {
const snapshotRef = admin.database().ref(`panen_snapshot/${todayKey}`);
await snapshotRef.remove();
console.log(`[ok] Reset snapshot panen untuk hari ${todayKey} (jadwal terakhir selesai)`);
}
} }
async function runTick() { async function runTick() {
@ -655,7 +685,7 @@ async function runTick() {
} }
if (hasEveningRun) { if (hasEveningRun) {
await resetSensorAfterEvening(todayKey); await resetSensorAfterEvening(todayKey, nowHHMM);
} }
} }