Table des matières:

Votre moniteur de facture énergétique : 4 étapes
Votre moniteur de facture énergétique : 4 étapes

Vidéo: Votre moniteur de facture énergétique : 4 étapes

Vidéo: Votre moniteur de facture énergétique : 4 étapes
Vidéo: Tout savoir sur votre première facture chez ENGIE 2024, Juillet
Anonim
Votre moniteur de facture énergétique
Votre moniteur de facture énergétique

À PROPOS DE CE PROJET

Si vous voulez vraiment rendre votre maison plus intelligente, vous voudrez probablement commencer par vos factures mensuelles (c'est-à-dire énergie, gaz, etc.). Comme certains le disent, Good for Planet, The Wallet et The Bottom Line. Le matériel open source est notre moyen d'atteindre la durabilité dans l'environnement domestique ! Cette idée nous a amené à construire une solution simple et sécurisée, facile à intégrer avec n'importe quel logiciel domotique puisqu'elle expose les données sur MQTT (dans notre cas nous allons vous montrer comment l'intégrer dans Home Assistant).

Aperçu

Afin de mesurer la consommation d'énergie électrique, nous avons choisi d'utiliser le Finder Energy Meter, car il est conçu pour une utilisation sur rail DIN et s'intègre parfaitement dans l'armoire principale de notre maison. L'avantage de ce produit est qu'il dispose d'une interface Modbus RS485, un protocole de communication standard industriel qui permet de parler très facilement à un Arduino. En fait, Arduino a sorti un shield officiel, le MKR485 et deux librairies pour décoder le protocole. Comme carte mère, nous avons choisi l'Arduino MKR WiFi 1010, car il partage le facteur de forme MKR et dispose d'une connectivité WiFi.

