gemessene Temperaturen zweier RPi zusammenführen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,
    ich möchte in 2 unterschiedlichen Räumen 2 Ras-Pis mit unterschiedlichen Aufgaben betreiben.
    Ein RasPi misst diverse Temperaturen, die ich inspiriert von Martin Kompf mit dem RRD-Tool aufbereite. Der zweite RasPi misst in seinem Raum ebenfalls die Temperatur und zukünftig soll dies den Rollladen steuern.
    Nun würde ich gern diese Temperatur mit in die Datenbank des ersten RasPi integrieren. Bei der Erzeugung der Datenbank habe ich dafür schon Platz gelassen. Ich brauche also "nur" noch einen Weg, wie ich diese Temperatur zu dem anderen RasPi bekomme.

    Ich dachte, entweder den Inhalt des Ordners ..../bus/w1/28-1234567890/ in den zweiten RasPi kopieren, oder besser direkt vom zweiten RasPi lesen lassen.

    Den einzulesenden Pfad ändern, geht leider nicht. Ich denke mal, der andere RasPi hat nicht die Rechte zum Lesen des Ordners.

    Code
    temp9_path = "http://raspi1/sys/bus/devices/28-00000563284d/w1-slave"


    Vielleicht den Ordner /28-000.../ in einen "öffentlichen" Ordner der RasPi1 legen, den dann der RasPi2 lesen kann, oder so...

    Geht das irgendwie oder gibt es ein Stichwort für das, was ich machen möchte

    Viele Grüße
    DocAdams

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

  • Wenn die Geräte nur dafür da sind irgendwas zu messen würde ich anstatt eines RaspberryPI's lieber zu einem Arduino greifen, wie zum Beispiel den Arduino Mini (ohne USB) oder den Arduino Micro (mit USB).

    Zum übertragen der Werte könnte dann entweder ein langes USB Kabel oder ein RF Funk Module dienen.
    Man könnte aber auch einen Arduino UNO und ein WiFi- oder Ethernet- Shield verwenden um die Daten zu übertragen. Man kann aber auch die kleinen Mini/Nano/Micro Arudino's mit diesen Shields verwenden, oder irgendein anderes WiFi Module mit SPI Schnittstelle. Oder das Arduino WiFi RedBack ist auch nett :)

    Der Stromverbrauch dieser Mikrokontroller fällt weitaus geringer aus als mit einem RaspberryPI möglich wäre. Sensoren auslesen und irgendwelche Geräte steuern ist auch kein Problem.


    Aber nun zu deinem Anliegen :D


    Den einzulesenden Pfad ändern, geht leider nicht. Ich denke mal, der andere RasPi hat nicht die Rechte zum Lesen des Ordners.

    Code
    temp9_path = "http://raspi1/sys/bus/devices/28-00000563284d/w1-slave"

    Das wird nicht funktionieren. /sys/ ist ein temporäres, vom Kernel erzeugtes Dateisystem in dem du nicht manuell irgendwas erstellen kannst. Desweiteren würde über http der web-root Ordner angesprochen werden was beim apache2 /var/www/ wäre.

    Wie du die Daten von RPI-1 auf RPI-2 überträgst gäb es mehrere Möglichkeiten:

    • RPI-1 erzeugt regelmässig eine temporäre Datei im Web-Root Order die vom RPI-2 ausgelesen wird (nicht wirklich genau da nicht synchron).
    • Eine Verknüpfung im Web-Root Ordner /var/www/ erzeugen die auf die Datei /sys/bus/devices/28-00000563284d/w1-slave zeigt und diese dann auslesen (wget http://rpi/w1-slave o.ä.).
    • Script erstellen welches über SSH einen Befehl auf dem anderen PI absetzt und die Rückgabe ausgibt.
    • Auf RPI-1 ein Socket laufen lassen zu dem RPI-2 connected und Werte abfragt (darüber könnte man auch andere Befehle für den RPI-1 absetzen).

    Für welche Möglichkeit entscheidest du dich :huh:

  • Hallo,
    die Temperaturmessung ist eher ein interessantes Nebenprodukt. RasPi2 soll einmal ein intelligenter Stromzähler werden, die Fenster auf der Nordseite überwachen und diverse Temperaturen messen und anzeigen. Momentan misst er seit Februar 2 Temperaturen, es sollen aber noch mehr aus dem Heizungskeller dazukommen (z.B. Vor- und Nachlauf). Und da wäre die Stubentemperatur von RasPi1 interessant.

    Der soll hauptsächlich die Rollladensteuerung übernehmen. Das Projekt biegt langsam in die Zielgerade, wobei ich sicher noch vieles optimieren könnte. Jedenfalls werden dafür schon die Fenster- und Raumtemperatur gemessen, und die würde ich gern im RasPi2 auch dauerhaft machen.

    Von deinen 4 Varianten würde ich vermutlich von den beiden ersten noch am ehesten was verstehen. Ich versuche mich mal an Variante 2, mal sehen, wie weit ich komme.

    Viele Grüße
    DocAdams

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

  • Wenn Du vorhast irgendwann noch weitere Raspberrys (oder wie von meigrafd vorgeschlagen Arduinos) zu nutzen, würde ich Dir empfehlen für alle einheitliche REST-Schnittstellen zu bauen (geht unter Python mit 'flask' ganz leicht). Dann kannst Du zentral Werte von allen anderen Geräten abrufen und damit weiterarbeiten oder auch Befehle auslösen. :)

    Dann könntest Du Dir Ressourcen wie beispielsweise: 'http://raspberrypi/temp/28-00000563284d' konfigurieren, die einfach nur die Temperatur ausgibt und anschließend am zentralen Raspberry weiterverarbeiten. :)

    Das könnte dann in etwa so aussehen:


    (Inspiriert von dem Beispiel von http://www.kompf.de/weather/pionewiremini.html)

    Einmal editiert, zuletzt von Chris1705 (27. August 2014 um 18:44)

  • Vielen Dank für eure Tipps.
    dreamshader
    ich habe mir die Seite über pigpio/pigs angeschaut. Da scheitere ich an 2 Dingen, ich stehe nicht so im Stoff und mein Schul-Englisch ist nicht so, dass ich das verstehen lerne... :(

    Chris1705
    ich schaue mir morgen, wenn ich aufnahmefähiger bin, mal Flask an. Mehr als den Wikipedia-Artikel dazu kenne ich noch nicht.

    @meigraf
    mit deiner Idee bin ich am weitesten, aber noch nicht am Ziel. Ich habe im RasPi1 im Ordner /var/www einen Symlink auf /sys/bus/w1/ gelegt. Der Ornder und seine Unterorner liegen nun da. Wenn ich aber in RasPi2 in der Konsole den Befehl eingebe, kommt folgende Fehlermeldung:

    Code
    wget http://raspi1/var/www/w1/devices/28-0000055ffdb4/w1_slave/name
    
    
    
    
    --2014-08-27 23:27:49--  http://raspi1/var/www/w1/devices/28-0000055ffdb4/w1_slave/name
    Aufl▒sen des Hostnamen ▒raspi1 (raspi1)▒... 192.168.178.23, 
    Verbindungsaufbau zu raspi1 (raspi1)|192.168.178.23|:80... verbunden.
    HTTP-Anforderung gesendet, warte auf Antwort... 404 Not Found
    2014-08-27 23:27:49 FEHLER 404: Not Found.


    Also hat sich RasPi2 mit RasPi1 immerhin schon verbunden. Aber er findet nichts. Ich habe keine Optionen angegeben, habe aber auch nichts Passendes gefunden.

    Auch andere Objekte, die in /var/www/ liegen, werden nicht gefunden (um zu testen, ob es womöglich an einem falschen Symlink liegt). Sind da noch Rechte anzugeben?

    Viele Grüße
    DocAdams

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

    Einmal editiert, zuletzt von docadams (28. August 2014 um 08:40)

  • Wie hast du den Symlink denn angelegt? Bitte exakten Befehl posten


    Es wäre aber denk ich einfacher ein SSH Befehl abzusetzen:

    Code
    apt-get install sshpass

    Und das Script könnte dann wie folgt aussehen:

    Wenn du bereits ein Bash Script nutzt kannst du die Rückgabe des cat Befehls ganz einfach verwenden:

    Code
    #/bin/bash
    
    
    #...irgendwas...
    
    
    response=$(/bin/bash SSHscript.sh)
    echo $response

    Man kann auch mehrere Befehle gleichzeitig absätzen:

    Code
    RemoteCMD='cat /sys/bus/devices/28-00000563284d/w1-slave ; uname -mrs ; df -H'

    ...die Ausgabe wäre dann eben untereinander und das müsste man dann eben wie mans haben will filtern...

  • Ich sitz jetzt nicht vor dem heimischen Rechner, kann es also jetzt nicht probieren.
    Aus der Erinnerung lautete der Symlink-Befehl glaube ich so (im Ornder /var/www):

    Code
    ln -s /sys/bus/w1/

    Den wget-Befehl hatte ich zu Testzwecken im Terminal ausgeführt. Später wollte ich das in den Befehl integrieren, das auch die Werte abfragt und in die RRD-Datei einträgt (ein Python-Skript).
    Dann würde wget jedes mal bei Programmstart die Werte vom anderen RasPi holen und in einen Ordner, der pi gehört, schreiben. Vielleicht noch 5 Sekunden warten und dann auch diese Werte in die Datenbank eintragen. So war mein Plan mit meiner begrenzten Fantasie.

    Ach ja, den wget-Befehl hatte ich auch mit Benutzer und Passwort probiert.

    PS.
    Ubuntuusers.de kennt gar nicht sshpass.
    Ich bin ja totaler Quereinsteiger. Ubuntuusers sind für mich _die_ Informationsquelle Nr. 1, oder gibt es bessere Empfehlungen?

    Viele Grüße
    DocAdams

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

  • Die Syntax wäre:

    Code
    ln -s <target> <linkname>

    Also zB

    Code
    ln -s /sys/bus/devices/28-00000563284d/w1-slave /var/www/w1-slave

    //EDIT: Sorry, da hatte ich nen Dreher drin :blush:

  • Am Ende kommt es aber auf das Selbe, ich hatte ja den Befehl im Zielordner ausgeführt. Aber daran kann es eigentlich nicht liegen, denn wget findet ja auch Dateien nicht, die auf jeden Fall im Quellordner liegen (z.B. info.php). Ich glaube, der andere RasPi kommt gar nicht erst zum Zielordner.

    Muss ich noch irgendwelche Rechte oder Freigaben vergeben, damit von Außen darauf zugegriffen werden kann/darf? Oder mit Port 80 stimmt was nicht.

    Und bevor ich sshpass installiere, kann ich das als User pi machen oder mit

    Code
    sudo apt-get install sshpass

    ?

    Viele Grüße
    DocAdams

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

  • PHP Dateien können mit wget nicht geladen werden, nur dessen Ausgaben. Aber der korrekte wget Befehl dafür wäre auch:

    Code
    wget -O- http://...

    mit -O wird die Ausgabe angebeneben, wobei " - " für stdout steht also die Konsole. Man könnte da auch eine Datei angeben zB: -O/tmp/temp.txt

    Was passiert denn wenn du die Datei manuell öffnen willst, also die ganze Datei wo auch was drin steht?

    Ansonsten wie gesagt das Script mit sshpass nutzen.

    Befehle die mit sudo ausgeführt werden, werden mit root rechten ausgeführt. Du kannst also auch als pi mithilfe sudo's Pakete installieren... normale benutzer dürfen das aber nicht - also ja, mit sudo davor.
    (ich bin immer als root angemeldet, deshalb brauch ich kein sudo)

  • Hallo,
    ich konnte mich jetzt endlich etwas länger zusammenhängend mit dem Problem beschäftigen und habe auch eine Lösung gefunden, die vermutlich nicht optimal, dafür aber von mir ist ;)

    Zunächst musste ich ja erst mal das Problem lösen, dass er den Ordner auf dem anderen RasPi nicht fand. Typischer Laien-Fehler. der Pfad darf nicht so lauten, wie auf dem anderen RasPi.

    Code
    wget http://raspi2/var/www/w1/devices/28-0000012345678/w1_slave/w1_slave  # FALSCH
    # sondern
    wget http://raspi2/w1/devices/28-0000012345678/w1_slave/w1_slave  # RICHTIG

    Ich habe mich dann für den wget-Befehl entschieden, da kann ich eigentlich alles machen, was ich brauche und verstehe.

    Also zunächst verlinke ich auf dem anderen RasPi von /war/WWW/ auf //sys/bus/w1/devices/

    Und diesen Inhalt hole ich mir folgendermaßen rüber.


    Wenn es keine Sicherheits- oder andere Bedenken von den Profis gibt, würde ich das so belassen.

    PS. warum auch immer, es war mir nicht gelungen, in den wget-Befehl den Zielordner einzugeben. Darum springe ich vor der Datenübernahme in den recht weit oben liegenden Zielordner. Dann können sich noch andere Programme dieser Daten bedienen, z.B. die, die an w1 angeschlossenen Reedkontakte auswerten können.

    Viele Grüße
    DocAdams

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

    Einmal editiert, zuletzt von docadams (31. August 2014 um 19:27)


  • Zunächst musste ich ja erst mal das Problem lösen, dass er den Ordner auf dem anderen RasPi nicht fand. Typischer Laien-Fehler. der Pfad darf nicht so lauten, wie auf dem anderen RasPi.

    Code
    wget http://raspi2/var/www/w1/devices/28-0000012345678/w1_slave/w1_slave  # FALSCH
    # sondern
    wget http://raspi2/w1/devices/28-0000012345678/w1_slave/w1_slave  # RICHTIG

    Das ist klar weil /var/www/ der root-Ordner vom Webserver ist, dieser beim Ansurfen aber nicht mitangeben werden muss. Also eine Datei /var/www/index.php ruft man einfach nur als http://raspIP/index.php auf. Dachte aber dass das eigentlich klar sei ;)

    das vorherige löschen der Dateien kannst du dir sparen da die Dateien eindeutig beim wget Befehl angegeben sind und somit überschrieben werden.
    Ich würde dir allerdings raten diese Dateien nicht jedesmal auf den SD schreiben zu lassen sondern entweder einen extra tmpfs Ordner dafür anzulegen (und nach jedem reboot) oder diese in /tmp/ abzulegen (und tmpfs für /tmp/ über /etc/default/tmpfs aktivieren)

    Desweiteren macht das doppelte "cd /home/pi/skripte/temperatur/" keinen Sinn. Weder das erste noch das zweite(letzte) wird benötigt da keiner der anderen Befehle damit zu tun hat.

    Auch das "cd /home/pi/raspi2/" ist eigentlich überflüssig da du beim -O paramter vom wget Befehl selbstverständlich auch den Pfad zur Datei angeben kannst: -O /home/pi/raspi2/stube

    Also das sollte problemlos gehen:

    Spoiler anzeigen

    vorausgesetzt der ordner /home/pi/raspi2/ existiert...

    Wenn es keine Sicherheits- oder andere Bedenken von den Profis gibt, würde ich das so belassen.

    Sicherheitsbedenken kann es nur geben wenn du eine Portweiterleitung für den Webserver eingerichtet hast.. Aber selbst für den Fall gibts hierbei keinerlei Bedenken da ein Angreifer damit nichts anfangen kann.

  • Hallo,
    ich habe das Ganze etwas umorganisiert.
    Für den Anfang sieht es sicher etwas verwirrend aus, ich denke aber, dafür kann ich in Zukunft eine einheitliche Linie durchziehen, wenn ich solche Daten (Temperaturen oder Meldungen, ob Reedkontakte geschlossen sind) von einem zum anderen übertragen muss.

    Zunächst kopiere ich die w1-Werte in einen bestimmten Ordner (/home/pi/raspi2/) und gebe den Dateien "w1_slave" menschenlesbare Namen. Wenn mal ein Sensor ausgewechselt werden muss, muss ich dann nur an dieser einen Stelle die Zahlenkombination anpassen, egal, welche Programme auf diesen Sensor zugreifen. Das mache ich mit der gettemp.py, die auf jedem Raspi läuft.

    Code
    ...
    os.system("sudo cp /sys/bus/w1/devices/28-0000012365478/w1_slave /home/pi/raspi2/stube.temp")
    ...


    Danach wird dieser Ordner nach /var/WWW gespiegelt, damit die Daten vom anderen Raspi geholt werden können.

    Code
    sudo ln -s /home/pi/raspi2

    Nun geht es im anderen Raspi weiter.
    Mit dem Skript "holen.sh" kopiere ich mir immer eine Minute vor dem Einlesen der Temperaturwerte diesen Ordner rüber auf Raspi 1, und zwar in den Ordner /home/pi/raspi2 (weil es ja die Daten von Raspi 2 sind).

    Code
    cd /home/pi/raspi2/
    wget -t 1 -r -A temp -np -nd http://fhem2/raspi2/


    Und aus diesem Ordner holt dann die dortige gettemp.py die Temperaturwerte.

    Code
    ...
    temp2_path = "/home/pi/raspi1/aussen.temp" 						# Aussen oben
    temp3_path = "/home/pi/raspi2/stube.temp"						# Stube
    ...

    Mit dem anderen Raspi verfahre ich genau so. Es existieren also auf beiden Raspis jeweils die beiden Ordner raspi1 und raspi2. Der eine Ordner mit den eigenen Daten und der andere Ordner mit den Daten des anderen Raspis. So kommt dann wieder Ordnung in das Chaos.

    Wie gesagt, die beiden Raspis sollen ja eigentlich unterschiedliche Aufgaben erfüllen und wenn einer mal ausfällt, kann der andere seinen Teil weiter machen.

    Viele Grüße
    DocAdams

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

Jetzt mitmachen!

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