Reading, Berkshire
Offline
Full Member
Karma: 2
Posts: 132
|
 |
« on: September 12, 2012, 08:57:32 am » |
Hello, I'm trying to get the time for london using the workweatheronline API info: http://www.worldweatheronline.com/time-zone-api.aspxI have adapted the twitterclient sketch in the Ethernet library in order to access this informaton. I have removed my MAC and API Key from this sketch below. In the Serial Monitor it doesn't get past making HTTP request...
This leads me to believe there is something wrong with my "void connectToServer()" section. This is my first time trying to GET information from an XML. Some guidance would be appreciated. Thank you The XML time that I need is between <localtime>2012-09-12 14:24</localtime> So I have set the sketch to read the time after <localtime> and to stop at '<' #include <SPI.h> #include <Ethernet.h>
// Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { *** MY MAC CODE GOES IN HERE**** }; IPAddress ip(*** MY IP GOES IN HERE******);
// initialize the library instance: EthernetClient client;
const unsigned long requestInterval = 60000; // delay between requests
char serverName[] = "http://www.worldweatheronline.com/feed/tz.ashx"; // time URL
boolean requested; // whether you've made a request since connecting unsigned long lastAttemptTime = 0; // last time you connected to the server, in milliseconds
String currentLine = ""; // string to hold the text from server String time = ""; // string to hold the time boolean readingTime = false; // if you're currently reading the time
void setup() { // reserve space for the strings: currentLine.reserve(256); time.reserve(150);
// Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only }
// attempt a DHCP connection: Serial.println("Attempting to get an IP address using DHCP:"); if (!Ethernet.begin(mac)) { // if DHCP fails, start with a hard-coded address: Serial.println("failed to get an IP address using DHCP, trying manually"); Ethernet.begin(mac, ip); } Serial.print("My address:"); Serial.println(Ethernet.localIP()); // connect to Time Server: connectToServer(); }
void loop() { if (client.connected()) { if (client.available()) { // read incoming bytes: char inChar = client.read();
// add incoming byte to end of line: currentLine += inChar;
// if you get a newline, clear the line: if (inChar == '\n') { currentLine = ""; } // if the current line ends with <localtime>, it will // be followed by the time: if ( currentLine.endsWith("<localtime>")) { // time is beginning. Clear the time string: readingTime= true; time = ""; } // if you're currently reading the bytes of the time, // add them to the time String: if (readingTime) { if (inChar != '<') { time += inChar; } else { // if you got a "<" character, // you've reached the end of the time: readingTime = false; Serial.println(time); // close the connection to the server: client.stop(); } } } } else if (millis() - lastAttemptTime > requestInterval) { // if you're not connected, and two minutes have passed since // your last connection, then attempt to connect again: connectToServer(); } }
void connectToServer() { // attempt to connect, and wait a millisecond: Serial.println("connecting to server..."); if (client.connect(serverName, 80)) { Serial.println("making HTTP request..."); // make HTTP GET request to server: client.println("GET key=******MY API KEY GOES IN HERE*********&q=london&format=xml"); client.println("HOST: http://www.worldweatheronline.com/feed/tz.ashx"); client.println(); } // note the time of this connect attempt: lastAttemptTime = millis(); }
|
|
|
|
|
Logged
|
|
|
|
|
Seattle, WA USA
Offline
Brattain Member
Karma: 311
Posts: 35470
Seattle, WA USA
|
 |
« Reply #1 on: September 12, 2012, 09:11:54 am » |
Looking at the example on the page you linked, they show: http://www.worldweatheronline.com/feed/tz.ashx?key=xxxxxxxxxxxxxxxxx&q=SW1&format=xmlas the value to dump in a browser window. The host, then, is www.worldweatheronline.com. The GET request, then, is "feed/tz.ashx?key=xxxxxxxxxxxxxxxxx&q=SW1&format=xml". That's what I'd try, anyway.
|
|
|
|
|
Logged
|
|
|
|
|
Reading, Berkshire
Offline
Full Member
Karma: 2
Posts: 132
|
 |
« Reply #2 on: September 12, 2012, 09:20:43 am » |
Hi PaulS
sadly that didn't work. I'm quite confused by this.
|
|
|
|
|
Logged
|
|
|
|
|
Seattle, WA USA
Offline
Brattain Member
Karma: 311
Posts: 35470
Seattle, WA USA
|
 |
« Reply #3 on: September 12, 2012, 09:22:25 am » |
sadly that didn't work. Sadly, no modified code to look at...
|
|
|
|
|
Logged
|
|
|
|
|
Reading, Berkshire
Offline
Full Member
Karma: 2
Posts: 132
|
 |
« Reply #4 on: September 12, 2012, 09:30:15 am » |
- http://www.worldweatheronline.com/time-zone-api.aspx#include <SPI.h> #include <Ethernet.h>
// Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { *** MY MAC CODE GOES IN HERE**** }; IPAddress ip(*** MY IP GOES IN HERE******);
// initialize the library instance: EthernetClient client;
const unsigned long requestInterval = 60000; // delay between requests
char serverName[] = "http://www.worldweatheronline.com/feed/tz.ashx"; // time URL
boolean requested; // whether you've made a request since connecting unsigned long lastAttemptTime = 0; // last time you connected to the server, in milliseconds
String currentLine = ""; // string to hold the text from server String time = ""; // string to hold the time boolean readingTime = false; // if you're currently reading the time
void setup() { // reserve space for the strings: currentLine.reserve(256); time.reserve(150);
// Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only }
// attempt a DHCP connection: Serial.println("Attempting to get an IP address using DHCP:"); if (!Ethernet.begin(mac)) { // if DHCP fails, start with a hard-coded address: Serial.println("failed to get an IP address using DHCP, trying manually"); Ethernet.begin(mac, ip); } Serial.print("My address:"); Serial.println(Ethernet.localIP()); // connect to Time Server: connectToServer(); }
void loop() { if (client.connected()) { if (client.available()) { // read incoming bytes: char inChar = client.read();
// add incoming byte to end of line: currentLine += inChar;
// if you get a newline, clear the line: if (inChar == '\n') { currentLine = ""; } // if the current line ends with <localtime>, it will // be followed by the time: if ( currentLine.endsWith("<localtime>")) { // time is beginning. Clear the time string: readingTime= true; time = ""; } // if you're currently reading the bytes of the time, // add them to the time String: if (readingTime) { if (inChar != '<') { time += inChar; } else { // if you got a "<" character, // you've reached the end of the time: readingTime = false; Serial.println(time); // close the connection to the server: client.stop(); } } } } else if (millis() - lastAttemptTime > requestInterval) { // if you're not connected, and two minutes have passed since // your last connection, then attempt to connect again: connectToServer(); } }
void connectToServer() { // attempt to connect, and wait a millisecond: Serial.println("connecting to server..."); if (client.connect(serverName, 80)) { Serial.println("making HTTP request..."); // make HTTP GET request to server: client.println("GET /feed/tz.ashx?key=(APIkey)&q=london&format=xml"); client.println("HOST: http://www.worldweatheronline.com"); client.println(); } // note the time of this connect attempt: lastAttemptTime = millis(); }
|
|
|
|
|
Logged
|
|
|
|
|
|
|
Seattle, WA USA
Offline
Brattain Member
Karma: 311
Posts: 35470
Seattle, WA USA
|
 |
« Reply #6 on: September 12, 2012, 09:41:59 am » |
client.println("HOST: http://www.worldweatheronline.com"); No host name has http:// in it...
|
|
|
|
|
Logged
|
|
|
|
|
Reading, Berkshire
Offline
Full Member
Karma: 2
Posts: 132
|
 |
« Reply #7 on: September 12, 2012, 10:20:58 am » |
Neither #include <SPI.h> #include <Ethernet.h>
// Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { *** MY MAC CODE GOES IN HERE**** }; IPAddress ip(*** MY IP GOES IN HERE******);
// initialize the library instance: EthernetClient client;
const unsigned long requestInterval = 60000; // delay between requests
char serverName[] = "www.worldweatheronline.com/feed/tz.ashx"; // time URL
boolean requested; // whether you've made a request since connecting unsigned long lastAttemptTime = 0; // last time you connected to the server, in milliseconds
String currentLine = ""; // string to hold the text from server String time = ""; // string to hold the time boolean readingTime = false; // if you're currently reading the time
void setup() { // reserve space for the strings: currentLine.reserve(256); time.reserve(150);
// Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only }
// attempt a DHCP connection: Serial.println("Attempting to get an IP address using DHCP:"); if (!Ethernet.begin(mac)) { // if DHCP fails, start with a hard-coded address: Serial.println("failed to get an IP address using DHCP, trying manually"); Ethernet.begin(mac, ip); } Serial.print("My address:"); Serial.println(Ethernet.localIP()); // connect to Time Server: connectToServer(); }
void loop() { if (client.connected()) { if (client.available()) { // read incoming bytes: char inChar = client.read();
// add incoming byte to end of line: currentLine += inChar;
// if you get a newline, clear the line: if (inChar == '\n') { currentLine = ""; } // if the current line ends with <localtime>, it will // be followed by the time: if ( currentLine.endsWith("<localtime>")) { // time is beginning. Clear the time string: readingTime= true; time = ""; } // if you're currently reading the bytes of the time, // add them to the time String: if (readingTime) { if (inChar != '<') { time += inChar; } else { // if you got a "<" character, // you've reached the end of the time: readingTime = false; Serial.println(time); // close the connection to the server: client.stop(); } } } } else if (millis() - lastAttemptTime > requestInterval) { // if you're not connected, and two minutes have passed since // your last connection, then attempt to connect again: connectToServer(); } }
void connectToServer() { // attempt to connect, and wait a millisecond: Serial.println("connecting to server..."); if (client.connect(serverName, 80)) { Serial.println("making HTTP request..."); // make HTTP GET request to server: client.println("GET /feed/tz.ashx?key=(APIkey)&q=london&format=xml"); client.println("HOST: www.worldweatheronline.com"); client.println(); } // note the time of this connect attempt: lastAttemptTime = millis(); } or #include <SPI.h> #include <Ethernet.h>
// Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { *** MY MAC CODE GOES IN HERE**** }; IPAddress ip(*** MY IP GOES IN HERE******);
// initialize the library instance: EthernetClient client;
const unsigned long requestInterval = 60000; // delay between requests
char serverName[] = "http://www.worldweatheronline.com/feed/tz.ashx"; // time URL
boolean requested; // whether you've made a request since connecting unsigned long lastAttemptTime = 0; // last time you connected to the server, in milliseconds
String currentLine = ""; // string to hold the text from server String time = ""; // string to hold the time boolean readingTime = false; // if you're currently reading the time
void setup() { // reserve space for the strings: currentLine.reserve(256); time.reserve(150);
// Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only }
// attempt a DHCP connection: Serial.println("Attempting to get an IP address using DHCP:"); if (!Ethernet.begin(mac)) { // if DHCP fails, start with a hard-coded address: Serial.println("failed to get an IP address using DHCP, trying manually"); Ethernet.begin(mac, ip); } Serial.print("My address:"); Serial.println(Ethernet.localIP()); // connect to Time Server: connectToServer(); }
void loop() { if (client.connected()) { if (client.available()) { // read incoming bytes: char inChar = client.read();
// add incoming byte to end of line: currentLine += inChar;
// if you get a newline, clear the line: if (inChar == '\n') { currentLine = ""; } // if the current line ends with <localtime>, it will // be followed by the time: if ( currentLine.endsWith("<localtime>")) { // time is beginning. Clear the time string: readingTime= true; time = ""; } // if you're currently reading the bytes of the time, // add them to the time String: if (readingTime) { if (inChar != '<') { time += inChar; } else { // if you got a "<" character, // you've reached the end of the time: readingTime = false; Serial.println(time); // close the connection to the server: client.stop(); } } } } else if (millis() - lastAttemptTime > requestInterval) { // if you're not connected, and two minutes have passed since // your last connection, then attempt to connect again: connectToServer(); } }
void connectToServer() { // attempt to connect, and wait a millisecond: Serial.println("connecting to server..."); if (client.connect(serverName, 80)) { Serial.println("making HTTP request..."); // make HTTP GET request to server: client.println("GET /feed/tz.ashx?key=(APIkey)&q=london&format=xml"); client.println("HOST: www.worldweatheronline.com"); client.println(); } // note the time of this connect attempt: lastAttemptTime = millis(); } Worked
|
|
|
|
|
Logged
|
|
|
|
|
Seattle, WA USA
Offline
Brattain Member
Karma: 311
Posts: 35470
Seattle, WA USA
|
 |
« Reply #8 on: September 12, 2012, 10:26:38 am » |
One last suggestion, then. client.println("GET /feed/tz.ashx?key=(APIkey)&q=london&format=xml"); Loose the leading slash. client.println("GET feed/tz.ashx?key=(APIkey)&q=london&format=xml");
|
|
|
|
|
Logged
|
|
|
|
|
Reading, Berkshire
Offline
Full Member
Karma: 2
Posts: 132
|
 |
« Reply #9 on: September 12, 2012, 10:42:16 am » |
No joy.
I'll have a look through some text books and get back to this thread. I've contacted the staff as well to make sure it's not something at their end.
That wasted an afternoon.
|
|
|
|
|
Logged
|
|
|
|
|
UK
Offline
Tesla Member
Karma: 89
Posts: 6303
-
|
 |
« Reply #10 on: September 12, 2012, 01:35:32 pm » |
The server name is the domain name of the site you're connecting to, in this case " www.worldweatheronline.com".
|
|
|
|
|
Logged
|
|
|
|
|
CH
Offline
God Member
Karma: 19
Posts: 703
Book Writer "Arduino Praxiseinstieg"
|
 |
« Reply #11 on: September 13, 2012, 02:16:54 am » |
I checked your sketch and changed some lines (Fixed IP, Server IP, Serial Begin) Here is a working version. See the result in the serial monitor: worldweatheronline-xml by Arduinopraxis#include <SPI.h> #include <Ethernet.h>
// Ethernet byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xAD }; byte ip[] = { 10, 0, 1, 101 }; byte gateway[] = { 10, 0, 1, 1 }; byte subnet[] = { 255, 255, 255, 0 };
// initialize the library instance: EthernetClient client;
const unsigned long requestInterval = 60000; // delay between requests
//char serverName[] = "http://www.worldweatheronline.com/feed/tz.ashx"; // time URL
// Server IPAddress server(81,201,134,251);
boolean requested; // whether you've made a request since connecting unsigned long lastAttemptTime = 0; // last time you connected to the server, in milliseconds
String currentLine = ""; // string to hold the text from server String time = ""; // string to hold the time boolean readingTime = false; // if you're currently reading the time
void setup() { // reserve space for the strings: currentLine.reserve(256); time.reserve(150); // Start Serial Port Serial.begin(9600); Serial.println("Setup..."); // Start Ethernet Ethernet.begin(mac, ip);
// connect to Time Server: connectToServer(); }
void loop() { if (client.connected()) { if (client.available()) { // read incoming bytes: char inChar = client.read();
// add incoming byte to end of line: currentLine += inChar;
// if you get a newline, clear the line: if (inChar == '\n') { currentLine = ""; } // if the current line ends with <localtime>, it will // be followed by the time: if ( currentLine.endsWith("<localtime>")) { // time is beginning. Clear the time string: readingTime= true; time = ""; } // if you're currently reading the bytes of the time, // add them to the time String: if (readingTime) { if (inChar != '<') { time += inChar; } else { // if you got a "<" character, // you've reached the end of the time: readingTime = false; Serial.println(time); // close the connection to the server: client.stop(); } } } } else if (millis() - lastAttemptTime > requestInterval) { // if you're not connected, and two minutes have passed since // your last connection, then attempt to connect again: connectToServer(); } }
void connectToServer() { // attempt to connect, and wait a millisecond: Serial.println("connecting to server..."); //if (client.connect(serverName, 80)) { if (client.connect(server, 80)) { Serial.println("making HTTP request..."); // make HTTP GET request to server: client.println("GET /feed/tz.ashx?key=(yourkey_here)&q=london&format=xml"); client.println("HOST: www.worldweatheronline.com"); client.println(); } // note the time of this connect attempt: lastAttemptTime = millis(); }
|
|
|
|
|
Logged
|
|
|
|
|
0
Online
Tesla Member
Karma: 50
Posts: 6535
Arduino rocks
|
 |
« Reply #12 on: September 13, 2012, 07:30:00 pm » |
I modified the previously posted code to fit my router setup and it seems to get weather data from somewhere and is displayed in the serial monitor. // // Read Yahoo Weather API XML // 03.09.2012 // http://arduino-praxis.ch
#include <SPI.h> #include <Ethernet.h> #include <TextFinder.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xAD }; byte ip[] = { 192, 168, 1, 102 }; byte gateway[] = { 192, 168, 1, 1 }; byte subnet[] = { 255, 255, 255, 0 };
// Server Yahoo IPAddress server(87,248,122,181);
EthernetClient client; TextFinder finder( client );
char place[50]; char hum[30];
void setup() { // Start Ehternet Ethernet.begin(mac, ip); // Start Serial Port Serial.begin(9600); Serial.println("Setup..."); }
void loop() { if (client.connect(server, 80)) { // Call Wetter-API // w: ID from your City // http://weather.yahooapis.com/forecastrss?w=12893459&u=c /// Serial.println("Connect to Yahoo Weather..."); client.println("GET /forecastrss?w=12893459&u=c HTTP/1.0"); client.println("HOST:weather.yahooapis.com\n\n"); client.println(); Serial.println("Connected..."); } else { Serial.println(" connection failed"); }
if (client.connected()) { // Humidity if ( (finder.getString("<yweather:atmosphere humidity=\"", "\"",hum,4)!=0) ) { Serial.print("Humidity: "); Serial.println(hum); } else { Serial.print("No Humidity Data"); } // Place/City if ( (finder.getString("<title>Conditions for ", " ",place,50)!=0) ) { Serial.print("City: "); Serial.println(place); } // Temperature if(finder.find("temp=") ) { int temperature = finder.getValue(); Serial.print("Temp C: "); Serial.println(temperature); } else { Serial.print("No Temperature Data"); } // END XML } else { Serial.println("Disconnected"); } client.stop(); client.flush(); delay(60000); }
|
|
|
|
|
Logged
|
|
|
|
|
Reading, Berkshire
Offline
Full Member
Karma: 2
Posts: 132
|
 |
« Reply #13 on: September 14, 2012, 11:09:37 am » |
Why isn't my version working then? #include <SPI.h> #include <Ethernet.h>
// Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x13, 0x1D}; byte ip[]={78,149,131,230 }; // initialize the library instance: EthernetClient client;
const unsigned long requestInterval = 60000; // delay between requests
char serverName[] = "http://www.worldweatheronline.com/feed/tz.ashx"; // time URL IPAddress server (81,201,134,251);
boolean requested; // whether you've made a request since connecting unsigned long lastAttemptTime = 0; // last time you connected to the server, in milliseconds
String currentLine = ""; // string to hold the text from server String time = ""; // string to hold the time boolean readingTime = false; // if you're currently reading the time
void setup() { // reserve space for the strings: currentLine.reserve(256); time.reserve(150); // Start Serial Port Serial.begin(9600); Serial.println("Setup..."); // Start Ethernet Ethernet.begin(mac, ip);
// connect to Time Server: connectToServer(); }
void loop() { if (client.connected()) { if (client.available()) { // read incoming bytes: char inChar = client.read();
// add incoming byte to end of line: currentLine += inChar;
// if you get a newline, clear the line: if (inChar == '\n') { currentLine = ""; } // if the current line ends with <localtime>, it will // be followed by the time: if ( currentLine.endsWith("<localtime>")) { // time is beginning. Clear the time string: readingTime= true; time = ""; } // if you're currently reading the bytes of the time, // add them to the time String: if (readingTime) { if (inChar != '<') { time += inChar; } else { // if you got a "<" character, // you've reached the end of the time: readingTime = false; Serial.println(time); // close the connection to the server: client.stop(); } } } } else if (millis() - lastAttemptTime > requestInterval) { // if you're not connected, and two minutes have passed since // your last connection, then attempt to connect again: connectToServer(); } }
void connectToServer() { // attempt to connect, and wait a millisecond: Serial.println("connecting to server..."); if (client.connect(server, 80)) { Serial.println("making HTTP request..."); // make HTTP GET request to server: client.println("GET /feed/tz.ashx?key=92b48f5ddc131933121209&q=london&format=xml"); client.println("HOST: www.worldweatheronline.com"); client.println(); } // note the time of this connect attempt: lastAttemptTime = millis(); }
|
|
|
|
|
Logged
|
|
|
|
|
0
Online
Tesla Member
Karma: 50
Posts: 6535
Arduino rocks
|
 |
« Reply #14 on: September 14, 2012, 11:44:49 am » |
Why isn't my version working then? Your code appears to be "different" from the code I used. I suggest you try the code that worked for me to see if you have hardware issues or just issues with your code.
|
|
|
|
|
Logged
|
|
|
|
|
|