#! /usr/bin/perl
use Net::FTP;
use IO::Socket::INET;

# flush after every write
$| = 1;



my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,
    $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
$sek = $Sekunden;
my $CTIME_String = localtime(time);

$Monat+=1;
$Jahrestag+=1;
$Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat;
$Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag;
$Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden;
$Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
$Sekunden = $Sekunden < 10 ? $Sekunden = "0".$Sekunden : $Sekunden;
$Jahr+=1900;
my @Wochentage = ("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
my @Monatsnamen = ("","Januar","Februar","M&auml;rz","April","Mai","Juni",
           "Juli","August","September","Oktober","November","Dezember");


sub hex2bin {
        my $h = shift;
        my $hlen = length($h);
        my $blen = $hlen * 4;
        return unpack("B$blen", pack("H$hlen", $h));
}

$/ = '';

%h2b = (0 => "0000",
1 => "0001", 2 => "0010", 3 => "0011",
4 => "0100", 5 => "0101", 6 => "0110",
7 => "0111", 8 => "1000", 9 => "1001",
a => "1010", b => "1011", c => "1100",
d => "1101", e => "1110", f => "1111",
A => "1010", B => "1011", C => "1100",
D => "1101", E => "1110", F => "1111",
);

$PumpeHK1="aus";
$PumpeBoiler="aus";
$Stoerung="false";
$FB_HK1="none";

open ($fd, "< /dev/ttyAMA0") or die "cannot open serial port";

while(getc($fd) ne "\n"){} #erste Zeile verwerfen

print $fd

$c= "";
$output = "";
while($c ne "\n") {
  $c = getc($fd);
  $output = $output.$c;
}              #die zweite Zeile ist komplett


print "\n";
print "Daten von: $Stunden.$Minuten:$Sekunden Uhr\n";

my @new=split(/ /,$output);
 if ($new[1]=="0") { print "Status "."$new[1]".": Heizung aus\n";}
 if ($new[1]=="1") { print "Status "."$new[1]".": Nachfllen in x Minuten\n";}
 if ($new[1]=="2") { print "Status "."$new[1]".": Pellets nachfün";}
 if ($new[1]=="3") { print "Status "."$new[1]".": Rost check\n";}
 if ($new[1]=="4") { print "Status "."$new[1]".": Zuendung Start\n";}
 if ($new[1]=="6") { print "Status "."$new[1]".": Zuendung Einschub\n";}
 if ($new[1]=="7") { print "Status "."$new[1]".": Zuendung Pause\n";}
 if ($new[1]=="8") { print "Status "."$new[1]".": Zuendung Reduziert\n";}
 if ($new[1]=="9") { print "Status "."$new[1]".": Leistungsbrand\n";}
 if ($new[1]=="10") { print "Status "."$new[1]".": Gluterhaltung\n";}
 if ($new[1]=="12") { print "Status "."$new[1]".": Entaschung Geblaese\n";}
 if ($new[1]=="13") { print "Status "."$new[1]".": Rost auf\n";}
 print "Kessel: "."$new[3]"."°\n";
 print "Aussentemp: "."$new[5]"."°\n";
 print "Heizkreis1 ist: "."$new[7]"."°\n";
 print "Heizkreis1 soll: "."$new[9]"."°\n";
 print "Boiler: "."$new[11]"."°\n";
 print "Raum soll: "."$new[15]"."°\n";
 print "Foerderrat: "."$new[13]"."%\n";

# Daten in rrd Datenbank abspeichern
my $update="rrdtool update spiel.rrd "."N:"."$new[3]".":"."$new[5]".":"."$new[7]".":"."$new[9]".":"."$new[11]".":"."$new[13]\n";
qx ($update);
print "$update";



($binary50 = $new[50]) =~ s/(.)/$h2b{lc $1}/g;
($binary51 = $new[51]) =~ s/(.)/$h2b{lc $1}/g;
($binary52 = $new[52]) =~ s/(.)/$h2b{lc $1}/g;
($binary53 = $new[53]) =~ s/(.)/$h2b{lc $1}/g;
($binary54 = $new[54]) =~ s/(.)/$h2b{lc $1}/g;
($binary55 = $new[55]) =~ s/(.)/$h2b{lc $1}/g;

print "\n";

print "Digitalwert 1 (51)\n";
if ($binary51 & 0b00000001) {print "Mischer 1 zu\n";}
if ($binary51 & 0b00000010) {print "Mischer 1 auf\n";}
if ($binary51 & 0b00000100) {print "Mischer 2 zu\n";}
if ($binary51 & 0b00001000) {print "Mischer 2 auf\n";}
if ($binary51 & 0b00010000) {print "Pumpe HK1 an\n";$PumpeHK1="an";}
if ($binary51 & 0b00100000) {print "Pumpe HK2 an\n";}
if ($binary51 & 0b01000000) {print "Pumpe Boiler 1 an\n";$PumpeBoiler="an";}
if ($binary51 & 0b10000000) {print "Stoerung !!!\n";$Stoerung="true";}
print "\n";

print "Digitalwert 2 (52)\n";
if ($binary52 & 0b00000001) {print "Pufferladepumpe\n";}
if ($binary52 & 0b00000010) {print "Pumpe Boiler 2 an\n";}
if ($binary52 & 0b00000100) {print "Raumaustragung vor\n";}
if ($binary52 & 0b00001000) {print "Raumaustragung rueck\n";}
if ($binary52 & 0b00100000) {print "Zuendung Heizung\n";}
if ($binary52 & 0b01000000) {print "Pellets Sauger an\n";}
if ($binary52 & 0b10000000) {print "Lambdaheizung\n";}
print "\n";

print "Digitalwert 3 (53)\n";
if ($binary53 & 0b00000001) {print "Putzeinrichtung Freigabe\n";}
if ($binary53 & 0b00000010) {print "Putzeinrichtung ein\n";}
if ($binary53 & 0b00000100) {print "Schiebrost ein\n";}
if ($binary53 & 0b00001000) {print "Schiebrost rueck\n";}
if ($binary53 & 0b00010000) {print "Zuendung Geblaese\n";}
if ($binary53 & 0b00100000) {print "Einschubschnecke rueck\n";}
if ($binary53 & 0b01000000) {print "Einschubschnecke ein\n";}
print "\n";

print "Digitalwert 4 (54)\n";
if ($binary54 & 0b00000010) {print "Fuellstand\n";}
if ($binary54 & 0b00010000) {print "Saugzuggeblaese\n";}
print "\n";

print "Digitalwert 5 (55)\n";
if ($binary55 & 0b00000001) {print "Fernbedienung HK1 Uhr\n";$FB_HK1="nein";}
if ($binary55 & 0b00000010) {print "Fernbedienung HK1 Tag\n";$FB_HK1="Tagabsenkung";}
if ($binary55 & 0b00000100) {print "Fernbedienung HK1 Nacht\n";$FB_HK1="Nachtabsenkung";}
if ($binary55 & 0b01000000) {print "HK Ventil\n";}
print "\n";

print "$PumpeHK1"."\n";
print "$PumpeBoiler"."\n";
print "$Stoerung"."\n";
if ($Stoerung eq "true") {qx (python Mail.py Stoerung kritisch);}

# Grafik generieren
my $Befehl1="rrdtool graph "."$Jahr"."$Monat"."$Monatstag".".png --start end-24h --title \""."$Monatstag".". "."$Monatsnamen[$Monat]"." "."$Jahr"."\" ";
my $Befehl2=" --width 800 --height 200 --right-axis 1:0 HRULE:50#B0B0B0 HRULE:60#B0B0B0 DEF:kessel=spiel.rrd:kessel:AVERAGE DEF:boiler=spiel.rrd:boiler:AVERAGE DEF:aussen=spiel.rrd:aussen:AVERAGE VDEF:max=aussen,MAXIMUM VDEF:min=aussen,MINIMUM DEF:hk1ist=spiel.rrd:hk1ist:AVERAGE DEF:hk1soll=spiel.rrd:hk1soll:AVERAGE DEF:foerder=spiel.rrd:foerder:AVERAGE ";
my $Befehl3="AREA:foerder#FFDEAD:\"Foerderrate\" LINE1:hk1soll#800000:\"Heizkreis 1 soll\" LINE2:kessel#000000:\"Kesseltemp\" LINE2:boiler#FF0000:\"Boilertemp\" LINE2:hk1ist#00FF00:\"Heizkreis 1 ist\" LINE2:aussen#00FFFF:\"Aussentemp\" GPRINT:min:\"Min %2.1lf°\" GPRINT:max:\"Max %2.1lf°\"  \n";
my $Befehl="$Befehl1"."$Befehl2"."$Befehl3";
qx ($Befehl);

print "\nBefehl ausgefuehrt";

my $Tagesdatei="$Jahr"."$Monat"."$Monatstag".".png";
print "\n$Tagesdatei";


#  Daten im LAN verteilen 
$socket = new IO::Socket::INET (
PeerAddr   => '192.168.2.82:50000',         #Ip@ von zweitem Paspberry
Proto        => 'udp'
) or die "ERROR in Socket Creation : $!\n";
#send operation
#data = "data from client";
$socket->send($new[1]." ".$new[3]." ".$new[5]." ".$new[7]." ".$new[9]." ".$new[11]." ".$new[13]);

sleep(2);
$socket->close();


open (TXT, ">status.html");
print TXT "<Content-Type: Text/html; charset=iso-8859-1>";
print TXT "<HTML>\n";
  print TXT "<HEAD><TITLE> Heizung Kesselstatus </TITLE>\n";
  print TXT "<meta http-equiv=\"refresh\" content=\"300\" /></HEAD>";

  if ($Stoerung eq "false") { print TXT "<BODY bgcolor=\"\#FFFFFF\"\>\n"};
  if ($Stoerung eq "true") { print TXT "<BODY bgcolor=\"\#FF0000\"\>\n"};
     print TXT "<H2>Kesselstatus $Stunden:$Minuten Uhr $Monatstag.$Monat.$Jahr</H2>\n";
      print TXT "<table border=\"0\"><span style=\"font-size:large\">";
      if ($new[1]=="0") { print TXT "<tr><td bgcolor=\"\#FFCCFF\">Status: <b>Heizung aus</b></td><td></td></tr>";}
      if ($new[1]=="1") { print TXT "<tr><td>Status "."$new[1]".": Nachfuellen in x Minuten</td><td></td></tr>";}
      if ($new[1]=="2") { print TXT "<tr><td>Status "."$new[1]".": Pellets nachfü/td><td></td></tr>";}
      if ($new[1]=="3") { print TXT "<tr><td>Status "."$new[1]".": Rost check</td><td></td></tr>";}
      if ($new[1]=="4") { print TXT "<tr><td>Status "."$new[1]".": Zuendung Start</td><td></td></tr>";}
      if ($new[1]=="6") { print TXT "<tr><td>Status "."$new[1]".": Zuendung Einschub</td><td></td></tr>";}
      if ($new[1]=="7") { print TXT "<tr><td>Status "."$new[1]".": Zuendung Pause</td><td></td></tr>";}
      if ($new[1]=="8") { print TXT "<tr><td>Status "."$new[1]".": Zuendung reduziert</td><td></td></tr>";}
      if ($new[1]=="9") { print TXT "<tr><td bgcolor=\"\#FF0000\">Status: <b>Leistungsbrand</b></td><td></td></tr>";}
      if ($new[1]=="10") { print TXT "<tr><td bgcolor=\"\#FF9900\">Status: <b>Gluterhaltung</b></td><td></td></tr>";}
      if ($new[1]=="12") { print TXT "<tr><td>Status "."$new[1]".": Entaschung Geblaese</td><td></td></tr>";}
      if ($new[1]=="13") { print TXT "<tr><td>Status "."$new[1]".": Rost auf</td><td></td></tr>";}

      print TXT "<tr><td>Kessel: "."$new[3]"."&#176;</td><td>Aussen: "."$new[5]"."&#176;</td><td>&nbsp;&nbsp;&nbsp;&nbsp;Heizkreis 1 Pumpe: "."$PumpeHK1"."</td></tr>";
      print TXT "<tr><td>HK1 ist: "."$new[7]"."&#176;</td><td>soll: "."$new[9]"."&#176;</td><td>&nbsp;&nbsp;&nbsp;&nbsp;Boiler Pumpe: "."$PumpeBoiler"."</td></tr>";
      print TXT "<tr><td>Boiler: "."$new[11]"."&#176;</td><td>Raum soll: "."$new[15]"."&#176;</td><td>&nbsp;&nbsp;&nbsp;&nbsp;Absenkung: "."$FB_HK1"."</td></tr>";
      print TXT "<tr><td>Foerder: "."$new[13]"."% </td><td><A HREF=\"calender.html\">Historie</A></td>";
      if ($Stoerung eq "true") { print TXT "<td bgcolor=\"\#FF0000\"><b>&nbsp;&nbsp;Stoerung !!!</b></td>";}
      print TXT "</tr>";
      print TXT "</span></table>";
      print TXT "<br>";
      print TXT "<br><br>";
      my $Tagesdatei="$Jahr"."$Monat"."$Monatstag".".png";
      print TXT "<img src=\""."$Tagesdatei". "\" alt=\"noch kein Bild vorhanden ;-(\"><br><br>";
      print TXT "<br>";
      my $wetter="w"."$Jahr"."$Monat"."$Monatstag".".png";
      print TXT "<img src=\""."$wetter". "\" alt=\"noch kein Bild vorhanden ;-(\"><br><br>";
     print TXT "<HR>\n";
     print TXT "&copy;&nbsp;&nbsp;<a href=\"mailto:pelletheizer\@404-not-found.de\">Juergen Armbruster<a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF=\"impressum.html\">Impressum</A>";
     print TXT "<HR>\n";
print TXT "</BODY></HTML>\n";
close TXT;

print "\nschreibe Datei auf Server ...";
$ftp = Net::FTP->new("ftp.xyz.de");   # Hier Deinen Host eingeben
die "Konnte keine Verbindung aufbauen $!" unless $ftp;
$ftp->login("user", password");       # Hier Benutzername und Password eingeben
$ftp->cwd("webseiten");               # cwd: Verzeichnis wechseln
$ftp->put("status.html");
$ftp->binary;
$ftp->put("$Tagesdatei");
$ftp->put("w"."$Tagesdatei");
$ftp->quit;
print "fertig \n";

close ($fd);



