#!/usr/bin/python
# -*- coding: latin-1 -*-

import cherrypy
import platform
import os, sys
import datetime
import FreeSolRaspi_Helper as fsh


# Softwareversion
Version= "0.95"
# 2.6.19 9:00

def ZeiAnz(Code, String):
    global Ergebnis_Start
    
    Anzeigen=True
    if len(Code)==0:
        Anzeigen=True
    else:
        if Code[0]=="0":
            Anzeigen=False
        else:
            Anzeigen=True
        Code=Code[1:]
    if Anzeigen:
        Ergebnis_Start+=String
    return Code

class Root:
    global Ergebnis_Start
    
    @cherrypy.expose
    def index(self):
        global Ergebnis_Start
        
        heute=datetime.date.today() # - datetime.timedelta(days=2) #Starttag für Debugzewecke ändern
        Plattform=fsh.Plattform_Konfiguration()
        Konfiguration=fsh.Konfiguration_verwalten()
        ZeitpunktLetztes, PGesamtLetzes, PGesamtHeute, ZeitpunktMax, PMax, PGesamtGestern, ZeitpunktMaxGestern, PMaxGestern, LetzterZeitpunkt, LetzterMesswert = fsh.AktuelleSolarleistung()
        tagdatum=heute.strftime('%y%m%d')
        tagwrdatum=heute.strftime('%Y-%m-%d')
        tagwrdatumgestern=(heute - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
        monatdatum=heute.strftime('%y%m')
        jahrdatum=heute.strftime('%y')
        aktuellerzeitpunkt=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        Bezugheute, Einspeisheute, Bezuggestern, Einspeisgestern, LetzterBezug, LetzteEinspeis, ZeitpunktLetzterBezEinsp=fsh.AktuellerBezugEinspeisung()
        BezugStand, EinspeisStand, ZeitpunktLetzterBezEinsp = fsh.AktuelleZählerständeSML()
        s= u"""<html> 
<head> 
<title>FreeSol Raspi</title>
</head> 
<html> 
<body>
<h1>FreeSol Raspi: Daten Solaranlage</h1>"""
        
        s= s+ "<table> "
        Code=Konfiguration.Konfiguration['Anzeige_Startseite']
        Ergebnis_Start=""
        Code= ZeiAnz(Code, "<tr> <td><b>Solarenergie erzeugt heute ("+tagwrdatum+"):</b></td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(float(PGesamtHeute)/1000.0,2)) +" kWh</td> </tr> ")  
        if Konfiguration.Konfiguration['USB_PortNr_SML']!="" and Konfiguration.Konfiguration['OBIS_Bezug']!="" and Konfiguration.Konfiguration['OBIS_Einspeisung']!="":
            Code= ZeiAnz(Code, "<tr> <td>Bezug heute:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(Bezugheute,2)) +" kWh</td> </tr> ")
            Code= ZeiAnz(Code, "<tr> <td>Einspeisung heute:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(Einspeisheute,2)) +" kWh</td> </tr> ")
            Code= ZeiAnz(Code, "<tr> <td>Verbrauch heute:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(Bezugheute,2)-round(Einspeisheute,2)+round(float(PGesamtHeute)/1000.0,2)) +" kWh</td> </tr> ")
            Code= ZeiAnz(Code, "<tr> <td>Eigenverbrauch heute:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(float(PGesamtHeute)/1000.0,2)-round(Einspeisheute,2)) +" kWh</td> </tr> ")
        Code= ZeiAnz(Code, "<tr> <td>Zeitpunkt maximale Solarleistung heute:</td> <td  ALIGN=RIGHT>" + ZeitpunktMax + "</td> </tr> ")
        Code= ZeiAnz(Code, "<tr> <td>Maximale Solarleistung heute:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(float(PMax)/1000.0,2)) +" kW</td> </tr> ")
        Ergebnis_Start+= "<tr> <td> </td> <td> </td> </tr> "
        Code= ZeiAnz(Code, "<tr> <td><b>Solarenergie erzeugt gestern ("+ZeitpunktMaxGestern[0:10]+"):</b></td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(float(PGesamtGestern)/1000.0,2)) +" kWh</td> </tr> ")
        if Konfiguration.Konfiguration['USB_PortNr_SML']!="" and Konfiguration.Konfiguration['OBIS_Bezug']!="" and Konfiguration.Konfiguration['OBIS_Einspeisung']!="":
            Code= ZeiAnz(Code, "<tr> <td>Bezug gestern:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(Bezuggestern,2)) +" kWh</td> </tr> ")
            Code= ZeiAnz(Code, "<tr> <td>Einspeisung gestern:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(Einspeisgestern,2)) +" kWh</td> </tr> ")
            Code= ZeiAnz(Code, "<tr> <td>Verbrauch gestern:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(Bezuggestern,2)-round(Einspeisgestern,2)+round(float(PGesamtGestern)/1000.0,2)) +" kWh</td> </tr> ")
            Code= ZeiAnz(Code, "<tr> <td>Eigenverbrauch gestern:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(float(PGesamtGestern)/1000.0,2)-round(Einspeisgestern,2)) +" kWh</td> </tr> ")
        Code= ZeiAnz(Code, "<tr> <td>Zeitpunkt maximale Solarleistung gestern:</td> <td  ALIGN=RIGHT>" + ZeitpunktMaxGestern + "</td> </tr> ")
        Code= ZeiAnz(Code, "<tr> <td>Maximale Solarleistung gestern:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(float(PMaxGestern)/1000.0,2)) +" kW</td> </tr> ")
        Ergebnis_Start+= "<tr> <td> </td> <td> </td> </tr> "
        Code= ZeiAnz(Code, "<tr> <td><b>Zeitpunkt letzter Solarmesswert:</b></td> <td  ALIGN=RIGHT>" +ZeitpunktLetztes[0:19] +"</td> </tr> ")
        Code=ZeiAnz(Code,  "<tr> <td>Letzter Messwert Solarleistung:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(float(PGesamtLetzes)/1000.0,2)) +" kW</td> </tr> ")
        Ergebnis_Start+= "<tr> <td> </td> <td> </td> </tr> "
        if Konfiguration.Konfiguration['USB_PortNr_SML']!="" and Konfiguration.Konfiguration['OBIS_Bezug']!="" and Konfiguration.Konfiguration['OBIS_Einspeisung']!="":
            Code= ZeiAnz(Code, "<tr> <td><b>Zeitpunkt letzter Bezugs- und Einspeisemesswert:</b></td> <td  ALIGN=RIGHT>" +ZeitpunktLetzterBezEinsp[0:19] +"</td> </tr> ")
            KorrFakt=float(Konfiguration.Konfiguration['SML_Faktor'])
            Code= ZeiAnz(Code, "<tr> <td>Zählerstand Bezug:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(BezugStand*KorrFakt,2)) + " kWh")
            Code= ZeiAnz(Code, "<tr> <td>Zählerstand Einspeisung:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(EinspeisStand*KorrFakt,2)) + " kWh")
            Code= ZeiAnz(Code, "<tr> <td>Letzter Messwert Bezugsleistung:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(LetzterBezug,2)) +" kW</td> </tr> ")
            Code= ZeiAnz(Code, "<tr> <td>Letzter Messwert Einspeiseleistung:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(LetzteEinspeis,2)) +" kW</td> </tr> ")
            t1=datetime.datetime.strptime(ZeitpunktLetztes[0:19], '%Y-%m-%d %H:%M:%S')
            t2=datetime.datetime.strptime(ZeitpunktLetzterBezEinsp[0:19], '%Y-%m-%d %H:%M:%S')
            if abs((t1-t2).total_seconds()) < 60.0: # Letze Messerte innerhalb einer Minute
                stemp= "<tr> <td>Letzter Wert Verbrauch:</td> <td  ALIGN=RIGHT>" +"{0:.2f}".format(round(float(PGesamtLetzes)/1000.0,2) + round(LetzterBezug,2) -round(LetzteEinspeis,2)) +" kW</td> </tr> "
            else:
                stemp= "<tr> <td>Letzter Wert Verbrauch:</td> <td  ALIGN=RIGHT>" +"Nicht bestimmbar</td> </tr> "        
            Code= ZeiAnz(Code, stemp)
        Code= ZeiAnz(Code, "<tr> <td>Aktueller Zeitpunkt:</td> <td  ALIGN=RIGHT>" +aktuellerzeitpunkt +"</td> </tr> ")
        s= s+ Ergebnis_Start
        s= s+ "<tr> <td> </td> <td> </td> </tr> "
        s= s+ "</table> <br><br>"
        s=s+"""
<form>
<input type="submit" value="Heute"
       formaction="/Heute"> 
<input type="submit" value="Gestern"
       formaction="/Gestern"> 
</form>
<form method="get" action="Tag">
    <button type="submit">Tag</button> 
    <input type="text" value="""+tagdatum+""" name="datum" /> Format: yymmdd, z.B. 160227
</form>
<form method="get" action="Monat">
    <button type="submit">Monat</button> 
    <input type="text" value="""+monatdatum+""" name="datum" /> Format: yymm, z.B. 1602
</form>
<form method="get" action="Jahr">
    <button type="submit">Jahr</button> 
    <input type="text" value="""+jahrdatum+""" name="datum" /> Format: yy, z.B. 16
</form>
<form method="get" action="Konfiguration">
    <button type="submit">Konfiguration</button> 
</form>
</body> 
</html>"""
        #print s
        return s
    
    @cherrypy.expose
    def Tag(self, datum):
        DatenDa=0
        tagwert=datum
        #if not os.path.isfile(os.path.join(pfad,"/Stundenwerte ",heute,".png")):
        DatenDa=fsh.Abfrage(Art='Tag', Tag=tagwert)
                    
        if DatenDa==0:    
            return """ <html>
        <head>
        <title>FreeSol Stundenwerte """ + tagwert +"""</title>
        </head>
        <html>
        <body>
        <img src="images/Stundenwerte """ + tagwert +""".png">
        </body>
        </html>"""
        
        else:
            return  """<html>
        <head>
        <title>FreeSol Stundenwerte """ + tagwert +"""</title>
        </head>
        <html>
        <body>
        Keine Daten vorhanden ...
        </body>
        </html>"""
        
    @cherrypy.expose
    def Monat(self, datum="1602"):
        DatenDa=0
        monatswert=datum
        #if not os.path.isfile(pfad+"/Monatswerte "+heute+".png"):
        DatenDa=fsh.Abfrage(Art='Monat', Monat=monatswert)
                    
        if DatenDa==0:    
            return """ <html>
        <head>
        <title>FreeSol Tageswerte """ + monatswert +"""</title>
        </head>
        <html>
        <body>
        <img src="images/Monatswerte """ + monatswert +""".png">
        </body>
        </html>"""
        
        else:
            return  """<html>
        <head>
        <title>FreeSol Tageswerte """ + monatswert +"""</title>
        </head>
        <html>
        <body>
        Keine Daten vorhanden ...
        </body>
        </html>"""
         
    @cherrypy.expose
    def Jahr(self, datum="16"):
        DatenDa=0
        jahreswert=datum
        #if not os.path.isfile(pfad+"/Monatswerte "+heute+".png"):
        DatenDa=fsh.Abfrage(Art='Jahr', Jahr=jahreswert)
                    
        if DatenDa==0:    
            return """ <html>
        <head>
        <title>FreeSol Monatswerte """ + jahreswert +"""</title>
        </head>
        <html>
        <body>
        <img src="images/Jahreswerte """ + jahreswert +""".png">
        </body>
        </html>"""
        
        else:
            return  """<html>
        <head>
        <title>FreeSol Monatswerte """ + jahreswert +"""</title>
        </head>
        <html>
        <body>
        Keine Daten vorhanden ...
        </body>
        </html>"""
                      
    
    @cherrypy.expose
    def Heute(self):
        DatenDa=0
        heute=str(datetime.datetime.now().date())[2:].replace('-','')
        print(heute)
        #if not os.path.isfile(pfad+"/Stundenwerte "+heute+".png"):
        DatenDa=fsh.Abfrage(Art='Tag', Tag=heute)
            
        if DatenDa==0:    
            return """ <html>
<head>
<title>FreeSol Stundenwerte Heute</title>
</head>
<html>
<body>
<img src="images/Stundenwerte """ + heute +""".png">
</body>
</html>"""

        else:
            return  """<html>
<head>
<title>FreeSol Stundenwerte Heute</title>
</head>
<html>
<body>
Keine Daten vorhanden ...
</body>
</html>"""
        
        
    @cherrypy.expose
    def Gestern(self):
        DatenDa=0
        gestern=str(datetime.datetime.now().date() - datetime.timedelta(days=1))[2:].replace('-','')
        #if not os.path.isfile(pfad+"/Stundenwerte "+heute+".png"):
        DatenDa=fsh.Abfrage(Art='Tag', Tag=gestern)
            
        if DatenDa==0:    
            return """ <html>
<head>
<title>FreeSol Stundenwerte Gestern</title>
</head>
<html>
<body>
<img src="images/Stundenwerte """ + gestern +""".png">
</body>
</html>"""

        else:
            return  """<html>
<head>
<title>FreeSol Stundenwerte Heute</title>
</head>
<html>
<body>
Keine Daten vorhanden ...
</body>
</html>"""        
        
        
    @cherrypy.expose
    def Konfiguration(self):
        Konfiguration=fsh.Konfiguration_verwalten()
        
        Ergebnis=  """<html>
<head>
<title>FreeSol Konfigurationen</title>
</head>
<html>
<body>
<h1> FreeSol Konfiguration</h1>
<form method="get" action="Konfiguration_speichern_Form">
"""
        BezugStand, EinspeisStand, ZeitpunktLetzterBezEinsp = fsh.AktuelleZählerständeSML()

        for key in Konfiguration.KeyAnzeigenreihenfolge:
            temp='""'
            temp2=""
            if Konfiguration.Konfiguration[key]!='':
                temp=Konfiguration.Konfiguration[key]
                if key=="OBIS_Bezug":
                    temp2 = "  Zählerstand vor Skalierung:" +str(round(BezugStand,2)) + " um "+ ZeitpunktLetzterBezEinsp 
                elif key=="OBIS_Einspeisung":
                    temp2 = "  Zählerstand vor Skalierung:" +str(round(EinspeisStand,2)) + " um "+ ZeitpunktLetzterBezEinsp 
            Ergebnis += """
    <label for=" """+key+""" ">"""+key+""": </label>
    <input type="text" value="""+temp+""" name="""+key+""" />"""
            if key=="OBIS_Bezug" or key=="OBIS_Einspeisung":
                Ergebnis +=temp2 + """<br><br>"""
            else:            
                Ergebnis +="""<br><br>"""
        Ergebnis += """
    <br>
    <button type="submit">Konfiguration speichern (Achtung: Raspi-Neustart bei Portwechsel)</button>
</form>
<form method="get" action="Konfiguration">
    <button type="submit">Konfiguration laden</button> 
</form>
<form method="get" action="Software_Update">
    <button type="submit">Software Update</button> 
</form>
<form method="get" action="index">
    <button type="submit">Startseite</button> 
</form>
<h2> Hinweise zur Konfiguration</h2>
  <ul>
  <li><b>OBIS_Bezug und OBIS_Einspeisung:</b> z.B. 1.8.0 und 2.8.0 </li>
  <li><b>USB_PortNr_SML:</b> Portnummer nur als Zahl, ohne Präfix, eingeben, z.B. 0 oder 3.</li>
  <li><b>Zählerstände:</b> Hier werden die letzten Werte aus der Datenbank ausgegeben, die in der Datenbank für 
                           Bezug und Einspeisung eingetragen sind. Achtung: Wenn man die OBIS-Kennzahl ändert, ändert 
                           sich der letzte Datenbankeintrag nicht, erst der nächste kommt aus der neuen OBIS-Kennzahl.</li>
  <li><b>SML_Faktor:</b> Korrekturfaktor für beide SML-Zählerwerte, typischerweise steht hier 1 oder 0.001</li>
  <li><b>Anzeige_Startseite:</b> Bestimmt Sichtbarkeit der einzelnen Datenzeilen der Startseite. Bei 0 wird die Zeile nicht
                                 angezeigt, bei '', 1 oder jedem anderen Zeichen schon. Jede Ziffer gilt für eine Zeile. Ist der String leer, werden alle
                                 Zeilen angezeigt. Beispiel: 1001. d.h. die Zeilen 2 und 3 werden nicht angezeigt, die Zeilen 1 und 4 schon, ebenfalls 
                                 alle Zeilen ab Zeile 5.</li>
<li><b>Installierte_PVLeistung:</b> Installierte PV-Leistung in kWp, z.B. 11.29</li>
</ul> 
</body>
</html>"""      
        return Ergebnis

    @cherrypy.expose
    def Konfiguration_speichern_Form(self, **kwargs):
        global Konfiguration

        Neustart=False
        Zusatztext=""
        for key, value in kwargs.items():
            if key=="Port" and value !=Konfiguration.Konfiguration['Port']:
                Neustart=True            
            Konfiguration.Konfiguration[key]=value
        Konfiguration.Konfiguration_speichern()
        if Neustart:
            Zusatztext="Achtung, Raspi muss wegen Portwechsel neu gestartet werden, dies dauert ca. 20 Sekunden. Danach Zugriff mit neuem Port "+Konfiguration['Port']+".<br>"
            os.system('sudo reboot') # sudo shutdown -r now')
            #cherrypy.config.update({'server.socket_port': int(Konfiguration.Konfiguration["Port"])})
            #cherrypy.engine.restart()
        return """<html>
<head>
<title>FreeSol Konfiguration gespeichert</title>
</head>
<html>
<body>
<h1> FreeSol Konfiguration wurde gespeichert</h1>"""+Zusatztext+"""<br>
<form method="get" action="Konfiguration">
    <button type="submit">Zurück zur Konfigurationsseite</button> 
</form>
<form method="get" action="index">
    <button type="submit">Startseite</button> 
</form>
</body>
</html>"""      

    
    @cherrypy.expose
    def Software_Update(self):
        Softwareversionen=fsh.Softwareversionen_verwalten()

        return  """<html>
<head>
<title>FreeSol Software-Versionen</title>
</head>
<html>
<body>
<h1> FreeSol Software-Versionen</h1>
<h2> Installierte Versionen</h2>
""" + Softwareversionen.InstVer + """<br>
<h2> Verfügbare Versionen</h2>
""" + Softwareversionen.VerfVer + """<br>
<h2> Aktualisierbare Files</h2>
""" + Softwareversionen.Updatetext + """<br><br>

<form method="get" action="Backup">
    <button type="submit">Backup der Datenbank herunterladen</button> 
</form>

<form method="get" action="Update_durchfuehren">
    <button type="submit">Update durchführen</button> 
</form>
<form method="get" action="index">
    <button type="submit">Startseite</button> 
</form>


</body>
</html>"""                
    
    @cherrypy.expose
    def Update_durchfuehren(self):
        Softwareversionen=fsh.Softwareversionen_verwalten() # Softwarestand vor Update einlesen
            
        # Update durchführen    
        Pfad=os.path.join(Startfilepfad, "aktuelle_Version")
        for File in Softwareversionen.Updateliste:
            if platform.system()=="Windows":
                copyfile(os.path.join(Pfad,File) , File)
            else:
                os.system('sudo cp '+ Pfad+"/"+File +" "+Startfilepfad +"/"+File)
            
        Softwareversionen=fsh.Softwareversionen_verwalten() # Softwarestand nach Update einlesen
        
        return  """<html>
<head>
<title>FreeSol Software-Update durchgeführt</title>
</head>
<html>
<body>
<h1> Software-Versionen nach Update</h1>
<h2> Aktualisierte Files</h2>
""" + Softwareversionen.Updatetext + """<br>
<h2> Installierte Versionen</h2>
""" + Softwareversionen.InstVer + """<br>
<h2> Verfügbare Versionen</h2>
""" + Softwareversionen.VerfVer + """<br>

<form method="get" action="index">
    <button type="submit">Startseite</button> 
</form>

</body>
</html>"""              
    
    
    @cherrypy.expose
    def Backup(self):
        return cherrypy.lib.static.serve_file(os.path.join(Startfilepfad,'FreeSolRaspi.db'), "application/x-download", "attachment")    
    

####### Hauptprogramm
Konfiguration=fsh.Konfiguration_verwalten()
# Welche Platform?
if platform.system()=="Windows":
    pfad= os.path.join(os.path.abspath(os.curdir), 'Bilder')
    print(pfad)
    cherrypy.config.update({'server.socket_port': int(Konfiguration.Konfiguration['Port']), })#'server.socket_host': '0.0.0.0',
else:
    pfad="/webserv"
    cherrypy.config.update({'server.socket_host': '0.0.0.0','server.socket_port': int(Konfiguration.Konfiguration['Port']), })


conf = {'/images': {'tools.staticdir.on': True,
                    'tools.staticdir.dir': pfad}}
print(conf)
cherrypy.quickstart(Root(), '/', config=conf)

