1

Téma: malé měření elektro

Ahoj, asi to neni pripad k chlubeni ,ale protože jsem vetsinu kodu pochytil (a nektere i pochopil ) tady na foru rád bych přidal mé měřeni elektriky  doma pomocí SDS Mikro E.

základem jsou 3 jednofázove elektroměry měřící jednotlivé fáze L1-L3. Celkový odběr řeším pomocí virtuálního elektroměru,který počítám v SDS-C . Pro tuto features jsem použil zápis do proměnné  4. S0 měřidla (proto abych to viděl na stránce ve vnitřním webu) a nezavislý vypočet virtualního času mezi pulsy ,který posilam na e-portal , kde se to tvaří jako další elektroměr...(v odesílaní jsem vyměnil sys[59x] za svou ramxx)

Pro "domácí" kontrolu jsem stvořil jednoduchou user.html  ,kde vidim hlavní udaje z elektroměru posilené o spočítané hodnoty odběru za poslední hodinu a posledních 24 hod.Stránku jsem optimalizoval pro zobrazeni na telefonu s 480x800px (samozřejme je to mirně upravená demo stránka....)

userhtml


pro doplnění informací a protože jsem již doma měl fungující 1-wire sít s DS18B20 (původně celé na jednočipu x51) jsem připojil i teploměry v nedoporučeníhodné topologii "hvězdice".(10 čidel  od 2m do 25m) vše na FTP cat 5e  spojené na svorkovnici u SDS.


pridal bych i kod v SDS a user.html ,ale nejak se mi nedaří to sem umistit.. (asi to chce nejake zaklinadlo...)



Honza

2

Re: malé měření elektro

Aktualizace leden 2016:

- doplneno dalsi cidlo na topnou vodu
- upraveno pocitani max vykonu na user strance (asi chyba v sds) - je treba pocitat ze se cas mezi pulsy muze = 0   smile

- upraveno posilani na Eportal - misto Aktualniho vykonu je posilan max prikon v danem casovem intervalu (1/4 hod)



PS. po dvou mesicich mam konecne reseni obycejneho mereni spotreby, coz jsem si na zacatku myslel ze si kupuji "hotove" reseni......

3 Naposledy upravil: honzaM (2016-12-19 19:47:20)

Re: malé měření elektro

tak cas pokrocil a uz nejakou dobu pouzivam novejsi  user.html

new_usrhtml



pokud by nekoho zajimal zdrojak..

T

// Program pro odesilani informaci na portal.merenienergie.cz
// JM  vypocitava virtualni celkovy (3fazovy) elektromer
// zobrazuje na interni HTML strance
  
//  nove: 1/4hod vypocet posledni hod hodnoty L1-L3 /jemnejsi rozliseni/
//  popis promennych, zapis do 4-S0 /sys[469] - kvuli zobrazeni na eportal
// pridan virtualni cas mezi pulsy - ram[99]
// pridany ram[16-19] max hodnoty fazi
// ochrana aktualnich vykonu v ram[21-23] < 10kW /45A/
// omezeni echo vypisu /kratsi udaje,cas na jednom radku/
// ochrana aktualniho vykonu pred chybnym udajem , sys[592-4] = 0
// reset max hodnot odberu pomoci sys[149] =  1
// zmena odesilanych hodnot na portal - misto akt.vykonu max ve 1/4 hod..RAM[95-98]]
// vypocet mn.vody v bojleru, pouziva ram[9] jako temp a ram[15] jako vystup v litrech

// posledni uprava 3.10.2016 vypocet mn. vody v bojleru (ram[15])


// ***********  upozorneni  **************
// echotime pouziva RAM[0-5]
// portal pouziva RAM[100-110]
// pokud se bude pouzivat dalsi http_get, e-mail, atd., pozor na timeouty pro dobehnuti GETu
// pozor na pouzivani sys[64] odpocitavani casu - muze dojit k omezeni funkce portalu

// *******  promenne k portalu  **********
var _portal_vstup;       //index S0 vstupu
var _portal_konst;       //prepoctova konst S0 vstupu
var _portal_ram;         //index ram pole
var _portal_pom;         //pomocna
var _portal_dns;         //je dostupny preklad dns
var _portal_data;        //typ odesilanych dat
var _portal_timeout;     //timeout pro odesilani dat
var _portal_timeoutget;  //timeout pro chybu serveru
var _portal_timeoutdns;  //timeout pro dns_resolve

// *******  vase promenne sem **********

var thishour; //flag že tuhle hod už procedury proběhly
var thismin; 


// *******  globalni procedury  **********
echotime
{
 ram[0]=sys[8] / 10;
 ram[1]=sys[8] % 10;
 ram[2]=sys[9] / 10;
 ram[3]=sys[9] % 10;
 ram[4]=sys[10] / 10;
 ram[5]=sys[10] % 10;
 //echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5]);
}


