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}).`); }