API Metric Export
L'API Metric Export fournit n'importe quel indicateur de vos centrales sous forme de série temporelle, en CSV ou en JSON, avec une seule requête GET. Elle lit la même collection d'indicateurs que les rapports, y compris les indicateurs que votre organisation a définis elle-même.
Chaque lien affiché par la page Export de données est un appel de cette API : le moyen le plus simple d'obtenir une requête qui fonctionne est donc de la construire là et de la copier.
Ouvrir dans Mirox
Export de données ▸ Métriques pour une sélection libre, Export de données ▸ Constructeur API pour un modèle. Les deux affichent le lien de ce que vous avez sélectionné.
Les liens d'export de l'export précédent continuent de fonctionner sans changement. Ils sont décrits dans l'API de l'ancien export ; le passage de l'un à l'autre est expliqué dans le guide de migration.
Routes
Tous les chemins suivent https://service.mirox.io/api.
| Route | Réponse | Rôle |
|---|---|---|
GET /v1/export/series | CSV, ou JSON avec format=json | Exporter des indicateurs sous forme de série temporelle |
GET /v1/export/series/estimate | JSON | Taille et durée d'un export, sans lire de données |
GET /v1/export/series/catalog | JSON, ou un glossaire CSV avec format=csv | Les indicateurs que vous pouvez exporter |
GET /v1/export/series/lanes | JSON | Les composants d'une centrale |
GET /v1/export/series/template/{template_uid} | CSV, ou JSON avec format=json | Exporter un modèle |
POST /v1/export/template/{template_uid}/convert | JSON | Convertir un ancien modèle |
Authentification
Envoyez un jeton d'API du groupe Metric Export dans l'en-tête Authorization :
Authorization: Bearer YOUR_API_TOKEN
Le jeton lit chaque route d'export de cette page ainsi que les anciennes routes. Il ne peut rien créer, modifier ni supprimer. Dans un navigateur où vous êtes connecté à Mirox, les liens fonctionnent sans jeton.
Vous ne recevez que les données des centrales dont vous pouvez lire les mesures. Les indicateurs de votre organisation sont exportés par chaque rôle d'organisation sauf Externe. Voir Qui peut exporter quoi.
Les indicateurs sont sélectionnés par identifiant ; une requête est limitée à la centrale
Un export nomme les indicateurs par leur identifiant. Mirox résout chaque identifiant en sa propre requête, limitée à la centrale. Les indicateurs de votre organisation sont des entrées validées de la collection, limitées à la centrale de la même façon. Le seul texte de requête qu'un appelant peut envoyer est une expression MetricsQL dans expr : elle ne s'exécute que sur les centrales de la requête, avec la centrale ajoutée à chaque sélecteur, et elle est refusée lorsqu'elle nomme elle-même une centrale, un parc ou une organisation.
Exporter une série temporelle
GET /v1/export/series
Injection réseau d'une centrale sur le mois précédent, par jour :
curl --compressed "https://service.mirox.io/api/v1/export/series?park=ABC123DEF456&metrics=plant.grid_feedin&window=previous_month&step=day" \
-H "Authorization: Bearer YOUR_API_TOKEN" -o feedin.csv
Date;Grid feed-in (kWh)
2026-08-01;5321,4
2026-08-02;4980,2
...
Paramètres
| Paramètre | Valeurs | Par défaut | Signification |
|---|---|---|---|
metrics | 1 à 20 identifiants d'indicateur, séparés par des virgules | obligatoire sauf si expr est donné | Les colonnes, dans cet ordre. Voir Indicateurs et valeurs. |
expr | une expression MetricsQL, répétable jusqu'à 5 fois | — | Des requêtes brutes de la base de séries temporelles, un jeu de colonnes chacune, après les indicateurs. Voir Requêtes MetricsQL brutes. |
park | UID de centrales, séparés par des virgules | — | Les centrales. park ou portfolio est obligatoire. |
portfolio | UID de portefeuilles, séparés par des virgules | — | Toutes les centrales de ces portefeuilles, en plus de park. Au plus 50 centrales au total. |
start, end | date ou date avec heure | — | Une période libre. Voir Période. |
year, quarter, month, week, day | nombres | — | Une période calendaire. |
window | période prédéfinie | previous_month | Une période nommée. |
step | auto, 1min, 5min, 15min, 1h, day, week, month, quarter, year | auto | La durée d'une ligne. Voir Pas. |
mismatch | refuse, sparse | refuse | Ce qu'il advient d'un indicateur qui ne propose pas le pas : refuser la requête, ou l'exporter à son propre pas. Voir Indicateurs à pas différents. |
values | auto, delta, cumulative, native | auto | Le mode de valeurs de tous les indicateurs. |
tz | local, utc | local | Le calendrier des lignes. Voir Grille temporelle. |
multi_park_agg | merge, split | merge | Plusieurs centrales regroupées, ou une colonne par centrale. Voir Plusieurs centrales. |
components | jusqu'à 100 références de composant, séparées par des virgules | tous | Restreint les indicateurs par composant à ces composants. Voir Composants. |
lane_limit | 1 à 100 | 50 | Composants par indicateur et par page. |
lane_page | 1 et plus | 1 | La page de composants. |
format | csv, json | csv | Le format de la réponse. |
language | en, de, es, fr, it, pt | en | La langue des noms de colonne. |
separator_csv | , ; tabulation | | ; | Le séparateur de colonnes. |
separator_decimal | . , | , | Le séparateur décimal. Il doit différer de separator_csv. |
datetime_format | motif strftime, jusqu'à 64 caractères | selon le pas | Le format de la colonne de temps. |
header | name, id | name | En-têtes de colonne sous forme de noms ou d'identifiants. Voir Réponse CSV. |
empty | blank, zero | blank | Une valeur manquante sous forme de cellule vide ou de 0. |
offset_column | true, false | true | La colonne Décalage UTC. Elle n'apparaît qu'aux pas inférieurs à un jour, en heure locale de la centrale. |
precision | display, full | display | Valeurs arrondies aux décimales de l'indicateur, ou non arrondies. |
lane_limit et lane_page hors de leurs bornes sont ramenés à la borne la plus proche. Un paramètre que la route ne connaît pas est ignoré.
Indicateurs et valeurs
Un identifiant d'indicateur a la forme <préfixe>.<nom>, par exemple plant.grid_feedin, inverter.ac_power ou sensor.irradiance. Un indicateur de votre organisation s'écrit organization.<id de l'indicateur>. Le catalogue les liste tous.
Chaque indicateur a une grandeur, qui décide des modes de valeurs qu'il propose :
values | Une ligne affiche | S'applique à |
|---|---|---|
delta | la quantité dans l'intervalle | l'énergie uniquement |
cumulative | le cumul depuis le début de la période | l'énergie et les autres grandeurs comptées |
native | la valeur telle que l'indicateur la fournit | chaque indicateur |
auto | delta pour l'énergie, native pour tout le reste |
Un suffixe fixe le mode d'un seul indicateur et l'emporte sur values :
metrics=plant.grid_feedin:cumulative,plant.grid_power
Un mode qui ne s'applique pas à un indicateur n'est jamais une erreur. L'indicateur est exporté en native, et la remarque value_mode_ignored le signale. delta n'est jamais appliqué à une puissance.
Le même indicateur dans deux modes donne deux colonnes. Le même indicateur deux fois dans le même mode en donne une.
Énergie par intervalle en dessous de 15 minutes
Un compteur compte l'énergie par paliers entiers. À 1min ou 5min, une énergie en mode delta saute donc entre zéro et un palier. L'export la fournit et ajoute la remarque energy_delta_fine_step, qui nomme l'indicateur de puissance correspondant lorsque la collection en a un. Pour une courbe, utilisez l'indicateur de puissance ; pour l'énergie, utilisez 15min ou plus.
Période
Indiquez la période de l'une des trois façons suivantes. Deux façons dans une même requête répondent 400 window_conflict.
| Façon | Paramètres | Exemple |
|---|---|---|
| Période libre | start, end | start=2026-07-01&end=2026-07-31 |
| Calendrier | year avec quarter, month, week ou day | year=2026&quarter=2 |
| Période prédéfinie | window | window=previous_week |
Période libre. start et end sont une date (2026-07-01) ou une date avec heure (2026-07-01T06:00, 2026-07-01T06:00:00Z, 2026-07-01T06:00:00+02:00). Une valeur sans fuseau horaire est lue dans le fuseau horaire des lignes. Un end qui est une date inclut ce jour ; un end avec heure est l'instant où la période se termine. Sans end, la période se termine maintenant. end seul, sans start, est refusé.
Calendrier. year de 2020 à 2100, quarter de 1 à 4, month de 1 à 12, week de 1 à 53 (semaine ISO), day de 1 à 31. day exige month. Sans year, il s'agit de l'année en cours. day l'emporte sur week, week sur month, month sur quarter.
Périodes prédéfinies. today, yesterday, last_7_days, last_30_days, this_week, previous_week, this_month, previous_month, this_quarter, previous_quarter, this_year, previous_year. Les périodes this_ courent jusqu'à maintenant ; last_7_days et last_30_days glissent jusqu'à maintenant pour les pas inférieurs à un jour (même heure 7 ou 30 jours plus tôt) ; à partir de day, ce sont les 7 ou 30 derniers jours locaux, aujourd'hui compris. À partir de day, chaque fenêtre est élargie à des jours entiers (semaines, mois …) dans le fuseau de la centrale, et la réponse renvoie la fenêtre effective.
Une période commence au plus tôt en 2020 et couvre au plus 1827 jours (cinq ans). Une période qui s'étend dans le futur se termine maintenant, avec la remarque end_clamped.
Pas
step=auto choisit un pas que chaque indicateur demandé propose et qui respecte les limites : 15min jusqu'à deux jours, 1h jusqu'à 62 jours, day jusqu'à trois ans, month au-delà. Si ce pas ne convient pas, le pas immédiatement plus grossier est essayé, puis les pas plus fins. La remarque step_auto et l'en-tête X-Mirox-Step nomment le pas choisi.
Chaque indicateur propose ses propres pas. Le catalogue les liste sous export_steps :
| Type d'indicateur | Pas |
|---|---|
| Énergie d'un compteur qui compte chaque minute | 1min à year |
| Énergie comptée moins souvent — éoliennes, écrêtement décompté | 15min à year |
| Puissance (W, var, VA, W/m²), tension, courant, fréquence | 1min, 5min, 15min |
| Température, état de charge et autres niveaux mesurés | de l'intervalle de mesure à year |
| États de fonctionnement et codes d'état | 15min |
| Ratio de performance | day, week, month, quarter, year |
| Disponibilité | 15min, 1h, day, week, month, quarter, year |
| Indicateurs de votre organisation | de leur résolution la plus fine à year, jamais plus fin que 15min |
La puissance n'est proposée qu'à 15 minutes ou plus fin. Une puissance journalière ou mensuelle est une moyenne qui masque ce qui s'est passé ; l'indicateur d'énergie donne la valeur recherchée.
Un pas n'est jamais modifié en silence. Avec mismatch=refuse, la valeur par défaut, un pas que l'un des indicateurs ne propose pas répond 400 step_not_served avec les pas de chaque indicateur, et avec step=auto, des indicateurs qui n'ont aucun pas en commun répondent 400 no_common_step. Avec mismatch=sparse, une telle requête est fournie malgré tout — voir Indicateurs à pas différents.
Les pas d'un jour ou plus couvrent des intervalles entiers. Une période qui commence ou se termine à l'intérieur de l'un d'eux est élargie vers l'extérieur, avec la remarque window_aligned. Les semaines commencent le lundi.
Indicateurs à pas différents
mismatch=sparse fournit une requête dont les indicateurs ne proposent pas tous le pas, pourvu que chacun propose un pas quelconque. La grille du fichier est le pas demandé ; avec step=auto, c'est le pas que le plus grand nombre d'indicateurs proposent tel quel, choisi selon la période et les limites comme d'habitude. Les positions des colonnes et la forme de la réponse CSV et JSON ne changent pas.
| L'indicateur propose | Ce que fait l'export | Remarque |
|---|---|---|
| uniquement des pas plus fins | Le lit au plus grossier d'entre eux et le regroupe à la grille selon la règle de sa grandeur : une énergie s'additionne, une mesure se moyenne, un ratio se recalcule à partir de ses deux moitiés, un état garde son dernier code. | step_folded avec le step lu |
| uniquement des pas plus grossiers | Le lit au plus fin d'entre eux et écrit chaque valeur sur la ligne où commence son propre intervalle — la valeur d'un jour sur la ligne de son minuit local, celle d'un mois sur la ligne de son premier jour. Les lignes intermédiaires restent vides. | step_sparse avec ce step |
| un pas plus grossier, mais aucun de ses intervalles ne commence sur une ligne | La colonne est vide, par exemple une valeur journalière dans un fichier qui commence à 06:00. | metric_unavailable avec reason off_grid |
Deux cas sont refusés dans les deux modes, avec 400 step_not_served : une valeur par mois, trimestre ou année dans un fichier par week, car son premier jour n'est presque jamais un lundi ; et une valeur mensuelle comme le Marktwert dans un fichier par quarter ou year, car une somme ou une moyenne de mois n'est pas cette valeur. Dans un fichier par month, elle est lue telle quelle ; dans un fichier plus fin, elle est clairsemée.
L'estimation liste les mêmes remarques, compte les lectures au pas propre de chaque indicateur et marque un pas dans per_step comme dans les limites même si tous les indicateurs ne le proposent pas. La page Export de données demande toujours avec mismatch=sparse ; un modèle porte son propre mismatch dans sa spec.
Grille temporelle
Avec tz=local, les lignes suivent l'heure locale de la centrale, heure d'été comprise : un jour est un jour local de 23, 24 ou 25 heures, un mois est un mois local. Avec tz=utc, les lignes suivent le calendrier UTC.
- Aux pas inférieurs à un jour en heure locale, la colonne Décalage UTC (
UTC offsetaveclanguage=en) suit la colonne de temps (+02:00). Le jour du passage à l'heure d'hiver, une heure apparaît deux fois ; le décalage permet de les distinguer.offset_column=falsesupprime la colonne. - Des centrales situées dans des fuseaux horaires différents partagent une seule colonne de temps. Une telle requête est servie sur le calendrier UTC, avec la remarque
merged_on_utc, que les centrales soient regroupées ou séparées. - Avec
tz=utcet un pas d'un jour ou plus, un indicateur qui n'existe que par jour local n'a pas de valeur UTC. Sa colonne reste vide, avec la remarqueutc_calendar_unsupported.
L'en-tête X-Mirox-Grid nomme le calendrier utilisé : local:Europe/Berlin ou utc.
Plusieurs centrales
Avec multi_park_agg=merge, chaque indicateur est une colonne pour toutes les centrales, regroupée selon la règle de l'indicateur. Le catalogue liste la règle sous merge :
merge | Valeur regroupée | Indicateurs |
|---|---|---|
sum | additionnée sur les centrales | énergie, grandeurs comptées, puissance |
mean | moyennée sur les centrales | irradiance, température, état de charge et autres niveaux |
pair_ratio | recalculée à partir des totaux des centrales | ratio de performance, disponibilité et autres ratios |
first | la valeur commune | prix, lorsque toutes les centrales se trouvent dans une même zone de marché |
split_only | ne peut pas être regroupée | états et codes d'état |
Un indicateur qui ne peut pas être regroupé est exporté par centrale, avec la remarque merge_not_meaningful. Cela vaut aussi pour un ratio à un pas auquel ses deux moitiés ne sont pas disponibles, et pour les prix de centrales situées dans des zones de marché différentes.
Avec multi_park_agg=split, chaque indicateur est une colonne par centrale. Avec une seule centrale, les deux donnent le même fichier.
Les indicateurs par composant sont toujours par centrale (remarque components_split_by_park).
Composants
Un indicateur d'un niveau de composant donne une colonne par composant. Les niveaux sont inverter, gak (boîte de jonction), string, turbine, sensor, meter, battery_box (conteneur), battery_storage (rack), battery_module, battery_cell et battery_pcs (convertisseur).
Sans components, l'export contient tous les composants visibles des centrales, lane_limit par indicateur et par page. S'il y en a davantage, la remarque lanes_truncated en indique le total ; demandez la page suivante avec lane_page.
components restreint l'export aux composants que vous nommez. Une référence a la forme <niveau>:<id>, par exemple inverter:1043. Un capteur ou un compteur que Mirox mesure mais qui n'a pas d'entrée dans les composants de la centrale a une référence de la forme sensor:h3f9c2a71b04e6d5. La route des composants liste les références d'une centrale. Une référence qui n'appartient à aucune des centrales choisies répond 400 unknown_lane.
metrics=inverter.ac_power&components=inverter:1043,inverter:1044
Requêtes MetricsQL brutes
expr ajoute à un export une requête brute en MetricsQL, le langage de requête de la base de séries temporelles de la plateforme — pour une série pour laquelle la collection n'a pas d'indicateur. Le paramètre peut être répété jusqu'à cinq fois ; chaque expression peut compter jusqu'à 4 000 caractères. Une requête peut porter expr seul, ou metrics et expr ensemble ; les colonnes des indicateurs viennent en premier.
expr=sum by (inverter_id) (powerplant_inverter_power_ac)&park=ABC123DEF456&window=yesterday&step=15min
Une expression est évaluée par centrale, comme un tableau de bord l'évalue : sur les données de la centrale elle-même, au pas demandé, en échantillons bruts — tout pas est permis, values et les règles de regroupement des indicateurs ne s'appliquent pas. Mirox ajoute la centrale à chaque sélecteur de l'expression ; une expression qui nomme elle-même un label park, organization ou plant est refusée avec 400 expr_forbidden_label.
| Cas | header=name | header=id |
|---|---|---|
| Une série par centrale | MetricsQL sum by (inverter_id) (powerplant_inverter_power_ac) | expr1 |
| Plusieurs séries sur une centrale quelconque | l'en-tête suivi du name{labels} propre à chaque série | expr1{inverter_id="INV1"} |
| Plusieurs centrales | le nom de la centrale devant, comme pour toute colonne | ABC123DEF456/expr1 |
Lorsqu'une expression renvoie plusieurs séries sur l'une de ses centrales, les colonnes de cette expression sur toutes les centrales portent les labels de série, de sorte qu'un fichier n'a qu'une nomenclature par expression. Un en-tête de plus de 1 000 caractères est coupé avec … dans l'expression, jamais dans le texte de la série. Dans la réponse JSON, columns[].key est le texte de header=id et columns[].metric l'identifiant de l'expression, expr.e1, expr.e2, …, qu'utilisent les remarques et les refus. Une centrale sur laquelle l'expression ne renvoie rien garde une colonne vide, avec la remarque expr_no_series ; avec plusieurs centrales, chaque centrale reçoit ses propres colonnes, avec la remarque expr_split_by_park.
Une expression peut renvoyer au plus 500 séries sur une centrale (400 expr_too_many_series) ; agrégez-la, avec sum by (…) par exemple. Les séries comptent dans les mêmes 400 colonnes et 1 800 000 valeurs que tout export : la première lecture de chaque expression sur chaque centrale est une courte sonde, les largeurs sont additionnées sur toute la requête, et une requête qui dépasse les limites est refusée avec 400 over_budget et params.series avant toute lecture complète d'une expression. Une expression qui ne s'analyse pas, est vide, trop longue, ou que la base refuse répond 400 expr_invalid avec la reason.
L'estimation compte une expression comme une colonne par centrale, car ses séries ne sont connues qu'à la lecture. Les expressions ne sont pas enregistrées dans les modèles.
Réponse CSV
La réponse est en UTF-8, avec le nom de fichier series_export_<premier jour>_<dernier jour>_<pas>.csv. Une réponse de plus de 1 Mo environ est compressée lorsque la requête porte Accept-Encoding: gzip (curl : --compressed).
Les colonnes sont, dans cet ordre : le temps, le Décalage UTC lorsqu'il s'applique, puis les indicateurs dans l'ordre de metrics.
| Cas | header=name | header=id |
|---|---|---|
| Temps | Date | timestamp |
| Décalage UTC | UTC offset | utc_offset |
| Une centrale, ou centrales regroupées | Grid feed-in (kWh) | plant.grid_feedin |
| Centrales séparées | Sunnyside - Grid feed-in (kWh) | ABC123DEF456/plant.grid_feedin |
| Composant | WR 01.01 - AC power per inverter (W) | ABC123DEF456/inverter:1043/inverter.ac_power |
| Composant, plusieurs centrales | Sunnyside - WR 01.01 - AC power per inverter (W) | ABC123DEF456/inverter:1043/inverter.ac_power |
| Indicateur à variantes, comme trois phases | le nom suivi de la variante | l'identifiant suivi de #<variante> |
| Un indicateur dans deux modes de valeurs | le même nom deux fois | plant.grid_feedin:delta, plant.grid_feedin:cumulative |
| Requête MetricsQL brute | MetricsQL <expression>, suivi des labels de série lorsqu'il y en a plusieurs | expr1, expr1{inverter_id="INV1"} — voir Requêtes MetricsQL brutes |
Utilisez header=id dans les scripts et les classeurs
Les noms sont faits pour les personnes : ils suivent language et changent lorsqu'un indicateur est renommé. Les identifiants sont stables. Un script ou un classeur qui retrouve ses colonnes par leur en-tête devrait demander header=id. Dans un modèle, vous pouvez aussi donner à chaque colonne votre propre texte d'en-tête.
La colonne de temps est formatée selon le pas, sauf si datetime_format est indiqué :
| Pas | Format | Exemple |
|---|---|---|
1min, 5min, 15min, 1h | %Y-%m-%d %H:%M | 2026-08-01 06:15 |
day, week | %Y-%m-%d | 2026-08-01 |
month, quarter, year | %Y-%m | 2026-08 |
Chaque ligne est horodatée au début de son intervalle. Une valeur manquante est une cellule vide, de sorte que « pas de données » et « zéro » se distinguent ; empty=zero écrit 0 à la place.
Quatre en-têtes de la réponse reprennent ce qui a été résolu :
| En-tête | Contenu | Exemple |
|---|---|---|
X-Mirox-Step | le pas | day |
X-Mirox-Grid | le calendrier | local:Europe/Berlin |
X-Mirox-Window | début et fin de la période exportée | 2026-08-01T00:00:00+02:00/2026-09-01T00:00:00+02:00 |
X-Mirox-Notes | les remarques, séparées par ; | step_auto:step=day |
Réponse JSON
format=json fournit le même tableau sous forme de données structurées :
| Champ | Contenu |
|---|---|
window | start, end, grid, tz_name, step, et aligned lorsque la période a été élargie |
parks | les centrales exportées avec uid, name et timezone |
buckets | les lignes : start sous forme d'heure avec décalage, ts en secondes Unix |
columns | une entrée par colonne : key (le texte de header=id), metric, name, unit, digits, quantity, values_mode, merge, park_uid, lane (ref, level, title), variant, et values dans l'ordre de buckets ; une valeur manquante est null |
notes | les remarques avec code, metric et params |
lanes_total | composants par indicateur par composant, avant pagination |
lane_page, lane_limit | la page fournie |
totals | values, queries et duration_ms de l'export |
Remarques
Une remarque vous dit ce que Mirox a fait de lui-même. Elle ne fait jamais échouer un export. Les remarques font partie de la réponse JSON et de l'en-tête X-Mirox-Notes. L'en-tête contient jusqu'à 1 ko de remarques, écrites sous la forme code:clé=valeur,clé=valeur et séparées par ;. Si elles n'y tiennent pas toutes, l'en-tête se termine par notes_omitted:count=<n> ; la réponse JSON les contient toutes.
| Remarque | Signification |
|---|---|
parks_dropped | Les centrales que vous avez nommées mais que vous ne pouvez pas lire ont été laissées de côté. uids les nomme. |
grant_required | Un indicateur de montant reste vide pour une centrale sur laquelle vous n'avez pas l'accès à la comptabilité. |
value_mode_ignored | Le mode de valeurs demandé ne s'applique pas à l'indicateur ; il a été exporté en native. |
energy_delta_fine_step | Une énergie par intervalle à un pas inférieur à 15 minutes montre les paliers du compteur. twin nomme l'indicateur de puissance correspondant. |
legacy_id_mapped | Un identifiant de l'export précédent a été traduit. from, to et exactness indiquent comment. |
merge_not_meaningful | L'indicateur ne peut pas être regroupé sur les centrales et est affiché par centrale. |
components_split_by_park | Les indicateurs par composant sont affichés par centrale. |
merged_on_utc | Les centrales sont dans des fuseaux horaires différents ; les lignes sont en UTC. |
utc_calendar_unsupported | L'indicateur n'a pas de valeur sur le calendrier UTC ; sa colonne est vide. |
window_aligned | La période a été élargie à des intervalles entiers. start et end donnent le résultat. |
end_clamped | La période s'étendait dans le futur et se termine maintenant. |
step_auto | Le pas choisi par auto. |
step_folded | Avec mismatch=sparse : l'indicateur a été lu à un step plus fin et regroupé à la grille. |
step_sparse | Avec mismatch=sparse : l'indicateur a une valeur par step, sur la première ligne de chacun de ses intervalles. |
lanes_truncated | L'indicateur a plus de composants que la page n'en contient. total, page et limit indiquent où vous en êtes. |
lanes_unpaged | Des séries mesurées sans entrée dans les composants de la centrale ont été exportées telles que mesurées. |
metric_unavailable | L'indicateur n'a pas de valeurs pour une centrale ; la colonne est vide. reason vaut planned, not_applicable, no_data_source, draft, deleted, unknown_lane, off_grid ou, dans un modèle, not_permitted. |
expr_no_series | Une requête brute n'a renvoyé aucune série sur une centrale ; sa colonne est vide. |
expr_split_by_park | Les requêtes brutes sont lues par centrale et reçoivent un jeu de colonnes par centrale. |
provider_note | Une remarque de l'indicateur lui-même, par exemple la source qui a répondu. |
Une colonne vide est toujours conservée. Un indicateur qui ne s'applique pas à l'une des centrales, ou un indicateur de montant sans accès à la comptabilité, laisse sa colonne en place : la position des autres colonnes ne change donc jamais.
Estimer avant d'exporter
GET /v1/export/series/estimate
La route prend les paramètres de l'export, sans le format de fichier, et répond ce que serait l'export — sans lire de données et sans être décomptée du quota horaire.
| Champ | Contenu |
|---|---|
step, grid, window | ce à quoi la requête se résout |
parks, columns, rows, values, queries | la taille |
bytes_csv, seconds_estimate | taille approximative du fichier et durée |
within_budget | si l'export serait fourni |
preview_ok | s'il est assez petit pour l'aperçu dans l'application (200 000 valeurs) |
limits | les limites en vigueur |
per_step | pour chaque pas : served_by_all, values, within_budget, et la reason sinon |
refusals | chaque erreur que l'export répondrait, avec code, params et hint |
notes | les remarques que l'export porterait |
Un refus ne fait jamais échouer l'estimation : elle répond 200 et liste le refus. L'estimation compte, elle ne produit rien : les libellés de ligne et les en-têtes sont ceux de l'export. Une requête brute compte comme une colonne par centrale, et avec mismatch=sparse les remarques nomment les colonnes regroupées et clairsemées.
Le catalogue des indicateurs
GET /v1/export/series/catalog
| Paramètre | Valeurs | Par défaut | Signification |
|---|---|---|---|
park, portfolio | UID | — | Les centrales par rapport auxquelles les indicateurs sont évalués. Sans centrales, toute la collection est listée. |
language | en, de, es, fr, it, pt | en | La langue des noms et des descriptions. |
level | un niveau | tous | Un seul niveau. |
quantity | energy, amount, rate, level, ratio, state, price | toutes | Une seule grandeur. |
search | texte, jusqu'à 100 caractères | — | Recherche dans le nom, la description, l'unité, l'identifiant et les identifiants de l'export précédent. |
include_unavailable | true, false | true | Liste aussi les indicateurs qui ne peuvent pas être exportés pour les centrales choisies. |
page, limit | nombres, limit jusqu'à 100 | 1, 100 | Pagination. |
sort | order, name, id, level, précédé de - pour l'ordre décroissant | order | L'ordre de la liste. |
format | json, csv | json | csv fournit le glossaire. |
Chaque indicateur porte, à côté de son identifiant, de son nom, de sa description, de son unité et de son niveau :
| Champ | Contenu |
|---|---|
quantity | ce qu'est le nombre : energy, amount (une autre grandeur comptée), rate (puissance), level, ratio, state ou price |
value_modes, default_value_mode | les modes de valeurs qu'il propose, et celui que choisit auto |
export_steps | les pas qu'il propose |
native_step_seconds | sa fréquence de mesure |
merge | comment plusieurs centrales sont regroupées |
twin_item_id | pour un indicateur d'énergie, son indicateur de puissance |
lane_level | pour un indicateur par composant, le niveau de ses composants |
legacy_ids | les identifiants de l'export précédent auxquels il répond |
applies_parks | sur combien des centrales choisies il s'applique |
exportable, export_reason | s'il peut être exporté, et sinon pourquoi : draft, planned, grant_required, not_applicable ou no_source |
Jusqu'à 10 centrales, chaque centrale est vérifiée quant à l'équipement dont un indicateur a besoin. Au-delà, les centrales ne sont évaluées que par leur type ; ce qui manque à une centrale donnée apparaît au moment de l'export sous forme de remarque metric_unavailable.
Glossaire. format=csv fournit toute la liste filtrée sous forme de fichier, metric_catalog_<langue>.csv, avec les colonnes identifiant, niveau, nom, unité, description, grandeur, modes de valeurs, pas, intervalle de mesure, regroupement sur les centrales, remarque et identifiants précédents. page et limit ne s'appliquent pas.
curl "https://service.mirox.io/api/v1/export/series/catalog?format=csv&language=en" \
-H "Authorization: Bearer YOUR_API_TOKEN" -o metric_catalog_en.csv
Indicateurs disponibles
La collection est classée par niveau. Le préfixe d'un identifiant indique où se situe un indicateur.
| Niveau | level | Préfixe d'identifiant | Ce qu'il contient |
|---|---|---|---|
| Centrale · mesures | plant | plant. | Ce que la centrale mesure elle-même : le compteur réseau, les sommes des onduleurs, les capteurs du site, les limites de puissance qui lui ont été imposées. |
| Centrale · référence | plant_reference | plant. | Ce que la centrale aurait dû produire : irradiation dans le plan des modules, production attendue, ratio de performance, productible spécifique, pertes. |
| Centrale · indemnisation | plant_compensation | plant. | Écrêtement et pertes par limitation en énergie et en puissance, par destinataire et par méthode. |
| Indicateurs | metrics | availability., organization. | Valeurs de disponibilité, heures d'ensoleillement et indicateurs de votre organisation. |
| Onduleur | inverter | inverter. | Une colonne par onduleur. |
| Boîte de jonction | gak | gak. | Une colonne par boîte de jonction. |
| String | string | string. | Une colonne par string. |
| Batterie | battery | battery. | Le stockage dans son ensemble : énergie, puissance, état de charge, consignes. |
| Conteneur de batteries | battery_box | battery_box. | Une colonne par conteneur. |
| Rack de batteries | battery_storage | battery_storage. | Une colonne par rack. |
| Module de batterie | battery_module | battery_module. | Une colonne par module. |
| Cellule de batterie | battery_cell | battery_cell. | Une colonne par cellule ou par point de mesure. |
| Convertisseur de batterie (PCS) | battery_pcs | battery_pcs. | Une colonne par convertisseur. |
| Éolienne | turbine | turbine. | Une colonne par éolienne. |
| Capteur | sensor | sensor. | Une colonne par capteur : irradiance, irradiation, température, humidité, vent. |
| Compteur | meter | meter. | Une colonne par compteur d'énergie. |
| Infrastructure | infrastructure | infrastructure. | Le chemin des données et le site : complétude, état des enregistreurs, réseau, alarmes, connexions de commande. |
| Météo | weather | weather. | La météo sur le site, y compris le vent et la température à 80, 120 et 180 m. |
| Marché | market | market. | Prix et valeurs de marché. |
| Finances de la centrale | financial | financial. | Montants de la centrale. Ils exigent l'accès à la comptabilité. |
La liste complète avec noms, unités et descriptions dans votre langue se trouve dans le catalogue, dans le fichier de glossaire ou sous Explications dans l'onglet Métriques. Les valeurs de prévision météo de l'export précédent ne font pas partie de la collection ; voir le guide de migration.
Composants d'une centrale
GET /v1/export/series/lanes
| Paramètre | Valeurs | Par défaut | Signification |
|---|---|---|---|
park | un UID de centrale | obligatoire | La centrale. |
level | un niveau de composant | obligatoire | Voir Composants. |
metric | un identifiant d'indicateur | — | Pour les capteurs et les compteurs : liste ceux qui ont fourni cet indicateur au cours des 30 derniers jours. |
search | texte | — | Recherche dans les noms. |
include_hidden | true, false | false | Liste aussi les composants masqués. |
page, limit | nombres, limit jusqu'à 100 | 1, 50 | Pagination. |
sort | order, name, précédé de - pour l'ordre décroissant | order | order est l'ordre des colonnes dans l'export. |
Chaque entrée comporte la référence ref pour le paramètre components, le name, le level, le parent (parent_ref, parent_name — l'onduleur d'un string, par exemple), des attributes (role d'un compteur, position d'un capteur d'irradiance, vendor), hidden, et source : db pour une entrée des composants de la centrale, store pour une série mesurée mais sans entrée de ce type.
Une centrale qui n'existe pas et une centrale que vous ne pouvez pas lire répondent toutes deux 404 park_not_found.
Système de modèles
Un modèle est une liste d'indicateurs enregistrée, avec des valeurs par défaut pour le pas, la période, les valeurs, le fuseau horaire, le regroupement des centrales, la taille de page des composants et les en-têtes de colonne. À quoi servent les modèles et comment les gérer dans l'application est expliqué dans le guide Metric Export.
Exporter un modèle
GET /v1/export/series/template/{template_uid}
La route prend les paramètres de l'export sauf metrics, components et values, que le modèle fixe. Chaque paramètre que vous omettez prend la valeur par défaut du modèle ; chaque paramètre que vous indiquez l'emporte sur elle.
curl --compressed "https://service.mirox.io/api/v1/export/series/template/CAFE1000CAFE?park=ABC123DEF456&window=previous_month&header=id" \
-H "Authorization: Bearer YOUR_API_TOKEN" -o standard.csv
- Un modèle d'une autre organisation répond
404 template_not_found. - Un ancien modèle répond
400 template_is_legacy;params.legacy_urlest le lien qui l'exporte. - Une colonne dont l'indicateur n'est plus disponible est exportée vide sous son en-tête, avec la remarque
metric_unavailable. Il en va de même pour un indicateur de votre organisation lorsque vous exportez en tant qu'Externe (reasonnot_permitted).
Modèles système
| Modèle | UID | Pas | Période |
|---|---|---|---|
| Export standard | CAFE1000CAFE | day | previous_month |
| Export étendu | CAFE1001CAFE | day | previous_month |
| Export étendu (disponibilité des onduleurs) | CAFE1002CAFE | day | previous_month |
| Export de disponibilité énergétique | CAFE1003CAFE | day | previous_month |
| Rapport technique | ABCD12340002 | day | previous_month |
| Éoliennes | CAFE1010CAFE | day | previous_month |
| Stockage par batterie | CAFE1020CAFE | day | previous_month |
| Capteurs d'irradiance | CAFE1030CAFE | 15min | yesterday |
Les cinq premiers succèdent à CAFE0000CAFE, CAFE0001CAFE, CAFE0002CAFE, CAFE0003CAFE et ABCD12340001, qui continuent de fonctionner sur l'ancienne route. Leurs colonnes sont listées dans le guide de migration. Ils proposent les pas day, week, month, quarter et year ; les quatre premiers proposent en plus 15min et 1h.
Gérer les modèles
Les modèles sont listés, lus, créés, modifiés et supprimés sous /v1/export/template. La lecture fonctionne avec un jeton Metric Export. L'écriture exige le rôle d'organisation Admin, Modérateur, Gestionnaire d’actifs (technique) ou Gestionnaire d’actifs (commercial) et une connexion ou un jeton Accès complet.
| Requête | Rôle |
|---|---|
GET /v1/export/template | Lister les modèles. view=current liste les modèles système de cette page et les modèles de votre organisation ; view=legacy, la valeur par défaut, liste les modèles enregistrés comme auparavant ; view=all liste les deux. kind=series ou kind=legacy filtre. |
GET /v1/export/template/{template_uid} | Lire un modèle. |
POST /v1/export/template | Créer un modèle avec kind=series et le contenu dans spec. Sans kind, la requête crée un ancien modèle à partir de metric_ids, comme auparavant. |
PUT /v1/export/template/{template_uid} | Modifier le nom, la description ou spec. Le type ne peut pas changer. |
DELETE /v1/export/template/{template_uid} | Supprimer un modèle. Les modèles système ne peuvent être ni modifiés ni supprimés. |
Le spec d'un modèle :
| Champ | Valeurs | Par défaut |
|---|---|---|
items | 1 à 40 entrées, chacune avec metric, et en option values et label | obligatoire |
step | un pas | auto |
values | un mode de valeurs | auto |
tz | local, utc | local |
window | une période prédéfinie | previous_month |
multi_park_agg | merge, split | merge |
lane_limit | 1 à 100 | 50 |
header | name, id | name |
mismatch | refuse, sparse | refuse |
label est le texte d'en-tête de la colonne avec header=name. Un indicateur ne peut apparaître qu'une fois, et un modèle ne contient pas de requêtes brutes. À l'enregistrement d'un modèle, chaque indicateur doit être exportable et les indicateurs doivent avoir un pas en commun — sous mismatch=sparse, chacun doit proposer un pas quelconque ; sinon la réponse est 422 spec_invalid, et params.problems nomme l'indicateur et la raison. Un modèle s'exécute avec son propre mismatch (l'application l'affiche comme Métriques d'un autre pas : Strict ou Souple) ; le paramètre du lien d'export l'emporte.
Convertir un ancien modèle
POST /v1/export/template/{template_uid}/convert
| Champ | Valeurs | Signification |
|---|---|---|
name | jusqu'à 100 caractères | Le nom du nouveau modèle. Par défaut : le nom de l'ancien modèle suivi de « (new) ». |
dry_run | true, false | true fournit la correspondance sans rien créer. |
La réponse liste mapped (legacy_id, metric, values, exactness : exact ou approximate) et unmapped (legacy_id, reason : formula, no_equivalent, report_value ou instant, et jusqu'à trois suggestions), ainsi que, sauf s'il s'agissait d'un essai à blanc, le nouveau template. Un essai à blanc répond 200, une conversion 201.
Le nouveau modèle exporte des jours sur le mois précédent. L'ancien modèle n'est jamais modifié. Deux anciennes colonnes qui lisent le même compteur deviennent une seule colonne. 422 nothing_to_convert signifie qu'aucune colonne n'a d'équivalent, ou que le modèle n'est pas un ancien modèle.
Limites
Un export est servi en une seule requête ; sa taille est donc bornée. Chaque limite est vérifiée avant la lecture des données ; une requête trop volumineuse est refusée immédiatement et vous indique ce qui conviendrait.
| Limite | Valeur |
|---|---|
| Indicateurs par requête | 20 ; dans un modèle 40 |
| Requêtes MetricsQL brutes par requête | 5, de 4 000 caractères chacune, avec au plus 500 séries par centrale |
| Centrales par requête | 50 |
| Composants par indicateur et par page | 50 par défaut, au plus 100 |
| Colonnes | 400 |
| Valeurs par colonne | 180 000 — 125 jours à 1min, 625 jours à 5min, cinq ans à 15min |
| Valeurs au total | 1 800 000 (lignes × colonnes) |
| Période | 1827 jours |
| Lectures de la base de mesures par requête | 1 500 |
| Durée | 50 secondes |
| Exports par utilisateur et par heure | 240 |
| Exports exécutés en même temps | 3 par organisation |
Scinder un export volumineux
400 over_budget nomme dans params ce qui était nécessaire et ce qui est autorisé, et dans hint l'issue : step, le pas immédiatement plus grossier qui convient, et max_days, la période la plus longue qui convient au pas demandé. Interrogez d'abord l'estimation si vous construisez des requêtes dans un script ; son per_step liste la taille pour chaque pas.
Si ni un pas plus grossier ni une période plus courte ne vous conviennent, scindez l'export :
| Scinder par | Comment |
|---|---|
| Période | Une requête par mois ou par trimestre. Utilisez les paramètres calendaires (year=2026&month=7) et assemblez les fichiers. |
| Centrale | Une requête par centrale ou par portefeuille. |
| Indicateur | Les indicateurs par composant dans des requêtes à part. Un indicateur par composant sur une centrale de 200 onduleurs représente 200 colonnes. |
| Page | lane_page=1, 2, … pour les composants d'un indicateur. |
Certains indicateurs sont déterminés à partir de plusieurs sources pour chaque jour, avant tout plant.production_reported (Production, résolue). Ils exigent bien plus de lectures de la base de mesures qu'un relevé de compteur, à chaque pas. Une requête ou un modèle qui porte un tel indicateur couvre actuellement environ neuf mois-centrale : une centrale sur neuf mois, ou neuf centrales sur un mois. Un pas d'une semaine ou plus élargit la période à des intervalles entiers, et c'est la période élargie qui compte. Scindez de tels exports par période ou par centrale, ou exportez l'indicateur dans une requête à part.
429 busy et 429 rate_limited portent l'en-tête Retry-After avec le nombre de secondes à attendre.
Erreurs
Une erreur des routes de cette page a la forme suivante :
{
"detail": {
"code": "step_not_served",
"message": "The step is not served by every requested metric.",
"params": {"step": "1h", "metrics": {"plant.grid_power": ["1min", "5min", "15min"]}},
"hint": {"offered_common": ["1min", "5min", "15min"]}
}
}
code est stable et destiné aux programmes. message est un texte en anglais destiné aux personnes. params indique ce qui n'allait pas, hint ce qui fonctionnerait.
| Statut | code | Signification | params et hint |
|---|---|---|---|
| 400 | scope_required | Ni park ni portfolio n'a été indiqué. | hint.example |
| 400 | unknown_metric | Un identifiant d'indicateur n'existe pas. | params.ids ; hint.suggestions avec des identifiants similaires |
| 400 | legacy_metric_id | Un identifiant de l'export précédent n'a pas d'équivalent dans la collection. | params.id, params.legacy_url ; hint.reason, hint.closest, hint.pending, hint.legacy_url |
| 400 | metric_not_exportable | L'indicateur existe mais n'est pas une série temporelle que vous pouvez exporter. | params.id, params.reason : draft, planned, no_source, events ou master |
| 400 | window_conflict | La période a été indiquée de plus d'une façon. | params.families |
| 400 | window_invalid | La période n'est pas valide. | params.reason : end_before_start, start_in_future, before_2020, too_long, day_requires_month, start_required ou invalid_date |
| 400 | step_not_served | Un indicateur ne propose pas le pas demandé. | params.metrics avec les pas de chaque indicateur ; hint.offered_common |
| 400 | no_common_step | Les indicateurs n'ont aucun pas en commun. | params.metrics ; hint.split |
| 400 | over_budget | L'export dépasse une limite. | params.values, limit, queries, query_limit, columns, column_limit, parks ; avec plus de 50 centrales, params.parks et park_limit ; pour une requête brute, params.series ; hint.step, hint.max_days, hint.lane_limit, hint.reduce |
| 400 | unknown_lane | Une référence de composant n'appartient à aucune des centrales. | params.refs |
| 400 | expr_invalid | Une requête brute ne peut pas être exécutée. | params.expr, params.reason : empty, syntax (avec detail), too_long, too_large, store (avec le detail de la base) ou parser_unavailable |
| 400 | expr_forbidden_label | Une requête brute nomme elle-même une centrale, un parc ou une organisation. | params.expr, params.labels |
| 400 | expr_too_many_series | Une requête brute renvoie plus de 500 séries sur une centrale. | params.expr, params.park, params.series, params.limit ; hint.reduce |
| 400 | separator_conflict | Le séparateur de colonnes et le séparateur décimal sont identiques. | — |
| 400 | invalid_datetime_format | datetime_format n'est pas un motif valide. | hint.example |
| 400 | template_is_legacy | Le modèle est un ancien modèle. | params.legacy_url |
| 403 | no_accessible_parks | Vous ne pouvez lire aucune des centrales choisies. | — |
| 403 | metric_forbidden | Un indicateur de votre organisation a été demandé avec le rôle d'organisation Externe. | params.ids |
| 404 | template_not_found, park_not_found | Le modèle ou la centrale n'existe pas, ou vous ne pouvez pas le lire. | — |
| 409 | name_conflict | Un modèle portant ce nom existe déjà. | params.name |
| 422 | — | Un paramètre a une valeur hors de sa liste, ou metrics contient plus de 20 identifiants. | le champ et la raison |
| 422 | spec_invalid, use_spec, nothing_to_convert | Un modèle ne peut pas être enregistré ou converti tel qu'il a été envoyé. | params.problems |
| 429 | busy | Trop d'exports sont en cours. | en-tête Retry-After |
| 429 | rate_limited | Le quota horaire est épuisé. | en-tête Retry-After |
| 502 | store_error | La base de mesures a répondu par une erreur. Rien n'a été exporté ; une valeur n'est jamais remplacée par zéro. | params.metric |
| 503 | store_timeout | La base de mesures n'a pas répondu à temps. | hint.step avec un pas plus grossier |
401 signifie que le jeton est absent, expiré ou révoqué.
Identifiants de l'export précédent
Le paramètre metrics accepte aussi les identifiants de l'export précédent, comme energy_grid_daily ou raw_grid_power. Un identifiant qui a un équivalent est traduit en son indicateur, dans le mode de valeurs le plus proche du nombre précédent, et la remarque legacy_id_mapped indique quel indicateur a répondu et si le nombre est le même (exact) ou s'il s'agit de la même grandeur lue d'une meilleure façon (approximate).
Un identifiant sans équivalent répond 400 legacy_metric_id. hint.reason indique pourquoi, hint.closest nomme l'indicateur le plus proche lorsqu'il y en a un, hint.pending nomme l'indicateur prévu pour le reprendre, et legacy_url est le lien de l'export précédent qui fournit toujours l'identifiant. Avec plus de centrales qu'un lien ne peut en nommer, legacy_url nomme la première centrale et params.legacy_url_scope vaut first. Un identifiant de composant d'un niveau de batterie n'a pas de lien de l'export précédent ; hint.legacy_route vaut alors none. Le guide de migration liste chaque identifiant.
Excel et scripts
- Metric Export pour Excel — des recettes, et la connexion Power Query avec l'en-tête
Authorization - Générateur de rapports externe — un exemple Python complet
Fonctionnalités associées
- Metric Export — la page Export de données
- Migrer vers le Metric Export — anciens identifiants, nouveaux indicateurs et ce qui change
- API de l'ancien export — les liens d'export précédents
- Indicateurs — définissez vos propres indicateurs et exportez-les
- Jetons d'API — créez le jeton Metric Export
- Aperçu de l'API — la référence interactive de toutes les routes