// *******  procedury portalu **********
odesli_data_na_portal
{
 if (_portal_timeoutget==0) goto odesli_data_na_portal_get;   //odeslat data
 //pred odeslanim dat zkontrolovat zda nebezi predchozi pozadavek
 if (sys[65]==0 && _portal_timeoutget>=sys[3]) goto odesli_data_na_portal_end;    //jeste bezi, ale mam cas delam neco jineho
 if (_portal_timeoutget<sys[3]) goto odesli_data_na_portal_chyba;    //uz neni cas - chyba
 if ((sys[65]!=1024) || (sys[75] != 200)) {
  goto odesli_data_na_portal_chyba;
 } else {
  if (_portal_data==1) {
   echotime();
   echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' S0 odeslano na server, OK.');
   echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5]':', ram[95]':', ram[96]':', ram[97]':', ram[98],);
  }
  if (_portal_data==2) {
   echotime();
   echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' Temp A odeslano na server, OK.');
  }
  _portal_data++;
  _portal_timeoutget=0;
  if (_portal_data>4) {
   _portal_timeout=sys[3]+90000;    //interval
   _portal_data=0;                  //vynulovat
   goto odesli_data_na_portal_end;
  }
 }

label odesli_data_na_portal_get:
 if (_portal_dns==1) {
  //mam dns
  if (_portal_data==1) {        //sys[595] nahrazeno ram[99] JM24112015  ; sys[592-595] nahrazeno ram[95-98] max hodnota v 1/4 hod
  // http_get(sys[66],sys[67],sys[68],sys[69],'eportal.merenienergie.cz','/datas0.php?ver=1&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t0v1=', sys[493], '&t0v2=', sys[494], '&t0v3=', sys[495], '&t0v4=', sys[496], '&t0v5=', sys[497], '&t0v6=', sys[498], '&t0v7=', sys[499], '&t0v8=', sys[500], '&t1v1=', sys[526], '&t1v2=', sys[527], '&t1v3=', sys[528], '&t1v4=', sys[529], '&t1v5=', sys[530], '&t1v6=', sys[531], '&t1v7=', sys[532], '&t1v8=', sys[533], '&av1=', sys[592], '&av2=', sys[593], '&av3=', sys[594], '&av4=', ram[99], '&av5=', sys[596], '&av6=', sys[597], '&av7=', sys[598], '&av8=', sys[599], '&tt=', sys[459]);
   http_get(sys[66],sys[67],sys[68],sys[69],'eportal.merenienergie.cz','/datas0.php?ver=1&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t0v1=', sys[493], '&t0v2=', sys[494], '&t0v3=', sys[495], '&t0v4=', sys[496], '&t0v5=', sys[497], '&t0v6=', sys[498], '&t0v7=', sys[499], '&t0v8=', sys[500], '&t1v1=', sys[526], '&t1v2=', sys[527], '&t1v3=', sys[528], '&t1v4=', sys[529], '&t1v5=', sys[530], '&t1v6=', sys[531], '&t1v7=', sys[532], '&t1v8=', sys[533], '&av1=', ram[95], '&av2=', ram[96], '&av3=', ram[97], '&av4=', ram[98], '&av5=', sys[596], '&av6=', sys[597], '&av7=', sys[598], '&av8=', sys[599], '&tt=', sys[459]);

   //nulovani 1/4 hod maxim
  ram[95] = 3600000;     // max odber ve 1/4hodine L1
  ram[96] = 3600000;     // max odber ve 1/4hodine L2
  ram[97] = 3600000;     // max odber ve 1/4hodine L3
  ram[98] = 3600000;

  }
  if (_portal_data==2) {
   http_get(sys[66],sys[67],sys[68],sys[69],'eportal.merenienergie.cz','/datatemp.php?ver=1&line=a&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t1=', sys[310], '&t2=', sys[311], '&t3=', sys[312], '&t4=', sys[313], '&t5=', sys[314], '&t6=', sys[315], '&t7=', sys[316], '&t8=', sys[317], '&t9=', sys[318], '&t10=', sys[319], '&t11=', sys[320], '&t12=', sys[321], '&t13=', sys[322], '&t14=', sys[323], '&t15=', sys[324], '&t16=', sys[325]);
  }
 } else {
  //nemam dns
  if (_portal_data==1) {
   http_get(77,93,211,207,'eportal.merenienergie.cz','/datas0.php?ver=1&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t0v1=', sys[493], '&t0v2=', sys[494], '&t0v3=', sys[495], '&t0v4=', sys[496], '&t0v5=', sys[497], '&t0v6=', sys[498], '&t0v7=', sys[499], '&t0v8=', sys[500], '&t1v1=', sys[526], '&t1v2=', sys[527], '&t1v3=', sys[528], '&t1v4=', sys[529], '&t1v5=', sys[530], '&t1v6=', sys[531], '&t1v7=', sys[532], '&t1v8=', sys[533], '&av1=', sys[592], '&av2=', sys[593], '&av3=', sys[594], '&av4=', sys[595], '&av5=', sys[596], '&av6=', sys[597], '&av7=', sys[598], '&av8=', sys[599], '&tt=', sys[459]);
  }
  if (_portal_data==2) {
   http_get(77,93,211,207,'eportal.merenienergie.cz','/datatemp.php?ver=1&line=a&devid=', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '&t1=', sys[310], '&t2=', sys[311], '&t3=', sys[312], '&t4=', sys[313], '&t5=', sys[314], '&t6=', sys[315], '&t7=', sys[316], '&t8=', sys[317], '&t9=', sys[318], '&t10=', sys[319], '&t11=', sys[320], '&t12=', sys[321], '&t13=', sys[322], '&t14=', sys[323], '&t15=', sys[324], '&t16=', sys[325]);
  }
 }

 _portal_timeoutget=sys[3]+1500;   //15sekund pro potvrzeni ze serveru
 goto odesli_data_na_portal_end;

label odesli_data_na_portal_chyba:
 echo(' Chyba komunikace s www serverem, http: ', sys[75]);
 _portal_timeout=sys[3]+90000;    //interval
 _portal_data=0;                  //vynulovat
 _portal_timeoutget=0;            //vynulovat
 _portal_timeoutdns=0;            //vynulovat

label odesli_data_na_portal_end:
}

portal_nastav
{
 _portal_timeout=0;     //zrovna se odesilaji data
 _portal_timeoutget=0;  //vynulovat timeout predchozich get pozadavku
 _portal_timeoutdns=0;  //vynulovat timeout predchoziho dns resolveru
 _portal_dns=0;         //nemam dns
 _portal_data=1;
}

portal_dns
{
 if (_portal_timeoutdns==0) {
  echotime();
  echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' dns_resolv()');
  dns_resolv('eportal.merenienergie.cz');
  _portal_timeoutdns=sys[3]+1500;    //15sek timeout
 }
 if (sys[65] == 512) {
  echotime();
  echo (ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' dns_resolv() OK:', sys[65]);
  _portal_dns=1;
  return;
 }
 if (_portal_timeoutdns<sys[3]) {
  echotime();
  echo (ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' dns_resolv() chyba:', sys[65]);
  _portal_dns=2;
 }
}
// *******  moje  procedury  **********

virtualni_elektromer_3f       // virtualni elmer  - pocita z 3x jednofazovy elektromer
{
 // pouzite promenne ram
 // ram[20]= celkovy  odber 3 faze /v kWh/
 // ram[21]= hodnota aktualniho odberu L1
 // ram[22]= hodnota aktualniho odberu L2
 // ram[23]= hodnota aktualniho odberu L3
 // ram[24] = aktualni odber ve vsech fazich
 // temp ram[31-33]
 // ram[99] = virtualni cas mezi pulsy /msec/
 
 
  ram[31] = sys[592];                  // vypocet casu elektromer L1
    if (sys[625] > ram[31] && ram[31] > 100 ) {
        ram[31] = sys[625];
    }
  if (ram[31] < 3600000){
  ram[21] = 3600000/ram[31];
  }
  else
  {
  ram[21] = 0 ;                         // mene nez 1 Watt
  }
  ram[32] = sys[593];                  // vypocet casu elektromer L2
    if (sys[626] > ram[32] && ram[32] > 100) {
        ram[32] = sys[626];
    }
  if (ram[32] < 3600000){
  ram[22] = 3600000/ram[32];
  }
  else
  {
  ram[22] = 0 ;                         // mene nez 1 Watt
  }
  
  ram[33] = sys[594];                  // vypocet casu elektromer L3
    if (sys[627] > ram[33]&& ram[33] > 100) {
        ram[33] = sys[627];
    }
  if (ram[33] < 3600000){
  ram[23] = 3600000/ram[33];
  }
  else
  {
  ram[23] = 0 ;                         // mene nez 1 Watt
  }
  
  // --- ochrana aktualniho vykonu pred velkou hodnotou (>10kW)
  if (ram[21] > 10000){
  ram[21] = 1;
  }
  if (ram[22] > 10000){
  ram[22] = 1;
  }
  if (ram[23] > 10000){
  ram[23] = 1;
  }
  
 // vysledne hodnoty
  
 sys[496]= (sys[493]+sys[494]+sys[495]);       // zapis hodnoty z elmeru do 4.vstupu S0
 ram[20] = (sys[493]+sys[494]+sys[495]) /1000; // celkovy stav elmeru - jen cele kWh
 ram[24] = ram[21] + ram[22] + ram[23];        // celkovy odber ve 3 fazich (/10)

  if (ram[24] > 1)
  {
    ram[99] = 3600000 / ram[24];                // vypocet casu pulsu virtualniho elmeru
  }
  else
  {
    ram[99] = 3600000;    //1 Watt
  }
 }
