GPIO Ports von mehreren Pi abfragen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo ich könnte eure Hilfe gebrauchen.

    Bin bei meiner Smart Home Geschichte an meine Grenzen gestoßen.

    Ich habe einen Raspberry im Garten für die Teich und Rasenbewässerung und einen im Haus für Licht und Rolladensteuerung. Beide sind mit einen Web-Server versehen sodas ich die vom Handy oder PC steuern kann. Entsprechend haben die Button unterschiedliche Farbzustände je nachdem wie der Status der einzelnen GPIO sind.

    Neu habe ich einen 3. Rasperry mit Display. Dort werden alle GPIO der anderen 2 Rasberry als Button dargestellt. Damit kann ich auch alle GPIO steuern.

    Nun möchte ich auch hier, das die Button entsprechend farblich anzeigen, wie die Schaltzustände der einzelne GPIO sind. Des weiteren werden für die Lichtsteuerung Aktoren benutzt. Die Schaltzustände werden da in einer SQLite Datenbank gespeichert.


    Wie kann ich jetzt die GPIO und die Datendank der beiden Raspberry auslesen sodas ich die Farblich auf dem Display anzeigen kann.
    Habe es mit include() und Angabe der IP-Adresse usw. probiert aber ohne Erfolg.


    Welche Möglichkeiten gibt es die ich benutzen kann. Im Moment habe ich keine Idee, wie ich das realisieren kann.
    Wäre euch sehr Dankbar wenn ihr mir helfen könnt.

    Einmal editiert, zuletzt von Robby (27. März 2020 um 00:55)

  • Hallo,

    mein System funktioniert so.

    In einer Tabelle habe ich bei den Aktoren z.b. Licht

    OnCode Offcode

    001 002

    Nun sendet der Aktor seinen Code 001 an eine auswert php Datei. Diese schaut in der Code Tabelle welcher Code könnte es sein und setzt den Status auf 0 für aus und 1 für an.

    wäre

    http://zuhause.schmidt-bande.com/smarthome/klar/rf_receive.txt

    hier mal alles in der Übersicht

    http://zuhause.schmidt-bande.com/smarthome/klar/

    ist zwar nicht der super Code aber für zuhause reicht mir das.

    Lars

  • Kurze Antwort:

    Code
    $temperature = file_get_contents("http://www.example.com/temperature.php");

    Lange Antwort:

    * Die Scripts so umbauen dass sie nur noch die Daten im JSON-Format liefern.

    * Die HTML-Seiten so umbauen dass sie die Daten mit AJAX in die Seite einsetzen

    Vorteil: Daten und Darstellung getrennt, die Daten koennen auch anderweitig genutzt werden.

  • Danke Tell,

    dann muß ich ja meine ganze skripte umbauen oh je.

    Leider habe ich in JSON und AJAX noch keine Erfahrungen. Also erst damal einlesen.

    Oder kannst du mir kurz zeigen, wie die beide skripte aussehen müssen um die Ausgabe in AJAX zu bekommen?

    Die GPIO frage ich so ab: Dieses skript im im Hauptprogramm über include() eingebunden, deswegen der header.

    PHP
    <?php
    #
    # Pin 3  -->  GPIO 2  -->  einschalten  --> Relais 1/1
      $wert1 = exec("gpio  -g read 2");
      header('Location: http:../web/OrchideenControl.php');
      exit;
    ?>

    Und die Datenbank Abfrage sieht bei mir so aus:

    Wäre dir dankbar, wenn du mir dabei Hilfestellung geben kannst.

  • getstate.php:

    PHP
    <?php
      header( "Content-type", "application/json" ) ;
    
      echo '{ "input1": true, "input2": false }' ;
    ?>

    true und false muessen selbstverstaendlich den Zustand der entsprechenden Eingaenge angeben.

    index.html:

  • Hatte heute wieder erwarten etwas Zeit gehabt und dein Skript ausprobiert.

    Ich habe beide Skripte 1 zu 1 übernommen.
    Wenn ich beide Skripte auf einen PI habe funktioniert es. Aber wenn ich die Getstate.php auf einen anderen PI verlege und die IP-Adresse in der index.html anpasse, bekomme ich folgende Fehlermeldung:

    TypeError: NetworkError when attempting to fetch resource.

    Die Skripte gehören zum Benutzer www-data und die Rechte habe ich auch auf 0755 gesetzt. Die Fehlermeldung kommt immer.

    Die Skripte sind im Verzeichnis /var/www/html abgelegt. So wie es aussieht, habe ich ein Berechtigungsproblem, denn die Getstate.php findet er.

    Wenn ich die nämlich umbenenne bekomme ich die Fehlermeldung das er die Datei nicht findet.

    Muss ich eventuell noch ein Modul nach installieren in Linux? Wegen JSON oder AJAX. Da ich bis jetzt noch nichts damit gemacht habe.

    Installiert habe ich bis jetzt Apache, php und sqlite.

    Endschuldige wenn ich so danach Frage, aber ich habe noch nicht sehr viel Kenntnisse in Linux und PI.

    Einmal editiert, zuletzt von Robby (28. März 2020 um 15:50)

  • Ich hab's mit einem Raspberry und einer Linux-Maschine probiert. Das hat funktioniert.

    > TypeError: NetworkError when attempting to fetch resource.

    Das ist ein seltsamer Fehler, den habe ich bisher noch nicht gesehen.

    * Was passiert wenn man getstate.php mit dieser URL direkt im Browser aufruft?

    * Was sagt Chrom(e|imum) im Network-Tab der Entwickler-Ansicht?

    * Gibt es eine Fehlermeldung im Server-Log?

    Installieren muss man eigentlich nichts, und JavaScript ist anscheinend aktiv, sonst wuerde kein Fehler angezeigt.

  • Hey Tell,

    soweit ich es eingrenzen konnte liegt es warscheinlich an den Apache2 Server, denn der Apache2 läuft bei mir auf jeden Rasberry. Der Grund ist da ich mit einen angefangen bin und es immer erweitert habe. Und was ich jetzt mache soll halt als Zentrale Anzeige dienen, damit ich an einer Stelle alles sehen kann wie der Stand ist.

    So nun zu den Fehlermeldungen:

    Im Crom unter Netzwerkanalyse ist alles OK. Die Datei wird gefunden.

    Aber unter der Console bekomme ich diese Meldung:

    Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf http://192.168.xxx.xxx/web/getstate.php (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt).

    Dabei wird dieser Link mit angegeben.

    Der beschreibt ganz gut den Fehler. Nur wie gesagt meine Kenntnisse sind noch nicht so groß. Deswegen weiß ich nicht wo und wie ich den Header Eintrag einbinden muss.

    Einmal editiert, zuletzt von Robby (29. März 2020 um 12:20)

  • Ich habe den Fehler gefunden.

    Den Tip mit der Entwickler Ansicht war gut. Danach habe ich das halbe Internet durchsucht und bin fündig geworden.

    Nachdem ich deine getstate.php um einen Eintrag erweitert habe funktioniert dein Skript auch bei mir

    PHP
     <?php
      header("Access-Control-Allow-Origin: *");
      header( "Content-type", "application/json");
    
      echo '{ "input1": true, "input2": false }' ;
    ?>

    Jetzt komme ich auch klar und kann meine Skripte entsprechend anpassen.

    Ich möchte mich ganz herzlich bei dir bedanken für eine Hilfe.

    Das Thema kann als gelöst makiert werden.

  • hyle

    Danke für den Hinweis !

    Da war ich doch etwas zu vorschnell, man sollte doch erst weiter machen...

    Habe da doch noch ein Problem, denn wenn ich es erweitern möchte bekomme ich eine Fehlermeldung.

    TypeError: document.getElementById(...) is null

    die getstate.php:

    PHP
     <?php
      header("Access-Control-Allow-Origin: *");
      header( "Content-type", "application/json");
      echo '{ "input1": true, "input2": false, "input3": true }' ;
    ?>

    und die index.html

    @ Tell

    könntest du mich dabei noch einmal unterstützen?

    Ich kann so kein Fehler erkennen.

  • Sorry, mein Fehler!

    In meiner Version ist der CORS-Header drin, aber gepostet habe ich anscheinend eine Vorgaengerversion :-/

    Der Code im Post ist jetzt korrigiert.

    Der Content-Header war ebenfalls nicht in Ordnung, der muss auch angepasst werden.

    - - - - -

    > Ich kann so kein Fehler erkennen.

    Das ist jetzt aber nicht mein Fehler:

    <p><input type="button" value="Eingang 3" id="input2" class="off"></p>

    Die id muss natuerlich input3 sein...

  • Hallo Tell,

    Habe noch ein Problem in der getstate.php. Wie muss ich in den echo String statt true und false eine Variable einbinden.

    Versuche gerade die Skripte bei mir einzubinden. So wie es jetzt ist bekomme ich zwar keine Fehlermeldung mehr, aber die Button sind alle grün.

    Egal welchen wert die einzelnen Variablen haben.

  • Ich hab gerade keinen Pi zur Hand, aber so muesste es eigentlich gehen:

    Code
     echo "{ \"input1\": $wert1, \"input2\": $wert2, \"input3\": $wert3, \"input4\" : $wert4, \"input5\" : $wert5, \"input6\" : $wert6 }" ;

    Und der Content-type Header ist immer noch falsch!

    Einmal editiert, zuletzt von Tell (30. März 2020 um 15:03)

  • Danke Tell,

    ja jetzt funktioniert es. Vielen lieben Dank dafür. Werde mich heute mal dransetzen und weiter in mein System einzubinden.

    Und mit den Content-type Header meintest du die Leerzeichen am Ende?

    War mir nicht bewußt das es da so genau drauf ankommt.

  • Eine Frage habe ich noch und zwar sieht die index.html jetzt so aus:

    Soweit funktioniert es auch sehr gut. Nur das letzte Problem was ich noch habe ist, so wie es jetzt ist kann ich die relais einschalten über "relais01ein.php" zb.

    Entsprechend ändert sich auch der Button.

    Zum Ausschalten benötige ich aber das Skript "relais01aus.php".

    Gibt es dazu noch eine Möglichkeit, oder muss ich die einzelnen Skripte entsprechend abändern.

    In den einzelnen Skripten steht nur der entsprechende Befehl für den gpio Port drin.

    Ach Übrigends den Contend Haeder habe ich jetzt entsprechend angepasst.

  • Hallo Tell


    die relaisxxein.php

    PHP
    <?php
    #
    # Pin 3  -->  GPIO 2  -->  einschalten  --> Relais 1/1
      exec("gpio  -g write 2 0 ");
      header('Location: http:../web/OrchideenControl.php');
      exit;
    ?>

    und relaisxxaus.php

    PHP
    <?php
    #
    # Pin 3  -->  GPIO 2  -->  wiring  -->  ausschalten  --> Relais 1/1
      exec("gpio  -g write 2 1");
      header('Location: http:../web/OrchideenControl.php');
      exit;
    ?>

    Ich habe noch Aktoren FS20 in Betrieb.

    FS20_xx_ein.php

    FS20_xx_aus.php

    Die shell_exec ...... da steht nur der Binar Code für den Aktor der an der RS232 gesendet wird.

    Da man die Aktoren nicht auslesen kann speichere ich die Informationen in einer Datenbank.

    Wenn das mit deinen String nicht geht oder nur mit viel Aufwand, dann würde ich diese Skripte abändern, so das ich erst den Status abfrage und dann endsprechend umschalte.

    Wenn das

Jetzt mitmachen!

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