Skip to content

Commit

Permalink
Fix #18: Add support for Grid Power, Voltage, Power Factor, Energy an…
Browse files Browse the repository at this point in the history
…d Returned Energ from Website, HA, MQTT and REST API
  • Loading branch information
mathieucarbou committed Mar 25, 2024
1 parent 48f023b commit 8621eb3
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 6 deletions.
3 changes: 3 additions & 0 deletions include/YaSolRWebsite.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ namespace YaSolR {

Statistic _gridVoltStat = Statistic(&dashboard, "Grid Voltage");
Statistic _gridFreqStat = Statistic(&dashboard, "Grid Frequency");
Statistic _gridPowerFactorStat = Statistic(&dashboard, "Grid Power Factor");
Statistic _gridEnergyStat = Statistic(&dashboard, "Grid Energy");
Statistic _gridEnergyReturnedStat = Statistic(&dashboard, "Grid Energy Returned");

Statistic _output1SwitchCountStat = Statistic(&dashboard, "Output 1 Switch Count");
Statistic _output2SwitchCountStat = Statistic(&dashboard, "Output 2 Switch Count");
Expand Down
15 changes: 15 additions & 0 deletions lib/MycilaGrid/MycilaGrid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,18 @@ float Mycila::GridClass::getActivePower() const {
return 0;
}

float Mycila::GridClass::getActiveEnergy() const {
return _jsy != nullptr ? _jsy->getEnergy2() : 0;
}

float Mycila::GridClass::getActiveEnergyReturned() const {
return _jsy != nullptr ? _jsy->getEnergyReturned2() : 0;
}

float Mycila::GridClass::getPowerFactor() const {
return _jsy != nullptr ? _jsy->getPowerFactor2() : 0;
}

float Mycila::GridClass::getVoltage() const {
// 1. MQTT
if (!_mqttGridVoltageTopic.isEmpty() && !isMQTTGridDataExpired())
Expand All @@ -87,9 +99,12 @@ float Mycila::GridClass::getVoltage() const {
}

void Mycila::GridClass::toJson(const JsonObject& root) const {
root["energy_returned"] = getActiveEnergyReturned();
root["energy"] = getActiveEnergy();
root["frequency"] = getFrequency();
root["online"] = isConnected();
root["power"] = getActivePower();
root["power_factor"] = getPowerFactor();
root["voltage"] = getVoltage();
if (_jsy != nullptr)
_jsy->toJson(root["jsy"].to<JsonObject>());
Expand Down
3 changes: 3 additions & 0 deletions lib/MycilaGrid/MycilaGrid.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ namespace Mycila {

float getFrequency() const;
float getActivePower() const;
float getActiveEnergy() const;
float getActiveEnergyReturned() const;
float getPowerFactor() const;
float getVoltage() const;

bool isConnected() const { return getVoltage() > 0; }
Expand Down
5 changes: 5 additions & 0 deletions src/YaSolR_HADiscovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,11 @@ void YaSolR::YaSolRClass::publishHADiscovery() {
// SENSORS

Mycila::HADiscovery.publish(Mycila::HAState("grid", "Grid Electricity", "/grid/online", YASOLR_TRUE, YASOLR_FALSE, "connectivity"));
Mycila::HADiscovery.publish(Mycila::HAGauge("grid_energy", "Grid Energy", "/grid/energy", "energy", nullptr, "kWh"));
Mycila::HADiscovery.publish(Mycila::HAGauge("grid_energy_returned", "Grid Energy Returned", "/grid/energy_returned", "energy", nullptr, "kWh"));
Mycila::HADiscovery.publish(Mycila::HAGauge("grid_power", "Grid Power", "/grid/power", "power", nullptr, "W"));
Mycila::HADiscovery.publish(Mycila::HAGauge("grid_power_factor", "Grid Power Factor", "/grid/power_factor", "power_factor"));
Mycila::HADiscovery.publish(Mycila::HAGauge("grid_voltage", "Grid Voltage", "/grid/voltage", "voltage"));

Mycila::HADiscovery.publish(Mycila::HAGauge("router_energy", "Routed Energy", "/router/energy", "energy", nullptr, "kWh"));
Mycila::HADiscovery.publish(Mycila::HAGauge("router_power", "Total Routed Power", "/router/power", "power", nullptr, "W"));
Expand Down
16 changes: 10 additions & 6 deletions src/YaSolR_MQTT_Publish.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,12 @@ void YaSolR::YaSolRClass::publishMQTT() {

// grid
{
Mycila::MQTT.publish(baseTopic + "/grid/power", String(Mycila::Grid.getActivePower()));
Mycila::MQTT.publish(baseTopic + "/grid/power", String(Mycila::Grid.getActivePower(), 3));
Mycila::MQTT.publish(baseTopic + "/grid/energy", String(Mycila::Grid.getActiveEnergy(), 3));
Mycila::MQTT.publish(baseTopic + "/grid/energy_returned", String(Mycila::Grid.getActiveEnergyReturned(), 3));
Mycila::MQTT.publish(baseTopic + "/grid/power_factor", String(Mycila::Grid.getPowerFactor(), 3));
Mycila::MQTT.publish(baseTopic + "/grid/online", YASOLR_BOOL(Mycila::Grid.isConnected()));
Mycila::MQTT.publish(baseTopic + "/grid/voltage", String(Mycila::Grid.getVoltage(), 3));
}
yield();

Expand Down Expand Up @@ -78,11 +82,11 @@ void YaSolR::YaSolRClass::publishMQTT() {

// router
{
Mycila::MQTT.publish(baseTopic + "/router/energy", String(Mycila::Router.getTotalRoutedEnergy()));
Mycila::MQTT.publish(baseTopic + "/router/power_factor", String(Mycila::Router.getTotalPowerFactor()));
Mycila::MQTT.publish(baseTopic + "/router/power", String(Mycila::Router.getTotalRoutedPower()));
Mycila::MQTT.publish(baseTopic + "/router/thdi", String(Mycila::Router.getTotalTHDi()));
Mycila::MQTT.publish(baseTopic + "/router/virtual_grid_power", String(Mycila::Router.getVirtualGridPower()));
Mycila::MQTT.publish(baseTopic + "/router/energy", String(Mycila::Router.getTotalRoutedEnergy(), 3));
Mycila::MQTT.publish(baseTopic + "/router/power_factor", String(Mycila::Router.getTotalPowerFactor(), 3));
Mycila::MQTT.publish(baseTopic + "/router/power", String(Mycila::Router.getTotalRoutedPower(), 3));
Mycila::MQTT.publish(baseTopic + "/router/thdi", String(Mycila::Router.getTotalTHDi(), 3));
Mycila::MQTT.publish(baseTopic + "/router/virtual_grid_power", String(Mycila::Router.getVirtualGridPower(), 3));
}
yield();

Expand Down
3 changes: 3 additions & 0 deletions src/YaSolR_Website_Update.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ void YaSolR::WebsiteClass::_update(bool skipWebSocketPush) {
_ethMACStat.set(ESPConnect.getMACAddress(ESPConnectMode::ETH).c_str());
_gridFreqStat.set((String(Mycila::Grid.getFrequency()) + " Hz").c_str());
_gridVoltStat.set((String(Mycila::Grid.getVoltage()) + " V").c_str());
_gridPowerFactorStat.set(String(Mycila::Grid.getPowerFactor()).c_str());
_gridEnergyStat.set((String(Mycila::Grid.getActiveEnergy(), 3) + " kWh").c_str());
_gridEnergyReturnedStat.set((String(Mycila::Grid.getActiveEnergyReturned(), 3) + " kWh").c_str());
_heapMemoryUsageStat.set((String(memory.usage) + " %").c_str());
_heapMemoryUsedStat.set((String(memory.used) + " bytes").c_str());
_netModeStat.set(mode == ESPConnectMode::AP ? "AP" : (mode == ESPConnectMode::STA ? "WiFi" : (mode == ESPConnectMode::ETH ? "Ethernet" : "")));
Expand Down

0 comments on commit 8621eb3

Please sign in to comment.