// ****************************************************************
spotreba_hodiny           // pocita a uklada vzorky kazdou hodinu
{
// pouzite promenne ram
// ram[29] = hodnota 3faz za posledn9 hodinu
// ram[30] = hodnota 3faz za poslednich 24 hod
// temp  ram[50-73]

  
  // rotace hodnot pro vypocet spotreby 3f za poslednich  24hod
  // aktualizovano kazdou hodinu
  
  //ram[74] = ram[73];                   // 24 hod
  ram[73] = ram[72];
  ram[72] = ram[71];
  ram[71] = ram[70];
  ram[70] = ram[69];
  ram[69] = ram[68];
  ram[68] = ram[67];
  ram[67] = ram[66];
  ram[66] = ram[65];
  ram[65] = ram[64];
  ram[64] = ram[63];
  ram[63] = ram[62];
  ram[62] = ram[61];
  ram[61] = ram[60];
  ram[60] = ram[59];
  ram[59] = ram[58];
  ram[58] = ram[57];
  ram[57] = ram[56];
  ram[56] = ram[55];
  ram[55] = ram[54];
  ram[54] = ram[53];
  ram[53] = ram[52];
  ram[52] = ram[51];
  ram[51] = ram[50];
  ram[50] = sys[493]+sys[494]+sys[495];          //aktualni stav
 
  // ----- vypocet hodnoty spotreby za 24 hod-----
   if (ram[50] > ram[73]){
     ram[30] = ram[50] - ram[73];
   }
    else
    {
    ram[30] = 0;   // pokud je nesmyslna hodnota nebo neni naplneno
    }
    //---vypocet spotreby 3f za posledni hodinu-----------------------
    //if (ram[50] > ram[51]){
    //   ram[29] = ram[50] - ram[51];
    //}
    //else
    //{
    //    ram[29] =0;  // pokud je nesmyslna hodnota nebo neni naplneno
    //}
    // takhle by to stacilo - bude to jemnejsi ve 1/4hod intervalu
    // musi byt v 1/4hod 
    //ram[29] =   ram[26] + ram[27]+ ram[28];
//--------------

 echotime();                        // zapis cas
 echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' spotreba  24h: ',ram[30],' [Wh]',);
}
 //------------------------------------------------------------------------------
spotreba_minuty {          // uklada a pocita vzorky kazdou 1/4 hodinu
  // pouzite promenne ram
  // ram[26] = hodnota L1 za posledni hodinu
  // ram[27] = hodnota L2 za posledni hodinu
  // ram[28] = hodnota L3 za posledni hodinu
  // ram[29] = hodnota 3f za posledni hodinu
  // ram[80-83]   buffer posledni 1/4 hodiny  L1
  // ram[85-88]   buffer posledni 1/4 hodiny  L2
  // ram[90-93]   buffer posledni 1/4 hodiny  L3
  
 //nacteni hodnoty elmer L1 
 ram[83] = ram[82];        // posunu hodnotu - 4 x 1/4hod
 ram[82] = ram[81];
 ram[81] = ram[80];
 ram[80] = sys[493];       // ulozeni jako aktualni hodnota
 
 if (ram[80] > ram[83]) {
    ram[26] = ram[80] - ram[83];
    }
 else
 {
 ram[26] =0;   // pokud je nesmyslna hodnota nebo neni naplneno
 }
 //nacteni hodnoty elmer L2 
 ram[88] = ram[87];        // posunu hodnotu - 4 x 1/4hod
 ram[87] = ram[86];
 ram[86] = ram[85];
 ram[85] = sys[494];       // ulozeni jako aktualni hodnota
 
 if (ram[85] > ram[88]) {
    ram[27] = ram[85] - ram[88];
    }
 else
 {
 ram[27] =0;   // pokud je nesmyslna hodnota nebo neni naplneno
 }
 //nacteni hodnoty elmer L3 
 ram[93] = ram[92];        // posunu hodnotu - 4 x 1/4hod
 ram[92] = ram[91];
 ram[91] = ram[90];
 ram[90] = sys[495];       // ulozeni jako aktualni hodnota
 
 if (ram[90] > ram[93]) {
    ram[28] = ram[90] - ram[93];
    }
 else
 {
 ram[28] =0;   // pokud je nesmyslna hodnota nebo neni naplneno

 } 
    // 3-Fazovy  elektromer hodnota za posledni  hodinu
    ram[29] =   ram[26] + ram[27]+ ram[28]; 
 //-------------------------------------------

 echotime();                        // zapis cas
 echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' L1:',ram[26],' L2:',ram[27],' L3:',ram[28],' 3f:',ram[29],' [Wh].1/4 hod');
 echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' L1max:',ram[17],' L2max:',ram[18],' L3max:',ram[19],' 3fmax:',ram[16]);
}
//*******B o j l e r ****************

bojler {
// vypocitava ze 2 teplot dostupnou vodu v bojleru
// vystup je v ram[15] - litry vody
// temp je     ram[9]
// vstupy v sys[320]-dolni cidlo
//          sys[321]-horni cidlo


//vypocet prumeru
     ram[9]= sys[321] + sys[320];
     ram[9] = ram[9] / 200;
        

       // prumer je vic nez 40st
       if (ram[9] > 40){
           //ram[15] = ram[9] * 4;     //vysledek
           ram[15] = 100;
       }
       //prumer je mene nez 40st,ale horni je vice nez 40st
        if (ram[9] < 40){
           if(sys[321] > 4000){
                //ram[15] = (ram[9] * 4)/3;     //vysledek
                ram[15] = (ram[9] - 30)*10;
            }
       }
       
       if (ram[9] < 30){
          ram[15] = 1;  // je malo teploty
       }
       // horni teplota je mene nez 40st
       if(sys[321] < 4000){
        ram[15] = 0;
       }
       //prekroceni rozsahu,porucha cidla apod..
       if(sys[320] > 10000){
        ram[15] = 999;      //priznak poruchy
       }
       if(sys[321] > 10000){
        ram[15] = 999;
       }
     //ram[15] = sys[321] / 100;   //pro debug
     
}

