lestoitsduval-alerting/index.js

94 lines
3.0 KiB
JavaScript

import Mailjet from 'node-mailjet'
const monitoringUrl = "https://monitoringapi.solaredge.com/site/2516130/overview?api_key=GVF1BZAAM74IRDZ2WRWT32A5V0CY9G4Z&format=json"
async function getData() {
const response = await fetch(monitoringUrl);
return response.json();
}
async function getCurrentPower(data) {
return data.overview.currentPower.power
}
async function getLastUpdateTime(data) {
return data.overview.lastUpdateTime
}
async function sendAlert(msg) {
console.log("sendAlert start")
const mailjet = Mailjet.apiConnect(
process.env.MJ_APIKEY_PUBLIC,
process.env.MJ_APIKEY_PRIVATE,
);
const request = mailjet
.post('send', { version: 'v3.1' })
.request({
Messages: [
{
From: {
Email: "admin@lestoitsduval.fr",
Name: "Les Toits du Val - Salle Greyzollon Duluth"
},
To: [
{
Email: "alert@lestoitsduval.fr",
Name: "Équipe pour les alertes"
}
],
Subject: "😱 Alerte sur la production",
TextPart: msg,
}
]
})
request
.then((result) => {
console.log("result")
console.log(result.body)
})
.catch((err) => {
console.log("err")
console.log(err)
})
console.log("sendAlert end")
return
}
function formatTime(seconds) {
if (seconds < 60) {
return `${seconds} seconde${seconds > 1 ? 's' : ''}`;
} else if (seconds < 3600) {
const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60;
return remainingSeconds === 0
? `environ ${minutes} minute${minutes > 1 ? 's' : ''}`
: `${minutes} minute${minutes > 1 ? 's' : ''} et ${remainingSeconds} seconde${remainingSeconds > 1 ? 's' : ''}`;
} else {
const hours = Math.floor(seconds / 3600);
const remainingMinutes = Math.floor((seconds % 3600) / 60);
return remainingMinutes === 0
? `environ ${hours} heure${hours > 1 ? 's' : ''}`
: `environ ${hours} heure${hours > 1 ? 's' : ''} et ${remainingMinutes} minute${remainingMinutes > 1 ? 's' : ''}`;
}
}
const data = await getData();
const now = new Date();
const currentPower = await getCurrentPower(data);
const lastUpdateTime = await getLastUpdateTime(data);
console.log(`[${lastUpdateTime}] La salle Greyzollon Duluth produissait ${currentPower} watt${currentPower>0?'s':''} !`)
const secondDifference = Math.ceil(Math.abs(now.getTime() - new Date(lastUpdateTime).getTime()) / 1000);
const formatedDifference = formatTime(secondDifference)
if (secondDifference > (6 * 60)) {
const msg = `❌ L'installation n'a pas répondu depuis '${lastUpdateTime}' ça fait ${formatedDifference} (${secondDifference}) !`
console.log(msg);
await sendAlert(msg);
} else {
console.log(`✅ L'installation répond correctement dernière mise à jour il y a ${formatedDifference} (${secondDifference}).`);
}