Si tens dispositius Shelly a casa — mesuradors d'energia, endolls intel·ligents o sondes de temperatura — pots anar molt més enllà de l'app oficial. En aquest article explico com hem muntat un sistema complet per recollir les dades cada 10 segons, guardar-les a InfluxDB i visualitzar-les amb Grafana en dashboards personalitzats.

Per a què serveix tot això?

L'app de Shelly és útil per al dia a dia, però no et permet veure l'evolució del consum al llarg del temps, comparar dispositius, o creuar les dades amb altres fonts (com ara la producció solar teòrica). Amb aquest sistema pots:

  • Veure el consum en temps real de cada circuit de casa.
  • Comparar la producció solar real amb la teòrica per la teva ubicació.
  • Monitorar temperatures de fins a 9 sondes DS18B20 simultàniament.
  • Crear alertes si el consum supera un llindar.
  • Accedir als dashboards des d'internet via Cloudflare Tunnel, sense obrir ports.

Arquitectura del sistema

El flux és senzill: un script Python consulta l'API de Shelly Cloud cada 10 segons, transforma les dades i les escriu a InfluxDB. Grafana llegeix d'InfluxDB i pinta les gràfiques. Tot corre en Docker al mateix servidor.

Shelly Cloud API  (shelly-194-eu.shelly.cloud)
        │
        │  HTTP POST /device/all_status  (cada 10s)
        ▼
shelly_collector.py  (Python 3 · servei systemd)
        │
        │  InfluxDB Line Protocol
        ▼
InfluxDB 2.x  (Docker · port 8086)
  bucket: shelly
        │
        │  Flux queries
        ▼
Grafana  (Docker · port 3000)

Pas 1 — Obtenir les credencials de Shelly Cloud

El portal antic (home.shelly.cloud) està deprecated. Ara tot es fa des de control.shelly.cloud. Per obtenir la clau d'autenticació i el servidor, obre el navegador, prem F12, ves a la pestanya Network i fes qualsevol acció a l'app. Veuràs peticions al teu servidor (ex: shelly-194-eu.shelly.cloud) i el paràmetre auth_key.

Verifica que funciona amb aquest curl:

curl -X POST "https://shelly-194-eu.shelly.cloud/device/all_status?auth_key=LA-TEVA-CLAU"

Si veus un JSON amb tots els teus dispositius, perfecte. Anota les MACs de cada Shelly — les necessitaràs al script.

Pas 2 — Muntar InfluxDB i Grafana amb Docker

services:
  influxdb:
    image: influxdb:2
    ports: ["8086:8086"]
    volumes:
      - influxdb_data:/var/lib/influxdb2

  grafana:
    image: grafana/grafana:latest
    ports: ["3000:3000"]
    volumes:
      - grafana_data:/var/lib/grafana

volumes:
  influxdb_data:
  grafana_data:

Un cop en marxa, crea el bucket:

sudo docker exec influxdb influx bucket create \
  --name shelly \
  --retention 0 \
  --org EL-TEU-ORG

Pas 3 — El script de recol·lecció

El script shelly_collector.py té un mapa de dispositius on defineixes cada Shelly amb el seu ID (MAC), nom i tipus. Suporta quatre tipus: em (mesurador 2 canals), plug_gen2 (Plug S Gen2), shelly1_temp (Shelly 1 amb sondes DS18B20) i ht (H&T). Exemple per un Shelly EM:

{
    "id":        "c45bbe6b6dd6",  # MAC en minúscules sense :
    "name":      "em-Recoder",   # nom que apareixerà a Grafana
    "type":      "em",
    "room":      "garatge",
    "ch0_label": "entrada",
    "ch1_label": "sortida",
},

Instal·la les dependències i prova el script:

pip3 install requests influxdb-client --break-system-packages
python3 shelly_collector.py

# Sortida esperada:
# 2026-03-26 15:18:28 INFO  ✅ 22 punts escrits a InfluxDB (15:18:28)

Pas 4 — Convertir-ho en un servei systemd

Crea /etc/systemd/system/shelly-collector.service:

[Unit]
Description=Shelly Cloud -> InfluxDB collector
After=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory=/srv/docker/grafana
ExecStart=/usr/bin/python3 /srv/docker/grafana/shelly_collector.py
Restart=always
RestartSec=15

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable shelly-collector
sudo systemctl start shelly-collector
sudo systemctl status shelly-collector

Pas 5 — Configurar Grafana

A http://localhost:3000, afegeix un Data Source d'InfluxDB amb Query Language: Flux, URL http://influxdb:8086 (nom del contenidor, no localhost), l'organització i el token. Importa els tres dashboards JSON des de Dashboards → Import → Upload JSON.

Extra — Comparar producció solar real vs teòrica

Importa primer el fitxer de dades de referència solar:

sudo docker cp solar_barcelona_2025_2026.lp influxdb:/tmp/
sudo docker exec influxdb influx write \
  --bucket shelly \
  --org EL-TEU-ORG \
  --precision ns \
  --file /tmp/solar_barcelona_2025_2026.lp

Query Flux per mostrar les dues corbes al mateix gràfic a Grafana:

real = from(bucket: "shelly")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "energy")
  |> filter(fn: (r) => r._field == "power_w")
  |> filter(fn: (r) => r.device == "em-Recoder")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> map(fn: (r) => ({r with _field: "real " + r.channel}))

solar = from(bucket: "shelly")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "solar_production")
  |> filter(fn: (r) => r._field == "power_w")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> map(fn: (r) => ({r with _field: "solar-teoric-w"}))

union(tables: [real, solar])

Afegir un nou dispositiu Shelly

  1. Troba la MAC amb el curl de /device/all_status.
  2. Afegeix el bloc de configuració a la llista DEVICES del script.
  3. Reinicia el servei — les queries generals de Grafana ja el mostraran automàticament.
# Trobar la MAC del nou dispositiu
curl -s -X POST \
  "https://shelly-194-eu.shelly.cloud/device/all_status?auth_key=LA-TEVA-CLAU" \
  | python3 -m json.tool | grep '"mac"'

# Reiniciar el servei
sudo systemctl restart shelly-collector

Resultat final

Amb tot muntat, tenim 11 dispositius Shelly reportant dades cada 10 segons: 5 mesuradors EM (alguns amb solar), 2 Plug S Gen2, 3 Shelly 1 amb sondes DS18B20 i 1 H&T. Grafana mostra tres dashboards diferenciats i el sistema porta mesos funcionant sense cap intervenció manual.

Més informació