Source code for dhtioc.datalogger
#!/usr/bin/env python3
__all__ = ["DataLogger",]
"""
Record raw values in data files.
.. autosummary::
~DataLogger
"""
import datetime
import logging
import os
import time
from .__init__ import __version__
logger = logging.getLogger(__name__)
[docs]class DataLogger:
"""
Record raw values in data files.
PARAMETERS
ioc_prefix
*str* :
EPICS IOC prefix
path
*str* :
Base directory path under which to store data files.
(default: ``~/Documents/dhtioc_raw``)
"""
def __init__(self, ioc_prefix, path=None):
"""Constructor."""
self.prefix = ioc_prefix
self.base_path = path or os.path.abspath(
os.path.join(
os.environ.get("HOME", os.path.join("/", "home", "pi")),
"Documents",
"dhtioc_raw"
)
)
self.file_extension = "txt"
[docs] def get_daily_file(self, when=None):
"""
Return absolute path to daily file.
PARAMETERS
when
*obj* :
Path will be based on this instance of `datetime.datetime`.
(default: now)
"""
dt = when or datetime.datetime.now()
path = os.path.join(
self.base_path,
f"{dt.year:04d}",
f"{dt.month:02d}",
(
f"{dt.year:04d}"
f"-{dt.month:02d}"
f"-{dt.day:02d}"
f".{self.file_extension}"
),
)
return path
[docs] def create_file(self, fname):
"""
Create the data file (and path as necessary)
PARAMETERS
fname
*str* :
File to be created. Absolute path.
"""
path = os.path.split(fname)[0]
# create path as needed
os.makedirs(path, exist_ok=True)
if not os.path.exists(path):
raise FileNotFoundError(
f"Could not create directory path: {path}")
# create file
with open(fname, "w") as f:
created = datetime.datetime.now().isoformat(sep=" ")
f.write(
f"# file: {fname}\n"
f"# created: {created}\n"
f"# program: dhtioc\n"
f"# version: {__version__}\n"
f"# URL: https://dhtioc.readthedocs.io/\n"
f"#\n"
f"# IOC prefix: {self.prefix}\n"
f"#\n"
f"# time: python timestamp (``time.time()``)," # long line ...
f" seconds (since 1970-01-01T00:00:00 UTC)\n"
f"# RH: relative humidity, %\n"
f"# T: temperature, C\n"
f"#\n"
f"# time RH T\n"
)
[docs] def record(self, humidity, temperature, when=None):
"""
Record new values of humidity & temperature.
Create new file and path as needed.
PARAMETERS
humidity
*float* :
Relative humidity, %.
temperature
*float* :
Temperature, C.
when
*obj* :
`datetime.datetime` of these values.
(default: now)
"""
dt = when or datetime.datetime.now()
fname = self.get_daily_file(dt)
if not os.path.exists(fname):
self.create_file(fname)
with open(fname, "a") as f:
f.write(
f"{dt.timestamp():.02f}"
f" {humidity:.01f}"
f" {temperature:.01f}\n"
)
if __name__ == "__main__":
dl = DataLogger("ioc:")
# when = None
when = datetime.datetime.fromtimestamp(405783400)
fname = dl.get_daily_file(when)
dl.record(50, 25, when)
dl.record(50.98765, 25.12345)
time.sleep(2)
dl.record(50, 25)
print(fname)