Le suivi par prise connectée MQTT est le moyen le plus économique de savoir ce que coûte réellement chaque appareil de votre maison connectée. Dans ce tutoriel, vous allez connecter des prises Tasmota et Shelly à un broker, normaliser leurs payloads différents, stocker les mesures dans SQLite avec un abonné Python et produire un graphique de kWh journaliers par appareil. L'approche gère les redémarrages et les remises à zéro des compteurs, là où la plupart des loggers d'énergie faits maison se trompent sans bruit.
Quelles prises connectées parlent MQTT
Il vous faut une prise capable de publier vers un broker de votre choix, et pas seulement vers le cloud d'un fabricant. Trois familles couvrent l'essentiel du marché pour cet usage :
| Famille de prises | Activation de MQTT | Champs d'énergie | Remarques |
|---|---|---|---|
| Prises flashées Tasmota (nombreux modèles à base d'ESP) | Intégré au firmware Tasmota | ENERGY.Power (W), ENERGY.Total (kWh), Today, Yesterday |
Certains modèles sont livrés avec Tasmota ; d'autres doivent être flashés |
| Shelly Plug S Gen3 / Plus Plug | Interface web locale, Settings > MQTT | apower (W), aenergy.total (Wh) |
API JSON-RPC Gen2/Gen3 |
| Prises basées sur ESPHome | Bloc mqtt: dans le YAML ESPHome |
Un topic par capteur | Flexible mais topics par entité |
Vérifiez que la prise mesure la puissance avant de l'acheter ; beaucoup de prises bon marché se contentent de commuter. Vérifiez aussi le courant nominal par rapport à l'appareil, car bouilloires, radiateurs et sèche-linge sont proches de la limite de la plupart des prises.
Connecter une prise Tasmota
Ouvrez l'interface web Tasmota, puis Configuration > Configure MQTT, ou utilisez la console pour aller plus vite. La commande Backlog applique plusieurs réglages d'un coup et redémarre la prise :
Backlog MqttHost broker.connectmq.com; MqttPort 1883; MqttClient plug-kitchen-kettle-9f2; Topic kettle; FullTopic connectmq/demo/p4w8/%prefix%/%topic%/; TelePeriod 60
La prise publie alors sa télémétrie toutes les 60 secondes sur connectmq/demo/p4w8/tele/kettle/SENSOR, avec un payload de ce type :
{
"Time": "2026-10-16T07:31:12",
"ENERGY": {
"TotalStartTime": "2025-11-02T18:04:51",
"Total": 48.215,
"Yesterday": 0.412,
"Today": 0.197,
"Period": 3,
"Power": 0,
"ApparentPower": 0,
"ReactivePower": 0,
"Factor": 0.00,
"Voltage": 231,
"Current": 0.000
}
}
Total est l'énergie cumulée depuis la mise en service, en kWh, et Power la puissance active instantanée en watts. Utilisez un segment de chemin aléatoire comme p4w8, car le serveur MQTT public gratuit est partagé et lisible par tous. Les détails propres à Tasmota, y compris les builds TLS, sont traités dans le guide Tasmota MQTT.
Connecter une prise Shelly
Sur une Shelly Plus Plug ou Plug S Gen3, ouvrez l'interface web locale, allez dans Settings > MQTT, activez-le, réglez le serveur sur broker.connectmq.com:1883, le préfixe sur connectmq/demo/p4w8/shelly/fridge, et activez Generic status update over MQTT. La prise publie alors des instantanés complets sur connectmq/demo/p4w8/shelly/fridge/status/switch:0, où apower est en watts et aenergy.total correspond à l'énergie cumulée en wattheures, et non en kWh. Confondre ces unités est le bug le plus fréquent quand on combine plusieurs marques. Le guide de configuration Shelly MQTT explique toute la structure des topics et du RPC.
Concevoir le pipeline de données des prises connectées MQTT
Chaque prise publie déjà vers le broker ; il manque quelque chose qui écoute et conserve l'historique. Les brokers distribuent les messages en direct et les valeurs retenues, mais ce ne sont pas des bases de données : le logger est donc un client MQTT séparé. Le plan :
- S'abonner aux deux formats de prise avec des wildcards.
- Normaliser chaque message en
(time, plug, power_w, total_kwh). - Stocker chaque échantillon dans SQLite.
- Calculer l'énergie journalière à partir de la différence entre totaux cumulés consécutifs, en ignorant les sauts négatifs causés par les remises à zéro.
- Tracer une série de barres par prise et par jour.
Pourquoi partir des totaux cumulés plutôt que d'intégrer la puissance ? Parce que la puissance n'est échantillonnée qu'une fois par minute, et qu'une bouilloire qui fonctionne 90 secondes entre deux échantillons peut apparaître à zéro. Le compteur d'énergie de la prise mesure en continu, si bien que les deltas du total restent exacts même avec un échantillonnage clairsemé. Si un message est perdu, le delta suivant couvre simplement une période plus longue.
Le logger Python
pip install "paho-mqtt>=2.0" matplotlib
import json
import sqlite3
import sys
from datetime import datetime
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/p4w8"
DB = sqlite3.connect("plugs.db", check_same_thread=False)
DB.execute("""CREATE TABLE IF NOT EXISTS samples (
ts TEXT, plug TEXT, power_w REAL, total_kwh REAL)""")
DB.commit()
def normalize(topic, payload):
parts = topic.split("/")
data = json.loads(payload)
if "/tele/" in topic and topic.endswith("/SENSOR"):
e = data.get("ENERGY")
if not e:
return None
return parts[-2], float(e["Power"]), float(e["Total"])
if "/shelly/" in topic and topic.endswith("/status/switch:0"):
if "aenergy" not in data:
return None
plug = parts[parts.index("shelly") + 1]
return plug, float(data.get("apower", 0)), float(data["aenergy"]["total"]) / 1000.0
return None
def on_connect(client, userdata, flags, reason_code, properties):
print("Connected:", reason_code)
client.subscribe(f"{PREFIX}/tele/+/SENSOR", qos=1)
client.subscribe(f"{PREFIX}/shelly/+/status/switch:0", qos=1)
def on_message(client, userdata, msg):
try:
row = normalize(msg.topic, msg.payload)
except (ValueError, KeyError) as exc:
print("Skipping", msg.topic, exc)
return
if row is None:
return
plug, power, total = row
DB.execute("INSERT INTO samples VALUES (?, ?, ?, ?)",
(datetime.now().isoformat(timespec="seconds"), plug, power, total))
DB.commit()
print(f"{plug:12s} {power:8.1f} W {total:10.3f} kWh")
def daily_kwh():
rows = DB.execute("SELECT ts, plug, total_kwh FROM samples ORDER BY plug, ts").fetchall()
result, last = {}, {}
for ts, plug, total in rows:
day = ts[:10]
prev = last.get(plug)
last[plug] = total
if prev is None:
continue
delta = total - prev
if delta < 0: # remise à zéro du compteur ou prise remplacée : on ignore cet intervalle
continue
result.setdefault(plug, {}).setdefault(day, 0.0)
result[plug][day] += delta
return result
def plot():
import matplotlib.pyplot as plt
data = daily_kwh()
days = sorted({d for per in data.values() for d in per})
width = 0.8 / max(len(data), 1)
fig, ax = plt.subplots(figsize=(10, 5))
for i, (plug, per_day) in enumerate(sorted(data.items())):
xs = [n + i * width for n in range(len(days))]
ax.bar(xs, [per_day.get(d, 0) for d in days], width, label=plug)
ax.set_xticks([n + 0.4 - width / 2 for n in range(len(days))])
ax.set_xticklabels(days, rotation=45, ha="right")
ax.set_ylabel("kWh per day")
ax.legend()
fig.tight_layout()
fig.savefig("daily_kwh.png", dpi=120)
for plug, per_day in sorted(data.items()):
print(plug, {d: round(v, 3) for d, v in sorted(per_day.items())})
if __name__ == "__main__":
if sys.argv[1:] == ["plot"]:
plot()
else:
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="plug-logger-3391")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_forever()
Laissez tourner python plug_logger.py, puis au bout d'un jour ou deux lancez python plug_logger.py plot pour produire daily_kwh.png et afficher les chiffres. Les journées sont découpées selon l'heure locale du logger, ce qui correspond généralement à ce que l'on souhaite pour un bilan domestique.
Interpréter les chiffres
Après une semaine de données, quelques tendances ressortent en général :
- Consommations de veille. Téléviseurs, consoles et équipements réseau qui ne descendent jamais sous quelques watts finissent par peser sur l'année. Regardez le
power_wminimal de chaque prise, pas seulement le total journalier. - Réfrigérateurs et congélateurs présentent un cycle de fonctionnement régulier. Un total journalier qui augmente à température ambiante constante peut signaler un joint défaillant ou un condenseur encrassé.
- Les charges courtes et puissantes comme les bouilloires et les machines à café apparaissent à peine dans les échantillons de puissance, mais le compteur d'énergie les capte, ce qui valide la méthode des deltas.
- Le coût annuel correspond aux kWh journaliers multipliés par 365 et par votre tarif. Calculez-le par prise pour savoir quel changement en vaut la peine.
Pour une vue de toute la maison à titre de comparaison, consultez le tutoriel suivi de la consommation électrique de la maison avec MQTT. Jeedom et Domoticz savent aussi communiquer en MQTT et peuvent s'abonner aux mêmes topics.
Transformer les données des prises connectées MQTT en alertes
L'historique vous dit ce qui s'est passé ; les alertes vous préviennent pendant que cela se produit. Comme chaque mesure transite déjà par le broker, vous pouvez ajouter des alertes sans toucher aux prises :
- Congélateur à l'arrêt. Une prise de congélateur qui indique moins de quelques watts pendant plus d'une heure signifie généralement un thermostat déclenché ou une porte restée ouverte. Les règles d'alerte à seuil du portail ConnectMQ peuvent surveiller un champ numérique sur un topic, et un abonné Python ou Node-RED peut ajouter la condition « pendant plus d'une heure ».
- Appareil oublié. Un fer à repasser, un radiateur ou un lisseur qui consomme plus longtemps que d'habitude est un cas classique d'automatisation par prise connectée MQTT : publiez
offsur le topic de commande de la prise après un délai. - Lave-linge terminé. Une puissance qui passe de plusieurs centaines de watts à presque zéro et y reste quelques minutes est un signal fiable de « cycle terminé » pour une notification sur le téléphone.
Gardez la logique dans un seul abonné plutôt que de la disperser sur les appareils, afin de pouvoir modifier les seuils sans rien reflasher.
Liste de dépannage
| Problème | Cause | Solution |
|---|---|---|
| Totaux journaliers 1000 fois trop grands | Wh Shelly traités comme des kWh | Divisez aenergy.total par 1000 |
| Aucune donnée Tasmota pendant des minutes | TelePeriod trop long |
Réglez TelePeriod 60 ou moins (minimum 10) |
| Les prises se déconnectent mutuellement | Client ID MQTT en double | Un MqttClient unique par prise |
| Valeurs journalières négatives | Remise à zéro du compteur non gérée | Ignorez les deltas négatifs comme ci-dessus |
| Mesures de puissance incohérentes | Prise non étalonnée | Étalonnez avec PowerSet, VoltageSet, CurrentSet dans Tasmota |
Passer à un broker privé
Le serveur MQTT public gratuit est parfait pour cette expérience, mais les données d'énergie révèlent quand vous êtes chez vous, et quiconque devine votre préfixe peut aussi commuter vos prises. Avant de laisser l'installation tourner, passez à un broker MQTT cloud avec identifiants et TLS. Avec ConnectMQ, créez un broker dans le portail, puis attribuez à chaque prise son propre nom d'utilisateur, mot de passe et client ID. Dans Tasmota, cela suppose un build avec TLS et MqttPort 8883 ; dans Shelly, activez SSL avec le bundle de CA intégré. Dans le logger, ajoutez :
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set()
client.connect("broker.connectmq.com", 8883, keepalive=60)
Les 25 connexions du plan Serverless (Free) suffisent pour une douzaine de prises, le logger et un tableau de bord. Un broker MQTT managé signifie aussi que le broker est joignable depuis votre téléphone sans ouvrir de ports sur votre box. Le guide de l'automatisation IoT montre comment les données des prises peuvent aussi déclencher des automatisations.
Commencez à surveiller vos prises avec ConnectMQ
ConnectMQ offre à vos prises connectées, loggers et tableaux de bord un broker privé sécurisé par TLS, avec un explorateur de topics en direct et des règles d'alerte à seuil, par exemple pour vous avertir lorsqu'une prise de congélateur indique zéro watt trop longtemps. Créez un broker Serverless gratuit sur app.connectmq.com, sans carte bancaire.
Questions fréquentes
N'importe quelle prise connectée peut-elle envoyer des données MQTT ?
Non. Seules les prises dont le firmware intègre MQTT, comme les appareils Tasmota, Shelly Gen2/Gen3 ou ESPHome, peuvent publier vers un broker de votre choix. Les prises uniquement cloud nécessitent plutôt une intégration du fabricant.
Quelle est la précision des mesures d'énergie d'une prise connectée ?
Elle suffit généralement pour comparer des appareils et repérer le gaspillage, mais ces prises ne sont pas des compteurs de facturation. Un étalonnage avec une charge résistive connue améliore nettement la précision sur les prises Tasmota.
Pourquoi utiliser le total d'énergie plutôt que la valeur de puissance ?
La prise intègre l'énergie en continu, alors que la puissance n'est échantillonnée qu'à l'envoi d'un message. Les différences entre totaux cumulés captent les charges courtes que les échantillons de puissance manquent.
À quelle fréquence une prise connectée doit-elle publier ?
Toutes les 30 à 60 secondes, c'est un bon équilibre pour l'historique et les tableaux de bord. Des intervalles plus courts ajoutent du trafic sans améliorer les totaux journaliers, puisque ceux-ci proviennent du compteur d'énergie.



