Лічильник SDM630 та OpenHAB

ля вимірювання параметрів електричної мережі на мій погляд доцільно використовувати створені для цього пристрої. Одним з таких пристроїв є лічильник електричної енергії Eastron SDM630  Наскільки я знаю він не сертифікований в Україні та не є вимірювальним приладом, але для дома ніхто не заважає його використовувати (його однофазний аналог в мене нарахував на 3 кВт більше у порівнянні з лічильником від обленерго. За цей період було спожито біля 4000 кВт*ч. Вважаю що це нормальний результат, хоча він ніяк не дає можливості робити висновки на відповідність китайського лічильника нормам). SDM630 окрім рахування спожитої енергії вимірює усі основні показники як напруга, струм, потужність активна те реактивна по фазам та у цілому та інші. Отримати ці значення можна за допомогою протоколу Modbus. Знайти опис регістрів можна наприклад за цим посиланням – SDM630-Modbus_Protocol.pdf (innon.com)

Я буду отримувати параметри електромережі за допомогою Openhub. Він має підтримку протоколу Modbus. Лічильник має порт RS485 у той час як openHAB працює у віртуальному середовищі та немає ніяких фізичних портів. Для можливості легкого переносу віртуальної машини у іншу систему віртуалізації чи апаратну платформу ніякого доступу з віртуальної машини до заліза робити не будемо. Для підключення будемо використовувати TCP2RS485 Modbus gateway. Схема виходить наступна:



Для Modbus gateway використовуємо модуль на базі ESP32. ESp32 має gslnhbvre Ethernet та serial інтерфейсів що дає можливість зробити простий шлюзю Програмне забезпечення шлюзу можна знайти  за посиланням. Плата з POE модулем виглядає так:

Для отримання показників з лічильника у OpenHAB треб зробити для кожного показника окрему конфігурацію. Нам треба буде налаштувати клієнта modbus, періодичне опитування, а також things та items у термінах Modbus.

Конфігурація клієнта Modbus, опитування та речей

Для цього створbмо файл з будь-якою назвою та розширенням .things у теці things:

Bridge modbus:tcp:loc_elcnt [ host="iot-power-1.loc", port=502, id=1 ] {
	Bridge poller loc_elcnt_pooller1 [ length=6, type="input" ] {
	   Thing data loc_elcnt_pf1_voltage [ readStart="0", readValueType="float32" ]
	   Thing data loc_elcnt_pf2_voltage [ readStart="2", readValueType="float32" ]
	   Thing data loc_elcnt_pf3_voltage [ readStart="4", readValueType="float32" ]
	}
	Bridge poller loc_elcnt_pooller7 [ start="12", length=6, type="input" ] {
	   Thing data loc_elcnt_pf1_power [ readStart="12", readValueType="float32" ]
	   Thing data loc_elcnt_pf2_power [ readStart="14", readValueType="float32" ]
	   Thing data loc_elcnt_pf3_power [ readStart="16", readValueType="float32" ]
	}
	Bridge poller loc_elcnt_pooller4 [ start="224", length=2, type="input" ] {
	   Thing data loc_neutral_current [ readStart="224", readValueType="float32" ]
	}

	Bridge poller loc_elcnt_pooller5 [ start="342", length=2, type="input" ] {
	   Thing data loc_elcnt_total_power [ readStart="342", readValueType="float32" ]
	}

	Bridge poller loc_elcnt_pooller2 [ start="52", length=2, type="input" ] {
	   Thing data loc_elcnt_system_power [ readStart="52", readValueType="float32" ]
	}

	Bridge poller loc_elcnt_pooller6 [ start="6", length=6, type="input" ] {
	   Thing data loc_elcnt_pf1_current [ readStart="6", readValueType="float32" ]
	   Thing data loc_elcnt_pf2_current [ readStart="8", readValueType="float32" ]
	   Thing data loc_elcnt_pf3_current [ readStart="10", readValueType="float32" ]
	}
}

modbus:tcp:loc_elcnt [ host=”iot-power-1.loc”, port=502, id=1 ] – конфігурація Modbus клієнта за протоколом tcp та налаштування імені вузла, портe та ID.
У якості ID вказуємо ID з лічильника. Шлюз ніяк не обробляє цей параметр та може мати кілька різних пристроїв з різними ID.
Bridge poller – налаштування періодичного опитування та налаштування конвертації значень з регістрів у нормальні значення напруги, струму та іншого.

