AVR-Werte sammeln per PHP

Um z.B. Temperatur-Werte historisch zu halten und darstellen zu können, habe ich ein PHP-Skript update.php programmiert, welches mir Werte z.B. vom AVR-NET-IO ausliest und mit einem timestamp in eine mySQL Datenbank (mySQL ist auch auf dem NAS DS209) schreibt:

Dieses PHP-Skript wird per cron-Job mit „wget http://localhost/update.php alle 10 Minuten auf dem NAS DS209 aufgerufen.
Somit habe ich eine Historie mit einer Auflösung von 10 Minuten in der mySQL-Datenbank.

Die entsprechende Datenbank kann dann z.B. so aussehen:

Im Prinzip geht das dann genauso bei anderen AVR-Webservern, es muss eben nur eine daten.html Seite vorhanden sein.

Auswerten lässt sich diese Historie z.B. mit Digrammen, wie dies funktioniert, steht hier:
Werte als Diagramm darstellen

author avatar
Christian Häussler

16 Replies to “AVR-Werte sammeln per PHP”

  1. Hi Christian,

    kann es sein das ich die webpage-netio.h noch anpassen muss, so wie du in den folgenden Betrag beschrieben hast.

    http://son.ffdf-clan.de/?path=forumsthread&threadid=59

    ich habe etwas änliches gemacht!
    Ich gebe alle Werte, die ich logen will, in der daten.html aus, aber etwas anders, so:
    Wert=Value
    Das sieht im Quellcode der webpage.h so aus:
    view sourceprint?
    1    „OW1Akt=%OW@00 °Crn“
    2    „OW1Min=%OW@08 °Crn“
    3    „OW1Max=%OW@16 °Crn“
    4    „ADC4=%VA@04rn“
    5    „Temp=%VA@00 °Crn“
    6    „Humi=%VA@01 %rHrn“
    7    „Taup=%VA@02 °Crn“

    Wenn ja, wo muss ich was in die webpage-netio.h einfügen?

    webpage-netio.h

    //—————————————————————————-
    // Daten Seite
    #if HTTP_CSVDATEN
    PROGMEM char Page2[] = {

    // Ausgabe erfolt im CSV-Format mit Semicolon (;) als Feldtrenner
    // 1. Zeile Feldbezeichnung
    // 2. Zeile Werte

    // Feldbezeichnungen
    Eing_A0″;“
    Eing_A1″;“
    Eing_A2″;“
    Eing_A3″;“
    Eing_A4″;“
    Eing_A5″;“
    Eing_A6″;“
    Eing_A7

    #if USE_PORTD_6IN
    „;“
    Eing_D2″;“
    Eing_D3″;“
    Eing_D4″;“
    Eing_D5″;“
    Eing_D6″;“
    Eing_D7
    #endif

    #if USE_OW
    „;“
    T00″;“
    T01″;“
    T02″;“
    T03″;“
    T04″;“
    T05″;“
    T06″;“
    T07″\r\n“
    #else
    „\r\n“
    #endif

    // Werte
    „%VA@00;“
    „%VA@01;“
    „%VA@02;“
    „%VA@03;“
    „%VA@04;“
    „%VA@05;“
    „%VA@06;“
    „%VA@07“

    #if USE_OW
    „;“
    „%OW@00;“
    „%OW@01;“
    „%OW@02;“
    „%OW@03;“
    „%OW@04;“
    „%OW@05;“
    „%OW@06;“
    „%OW@07\r\n“
    #else
    „\r\n“
    #endif
    „%END“};
    #endif

    Gruß Christof

    • Hallo Christof,

      so wie Deine Seite aus sieht, schreibst Du ja alle Werte mit ; hintereinander weg.
      Du musst aber Wert=Value ausgeben, sonst erkennt die update.php keine Werte!
      Meine daten.htm z.B. sieht so aus:

      // Daten-Seite: 1-Wire-Werte, AD-Werte und SHT-Werte 
      PROGMEM char Page2[] = {
      
      #if USE_OW
      	// 1-Wire Sensoren -> Temperatur
      	"AT_Akt=%OW@00\r\n"
      	"AT_Min=%OW@08\r\n"
      	"AT_Max=%OW@16\r\n"
      #endif // USE_OW
      
      #if USE_SHT
      	"IT_Akt=%OW@05\r\n"
      	"IT_Min=%OW@13\r\n"
      	"IT_Max=%OW@21\r\n"
      	"Humi_Akt=%OW@06\r\n"
      	"Humi_Min=%OW@14\r\n"
      	"Humi_Max=%OW@22\r\n"
      	"Taup_Akt=%OW@07\r\n"
      	"Taup_Min=%OW@15\r\n"
      	"Taup_Max=%OW@23\r\n"
      #endif // USE_SHT
      
      	// AD-Werte
      	"Sonne=%VA@04\r\n"
      	"%END"};
      

      Viele Grüße
      Christian

  2. Hi Christof,

    naja, die Ausgabe des Query bestätigt, das KEIEN Werte in die Datenbank geschrieben werden, da diese offenwichtlich nicht aus der daten.html Seite des AVR-NET-IO gelesen werden konnten.

    Wie ist denn der Inhalt der daten.html Seite?
    Steht da wirklich z.B.:
    $AT_Akt = 18,5
    $AT_Min = 12,3
    $AT_Max = 22,9

    Wie sieht die Ausgabe aus, wenn Du die Datei direkt im Browser aufrufst?

    Gruß
    Christian

  3. Hi Christian
    ich habe eine bisschen im I-Net geforscht und habe eine Ausgabe an folgender Stelle eingefügt. Siehe fett gedruckter Text. Das Ergebnis (gekürzt)  aus dem DOS Fenster nach dem Ausführen des Scripts siehst du unten. Dein Vorschlag zur Ausgabe über Echo siehst am Ende der Ausgabe.
    function getAVRNetIOValue($id) {
    $value = NULL;
    error_reporting(0);    
    $avr_net_io = fopen(„http://172.21.47.230/daten.html“, „r“) or die(„Die Werte des AVR-NET-IO konnten nicht ermittelt werden!

    <BR>Der AVR-NET-IO ist offline!“);
    if ($avr_net_io!=false) {
    while ( ($data = fgetcsv($avr_net_io, 1000, „=“)) !== FALSE ) {
    $num = count($data);
    print „<p> $num fields in line $row: <br>\n“;
    $row++;

    for ($c=0; $c < $num; $c++) {              // FOR-Schleife, um Felder
    print $data[$c] . „<br>\n“;
    }

    if ($data[0] == $id) {
    $value = $data[1];
    }
    }
    fclose($avr_net_io);
    }
    return $value;
    }
    Ergebniss
    width:220px;>Digital</td><td style<br>
    width:80px;>auf/zu</td><td style<br>
    width:220px;>Digital</td><td style<br>
    width:80px;>auf/zu</td></tr><br>
    <p> 3 fields in line 25: <br>
    <tr><td>D2_</td><td class<br>
    grn></td><td>D5_</td><td class<br>
    grn></td></tr><br>
    <p> 3 fields in line 26: <br>
    <tr><td>D3_</td><td class<br>
    grn></td><td>D6_</td><td class<br>
    grn></td></tr><br>
    <p> 3 fields in line 27: <br>
    <tr><td>D4_</td><td class<br>
    grn></td><td>D7_</td><td class<br>
    grn></td></tr><br>
    <p> 1 fields in line 28: <br>
    </table><br>
    <p> 1 fields in line 29: <br>
    <br><br>
    <p> 3 fields in line 30: <br>
    <table class<br>
    tbl border<br>
    1><br>
    <p> 6 fields in line 31: <br>
    <tr><th colspan<br>
    5>Temperatursensoren</th></tr><tr><td width<br>
    200px>1-Wire</td><td width<br>
    200px>Ort</td><td align<br>
    right>Wert</td><td align<br>
    left> </td><td>Min/Max(Tag)</td></tr><br>
    <p> 2 fields in line 32: <br>
    <tr><td>Sensor 0</td><td>Aussen</td><td align<br>
    right>20,7</td><td>&deg;C</td><td>20,7 / 22,1</td></tr><br>
    <p> 2 fields in line 33: <br>
    <tr><td>Sensor 1</td><td>Innen</td><td align<br>
    right>20,9</td><td>&deg;C</td><td>20,9 / 22,1</td></tr><br>
    <p> 1 fields in line 34: <br>
    </table><br>
    <p> 1 fields in line 35: <br>
    </div><br>
    <p> 2 fields in line 36: <br>
    <br><div id<br>
    tail>94 Besucher seit Start des Webservers<br>Version V1.0.18 – Basiert auf
    Ulrich Radig’s ETH_M32_EX V1.2.5 und diversen Erweiterungen<br>
    <p> 1 fields in line 37: <br>
    </div><br>
    <p> 1 fields in line 38: <br>
    </body></html><br>
    Auslesen der AVR Werte erfolgreich
    temp=Verbindung zum Datenbankserver erfolgreich
    Gewaechshaus Werte in Datenbank geschrieben
    Verbindung zum Datenbankserver abgebaut
    INSERT INTO avr (Sensor0, Sensor0_min, Sensor0_max) values (“, “, “)
    Gruß Christof

  4. Hallo Christian,
    folgendes wird nach dem Ausführen des Script angezeigt.
    C:\Programme\PHP5\php-cgi.exe C:\script\update.txt
    X-Powered-By: PHP/5.2.8
    Content-type: text/html

    Auslesen der AVR Werte erfolgreich
    Verbindung zum Datenbankserver erfolgreich
    Gewaechshaus Werte in Datenbank geschrieben
    Verbindung zum Datenbankserver abgebaut
    Guß Christof
     
     

    • Hallo Christof,

      hmm, OK.
      Dann gib die Werte doch mal über echo aus, also:
      echo $AT_Akt;
      echo $AT_Min;
      echo $AT_Max;
      und den Query:
      echo $query;
      am besten am Ende des Script’s!
      Dann siehst Du, was (oder was nicht) in die Datenbank geschrieben wurde.

      Gruß
      Christian

  5. Hallo Christian,
    Hier meine angepasste update.php. Ich rufe das script über:

    C:\Programme\PHP5\php-cgi.exe C:\script\update.txt auf.
    Der Aufruf der Datenseite im Browser funktioniert und liefert mir die entsprechenden Werte, auch das Schalten der Ausgänge über die Website funktioniert.

    <?php
    # —————————————————–
    # Datei: update.php
    # —————————————————–
    # Beschreibung:
    # Holt AVR-Werte und schreibt sie in eine Datenbank
    # —————————————————–
    # Autor: Christian Haeussler
    # geändert am: 05.05.2009
    # —————————————————–

    /* Ausgabe vom AVR-NET-IO: webpage.h -> daten.html
    // 1-Wire Sensor-Werte
    „AT_Akt=%OW@00\r\n“
    „AT_Min=%OW@08\r\n“
    „AT_Max=%OW@16\r\n“

    */

    function getAVRNetIOValue($id) {
    $value = NULL;
    error_reporting(0);   
    $avr_net_io = fopen(„http://IP Adresse NET IO/daten.html“, „r“) or die(„Die Werte des AVR-NET-IO konnten nicht ermittelt werden!<BR>Der AVR-NET-IO ist offline!“);
    if ($avr_net_io!=false) {
    while ( ($data = fgetcsv($avr_net_io, 1000, „=“)) !== FALSE ) {
    $num = count($data);
    $row++;
    if ($data[0] == $id) {
    $value = $data[1];
    }
    }
    fclose($avr_net_io);
    }
    return $value;
    }

    /* AVR Werte auslsen */
    $AT_Akt = getAVRNetIOValue(„AT_Akt“);
    $AT_Min = getAVRNetIOValue(„AT_Min“);
    $AT_Max = getAVRNetIOValue(„AT_Max“);

    echo „Auslesen der AVR Werte erfolgreich\n“;

    /* Verbindung zu mySQL aufbauen, auswählen einer Datenbank */
    $link = mysql_connect(„localhost“, „root“, „password“)
    or die(„Keine Verbindung möglich: “ . mysql_error() . „\n“);
    echo „Verbindung zum Datenbankserver erfolgreich\n“;
    mysql_select_db(„avr_db“) or die(„Auswahl der Datenbank fehlgeschlagen\n“);

    /* aufbau der SQL Anfrage */
    $query = „INSERT INTO avr (Sensor0, Sensor0_min, Sensor0_max,) values „;
    $query = $query . „(‚$AT_Akt‘, ‚$AT_Min‘, ‚$AT_Max‘)“;

    /* ausführen der SQL Anfrage */
    $result = mysql_query($query) or die(„Anfrage:\n\n$query\n\nfehlgeschlagen: “ . mysql_error() . „\n“);

    echo „Gewaechshaus Werte in Datenbank geschrieben\n“;

    /* schliessen der mySQL Verbinung */
    mysql_close($link);
    echo „Verbindung zum Datenbankserver abgebaut\n“;
    ?>

    In der Tabelle des SQL Server gibt es jetzt noch folgende Datenfelder:

    Feld              Typ          Kollation    
    id              int(10)
    ts              timestamp           
    Sensor0          text      utf8_general_ci
    Sensor0_max      text      utf8_general_ci      
    Sensor0_min          text      utf8_general_ci

    Besten Dank für deine Hilfe
    Guß Christof

  6. Hi,
    ich habe deine update.php auf 3 Werte die ich aus meinem Pollin Board (Webserber eth_m32_ex_avr-net-io_1_0_18) lesen möchte reduziert. DAs sind  „AT_Akt=%OW@00\r\n“
    „AT_Min=%OW@08\r\n“
    „AT_Max=%OW@16\r\n“
    Leider wird in meinen SQL Server nur der Timestamp und die ID geschrieben. Die anderen 3 Felder sind leer. Was mache ich falsch? Kannst du mir helfen?
    Gruß Christof

    • Hallo Christof,

      schick mir doch mal Deine update.php evtl. ist da ein Fehler drin.
      Oder ruf doch mal die Daten-Seite Deines Net-IO manuell im Browser auf, kommen da Werte?

      Viele Grüße,
      Christian

  7. Hi,
    kann das avr-net-IO-Board auch das Script ausführen? Ich suche eine Lösung die Daten einer CSV-Datei in eine Datenbank im Internet zu übermitteln. Da hilft mir der Aufruf des Boards im home-netzwerk leider nicht weiter. Kann man die Daten automatisiert an eine sql schicken?

    • Hallo Tobias,

      das geht schon, Du müsstest Dir dann im Internet einen Web-Space besorgen mit einer MySQL Datenbank. Hier müsstest Du dann ein PHP-Script hochladen, das Daten anhand der in einer URL übergebenen Werte in die MySQL-DB schreibt. Der AVR-NET-IO müsste dann aus Deinem Heimnetz nur dieses PHP-Script aufrufen und die Werte mit übergeben.

      Gruß
      Christian

  8. Pingback: AVR-NET-IO als Gewächshaussteuerung | Christian´s Hobby Blog

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.