Съдържание:

Вашият монитор за сметки за енергия: 4 стъпки
Вашият монитор за сметки за енергия: 4 стъпки

Видео: Вашият монитор за сметки за енергия: 4 стъпки

Видео: Вашият монитор за сметки за енергия: 4 стъпки
Видео: Как да наблюдавате работата на Вашата фотоволтаична система на търговска сграда? част 4 2024, Юли
Anonim
Вашият монитор за сметки за енергия
Вашият монитор за сметки за енергия

ЗА ТОЗИ ПРОЕКТ

Ако наистина искате да направите дома си по -умен, вероятно ще искате да започнете от месечните си сметки (т.е. енергия, газ и т.н. …). Както някои казват, Добър за планетата, Портфейла и Долната линия. Хардуерът с отворен код е нашият начин да постигнем устойчивост в домашната среда! Тази идея ни накара да изградим просто и сигурно решение, лесно за интегриране с всеки софтуер за домашна автоматизация, тъй като излага данни през MQTT (в нашия случай ще ви покажем как да го интегрирате в Home Assistant).

Общ преглед

За да измерим консумацията на електрическа енергия, избрахме да използваме Finder Energy Meter, тъй като той е предназначен за използване на DIN шина и се вписва перфектно в основния шкаф на нашата къща. Хубавото на този продукт е, че той има RS485 Modbus интерфейс, стандартен индустриален комуникационен протокол, който прави разговора с Arduino наистина лесен. Всъщност Arduino пусна официален щит, MKR485 и две библиотеки за декодиране на протокола. Като дънна платка избрахме Arduino MKR WiFi 1010, тъй като той споделя форм -фактора MKR и има WiFi свързаност.

Настройка Внимание! Проверете правилата на вашата държава относно работата с електрическата система на вашия дом и бъдете изключително внимателни, защото това може да бъде смъртоносно! Ако не знаете как, обадете се на електротехник. Първата стъпка е да инсталирате глюкомера във вашия електрически шкаф. За да сте сигурни, че работите в безопасна среда, изключете захранването от електрическия терминал преди вашата система и проверете два пъти с мултиметъра дали няма напрежение между клемите. След това поставете електромера в шкафа си и свържете жици и неутрални проводници от главния прекъсвач към входа на глюкомера, не забравяйте да използвате цветовата конвенция (синьо за неутрално и кафяво/черно/сиво за живи в ЕС). Изходът трябва да бъде свързан към останалата част от системата.

Връзки за основно напрежение. Проводниците отгоре са входни, проводниците отвъд са изходи.

Стъпка 1: Необходими части

Необходими части
Необходими части

Стъпка 2: Софтуерни нужди

Софтуерни нужди
Софтуерни нужди

Софтуер

Стартирайте компютъра и отворете IDE. Можете да използвате Arduino IDE или Arduino Create Editor. Кодът отговаря на следните изисквания: Комуникация Modbus, управление на WiFi протокол MQTT Modbus е протокол с отворен код за индустриални сензори и машини. За да накараме Arduino да говори за Modbus, ще използваме библиотеката Arduino Modbus. Тази библиотека включва всички манипулатори и прави свързването на всяко устройство Modbus много бързо. Тъй като ще четем регистрите, следвайки листа с данни на измервателния уред, можем да намерим цялата необходима ни информация като кодове на функции, адрес на регистъра и размер на регистъра с думи. Но за да стане по -ясно, нека обясним как работи Modbus: Съобщенията на Modbus следват проста структура: 01 03 04 00 16 00 02 25 C7 0x01 е адресът на устройството 0x03 е функционалният код, който казва на устройството дали искаме да четем или записваме данни *, в този случай прочетете регистрите за задържане 0x04 за Byte Count00 16 - Изпращаме 4 байта адрес на регистър (00 16), който казва на устройството какво искаме да прочетем 00 02- след това размерът на регистъра (00 02) с думи (всяка дума е с дължина 2 байта) Последните 4 байта са CRC код. Този код се генерира от математическа функция през предишни байтове, което гарантира, че съобщението е получено правилно.

Интеграция на Home Assistant Добавянето на глюкомера към Home Assistant е доста лесно. Ако приемем, че имате конфигуриран брокер на MQTT (Ето ръководството), всичко, което трябва да направите, е да добавите нови дефиниции под файла configuration.yaml. сензор: - платформа: mqtt име: "Главно напрежение" state_topic: "енергия/основно/напрежение" единица_измерване: "V" Тук трябва да поставите името на измерването, темата MQTT за четене и мерната единица на количеството. Запазете файла, проверете конфигурацията и презаредете Home Assistant, сега измерванията ще се появят на главната страница.

Панел за потребление на Home Assistant, показващ текущите показания

Home Assistant ще се погрижи за създаването на графики и ще автоматизира процесите, задействани от вашите показания. Този урок приключи, сега от вас зависи да добавите функции и да го персонализирате за вашите собствени цели!

Стъпка 3: Сглобете

Съберете
Съберете
Съберете
Съберете

Свършен? Време е да завиете връзката RS485! Ще използваме усукана единична двойка кабел със земята, обикновено използвана за телефонни линии. С този кабел можете да предавате на дълги разстояния (1,2 км). Ние обаче използваме кабел достатъчно дълго, за да излезем от шкафа и да поставим Arduino на достъпно място.

Finder RS485 връзка

