Leggere strighe via web da arduino per automazione fotovoltaica

Buongiorno,
ho a disposizione un arduino uno ethernet, "medie" capacità di programmazione (giusto per dare un'idea, quello che per ora sono riuscito a fare copiando/adattando pezzi di programmi trovati in giro è l'apertura/chiusura di tende elettriche con comandi impartiti via web da smartphone/ipad etc). Ho il seguente problema ed ovviamente ho già cercato (ma per ora non trovato) dei codici di esempio. Ho altri dispositivi (non arduino) connessi in rete che caricano su pachube/cosm informazioni relative alla produzione fotovoltaica ed al consumo della mia casa (esattamente utilizzo dispositivi della Current Cost). Quindi già caricati e belli pronti su pachube, aggiornati ogni 5 minuti, ci sono 2 dati relativi alla produzione del fotovoltaico sul tetto ed al consumo della casa. Il mio obiettivo è realizzare, con arduino, un dispositivo che in automatico attivi un relè quando il consumo della casa + delta elettrodomestico è minore o uguale alla produzione fotovoltaica. Esempio: produco 2000 watt con il fotovoltaico, la casa sta consumando 500 watt, ho una stufetta elettrica che consuma 1000 watt, quindi sono in sovraproduzione anche accendendo la stufetta, arduino la accende. Ovviamente ci sarà un loop che ogni 3/5 minuti rifà il controllo. Mi manca la "conoscenza" su come "tirare dentro" arduino questi due dati numerici da pachube. da lì in poi, per i calcoli e l'attivazione del relè sono in grado di arrangiarmi Utilizzando le api di pachube, questo url "http://api.pachube.com/v2/feeds/xxxxx/datastreams/1.csv" mi produce questa stringa sul browser "2012-10-19T07:31:10.985658Z,126" (in questo momento casa mia sta consumando 126 watt) mentre una seconda api sul canale 4 "http://api.pachube.com/v2/feeds/xxxxx/datastreams/4.csv" produce la stringa "2012-10-19T07:51:17.198951Z,1642" sul browser (ovvero il fotovoltaico sta producendo 1642 watt). Non so come fare questo passaggio con arduino, ovvero come passare questi due url e ritrovarmi in due stringhe le informazioni da trattare. Grazie mille per l'aiuto.

per ottenere quelle pagine non fai altro che una semplicissima GET.

una volta che hai fatto la get il server ti risponde con un header 200ok (se va tutto bene), un altra sfilza di header, una riga vuota e il contenuto della pagina (la striga da parsare) ed infine 2 righe vuote (fine pagina, chiudi il client)

per lavorare con la stringa usa String: ti permette di "tagliare"(substring), "cercare"(find) e anche "dividere"(slipt) in maniera semplice ed immediata

studiando meglio la cosa, forse potrebbe essere più furbo e pratico (e semplice) invertire completamente il discorso ovvero sfruttare i trigger di cosm e farmi spedire ad arduino le informazioni di consumo e produzione ogni volta che questi valori cambiano ( arduino quindi che resta in attesa come un web server) ....

possibile ma devi litigare con i DDNS. mi pare che ci sia una libreria però, oppure alcuni router supportano la funzione. In oltre ovrai aprire le porte in firewll/nat per accettare le connessioni.

