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

# Autor: Thomas Wagner 2019

import os, sys
import platform
import sqlite3 as lite
#import pandas as pd
import datetime
#import numpy as np
import time
import SMLParser
import serial #conda install pyserial     alt: pip install serial in windows
import FreeSolRaspi_Helper

Version= "0.95"

Plattform=FreeSolRaspi_Helper.Plattform_Konfiguration()

## Für Raspi die Grafikausgabe umleiten
#if os.environ.get('DISPLAY','') == '':
    #print('No display found. Using non-interactive Agg backend')
    #plt.switch_backend('Agg')


## Konfiguration von Displayparametern in der Konsole
#pd.set_option('display.max_rows', None)
#pd.set_option('display.max_columns', None)
#pd.set_option('display.width', 2000)
## SettingWithCopyWarning aus:
#pd.options.mode.chained_assignment = None  # default='warn'


def InitialisiereDB(db_filename):
    #Prüfen ob DB existiert
    if not os.path.isfile(db_filename): #Erste Einrichtung der Datenbank
        con = lite.connect(db_filename)          
        try:
            with con:    
                cur = con.cursor()    
                cur.execute("CREATE TABLE SML (date text, SML_Bezug float, SML_Einspeis float)")
                SML_Bezug = 0.0
                SML_Einspeis = 0.0
                date = time.strftime("%Y-%m-%d %H:%M:%S")
                print(date, SML_Bezug, SML_Einspeis)
                cur.execute("INSERT INTO SML (date, S0) VALUES (?,?)", (date, SML_Bezug, SML_Einspeis))    
                date = time.strftime("%Y-%m-%d %H:%M:%S")
                print(date, SML_Bezug, SML_Einspeis)
                cur.execute("INSERT INTO SML (date, S0) VALUES (?,?)", (date, SML_Bezug, SML_Einspeis))     
        except:
            print("Fehler beim Datenbank Anlegen")
            sys.exit(1)              


def SML_lesen():
    InitialisiereDB(Plattform.db_filename)
    
    heute = (datetime.date.today()).strftime('%Y-%m-%d')
    print(heute)
    
    con = lite.connect(Plattform.db_filename)          
    heute = (datetime.date.today()).strftime('%Y-%m-%d')
    print(heute)
    
    con.close()  


if __name__ == '__main__':
    print("Hauptprogramm")
    print()
    
    PortNr=-1
    Portliste=[]
    for i in range(20):
        try:
            ser = serial.Serial(Plattform.portprefix+str(i)) #/dev/ttyUSB0') # open serial port
            print()
            print("Schreibversuch auf Port "+str(i)+":")
            print("Port offen? "+str(ser.is_open))
            print("Portname:   "+ ser.name) # check which port was really used
            print("Baudrate:   "+str(ser.baudrate))
            print("Parity:     "+str(ser.parity)) #serial.PARITY_EVEN
            print("Timeout:    "+str(ser.timeout)) #None
            print("RTSCTS:     "+str(ser.rtscts)) #False
            print()
            
            ser.write(b'Test'*50) # write a string
            ser.close() # close port
            PortNr=i
            Portliste.append(i)
        except:
            print("Portanfrage für Port "+str(i)+" verursacht Fehler")
            
    for PortNr in Portliste:
        print("Es wird Port "+str(PortNr)+" zum Lesen gewählt")
        Daten=b""
        try: 
            with serial.Serial(Plattform.portprefix+str(PortNr)) as ser:
                ser.timeout=3
                print("Ist Port "+str(PortNr)+" zum Lesen geöffnet? "+str(ser.is_open))
                print("Portname:   "+ ser.name) # check which port was really used
                print("Baudrate:   "+str(ser.baudrate))
                print("Parity:     "+str(ser.parity)) #serial.PARITY_EVEN
                print("Timeout:    "+str(ser.timeout)) #None
                print("RTSCTS:     "+str(ser.rtscts)) #False
                print()
                
                Daten=ser.read(1000)
                ser.close()
        except:
            print("Fehler bei Lesen")
        
        print("Leseergebnis an der Schnittstelle")
        print(len(Daten))
        print(Daten)
        print()
        
        if len(Daten)>0:
            break
    
    try:
        with open(Plattform.Outputfile, "wb") as binary_file:
            # Write text or bytes to the file
            num_bytes_written = binary_file.write(Daten)  #"Write text by encoding\n".encode('utf8'))
            print("Geschrieben %d Bytes." % num_bytes_written)    
        
        print("Daten geschrieben.")
        print()
        SML1=SMLParser.SML(Plattform.Outputfile)
        SML1.Drucken()
        SML1.Zaehlerinfos_Alle()
        SML1.OBIS_Alle()
    except:
        print()
        print("Kein Datenfile gefunden")
        print()
    
    print("Programmende")
    print("(Programmausführung mit Ctrl-C anhalten, damit dieser Bildschirm schließt.")
    while True:
        pass
    