Add temperature_logger/src/temperature_logger/core.py
This commit is contained in:
commit
a7e7b95ea0
1 changed files with 67 additions and 0 deletions
67
temperature_logger/src/temperature_logger/core.py
Normal file
67
temperature_logger/src/temperature_logger/core.py
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import datetime
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from dataclasses import dataclass, asdict
|
||||||
|
import serial
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TemperatureLog:
|
||||||
|
timestamp: str
|
||||||
|
temperature: float
|
||||||
|
location: str
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_sensor(sensor: str) -> None:
|
||||||
|
if not isinstance(sensor, str) or not sensor:
|
||||||
|
raise ValueError("Sensor-Port muss ein nicht-leerer String sein.")
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_interval(interval: float) -> None:
|
||||||
|
if not isinstance(interval, (float, int)) or interval <= 0:
|
||||||
|
raise ValueError("Das Messintervall muss eine positive Zahl sein.")
|
||||||
|
|
||||||
|
|
||||||
|
def log_temperature_data(sensor: str, interval: float) -> None:
|
||||||
|
"""Liest periodisch Temperaturdaten vom angegebenen Sensorport und speichert sie als JSON."""
|
||||||
|
_validate_sensor(sensor)
|
||||||
|
_validate_interval(interval)
|
||||||
|
|
||||||
|
output_path = Path("output/temperature_log.json")
|
||||||
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
try:
|
||||||
|
ser = serial.Serial(sensor, baudrate=9600, timeout=2)
|
||||||
|
except serial.SerialException as e:
|
||||||
|
raise RuntimeError(f"Fehler beim Öffnen des Sensorports '{sensor}': {e}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
line = ser.readline().decode('utf-8').strip()
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
temperature = float(line)
|
||||||
|
except ValueError:
|
||||||
|
continue # Ungültige Daten überspringen
|
||||||
|
|
||||||
|
entry = TemperatureLog(
|
||||||
|
timestamp=datetime.datetime.utcnow().isoformat(),
|
||||||
|
temperature=temperature,
|
||||||
|
location=os.uname().nodename if hasattr(os, 'uname') else 'unknown'
|
||||||
|
)
|
||||||
|
|
||||||
|
with output_path.open('a', encoding='utf-8') as f:
|
||||||
|
json.dump(asdict(entry), f, ensure_ascii=False)
|
||||||
|
f.write('\n')
|
||||||
|
|
||||||
|
time.sleep(interval)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("\nTemperatur-Logging beendet.")
|
||||||
|
finally:
|
||||||
|
ser.close()
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ["TemperatureLog", "log_temperature_data"]
|
||||||
Loading…
Reference in a new issue