Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V1.2.0 #32

Merged
merged 75 commits into from
Mar 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
5a680c3
begin v1.2.0
bugsounet Feb 28, 2025
aed9aea
review node_helper structure
bugsounet Feb 28, 2025
f8a8d6b
move scheduleDataFetch to Timers section
bugsounet Feb 28, 2025
ee4f0e0
move to timers
bugsounet Feb 28, 2025
5bde4ad
move datafile to data folder
bugsounet Feb 28, 2025
7e50947
move api
bugsounet Feb 28, 2025
df9f89a
add api component
bugsounet Feb 28, 2025
b968f5c
update ignore files
bugsounet Feb 28, 2025
085206c
fix api
bugsounet Feb 28, 2025
1838f9f
add timers classe
bugsounet Feb 28, 2025
bc9fe64
update bugsounet's installer
bugsounet Feb 28, 2025
76bb939
delete some logs
bugsounet Feb 28, 2025
f2ae69c
fix missing things
bugsounet Feb 28, 2025
695dd5f
add files classe
bugsounet Feb 28, 2025
9c24b74
crete chart component
bugsounet Mar 1, 2025
4baf331
fix CHART
bugsounet Mar 1, 2025
dc22d22
add parser
bugsounet Mar 1, 2025
6bab8d9
fix chart calculateDates
bugsounet Mar 1, 2025
33acbe3
add rejection
bugsounet Mar 1, 2025
2946303
Merge branch 'dev' into v1.2
bugsounet Mar 1, 2025
abf69f4
move to fetcher
bugsounet Mar 1, 2025
6ce702a
fix getConsumptionData callback
bugsounet Mar 1, 2025
bbec48d
add LeapYear
bugsounet Mar 2, 2025
e34e4b8
review (again) parser
bugsounet Mar 2, 2025
a75251f
update windows installer
bugsounet Mar 2, 2025
cfc99a7
add getLoadCurve API
bugsounet Mar 3, 2025
df3e03b
some fix
bugsounet Mar 3, 2025
2fd40b7
Bump @stylistic/eslint-plugin from 4.1.0 to 4.2.0
dependabot[bot] Mar 3, 2025
bfaa705
Bump eslint-plugin-package-json from 0.26.0 to 0.26.1
dependabot[bot] Mar 3, 2025
6fe6693
Bump stylelint from 16.14.1 to 16.15.0
dependabot[bot] Mar 3, 2025
c43cf91
Merge pull request #25 from 2hdlockness/dependabot/npm_and_yarn/dev/s…
2hdlockness Mar 3, 2025
6dbedf3
Merge pull request #26 from 2hdlockness/dependabot/npm_and_yarn/dev/e…
2hdlockness Mar 3, 2025
f644bef
Merge pull request #27 from 2hdlockness/dependabot/npm_and_yarn/dev/s…
2hdlockness Mar 3, 2025
841472a
Bump stylelint from 16.14.1 to 16.15.0
dependabot[bot] Mar 3, 2025
877a6ff
Bump stylelint from 16.14.1 to 16.15.0
bugsounet Mar 3, 2025
d40d473
Bump eslint-plugin-package-json from 0.26.0 to 0.26.1
dependabot[bot] Mar 3, 2025
b2f27f4
Bump eslint-plugin-package-json from 0.26.0 to 0.26.1
bugsounet Mar 3, 2025
5603b76
Bump @stylistic/eslint-plugin from 4.1.0 to 4.2.0
dependabot[bot] Mar 3, 2025
baa78a8
Bump @stylistic/eslint-plugin from 4.1.0 to 4.2.0
bugsounet Mar 3, 2025
e4cd1a7
Merge branch '2hdlockness:dev' into dev
bugsounet Mar 3, 2025
2a81716
sync
bugsounet Mar 3, 2025
a04cd0d
Merge branch 'dev' of https://github.com/bugsounet/MMM-Linky-develop …
bugsounet Mar 3, 2025
3ed9cb6
Merge branch 'dev' into v1.2
bugsounet Mar 3, 2025
80b1c71
beta for testing...
bugsounet Mar 4, 2025
27dcbcd
fix createChart legend
bugsounet Mar 4, 2025
2104bb2
simply legend
bugsounet Mar 4, 2025
c9fb3fa
Update Readme
bugsounet Mar 5, 2025
162b104
update Readme
bugsounet Mar 5, 2025
d19e0ea
add run run reset:cache
bugsounet Mar 5, 2025
c3b7e17
Update rev
bugsounet Mar 5, 2025
f35cf5a
last fix
bugsounet Mar 5, 2025
974f102
Fix: Readme
bugsounet Mar 5, 2025
7b1aa57
Bump eslint-plugin-package-json from 0.26.1 to 0.26.2
bugsounet Mar 5, 2025
9549596
Bump deps
bugsounet Mar 8, 2025
0e30d5a
use API cache
bugsounet Mar 9, 2025
4f66116
cleaning
bugsounet Mar 9, 2025
ca3cf9d
API cache
bugsounet Mar 9, 2025
cce7602
Update README.md
bugsounet Mar 9, 2025
c6b550d
update revision date (rev)
bugsounet Mar 9, 2025
aa3ea3a
animation change
bugsounet Mar 9, 2025
ef54ab8
Merge pull request #28 from bugsounet/v1.2
2hdlockness Mar 9, 2025
a2df10e
Update README.md
2hdlockness Mar 9, 2025
8c5456f
Fix: day format
bugsounet Mar 9, 2025
96713ec
Update README.md
2hdlockness Mar 9, 2025
897f681
Merge pull request #29 from bugsounet/patch_Day
2hdlockness Mar 9, 2025
45f3475
other patch day
bugsounet Mar 9, 2025
09c0aae
fix readme
bugsounet Mar 9, 2025
6506e0a
Merge branch 'dev' into patch_Day
bugsounet Mar 9, 2025
ad37ffa
add borderWidth:3 to *Curve
bugsounet Mar 9, 2025
7086c9d
Merge branch 'patch_Day' of https://github.com/bugsounet/MMM-Linky-de…
bugsounet Mar 9, 2025
c1a8371
fix: chart line
bugsounet Mar 9, 2025
4ece523
Merge pull request #30 from bugsounet/patch_Day
2hdlockness Mar 9, 2025
05ee078
cleaning
bugsounet Mar 9, 2025
3cc9561
Merge pull request #31 from bugsounet/patch_Day
2hdlockness Mar 9, 2025
03a3dc0
Update README.md
2hdlockness Mar 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ const config = [
}
},
{
"ignores": ["*.js"]
"ignores": ["*.js", "components/*.js"]
}
];

Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/node_modules/
/MMM-Linky.js
/node_helper.js
/linkyData.json
/components/
/data/*.json
91 changes: 75 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,19 @@ Si vous choisissez de récupérer les données de l'année précédente une comp

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

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

## ScreenShots

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

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

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

## Installation

Expand All @@ -30,7 +31,7 @@ cd MMM-Linky
npm run setup
```

## Using the module
## Utilisation du module

### Pré-requis

Expand All @@ -48,6 +49,8 @@ Pour utiliser ce module, ajoutez-le au tableau modules dans le fichier `config/c
prm: "",
token: "",
periode: 1,
apis: ["getDailyConsumption"],
affichageInterval: 1000 * 15,
annee_n_minus_1: 1,
couleur: 3,
valuebar: 1,
Expand All @@ -69,6 +72,7 @@ Configuration minimale :
config: {
prm: "",
token: "",
apis: ["getDailyConsumption"]
},
},
```
Expand All @@ -77,18 +81,73 @@ Configuration minimale :

Option|Default|Description
---|---|---
`debug`|0|Active le mode débogage. <br>`1` : activer <br> `0` : Désactiver
`debug`|0|Active le mode débogage. <br>`1` : activer <br> `0` : désactiver
`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)
`token`||Votre token personnel [CONSO API](https://conso.boris.sh/)
`token`||Votre token personnel [CONSO API](https://conso.boris.sh/)
`periode`|1|Choix de la période: <br>`1` = Données de la veille <br>`2` = 3 derniers jours <br>`3` = 7 derniers jours
`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
`apis`|["getDailyConsumption"]|Nom des API à interroger (voir ci-dessous)
`affichageInterval`|1000 * 15|Intervalle d'affichage des graphiques en ms (si utilisation de plusieurs API)
`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
`couleur`|3| `1` : Bleu et Rose <br>`2` : Jaune et Vert <br>`3` : Blanc et Bleu <br>`4` : Orange et Violet
`valuebar`|1|Affiche les valeurs à l'intérieur des barres. <br>`1` : Afficher <br>`0` : Masquer
`valuebartextcolor`|0|Couleur du texte des valeurs. <br>`0` : Texte noir <br>`1` : Texte blanc
`header`|1|Affiche l'en-tête selon la période selectionné. <br>`1` : Afficher <br>`0` : Masquer
`energie`|1|Affiche l'indicateur de consomation d'énergie. <br>`1` : Afficher <br>`0` : Masquer
`updateDate`|1|Affiche la date de récupération des données. <br>`1` : Afficher <br>`0` : Masquer
`updateNext`|1|Affiche la date du prochain cycle de récupération des données. <br>`1` : Afficher <br>`0` : Masquer
`valuebar`|1|Affiche les valeurs à l'intérieur des barres. <br>`1` : afficher <br>`0` : masquer
`valuebartextcolor`|0|Couleur du texte des valeurs. <br>`0` : texte noir <br>`1` : texte blanc
`header`|1|Affiche l'en-tête selon la période selectionné. <br>`1` : afficher <br>`0` : masquer
`energie`|1|Affiche l'indicateur de consomation d'énergie. <br>`1` : afficher <br>`0` : masquer
`updateDate`|1|Affiche la date de récupération des données. <br>`1` : afficher <br>`0` : masquer
`updateNext`|1|Affiche la date du prochain cycle de récupération des données. <br>`1` : afficher <br>`0` : masquer

### APIs

Grâce à `Conso API`, vous pouvez interroger plusieurs API et afficher le graphique correspondant.

* `getDailyConsumption`: Récupère la consommation quotidienne.
* `getLoadCurve`: Récupère la puissance moyenne consommée de la veille sur un intervalle de 30 min.
* `getMaxPower`: Récupère la puissance maximale de consommation atteinte quotidiennement.

Il est également possible d'afficher vos données de production d'energie.

* `getDailyProduction`: Récupère la production quotidienne.
* `getProductionLoadCurve`: Récupère la puissance moyenne produite sur un intervalle de 30 min.

## Mise en cache des données

Afin d'éviter une surcharge de l'API, une mise en cache des données a été mise en place.

De ce fait, lors d'un redémarrage de `MagicMirror²`, `MMM-Linky` utilisera les dernières données reçues de l'API.

La validité de ce cache à été fixée à 10h.

## Effacer le cache des données

Vous pouvez toute fois détruire ce cache avec la commande: `npm run reset:cache`

Il est déconseillé d'utiliser cette commande trop souvent car l'api a un usage limité.

`Conso API` a fixé cette régle:

* Maximum de 5 requêtes par seconde.
* Maximum de 10 000 requêtes par heure.

⚠ Si vous dépassez une des régles, votre adresse IP sera bloquée sans avertissement !

Malheurement, nous n'avons aucun pouvoir pour la débloquer...

Pour rappel un appel API est une requête. si vous utilisez 2 API en config... c'est donc 2 requêtes !

## Changement de configuration

Afin de générer un nouveau cache, une nouvelle requête sera relancé pour les API suivantes (si utilisées)

↪️ En cas de changement de configuration `periode`

* `getDailyConsumption`
* `getMaxPower`
* `getDailyProduction`

↪️ En cas de changement de configuration `annee_n_minus_1`

* `getDailyConsumption`
* `getDailyProduction`

## Mise à jour

Expand Down
Empty file added data/.keep
Empty file.
21 changes: 21 additions & 0 deletions installer/cache.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const utils = require("./utils");

async function main () {
// Let's start !
utils.empty();
utils.info(`Delete Cache ${utils.moduleName()} v${utils.moduleVersion()}`);
utils.empty();
await deleteCache();
utils.success("Done!");
}

async function deleteCache () {
utils.info("➤ Cleaning json data files...");
if (utils.isWin()) {
await utils.execCMD(`del ${utils.getModuleRoot()}\\data\\*.json`);
} else {
await utils.execCMD(`rm -f ${utils.getModuleRoot()}/data/*.json`);
}
}

main();
44 changes: 35 additions & 9 deletions installer/functions.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
const path = require("node:path");
const utils = require("./utils");

var packageJSON;
Expand All @@ -12,6 +13,8 @@ try {
var options = packageJSON.installer || {};

async function updatePackageInfoLinux () {
const apt = options.apt;
if (!apt.length) return;
utils.empty();
utils.info("➤ Update package informations");
utils.empty();
Expand All @@ -34,14 +37,13 @@ async function updatePackageInfoLinux () {
module.exports.updatePackageInfoLinux = updatePackageInfoLinux;

async function installLinuxDeps () {
const apt = options.apt;
if (!apt.length) return;
utils.empty();
utils.info("➤ Dependencies installer");
utils.empty();
const apt = options.apt;
if (!apt.length) {
utils.out("No dependecies needed!");
return;
}
utils.out(`Checking: ${apt}...`);
utils.empty();
return new Promise((resolve) => {
utils.check(apt, (result) => {
if (!result.length) {
Expand Down Expand Up @@ -70,6 +72,32 @@ async function installLinuxDeps () {
}
module.exports.installLinuxDeps = installLinuxDeps;

async function postInstall () {
if (!options.postInstall) return;
utils.empty();
utils.info("➤ Post-Install...");
utils.empty();
const Path = path.resolve(`${utils.getModuleRoot()}`, "installer");
const args = utils.getArgs();
const command = args.path ? `${options.postInstall} --path=${args.path}` : `${options.postInstall}`;
return new Promise((resolve) => {
utils.execPathCMD(command, Path, (err) => {
if (err) {
utils.error("Error Detected!");
process.exit(1);
}
resolve();
})
.on("stdout", function (data) {
utils.out(data.trim());
})
.on("stderr", function (data) {
utils.error(data.trim());
});
});
}
module.exports.postInstall = postInstall;

async function installNPMDeps () {
utils.empty();
utils.info("➤ NPM Package installer");
Expand Down Expand Up @@ -141,13 +169,10 @@ async function develop () {
module.exports.develop = develop;

async function electronRebuild () {
if (!options.rebuild || (utils.isWin() && !options.windowsRebuild)) return;
utils.empty();
utils.info("➤ Rebuild MagicMirror...");
utils.empty();
if (!options.rebuild || (utils.isWin() && !options.windowsRebuild)) {
utils.out("electron-rebuild is not needed.");
return;
}
return new Promise((resolve) => {
utils.electronRebuild((err) => {
if (err) {
Expand Down Expand Up @@ -209,6 +234,7 @@ function setOptions () {
minify: true,
rebuild: false,
apt: [],
postInstall: null,
windowsNPMRemove: [],
windowsRebuild: false
};
Expand Down
5 changes: 5 additions & 0 deletions installer/setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ async function checkOS () {
}
utils.empty();
await utils.checkRoot();
await functions.updatePackageInfoLinux();
await functions.installLinuxDeps();
await functions.installNPMDeps();
await functions.postInstall();
await functions.electronRebuild();
await functions.installFiles();
functions.done();
break;
Expand All @@ -38,6 +42,7 @@ async function checkOS () {
case "Windows":
utils.success(`OS Detected: Windows (${sysinfo.name} ${sysinfo.version} ${sysinfo.arch})`);
await functions.installNPMDeps();
await functions.postInstall();
await functions.installFiles();
functions.done();
break;
Expand Down
25 changes: 24 additions & 1 deletion installer/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ var packageJSON = require("../package.json");

var moduleRoot = path.resolve(__dirname, "../");
const installerHome = path.resolve(__dirname, "../installer");
const bugsounetRoot = path.resolve(__dirname);

// color codes
const reset = "\x1B[0m";
Expand Down Expand Up @@ -353,7 +354,8 @@ module.exports.develop = develop;
// electron need to be rebuilded
function electronRebuild (callback = () => {}) {
var emitter = new events.EventEmitter();
var child = exec("npx electron-rebuild", { cwd: moduleRoot }, function (err) {
const cmd = args.path ? `npx electron-rebuild -m ${moduleRoot}` : "npx electron-rebuild";
var child = exec(cmd, { cwd: bugsounetRoot }, function (err) {
if (err) {
return callback(err);
}
Expand Down Expand Up @@ -392,6 +394,27 @@ function execCMD (command, callback = () => {}, bypass) {
}
module.exports.execCMD = execCMD;

function execPathCMD (command, path, callback = () => {}) {
var emitter = new events.EventEmitter();
var child = exec(`${command}`, { cwd: path }, function (err) {
if (err) {
return callback(err);
}
return callback();
});

child.stdout.on("data", function (data) {
emitter.emit("stdout", data);
});

child.stderr.on("data", function (data) {
emitter.emit("stderr", data);
});

return emitter;
}
module.exports.execPathCMD = execPathCMD;

async function moduleReset () {
info("➤ Cleaning js files and reset git branch...");
if (isWin()) {
Expand Down
Loading