<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><br class=""></div>I’ve extended ovms_time to also include suseconds_t timu, if available.<div class=""><br class=""></div><div class="">I think NTP can be done within ovms_time, as an ‘ntp’ source in a similar way to the ‘time’ source for manual configuration. The issue I am hitting is finding out when the time has actually been set. It seems that LWIP SNTP doesn’t provide any facility to expose that. There is a macro SNTP_SET_SYSTEM_TIME_US that is defined in the Espressif LWIP options file as:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">#define SNTP_SET_SYSTEM_TIME_US(sec, us)  \</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">    do { \</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">        struct timeval tv = { .tv_sec = sec, .tv_usec = us }; \</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">        settimeofday(&tv, NULL); \</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">    } while (0);</span></font></div></div></blockquote><div class=""><div><br class=""></div><div>but there is no easy way of overriding that from a client app. It seems I’m not the only one who found this:</div><div><br class=""></div></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div><a href="https://www.esp32.com/viewtopic.php?f=2&t=4695" class="">https://www.esp32.com/viewtopic.php?f=2&t=4695</a></div></div><div><br class=""></div><div><span class="responsive-hide" style="margin: 0px; padding: 0px; border: 0px; font-family: "Open Sans", sans-serif; font-size: 13px; font-stretch: inherit; line-height: inherit; vertical-align: baseline; color: rgb(68, 68, 68);">by <span style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: 600; font-stretch: inherit; line-height: inherit; vertical-align: baseline;" class=""><a href="https://www.esp32.com/memberlist.php?mode=viewprofile&u=4952&sid=4f2bdf4eea4ed434cf38cf94a2df7709" class="username" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; vertical-align: baseline; direction: ltr; unicode-bidi: embed; text-decoration: none; color: rgb(223, 121, 128);">vonnieda</a></span> » </span><span style="color: rgb(68, 68, 68); font-family: "Open Sans", sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class="">Tue Feb 13, 2018 11:48 pm</span></div><div><span style="color: rgb(68, 68, 68); font-family: "Open Sans", sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class="">It's working well, but I need to know when it has received a time update and set the time.</span></div><div><span style="color: rgb(68, 68, 68); font-family: "Open Sans", sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class=""><br class=""></span></div><div><span class="responsive-hide" style="margin: 0px; padding: 0px; border: 0px; font-family: "Open Sans", sans-serif; font-size: 13px; font-stretch: inherit; line-height: inherit; vertical-align: baseline; color: rgb(68, 68, 68);">by <span style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: 600; font-stretch: inherit; line-height: inherit; vertical-align: baseline;" class=""><a href="https://www.esp32.com/memberlist.php?mode=viewprofile&u=2849&sid=4f2bdf4eea4ed434cf38cf94a2df7709" class="username" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; vertical-align: baseline; direction: ltr; unicode-bidi: embed; text-decoration: none; color: rgb(223, 121, 128);">loboris</a></span> » </span><span style="color: rgb(68, 68, 68); font-family: "Open Sans", sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class="">Wed Feb 14, 2018 8:34 am</span></div><div><span style="color: rgb(68, 68, 68); font-family: "Open Sans", sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class="">I've needed the same thing and ended up adding the global variable </span><span style="margin: 0px; padding: 0px; border: 0px; font-family: "Open Sans", sans-serif; font-size: 13px; font-style: italic; font-stretch: inherit; line-height: inherit; vertical-align: baseline; color: rgb(68, 68, 68);" class="">sntp_is_synced</span><span style="color: rgb(68, 68, 68); font-family: "Open Sans", sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class=""> which is set to true before calling SNTP_SET_SYSTEM_TIME_US in "sntp.c".</span><br style="color: rgb(68, 68, 68); font-family: "Open Sans", sans-serif; font-size: 13px;" class=""><span style="color: rgb(68, 68, 68); font-family: "Open Sans", sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class="">Not a very elegant solution because I've modified the file in the esp-idf, but it works fine.</span></div></blockquote><div class=""><div><br class=""></div><div>Urgh. But, the Laboris solution seems fairly neat and would meet our requirements.</div><div><br class=""></div><div>Time zones seem messy (without all those compiled zone files), but workable. I’ll add it.</div><div><br class=""></div><div>Regards, Mark.</div><div><br class=""></div><div><blockquote type="cite" class=""><div class="">On 25 Feb 2018, at 5:44 AM, Stephen Casner <<a href="mailto:casner@acm.org" class="">casner@acm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Mark,<br class=""><br class="">Thanks for this.  I've made a small change to make 'status' the<br class="">default argument for the command if you don't give one.  (I made a<br class="">change to the command system this some months ago to enable this but<br class="">it hasn't been used much yet.)<br class=""><br class="">I have a few comments on the time system:<br class=""><br class="">- A full NTP daemon does much more than select among time sources by<br class="">  stratum.  Given multiple sources, it also has mechanisms to try to<br class="">  detect "falsetickers" (a Dave Mills term) and strategies to choose<br class="">  between stepping or slewing time depending upon which is more<br class="">  appropriate for the way the time source is used.<br class=""><br class="">- One of the ESP-IDF example programs is SNMP (simple NTP) using the<br class="">  capability built into LwIP.  It is easy to invoke -- as a test I<br class="">  just added this to console_ssh to take advantage of its existing<br class="">  event notification for wifi coming up:<br class=""><br class="">  @@ -32,6 +32,7 @@<br class="">   #include <lwip/def.h><br class="">   #include <lwip/sockets.h><br class="">   #undef bind<br class="">  +#include "apps/sntp/sntp.h"<br class="">   #include "freertos/queue.h"<br class="">   #include "ovms_log.h"<br class="">   #include "ovms_events.h"<br class="">  @@ -153,6 +155,11 @@ void OvmsSSH::NetManInit(std::string event, void* data)<br class="">     // Only initialise server for WIFI connections<br class="">     if (!MyNetManager.m_connected_wifi) return;<br class=""><br class="">  +  ESP_LOGI(tag, "Initializing SNTP");<br class="">  +  sntp_setoperatingmode(SNTP_OPMODE_POLL);<br class="">  +  sntp_setservername(0, (char*)"<a href="http://pool.ntp.org" class="">pool.ntp.org</a>");<br class="">  +  sntp_init();<br class="">  +<br class="">     ESP_LOGI(tag, "Launching SSH Server");<br class="">     int ret = wolfSSH_Init();<br class="">     if (ret != WS_SUCCESS)<br class=""><br class="">  One problem with fitting this into the time scheme that you have<br class="">  implemented is that it will be updating time in the background on<br class="">  its own.  The other operating mode is SNTP_OPMODE_LISTENONLY, which<br class="">  I don't think would be useful.  There are parameters defined in<br class="">  components/lwip/include/lwip/apps/sntp/sntp_opts.h that might be<br class="">  useful to change.  The current update interval is one hour.<br class=""><br class="">- Another aspect of the SNMP example program is the use of the<br class="">  environment variable TZ to control the local timezone.  Here is the<br class="">  'date' command I implemented as a test:<br class=""><br class="">  void date(int verbosity, OvmsWriter* writer, OvmsCommand* cmd, int argc, const char* const* argv)<br class="">    {<br class="">    time_t now;<br class="">    struct tm timeinfo;<br class="">    char strftime_buf[64];<br class="">    setenv("TZ", "PST8PDT,M3.2.0/2,M11.1.0", 1);<br class="">    tzset();<br class="">    time(&now);<br class="">    localtime_r(&now, &timeinfo);<br class="">    strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);<br class="">    writer->printf("The current date/time in Sunnyvale is: %s\n", strftime_buf);<br class="">    }<br class=""><br class="">  Perhaps we should have a config parameter for timezone?<br class=""><br class="">                                                        -- Steve<br class=""><br class="">On Sat, 24 Feb 2018, Mark Webb-Johnson wrote:<br class=""><br class=""><blockquote type="cite" class="">I’ve done a very rough implementation of this:<br class=""><br class="">OVMS > time set 1519486746<br class="">Time set (at stratum 15)<br class=""><br class="">OVMS > time status<br class="">UTC Time:   Sat Feb 24 15:39:09 2018<br class="">Local Time: Sat Feb 24 15:39:09 2018<br class="">Provider:   time<br class=""><br class="">PROVIDER             STRATUM  UPDATE TIME<br class="">*time                     15       4 Sat Feb 24 15:39:10 2018<br class=""><br class="">OVMS > time status<br class="">UTC Time:   Sat Feb 24 15:39:14 2018<br class="">Local Time: Sat Feb 24 15:39:14 2018<br class="">Provider:   time<br class=""><br class="">PROVIDER             STRATUM  UPDATE TIME<br class="">*time                     15       9 Sat Feb 24 15:39:15 2018<br class=""><br class="">I’ll work on it some more tomorrow. As it is, components can now call MyTime.Set(…) to feed their opinion of time into the system.<br class=""><br class="">Regards, Mark.<br class=""><br class=""><blockquote type="cite" class="">On 24 Feb 2018, at 10:23 PM, Mark Webb-Johnson <<a href="mailto:mark@webb-johnson.net" class="">mark@webb-johnson.net</a>> wrote:<br class=""><br class="">I forgot about vehicles. Tesla Roadster is the same.<br class=""><br class="">I’ll write an ovms_time component now. Then, we can all submit time to it appropriately.<br class=""><br class="">class OvmsTime<br class="">  {<br class="">  public:<br class="">    OvmsTime();<br class="">    ~OvmsTime();<br class=""><br class="">  public:<br class="">    void Set(char* provider, int stratum, bool trusted, time_t time);<br class="">  };<br class=""><br class="">extern OvmsTime MyTime;<br class=""><br class="">Just follow the NTP stratum approach (distance from a zero-delay device). Trusted is a separate indication that just sets stratum level to 16. The provider is simply the logging TAG.<br class=""><br class="">Internal implementation is like NTP. We track the last times from all providers, and pick the one with the lowest stratum that has reported within a reasonable time.<br class=""><br class="">We can add the boot-time save/restore later (once Michael has done that code for safe boot, etc).<br class=""><br class="">Regards, Mark.<br class=""><br class=""><blockquote type="cite" class="">On 24 Feb 2018, at 9:19 PM, Geir Øyvind Vælidalo <<a href="mailto:geir@validalo.net" class="">geir@validalo.net</a> <<a href="mailto:geir@validalo.net" class="">mailto:geir@validalo.net</a>>> wrote:<br class=""><br class="">Sounds like a plan. I can get time from the car too, but the resolution is several seconds, so I think we need to have some sort of priority here. Maybe SNTP first, then GPS, cellular and finally “car”?<br class=""><br class="">Geir<br class=""><br class="">Sendt fra min iPhone<br class=""><br class=""><blockquote type="cite" class="">24. feb. 2018 kl. 04:36 skrev Mark Webb-Johnson <<a href="mailto:mark@webb-johnson.net" class="">mark@webb-johnson.net</a> <<a href="mailto:mark@webb-johnson.net" class="">mailto:mark@webb-johnson.net</a>>>:<br class=""><br class="">I don’t think so.<br class=""><br class="">There are various sources for date/time. GPS. Cellular. SNTP. Need to ensure that they are not all fighting.<br class=""><br class="">Another module to do this? Have components tell it their opinion of the time, then it centrally decides and updates system clock if necessary<br class=""><br class="">Also store last clock in RTC ram so during a crash/reboot it can recover the last know time?<br class=""><br class="">Regards, Mark<br class=""><br class=""><blockquote type="cite" class="">On 24 Feb 2018, at 9:44 AM, Stephen Casner <<a href="mailto:casner@acm.org" class="">casner@acm.org</a> <<a href="mailto:casner@acm.org" class="">mailto:casner@acm.org</a>>> wrote:<br class=""><br class="">Does the sytem date get set anywhere (presumably from GPS)?<br class=""><br class="">This question occurred to me as I'm working on a side project using<br class="">the DEVKIT-C module which won't have access to GPS so I added the code<br class="">to set the data using SNTP.<br class=""><br class="">                                                     -- Steve<br class="">_______________________________________________<br class="">OvmsDev mailing list<br class=""><a href="mailto:OvmsDev@lists.teslaclub.hk" class="">OvmsDev@lists.teslaclub.hk</a> <<a href="mailto:OvmsDev@lists.teslaclub.hk" class="">mailto:OvmsDev@lists.teslaclub.hk</a>><br class=""><a href="http://lists.teslaclub.hk/mailman/listinfo/ovmsdev" class="">http://lists.teslaclub.hk/mailman/listinfo/ovmsdev</a><br class=""></blockquote><br class="">_______________________________________________<br class="">OvmsDev mailing list<br class=""><a href="mailto:OvmsDev@lists.teslaclub.hk" class="">OvmsDev@lists.teslaclub.hk</a> <<a href="mailto:OvmsDev@lists.teslaclub.hk" class="">mailto:OvmsDev@lists.teslaclub.hk</a>><br class=""><a href="http://lists.teslaclub.hk/mailman/listinfo/ovmsdev" class="">http://lists.teslaclub.hk/mailman/listinfo/ovmsdev</a><br class=""></blockquote><br class="">_______________________________________________<br class="">OvmsDev mailing list<br class=""><a href="mailto:OvmsDev@lists.teslaclub.hk" class="">OvmsDev@lists.teslaclub.hk</a> <<a href="mailto:OvmsDev@lists.teslaclub.hk" class="">mailto:OvmsDev@lists.teslaclub.hk</a>><br class=""><a href="http://lists.teslaclub.hk/mailman/listinfo/ovmsdev" class="">http://lists.teslaclub.hk/mailman/listinfo/ovmsdev</a><br class=""></blockquote><br class="">_______________________________________________<br class="">OvmsDev mailing list<br class=""><a href="mailto:OvmsDev@lists.teslaclub.hk" class="">OvmsDev@lists.teslaclub.hk</a><br class="">http://lists.teslaclub.hk/mailman/listinfo/ovmsdev<br class=""></blockquote><br class=""></blockquote>_______________________________________________<br class="">OvmsDev mailing list<br class=""><a href="mailto:OvmsDev@lists.teslaclub.hk" class="">OvmsDev@lists.teslaclub.hk</a><br class="">http://lists.teslaclub.hk/mailman/listinfo/ovmsdev<br class=""></div></div></blockquote></div><br class=""></div></body></html>