// *******  startovaci procedury  **********
init
{
 echotime();
 echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' Start programu');

 sys[77]=0;  //http_get odpovet nechci do ram[]
 sys[78]=0;  //http_get odpovet nechci do ram[]
 _portal_timeout=1;     //odeslat data ihned

 // *******  uzivatelsky nastavitelne promenne  ***********


 
 // -------  init   -------
 // nastavi aktualni stav,aby po startu byla shoda
 
  thishour= 0;             // pocitadlo hodin reset
  thismin = 0;             // pocitadlo  1/4 hodin

  
  ram[50] = sys[493]+sys[494]+sys[495];         // posledni hod a 24 hod 3f celkovy elmer
  sys[496] = sys[493]+sys[494]+sys[495];        //zapis do pocitadla 4. vstupu S0
  //ram[74] = ram[50];
  ram[73] = ram[50];
  ram[72] = ram[50];
  ram[71] = ram[50];
  ram[70] = ram[50];
  ram[69] = ram[50];
  ram[68] = ram[50];
  ram[67] = ram[50];
  ram[66] = ram[50];
  ram[65] = ram[50];
  ram[64] = ram[50];
  ram[63] = ram[50];
  ram[62] = ram[50];
  ram[61] = ram[50];
  ram[60] = ram[50];
  ram[59] = ram[50];
  ram[58] = ram[50];
  ram[57] = ram[50];
  ram[56] = ram[50];
  ram[55] = ram[50];
  ram[54] = ram[50];
  ram[53] = ram[50];
  ram[52] = ram[50];
  ram[51] = ram[50];

  spotreba_hodiny();
  
  //-- 1/4 hod ------
  ram[80] = sys[493];
  ram[81] = ram[80];
  ram[82] = ram[80];
  ram[83] = ram[80];
  
  ram[85] = sys[494];
  ram[86] = ram[85];
  ram[87] = ram[85];
  ram[88] = ram[85];
  
  ram[90] = sys[495];
  ram[91] = ram[90];
  ram[92] = ram[90];
  ram[93] = ram[90];
  
  spotreba_minuty();
  
  ram[99] = 3600000;    //1 Watt
  
  ram[16] = 0;      //max hodnota 3f
  ram[17] = 0;     // max hodnota L1
  ram[18] = 0;     // max hodnota L2
  ram[19] = 0;     // max hodnota L3
  
  ram[95] = 3600000;     // max odber ve 1/4hodine L1
  ram[96] = 3600000;     // max odber ve 1/4hodine L2
  ram[97] = 3600000;     // max odber ve 1/4hodine L3
  ram[98] = 3600000;     // max odber ve 1/4hodine 3f
  
  ram[13] = 50;   // min teplota
  ram[14] = -25;  //max teplota
}
//------------------------------------------------------------------------------------------
main
{
 //odeslani dat na portal v nastaveny interval ---------------------
 if (_portal_timeout>0 && _portal_timeout<sys[3]) portal_nastav();
 if (_portal_dns==0) portal_dns();
 if (_portal_dns!=0 && _portal_data>0) odesli_data_na_portal();

 // -------  volani vlastnich procedur sem  -------
 
 
  bojler();   // vypocet mnozstvi vody v bojleru (a 40st C)
 
  
  virtualni_elektromer_3f();  // vypocet virtualniho 3f elektromeru,
 
  wait(1500);
  
 if (sys[9]==0 && thishour!=sys[8]){  // v kazde hodine v nulte minute sejme vzorek spotreby
    spotreba_hodiny();
    thishour = sys[8];
 }
 
 if (sys[9]==0 ||sys[9]==15 || sys[9]==30 ||sys[9]==45 ){  // v kazde ctvrthodine sejme vzorek spotreby
   
    if(thismin!=sys[9]){
       spotreba_minuty();   //kazdou 1/4 hodinu ulozi vzorek
        thismin = sys[9];
    } 
 }
 // test na nejvyssi hodnotu odberu L1
 if (ram[21] > ram[17] ){
    ram[17] = ram[21];
 }
  // test na nejvyssi hodnotu odberu L2
 if (ram[22] > ram[18] ){
    ram[18] = ram[22];
 } 
 // test na nejvyssi hodnotu odberu L3
 if (ram[23] > ram[19] ){
    ram[19] = ram[23];
 }
 // test na nejvyssi hodnotu odberu 3faz
 if (ram[24] > ram[16] ){
    ram[16] = ram[24];
 }
 // nejvyssi odber ve 1/4 hod -  nejnizsi hodnota casu mezi pulsy
 // posila se misto AktualnihoVykonu na portal
 
    if (sys[592] < ram[95] && sys[592] > 1){
       ram[95] = sys[592];       // L1
    }
    if (sys[593] < ram[96] && sys[593] > 1){
       ram[96] = sys[593];       // L2
    }
    if (sys[594] < ram[97] && sys[594] > 1){
       ram[97] = sys[594];       // L3
    }
    if (ram[99] < ram[98] && ram[99] > 1){
       ram[98] = ram[99];       // 3faz
    }
    
    // zjistovani min a max teploty venkovni
    // venkovni = sys[310]
    if (sys[310]/100 > ram[14] && sys[310]/100 < 80){
       ram[14] = sys[310]/100;
     }
    if (sys[310]/100 < ram[13] && sys[310]/100 < 80){
       ram[13] = sys[310]/100;
    }
   // reset min a max teplot
   if (sys[149] == 2 ){
   ram[13] = 50;   // min teplota
   ram[14] = -25;  //max teplota
   sys[149] = 0;
   }
    
 // RESET HODNOT MAX VYKONU
 if (sys[149] == 1 ){
    ram[16] = 1;
    ram[17] = 1;
    ram[18] = 1;
    ram[19] = 1;
    sys[149] = 0;
    echotime();   // vypis na konzoli
    echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5], ' reset max hodnot');
 }
 
} //-------------------- main end ----------------------------------------------------------------

