Editer sur publi.codes/studio
meta:
  titre: Calcul de l'eco-index d'une page web
  statut: Expérimental
  références:
    ecoindex.fr: https://www.ecoindex.fr/comment-ca-marche/
    GitHub: https://github.com/cnumr/GreenIT-Analysis/blob/master/script/ecoIndex.js
  description: |
    EcoIndex permet de prendre conscience de l’impact environnemental d’internet et de proposer des solutions concrètes.

    Plusieurs critères sont pris en compte par notre méthode de calcul :
      - La complexité de la page
      - Le poids des données transférées 
      - Le nombre de requêtes HTTP

input: oui

# input utilisateurs
input . dom:
  question: Combien d'éléments DOM sont affichés dans la page ?

input . req:
  question: Combien de requêtes HTTP sont nécessaires pour charger la page ?

input . size:
  question: Quel est le poids complet du téléchargement de la page et ses ressources ?

quantiles: oui

ecoindex:
  valeur: (100 - (5 * (3 * quantiles . dom + 2 * quantiles . req + quantiles . size)) / 6)
  arrondi: oui

ecoindex . grade:
  variations:
    - si: ecoindex > 75
      alors: "'A'"
    - si: ecoindex > 65
      alors: "'B'"
    - si: ecoindex > 50
      alors: "'C'"
    - si: ecoindex > 35
      alors: "'D'"
    - si: ecoindex > 20
      alors: "'E'"
    - si: ecoindex > 5
      alors: "'F'"
    - sinon: "'G'"

emissions gaz:
  valeur: (2 + (2 * (50 - ecoindex)) / 100)
  arrondi: 2 décimales
  unité: gCO2e

consommation eau:
  valeur: (3 + (3 * (50 - ecoindex)) / 100)
  arrondi: 2 décimales
  unité: cl

emissions . km:
  valeur: emissions gaz * 1000 / 90 # 90g CO2 /km (gCO2e)
  arrondi: 1 décimale
  unité: km

emissions . douches:
  valeur: ((consommation eau / 100) * 1000) / 60 # 60L / douche
  arrondi: 1 décimale
  unité: douche(s)

quantiles . dom:
  variations:
    - si: input . dom < 47
      alors: 0 + (input . dom) / (47)
    - si: input . dom < 75
      alors: 1 + (input . dom - 47) / (75 - 47)
    - si: input . dom < 159
      alors: 2 + (input . dom - 75) / (159 - 75)
    - si: input . dom < 233
      alors: 3 + (input . dom - 159) / (233 - 159)
    - si: input . dom < 298
      alors: 4 + (input . dom - 233) / (298 - 233)
    - si: input . dom < 358
      alors: 5 + (input . dom - 298) / (358 - 298)
    - si: input . dom < 417
      alors: 6 + (input . dom - 358) / (417 - 358)
    - si: input . dom < 476
      alors: 7 + (input . dom - 417) / (476 - 417)
    - si: input . dom < 537
      alors: 8 + (input . dom - 476) / (537 - 476)
    - si: input . dom < 603
      alors: 9 + (input . dom - 537) / (603 - 537)
    - si: input . dom < 674
      alors: 10 + (input . dom - 603) / (674 - 603)
    - si: input . dom < 753
      alors: 11 + (input . dom - 674) / (753 - 674)
    - si: input . dom < 843
      alors: 12 + (input . dom - 753) / (843 - 753)
    - si: input . dom < 949
      alors: 13 + (input . dom - 843) / (949 - 843)
    - si: input . dom < 1076
      alors: 14 + (input . dom - 949) / (1076 - 949)
    - si: input . dom < 1237
      alors: 15 + (input . dom - 1076) / (1237 - 1076)
    - si: input . dom < 1459
      alors: 16 + (input . dom - 1237) / (1459 - 1237)
    - si: input . dom < 1801
      alors: 17 + (input . dom - 1459) / (1801 - 1459)
    - si: input . dom < 2479
      alors: 18 + (input . dom - 1801) / (2479 - 1801)
    - si: input . dom < 594601
      alors: 19 + (input . dom - 2479) / (594601 - 2479)
    - sinon: 20

quantiles . req:
  variations:
    - si: input . req < 2
      alors: 0 + (input . req) / (2)
    - si: input . req < 15
      alors: 1 + (input . req - 2) / (15 - 2)
    - si: input . req < 25
      alors: 2 + (input . req - 15) / (25 - 15)
    - si: input . req < 34
      alors: 3 + (input . req - 25) / (34 - 25)
    - si: input . req < 42
      alors: 4 + (input . req - 34) / (42 - 34)
    - si: input . req < 49
      alors: 5 + (input . req - 42) / (49 - 42)
    - si: input . req < 56
      alors: 6 + (input . req - 49) / (56 - 49)
    - si: input . req < 63
      alors: 7 + (input . req - 56) / (63 - 56)
    - si: input . req < 70
      alors: 8 + (input . req - 63) / (70 - 63)
    - si: input . req < 78
      alors: 9 + (input . req - 70) / (78 - 70)
    - si: input . req < 86
      alors: 10 + (input . req - 78) / (86 - 78)
    - si: input . req < 95
      alors: 11 + (input . req - 86) / (95 - 86)
    - si: input . req < 105
      alors: 12 + (input . req - 95) / (105 - 95)
    - si: input . req < 117
      alors: 13 + (input . req - 105) / (117 - 105)
    - si: input . req < 130
      alors: 14 + (input . req - 117) / (130 - 117)
    - si: input . req < 147
      alors: 15 + (input . req - 130) / (147 - 130)
    - si: input . req < 170
      alors: 16 + (input . req - 147) / (170 - 147)
    - si: input . req < 205
      alors: 17 + (input . req - 170) / (205 - 170)
    - si: input . req < 281
      alors: 18 + (input . req - 205) / (281 - 205)
    - si: input . req < 3920
      alors: 19 + (input . req - 281) / (3920 - 281)
    - sinon: 20

quantiles . size:
  variations:
    - si: input . size < 1.37
      alors: 0 + input . size / 1.37
    - si: input . size < 144.7
      alors: 1 + (input . size - 1.37) / (144.7 - 1.37)
    - si: input . size < 319.53
      alors: 2 + (input . size - 144.7) / (319.53 - 144.7)
    - si: input . size < 479.46
      alors: 3 + (input . size - 319.53) / (479.46 - 319.53)
    - si: input . size < 631.97
      alors: 4 + (input . size - 479.46) / (631.97 - 479.46)
    - si: input . size < 783.38
      alors: 5 + (input . size - 631.97) / (783.38 - 631.97)
    - si: input . size < 937.91
      alors: 6 + (input . size - 783.38) / (937.91 - 783.38)
    - si: input . size < 1098.62
      alors: 7 + (input . size - 937.91) / (1098.62 - 937.91)
    - si: input . size < 1265.47
      alors: 8 + (input . size - 1098.62) / (1265.47 - 1098.62)
    - si: input . size < 1448.32
      alors: 9 + (input . size - 1265.47) / (1448.32 - 1265.47)
    - si: input . size < 1648.27
      alors: 10 + (input . size - 1448.32) / (1648.27 - 1448.32)
    - si: input . size < 1876.08
      alors: 11 + (input . size - 1648.27) / (1876.08 - 1648.27)
    - si: input . size < 2142.06
      alors: 12 + (input . size - 1876.08) / (2142.06 - 1876.08)
    - si: input . size < 2465.37
      alors: 13 + (input . size - 2142.06) / (2465.37 - 2142.06)
    - si: input . size < 2866.31
      alors: 14 + (input . size - 2465.37) / (2866.31 - 2465.37)
    - si: input . size < 3401.59
      alors: 15 + (input . size - 2866.31) / (3401.59 - 2866.31)
    - si: input . size < 4155.73
      alors: 16 + (input . size - 3401.59) / (4155.73 - 3401.59)
    - si: input . size < 5400.08
      alors: 17 + (input . size - 4155.73) / (5400.08 - 4155.73)
    - si: input . size < 8037.54
      alors: 18 + (input . size - 5400.08) / (8037.54 - 5400.08)
    - si: input . size < 223212.26
      alors: 19 + (input . size - 8037.54) / (223212.26 - 8037.54)
    - sinon: 20

résultat:
  applicable si:
    toutes ces conditions:
      - input . dom
      - input . req
      - input . size
  texte: |
    Note eco-index: {{ ecoindex }}
    Grade eco-index: {{ ecoindex . grade }}

    Par visite:
     - Emissions de gaz: {{ emissions gaz }}
     - Consommation d'eau: {{ consommation eau }}

    Pour un total de 1000 visites par mois, ceci correspond à:
    - {{ emissions . km }} en voiture (Peugeot 208 5P 1.6 BlueHDi FAP (75ch) BVM5)
    - et {{ emissions . douches }}.
Todo: lancer les tests unitaires