// Program pro odesilani informaci na portal.merenienergie.cz
// Verze ze 14.02.2012 odstranuje chybu pri zasilani aktualniho vykonu
// Verze z  01.03.2012 odesila cas pro vypocet aktualniho vykonu. Akt.vykon je vypocitavan na strane serveru
//                     je pridan dalsi parametr pro zjisteni verze odesilajiciho sds-c programu
// Verze z  05.03.2012 casovy interval nastaven administratorem portalu dle pozadavku zakaznika
//                     timeout pro DNS resolve zkracen ze 45 na 30sek
// Verze z  02.02.2014 casovy interval nastaven napevno na 15min

//rele 2
#define RELEMENIC sys[232]
#define RELEMENIC_OVL sys[197]
#define RELEBOILER sys[231]
#define RELEBOILER_OVL sys[196]

#define BATTERYMIN 43000
#define BATTERYMAX 56000
#define BATTERYVOLT sys[434]
#define BATTERYAMP sys[433]
#define PVAMP sys[432]
#define TARIF sys[152]

#define POCITADLO_S1 sys[493]
#define POCITADLO_S2 sys[494]
#define POCITADLO_S3 sys[495]
#define POCITADLO_S1_KONST sys[559]
#define POCITADLO_S2_KONST sys[560]
#define POCITADLO_S3_KONST sys[561]

var battery_state; //1 empty, 2 almost empty, 3 almost full, 4 full, 5 normal
var battery_state_old;
var battery_voltage;
var battery_voltage_ma1;
var battery_voltage_ma2;
var battery_voltage_ma3;
var battery_voltage_ma4;

//flags
var tarif_flag;
var menicOUT;
var boilerOUT;
var email_last_5min;
var initFlag;

var second_last;


var temp;

//odesilani emailu o spotrebach
var S0_vstup_0, S0_vstup_1, S0_vstup_2;  
var S0_vstup_0_new, S0_vstup_1_new, S0_vstup_2_new;  
var S0_vstup_0_new_energy, S0_vstup_1_new_energy, S0_vstup_2_new_energy;  
var last_d, last_m, last_r;  
var spotreba_email_flag;

var _portal_vstup;    //index vstupu
var _portal_konst;    //prepoctova konst 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_vykonhod; //vykon za aktualni hodinu
 
var mez, odeslano;

portal_ad
{
 _portal_vstup=431;
 _portal_konst=436;
 _portal_ram=101;

 label portal_ad_1:
 //AD
 _portal_pom=sys[_portal_vstup]*100000/sys[_portal_konst];  //3205 jako 3.205v
 ram[_portal_ram]=_portal_pom;   //schovat akt.napeti

 _portal_vstup++;
 _portal_konst+=4;
 _portal_ram++;
 if (_portal_vstup<435) goto portal_ad_1;
}