Конфігурація items

Для відображення, збереження чи ще будь яких дій при зміні показників нам треба створити такий файл з будь-яким іменем та розширенням items у теці items:

Group loc_chartPower        (Location)
Group loc_Energy            (loc_Energy)
Number loc_ENRG_PH1_VOLTAGE "Напруга фаза 1[%6.2f В]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller1:loc_elcnt_pf1_voltage:number"}
Number loc_ENRG_PH2_VOLTAGE "Напруга фаза 2[%6.2f В]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller1:loc_elcnt_pf2_voltage:number"}
Number loc_ENRG_PH3_VOLTAGE "Напруга фаза 3[%6.2f В]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller1:loc_elcnt_pf3_voltage:number"}
Number loc_ENRG_PH1_CURRENT "Струм фаза 1[%6.2f А]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller6:loc_elcnt_pf1_current:number"}
Number loc_ENRG_PH2_CURRENT "Струм фаза 2[%6.2f А]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller6:loc_elcnt_pf2_current:number"}
Number loc_ENRG_PH3_CURRENT "Струм фаза 3[%6.2f А]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller6:loc_elcnt_pf3_current:number"}
Number loc_ENRG_PH1_POWER "Потужність фаза 1[%6.2f Вт]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller7:loc_elcnt_pf1_power:number"}
Number loc_ENRG_PH2_POWER "Потужність фаза 2[%6.2f Вт]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller7:loc_elcnt_pf2_power:number"}
Number loc_ENRG_PH3_POWER "Потужність фаза 3[%6.2f Вт]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller7:loc_elcnt_pf3_power:number"}
Number loc_ENRG_SYSTEM_POWER "Потужність загальна поточна [%6.2f Вт]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller2:loc_elcnt_system_power:number"}
Number loc_ENRG_FREQ_POWER "Частота[%6.2f Hz]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller3:loc_elcnt_freq:number"}
Number loc_ENRG_NEUTRAL_CURRENT "Струм нейтралі[%6.2f А]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller4:loc_neutral_current:number"}
Number loc_ENRG_TOTAL_POWER "Загальна потужність[%6.2f кВт*ч]"  (loc_Energy,loc_chartPower) {channel="modbus:data:loc_elcnt:loc_elcnt_pooller5:loc_elcnt_total_power:number"}

 

Після цього OpenHAB буде отримувати значення усіх налаштованих параметрів з лічильника.

Для відображення можна додати таку конфігурацію у будь який sitemap:

        Frame label="Електроенергія" {
                Text item=loc_ENRG_PH1_VOLTAGE
                Text item=loc_ENRG_PH2_VOLTAGE
                Text item=loc_ENRG_PH3_VOLTAGE
                Text label="Детально" {
                                Text item=loc_ENRG_PH1_VOLTAGE
                                Text item=loc_ENRG_PH2_VOLTAGE
                                Text item=loc_ENRG_PH3_VOLTAGE
                                Text item=loc_ENRG_PH1_CURRENT
                                Text item=loc_ENRG_PH2_CURRENT
                                Text item=loc_ENRG_PH3_CURRENT
                                Text item=loc_ENRG_PH1_POWER
                                Text item=loc_ENRG_PH2_POWER
                                Text item=loc_ENRG_PH3_POWER
                                Text item=loc_ENRG_SYSTEM_POWER
                                Text item=loc_ENRG_TOTAL_POWER
                }
        }

У результаті отримаємо таке представлення:

 

детальне представлення:

 

Для збереження даних можна зробити файл з будь-якою назвою та розширенням .persist  у теці persistence :

Strategies {
    every5Seconds : "0/5 * * * * ?"
    everyMinute : "0 * * * * ?"
    everyHour   : "0 0 * * * ?"
    everyDay    : "0 0 0 * * ?"
}

Items {
        loc_chartPower* : strategy = every5Seconds
}

В мене налаштовано збереження даних у influxdb, за допомогою graphana можна легко отримати таки графіки: