fix: Add polling mechanism for sensor threshold monitoring
Problem: - Firebase SDK listener not triggering (SDK timeout) - No sensor data being checked despite sensor=true - Log shows no SENSOR CHECK output Solution: - Add polling every 30 seconds using REST API (reliable) - Keep Firebase listener as backup if SDK recovers - Check kontrolConfig.sensor flag before processing - Shared checkSensorThresholds() function for both methods This ensures sensor mode works even when Firebase SDK fails
This commit is contained in:
parent
581ab42fac
commit
c79033de91
77
worker.js
77
worker.js
|
|
@ -786,28 +786,32 @@ setTimeout(async () => {
|
|||
|
||||
let sensorCheckCounter = 0;
|
||||
|
||||
async function setupSensorMonitoring() {
|
||||
console.log('🌡️ ==================== SENSOR MODE ENABLED ====================');
|
||||
console.log('✅ Sensor Mode (Threshold System) monitoring started');
|
||||
console.log('📍 Listening to Firebase path: /data');
|
||||
console.log('📍 Config path: /' + FIREBASE_PATHS.kontrol);
|
||||
console.log('⏱️ Debounce time: 2 minutes between watering per pot');
|
||||
console.log('================================================================\n');
|
||||
|
||||
db.ref('data').on('value', async (snapshot) => {
|
||||
// Core sensor check logic (shared by listener and polling)
|
||||
async function checkSensorThresholds() {
|
||||
sensorCheckCounter++;
|
||||
|
||||
try {
|
||||
const sensorData = snapshot.val();
|
||||
// Fetch sensor data using smart method (REST fallback)
|
||||
const sensorData = await readFirebaseSmart('data');
|
||||
|
||||
if (!sensorData) {
|
||||
console.log('⚠️ Sensor data is null/empty');
|
||||
console.log('⚠️ Sensor data is null/empty - ESP32 might not be sending data');
|
||||
return;
|
||||
}
|
||||
|
||||
const configSnapshot = await fetchWithTimeout(db.ref(FIREBASE_PATHS.kontrol), 10000);
|
||||
const kontrolConfig = configSnapshot.val();
|
||||
// Fetch kontrol config using smart method
|
||||
const kontrolConfig = await fetchKontrolSmart();
|
||||
|
||||
if (!kontrolConfig) {
|
||||
console.log('⚠️ Kontrol config is null');
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if sensor mode is enabled
|
||||
if (!kontrolConfig.sensor) {
|
||||
if (sensorCheckCounter % 10 === 0) {
|
||||
console.log(`⚠️ Sensor mode DISABLED (sensor=false). Skipping threshold check.`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -908,9 +912,54 @@ async function setupSensorMonitoring() {
|
|||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Error in threshold monitoring:', error.message);
|
||||
console.error('❌ Error in sensor threshold check:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Setup sensor monitoring with BOTH listener (SDK) and polling (fallback)
|
||||
async function setupSensorMonitoring() {
|
||||
console.log('🌡️ ==================== SENSOR MODE ENABLED ====================');
|
||||
console.log('✅ Sensor Mode (Threshold System) monitoring started');
|
||||
console.log('📍 Primary: Polling every 30 seconds (REST API)');
|
||||
console.log('📍 Backup: Firebase listener on /data (if SDK works)');
|
||||
console.log('📍 Config path: /' + FIREBASE_PATHS.kontrol);
|
||||
console.log('⏱️ Debounce time: 2 minutes between watering per pot');
|
||||
console.log('================================================================\n');
|
||||
|
||||
// METHOD 1: Polling (RELIABLE - uses REST API)
|
||||
// Check sensor threshold every 30 seconds
|
||||
setInterval(async () => {
|
||||
try {
|
||||
await checkSensorThresholds();
|
||||
} catch (error) {
|
||||
console.error('❌ Polling sensor check failed:', error.message);
|
||||
}
|
||||
}, 30000); // 30 seconds
|
||||
|
||||
// Run first check immediately
|
||||
setTimeout(async () => {
|
||||
console.log('🚀 Running first sensor check...');
|
||||
try {
|
||||
await checkSensorThresholds();
|
||||
console.log('✅ First sensor check completed');
|
||||
} catch (error) {
|
||||
console.error('❌ First sensor check failed:', error.message);
|
||||
}
|
||||
}, 10000); // 10 seconds after startup
|
||||
|
||||
// METHOD 2: Firebase Listener (BACKUP - might not work if SDK fails)
|
||||
try {
|
||||
db.ref('data').on('value', async (snapshot) => {
|
||||
console.log('🔔 Firebase listener triggered (SDK working!)');
|
||||
// Call the same check function
|
||||
await checkSensorThresholds();
|
||||
}, (error) => {
|
||||
console.error('❌ Firebase listener error:', error.message);
|
||||
});
|
||||
console.log('✅ Firebase listener attached (backup method)');
|
||||
} catch (error) {
|
||||
console.log('⚠️ Firebase listener failed to attach (will rely on polling)');
|
||||
}
|
||||
}
|
||||
|
||||
setupSensorMonitoring();
|
||||
|
|
|
|||
Loading…
Reference in New Issue