Sync to original project

This commit is contained in:
Carsten Schmiemann 2022-11-06 02:40:10 +01:00
parent 8bbf09ffc5
commit 949affec1f
14 changed files with 388 additions and 80 deletions

View File

@ -753,7 +753,7 @@ void OvmsLocations::UpdatedVehicleOn(OvmsMetric* metric)
void OvmsLocations::UpdateParkPosition() void OvmsLocations::UpdateParkPosition()
{ {
OvmsRecMutexLock lock(&m_park_lock); OvmsRecMutexLock lock(&m_park_lock);
bool caron = StdMetrics.ms_v_env_on->AsBool(); bool caron = StdMetrics.ms_v_env_on->AsBool();
if (caron) if (caron)
{ {

View File

@ -288,7 +288,7 @@ void ota_flash_http(int verbosity, OvmsWriter* writer, OvmsCommand* cmd, int arg
url = MyConfig.GetParamValue("ota","server"); url = MyConfig.GetParamValue("ota","server");
if (url.empty()) if (url.empty())
url = "ovms-ota.bit-cloud.de"; url = "api.openvehicles.com/firmware/ota";
url.append("/"); url.append("/");
url.append(GetOVMSProduct()); url.append(GetOVMSProduct());
@ -830,7 +830,7 @@ void OvmsOTA::GetStatus(ota_info& info, bool check_update /*=true*/)
std::string tag = MyConfig.GetParamValue("ota","tag"); std::string tag = MyConfig.GetParamValue("ota","tag");
std::string url = MyConfig.GetParamValue("ota","server"); std::string url = MyConfig.GetParamValue("ota","server");
if (url.empty()) if (url.empty())
url = "ovms-ota.bit-cloud.de"; url = "api.openvehicles.com/firmware/ota";
url.append("/"); url.append("/");
url.append(GetOVMSProduct()); url.append(GetOVMSProduct());
url.append("/"); url.append("/");
@ -1029,7 +1029,7 @@ bool OvmsOTA::AutoFlash(bool force)
std::string tag = MyConfig.GetParamValue("ota","tag"); std::string tag = MyConfig.GetParamValue("ota","tag");
std::string url = MyConfig.GetParamValue("ota","server"); std::string url = MyConfig.GetParamValue("ota","server");
if (url.empty()) if (url.empty())
url = "ovms-ota.bit-cloud.de"; url = "api.openvehicles.com/firmware/ota";
url.append("/"); url.append("/");
url.append(GetOVMSProduct()); url.append(GetOVMSProduct());

View File

@ -282,14 +282,133 @@ void OvmsServerV3::TransmitModifiedMetrics()
if (!m_mgconn) if (!m_mgconn)
return; return;
OvmsMetric* metric = MyMetrics.m_first; if (StandardMetrics.ms_v_bat_soc->IsModifiedAndClear(MyOvmsServerV3Modifier))
while (metric != NULL)
{ {
if (metric->IsModifiedAndClear(MyOvmsServerV3Modifier)) TransmitMetric(StandardMetrics.ms_v_bat_soc);
{ }
TransmitMetric(metric); if (StandardMetrics.ms_v_charge_voltage->IsModifiedAndClear(MyOvmsServerV3Modifier))
} {
metric = metric->m_next; TransmitMetric(StandardMetrics.ms_v_charge_voltage);
}
if (StandardMetrics.ms_v_charge_current->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_current);
}
if (StandardMetrics.ms_v_charge_state->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_state);
}
if (StandardMetrics.ms_v_charge_substate->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_substate);
}
if (StandardMetrics.ms_v_charge_mode->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_mode);
}
if (StandardMetrics.ms_v_bat_range_ideal->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_bat_range_ideal);
}
if (StandardMetrics.ms_v_bat_range_est->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_bat_range_est);
}
if (StandardMetrics.ms_v_charge_climit->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_climit);
}
if (StandardMetrics.ms_v_charge_kwh->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_kwh);
}
if (StandardMetrics.ms_v_charge_timermode->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_timermode);
}
if (StandardMetrics.ms_v_charge_timerstart->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_timerstart);
}
if (StandardMetrics.ms_v_bat_cac->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_bat_cac);
}
if (StandardMetrics.ms_v_charge_duration_full->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_duration_full);
}
if (StandardMetrics.ms_v_charge_duration_range->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_duration_range);
}
if (StandardMetrics.ms_v_charge_duration_soc->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_duration_soc);
}
if (StandardMetrics.ms_v_charge_inprogress->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_inprogress);
}
if (StandardMetrics.ms_v_charge_limit_range->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_limit_range);
}
if (StandardMetrics.ms_v_charge_limit_soc->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_limit_soc);
}
if (StandardMetrics.ms_v_env_cooling->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_env_cooling);
}
if (StandardMetrics.ms_v_bat_range_full->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_bat_range_full);
}
if (StandardMetrics.ms_v_bat_power->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_bat_power);
}
if (StandardMetrics.ms_v_bat_voltage->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_bat_voltage);
}
if (StandardMetrics.ms_v_bat_soh->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_bat_soh);
}
if (StandardMetrics.ms_v_charge_power->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_power);
}
if (StandardMetrics.ms_v_charge_efficiency->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_charge_efficiency);
}
if (StandardMetrics.ms_v_bat_current->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_bat_current);
}
if (StandardMetrics.ms_v_bat_range_speed->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_bat_range_speed);
}
if (StandardMetrics.ms_v_tpms_pressure->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_tpms_pressure);
}
if (StandardMetrics.ms_v_tpms_temp->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_tpms_temp);
}
if (StandardMetrics.ms_v_tpms_health->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_tpms_health);
}
if (StandardMetrics.ms_v_tpms_alert->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(StandardMetrics.ms_v_tpms_alert);
} }
} }
@ -748,13 +867,25 @@ void OvmsServerV3::MetricModified(OvmsMetric* metric)
{ {
if (!StandardMetrics.ms_s_v3_connected->AsBool()) return; if (!StandardMetrics.ms_s_v3_connected->AsBool()) return;
if (m_streaming) int now = StandardMetrics.ms_m_monotonic->AsInt();
//ESP_LOGD(TAG, "now: %d, m_lasttx_stream: %d, m_streaming: %d", now, m_lasttx_stream, m_streaming);
if (StandardMetrics.ms_v_env_on->AsBool() && m_streaming && now > m_lasttx_stream+m_streaming)
{ {
OvmsMutexLock mg(&m_mgconn_mutex); OvmsMutexLock mg(&m_mgconn_mutex);
if (!m_mgconn) if (!m_mgconn)
return; return;
metric->ClearModified(MyOvmsServerV3Modifier); //metric->ClearModified(MyOvmsServerV3Modifier);
TransmitMetric(metric);
while (metric != NULL)
{
if (metric->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(metric);
}
metric = metric->m_next;
}
//TransmitMetric(metric);
m_lasttx_stream = now;
} }
} }
@ -817,13 +948,22 @@ void OvmsServerV3::EventListener(std::string event, void* data)
*/ */
void OvmsServerV3::ConfigChanged(OvmsConfigParam* param) void OvmsServerV3::ConfigChanged(OvmsConfigParam* param)
{ {
ESP_LOGD(TAG, "--- ConfigChanged ---");
m_streaming = MyConfig.GetParamValueInt("vehicle", "stream", 0); m_streaming = MyConfig.GetParamValueInt("vehicle", "stream", 0);
ESP_LOGD(TAG, "m_streaming: %d", m_streaming);
m_updatetime_connected = MyConfig.GetParamValueInt("server.v3", "updatetime.connected", 60); m_updatetime_connected = MyConfig.GetParamValueInt("server.v3", "updatetime.connected", 60);
ESP_LOGD(TAG, "m_updatetime_connected: %d", m_updatetime_connected);
m_updatetime_idle = MyConfig.GetParamValueInt("server.v3", "updatetime.idle", 600); m_updatetime_idle = MyConfig.GetParamValueInt("server.v3", "updatetime.idle", 600);
ESP_LOGD(TAG, "m_updatetime_idle: %d", m_updatetime_idle);
m_updatetime_awake = MyConfig.GetParamValueInt("server.v3", "updatetime.awake", m_updatetime_idle); m_updatetime_awake = MyConfig.GetParamValueInt("server.v3", "updatetime.awake", m_updatetime_idle);
ESP_LOGD(TAG, "m_updatetime_awake: %d", m_updatetime_awake);
m_updatetime_on = MyConfig.GetParamValueInt("server.v3", "updatetime.on", m_updatetime_idle); m_updatetime_on = MyConfig.GetParamValueInt("server.v3", "updatetime.on", m_updatetime_idle);
ESP_LOGD(TAG, "m_updatetime_on: %d", m_updatetime_on);
m_updatetime_charging = MyConfig.GetParamValueInt("server.v3", "updatetime.charging", m_updatetime_idle); m_updatetime_charging = MyConfig.GetParamValueInt("server.v3", "updatetime.charging", m_updatetime_idle);
ESP_LOGD(TAG, "m_updatetime_charging: %d", m_updatetime_charging);
m_updatetime_sendall = MyConfig.GetParamValueInt("server.v3", "updatetime.sendall", 0); m_updatetime_sendall = MyConfig.GetParamValueInt("server.v3", "updatetime.sendall", 0);
ESP_LOGD(TAG, "m_updatetime_sendall: %d", m_updatetime_sendall);
ESP_LOGD(TAG, "--- ConfigChanged ---");
} }
void OvmsServerV3::NetUp(std::string event, void* data) void OvmsServerV3::NetUp(std::string event, void* data)
@ -929,12 +1069,55 @@ void OvmsServerV3::Ticker1(std::string event, void* data)
} }
else if ((m_lasttx==0)||(now>(m_lasttx+next))) else if ((m_lasttx==0)||(now>(m_lasttx+next)))
{ {
ESP_LOGD(TAG, "m_lasttx: %d next: %d, now: %d", m_lasttx, next, now);
ESP_LOGD(TAG, "m_updatetime_connected: %d m_updatetime_on: %d, m_updatetime_charging: %d", m_updatetime_connected, m_updatetime_on, m_updatetime_charging);
ESP_LOGD(TAG, "m_updatetime_awake: %d ", m_updatetime_awake);
TransmitModifiedMetrics(); TransmitModifiedMetrics();
m_lasttx = m_lasttx_stream = now; m_lasttx = m_lasttx_stream = now;
} }
else if (m_streaming && caron && m_peers && now > m_lasttx_stream+m_streaming) else if (m_streaming && caron && m_peers && now > m_lasttx_stream+m_streaming)
{ {
// TODO: transmit streaming metrics //Transmit important metrics while streaming
bool modified =
StandardMetrics.ms_v_pos_latitude->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_longitude->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_direction->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_altitude->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_gpslock->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_gpssq->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_gpsmode->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_gpshdop->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_satcount->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_gpsspeed->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_pos_speed->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_env_drivemode->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_bat_power->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_bat_energy_used->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_bat_energy_recd->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_inv_power->IsModifiedAndClear(MyOvmsServerV3Modifier) |
StandardMetrics.ms_v_inv_efficiency->IsModifiedAndClear(MyOvmsServerV3Modifier);
// Quick exit if nothing modified
if ((!modified)) return;
TransmitMetric(StandardMetrics.ms_v_pos_latitude);
TransmitMetric(StandardMetrics.ms_v_pos_longitude);
TransmitMetric(StandardMetrics.ms_v_pos_direction);
TransmitMetric(StandardMetrics.ms_v_pos_altitude);
TransmitMetric(StandardMetrics.ms_v_pos_gpslock);
TransmitMetric(StandardMetrics.ms_v_pos_gpssq);
TransmitMetric(StandardMetrics.ms_v_pos_gpsmode);
TransmitMetric(StandardMetrics.ms_v_pos_gpshdop);
TransmitMetric(StandardMetrics.ms_v_pos_satcount);
TransmitMetric(StandardMetrics.ms_v_pos_gpsspeed);
TransmitMetric(StandardMetrics.ms_v_pos_speed);
TransmitMetric(StandardMetrics.ms_v_env_drivemode);
TransmitMetric(StandardMetrics.ms_v_bat_power);
TransmitMetric(StandardMetrics.ms_v_bat_energy_used);
TransmitMetric(StandardMetrics.ms_v_bat_energy_recd);
TransmitMetric(StandardMetrics.ms_v_inv_power);
TransmitMetric(StandardMetrics.ms_v_inv_efficiency);
m_lasttx_stream = now; m_lasttx_stream = now;
} }
} }

