das Vergnügen hatte ich auch mit Template.
Bei mir hats die SD Karte wieder mal zerschossen - Gott sei Dank hatte ich eine Sicherung die 2Tage alt war.
free(cWetterHeute);
free(cWetterMorgen);
free(cWetterUeberm);
if(LOGGING == 1){
printf("Wunderground-API: Wetter Heute: %s",cWetterHeute);
printf("Wunderground-API: Wetter Morgen: %s",cWetterMorgen);
printf("Wunderground-API: Wetter Übermorgen: %s",cWetterUeberm);
}
/*
Um einen API Key zu erhalten muss man sich auf http://www.wunderground.com/weather/api/ registrieren.
Als Station gibt man am einfachsten den Namen des Wohnortes an,
dann wählt Wunderground die passende Wetterstation für einen aus.
Man kann aber auch eine bestimmte Station angeben.
Eine Karte der Wetterstationen gibt es hier: http://www.wunderground.com/wundermap/
Private Wetterstationen haben einen Namen als ID und müssen nach folgende Schema angegeben werden: "pws:NAME123".
Die offiziellen Stationen haben eine nummerische ID und werden folgendermaßen angegeben: "zmw:00000.0.00000"
*/
#define API_KEY "" // <-- Hier den API-Key eintragen. // Put your API-Key here.
#define STATION "" // <-- Hier ID der Wetterstation eintragen. // Put your Station ID here.
#define LANG "DL" // <-- Sprache // Language (http://www.wunderground.com/weather/api/d/docs?d=language-support&MR=1)
#define SERVER "api.wunderground.com"
#define UDP_ZEIT 75
#define ZYKLUS 1000 // Programm-Zyklus in Millisekunden.
#define LOGGING 1
#define ANZ_WERTE_A 33
char *a[ANZ_WERTE_A] = {
"observation_time",
"magic",
"wmo",
"latitude",
"longitude",
"elevation",
"weather",
"temp_c",
"relative_humidity",
"wind_degrees",
"wind_dir",
"wind_mph",
"wind_gust_mph",
"wind_kph",
"wind_gust_kph",
"pressure_mb",
"pressure_in",
"pressure_trend",
"dewpoint_f",
"dewpoint_c",
"heat_index_f",
"heat_index_c",
"windchill_f",
"windchill_c",
"feelslike_f",
"feelslike_c",
"visibility_mi",
"visibility_km",
"solarradiation",
"precip_1hr_in",
"precip_1hr_metric",
"precip_today_in",
"precip_today_metric",
};
// Globale Variabeln erzeugen.
char cAPIa[100];
char cAPIv[100];
int nEvents;
float fEingangEins;
float fEingangZwei;
// API-Aufrufe erzeugen.
strcat(cAPIa,"/api/");
strcat(cAPIa,API_KEY);
strcat(cAPIa,"/conditions/lang:");
strcat(cAPIa,LANG);
strcat(cAPIa,"/q/");
strcat(cAPIa,STATION);
strcat(cAPIa,".xml");
strcat(cAPIv,"/api/");
strcat(cAPIv,API_KEY);
strcat(cAPIv,"/forecast/lang:");
strcat(cAPIv,LANG);
strcat(cAPIv,"/q/");
strcat(cAPIv,STATION);
strcat(cAPIv,".xml");
while(1){
sleep(ZYKLUS); // Warten bis zum nächsten Interval.
setoutput(1,0); // Ausgang der Uhr auf 0 stellen.
nEvents = getinputevent(); //Eingänge auslesen.
if (nEvents & 0x18){ // Bitmaske für die Eingang.
fEingangEins = getinput(0); // Eingänge auf Veränderung prüfen, und ggf. Variabeln aktualisieren.
fEingangZwei = getinput(1);
}
// Prüfen ob die Daten aktualisiert werden sollen.
// Aktuelles Wetter - Anfang.
if (fEingangEins != 0){
fEingangEins = 0; // 0 setzten, damit der Abruf pro Flanke nur einmal erfolgt.
char *cDatenA = httpget(SERVER,cAPIa); // Daten abrufen.
if ((cDatenA != NULL) && (cDatenA != 0)){ //Prüfen ob die Daten Vorhanden sind.
setoutput(1,1); // Impuls an Uhr
// Windrichtung Ausgeben.
char *cWindRichtungXML;
if((cWindRichtungXML =getxmlvalue(cDatenA,0,"wind_degrees")) != NULL){
setoutput(0,batof(cWindRichtungXML));
}
free(cWindRichtungXML);
// Drucktendenz ermitteln.
char* cDruckTendenzXML;
if((cDruckTendenzXML = getxmlvalue(cDatenA,0,"pressure_trend")) != NULL){
if(strcmp(cDruckTendenzXML,"+") == 0){ setoutput(2,1); } //steigender Druck.
else{
if(strcmp(cDruckTendenzXML,"-") == 0){ setoutput(2,-1); } // fallender Druck
else{ setoutput(2,0); } // gleichbleibender Druck.
}
}
free(cDruckTendenzXML);
// Edit: MightyLox
char* cXML;
// --- Druck
if((cXML =getxmlvalue(cDatenA,0,"pressure_mb")) != NULL){
setoutput(3,batof(cXML));
}
free(cXML);
// --- Regen heute
if((cXML =getxmlvalue(cDatenA,0,"precip_today_metric")) != NULL){
setoutput(4,batof(cXML));
}
free(cXML);
// --- Windböen
if((cXML =getxmlvalue(cDatenA,0,"wind_gust_kph")) != NULL){
setoutput(5,batof(cXML));
}
free(cXML);
// --- gefühlte Temperaturen
if((cXML =getxmlvalue(cDatenA,0,"feelslike_c")) != NULL){
setoutput(6,batof(cXML));
}
free(cXML);
// --- Taupunkt
if((cXML =getxmlvalue(cDatenA,0,"dewpoint_c")) != NULL){
setoutput(7,batof(cXML));
}
free(cXML);
// --- aktuelles Wetter: hier fehlen noch einige Werte
if((cXML =getxmlvalue(cDatenA,0,"weather")) != NULL){
if(strcmp(cXML,"Heiter") == 0) setoutput(8,1);
else
if(strcmp(cXML,"Regen") == 0) setoutput(8,2);
else
if(strcmp(cXML,"Nebel") == 0) setoutput(8,3);
else
setoutput(8,0);
}
free(cXML);
// --- Wind
if((cXML =getxmlvalue(cDatenA,0,"wind_kph")) != NULL){
setoutput(9,batof(cXML));
}
free(cXML);
// --- Luftfeuchtigkeit
if((cXML =getxmlvalue(cDatenA,0,"relative_humidity")) != NULL){
setoutput(10,batof(cXML));
}
free(cXML);
// --- aktuelle Temperatur
if((cXML =getxmlvalue(cDatenA,0,"temp_c")) != NULL){
setoutput(11,batof(cXML));
}
free(cXML);
// End: MightyLox
// UDP Stream erzeugen.
STREAM* sUDPStreamA = stream_create("/dev/udp/127.0.0.1/2611",0,0);
if (sUDPStreamA != NULL){
char cTmpA[255]; // Tmp. für den Text.
int i = 0;
memset(cTmpA, 0, 2); // Variable leeren.
while(i < ANZ_WERTE_A){
sleep(UDP_ZEIT);
// String erzeugen
char* cXMLString;
if((cXMLString = getxmlvalue(cDatenA,0,a[i])) != NULL){ // Wenn der Wert existiert.
strcat(cTmpA,a[i]);
strcat(cTmpA,":");
strcat(cTmpA,cXMLString);
strcat(cTmpA,"\0"); // Nullterminierung zum Ende des Strings.
stream_write(sUDPStreamA,cTmpA, strlen(cTmpA)); // Vorbereiten
stream_flush(sUDPStreamA); //Absenden
if(LOGGING == 1){
printf("Wunderground-API: %s",cTmpA); // Logausgabe
//setlogtext(cTmpA);
}
}
free(cXMLString);
memset(cTmpA, 0, 255); // Variable leeren.
i++;
}
memset(cTmpA, 0, 255); // Variable leeren.
}
stream_close(sUDPStreamA);
}
char *cObservationtimeXML;
if((cObservationtimeXML = getxmlvalue(cDatenA,0,"observation_time")) != NULL){
printf("Wunderground-API: %s", cObservationtimeXML);
}
free(cObservationtimeXML);
free(cDatenA);
//Aktuelles Wetter - Ende.
}
//Vorherhsage - Anfang.
if (fEingangZwei != 0){
fEingangZwei = 0; // 0 setzten, damit der Abruf pro Flanke nur einmal erfolgt.
char *cDatenV = httpget(SERVER,cAPIv); // Daten abrufen.
if ((cDatenV != NULL) && (cDatenV != 0)){ //Prüfen ob die Daten Vorhanden sind.
char cTmpB[255]; // Tmp. f�r den Text.
memset(cTmpB, 0, 2); // Variable leeren.
// Text erzeugen
char *cWetter1 = strstrskip(getxmlvalue(cDatenV,0,"fcttext_metric"),"[CDATA[");
char *cWetter2 = strstrskip(getxmlvalue(cDatenV,1,"fcttext_metric"),"[CDATA["); // Daten vor dem Text abschneiden
char *cWetter3 = strstrskip(getxmlvalue(cDatenV,2,"fcttext_metric"),"[CDATA[");
char *cWetter1Title = getxmlvalue(cDatenV,0,"title");
char *cWetter2Title = getxmlvalue(cDatenV,1,"title"); // Daten vor dem Text abschneiden
char *cWetter3Title = getxmlvalue(cDatenV,2,"title");
cWetter1[strlen(cWetter1)-3] = '\0'; // Nullterminierung im String setzten damit die nachfolgenden Zeichne ignoriert werden.
cWetter2[strlen(cWetter2)-3] = '\0';
cWetter3[strlen(cWetter3)-3] = '\0';
strcat(cTmpB, cWetter1Title);
strcat(cTmpB, ": ");
strcat(cTmpB, cWetter1);
setoutputtext(0,cTmpB);
memset(cTmpB, 0, 2); // Variable leeren.
strcat(cTmpB, cWetter2Title);
strcat(cTmpB, ": ");
strcat(cTmpB, cWetter2);
setoutputtext(1,cTmpB);
memset(cTmpB, 0, 2); // Variable leeren.
strcat(cTmpB, cWetter3Title);
strcat(cTmpB, ": ");
strcat(cTmpB, cWetter3);
setoutputtext(2,cTmpB);
memset(cTmpB, 0, 2); // Variable leeren.
if(LOGGING == 1){
printf("Wunderground-API: Wetter %s: %s",cWetter1Title,cWetter1);
printf("Wunderground-API: Wetter %s: %s",cWetter2Title,cWetter2);
printf("Wunderground-API: Wetter %s: %s",cWetter3Title,cWetter3);
}
free(cWetter1);
free(cWetter2);
free(cWetter3);
free(cWetter1Title);
free(cWetter2Title);
free(cWetter3Title);
memset(cTmpB, 0, 255); // Variable leeren.
}
free(cDatenV);
}
//Vorherhsage - Ende.
}
}
"weather":"Leichter Schneefall",
Wir verarbeiten personenbezogene Daten über Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen, Werbung zu personalisieren und Websiteaktivitäten zu analysieren. Wir können bestimmte Informationen über unsere Nutzer mit unseren Werbe- und Analysepartnern teilen. Weitere Einzelheiten finden Sie in unserer Datenschutzrichtlinie.
Wenn Sie unten auf "Einverstanden" klicken, stimmen Sie unserer Datenschutzrichtlinie und unseren Datenverarbeitungs- und Cookie-Praktiken wie dort beschrieben zu. Sie erkennen außerdem an, dass dieses Forum möglicherweise außerhalb Ihres Landes gehostet wird und Sie der Erhebung, Speicherung und Verarbeitung Ihrer Daten in dem Land, in dem dieses Forum gehostet wird, zustimmen.
Kommentar