Электрика
Электропитание в доме организовано по схеме резервирования одной фазы через ИБП с аккумуляторами, схема очень приятная и мне категорически нравится и всем советую, есть только у нее недостаток - если в городе пропал свет и при этом в чатике поселка никто не спросит "а где свет" то можно очень не сразу догадаться что сидишь на АКБ и что не плохо бы было выключить лишний свет и/или погасить один телевизор.
Кроме этого есть такое профзаболевание - страсть смотреть графики ). Я решил что мне нужен способ мониторить состояние электросети от города а также состояние АКБ.
Основное требование было - измерение тока токовым трансформатором а не шунтом, ставить непонятные китайские шунты в сеть дома мне кажется весьма небезопасно.
Для реализации первой задачи я пошерстил инет в поисках максимально-недорогого и при этом функционального решения, по большому счету вариантов получилось 4:
1) PZEM модули с алишечки, например PZEM-004T. Это забавная штука которая умеет мерять ток/напряжение и имеет наружу modbus. Штука правда интересная и к ее вариации я еще вернусь
2) Наши родные счетчики SmartMac D103. Я с ребятами пообщался на выставке обсудили перспективы и работу mqtt и тп задротские нюансы. Штука забавная и я в конечном итоге использовал другой их продукт но цена на конкретно D103 мне показалась абсолютно неоправданной.
3) Zwave трехфазный "счетчик" QUBINO 3-PHASE SMART METER - GOAEZMNHXD1. Штука мне на бумаге очень понравилась и я долгое время ее рассматривал как кандидата на скорую покупку. Минус и большой один - там НЕ ТТ а шунты, но по скольку это не китай и плюс это Zwave где сертификация занимает отдельную историю, я с этим фактом смирился
4) Shelly 3EM, окончательный выбор мимо которого я пройти не смог, впоследствии у меня будет еще пяток их девайсов. То редкое сочетание когда и не дорого и хорошо.
Shelly вообще и 3EM в частности.
Что это и почему, это компания (вроде как Болгария) которая делает достаточно большой спектр ооочень недорогих устройств для автоматизации домов. Самое правильное что ребята на мой взгляд сделали, это посадили по человеку ответственному за реализацию интерфейсов к опенхабу и hass, оторванных от облаков. Да у них есть свое приложение, свое облако но ребята не стали надувать сопли пузырями и рассказывать что они сейчас победят hass или openhab. Они возглавили ).
На сейчас поддержку железок Shelly в опенхаб (www.openhab.org/addons/bindings/shelly/) можно назвать идеальной, все-все железки в тч новые сразу уимеют в опенхаб прямо из коробки, суппорт реагирует и отвечает на все вопросы и активно включается в изучение проблем. В общем молодцы и ребятам пламенный привет.
Про 3EM
Это штука на дин-рейку, по ширине чуть больше 1 места, имеет 3 канала с токовыми трансформаторами и 3 канала по напряжению. Есть неий четвертый канал который по мануалу можно использовать для контроля продажи электрики в сеть но у меня почему-то он не заработал как полноценный.
Имеет вайфай и по локальной сети либо брокастами либо на прописанный хост умеет слать данные которые умеет понимать родной очень приятный бондинг в опенхабе.
Питание эта штука получает прямо по одному их входных каналов которые меряют напряжение.
Есть небольшой нюанс который характерен для моей схемы питания - поскольку у меня питание организовано через УПС то и напряжение по одной из фаз будет меряться после УПС. С-но если есть желание мониторить напряжение до УПСа и стабилизаторов на других фазах и после и при этом что-бы железки сами висели на фазе резервированной - их надо аж 3 штуки, я пока обхожусь одной но планирую именно что 3, благо цена на них вразумительная.
АКБ
Для мониторинга напряжения и тока АКБ я остановился на упомянутом выше PZEM, тут уже ТТ по очевидной причине не будет работать, только шунт. их есть несколько разных вариантов мне идеально подошел PZEM-017 с шунтом на 50А (aliexpress.ru/item/4000277396829.html?item_id=4000277396829&sku_id=10000001130795271&spm=a2g39.orderlist.0.0.61f34aa6WukF8L).
Нюансы работы с модбасом я рассмотрю в отдельном посте, пока просто учтите что бумажечка с регистрами из комплекта PZEM это то без чего у вас не ничего не получится.
К сожалению для мониторинга тока заряда/разряда АКБ необходимо врезать в 10мм2 кабель токовый шунт, кабель родной резать не хотелось и я пока меряю только напряжение АКБ, чего мне достаточно для понимания "сколько там еще осталось".
Прокси для электропитания
Group Equipment_ElectricityInverter "Інвертор" <plug> (Main, gEquipmentElectricity, gEquipmentElectricity_A) ["Inverter"]
Group Equipment_ElectricityInverterBattery "Батарея інвертора" <plug> (Equipment_ElectricityInverter) ["Battery"]
Number:ElectricPotential Equipment_ElectricityInverterBattery_Voltage "Напруга АКБ [%.2f %unit%]" <voltagea> (Equipment_ElectricityInverterBattery)
Number:ElectricCurrent Equipment_ElectricityInverterBattery_Current "Струм АКБ [%.0f %unit%]" <voltagea> (Equipment_ElectricityInverterBattery)
Group Equipment_ElectricityInput "Ввод електрики" <plug> (Main, gEquipmentElectricity) ["Equipment"]
Group:Number:AVG Equipment_ElectricityInputV "Напруга від міста [%.0f V]" <plug> (Equipment_ElectricityInput) ["Measurement", "Voltage"]
Number:ElectricPotential Equipment_ElectricityInputVA "Напруга від міста A [%.0f %unit%]" <voltagea> (Equipment_ElectricityInputV, gEquipmentElectricity_A)
Number:ElectricPotential Equipment_ElectricityInputVB "Напруга від міста B [%.0f %unit%]" <voltageb> (Equipment_ElectricityInputV, gEquipmentElectricity_B)
Number:ElectricPotential Equipment_ElectricityInputVC "Напруга від міста C [%.0f %unit%]" <voltagec> (Equipment_ElectricityInputV, gEquipmentElectricity_C)
Contact Equipment_ElectricityLostAlarm "Відсутне энергопостачання від міста [MAP(uk.map):%s]" <error> (Equipment_ElectricityInput, gAlarms) ["Alarm", "Voltage"]
Group:Number:SUM Equipment_ElectricityInputP "Споживання від міста [%.0f W]" <plug> (Equipment_ElectricityInput) ["Measurement", "Power"]
Number:Power Equipment_ElectricityInputPA "Споживання від міста A [%.0f W]" <flash> (Equipment_ElectricityInputP, gEquipmentElectricity_A)
Number:Power Equipment_ElectricityInputPB "Споживання від міста B [%.0f W]" <flash> (Equipment_ElectricityInputP, gEquipmentElectricity_B)
Number:Power Equipment_ElectricityInputPC "Споживання від міста C [%.0f W]" <flash> (Equipment_ElectricityInputP, gEquipmentElectricity_C)
Group Equipment_ElectricityHome "Живлення будинку" <plug> (Home, gEquipmentElectricity) ["Equipment"]
Group:Number:AVG Equipment_ElectricityHomeV "Напруга мережі будинку [%.0f V]" <plug> (Equipment_ElectricityHome) ["Measurement", "Voltage"]
Number:ElectricPotential Equipment_ElectricityHomeVA "Напруга будинку A [%.0f %unit%]" <voltagea> (Equipment_ElectricityHomeV, Equipment_ElectricityInverter, gEquipmentElectricity_A)
Number:ElectricPotential Equipment_ElectricityHomeVB "Напруга будинку B [%.0f %unit%]" <voltageb> (Equipment_ElectricityHomeV, gEquipmentElectricity_B)
Number:ElectricPotential Equipment_ElectricityHomeVC "Напруга будинку C [%.0f %unit%]" <voltagec> (Equipment_ElectricityHomeV, gEquipmentElectricity_C)
Group:Number:SUM Equipment_ElectricityHomeP "Споживання мережі будинку [%.0f W]" <plug> (Equipment_ElectricityHome) ["Measurement", "Power"]
Number:Power Equipment_ElectricityHomePA "Споживання будинку A [%.0f W]" <flash> (Equipment_ElectricityHomeP, Equipment_ElectricityInverter, gEquipmentElectricity_A)
Number:Power Equipment_ElectricityHomePB "Споживання будинку B [%.0f W]" <flash> (Equipment_ElectricityHomeP, gEquipmentElectricity_B)
Number:Power Equipment_ElectricityHomePC "Споживання будинку C [%.0f W]" <flash> (Equipment_ElectricityHomeP, gEquipmentElectricity_C)
Железо Shelly
Number:Power Shelly_EM3_2_APower "A [%.1f W]" {channel="shelly:shellyem3:####:meter1#currentWatts", expire="5m"}
Number:Power Shelly_EM3_2_BPower "B [%.1f W]" {channel="shelly:shellyem3:####:meter2#currentWatts", expire="5m"}
Number:Power Shelly_EM3_2_CPower "C [%.1f W]" {channel="shelly:shellyem3:####:meter3#currentWatts", expire="5m"}
Number:ElectricPotential Shelly_EM3_2_AVoltage "A [%d V]" {channel="shelly:shellyem3:####:meter1#voltage", expire="5m"}
Number:ElectricPotential Shelly_EM3_2_BVoltage "B [%d V]" {channel="shelly:shellyem3:####:meter2#voltage", expire="5m"}
Number:ElectricPotential Shelly_EM3_2_CVoltage "C [%d V]" {channel="shelly:shellyem3:####:meter3#voltage", expire="5m"}
Железо PZEM
Bridge modbus:serial:PZEM_1 [ port="/dev/usbHL340", id=1, baud=9600, stopBits="2.0", parity="none",dataBits=8,enableDiscovery=true,encoding="rtu" ] {
Bridge poller holding [ start=0, length=8, refresh=1000, type="input" ] {
Thing data voltage [ readStart="0", readValueType="uint16" ]
Thing data current [ readStart="1", readValueType="uint16" ]
}
}
Number:ElectricPotential PZEM_1_Voltage "Voltage [%d V]" {channel="modbus:data:PZEM_1:holding:voltage:number", expire="5m"}
Прокси-правила (кусок), тут очень красноречивый пример, когда
1) железка отдает напряжение в сотых вольта, а виртуальная железка уже оперирует "нормальными" вольтами
2) пока у меня нет стабилизаторов и только одна EM3 я считаю что она у меня снимает напряжение и до и после несуществующих стабов, но виртуальная инфраструктура заложена по максималкам и на вырост.
ule "Equipment_ElectricityInverterBattery_Voltage update"
when
Item PZEM_1_Voltage received update
or
System started
then
if (PZEM_1_Voltage.state != UNDEF) {
val v = PZEM_1_Voltage.state as Number
var Number value = 0|V;
if (v > 0) {
value = v/100;
}
Equipment_ElectricityInverterBattery_Voltage.postUpdate(value)
} else Equipment_ElectricityInverterBattery_Voltage.postUpdate(UNDEF)
end
rule "Equipment_ElectricityHome A update"
when
Item Shelly_EM3_2_AVoltage received update
or Item Shelly_EM3_2_APower received update
or System started
then
if (Shelly_EM3_2_AVoltage.state != UNDEF) {
val v = Shelly_EM3_2_AVoltage.state as Number
Equipment_ElectricityHomeVA.postUpdate(v)
Equipment_ElectricityInputVA.postUpdate(v)
val w = Shelly_EM3_2_APower.state as Number
Equipment_ElectricityHomePA.postUpdate(w)
Equipment_ElectricityInputPA.postUpdate(w)
} else {
Equipment_ElectricityHomeVA.postUpdate(UNDEF)
Equipment_ElectricityHomePA.postUpdate(UNDEF)
Equipment_ElectricityInputVA.postUpdate(UNDEF)
Equipment_ElectricityInputPA.postUpdate(UNDEF)
}
end
Зачем это все городилось:
rule "Equipment_ElectricityHome lost"
when
Item Equipment_ElectricityHomeVC received update // мониторим фазу С потому как A на ИБП
or Time cron "0 0/1 * * * ?"
or System started
then
if (Equipment_ElectricityHomeVC.state == UNDEF) {
// что-то поломалось
} else if (Equipment_ElectricityHomeVC.state < 100|V) { // напряжение меньше 100В = нет электрики
Main_NotifyMessage.sendCommand("Відсутне энергопостачання від міста")
} else {
Main_NotifyMessage.sendCommand("Відновлено энергопостачання від міста")
}
end
Тут обращаю внимание на маленьку грабельку - когда по фазе напряжения нет то шелли показывает некий потенциал до пару вольт, скорее всего это просто наводка от зарезервированной фазы, потому проверять в правиле напряжение на "ровно 0" нельзя, я этот момент достаточно долго не мог осознать и не догонял почему правило не срабатывает.
Ну и конечно если у вас питание не зарезервировано то все не так весело.
Чуть ранее я писал про пользу интеграции influx с openhab, пришло всемя показать как это все работает. Поскольку все метрики выше собираются и хранятся то статистика доступна к просмотру и анализу, что очень бывает удобно для понимания "че вообще происходит", "сколько купить АКБ", "какой мощности нужен генератор" и тп насущные вопросы. Я не буду тут рассказывать как рисовать графики в графане, это все разжевано в документации и кроме того очень сильно отличается между версиями 1 и 2.
Чего нет но надо доделать
1) Уведомление о низком напряжении АКБ, тут в планах просто считать если среднее напряжение за последние n-минут меньше некоего то алярм
2) Еще двух 3EM для полноценного и честного обмера 6 каналов и бесперебойным питанием
3) Чисто теоретически есть в планах добавить обсчет "оставшегося времени по текущей нагрузке", но это уже когда совсем будет скучно