Интерфейсът RS485 назовава своите терминали A, B и COM. Общ стандарт фактически е използването на TX+/RX+ или D+ като алтернатива за B (висока за MARK т.е. празен ход), TX-/RX- или D- като алтернатива за A (ниска за MARK т.е. празен ход) Тъй като MKR щитът поддържа и Full Duplex, ще видите още два терминала, Y и Z. Тук ще превием другия край на кабела, тъй като от листа с данни знаем, че полудуплексната комуникация се случва само на Y и Z терминали. COM терминалът трябва да бъде свързан към ISOGND. Тъй като използваме полудуплекс връзка и тъй като кабелите са peer-to-peer, трябва да настроим превключвателите на щита MKR485, за да съответстват на нашата настройка: настройваме HALF (2 на изключено) и прекратяване на YZ (3 до НА); първото няма значение. Прекратяването е съпротивление, свързващо двата терминала за данни, за заглушаване на смущения.

Това е то. Сега можете да затворите шкафа и да се съсредоточите върху софтуерната страна!

Стъпка 4: Код

Код
Код

#включва

#include #include #include // вашите идентификационни данни за wifi const char ssid = "**********"; const char pass = "**********";

WiFiClient мрежа; MQTTClient клиент; безпътен дълъг курс = 60000; // честота на опресняване по подразбиране в ms unsigned long lastMillis = 0;

// функция за свързване void connect () {Serial.print ("проверка на wifi …"); while (WiFi.status ()! = WL_CONNECTED) {Serial.print ("."); забавяне (1000); } Serial.print ("\ nсвързване …"); while (! client.connect ("device_name", "user_name", "user_pw")) {// ПРОМЯНА ДА СЪОТВЕТСТВАТ НА ВАШИТЕ НАСТРОЙКИ Serial.print ("."); забавяне (1000); } Serial.println ("\ nсвързан!"); client.subscribe ("енергия/основно/опресняване"); // тема за задаване на честота на опресняване дистанционно} // mqtt получавам функция за обратно повикване void messageReceived (String & topic, String & payload) {Serial.println ("incoming:" + topic + " -" + payload); if (topic == "energy/main/refreshrate") {// скорост на обработка на честотата на опресняване = payload.toInt ()*1000; Serial.println ("нова скорост"+низ (скорост)); }}

void setup () {Serial.begin (115200); WiFi.begin (ssid, pass); while (! Сериен); client.begin ("broker_ip", net); // ПРОМЯНА ДА СЪОТВЕТСТВА НА ВАШАТА НАСТРОЙКА client.onMessage (messageReceived); // стартирайте клиента на Modbus RTU, ако (! ModbusRTUClient.begin (9600)) {Serial.println ("Неуспешно стартиране на Modbus RTU клиент!"); докато (1); }}

void loop () {client.loop (); if (! client.connected ()) {// проверете мрежовата връзка connect (); } // публикуване на съобщение след изминало опресняване (неблокираща рутина) if (millis () - lastMillis> rate) {lastMillis = millis (); // прави всички прочетени повиквания плаващи volt = readVoltage (); забавяне (100); float amp = readCurrent (); забавяне (100); двоен ват = readPower (); забавяне (100); float hz = readFreq (); забавяне (100); double wh = readEnergy (); // публикуване на резултати по сродни теми client.publish ("енергия/основно/напрежение", низ (волт, 3)); client.publish ("енергия/основна/ток", низ (усилвател, 3)); client.publish ("енергия/основна/мощност", низ (ват, 3)); client.publish ("енергия/основна/честота", низ (hz, 3)); client.publish ("енергия/основна/енергия", низ (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"); забавяне (100); }}

/ * Функции за четене на регистрите на измервателния уред на Finder * * Проверете ръководството за протокол modbus, за да разберете кода * https://gfinder.findernet.com/public/attachments/7E/EN/PRT_Modbus_7E_64_68_78_86EN.pdf */float readVoltage () {float волта = 0.; if (! ModbusRTUClient.requestFrom (0x01, HOLDING_REGISTERS, 0x000C, 2)) {// направете повикване към регистъра Serial.print ("неуспешно четене на напрежение!"); Serial.println (ModbusRTUClient.lastError ()); // манипулатор на грешки} else {uint16_t word1 = ModbusRTUClient.read (); // четене на данни от буфера uint16_t word2 = ModbusRTUClient.read (); uint32_t millivolt = word1 << 16 | word2; // битов математически волт = миливолта/1000.0; } възвратен волт; } float readCurrent () {float ampere = 0.; if (! ModbusRTUClient.requestFrom (0x01, HOLDING_REGISTERS, 0x0016, 2)) {Serial.print ("неуспешно четене на текущо!"); Serial.println (ModbusRTUClient.lastError ()); } else {uint16_t word1 = ModbusRTUClient.read (); uint16_t word2 = ModbusRTUClient.read (); int32_t milliamp = word1 << 16 | word2; ампер = милиампер/1000,0; } ампер за връщане; }

double readPower () {двоен ват = 0.; if (! ModbusRTUClient.requestFrom (0x01, HOLDING_REGISTERS, 0x0025, 3)) {Serial.print ("не успя да прочете мощността!"); Serial.println (ModbusRTUClient.lastError ()); } else {uint16_t word1 = ModbusRTUClient.read (); uint16_t word2 = ModbusRTUClient.read (); uint16_t word3 = ModbusRTUClient.read (); uint64_t миливат; if (word1 >> 7 == 0) {milliwatt = word1

Препоръчано: