TRMNL
Show your Joulo kWh, ERE and session count on a TRMNL e-ink display with a private plugin
TRMNL is an e-ink display that polls a JSON endpoint and renders it with Liquid markup. A private plugin against GET /energy puts your lifetime kWh, ERE and session count on the wall. No server in between.
The dashboard generates this recipe with your token filled in under Developer → API → Recipes. This page explains what each part does.
Prerequisites
- A Joulo account with at least one connected charger
- An active API token (generate one from Developer → API in the dashboard)
- A TRMNL device with the Developer edition, which unlocks private plugins
Create the plugin
New private plugin
In TRMNL go to Plugins → Private Plugin → New. Pick the Polling strategy.
Polling URL
https://api.joulo.nl/functions/v1/api/energyPolling headers
TRMNL takes headers as key=value pairs. Separate several with &.
authorization=Bearer YOUR_API_TOKENRefresh rate
60 minutes is enough. The totals change per charging session, not per minute.
Markup
Paste this into the Markup field. TRMNL exposes the root keys of the JSON response as Liquid variables.
<div class="layout layout--col">
<div class="columns">
<div class="column">
<span class="value value--large">{{ total_kwh | round: 1 }}</span>
<span class="label">kWh (counts for ERE)</span>
</div>
<div class="column">
<span class="value value--large">{{ total_ere_credits | round: 0 }}</span>
<span class="label">ERE</span>
</div>
<div class="column">
<span class="value value--large">{{ total_sessions }}</span>
<span class="label">Charging sessions</span>
</div>
</div>
</div>
<div class="title_bar">
<span class="title">Joulo</span>
<span class="instance">{{ total_kwh_all | round: 0 }} kWh charged in total</span>
</div>Fields explained
| Variable | Meaning |
|---|---|
total_kwh | Energy from MID-eligible chargers. The same headline number as the dashboard. |
total_ere_credits | ERE earned on that energy. |
total_sessions | Sessions on MID-eligible chargers. |
total_kwh_all | All charging energy, including chargers without a MID meter. |
total_sessions_all | All sessions, including chargers without a MID meter. |
The full response shape is on the energy endpoint page.
Liquid's round filter keeps the display readable. The JSON carries more decimals than an e-ink panel needs.
Money on the display
GET /ere-position returns the expected earnings for the compliance year, what is reserved and what is paid out. Add it as a second polling URL. TRMNL then exposes the responses as IDX_0 and IDX_1:
<span class="value">{{ IDX_1.total_expected_eur | round: 0 }} EUR</span>
<span class="label">Expected this year</span>The fields are described on the ERE position page.
The token in the plugin has full read access to your charging data. Do not share plugin screenshots that include the settings page.