Skip to content

Commit 800ae0c

Browse files
authored
Merge pull request #32 from 2hdlockness/dev V1.2.0
V1.2.0
2 parents e189843 + 03a3dc0 commit 800ae0c

19 files changed

+1109
-542
lines changed

.eslint.config.mjs

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ const config = [
112112
}
113113
},
114114
{
115-
"ignores": ["*.js"]
115+
"ignores": ["*.js", "components/*.js"]
116116
}
117117
];
118118

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/node_modules/
22
/MMM-Linky.js
33
/node_helper.js
4-
/linkyData.json
4+
/components/
5+
/data/*.json

README.md

+75-16
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@ Si vous choisissez de récupérer les données de l'année précédente une comp
88

99
Le header est également dynamique et changera en fonction de la période sélectionnée !
1010

11-
Les données sont actualisées chaque jour entre 14h et 15h.
11+
Les données sont actualisées chaque jour entre 12h et 12h15.
1212

1313
## ScreenShots
1414

15-
![Conso 7 derniers jours](https://github.com/user-attachments/assets/055eef27-43bb-478c-a2cb-16a451bac5b4)
16-
![Conso 3 derniers jours](https://github.com/user-attachments/assets/6dacfd38-d78e-4cb3-be22-be8aec980729)
17-
![Conso veille](https://github.com/user-attachments/assets/6e965953-0c5d-466e-accd-40d09ae3ab71)
15+
![APIs](https://github.com/user-attachments/assets/e3497a96-6a3a-4322-b9cb-fdd8bcfe9688)
16+
![Conso 7 derniers jours JPG](https://github.com/user-attachments/assets/fd2412cf-6cb1-4171-a3b7-1a9300ab2cc6)
17+
![Conso 3 derniers jours JPG](https://github.com/user-attachments/assets/c6658811-e6f4-4a5d-8e2c-ea0a53189fea)
18+
![Conso veille](https://github.com/user-attachments/assets/2e50eac0-71d2-44b4-9c78-0e9f4f1b80db)
1819

1920
Possibilité de choisir entre 4 thèmes de couleur pour le graphique et d'afficher les valeurs dans les barres :
2021

21-
![WithDataLabel](https://github.com/user-attachments/assets/a4196ed6-2289-487d-a4dc-aee6fb35ff06)
22-
![Capture](https://github.com/user-attachments/assets/52c76634-4543-41e0-be96-27326745fa3d)
22+
![WithDataLabel](https://github.com/user-attachments/assets/3ee608d5-3127-4adb-b6c3-2a3a07f6111e)
23+
![Capture](https://github.com/user-attachments/assets/a4d7366f-9f04-4a02-afaf-221caa9e1872)
2324

2425
## Installation
2526

@@ -30,7 +31,7 @@ cd MMM-Linky
3031
npm run setup
3132
```
3233

33-
## Using the module
34+
## Utilisation du module
3435

3536
### Pré-requis
3637

@@ -48,6 +49,8 @@ Pour utiliser ce module, ajoutez-le au tableau modules dans le fichier `config/c
4849
prm: "",
4950
token: "",
5051
periode: 1,
52+
apis: ["getDailyConsumption"],
53+
affichageInterval: 1000 * 15,
5154
annee_n_minus_1: 1,
5255
couleur: 3,
5356
valuebar: 1,
@@ -69,6 +72,7 @@ Configuration minimale :
6972
config: {
7073
prm: "",
7174
token: "",
75+
apis: ["getDailyConsumption"]
7276
},
7377
},
7478
```
@@ -77,18 +81,73 @@ Configuration minimale :
7781

7882
Option|Default|Description
7983
---|---|---
80-
`debug`|0|Active le mode débogage. <br>`1` : activer <br> `0` : Désactiver
84+
`debug`|0|Active le mode débogage. <br>`1` : activer <br> `0` : désactiver
8185
`prm`||Votre numéro PDL Linky [VOIR ICI](https://www.enedis.fr/faq/compteur-linky/ou-trouver-le-numero-point-de-livraison-pdl-du-compteur-linky)
82-
`token`||Votre token personnel [CONSO API](https://conso.boris.sh/)
86+
`token`||Votre token personnel [CONSO API](https://conso.boris.sh/)
8387
`periode`|1|Choix de la période: <br>`1` = Données de la veille <br>`2` = 3 derniers jours <br>`3` = 7 derniers jours
84-
`annee_n_minus_1`|1|Récupérer les données de l'année précédente. <br>`1` : Activer <br> `0` : Désactiver
88+
`apis`|["getDailyConsumption"]|Nom des API à interroger (voir ci-dessous)
89+
`affichageInterval`|1000 * 15|Intervalle d'affichage des graphiques en ms (si utilisation de plusieurs API)
90+
`annee_n_minus_1`|1|Récupérer les données de l'année précédente. (uniquement pour les API `getDailyConsumption` et `getDailyProduction`) <br>`1` : activer <br> `0` : désactiver
8591
`couleur`|3| `1` : Bleu et Rose <br>`2` : Jaune et Vert <br>`3` : Blanc et Bleu <br>`4` : Orange et Violet
86-
`valuebar`|1|Affiche les valeurs à l'intérieur des barres. <br>`1` : Afficher <br>`0` : Masquer
87-
`valuebartextcolor`|0|Couleur du texte des valeurs. <br>`0` : Texte noir <br>`1` : Texte blanc
88-
`header`|1|Affiche l'en-tête selon la période selectionné. <br>`1` : Afficher <br>`0` : Masquer
89-
`energie`|1|Affiche l'indicateur de consomation d'énergie. <br>`1` : Afficher <br>`0` : Masquer
90-
`updateDate`|1|Affiche la date de récupération des données. <br>`1` : Afficher <br>`0` : Masquer
91-
`updateNext`|1|Affiche la date du prochain cycle de récupération des données. <br>`1` : Afficher <br>`0` : Masquer
92+
`valuebar`|1|Affiche les valeurs à l'intérieur des barres. <br>`1` : afficher <br>`0` : masquer
93+
`valuebartextcolor`|0|Couleur du texte des valeurs. <br>`0` : texte noir <br>`1` : texte blanc
94+
`header`|1|Affiche l'en-tête selon la période selectionné. <br>`1` : afficher <br>`0` : masquer
95+
`energie`|1|Affiche l'indicateur de consomation d'énergie. <br>`1` : afficher <br>`0` : masquer
96+
`updateDate`|1|Affiche la date de récupération des données. <br>`1` : afficher <br>`0` : masquer
97+
`updateNext`|1|Affiche la date du prochain cycle de récupération des données. <br>`1` : afficher <br>`0` : masquer
98+
99+
### APIs
100+
101+
Grâce à `Conso API`, vous pouvez interroger plusieurs API et afficher le graphique correspondant.
102+
103+
* `getDailyConsumption`: Récupère la consommation quotidienne.
104+
* `getLoadCurve`: Récupère la puissance moyenne consommée de la veille sur un intervalle de 30 min.
105+
* `getMaxPower`: Récupère la puissance maximale de consommation atteinte quotidiennement.
106+
107+
Il est également possible d'afficher vos données de production d'energie.
108+
109+
* `getDailyProduction`: Récupère la production quotidienne.
110+
* `getProductionLoadCurve`: Récupère la puissance moyenne produite sur un intervalle de 30 min.
111+
112+
## Mise en cache des données
113+
114+
Afin d'éviter une surcharge de l'API, une mise en cache des données a été mise en place.
115+
116+
De ce fait, lors d'un redémarrage de `MagicMirror²`, `MMM-Linky` utilisera les dernières données reçues de l'API.
117+
118+
La validité de ce cache à été fixée à 10h.
119+
120+
## Effacer le cache des données
121+
122+
Vous pouvez toute fois détruire ce cache avec la commande: `npm run reset:cache`
123+
124+
Il est déconseillé d'utiliser cette commande trop souvent car l'api a un usage limité.
125+
126+
`Conso API` a fixé cette régle:
127+
128+
* Maximum de 5 requêtes par seconde.
129+
* Maximum de 10 000 requêtes par heure.
130+
131+
⚠ Si vous dépassez une des régles, votre adresse IP sera bloquée sans avertissement !
132+
133+
Malheurement, nous n'avons aucun pouvoir pour la débloquer...
134+
135+
Pour rappel un appel API est une requête. si vous utilisez 2 API en config... c'est donc 2 requêtes !
136+
137+
## Changement de configuration
138+
139+
Afin de générer un nouveau cache, une nouvelle requête sera relancé pour les API suivantes (si utilisées)
140+
141+
↪️ En cas de changement de configuration `periode`
142+
143+
* `getDailyConsumption`
144+
* `getMaxPower`
145+
* `getDailyProduction`
146+
147+
↪️ En cas de changement de configuration `annee_n_minus_1`
148+
149+
* `getDailyConsumption`
150+
* `getDailyProduction`
92151

93152
## Mise à jour
94153

data/.keep

Whitespace-only changes.

installer/cache.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const utils = require("./utils");
2+
3+
async function main () {
4+
// Let's start !
5+
utils.empty();
6+
utils.info(`Delete Cache ${utils.moduleName()} v${utils.moduleVersion()}`);
7+
utils.empty();
8+
await deleteCache();
9+
utils.success("Done!");
10+
}
11+
12+
async function deleteCache () {
13+
utils.info("➤ Cleaning json data files...");
14+
if (utils.isWin()) {
15+
await utils.execCMD(`del ${utils.getModuleRoot()}\\data\\*.json`);
16+
} else {
17+
await utils.execCMD(`rm -f ${utils.getModuleRoot()}/data/*.json`);
18+
}
19+
}
20+
21+
main();

installer/functions.js

+35-9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
const path = require("node:path");
12
const utils = require("./utils");
23

34
var packageJSON;
@@ -12,6 +13,8 @@ try {
1213
var options = packageJSON.installer || {};
1314

1415
async function updatePackageInfoLinux () {
16+
const apt = options.apt;
17+
if (!apt.length) return;
1518
utils.empty();
1619
utils.info("➤ Update package informations");
1720
utils.empty();
@@ -34,14 +37,13 @@ async function updatePackageInfoLinux () {
3437
module.exports.updatePackageInfoLinux = updatePackageInfoLinux;
3538

3639
async function installLinuxDeps () {
40+
const apt = options.apt;
41+
if (!apt.length) return;
3742
utils.empty();
3843
utils.info("➤ Dependencies installer");
3944
utils.empty();
40-
const apt = options.apt;
41-
if (!apt.length) {
42-
utils.out("No dependecies needed!");
43-
return;
44-
}
45+
utils.out(`Checking: ${apt}...`);
46+
utils.empty();
4547
return new Promise((resolve) => {
4648
utils.check(apt, (result) => {
4749
if (!result.length) {
@@ -70,6 +72,32 @@ async function installLinuxDeps () {
7072
}
7173
module.exports.installLinuxDeps = installLinuxDeps;
7274

75+
async function postInstall () {
76+
if (!options.postInstall) return;
77+
utils.empty();
78+
utils.info("➤ Post-Install...");
79+
utils.empty();
80+
const Path = path.resolve(`${utils.getModuleRoot()}`, "installer");
81+
const args = utils.getArgs();
82+
const command = args.path ? `${options.postInstall} --path=${args.path}` : `${options.postInstall}`;
83+
return new Promise((resolve) => {
84+
utils.execPathCMD(command, Path, (err) => {
85+
if (err) {
86+
utils.error("Error Detected!");
87+
process.exit(1);
88+
}
89+
resolve();
90+
})
91+
.on("stdout", function (data) {
92+
utils.out(data.trim());
93+
})
94+
.on("stderr", function (data) {
95+
utils.error(data.trim());
96+
});
97+
});
98+
}
99+
module.exports.postInstall = postInstall;
100+
73101
async function installNPMDeps () {
74102
utils.empty();
75103
utils.info("➤ NPM Package installer");
@@ -141,13 +169,10 @@ async function develop () {
141169
module.exports.develop = develop;
142170

143171
async function electronRebuild () {
172+
if (!options.rebuild || (utils.isWin() && !options.windowsRebuild)) return;
144173
utils.empty();
145174
utils.info("➤ Rebuild MagicMirror...");
146175
utils.empty();
147-
if (!options.rebuild || (utils.isWin() && !options.windowsRebuild)) {
148-
utils.out("electron-rebuild is not needed.");
149-
return;
150-
}
151176
return new Promise((resolve) => {
152177
utils.electronRebuild((err) => {
153178
if (err) {
@@ -209,6 +234,7 @@ function setOptions () {
209234
minify: true,
210235
rebuild: false,
211236
apt: [],
237+
postInstall: null,
212238
windowsNPMRemove: [],
213239
windowsRebuild: false
214240
};

installer/setup.js

+5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ async function checkOS () {
2525
}
2626
utils.empty();
2727
await utils.checkRoot();
28+
await functions.updatePackageInfoLinux();
29+
await functions.installLinuxDeps();
2830
await functions.installNPMDeps();
31+
await functions.postInstall();
32+
await functions.electronRebuild();
2933
await functions.installFiles();
3034
functions.done();
3135
break;
@@ -38,6 +42,7 @@ async function checkOS () {
3842
case "Windows":
3943
utils.success(`OS Detected: Windows (${sysinfo.name} ${sysinfo.version} ${sysinfo.arch})`);
4044
await functions.installNPMDeps();
45+
await functions.postInstall();
4146
await functions.installFiles();
4247
functions.done();
4348
break;

installer/utils.js

+24-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var packageJSON = require("../package.json");
99

1010
var moduleRoot = path.resolve(__dirname, "../");
1111
const installerHome = path.resolve(__dirname, "../installer");
12+
const bugsounetRoot = path.resolve(__dirname);
1213

1314
// color codes
1415
const reset = "\x1B[0m";
@@ -353,7 +354,8 @@ module.exports.develop = develop;
353354
// electron need to be rebuilded
354355
function electronRebuild (callback = () => {}) {
355356
var emitter = new events.EventEmitter();
356-
var child = exec("npx electron-rebuild", { cwd: moduleRoot }, function (err) {
357+
const cmd = args.path ? `npx electron-rebuild -m ${moduleRoot}` : "npx electron-rebuild";
358+
var child = exec(cmd, { cwd: bugsounetRoot }, function (err) {
357359
if (err) {
358360
return callback(err);
359361
}
@@ -392,6 +394,27 @@ function execCMD (command, callback = () => {}, bypass) {
392394
}
393395
module.exports.execCMD = execCMD;
394396

397+
function execPathCMD (command, path, callback = () => {}) {
398+
var emitter = new events.EventEmitter();
399+
var child = exec(`${command}`, { cwd: path }, function (err) {
400+
if (err) {
401+
return callback(err);
402+
}
403+
return callback();
404+
});
405+
406+
child.stdout.on("data", function (data) {
407+
emitter.emit("stdout", data);
408+
});
409+
410+
child.stderr.on("data", function (data) {
411+
emitter.emit("stderr", data);
412+
});
413+
414+
return emitter;
415+
}
416+
module.exports.execPathCMD = execPathCMD;
417+
395418
async function moduleReset () {
396419
info("➤ Cleaning js files and reset git branch...");
397420
if (isWin()) {

0 commit comments

Comments
 (0)