Skip to content

Commit 92e1b9b

Browse files
committed
allow passing in path to measurements file
also allow disabling stdout, and only log to the influxdb file
1 parent c9bb302 commit 92e1b9b

File tree

2 files changed

+34
-18
lines changed

2 files changed

+34
-18
lines changed

influxdb_logger.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
21
import logging
32
import logging.handlers
43
import os
54
import time
65

6+
77
class InfluxdbLogger:
88
"""Repeatedly logs data from all devices"""
9-
LOG_OUTPUT_FILE = "measurements.log"
109

1110
# the influxdb measurement we're outputting
1211
MEASUREMENT = "bmnode"
@@ -18,12 +17,15 @@ class InfluxdbLogger:
1817
# must be at least 1 to enable rotation
1918
MAX_BACKUP_FILES = 1
2019

20+
def __init__(self, path: str) -> None:
21+
self.path = os.path.abspath(path)
22+
2123
@property
2224
def datalog(self) -> logging.Logger:
2325
if not hasattr(self, "_datalog"):
2426
# make sure our destination exists
2527
try:
26-
os.makedirs(os.path.dirname(os.path.abspath(self.LOG_OUTPUT_FILE)))
28+
os.makedirs(os.path.dirname(self.path))
2729
except FileExistsError:
2830
pass
2931

@@ -38,7 +40,7 @@ def datalog(self) -> logging.Logger:
3840

3941
# rotate the files every once in a while to allow files to close
4042
handler = logging.handlers.RotatingFileHandler(
41-
self.LOG_OUTPUT_FILE,
43+
self.path,
4244
maxBytes=self.MAX_SIZE_BYTES,
4345
backupCount=self.MAX_BACKUP_FILES,
4446
)
@@ -58,7 +60,7 @@ def hostname(self) -> str:
5860
@classmethod
5961
def d2str(cls, d) -> str:
6062
"""convert dictionary of key/value pairs to a string"""
61-
pairs = [f"{k.replace(' ', '_')}={v}" for k,v in d.items()]
63+
pairs = [f"{k.replace(' ', '_')}={v}" for k, v in d.items()]
6264
return ",".join(pairs)
6365

6466
def emit(self, fields, tags, measurement=None) -> None:

main.py

+27-13
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from influxdb_logger import InfluxdbLogger
1111
from pms7003 import PMS7003, PMSData
1212

13+
1314
def get_breakpoint(pm25: float) -> Tuple[str, str]:
1415
"""get colorized breakpoint for the pm25 value"""
1516
if pm25 < 15.5:
@@ -25,6 +26,7 @@ def get_breakpoint(pm25: float) -> Tuple[str, str]:
2526
else:
2627
return "Hazardous", Fore.MAGENTA
2728

29+
2830
def print_debug(data: PMSData) -> None:
2931
"""print the entire PMSData structure to the console"""
3032
print(
@@ -36,9 +38,7 @@ def print_debug(data: PMSData) -> None:
3638
)
3739
print("PM 1.0 (CF=1) : %s\t | PM 1.0 : %s" % (data.pm1_0_cf1, data.pm1_0_atm))
3840
print("PM 2.5 (CF=1) : %s\t | PM 2.5 : %s" % (data.pm2_5_cf1, data.pm2_5_atm))
39-
print(
40-
"PM 10.0 (CF=1) : %s\t | PM 10.0 : %s" % (data.pm10_0_cf1, data.pm10_0_atm)
41-
)
41+
print("PM 10.0 (CF=1) : %s\t | PM 10.0 : %s" % (data.pm10_0_cf1, data.pm10_0_atm))
4242
print("0.3um in 0.1L of air : %s" % (data.count_0_3))
4343
print("0.5um in 0.1L of air : %s" % (data.count_0_5))
4444
print("1.0um in 0.1L of air : %s" % (data.count_1_0))
@@ -52,6 +52,7 @@ def print_debug(data: PMSData) -> None:
5252
"============================================================================"
5353
)
5454

55+
5556
def print_pm(data: PMSData) -> None:
5657
"""print PM values to the console"""
5758
aqi, style = get_breakpoint(data.pm2_5_atm)
@@ -63,9 +64,10 @@ def print_pm(data: PMSData) -> None:
6364
"AQI": f"{style}{aqi}{Style.RESET_ALL}",
6465
}
6566

66-
pairs = [f"{k}: {v}" for k,v in result.items()]
67+
pairs = [f"{k}: {v}" for k, v in result.items()]
6768
click.echo(" ".join(pairs))
6869

70+
6971
@click.command()
7072
@click.option(
7173
"--port",
@@ -75,23 +77,36 @@ def print_pm(data: PMSData) -> None:
7577
show_default=True,
7678
)
7779
@click.option(
78-
"--debug",
80+
"--debug/--no-debug",
7981
default=False,
8082
help="Print debug data from the device",
8183
show_default=True,
8284
)
83-
def main(port: str, debug: bool) -> None:
85+
@click.option(
86+
"--log-only/--no-log-only",
87+
default=False,
88+
help="Only log to the influxdb log file; nothing on stdout",
89+
)
90+
@click.option(
91+
"--log-path",
92+
default="measurements.log",
93+
help="Location where logs are written",
94+
show_default=True,
95+
)
96+
def main(
97+
port: str, debug: bool, log_only: bool, log_path: str
98+
) -> None:
8499
if not os.access(port, mode=os.R_OK, follow_symlinks=True):
85100
click.echo(
86101
f"{Fore.RED}cannot access {port}; check path and permissions", err=True
87102
)
88103
return
89104

90-
logger = InfluxdbLogger()
91-
tags = {'type': 'PMS7003', 'id': port}
105+
logger = InfluxdbLogger(log_path)
106+
tags = {"type": "PMS7003", "id": port}
92107
click.echo(
93108
f"{Fore.BLUE}"
94-
f"writing influxdb measurement {logger.MEASUREMENT} to {logger.LOG_OUTPUT_FILE}"
109+
f"writing influxdb measurement {logger.MEASUREMENT} to {logger.path}"
95110
f"{Style.RESET_ALL}"
96111
)
97112

@@ -103,13 +118,12 @@ def main(port: str, debug: bool) -> None:
103118
if debug:
104119
print_verbose(data)
105120
else:
106-
print_pm(data)
107121
logger.emit(
108-
fields={k:v for k,v in data._asdict().items() if k.startswith('pm')},
122+
fields={k: v for k, v in data._asdict().items() if k.startswith("pm")},
109123
tags=tags,
110124
)
111-
112-
time.sleep(1)
125+
if not log_only:
126+
print_pm(data)
113127

114128
if __name__ == "__main__":
115129
main()

0 commit comments

Comments
 (0)