View File

@ -11,5 +11,5 @@ ifdef CONFIG_MG_ENABLE_SSL
COMPONENT_SRCDIRS := src COMPONENT_SRCDIRS := src
COMPONENT_ADD_INCLUDEDIRS := src COMPONENT_ADD_INCLUDEDIRS := src
COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
COMPONENT_EMBED_FILES := trustedca/usertrust.crt trustedca/digicert_global.crt trustedca/starfield_class2.crt trustedca/baltimore_cybertrust.crt trustedca/isrg_x1.crt trustedca/ovms_ca.crt COMPONENT_EMBED_FILES := trustedca/usertrust.crt trustedca/digicert_global.crt trustedca/starfield_class2.crt trustedca/baltimore_cybertrust.crt trustedca/isrg_x1.crt
endif endif

View File

@ -164,10 +164,6 @@ void OvmsTLS::Reload()
extern const unsigned char isrg_x1_end[] asm("_binary_isrg_x1_crt_end"); extern const unsigned char isrg_x1_end[] asm("_binary_isrg_x1_crt_end");
m_trustlist["ISRG X1 CA"] = new OvmsTrustedCert(isrg_x1, isrg_x1_end - isrg_x1); m_trustlist["ISRG X1 CA"] = new OvmsTrustedCert(isrg_x1, isrg_x1_end - isrg_x1);
extern const unsigned char ovms_ca[] asm("_binary_ovms_ca_crt_start");
extern const unsigned char ovms_ca_end[] asm("_binary_ovms_ca_crt_end");
m_trustlist["OVMS Bit-Cloud.de CA"] = new OvmsTrustedCert(ovms_ca, ovms_ca_end - ovms_ca);
// Add trusted certs on disk (/store/trustedca) // Add trusted certs on disk (/store/trustedca)
DIR *dir; DIR *dir;
struct dirent *dp; struct dirent *dp;

View File

@ -158,3 +158,4 @@ Also keep in mind, not all deviations may be caused by actual battery
issues. Voltage and temperature sensors can lose their calibration or issues. Voltage and temperature sensors can lose their calibration or
become defective as well. become defective as well.

View File

@ -1406,7 +1406,6 @@ void OvmsWebServer::HandleCfgServerV2(PageEntry_t& p, PageContext_t& c)
c.input_text("Server", "server", server.c_str(), "Enter host name or IP address", c.input_text("Server", "server", server.c_str(), "Enter host name or IP address",
"<p>Public OVMS V2 servers:</p>" "<p>Public OVMS V2 servers:</p>"
"<ul>" "<ul>"
"<li><code>ovms-server.bit-cloud.de</code> <a href=\"https://ovms.bit-cloud.de/user/register\" target=\"_blank\">Registration</a></li>"
"<li><code>api.openvehicles.com</code> <a href=\"https://www.openvehicles.com/user/register\" target=\"_blank\">Registration</a></li>" "<li><code>api.openvehicles.com</code> <a href=\"https://www.openvehicles.com/user/register\" target=\"_blank\">Registration</a></li>"
"<li><code>ovms.dexters-web.de</code> <a href=\"https://dexters-web.de/?action=NewAccount\" target=\"_blank\">Registration</a></li>" "<li><code>ovms.dexters-web.de</code> <a href=\"https://dexters-web.de/?action=NewAccount\" target=\"_blank\">Registration</a></li>"
"</ul>"); "</ul>");
@ -2650,7 +2649,6 @@ void OvmsWebServer::HandleCfgFirmware(PageEntry_t& p, PageContext_t& c)
"<p>Automatic updates are normally only done if a wifi connection is available at the time. Before allowing updates via modem, be aware a single firmware image has a size of around 3 MB, which may lead to additional costs on your data plan.</p>"); "<p>Automatic updates are normally only done if a wifi connection is available at the time. Before allowing updates via modem, be aware a single firmware image has a size of around 3 MB, which may lead to additional costs on your data plan.</p>");
c.print( c.print(
"<datalist id=\"server-list\">" "<datalist id=\"server-list\">"
"<option value=\"https://ovms-ota.bit-cloud.de\">"
"<option value=\"https://api.openvehicles.com/firmware/ota\">" "<option value=\"https://api.openvehicles.com/firmware/ota\">"
"<option value=\"https://ovms.dexters-web.de/firmware/ota\">" "<option value=\"https://ovms.dexters-web.de/firmware/ota\">"
"</datalist>" "</datalist>"
@ -2661,7 +2659,7 @@ void OvmsWebServer::HandleCfgFirmware(PageEntry_t& p, PageContext_t& c)
"</datalist>" "</datalist>"
); );
c.input_text("Update server", "server", server.c_str(), "Specify or select from list (clear to see all options)", c.input_text("Update server", "server", server.c_str(), "Specify or select from list (clear to see all options)",
"<p>Default is <code>https://ovms-ota.bit-cloud.de</code>.</p>", "<p>Default is <code>https://api.openvehicles.com/firmware/ota</code>.</p>",
"list=\"server-list\""); "list=\"server-list\"");
c.input_text("Version tag", "tag", tag.c_str(), "Specify or select from list (clear to see all options)", c.input_text("Version tag", "tag", tag.c_str(), "Specify or select from list (clear to see all options)",
"<p>Default is <code>main</code> for standard releases. Use <code>eap</code> (early access program) for stable or <code>edge</code> for bleeding edge developer builds.</p>", "<p>Default is <code>main</code> for standard releases. Use <code>eap</code> (early access program) for stable or <code>edge</code> for bleeding edge developer builds.</p>",

View File

@ -749,7 +749,7 @@ std::string OvmsWebServer::CfgInit3(PageEntry_t& p, PageContext_t& c, std::strin
if (server.empty()) if (server.empty())
server = MyConfig.GetParamValue("ota", "server"); server = MyConfig.GetParamValue("ota", "server");
if (server.empty()) if (server.empty())
server = "https://ovms-ota.bit-cloud.de"; server = "https://api.openvehicles.com/firmware/ota";
MyOTA.GetStatus(info, true); MyOTA.GetStatus(info, true);
@ -843,8 +843,6 @@ std::string OvmsWebServer::CfgInit3(PageEntry_t& p, PageContext_t& c, std::strin
c.panel_start("primary", "Step 3/5: Update Firmware"); c.panel_start("primary", "Step 3/5: Update Firmware");
c.form_start(p.uri); c.form_start(p.uri);
c.input_radio_start("Update server", "server"); c.input_radio_start("Update server", "server");
c.input_radio_option("server", "Europe, Germany (ovms-ota.bit-cloud.de)",
"https://ovms-ota.bit-cloud.de" , server == "https://ovms-ota.bit-cloud.de");
c.input_radio_option("server", "Asia-Pacific (openvehicles.com)", c.input_radio_option("server", "Asia-Pacific (openvehicles.com)",
"https://api.openvehicles.com/firmware/ota" , server == "https://api.openvehicles.com/firmware/ota"); "https://api.openvehicles.com/firmware/ota" , server == "https://api.openvehicles.com/firmware/ota");
c.input_radio_option("server", "Europe (dexters-web.de)", c.input_radio_option("server", "Europe (dexters-web.de)",
@ -952,10 +950,10 @@ std::string OvmsWebServer::CfgInit4(PageEntry_t& p, PageContext_t& c, std::strin
// default data server = ota server: // default data server = ota server:
if (server.empty()) { if (server.empty()) {
server = MyConfig.GetParamValue("ota", "server"); server = MyConfig.GetParamValue("ota", "server");
if (startsWith(server, "ovms-ota.bit-cloud.de")) if (startsWith(server, "ovms.dexters-web.de"))
server = "ovms-server.bit-cloud.de";
else
server = "ovms.dexters-web.de"; server = "ovms.dexters-web.de";
else
server = "api.openvehicles.com";
} }
} }
@ -1036,9 +1034,6 @@ std::string OvmsWebServer::CfgInit4(PageEntry_t& p, PageContext_t& c, std::strin
c.input_radio_start("OVMS data server", "server"); c.input_radio_start("OVMS data server", "server");
c.input_radio_option("server", "No server connection", "" , server == ""); c.input_radio_option("server", "No server connection", "" , server == "");
c.input_radio_option("server",
"Europe, Germany (ovms-server.bit-cloud.de) <a href=\"https://ovms.bit-cloud.de/user/register\" target=\"_blank\">Registration</a>",
"ovms-server.bit-cloud.de" , server == "ovms-server.bit-cloud.de");
c.input_radio_option("server", c.input_radio_option("server",
"Asia-Pacific (openvehicles.com) <a href=\"https://www.openvehicles.com/user/register\" target=\"_blank\">Registration</a>", "Asia-Pacific (openvehicles.com) <a href=\"https://www.openvehicles.com/user/register\" target=\"_blank\">Registration</a>",
"api.openvehicles.com" , server == "api.openvehicles.com"); "api.openvehicles.com" , server == "api.openvehicles.com");

View File

@ -90,6 +90,8 @@ OvmsVehicleFactory::OvmsVehicleFactory()
OvmsCommand* cmd_bms = MyCommandApp.RegisterCommand("bms","BMS framework", bms_status, "", 0, 0, false); OvmsCommand* cmd_bms = MyCommandApp.RegisterCommand("bms","BMS framework", bms_status, "", 0, 0, false);
cmd_bms->RegisterCommand("status","Show BMS status",bms_status); cmd_bms->RegisterCommand("status","Show BMS status",bms_status);
cmd_bms->RegisterCommand("temp","Show BMS temperature status",bms_status);
cmd_bms->RegisterCommand("volt","Show BMS voltage status",bms_status);
cmd_bms->RegisterCommand("reset","Reset BMS statistics",bms_reset); cmd_bms->RegisterCommand("reset","Reset BMS statistics",bms_reset);
cmd_bms->RegisterCommand("alerts","Show BMS alerts",bms_alerts); cmd_bms->RegisterCommand("alerts","Show BMS alerts",bms_alerts);

View File

@ -155,6 +155,8 @@ struct DashboardConfig;
#define VEHICLE_POLL_TYPE_OBDIIGROUP 0x21 // Custom: Read data by 8 bit PID #define VEHICLE_POLL_TYPE_OBDIIGROUP 0x21 // Custom: Read data by 8 bit PID
#define VEHICLE_POLL_TYPE_OBDII_32 0x32 // Custom: VW routine control extension (8 bit PID) #define VEHICLE_POLL_TYPE_OBDII_32 0x32 // Custom: VW routine control extension (8 bit PID)
#define VEHICLE_OBD_BROADCAST_MODULE_TX 0x7df
#define VEHICLE_OBD_BROADCAST_MODULE_RX 0x0
// A note on "PID" and their sizes here: // A note on "PID" and their sizes here:
// By "PID" for the service types we mean the part of the request parameters // By "PID" for the service types we mean the part of the request parameters
// after the service type that is reflected in _every_ valid response to the request. // after the service type that is reflected in _every_ valid response to the request.
@ -479,6 +481,12 @@ class OvmsVehicle : public InternalRamAllocated
Range = 3, Range = 3,
Performance = 4 Performance = 4
} vehicle_mode_t; } vehicle_mode_t;
enum class vehicle_bms_status_t
{
Both,
Voltage,
Temperature
};
public: public:
vehicle_mode_t VehicleModeKey(const std::string code); vehicle_mode_t VehicleModeKey(const std::string code);
@ -694,7 +702,7 @@ class OvmsVehicle : public InternalRamAllocated
void BmsGetCellDefaultThresholdsVoltage(float* warn, float* alert, float* maxgrad=NULL, float* maxsddev=NULL); void BmsGetCellDefaultThresholdsVoltage(float* warn, float* alert, float* maxgrad=NULL, float* maxsddev=NULL);
void BmsGetCellDefaultThresholdsTemperature(float* warn, float* alert); void BmsGetCellDefaultThresholdsTemperature(float* warn, float* alert);
void BmsResetCellStats(); void BmsResetCellStats();
virtual void BmsStatus(int verbosity, OvmsWriter* writer); virtual void BmsStatus(int verbosity, OvmsWriter* writer, vehicle_bms_status_t statusmode);
virtual bool FormatBmsAlerts(int verbosity, OvmsWriter* writer, bool show_warnings); virtual bool FormatBmsAlerts(int verbosity, OvmsWriter* writer, bool show_warnings);
bool BmsCheckChangeCellArrangementVoltage(int readings, int readingspermodule = 0); bool BmsCheckChangeCellArrangementVoltage(int readings, int readingspermodule = 0);
bool BmsCheckChangeCellArrangementTemperature(int readings, int readingspermodule = 0); bool BmsCheckChangeCellArrangementTemperature(int readings, int readingspermodule = 0);

View File

@ -550,13 +550,59 @@ void OvmsVehicle::BmsResetCellStats()
BmsResetCellTemperatures(false); BmsResetCellTemperatures(false);
} }
void OvmsVehicle::BmsStatus(int verbosity, OvmsWriter* writer) template<typename INT>
INT round_up_div(INT value, INT divis)
{ {
return (value + divis -1) / divis;
}
void OvmsVehicle::BmsStatus(int verbosity, OvmsWriter* writer, vehicle_bms_status_t statusmode)
{
auto check_max_cols = [](int total_cols, int maximum)
{
if (maximum <= 1)
return 1;
if (total_cols <= maximum)
return total_cols;
if (maximum >= 4 && total_cols % 4 == 0)
return 4;
if (total_cols % 3 == 0)
return 3;
if (maximum >= 5 && total_cols % 5 == 0)
return 5;
return maximum;
};
int c; int c;
if ((! m_bms_has_voltages)||(! m_bms_has_temperatures)) bool show_voltage = m_bms_has_voltages;
bool show_temperature = m_bms_has_temperatures;
switch (statusmode)
{ {
writer->puts("No BMS status data available"); case vehicle_bms_status_t::Both:
break;
case vehicle_bms_status_t::Voltage:
show_temperature = false;
break;
case vehicle_bms_status_t::Temperature:
show_voltage = false;
break;
}
if ((!show_voltage) && (!show_temperature))
{
const char *datatype= "status";
switch (statusmode)
{
case vehicle_bms_status_t::Both:
break;
case vehicle_bms_status_t::Voltage:
datatype = "voltage";
break;
case vehicle_bms_status_t::Temperature:
datatype = "temperature";
break;
}
writer->printf("No BMS %s data available\n", datatype);
return; return;
} }
@ -580,61 +626,133 @@ void OvmsVehicle::BmsStatus(int verbosity, OvmsWriter* writer)
case OvmsStatus::Alert: talert++; break; case OvmsStatus::Alert: talert++; break;
} }
} }
if (show_voltage)
{
writer->puts("Voltage:");
writer->printf(" Average: %5.3fV [%5.3fV - %5.3fV]\n",
StdMetrics.ms_v_bat_pack_vavg->AsFloat(),
StdMetrics.ms_v_bat_pack_vmin->AsFloat(),
StdMetrics.ms_v_bat_pack_vmax->AsFloat());
writer->printf(" Deviation: SD %6.2fmV [max %.2fmV], %d warnings, %d alerts\n",
StdMetrics.ms_v_bat_pack_vstddev->AsFloat()*1000,
StdMetrics.ms_v_bat_pack_vstddev_max->AsFloat()*1000,
vwarn, valert);
}
writer->puts("Voltage:"); if (show_temperature)
writer->printf(" Average: %5.3fV [%5.3fV - %5.3fV]\n", {
StdMetrics.ms_v_bat_pack_vavg->AsFloat(), writer->puts("Temperature:");
StdMetrics.ms_v_bat_pack_vmin->AsFloat(), writer->printf(" Average: %5.1fC [%5.1fC - %5.1fC]\n",
StdMetrics.ms_v_bat_pack_vmax->AsFloat()); StdMetrics.ms_v_bat_pack_tavg->AsFloat(),
writer->printf(" Deviation: SD %6.2fmV [max %.2fmV], %d warnings, %d alerts\n", StdMetrics.ms_v_bat_pack_tmin->AsFloat(),
StdMetrics.ms_v_bat_pack_vstddev->AsFloat()*1000, StdMetrics.ms_v_bat_pack_tmax->AsFloat());
StdMetrics.ms_v_bat_pack_vstddev_max->AsFloat()*1000, writer->printf(" Deviation: SD %6.2fC [max %.2fC], %d warnings, %d alerts\n",
vwarn, valert); StdMetrics.ms_v_bat_pack_tstddev->AsFloat(),
StdMetrics.ms_v_bat_pack_tstddev_max->AsFloat(),
writer->puts("Temperature:"); twarn, talert);
writer->printf(" Average: %5.1fC [%5.1fC - %5.1fC]\n", }
StdMetrics.ms_v_bat_pack_tavg->AsFloat(),
StdMetrics.ms_v_bat_pack_tmin->AsFloat(),
StdMetrics.ms_v_bat_pack_tmax->AsFloat());
writer->printf(" Deviation: SD %6.2fC [max %.2fC], %d warnings, %d alerts\n",
StdMetrics.ms_v_bat_pack_tstddev->AsFloat(),
StdMetrics.ms_v_bat_pack_tstddev_max->AsFloat(),
twarn, talert);
writer->puts("Cells:"); writer->puts("Cells:");
int kv = 0; int kv = 0;
int kt = 0; int kt = 0;
for (int module = 0; module < ((m_bms_readings_v+m_bms_readingspermodule_v-1)/m_bms_readingspermodule_v); module++) int module_count = 0;
if (show_voltage)
module_count = round_up_div(m_bms_readings_v,m_bms_readingspermodule_v);
if (show_temperature)
{
int temp_module_count = round_up_div(m_bms_readings_t,m_bms_readingspermodule_t);
if (temp_module_count > module_count)
module_count = temp_module_count;
}
int max_cols_v = 0;
if (show_voltage)
max_cols_v = check_max_cols(m_bms_readingspermodule_v, show_temperature?4:5);
int max_cols_t = 0;
if (show_temperature)
max_cols_t = check_max_cols(m_bms_readingspermodule_t, 5-max_cols_v);
for (int module = 0; module < module_count; ++module)
{ {
writer->printf(" +"); writer->printf(" +");
for (c=0;c<m_bms_readingspermodule_v;c++) { writer->printf("-------"); } if (show_voltage)
writer->printf("-+");
for (c=0;c<m_bms_readingspermodule_t;c++) { writer->printf("-------"); }
writer->puts("-+");
writer->printf("%3d |",module+1);
for (c=0; c<m_bms_readingspermodule_v; c++)
{ {
if (kv < m_bms_readings_v) for (c=0;c<max_cols_v;c++) { writer->printf("-------"); }
writer->printf(" %5.3fV",m_bms_voltages[kv++]); writer->printf("-+");
else
writer->printf(" ");
} }
writer->printf(" |");
for (c=0; c<m_bms_readingspermodule_t; c++) if (show_temperature) {
for (c=0;c<max_cols_t;c++) { writer->printf("-------"); }
writer->printf("-+");
}
writer->puts("");
int rows_v = 0, rows_t = 0;
int reading_left_v = 0, reading_left_t = 0;
if (show_voltage)
{ {
if (kt < m_bms_readings_t) int items_left_v = m_bms_readings_v - kv;
writer->printf(" %5.1fC",m_bms_temperatures[kt++]); reading_left_v = std::min(items_left_v, m_bms_readingspermodule_v);
else rows_v = round_up_div(reading_left_v, max_cols_v);
writer->printf(" "); }
if (show_temperature)
{
int items_left_t = m_bms_readings_t - kt;
reading_left_t = std::min(items_left_t, m_bms_readingspermodule_t);
rows_t = round_up_div(reading_left_t, max_cols_t);
}
int rows = std::max(rows_v,rows_t);
for (int row = 0 ; row < rows; ++row)
{
if (row == 0)
writer->printf("%3d |",module+1);
else
writer->printf(" |");
if (show_voltage)
{
for (c=0; c<max_cols_v; c++)
{
if (kv < m_bms_readings_v && (reading_left_v > 0))
{
writer->printf(" %5.3fV",m_bms_voltages[kv]);
--reading_left_v;
++kv;
}
else
writer->printf(" ");
}
writer->printf(" |");
}
if (show_temperature)
{
for (c=0; c<m_bms_readingspermodule_t; c++)
{
if (kt < m_bms_readings_t && (reading_left_t > 0))
{
writer->printf(" %5.1fC",m_bms_temperatures[kt]);
--reading_left_t;
++kt;
}
else
writer->printf(" ");
}
writer->printf(" |");
}
writer->puts("");
} }
writer->puts(" |");
} }
writer->printf(" +"); writer->printf(" +");
for (c=0;c<m_bms_readingspermodule_v;c++) { writer->printf("-------"); } if (show_voltage)
writer->printf("-+"); {
for (c=0;c<m_bms_readingspermodule_t;c++) { writer->printf("-------"); } for (c=0;c<max_cols_v;c++) { writer->printf("-------"); }
writer->puts("-+"); writer->printf("-+");
}
if (show_temperature)
{
for (c=0;c<max_cols_t;c++) { writer->printf("-------"); }
writer->printf("-+");
}
writer->puts("");
} }
bool OvmsVehicle::FormatBmsAlerts(int verbosity, OvmsWriter* writer, bool show_warnings) bool OvmsVehicle::FormatBmsAlerts(int verbosity, OvmsWriter* writer, bool show_warnings)

