Skip to content

Commit

Permalink
Refactor & clean code for production data synchronization
Browse files Browse the repository at this point in the history
  • Loading branch information
bokub committed Nov 15, 2023
1 parent 7f347ce commit cfd0c34
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 183 deletions.
21 changes: 12 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,21 @@ Pour utiliser cet add-on, il vous faut :

## Configuration

Une fois l'add-on installé, rendez-vous dans l'onglet _Configuration_ et remplissez les champs vides :
Une fois l'add-on installé, rendez-vous dans l'onglet _Configuration_ et remplissez les champs vides

### Si vous voulez récupérer votre consommation

- `consumption PRM` : Votre numéro de PRM (14 chiffres) pour la consommation.
- Si vous ne le connaissez pas, entrez votre token sur [la page exemples](https://conso.boris.sh/exemples) de Conso API et le PRM s'affichera dans le champ _PRM_
- Vous pouvez également le trouver sur votre compteur en appuyant sur la touche **+** jusqu’à lire la valeur du _numéro de PRM_.
- `consumption token` : Votre token **Conso API**
- `consumption name` : Choisissez le nom qui sera affiché dans les tableaux de bord d'énergie. Vous pourrez le changer plus tard si vous le souhaitez.
- `consumption action` : Laissez la valeur par défaut: `sync`
- `production PRM` : Votre numéro de PRM (14 chiffres) pour la production.
- Si vous ne le connaissez pas, entrez votre token sur [la page exemples](https://conso.boris.sh/exemples) de Conso API et le PRM s'affichera dans le champ _PRM_
- Vous pouvez également le trouver sur votre compteur en appuyant sur la touche **+** jusqu’à lire la valeur du _numéro de PRM_.
- `production token` : Votre token **Conso API**

### Si vous produisez de l'électricité et voulez récupérer votre production

- `production PRM` : Votre numéro de PRM (14 chiffres) pour la production. Selon les cas, il peut être identique ou différent de celui qui gère la consommation.
- `production token` : Votre token **Conso API** correspondant au PRM de production
- `production name` : Choisissez le nom qui sera affiché dans les tableaux de bord d'énergie. Vous pourrez le changer plus tard si vous le souhaitez.
- `production action` : Laissez la valeur par défaut: `sync`

Expand All @@ -75,7 +78,7 @@ Pour visualiser les données de **HA Linky** dans vos tableaux de bord d'énergi

- Cliquez [ici](https://my.home-assistant.io/redirect/config_energy/), ou ouvrez le menu _Paramètres_ / _Settings_, puis _Tableaux de bord_ / _Dashboards_, puis _Énergie_ / _Energy_
- Dans la section _Réseau électrique_ / _Electricity grid_, cliquez sur _Ajouter une consommation_ / _Add consumption_
- Choisissez la statistique correspondant au `consumption name` et/ou `production name` que vous avez choisi à l'étape de configuration
- Choisissez la statistique correspondant au `consumption name` ou `production name` que vous avez choisi à l'étape de configuration
- Cliquez sur _Enregistrer_ / _Save_

### Bon à savoir
Expand All @@ -86,10 +89,10 @@ Pour visualiser les données de **HA Linky** dans vos tableaux de bord d'énergi

### Remise à zéro

En cas de problème, il est toujours possible d'effacer toutes les données créées par **HA Linky**
En cas de problème, il est toujours possible d'effacer toutes les données de consommation ou de production créées par **HA Linky**

Revenez sur l'onglet _Configuration_ de l'add-on et changez la valeur de `production/consumption action` à `reset`, puis appliquez les modifications et redémarrez l'add-on.
Revenez sur l'onglet _Configuration_ de l'add-on et changez la valeur de `consumption action` (ou `production action`) à `reset`, puis appliquez les modifications et redémarrez l'add-on.

Ouvrez ensuite l'onglet _Journal_ / _Log_ pour vérifier que la remise à zéro s'est bien déroulée.

Au prochain démarrage, si `production/consumption action` est repassé à `sync`, **HA Linky** réimportera à nouveau toutes vos données. Cette manipulation peut surcharger le serveur de **Conso API**, ne l'utilisez donc que si nécessaire pour ne pas risquer un ban !
Au prochain démarrage, si `consumption action` (ou `production action`) est repassé à `sync`, **HA Linky** réimportera à nouveau toutes vos données. Cette manipulation peut surcharger le serveur de **Conso API**, ne l'utilisez donc que si nécessaire pour ne pas risquer un ban !
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ha-linky",
"private": true,
"version": "1.1.0",
"version": "1.2.0",
"type": "module",
"scripts": {
"build": "tsc",
Expand Down
26 changes: 13 additions & 13 deletions src/config.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
import { readFileSync } from 'fs';

export type MeterConfig = {
prm: string;
token: string;
name: string;
action: 'sync' | 'reset';
isProduction: boolean;
};

export type UserConfig = {
consumption?: {
prm: string;
token: string;
name: string;
action: 'sync' | 'reset';
};
production?: {
prm: string;
token: string;
name: string;
action: 'sync' | 'reset';
};
consumption?: MeterConfig;
production?: MeterConfig;
};

export function getUserConfig(): UserConfig {
Expand All @@ -36,15 +34,17 @@ export function getUserConfig(): UserConfig {
token: parsed['consumption token'],
name: parsed['consumption name'] || 'Linky consumption',
action: parsed['consumption action'] === 'reset' ? 'reset' : 'sync',
isProduction: false,
}
: undefined,
production:
parsed['production PRM'] && parsed['production token']
? {
prm: parsed['production PRM'],
token: parsed['production token'],
name: parsed['production name'] || 'Linky consumption',
name: parsed['production name'] || 'Linky production',
action: parsed['production action'] === 'reset' ? 'reset' : 'sync',
isProduction: true,
}
: undefined,
};
Expand Down
33 changes: 22 additions & 11 deletions src/ha.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { debug, warn } from './log.js';
import dayjs from 'dayjs';

const WS_URL = 'ws://supervisor/core/websocket';
const SOURCE = 'linky';

export type SuccessMessage = {
id: string;
Expand All @@ -23,6 +22,10 @@ export type ErrorMessage = {

export type ResultMessage = SuccessMessage | ErrorMessage;

function getStatisticId(prm: string, isProduction: boolean) {
return `${isProduction ? 'linky_prod' : 'linky'}:${prm}`;
}

export class HomeAssistantClient {
private messageId = Number(Date.now().toString().slice(9));
private connection: ws.connection;
Expand Down Expand Up @@ -88,46 +91,54 @@ export class HomeAssistantClient {
});
}

public async saveStatistics(prm: string, name: string, stats: { start: string; state: number; sum: number }[]) {
const statisticId = `${SOURCE}:${prm}`;
public async saveStatistics(
prm: string,
name: string,
isProduction: boolean,
stats: { start: string; state: number; sum: number }[],
) {
const statisticId = getStatisticId(prm, isProduction);

await this.sendMessage({
type: 'recorder/import_statistics',
metadata: {
has_mean: false,
has_sum: true,
name,
source: SOURCE,
source: statisticId.split(':')[0],
statistic_id: statisticId,
unit_of_measurement: 'Wh',
},
stats,
});
}

public async isNewPRM(prm: string) {
const statisticId = `${SOURCE}:${prm}`;
public async isNewPRM(prm: string, isProduction: boolean) {
const statisticId = getStatisticId(prm, isProduction);
const ids = await this.sendMessage({
type: 'recorder/list_statistic_ids',
statistic_type: 'sum',
});
return !ids.result.find((statistic: any) => statistic.statistic_id === statisticId);
}

public async findLastStatistic(prm: string): Promise<null | {
public async findLastStatistic(
prm: string,
isProduction: boolean,
): Promise<null | {
start: number;
end: number;
state: number;
sum: number;
change: number;
}> {
const isNew = await this.isNewPRM(prm);
const isNew = await this.isNewPRM(prm, isProduction);
if (isNew) {
warn(`PRM ${prm} not found in Home Assistant statistics`);
return null;
}

const statisticId = `${SOURCE}:${prm}`;
const statisticId = getStatisticId(prm, isProduction);

// Loop over the last 52 weeks
for (let i = 0; i < 52; i++) {
Expand All @@ -154,8 +165,8 @@ export class HomeAssistantClient {
return null;
}

public async purge(prm: string) {
const statisticId = `${SOURCE}:${prm}`;
public async purge(prm: string, isProduction: boolean) {
const statisticId = getStatisticId(prm, isProduction);

warn(`Removing all statistics for PRM ${prm}`);
await this.sendMessage({
Expand Down
Loading

0 comments on commit cfd0c34

Please sign in to comment.