Leggere strighe via web da arduino per automazione fotovoltaica

Fatto! Non ho scritto un programma molto elegante ma funziona davvero bene :slight_smile: In pratica attiva una utenza da 800 watt quando la produzione fotovoltaica è sufficiente. L'attivazione avviene tramite un relè passopasso 220/220v con l'aiuto di un relè 5v messo sulla porta 9 di arduino.

/* programma che legge da cosm/pachube il consumo della casa e la produzione del fotovoltaico /
/
attiva (o disattiva) un relè passopasso tramite la porta 9 se la produzione fotovoltaica /
/
è sufficiente (o meno) - CoC 2012 */

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

byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // indirizzo mac dal mio arduino
IPAddress ip(192,168,1,202); // indirizzo IP del mio arduino
char cosmKey[] = "LA MIA KEY DI COSM"; // la mia key di cosm

// Definisco le stringhe dei miei DatastreamsID (sono 5 nel mio caso)
char temperatureId[] = "0";
char consumocasa1Id[] = "1";
char consumocasa2Id[] = "2";
char contatorefvId[] = "3";
char produzionefvId[] = "4";

CosmDatastream datastreams[] = {
CosmDatastream(temperatureId, strlen(temperatureId), DATASTREAM_FLOAT),
CosmDatastream(consumocasa1Id, strlen(consumocasa1Id), DATASTREAM_FLOAT),
CosmDatastream(consumocasa2Id, strlen(consumocasa2Id), DATASTREAM_FLOAT),
CosmDatastream(contatorefvId, strlen(contatorefvId), DATASTREAM_FLOAT),
CosmDatastream(produzionefvId, strlen(produzionefvId), DATASTREAM_FLOAT),
};
CosmFeed feed(IL_MIO_FEED_DI_COSM, datastreams, 5 /* il numero dei datastreams */);
EthernetServer ArduinoServer(80);
EthernetClient client;
CosmClient cosmclient(client);
unsigned long produzione = 0; // produzione fotovoltaico in watt presa da cosm
unsigned long consumo = 0; // consumo della casa in watt presa da cosm
unsigned long utenza = 800; // utenza (stufetta elettrica) da 800 watt
boolean stato_presa = false; // attualmente la presa è accesa (true) o spenta (false)

void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip);
ArduinoServer.begin();
}

void loop() {
int ret = cosmclient.get(feed, cosmKey);
Serial.println("---------------------------------");
Serial.print("Codice di connessione a cosm: ");
Serial.println(ret);
if (ret > 0)
{
Serial.print("Consumo della casa watt: ");
consumo = (unsigned long)feed[1].getFloat();
Serial.println(consumo);
Serial.print("Produzione fotovoltaico watt: ");
produzione = (unsigned long)feed[4].getFloat();
Serial.println(produzione);
Serial.print("Utenza watt: ");
Serial.println(utenza);
if (stato_presa)
{ // se entro qua vuol dire che l'utenza è accesa
if (produzione < consumo) {
digitalWrite(9, HIGH);
delay (250); // click di 1/4 di secondo al relè per spegnere
digitalWrite(9, LOW);
stato_presa = false;
Serial.println("*** HO SPENTO L'UTENZA ");
}
}
else
{ // se entro qua vuol dire che l'utenza è spenta
if (produzione > (consumo + utenza))
{
digitalWrite(9, HIGH);
delay (250); // click di 1/4 di secondo al relè per accendere
digitalWrite(9, LOW);
stato_presa = true;
Serial.println("
HO ACCESO L'UTENZA ***");
}
}

}
Serial.print("Stato Utenza (0=spenta): ");
Serial.println(stato_presa);
delay(180000UL); // rifaccio il controllo ogni 3 minuti
}