Problem mit Dateien untereinander tauschen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich möchte gern zwischen meinen beiden RasPis Dateien austauschen. Das soll innerhalb eines Python-Programms ablaufen.

    Dazu habe ich in das Python-Programm folgenden Code geschrieben:

    Code
    os.system("wget -P /home/pi/raspi2/ -t 1 -r -A temp -np -nd -q -N http://fhem2/raspi2/")

    Das Komische ist, dass ich genau das gleiche umgedreht mit dem anderen RasPi nicht hinbekomme. Die Zeile

    Code
    os.system("wget -P /home/pi/raspi1/ -t 1 -r -A temp -np -nd -N http://fhem1/raspi1/")


    bewirkt diese Meldung:

    Code
    pi@fhem2 ~/skripte/temperatur $ ./getheizung.py
    --2015-02-23 18:24:25--  http://fhem/skripte/
    Aufl▒sen des Hostnamen ▒fhem (fhem)▒... 192.168.178.23
    Verbindungsaufbau zu fhem (fhem)|192.168.178.23|:80... verbunden.
    HTTP-Anforderung gesendet, warte auf Antwort... 404 Not Found
    2015-02-23 18:24:25 FEHLER 404: Not Found.

    Also, mit dem Zielrechner hat er sich verbunden, aber er findet das Ziel nicht (so lese ich das). Aber der Ordner mit Inhalt ist vorhanden. Besitzverhältnisse und Rechte sind identisch.

    Ich komme nicht weiter, muss ich bie dem Zielrechner noch was einrichten, was ich bei dem anderen Rechner unbewusst schon gemacht habe?

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

    Einmal editiert, zuletzt von docadams (23. Februar 2015 um 18:38)

  • Hallo,

    du interpretierst den Fehler schon richtig - 404 = nichts gefunden.

    Was passiert denn, wenn du die URL direkt im Browser aufrufst? Und was für Dateien willst du austauschen?

    Ansonsten ist diese Verwendung von `os.system` mit `wget` echt gruslig. Wenn man mit Python programmiert ist es nicht das Ziel, Shell-Befehle einzubauen. Dann kannst du direkt ein Shellskript schreiben.

    OOTB kann Python das auch, z.B. mit dem Modul `urllib2`, siehe z.B.:

    * https://docs.python.org/2/library/urllib2.html
    * https://docs.python.org/2/howto/urllib2.html
    * http://pymotw.com/2/urllib2/

    Gruß, noisefloor

  • Hallo,
    im Browser passiert das Gleiche. Bei dem einen Aufruf http://fhem2/raspi2 sehe ich

    Code
    Index of /raspi2


    des Ordners.
    Aber umgedreht erscheint bei Aufruf http://fhem1/raspi1 die Meldung

    Code
    404 - Not Found

    Gebe ich nur http://fhem1 ein, also ohne den Zielordner, erscheint die erwartete index.html-Seite, während bei http://fhem2 der ganze Index of / erscheint.

    Also. ich berichte nur, was ich hier sehe, ich weiß nicht, ob es von Bedeutung sein könnte.

    Bei den zu übernehmenden Dateien handelt es sich um Kopien der in dem Ordner /sys/bus/w1/devices/28-000.../w1_slave, die ich vorher umgenannt habe in z.B. norden.temp.

    Im Prinzip geht es, leider nur in eine Richtung, in die andere Richtung nicht .

    Könnte ich irgendwie vergessen haben, den Ordner zum Lesen von aussen frei zu geben?
    An diesem RasPi habe ich vor 1,5 Jahren experimentiert, ich komm nicht vom Fach ;)

    Zu urllib bzw. urllib2 habe ich schon einiges weniges deutsches gefunden. Aber ich möchte erst das eine Problem lösen, bevor ich eine neue Baustelle eröffne.

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Hallo,

    404 = Datei nicht da (oder kein Zugriff drauf möglich). Ist nun mal so. Warum, ist so nicht zu sagen, weil dass ja auch z.B. am Webserver liegen kann.

    Zwei Fragen:
    * warum Dateitausch per HTTP? Das rsync, scp, FTP etc.
    * Warum Dateien aus dem `/sys` Ordner? Wenn ich mich nicht irre, enthält die Datei doch die gemessene Temperatur, und die ändert sich laufend (bzw. innerhalb des Messintervalls). Erklär' mal den tieferen Sinn dahinter, bitte.

    Gruß, noisefloor

  • Warum Dateitausch so und nicht anders. Um ehrlich zu sein, weil ich es nicht besser kann. Ich lese hier viel mit, schnappen was auf und überlege, ob und wie ich es für meine Interessen anpassen und umsetzen kann. Ich komme nicht aus der Programmiererecke und da ist sicher einiges durcheinander. Weil es ja auch hier diverse "Stilrichtungen" gibt.

    Es ist richtig, es sind die Dateien mit den Temperaturen.
    Der tiefere Sinn ist auch historisch gewachsen.

    Ich habe 2 Raspis im Einsatz. Einer steuert die Rollläden. Weil er das u.a. auch temperaturabhängig macht, fallen also diese Werte an. Der andere ist praktisch am anderen Ende der Wohnung und misst u.a. seit über einem Jahr diverse Temperaturen (außen Norden, 2 Zimmer, Heizung) Und da möchte ich die Temperatur des ersten Zimmers und die Südtemperatur mit rüberbringen.
    Die RRD-Datenbank hat Platz dafür.
    Also nichts Lebensnotwendigen, wäre aber halt schön.

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Hallo,

    ok... Aber der Weg ist viel zu umständlich, dass ist ja von hinten durchs Auge in die Brust ;)
    Außerdem interessiert den "anderen" Raspi doch auch nur die Temperatur, die der andere gemessen hat und nicht die ganze Rohdaten.

    Der einfachste Ansatz wäre IMHO, wenn du ein deinem Netze zu Hause einen Datenbank-Server laufen hättest (PostgreSQL, MySQL, MariaDB, Redis...), in dessen DB beide Raspis schreiben und auch nach Bedarf lesen können.

    Plan B wäre, dass du den Messwert auf jedem Raspi dem anderen per RPC (Remote Procedure Call) oder auch via Webserver per REST bereitstellst. Erster kann Python OOTB, d.h. die benötigten Module sind an Bord, letzteres ist sehr einfach mit Bottle und ein paar Zeile Python-Code zu realisieren.

    Bei Fragen -> fragen.

    Gruß, noisefloor

  • Hm, meinst du soetwas in dieser Art?
    Ich finde nur jede Menge Himbeersaftflaschen ;-/

    Ich dachte, so alle 5 Minuten mal 3 Dateien von einem anderen RasPi abzuholen, ist wget der einfachste Weg, ohne groß weitere Datenbanken, Webserver usw. einzusetzen.
    Auch glaube ich (kann ich aber nicht beweisen), dass die Ursache im anderen RasPi liegt, der mich sperrt. Da würden auch andere Lösungen Außen vor bleiben. Ich habe einfach keine Idee mehr, was ich beim Aufsetzen des einen RasPi anders gemacht habe, als beim anderen, dass der eine das Abholen der Dateien erlaubt, und der andere nicht.

    Stellt sich natürlich auch anderesrum die Frage, wie unsicher der eine gegenüber dem Anderen ist. Aber das ist ein anderes Thema...

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Hallo,

    was meinst du denn mit "Himbeersaftflaschen"?

    Das der eine Raspi "falsch" konfiguriert ist kann schon sein - lässt sich so halt von außen schlecht sagen.

    Was aber nichts daran ändert, dass die Idee, eine Datei aus `/sys` zu holen keine gute Idee ist. Egal, wie oft.

    Bzgl. Bottle: das ist ein Beispiel, wie man über die URL etwas schaltet. Wenn du über Bottle Daten (wie den Temperaturwert) holen willst, dann würde das etwas anders funktionieren. Bei Interesse kann ich dir mal ein Minibeispiel posten.

    Gruß, noisefloor

  • Ich bin derzeit unterwegs, antworte also aus dem Kopf, falls ich jetzt etwas daneben liege.
    Das mit Himbeerflaschen ist nicht ganz Ernst gemeint. Ich kenne Bottle nicht. Also habe ich meine Lieblingssuchmaschine nach Raspberry pi und Bottle gefragt. Das Pi wurde elegant ignoriert :)

    Das mit Daten aus /sys ist ist bei mir nicht ganz korrekt. Ich befürchte jetzt, das ist auch nicht richtig, ich hab es mir so zusammen gedacht: Also, ich greife auf die Temperaturen von mehreren verschiedenen Programmen zu. Nun musste ich öfter einen Sensor tauschen. Da in jedem Programm die Nummer tauschen, war blöd. Also kopiere ich in jedem Abfragezyklus jeden Sensor-Datei in den Ordner /home/pi/Temperaturen und nenne sie in z.B. Stube.temp um.
    Wenn jetzt ein Sensor gewechselt werden muss, muss ich nur einmal beim Kopierbefehl was anpassen.

    Kurzum, ich hole mit wget die Dateien aus /home/pi/Temperaturen und nicht aus /sys/bus....

    Könntest du mir mal ein Minibeispiel für Bottle posten, damit ich mal einen Einstieg habe. Danke.

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Einen Fileaustausch remote macht man mit rsync, jedenfalls, wenn man will, dass es zuverlässig läuft und überall. :thumbs1:

    rsync kann bei Bedarf auch per ssh (also verschlüsselt) und auch per Internet (wenn die entsprechenden Ports offen sind).

    Such mal "rsync", :
    Ja, ich weiss, der Optionen zum konfigurieren sind es gar viele, aber genau das so universell es macht das Teil... :angel:

    das Zen

  • Hallo,

    hier das Beispiel.

    Zuerst in der Shell die DB anlegen:

    Code
    noisefloor@noisefloor-t410:~/code$ sqlite3 temperatur.db
    sqlite> CREATE TABLE test (id INTEGER PRIMARY KEY AUTOINCREMENT,
                               t TIMESTAMP,
                               DEFAULT CURRENT_TIMESTAMP);


    sqlite>.exit

    Bottle und SQLite-Plugin installieren:

    Code
    noisefloor@noisefloor-t410:~/code$ sudo pip2.7 install bottle
    noisefloor@noisefloor-t410:~/code$ sudo pip2.7 install bottle_sqlite

    Ggf. muss du hier bei dir nur `pip` schreiben. Je nach dem, wie pip installiert ist.

    Ein Python-Skript (temp_gen.py), welches alle 30s einen Wert in die DB schreibt. Hier müsstest du dann Messwerte schreiben:

    Das Server-Skript:

    `HOST` musst du natürlich durch die richtige IP-Adresse ersetzen.

    Was der Server macht: beim Aufruf der Adresse `http://192.168.2.105:8888/latest_temp` wird die neuste Temperaturwert aus der DB gelesen, in ein Dictionary verpackt und gesendet. Bottle macht aus Dicts in der Response automatisch JSON, d.h. im Browser siehst du sowas wie `{"temperature": 22.460724429993963}`

    Wenn du die Temperatur mittels eines anderen Python-Skripts abholen willst, dann geht das mit der `urllib2`:

    Code
    import urllib2
    import json
    
    
    response = urllib2.urlopen('http://192.168.2.105:8888/latest_temp')
    data = json.load(response)   
    print data['temperature']

    Hier wird der Wert nur geprinten - es steh dir dann natürlich frei, den Wert andersweitig weiter zu verarbeiten.

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!