Posts by noisefloor

    Hallo,


    Quote

    Wenn ich dann im Browser die IP-Adresse meines Pis eingebe, komme ich zu meiner Website. Wenn ich den Apache Webserver anhalte, komme ich zu dem Login von Owncloud.


    Was ganz klar für eine falsche Konfiguration spricht. Wie linusg schon sagt: beide Server gleichzeitig laufen lassen macht wenig Sinn - mach' beides über nginx oder Apache, dann passt es.


    Gruß, noisefloor

    Hallo,


    Linus: thx. `fetch()` kannte ich nicht... Hier nochmal die `index.html` mit (hoffentlich) modernerem JavaScript:


    Die Funktionalität hat sich nicht geändert - außer, dass das jetzt wohl nicht mehr mit dem IE funktioniert ;-)


    Gruß, noisefloor

    Hallo,


    @marczurhorst: im folgenden ein simples Beispiel für Flask + JavaScript (ohne jQuery) + AJAX. Es gibt zwei Routen: An die eine wird der Wert des Sliders per POST-Request verpackt in Formulardaten geschickt, serverseitig wird einfach nur der Statuscode 200 zurück geliefert.

    An die andere Route werden die Werte der Number-Eingabefelder als JSON geschickt, zurück geliefert wird auch JSON.


    Python:

    HTML + JS:

    Das JS kann man vielleicht noch eleganter machen... JS ist nicht so meine Domäne.


    Gruß, noisefloor

    Hallo,


    pickle ist ja eigentlich zum seralisieren von ganzen Python-Objekten.


    Universeller, unabhängiger und auch mit Bordmitteln machbar wäre, dass als JSON zu speichern. Oder als INI-Datei und die dann mit dem configparser-Modul lesen. Oder als Schlüssel-Werte Paare speichern mit Hilfe des shelve-Moduls.


    Gruß, noisefloor

    Hallo,


    Programmieren ist halt nicht raten. Wenn dir die Grundlagen fehlen - was ja nicht schlimm ist, keder fängt mal an - kannst du dir halt niemals funktionierenden Code "zusammenkopieren". Weil: du weißt ja nicht bzw. kannst nicht beurteilen, was der Code macht.


    Quote

    Ich hatte verstanden dass ich AJAX/JS schon brauchen würde, damit ich beim Ändern von Einstellungen (z.B. Spinner mit +/- Buttons) nicht bei jedem einzelnen Klick die Seite neu laden müsse. Nun gut, dann suche ich nun mal nach einen klassischen Request/Response Modell.

    Jein. AJAX macht Sinn, wenn du irgendwas "live" ändern willst / musst und etwas von 0 bis 100 nur in 1er-Schritten ändern kannst / willst. Weil, wie du richtig sagst, du sparst dir dann ein paar Request.

    Aber du kannst das auch später Schritt für Schritt nachrüsten, wenn die Steuerung erst mal läuft.


    Gruß, noisefloor

    Hallo,


    ich muss das STF zustimmen: das Projekt is tzu groß für dich, in so fern das dir die Grundlagen fehlen. Vielleicht nicht unbedingt bei Python, aber von Webprogrammierung an sich.


    Du mischst Datenaustauch per AJAX (also quasi "im Hintergrund") und Datenaustausch per klassischem Request/Response Model. Du mischst beides, dass aber nicht richtig und darum funktioniert es nicht. Grundsätzlich geht das komplett ohne JavaScript / AJAX. und gerade den Login würde ich per klassischem Request/Response bauen.


    Mein Tipp wäre also für's erste:

    Alles JavaScript weg, Bootstrap wenn nur für's Styling (also die CSS-Klassen) nutzen und alles andere klassisch machen.


    BTW, zum Code: das app.run() ist veraltet, Flask-Apps startet man jetzt über das flask-Kommando.


    Gruß, noisefloor

    Hallo,


    du kannst in eine Datei nur Strings schreiben. Mini-Beispiel für Python 3 basierend auf deinem:


    Python
    with open('demo.ter', 'w') as f:
        f.write('c\n')
        f.write('base=64\n')
        m = [['0.0' for _ in range(10)] for _ in range(10)]
        for row in m:
            f.write('|'.join(row))
            f.write('\n')

    Wenn du dazu noch Fragen hast startest du am bestehen einen eigenen Thread, das wird sonst unübersichtlich hier im Sammelthread. In deinem Code sind auch Anti-Pattern, was Iteration in Python angeht.


    Gruß, noisefloor

    Hallo,


    also die (industriellen) Druckminderer, die ich kenne, arbeiten alle mechanisch: mit einer Düse und einer Feder. Die passende Kombi hängt vom Gasart, Eingangsdruck und dem gewünschten Ausgangsvolumenstrom ab. Wobei dabei eine halbwegs konstanter Eingangsdruck anliegen sollte.


    Wenn man noch eine Volumenstromregelung braucht, dann muss halt noch ein Regelventil hinter den Druckminderer.


    Gruß, noisefloor

    Hallo,


    zum restlichen Code:


    Variablennamen mit nur einem Buchstaben sind in der Regel schlecht. Grund: aussageloser Name. Der Name darf gerne beschreiben, was für einen Wert die Variablen hält. Tun a, b, w, ... aber nicht.

    Da sind viel zu viele Leerzeilen drin. Leerzeilen macht man in Python normalerweise nur zum Trennen von Funktionen und Klassen.

    Du klammerst viel zu viel. bei a = (random.choice(x)) oder if(c==a) ist die äußere Klammer überflüssig.

    Das x = [0,1...31] kannst du auch kürzer als x =  range(0, 32) schreiben.

    Der Teil

    Python
    while i == 64:
        i = i == 0
        a = (random.choice(x))

    macht keinen Sinn, das ist eine Endlosschleife. i = i==0 evaluiert zu `True` oder `False` - damit wird i==64 nie erreicht. Und selbst wenn der Code anders wäre und i doch wieder später irgendwo ein Integer werden würde ist es schlecht Stil, wenn eine Variable mal ein Integer, mal ein Bool'scher Wert wäre. Das macht das Programm undurchsichtig.


    Gruß, noisefloor

    Hallo,


    Tillmario:


    • Logging geht besser mit dem `logging` Modul. Das unterstützt auch logrotate, so dass du dir nicht selber alles 24h eine neue Datei "basteln" musst.
    • Strings formatiert man mit der `format` Methode, nicht mit `+`.
    • Datei- / Verzeichnisnamen baut man mit `os.path.join()` zusammen.
    • Dateien öffnet man besser mit dem `with` Statement, dann hat man auch die Garantie, dass die Datei geschlossen wird.
    • `append` als Funktionsnamen ist nichtssagend. append to what? `append_to_logfile` wäre z.B. besser.


    Du hast eine eigene Funktion genau so benannt wie eine Methode. Das geht schief. Du musst deine eigene Funktion anders benennen.

    Die Aussage ist so falsch, muss der TE nicht. BTW: welche Methode? ;-) Methodennamen existieren nur im Namensraum der Klasse bzw. der Instanzen der Klasse-. Da gibt's keine Kollisionen, wenn verschiedene Instanzen verschiedener Klassen gleiche Methodennamen haben. Beispiele: sowohl Listen als als `collections.deque` haben eine `append` Methode. Funktioniert bekanntlich einwandfrei.


    Gruß, noiserfloor

    Hallo,


    Quote

    Mein subjektives Empfinden ist, das (immer noch) eine starke Fixierung auf die Shell besteht. Vielleicht ist aber auch das der Unterschied zu anderen Betriebssystemen die schon vor 30 Jahren auf GUI ausgelegt waren.

    Wobei eine Software Schmiede aus Remond ja vor ein paar Jahren auch auf den Trichter gekommen ist, dass die Shell doch ganz cool ist und für Windows ein Produkt namens PowerShell eingeführt hat und seitdem weiter entwickelt. Dei PowerShell gibt's inzwischen übrigens auch für Linux :-)


    Quote


    Warum gibt es kein Wiki, dass im OS fest eingebaut ist?

    Das macht doch überhaupt keine Sinn, also rein von der Grundidee. Ein Wiki dient dazu, dass möglichst viele Nutzer kollaborativ ihr wissen zusammen werden, so dass alle davon profitieren. Wenn es fest im OS in deinem Computer eingebaut wäre, dann könnte keiner beitragen - was wenig Sinn macht.


    Gruß, noisefloor

    Hallo,


    Quote

    Wenn es an einer solchen Kleinigkeit schon so massiv scheitert, wie soll denn dann eine größere, ggf. reine Python Version funktionieren?

    Das ist keine "Kleinigkeit". Es gibt Programmiersprachen, die spielen gut zusammen und es gibt welche, die spielen nicht gut zusammen. PHP+Python ist halt keine gute Kombi.


    Des Weiteren liegt dein Problem ja nicht Python, sondern am gesamten. Wenn du alles in Python machen würdest, hättest du z.B. definitiv keine Probleme mit der Übergaben von Werten.

    Abgesehen davon ist Webentwicklung mit Python IMHO schneller, einfacher und flexibler als mit PHP. Wenn du natürlich eine reine PHP Lösung hin bekommst - auch gut.


    Gruß, noisefloor

    Hallo,


    das geht mit dd auf der Kommandozeile:


    sudo dd if=iso_image.iso of=/dev/sdx bs=1M && sync


    `iso_image.iso` muss ein bootbares Image sein (was man z.B. auch auf eine CD oder DVD brennen könnte, `/dev/sdx` der Device-Pfad zum Stick, wobei der Stick _nicht_ eingehängt sein darf.


    Gruß, noisefloor

    Hallo,

    Ich würde es so machen, dass jeder Akteur (Taster, Bewegungsmelder oder Button der Homepage)


    - einen Wert 1 in eine Datei schreibt, wenn er das Gerät einschaltet und

    - einen Wert 0, wenn er es ausschaltet.

    Wenn es 2 Geräte/ Lampe sind, dann halt 2 Dateien, die den Zustand wieder geben, ob gerade "ein" oder "aus" ist.


    Du brauchst dann nur deine Schleife, um zu schauen, was gerade in den Dateien los ist.

    Der Ansatz mit den Dateien macht aber nur Sinn, wenn man die Persistenz des Zustands auch über einen Reboot des Systems braucht oder das Skript nicht dauerhaft läuft. Wenn das Skript durch läuft ist der Zustand im Skript so wie so bekannt.


    Ein einfache Datei halte ich auch für einen suboptimalen Ansatz und eine Datei pro Geräte würde ich schon als "broken by design" bezeichnen. Für so was ist es einfacher (und besser), wenn man ein einfaches Key-Value Store nimmt. Davon hat Python standardmäßig ein paar an Bord. Oder, wenn man wirklich nur `True` und `False` speichern braucht, dann geht das mit dem shelve-Modul.


    berryfox: mit dem gpiozero-Modul sollte sich in der Tat ein Teil deiner Probleme lösen lassen.


    Gruß, noisefloor

    Python meinte ich doch. Wer kommt denn auf die Idee, eine Hausautomation in Python selbst zu programmieren?

    Kein Ahnung. Grundsätzlich möglich ist es ja.


    Noisefloor, dir ist schon klar, dass jemand, der Schwierigkeiten hat, einen Tastendruck abzufragen und ein Lämpchen zu schalten, mit deinen Fachbegriffen überfordert sein dürfte?

    a) fängt jeder mal klein an und b) sind das nun mal die passenden Begriffe hier. Wenn das jemand (wie z.B. der TE) nicht versteht, also was gemeint ist, dann sind wir der Erkenntnis, dass das Projekt zum aktuellen Zeitpunkt überambitioniert ist, schon mal einen Schritt näher gekommen ;-)


    Gruß, noisefloor