mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-24 14:26:11 +02:00
added PR #356, prometheus endpoint thanks to @avendretter
changed default wifi IP to 192.168.4.1 (to avoid conflicts with local router configurations) added default pinout for ESP32
This commit is contained in:
parent
d0e7ee393c
commit
1d7b02571d
7 changed files with 132 additions and 25 deletions
|
@ -218,19 +218,20 @@ When everything is wired up and the firmware is flashed, it is time to connect t
|
||||||
|
|
||||||
To take control of your Ahoy DTU, you can directly call one of the following sub-pages (e.g. [http://ahoy-dtu/setup](http://ahoy-dtu/setup) or [http://192.168.1.1/setup](http://192.168.1.1/setup) ).<br/>
|
To take control of your Ahoy DTU, you can directly call one of the following sub-pages (e.g. [http://ahoy-dtu/setup](http://ahoy-dtu/setup) or [http://192.168.1.1/setup](http://192.168.1.1/setup) ).<br/>
|
||||||
|
|
||||||
| page | use | output |
|
| page | use | output | default availability |
|
||||||
| ---- | ------ | ------ |
|
| ---- | ------ | ------ | ------ |
|
||||||
| /uptime | displays the uptime of your Ahoy DTU | 0 Days, 01:37:34; now: 2022-08-21 11:13:53 |
|
| /uptime | displays the uptime uf your Ahoy DTU | 0 Days, 01:37:34; now: 2022-08-21 11:13:53 | yes |
|
||||||
| /reboot | reboots the Ahoy DTU | |
|
| /reboot | reboots the Ahoy DTU | | yes |
|
||||||
| /erase | erases the EEPROM | |
|
| /erase | erases the EEPROM | | yes |
|
||||||
| /factory | resets to the factory defaults configured in config.h | |
|
| /factory | resets to the factory defaults configured in config.h | | yes |
|
||||||
| /setup | opens the setup page | |
|
| /setup | opens the setup page | | yes |
|
||||||
| /save | | |
|
| /save | | | yes |
|
||||||
| /cmdstat | show stat from the home page | |
|
| /cmdstat | show stat from the home page | | yes |
|
||||||
| /visualization | displays the information from your converter | |
|
| /visualization | displays the information from your converter | | yes |
|
||||||
| /livedata | displays the live data | |
|
| /livedata | displays the live data | | yes |
|
||||||
| /json | gets live-data in JSON format | json output from the livedata |
|
| /json | gets live-data in JSON format | json output from the livedata | no - enable via config_override.h |
|
||||||
| /api | | |
|
| /metrics | gets live-data for prometheus | prometheus metrics from the livedata | no - enable via config_override.h |
|
||||||
|
| /api | | | yes |
|
||||||
|
|
||||||
## MQTT command to set the DTU without webinterface
|
## MQTT command to set the DTU without webinterface
|
||||||
|
|
||||||
|
|
|
@ -46,9 +46,15 @@
|
||||||
#define DEF_DEVICE_NAME "AHOY-DTU"
|
#define DEF_DEVICE_NAME "AHOY-DTU"
|
||||||
|
|
||||||
// default pinout (GPIO Number)
|
// default pinout (GPIO Number)
|
||||||
|
#if defined(ESP32)
|
||||||
#define DEF_CS_PIN 15
|
#define DEF_CS_PIN 15
|
||||||
#define DEF_CE_PIN 2
|
#define DEF_CE_PIN 2
|
||||||
#define DEF_IRQ_PIN 0
|
#define DEF_IRQ_PIN 0
|
||||||
|
#else
|
||||||
|
#define DEF_CS_PIN 5
|
||||||
|
#define DEF_CE_PIN 4
|
||||||
|
#define DEF_IRQ_PIN 16
|
||||||
|
#endif
|
||||||
#define DEF_LED0_PIN 255 // off
|
#define DEF_LED0_PIN 255 // off
|
||||||
#define DEF_LED1_PIN 255 // off
|
#define DEF_LED1_PIN 255 // off
|
||||||
|
|
||||||
|
|
|
@ -25,4 +25,12 @@
|
||||||
#undef DEF_RF24_IRQ_PIN
|
#undef DEF_RF24_IRQ_PIN
|
||||||
#define DEF_RF24_IRQ_PIN 16
|
#define DEF_RF24_IRQ_PIN 16
|
||||||
|
|
||||||
|
|
||||||
|
// To enable the json endpoint at /json
|
||||||
|
// #define ENABLE_JSON_EP
|
||||||
|
|
||||||
|
// To enable the endpoint for prometheus to scrape data from at /metrics
|
||||||
|
// #define ENABLE_PROMETHEUS_EP
|
||||||
|
|
||||||
|
|
||||||
#endif /*__CONFIG_OVERRIDE_H__*/
|
#endif /*__CONFIG_OVERRIDE_H__*/
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 5
|
#define VERSION_MINOR 5
|
||||||
#define VERSION_PATCH 33
|
#define VERSION_PATCH 34
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -68,6 +68,12 @@ void web::setup(void) {
|
||||||
mWeb->on("/live", HTTP_ANY, std::bind(&web::onLive, this, std::placeholders::_1));
|
mWeb->on("/live", HTTP_ANY, std::bind(&web::onLive, this, std::placeholders::_1));
|
||||||
mWeb->on("/api1", HTTP_POST, std::bind(&web::showWebApi, this, std::placeholders::_1));
|
mWeb->on("/api1", HTTP_POST, std::bind(&web::showWebApi, this, std::placeholders::_1));
|
||||||
|
|
||||||
|
#ifdef ENABLE_JSON_EP
|
||||||
|
mWeb->on("/json", HTTP_ANY, std::bind(&web::showJson, this, std::placeholders::_1));
|
||||||
|
#endif
|
||||||
|
#ifdef ENABLE_PROMETHEUS_EP
|
||||||
|
mWeb->on("/metrics", HTTP_ANY, std::bind(&web::showMetrics, this, std::placeholders::_1));
|
||||||
|
#endif
|
||||||
|
|
||||||
mWeb->on("/update", HTTP_GET, std::bind(&web::onUpdate, this, std::placeholders::_1));
|
mWeb->on("/update", HTTP_GET, std::bind(&web::onUpdate, this, std::placeholders::_1));
|
||||||
mWeb->on("/update", HTTP_POST, std::bind(&web::showUpdate, this, std::placeholders::_1),
|
mWeb->on("/update", HTTP_POST, std::bind(&web::showUpdate, this, std::placeholders::_1),
|
||||||
|
@ -641,3 +647,79 @@ void web::serialCb(String msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
#ifdef ENABLE_JSON_EP
|
||||||
|
void web::showJson(void) {
|
||||||
|
DPRINTLN(DBG_VERBOSE, F("web::showJson"));
|
||||||
|
String modJson;
|
||||||
|
|
||||||
|
modJson = F("{\n");
|
||||||
|
for(uint8_t id = 0; id < mMain->mSys->getNumInverters(); id++) {
|
||||||
|
Inverter<> *iv = mMain->mSys->getInverterByPos(id);
|
||||||
|
if(NULL != iv) {
|
||||||
|
char topic[40], val[25];
|
||||||
|
snprintf(topic, 30, "\"%s\": {\n", iv->name);
|
||||||
|
modJson += String(topic);
|
||||||
|
for(uint8_t i = 0; i < iv->listLen; i++) {
|
||||||
|
snprintf(topic, 40, "\t\"ch%d/%s\"", iv->assign[i].ch, iv->getFieldName(i));
|
||||||
|
snprintf(val, 25, "[%.3f, \"%s\"]", iv->getValue(i), iv->getUnit(i));
|
||||||
|
modJson += String(topic) + ": " + String(val) + F(",\n");
|
||||||
|
}
|
||||||
|
modJson += F("\t\"last_msg\": \"") + mMain->getDateTimeStr(iv->ts) + F("\"\n\t},\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
modJson += F("\"json_ts\": \"") + String(mMain->getDateTimeStr(mMain->mTimestamp)) + F("\"\n}\n");
|
||||||
|
|
||||||
|
mWeb->send(200, F("application/json"), modJson);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
#ifdef ENABLE_PROMETHEUS_EP
|
||||||
|
std::pair<String, String> web::convertToPromUnits(String shortUnit) {
|
||||||
|
|
||||||
|
if(shortUnit == "A") return {"ampere", "gauge"};
|
||||||
|
if(shortUnit == "V") return {"volt", "gauge"};
|
||||||
|
if(shortUnit == "%") return {"ratio", "gauge"};
|
||||||
|
if(shortUnit == "W") return {"watt", "gauge"};
|
||||||
|
if(shortUnit == "Wh") return {"watt_daily", "counter"};
|
||||||
|
if(shortUnit == "kWh") return {"watt_total", "counter"};
|
||||||
|
if(shortUnit == "°C") return {"celsius", "gauge"};
|
||||||
|
|
||||||
|
return {"", "gauge"};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void web::showMetrics(void) {
|
||||||
|
DPRINTLN(DBG_VERBOSE, F("web::showMetrics"));
|
||||||
|
String metrics;
|
||||||
|
char headline[80];
|
||||||
|
|
||||||
|
snprintf(headline, 80, "ahoy_solar_info{version=\"%s\",image=\"\",devicename=\"%s\"} 1", mVersion, mSysCfg->deviceName);
|
||||||
|
metrics += "# TYPE ahoy_solar_info gauge\n" + String(headline) + "\n";
|
||||||
|
|
||||||
|
for(uint8_t id = 0; id < mMain->mSys->getNumInverters(); id++) {
|
||||||
|
Inverter<> *iv = mMain->mSys->getInverterByPos(id);
|
||||||
|
if(NULL != iv) {
|
||||||
|
char type[60], topic[60], val[25];
|
||||||
|
for(uint8_t i = 0; i < iv->listLen; i++) {
|
||||||
|
uint8_t channel = iv->assign[i].ch;
|
||||||
|
if(channel == 0) {
|
||||||
|
String promUnit, promType;
|
||||||
|
std::tie(promUnit, promType) = convertToPromUnits( iv->getUnit(i) );
|
||||||
|
snprintf(type, 60, "# TYPE ahoy_solar_%s_%s %s", iv->getFieldName(i), promUnit.c_str(), promType.c_str());
|
||||||
|
snprintf(topic, 60, "ahoy_solar_%s_%s{inverter=\"%s\"}", iv->getFieldName(i), promUnit.c_str(), iv->name);
|
||||||
|
snprintf(val, 25, "%.3f", iv->getValue(i));
|
||||||
|
metrics += String(type) + "\n" + String(topic) + " " + String(val) + "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mWeb->send(200, F("text/plain"), metrics);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -33,6 +33,14 @@ class web {
|
||||||
|
|
||||||
void setProtection(bool protect);
|
void setProtection(bool protect);
|
||||||
|
|
||||||
|
|
||||||
|
void onUpdate(AsyncWebServerRequest *request);
|
||||||
|
void showUpdate(AsyncWebServerRequest *request);
|
||||||
|
void showUpdate2(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final);
|
||||||
|
|
||||||
|
void serialCb(String msg);
|
||||||
|
|
||||||
|
private:
|
||||||
void onConnect(AsyncEventSourceClient *client);
|
void onConnect(AsyncEventSourceClient *client);
|
||||||
|
|
||||||
void onIndex(AsyncWebServerRequest *request);
|
void onIndex(AsyncWebServerRequest *request);
|
||||||
|
@ -51,13 +59,6 @@ class web {
|
||||||
void onLive(AsyncWebServerRequest *request);
|
void onLive(AsyncWebServerRequest *request);
|
||||||
void showWebApi(AsyncWebServerRequest *request);
|
void showWebApi(AsyncWebServerRequest *request);
|
||||||
|
|
||||||
void onUpdate(AsyncWebServerRequest *request);
|
|
||||||
void showUpdate(AsyncWebServerRequest *request);
|
|
||||||
void showUpdate2(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final);
|
|
||||||
|
|
||||||
void serialCb(String msg);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void onSerial(AsyncWebServerRequest *request);
|
void onSerial(AsyncWebServerRequest *request);
|
||||||
void onSystem(AsyncWebServerRequest *request);
|
void onSystem(AsyncWebServerRequest *request);
|
||||||
|
|
||||||
|
@ -70,6 +71,15 @@ class web {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_JSON_EP
|
||||||
|
void showJson(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_PROMETHEUS_EP
|
||||||
|
void showMetrics(void);
|
||||||
|
std::pair<String, String> convertToPromUnits(String shortUnit);
|
||||||
|
#endif
|
||||||
|
|
||||||
AsyncWebServer *mWeb;
|
AsyncWebServer *mWeb;
|
||||||
AsyncEventSource *mEvts;
|
AsyncEventSource *mEvts;
|
||||||
bool mProtected;
|
bool mProtected;
|
||||||
|
|
|
@ -110,7 +110,7 @@ bool ahoywifi::loop(void) {
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void ahoywifi::setupAp(const char *ssid, const char *pwd) {
|
void ahoywifi::setupAp(const char *ssid, const char *pwd) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("app::setupAp"));
|
DPRINTLN(DBG_VERBOSE, F("app::setupAp"));
|
||||||
IPAddress apIp(192, 168, 1, 1);
|
IPAddress apIp(192, 168, 4, 1);
|
||||||
|
|
||||||
DPRINTLN(DBG_INFO, F("\n---------\nAP MODE\nSSID: ")
|
DPRINTLN(DBG_INFO, F("\n---------\nAP MODE\nSSID: ")
|
||||||
+ String(ssid) + F("\nPWD: ")
|
+ String(ssid) + F("\nPWD: ")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue