Mic2022 Anmerkungen zum Quelltext:
Bei den Importen kann man ein bisschen aufräumen. `os`, `digitalio`, `influxdb_client`, `WritePrecision`, `SYNCHRONOUS`, `WriteOptions`, und `NoOptionError` werden importiert, aber nirgends verwendet‽
`InfluxDBClient` und `Point` werden zweimal importiert.
Das Modul `ConfigParser` gibt's in Python 3 nicht mehr, das braucht man gar nicht erst versuchen zu importieren.
Wenn man eine Ausnahme behandelt in dem man sie einzig und alleine mit ``raise`` sofort wieder auslöst, kann man sich das auch komplett sparen.
`codecs.open()` hat man unter Python 2.7 schon nicht mehr verwendet. In Python 3 nimmt man die normale `open()`-Funktion. Aber letztlich macht es keinen Sinn die Datei selbst zu öffnen (und dann nicht wieder zu schliessen!) statt die `read()`-Methode mit dem Pfad aufzurufen.
`open_config_file()` öffnet die Konfigurationsdatei nicht nur sondern liest sie auch ein. Womit dann `read_config_file()` natürlich auch nicht mehr das macht was der Funktionsname suggeriert.
Bei `file_config` sind die Worte falsch herum. Das ist keine Dateikonfiguration, sondern eine Konfigurationsdatei. Also eigentlich ja nur eine Konfiguration. Eine Verbindung zu einer Datei hat dieses Objekt nicht.
Der Name `credentials` wird für etwas wiederverwendet was keine Anmeldeinformationen sind.
So ein Tupel mit 7 Werten ist ein bisschen unübersichtlich.
`bmp280_values` wäre ein guter Name für BMP280-Werte, aber für eine Funktion sollte man nicht so einen passiven Namen nehmen sondern einen der eine Tätigkeit beschreibt.
In der Funktion ist die Ausnahmebehandlung wieder unsinnig. Da wird dann statt eines Rückgabewertes eine Ausgabe gemacht und implizit `None` zurückgegeben, was dann an späterer Stelle zu einem TypeError in einer anderen Funktion führt. `Print` ist zudem falsch geschrieben, das würde da also in einen `NameError` laufen.
Für jede Messung das `I2C` und `Adafruit_BMP280_I2C` neu zu erstellen ist vielleicht ein bisschen umständlich.
Grunddatentypen sollten nicht in Namen vorkommen. Das ändert man gerne mal und dann hat man entweder falsche, irreführende Namen im Quelltext oder muss alle betroffenen Namen anpassen. `value_list` stimmt auch inhaltlich nicht so ganz, weil die Werte ja in `bmp_values` stehen. In `value_list` stehen die Namen/Bezeichnungen zu den Werten.
``for i in range(0, len(sequence))`` ist in Python ein „anti pattern“ weil man direkt über die Elemente von Sequenzen iterieren kann. Wenn man über mehrere Sequenzen ”parallel” iterieren möchte, gibt es die `zip()`-Funktion. Besser wäre aber die Daten gleich zusammen zu übergeben und nicht in zwei getrennten Datenstrukturen.
`bmp_frequency` ist keine Frequenz sondern eine Verzögerung.
Ungetestet:
# Sensor monitor for BMP280 pressure sensor. Read in sensor data and store the
# data in a defined InfluxDB2 data base.
#
# For configuration a file 'config.ini' is needed, to set the configuration for
# the used InfluxDB2 bucket.
#
# Version 1.2 (2024-02-10), (c) by Mic2022.
import time
from configparser import ConfigParser
from pathlib import Path
import adafruit_bmp280
import board
import busio
from influxdb_client import InfluxDBClient, Point
CONFIG_FILE_PATH = Path().home() / ".lacrosse/config.ini"
def read_config_file(file_path):
config = ConfigParser()
config.read(file_path, encoding="UTF-8")
return config["pylacross_db"], config["bmp_sensor"]
def write_influxdb(
write_api, bucket, org, measurement, room_name, name_to_value
):
for name, value in name_to_value.items():
write_api.write(
bucket=bucket,
org=org,
record=(
Point(measurement).tag("Raum", room_name).field(name, value)
),
)
def main():
db_config, sensor_config = read_config_file(CONFIG_FILE_PATH)
print(
f"Write BMP280 sensor data in InfluxDB2 database {db_config['bucket']} ..."
)
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(
busio.I2C(board.SCL, board.SDA), address=0x76
)
write_api = InfluxDBClient(
url=db_config["url"], token=db_config["token"], org=db_config["org"]
).write_api()
while True:
write_influxdb(
write_api,
db_config["bucket"],
db_config["org"],
db_config["measurement"],
sensor_config["bmp_room"],
{
"BMP_Temperatur": bmp280.temperature,
"BMP_Luftdruck": bmp280.pressure,
"BMP_Höhe": bmp280.altitude,
},
)
#
# TODO "bmp_frequency" ist als Name inhaltlich falsch. Das ist keine
# Frequenz.
#
time.sleep(sensor_config.getint("bmp_frequency"))
if __name__ == "__main__":
main()
Alles anzeigen