Beiträge von __blackjack__

    MK-Ler Es gibt im ersten Beispiel ein `aktiv` auf der Klasse, und dann nach dem setzen ein weiteres auf dem erstellten Objekt:

    Das verwirrend Klassenattribute auf diese Weise als Defaultwerte für nicht gesetzte Instanzattribute zu missbrauchen.

    Das ist nicht zu verwechseln mit `dataclass` oder dem externen `attrs`-Package. Die entfernen die Klassenattribute und basteln daraus eine `__init__()` die diese Attribute auf beim erstellen des Objekts auf der Instanz anlegen.

    SD-Kartenleser über GPIOs anschliessen? Wäre per USB nicht deutlich einfacher?

    Je nach dem was die Hardware die Du da ersetzen möchtest so alles kann, ist es nicht mit Code getan, sondern erfordert ja sicher auch ein bischen Hardwarebasteln.

    Die Beschreibung ist zumindest für Leute die diese Hardware „beier …“ nicht kennen, viel zu wenig um da irgendwelche sinnvollen Aussagen machen zu können.

    MK-Ler: `Set` ist ein guter Name für eine Klasse die eine Menge repräsentiert, denn das bedeutet der Name. Wenn man `Settings` meint, sollte man das auch ausschreiben.

    Der Präfix `Meine` ist unsinnig wenn es nicht auch `DeineSettings` oder `UnsereSettings` oder so gibt. Ein Modul das wie die einzige Klasse im Modul heisst, ist ein Warnzeichen das man da was komisches macht. Also zum Beispiel versucht Java in Python zu programmieren. Oder eine unnötige Klasse dazwischen zu schieben. Man braucht keine Klassen für OOP sondern Objekte. Module sind Objekte.

    Egal ob Klasse oder Modul: Die Werte sollten nicht *gesetzt* werden, denn dann hast Du Dir globale Variablen eingehandelt.

    Bei der Klasse ist das hier noch mal schräg bis falsch, weil Du da Klassenattribute und Instanzattribute vermischt. Das Instanzattribut `aktiv` wird neu eingeführt und auf `True` gesetzt, aber das Klassenattribut `aktiv` existiert weiterhin ist an `False` gebunden.

    Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Siehe auch den Style Guide for Python Code.

    Franky07 Wenn ich bei YouTube nach „sachsenkanal rauchmelder“ suche, finde ich nichts passendes. Der Sender hat auch einen leichten (?) Schwurbler-Rechtsdrall. Der taugt nicht wirklich als Primärquelle, weil die ja erst einmal grundsätzlich alles was vom Staat kommt, ablehnen.

    Was die Kontrollmöglichkeiten des Staates in Wohnungen angeht: spätestens wenn es ein Feuer gibt, kann die Feuerwehr rein, und wenn dann keine Rauchmelder da sind, freut sich die Versicherung.

    Franky07 Laut https://www.rauchmelder-lebensretter.de/rauchmelderpflicht/ gilt mittlerweile in allen 16 Bundesländern Rauchmelderpflicht für vermieteten und ebenso für selbstgenutzten Wohnraum. Auch in Bestandsbauten. Sachsen war da das letzte Bundesland bei dem die Übergangsfrist bis zum Ende letzten Jahres galt.

    Und vielleicht neben der Versicherungsfrage noch die Anmerkung: Egal wer den Schaden bezahlt, falls da Menschen bei sterben weil das selbstgebastelte den Rauchmelder kaputt gemacht hat, macht es auch nicht weniger unglücklich wenn der Schaden von der Versicherung bezahlt würde.

    gwaag Das Skript was Du da weiter oben angehängt hast ist alles andere als okay. Das mag mehr oder weniger funktionieren, gehört aber im Grunde komplett neu geschrieben nach dem Du programmieren gelernt hast. Sorry wenn das hart klingen mag, aber das sieht nach programmieren durch raten und kopieren aus. So funktioniert das nicht. Und wenn es ”funktioniert” kannst Du nicht sicher sein, dass es das wirklich tut, oder nur was Du bisher ”beobachtet” hast, solange Du nicht weisst was da tatsächlich passiert.

    Ziggi3 Was hast Du denn am Skript verändert, denn diesen ersten Fehler kann man ganz leicht bekommen wenn *vor* dieser Zeile die Anzahl der " nicht korrekt ist, also Beispielsweise so:

    Bash
    "
    wget --timeout=10 --tries=20 --user-agent="Mozilla/5.0 (X11; U; Linux x86_64; de-de) AppleWebKit/534.26+ (KHTML, like Gecko) Ubuntu/11.04 Epiphany/2.30.6" 'https://foo.web.com'

    Hier wird die ( bei (X11 zum Problem weil die an der Stelle *ausserhalb* einer literalen Zeichenkette keinen Sinn macht. Und wenn man das entfernt, verursacht der gleiche Fehler *vor* dieser Zeile halt Probleme in anderen folgenden Quelltextteilen.

    Edit: Übrigens ein Fehler/Problem das man an der farbigen Syntaxhervorhebung leicht identifizieren kann. Sollte Dein Editor das nicht unterstützen, würde ich einen Wechsel des Editors empfehlen.

    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: