Java Script txt datei auslesen

  • Hallo,
    ich möchte mit Java Script eine Textdatei auslesen, und die Daten auf der html Seite zyklisch aktualisieren (z.B. aller 10s), ohne die Seite komplett neu zu laden.
    Anbei mein Testscript, was leider nicht richtig funktioniert.
    Wer kann mir helfen? Oder eine Quelle für eine funktionierende Variante.
    Danke

  • Javascript wird Clientseitig ausgeführt. Ich glaube also nicht dass das was du vor hast funktionieren wird oder Sinnvoll ist ;)

    Sinniger wäre es wenn du eine Anfrage an ein PHP Script stellst, dieses dann darauf reagiert (if (issset($_GET['text']....), die Datei ausliest und den Inhalt zurück schickt (antwort). Das kannst du in der selben Datei machen wie der Rest steht.

    Gegenfrage: Was steht in der Datei drin?

  • Ich dachte, mit Datum und Zeit funktioniert dies auch, warum nicht mit einer txt Datei, wo eine Temperatur abgelegt wird. Im Moment lese ich die Datei mit php ein und übergebe den Wert in einer Variable an html. Das funktioniert, ist aber nur nach der Browseraktualisierung aktuell. Deswegen wollte ich eine automatisch Aktualisierung integrieren, ohne alles komplett neu zu laden.

    Code
    $temppool = file_get_contents('/home/pi/wetter/wde1/temperatur.txt');
    $tpl->assign('var01', $temppool);
  • Hallo,

    JS, welches im Browser läuft, kann nicht auf das lokale Dateisystem zugreifen.

    Das `open("GET", "../datei.txt")` sendet auch eine HTTP GET-Request - und erwartet normalerweise eine URL als Parameter.


    Wenn du Daten auf der Seite ändern willst, müssen die vom Server kommen. Auf dem Server kann dann PHP, Python, JavaScript, ... laufen. Halt irgendwas, was die gewünschten Daten liefert. Die Verarbeitung läuft dann wieder im Browser.

    Gruß, noisefloor
    Automatisch zusammengefügt:
    Hallo,

    Zitat

    Ich dachte, mit Datum und Zeit funktioniert dies auch, warum nicht mit einer txt Datei,


    Datum und Zeit werden ja auch über eingebaute JS Funktionen bereit gestellt (welche die Zeit aus dem System "ziehen") - da ist kein Dateizugriff, HTTP-Request oder so notwendig. Das ist was ganz anderes, als was du möchtest :)

    Gruß, noisefloor

    Einmal editiert, zuletzt von noisefloor (11. März 2016 um 22:13)

  • Blöde Frage: Ist das eine von dir selbst erstellte html Datei, oder modifizierst du eine "fremde" ? Diese "$tpl->assign" Geschichte sieht mir, ohne dich beleidigen zu wollen, nicht nach deinem Code aus ;)

    Du kannst normalerweise problemlos AJAX einbauen. Also grob umschrieben definierst du eine Stelle in der HTML Seite die aktualisiert werden soll, zum Beispiel "<span id='temp'></span>", und in javascript rufst du periodisch die Daten ab und lässt diese id updaten....

    Beispiel:

    index.html
    [code=php]
    <!DOCTYPE html>
    <html>
    <head>
    <script src="https://code.jquery.com/jquery-2.2.1.min.js"></script>
    <script type="text/javascript">
    function get_request(command) {
    $.ajax({
    type: "GET",
    url: "data.php?"+command,
    async: true,
    dataType: "JSON",
    success: function(data) {
    $.each(data, function(id,val) {
    if (document.getElementById(id) !== null) {
    console.log("JSON Data: " + id + ":" + val);
    document.getElementById(id).innerHTML = val;
    }
    })
    },
    });
    }
    function get_temperatur() {
    get_request("temp=pool");
    gettempTimer = setTimeout(get_temperatur, 1000);
    }
    gettempTimer = setTimeout(get_temperatur, 1000);
    </script>
    </head>

    <body>
    <b>Pool Temperatur:</b> <span id="pool" > </span>
    </body>
    </html>
    [/php]

    data.php
    [code=php]
    <?php
    if (isset($_GET['temp'])) {
    $where = $_GET['temp'];
    $data = array();
    $data[$where] = file_get_contents('/home/pi/wetter/wde1/' . $where . '.txt');
    print json_encode($data);
    }
    ?>
    [/php]

    Allerdings finde ich Umwege über irgendwelche Textdateien Schwachsinn... Irgend ein Script schreibt das in eine Textdatei und verursacht somit eine unnötige Belastung der SD die daraufhin nicht mehr soo lange hält und irgendein anderes Script liest dann diese Textdatei aus.... Wieso letzteres aber nicht einfach das erste Script ausführt und die Rück-/Ausgabe verwendet ist schleierhaft ....

  • Danke für den Vorschlag.
    Ich finde die Variante mit dem Zwischenspeichern in einer txt auch nicht gut.
    Die Temperatur von dem Sensor wird allerdings nur aller paar Minuten gesendet. Wenn ich die Seite aufrufe und die Temperatur kommt gerade nicht rein, habe ich keine Anzeige. Die bessere Lösung wäre ein ablegen in einer Datenbank, oder ein Zwischenspeichern im RAM. Das kommt noch...

    Das Script funktioniert, so, aber leider noch nicht.
    Was bedeutet die Variable in der Pfadzeile zu der Textdatei?

    $data[$where] = file_get_contents('/home/pi/wetter/wde1/' . $where . '.txt');
    warum nicht so?
    $data[$where] = file_get_contents('/home/pi/wetter/wde1/temperatur.txt');

  • Das Script funktioniert schon wenn man weiß was benötigt wird :fies: Demo: http://raspberrypi.roxxs.org/test/stefan.php (der Wert ändert sich aber nicht)

    $where dient der Flexibilität. "temppool" sah für mich so aus als würdest du die Temperatur eines Pool's erfassen - wäre zumindest eine mögliche Deutung des Variable-Namens.
    Dementsprechend können mehrere Textdateien existieren, pro Sensor eine. Und somit kannst du auch mehrere Werte über die Webseite abfragen, brauchst dann halt nur mehrere get_request("temp=pool"); Abfragen.. Und desweiteren muss es halt eine "id" passend zum Textdateinamen geben.

    Wenn du also nur eine Datei für einen einzigen Sensor hast, dann änderst du obiges einfach wie folgt ab - wobei ich jetzt nur die zu ändernden Zeilen zeige nicht alles:
    [code=php]
    get_request("temp=temperatur");

    <b>Temperatur:</b> <span id="temperatur"> </span>
    [/php]

    na, machts nu *klick* ? :D

  • Bitte Poste Quellcode hier eingebettet, oder als Pastebin - so ein Screenshot ist nahezu unbrauchbar.

    Ausserdem solltest du mal den Debugger deines Browsers aktivieren, und dort nach Fehlermeldungen und dem Netzwerkverkehr schauen - da sollte dann schon Klarheit reinkommen.

  • Ich fasse es nicht, wollte gerade nach Fehlermeldungen schauen und die Temperatur ist da.
    Die Aktualisierung klappt aber nicht, hab jetzt noch mal die eingehende Temperatur geändert. Auf der Testseite wird diese aber nicht übernommen. Woran kann das liegen? Betrifft aber nur den IE, bei GoogleChrom geht es, kann man da noch was machen?

    Einmal editiert, zuletzt von stefan-dd (12. März 2016 um 14:25)

  • Ruf halt mal data.php?temp=pool manuell im IE auf, um sicher zu stellen das es nicht am data.php liegt - Ausschlussverfahren.

    Allerdings ist IE ziemlich mies, Microsoft hält sich nicht an den HTML Standard und macht bei vielem Probleme... Könnte also gut sein das IE nicht mit jQuery zurecht kommt.

  • Bei Aufruf der Daten php wird der Wert angezeigt, aktualisiert sich mit F5.
    Die html Seite aktualisiert sich nur mit Browser Neustart, da hilft auch kein F5 oder neues Fenster.
    Google Chrom funktioniert.
    Wie kann man das im IE hin bekommen?

  • Vergiss IE

    Das ist ernst gemeint!
    IE ist unsicher. IE hat etliche Sicherheitslücken die selbst nach Jahren nicht gestopft werden. IE macht bei vielen Sachen Probleme da Microsoft sich nicht an die HTML Standards hält. Ich hab das bei einem anderen großen Projekt irgendwann aufgegeben weil nur der IE bei zich verschiedenen Sachen Probleme machte - alle anderen Browser funktionieren top.

  • Nun würde ich gern noch Raspberry Temperatursensoren in dem Script mit auslesen. Der JavaScript Code gibt die Übertragung mehrerer Daten ja her.
    Ich weis aber nicht wie man dies in dem php richtig integriert. Als Datensatzvariable könnte man ja die Sensornummer nutzen.
    Anbei mal meine Idee. Wer kann mir weiterhelfen?
    Danke

  • Zunächst mal musst du die erste Zeile bezüglich $data[$where] auskommentieren oder zuvor prüfen ob die Datei existiert, sonst verfälscht du das Ergebnis - es kann ja nicht beides zutreffen Textdatei oder 1wire.

    Desweiteren ist es absolut nicht notwendig Konsolen Befehle auszuführen, das bremst nur unnötig aus - mal gänzlich davon abgesehen das man cat nicht braucht da das grep auch alleine kann...
    Gewöhne dir bitte an so viel wie möglich in der jeweiligen Programmiersprache umzusetzen, das ist weitaus schneller und besser. Konsolen Befehle ist bash, du nutzt aber gerade PHP.

    Das Problem ist das du glaub ich noch nicht verstanden hast wie das ganze Funktioniert. Die Übergabe an data.php muss die id enthalten dessen Wert dann aktualisiert wird. Wenn du $where nutzt muss also in der index.html auch ein <span id mit der dazu passenden id existieren.
    Beispiel:

    Code
    get_request("temp=10-000801b5a7a6");
    Code
    <b>Temperatur:</b> <span id="10-000801b5a7a6"></span>

    Siehst du die Zusammenhänge?

    Nun zu dem Part des auslesens via data.php:

    Wenn du SOWOHL Textdatei als auch 1wire auslesen willst, solltest du in der data.php eine Prüfung einbauen was jeweils zutrifft - denn sonst kassierst du etliche Fehler und /var/log/apache2/errror.log wächst ins unermessliche.

    Ausgangslage:
    [code=php]
    <?php
    if (isset($_GET['temp'])) {
    $where = $_GET['temp'];
    $data = array();
    $data[$where] = file_get_contents('/home/pi/wetter/wde1/' . $where . '.txt');
    print json_encode($data);
    }
    ?>
    [/php]

    Ändern in:
    [code=php]
    <?php
    if (isset($_GET['temp'])) {
    $where = $_GET['temp'];
    $data = array();
    if (file_exists('/home/pi/wetter/wde1/' . $where . '.txt')) {
    $data[$where] = file_get_contents('/home/pi/wetter/wde1/' . $where . '.txt');
    } elseif (file_exists('/sys/bus/w1/devices/' . $where . '/w1_slave')) {
    $lines = file("/sys/bus/w1/devices/" . $where . "/w1_slave");
    if (preg_match("/t=(.*)/", $lines[1], $match)) {
    $data[$where] = round($match[1]/1000, 2);
    }
    }
    }
    print json_encode($data);
    }
    ?>
    [/php]

    Bitte versuchen zu verstehen was da abgeht, nicht einfach nur copy&paste. Wenn Fragen sind dann bitte gezielt fragen, nicht einfach nur "versteh ich nicht".

Jetzt mitmachen!

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