import machine
import os
import TimeUtils
class Logger():
def __init__(self, hk_days):
self.hk_days = hk_days
self.TimeUtils = TimeUtils.TimeUtils()
self.tempLogFile = True
self.tempSoilFile = True
if not "logs" in os.listdir():
os.mkdir("/logs")
if not "soil" in os.listdir():
os.mkdir("/soil")
def LogMessage(self, message):
print(message)
lfname = "/logs/temp.txt"
if not self.tempLogFile:
dt = machine.RTC().datetime()
lfname = ("/logs/%04d-%02d-%02d.txt" % (dt[0], dt[1], dt[2]))
dt = machine.RTC().datetime()
file = open(lfname, "a")
file.write(self.TimeUtils.DateTimeNow() + ";" + message + "\n")
file.close()
def LogSoil(self, message):
print(message)
lfname = "/soil/temp.txt"
if not self.tempSoilFile:
dt = machine.RTC().datetime()
lfname = ("/soil/%04d-%02d-%02d.txt" % (dt[0], dt[1], dt[2]))
dt = machine.RTC().datetime()
file = open(lfname, "a")
file.write(self.TimeUtils.DateTimeNow() + ";" + str(message) + "\n")
file.close()
def Housekeeping(self):
for file in os.listdir("/logs"):
if (file.endswith(".txt")) and not (file == "temp.txt"):
fd = file.split('.')[0].split('-')
if (self.TimeUtils.IsOlderThanDays(fd, self.hk_days)):
os.remove("/logs/" + file)
self.LogMessage("Housekeeping: deleted logfile " + file)
for file in os.listdir("/soil"):
if (file.endswith(".txt")) and not (file == "temp.txt"):
fd = file.split('.')[0].split('-')
if (self.TimeUtils.IsOlderThanDays(fd, self.hk_days)):
os.remove("/soil/" + file)
self.LogMessage("Housekeeping: deleted soilfile " + file)
def LastLogs(self, lines):
logfilename = "/logs/temp.txt"
if not self.tempLogFile:
dt = machine.RTC().datetime()
logfilename = ("/logs/%04d-%02d-%02d.txt" % (dt[0], dt[1], dt[2]))
bufsize = 4096
fsize = os.stat(logfilename)[6]
iter = 0
with open(logfilename, "r") as logfile:
line_count = 0
for line in logfile:
line_count += 1
if (lines > line_count):
lines = line_count
#todo if lines from todays logfile are less than the number of requested lines, read missing lines from yesterdays logfile - only if not tempLogFile!
if bufsize > fsize:
bufsize = fsize - 1
fetched_lines = []
while True:
iter += 1
try:
logfile.seek(fsize - bufsize * iter)
fetched_lines.extend(logfile.readlines())
except:
return "eof"
break
if len(fetched_lines) >= lines or logfile.tell() == 0:
return "
".join(fetched_lines[-lines:])
break
def LastSoils(self, lines):
logfilename = "/soil/temp.txt"
if not self.tempLogFile:
dt = machine.RTC().datetime()
logfilename = ("/soil/%04d-%02d-%02d.txt" % (dt[0], dt[1], dt[2]))
bufsize = 4096
fsize = os.stat(logfilename)[6]
iter = 0
with open(logfilename, "r") as logfile2:
line_count = 0
for line in logfile2:
line_count += 1
if (lines > line_count):
lines = line_count
#todo if lines from todays logfile are less than the number of requested lines, read missing lines from yesterdays logfile - only if not tempLogFile!
if bufsize > fsize:
bufsize = fsize - 1
fetched_lines = []
while True:
iter += 1
try:
logfile2.seek(fsize - bufsize * iter)
fetched_lines.extend(logfile2.readlines())
except:
return "eof"
break
if len(fetched_lines) >= lines or logfile2.tell() == 0:
return "
".join(fetched_lines[-lines:])
break
def MergeTempLogfile(self):
if not self.tempLogFile:
tempLines = 0
try:
with open("/logs/temp.txt", "r") as tempfile:
tlines = tempfile.readlines()
dt = machine.RTC().datetime()
with open(("/logs/%04d-%02d-%02d.txt" % (dt[0], dt[1], dt[2])), "a") as logfile:
for line in tlines:
tempLines += 1
logfile.write(line)
os.remove("/logs/temp.txt")
self.LogMessage("Merged " + str(tempLines) + " lines from temp-logfile into this logfile")
except OSError:
pass
def MergeTempSoilfile(self):
if not self.tempSoilFile:
tempLines = 0
try:
with open("/soil/temp.txt", "r") as tempfile:
tlines = tempfile.readlines()
dt = machine.RTC().datetime()
with open(("/soil/%04d-%02d-%02d.txt" % (dt[0], dt[1], dt[2])), "a") as logfile:
for line in tlines:
tempLines += 1
logfile.write(line)
os.remove("/soil/temp.txt")
self.LogMessage("Merged " + str(tempLines) + " lines from temp-soilfile into todays soilfile")
except OSError:
pass
def DisableTempLogfile(self):
self.tempLogFile = False
self.MergeTempLogfile()
def DisableTempSoilfile(self):
self.tempSoilFile = False
self.MergeTempSoilfile()