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 pio Beitrag anzeigen
    Aufruf:
    GoogleWeather($12345$c1400, Irgendeinortsname, $Germany$c1400)
    Man beachte, dass der erste und der letzte Parameter als String c1400 definiert sind, der Ort aber nicht.
    Da besteht m.E. noch Verbesserungspotenzial: Die PLZ würde ich als Nummer vorgeben und im Makro wandeln. Da tut sich der Anwender leichter. Gleichermaßen das Land. Den Ort braucht man ja nicht- Wie ich eben sehe, ist das mit dem PLZ auch per Ortsvorgabe möglich, also
    GoogleWeather(Forchheim,Germany)
    fände ich am besten.

    Einen Kommentar schreiben:


  • pio
    antwortet
    Aufruf:
    GoogleWeather($12345$c1400, Irgendeinortsname, $Germany$c1400)

    Man beachte, dass der erste und der letzte Parameter als String c1400 definiert sind, der Ort aber nicht.

    Die Daten befinden sich anschliessend in den "globalen" Variablen:
    Temperatur=0.0
    Luftfeuchte=0.0
    VorhersageMax=0.0
    VorhersageMin=0.0
    Wolken=$$
    VorhersageWolken=$$


    Das Makro ist NOCH NICHT GETESTET, da bei mir sonst alle Rolläden hochgehen würden -> WAF = minus unendlich

    Code:
    :begin GoogleWeather (PLZ, Ort, Land)
    :info $Google Weather Infos in Strings$\\
          $Postleitzahl$\\
          $Ort$\\
          $Land$\\
    :shortinfo $Google Weather Infos in Strings$ 
    
          Ort^WetterTrigger=AUS
    
          // Google Weather: Es kommen 2 TCP Pakete an.
          Ort^xmlText=$$
          Ort^xmlText_Data1=$$
          Ort^xmlText_Data2=$$
          Ort^xmlCount=0
    
          Ort^Port=0u16
          Ort^IP=0u32
          Ort^GooglePort = 80u16
          Ort^GoogleIP = resolve($www.google.com$)
    
          // TCP Verbindung aufmachen
          if htime(00, 00, 00) or systemstart() then Ort^WetterTrigger=EIN endif
          if (after(Ort^WetterTrigger,10000u64) == EIN) then {
              connecttcp(Ort^GooglePort,Ort^GoogleIP)
          }endif
    
          // TCP Anfrage schicken
          if (after(Ort^WetterTrigger,11000u64) == EIN) then {
              sendtcp(Ort^GooglePort,Ort^GoogleIP,$GET /ig/api?weather=$+PLZ+Land+$&hl=de HTTP/1.1$,0x0D,0x0A,0x0D,0x0A)
          }endif
    
    
          // Es kommen 2 Pakete an
          if event(readtcp(Ort^Port,Ort^IP,Ort^xmlText)) and Ort^IP == Ort^GoogleIP then {
             if (Ort^xmlCount==0) then Ort^xmlText_Data1=Ort^xmlText endif;
             if (Ort^xmlCount==1) then Ort^xmlText_Data2=Ort^xmlText endif;
             Ort^xmlCount=Ort^xmlCount+1
          }endif
    
          // TCP Verbindung wieder ordentlich schließen
    
          if after(Ort^WetterTrigger,20000u64) then {
             closetcp(Ort^Port,Ort^IP);
             Ort^WetterTrigger=AUS
          } endif
    
          // Parsen der xml Daten
    
          Temperatur=0.0
          Luftfeuchte=0.0
          VorhersageMax=0.0
          VorhersageMin=0.0
          Wolken=$$
          VorhersageWolken=$$
    
          Ort^PosStart=0u16
          Ort^PosEnd=0u16
    
          // Und nun parsen
          if Ort^xmlCount==2 then {
              /* Die eigentlichen Daten passen in einen einizigen String, daher Ausschneiden des Headers */;
              Ort^PosStart=find(Ort^xmlText_Data1,$<forecast_information>$,0u16)+size($<forecast_information>$);
              Ort^xmlText=split(Ort^xmlText_Data1,Ort^PosStart,END)+Ort^xmlText_Data2;
    
              /* Parsen nach Temperatur */;
              Ort^PosStart=find(Ort^xmlText,$<temp_c data="$,0u16)+size($<temp_c data="$);
              Ort^PosEnd=find(split(Ort^xmlText,Ort^PosStart,END),$"$,0u16)+Ort^PosStart;
              Temperatur=convert(split(Ort^xmlText,Ort^PosStart,Ort^PosEnd),0.0);
    
              /* Parsen nach Luftfeuchte */;
              Ort^PosStart=find(Ort^xmlText,$<humidity data="Feuchtigkeit:$,0u16)+size($<humidity data="Feuchtigkeit:$);
              Ort^PosEnd=find(split(Ort^xmlText,Ort^PosStart,END),$%$,0u16)+Ort^PosStart;
              Luftfeuchte=convert(split(Ort^xmlText,Ort^PosStart,Ort^PosEnd),0.0);
    
              /* Parsen nach Vorhersage Min*/;
              Ort^PosStart=find(Ort^xmlText,$<low data="$,0u16)+size($<low data="$);
              Ort^PosEnd=find(split(Ort^xmlText,Ort^PosStart,END),$"$,0u16)+Ort^PosStart;
              VorhersageMin=convert(split(Ort^xmlText,Ort^PosStart,Ort^PosEnd),0.0);
    
              /* Parsen nach Vorhersage Max*/;
              Ort^PosStart=find(Ort^xmlText,$<high data="$,0u16)+size($<high data="$);
              Ort^PosEnd=find(split(Ort^xmlText,Ort^PosStart,END),$"$,0u16)+Ort^PosStart;
              VorhersageMax=convert(split(Ort^xmlText,Ort^PosStart,Ort^PosEnd),0.0);
    
              /* Parsen nach Wolken*/;
              Ort^PosStart=find(Ort^xmlText,$<condition data="$,0u16)+size($<condition data="$);
              Ort^PosEnd=find(split(Ort^xmlText,Ort^PosStart,END),$"/>$,0u16)+Ort^PosStart-1u16;
              Wolken=split(Ort^xmlText,Ort^PosStart,Ort^PosEnd);
    
              /* Parsen nach Wolkenvorhersage für 1. Tag*/;
              Ort^PosStart=find(Ort^xmlText,$<condition data="$,1u16)+size($<condition data="$);
              Ort^PosEnd=find(split(Ort^xmlText,Ort^PosStart,END),$"/>$,0u16)+Ort^PosStart-1u16;
              VorhersageWolken=split(Ort^xmlText,Ort^PosStart,Ort^PosEnd);
              Ort^xmlCount=0
          } endif 
    
    :end

    Einen Kommentar schreiben:


  • Bodo
    antwortet
    Hoi

    Genau mit Hex und Co und wie was wo warum welches Format ist oder sein muss, da hapert's bei mir und es dämmert nur schwach.
    Na ja, das lern' ich auch noch... irgendwann... vielleicht...

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    Zitat von Bodo Beitrag anzeigen
    Hoi

    Klar hab' ich Vertrauen in Dein Coding, nur hab' ich mich schon wieder so angestellt, dass überhaupt nix geklappt hat.
    Als ich mir als Zwischenergebnis die IP von Google mal ausgegeben hab' als $$ da kam dann 3512043363 dabei raus und so Sachen...
    Naja, resolve() liefert eine 32 Bit Zahl, die den 4 Bytes der IP Adresse liefert...

    Einen Kommentar schreiben:


  • Bodo
    antwortet
    Hoi

    Klar hab' ich Vertrauen in Dein Coding, nur hab' ich mich schon wieder so angestellt, dass überhaupt nix geklappt hat.
    Als ich mir als Zwischenergebnis die IP von Google mal ausgegeben hab' als $$ da kam dann 3512043363 dabei raus und so Sachen...

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    Ich glaub' es nicht. Es funzt. Ich bin völlig platt.
    Hast Du kein Vertrauen in mein Coding? [/QUOTE]
    Speziell das mit dem aktualisieren. Hab' schon wieder alles verlernt, scheinbar.
    Wie meinst Du das?
    Ich dachte da anstelle der GA an einen Aufruf von htime
    *Edit: Ha klar, andere PLZ, mei bin ich bl***
    Naja, das hab ich mir erlaubt ...

    Einen Kommentar schreiben:


  • Bodo
    antwortet
    Hoi Michael

    Ich glaub' es nicht. Es funzt. Ich bin völlig platt.
    Hab' zwar bei der Temperatur 11.00 statt 12 aber das ist Nebensache.*
    Macro würde ich ja gerne machen, aber momentan trau ich mir das nicht zu.
    Speziell das mit dem aktualisieren. Hab' schon wieder alles verlernt, scheinbar.

    *Edit: Ha klar, andere PLZ, mei bin ich bl***

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    Süßes oder Saures...

    [highlight=epc]
    [EibPC]
    // Google Weather: Es kommen 2 TCP Pakete an.
    xmlText=$$
    xmlText_Data1=$$
    xmlText_Data2=$$
    xmlCount=0

    Port=0u16
    IP=0u32
    GooglePort = 80u16
    GoogleIP = resolve($www.google.com$)
    // TCP Verbindung aufmachen
    if ('0/0/80'b01 == EIN) then {
    connecttcp(GooglePort,GoogleIP)
    }endif
    // TCP Anfrage schicken
    if (after('0/0/80'b01,1000u64) == EIN) then {
    sendtcp(GooglePort,GoogleIP,$GET /ig/api?weather=91301+Germany&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 after('0/0/80'b01,10000u64) then {
    closetcp(Port,IP)
    } endif


    // Parsen der xml Daten
    Temperatur=0.0
    Luftfeuchte=0.0
    VorhersageMax=0.0
    VorhersageMin=0.0
    Wolken=$$
    VorhersageWolken=$$
    PosStart=0u16
    PosEnd=0u16
    // Und nun parsen
    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 Temperatur */;
    PosStart=find(xmlText,$<temp_c data="$,0u16)+size($<temp_c data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"$,0u16)+ PosStart;
    Temperatur=convert(split(xmlText,PosStart,PosEnd), 0.0);
    /* Parsen nach Luftfeuchte */;
    PosStart=find(xmlText,$<humidity data="Feuchtigkeit:$,0u16)+size($<humidity data="Feuchtigkeit:$);
    PosEnd=find(split(xmlText,PosStart,END),$%$,0u16)+ PosStart;
    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;
    VorhersageMin=convert(split(xmlText,PosStart,PosEn d),0.0);
    /* Parsen nach Vorhersage Max*/;
    PosStart=find(xmlText,$<high data="$,0u16)+size($<high data="$);
    PosEnd=find(split(xmlText,PosStart,END),$"$,0u16)+ PosStart;
    VorhersageMax=convert(split(xmlText,PosStart,PosEn d),0.0);
    /* 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);
    xmlCount=0
    } endif
    [/highlight]
    So nun geht das, wenn man die GA auf 1 toggelt.

    Ich hoffe, es findet sich nun jemand, der das in ein Makro pakt und hier postet. Dann würde ich es auch in die Makrosammlung mit aufnehmen.

    Als Makro stelle ich mir vor:
    Wetter(PLZ)
    wobei dieses Makro jeden Tag mit einem Timer aktualisiert wird. Mal gespannt, wer das macht...

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    Zitat von MarkusL Beitrag anzeigen
    Sollte nicht entsprechend dem Tip von Michael in Post #9 die Zeile 12 unter 15 verschoben werden?
    Ja, ich mach das eben mal und poste es gleich - es sei denn es klingeln noch 20x irgendwelche Kinder mit Süßes oder Saures...

    Einen Kommentar schreiben:


  • MarkusL
    antwortet
    Sollte nicht entsprechend dem Tip von Michael in Post #9 die Zeile 12 unter 15 verschoben werden?

    Einen Kommentar schreiben:


  • Bodo
    antwortet
    Hoi

    Danke, ich bin echt blind...

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    [highlight=epc]
    // Google Weather
    xmlText=$$
    Port=0u16
    IP=0u32
    GooglePort = 80u16
    GoogleIP = resolve($www.google.com$)
    if ("Google-0/0/80" == EIN) then {
    connecttcp(GooglePort,GoogleIP)
    }endif
    if (after("Google-0/0/80",1000u64) == EIN) then {
    sendtcp(GooglePort,GoogleIP,$GET /ig/api?weather=89520+Germany&hl=de HTTP/1.1$,0x0Du08,0x0Au08,0x0Du08,0x0Au08);
    closetcp(GooglePort,GoogleIP)
    }endif
    if event(readtcp(Port,IP,xmlText)) and IP == GoogleIP then {
    sendmail($xxxxx@xxxxx.ch$,betreff,xmlText)
    }endif
    [/highlight]
    Eine Klammer war nicht geschlossen bei event - ok. ok, die Fehlermeldung könnte besser sein, ich weiss schon.

    Einen Kommentar schreiben:


  • Bodo
    antwortet
    Hoi

    Ich hab' das readtcp auch mit GoogleIP versucht.
    [highlight=epc]
    // Google Weather
    xmlText=$$
    Port=0u16
    IP=0u32
    GooglePort = 80u16
    GoogleIP = resolve($www.google.com$)
    if ("Google-0/0/80" == EIN) then {
    connecttcp(GooglePort,GoogleIP)
    }endif
    if (after("Google-0/0/80",1000u64) == EIN) then {
    sendtcp(GooglePort,GoogleIP,$GET /ig/api?weather=89520+Germany&hl=de HTTP/1.1$,0x0Du08,0x0Au08,0x0Du08,0x0Au08);
    closetcp(GooglePort,GoogleIP)
    }endif
    if (event(readtcp(Port,IP,xmlText)) and IP == GoogleIP then {
    sendmail($xxxxx@xxxxx.ch$,betreff,xmlText)
    }endif
    [/highlight]

    gibt einen Fehler:
    Code:
    Datei: "./tmpMacroOut.txt" wurde geschriebenSyntaxfehler in Zeile:[167] 
     >if (event(readtcp(Port,IP,xmlText)) and  IP == GoogleIP then {  sendmail($xxxxx@xxxxx.ch$,betreff,xmlText)}endif<
     Gültig bis Spaltenposition: {0} 
     STOP Parser --> if (event(readtcp(Port,IP,xmlText)) and  IP == GoogleIP then {  sendmail($xxxxx@xxxxx.ch$,betreff,xmlText)}endif

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    Zitat von Bodo Beitrag anzeigen
    [highlight=epc]
    if (after("Google-0/0/70",1000u64) == EIN) then {
    sendtcp(GooglePort,GoogleIP,$GET /ig/api?weather=89520+Germany&hl=de HTTP/1.1$,0x0Du08,0x0Au08,0x0Du08,0x0Au08);
    closetcp(GooglePort,GoogleIP)
    }endif
    [/highlight]
    Sehe ich gerade: closetcp erst in der if(event(readtcp(- Funktion aufrufen, sonst bekommst Du die Anwort nimmer mit.

    Einen Kommentar schreiben:


  • enertegus
    antwortet
    Zitat von Bodo Beitrag anzeigen
    Hoi
    Kann ich eine URL auch so eingeben: "http://www.google.com"
    Du kannst so arbeiten:
    [highlight=epc]
    // Google Weather
    GooglePort = 80u16
    GoogleIP = resolve($www.google.com$)
    [/highlight]
    Und wie packe ich das Ergebnis (also das xml) in eine Variable?
    Ich habe eben mal gesnifft, die Antwort ist weniger als 1400 Bytes und passt daher komplett in einen c1400 String. Das macht eine komplexere Verarbeitung in einer Nachrichtenwarteschlange unnötig:
    [highlight=epc]
    xmlText=$$
    Port=0u16
    IP=0u32
    // readtcp überschreibt beim Eintreffen einer Nachricht seine Argumente
    if (event( readtcp(Port,IP,xmlText)) and IP== GoogleIP then {
    /// Jetzt trägt xmlText die gesamten ASCII string
    /// xmlString muss nun mit find() und split() geparst werden
    }endif
    [/highlight]

    Einen Kommentar schreiben:

Lädt...
X