OneWire Temp posting to cosm issues - 'class EthernetClient' has no member named

Hello,

Let me preface this post with I’m a newbie and have limited programming background so please bare with me.

I have an Arduino uno with and ethernet sheild. I’m trying to get two temperature sensors to report to cosm. Over a year ago (prior to Cosm) I setup another identical setup using Pachube and its still functioning fine today. However using the same code does not work with the newly created FeedID. It gives me 403’s. I’m assuming its due to the new API version that must be required?

At any rate Cosm has example code they give and in trying to figure out how to get the example code to work for the new API I’m having all sorts of issues. It seems as though once I solve one compilation error another shows. Fun stuff :slight_smile: However I’m now stumped and not sure how to proceed. Can you please help in identifying why I’m getting the following error when verifying the code?

‘class EthernetClient’ has no member named ‘print’

sketch_nov09b.cpp: In function ‘void sendData(int)’:
sketch_nov09b:114: error: ‘class EthernetClient’ has no member named ‘print’
sketch_nov09b:115: error: ‘class EthernetClient’ has no member named ‘print’
sketch_nov09b:116: error: ‘class EthernetClient’ has no member named ‘println’
sketch_nov09b:117: error: ‘class EthernetClient’ has no member named ‘println’
sketch_nov09b:118: error: ‘class EthernetClient’ has no member named ‘print’
sketch_nov09b:119: error: ‘class EthernetClient’ has no member named ‘println’
sketch_nov09b:120: error: ‘class EthernetClient’ has no member named ‘print’
sketch_nov09b:121: error: ‘class EthernetClient’ has no member named ‘println’
sketch_nov09b:122: error: ‘class EthernetClient’ has no member named ‘print’
sketch_nov09b:127: error: ‘class EthernetClient’ has no member named ‘println’
sketch_nov09b:130: error: ‘class EthernetClient’ has no member named ‘println’
sketch_nov09b:131: error: ‘class EthernetClient’ has no member named ‘println’
sketch_nov09b:132: error: ‘class EthernetClient’ has no member named ‘println’
sketch_nov09b:135: error: ‘class EthernetClient’ has no member named ‘print’
sketch_nov09b:136: error: ‘class EthernetClient’ has no member named ‘println’

The line of code that error is being generated on is - client.print(“PUT /v2/feeds/”);

Here is the current sketch

/*
Pachube sensor client

This sketch connects an analog sensor to Pachube (http://www.pachube.com)
using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or
the Adafruit Ethernet shield, either one will work, as long as it's got
a Wiznet Ethernet module on board.

This example has been updated to use version 2.0 of the Pachube.com API.
To make it work, create a feed with a datastream, and give it the ID
sensor1. Or change the code below to match your feed.

Circuit:
* Analog sensor attached to analog in 0
* Ethernet shield attached to pins 10, 11, 12, 13

created 15 March 2010
modified 9 Apr 2012
by Tom Igoe with input from Usman Haque and Joe Saavedra

http://arduino.cc/en/Tutorial/PachubeClient
This code is in the public domain.

*/

#include
#include
#include
#include

#define APIKEY "YOUR API KEY GOES HERE" // replace your pachube api key here
#define FEEDID 00000 // replace your feed ID
#define USERAGENT "My Project" // user agent is the project name

// assign a MAC address for the ethernet controller.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
// fill in your address here:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x95};

// fill in an available IP address on your network here,
// for manual configuration:
//IPAddress ip(192,168,168,25);
byte ip[] = {
192, 168, 168, 251 }; // no DHCP so we set our own IP address
// initialize the library instance:
EthernetClient client;

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
IPAddress server(216,52,233,122); // numeric IP for api.pachube.com
//char server[] = "api.pachube.com"; // name address for pachube API

unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
boolean lastConnected = false; // state of the connection last time through the main loop
const unsigned long postingInterval = 10*1000; //delay between updates to Pachube.com

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
// while (!Serial) {
// ; // wait for serial port to connect. Needed for Leonardo only
// }

// start the Ethernet connection:
//if (Ethernet.begin(mac) == 0) {
//Serial.println("Failed to configure Ethernet using DHCP");
// DHCP failed, so use a fixed IP address:
Ethernet.begin(mac, ip);
// }
}

void loop() {
// read the analog sensor:
int sensorReading = analogRead(A0);

// if there's incoming data from the net connection.
// send it out the serial port. This is for debugging
// purposes only:
if (client.available()) {
char c = client.read();
Serial.print(c);
}

// if there's no net connection, but there was one last time
// through the loop, then stop the client:
if (!client.connected() && lastConnected) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}