cocitaly:
Buongiorno,
ho a disposizione un arduino uno ethernet, "medie" capacità di programmazione (giusto per dare un'idea, quello che per ora sono riuscito a fare copiando/adattando pezzi di programmi trovati in giro è l'apertura/chiusura di tende elettriche con comandi impartiti via web da smartphone/ipad etc). Ho il seguente problema ed ovviamente ho già cercato (ma per ora non trovato) dei codici di esempio. Ho altri dispositivi (non arduino) connessi in rete che caricano su pachube/cosm informazioni relative alla produzione fotovoltaica ed al consumo della mia casa (esattamente utilizzo dispositivi della Current Cost). Quindi già caricati e belli pronti su pachube, aggiornati ogni 5 minuti, ci sono 2 dati relativi alla produzione del fotovoltaico sul tetto ed al consumo della casa. Il mio obiettivo è realizzare, con arduino, un dispositivo che in automatico attivi un relè quando il consumo della casa + delta elettrodomestico è minore o uguale alla produzione fotovoltaica. Esempio: produco 2000 watt con il fotovoltaico, la casa sta consumando 500 watt, ho una stufetta elettrica che fotovoltaico consuma 1000 watt, quindi sono in sovraproduzione anche accendendo la stufetta, arduino la accende. Ovviamente ci sarà un loop che ogni 3/5 minuti rifà il controllo. Mi manca la "conoscenza" su come "tirare dentro" arduino questi due dati numerici da pachube. da lì in poi, per i calcoli e l'attivazione del relè sono in grado di arrangiarmi Utilizzando le api di pachube, questo url "http://api.pachube.com/v2/feeds/xxxxx/datastreams/1.csv" mi produce questa stringa sul browser "2012-10-19T07:31:10.985658Z,126" (in questo momento casa mia sta consumando 126 watt) mentre una seconda api sul canale 4 "http://api.pachube.com/v2/feeds/xxxxx/datastreams/4.csv" produce la stringa "2012-10-19T07:51:17.198951Z,1642" sul browser (ovvero il fotovoltaico sta producendo 1642 watt). Non so come fare questo passaggio con arduino, ovvero come passare questi due url e ritrovarmi in due stringhe le informazioni da trattare. Grazie mille per l'aiuto.

Buongiorno
Grazie per la condivisione di queste informazioni utili.

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
}

Buona sera, ho letto delle infinite possibilità di ARDUINO, e mi chedevo se si può fare o se già esiste, un sistema di monitoraggio e otimizzazione di un impianto fotovoltaico, mi spiego un sistema che collegato ad ogni singolo pannello, monitorizzi lo stato, ed in caso di mal funzionamento, agisca in modo adeguato, il tutto con rete wireless "xBee"collegato ad un pc.Se non mi sono spiegato bene,
Allego un sito dove aver un'idea del sistema "Black Magic "
http://www.bmsolar.it/
Ringrazio per qualsiasi suggeriment, idea o altro.
Grazie
Marco
artigianmetallid@tiscali.it

quanto costa, a spanne, questo blackmagic ? non so ... per un impianto da 6kw picco (24 moduli, per esempio). comunque sul sito che hai citato ci sono indicazioni di massima sul suo funzionamento, senza specifiche tecniche e dettagli ... quindi replicare con arduino una cosa che non si conosce credo sia ... alchimistico/numismatico/zodiacale :slight_smile:

se si hanno abbastanza conoscenze non serve "rubare" l'idea.

probabilmente quel sistema isola i pannelli che stanno producendo molto meno degli altri (e che quindi si comporterebbero da utilizzatore invece che da generatore) e li segnala pure, ma non vedo come possa andare oltre. Trovo mooooolto ottimistico il 90% di rendimento in più, direi che rientra nella tipologia "trochetto magico" (copyright vanna marchi), perchè altrimenti sarebbe un componente standard degli impianti.
Magari qualche esperto di impianti conosce le problematiche che possono verificarsi e mi smentisce.

lesto, quoto completamente.

Giustamente come cita LESTO il sistema individua i pannelli che hanno un problema solitamente ombreggiamento o surriscaldamento e li bypassano evitando cosi che la stringa di pannelli in serie non cada di resa.Ora volevo sapere se era possibile per ogni pannello, controllare la tensione,corrente,temperatura.E poi tramite sempre arduino fare in modo che decida se intervenire e come, su tutto il sistema. tutto questo poi seguito sul pc.

misurare tnsione corrente e temperature è una cosa banale con un'arduino, la cosa che ancora non capisco è come intendi intervenire una volta che questi dati sono noti (che poi è il programma che vai a mettere sull'arduino)

per la tensione un partitore di tensione dovrebbe bastare, per la corrente un partitore di corrente, e per la temperatura di pende dal min-max, ma esistono continaia di sesnori a 1 o 2€
immagino che per intervenire servano dei relè o dei mosfet, che probabilmente necessiteranno dei transitor.

Inizia a pensare a questo la comunicazione PC lasciarla per ultima