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()
{
OvmsRecMutexLock lock(&m_park_lock);
bool caron = StdMetrics.ms_v_env_on->AsBool();
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");
if (url.empty())
url = "ovms-ota.bit-cloud.de";
url = "api.openvehicles.com/firmware/ota";
url.append("/");
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 url = MyConfig.GetParamValue("ota","server");
if (url.empty())
url = "ovms-ota.bit-cloud.de";
url = "api.openvehicles.com/firmware/ota";
url.append("/");
url.append(GetOVMSProduct());
url.append("/");
@ -1029,7 +1029,7 @@ bool OvmsOTA::AutoFlash(bool force)
std::string tag = MyConfig.GetParamValue("ota","tag");
std::string url = MyConfig.GetParamValue("ota","server");
if (url.empty())
url = "ovms-ota.bit-cloud.de";
url = "api.openvehicles.com/firmware/ota";
url.append("/");
url.append(GetOVMSProduct());

View File

@ -282,14 +282,133 @@ void OvmsServerV3::TransmitModifiedMetrics()
if (!m_mgconn)
return;
OvmsMetric* metric = MyMetrics.m_first;
while (metric != NULL)
if (StandardMetrics.ms_v_bat_soc->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
if (metric->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
TransmitMetric(metric);
}
metric = metric->m_next;
TransmitMetric(StandardMetrics.ms_v_bat_soc);
}
if (StandardMetrics.ms_v_charge_voltage->IsModifiedAndClear(MyOvmsServerV3Modifier))
{
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 (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);
if (!m_mgconn)
return;
metric->ClearModified(MyOvmsServerV3Modifier);
TransmitMetric(metric);
//metric->ClearModified(MyOvmsServerV3Modifier);
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)
{
ESP_LOGD(TAG, "--- ConfigChanged ---");
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);
ESP_LOGD(TAG, "m_updatetime_connected: %d", m_updatetime_connected);
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);
ESP_LOGD(TAG, "m_updatetime_awake: %d", m_updatetime_awake);
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);
ESP_LOGD(TAG, "m_updatetime_charging: %d", m_updatetime_charging);
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)
@ -929,12 +1069,55 @@ void OvmsServerV3::Ticker1(std::string event, void* data)
}
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();
m_lasttx = m_lasttx_stream = now;
}
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;
}
}

View File

@ -11,5 +11,5 @@ ifdef CONFIG_MG_ENABLE_SSL
COMPONENT_SRCDIRS := src
COMPONENT_ADD_INCLUDEDIRS := src
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

View File

@ -164,10 +164,6 @@ void OvmsTLS::Reload()
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);
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)
DIR *dir;
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
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",
"<p>Public OVMS V2 servers:</p>"
"<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>ovms.dexters-web.de</code> <a href=\"https://dexters-web.de/?action=NewAccount\" target=\"_blank\">Registration</a></li>"
"</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>");
c.print(
"<datalist id=\"server-list\">"
"<option value=\"https://ovms-ota.bit-cloud.de\">"
"<option value=\"https://api.openvehicles.com/firmware/ota\">"
"<option value=\"https://ovms.dexters-web.de/firmware/ota\">"
"</datalist>"
@ -2661,7 +2659,7 @@ void OvmsWebServer::HandleCfgFirmware(PageEntry_t& p, PageContext_t& c)
"</datalist>"
);
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\"");
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>",

View File

@ -749,7 +749,7 @@ std::string OvmsWebServer::CfgInit3(PageEntry_t& p, PageContext_t& c, std::strin
if (server.empty())
server = MyConfig.GetParamValue("ota", "server");
if (server.empty())
server = "https://ovms-ota.bit-cloud.de";
server = "https://api.openvehicles.com/firmware/ota";
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.form_start(p.uri);
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)",
"https://api.openvehicles.com/firmware/ota" , server == "https://api.openvehicles.com/firmware/ota");
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:
if (server.empty()) {
server = MyConfig.GetParamValue("ota", "server");
if (startsWith(server, "ovms-ota.bit-cloud.de"))
server = "ovms-server.bit-cloud.de";
else
if (startsWith(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_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",
"Asia-Pacific (openvehicles.com) <a href=\"https://www.openvehicles.com/user/register\" target=\"_blank\">Registration</a>",
"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);
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("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_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:
// 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.
@ -479,6 +481,12 @@ class OvmsVehicle : public InternalRamAllocated
Range = 3,
Performance = 4
} vehicle_mode_t;
enum class vehicle_bms_status_t
{
Both,
Voltage,
Temperature
};
public:
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 BmsGetCellDefaultThresholdsTemperature(float* warn, float* alert);
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);
bool BmsCheckChangeCellArrangementVoltage(int readings, int readingspermodule = 0);
bool BmsCheckChangeCellArrangementTemperature(int readings, int readingspermodule = 0);

View File

@ -550,13 +550,59 @@ void OvmsVehicle::BmsResetCellStats()
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;
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;
}
@ -580,61 +626,133 @@ void OvmsVehicle::BmsStatus(int verbosity, OvmsWriter* writer)
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:");
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("Temperature:");
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);
if (show_temperature)
{
writer->puts("Temperature:");
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:");
int kv = 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(" +");
for (c=0;c<m_bms_readingspermodule_v;c++) { writer->printf("-------"); }
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 (show_voltage)
{
if (kv < m_bms_readings_v)
writer->printf(" %5.3fV",m_bms_voltages[kv++]);
else
writer->printf(" ");
for (c=0;c<max_cols_v;c++) { writer->printf("-------"); }
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)
writer->printf(" %5.1fC",m_bms_temperatures[kt++]);
else
writer->printf(" ");
int items_left_v = m_bms_readings_v - kv;
reading_left_v = std::min(items_left_v, m_bms_readingspermodule_v);
rows_v = round_up_div(reading_left_v, max_cols_v);
}
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(" +");
for (c=0;c<m_bms_readingspermodule_v;c++) { writer->printf("-------"); }
writer->printf("-+");
for (c=0;c<m_bms_readingspermodule_t;c++) { writer->printf("-------"); }
writer->puts("-+");
if (show_voltage)
{
for (c=0;c<max_cols_v;c++) { writer->printf("-------"); }
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)

View File

@ -435,7 +435,14 @@ void OvmsVehicleFactory::bms_status(int verbosity, OvmsWriter* writer, OvmsComma
{
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
{

View File

@ -87,8 +87,8 @@ OvmsVehicleRenaultZoePh2OBD::OvmsVehicleRenaultZoePh2OBD() {
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_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_pressure = MyMetrics.InitFloat("zph2.h.compressor.pressure", SM_STALE_MID, 0, Bar);
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);
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);