// if you're not connected, and ten seconds have passed since
// your last connection, then connect again and send data:
if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
sendData(sensorReading);
}
// store the state of the connection for next time through
// the loop:
lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
void sendData(int thisData) {
// if there's a successful connection:
if (client.connect(server, 80)) {
Serial.println("connecting...");
// send the HTTP PUT request:
client.print("PUT /v2/feeds/");
client.print(FEEDID);
client.println(".csv HTTP/1.1");
client.println("Host: api.pachube.com");
client.print("X-PachubeApiKey: ");
client.println(APIKEY);
client.print("User-Agent: ");
client.println(USERAGENT);
client.print("Content-Length: ");

// calculate the length of the sensor reading in bytes:
// 8 bytes for "sensor1," + number of digits of the data:
int thisLength = 8 + getLength(thisData);
client.println(thisLength);

// last pieces of the HTTP PUT request:
client.println("Content-Type: text/csv");
client.println("Connection: close");
client.println();

// here's the actual content of the PUT request:
client.print("sensor1,");
client.println(thisData);

}
else {
// if you couldn't make a connection:
Serial.println("connection failed");
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
// note the time that the connection was made or attempted:
lastConnectionTime = millis();
}

// This method calculates the number of digits in the
// sensor reading. Since each digit of the ASCII decimal
// representation is a byte, the number of digits equals
// the number of bytes:

int getLength(int someValue) {
// there's at least one byte:
int digits = 1;
// continually divide the value by ten,
// adding one to the digit count for each
// time you divide, until you're at 0:
int dividend = someValue /10;
while (dividend > 0) {
dividend = dividend /10;
digits++;
}
// return the number of digits:
return digits;
}

Please advise and thanks in advance.
Thanks,
Brad

Let me preface this post with I'm a newbie and have limited programming background so please bare with me.

Why is it that every newbie that comes in here wants us all to take our clothes off together? Forget it. I'm keeping mine on.

#include
#include
#include
#include

WTF?

if (client.available()) {
char c = client.read();
Serial.print(c);
}

It doesn't matter whether there is a client connected? Yes, it does. Supposing that there is a client connected, does reading one character really tell you anything?

Where have you included EthernetClient.h?

Paul,

First off thanks for keeping your cloths on!

Second, DOH… I posted the wrong code… Let me try again

/*
Cosm sensor client

This sketch connects an analog sensor to Cosm (http://www.cosm.com)
using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or
the Adafruit Ethernet shield, either one will work, as long as it's got
a Wiznet Ethernet module on board.

This example has been updated to use version 2.0 of the cosm.com API.
To make it work, create a feed with a datastream, and give it the ID
sensor1. Or change the code below to match your feed.

Circuit:
* Analog sensor attached to analog in 0
* Ethernet shield attached to pins 10, 11, 12, 13

created 15 March 2010
updated 14 May 2012
by Tom Igoe with input from Usman Haque and Joe Saavedra

http://arduino.cc/en/Tutorial/CosmClient
This code is in the public domain.

*/

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>

#define APIKEY "YOUR API KEY GOES HERE" // replace your Cosm api key here
#define FEEDID 00000 // replace your feed ID
#define USERAGENT "My Project" // user agent is the project name

// assign a MAC address for the ethernet controller.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
// fill in your address here:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x95};

// fill in an available IP address on your network here,
// for manual configuration:
//IPAddress ip(10,0,1,20);
byte ip[] = { 
   192, 168, 168, 251   };                  // no DHCP so we set our own IP address
// initialize the library instance:
EthernetClient client;

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(216,52,233,121); // numeric IP for api.cosm.com
char server[] = "api.cosm.com"; // name address for cosm API

unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
boolean lastConnected = false; // state of the connection last time through the main loop
const unsigned long postingInterval = 10*1000; //delay between updates to cosm.com

void setup() {
// start serial port:
Serial.begin(9600);
// start the Ethernet connection:
//if (Ethernet.begin(mac) == 0) {
//Serial.println("Failed to configure Ethernet using DHCP");
// DHCP failed, so use a fixed IP address:
Ethernet.begin(mac, ip);
//}
}

void loop() {
// read the analog sensor:
int sensorReading = analogRead(A0);
int sensorReading2 = analogRead(A1);

// if there's incoming data from the net connection.
// send it out the serial port. This is for debugging
// purposes only:
//if (client.available()) {
//char c = client.read();
//Serial.print(c);
//}

// if there's no net connection, but there was one last time
// through the loop, then stop the client:
if (!client.connected() && lastConnected) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}

// if you're not connected, and ten seconds have passed since
// your last connection, then connect again and send data:
if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
sendData(sensorReading, sensorReading2);
}
// store the state of the connection for next time through
// the loop:
lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
void sendData(int thisData, int thisData2) {
// if there's a successful connection:
if (client.connect(server, 80)) {
Serial.println("connecting...");
// send the HTTP PUT request:
client.print("PUT /v2/feeds/");
client.print(FEEDID);
client.println(".csv HTTP/1.1");
client.println("Host: api.cosm.com");
client.print("X-ApiKey: ");
client.println(APIKEY);
client.print("User-Agent: ");
client.println(USERAGENT);
client.print("Content-Length: ");

// calculate the length of the sensor reading in bytes:
// 8 bytes for "sensor1," + number of digits of the data:
// plus the same again and length of data 2
int thisLength = 8 + getLength(thisData) + 8 + getLength(thisData2);
client.println(thisLength);

// last pieces of the HTTP PUT request:
client.println("Content-Type: text/csv");
client.println("Connection: close");
client.println();

// here's the actual content of the PUT request:
client.print("sensor1,");
client.println(thisData);
// and the 2nd sensor
client.print("sensor2,");
client.println(thisData2);

}
else {
// if you couldn't make a connection:
Serial.println("connection failed");
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
// note the time that the connection was made or attempted:
lastConnectionTime = millis();
}

// This method calculates the number of digits in the
// sensor reading. Since each digit of the ASCII decimal
// representation is a byte, the number of digits equals
// the number of bytes:

int getLength(int someValue) {
// there's at least one byte:
int digits = 1;
// continually divide the value by ten,
// adding one to the digit count for each
// time you divide, until you're at 0:
int dividend = someValue /10;
while (dividend > 0) {
dividend = dividend /10;
digits++;
}
// return the number of digits:
return digits;
}

Thanks,
Brad

//if (Ethernet.begin(mac) == 0) {
//Serial.println("Failed to configure Ethernet using DHCP");
// DHCP failed, so use a fixed IP address:
Ethernet.begin(mac, ip);
//}

Is your delete key broken?

I copied and pasted the latest code in the Arduino 1.0.1 IDE. The error message I got when compiling was:

Binary sketch size: 11,100 bytes (of a 30,720 byte maximum)

I'm sorry that I can't help you fix that one.

Yeah yeah… I know it looks messy but when using examples for some reason I like to keep everything until I know it works. Call me a pack rat if you will.

So it compiles fine for you?!?!? Ok so I too am using 1.0.1 for Windows and I just downloaded 1.0.2 and I’m getting the same results. Really not sure why it’s working for you and not me.

I just went out and found another example for cosm upload but it too fails with the following:

‘EthernetClient’ does not name a type

#include <SPI.h>
#include <Ethernet.h>
#include <HttpClient.h>
#include <Cosm.h>

// MAC address for your Ethernet shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// Your Cosm key to let you upload data
char cosmKey[] = "YOUR_COSM_API_KEY";

// Analog pin which we're monitoring (0 and 1 are used by the Ethernet shield)
int sensorPin = 2;

// Define the strings for our datastream IDs
char sensorId[] = "1";
CosmDatastream datastreams[] = {
  CosmDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT),
};
// Finally, wrap the datastreams into a feed
CosmFeed feed(15552, datastreams, 1 /* number of datastreams */);