odesli_data_na_portal
{
 _portal_data=1;
 dns_resolv('eportal.merenienergie.cz');
 sys[64] = 30;  //sekund
 
label cekam_na_dns:
 if (sys[64] == 0) {
  _portal_dns=0;
  goto odeslat;
 }
 if (sys[65] == 512) {
  _portal_dns=1;
  goto odeslat;
 }
 goto cekam_na_dns;

label odeslat:
 if (_portal_dns==0) {
  if (_portal_data==1) {
   http_get(77,93,211,207,'eportal.merenienergie.cz','/datas0.php?ver=1&devid=', 'x', '&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==4) {
   portal_ad();
   http_get(77,93,211,207,'eportal.merenienergie.cz','/dataad.php?ver=1&devid=', 'x', '&ad1=', ram[101], '&ad2=', ram[102], '&ad3=', ram[103], '&ad4=', ram[104]);
  }
 }
 if (_portal_dns==1) {
  if (_portal_data==1) {
   http_get(sys[66],sys[67],sys[68],sys[69],'eportal.merenienergie.cz','/datas0.php?ver=1&devid=', 'x', '&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==4) {
   portal_ad();
   http_get(sys[66],sys[67],sys[68],sys[69],'eportal.merenienergie.cz','/dataad.php?ver=1&devid=', 'x', '&ad1=', ram[101], '&ad2=', ram[102], '&ad3=', ram[103], '&ad4=', ram[104]);
  }
 }
 
 sys[64] = 30;  //sekund
 
label cekam_na_http_smycka:
 if (sys[64] == 0) goto chyba_www_serveru;
 if (sys[65] == 0) goto cekam_na_http_smycka;
 if ((sys[65] != 1024)||(sys[75] != 200)) goto chyba_www_serveru;
  if (_portal_data==1) {
   echo('S0 odeslano na server, OK.');
  }
  if (_portal_data==4) {
   echo('AD odeslano na server, OK.');
  }
 _portal_data++;
 if (_portal_data<=4) goto odeslat;
 
 return;
 
label chyba_www_serveru:
 echo('Chyba komunikace s www serverem, http: ', sys[75]);
}

init
{
 echo('Start programu. Email xxx@gmail.com');
 RELEMENIC_OVL = 2; //nastaveni pres sds C
 RELEMENIC = 0;
 menicOUT = 0;
 
 initFlag = 1;
 tarif_flag = 0;
 email_last_5min = 0;

 
 battery_state_old = 5;
 spotreba_email_flag = 0;
 
 battery_voltage_ma4 = 0;
 battery_voltage_ma3 = 0;
 battery_voltage_ma2 = 0;
 battery_voltage_ma1 = 0;
 
 //pockame 20 sekund, do te doby se chytne NTP
 //wait(20000); 
}

main
{
 if ((sys[9]==0 || sys[9]==15 || sys[9]==30 || sys[9]==45) && sys[10]==0){  
  odesli_data_na_portal();  
  wait(2000);
 }
 

    if (sys[8] == 21) {
      spotreba_email_flag = 0;
    }
    //poslat email o spotrebe o pulnoci
	if ( (spotreba_email_flag == 0) && (sys[8] == 20)) {
        spotreba_email_flag = 1;
		
		//spocitam rozdil mezi aktualnim stavem a puvodnim stavem  
		S0_vstup_0_new = POCITADLO_S1 - S0_vstup_0;  
		//S0_vstup_1_new = POCITADLO_S2 - S0_vstup_1;
		S0_vstup_2_new = POCITADLO_S3 - S0_vstup_2;

		//prevedeme na Wh  
		S0_vstup_0_new_energy = (S0_vstup_0_new) / (POCITADLO_S1_KONST/1000);
		//S0_vstup_1_new_energy = (S0_vstup_1_new) / (POCITADLO_S2_KONST/1000);
		S0_vstup_2_new_energy = (S0_vstup_2_new) / (POCITADLO_S3_KONST/1000);
		
		smtp_send('xxxx@gmail.com','Záznam energie',
		'Za dobu od: ',last_d,'.',last_m,'.',last_r,' 20:00 , do: ', sys[5], '.', sys[6], '.', sys[7], ' 20:00\n\n',
		'S0: MENIC:\n   impulsu = ',S0_vstup_0_new,',  energie = ',S0_vstup_0_new_energy,' Wh\n\n',
		//'S0: druhy vstup:\n   impulsu = ',S0_vstup_1_new,',  energie = ',S0_vstup_1_new_energy,' Wh\n\n',
		'S0: HLAVNI ELEKTROMER:\n   impulsu = ',S0_vstup_2_new,',  energie = ',S0_vstup_2_new_energy,' Wh\n\n');
        wait(2000);		
        smtp_send('xxxx2k@gmail.com','Zaznam energie',
		'Za dobu od: ',last_d,'.',last_m,'.',last_r,' 20:00 , do: ', sys[5], '.', sys[6], '.', sys[7], ' 20:00\n\n',
		'S0: MENIC:\n   impulsu = ',S0_vstup_0_new,',  energie = ',S0_vstup_0_new_energy,' Wh\n\n',
		//'S0: druhy vstup:\n   impulsu = ',S0_vstup_1_new,',  energie = ',S0_vstup_1_new_energy,' Wh\n\n',
		'S0: HLAVNI ELEKTROMER:\n   impulsu = ',S0_vstup_2_new,',  energie = ',S0_vstup_2_new_energy,' Wh\n\n');
		
        
		//zapiseme info na web  
		echo('archiv: poslan email (',sys[65],')');
        
		//zapisu si vstupni datum  
		last_d = sys[5]; last_m = sys[6]; last_r = sys[7]; 
		//zapisu si pocatecni hodnoty S0 pocitadel  
		S0_vstup_0 = POCITADLO_S1;  
		//S0_vstup_1 = POCITADLO_S2;
		S0_vstup_2 = POCITADLO_S3;
	}



    //do it every second
	if (sys[10] != second_last) {
		second_last = sys[10];
        email_last_5min = email_last_5min + 1;
		
		//moving average
	    battery_voltage = BATTERYVOLT*100000/sys[448];
	    battery_voltage_ma4 = battery_voltage_ma3;
	    battery_voltage_ma3 = battery_voltage_ma2;
	    battery_voltage_ma2 = battery_voltage_ma1;
	    battery_voltage_ma1 = battery_voltage;
	    //az se naplni buffer...
        if (battery_voltage_ma4 > 0) {
          battery_voltage = (battery_voltage + battery_voltage_ma1 + battery_voltage_ma2 + battery_voltage_ma3 + battery_voltage_ma4) / 5;
        }
	    if (initFlag >= 1) {
	      initFlag++;
	    }  
	    if (initFlag > 10) {
		  smtp_send('xxx@gmail.com', 'Boot SDS mikro', 'Baterie: ', battery_voltage);
		  echo('Counter initFlag: ',initFlag);
		  initFlag = 0;
        }

        //already init
		if (initFlag == 0) {
            if (battery_voltage < 55000) {
                if (menicOUT == 1) {
                  echo('Email sent, state 1 bylo prepnuto na sit cez', battery_voltage );
                  //temp = BATTERYAMP*1000/sys[448];
                  temp = (POCITADLO_S1) / (POCITADLO_S1_KONST/1000);
                  smtp_send('xxxx@gmail.com', 'Batterry EMPTY', 'bylo prepnuto na sit CEZ!\nNapeti: ', battery_voltage,'\nStav: ',temp, 'Wh');
                  wait(2000);
                }
                RELEMENIC_OVL = 2; //nastaveni pres sds C
                RELEMENIC = 0;
                menicOUT = 0;
                wait(500);
            }
            if ((battery_voltage > 60000) && (battery_voltage < 64000) ) {
                if (menicOUT == 0) {
                  echo('Email sent, bude zapnut ostrov', battery_voltage );
                  temp = (POCITADLO_S1) / (POCITADLO_S1_KONST/1000);
                  smtp_send('xxxx@gmail.com', 'Batterry FULL', 'bylo prepnuto na ostrov!\nNapeti: ', battery_voltage,'\nStav: ',temp, 'Wh');
                  wait(1000);
                }
                RELEMENIC_OVL = 2; //nastaveni pres sds C
                RELEMENIC = 1;
                menicOUT = 1;
            }
            if (battery_voltage < 55500) {
              if (boilerOUT == 1) {
              }
              boilerOUT = 0;
              RELEBOILER_OVL = 2; //nastaveni pres sds C
              RELEBOILER = 0;
            }
            if (battery_voltage > 62500) {
              if (boilerOUT == 0) {
              }
              boilerOUT = 1;
              RELEBOILER_OVL = 2; //nastaveni pres sds C
              RELEBOILER = 1;
            }
        }
	}
 
} //main
