diff --git a/OVMS.V3/components/ovms_location/src/ovms_location.cpp b/OVMS.V3/components/ovms_location/src/ovms_location.cpp index 860834b..ddf4988 100644 --- a/OVMS.V3/components/ovms_location/src/ovms_location.cpp +++ b/OVMS.V3/components/ovms_location/src/ovms_location.cpp @@ -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) { diff --git a/OVMS.V3/components/ovms_ota/src/ovms_ota.cpp b/OVMS.V3/components/ovms_ota/src/ovms_ota.cpp index 723dfa2..ecfb4a0 100644 --- a/OVMS.V3/components/ovms_ota/src/ovms_ota.cpp +++ b/OVMS.V3/components/ovms_ota/src/ovms_ota.cpp @@ -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()); diff --git a/OVMS.V3/components/ovms_server_v3/src/ovms_server_v3.cpp b/OVMS.V3/components/ovms_server_v3/src/ovms_server_v3.cpp index bdb027a..efd0cf6 100644 --- a/OVMS.V3/components/ovms_server_v3/src/ovms_server_v3.cpp +++ b/OVMS.V3/components/ovms_server_v3/src/ovms_server_v3.cpp @@ -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; } } diff --git a/OVMS.V3/components/ovms_tls/component.mk b/OVMS.V3/components/ovms_tls/component.mk index 1a17834..a7709f7 100644 --- a/OVMS.V3/components/ovms_tls/component.mk +++ b/OVMS.V3/components/ovms_tls/component.mk @@ -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 diff --git a/OVMS.V3/components/ovms_tls/src/ovms_tls.cpp b/OVMS.V3/components/ovms_tls/src/ovms_tls.cpp index 29c3602..64cdd34 100644 --- a/OVMS.V3/components/ovms_tls/src/ovms_tls.cpp +++ b/OVMS.V3/components/ovms_tls/src/ovms_tls.cpp @@ -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; diff --git a/OVMS.V3/components/ovms_webserver/docs/bms-cell-info.odg b/OVMS.V3/components/ovms_webserver/docs/bms-cell-info.odg new file mode 100644 index 0000000..1643e9d Binary files /dev/null and b/OVMS.V3/components/ovms_webserver/docs/bms-cell-info.odg differ diff --git a/OVMS.V3/components/ovms_webserver/docs/bms-cell-monitor.rst b/OVMS.V3/components/ovms_webserver/docs/bms-cell-monitor.rst index 6c1ec94..cce7b5d 100644 --- a/OVMS.V3/components/ovms_webserver/docs/bms-cell-monitor.rst +++ b/OVMS.V3/components/ovms_webserver/docs/bms-cell-monitor.rst @@ -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. + diff --git a/OVMS.V3/components/ovms_webserver/src/web_cfg.cpp b/OVMS.V3/components/ovms_webserver/src/web_cfg.cpp index 52abbb9..ae7649b 100644 --- a/OVMS.V3/components/ovms_webserver/src/web_cfg.cpp +++ b/OVMS.V3/components/ovms_webserver/src/web_cfg.cpp @@ -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", "

Public OVMS V2 servers:

" ""); @@ -2650,7 +2649,6 @@ void OvmsWebServer::HandleCfgFirmware(PageEntry_t& p, PageContext_t& c) "

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.

"); c.print( "" - "" @@ -2661,7 +2659,7 @@ void OvmsWebServer::HandleCfgFirmware(PageEntry_t& p, PageContext_t& c) "" ); c.input_text("Update server", "server", server.c_str(), "Specify or select from list (clear to see all options)", - "

Default is https://ovms-ota.bit-cloud.de.

", + "

Default is https://api.openvehicles.com/firmware/ota.

", "list=\"server-list\""); c.input_text("Version tag", "tag", tag.c_str(), "Specify or select from list (clear to see all options)", "

Default is main for standard releases. Use eap (early access program) for stable or edge for bleeding edge developer builds.

", diff --git a/OVMS.V3/components/ovms_webserver/src/web_cfg_init.cpp b/OVMS.V3/components/ovms_webserver/src/web_cfg_init.cpp index b260510..33d094e 100644 --- a/OVMS.V3/components/ovms_webserver/src/web_cfg_init.cpp +++ b/OVMS.V3/components/ovms_webserver/src/web_cfg_init.cpp @@ -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) Registration", - "ovms-server.bit-cloud.de" , server == "ovms-server.bit-cloud.de"); c.input_radio_option("server", "Asia-Pacific (openvehicles.com) Registration", "api.openvehicles.com" , server == "api.openvehicles.com"); diff --git a/OVMS.V3/components/vehicle/vehicle.cpp b/OVMS.V3/components/vehicle/vehicle.cpp index 0195f22..05d77d9 100644 --- a/OVMS.V3/components/vehicle/vehicle.cpp +++ b/OVMS.V3/components/vehicle/vehicle.cpp @@ -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); diff --git a/OVMS.V3/components/vehicle/vehicle.h b/OVMS.V3/components/vehicle/vehicle.h index 820735a..81061f8 100644 --- a/OVMS.V3/components/vehicle/vehicle.h +++ b/OVMS.V3/components/vehicle/vehicle.h @@ -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); diff --git a/OVMS.V3/components/vehicle/vehicle_bms.cpp b/OVMS.V3/components/vehicle/vehicle_bms.cpp index 1c4861c..18c4366 100644 --- a/OVMS.V3/components/vehicle/vehicle_bms.cpp +++ b/OVMS.V3/components/vehicle/vehicle_bms.cpp @@ -550,13 +550,59 @@ void OvmsVehicle::BmsResetCellStats() BmsResetCellTemperatures(false); } -void OvmsVehicle::BmsStatus(int verbosity, OvmsWriter* writer) +template +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;cprintf("-------"); } - writer->printf("-+"); - for (c=0;cprintf("-------"); } - writer->puts("-+"); - writer->printf("%3d |",module+1); - for (c=0; cprintf(" %5.3fV",m_bms_voltages[kv++]); - else - writer->printf(" "); + for (c=0;cprintf("-------"); } + writer->printf("-+"); } - writer->printf(" |"); - for (c=0; cprintf("-------"); } + 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 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 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;cprintf("-------"); } - writer->printf("-+"); - for (c=0;cprintf("-------"); } - writer->puts("-+"); + if (show_voltage) + { + for (c=0;cprintf("-------"); } + writer->printf("-+"); + } + if (show_temperature) + { + for (c=0;cprintf("-------"); } + writer->printf("-+"); + } + writer->puts(""); } bool OvmsVehicle::FormatBmsAlerts(int verbosity, OvmsWriter* writer, bool show_warnings) diff --git a/OVMS.V3/components/vehicle/vehicle_shell.cpp b/OVMS.V3/components/vehicle/vehicle_shell.cpp index b39b6d2..3bf66ee 100644 --- a/OVMS.V3/components/vehicle/vehicle_shell.cpp +++ b/OVMS.V3/components/vehicle/vehicle_shell.cpp @@ -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 { diff --git a/OVMS.V3/components/vehicle_renaultzoe_ph2_obd/src/vehicle_renaultzoe_ph2_obd.cpp b/OVMS.V3/components/vehicle_renaultzoe_ph2_obd/src/vehicle_renaultzoe_ph2_obd.cpp index 850e297..6b0de7b 100644 --- a/OVMS.V3/components/vehicle_renaultzoe_ph2_obd/src/vehicle_renaultzoe_ph2_obd.cpp +++ b/OVMS.V3/components/vehicle_renaultzoe_ph2_obd/src/vehicle_renaultzoe_ph2_obd.cpp @@ -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);