EthernetClient client;
CosmClient cosmclient(client);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  Serial.println("Starting single datastream upload to Cosm...");
  Serial.println();

  while (Ethernet.begin(mac) != 1)
  {
    Serial.println("Error getting IP address via DHCP, trying again...");
    delay(15000);
  }
}

void loop() {
  int sensorValue = analogRead(sensorPin);
  datastreams[0].setFloat(sensorValue);

  Serial.print("Read sensor value ");
  Serial.println(datastreams[0].getFloat());

  Serial.println("Uploading it to Cosm");
  int ret = cosmclient.put(feed, cosmKey);
  Serial.print("cosmclient.put returned ");
  Serial.println(ret);

  Serial.println();
  delay(15000);
}

I’m becoming more perplexed by the minute!

'EthernetClient' does not name a type

It's true. The IDE doesn't just know stuff. You have to include the header files for classes you want to use.

FWIW, I copied your code and it compiles OK.

The 403 code you get probably says "forbidden". I had A nightmare with this a couple of weeks ago. It turned out that this had everything to do with management of cosm and nothing to do with code. Yes I too had an account that had worked, but that was only a day so old.

My only solution was to quit cosm and start over as an alien. The whole sorry saga is in the "help me" section of the cosm forum. I now believe Ilya therein is a person but it wasn't very apparent at the time.

When I sorted the management mess out, the code worked first time. You can see that in the cosm "It works" section. This is for two DS18B20 using the same libraries your have.

Thanks for the reply Nick!

I seen your post last night and did attempt to create an entire new account hoping it would work but no luck. The code I'm trying to use is the same code you posted :slight_smile:

Not sure why its compiling for you all and not me. Time to try a different computer...

So when I compile from a different computer it works fine. NICE!

Unfortunately I'm still getting 404's and 403's from Cosm. I have tried another account with the hopes that it would work but no dice. Time hit up there support and see if they respond and or find some other way of collecting and reporting the data.

Thanks for the help guys.

-Brad