@ -1021,13 +1021,300 @@ const formatDate = (date) => {
} ;
} ;
// 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
// console.log(req.body.startTime)
// // Ensure motor_id is provided
// if (!motorId) {
// throw new Error("Motor ID is required.");
// }
// // Determine the motor stop status based on the action
// let motorStopStatus;
// if (action === "start") {
// motorStopStatus = "2"; // If action is start, set stop status to "2"
// } else if (action === "stop") {
// motorStopStatus = "1"; // If action is stop, set stop status to "1"
// } else {
// throw new Error("Invalid action provided.");
// }
// // 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: {
// "connections.inputConnections.$.motor_stop_status": "1",
// "connections.inputConnections.$.stopTime": req.body.stopTime,
// "connections.inputConnections.$.threshold_type": null,
// "connections.inputConnections.$.manual_threshold_time": null,
// "connections.inputConnections.$.manual_threshold_percentage": null
// }
// }
// );
// // Send immediate response to the client
// reply.code(200).send({ message: "Motor stopped successfully." });
// // Perform stop operations in the background
// (async () => {
// await delay(300000);
// // Update the existing motor data entry with stop details
// 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 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 } }
// );
// await MotorData.updateOne(
// { customerId, motor_id: motorId, start_instance_id: start_instance_id },
// {
// $set: {
// stopTime: req.body.stopTime,
// receiverfinalwaterlevel: receiverFinalWaterLevel.toString(),
// quantity_delivered: quantityDelivered.toString()
// }
// }
// );
// }
// })();
// // Return here to ensure the rest of the code is not executed for the stop action
// return;
// } else {
// // Update the motor stop status to "2" for start action
// await Tank.updateOne(
// { customerId, "connections.inputConnections.motor_id": motorId },
// { $set: { "connections.inputConnections.$.motor_stop_status": "2" } }
// );
// }
// // 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({
// 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();
// 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 } }
// );
// }
// }
// // 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) {
// console.log(splr_tank_info3_percentage,)
// 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);
// await delay(300000);
// 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 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 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()
// }
// }
// );
// }
// }
// }, 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);
// 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: {
// stopTime:stopTime,
// receiverfinalwaterlevel: receiverFinalWaterLevel.toString(),
// quantity_delivered: quantityDelivered.toString()
// }
// }
// );
// }
// }
// }, 20000); // Check water level every minute
// }
// }
// // Respond with success message
// reply.code(200).send({ message: `Motor ${action === "start" ? "started" : "stopped"} successfully.` });
// } catch (err) {
// // Handle errors
// throw boom.boomify(err);
// }
// };
const admin = require ( 'firebase-admin' ) ;
// Initialize Firebase Admin SDK (make sure this is done once in your app)
// const serviceAccount = require('../waternotifications-ab81a-firebase-adminsdk-ereny-8b0bdac787.json');
const serviceAccount = require ( '../waternotifications-ab81a-firebase-adminsdk-ereny-8b0bdac787.json' ) ;
admin . initializeApp ( {
credential : admin . credential . cert ( serviceAccount ) ,
} ) ;
exports . motorAction = async ( req , reply ) => {
exports . motorAction = async ( req , reply ) => {
try {
try {
const customerId = req . params . customerId ;
const customerId = req . params . customerId ;
const action = req . body . action ;
const action = req . body . action ;
const motorId = req . body . motor _id ;
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 )
//const fcmIds = req.body.fcmIds; // Assume this is provided in the request to notify users
// Ensure motor_id is provided
// Ensure motor_id is provided
if ( ! motorId ) {
if ( ! motorId ) {
throw new Error ( "Motor ID is required." ) ;
throw new Error ( "Motor ID is required." ) ;
@ -1042,8 +1329,10 @@ exports.motorAction = async (req, reply) => {
} else {
} else {
throw new Error ( "Invalid action provided." ) ;
throw new Error ( "Invalid action provided." ) ;
}
}
const users = await User . find ( { customerId : customerId } ) ;
const fcmIds = users . map ( user => user . fcmId ) . filter ( fcmId => fcmId ) ;
// Update the motor stop status immediately if action is stop
// Handle motor stop action
if ( action === "stop" ) {
if ( action === "stop" ) {
// Update the motor stop status and other fields
// Update the motor stop status and other fields
await Tank . updateOne (
await Tank . updateOne (
@ -1062,6 +1351,21 @@ exports.motorAction = async (req, reply) => {
// Send immediate response to the client
// Send immediate response to the client
reply . code ( 200 ) . send ( { message : "Motor stopped successfully." } ) ;
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
// Perform stop operations in the background
( async ( ) => {
( async ( ) => {
await delay ( 300000 ) ;
await delay ( 300000 ) ;
@ -1100,16 +1404,26 @@ exports.motorAction = async (req, reply) => {
{ customerId , "connections.inputConnections.motor_id" : motorId } ,
{ customerId , "connections.inputConnections.motor_id" : motorId } ,
{ $set : { "connections.inputConnections.$.motor_stop_status" : "2" } }
{ $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
// Check threshold settings if action is start
if ( action === "start" ) {
if ( action === "start" ) {
if ( req . body . threshold _type === "time" ) {
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 receiver _tank _info7 = await Tank . findOne ( { customerId , tankName : req . body . to , tankLocation : req . body . to _type . toLowerCase ( ) } ) ;
const newMotorData = new MotorData ( {
const newMotorData = new MotorData ( {
@ -1135,21 +1449,30 @@ exports.motorAction = async (req, reply) => {
}
}
}
}
// Start monitoring water level based on threshold time
// Start monitoring water level based on threshold time
const thresholdTime = moment ( ) . add ( req . body . manual _threshold _time , 'minutes' ) . toDate ( ) ;
const thresholdTime = moment ( ) . add ( req . body . manual _threshold _time , 'minutes' ) . toDate ( ) ;
const intervalId = setInterval ( async ( ) => {
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 = 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 ) ;
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 . 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 ;
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 ) {
if ( new Date ( ) >= thresholdTime || splr _tank _info3 _percentage <= 20 ) {
console . log ( splr _tank _info3 _percentage , )
// 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 ) ;
}
}
await Tank . updateOne (
await Tank . updateOne (
{ customerId , "connections.inputConnections.motor_id" : motorId } ,
{ customerId , "connections.inputConnections.motor_id" : motorId } ,
{
{
@ -1171,16 +1494,17 @@ exports.motorAction = async (req, reply) => {
const receiverFinalWaterLevel = parseInt ( receiverTank . waterlevel , 10 ) ;
const receiverFinalWaterLevel = parseInt ( receiverTank . waterlevel , 10 ) ;
const quantityDelivered = receiverFinalWaterLevel - parseInt ( motorData . receiverInitialwaterlevel , 10 ) ;
const quantityDelivered = receiverFinalWaterLevel - parseInt ( motorData . receiverInitialwaterlevel , 10 ) ;
const water _pumped _till _now = parseInt ( receiverTank . total _water _added _from _midnight , 10 ) ;
const water _pumped _till _now = parseInt ( receiverTank . total _water _added _from _midnight , 10 ) ;
const totalwaterpumped = quantityDelivered + water _pumped _till _now
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 } } )
await Tank . findOneAndUpdate (
{ customerId , tankName : motorData . receiverTank , tankLocation : motorData . receiver _type . toLowerCase ( ) } ,
const stopTime = formatDate ( new Date ( ) ) ;
{ $set : { total _water _added _from _midnight : totalwaterpumped } }
) ;
await MotorData . updateOne (
await MotorData . updateOne (
{ customerId , motor _id : motorId , start _instance _id : start _instance _id } ,
{ customerId , motor _id : motorId , start _instance _id : start _instance _id } ,
{
{
$set : {
$set : {
stopTime : stopTime ,
stopTime : req . body . stopTime ,
receiverfinalwaterlevel : receiverFinalWaterLevel . toString ( ) ,
receiverfinalwaterlevel : receiverFinalWaterLevel . toString ( ) ,
quantity _delivered : quantityDelivered . toString ( )
quantity _delivered : quantityDelivered . toString ( )
}
}
@ -1188,7 +1512,7 @@ exports.motorAction = async (req, reply) => {
) ;
) ;
}
}
}
}
} , 60000 ) ;
} , 60000 ) ; // Check every minute
} else if ( req . body . threshold _type === "litres" ) {
} else if ( req . body . threshold _type === "litres" ) {
console . log ( "entered litres" )
console . log ( "entered litres" )
const receiver _tank _info7 = await Tank . findOne ( { customerId , tankName : req . body . to , tankLocation : req . body . to _type . toLowerCase ( ) } ) ;
const receiver _tank _info7 = await Tank . findOne ( { customerId , tankName : req . body . to , tankLocation : req . body . to _type . toLowerCase ( ) } ) ;
@ -1239,7 +1563,6 @@ exports.motorAction = async (req, reply) => {
// Update water level threshold
// Start monitoring water level based on threshold percentage
// Start monitoring water level based on threshold percentage
@ -1285,11 +1608,10 @@ exports.motorAction = async (req, reply) => {
) ;
) ;
}
}
}
}
} , 20000 ) ; // Check water level every minute
} , 20000 ) ;
}
}
}
}
// Respond with success message
reply . code ( 200 ) . send ( { message : ` Motor ${ action === "start" ? "started" : "stopped" } successfully. ` } ) ;
reply . code ( 200 ) . send ( { message : ` Motor ${ action === "start" ? "started" : "stopped" } successfully. ` } ) ;
} catch ( err ) {
} catch ( err ) {
// Handle errors
// Handle errors
@ -1297,8 +1619,6 @@ exports.motorAction = async (req, reply) => {
}
}
} ;
} ;
const motorActionAuto = async ( req , reply ) => {
const motorActionAuto = async ( req , reply ) => {
try {
try {
const customerId = req . params . customerId ;
const customerId = req . params . customerId ;