HTML stranka (user.html)  nejak takto:

<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml">

 <head>
  <TITLE>SDS-MICROWEB</TITLE>
  <META content="text/html; charset=windows-1250" http-equiv=Content-Type>
  <META content="honza" name=author>
  <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
  <META HTTP-EQUIV="EXPIRES" CONTENT="0">
  <STYLE title=currentStyle type=text/css media=screen>
   body {
    font-family:arial ,verdana, sans-serif;
    font-size:22px;
    word-wrap:break-word;
    background:#000;
    max-width: 900px;
    min-width: 800px; 
    margin: 0px auto;
    }


   .content {padding:10px;}

   h1 {font-size:30px; margin:0; padding:10px; color:#fff;}
   h2 {font-size:18px; margin:0; padding:10px; color:#ddd;}
   h3 {font-size:12px; margin:0; padding:10px;}


   label {
    clear:left; display:block; float:left;
    width:125px; text-align:left; padding-right:5px; color:#ff0;
    margin: 2px 0px 5px 0px; line-height:1.1em; font-style:normal;
    xbackground:#aa0;
   }
   .dataM {
    xclear:left; xdisplay:block; float:right;
    width:110px; text-align:right; color:black;
    xline-height:0.5em; font-style:normal;
    xbackground:#aaa; margin: -2px 0px 5px 0px;
   }
   .data {
    xclear:left; xdisplay:block; float:right;
    width:110px; text-align:right; color:black;
    xline-height:1.1em; font-style:normal;
    xbackground:#aaa; margin: -2px 0px 1px 0px;
   }
    .data2 {
    xclear:left; xdisplay:block; float:right;
    width:125px; text-align:right; color:white;
    xline-height:1.1em; font-style:normal;
    xbackground:grey; margin: -2px 0px 5px 0px;
    background:grey;
   }
   .dataB {
    xclear:left; xdisplay:block; float:right;
    width:160px; text-align:right; color:black;
    xline-height:2em; font-style:bold;font-size:38px;
    xbackground:grey; margin: -2px 0px 5px 0px;
    
   }
   
  </STYLE>
<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;margin: 0px auto;table-layout: fixed;}
.tg td{font-family:Arial, sans-serif;font-size:24px;padding:6px 3px;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;}
.tg th{font-family:Arial, sans-serif;font-size:20px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:3px;overflow:hidden;word-break:normal;}
</style>
 

  
 <script type="text/javascript">
  var t;
  var req=false;
  var reqTemp =null;
  var boolNames =true;
  var timeout = 2000
  
  
  function reqComplete(){
   if(req.readyState == 4){
    if(req.status == 200){
     var rE=req.responseText.split("|");
     document.getElementById("AD0").innerHTML=rE[11];
     document.getElementById("AD1").innerHTML=rE[12];
      if(rE[10]=='bez senzorů'){
      document.getElementById("pocetcidel").innerHTML=rE[10];
      
     } else {
      var rACU=rE[10].split(" ");
      document.getElementById("pocetcidel").innerHTML=((rACU.length-1)/2)+" &nbsp;(16)";
     }

     var xx;
     xx=((5*(59 - 30*((3/1024)*rE[9])))/2);
     xx=xx.toFixed(1);
     document.getElementById("SoC").innerHTML=xx+" &deg;C";
    }
   }
  }

   
      function fceCidla(){
       if(reqTemp.readyState == 4 && reqTemp.status == 200){
           if(reqTemp.responseText != ''){
             var cidlaTeploty = reqTemp.responseText.split("|");
             for(i = 1; i <= cidlaTeploty.length; i++){
                 objTemp = document.getElementById('temp' + i);
                 pom = cidlaTeploty[i-1] / 100;
                    if(pom > 200){
                    objTemp.innerHTML = '-';
                    pom=0;
                    }else{
                      //objTemp.innerHTML = pom.toFixed(2) + " °C";
                      objTemp.innerHTML = pom.toFixed(1) + " °C";
                    }
                   }
              }
          }
        }

  var reqE=false;
  function reqCompleteE(){
   if(reqE.readyState == 4){
    if(reqE.status == 200){
     var rE=reqE.responseText.split("|");
     document.getElementById("vykon").innerHTML=rE[8];
     document.getElementById("vykon2").innerHTML=rE[15];
     document.getElementById("vykon3").innerHTML=rE[22];

    }
   }
  }
  var reqE2=false;
  function reqCompleteE2(){
      if(reqE2.readyState == 4 && reqE2.status == 200){
         
             var rE2 = reqE2.responseText.split("|");
              document.getElementById("tmin").innerHTML=rE2[3] ;
              document.getElementById("tmax").innerHTML=rE2[4] ;
              document.getElementById("bojlitr").innerHTML=rE2[5] +" %";
              document.getElementById("maxL1").innerHTML=rE2[7] +" W";
              document.getElementById("maxL2").innerHTML=rE2[8] +" W";
              document.getElementById("maxL3").innerHTML=rE2[9] +" W";
              document.getElementById("max3f").innerHTML=rE2[6] +" W";
             
              document.getElementById("suma2").innerHTML=rE2[14]/1000 +" kW";
              document.getElementById("hodL1").innerHTML=rE2[16] +" Wh";
              document.getElementById("hodL2").innerHTML=rE2[17] +" Wh";
              document.getElementById("hodL3").innerHTML=rE2[18] +" Wh";
              document.getElementById("hodLV").innerHTML=rE2[19] +" Wh";
              document.getElementById("hod24").innerHTML=rE2[20] +" Wh";
      }
  }
 
  function sdsps(){
   req=false;
   regE=false;
   reqE2=false;
   reqTemp=false;
  
   
   if(window.XMLHttpRequest){
    reqTemp = new XMLHttpRequest();
    req=new XMLHttpRequest();
    reqE=new XMLHttpRequest();
    reqE2=new XMLHttpRequest();
   }
   else if (window.ActiveXObject){
    reqTemp = new ActiveXObject("Microsoft.XMLHTTP");
    req=new ActiveXObject("Microsoft.XMLHTTP");
    reqE=new ActiveXObject("Microsoft.XMLHTTP");
    reqE2=new ActiveXObject("Microsoft.XMLHTTP");
   }
   if (req){
    req.open("GET", "cgi_dys?rand="+Math.random(), true);
    req.onreadystatechange = reqComplete;
    req.send(null);
   }
   if (reqE){
    reqE.open("GET", "cgi_dyeA?rand="+Math.random(), true);
    reqE.onreadystatechange = reqCompleteE;
    reqE.send(null);
   }
   if(reqE2){
     reqE2.open("GET", "get_ram[10]?rn=21&rand="+Math.random(), true)
     reqE2.onreadystatechange = reqCompleteE2;
     reqE2.send(null);
    }
    
    if(reqTemp){
     reqTemp.open("GET", "get_sys[310]?rn=16&rand="+Math.random(), true);
     reqTemp.onreadystatechange = fceCidla;
     reqTemp.send(null);
    }
   t=setTimeout("sdsps()",timeout);
  };


  

 
  </script>
  <script language="JavaScript">
   <!--
    function DispStb(msgStr) {
     status=msgStr;
     document.RetVal=true;
    }
   //-->
  </script>
 </head>

<body onLoad="sdsps();">


<div>
 










<table   class="tg">
  <tr>  <!-- toto je prvni bunka venkovni teplota-->
    <td  bgcolor = LimeGreen ; valign="top" ; rowspan="2">
     <table >
        <tr><td  width = 20>  <td rowspan=2 ; valign = "top"> <label  class=dataB id="temp1">-0.0°C</label>
        <tr><td> 
        <tr><td colspan = 2>&nbsp&nbsp&nbspvenkovní&nbspteplota&nbsp
      </table>
     
      <table  title="min a max teplota" ; style="color: DimGray" >
        <tr><td  style ="font-size:18px">min: <td width = 40><div style ="font-size:18px" id="tmin"  </div> <td style ="font-size:18px">&nbsp max:<td width = 40><div style ="font-size:18px" id="tmax" </div>
      </table>
      <hr>
    </td>
    <!-- toto je druha bunka  vsechny hlavni mistnosti-->
    <td bgcolor = Silver ; width = 300  ; valign="top" ; rowspan="3">
      <table >
        <tr><td width = 110> obyvák<td><label class=data id="temp6">0.00 °C</label>
        <tr><td> jídelna<td><label class=data id="temp3">0.00 °C</label>
        <tr><td> 
        <tr><td> honzík<td><label class=data id="temp7">0.00 °C</label>
        <tr><td> tánička<td><label class=data id="temp4">0.00 °C</label>
        <tr><td> ložnice<td><label class=data id="temp5">0.00 °C</label>
        <tr><td> 
        <tr><td>půda_izo <td><label class=data id="temp8">0.00 °C</label>
        <tr><td> router<td><label class=data id="temp2">0.00 °C</label>
        <tr><td> základy<td><label class=data id="temp9" >0.00 °C</label>
        <tr><td> 
        <tr><td> 
        <tr><td >topení<td><label class=data id="temp10" >0.00 °C</label>
      </table>
    </td>
    <!-- toto je treti bunka  prikon celkovy -->
    <td bgcolor = DeepSkyBlue ; width = 300 ; valign="top" ; rowspan="2">
    <table >
        <tr><td width = 110> příkon&nbsp&nbsp<td> <label class=data2 id="suma2">0.000 kW</label>
        <tr><td> max  <td><label class=data id="max3f">0000 W</label>
        <tr><td> hod <td><label class=data id="hodLV">0000 Wh</label>
        <tr><td> 24hod <td nowrap><label class=data id="hod24">00000 Wh</label>
    </table>
    </td>
    <!-- toto je ctvrta bunka prikon L1 -->
    <td bgcolor = DeepSkyBlue ; width = 350;>
    <table >
        <tr><td width = 110 > příkon&nbspL1 <td><label class=data2 id="vykon">0.000 kW</label>
        <tr><td> max<td><label class=data id="maxL1">0000 W</label>
        <tr><td> hod <td><label class=data id="hodL1">0000 Wh</label>
    </table>
    </td>
  </tr> <!-- toto je konec prvni rady bunek -->

  <tr> <!-- toto je prava stredni bunka  prikon L2-->
    <td bgcolor = DeepSkyBlue ; width = 300 ; valign="middle">
      <table >
        <tr><td width = 110> příkon&nbspL2 <td><label class=data2 id="vykon2">0.000 kW</label>
        <tr><td> max<td><label class=data id="maxL2">0000 W</label>
        <tr><td> hod <td><label class=data id="hodL2">0.000 Wh</label>
      </table>
    </td>
  </tr>
  <tr>  <!-- toto je leva spodni bunka  info -->
    <td bgcolor = SteelBlue ; title ="SDS info" ; width = 300 >
      <table >
        <tr><td width = 110 ; style ="font-size:18px" >napájeni<td><label class=data style ="font-size:18px" id="AD0">0.000 V</label>
        <tr><td style ="font-size:18px">1-wire  <td><label class=data style ="font-size:18px" id="AD1">0.000 V</label>
        <tr><td style ="font-size:18px">čidla  <td><label class=data style ="font-size:18px" id="pocetcidel">0 (max16)</label>
        <tr><td style ="font-size:18px">tempSDS  <td><label class=data style ="font-size:18px" id="SoC">0.00 °C</label>  
      </table>
    </td> 
    <!-- toto je 3 spodni bunka  topeni-bojler-->
    <td bgcolor = DodgerBlue ; width = 300 ; valign="bottom" >
    <table >
        <tr><td>bojler&nbsp<td><label class=data id="temp12" >0.00 °C</label>
        <tr><td> <td><label class=data style ="font-size:18px" id="temp11" >0.00 °C</label>   
        <tr><td>TUV<td><label class=data id="bojlitr" >100 %</label>
        <tr><td>
    </table>
    </td>
    <!-- toto je 4 spodni bunka  prikon L3-->
    <td bgcolor = DeepSkyBlue ; width = 300 ; valign="bottom" >
      <table >
        <tr><td width = 110> příkon&nbspL3 <td><label class=data2 id="vykon3">0.000 kW</label>
        <tr><td> max<td><label class=data id="maxL3">0000 W</label>
        <tr><td> hod <td><label class=data id="hodL3">0000 Wh</label>
        <tr><td>
      </table>
    </td>
  </tr>
</table>



  
</div> 




</body>

</html>

Re: malé měření elektro

Krásné,kéž bych to dotáhl také tak daleko ..
Myslím si,že každá takováto instalace stojí za pochlubení.
Škoda,že v mém okolí nemá nikoho,s kým bych mohl toto rozvíjet sad

5

Re: malé měření elektro

Jaký důvod má to měření teploty v bojleru průměrem dvou teplot a výpočtem procent?

nějaké ukázky kódu zde: http://forum.merenienergie.cz//viewtopic.php?id=552

6

Re: malé měření elektro

sidbin napsal:

Jaký důvod má to měření teploty v bojleru průměrem dvou teplot a výpočtem procent?


ma to zjednodusit odhad  zbytku teple vody v bojleru. V mem pripade  bojler ma 160 l a zobrazeni v litrech nebylo dobre chapano.hlavni duvod  vzniku mereni byl , ze pri nabijeni sluncem neni jiste kolik tam je teple vody. (obcas slunicko prestane v pulce prace ..)

jsou to dve cidla - jedno uplne nahore a druhe cca v 1/3 vysky. celkem to "meri " dobre :-)  (empiricky jsem to "nastavil" vypoctem tak,aby 0 byla drive nez studena voda...)

7

Re: malé měření elektro

Aha zajímavý nápad. libi se mi.

Já mám 250L a taktéž solár. V bojleru jsou tři čidla (dvě v jímce u výměníků solár a plyn, jedno jsem nahradil místo teploměru).
Jsou ve výškách 25,81,91cm a jedu podle vrstvení vody. Teď mám například rozdíl teplot ve vrstvách 36°C. Toho průměru bych tedy nedosáhl, ikdyž vím, že je tam vody dost.

nějaké ukázky kódu zde: http://forum.merenienergie.cz//viewtopic.php?id=552