Turinys:

Jūsų energijos sąskaitos monitorius: 4 žingsniai
Jūsų energijos sąskaitos monitorius: 4 žingsniai

Video: Jūsų energijos sąskaitos monitorius: 4 žingsniai

Video: Jūsų energijos sąskaitos monitorius: 4 žingsniai
Video: Home Assistant. Урок 9.4 ADD-ON - Xiaomi Gateway 3, интеграция в zigbee2mqtt 2024, Liepa
Anonim
Jūsų sąskaitos už energiją monitorius
Jūsų sąskaitos už energiją monitorius

APIE ŠĮ PROJEKTĄ

Jei tikrai norite padaryti savo namus protingesnius, tikriausiai norėsite pradėti nuo mėnesinių sąskaitų (ty energijos, dujų ir pan.). Kaip kai kurie sako, „Good for Planet“, „The Wallet“ir „Bottom Line“. Atvirojo kodo aparatinė įranga yra mūsų būdas pasiekti tvarumą namų aplinkoje! Ši idėja paskatino mus sukurti paprastą ir saugų sprendimą, kurį būtų lengva integruoti į bet kurią namų automatikos programinę įrangą, nes ji atskleidžia duomenis per MQTT (mūsų atveju parodysime, kaip juos integruoti į namų asistentą).

Apžvalga

Norėdami išmatuoti elektros energijos suvartojimą, mes pasirinkome naudoti „Finder“energijos matuoklį, nes jis skirtas naudoti DIN bėgeliams ir puikiai tinka pagrindinėje mūsų namo spintoje. Puikus šio gaminio dalykas yra tai, kad jis turi RS485 „Modbus“sąsają, pramoninį standartinį ryšio protokolą, kuris labai palengvina pokalbį su „Arduino“. Tiesą sakant, „Arduino“išleido oficialų skydą, MKR485 ir dvi bibliotekas, skirtas iššifruoti protokolą. Kaip pagrindinę plokštę pasirinkome „Arduino MKR WiFi 1010“, nes ji turi MKR formos faktorių ir turi „WiFi“ryšį.

SąrankaĮspėjimas! Patikrinkite savo šalies taisykles, susijusias su namų elektros sistemos tvarkymu, ir būkite labai atsargūs, nes tai gali būti mirtina! Jei nežinote, kvieskite elektriką. Pirmasis žingsnis yra įdiegti skaitiklį į savo elektros spintelę. Kad užtikrintumėte, jog dirbate saugioje aplinkoje, išjunkite maitinimą iš elektros terminalo prieš sistemą ir dar kartą patikrinkite multimetru, ar nėra įtampos tarp gnybtų. Tada įdėkite energijos matuoklį į savo spintelę ir prijunkite įtampos ir neutralumo laidus nuo pagrindinio pertraukiklio prie skaitiklio įvesties, nepamirškite naudoti spalvų susitarimo (mėlyna - neutrali, o ruda/juoda/pilka - jei gyvenate ES). Išvestis turi būti prijungta prie likusios sistemos.

Pagrindinės įtampos jungtys. Viršuje esantys laidai yra įėjimai, anapus esantys laidai yra išėjimai.

1 žingsnis: reikalingos dalys

Reikalingos dalys
Reikalingos dalys

2 žingsnis: programinės įrangos poreikis

Programinės įrangos poreikiai
Programinės įrangos poreikiai

Programinė įranga

Paleiskite kompiuterį ir atidarykite IDE. Galite naudoti „Arduino IDE“arba „Arduino Create Editor“. Kodas atitinka šias užklausas: „Modbus“ryšys, „WiFi“valdymas MQTT protokolas „Modbus“yra atvirojo kodo protokolas pramoniniams jutikliams ir mašinoms. Norėdami, kad „Arduino“kalbėtų apie „Modbus“, mes naudosime „Arduino Modbus“biblioteką. Ši biblioteka supakuoja visus tvarkytojus ir leidžia labai greitai prijungti bet kurį „Modbus“įrenginį. Kadangi ketiname skaityti registrus, pagal skaitiklio duomenų lapą galime rasti visą mums reikalingą informaciją, pvz., Funkcijų kodus, registro adresą ir registro dydį žodžiais. Bet kad būtų aiškiau, paaiškinkime, kaip veikia „Modbus“: „Modbus“pranešimai yra paprastos struktūros: 01 03 04 00 16 00 02 25 C7 0x01yra įrenginio adresas 0x03 yra funkcijos kodas, nurodantis įrenginiui, ar norime skaityti ar rašyti duomenis *, šiuo atveju skaitykite baitų skaičiaus laikymo registrus 0x04 baitams skaičiuoti 16 16 - Siunčiame 4 baitus registro adreso (00 16), kuris nurodo įrenginiui, ką norime perskaityti 00 02- tada registro dydį (00 02) žodžiais (kiekvienas žodis yra 2 baitų ilgio) Paskutiniai 4 baitai yra CRC kodas. Šis kodas sugeneruotas iš matematinės funkcijos per ankstesnius baitus, tai užtikrina, kad pranešimas buvo priimtas teisingai.

