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