Exemple #1
0
        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!");
                    }
                }
            }
        }
Exemple #2
0
        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();
        }
Exemple #3
0
        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(); });
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        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()");
                    }
                }
            }
        }
Exemple #6
0
        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)
                        ? "&lt;&gt;"
                        : 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>");
        }
Exemple #7
0
        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();
        }
Exemple #8
0
        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();
        }
Exemple #9
0
        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)
            { }
        }
Exemple #10
0
        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)
                        ? "&lt;&gt;"
                        : 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>");
        }
Exemple #11
0
        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)
            { }
        }
Exemple #12
0
        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();
        }
Exemple #13
0
        // 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();
            }
        }
Exemple #14
0
        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());
            }
        }
Exemple #15
0
        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!");
            }
        }
Exemple #16
0
        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();
            }
        }
Exemple #17
0
        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)
            { }
        }
Exemple #18
0
        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());
            }
        }
Exemple #19
0
        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!");
            }
        }
Exemple #20
0
 private void updategrafana(HttpListenerRequest request, HttpListenerResponse response)
 {
     Tools.lastGrafanaSettings = DateTime.UtcNow.AddDays(-1);
     Task.Run(() => { UpdateTeslalogger.UpdateGrafana(); });
     WriteString(response, @"OK");
 }
Exemple #21
0
        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());
            }
        }
Exemple #24
0
        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()");
                    }
                }
            }
        }
Exemple #25
0
        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!");
            }
        }