diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..190d90d2c7182f67b609ff98b5270b682bc3e0a9
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,18 @@
+NAME = sl-monitor-gui
+MAIN = sl-monitor.py
+
+DIRNAME = $(NAME:-gui=)
+PY_FILES += $(wildcard src/*.py)
+
+default: bin ${PY_FILES}
+	@cp ${PY_FILES} bin/${DIRNAME}
+	@echo "#!/bin/bash\nexec ${DIRNAME}/${MAIN}" > bin/${NAME}
+	@chmod +x bin/${NAME} bin/${DIRNAME}/${MAIN}
+
+bin:
+	@test -d $@ || mkdir -p $@/${DIRNAME}
+
+clean:
+	@rm -fr bin/ src/*~
+
+.PHONY: clean
diff --git a/src/sl-monitor.py b/src/sl-monitor.py
new file mode 100755
index 0000000000000000000000000000000000000000..10fff3e9aa80c234ca30fa378ea6aa6eb3557553
--- /dev/null
+++ b/src/sl-monitor.py
@@ -0,0 +1,1387 @@
+#!/usr/bin/python 
+
+# carico moduli
+import os
+import csv
+import time
+import random
+import PyTango
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+import sys
+
+try:
+    stile = sys.argv[1]
+except:
+    stile = ''
+
+global nomefile
+#nomefile = '/home/lfo/devel/fermi/panels/laser/slmonitor/listoneseed.csv'
+nomefile = '/home/lfo/runtime/panels/etc/listoneseed.csv'
+global devprodic
+devprodic = {}
+devprodic['sl/laser/calendar_sl.01'] = PyTango.DeviceProxy('sl/laser/calendar_sl.01')
+giocaconnoi = devprodic['sl/laser/calendar_sl.01'].activityNum
+giocaconnoi = 1
+if giocaconnoi == 0:
+    sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 1
+elif giocaconnoi == 1:
+    sistemi = 1#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 1
+elif giocaconnoi == 2:
+    sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 1
+elif giocaconnoi == 3:
+    sistemi = 1#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 1
+elif giocaconnoi == 4:
+    sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 1
+elif giocaconnoi == 5:
+    sistemi = 1#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 1
+elif giocaconnoi == 6:
+    sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 1
+elif giocaconnoi == 7:
+    sistemi = 2#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 2
+elif giocaconnoi == 8:
+    sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 2
+elif giocaconnoi == 9:
+    sistemi = 2#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 2
+elif giocaconnoi == 10:
+    sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 1
+elif giocaconnoi == 11:
+    sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2
+    fel = 2
+devprodic['sl/laser/evops_sl.01'] = PyTango.DeviceProxy('sl/laser/evops_sl.01')
+devprodic['sl/laser/evops_sl.03'] = PyTango.DeviceProxy('sl/laser/evops_sl.03')
+devprodic['sl/misc/ranges'] = PyTango.DeviceProxy('sl/misc/ranges')
+devprodic['sl/delay/sdg_slr.01'] = PyTango.DeviceProxy('sl/delay/sdg_slr.01')
+devprodic['sl/delay/sdg_slr.02'] = PyTango.DeviceProxy('sl/delay/sdg_slr.02')
+devprodic['sl/timing/tmu_sl.01'] = PyTango.DeviceProxy('sl/timing/tmu_sl.01')
+devprodic['f/timing/rttrigger_sl.01'] = PyTango.DeviceProxy('f/timing/rttrigger_sl.01')
+devprodic['f/timing/rttrigger_sl.02'] = PyTango.DeviceProxy('f/timing/rttrigger_sl.02')
+devprodic['f/timing/rttrigger_sl.03'] = PyTango.DeviceProxy('f/timing/rttrigger_sl.03')
+if fel == 1:
+    devprodic['superclaudio'] = PyTango.DeviceProxy('fel01/master/master_fel01.01')
+elif fel ==2:
+    devprodic['superclaudio'] = PyTango.DeviceProxy('fel02/master_s01/master_s01_fel02.01')
+else:
+    devprodic['superclaudio'] = PyTango.DeviceProxy('fel01/master/master_fel01.01')
+
+
+class MainWindow(QDialog):
+    def __init__(self, parent = None):
+        super(MainWindow, self).__init__(parent)
+        self.tempodiriferimento = 0
+        print(sistemi)
+        # creo gli elementi e ne aggiusto le proprieta
+        self.Slabel_title = QLabel("SEED")
+        self.Slabel_title.setFont(font_grande)
+        self.Sbutton_distruzioni = QPushButton("?")
+        self.Sbutton_distruzioni.setMaximumWidth(20)
+        self.Sbutton_distruzioni.setStyleSheet("background-color: light gray")
+        self.Sprogressbar = QProgressBar()
+        self.Sprogressbar.setMinimum(0)
+        self.Sprogressbar.setMaximum(100)
+        self.Sprogressbar.setValue(0)
+        self.Sprogressbar.setFont(font_piccolo)
+        self.Sprogressbar.setStyleSheet("background-color: white")
+        self.Sstato_L = QLabel('State:')
+        self.Sstato_R = QLineEdit('')
+#        self.Sbutton_on = QPushButton("ON")
+#        self.Sbutton_on.setFont(font_medio)
+#        self.Sbutton_on.setStyleSheet("background-color: light gray")
+#        self.Sbutton_standby = QPushButton("STANDBY")
+#        self.Sbutton_standby.setFont(font_medio)
+#        self.Sbutton_standby.setStyleSheet("background-color: light gray")
+#        self.Sbutton_off = QPushButton("OFF")
+#        self.Sbutton_off.setFont(font_medio)
+#        self.Sbutton_off.setStyleSheet("background-color: light gray")
+        self.Sbutton_manutenzione = QPushButton("Maintenance")
+        self.Sbutton_manutenzione.setFont(font_medio)
+        self.Sbutton_manutenzione.setStyleSheet("background-color: light gray")
+        self.Sbutton_manutenzione.setDisabled(0)
+        self.Sbutton_svistalaser = QPushButton("Quick view")
+        self.Sbutton_svistalaser.setStyleSheet("background-color: light gray")
+        self.Slineedit_cont = QLineEdit("Controls")
+        self.Slineedit_cont.setReadOnly(1)
+        self.Slineedit_cont.setFont(font_piccolo)
+        self.Slineedit_cont.setStyleSheet("background-color: white")
+        self.Sbutton_cont = QPushButton("Show")
+        self.Sbutton_cont.setFont(font_piccolo)
+        self.Sbutton_cont.setStyleSheet("background-color: light gray")
+        self.Sbutton_cont.impronta = "Controls"
+        self.Slineedit_temp = QLineEdit("Temperature")
+        self.Slineedit_temp.setReadOnly(1)
+        self.Slineedit_temp.setFont(font_piccolo)
+        self.Slineedit_temp.setStyleSheet("background-color: white")
+        self.Sbutton_temp = QPushButton("Show")
+        self.Sbutton_temp.setFont(font_piccolo)
+        self.Sbutton_temp.setStyleSheet("background-color: light gray")
+        self.Sbutton_temp.impronta = "Temperature"
+        self.Slineedit_trg = QLineEdit("Trigger")
+        self.Slineedit_trg.setReadOnly(1)
+        self.Slineedit_trg.setFont(font_piccolo)
+        self.Slineedit_trg.setStyleSheet("background-color: white")
+        self.Sbutton_trg = QPushButton("Show")
+        self.Sbutton_trg.setFont(font_piccolo)
+        self.Sbutton_trg.setStyleSheet("background-color: light gray")
+        self.Sbutton_trg.impronta = "Trigger"
+        self.Slineedit_osc = QLineEdit("Oscillator")
+        self.Slineedit_osc.setReadOnly(1)
+        self.Slineedit_osc.setFont(font_piccolo)
+        self.Slineedit_osc.setStyleSheet("background-color: white")
+        self.Sbutton_osc = QPushButton("Show")
+        self.Sbutton_osc.setFont(font_piccolo)
+        self.Sbutton_osc.setStyleSheet("background-color: light gray")
+        self.Sbutton_osc.impronta = "Oscillator"
+        self.Slineedit_loc = QLineEdit("Locking")
+        self.Slineedit_loc.setReadOnly(1)
+        self.Slineedit_loc.setFont(font_piccolo)
+        self.Slineedit_loc.setStyleSheet("background-color: white")
+        self.Sbutton_loc = QPushButton("Show")
+        self.Sbutton_loc.setFont(font_piccolo)
+        self.Sbutton_loc.setStyleSheet("background-color: light gray")
+        self.Sbutton_loc.impronta = "Locking"
+        self.Slineedit_amp = QLineEdit("Amplifier")
+        self.Slineedit_amp.setReadOnly(1)
+        self.Slineedit_amp.setFont(font_piccolo)
+        self.Slineedit_amp.setStyleSheet("background-color: white")
+        self.Sbutton_amp = QPushButton("Show")
+        self.Sbutton_amp.setFont(font_piccolo)
+        self.Sbutton_amp.setStyleSheet("background-color: light gray")
+        self.Sbutton_amp.impronta = "Amplifier"
+        self.Slineedit_opa = QLineEdit("Opa")
+        self.Slineedit_opa.setReadOnly(1)
+        self.Slineedit_opa.setFont(font_piccolo)
+        self.Slineedit_opa.setStyleSheet("background-color: white")
+        self.Sbutton_opa = QPushButton("Show")
+        self.Sbutton_opa.setFont(font_piccolo)
+        self.Sbutton_opa.setStyleSheet("background-color: light gray")
+        self.Sbutton_opa.impronta = "Opa"
+        self.Slineedit_nrg = QLineEdit("Energy")
+        self.Slineedit_nrg.setReadOnly(1)
+        self.Slineedit_nrg.setFont(font_piccolo)
+        self.Slineedit_nrg.setStyleSheet("background-color: white")
+        self.Sbutton_nrg = QPushButton("Show")
+        self.Sbutton_nrg.setFont(font_piccolo)
+        self.Sbutton_nrg.setStyleSheet("background-color: light gray")
+        self.Sbutton_nrg.impronta = "Energy"
+        self.Slineedit_vun = QLineEdit("Virtual Undulator")
+        self.Slineedit_vun.setReadOnly(1)
+        self.Slineedit_vun.setFont(font_piccolo)
+        self.Slineedit_vun.setStyleSheet("background-color: white")
+        self.Sbutton_vun = QPushButton("Show")
+        self.Sbutton_vun.setFont(font_piccolo)
+        self.Sbutton_vun.setStyleSheet("background-color: light gray")
+        self.Sbutton_vun.impronta = "VirtualUN"
+        self.Slineedit_fbk = QLineEdit("Feedback")
+        self.Slineedit_fbk.setReadOnly(1)
+        self.Slineedit_fbk.setFont(font_piccolo)
+        self.Slineedit_fbk.setStyleSheet("background-color: white")
+        self.Sbutton_fbk = QPushButton("Show")
+        self.Sbutton_fbk.setFont(font_piccolo)
+        self.Sbutton_fbk.setStyleSheet("background-color: light gray")
+        self.Sbutton_fbk.impronta = "Feedback"
+        self.Sbutton_allin = QPushButton("Show all")
+        self.Sbutton_allin.setFont(font_piccolo)
+        self.Sbutton_allin.setStyleSheet("background-color: light gray")
+        self.Sbutton_configure = QPushButton("Configure")
+        self.Sbutton_configure.setFont(font_piccolo)
+        self.Sbutton_configure.setStyleSheet("background-color: light gray")
+        self.Serrorbox = QListWidget()
+        voce = time.ctime()[4:19] + ' ready'
+        self.Serrorbox.insertItem(0, voce)
+        self.Serrorbox.setFont(font_moltopiccolo)
+        # assegno gli oggetti a diversi layout e creo i layout
+        Slayout = QVBoxLayout()
+        Slayout_0 = QHBoxLayout()
+        Slayout_0.addWidget(self.Slabel_title)
+        Slayout_0.addWidget(self.Sbutton_distruzioni)
+        Slayout.addLayout(Slayout_0)
+        if stile == 'allarmi':
+            chepalle = QLabel("with alarms")
+            chepalle.setFont(font_medio)
+            Slayout.addWidget(chepalle)
+        Slayout.addWidget(self.Sprogressbar)
+        
+#        Slayout.addWidget(self.Sbutton_on)
+#        Slayout.addWidget(self.Sbutton_standby)
+        Slayout_1 = QHBoxLayout()
+#        Slayout_1.addWidget(self.Sbutton_off)
+#        Slayout_1.addWidget(self.Sbutton_manutenzione)
+        Slayout_1.addWidget(self.Sstato_L)
+        Slayout_1.addWidget(self.Sstato_R)
+        Slayout.addLayout(Slayout_1)
+        Slayout.addWidget(self.Sbutton_manutenzione)
+        Slayout.addWidget(self.Sbutton_svistalaser)
+        contSlayout = QHBoxLayout()
+        contSlayout.addWidget(self.Slineedit_cont)
+        contSlayout.addWidget(self.Sbutton_cont)
+        tempSlayout = QHBoxLayout()
+        tempSlayout.addWidget(self.Slineedit_temp)
+        tempSlayout.addWidget(self.Sbutton_temp)
+        trgSlayout = QHBoxLayout()
+        trgSlayout.addWidget(self.Slineedit_trg)
+        trgSlayout.addWidget(self.Sbutton_trg)
+        oscSlayout = QHBoxLayout()
+        oscSlayout.addWidget(self.Slineedit_osc)
+        oscSlayout.addWidget(self.Sbutton_osc)
+        locSlayout = QHBoxLayout()
+        locSlayout.addWidget(self.Slineedit_loc)
+        locSlayout.addWidget(self.Sbutton_loc)
+        ampSlayout = QHBoxLayout()
+        ampSlayout.addWidget(self.Slineedit_amp)
+        ampSlayout.addWidget(self.Sbutton_amp)
+        opaSlayout = QHBoxLayout()
+        opaSlayout.addWidget(self.Slineedit_opa)
+        opaSlayout.addWidget(self.Sbutton_opa)
+        nrgSlayout = QHBoxLayout()
+        nrgSlayout.addWidget(self.Slineedit_nrg)
+        nrgSlayout.addWidget(self.Sbutton_nrg)
+        vunSlayout = QHBoxLayout()
+        vunSlayout.addWidget(self.Slineedit_vun)
+        vunSlayout.addWidget(self.Sbutton_vun)
+        fbkSlayout = QHBoxLayout()
+        fbkSlayout.addWidget(self.Slineedit_fbk)
+        fbkSlayout.addWidget(self.Sbutton_fbk)
+        infondoSlayout = QHBoxLayout()
+        infondoSlayout.addWidget(self.Sbutton_configure)
+        infondoSlayout.addWidget(self.Sbutton_allin)
+        Slayout.addLayout(contSlayout)
+        Slayout.addLayout(tempSlayout)
+        Slayout.addLayout(trgSlayout)
+        Slayout.addLayout(oscSlayout)
+        Slayout.addLayout(locSlayout)
+        Slayout.addLayout(ampSlayout)
+        Slayout.addLayout(opaSlayout)
+        Slayout.addLayout(nrgSlayout)
+        Slayout.addLayout(vunSlayout)
+        Slayout.addLayout(fbkSlayout)
+        Slayout.addLayout(infondoSlayout)
+        Slayout.addWidget(self.Serrorbox)
+        self.setLayout(Slayout)
+        if stile == 'allarmi':
+            self.setWindowTitle("SEED monitor panel (alarms)")
+        else:
+            self.setWindowTitle("SEED monitor panel")
+        self.setStyleSheet("background-color: rgb(230, 255, 255)")
+        self.show()
+        #collego oggetti ed azioni
+        self.Sbutton_distruzioni.clicked.connect(self.istruzioni)
+#        self.Sbutton_on.clicked.connect(self.procedura_accensione)
+#        self.Sbutton_standby.clicked.connect(self.procedura_parcheggio)
+#        self.Sbutton_off.clicked.connect(self.procedura_spegnimento)
+        self.Sbutton_cont.clicked.connect(self.Show)
+        self.Sbutton_temp.clicked.connect(self.Show)
+        self.Sbutton_trg.clicked.connect(self.Show)
+        self.Sbutton_osc.clicked.connect(self.Show)
+        self.Sbutton_loc.clicked.connect(self.Show)
+        self.Sbutton_amp.clicked.connect(self.Show)
+        self.Sbutton_opa.clicked.connect(self.Show)
+        self.Sbutton_nrg.clicked.connect(self.Show)
+        self.Sbutton_vun.clicked.connect(self.Show)
+        self.Sbutton_fbk.clicked.connect(self.Show)
+        self.Sbutton_allin.clicked.connect(self.mostrami_tutto)
+        self.Sbutton_configure.clicked.connect(self.configurare)
+        self.Sbutton_manutenzione.clicked.connect(self.manutenzionefinta)
+        self.Sbutton_svistalaser.clicked.connect(lambda:os.system('python ///home/lfo/runtime/panels/bin/slassistente.py &'))
+        self.s = list #creo contenitore lista
+        #creo il timer
+        self.timer = QBasicTimer()
+        self.timer.start(10000, self)
+        self.update()
+
+    def __del__(self):
+        devprodic['sl/misc/ranges'].write_attribute('On_Condition', 0)
+        self.timer.stop()
+        pass
+
+    def timerEvent(self, event):
+        self.update()
+
+    def update(self):
+        Controls_color = []
+        Temperature_color = []
+        Trigger_color = []
+        Oscillator_color = []
+        Locking_color = []
+        Amplifier_color = []
+        Opa_color = []
+        Energy_color = []
+        VirtualUN_color = []
+        Feedback_color = []
+        sounareononsuonare = []
+        statoallarmi = 0
+        # se il file e` stato aggiornato lo leggo, altrimenti passo direttamente a leggere dati dal database
+        if self.tempodiriferimento < os.path.getmtime(nomefile):
+            # aggiorno tempodiriferimento e leggo file
+            voce = time.ctime()[4:19] + ' carico file'
+            item = QListWidgetItem(str(voce))
+            self.Serrorbox.insertItem(0, item)
+            self.tempodiriferimento = time.time()
+            with open(nomefile) as csvfile:
+                spamreader = csv.reader(csvfile, delimiter=',', quotechar='"')
+                self.s = []
+                for row in spamreader:
+                    # se non presente aggiungo il device proxy al dizionario
+                    if row[1] in devprodic:
+                        
+                        pass
+                    else:
+                        devprodic[row[1]] = PyTango.DeviceProxy(row[1])
+                    #row[0]->Active
+                    #1row[1]->Device
+                    #2row[2]->Attribute
+                    #3row[3]->Type
+                    #4row[4]->Subsystem
+                    #5row[5]-AlarmON
+                    #6row[6]->AlarmCycles
+                    #7row[7]->Autofix
+                    #8row[8]->Description
+                    #9row[9]->wikiReperibile
+                    #10row[10]->wikiProcedure
+                    #11row[11]->Script
+                    #12row[12]->helpMessage
+                    #devprodic[row[1]]->PyTango deviceproxy
+                    self.s.append(elemento(str(row[0]), str(row[1]), str(row[2]), str(row[3]), str(row[4]), str(row[5]), str(row[6]), str(row[7]), str(row[8]), str(row[9]), str(row[10]), str(row[11]), str(row[12]), devprodic[row[1]]))
+            csvfile.close()
+            spamreader = None
+        for corridore in range(len(self.s)):
+            #print(self.p[corridore].Active)
+            if self.s[corridore].Active == '1':
+                try:
+                    # lettura e confronto
+                    self.s[corridore].lettura()
+                    # assegnazione al sottosistema
+                    if self.s[corridore].Subsystem == 'Controls':
+                        Controls_color.append(self.s[corridore].ok)
+                    elif self.s[corridore].Subsystem == 'Temperature':
+                        Temperature_color.append(self.s[corridore].ok)
+                    elif self.s[corridore].Subsystem == 'Trigger':
+                        Trigger_color.append(self.s[corridore].ok)
+                    elif self.s[corridore].Subsystem == 'Oscillator':
+                        Oscillator_color.append(self.s[corridore].ok)
+                    elif self.s[corridore].Subsystem == 'Locking':
+                        Locking_color.append(self.s[corridore].ok)
+                    elif self.s[corridore].Subsystem == 'Amplifier':
+                        Amplifier_color.append(self.s[corridore].ok)
+                    elif self.s[corridore].Subsystem == 'Opa':
+                        Opa_color.append(self.s[corridore].ok)
+                    elif self.s[corridore].Subsystem == 'Energy':
+                        Energy_color.append(self.s[corridore].ok)
+                    elif self.s[corridore].Subsystem == 'VirtualUN':
+                        VirtualUN_color.append(self.s[corridore].ok)
+                    elif self.s[corridore].Subsystem == 'Feedback':
+                        Feedback_color.append(self.s[corridore].ok)
+                    # allarme
+                    if self.s[corridore].AlarmON == '1' and float(self.s[corridore].n_wrong) >= float(self.s[corridore].AlarmCycles):
+                        statoallarmi = 1
+                        sounareononsuonare.append(1)
+                        print(self.s[corridore].Device)
+                        voce = time.ctime()[4:19] + ' ' + self.s[corridore].Device + '/' + self.s[corridore].Attribute + ' notok for ' + str(self.s[corridore].n_wrong) + ' times'
+                        item = QListWidgetItem(str(voce))
+                        color = QColor(int(1),int(0),int(0))
+                        item.setTextColor(color)
+                        self.Serrorbox.insertItem(0, item)
+                    elif self.s[corridore].AlarmON == '1' and float(self.s[corridore].n_wrong) < float(self.s[corridore].AlarmCycles):
+                        statoallarmi = 1
+                        sounareononsuonare.append(0)
+                except:
+#                    print('errore in lettura attibuti dentro il metodo update')
+#                    print(self.s[corridore].Attribute)
+#                    print('')
+                    voce = time.ctime()[4:19] + ' Error reading ' + self.s[corridore].Device + '/' + self.s[corridore].Attribute + ' in section update'
+                    item = QListWidgetItem(str(voce))
+                    self.Serrorbox.insertItem(0, item)
+            ora = 100 * (corridore+1) / len(self.s)
+#            print(ora)
+#            print(self.s[corridore].Device + '/' + self.s[corridore].Attribute)
+#            print(' ' )
+            self.Sprogressbar.setValue(ora)
+            time.sleep(0.015)
+        # beep allarmi
+        if stile == 'allarmi':
+            controllo = devprodic['sl/misc/ranges'].slalarm
+            if 1 in sounareononsuonare:
+                if controllo == True:
+                    pass
+                else:
+                    devprodic['sl/misc/ranges'].write_attribute('slalarm', True)
+            else:
+                if controllo == False:
+                    pass
+                else:
+                    devprodic['sl/misc/ranges'].write_attribute('slalarm', False)
+        # coloro pannello
+        if statoallarmi == 0:
+            self.Sbutton_manutenzione.setStyleSheet("background-color: #ff0000")
+        elif statoallarmi == 1:
+            self.Sbutton_manutenzione.setStyleSheet("background-color: light gray")
+        else:
+            self.Sbutton_manutenzione.setStyleSheet("background-color: #ffff00")
+        if 2 in Controls_color:
+            self.Slineedit_cont.setStyleSheet("background-color: #ff0000")
+        elif 1 in Controls_color:
+            self.Slineedit_cont.setStyleSheet("background-color: #ffff00")
+        elif 0 in Controls_color:
+            self.Slineedit_cont.setStyleSheet("background-color: #00ff00")
+        if 2 in Temperature_color:
+            self.Slineedit_temp.setStyleSheet("background-color: #ff0000")
+        elif 1 in Temperature_color:
+            self.Slineedit_temp.setStyleSheet("background-color: #ffff00")
+        elif 0 in Temperature_color:
+            self.Slineedit_temp.setStyleSheet("background-color: #00ff00")
+        if -99 in Trigger_color:
+            self.Slineedit_trg.setStyleSheet("background-color: #5555ff")
+        elif 2 in Trigger_color:
+            self.Slineedit_trg.setStyleSheet("background-color: #ff0000")
+        elif 1 in Trigger_color:
+            self.Slineedit_trg.setStyleSheet("background-color: #ffff00")
+        elif 0 in Trigger_color:
+            self.Slineedit_trg.setStyleSheet("background-color: #00ff00")
+        if 2 in Oscillator_color:
+            self.Slineedit_osc.setStyleSheet("background-color: #ff0000")
+        elif 1 in Oscillator_color:
+            self.Slineedit_osc.setStyleSheet("background-color: #ffff00")
+        elif 0 in Oscillator_color:
+            self.Slineedit_osc.setStyleSheet("background-color: #00ff00")
+        if 2 in Locking_color:
+            self.Slineedit_loc.setStyleSheet("background-color: #ff0000")
+        elif 1 in Locking_color:
+            self.Slineedit_loc.setStyleSheet("background-color: #ffff00")
+        elif 0 in Locking_color:
+            self.Slineedit_loc.setStyleSheet("background-color: #00ff00")
+        if 2 in Amplifier_color:
+            self.Slineedit_amp.setStyleSheet("background-color: #ff0000")
+        elif 1 in Amplifier_color:
+            self.Slineedit_amp.setStyleSheet("background-color: #ffff00")
+        elif 0 in Amplifier_color:
+            self.Slineedit_amp.setStyleSheet("background-color: #00ff00")
+        if 2 in Opa_color and len(Opa_color) > 0:
+            self.Slineedit_opa.setStyleSheet("background-color: #ff0000")
+        elif 1 in Opa_color and len(Opa_color) > 0:
+            self.Slineedit_opa.setStyleSheet("background-color: #ffff00")
+        elif 0 in Opa_color and len(Opa_color) > 0:
+            self.Slineedit_opa.setStyleSheet("background-color: #00ff00")
+        else:
+            self.Slineedit_opa.setStyleSheet("background-color: gray")
+        if 2 in Energy_color:
+            self.Slineedit_nrg.setStyleSheet("background-color: #ff0000")
+        elif 1 in Energy_color:
+            self.Slineedit_nrg.setStyleSheet("background-color: #ffff00")
+        elif 0 in Energy_color:
+            self.Slineedit_nrg.setStyleSheet("background-color: #00ff00")
+        if 2 in VirtualUN_color:
+            self.Slineedit_vun.setStyleSheet("background-color: #ff0000")
+        elif 1 in VirtualUN_color:
+            self.Slineedit_vun.setStyleSheet("background-color: #ffff00")
+        elif 0 in VirtualUN_color:
+            self.Slineedit_vun.setStyleSheet("background-color: #00ff00")
+        if 2 in Feedback_color:
+            self.Slineedit_fbk.setStyleSheet("background-color: #ff0000")
+        elif 1 in Feedback_color:
+            self.Slineedit_fbk.setStyleSheet("background-color: #ffff00")
+        elif 0 in Feedback_color:
+            self.Slineedit_fbk.setStyleSheet("background-color: #00ff00")
+        # analisi precondizioni accensione laser
+        if (2 not in Controls_color) and (2 not in Temperature_color) and (2 not in Trigger_color) and (2 not in Oscillator_color):
+            if devprodic['sl/misc/ranges'].On_Condition != 1:
+                try:
+                    devprodic['sl/misc/ranges'].write_attribute('On_Condition',1)
+                except:
+                    errore = 'sl/misc/ranges/On_Condition CommunicationFailed'
+                    voce = time.ctime()[4:19] + ' ' + errore
+                    item = QListWidgetItem(str(voce))
+                    color = QColor(int(1),int(0),int(0))
+                    item.setTextColor(color)
+                    self.Serrorbox.insertItem(0, item)
+        else:
+            if devprodic['sl/misc/ranges'].On_Condition != 0:
+                try:
+                    devprodic['sl/misc/ranges'].write_attribute('On_Condition',0)
+                except:
+                    errore = 'sl/misc/ranges/On_Condition CommunicationFailed'
+                    voce = time.ctime()[4:19] + ' ' + errore
+                    item = QListWidgetItem(str(voce))
+                    color = QColor(int(1),int(0),int(0))
+                    item.setTextColor(color)
+                    self.Serrorbox.insertItem(0, item)
+        # analisi condizione laser On,Standby,Off
+        if (2 not in Oscillator_color) and (2 not in Locking_color) and (2 not in Amplifier_color) and (2 not in Energy_color):# laser ON
+            self.Sstato_R.setText('ON')
+            self.Sstato_R.setStyleSheet("background-color: #00ff00")
+#            self.Sbutton_on.setStyleSheet("background-color: #00ff00")
+#            self.Sbutton_standby.setStyleSheet("background-color: light gray")
+#            self.Sbutton_off.setStyleSheet("background-color: light gray")
+        elif (2 not in Oscillator_color) and (2 not in Locking_color) and (2 in Amplifier_color) and (0 not in Energy_color):# laser STANDBY
+            self.Sstato_R.setText('STANDBY')
+            self.Sstato_R.setStyleSheet("background-color: #ff0000")
+#            self.Sbutton_on.setStyleSheet("background-color: light gray")
+#            self.Sbutton_standby.setStyleSheet("background-color: #00ff00")
+#            self.Sbutton_off.setStyleSheet("background-color: light gray")
+        elif (2 not in Oscillator_color) and (2 in Locking_color) and (0 not in Amplifier_color) and (0 not in Energy_color):# laser OFF
+            self.Sstato_R.setText('OFF')
+            self.Sstato_R.setStyleSheet("background-color: #ff0000")
+#            self.Sbutton_on.setStyleSheet("background-color: light gray")
+#            self.Sbutton_standby.setStyleSheet("background-color: light gray")
+#            self.Sbutton_off.setStyleSheet("background-color: #00ff00")
+        else:# unknown
+            self.Sstato_R.setText('UNKNOWN')
+            self.Sstato_R.setStyleSheet("background-color: #ff0000")
+#            self.Sbutton_on.setStyleSheet("background-color: light gray")
+#            self.Sbutton_standby.setStyleSheet("background-color: light gray")
+#            self.Sbutton_off.setStyleSheet("background-color: light gray")
+        self.Sprogressbar.setValue(0)
+
+    def procedura_accensione(self): #fel1 elite1
+        self.msgBox = QMessageBox()
+        self.msgBox.setIcon(QMessageBox.Question)
+        self.msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
+        self.msgBox.setText("...turning on SeedLaser. Are you sure you want to proceed?")
+        risp = self.msgBox.exec_()
+        if risp == 1024: #!!!!!!!!!!!!!
+            info = 'turning on SEED'
+            voce = time.ctime()[4:19] + ' ' + info
+            item = QListWidgetItem(str(voce))
+            color = QColor(int(0),int(0),int(1))
+            item.setTextColor(color)
+            self.Serrorbox.insertItem(0, item)
+            #leggo stato pompe
+            if sistemi == 1 or sistemi == 12:
+                C301 = devprodic['sl/laser/evops_sl.01'].Current
+                S301 = str(devprodic['sl/laser/evops_sl.01'].command_inout('State'))
+            if sistemi == 2 or sistemi == 12:
+                Crev = devprodic['sl/laser/evops_sl.03'].Current
+                Srev = str(devprodic['sl/laser/evops_sl.03'].command_inout('State'))
+            # accendo i laser che devono lavorare (in base a variabile sistemi)
+            if sistemi == 1 or sistemi == 12:
+                if S301 == 'ON' and C301 > 1:
+                    devprodic['sl/laser/evops_sl.01'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_01_Current_set)
+                elif S301 == 'ON' and C301 < 1:
+                    devprodic['sl/laser/evops_sl.01'].command_inout('Off')
+                    time.sleep(1)
+                    devprodic['sl/laser/evops_sl.01'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_01_Current_set)
+                    time.sleep(0.2)
+                    devprodic['sl/laser/evops_sl.01'].command_inout('Run')
+                    time.sleep(0.2)
+                elif S301 != 'ON':
+                    devprodic['sl/laser/evops_sl.01'].command_inout('Off')
+                    time.sleep(1)
+                    devprodic['sl/laser/evops_sl.01'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_01_Current_set)
+                    time.sleep(0.2)
+                    devprodic['sl/laser/evops_sl.01'].command_inout('Run')
+                    time.sleep(0.2)
+            if sistemi == 2 or sistemi == 12:
+                if Srev == 'ON' and Crev > 1:
+                    devprodic['sl/laser/evops_sl.03'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_03_Current_set)
+                elif Srev == 'ON' and Crev < 1:
+                    devprodic['sl/laser/evops_sl.03'].command_inout('Off')
+                    time.sleep(1)
+                    devprodic['sl/laser/evops_sl.03'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_03_Current_set)
+                    time.sleep(0.2)
+                    devprodic['sl/laser/evops_sl.03'].command_inout('Run')
+                    time.sleep(0.2)
+                elif Srev != 'ON':
+                    devprodic['sl/laser/evops_sl.03'].command_inout('Off')
+                    time.sleep(1)
+                    devprodic['sl/laser/evops_sl.03'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_03_Current_set)
+                    time.sleep(0.2)
+                    devprodic['sl/laser/evops_sl.03'].command_inout('Run')
+                    time.sleep(0.2)
+            Stmu = devprodic['sl/timing/tmu_sl.01'].LockStatus
+            # controllo locking
+            if Stmu != 'Locked on Cross Correlator Signal':
+                devprodic['sl/timing/tmu_sl.01'].command_inout('Lock')
+                time.sleep(60)
+            # controllo sdg
+            if sistemi == 1 or sistemi == 12:
+                devprodic['sl/delay/sdg_slr.01'].command_inout('ResetBwd')
+                time.sleep(1)
+                ssdg1 = devprodic['sl/timing/timing_sl.01'].PC1sdg1Enable
+                ssdg2 = devprodic['sl/timing/timing_sl.01'].PC2sdg1Enable
+                if ssdg1 == 0:
+                    devprodic['sl/timing/timing_sl.01'].write_attribute('PC1sdg1Enable', 1)
+                if ssdg2 == 0:
+                    devprodic['sl/timing/timing_sl.01'].write_attribute('PC2sdg1Enable', 1)
+            if sistemi == 2 or sistemi == 12:
+                devprodic['sl/delay/sdg_slr.02'].command_inout('ResetBwd')
+                time.sleep(1)
+                ssdg1 = devprodic['sl/timing/timing_sl.01'].PC1sdg2Enable
+                ssdg2 = devprodic['sl/timing/timing_sl.01'].PC2sdg2Enable
+                if ssdg1 == 0:
+                    devprodic['sl/timing/timing_sl.01'].write_attribute('PC1sdg2Enable', 1)
+                if ssdg2 == 0:
+                    devprodic['sl/timing/timing_sl.01'].write_attribute('PC2sdg2Enable', 1)
+            #verifiche
+            time.sleep(60)
+            check = 0
+            Stmu = devprodic['sl/timing/tmu_sl.01'].LockStatus
+            if Stmu == 'Locked on Cross Correlator Signal':
+                check += 1
+            if sistemi == 1 or sistemi == 12:
+                S301 = str(devprodic['sl/laser/evops_sl.01'].command_inout('State'))
+                if S301 == 'ON':
+                    check += 1
+                C301 = devprodic['sl/laser/evops_sl.01'].Current
+                if C301 >= devprodic['sl/misc/ranges'].evops_sl_01_Current_ok:
+                    check += 1
+                ssdg11 = devprodic['sl/timing/timing_sl.01'].PC1sdg1Enable
+                if ssdg11 == 1:
+                    check += 1
+                ssdg12 = devprodic['sl/timing/timing_sl.01'].PC2sdg1Enable
+                if ssdg12 == 1:
+                    check += 1
+            if sistemi == 2 or sistemi == 12:
+                Srev = str(devprodic['sl/laser/evops_sl.03'].command_inout('State'))
+                if Srev == 'ON':
+                    check += 1
+                Crev = devprodic['sl/laser/evops_sl.03'].Current
+                if Crev >= devprodic['sl/misc/ranges'].evops_sl_03_Current_ok:
+                    check += 1
+                ssdg21 = devprodic['sl/timing/timing_sl.01'].PC1sdg2Enable
+                if ssdg21 == 1:
+                    check += 1
+                ssdg22 = devprodic['sl/timing/timing_sl.01'].PC2sdg2Enable
+                if ssdg22 == 1:
+                    check += 1
+            if sistemi == 1:
+                goal = 5
+            elif sistemi == 2:
+                goal = 5
+            elif sistemi == 12:
+                goal = 9
+            if check == goal:
+                self.msgBox = QMessageBox()
+                self.msgBox.setIcon(QMessageBox.Information)
+                self.msgBox.setText("Procedure complete. Wait 30 minutes for laser warmed up.")
+                self.msgBox.exec_()
+                info = 'ON procedure complete'
+                voce = time.ctime()[4:19] + ' ' + info
+                item = QListWidgetItem(str(voce))
+                color = QColor(int(0),int(0),int(1))
+                item.setTextColor(color)
+                self.Serrorbox.insertItem(0, item)
+            else:
+                #procedura fallita, avvisa tutti
+                self.msgBox = QMessageBox()
+                self.msgBox.setIcon(QMessageBox.Critical)
+                self.msgBox.setText("Procedure fail. You can try again or use manual procedure from WIKI.")
+                self.msgBox.exec_()
+                errore = 'ON procedure fail'
+                voce = time.ctime()[4:19] + ' ' + errore
+                item = QListWidgetItem(str(voce))
+                color = QColor(int(1),int(0),int(0))
+                item.setTextColor(color)
+                self.Serrorbox.insertItem(0, item)
+            self.attaccatutto() #abilito allarmi acustici
+
+    def procedura_parcheggio(self):
+        # chiedi conferma
+        self.msgBox = QMessageBox()
+        self.msgBox.setIcon(QMessageBox.Question)
+        self.msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
+        self.msgBox.setText("Are you sure you want to put SEED in standby?")
+        risp = self.msgBox.exec_()
+        if risp == 1024: #!!!!!!!!!!!!!!!!!!
+            info = 'turning standby SEED'
+            voce = time.ctime()[4:19] + ' ' + info
+            item = QListWidgetItem(str(voce))
+            self.Serrorbox.insertItem(0, item)
+            self.staccatutto() #disabilito allarmi acustici
+            voce = time.ctime()[4:19] + ' alarms OFF'
+            item = QListWidgetItem(str(voce))
+            self.Serrorbox.insertItem(0, item)
+            # controllo stato laser
+            C301 = devprodic['sl/laser/evops_sl.01'].Current
+            S301 = str(devprodic['sl/laser/evops_sl.01'].command_inout('State'))
+            Crev = devprodic['sl/laser/evops_sl.03'].Current
+            Srev = str(devprodic['sl/laser/evops_sl.03'].command_inout('State'))
+            if S301 == 'ON' and C301 > 1:
+                devprodic['sl/laser/evops_sl.01'].write_attribute('Current', 10.0)
+            elif S301 == 'ON' and C301 < 1:
+                devprodic['sl/laser/evops_sl.01'].command_inout('Off')
+                time.sleep(1)
+                devprodic['sl/laser/evops_sl.01'].write_attribute('Current', 10.0)
+                time.sleep(0.2)
+                devprodic['sl/laser/evops_sl.01'].command_inout('Run')
+                time.sleep(0.2)
+            elif S301 != 'ON':
+                devprodic['sl/laser/evops_sl.01'].command_inout('Off')
+                time.sleep(1)
+                devprodic['sl/laser/evops_sl.01'].write_attribute('Current', 10.0)
+                time.sleep(0.2)
+                devprodic['sl/laser/evops_sl.01'].command_inout('Run')
+                time.sleep(0.2)
+            if Srev == 'ON' and Crev > 1:
+                devprodic['sl/laser/evops_sl.03'].write_attribute('Current', 10.0)
+            elif Srev == 'ON' and Crev < 1:
+                devprodic['sl/laser/evops_sl.03'].command_inout('Off')
+                time.sleep(1)
+                devprodic['sl/laser/evops_sl.03'].write_attribute('Current', 10.0)
+                time.sleep(0.2)
+                devprodic['sl/laser/evops_sl.03'].command_inout('Run')
+                time.sleep(0.2)
+            elif Srev != 'ON':
+                devprodic['sl/laser/evops_sl.03'].command_inout('Off')
+                time.sleep(1)
+                devprodic['sl/laser/evops_sl.03'].write_attribute('Current', 10.0)
+                time.sleep(0.2)
+                devprodic['sl/laser/evops_sl.03'].command_inout('Run')
+                time.sleep(0.2)
+            self.msgBox = QMessageBox()
+            self.msgBox.setIcon(QMessageBox.Information)
+            self.msgBox.setText("Procedure complete. SEED is set to stanby condition.")
+            self.msgBox.exec_()
+
+    def procedura_spegnimento(self):
+        # chiedi conferma
+        self.msgBox = QMessageBox()
+        self.msgBox.setIcon(QMessageBox.Question)
+        self.msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
+        self.msgBox.setText("Are you sure you want to turn OFF SeedLaser?")
+        risp = self.msgBox.exec_()
+        if risp == 1024: #!!!!!!!!!!!!!!!!!!!!
+            info = 'turning off SEED'
+            voce = time.ctime()[4:19] + ' ' + info
+            item = QListWidgetItem(str(voce))
+            self.Serrorbox.insertItem(0, item)
+            self.staccatutto() #disabilito allarmi acustici
+            voce = time.ctime()[4:19] + ' alarms OFF'
+            item = QListWidgetItem(str(voce))
+            self.Serrorbox.insertItem(0, item)
+            if sistemi == 1 or sistemi == 12:
+                devprodic['sl/laser/evops_sl.01'].command_inout('Off')
+            if sistemi == 2 or sistemi == 12:
+                devprodic['sl/laser/evops_sl.03'].command_inout('Off')
+            self.msgBox = QMessageBox()
+            self.msgBox.setIcon(QMessageBox.Information)
+            self.msgBox.setText("Procedure complete. SEED is turned off.")
+            self.msgBox.exec_()
+
+    def Show(self):
+        ditata = self.sender()
+        datinmostra = list()
+        for cammina in range(len(self.s)):
+            if self.s[cammina].Subsystem == ditata.impronta and self.s[cammina].Active == '1':
+                #"Help;description;VALUE;Device/Attribute;min alarm;min warning;max warning;max alarm;alarm:nwrong/alarmicycles:Subsystem"
+                #9 ok, 10 reperibile, 11 script, 12 procedura, 13 help
+                datinmostra.append([self.s[cammina].Description, str(self.s[cammina].read), self.s[cammina].Device + '/' + self.s[cammina].Attribute, str(self.s[cammina].ref[2]), str(self.s[cammina].ref[0]), str(self.s[cammina].ref[1]), str(self.s[cammina].ref[3]), str(self.s[cammina].n_wrong) + '/' + str(self.s[cammina].AlarmCycles), self.s[cammina].AlarmON, self.s[cammina].Subsystem, self.s[cammina].ok, self.s[cammina].wikiReperibile, self.s[cammina].Script, self.s[cammina].wikiProcedure, self.s[cammina].helpMessage])
+        self.sipuofare = tabelliamo()
+        self.sipuofare.riempi(datinmostra)
+        self.sipuofare.setWindowTitle("Show " + ditata.impronta)
+        self.sipuofare.resize(screen.width()/2, 30+35*len(datinmostra))
+        self.sipuofare.show()
+
+    def mostrami_tutto(self):
+        datinmostra = list()
+        for cammina in range(len(self.s)):
+            if self.s[cammina].Active == '1':
+                #"Help;description;VALUE;Device/Attribute;min alarm;min warning;max warning;max alarm;alarm:nwrong/alarmicycles:Subsystem"
+                #9 ok, 10 reperibile, 11 script, 12 procedura, 13 help
+                datinmostra.append([self.s[cammina].Description, str(self.s[cammina].read), self.s[cammina].Device + '/' + self.s[cammina].Attribute, str(self.s[cammina].ref[2]), str(self.s[cammina].ref[0]), str(self.s[cammina].ref[1]), str(self.s[cammina].ref[3]), str(self.s[cammina].n_wrong) + '/' + str(self.s[cammina].AlarmCycles), self.s[cammina].AlarmON, self.s[cammina].Subsystem, self.s[cammina].ok, self.s[cammina].wikiReperibile, self.s[cammina].Script, self.s[cammina].wikiProcedure, self.s[cammina].helpMessage])
+        self.sipuofare = tabelliamo()
+        self.sipuofare.riempi(datinmostra)
+        self.sipuofare.setWindowTitle("Show ALL")
+        self.sipuofare.resize(screen.width()/2,screen.width()/2)
+        self.sipuofare.show()
+
+    def configurare(self):
+        text, ok = QInputDialog.getText(self, 'Input Dialog', 'Make a try:')
+        if ok:
+            if str(text) == "LfoUser":
+                self.listButton = QPushButton("Change LIST")
+                self.limitsButton = QPushButton("Change LIMITS")
+                self.wikiButton = QPushButton("Disable all alarms")
+                self.jiveButton = QPushButton("Enable all alarms")
+                self.buttonBox = QDialogButtonBox(Qt.Vertical)
+                self.buttonBox.addButton(self.listButton, QDialogButtonBox.ActionRole)
+                self.buttonBox.addButton(self.limitsButton, QDialogButtonBox.ActionRole)
+                self.buttonBox.addButton(self.wikiButton, QDialogButtonBox.ActionRole)
+                self.buttonBox.addButton(self.jiveButton, QDialogButtonBox.ActionRole)
+                self.listButton.pressed.connect(self.cambialista)
+                self.limitsButton.pressed.connect(self.cambialimiti)
+                self.wikiButton.pressed.connect(self.staccatutto)
+                self.jiveButton.pressed.connect(self.attaccatutto)
+                self.buttonBox.show()
+            else:
+                self.error = QErrorMessage()
+                self.error.showMessage('Wrong input key. Try again')
+
+    def cambialimiti(self):
+        self.buttonBox.close()
+        datinmostra = list()
+        for cammina in range(len(self.s)):
+            if self.s[cammina].Type == '1' and self.s[cammina].Active == '1':
+                datinmostra.append([self.s[cammina].Subsystem, self.s[cammina].Device, self.s[cammina].Attribute, str(self.s[cammina].ref[2]), str(self.s[cammina].ref[0]), str(self.s[cammina].read), str(self.s[cammina].ref[1]), str(self.s[cammina].ref[3])])
+        self.corstruttore = tabelliamo2()
+        self.corstruttore.riempi(datinmostra)
+        self.corstruttore.resize(screen.width()/2,screen.width()/2)
+        self.corstruttore.setWindowTitle("Change Limits")
+        self.corstruttore.show()
+
+    def cambialista(self):
+        self.buttonBox.close()
+        self.datinmostra = list()
+        with open(nomefile) as csvfile:
+            spamreader = csv.reader(csvfile, delimiter=',', quotechar='"')
+            for row in spamreader:
+                #"Active;Device;Attribute;Type;Subsystem;AlarmON;AlarmCycles;Autofix;Description;wikiReperibile;wikiProcedure;Script;helpMessage"
+                self.datinmostra.append([str(row[0]), str(row[1]), str(row[2]), str(row[3]), str(row[4]), str(row[5]), str(row[6]), str(row[7]), str(row[8]), str(row[9]), str(row[10]), str(row[11]), str(row[12])])
+        self.sipuofare = tabelliamo3()
+        self.sipuofare.riempi(self.datinmostra)
+        self.sipuofare.resize(screen.width()/2,screen.width()/2)
+        self.sipuofare.setWindowTitle("Change List")
+        self.sipuofare.show()
+
+    def staccatutto(self):
+        cideveessereunmetodomigliore = []
+        with open(nomefile) as csvRfile:
+            spamreader = csv.reader(csvRfile, delimiter=',', quotechar='"')
+            for row in spamreader:
+                if row[5] == '1':
+                    row[5] = '2'
+                cideveessereunmetodomigliore.append(row)
+        csvRfile.close()
+        with open(nomefile, 'wb') as csvWfile:
+            spamwriter = csv.writer(csvWfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
+            for ind in range(len(cideveessereunmetodomigliore)):
+                spamwriter.writerow(cideveessereunmetodomigliore[ind])
+        csvWfile.close()
+
+    def attaccatutto(self):
+        cideveessereunmetodomigliore = []
+        with open(nomefile) as csvRfile:
+            spamreader = csv.reader(csvRfile, delimiter=',', quotechar='"')
+            for row in spamreader:
+                if row[5] == '2':
+                    row[5] = '1'
+                cideveessereunmetodomigliore.append(row)
+        csvRfile.close()
+        with open(nomefile, 'wb') as csvWfile:
+            spamwriter = csv.writer(csvWfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
+            for ind in range(len(cideveessereunmetodomigliore)):
+                spamwriter.writerow(cideveessereunmetodomigliore[ind])
+        csvWfile.close()
+
+    def manutenzionefinta(self):
+        print('ao')
+        if self.Sbutton_manutenzione.styleSheet() == 'background-color: light gray':
+            self.staccatutto()
+        else:
+            self.attaccatutto()
+
+    def istruzioni(self):
+        os.system('firefox http://acswww.elettra.trieste.it/Fermi/Procedures/Lasers/sinoseed &')
+        pass
+
+class tabelliamo(QTableWidget): #tabelle SHOW
+    def __init__(self, parent=None):
+        super(tabelliamo, self).__init__(parent)
+        self.setColumnCount(11)
+        self.setHorizontalHeaderLabels(QString("Help;Description;VALUE;Attribute;min_Alarm;min_Warning;max_Warning;max_Alarm;Out_of_range;Alarm ON;Subsystem").split(";"))
+
+    def riempi(self, input1):
+        self.setRowCount(len(input1))
+        for ind in range(len(input1)):
+            bott1 = QPushButton(self)
+            bott1.setText('Info')
+            bott1.clicked.connect(self.informalo)
+            bott1.setToolTip(input1[ind][14])#14 help message
+            bott1.in1 = str(input1[ind][12]) #12 script
+            bott1.in2 = str(input1[ind][13]) #13 wiki
+            bott1.in3 = str(input1[ind][11]) #11 reperibile
+            self.setCellWidget(ind,0,bott1)
+            for ice in range(len(input1[0])-1): #colonna
+                elementonuovo = QTableWidgetItem(input1[ind][ice])
+                if ice == 1 and input1[ind][10] == 0:
+                    elementonuovo.setBackground(QColor(0,255,0))
+                elif ice == 1 and input1[ind][10] == 1:
+                    elementonuovo.setBackground(QColor(255,255,0))
+                elif ice == 1 and input1[ind][10] >= 2:
+                    elementonuovo.setBackground(QColor(255,0,0))
+                elif ice == 1 and input1[ind][10] == -99:
+                    elementonuovo.setBackground(QColor(0,0,255))
+                if ice in [8] and input1[ind][ice] == '1':
+                    elementonuovo = QTableWidgetItem('ON')
+                elif ice in [8] and input1[ind][ice] != '1':
+                     elementonuovo = QTableWidgetItem('OFF')
+                     #elementonuovo.setBackground(QColor(255,255,0))
+                self.setItem(ind,ice+1,elementonuovo)
+        self.resizeColumnsToContents()
+
+    def wikalo(self):
+        ditata = self.sender()
+        a=ditata.toolTip()
+        os.system('firefox ' + str(a) + ' &')
+
+    def launchalo(self):
+        ditata = self.sender()
+        a=ditata.toolTip()
+        os.system('python ' + str(a) + ' &')
+
+    def stutalo(self):
+        self.close()
+
+    def informalo(self):
+        ditata = self.sender()
+        a=ditata.toolTip()
+        dialog = QMessageBox()
+        dialog.setText(a)
+        if ditata.in1 != 'x':
+            ScriptButton = QPushButton("Script")
+            ScriptButton.setToolTip(ditata.in1)
+            dialog.addButton(ScriptButton, QMessageBox.ActionRole)
+            ScriptButton.pressed.connect(self.launchalo)
+            dialog.setDefaultButton(ScriptButton)
+        if ditata.in2 != 'x':
+            WIKIButton = QPushButton("WIKI")
+            WIKIButton.setToolTip(ditata.in2)
+            dialog.addButton(WIKIButton, QMessageBox.ActionRole)
+            WIKIButton.pressed.connect(self.wikalo)
+        if ditata.in3 != 'x':
+            ReperibileButton = QPushButton("Reperibile")
+            ReperibileButton.setToolTip(ditata.in3)
+            dialog.addButton(ReperibileButton, QMessageBox.ActionRole)
+            ReperibileButton.pressed.connect(self.wikalo)
+        CloseButton = QPushButton("Close")
+        CloseButton.setToolTip(ditata.in1)
+        dialog.addButton(CloseButton, QMessageBox.ActionRole)
+        CloseButton.pressed.connect(self.stutalo)
+        dialog.exec_()
+
+class tabelliamo2(QDialog): #tabelle CHANGE LIMITS
+    def __init__(self, parent=None):
+        super(tabelliamo2, self).__init__(parent)
+        self.tabella = QTableWidget()
+        self.tabella.setColumnCount(8)
+        self.tabella.setHorizontalHeaderLabels(QString("Subsystem;Device;Attribute;min alarm;min warning;last VALUE;max warning;max alarm").split(";"))
+        self.button1 = QPushButton("CHANGE")
+        self.button2 = QPushButton("Cancel")
+        self.button1.pressed.connect(self.dajedidb)
+        self.button2.pressed.connect(self.chiudi)
+    def riempi(self, input1):
+        self.tabella.setRowCount(len(input1))
+        for ind in range(len(input1)):
+            for ice in range(len(input1[0])):
+                elementonuovo = QTableWidgetItem(input1[ind][ice])
+                if ice == 3:
+                    elementonuovo.setBackground(QColor(255,0,0))
+                elif ice == 4:
+                    elementonuovo.setBackground(QColor(255,255,0))
+                elif ice == 6:
+                    elementonuovo.setBackground(QColor(255,255,0))
+                elif ice == 7:
+                    elementonuovo.setBackground(QColor(255,0,0))
+                self.tabella.setItem(ind,ice,elementonuovo)
+        self.tabella.resizeColumnsToContents()
+        altrolay = QVBoxLayout()
+        altrolay.addWidget(self.tabella)
+        altrolay.addWidget(self.button1)
+        altrolay.addWidget(self.button2)
+        self.setLayout(altrolay)
+        self.resize(screen.width(),screen.width())
+
+    def dajedidb(self):
+        # 'scarica' tabella, traduci str(float()), confronta, scrivi
+        for ind in range(self.tabella.rowCount()):
+            cambiati = 0
+            device = str(self.tabella.item(ind,1).text())
+            attributo = str(self.tabella.item(ind,2).text())
+            dev = PyTango.DeviceProxy(device)
+            altro = dev.get_attribute_config_ex(attributo)
+            #MIN ALARM
+            datooriginale_min_alarm = altro[0].alarms.min_alarm
+            if datooriginale_min_alarm != 'Not specified':
+                datooriginale_min_alarm = str(float(altro[0].alarms.min_alarm))
+            datonuovo_min_alarm = self.tabella.item(ind,3).text()
+            if datonuovo_min_alarm == 'None':
+                datonuovo_min_alarm = 'Not specified'
+            if datooriginale_min_alarm != datonuovo_min_alarm:
+                altro[0].alarms.min_alarm = str(datonuovo_min_alarm)
+                cambiati = cambiati + 1
+            #MIN WARNING
+            datooriginale_min_warning = altro[0].alarms.min_warning
+            if datooriginale_min_warning != 'Not specified':
+                datooriginale_min_warning = str(float(altro[0].alarms.min_warning))
+            datonuovo_min_warning = self.tabella.item(ind,4).text()
+            if datonuovo_min_warning == 'None':
+                datonuovo_min_warning = 'Not specified'
+            if datooriginale_min_warning != datonuovo_min_warning:
+                altro[0].alarms.min_warning = str(datonuovo_min_warning)
+                cambiati = cambiati + 1
+            #MAX WARNING
+            datooriginale_max_warning= altro[0].alarms.max_warning
+            if datooriginale_max_warning != 'Not specified':
+                datooriginale_max_warning = str(float(altro[0].alarms.max_warning))
+            datonuovo_max_warning = self.tabella.item(ind,6).text()
+            if datonuovo_max_warning == 'None':
+                datonuovo_max_warning = 'Not specified'
+            if datooriginale_max_warning != datonuovo_max_warning:
+                altro[0].alarms.max_warning = str(datonuovo_max_warning)
+                cambiati = cambiati + 1
+            #MAX ALARM
+            datooriginale_max_alarm = altro[0].alarms.max_alarm
+            if datooriginale_max_alarm != 'Not specified':
+                datooriginale_max_alarm = str(float(altro[0].alarms.max_alarm))
+            datonuovo_max_alarm = self.tabella.item(ind,7).text()
+            if datonuovo_max_alarm == 'None':
+                datonuovo_max_alarm = 'Not specified'
+            if datooriginale_max_alarm != datonuovo_max_alarm:
+                altro[0].alarms.max_alarm = str(datonuovo_max_alarm)
+                cambiati = cambiati + 1
+            if cambiati > 0:
+                dev.set_attribute_config(altro)
+
+    def chiudi(self):
+        self.done(0)
+
+class tabelliamo3(QDialog): #tabelle CHANGE LIST
+    def __init__(self, parent=None):
+        super(tabelliamo3, self).__init__(parent)
+        self.tabella = QTableWidget()
+        self.tabella.setColumnCount(13)
+        self.tabella.setHorizontalHeaderLabels(QString("Active;Device;Attribute;Type;Subsystem;AlarmON;AlarmCycles;Autofix;Description;wikiReperibile;wikiProcedure;Script;helpMessage").split(";"))
+        self.button1 = QPushButton("CHANGE")
+        self.button2 = QPushButton("Cancel")
+        self.button3 = QPushButton("add row")
+        self.button1.pressed.connect(self.scrivistocsv)
+        self.button2.pressed.connect(self.chiudi)
+        self.button3.pressed.connect(self.lineanuova)
+
+    def riempi(self, input1):
+        self.tabella.setRowCount(len(input1))
+        for ind in range(len(input1)):
+            for ice in range(len(input1[0])):
+                elementonuovo = QTableWidgetItem(input1[ind][ice])
+                self.tabella.setItem(ind,ice,elementonuovo)
+        self.tabella.resizeColumnsToContents()
+        altrolay = QVBoxLayout()
+        bottoni1 = QHBoxLayout()
+        bottoni2 = QHBoxLayout()
+        bottoni1.addWidget(self.button3)
+        bottoni1.addWidget(self.button1)
+        bottoni1.addWidget(self.button2)
+        altrolay.addWidget(self.tabella)
+        altrolay.addLayout(bottoni1)
+        self.setLayout(altrolay)
+        self.resize(screen.width(),screen.width())
+
+    def scrivistocsv(self):
+        indice = 0
+        with open(nomefile, 'wb') as csvfile:
+            spamwriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
+            for ind in range(self.tabella.rowCount()):
+                riga = list()
+                for ice in range(self.tabella.columnCount()):
+                    riga.append(self.tabella.item(ind,ice).text())
+                spamwriter.writerow(riga)
+        csvfile.close()
+
+    def lineanuova(self):
+        self.tabella.setRowCount(self.tabella.rowCount()+1)
+        for ice in range(self.tabella.columnCount()):
+            self.tabella.setItem(self.tabella.rowCount()+1,ice,QTableWidgetItem(' '))
+
+    def chiudi(self):
+        self.done(0)
+
+class elemento:
+    def __init__(self, Active, Device, Attribute, Type, Subsystem, AlarmON, AlarmCycles, Autofix, Description, wikiReperibile, wikiProcedure, Script, helpMessage, devpro):
+        self.Active = Active #0 disattivo, 1 attivo
+        self.Device = Device #STRINGA indirizzo device
+        self.Attribute = Attribute #STRINGA nome attributo
+        self.Type = Type #NUMERO 0 stringa, 1numero, 2 tangostate, 3 booleano che deve essere 1
+        self.Subsystem = Subsystem #STRINGA nome sottosistema
+        self.AlarmON = AlarmON #BOOL allarme si/no
+        self.AlarmCycles =  AlarmCycles #NUMERO di cicli di lettura "alarm" prima di accendere l-allarme
+        self.Autofix = Autofix #BOOL che fa partire lo scrip in automatico !!!nacora non implementato!!!
+        self.Description = Description #STRINGA descrizione attributo
+        self.wikiReperibile = wikiReperibile #STRINGA inirizzo pagina reperibilita
+        self.wikiProcedure = wikiProcedure #STRINGA indirizzo pagina procedura
+        self.Script = Script #STRINGA indirizzo script
+        self.helpMessage = helpMessage #STRINGA messaggio del bottone info
+        self.read = -1 #NUMERO spazio per storare lettura
+        self.ref = [0, 0, 0, 0] #VETTORE spazio per storare warning e alarm
+        self.ok = 0 #NUMERO 0-> ok, 1-> warning, 2-> alarm
+        self.n_reading = 0 #NUMERO contatore letture eseguite
+        self.n_wrong = 0 ##NUMERO contatore letture out of range consecutivi
+        self.devpro = devpro #EH tango device proxy
+
+    def lettura(self):
+        test_device = self.devpro
+        #caso stringa LockStatus
+        if self.Type == '0' and self.Attribute == 'LockStatus': 
+            try:
+                self.read = eval('test_device.' + self.Attribute) #lettura attributo
+            except PyTango.DevFailed:
+                self.read = 'No link'
+                self.ok = 2
+            self.ref[0] = 'None'
+            self.ref[1] = 'None'
+            self.ref[2] = 'None'
+            self.ref[3] = 'None'
+            self.n_reading = self.n_reading +1
+            if self.read == 'Locked on Cross Correlator Signal':
+                self.ok = 0
+                self.n_wrong = 0
+                self.read = 'Locked'
+            elif self.read != 'Locked on Cross Correlator Signal':
+                self.read = 'NOT Locked'
+                self.ok = 2
+                self.n_wrong = self.n_wrong +1
+        #caso numero
+        elif self.Type == '1': 
+            self.ok = 0
+            sfasatoreattivo = False
+            if str(test_device) == 'Evr(ec-sl-slpsr-01/evr/ff100000)': # valuto silent beam parte 1
+                if int(self.Attribute.split('Chan')[1].split('Delay')[0]) == 0:
+                    if str(devprodic['f/timing/rttrigger_sl.01'].State()) != 'OFF': #leggo valore
+                        sfasatoreattivo = True
+                    else: #silent beam attivo
+                        sfasatoreattivo = False
+                elif int(self.Attribute.split('Chan')[1].split('Delay')[0]) == 1:
+                    if str(devprodic['f/timing/rttrigger_sl.02'].State()) != 'OFF': #leggo valore
+                        sfasatoreattivo = True
+                    else: #silent beam attivo
+                        sfasatoreattivo = False
+                elif int(self.Attribute.split('Chan')[1].split('Delay')[0]) == 2:
+                    if str(devprodic['f/timing/rttrigger_sl.03'].State()) != 'OFF': #leggo valore
+                        sfasatoreattivo = True
+                    else: #silent beam attivo
+                        sfasatoreattivo = False
+            try:
+                self.read = eval('test_device.' + self.Attribute) #lettura attributo
+            except PyTango.DevFailed:
+                self.read = 'No link'
+                self.ok = 2
+            tmp = test_device.get_attribute_config_ex(self.Attribute) #lettura limiti
+            if tmp[0].alarms.min_warning == 'Not specified':
+                self.ref[0] = 'None'
+            else:
+                self.ref[0] = float(tmp[0].alarms.min_warning)
+                if self.read >= self.ref[0]:
+                    self.ok = self.ok + 0
+                else:
+                    self.ok = self.ok + 1
+            if tmp[0].alarms.max_warning == 'Not specified':
+                self.ref[1] = 'None'
+            else:
+                self.ref[1] = float(tmp[0].alarms.max_warning)
+                if self.read <= self.ref[1]:
+                    self.ok = self.ok + 0
+                else:
+                    self.ok = self.ok + 1
+            if tmp[0].alarms.min_alarm == 'Not specified':
+                self.ref[2] = 'None'
+            else:
+                self.ref[2] = float(tmp[0].alarms.min_alarm)
+                if self.read > self.ref[2]:
+                    self.ok = self.ok + 0
+                else:
+                    self.ok = self.ok + 2
+            if tmp[0].alarms.max_alarm == 'Not specified':
+                self.ref[3] = 'None'
+            else:
+                self.ref[3] = float(tmp[0].alarms.max_alarm)
+                if self.read < self.ref[3]:
+                    self.ok = self.ok + 0
+                else:
+                    self.ok = self.ok + 2
+            self.n_reading = self.n_reading +1
+            if self.ok >= 2: #caso ALARM o WARNING+ALARM
+                self.ok = 2
+                self.n_wrong = self.n_wrong +1
+            elif self.ok == 1: #caso WARNING
+                self.n_wrong = self.n_wrong +1 #opinabile, si potrebbe decidere di far suonare allarmi solo per ALARM
+            elif self.ok == 0:
+                self.n_wrong = 0 #resetto il contatore
+            tmp = None
+            if sfasatoreattivo: # valuto silent beam parte 2
+                self.n_wrong = 0
+        #caso tango state
+        elif self.Type == '2': 
+            try:
+                self.read = str(test_device.command_inout('State'))
+            except PyTango.DevFailed:
+                self.read = 'No link'
+                self.ok = 2
+            self.ref[0] = 'None'
+            self.ref[1] = 'None'
+            self.ref[2] = 'None'
+            self.ref[3] = 'None'
+            self.n_reading = self.n_reading +1
+            if self.read == 'ON' or self.read == 'RUNNING' or self.read == 'OPEN':
+                self.ok = 0
+                self.n_wrong = 0
+            else:
+                self.ok = 2
+                self.n_wrong = self.n_wrong +1
+        #caso booleani (che devono essere true)
+        elif self.Type == '3': 
+            self.read = eval('test_device.' + self.Attribute) #lettura attributo
+            self.ref[0] = 'None'
+            self.ref[1] = 'None'
+            self.ref[2] = 0.9
+            self.ref[3] = 1.1
+            self.n_reading = self.n_reading +1
+            if self.read == 1:
+                self.ok = 0
+                self.n_wrong = 0
+            else:
+                self.ok = 2
+                self.n_wrong = self.n_wrong +1
+        #caso booleani (che devono essere false)
+        elif self.Type == '4': 
+            try:
+                self.read = eval('test_device.' + self.Attribute) #lettura attributo
+            except PyTango.DevFailed:
+                self.read = 'No link'
+                self.ok = 2
+            self.ref[0] = 'None'
+            self.ref[1] = 'None'
+            self.ref[2] = -0.1
+            self.ref[3] = 0.1
+            self.n_reading = self.n_reading +1
+            if self.read == 0:
+                self.ok = 0
+                self.n_wrong = 0
+            else:
+                self.ok = 2
+                self.n_wrong = self.n_wrong +1
+        #caso fabio rossi
+        elif self.Type == '5': #caso fabio rossi
+            try:
+                self.read = eval('test_device.' + self.Attribute) #lettura attributo
+            except PyTango.DevFailed:
+                self.read = 'No link'
+                self.ok = 2
+            self.ref[0] = 'None'
+            self.ref[1] = 'None'
+            self.ref[2] = 4.9
+            self.ref[3] = 5.1
+            self.n_reading = self.n_reading +1
+            if self.read == 5:
+                self.ok = 0
+                self.n_wrong = 0
+            else:
+                self.ok = 2
+                self.n_wrong = self.n_wrong +1
+        #caso virtual undulator
+        elif self.Type == '6': 
+            try:
+                self.read = eval('test_device.' + self.Attribute) #lettura attributo
+            except PyTango.DevFailed:
+                self.read = 'No link'
+                self.ok = 2
+            self.ref[0] = 'None'
+            self.ref[1] = 'None'
+            self.ref[2] = 1.9
+            self.ref[3] = 2.1
+            self.n_reading = self.n_reading +1
+            if self.read == 2:
+                self.ok = 0
+                self.n_wrong = 0
+            else:
+                self.ok = 2
+                self.n_wrong = self.n_wrong +1
+        #caso tango state per controlli
+        elif self.Type == '7': 
+            try:
+                self.read = str(test_device.command_inout('State'))
+            except PyTango.DevFailed:
+                self.read = 'No link'
+                self.ok = 2
+            self.ref[0] = 'None'
+            self.ref[1] = 'None'
+            self.ref[2] = 'None'
+            self.ref[3] = 'None'
+            self.n_reading = self.n_reading +1
+            if self.read != 'UNKNOW' and self.read != 'FAULT' and self.read != 'No link':
+                self.ok = 0
+                self.n_wrong = 0
+            else:
+                self.ok = 2
+                self.n_wrong = self.n_wrong +1
+        #caso tango state deve OFF
+        elif self.Type == '8': 
+            try:
+                self.read = str(test_device.command_inout('State'))
+            except PyTango.DevFailed:
+                self.read = 'No link'
+                self.ok = 2
+            self.ref[0] = 'None'
+            self.ref[1] = 'None'
+            self.ref[2] = 'None'
+            self.ref[3] = 'None'
+            self.n_reading = self.n_reading +1
+            if self.read == 'OFF':
+                self.ok = 0
+                self.n_wrong = 0
+            else:
+                self.ok = 1
+                self.n_wrong = self.n_wrong +1
+        #caso silent beam 
+        elif self.Type == '9': 
+            try:
+                self.read = str(test_device.command_inout('State'))
+            except PyTango.DevFailed:
+                self.read = 'No link'
+                self.ok = 2
+            self.ref[0] = 'None'
+            self.ref[1] = 'None'
+            self.ref[2] = 'None'
+            self.ref[3] = 'None'
+            self.n_reading = self.n_reading +1
+            if self.read == 'ON' or self.read == 'RUNNING':
+                self.ok = -99
+                self.n_wrong = 0
+            elif self.read == 'OFF':
+                self.ok = 0
+                self.n_wrong = 0
+            else:
+                self.ok = 2
+                self.n_wrong = self.n_wrong +1
+            tmp = None
+        test_device = None
+        #print(str(self.Device) + '/' + self.Attribute + 'value ' + str(self.read) + ' Vs ' + str(self.ref) + ' da ' + str(self.ok))
+
+    def statistica(self):
+        print(self.n_reading)
+        print(self.n_wrong)
+
+#####################
+if __name__ == '__main__':
+    app = QApplication([])
+    try:
+        tmpdim = sys.argv[1]
+        tmpdim = tmpdim.split('x')
+        dimensione = [float(tmpdim[0]), float(tmpdim[1])]
+    except:
+        screen = QDesktopWidget().screenGeometry()
+        larghezzaaltezza = [screen.width(), screen.height()]
+        print(larghezzaaltezza)
+        if max(larghezzaaltezza) > 3000:
+            dimensione = max(larghezzaaltezza)*0.38
+        elif max(larghezzaaltezza) > 2000:
+            dimensione = max(larghezzaaltezza)*0.6
+        elif max(larghezzaaltezza) > 1000:
+            dimensione = max(larghezzaaltezza)*0.7
+        else:
+            dimensione = max(larghezzaaltezza)*2
+    font_grande = QFont("Arial", round(dimensione/30.0), -1, False)
+    font_medio = QFont("Arial", round(dimensione/80.0), 1, False)
+    font_piccolo = QFont("Arial", round(dimensione/110.0), 1, False)
+    font_moltopiccolo = QFont("Arial", round(dimensione/130.0), -1, False)
+    app.setFont(font_piccolo)
+    window = MainWindow()
+    window.resize(larghezzaaltezza[0]/6, larghezzaaltezza[1]/6)
+    window.show()
+    app.exec_()