Skaitiklio pridėjimas prie namų asistento yra gana paprastas. Darant prielaidą, kad turite sukonfigūruotą MQTT tarpininką (čia yra vadovas), viskas, ką jums reikia padaryti, yra pridėti naujus apibrėžimus prie failo configuration.yaml. jutiklis: - platforma: mqtt pavadinimas: "Pagrindinė įtampa" state_topic: "energija/pagrindinė/įtampa" unit_of_measurement: "V" Čia turite įdėti matavimo pavadinimą, skaitomą MQTT temą ir kiekio matavimo vienetą. Išsaugokite failą, patikrinkite konfigūraciją ir iš naujo įkelkite „Home Assistant“, dabar matavimai bus rodomi pagrindiniame puslapyje.

„Home Assistant“vartojimo skydelis, kuriame rodomi dabartiniai rodmenys

„Home Assistant“pasirūpins grafikų kūrimu ir automatizuos jūsų rodmenų suaktyvintus procesus. Ši pamoka baigta, dabar jūs turite pridėti funkcijų ir pritaikyti ją savo tikslams!

3 žingsnis: Surinkite

Surinkti
Surinkti
Surinkti
Surinkti

Padaryta? Atėjo laikas įsukti RS485 jungtį! Mes naudosime susuktą vienos poros kabelį su žeme, paprastai naudojamą telefono linijoms. Naudodami šį kabelį galite perduoti dideliu atstumu (1,2 km). Tačiau mes tiesiog naudojame pakankamai ilgą kabelį, kad išeitume iš spintelės ir padėtume „Arduino“prieinamoje vietoje.

„Finder RS485“jungtis

RS485 sąsaja įvardija savo terminalus A, B ir COM. Įprastas de facto standartas yra naudoti TX+/RX+ arba D+ kaip alternatyvą B (aukštas MARK, ty tuščiąja eiga), TX-/RX- arba D- kaip alternatyvą A (žemas MARK, ty tuščiosios eigos). MKR skydas taip pat palaiko „Full Duplex“, pamatysite du kitus gnybtus, Y ir Z. Čia mes užsuksime kitą kabelio galą, nes iš duomenų lapo žinome, kad pusiau dvipusis ryšys vyksta tik Y ir Z terminaluose. COM terminalas turi būti prijungtas prie ISOGND. Kadangi mes naudojame pusiau dvipusį ryšį ir kabeliai yra lygiaverčiai, mes turime nustatyti MKR485 skydo jungiklius, kad jie atitiktų mūsų sąranką: mes nustatome HALF (2 išjungta) ir nutraukimą YZ (nuo 3 iki ĮJUNGTA); pirmasis nesvarbus. Baigimas yra pasipriešinimas, jungiantis du duomenų gnybtus, siekiant slopinti trukdžius.

Tai yra. Dabar galite uždaryti spintelę ir sutelkti dėmesį į programinę įrangą!

4 žingsnis: kodas

Kodas
Kodas

#įtraukti

#include #include #include // jūsų „Wi -Fi“prisijungimo duomenys const char ssid = "**********"; const char pass = "**********";

„WiFiClient“tinklas; „MQTTClient“klientas; nepasirašytas ilgas kursas = 60000; // numatytasis atnaujinimo dažnis ms unsigned long lastMillis = 0;

// prisijungimo funkcija void connect () {Serial.print ("wifi tikrinimas …"); while (WiFi.status ()! = WL_CONNECTED) {Serial.print ("."); vėlavimas (1000); } Serial.print ("\ nprijungiamas …"); while (! client.connect ("prietaiso_pavadinimas", "vartotojo_pavadinimas", "vartotojo_pw"))) {// PAKEITIMAS, KAD PATIKRINTŲ JŪSŲ NUSTATYMUS Serial.print ("."); vėlavimas (1000); } Serial.println ("\ nprijungtas!"); client.subscribe ("energija/pagrindinis/atnaujinti"); // tema nuotoliniu būdu nustatyti atnaujinimo dažnį} // mqtt gauti atgalinio ryšio funkciją void messageReceived (String & topic, String & payload) {Serial.println ("gaunamas:" + tema + " -" + naudingoji apkrova); if (topic == "energy/main/refreshrate") {// atnaujinimo dažnio tvarkyklės rodiklis = payload.toInt ()*1000; Serial.println ("naujas tarifas"+eilutė (norma)); }}

void setup () {Serial.begin (115200); WiFi.begin (ssid, pass); while (! Serial); client.begin ("broker_ip", neto); // PAKEISTI, KAD PATIKRINTŲ JŪSŲ SĄRANKOS klientą.onMessage (messageReceived); // paleiskite „Modbus RTU“klientą, jei (! ModbusRTUClient.begin (9600)) {Serial.println ("Nepavyko paleisti„ Modbus RTU Client! "); tuo tarpu (1); }}

void loop () {client.loop (); if (! client.connected ()) {// patikrinkite tinklo ryšį connect (); } // paskelbti pranešimą po atnaujinimo (neužblokuojanti rutina) if (millis () - lastMillis> rate) {lastMillis = millis (); // padaryti visus perskaitytus skambučius float volt = readVoltage (); vėlavimas (100); float amp = readCurrent (); vėlavimas (100); dvigubas vatas = readPower (); vėlavimas (100); plūdė hz = readFreq (); vėlavimas (100); dvigubas wh = readEnergy (); // paskelbti rezultatus susijusiomis temomis client.publish ("energija/pagrindinė/įtampa", eilutė (voltas, 3)); client.publish ("energija/pagrindinė/srovė", eilutė (stiprintuvas, 3)); client.publish ("energija/pagrindinė/galia", eilutė (vatas, 3)); client.publish ("energija/pagrindinis/dažnis", eilutė (hz, 3)); client.publish ("energija/pagrindinė/energija", eilutė (wh, 3)); Serijinis atspaudas (eilutė (voltas, 3)+"V"+eilutė (stiprintuvas, 3)+"A"+eilutė (vatas, 3)+"W"); Serijinis.println (eilutė (hz, 3)+"Hz"+eilutė (wh, 3)+"kWh"); vėlavimas (100); }}

/ * „Finder Energy Meter“registrų skaitymo funkcijos * * Patikrinkite „Modbus“protokolo vadovą, kad suprastumėte kodą * https://gfinder.findernet.com/public/attachments/7E/EN/PRT_Modbus_7E_64_68_78_86EN.pdf */float readVoltage () {float voltas = 0; if (! ModbusRTUClient.requestFrom (0x01, HOLDING_REGISTERS, 0x000C, 2)) {// skambinti registrui Serial.print ("nepavyko nuskaityti įtampos!"); Serial.println (ModbusRTUClient.lastError ()); // klaidų tvarkytojas} else {uint16_t word1 = ModbusRTUClient.read (); // skaityti duomenis iš buferio uint16_t word2 = ModbusRTUClient.read (); uint32_t millivolt = word1 << 16 | žodis2; // bitų matematikos voltas = milivoltas/1000,0; } grąžinimo voltas; } float readCurrent () {float ampere = 0.; if (! ModbusRTUClient.requestFrom (0x01, HOLDING_REGISTERS, 0x0016, 2)) {Serial.print ("nepavyko perskaityti dabartinės!"); Serial.println (ModbusRTUClient.lastError ()); } else {uint16_t word1 = ModbusRTUClient.read (); uint16_t word2 = ModbusRTUClient.read (); int32_t milliamp = word1 << 16 | žodis2; amperas = miliampas/1000,0; } grąžinimo amperas; }

double readPower () {dvigubas vatas = 0.; if (! ModbusRTUClient.requestFrom (0x01, HOLDING_REGISTERS, 0x0025, 3)) {Serial.print ("nepavyko perskaityti galios!"); Serial.println (ModbusRTUClient.lastError ()); } else {uint16_t word1 = ModbusRTUClient.read (); uint16_t word2 = ModbusRTUClient.read (); uint16_t word3 = ModbusRTUClient.read (); uint64_t milivatų; jei (žodis1 >> 7 == 0) {milivatas = žodis1

Rekomenduojamas: