Ankündigung

Einklappen
Keine Ankündigung bisher.

Wetterdaten aus dem Internet

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • enertegus
    antwortet
    Zitat von michel38 Beitrag anzeigen
    Erst einmal genau zu verstehen wie die Logik aufgebaut ist.
    Im ersten Teilstring nach "<forecast_information>" suchen und....??? Was soll abgetrennt werden und warum +xmlText_Data2??
    Die Antwort kommt in 2 Teilen und zwar xml_TextData1 und xml_TextData2. Im ersten String xml_TextData1 sind da noch vor dem "<forecast_information>" Sachen, die nicht interessieren und können gelöscht werden.

    Die eigentlichen Nutzdaten sind also über 2 Strings verteilt, was die Sache nach dem Suchen ja etwas unschön macht (ich weiss nicht, wie da getrennt wird, aber es könnte ja sein, dass z.B. am Ende des 1. strings "<forecast" und am Anfang des zweiten "_information>" steht).Eine Suche über 2 Strings gestaltet die Suche etwas aufwändiger.

    Im vorliegenden Fall sind aber die Nutzdaten <1400 Bytes und passen eigentlich in einen String. Dazu werden also zunächst alle Daten, die im ersten String vor "<forecast_information>" stehen gelöscht und dann der zweite String angehängt.

    Nun kann man nur noch mit einem String arbeiten und die Suche wird recht einfach. Alle Daten stehen dann im xmlText.

    Klarer?

    Einen Kommentar schreiben:


  • michel38
    antwortet
    Zitat von enertegus Beitrag anzeigen
    wo liegt das Problem genau?
    Erst einmal genau zu verstehen wie die Logik aufgebaut ist.

    Code:
    if event(readtcp(Port,IP,xmlText)) and IP == GoogleIP then {
    den String "xmlText" mit den Daten des Qelltext füllen.
    Code:
       if (xmlCount==0) then xmlText_Data1=xmlText endif;
       if (xmlCount==1) then xmlText_Data2=xmlText endif;
       xmlCount=xmlCount+1
    }endif
    Die Datenmenge in einzelne Strings aufteilen und den Counter hochzählen

    Code:
        PosStart=find(xmlText_Data1,$<forecast_information>$,0u16)+size($<forecast_information>$);
        xmlText=split(xmlText_Data1,PosStart,END)+xmlText_Data2;
    Im ersten Teilstring nach "<forecast_information>" suchen und....??? Was soll abgetrennt werden und warum +xmlText_Data2??

    Code:
    PosStart=find(xmlText,$<city data="$,0u16)+size($<city data="$);
        PosEnd=find(split(xmlText,PosStart,END),$"/>$,0u16)+PosStart-1u16;
        Weather_Stadt=split(xmlText,PosStart,PosEnd);
    Jetzt wird wieder im gesamten String gesucht, wozu sind die Teilstrings?

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    Zitat von michel38 Beitrag anzeigen
    Hallo,
    Die Daten hab ich schon mal im eibpc, aber das parsen bekomme ich noch nicht so richtig in den Griff. Kann jemand helfen?
    Unabhängig von der Anmerkung vom Makki, wo liegt das Problem genau?

    Einen Kommentar schreiben:


  • makki
    antwortet
    Warum müsst ihr euch das Leben so schwer machen
    Das gibts auch gescheit&normiert: Yahoo! Weather - Yahoo! Developer Network (oder von google)

    Webseiten zu parsen ist&bleibt IMHO fahrlässige selbstgeisselung

    Makki

    Einen Kommentar schreiben:


  • michel38
    antwortet
    Hallo,

    Die Daten hab ich schon mal im eibpc, aber das parsen bekomme ich noch nicht so richtig in den Griff. Kann jemand helfen?

    Einen Kommentar schreiben:


  • michel38
    antwortet
    Zitat von kex Beitrag anzeigen
    Der große Nachteil ist aber dass man bei HTML immer davon ausgehen muss, dass sich der Aufbau ändert, wenn das aussehen der Webseite verändert wird.
    Dem bin ich mir schon im klaren. Es ist einfach nur dir Herausforderung.

    Ich hab schon ein wenig gespielt, aber bevor das Parsen kommt, brauch ich noch vernünftige Daten. Derzeit bekomm ich noch eine "400 bad request" zurück. Werde mal noch die ein oder andere Variante testen. (der Abend ist ja noch lang. )

    Einen Kommentar schreiben:


  • kex
    antwortet
    Zitat von michel38 Beitrag anzeigen
    Funktioniert es nur mit xml oder geht auch eine html-Seite? Mein Favorit ist immer noch yahoo.
    Prinzipiell funktioniert das auch mit HTML, wobei es mit HTML sicher etwas komplexer wird (weils eben neben den wichtigen Infos noch Layout infos enthält). Der große Nachteil ist aber dass man bei HTML immer davon ausgehen muss, dass sich der Aufbau ändert, wenn das aussehen der Webseite verändert wird.
    Bei XML ist das etwas anders: Hier ist die wahrscheinlichkeit dass sich der Aufbau grundlegend ändert wesentlich geringer. Deshalb würde ich XML in jedemfall vorziehen

    Einen Kommentar schreiben:


  • michel38
    antwortet
    Danke Volker

    Aber mal eine andere Frage. Funktioniert es nur mit xml oder geht auch eine html-Seite? Mein Favorit ist immer noch yahoo.

    Einen Kommentar schreiben:


  • SnowMaKeR
    antwortet
    Hi Uwe,
    wie immer. Einfach nur der Hammer!

    Einen Kommentar schreiben:


  • michel38
    antwortet
    Hallo,

    Nach ein paar Startschwierigkeiten , hier mal mein Ergebnis:

    Einen Kommentar schreiben:


  • Bodo
    antwortet
    Hoi

    Ich hab's nicht als Macro verpackt, aber festgestelt, dass der Aufruf von
    [highlight=epc]GoogleIP = resolve($www.google.com$);[/highlight]
    zeitnah zur eigentlichen Webabfrage passieren muss.
    Ich hab's dank der vielen Hinweise so gelöst:
    [highlight=epc]
    [EibPC]
    BT7=6
    BT8=7
    BT9=8
    BT10=9
    BT11=10
    BT12=11
    BT13=12
    BT14=13

    [WebServer]
    button(BT7)[TEMPERATURE]$Temperatur$ button(BT8)[WEATHER]$Feuchte$ button(BT9)[TEMPERATURE]$Temp. Max$
    button(BT10)[TEMPERATURE]$Temp. Min$ button(BT11)[WEATHER]$Aktuell$ button(BT12)[WEATHER]$Heute$ button(BT13)[WEATHER]$Wind$
    button(BT14)[INFO]$Stadt$

    // Google Weather: Es kommen 2 TCP Pakete an.
    Port=0u16
    IP=0u32
    GooglePort=80u16
    GoogleIP=0u32
    xmlText=$$
    xmlText_Data1=$$
    xmlText_Data2=$$
    xmlCount=0
    PosStart=0u16
    PosEnd=0u16
    Google_Stadt=$$
    Google_Temperatur=0.0
    Google_Luftfeuchte=0.0
    Google_VorhersageMax=0.0
    Google_VorhersageMin=0.0
    Google_Wolken=$$
    Google_VorhersageWolken=$$
    Google_Wind=$$

    // TCP Verbindung aufmachen
    if mtime(02,00) or mtime(17,00) or mtime(32,00) or mtime(47,00) then {
    GoogleIP = resolve($www.google.com$);
    connecttcp(GooglePort,GoogleIP)
    }endif

    // TCP Anfrage schicken
    if mtime(02,03) or mtime(17,03) or mtime(32,03) or mtime(47,03) then {
    sendtcp(GooglePort,GoogleIP,$GET /ig/api?weather=Zurich+Switzerland&hl=de HTTP/1.1$,0x0D,0x0A,0x0D,0x0A)
    }endif

    // Es kommen 2 Pakete an
    if event(readtcp(Port,IP,xmlText)) and IP == GoogleIP then {
    if (xmlCount==0) then xmlText_Data1=xmlText endif;
    if (xmlCount==1) then xmlText_Data2=xmlText endif;
    xmlCount=xmlCount+1
    }endif

    // TCP Verbindung wieder ordentlich schließen
    if mtime(02,08) or mtime(17,08) or mtime(32,08) or mtime(47,08) then {
    closetcp(Port,IP)
    } endif

    // Und nun parsen der XML Daten
    if xmlCount==2 then {
    /* Die eigentlichen Daten passen in einen einizigen String, daher Ausschneiden des Headers */;
    PosStart=find(xmlText_Data1,$<forecast_information >$,0u16)+size($<forecast_information>$);
    xmlText=split(xmlText_Data1,PosStart,END)+xmlText_ Data2;

    /* Parsen nach Stadt*/;
    PosStart=find(xmlText,$<city data="$,0u16)+size($<city data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"/>$,0u16)+PosStart-1u16;
    Google_Stadt=split(xmlText,PosStart,PosEnd);

    /* Parsen nach Temperatur */;
    PosStart=find(xmlText,$<temp_c data="$,0u16)+size($<temp_c data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"$,0u16)+ PosStart;
    Google_Temperatur=convert(split(xmlText,PosStart,P osEnd),0.0);

    /* Parsen nach Luftfeuchte */;
    PosStart=find(xmlText,$<humidity data="Feuchtigkeit:$,0u16)+size($<humidity data="Feuchtigkeit:$);
    PosEnd=find(split(xmlText,PosStart,END),$%$,0u16)+ PosStart;
    Google_Luftfeuchte=convert(split(xmlText,PosStart, PosEnd),0.0);

    /* Parsen nach Vorhersage Min*/;
    PosStart=find(xmlText,$<low data="$,0u16)+size($<low data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"$,0u16)+ PosStart;
    Google_VorhersageMin=convert(split(xmlText,PosStar t,PosEnd),0.0);

    /* Parsen nach Vorhersage Max*/;
    PosStart=find(xmlText,$<high data="$,0u16)+size($<high data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"$,0u16)+ PosStart;
    Google_VorhersageMax=convert(split(xmlText,PosStar t,PosEnd),0.0);

    /* Parsen nach Wolken*/;
    PosStart=find(xmlText,$<condition data="$,0u16)+size($<condition data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"/>$,0u16)+PosStart-1u16;
    Google_Wolken=split(xmlText,PosStart,PosEnd);

    /* Parsen nach Wolkenvorhersage für 1. Tag*/;
    PosStart=find(xmlText,$<condition data="$,1u16)+size($<condition data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"/>$,0u16)+PosStart-1u16;
    Google_VorhersageWolken=split(xmlText,PosStart,Pos End);

    /* Parsen nach Wind*/;
    PosStart=find(xmlText,$<wind_condition data="$,0u16)+size($<wind_condition data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"/>$,0u16)+PosStart-1u16;
    Google_Wind=split(xmlText,PosStart,PosEnd);

    xmlCount=0;
    webdisplay(BT7,Google_Temperatur,TEMPERATURE,DISPL AY,GREEN);
    webdisplay(BT8,Google_Luftfeuchte,WEATHER,DISPLAY, GREEN);
    webdisplay(BT9,Google_VorhersageMax,TEMPERATURE,DI SPLAY,GREEN);
    webdisplay(BT10,Google_VorhersageMin,TEMPERATURE,D ISPLAY,GREEN);
    webdisplay(BT11,Google_Wolken,WEATHER,DISPLAY,GREE N);
    webdisplay(BT12,Google_VorhersageWolken,WEATHER,DI SPLAY,GREEN);
    webdisplay(BT13,Google_Wind,WEATHER,DISPLAY,GREEN) ;
    webdisplay(BT14,Google_Stadt,WEATHER,DISPLAY,GREEN )
    } endif


    [/highlight]

    Einen Kommentar schreiben:


  • martenss
    antwortet
    My implementation is attached here.

    Changes compared to the German version from pio:
    - hourly iso daily update
    - addition of tomorrow's forecast
    - recover after single xml message arrival (during busy hours Google seems to respond the second message with another IP@)
    - multi-language support (in Google itf)
    - updateCounter to keep track of last successful update

    Could probably be added to the English library, after being "polished" by Enertex.
    Angehängte Dateien

    Einen Kommentar schreiben:


  • Bodo
    antwortet
    Zitat von michel38 Beitrag anzeigen
    Als Antwort bekomme ich für den zweiten Tag die gleichen Werte wie vom ersten Tag Wo ist mein Fehler,
    Hoi

    Ich hab' zwar das mit dem Zähler selbst herausgefunden, aber wie man den Debugger startet, das entzieht sich bis jetzt hartnäckig meiner Kenntniss.

    Edit: Ahhhh, jetzt, soooo einfach .... F5 bzw. EibPC -> Variablen vorgeben und abfragen

    Einen Kommentar schreiben:


  • michel38
    antwortet
    Danke.

    Jetzt hab auch ich es verstanden. Wenn ich mir das Beispiel etwas genauer angesehen hätte auch früher.

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    Zitat von michel38 Beitrag anzeigen
    Can you put your Ergebniss on-line?
    Ich dachte das wird damit klar, weil man ja auch den String zum ersten und dann zum zweiten Male sucht:
    [highlight=epc]
    /* Parsen nach Wolken*/;
    PosStart=find(xmlText,$<condition data="$,0u16)+size($<condition data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"/>$,0u16)+PosStart-1u16;
    Wolken=split(xmlText,PosStart,PosEnd);

    /* Parsen nach Wolkenvorhersage für 1. Tag*/;
    PosStart=find(xmlText,$<condition data="$,1u16)+size($<condition data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"/>$,0u16)+PosStart-1u16;
    VorhersageWolken=split(xmlText,PosStart,PosEnd);[/highlight]

    find() sucht nach einem Teilstring in einem String, über das 3.Argument kann man nun (x+1)-te Auftauchen des gleichen Teilstrings suchen lassen:
    Man vergleiche das HTML file (http://www.google.com/ig/api?weather...+Germany&hl=de)
    Dort tauchen immer wieder die gleichen Strings im File (=String in dem wir suchen) auf, jediglich für den 1.Tag an erster Stelle, für den 2. an zweiter Stelle etc.

    find(xmlText,$<condition data="$,0u16)
    sucht also in String xmlText das erste Auftauchen (von Anfang an gerechnet) des Strings <condition data="

    find(xmlText,$<condition data="$,1u16)
    Sucht das 2.-te Auftauchen usw. Gleiches gilt dann für die Temperaturen etc.

    Einen Kommentar schreiben:

Lädt...
X