Трошки актуальної автоматизації.
Вводні:
гібридний сонячний інвертор Voltronic Axpert King 2 + батарейка до нього
Проблема:
досить крива родна апа яка шле дані в китайське облако, звідки їх можна подивитися, з того шо мені 100% потрібно то поточний заряд батарейки, бо зараз дуже актуальна інформація, чи не настав час витягати генератор. Апа з одного боку працює, з іншого через раз + дружині користуватися дуже не зручно.
Не дивлячись на те шо інвертор має вайфай на борту, використовує він його, схоже, лише для облака. Бо ніяких відкритих портів не знайшлося, гугл мовчить як партизан. Але в інеті повно інструкцій як зняти з його порта всі необхідні дані, інструкції різної красноокості тому я цього разу вирішив зробити трошки інакше - я купив готове рішення під інвертор, яке крутится на малині і досить виглядає привабливим. А головне має mqtt брокер на борту. Проект тут solar-assistant.io, жодного відношення не маю, пишу про то шо знайшов.
Отже, купив я дистрибутів під малину в них на сайті, прошив малину, втикнув в інвертор через microUsb. Завелося майже одразу, виглядає досить привабливо, але то не наш путь. Включаємо в налаштуваннях mqtt брокер та погнали
Things
Bridge mqtt:broker:solar "Solar" @ "MQTT" [ host="192.168.10.60", secure=false, username="путін" password="***ло", retainMessages=false, qos=2, enableDiscovery=false,clientID="openhab34" ]
{
Thing topic SolarAssistant_Inverter_1 "SolarAssistant Inverter 1" @ "SolarAssistant" {
Channels:
Type number : grid-voltage "Grid Voltage" [
stateTopic="solar_assistant/inverter_1/grid_voltage/state",
unit="V"
]
Type number : grid-power "Grid Power" [
stateTopic="solar_assistant/inverter_1/grid_power/state",
unit="W"
]
Type number : battery-voltage "Battery Voltage" [
stateTopic="solar_assistant/inverter_1/battery_voltage/state",
unit="V"
]
}
Thing topic SolarAssistant_Total "SolarAssistant Total" @ "SolarAssistant" {
Channels:
Type number : battery-soc "Battery SOC" [
stateTopic="solar_assistant/total/battery_state_of_charge/state",
unit="%"
]
}
}
"Залізні" Items
Number:Dimensionless SA_TOTAL_BATTERYSOC "Battery [%.0f %]" {channel="mqtt:topic:solar:SolarAssistant_Total:battery-soc", expire="1m"}
Number:ElectricPotential SA_INVERTER1_GRIDVOLTAGE "Grid Voltage [%.0f V]" {channel="mqtt:topic:solar:SolarAssistant_Inverter_1:grid-voltage", expire="1m"}
Number:Power SA_INVERTER1_GRIDPOWER "Grid Power [%.0f W]" {channel="mqtt:topic:solar:SolarAssistant_Inverter_1:grid-power", expire="1m"}
Number:ElectricPotential SA_INVERTER1_BATTERYVOLTAGE "Battery Voltage [%.0f V]" {channel="mqtt:topic:solar:SolarAssistant_Inverter_1:battery-voltage", expire="1m"}
Проксі
Group ElectricityInput "Ввод електрики" <electricity> (Home, gElectricity) ["Equipment"]
Number:ElectricPotential ElectricityInput_VA "Напруга від міста A [%.0f %unit%]" <measurement> (ElectricityInput, gElectricityVoltage) ["Measurement", "Voltage"]
Number:Power ElectricityInput_PA "Споживання від міста A [%.0f W]" <measurement> (ElectricityInput, gElectricityPower) ["Measurement", "Power"]
Group ElectricityInput_Inverter "Інвертер" <solar_energy> (ElectricityInput) ["Inverter"]
Group ElectricityInput_InverterBattery "Батарея" <battery> (ElectricityInput_Inverter) ["Battery"]
Number:ElectricPotential InverterBattery_Voltage "Напруга батареї [%.1f %unit%]" <measurement> (ElectricityInput_InverterBattery) ["Measurement", "Voltage"]
Number:Dimensionless InverterBattery_SOC "Стан батареї [%.0f %]" <measurement> (ElectricityInput_InverterBattery) ["Measurement", "Level"]
Проксі правила
let proxy = require('openhab-proxy-pattern');
const v = function(value) {
if (typeof value == 'string') {
const v = parseInt(value);
return isNaN(v) ? undefined : `${v} V`;
} else return 0;
};
const p = function(value) {
if (typeof value == 'string') {
const p = parseInt(value);
return isNaN(p) ? undefined : `${p} W`;
} else return 0;
};
['A'].forEach(function(phase)
{
proxy.bind(`ElectricityInput_V${phase}`, `SA_INVERTER1_GRIDVOLTAGE`, 15).update(v);
proxy.bind(`ElectricityInput_P${phase}`, `SA_INVERTER1_GRIDPOWER`, 60).update(p);
//proxy.bind(`ElectricityInput_PF${phase}`, `Shelly_EM3_2_${phase}PF`, 60).update(pf);
});
proxy.bind('InverterBattery_Voltage', 'SA_INVERTER1_BATTERYVOLTAGE', 15).update();
proxy.bind('InverterBattery_SOC', 'SA_TOTAL_BATTERYSOC', 15).update();
Правила для телеграм-бота
const bot = require('openhab-telegram').bot("telegram:telegramBot:dovgodko");
const alerts = require('openhab-alerts');
bot
.onCommand('info', function(t) {
return '/energy Енергія' + "\n/forecast Прогноз погоди";
});
bot
.onCommand('energy', function(t) {
const battery = items.getItem('InverterBattery_SOC').state;
let message = '';
message += `Заряд батареї - <b>${battery}</b>`;
return message;
});
['Alert_ElectricityLost'].forEach(function(contact) {
alerts.contact(contact).on(function (alerts, e) {
const battery = items.getItem('InverterBattery_SOC').state;
bot.alert(e.message + `, заряд аккумулятора ${battery}`);
}, function (alerts, e) {
const battery = items.getItem('InverterBattery_SOC').state;
bot.alert(e.message + `, заряд аккумулятора ${battery}`);
});
});
В результаті, в домашньому телеграм-боті з'явилась інформація про поточний заряд батареї, плюс коли електрика зникає або вмикається - бот каже поточний стан батареї
А в графані моніторинг додатковий