Bei mir hat das mit dem Download jetzt auch geklappt. Nur mal kurz drübergeschaut und gegruselt. Ich dachte ja bisher immer `data` wäre ein Exemplar von einem Datentyp – das ist ein Modul in dem globale Variablen abgelegt sind auf die alle möglichen anderen Module zugreifen. Das ist ja noch mal eine Stufe schlimmer als das ``global`` in den ”Funktionen”.
Ich habe jetzt nicht alles durchgesehen, aber in jedem Modul das ich gesehen habe sind globale Variablen, ein Haufen ``def``\s aber *keine* Argumente und kein ``return`` in Sicht. Es gibt vielleicht im ganzen Code keine einzige Funktion die den Namen auch verdient hätte. Obwohl doch es gibt wohl zwei. Die dann in allen sechs `channel*`-Modulen als Kopie vorliegen.
Denn für jeden der 6 Kanäle gibt es ein eigenes Modul mit etwas unter 5 Kilobyte die aber bis auf die Kanalnummer anscheinend den identischen Code enthalten. Argh! Ich kann ja noch verstehen das Anfänger auf die Idee kommen einzelne Funktionen oder Codeblöcke zu kopieren, aber durchnummerierte Module mit nahezu gleichem Code sehe ich gerade zum allerersten mal.
Was ich auch zu ersten mal sehe ist das jemand in Python ``<>`` statt ``!=`` verwendet. Das war seit dem ich mit Python angefangen habe schon veraltet. Kein Tutorial oder Buch das ich kenne hat das jemals als Option angeboten. Ich kenne das nur weil es der Vollständigkeit halber in der Liste der Vergleichsoperatoren in der Python-Referenzdokumentation steht. Also bei Python 2. In Python 3 gibt's diesen Operator nicht mehr, da geht nur noch ``!=``.
Jetzt wo ich weiss das es Python 2 ist: Geh den ganzen Code nach Vergleichen mit ``is`` durch und ersetze die durch ``==`` denn Du willst so ziemlich garantiert in keinem der Fälle auf Objektidentität testen sondern auf Gleichheit. Wobei auch das nicht wenn einer der beiden Operanden ein literales `True` oder `False` ist. Das hatten wir ja schon: das fällt entweder weg weil es total unnötig ist, oder man setzt ein ``not`` vor den nicht-literalen Wert. Wobei in dem Code auch viel zu viel Gebrauch von `bool()` gemacht wird. Und von `str()` auch. Beispielsweise bei ``str(float_to_str(act_value))`` ist entweder der `str()`-Aufruf unsinnig oder `float_to_str()` hat einen sehr falschen weil sehr irreführenden Namen. Falls das `act_` in `act_value` „actual“ heissen soll, möchtest Du wahrscheinlich mal in einem Wörterbuch die Bedeutung von „actual“ und „current“ nachschlagen. Falls das `act_` nicht für „actual“ steht ist es ein gutes Beispiel warum man keine Abkürzungen verwenden sollte. Die werden zu leicht missverstanden.
Neben `os.system()` sieht man in ein und dem gleichen Modul auch `os.popen()` und `commands.getoutput()` in wenigen Zeilen Abstand. Normal wäre das man *eine* dieser Varianten versucht und dabei dann in der Dokumentation davon findet das man die nicht mehr verwenden soll, weil die durch das `subprocess`-Modul abgelöst wurden. Der Code sieht aus als hätte da jemand in die Dokumentation vom `subprocess`-Modul geschaut und dann entschieden die dort als veraltet aufgeführten Varianten möglichst *alle* zu verwenden, und ja nur nicht das zu machen was empfohlen wird. Das grenzt ja schon fast an einen Trollversuch.
Den Code kann man komplett in die Tonne hauen. Dann Grundlagen lernen wie Funktionen, und ziemlich wahrscheinlich auch Klassen. Danach dann Anfangen und darauf achten, das auf Modulebene nur Code steht der Konstanten, Funktionen, und Klassen definiert. Kein ``global`` und Funktione und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. Und es gibt ``return`` wenn Werte aus der Funktion/Methode an den Aufrufer zurückgelangen sollen.