Skip to content

vsisl/electricitymap

 
 

Repository files navigation

electricitymap Slack Status

A real-time visualisation of the Greenhouse Gas (in terms of CO2 equivalent) footprint of electricity consumption built with d3.js, optimized for Google Chrome. Try it out at http://www.electricitymap.org, or download the app:

Get it on Google Play Get it on the Apple Store

image

You can contribute by

You can also see a list of missing datas displayed as warnings in the developer console, or question marks in the country panel:

image

Check the contributing section for more details.

Data sources

Carbon intensity calcuation and data source

The carbon intensity of each country is measured from the perspective of a consumer. It represents the greenhouse gas footprint of 1 kWh consumed inside a given country. The footprint is measured in gCO2eq (grams CO2 equivalent), meaning each greenhouse gas is converted to its CO2 equivalent in terms of global warming potential over 100 year (for instance, 1 gram of methane emitted has the same global warming impact during 100 years as ~20 grams of CO2 over the same period).

The carbon intensity of each type of power plant takes into account emissions arising from the whole lifecyle of the plant (construction, fuel production, operational emissions, and decomissioning). Carbon-intensity factors used in the map are detailed in co2eq-parameters.js. These numbers come from the following scientific peer reviewed litterature:

  • IPCC (2014) Fifth Assessment Report is used as reference in most instances (see a summary in the wikipedia entry)

Country-specific carbon-intensity factors:

Each country has a CO2 mass flow that depends on neighboring countries. In order to determine the carbon footprint of each country, the set of coupled CO2 mass flow balance equations of each countries must be solved simultaneously. This is done by solving the linear system of equations defining the network of GHG exchanges. Take a look at this notebook for a deeper explanation.

Real-time electricity data sources

Real-time electricity data is obtained using parsers

Production capacity data sources

Production capacities are centralized in the capacities.json file.

Electricity prices (day-ahead) data sources

Real-time weather data sources

We use the US National Weather Service's Global Forecast System (GFS)'s GFS 0.25 Degree Hourly data. Forecasts are made every 6 hours, with a 1 hour time step. The values extracted are wind speed and direction at 10m altitude, and ground solar irradiance (DSWRF - Downward Short-Wave Radiation Flux), which takes into account cloud coverage. In order to obtain an estimate of those values at current time, an interpolation is made between two forecasts (the one at the beginning of the hour, and the one at the end of the hour).

Topology data

We use the Natural Earth Data Cultural Vectors country subdivisions (map admin subunits).

Contribute

Want to help? Join us on slack at http://slack.tmrow.co.

Adding a new country

It is very simple to add a new country. The Electricity Map backend runs a list of so-called parsers every 5min. Those parsers are responsible to fetch the generation mix for a given country (check out the existing list in the parsers directory, or look at the work in progress).

A parser is a python script that is expected to define the method fetch_production which returns the production mix at current time, in the format:

def fetch_production(country_code='FR', session=None):
    return {
      'countryCode': 'FR',
      'datetime': '2017-01-01T00:00:00Z',
      'production': {
          'biomass': 0.0,
          'coal': 0.0,
          'gas': 0.0,
          'hydro': 0.0,
          'nuclear': null,
          'oil': 0.0,
          'solar': 0.0,
          'wind': 0.0,
          'geothermal': 0.0,
          'unknown': 0.0
      },
      'storage': {
          'hydro': -10.0,
      },
      'source': 'mysource.com'
    }

The session object is a python request session that you can re-use to make HTTP requests.

The production values should never be negative. Use null, or ommit the key, if a specific production mode is not known. Storage values can be both positive (when storing energy) or negative (when the storage is emptied).

The parser can also return an array of objects if multiple time values can be fetched. The backend will automatically update past values properly.

For more info, check out the example or browse existing parsers.

Frontend contributions

To get started, clone or fork the repository, and install Docker.

The frontend will need compiling. In order to do this, open a terminal and run

docker-compose run --rm web npm run watch

This will watch over source file changes, and recompile if needed.

Now that the frontend is compiled, you can run the application (which will use our existing backend to pull data), by running the following command in a new terminal:

docker-compose up --build

Head over to http://localhost:8000/ and you should see the map!

Once you're done doing your changes, submit a pull request to get them integrated into the production version.

Troubleshooting

  • ERROR: for X Cannot create container for service X: Invalid bind mount spec "<path>": Invalid volume specification: '<volume spec>'. If you get this error after running docker-compose up on Windows, you should tell docker-compose to properly understand Windows paths by setting the environment variable COMPOSE_CONVERT_WINDOWS_PATHS to 0 by running setx COMPOSE_CONVERT_WINDOWS_PATHS 0. You will also need a recent version of docker-compose. We have successfully seen this fix work with v1.13.0-rc4. More info here: docker/compose#4274.

  • No website found at http://localhost:8000: This can happen if you're running Docker in a virtual machine. Find out docker's IP using docker-machine ip default, and replace localhost by your Docker IP when connecting.

About

A real-time visualisation of the CO2 emissions of electricity generation

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 46.7%
  • JavaScript 42.6%
  • HTML 5.7%
  • CSS 3.5%
  • Other 1.5%