View File

@ -435,7 +435,14 @@ void OvmsVehicleFactory::bms_status(int verbosity, OvmsWriter* writer, OvmsComma
{ {
if (MyVehicleFactory.m_currentvehicle != NULL) if (MyVehicleFactory.m_currentvehicle != NULL)
{ {
MyVehicleFactory.m_currentvehicle->BmsStatus(verbosity, writer); OvmsVehicle::vehicle_bms_status_t statusmode = OvmsVehicle::vehicle_bms_status_t::Both;
const char* smode = cmd->GetName();
if (strcmp(smode,"volt")==0)
statusmode = OvmsVehicle::vehicle_bms_status_t::Voltage;
else if (strcmp(smode,"temp")==0)
statusmode = OvmsVehicle::vehicle_bms_status_t::Temperature;
MyVehicleFactory.m_currentvehicle->BmsStatus(verbosity, writer, statusmode);
} }
else else
{ {

View File

@ -87,8 +87,8 @@ OvmsVehicleRenaultZoePh2OBD::OvmsVehicleRenaultZoePh2OBD() {
mt_inv_hv_current = MyMetrics.InitFloat("zph2.i.current", SM_STALE_MID, 0, Amps); mt_inv_hv_current = MyMetrics.InitFloat("zph2.i.current", SM_STALE_MID, 0, Amps);
mt_mot_temp_stator1 = MyMetrics.InitFloat("zph2.m.temp.stator1", SM_STALE_MID, 0, Celcius); mt_mot_temp_stator1 = MyMetrics.InitFloat("zph2.m.temp.stator1", SM_STALE_MID, 0, Celcius);
mt_mot_temp_stator2 = MyMetrics.InitFloat("zph2.m.temp.stator2", SM_STALE_MID, 0, Celcius); mt_mot_temp_stator2 = MyMetrics.InitFloat("zph2.m.temp.stator2", SM_STALE_MID, 0, Celcius);
mt_hvac_compressor_speed = MyMetrics.InitFloat("zph2.h.compressor.speed", SM_STALE_MID, 0, rpm); mt_hvac_compressor_speed = MyMetrics.InitFloat("zph2.h.compressor.speed", SM_STALE_MID, 0);
mt_hvac_compressor_pressure = MyMetrics.InitFloat("zph2.h.compressor.pressure", SM_STALE_MID, 0, Bar); mt_hvac_compressor_pressure = MyMetrics.InitFloat("zph2.h.compressor.pressure", SM_STALE_MID, 0);
mt_hvac_compressor_power = MyMetrics.InitFloat("zph2.h.compressor.power", SM_STALE_MID, 0, Watts); mt_hvac_compressor_power = MyMetrics.InitFloat("zph2.h.compressor.power", SM_STALE_MID, 0, Watts);
mt_hvac_compressor_mode = MyMetrics.InitString("zph2.h.compressor.mode", SM_STALE_MID, 0, Other); mt_hvac_compressor_mode = MyMetrics.InitString("zph2.h.compressor.mode", SM_STALE_MID, 0, Other);