diff --git a/src/controllers/tanksController.js b/src/controllers/tanksController.js index 22b5be65..9fa8d874 100644 --- a/src/controllers/tanksController.js +++ b/src/controllers/tanksController.js @@ -1336,13 +1336,14 @@ const sendPushNotification = async (registrationToken, title, body) => { } }; + exports.motorAction = async (req, reply) => { try { const customerId = req.params.customerId; const action = req.body.action; const motorId = req.body.motor_id; - const start_instance_id = req.body.start_instance_id; - + const start_instance_id = req.body.start_instance_id + console.log(req.body.startTime) // Ensure motor_id is provided if (!motorId) { throw new Error("Motor ID is required."); @@ -1358,16 +1359,13 @@ exports.motorAction = async (req, reply) => { throw new Error("Invalid action provided."); } - const users = await User.find({ customerId: customerId }); - const fcmIds = users.map(user => user.fcmId).filter(fcmId => fcmId); - - // Handle motor stop action + // Update the motor stop status immediately if action is stop if (action === "stop") { // Update the motor stop status and other fields await Tank.updateOne( { customerId, "connections.inputConnections.motor_id": motorId }, - { - $set: { + { + $set: { "connections.inputConnections.$.motor_stop_status": "1", "connections.inputConnections.$.stopTime": req.body.stopTime, "connections.inputConnections.$.threshold_type": null, @@ -1380,21 +1378,6 @@ exports.motorAction = async (req, reply) => { // Send immediate response to the client reply.code(200).send({ message: "Motor stopped successfully." }); - // Send notification for motor stop - for (const fcmId of fcmIds) { - try { - const response = await sendPushNotification(fcmId, 'Motor Stopped', `Motor has stopped at ${req.body.stopTime}.`); - console.log('Notification sent successfully:', response); - - if (response.results[0].error === 'NotRegistered') { - await User.updateOne({ fcmId: fcmId }, { $unset: { fcmId: "" } }); - console.log(`Removed unregistered FCM ID: ${fcmId}`); - } - } catch (error) { - console.error('Error sending notification:', error); - } - } - // Perform stop operations in the background (async () => { await delay(300000); @@ -1414,8 +1397,8 @@ exports.motorAction = async (req, reply) => { await MotorData.updateOne( { customerId, motor_id: motorId, start_instance_id: start_instance_id }, - { - $set: { + { + $set: { stopTime: req.body.stopTime, receiverfinalwaterlevel: receiverFinalWaterLevel.toString(), quantity_delivered: quantityDelivered.toString() @@ -1433,26 +1416,16 @@ exports.motorAction = async (req, reply) => { { customerId, "connections.inputConnections.motor_id": motorId }, { $set: { "connections.inputConnections.$.motor_stop_status": "2" } } ); - - // Send notification for motor start - for (const fcmId of fcmIds) { - try { - const response = await sendPushNotification(fcmId, 'Motor Started', `Motor has started at ${req.body.startTime}.`); - console.log('Notification sent successfully:', response); - - if (response.results[0].error === 'NotRegistered') { - await User.updateOne({ fcmId: fcmId }, { $unset: { fcmId: "" } }); - console.log(`Removed unregistered FCM ID: ${fcmId}`); - } - } catch (error) { - console.error('Error sending notification:', error); - } - } } // Check threshold settings if action is start if (action === "start") { if (req.body.threshold_type === "time") { + // If threshold type is time, update threshold time + // await Tank.updateOne( + // { customerId, "connections.inputConnections.motor_id": motorId }, + // { $set: { "connections.inputConnections.$.manual_threshold_time": req.body.manual_threshold_time,startTime:req.body.startTime } } + // ); const receiver_tank_info7 = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); const newMotorData = new MotorData({ @@ -1464,44 +1437,35 @@ exports.motorAction = async (req, reply) => { supplier_type: req.body.from_type, receiver_type: req.body.to_type, startTime: req.body.startTime, - receiverInitialwaterlevel: parseInt(receiver_tank_info7.waterlevel, 10) + receiverInitialwaterlevel:parseInt(receiver_tank_info7.waterlevel, 10) }); await newMotorData.save(); - for await (const tank of Tank.find({ "connections.inputConnections.motor_id": motorId })) { + for await (const tank of Tank.find({ "connections.inputConnections.motor_id": motorId })) { const index = tank.connections.inputConnections.findIndex(connection => connection.motor_id === motorId); if (index !== -1) { await Tank.updateOne( { customerId, "connections.inputConnections.motor_id": motorId }, - { $set: { [`connections.inputConnections.${index}.manual_threshold_time`]: req.body.manual_threshold_time, [`connections.inputConnections.${index}.startTime`]: req.body.startTime, [`connections.inputConnections.${index}.start_instance_id`]: start_instance_id } } + { $set: { [`connections.inputConnections.${index}.manual_threshold_time`]: req.body.manual_threshold_time, [`connections.inputConnections.${index}.startTime`]: req.body.startTime,[`connections.inputConnections.${index}.start_instance_id`]: start_instance_id } } ); } } + // Start monitoring water level based on threshold time const thresholdTime = moment().add(req.body.manual_threshold_time, 'minutes').toDate(); const intervalId = setInterval(async () => { const splr_tank_info3 = await Tank.findOne({ customerId, tankName: req.body.from, tankLocation: req.body.from_type.toLowerCase() }); const splr_tank_info3_waterlevel = parseInt(splr_tank_info3.waterlevel, 10); + //console.log(splr_tank_info3_waterlevel,"splr_tank_info3_waterlevel") const splr_tank_info3_capacity = parseInt(splr_tank_info3.capacity.replace(/,/g, ''), 10); + // const splr_tank_info3_capacity = parseInt(splr_tank_info3.capacity, 10); + // console.log(splr_tank_info3.capacity,splr_tank_info3_capacity,"splr_tank_info3_capacity") const splr_tank_info3_percentage = (splr_tank_info3_waterlevel / splr_tank_info3_capacity) * 100; + // console.log(splr_tank_info3_percentage, "percentage for less than 20"); if (new Date() >= thresholdTime || splr_tank_info3_percentage <= 20) { - // Send notification for low supplier tank percentage - for (const fcmId of fcmIds) { - try { - const response = await sendPushNotification(fcmId, 'Low Water Level Alert', `Supplier tank water level is below 20% (${splr_tank_info3_percentage.toFixed(2)}%).`); - console.log('Notification sent successfully:', response); - - if (response.results[0].error === 'NotRegistered') { - await User.updateOne({ fcmId: fcmId }, { $unset: { fcmId: "" } }); - console.log(`Removed unregistered FCM ID: ${fcmId}`); - } - } catch (error) { - console.error('Error sending notification:', error); - } - } - + console.log(splr_tank_info3_percentage,) await Tank.updateOne( { customerId, "connections.inputConnections.motor_id": motorId }, { @@ -1523,94 +1487,135 @@ exports.motorAction = async (req, reply) => { const receiverFinalWaterLevel = parseInt(receiverTank.waterlevel, 10); const quantityDelivered = receiverFinalWaterLevel - parseInt(motorData.receiverInitialwaterlevel, 10); const water_pumped_till_now = parseInt(receiverTank.total_water_added_from_midnight, 10); - const totalwaterpumped = quantityDelivered + water_pumped_till_now; - await Tank.findOneAndUpdate( - { customerId, tankName: motorData.receiverTank, tankLocation: motorData.receiver_type.toLowerCase() }, - { $set: { total_water_added_from_midnight: totalwaterpumped } } - ); + const totalwaterpumped = quantityDelivered + water_pumped_till_now + await Tank.findOneAndUpdate({customerId, tankName: motorData.receiverTank, tankLocation: motorData.receiver_type.toLowerCase()}, { $set: { total_water_added_from_midnight: totalwaterpumped } }) + + const stopTime = formatDate(new Date()); await MotorData.updateOne( { customerId, motor_id: motorId, start_instance_id: start_instance_id }, { $set: { - stopTime: formatDate(new Date()), + stopTime:stopTime, receiverfinalwaterlevel: receiverFinalWaterLevel.toString(), quantity_delivered: quantityDelivered.toString() } } ); } - } else { - // Monitor the receiver tank's water level and send notification if max capacity is reached - const receiverTank = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); - const currentWaterLevel = parseInt(receiverTank.waterlevel, 10); - const receiverTankCapacity = parseInt(receiverTank.capacity, 10); - - if (currentWaterLevel >= receiverTankCapacity) { - // Send a notification for maximum water level reached - for (const fcmId of fcmIds) { - try { - const response = await sendPushNotification(fcmId, 'Maximum Water Level Alert', `The receiver tank has reached its maximum capacity.`); - console.log('Notification sent successfully:', response); - - if (response.results[0].error === 'NotRegistered') { - await User.updateOne({ fcmId: fcmId }, { $unset: { fcmId: "" } }); - console.log(`Removed unregistered FCM ID: ${fcmId}`); - } - } catch (error) { - console.error('Error sending notification:', error); + } + }, 60000); + } else if (req.body.threshold_type === "litres") { + console.log("entered litres") + const receiver_tank_info7 = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); + + const newMotorData = new MotorData({ + customerId: customerId, + motor_id: motorId, + start_instance_id: start_instance_id, + supplierTank: req.body.from, + receiverTank: req.body.to, + supplier_type: req.body.from_type, + receiver_type: req.body.to_type, + startTime: req.body.startTime, + receiverInitialwaterlevel:parseInt(receiver_tank_info7.waterlevel, 10) + }); + await newMotorData.save(); + // If threshold type is percentage, calculate percentage threshold + const receiver_tank_info = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); + const supplier_tank_info = await Tank.findOne({ customerId, tankName: req.body.from, tankLocation: req.body.from_type.toLowerCase() }); + if (!receiver_tank_info) { + throw new Error("Receiver tank not found."); + } + if (!supplier_tank_info) { + throw new Error("Supplierr tank not found."); + } + const supplier_capacity = parseInt(supplier_tank_info.capacity, 10); + const supplier_waterLevel = parseInt(supplier_tank_info.waterlevel, 10); + + const capacity = parseInt(receiver_tank_info.capacity, 10); + const waterLevel = parseInt(receiver_tank_info.waterlevel, 10); + const desired_percentage = parseInt(req.body.manual_threshold_litres.replace(/,/g, ''), 10); + + console.log(desired_percentage) + const threshold_water_level = waterLevel+desired_percentage; + + const supplier_threshold = supplier_waterLevel-desired_percentage + console.log(supplier_threshold,"supplier_threshold") + + for await (const tank of Tank.find({ "connections.inputConnections.motor_id": motorId })) { + const index = tank.connections.inputConnections.findIndex(connection => connection.motor_id === motorId); + if (index !== -1) { + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { $set: { [`connections.inputConnections.${index}.manual_threshold_percentage`]: supplier_threshold.toString(), [`connections.inputConnections.${index}.startTime`]: req.body.startTime } } + ); + } + } + + + + // Update water level threshold + + + // Start monitoring water level based on threshold percentage + const intervalId = setInterval(async () => { + // Check if water level has reached the threshold percentage + const supplier_tank_info1 = await Tank.findOne({ customerId, tankName: req.body.from, tankLocation: req.body.from_type.toLowerCase() }); + const current_water_level = parseInt(supplier_tank_info1.waterlevel, 10); + if (current_water_level <= supplier_threshold) { + // Stop the motor pump + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { + $set: { + "connections.inputConnections.$.motor_stop_status": "1", + + "connections.inputConnections.$.threshold_type": null, + "connections.inputConnections.$.manual_threshold_time": null, + "connections.inputConnections.$.manual_threshold_percentage": null } } + ); + clearInterval(intervalId); // Stop monitoring water level + await delay(300000); - // Stop the motor - await Tank.updateOne( - { customerId, "connections.inputConnections.motor_id": motorId }, + const motorData = await MotorData.findOne({ customerId, motor_id: motorId, start_instance_id: start_instance_id }); + if (motorData) { + const receiverTank = await Tank.findOne({ customerId, tankName: motorData.receiverTank, tankLocation: motorData.receiver_type.toLowerCase() }); + const receiverFinalWaterLevel = parseInt(receiverTank.waterlevel, 10); + const quantityDelivered = receiverFinalWaterLevel - parseInt(motorData.receiverInitialwaterlevel, 10); + + + const stopTime = formatDate(new Date()); + + await MotorData.updateOne( + { customerId, motor_id: motorId, start_instance_id: start_instance_id }, { $set: { - "connections.inputConnections.$.motor_stop_status": "1", - "connections.inputConnections.$.threshold_type": null, - "connections.inputConnections.$.manual_threshold_time": null, - "connections.inputConnections.$.manual_threshold_percentage": null + stopTime:stopTime, + receiverfinalwaterlevel: receiverFinalWaterLevel.toString(), + quantity_delivered: quantityDelivered.toString() } } ); - - clearInterval(intervalId); // Stop monitoring - - await delay(300000); - - const motorData = await MotorData.findOne({ customerId, motor_id: motorId, start_instance_id: start_instance_id }); - if (motorData) { - const receiverFinalWaterLevel = currentWaterLevel; - const quantityDelivered = receiverFinalWaterLevel - parseInt(motorData.receiverInitialwaterlevel, 10); - - const stopTime = formatDate(new Date()); - - await MotorData.updateOne( - { customerId, motor_id: motorId, start_instance_id: start_instance_id }, - { - $set: { - stopTime: stopTime, - receiverfinalwaterlevel: receiverFinalWaterLevel.toString(), - quantity_delivered: quantityDelivered.toString() - } - } - ); - } } } - }, 20000); // Check every 20 seconds + }, 20000); // Check water level every minute } } - reply.code(200).send({ message: "Motor action processed successfully." }); - } catch (error) { - console.error(error); - reply.code(500).send({ error: error.message }); + // Respond with success message + reply.code(200).send({ message: `Motor ${action === "start" ? "started" : "stopped"} successfully.` }); + } catch (err) { + // Handle errors + throw boom.boomify(err); } }; + + // exports.motorAction = async (req, reply) => { // try { // const customerId = req.params.customerId;