ConfigurationAvertissement ! Vérifiez les réglementations de votre pays concernant la gestion du système électrique de votre maison et soyez extrêmement prudent car cela peut être mortel ! Si vous ne savez pas comment faire, appelez un électricien. La première étape consiste à installer le compteur dans votre armoire électrique. Pour vous assurer que vous travaillez dans un environnement sûr, coupez l'alimentation de la borne électrique en amont de votre système et vérifiez avec le multimètre qu'il n'y a pas de tension entre les bornes. Ensuite, placez le compteur d'énergie à l'intérieur de votre armoire et connectez les fils sous tension et neutre du disjoncteur principal à l'entrée du compteur, n'oubliez pas d'utiliser la convention de couleur (bleu pour le neutre et marron/noir/gris pour vivre dans l'UE). La sortie doit être connectée au reste du système.

Connexions de tension principale. Les fils au-dessus sont des entrées, les fils au-delà sont des sorties.

Étape 1: Pièces nécessaires

Pièces nécessaires
Pièces nécessaires

Étape 2: Besoins logiciels

Besoins logiciels
Besoins logiciels

Logiciel

Démarrez votre ordinateur et ouvrez votre IDE. Vous pouvez utiliser l'IDE Arduino ou l'éditeur Arduino Create. Le code répond aux demandes suivantes: Communication Modbus, gestion WiFi Protocole MQTT Modbus est un protocole open-source pour les capteurs et machines industriels. Pour faire parler Arduino Modbus, nous allons utiliser la bibliothèque Arduino Modbus. Cette bibliothèque contient tous les gestionnaires et permet de connecter n'importe quel appareil Modbus très rapidement. Puisque nous allons lire des registres, en suivant la fiche technique du compteur, nous pouvons trouver toutes les informations dont nous avons besoin comme les codes de fonction, l'adresse du registre et la taille du registre en mots. Mais pour que ce soit plus clair, expliquons comment fonctionne Modbus: Les messages Modbus suivent une structure simple: 01 03 04 00 16 00 02 25 C7 0x01 est l'adresse de l'appareil 0x03 est le code de fonction qui indique à l'appareil si nous voulons lire ou écrire des données *, dans ce cas, lire les registres de maintien 0x04 pour le nombre d'octets00 16 - Nous envoyons 4 octets d'adresse de registre (00 16) qui indique à l'appareil ce que nous voulons lire 00 02- puis la taille du registre (00 02) en mots (chaque mot fait 2 octets) Les 4 derniers octets sont du code CRC. Ce code est généré à partir d'une fonction mathématique sur les octets précédents, cela garantit que le message a été reçu correctement.

Intégration de Home Assistant L'ajout du compteur à Home Assistant est assez simple. En supposant que vous ayez configuré un courtier MQTT (Voici le guide), il vous suffit d'ajouter de nouvelles définitions dans le fichier configuration.yaml. capteur: - plate-forme: mqtt nom: « Main Voltage » state_topic: « energy/main/voltage » unit_of_measurement: « V » Ici vous devez mettre le nom de la mesure, le sujet MQTT à lire et l'unité de mesure de la grandeur. Enregistrez le fichier, vérifiez la configuration et rechargez Home Assistant, maintenant les mesures apparaîtront sur la page principale.

Panneau de consommation Home Assistant affichant les lectures actuelles

Home Assistant s'occupera de créer des graphiques et d'automatiser les processus déclenchés par vos lectures. Ce tutoriel est terminé, à vous maintenant d'ajouter des fonctionnalités et de le personnaliser à vos propres fins !

Étape 3: Assembler

Assembler
Assembler
Assembler
Assembler

Terminé? Il est temps de visser la connexion RS485 ! Nous utiliserons un câble à paire unique torsadée avec la terre, généralement utilisé pour les lignes téléphoniques. Avec ce câble, vous pouvez transmettre sur une longue distance (1,2 km). Cependant, nous utilisons juste un câble assez long pour sortir de l'armoire et placer l'Arduino dans un endroit accessible.

Connexion RS485 du Finder

L'interface RS485 nomme ses bornes A, B et COM. Une norme de facto courante est l'utilisation de TX+/RX+ ou D+ comme alternative à B (élevé pour MARK c'est-à-dire inactif), TX-/RX- ou D- comme alternative à A (bas pour MARK c'est-à-dire inactif) Le blindage MKR prend également en charge le Full Duplex, vous verrez deux autres terminaux, Y et Z. Ici, nous allons visser l'autre extrémité du câble car nous savons d'après la fiche technique que la communication semi-duplex ne se produit que sur les terminaux Y et Z. Le terminal COM doit être connecté à ISOGND. Étant donné que nous utilisons une connexion semi-duplex et que le câblage est peer-to-peer, nous devons configurer les commutateurs sur le blindage MKR485 pour correspondre à notre configuration: nous définissons HALF (2 à off) et la terminaison sur YZ (3 à AU); le premier n'a pas d'importance. La terminaison est une résistance reliant les deux terminaux de données, pour amortir les interférences.

Ça y est. Maintenant, vous pouvez fermer l'armoire et vous concentrer sur le côté logiciel !

Étape 4: Coder

Code
Code

#comprendre

#include #include #include //vos identifiants wifi const char ssid = "**********"; const char pass = "**********";

Réseau Wi-Fi Client; Client MQTTClient; taux long non signé = 60000; // taux de rafraîchissement par défaut en ms non signé long lastMillis = 0;

//fonction de connexion void connect() { Serial.print("vérification du wifi…"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); retard(1000); } Serial.print("\nconnexion…"); while (!client.connect("device_name", "user_name", "user_pw")) { //CHANGER POUR CORRESPONDRE À VOTRE CONFIGURATION Serial.print("."); retard(1000); } Serial.println("\nconnecté!"); client.subscribe("energy/main/refreshrate"); //sujet pour définir la fréquence de rafraîchissement à distance } //mqtt recevoir la fonction de rappel void messageReceived(String &topic, String &payload) { Serial.println("incoming: " + topic + " - " + payload); if(topic == "energy/main/refreshrate"){ // gestionnaire de taux de rafraîchissement rate = payload.toInt()*1000; Serial.println("nouveau taux "+String(taux)); } }

void setup() { Serial.begin(115200); WiFi.begin(ssid, pass); tandis que (!Série); client.begin("broker_ip", net); //CHANGER POUR CORRESPONDRE À VOTRE CONFIGURATION client.onMessage(messageReceived); // démarre le client Modbus RTU if (!ModbusRTUClient.begin(9600)) { Serial.println("Impossible de démarrer le client Modbus RTU!"); tandis que (1); } }

boucle vide() { client.loop(); if (!client.connected()) { //vérifier la connexion réseau connect(); } // publie un message une fois le rafraîchissement écoulé (routine non bloquante) if (millis() - lastMillis > rate) { lastMillis = millis(); //faire tous les appels de lecture float volt = readVoltage(); retard (100); float amp = readCurrent(); retard (100); double watt = readPower(); retard (100); float Hz = readFreq(); retard (100); double wh = readEnergy(); // publier les résultats sous les sujets connexes client.publish("energy/main/voltage", String(volt, 3)); client.publish("energy/main/current", String(amp, 3)); client.publish("energy/main/power", String(watt, 3)); client.publish("énergie/principale/fréquence", String(hz, 3)); client.publish("energy/main/energy", String(wh, 3)); Serial.print(String(volt, 3)+"V "+String(amp, 3)+"A "+String(watt, 3)+"W "); Serial.println(String(hz, 3)+"Hz "+String(wh, 3)+"kWh"); retard (100); } }

/* Fonctions pour lire les registres du Finder Energy Meter * * Consultez le manuel du protocole modbus pour comprendre le code * https://gfinder.findernet.com/public/attachments/7E/EN/PRT_Modbus_7E_64_68_78_86EN.pdf */ float readVoltage(){ float volt = 0.; if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x000C, 2)) { //faire l'appel au registre Serial.print("échec de lecture de tension ! "); Serial.println(ModbusRTUClient.lastError()); //gestionnaire d'erreurs }else{ uint16_t word1 = ModbusRTUClient.read(); //lire les données du tampon uint16_t word2 = ModbusRTUClient.read(); uint32_t millivolt = mot1 << 16 | mot2; //bit math volt = millivolt/1000.0; } retour volt; } float readCurrent(){ float ampère = 0.; if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0016, 2)) { Serial.print("échec de lecture en cours ! "); Serial.println(ModbusRTUClient.lastError()); }else{ uint16_t word1 = ModbusRTUClient.read(); uint16_t word2 = ModbusRTUClient.read(); int32_t milliampère = mot1 << 16 | mot2; ampère = milliampère/1000,0; } renvoie l'ampère; }

double readPower(){ double watt = 0.; if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0025, 3)) { Serial.print("échec de lecture de l'alimentation ! "); Serial.println(ModbusRTUClient.lastError()); }else{ uint16_t word1 = ModbusRTUClient.read(); uint16_t word2 = ModbusRTUClient.read(); uint16_t word3 = ModbusRTUClient.read(); uint64_t milliwatt; if(mot1 >> 7 == 0){ milliwatt = mot1

Conseillé: