private static void RefreshToken() { TimeSpan ts = DateTime.Now - webhelper.lastTokenRefresh; if (ts.TotalDays > 9) { // If car wasn't sleeping since 10 days, try to get a new Teslalogger update UpdateTeslalogger.CheckForNewVersion(); TimeSpan ts2 = DateTime.Now - lastTryTokenRefresh; if (ts2.TotalMinutes > 30) { lastTryTokenRefresh = DateTime.Now; Logfile.Log("try to get new Token"); string temp = webhelper.GetTokenAsync().Result; if (temp != "NULL") { Logfile.Log("new Token received!"); webhelper.Tesla_token = temp; webhelper.lastTokenRefresh = DateTime.Now; // Every 10 Days send degradataion Data ShareData sd = new ShareData(webhelper.TaskerHash); sd.SendDegradationData(); } else { Logfile.Log("Error getting new Token!"); } } } }
void Init() { List <Address> list = new List <Address>(); if (System.IO.File.Exists(FileManager.GetFilePath(TLFilename.GeofenceRacingFilename)) && ApplicationSettings.Default.RacingMode) { ReadGeofenceFile(list, FileManager.GetFilePath(TLFilename.GeofenceRacingFilename)); RacingMode = true; Logfile.Log("*** RACING MODE ***"); } else { RacingMode = false; ReadGeofenceFile(list, FileManager.GetFilePath(TLFilename.GeofenceFilename)); if (!System.IO.File.Exists(FileManager.GetFilePath(TLFilename.GeofencePrivateFilename))) { Logfile.Log("Create: " + FileManager.GetFilePath(TLFilename.GeofencePrivateFilename)); System.IO.File.AppendAllText(FileManager.GetFilePath(TLFilename.GeofencePrivateFilename), ""); } UpdateTeslalogger.chmod(FileManager.GetFilePath(TLFilename.GeofencePrivateFilename), 666); ReadGeofenceFile(list, FileManager.GetFilePath(TLFilename.GeofencePrivateFilename)); } Logfile.Log("Addresses inserted: " + list.Count); sortedList = list.OrderBy(o => o.lat).ToList(); }
private static void InitConnectToDB() { for (int x = 1; x <= 30; x++) // try 30 times until DB is up and running { try { Logfile.Log("DB Version: " + DBHelper.GetVersion()); Logfile.Log("Count Pos: " + DBHelper.CountPos()); // test the DBConnection break; } catch (Exception ex) { if (ex.Message.Contains("Connection refused") || ex.Message.Contains("Unable to connect to any of the specified MySQL hosts") || ex.Message.Contains("Reading from the stream has failed.")) { Logfile.Log($"Wait for DB ({x}/30): Connection refused."); } else { ex.ToExceptionless().FirstCarUserID().Submit(); Logfile.Log("DBCONNECTION " + ex.Message); } Thread.Sleep(15000); } } UpdateTeslalogger.Start(); _ = Task.Run(() => { UpdateTeslalogger.UpdateGrafana(); }); }
private static void InitConnectToDB() { for (int x = 1; x <= 30; x++) // try 30 times until DB is up and running { try { Logfile.Log("DB Version: " + DBHelper.GetVersion()); Logfile.Log("Count Pos: " + DBHelper.CountPos()); // test the DBConnection break; } catch (Exception ex) { if (ex.Message.Contains("Connection refused")) { Logfile.Log($"Wait for DB ({x}/30): Connection refused."); } else { Logfile.Log("DBCONNECTION " + ex.Message); } Thread.Sleep(15000); } } UpdateTeslalogger.Start(); UpdateTeslalogger.UpdateGrafana(); }
private static void Main(string[] args) { try { InitDebugLogging(); InitStage1(); InitCheckDocker(); InitStage2(); InitConnectToDB(); InitWebserver(); InitOpenTopoDataService(); InitStaticMapService(); UpdateTeslalogger.StopComfortingMessagesThread(); MQTTClient.StartMQTTClient(); InitTLStats(); UpdateDbInBackground(); WebHelper.getTLSVersion(); Logfile.Log("Init finished, now enter main loop"); GetAllCars(); InitNearbySuCService(); } catch (Exception ex) { Logfile.Log(ex.Message); Logfile.ExceptionWriter(ex, "main loop"); Logfile.Log("Teslalogger Stopped!"); Tools.ExternalLog("Teslalogger Stopped! " + ex.ToString()); } finally { if (!UpdateTeslalogger.DownloadUpdateAndInstallStarted) { try { Logfile.Log("Startup doesn't sucessfully run DownloadUpdateAndInstall() - retry now!"); UpdateTeslalogger.DownloadUpdateAndInstall(); } catch (Exception ex) { Logfile.Log(ex.Message); Logfile.ExceptionWriter(ex, "Emergency DownloadUpdateAndInstall()"); } } } }
private void Debug_TeslaLoggerStates(HttpListenerRequest request, HttpListenerResponse response) { Dictionary <string, string> values = new Dictionary <string, string> { { "System.DateTime.Now", DateTime.Now.ToString() }, { "System.DateTime.UtcNow", DateTime.UtcNow.ToString() }, { "System.DateTime.UnixTime", Tools.ToUnixTime(DateTime.Now).ToString() }, { "UpdateTeslalogger.lastVersionCheck", UpdateTeslalogger.GetLastVersionCheck().ToString() }, { "TLMemCacheKey.Housekeeping", MemoryCache.Default.Get(Program.TLMemCacheKey.Housekeeping.ToString()) != null ? "AbsoluteExpiration: " + ((CacheItemPolicy)MemoryCache.Default.Get(Program.TLMemCacheKey.Housekeeping.ToString())).AbsoluteExpiration.ToString() : "null" }, }; foreach (Car car in Car.allcars) { Dictionary <string, string> carvalues = new Dictionary <string, string> { { $"Car #{car.CarInDB} GetCurrentState()", car.GetCurrentState().ToString() }, { $"Car #{car.CarInDB} GetWebHelper().GetLastShiftState()", car.GetWebHelper().GetLastShiftState().ToString() }, { $"Car #{car.CarInDB} GetHighFrequencyLogging()", car.GetHighFrequencyLogging().ToString() }, { $"Car #{car.CarInDB} GetHighFrequencyLoggingTicks()", car.GetHighFrequencyLoggingTicks().ToString() }, { $"Car #{car.CarInDB} GetHighFrequencyLoggingTicksLimit()", car.GetHighFrequencyLoggingTicksLimit().ToString() }, { $"Car #{car.CarInDB} GetHighFrequencyLoggingUntil()", car.GetHighFrequencyLoggingUntil().ToString() }, { $"Car #{car.CarInDB} GetHighFrequencyLoggingMode()", car.GetHighFrequencyLoggingMode().ToString() }, { $"Car #{car.CarInDB} GetLastCarUsed()", car.GetLastCarUsed().ToString() }, { $"Car #{car.CarInDB} GetLastOdometerChanged()", car.GetLastOdometerChanged().ToString() }, { $"Car #{car.CarInDB} GetLastTryTokenRefresh()", car.GetLastTryTokenRefresh().ToString() }, { $"Car #{car.CarInDB} lastSetChargeLimitAddressName", car.GetLastSetChargeLimitAddressName().Equals(string.Empty) ? "<>" : car.GetLastSetChargeLimitAddressName() }, { $"Car #{car.CarInDB} GetGoSleepWithWakeup()", car.GetGoSleepWithWakeup().ToString() }, { $"Car #{car.CarInDB} GetOdometerLastTrip()", car.GetOdometerLastTrip().ToString() }, { $"Car #{car.CarInDB} WebHelper.lastIsDriveTimestamp", car.GetWebHelper().lastIsDriveTimestamp.ToString() }, { $"Car #{car.CarInDB} WebHelper.lastUpdateEfficiency", car.GetWebHelper().lastUpdateEfficiency.ToString() }, { $"Car #{car.CarInDB} TeslaAPIState", car.GetTeslaAPIState().ToString(true).Replace(Environment.NewLine, "<br />") }, }; string carHTMLtable = "<table>" + string.Concat(carvalues.Select(a => string.Format("<tr><td>{0}</td><td>{1}</td></tr>", a.Key, a.Value))) + "</table>"; values.Add($"Car #{car.CarInDB}", carHTMLtable); } /*{ * "TLMemCacheKey.GetOutsideTempAsync", * MemoryCache.Default.Get(Program.TLMemCacheKey.GetOutsideTempAsync.ToString()) != null * ? ((double)MemoryCache.Default.Get(Program.TLMemCacheKey.GetOutsideTempAsync.ToString())).ToString() * : "null" * },*/ IEnumerable <string> trs = values.Select(a => string.Format("<tr><td>{0}</td><td>{1}</td></tr>", a.Key, a.Value)); WriteString(response, "<html><head></head><body><table>" + string.Concat(trs) + "</table></body></html>"); }
private static void InitStage3() { if (!webhelper.RestoreToken()) { webhelper.Tesla_token = webhelper.GetTokenAsync().Result; } if (webhelper.Tesla_token == "NULL") { ExitTeslaLogger("Tesla_token == NULL"); } LogToken(); if (DBHelper.DBConnectionstring.Length == 0) { ExitTeslaLogger("DBHelper.DBConnectionstring.Length == 0"); } if (webhelper.GetVehicles() == "NULL") { ExitTeslaLogger("wh.GetVehicles() == NULL"); } string online = webhelper.IsOnline().Result; Logfile.Log("Streamingtoken: " + webhelper.Tesla_Streamingtoken); if (DBHelper.GetMaxPosid(false) == 0) { Logfile.Log("Insert first Pos"); webhelper.IsDriving(true); } Logfile.Log("Country Code: " + DBHelper.UpdateCountryCode()); DBHelper.GetEconomy_Wh_km(webhelper); webhelper.DeleteWakeupFile(); string carName = webhelper.carSettings.Name; if (webhelper.carSettings.Raven) { carName += " Raven"; } Logfile.Log("Car: " + carName + " - " + webhelper.carSettings.Wh_TR + " Wh/km"); double.TryParse(webhelper.carSettings.Wh_TR, out DBHelper.currentJSON.Wh_TR); DBHelper.GetLastTrip(); UpdateTeslalogger.Start(webhelper); UpdateTeslalogger.UpdateGrafana(webhelper); DBHelper.currentJSON.current_car_version = DBHelper.GetLastCarVersion(); }
void Init() { List <Address> list = new List <Address>(); ReadGeofenceFile(list, FileManager.GetFilePath(TLFilename.GeofenceFilename)); UpdateTeslalogger.chmod(FileManager.GetFilePath(TLFilename.GeofencePrivateFilename), 666); ReadGeofenceFile(list, FileManager.GetFilePath(TLFilename.GeofencePrivateFilename)); Logfile.Log("Addresses inserted: " + list.Count); sortedList = list.OrderBy(o => o.lat).ToList(); }
private static void WriteMissingFile(double missingOdometer) { try { string filepath = System.IO.Path.Combine(FileManager.GetExecutingPath(), "MISSINGKM"); System.IO.File.AppendAllText(filepath, DateTime.Now.ToString(Tools.ciDeDE) + " : " + $"Missing: {missingOdometer}km!\r\n"); UpdateTeslalogger.chmod(filepath, 666, false); } catch (Exception) { } }
private void Debug_TeslaLoggerStates(HttpListenerRequest request, HttpListenerResponse response) { Dictionary <string, string> values = new Dictionary <string, string> { { "System.DateTime.Now", DateTime.Now.ToString() }, { "System.DateTime.UtcNow", DateTime.UtcNow.ToString() }, { "System.DateTime.UnixTime", Tools.ToUnixTime(DateTime.Now).ToString() }, { "Program._currentState", Program.GetCurrentState().ToString() }, { "WebHelper._lastShift_State", Program.GetWebHelper().GetLastShiftState() }, { "Program.highFreequencyLogging", Program.GetHighFreequencyLogging().ToString() }, { "Program.highFrequencyLoggingTicks", Program.GetHighFrequencyLoggingTicks().ToString() }, { "Program.highFrequencyLoggingTicksLimit", Program.GetHighFrequencyLoggingTicksLimit().ToString() }, { "Program.highFrequencyLoggingUntil", Program.GetHighFrequencyLoggingUntil().ToString() }, { "Program.highFrequencyLoggingMode", Program.GetHighFrequencyLoggingMode().ToString() }, { "TLMemCacheKey.GetOutsideTempAsync", MemoryCache.Default.Get(Program.TLMemCacheKey.GetOutsideTempAsync.ToString()) != null ? ((double)MemoryCache.Default.Get(Program.TLMemCacheKey.GetOutsideTempAsync.ToString())).ToString() : "null" }, { "TLMemCacheKey.Housekeeping", MemoryCache.Default.Get(Program.TLMemCacheKey.Housekeeping.ToString()) != null ? "AbsoluteExpiration: " + ((CacheItemPolicy)MemoryCache.Default.Get(Program.TLMemCacheKey.Housekeeping.ToString())).AbsoluteExpiration.ToString() : "null" }, { "Program.lastCarUsed", Program.GetLastCarUsed().ToString() }, { "Program.lastOdometerChanged", Program.GetLastOdometerChanged().ToString() }, { "Program.lastTryTokenRefresh", Program.GetLastTryTokenRefresh().ToString() }, { "Program.lastSetChargeLimitAddressName", Program.GetLastSetChargeLimitAddressName().Equals(string.Empty) ? "<>" : Program.GetLastSetChargeLimitAddressName() }, { "Program.goSleepWithWakeup", Program.GetGoSleepWithWakeup().ToString() }, { "Program.odometerLastTrip", Program.GetOdometerLastTrip().ToString() }, { "WebHelper.lastIsDriveTimestamp", Program.GetWebHelper().lastIsDriveTimestamp.ToString() }, { "WebHelper.lastUpdateEfficiency", Program.GetWebHelper().lastUpdateEfficiency.ToString() }, { "UpdateTeslalogger.lastVersionCheck", UpdateTeslalogger.GetLastVersionCheck().ToString() } }; IEnumerable <string> trs = values.Select(a => string.Format("<tr><td>{0}</td><td>{1}</td></tr>", a.Key, a.Value)); WriteString(response, "<html><head></head><body><table>" + string.Concat(trs) + "</table></body></html>"); }
private static void InitStage1() { Tools.SetThread_enUS(); UpdateTeslalogger.Chmod("nohup.out", 666, false); ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; Logfile.Log("TeslaLogger Version: " + Assembly.GetExecutingAssembly().GetName().Version); Logfile.Log("Teslalogger Online Version: " + WebHelper.GetOnlineTeslaloggerVersion()); Logfile.Log("Logfile Version: " + Assembly.GetAssembly(typeof(Logfile)).GetName().Version); Logfile.Log("SRTM Version: " + Assembly.GetAssembly(typeof(SRTM.SRTMData)).GetName().Version); try { string versionpath = Path.Combine(FileManager.GetExecutingPath(), "VERSION"); File.WriteAllText(versionpath, Assembly.GetExecutingAssembly().GetName().Version.ToString()); } catch (Exception) { } }
void Init() { List <Address> list = new List <Address>(); ReadGeofenceFile(list, FileManager.GetFilePath(TLFilename.GeofenceFilename)); if (!System.IO.File.Exists(FileManager.GetFilePath(TLFilename.GeofencePrivateFilename))) { Logfile.Log("Create: " + FileManager.GetFilePath(TLFilename.GeofencePrivateFilename)); System.IO.File.AppendAllText(FileManager.GetFilePath(TLFilename.GeofencePrivateFilename), ""); } UpdateTeslalogger.chmod(FileManager.GetFilePath(TLFilename.GeofencePrivateFilename), 666); ReadGeofenceFile(list, FileManager.GetFilePath(TLFilename.GeofencePrivateFilename)); Logfile.Log("Addresses inserted: " + list.Count); sortedList = list.OrderBy(o => o.lat).ToList(); }
// if online, switch state and return // else sleep 10000 private static void HandleState_Sleep() { string res = webhelper.IsOnline().Result; if (res == "online") { //Logfile.Log(res); SetCurrentState(TeslaState.Start); webhelper.IsDriving(true); // Positionsmeldung in DB für Wechsel } else { Thread.Sleep(10000); UpdateTeslalogger.CheckForNewVersion(); } }
private static void InitCheckDocker() { try { if (Tools.IsDocker()) { Logfile.Log("Docker: YES!"); ExceptionlessClient.Default.Configuration.DefaultData.Add("Docker", true); if (!File.Exists("/etc/teslalogger/settings.json")) { Logfile.Log("Creating empty settings.json"); File.AppendAllText("/etc/teslalogger/settings.json", GetDefaultConfigFileContent()); UpdateTeslalogger.Chmod("/etc/teslalogger/settings.json", 666); } if (!Directory.Exists("/etc/teslalogger/backup")) { Directory.CreateDirectory("/etc/teslalogger/backup"); UpdateTeslalogger.Chmod("/etc/teslalogger/backup", 777); } if (!Directory.Exists("/etc/teslalogger/Exception")) { Directory.CreateDirectory("/etc/teslalogger/Exception"); UpdateTeslalogger.Chmod("/etc/teslalogger/Exception", 777); } } else { Logfile.Log("Docker: NO!"); } } catch (Exception ex) { ex.ToExceptionless().FirstCarUserID().Submit(); Logfile.Log(ex.ToString()); } }
private static void Main(string[] args) { try { InitDebugLogging(); InitStage1(); InitCheckDocker(); InitStage2(); InitConnectToDB(); InitWebserver(); InitOpenTopoDataService(); UpdateTeslalogger.StopComfortingMessagesThread(); MQTTClient.StartMQTTClient(); InitTLStats(); UpdateDbInBackground(); Logfile.Log("Init finished, now enter main loop"); GetAllCars(); InitNearbySuCService(); } catch (Exception ex) { Logfile.Log(ex.Message); Logfile.ExceptionWriter(ex, "main loop"); Logfile.Log("Teslalogger Stopped!"); } }
private static void InitStage1() { Tools.SetThreadEnUS(); UpdateTeslalogger.Chmod("nohup.out", 666, false); UpdateTeslalogger.Chmod("backup.sh", 777, false); UpdateTeslalogger.Chmod("TeslaLogger.exe", 755, false); #pragma warning disable CA5364 // Verwenden Sie keine veralteten Sicherheitsprotokolle. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; #pragma warning restore CA5364 // Verwenden Sie keine veralteten Sicherheitsprotokolle. Logfile.Log("TeslaLogger Version: " + Assembly.GetExecutingAssembly().GetName().Version); Logfile.Log("Teslalogger Online Version: " + WebHelper.GetOnlineTeslaloggerVersion()); Logfile.Log("Logfile Version: " + Assembly.GetAssembly(typeof(Logfile)).GetName().Version); Logfile.Log("SRTM Version: " + Assembly.GetAssembly(typeof(SRTM.SRTMData)).GetName().Version); try { string versionpath = Path.Combine(FileManager.GetExecutingPath(), "VERSION"); File.WriteAllText(versionpath, Assembly.GetExecutingAssembly().GetName().Version.ToString()); } catch (Exception) { } try { if (File.Exists("BRANCH")) { var branch = File.ReadAllText("BRANCH").Trim(); Logfile.Log($"YOU ARE USING BRANCH: " + branch); ExceptionlessClient.Default.Configuration.DefaultData.Add("Branch", branch); ExceptionlessClient.Default.CreateLog("Program", "BRANCH: " + branch, Exceptionless.Logging.LogLevel.Warn).FirstCarUserID().Submit();; } } catch (Exception ex) { Logfile.Log(ex.ToString()); ex.ToExceptionless().FirstCarUserID().Submit(); } }
private static void InitStage1() { Tools.SetThreadEnUS(); UpdateTeslalogger.Chmod("nohup.out", 666, false); UpdateTeslalogger.Chmod("backup.sh", 777, false); UpdateTeslalogger.Chmod("TeslaLogger.exe", 755, false); #pragma warning disable CA5364 // Verwenden Sie keine veralteten Sicherheitsprotokolle. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; #pragma warning restore CA5364 // Verwenden Sie keine veralteten Sicherheitsprotokolle. Logfile.Log("TeslaLogger Version: " + Assembly.GetExecutingAssembly().GetName().Version); Logfile.Log("Teslalogger Online Version: " + WebHelper.GetOnlineTeslaloggerVersion()); Logfile.Log("Logfile Version: " + Assembly.GetAssembly(typeof(Logfile)).GetName().Version); Logfile.Log("SRTM Version: " + Assembly.GetAssembly(typeof(SRTM.SRTMData)).GetName().Version); try { string versionpath = Path.Combine(FileManager.GetExecutingPath(), "VERSION"); File.WriteAllText(versionpath, Assembly.GetExecutingAssembly().GetName().Version.ToString()); } catch (Exception) { } }
private static void InitCheckDocker() { try { if (Tools.IsDocker()) { Logfile.Log("Docker: YES!"); if (!File.Exists("/etc/teslalogger/settings.json")) { Logfile.Log("Creating empty settings.json"); File.AppendAllText("/etc/teslalogger/settings.json", "{\"SleepTimeSpanStart\":\"\",\"SleepTimeSpanEnd\":\"\",\"SleepTimeSpanEnable\":\"false\",\"Power\":\"hp\",\"Temperature\":\"celsius\",\"Length\":\"km\",\"Language\":\"en\",\"URL_Admin\":\"\",\"ScanMyTesla\":\"false\"}"); UpdateTeslalogger.Chmod("/etc/teslalogger/settings.json", 666); } if (!Directory.Exists("/etc/teslalogger/backup")) { Directory.CreateDirectory("/etc/teslalogger/backup"); UpdateTeslalogger.Chmod("/etc/teslalogger/backup", 777); } if (!Directory.Exists("/etc/teslalogger/Exception")) { Directory.CreateDirectory("/etc/teslalogger/Exception"); UpdateTeslalogger.Chmod("/etc/teslalogger/Exception", 777); } } else { Logfile.Log("Docker: NO!"); } } catch (Exception ex) { Logfile.Log(ex.ToString()); } }
static void Main(string[] args) { CheckNewCredentials(); try { Tools.SetThread_enUS(); Tools.Log("TeslaLogger Version: " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); Tools.Log("Current Culture: " + System.Threading.Thread.CurrentThread.CurrentCulture.ToString()); Tools.Log("Mono Runtime: " + Tools.GetMonoRuntimeVersion()); Tools.Log("DBConnectionstring: " + DBHelper.DBConnectionstring); Tools.Log("Car#:" + ApplicationSettings.Default.Car); Tools.Log("KeepOnlineMinAfterUsage: " + ApplicationSettings.Default.KeepOnlineMinAfterUsage); Tools.Log("SuspendAPIMinutes: " + ApplicationSettings.Default.SuspendAPIMinutes); for (int x = 0; x < 30; x++) // try 30 times until DB is up and running { try { Tools.Log("DB Version: " + DBHelper.GetVersion()); Tools.Log("Count Pos: " + DBHelper.CountPos()); // test the DBConnection break; } catch (Exception ex) { Tools.Log("DBCONNECTION " + ex.Message); System.Threading.Thread.Sleep(10000); } } WebHelper wh = new WebHelper(); if (!wh.RestoreToken()) { wh.Tesla_token = wh.GetTokenAsync().Result; } if (wh.Tesla_token == "NULL") { return; } // don't show full Token in Logfile string tempToken = wh.Tesla_token; if (tempToken.Length > 5) { tempToken = tempToken.Substring(0, tempToken.Length - 5); tempToken += "XXXXX"; } Tools.Log("TOKEN: " + tempToken); if (DBHelper.DBConnectionstring.Length == 0) { return; } if (wh.GetVehicles() == "NULL") { return; } String online = wh.IsOnline().Result; Tools.Log("Streamingtoken: " + wh.Tesla_Streamingtoken); if (DBHelper.GetMaxPosid(false) == 0) { Tools.Log("Insert first Pos"); wh.IsDriving(true); } DBHelper.GetEconomy_Wh_km(wh); wh.DeleteWakeupFile(); Tools.Log("Car: " + wh.carSettings.Name + " - " + wh.carSettings.Wh_TR + " Wh/km"); double.TryParse(wh.carSettings.Wh_TR, out DBHelper.currentJSON.Wh_TR); DBHelper.GetLastTrip(); UpdateTeslalogger.Start(wh); UpdateTeslalogger.UpdateGrafana(wh); DBHelper.currentJSON.current_car_version = DBHelper.GetLastCarVersion(); MQTTClient.StartMQTTClient(); Task.Factory.StartNew(() => wh.UpdateAllPOIAddresses()); Task.Factory.StartNew(() => DBHelper.CheckForInterruptedCharging(true)); // wh.IsDriving(); // wh.GetCachedRollupData(); //wh.GetEnergyChartData(); // wh.StartStreamThread(); // xxx DBHelper.UpdateIncompleteTrips(); while (true) { try { switch (currentState) { case TeslaState.Start: { RefreshToken(wh); // Alle States werden geschlossen DBHelper.CloseChargingState(); DBHelper.CloseDriveState(wh.lastIsDriveTimestamp); string res = wh.IsOnline().Result; lastCarUsed = DateTime.Now; if (res == "online") { Tools.Log(res); currentState = TeslaState.Online; wh.IsDriving(true); DBHelper.StartState(res); continue; } else if (res == "asleep") { Tools.Log(res); currentState = TeslaState.Sleep; DBHelper.StartState(res); DBHelper.currentJSON.CreateCurrentJSON(); } else if (res == "offline") { Tools.Log(res); DBHelper.StartState(res); DBHelper.currentJSON.CreateCurrentJSON(); } else { DBHelper.currentJSON.current_sleeping = false; DBHelper.currentJSON.current_online = false; DBHelper.currentJSON.CreateCurrentJSON(); Tools.Log("Unhandled State: " + res); } } break; case TeslaState.Online: { if (wh.IsDriving()) { lastCarUsed = DateTime.Now; Tools.Log("Driving"); // TODO: StartDriving currentState = TeslaState.Drive; wh.StartStreamThread(); // für altitude DBHelper.StartDriveState(); Task.Run(() => wh.DeleteWakeupFile()); continue; } else if (wh.isCharging()) { lastCarUsed = DateTime.Now; Tools.Log("Charging"); wh.IsDriving(true); DBHelper.StartChargingState(); currentState = TeslaState.Charge; wh.DeleteWakeupFile(); } else { RefreshToken(wh); int startSleepHour, startSleepMinute; Tools.StartSleeping(out startSleepHour, out startSleepMinute); bool sleep = false; if (FileManager.CheckCmdGoSleepFile()) { Tools.Log("STOP communication with Tesla Server to enter sleep Mode! (Sleep Button) https://teslalogger.de/faq-1.php"); currentState = TeslaState.GoSleep; goSleepWithWakeup = false; } else if (DateTime.Now.Hour == startSleepHour && DateTime.Now.Minute == startSleepMinute) { Tools.Log("STOP communication with Tesla Server to enter sleep Mode! (Timespan Sleep Mode) https://teslalogger.de/faq-1.php"); currentState = TeslaState.GoSleep; goSleepWithWakeup = true; } else { // wenn er 15 min online war und nicht geladen oder gefahren ist, dann muss man ihn die möglichkeit geben offline zu gehen TimeSpan ts = DateTime.Now - lastCarUsed; if (ts.TotalMinutes > ApplicationSettings.Default.KeepOnlineMinAfterUsage) { currentState = TeslaState.Start; wh.IsDriving(true); // kurz bevor er schlafen geht, eine Positionsmeldung speichern und schauen ob standheizung / standklima / sentry läuft. if (wh.is_preconditioning) { Tools.Log("preconditioning prevents car to get sleep"); lastCarUsed = DateTime.Now; } else if (wh.is_sentry_mode) { Tools.Log("sentry_mode prevents car to get sleep"); lastCarUsed = DateTime.Now; } else { try { Tools.Log("STOP communication with Tesla Server to enter sleep Mode! https://teslalogger.de/faq-1.php"); for (int x = 0; x < ApplicationSettings.Default.SuspendAPIMinutes * 10; x++) { if (wh.existsWakeupFile) { Tools.Log("Wakeupfile prevents car to get sleep"); wh.DeleteWakeupFile(); string wakeup = wh.Wakeup().Result; sleep = false; break; } if (x % 10 == 0) { Tools.Log("Waiting for car to go to sleep " + (x / 10).ToString()); Tools.StartSleeping(out startSleepHour, out startSleepMinute); if (DateTime.Now.Hour == startSleepHour && DateTime.Now.Minute == startSleepMinute) { Tools.Log("STOP communication with Tesla Server to enter sleep Mode! (Timespan Sleep Mode) https://teslalogger.de/faq-1.php"); currentState = TeslaState.GoSleep; goSleepWithWakeup = true; break; } } System.Threading.Thread.Sleep(1000 * 6); } } finally { if (!goSleepWithWakeup) { Tools.Log("Restart communication with Tesla Server!"); } } } } } if (sleep) { System.Threading.Thread.Sleep(5000); } else { continue; } } } break; case TeslaState.Charge: { if (!wh.isCharging()) { // TODO: ende des ladens in die datenbank schreiben currentState = TeslaState.Start; wh.IsDriving(true); } else { lastCarUsed = DateTime.Now; System.Threading.Thread.Sleep(10000); //wh.GetCachedRollupData(); } } break; case TeslaState.Sleep: { string res = wh.IsOnline().Result; if (res == "online") { Tools.Log(res); currentState = TeslaState.Start; wh.IsDriving(true); // Positionsmeldung in DB für Wechsel } else { // Tools.Log(res); System.Threading.Thread.Sleep(10000); } } break; case TeslaState.Drive: { int t = Environment.TickCount; if (wh.IsDriving()) { lastCarUsed = DateTime.Now; t = 4000 - (Environment.TickCount - t); if (t > 0) { System.Threading.Thread.Sleep(t); // alle 5 sek eine positionsmeldung } } else { // fahren aufgehört // TODO: Fahrt beenden currentState = TeslaState.Start; DBHelper.currentJSON.current_trip_end = DateTime.Now; DBHelper.currentJSON.current_trip_km_end = DBHelper.currentJSON.current_odometer; DBHelper.currentJSON.current_trip_end_range = DBHelper.currentJSON.current_ideal_battery_range_km; wh.StopStreaming(); } } break; case TeslaState.GoSleep: { bool KeepSleeping = true; int round = 0; try { while (KeepSleeping) { round++; System.Threading.Thread.Sleep(1000); if (System.IO.File.Exists(FileManager.GetFilePath(TLFilename.WakeupFilename))) { if (wh.DeleteWakeupFile()) { string wakeup = wh.Wakeup().Result; } KeepSleeping = false; currentState = TeslaState.Start; break; } else if (round > 10) { round = 0; if (wh.TaskerWakeupfile()) { if (wh.DeleteWakeupFile()) { string wakeup = wh.Wakeup().Result; } KeepSleeping = false; currentState = TeslaState.Start; break; } } if (goSleepWithWakeup) { int stopSleepingHour, stopSleepingMinute; Tools.EndSleeping(out stopSleepingHour, out stopSleepingMinute); if (DateTime.Now.Hour == stopSleepingHour && DateTime.Now.Minute == stopSleepingMinute) { Tools.Log("Stop Sleeping Timespan reached!"); KeepSleeping = false; currentState = TeslaState.Start; break; } } } } finally { Tools.Log("Restart communication with Tesla Server!"); } } break; } } catch (Exception ex) { Tools.ExceptionWriter(ex, "While Schleife"); } System.Threading.Thread.Sleep(1000); } } catch (Exception ex) { Tools.Log(ex.Message); Tools.ExceptionWriter(ex, "While Schleife"); } finally { Tools.Log("Teslalogger Stopped!"); } }
private void updategrafana(HttpListenerRequest request, HttpListenerResponse response) { Tools.lastGrafanaSettings = DateTime.UtcNow.AddDays(-1); Task.Run(() => { UpdateTeslalogger.UpdateGrafana(); }); WriteString(response, @"OK"); }
public static void Start(WebHelper wh) { try { if (!DBHelper.ColumnExists("pos", "battery_level")) { Logfile.Log("ALTER TABLE pos ADD COLUMN battery_level DOUBLE NULL"); DBHelper.ExecuteSQLQuery("ALTER TABLE pos ADD COLUMN battery_level DOUBLE NULL"); } if (!DBHelper.ColumnExists("drivestate", "outside_temp_avg")) { Logfile.Log("ALTER TABLE drivestate ADD COLUMN outside_temp_avg DOUBLE NULL, ADD COLUMN speed_max INT NULL, ADD COLUMN power_max INT NULL, ADD COLUMN power_min INT NULL, ADD COLUMN power_avg DOUBLE NULL"); DBHelper.ExecuteSQLQuery("ALTER TABLE drivestate ADD COLUMN outside_temp_avg DOUBLE NULL, ADD COLUMN speed_max INT NULL, ADD COLUMN power_max INT NULL, ADD COLUMN power_min INT NULL, ADD COLUMN power_avg DOUBLE NULL"); DBHelper.UpdateAllDrivestateData(); } if (!DBHelper.ColumnExists("charging", "charger_pilot_current")) { Logfile.Log("ALTER TABLE charging ADD COLUMN charger_pilot_current INT NULL, ADD COLUMN charge_current_request INT NULL"); DBHelper.ExecuteSQLQuery("ALTER TABLE charging ADD COLUMN charger_pilot_current INT NULL, ADD COLUMN charge_current_request INT NULL"); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.TableExists("car_version")) { Logfile.Log("CREATE TABLE car_version (id int NOT NULL AUTO_INCREMENT, StartDate datetime NOT NULL, version varchar(50), PRIMARY KEY(id))"); DBHelper.ExecuteSQLQuery("CREATE TABLE car_version (id int NOT NULL AUTO_INCREMENT, StartDate datetime NOT NULL, version varchar(50), PRIMARY KEY(id))"); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.TableExists("can")) { Logfile.Log("CREATE TABLE `can` (`datum` datetime NOT NULL, `id` mediumint NOT NULL, `val` double DEFAULT NULL, PRIMARY KEY(`datum`,`id`) ) ENGINE = InnoDB DEFAULT CHARSET = latin1;"); DBHelper.ExecuteSQLQuery("CREATE TABLE `can` (`datum` datetime NOT NULL, `id` mediumint NOT NULL, `val` double DEFAULT NULL, PRIMARY KEY(`datum`,`id`) ) ENGINE = InnoDB DEFAULT CHARSET = latin1;"); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("pos", "inside_temp")) { Logfile.Log("ALTER TABLE pos ADD COLUMN inside_temp DOUBLE NULL"); DBHelper.ExecuteSQLQuery("ALTER TABLE pos ADD COLUMN inside_temp DOUBLE NULL", 300); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("pos", "battery_heater")) { Logfile.Log("ALTER TABLE pos ADD COLUMN battery_heater TINYINT(1) NULL"); DBHelper.ExecuteSQLQuery("ALTER TABLE pos ADD COLUMN battery_heater TINYINT(1) NULL", 300); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("pos", "is_preconditioning")) { Logfile.Log("ALTER TABLE pos ADD COLUMN is_preconditioning TINYINT(1) NULL"); DBHelper.ExecuteSQLQuery("ALTER TABLE pos ADD COLUMN is_preconditioning TINYINT(1) NULL", 300); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("pos", "sentry_mode")) { Logfile.Log("ALTER TABLE pos ADD COLUMN sentry_mode TINYINT(1) NULL"); DBHelper.ExecuteSQLQuery("ALTER TABLE pos ADD COLUMN sentry_mode TINYINT(1) NULL", 300); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("chargingstate", "conn_charge_cable")) { Logfile.Log("ALTER TABLE chargingstate ADD COLUMN conn_charge_cable varchar(50)"); DBHelper.ExecuteSQLQuery("ALTER TABLE chargingstate ADD COLUMN conn_charge_cable varchar(50)", 300); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("chargingstate", "fast_charger_brand")) { Logfile.Log("ALTER TABLE chargingstate ADD COLUMN fast_charger_brand varchar(50)"); DBHelper.ExecuteSQLQuery("ALTER TABLE chargingstate ADD COLUMN fast_charger_brand varchar(50)", 300); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("chargingstate", "fast_charger_type")) { Logfile.Log("ALTER TABLE chargingstate ADD COLUMN fast_charger_type varchar(50)"); DBHelper.ExecuteSQLQuery("ALTER TABLE chargingstate ADD COLUMN fast_charger_type varchar(50)", 300); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("chargingstate", "fast_charger_present")) { Logfile.Log("ALTER TABLE chargingstate ADD COLUMN fast_charger_present TINYINT(1)"); DBHelper.ExecuteSQLQuery("ALTER TABLE chargingstate ADD COLUMN fast_charger_present TINYINT(1)", 300); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("charging", "battery_heater")) { Logfile.Log("ALTER TABLE charging ADD COLUMN battery_heater TINYINT(1) NULL"); DBHelper.ExecuteSQLQuery("ALTER TABLE charging ADD COLUMN battery_heater TINYINT(1) NULL", 600); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("chargingstate", "max_charger_power")) { Logfile.Log("ALTER TABLE chargingstate ADD COLUMN max_charger_power int NULL"); DBHelper.ExecuteSQLQuery("ALTER TABLE chargingstate ADD COLUMN max_charger_power int NULL", 600); Logfile.Log("ALTER TABLE OK"); } if (!DBHelper.ColumnExists("trip", "outside_temp_avg")) { UpdateDBView(wh); } System.Threading.Timer t = new System.Threading.Timer(FileChecker, null, 10000, 5000); chmod("/var/www/html/admin/wallpapers", 777); UpdatePHPini(); try { // create empty weather.ini file string filepath = System.IO.Path.Combine(FileManager.GetExecutingPath(), "weather.ini"); if (!File.Exists(filepath)) { System.IO.File.WriteAllText(filepath, "city = \"Berlin, de\"\r\nappid = \"12345678901234567890123456789012\""); } UpdateTeslalogger.chmod(filepath, 666, false); } catch (Exception) { } if (System.IO.File.Exists("cmd_updated.txt")) { Logfile.Log("Update skipped!"); return; } System.IO.File.AppendAllText("cmd_updated.txt", DateTime.Now.ToLongTimeString()); Logfile.Log("Start update"); if (Tools.IsMono()) { chmod("VERSION", 666); chmod("settings.json", 666); chmod("cmd_updated.txt", 666); chmod("MQTTClient.exe.config", 666); if (!exec_mono("git", "--version", false).Contains("git version")) { exec_mono("apt-get", "-y install git"); exec_mono("git", "--version"); } exec_mono("rm", "-rf /etc/teslalogger/git/*"); exec_mono("rm", "-rf /etc/teslalogger/git"); exec_mono("mkdir", "/etc/teslalogger/git"); exec_mono("git", "clone https://github.com/bassmaster187/TeslaLogger /etc/teslalogger/git/"); Tools.CopyFilesRecursively(new System.IO.DirectoryInfo("/etc/teslalogger/git/TeslaLogger/GrafanaPlugins"), new System.IO.DirectoryInfo("/var/lib/grafana/plugins")); Tools.CopyFilesRecursively(new System.IO.DirectoryInfo("/etc/teslalogger/git/TeslaLogger/www"), new System.IO.DirectoryInfo("/var/www/html")); Tools.CopyFile("/etc/teslalogger/git/TeslaLogger/bin/geofence.csv", "/etc/teslalogger/geofence.csv"); Tools.CopyFile("/etc/teslalogger/git/TeslaLogger/GrafanaConfig/sample.yaml", "/etc/grafana/provisioning/dashboards/sample.yaml"); if (!System.IO.Directory.Exists("/var/lib/grafana/dashboards")) { System.IO.Directory.CreateDirectory("/var/lib/grafana/dashboards"); } Tools.CopyFilesRecursively(new System.IO.DirectoryInfo("/etc/teslalogger/git/TeslaLogger/bin"), new System.IO.DirectoryInfo("/etc/teslalogger")); try { if (!File.Exists("/etc/teslalogger/MQTTClient.exe.config")) { Logfile.Log("Copy empty MQTTClient.exe.config file"); Tools.CopyFile("/etc/teslalogger/git/MQTTClient/App.config", "/etc/teslalogger/MQTTClient.exe.config"); } } catch (Exception ex) { Logfile.Log(ex.ToString()); } } Logfile.Log("End update"); Logfile.Log("Rebooting"); exec_mono("reboot", ""); } catch (Exception ex) { Logfile.Log("Error in update: " + ex.ToString()); } }
static void Main(string[] args) { try { Tools.SetThread_enUS(); Tools.Log("TeslaLogger Version: " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); Tools.Log("Current Culture: " + System.Threading.Thread.CurrentThread.CurrentCulture.ToString()); Tools.Log("Mono Runtime: " + Tools.GetMonoRuntimeVersion()); Tools.Log("DBConnectionstring: " + DBHelper.DBConnectionstring); Tools.Log("Car#:" + ApplicationSettings.Default.Car); Tools.Log("KeepOnlineMinAfterUsage: " + ApplicationSettings.Default.KeepOnlineMinAfterUsage); Tools.Log("SuspendAPIMinutes: " + ApplicationSettings.Default.SuspendAPIMinutes); for (int x = 0; x < 30; x++) // try 30 times until DB is up and running { try { x++; Tools.Log("DB Version: " + DBHelper.GetVersion()); Tools.Log("Count Pos: " + DBHelper.CountPos()); // test the DBConnection break; } catch (Exception ex) { Tools.Log("DBCONNECTION " + ex.Message); System.Threading.Thread.Sleep(10000); } } WebHelper wh = new WebHelper(); wh.Tesla_token = wh.GetTokenAsync().Result; if (wh.Tesla_token == "NULL") { return; } // don't show full Token in Logfile string tempToken = wh.Tesla_token; if (tempToken.Length > 5) { tempToken = tempToken.Substring(0, tempToken.Length - 5); tempToken += "XXXXX"; } Tools.Log("TOKEN: " + tempToken); if (DBHelper.DBConnectionstring.Length == 0) { return; } if (wh.GetVehicles() == "NULL") { return; } String online = wh.IsOnline().Result; Tools.Log("Streamingtoken: " + wh.Tesla_Streamingtoken); if (DBHelper.GetMaxPosid() == 0) { Tools.Log("Insert first Pos"); wh.IsDriving(true); } wh.DeleteWakeupFile(); UpdateTeslalogger.Start(); try { System.Threading.Thread MQTTthread = new System.Threading.Thread(StartMqttClient); MQTTthread.Start(); } catch (Exception ex) { Tools.Log(ex.ToString()); } // Task.Factory.StartNew(() => wh.UpdateAllPosAddresses()); // Task.Factory.StartNew(() => wh.UpdateAllPOIAddresses()); // wh.IsDriving(); // wh.GetCachedRollupData(); //wh.GetEnergyChartData(); while (true) { try { switch (currentState) { case TeslaState.Start: { TimeSpan ts = DateTime.Now - lastTokenRefresh; if (ts.TotalDays > 9) { wh.Tesla_token = wh.GetTokenAsync().Result; lastTokenRefresh = DateTime.Now; if (wh.Tesla_token == "NULL") { return; } } // Alle States werden geschlossen DBHelper.CloseChargingState(); DBHelper.CloseDriveState(); string res = wh.IsOnline().Result; // xxx test /* * wh.StartStreamThread(); * * System.Threading.Thread.Sleep(10000); * wh.IsDriving(true); * System.Threading.Thread.Sleep(5000); * wh.IsDriving(true); * System.Threading.Thread.Sleep(5000); * wh.IsDriving(true); * System.Threading.Thread.Sleep(5000); * wh.IsDriving(true); * System.Threading.Thread.Sleep(5000); * wh.IsDriving(true); * System.Threading.Thread.Sleep(5000); * wh.IsDriving(true); * wh.StopStreaming(); */ lastCarUsed = DateTime.Now; if (res == "online") { Tools.Log(res); currentState = TeslaState.Online; wh.IsDriving(true); DBHelper.StartState(res); } else if (res == "asleep") { Tools.Log(res); currentState = TeslaState.Sleep; DBHelper.StartState(res); System.Threading.Thread.Sleep(10000); } else if (res == "offline") { Tools.Log(res); DBHelper.StartState(res); System.Threading.Thread.Sleep(10000); } else { Tools.Log(res); } } break; case TeslaState.Online: { if (wh.isCharging()) { lastCarUsed = DateTime.Now; Tools.Log("Charging"); wh.IsDriving(true); DBHelper.StartChargingState(); currentState = TeslaState.Charge; wh.DeleteWakeupFile(); } else if (wh.IsDriving()) { lastCarUsed = DateTime.Now; Tools.Log("Driving"); // TODO: StartDriving wh.IsDriving(true); currentState = TeslaState.Drive; wh.StartStreamThread(); // für altitude DBHelper.StartDriveState(); wh.DeleteWakeupFile(); } else { int startSleepHour, startSleepMinute; Tools.StartSleeping(out startSleepHour, out startSleepMinute); if (System.IO.File.Exists("cmd_gosleep.txt")) { System.IO.File.Delete("cmd_gosleep.txt"); Tools.Log("Go to Sleep Mode!"); currentState = TeslaState.GoSleep; goSleepWithWakeup = false; } else if (DateTime.Now.Hour == startSleepHour && DateTime.Now.Minute == startSleepMinute) { Tools.Log("Go to Timespan Sleep Mode!"); currentState = TeslaState.GoSleep; goSleepWithWakeup = true; } else { // wenn er 15 min online war und nicht geladen oder gefahren ist, dann muss man ihn die möglichkeit geben offline zu gehen TimeSpan ts = DateTime.Now - lastCarUsed; if (ts.TotalMinutes > ApplicationSettings.Default.KeepOnlineMinAfterUsage) { currentState = TeslaState.Start; wh.IsDriving(true); // kurz bevor er schlafen geht, eine Positionsmeldung speichern und schauen ob standheizung / standklima läuft. if (wh.is_preconditioning) { Tools.Log("preconditioning prevents car to get sleep"); lastCarUsed = DateTime.Now; } else { for (int x = 0; x < ApplicationSettings.Default.SuspendAPIMinutes; x++) { if (wh.existsWakeupFile) { Tools.Log("Wakeupfile prevents car to get sleep"); wh.DeleteWakeupFile(); break; } Tools.Log("Waiting for car to go to sleep " + x.ToString()); System.Threading.Thread.Sleep(1000 * 60); } } } } System.Threading.Thread.Sleep(20000); } } break; case TeslaState.Charge: { if (!wh.isCharging()) { // TODO: ende des ladens in die datenbank schreiben currentState = TeslaState.Start; wh.IsDriving(true); } else { lastCarUsed = DateTime.Now; System.Threading.Thread.Sleep(10000); //wh.GetCachedRollupData(); } } break; case TeslaState.Sleep: { string res = wh.IsOnline().Result; if (res == "online") { Tools.Log(res); currentState = TeslaState.Start; wh.IsDriving(true); // Positionsmeldung in DB für Wechsel } else { // Tools.Log(res); System.Threading.Thread.Sleep(10000); } } break; case TeslaState.Drive: { int t = Environment.TickCount; if (wh.IsDriving()) { lastCarUsed = DateTime.Now; t = 4000 - (Environment.TickCount - t); if (t > 0) { System.Threading.Thread.Sleep(t); // alle 5 sek eine positionsmeldung } } else { // fahren aufgehört // TODO: Fahrt beenden currentState = TeslaState.Start; wh.StopStreaming(); } } break; case TeslaState.GoSleep: { bool KeepSleeping = true; int round = 0; while (KeepSleeping) { round++; System.Threading.Thread.Sleep(5000); if (System.IO.File.Exists("wakeupteslalogger.txt")) { wh.DeleteWakeupFile(); KeepSleeping = false; currentState = TeslaState.Start; break; } else if (round > 24) { round = 0; if (wh.existsWakeupFile) { wh.DeleteWakeupFile(); KeepSleeping = false; currentState = TeslaState.Start; break; } } if (goSleepWithWakeup) { int stopSleepingHour, stopSleepingMinute; Tools.EndSleeping(out stopSleepingHour, out stopSleepingMinute); if (DateTime.Now.Hour == stopSleepingHour && DateTime.Now.Minute == stopSleepingMinute) { Tools.Log("Restart Connecting to API"); KeepSleeping = false; currentState = TeslaState.Start; break; } } } } break; } } catch (Exception ex) { Tools.ExceptionWriter(ex, "While Schleife"); } System.Threading.Thread.Sleep(1000); } } catch (Exception ex) { Tools.ExceptionWriter(ex, "While Schleife"); } }
public static void CheckForNewVersion() { try { TimeSpan ts = DateTime.UtcNow - lastVersionCheck; if (ts.TotalMinutes > 120) { Logfile.Log(" *** Check new Version ***"); string online_version = WebHelper.GetOnlineTeslaloggerVersion(); if (String.IsNullOrEmpty(online_version)) { // recheck in 10 Minutes Logfile.Log("Empty Version String - recheck in 10 minutes"); lastVersionCheck = lastVersionCheck.AddMinutes(10); return; } lastVersionCheck = DateTime.UtcNow; string currentVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); Tools.UpdateType updateType = Tools.UpdateSettings(); if (UpdateNeeded(currentVersion, online_version, updateType)) { // if update doesn't work, it will retry tomorrow lastVersionCheck = DateTime.UtcNow.AddDays(1); Logfile.Log("---------------------------------------------"); Logfile.Log(" *** New Version Detected *** "); Logfile.Log("Current Version: " + currentVersion); Logfile.Log("Online Version: " + online_version); Logfile.Log("Start update!"); string cmd_updated = "/etc/teslalogger/cmd_updated.txt"; if (File.Exists(cmd_updated)) { File.Delete(cmd_updated); } if (Tools.IsDocker()) { Logfile.Log(" Docker detected!"); File.WriteAllText("/tmp/teslalogger-cmd-restart.txt", "update"); } else { Logfile.Log("Rebooting"); UpdateTeslalogger.Exec_mono("reboot", ""); } } return; } } catch (Exception ex) { Logfile.Log(ex.ToString()); } }
private static void Main(string[] args) { try { try { ExceptionlessClient.Default.Startup(ApplicationSettings.Default.ExceptionlessApiKey); // ExceptionlessClient.Default.Configuration.UseFileLogger("exceptionless.log"); ExceptionlessClient.Default.Configuration.ServerUrl = ApplicationSettings.Default.ExceptionlessServerUrl; ExceptionlessClient.Default.Configuration.SetVersion(Assembly.GetExecutingAssembly().GetName().Version); ExceptionlessClient.Default.CreateLog("Program", "Start " + Assembly.GetExecutingAssembly().GetName().Version, Exceptionless.Logging.LogLevel.Info).FirstCarUserID().Submit(); } catch (Exception ex) { Logfile.Log(ex.ToString()); } InitDebugLogging(); InitStage1(); InitCheckDocker(); InitStage2(); InitConnectToDB(); InitWebserver(); InitOpenTopoDataService(); InitStaticMapService(); UpdateTeslalogger.StopComfortingMessagesThread(); MQTTClient.StartMQTTClient(); InitTLStats(); UpdateDbInBackground(); Logfile.Log("Init finished, now enter main loop"); GetAllCars(); InitNearbySuCService(); } catch (Exception ex) { Logfile.Log(ex.Message); Logfile.ExceptionWriter(ex, "main loop"); Logfile.Log("Teslalogger Stopped!"); Tools.ExternalLog("Teslalogger Stopped! " + ex.ToString()); ex.ToExceptionless().FirstCarUserID().Submit(); ExceptionlessClient.Default.ProcessQueue(); } finally { if (!UpdateTeslalogger.DownloadUpdateAndInstallStarted) { try { Logfile.Log("Startup doesn't sucessfully run DownloadUpdateAndInstall() - retry now!"); ExceptionlessClient.Default.SubmitLog("Program", "Startup doesn't sucessfully run DownloadUpdateAndInstall() - retry now!"); UpdateTeslalogger.DownloadUpdateAndInstall(); } catch (Exception ex) { Logfile.Log(ex.Message); // Logfile.ExceptionWriter(ex, "Emergency DownloadUpdateAndInstall()"); ExceptionlessClient.Default.SubmitLog("Program", "Emergency DownloadUpdateAndInstall()"); } } } }
static void Main(string[] args) { CheckNewCredentials(); try { Tools.SetThread_enUS(); UpdateTeslalogger.chmod("nohup.out", 666, false); ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; Logfile.Log("TeslaLogger Version: " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); Logfile.Log("Logfile Version: " + System.Reflection.Assembly.GetAssembly(typeof(Logfile)).GetName().Version); Logfile.Log("SRTM Version: " + System.Reflection.Assembly.GetAssembly(typeof(SRTM.SRTMData)).GetName().Version); try { string versionpath = System.IO.Path.Combine(FileManager.GetExecutingPath(), "VERSION"); System.IO.File.WriteAllText(versionpath, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); } catch (Exception) { } try { if (Tools.IsDocker()) { Logfile.Log("Docker: YES!"); if (!System.IO.File.Exists("/etc/teslalogger/settings.json")) { Logfile.Log("Creating empty settings.json"); System.IO.File.AppendAllText("/etc/teslalogger/settings.json", "{\"SleepTimeSpanStart\":\"\",\"SleepTimeSpanEnd\":\"\",\"SleepTimeSpanEnable\":\"false\",\"Power\":\"hp\",\"Temperature\":\"celsius\",\"Length\":\"km\",\"Language\":\"en\",\"URL_Admin\":\"\",\"ScanMyTesla\":\"false\"}"); UpdateTeslalogger.chmod("/etc/teslalogger/settings.json", 666); } if (!System.IO.Directory.Exists("/etc/teslalogger/backup")) { System.IO.Directory.CreateDirectory("/etc/teslalogger/backup"); UpdateTeslalogger.chmod("/etc/teslalogger/backup", 777); } if (!System.IO.Directory.Exists("/etc/teslalogger/Exception")) { System.IO.Directory.CreateDirectory("/etc/teslalogger/Exception"); UpdateTeslalogger.chmod("/etc/teslalogger/Exception", 777); } } else { Logfile.Log("Docker: NO!"); } } catch (Exception ex) { Logfile.Log(ex.ToString()); } Logfile.Log("Current Culture: " + System.Threading.Thread.CurrentThread.CurrentCulture.ToString()); Logfile.Log("Mono Runtime: " + Tools.GetMonoRuntimeVersion()); Logfile.Log("Grafana Version: " + Tools.GetGrafanaVersion()); Logfile.Log("OS Version: " + Tools.GetOsVersion()); Logfile.Log("DBConnectionstring: " + DBHelper.DBConnectionstring); Logfile.Log("Car#:" + ApplicationSettings.Default.Car); Logfile.Log("KeepOnlineMinAfterUsage: " + ApplicationSettings.Default.KeepOnlineMinAfterUsage); Logfile.Log("SuspendAPIMinutes: " + ApplicationSettings.Default.SuspendAPIMinutes); Logfile.Log("SleepPositions: " + ApplicationSettings.Default.SleepPosition); Logfile.Log("UseScanMyTesla: " + Tools.UseScanMyTesla()); for (int x = 1; x <= 30; x++) // try 30 times until DB is up and running { try { Logfile.Log("DB Version: " + DBHelper.GetVersion()); Logfile.Log("Count Pos: " + DBHelper.CountPos()); // test the DBConnection break; } catch (Exception ex) { if (ex.Message.Contains("Connection refused")) { Logfile.Log($"Wait for DB ({x}/30): Connection refused."); } else { Logfile.Log("DBCONNECTION " + ex.Message); } System.Threading.Thread.Sleep(15000); } } WebHelper wh = new WebHelper(); if (!wh.RestoreToken()) { wh.Tesla_token = wh.GetTokenAsync().Result; } if (wh.Tesla_token == "NULL") { return; } // don't show full Token in Logfile string tempToken = wh.Tesla_token; if (tempToken.Length > 5) { tempToken = tempToken.Substring(0, tempToken.Length - 5); tempToken += "XXXXX"; } Logfile.Log("TOKEN: " + tempToken); if (DBHelper.DBConnectionstring.Length == 0) { return; } if (wh.GetVehicles() == "NULL") { return; } String online = wh.IsOnline().Result; Logfile.Log("Streamingtoken: " + wh.Tesla_Streamingtoken); if (DBHelper.GetMaxPosid(false) == 0) { Logfile.Log("Insert first Pos"); wh.IsDriving(true); } DBHelper.GetEconomy_Wh_km(wh); wh.DeleteWakeupFile(); String carName = wh.carSettings.Name; if (wh.carSettings.Raven) { carName += " Raven"; } Logfile.Log("Car: " + carName + " - " + wh.carSettings.Wh_TR + " Wh/km"); double.TryParse(wh.carSettings.Wh_TR, out DBHelper.currentJSON.Wh_TR); DBHelper.GetLastTrip(); UpdateTeslalogger.Start(wh); UpdateTeslalogger.UpdateGrafana(wh); DBHelper.currentJSON.current_car_version = DBHelper.GetLastCarVersion(); MQTTClient.StartMQTTClient(); new System.Threading.Thread(() => { System.Threading.Thread.Sleep(30000); DBHelper.UpdateElevationForAllPoints(); WebHelper.UpdateAllPOIAddresses(); DBHelper.CheckForInterruptedCharging(true); wh.UpdateAllEmptyAddresses(); DBHelper.UpdateIncompleteTrips(); DBHelper.UpdateAllChargingMaxPower(); var sd = new ShareData(wh.TaskerHash); sd.SendAllChargingData(); sd.SendDegradationData(); }).Start(); DBHelper.currentJSON.current_odometer = DBHelper.getLatestOdometer(); DBHelper.currentJSON.CreateCurrentJSON(); // wh.IsDriving(); // wh.GetCachedRollupData(); // wh.GetEnergyChartData(); // wh.StartStreamThread(); // xxx // string w = wh.Wakeup().Result; Address lastRacingPoint = null; while (true) { try { switch (currentState) { case TeslaState.Start: { RefreshToken(wh); if (wh.scanMyTesla != null) { wh.scanMyTesla.FastMode(false); } // Alle States werden geschlossen DBHelper.CloseChargingState(); DBHelper.CloseDriveState(wh.lastIsDriveTimestamp); string res = wh.IsOnline().Result; lastCarUsed = DateTime.Now; if (res == "online") { Logfile.Log(res); currentState = TeslaState.Online; wh.IsDriving(true); wh.ResetLastChargingState(); DBHelper.StartState(res); continue; } else if (res == "asleep") { Logfile.Log(res); currentState = TeslaState.Sleep; DBHelper.StartState(res); wh.ResetLastChargingState(); DBHelper.currentJSON.CreateCurrentJSON(); } else if (res == "offline") { Logfile.Log(res); DBHelper.StartState(res); DBHelper.currentJSON.CreateCurrentJSON(); while (true) { System.Threading.Thread.Sleep(30000); string res2 = wh.IsOnline().Result; if (res2 != "offline") { Logfile.Log("Back Online: " + res2); break; } if (wh.TaskerWakeupfile()) { if (wh.DeleteWakeupFile()) { string wakeup = wh.Wakeup().Result; lastCarUsed = DateTime.Now; } currentState = TeslaState.Start; break; } } } else { DBHelper.currentJSON.current_sleeping = false; DBHelper.currentJSON.current_online = false; DBHelper.currentJSON.CreateCurrentJSON(); Logfile.Log("Unhandled State: " + res); } } break; case TeslaState.Online: { if (wh.IsDriving() && DBHelper.currentJSON.current_speed > 0) { wh.ResetLastChargingState(); lastCarUsed = DateTime.Now; lastOdometerChanged = DateTime.Now; Logfile.Log("Driving"); if (wh.scanMyTesla != null) { wh.scanMyTesla.FastMode(true); } double missingOdometer = DBHelper.currentJSON.current_odometer - odometerLastTrip; if (odometerLastTrip != 0) { if (missingOdometer > 5) { Logfile.Log($"Missing: {missingOdometer} km! - Check: https://teslalogger.de/faq-1.php"); WriteMissingFile(missingOdometer); } else { Logfile.Log($"Missing: {missingOdometer} km"); } } // TODO: StartDriving currentState = TeslaState.Drive; wh.StartStreamThread(); // für altitude DBHelper.StartDriveState(); Task.Run(() => wh.DeleteWakeupFile()); continue; } else if (wh.isCharging(true)) { lastCarUsed = DateTime.Now; Logfile.Log("Charging"); if (wh.scanMyTesla != null) { wh.scanMyTesla.FastMode(true); } wh.IsDriving(true); DBHelper.StartChargingState(wh); currentState = TeslaState.Charge; wh.DeleteWakeupFile(); } else { RefreshToken(wh); int startSleepHour, startSleepMinute; Tools.StartSleeping(out startSleepHour, out startSleepMinute); bool sleep = true; if (FileManager.CheckCmdGoSleepFile()) { Logfile.Log("STOP communication with Tesla Server to enter sleep Mode! (Sleep Button) https://teslalogger.de/faq-1.php"); currentState = TeslaState.GoSleep; goSleepWithWakeup = false; } else if (DateTime.Now.Hour == startSleepHour && DateTime.Now.Minute == startSleepMinute) { Logfile.Log("STOP communication with Tesla Server to enter sleep Mode! (Timespan Sleep Mode) https://teslalogger.de/faq-1.php"); currentState = TeslaState.GoSleep; goSleepWithWakeup = true; } else { // wenn er 15 min online war und nicht geladen oder gefahren ist, dann muss man ihn die möglichkeit geben offline zu gehen TimeSpan ts = DateTime.Now - lastCarUsed; if (ts.TotalMinutes > ApplicationSettings.Default.KeepOnlineMinAfterUsage) { currentState = TeslaState.Start; wh.IsDriving(true); // kurz bevor er schlafen geht, eine Positionsmeldung speichern und schauen ob standheizung / standklima / sentry läuft. if (DBHelper.currentJSON.current_is_preconditioning) { Logfile.Log("preconditioning prevents car to get sleep"); lastCarUsed = DateTime.Now; } else if (wh.is_sentry_mode) { Logfile.Log("sentry_mode prevents car to get sleep"); lastCarUsed = DateTime.Now; } else { try { Logfile.Log("STOP communication with Tesla Server to enter sleep Mode! https://teslalogger.de/faq-1.php"); for (int x = 0; x < ApplicationSettings.Default.SuspendAPIMinutes * 10; x++) { TimeSpan tsSMT = DateTime.Now - DBHelper.currentJSON.lastScanMyTeslaReceived; if (DBHelper.currentJSON.SMTSpeed > 5 && DBHelper.currentJSON.SMTSpeed < 260 && DBHelper.currentJSON.SMTBatteryPower > 2 && tsSMT.TotalMinutes < 5) { Logfile.Log("ScanMyTesla prevents car to get sleep. Speed: " + DBHelper.currentJSON.SMTSpeed); lastCarUsed = DateTime.Now; string wakeup = wh.Wakeup().Result; sleep = false; break; } if (wh.existsWakeupFile) { Logfile.Log("Wakeupfile prevents car to get sleep"); lastCarUsed = DateTime.Now; wh.DeleteWakeupFile(); string wakeup = wh.Wakeup().Result; sleep = false; break; } if (x % 10 == 0) { Logfile.Log("Waiting for car to go to sleep " + (x / 10).ToString()); Tools.StartSleeping(out startSleepHour, out startSleepMinute); if (DateTime.Now.Hour == startSleepHour && DateTime.Now.Minute == startSleepMinute) { Logfile.Log("STOP communication with Tesla Server to enter sleep Mode! (Timespan Sleep Mode) https://teslalogger.de/faq-1.php"); currentState = TeslaState.GoSleep; goSleepWithWakeup = true; break; } } System.Threading.Thread.Sleep(1000 * 6); } } finally { if (!goSleepWithWakeup) { Logfile.Log("Restart communication with Tesla Server!"); } } } } } if (sleep) { System.Threading.Thread.Sleep(5000); } else { continue; } } } break; case TeslaState.Charge: { if (!wh.isCharging()) { // TODO: ende des ladens in die datenbank schreiben currentState = TeslaState.Start; wh.IsDriving(true); } else { lastCarUsed = DateTime.Now; System.Threading.Thread.Sleep(10000); //wh.GetCachedRollupData(); } } break; case TeslaState.Sleep: { string res = wh.IsOnline().Result; if (res == "online") { Logfile.Log(res); currentState = TeslaState.Start; wh.IsDriving(true); // Positionsmeldung in DB für Wechsel } else { // Logfile.Log(res); System.Threading.Thread.Sleep(10000); } } break; case TeslaState.Drive: { int t = Environment.TickCount; if (wh.IsDriving()) { lastCarUsed = DateTime.Now; t = ApplicationSettings.Default.SleepPosition - 1000 - (Environment.TickCount - t); if (t > 0) { System.Threading.Thread.Sleep(t); // alle 5 sek eine positionsmeldung } if (odometerLastTrip != DBHelper.currentJSON.current_odometer) { odometerLastTrip = DBHelper.currentJSON.current_odometer; lastOdometerChanged = DateTime.Now; } else { if (wh.isCharging(true)) { Logfile.Log("Charging during Drive -> Finish Trip!!!"); DriveFinished(wh); } else { // Odometer didn't change for 600 seconds TimeSpan ts = DateTime.Now - lastOdometerChanged; if (ts.TotalSeconds > 600) { Logfile.Log("Odometer didn't change for 600 seconds -> Finish Trip!!!"); DriveFinished(wh); } } } if (WebHelper.geofence.RacingMode) { Address a = WebHelper.geofence.GetPOI(DBHelper.currentJSON.latitude, DBHelper.currentJSON.longitude); if (a != null) { if (lastRacingPoint == null) { lastRacingPoint = a; Logfile.Log("RACING MODE: Finish Trip!"); DriveFinished(wh); } } else { lastRacingPoint = null; } } } else { DriveFinished(wh); ShareData sd = new ShareData(wh.TaskerHash); sd.SendAllChargingData(); } } break; case TeslaState.GoSleep: { wh.ResetLastChargingState(); bool KeepSleeping = true; int round = 0; try { while (KeepSleeping) { round++; System.Threading.Thread.Sleep(1000); if (System.IO.File.Exists(FileManager.GetFilePath(TLFilename.WakeupFilename))) { if (wh.DeleteWakeupFile()) { string wakeup = wh.Wakeup().Result; } KeepSleeping = false; currentState = TeslaState.Start; break; } else if (round > 10) { round = 0; if (wh.TaskerWakeupfile()) { if (wh.DeleteWakeupFile()) { string wakeup = wh.Wakeup().Result; } KeepSleeping = false; currentState = TeslaState.Start; break; } } if (goSleepWithWakeup) { int stopSleepingHour, stopSleepingMinute; Tools.EndSleeping(out stopSleepingHour, out stopSleepingMinute); if (DateTime.Now.Hour == stopSleepingHour && DateTime.Now.Minute == stopSleepingMinute) { Logfile.Log("Stop Sleeping Timespan reached!"); KeepSleeping = false; currentState = TeslaState.Start; break; } } } } finally { Logfile.Log("Restart communication with Tesla Server!"); } } break; } } catch (Exception ex) { Logfile.ExceptionWriter(ex, "While Schleife"); } if (WebHelper.geofence.RacingMode) { System.Threading.Thread.Sleep(10); } else { System.Threading.Thread.Sleep(1000); } } } catch (Exception ex) { Logfile.Log(ex.Message); Logfile.ExceptionWriter(ex, "While Schleife"); } finally { Logfile.Log("Teslalogger Stopped!"); } }