Pages: 1 2 3 [4]   Go Down
Author Topic: Wie bestimmten Wert von einer Webseite auslesen und darstellen ?  (Read 4866 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kann mir jemand noch einmal unter die Arme greifen.
Ich habe es ein wenig anders gemacht und kann jetzt eine HTML-Seite ganz auslesen, könnte sie auch gegrenzen. Die Buchstaben und Zahlen kommen jetzt seriell hintereinander auf den Monitor. Wie kriege ich es hin, dass ich jetzt an einer beliebigen Stelle (muss natürlich ggf. mit Suchstring) die Werte in einer Reihe hintereinander angezeigt bekomme, besser wäre es, wenn man sagen würde, dass die nächsten 6 Zeichen nach "Sensor 1) dargestellt werden sollen.

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>
#include "LCD4884.h"
int inByte;

#define LOGIN ("YWRtaW46dGdjKEE67w==.") //Base64 kodiert USERNAME:PASSWORT
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(98,33,2,73); // Webserver
EthernetClient client;
TextFinder finder( client);
void setup() {
  Serial.begin(9600);
    lcd.LCD_init();       
    lcd.LCD_clear();
   while (!Serial) {
    ; // warte bis serieller Port verbunden ist
  }

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Ethernet-Fehler using DHCP");
    for(;;)
      ;
  }
  delay(1000);
  Serial.println("verbinde, bitte warten...");
  lcd.LCD_write_string(0, 0, "bitte warten", MENU_NORMAL);
  if (client.connect(server, 80)) {
    Serial.println("verbunden");
    lcd.LCD_write_string(3, 1, "verbunden", MENU_NORMAL);
client.print(LOGIN);
client.println("GET  HTTP/1.0");
    client.println();
  }
  else {
    Serial.println("Verbindung fehlerhaft");
  }
}

void loop()
{
  if (client.available()) {
    inByte = client.read();
    Serial.println(char (inByte));  //[color=blue]hier rauschen jetzt alle Zeichen der Seite bis zum Ende vorbei[/color]
lcd.LCD_write_string(0, 3, "Suchwert", MENU_HIGHLIGHT);
  if (!client.connected()) {
    Serial.println(100);
    Serial.println("Trennung.");
    lcd.LCD_write_string(0, 5, "Trennung!", MENU_NORMAL);
    client.stop();
    for(;;)
      ;
  }
}
}

Gruß Gerd
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo, wie ich vermute, fällt euch auch nichts weiter ein, um mir einen praktikablen Weg aufzuzeigen. Was man alles machen könnte, wurde mir ja nun gesagt, doch was hilft es, wenn ich es nicht verstehe, obwohl es eigentlich sehr einfach sein müsste, wenn man nur 3-4 Zeichen aus einem TCP-String braucht.
Wir ihr ja mitbekommen habt, habe ich mit dem letzten Script die komplette Seite auslesen können. Jetzt möchte ich nur noch diesen (rot gekennzeichneten) Bereich auf einem Display darstellen.

Ausschnitt aus der Wiedergabe nach dem Listing
<tr><td>Sensor 4</td><td>Pumpe VL</td><td align="right">12,5</td><td align="left">&deg;C</td><td>12,4 / 12,6</td></tr>
<tr><td>Sensor 5</td><td>Brauchwasser</td><td align="right">12,9</td><td align="left">&deg;C</td><td>12,8 / 13,0</td></tr>
<tr><td>Sensor 6</td><td>Nebengebaeude</td><td align="right">8,9</td><td align="left">&deg;C</td><td>8,8 / 9,2</td></tr>

Dieser Wert ändert sich immer. Wie kann ich ihn im Rhythmus von ca. 1min auf dem Display darstellen.

Kann niemand helfen ??

Gruß und Dank
Gerd
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Gerd,

immer langsam, das wird schon. Mich wundert momentan, aber, das Du plötzlich Sensor 5 (Brauchwasser) haben willst, ich dachte bisher gibg es um das Nebengebäude, Sensor 6? Nicht das es einen großen Unterschied macht.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Mario,
du hast recht, habe mich vertippt. Ist aber im Grunde egal, ob vom Sensor 6 oder 5 der Wert gesucht werden soll, es kommt aufs Gleiche raus. Ich habe schon so viel gelesen und ausprobiert, jedoch ohne Erfolg. Ich finde auch keinen Vergleich im Netz, wo ich mir das ggf. umsetzen kann. Das beste wäre schon, wenn jemand mir die fehlenden Zeilen einfach mal ins Script reinsetzt, das ist dann konstruktiv und ich könnte es mir nach meinen Bedürfnissen abändern. Die lieben Hinweis, was und wie ich es machen könnte helfen mir im Augenblick nicht viel weiter, weil ich es z.Z nicht raffe - wie der Spruch mit dem Wald und den Bäumen.

Gruß Gerd
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21879
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der Vorschlag von Udo eine eigene Seite nur fürs Datenübertragen zu erstellen, wo die Werte unformatiert ohne Beiwerk übertragen werden und so einfacher zu übernehmen sind hast Du nicht in Betracht gezogen oder habe ich da Deine Antwort übersehen?
Grüße Uwe 
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Uwe,
den Vorschlag von Udo habe ich nicht angenommen, weil man es nicht braucht und es einfacher geht.
Ich kann nur sagen, die "Schweizer" haben es drauf. Im internationalen Forum hat @pylon mit 4 Zeilen das ganze Problem geklärt. DANKE @pylon.

Code:
finder.find("Pumpe VL");
finder.find("right\">);
value = finder.getValue();
finder.find(",");
afterpoint = finder.getValue();

Ich möchte es euch nicht vorenthalten, wie einfach es letzt endlich ist. Mit ein paar kleinen Abänderungen werden die Werte vor und nach dem Komma dann angezeigt.
Weitere Kosmetik bekomme ich hoffentlich alleine hin.

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>
int inByte;
int value;
int Zahl1;
int Zahl2;
#define LOGIN ("YWRdkW4c2FkVjaG56SSzw==.") //Base64 kodiert USERNAME:PASSWORT
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(95,33,3,26); // Webserver
EthernetClient client;
TextFinder finder( client);
void setup() {
  Serial.begin(9600);
   while (!Serial) {
    ; // warte bis serieller Port verbunden ist
  }

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Ethernet-Fehler using DHCP");
    for(;;)
      ;
  }
  delay(1000);
  Serial.println("verbinde, bitte warten...");
  if (client.connect(server, 80)) {
    Serial.println("verbunden");
client.print(LOGIN);
client.println("GET  HTTP/1.0");
    client.println();
    finder.find("Nebengebaeude");//kann beliebige Reihe sein
finder.find("right\">");
value = finder.getValue();
finder.find("<");// ist Zahl vor Komma
Zahl1 = finder.getValue();
finder.find(",");// ist Zahl hinter Komma
Zahl2 = finder.getValue();

Serial.print("die Temperatur = ");
Serial.print(Zahl1);
Serial.print(",");
Serial.print(Zahl2);
Serial.println(" Grad");
  }
  else {
    Serial.println("Verbindung fehlerhaft");
  }
}

void loop()
{
  }

Allen herzlichen Dank für die Unterstützung.

Gruß Gerd
« Last Edit: November 01, 2012, 08:20:16 am by COOL » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21879
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Trisonic schreibt hier:
http://arduino.cc/forum/index.php/topic,126166.msg949772.html#msg949772
er hätte sich mit dem/n Autor/ren der TextFinder gesprochen und diese hätten ihm gesagt, daß eine verbesserte Version der Bibiothek im Core des Arduino IDE ab 1.0 eingeflossen ist. Er bemängelt aber gleichzeitig, daß die Funktionen der Stream Bibiothek schlecht bis gar nicht dokumentiert sind.

Grüße Uwe
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke Uwe,
werde mal mir das durchlesen und meine Versuche machen.
Zur Zeit läuft alles nach mehreren Stunden problemlos. Ich habe das Script schon weitgehend erweitert und bin jetzt dabei eine Variante zu finden, um ohne IP auf den Server zu kommen, weil bei diesem Server alle 24 Std die IP geändert wird. Ebenso soll eine Menüführung mehrere Temp-Fühler auswählen lassen.

Gruß
Gerd
Logged

Pages: 1 2 3 [4]   Go Up
Jump to: