initial checkin of FanContol2
[vuplus_dvbapp-plugin] / fancontrol2 / src / plugin.py
diff --git a/fancontrol2/src/plugin.py b/fancontrol2/src/plugin.py
new file mode 100644 (file)
index 0000000..a9be39f
--- /dev/null
@@ -0,0 +1,1090 @@
+# FanControl2
+# joergm6 IHAD
+Version = "V2.4r4"
+import time
+import os
+from __init__ import _
+
+from enigma import eTimer, eSize
+
+# Config
+from Components.config import configfile, config, ConfigSubsection, ConfigNumber, ConfigInteger, ConfigSlider, ConfigSelection, ConfigYesNo, ConfigText
+from Components.config import getConfigListEntry
+from Components.Label import Label
+from Components.Sources.StaticText import StaticText
+from Components.Sources.Progress import Progress
+
+# Startup/shutdown notification
+from Tools import Notifications
+from Sensors import sensors
+from time import gmtime, strftime
+import datetime
+
+# Plugin
+from Plugins.Plugin import PluginDescriptor
+
+# GUI (Screens)
+from Screens.Screen import Screen
+from Components.ConfigList import ConfigListScreen
+from Screens.MessageBox import MessageBox
+from Screens.Console import Console
+from Screens import Standby 
+from Screens.MessageBox import MessageBox
+from Screens.Standby import TryQuitMainloop
+
+# GUI (Components)
+from Components.ActionMap import ActionMap
+from Components.ActionMap import NumberActionMap
+from Components.Harddisk import harddiskmanager
+
+def main(session,**kwargs):
+       try:
+               session.open(FanControl2Plugin)
+       except:
+               FClog("Pluginexecution failed")
+
+def mainMonitor(session,**kwargs):
+       try:
+               session.open(FanControl2Monitor)
+       except:
+               FClog("Pluginexecution failed")
+
+def Test0(wert):
+       return (1 if wert<=0 else wert)
+
+def skal(x, x1, x2, y1, y2):
+       if x > x2: return y2
+       if x < x1: return y1
+       m = (y2 - y1) / Test0(x2 - x1)
+       y = m * x + y1
+       return y
+
+def FClog(wert):
+       print "[FanControl2]",wert
+       while len(FC2Log) > config.plugins.FanControl.LogCount.value:
+               del FC2Log[5]
+       FC2Log.append(strftime("%H:%M:%S ") + wert)
+       if config.plugins.FanControl.EnableEventLog.value:
+               if Free(config.plugins.FanControl.LogPath.value):
+                       try:
+                               f = open(config.plugins.FanControl.LogPath.value + "FC2events.txt","a")
+                               try:
+                                       f.write(strftime("%H:%M:%S ") + wert + "\r\n")
+                               finally:
+                                       f.close()
+                       except IOError:
+                               FC2Log.append(strftime("%H:%M:%S ") + "Event-Log-Error")
+
+def FCdata():
+       global DataMinute
+       if strftime("%M")!=DataMinute and config.plugins.FanControl.EnableDataLog.value:
+               DataMinute = strftime("%M")
+               if Free(config.plugins.FanControl.LogPath.value):
+                       try:
+                               f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","a")
+                               try:
+                                       f.write(strftime("%Y.%m.%d %H:%M"))
+                                       for count in range(6):
+                                               f.write(";" + str(FC2werte[count]).replace(".",_(".")))
+                                       templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE)
+                                       tempcount = len(templist)
+                                       for count in range(tempcount):
+                                               f.write(";" + str(sensors.getSensorValue(count)))
+                                       f.write("\r\n")
+                               finally:
+                                       f.close()
+                       except IOError:
+                               FC2Log.append(strftime("%H:%M:%S ") + "Event-Log-Error")
+
+def Free(dir):
+       if not os.path.exists(dir):
+               return False
+       s = os.statvfs(dir)
+       return (s.f_bsize * s.f_bavail / 1024 / 1024) > 10
+
+def getVoltage(fanid):
+       f = open("/proc/stb/fp/fan_vlt", "r")
+       value = int(f.readline().strip(), 16)
+       f.close()
+       return value
+
+def setVoltage(fanid, value):
+       if value > 255:
+               return
+       f = open("/proc/stb/fp/fan_vlt", "w")
+       f.write("%x" % value)
+       f.close()
+
+def getPWM(fanid):
+       f = open("/proc/stb/fp/fan_pwm", "r")
+       value = int(f.readline().strip(), 16)
+       f.close()
+       return value
+
+def setPWM(fanid, value):
+       if value > 255:
+               return
+       f = open("/proc/stb/fp/fan_pwm", "w")
+       f.write("%x" % value)
+       f.close()
+
+# globale Variablen        
+ZielRPM = 0
+AktVLT = 0
+AktPWM = 0
+AktRPM = 0
+AktTemp = 0
+AktHDD = []
+LastVLT = 0
+LastPWM = 0
+FanFehler = 0
+OverheatTimer = 0
+Overheat = False
+FanOffWait = False
+Recording = False
+RPMread = 0
+RPMdiff = 0
+FirstStart = True
+RPMrunning = False
+istStandbySave = False
+disableHDDread = False
+session = None
+Box = ""
+DataMinute = ""
+FC2Log = []
+FC2werte = [0.1,0,0,0,0,0]
+FC2stunde = ["-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-"]
+HeadLine = "Time;Temp;RPM;VLT;PWM;HDD;Status;Temp1;Temp2;Temp3;Temp4;Temp5;Temp6;Temp7;Temp8\r\n"
+TempName = [
+       _("below Tunerslot 4"),
+       _("near XILINX Spartan"),
+       _("under the WLAN"),
+       _("left of the Battery"),
+       _("left near Front-CI"),
+       _("left near Card-Slot"),
+       _("over Security Card"),
+       _("under the Fan")
+]
+
+#Configuration
+config.plugins.FanControl = ConfigSubsection()
+config.plugins.FanControl.Fan = ConfigSelection(choices = [("disabled", _("disabled")), ("aus", _("Control disabled")), ("3pin", _("3Pin")), ("4pin", _("4Pin"))], default = "disabled")
+config.plugins.FanControl.StandbyOff = ConfigSelection(choices = [("false", _("no")), ("true", _("yes")), ("trueRec", _("yes, Except for Recording or HDD"))], default="false")
+config.plugins.FanControl.minRPM = ConfigSlider(default = 500, increment = 50, limits = (0, 1000))
+config.plugins.FanControl.maxRPM = ConfigSlider(default = 3000, increment = 50, limits = (500, 6000))
+config.plugins.FanControl.temp = ConfigSlider(default = 40, increment = 1, limits = (30, 50))
+config.plugins.FanControl.tempmax = ConfigSlider(default = 50, increment = 1, limits = (35, 55))
+config.plugins.FanControl.pwm = ConfigSlider(default = 130, increment = 5, limits = (0, 255))
+config.plugins.FanControl.vlt = ConfigSlider(default = 255, increment = 5, limits = (0, 255))
+config.plugins.FanControl.ShowError = ConfigSelection(choices = [("false", _("do nothing")), ("true", _("display Info")), ("shutdown", _("Box Shutdown"))], default="true")
+config.plugins.FanControl.ShutdownTemp = ConfigInteger(default = 65,limits = (50, 80))
+config.plugins.FanControl.AddOverheat = ConfigInteger(default = 0,limits = (0, 9))
+config.plugins.FanControl.DisableDMM = ConfigYesNo(default = False)
+config.plugins.FanControl.LogCount = ConfigInteger(default = 40,limits = (40, 999))
+config.plugins.FanControl.LogPath = ConfigText(default="/media/hdd/", fixed_size=False)
+config.plugins.FanControl.DeleteData = ConfigSelection(choices = [("0", _("no")), ("2", "2"), ("3", "3"), ("7", "7"), ("14", "14"), ("30", "30")], default="0")
+config.plugins.FanControl.EnableDataLog = ConfigYesNo(default = False)
+config.plugins.FanControl.EnableEventLog = ConfigYesNo(default = False)
+config.plugins.FanControl.CheckHDDTemp = ConfigSelection(choices = [("false", _("no")), ("true", _("yes")), ("auto", _("auto")), ("never", _("never"))], default="auto")
+config.plugins.FanControl.MonitorInExtension = ConfigYesNo(default = True)
+
+def GetFanRPM():
+       global RPMread
+       f = open("/proc/stb/fp/fan_speed", "r")
+       value = int(f.readline().strip()[:-4])
+       f.close()
+       if value > 0:
+               RPMread = 0
+       else:
+               RPMread += 1
+       value = int(value / 2)
+       return value
+
+def GetBox():
+       B = Box
+       if os.path.exists("/proc/stb/info/model"):
+               f = open("/proc/stb/info/model")
+               B = f.readline()
+               f.close()
+       return B
+
+def isDMMdisabled():
+       value = False
+       if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"):
+               FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "r")
+               text=FCfile.read()
+               FCfile.close()
+               if text.find("#Disabled by FC2 config.misc.standbyCounter.addNotifier") is not -1:
+                       value = True
+       return value
+
+def disableDMM():
+       if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"):
+               FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "r")
+               text=FCfile.read()
+               FCfile.close()
+               FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "w")
+               text=text.replace("config.misc.standbyCounter.addNotifier","#Disabled by FC2 config.misc.standbyCounter.addNotifier")
+               text=FCfile.write(text)
+               FCfile.close()
+               FClog("DMM-fancontrol disabled - please restart E2")
+
+def enableDMM():
+       if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"):
+               FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "r")
+               text=FCfile.read()
+               FCfile.close()
+               FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "w")
+               text=text.replace("#Disabled by FC2 config.misc.standbyCounter.addNotifier","config.misc.standbyCounter.addNotifier")
+               text=FCfile.write(text)
+               FCfile.close()
+
+class FanControl2Test(ConfigListScreen,Screen):
+       skin = """
+               <screen position="center,center" size="630,300" title="Fan Control 2 - Test" >
+                       <widget source="TextTest1" render="Label" position="5,20" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TextTest2" render="Label" position="5,50" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TextTest3" render="Label" position="5,80" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TextTest4" render="Label" position="5,130" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TextTest5" render="Label" position="5,160" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TextTest6" render="Label" position="5,190" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TextTest7" render="Label" position="5,220" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
+               </screen>"""
+
+
+       def __init__(self, session, args = 0):
+               self.session = session
+               Screen.__init__(self, session)
+
+               self.timer = eTimer()
+               self.timer.callback.append(self.DoTest)
+               self.timer.start(1000, True)
+
+               self["TextTest1"] = StaticText()
+               self["TextTest2"] = StaticText()
+               self["TextTest3"] = StaticText()
+               self["TextTest4"] = StaticText()
+               self["TextTest5"] = StaticText()
+               self["TextTest6"] = StaticText()
+               self["TextTest7"] = StaticText()
+
+               self["TextTest1"].setText(_("please wait (until 3min)..."))
+
+               self["actions"] = ActionMap(["OkCancelActions"], 
+               {
+                       "ok": self.cancel,
+                       "cancel": self.cancel
+               }, -1)
+
+       def VoltUp(self):
+               while GetFanRPM() < 100 and self.i < 255:
+                       setVoltage(self.id,self.i)
+                       time.sleep(0.3)
+                       self.i += 1
+
+       def VoltDown(self):
+               while GetFanRPM() > 100 and self.i > 0:
+                       setVoltage(self.id,self.i)
+                       time.sleep(1)
+                       self.i -= 1
+
+       def DoTest(self):
+               self.id = 0
+               self.i = 0
+               self.last = 0
+               self.rpm = 0
+               SaveAktVLT = AktVLT
+               SaveAktPWM = AktPWM
+               SaveFan = config.plugins.FanControl.Fan.value
+               config.plugins.FanControl.Fan.value = "aus"
+               if SaveFan == "4pin":
+                       setPWM(self.id,0)
+                       time.sleep(10)
+                       while GetFanRPM() < 100 and self.i < 255:
+                               setPWM(self.id,self.i)
+                               time.sleep(0.3)
+                               self.i += 1
+                       time.sleep(2)
+                       self.last=GetFanRPM()
+                       self["TextTest1"].setText(_("Min Fan Start %d rpm at PWM=%d") % (self.last, self.i))
+                       while GetFanRPM() > 100 and self.i > 1:
+                               setPWM(self.id,self.i)
+                               time.sleep(1)
+                               self.i -= 1
+                       ok = ("OK" if config.plugins.FanControl.minRPM.value >= self.last else (("!!>%d" % config.plugins.FanControl.minRPM.value)))
+                       self["TextTest2"].setText(_("Min Fan Stop %d rpm at PWM=%d (%s)") % (self.last, self.i, ok))
+
+                       setPWM(self.id,255)
+                       time.sleep(6)
+                       self.rpm = GetFanRPM()
+                       ok = ("OK" if config.plugins.FanControl.maxRPM.value <= self.rpm else ("!!<%d" % (config.plugins.FanControl.maxRPM.value)))
+                       self["TextTest3"].setText(_("Max Fan %d rpm at PWM=255 (%s)") % (self.rpm, ok))
+# extended
+                       self["TextTest4"].setText(_("Extended Control Range"))
+                       setPWM(self.id,0)
+                       time.sleep(10)
+                       self.rpm = GetFanRPM()
+                       if self.rpm > 0:
+                               setVoltage(self.id,0)
+                               time.sleep(10)
+                               self.VoltUp()
+                               time.sleep(3)
+                               self.last=GetFanRPM()
+                               self["TextTest5"].setText(_("Min Fan Start %d rpm at VLT=%d and PWM=0") % (self.last, self.i))
+                               self.VoltDown()
+                               ok = ("OK" if config.plugins.FanControl.minRPM.value >= self.last else (("!!>%d" % config.plugins.FanControl.minRPM.value)))
+                               self["TextTest6"].setText(_("Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)") % (self.last, self.i, ok))
+
+                       setPWM(self.id,255)
+                       setVoltage(self.id,255)
+                       time.sleep(6)
+                       self.rpm = GetFanRPM()
+                       ok = ("OK" if config.plugins.FanControl.maxRPM.value <= self.rpm else ("!!<%d" % (config.plugins.FanControl.maxRPM.value)))
+                       self["TextTest7"].setText(_("Max Fan %d rpm at PWM=255 and VLT=255 (%s)") % (self.rpm, ok))
+
+               if SaveFan == "3pin":
+                       setVoltage(self.id,0)
+                       time.sleep(10)
+                       self.VoltUp()
+                       time.sleep(3)
+                       self.last=GetFanRPM()
+                       self["TextTest1"].setText(_("Min Fan Start %d rpm at VLT=%d") % (self.last, self.i))
+                       self.VoltDown()
+                       ok = ("OK" if config.plugins.FanControl.minRPM.value >= self.last else ("!!>%d" % (config.plugins.FanControl.minRPM.value)))
+                       self["TextTest2"].setText(_("Min Fan Stop %d rpm at VLT=%d (%s)") % (self.last, self.i, ok))
+
+                       setVoltage(self.id,255)
+                       time.sleep(6)
+                       ok = ("OK" if config.plugins.FanControl.maxRPM.value <= GetFanRPM() else ("!!<%d" % (config.plugins.FanControl.maxRPM.value)))
+                       self["TextTest3"].setText(_("Max Fan %d rpm at VLT=255 (%s)") % (GetFanRPM(), ok))
+
+               setVoltage(self.id,SaveAktVLT)
+               setPWM(self.id,SaveAktPWM)
+               config.plugins.FanControl.Fan.value = SaveFan
+
+       def cancel(self):
+               self.close(False,self.session)
+
+class FanControl2Monitor(Screen, ConfigListScreen):
+       skin = """
+               <screen position="center,center" size="600,260" title="Fan Control 2 - Monitor">
+
+                       <widget source="TxtTemp0" render="Label" position="5,30" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtTemp1" render="Label" position="5,50" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtTemp2" render="Label" position="5,70" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtTemp3" render="Label" position="5,90" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtTemp4" render="Label" position="5,110" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtTemp5" render="Label" position="5,130" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtTemp6" render="Label" position="5,150" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtTemp7" render="Label" position="5,170" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtHDD" render="Label" position="5,190" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtFan" render="Label" position="5,210" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget name="TxtMinTemp" position="260,20" size="50,12" zPosition="1" font="Regular;12" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtFC2Temp" render="Label" position="398,20" size="50,12" zPosition="1" font="Regular;17" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget name="TxtMaxTemp" position="535,20" size="50,12" zPosition="1" font="Regular;12" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="ProTemp0" render="Progress" position="260,40" size="325,5" borderWidth="1" />
+                       <widget source="ProTemp1" render="Progress" position="260,60" size="325,5" borderWidth="1" />
+                       <widget source="ProTemp2" render="Progress" position="260,80" size="325,5" borderWidth="1" />
+                       <widget source="ProTemp3" render="Progress" position="260,100" size="325,5" borderWidth="1" />
+                       <widget source="ProTemp4" render="Progress" position="260,120" size="325,5" borderWidth="1" />
+                       <widget source="ProTemp5" render="Progress" position="260,140" size="325,5" borderWidth="1" />
+                       <widget source="ProTemp6" render="Progress" position="260,160" size="325,5" borderWidth="1" />
+                       <widget source="ProTemp7" render="Progress" position="260,180" size="325,5" borderWidth="1" />
+                       <widget source="ProHDD" render="Progress" position="260,200" size="325,5" borderWidth="1" />
+                       <widget source="ProFan" render="Progress" position="260,220" size="325,5" borderWidth="1" />
+
+               </screen>"""
+       
+       def __init__(self, session, args = None):
+               Screen.__init__(self, session)
+
+               self.temp_timer = eTimer()
+               self.temp_timer.callback.append(self.updateTemp)
+
+               for count in range(8):
+                       self["ProTemp%d" % count] = Progress()
+                       self["TxtTemp%d" % count] = StaticText("")
+               self["ProHDD"] = Progress()
+               self["TxtHDD"] = StaticText("")
+               self["ProFan"] = Progress()
+               self["TxtFan"] = StaticText("")
+               self["TxtFC2Temp"] = StaticText("")
+               self["TxtMinTemp"] = Label("30")
+               self["TxtMaxTemp"] = Label("55")
+
+               self["actions"] = ActionMap(["OkCancelActions", "EPGSelectActions"], 
+               {
+                       "ok": self.cancel,
+                       "cancel": self.cancel,
+                       "info": self.getHDD
+               }, -1)
+
+               self.onLayoutFinish.append(self.updateTemp)
+
+       def updateTemp(self):
+               templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE)
+               tempcount = len(templist)
+               for count in range(tempcount):
+                       tt = sensors.getSensorValue(count)
+                       self["ProTemp%d" % count].value = int((tt-30)*100/(55-30)) 
+                       if sensors.getSensorName(count) == "undefined":
+                               self["TxtTemp%d" % count].setText(_("%s   %02d C") % (TempName[count], tt))
+                       else:
+                               self["TxtTemp%d" % count].setText(_("%s   %02d C") % (sensors.getSensorName(count), tt))
+               if harddiskmanager.HDDCount() > 0:
+                       if max(AktHDD) > 0:
+                               self["ProHDD"].value = int((max(AktHDD)-30)*100/(55-30)) 
+                               self["TxtHDD"].setText(_("%s   %02d C") % ("HDD", max(AktHDD)))
+                       elif config.plugins.FanControl.CheckHDDTemp.value !="never":
+                               self["TxtHDD"].setText(_("press Info for HDD-Temp"))
+               self["TxtFan"].setText(_("Current rpm  %4d") % (AktRPM))
+               self["ProFan"].value = int((AktRPM-config.plugins.FanControl.minRPM.value)*100/Test0(config.plugins.FanControl.maxRPM.value-config.plugins.FanControl.minRPM.value))
+               if tempcount>1:
+                       self["TxtFC2Temp"].setText("%4.1f" % AktTemp)
+               self.temp_timer.start(2000, True)
+        
+       def cancel(self):
+               self.close(False,self.session)
+
+       def getHDD(self):
+               if harddiskmanager.HDDCount() > 0 and config.plugins.FanControl.CheckHDDTemp.value !="never":
+                       GetHDDtemp(True)
+                       for hdd in harddiskmanager.HDDList():
+                               if hdd[1].isSleeping():
+                                       (stat,wert)=getstatusoutput("hdparm -y %s" % hdd[1].getDeviceName())
+
+class FanControl2SpezialSetup(Screen, ConfigListScreen):
+       skin = """
+               <screen position="center,center" size="600,320" title="Fan Control 2 - Setup" >
+                       <widget name="config" position="10,20" size="580,290" scrollbarMode="showOnDemand" />
+               </screen>"""
+
+       def __init__(self, session, args = None):
+               Screen.__init__(self, session)
+
+               config.plugins.FanControl.DisableDMM.value = isDMMdisabled()
+               self.HDDmode = config.plugins.FanControl.CheckHDDTemp.value
+               self.MonitorMode = config.plugins.FanControl.MonitorInExtension.value
+
+               self.list = []
+               self.list.append(getConfigListEntry(_("Action in case of Fan failure"), config.plugins.FanControl.ShowError))
+               self.list.append(getConfigListEntry(_("Box shutdown at Temperature (C)"), config.plugins.FanControl.ShutdownTemp))
+               self.list.append(getConfigListEntry(_("increases overheating protection to (C)"), config.plugins.FanControl.AddOverheat))
+               self.list.append(getConfigListEntry(_("read HDD-Temperature in HDD-Standby-Mode"), config.plugins.FanControl.CheckHDDTemp))
+               self.list.append(getConfigListEntry(_("disable DMM-FanControl"), config.plugins.FanControl.DisableDMM))
+               self.list.append(getConfigListEntry(_("Show Monitor in Extension-Menu"), config.plugins.FanControl.MonitorInExtension))
+               self.list.append(getConfigListEntry(_("Number of WebIF-Log-Entries"), config.plugins.FanControl.LogCount))
+               self.list.append(getConfigListEntry(_("Logging path"), config.plugins.FanControl.LogPath))
+               self.list.append(getConfigListEntry(_("Enable Data Logging"), config.plugins.FanControl.EnableDataLog))
+               self.list.append(getConfigListEntry(_("Auto-Delete Data older than (Days)"), config.plugins.FanControl.DeleteData))
+               self.list.append(getConfigListEntry(_("Enable Event Logging"), config.plugins.FanControl.EnableEventLog))
+               ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.selectionChanged)
+
+               self["actions"] = ActionMap(["OkCancelActions"], 
+               {
+                       "ok": self.keyOK,
+                       "cancel": self.cancel
+               }, -1)
+
+       def keyOK(self):
+               ConfigListScreen.keyOK(self)
+               try:
+                       from Screens.LocationBox import LocationBox
+                       sel = self["config"].getCurrent()[1]
+                       if sel == config.plugins.FanControl.LogPath:
+                               self.session.openWithCallback(self.dirSelected, LocationBox, text = _("Choose path"), filename = "", currDir = self["config"].getCurrent()[1].value, minFree = 50)
+               except Exception, e:
+                       self.session.open(MessageBox, "Error:\n" + str(e), MessageBox.TYPE_ERROR)
+
+       def dirSelected(self, dir):
+               if dir is not None and dir != "?":
+                       if dir[-1:] != "/":
+                               dir += "/"
+                       config.plugins.FanControl.LogPath.value = dir
+        
+       def cancel(self):
+               global disableHDDread
+               if config.plugins.FanControl.LogPath.value[-1:] != "/":
+                       config.plugins.FanControl.LogPath.value += "/"
+               NeuStart = False
+               if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"):
+                       if not isDMMdisabled() and config.plugins.FanControl.DisableDMM.value:
+                               disableDMM()
+                               NeuStart = True
+                       if isDMMdisabled() and not config.plugins.FanControl.DisableDMM.value:
+                               enableDMM()
+                               NeuStart = True
+               if config.plugins.FanControl.CheckHDDTemp.value == "auto" and config.plugins.FanControl.CheckHDDTemp.value != self.HDDmode:
+                       disableHDDread = True
+               if config.plugins.FanControl.MonitorInExtension.value != self.MonitorMode:
+                       NeuStart = True
+
+               for x in self["config"].list:
+                       x[1].save()
+
+               if NeuStart:
+                       configfile.save()
+                       restartbox = self.session.openWithCallback(self.restartGUI,MessageBox,_("GUI needs a restart to apply the changes.\nDo you want to Restart the GUI now?"), MessageBox.TYPE_YESNO)
+                       restartbox.setTitle(_("Restart GUI now?"))
+               else:
+                       self.close(False,self.session)
+
+       def selectionChanged(self):
+               if not config.plugins.FanControl.EnableDataLog.value:
+                       return
+               if config.plugins.FanControl.LogPath.value[-1:] != "/":
+                       config.plugins.FanControl.LogPath.value += "/"
+               if not os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv") and Free(config.plugins.FanControl.LogPath.value):
+                       try:
+                               f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","w")
+                               try:
+                                       f.write(HeadLine)
+                               except:
+                                       f.close()
+                       except IOError:
+                               FCLog("Data-Log-Error")
+
+       def restartGUI(self, answer):
+               if answer is True:
+                       self.session.open(TryQuitMainloop, 3)
+               else:
+                       self.close()
+
+class FanControl2Plugin(ConfigListScreen,Screen):
+       skin = """
+               <screen position="center,center" size="600,440" title="Fan Control 2">
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/key_info.png" position="560,0" zPosition="4" size="35,25"  transparent="1" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/key_menu.png" position="560,20" zPosition="4" size="35,25"  transparent="1" alphatest="on" />
+                       <widget source="red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+                       <widget source="blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+                       <widget source="Version" render="Label" position="5,420" size="60,20" zPosition="1" font="Regular;11" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
+
+                       <widget name="config" position="10,50" size="580,200" scrollbarMode="showOnDemand" />
+                       <ePixmap position="20,260" size="560,3" pixmap="skin_default/div-h.png" transparent="1" alphatest="on" />
+                       <widget source="introduction" render="Label" position="5,262" size="580,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <ePixmap position="20,290" size="560,3" pixmap="skin_default/div-h.png" transparent="1" alphatest="on" />
+                       <widget source="TxtTemp" render="Label" position="5,330" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtZielRPM" render="Label" position="5,350" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtRPM" render="Label" position="5,370" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtVLT" render="Label" position="5,390" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="TxtPWM" render="Label" position="5,410" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="PixTemp" render="Progress" position="210,340" size="375,5" borderWidth="1" />
+                       <widget source="PixZielRPM" render="Progress" position="210,360" size="375,5" borderWidth="1" />
+                       <widget source="PixRPM" render="Progress" position="210,380" size="375,5" borderWidth="1" />
+                       <widget source="PixVLT" render="Progress" position="210,400" size="375,5" borderWidth="1" />
+                       <widget source="PixPWM" render="Progress" position="210,420" size="375,5" borderWidth="1" />
+               </screen>"""
+
+       def __init__(self, session, args = 0):
+               global LastVLT
+               global LastPWM
+               self.session = session
+               Screen.__init__(self, session)
+
+               self.fan_timer = eTimer()
+               self.fan_timer.callback.append(self.updateFanStatus)
+
+               self.list = []
+               self.list.append(getConfigListEntry(_("Fan type"), config.plugins.FanControl.Fan))
+               self.list.append(getConfigListEntry(_("Fan off in Standby"), config.plugins.FanControl.StandbyOff))
+               self.list.append(getConfigListEntry(_("min Speed rpm"), config.plugins.FanControl.minRPM))
+               self.list.append(getConfigListEntry(_("max Speed rpm"), config.plugins.FanControl.maxRPM))
+               self.list.append(getConfigListEntry(_("Static temp C"), config.plugins.FanControl.temp))
+               self.list.append(getConfigListEntry(_("End temperature C"), config.plugins.FanControl.tempmax))
+               self.list.append(getConfigListEntry(_("Initial Voltage"), config.plugins.FanControl.vlt))
+               self.list.append(getConfigListEntry(_("Initial PWM"), config.plugins.FanControl.pwm))
+               ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.selectionChanged)
+               LastVLT = config.plugins.FanControl.vlt.value
+               LastPWM = config.plugins.FanControl.pwm.value
+
+               self["red"] = StaticText(_("Cancel"))
+               self["green"] = StaticText(_("Save"))
+               self["yellow"] = StaticText(_("Check"))
+               self["blue"] = StaticText(_("Help"))
+               self["introduction"] = StaticText()
+               self["Version"] = StaticText(Version)
+               self["TxtTemp"] = StaticText()
+               self["TxtZielRPM"] = StaticText()
+               self["TxtRPM"] = StaticText()
+               self["TxtVLT"] = StaticText()
+               self["TxtPWM"] = StaticText()
+               self["PixTemp"] = Progress()
+               self["PixZielRPM"] = Progress()
+               self["PixRPM"] = Progress()
+               self["PixVLT"] = Progress()
+               self["PixPWM"] = Progress()
+
+               self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "MenuActions", "EPGSelectActions"], 
+               {
+                       "ok": self.save,
+                       "cancel": self.cancel,
+                       "red": self.cancel,
+                       "green": self.save,
+                       "yellow": self.pruefen,
+                       "blue": self.help,
+                       "menu": self.SetupMenu,
+                       "info": self.monitor
+               }, -1)
+
+               if not self.selectionChanged in self["config"].onSelectionChanged:
+                       self["config"].onSelectionChanged.append(self.selectionChanged)
+               self.selectionChanged()
+               self.onLayoutFinish.append(self.updateFanStatus)
+
+       def selectionChanged(self):
+               global LastVLT
+               global LastPWM
+               global AktPWM
+               global AktVLT
+               global AktRPM
+               self["introduction"].setText(_("Current value: %s") % (self.getCurrentValue()))
+               if self["config"].getCurrentIndex() > 4:
+                       if LastVLT != config.plugins.FanControl.vlt.value or LastPWM !=config.plugins.FanControl.pwm.value:
+                               LastVLT = config.plugins.FanControl.vlt.value
+                               LastPWM = config.plugins.FanControl.pwm.value
+                               AktVLT = LastVLT
+                               AktPWM = LastPWM
+                               id = 0
+                               setVoltage(id,LastVLT)
+                               setPWM(id,LastPWM)
+                               AktRPM = GetFanRPM()
+               d = config.plugins.FanControl.tempmax.value - config.plugins.FanControl.temp.value
+               if d < 5:
+                       if config.plugins.FanControl.temp.value + d < 55:
+                               config.plugins.FanControl.tempmax.value=config.plugins.FanControl.temp.value+5
+                       else:
+                               config.plugins.FanControl.temp.value=config.plugins.FanControl.tempmax.value-5
+
+       def getCurrentValue(self):
+               return str(self["config"].getCurrent()[1].getText())
+
+       def updateFanStatus(self):
+               global ZielRPM
+               global AktTemp
+               global AktVLT
+               global AktPWM
+               global AktRPM
+               if config.plugins.FanControl.Fan.value == "disabled":
+                       AktTemp = 0
+                       AktVLT = 0
+                       AktPWM = 0
+                       ZielRPM = 0
+                       AktRPM = 0
+               self["TxtTemp"].setText(_("Temperature C  %4.1f") % (AktTemp))
+               self["TxtZielRPM"].setText(_("Target rpm  %4d") % (ZielRPM))
+               self["TxtRPM"].setText(_("Current rpm  %4d") % (AktRPM))
+               self["TxtVLT"].setText(_("Voltage  %03d") % (AktVLT))
+               self["TxtPWM"].setText(_("PWM  %03d") % (AktPWM))
+               self["PixTemp"].value = int((AktTemp-config.plugins.FanControl.temp.value)*100/Test0(config.plugins.FanControl.tempmax.value-config.plugins.FanControl.temp.value))
+               self["PixZielRPM"].value = int((ZielRPM-config.plugins.FanControl.minRPM.value)*100/Test0(config.plugins.FanControl.maxRPM.value-config.plugins.FanControl.minRPM.value))
+               self["PixRPM"].value = int((AktRPM-config.plugins.FanControl.minRPM.value)*100/Test0(config.plugins.FanControl.maxRPM.value-config.plugins.FanControl.minRPM.value))
+               self["PixVLT"].value = int(AktVLT/2.55)
+               self["PixPWM"].value = int(AktPWM/2.55)
+               self.fan_timer.start(2000, True)
+       
+       def save(self):
+               for x in self["config"].list:
+                       x[1].save()
+               self.close(True,self.session)
+
+       def cancel(self):
+               for x in self["config"].list:
+                       x[1].cancel()
+               self.close(False,self.session)
+
+       def pruefen(self):
+               self.session.open(FanControl2Test)
+
+       def monitor(self):
+               self.session.open(FanControl2Monitor)
+
+       def help(self):
+               self.session.open(Console,_("Information"),["cat /usr/lib/enigma2/python/Plugins/Extensions/FanControl/%s" % _("readme.txt")])
+
+       def SetupMenu(self):
+               self.session.open(FanControl2SpezialSetup)
+
+def DeleteData():
+       if config.plugins.FanControl.DeleteData.value == "0" or config.plugins.FanControl.EnableDataLog.value == False:
+               return
+       try:
+               FClog("Auto-Delete Data")
+               f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","a")
+               s = f.tell()
+               f.close()
+               if s < 150:
+                       return
+               f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","r")
+               f.seek(s-100)
+               line = f.readline()
+               line = f.readline()
+               DT = line.split(";")
+               DT = DT[0].split(" ")
+               DD = DT[0].split(".")
+               DD48h = datetime.date(int(DD[0]),int(DD[1]),int(DD[2])) - datetime.timedelta(int(config.plugins.FanControl.DeleteData.value))
+               Dfind = "%04d.%02d.%02d %s" % (DD48h.year,DD48h.month,DD48h.day,DT[1])
+               f.seek(0)
+               line = f.readline()
+               fw = open(config.plugins.FanControl.LogPath.value + "FC2data.csv.tmp","w")
+               fw.write(HeadLine)
+               for line in f.readlines():
+                       DT = line.split(";")
+                       if DT[0] > Dfind:
+                               fw.write(line)
+               f.close()
+               fw.close()
+               if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
+                       os.remove(config.plugins.FanControl.LogPath.value + "FC2data.csv")
+               os.rename(config.plugins.FanControl.LogPath.value + "FC2data.csv.tmp",config.plugins.FanControl.LogPath.value + "FC2data.csv")
+       except Exception:
+               FClog("Error Delete Data")
+
+def getstatusoutput(cmd):
+       pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
+       text = pipe.read()
+       sts = pipe.close()
+       if sts is None: sts = 0
+       if text[-1:] == '\n': text = text[:-1]
+       return sts, text
+
+def HDDtestTemp():
+       global disableHDDread
+       if harddiskmanager.HDDCount() > 0 and config.plugins.FanControl.CheckHDDTemp.value !="never":
+               disableHDDread = False
+               for hdd in harddiskmanager.HDDList():
+                       FClog("%s %s Mode:%s" % (hdd[1].model(), hdd[1].getDeviceName(), config.plugins.FanControl.CheckHDDTemp.value))
+                       if config.plugins.FanControl.CheckHDDTemp.value == "auto":
+                               (stat,wert)=getstatusoutput("hdparm -y %s" % hdd[1].getDeviceName())
+                               time.sleep(0.5)
+                               (stat,wert)=ReadHDDtemp(hdd[1].getDeviceName())
+                               if stat != 0:
+                                       (stat,wert)=getstatusoutput("smartctl --smart=on %s" % hdd[1].getDeviceName())
+                                       FClog("HDD Temperature not readable")
+                               time.sleep(0.5)
+                               (stat,wert)=getstatusoutput("hdparm -C %s" % hdd[1].getDeviceName())
+                               if wert.find("standby")>0:
+                                       FClog("HDD supports Temp reading without Spinup")
+                               else:
+                                       if hdd[1].isSleeping():
+                                               (stat,wert)=getstatusoutput("hdparm -y %s" % hdd[1].getDeviceName())
+                                       FClog("HDD not supports Temp reading without Spinup -> Disabled")
+                                       disableHDDread = True
+
+def ReadHDDtemp(D):
+       return getstatusoutput("smartctl -A %s | grep \"194 Temp\" | grep Always" % D)
+
+def GetHDDtemp(OneTime):
+       global AktHDD
+       AktHDD = []
+       if harddiskmanager.HDDCount() > 0 and config.plugins.FanControl.CheckHDDTemp.value != "never" or OneTime == True:
+               for hdd in harddiskmanager.HDDList():
+                       sleeptime = int((time.time() - hdd[1].last_access))
+#                      FClog("HDD Temp reading %s %s %ds %s" % (config.plugins.FanControl.CheckHDDTemp.value, disableHDDread, sleeptime, hdd[1].isSleeping()))
+                       if config.plugins.FanControl.CheckHDDTemp.value == "true" or (config.plugins.FanControl.CheckHDDTemp.value == "auto" and not disableHDDread) or ((not hdd[1].isSleeping()) and sleeptime < 120) or OneTime == True:
+                               (stat,wert)=ReadHDDtemp(hdd[1].getDeviceName())
+                               if stat == 0:
+                                       try:
+                                               AktHDD.append(int(wert[wert.find("Always")+6:].replace(" ","").replace("-","")[:2]))
+                                       except:
+                                               AktHDD.append(0)
+                               if len(AktHDD) == 0:
+                                       AktHDD = [0]
+                               FClog("HDD Temp %dC" % (AktHDD[-1]))
+       if len(AktHDD) == 0:
+               AktHDD = [0]
+       return
+
+def HDDsSleeping(): 
+       for hdd in harddiskmanager.HDDList():
+               if not hdd[1].isSleeping():
+                       return False
+       return True
+
+def FC2systemStatus():
+       S = int(FC2werte[5])
+       R = " -" if S>0 else " "
+       if (S & 1)>0 :
+               R += " BoxOn"
+       if (S & 2)>0 :
+               R += " HDDon"
+       if (S & 4)>0 :
+               R += " REC"
+       return R
+
+class FanControl2(Screen):
+       skin = """ <screen position="100,100" size="300,300" title="FanControl2" > </screen>"""
+
+       def __init__(self,session):
+               global Box
+               Screen.__init__(self,session)
+               self.session = session
+               self.FanMin     = 500
+               self.FanMax     = 1500
+               self.targetTemp = 50.0
+               self.maxTemp    = 55.0
+               self.Range      = 5
+               self.Fan        = "aus"
+               self.dontshutdown = False
+               FClog("Starting up")
+               if os.path.exists("/usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/fc2/diagram.class.org"):
+                       os.rename("/usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/fc2/diagram.class.org","/usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/fc2/diagram.class")
+               if not isDMMdisabled() and config.plugins.FanControl.DisableDMM.value:
+                       disableDMM()
+               Box = GetBox()
+               HDDtestTemp()
+               GetHDDtemp(False)
+               DeleteData()
+               self.timer = eTimer()
+               if self.query not in self.timer.callback:
+                       self.timer.callback.append(self.query)
+               self.timer.startLongTimer(10)
+               config.misc.standbyCounter.addNotifier(self.standbyQuery, initial_call = False)
+
+       def FC2AskShutdown(self):
+               if not self.dontshutdown:
+                       self.dontshutdown = True
+                       self.session.openWithCallback(self.FC2DoShutdown, MessageBox, _("FanControl2 emergency, Box Shutdown now?"),type = MessageBox.TYPE_YESNO,timeout = 60)
+
+       def FC2DoShutdown(self,retval):
+               if (retval):
+                       if Standby.inTryQuitMainloop == False:
+                               self.session.open(Standby.TryQuitMainloop, 1)
+
+       def stop(self):
+               FClog("Stop")
+               if self.query in self.timer.callback:
+                       self.timer.callback.remove(self.query)
+               self.timer.stop()
+
+       def CurrTemp(self):
+               m1 = 0.1
+               m2 = 0.1
+               ti = [0,0,0,0,0,0,0,0,0,0]
+               templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE)
+               tempcount = len(templist)
+               for count in range(tempcount):
+                       tt = sensors.getSensorValue(count)
+                       ti[count] = tt
+                       if m1 < tt:
+                               mi = count
+                               m1 = tt
+               for count in range(tempcount):
+                       if m2 < ti[count] and count != mi:
+                               m2 = ti[count]
+               if m2 == 0.1:
+                       m2 = m1
+               return (m1 + m2) / 2.0
+                
+       def cycle(self):
+               self.Range = self.maxTemp - self.targetTemp
+               x = AktTemp - self.targetTemp
+               rpm = skal(x, 0, self.Range, self.FanMin, self.FanMax)
+               return rpm
+
+       def standbyQuery(self, configElement):
+               Standby.inStandby.onClose.append(self.query)
+               self.query()
+                
+       def query(self):
+               global FirstStart
+               global istStandbySave
+               global Overheat
+               global OverheatTimer
+               global FanOffWait
+               global RPMread
+               global RPMdiff
+               global FanFehler            
+               global ZielRPM
+               global AktRPM
+               global AktTemp
+               global AktVLT
+               global AktPWM
+               global Recording
+#              tt = time.time()
+               try:
+                       if config.plugins.FanControl.Fan.value == "disabled":
+                               self.timer.startLongTimer(10)
+                               return
+                       self.targetTemp = config.plugins.FanControl.temp.value
+                       self.maxTemp    = config.plugins.FanControl.tempmax.value
+                       self.Fan        = config.plugins.FanControl.Fan.value
+                       self.Vlt        = config.plugins.FanControl.vlt.value
+                       self.HDDidle    = True
+                       id = 0
+                       AktRPMtmp = 0
+                       sleeptime = 0
+                       AktTemp = self.CurrTemp()
+                       Recording = self.session.nav.RecordTimer.isRecording()
+                       if AktTemp >= config.plugins.FanControl.ShutdownTemp.value:
+                               FClog("Emergency Shutdown")
+                               self.FC2AskShutdown()
+                       if harddiskmanager.HDDCount() > 0:
+                               self.HDDidle = HDDsSleeping()
+                               if int(strftime("%S")) < 10 and strftime("%M")[-1:] == "0":
+                                       GetHDDtemp(False)
+                                       if strftime("%H:%M") == "00:00":
+                                               DeleteData()
+                       S=0
+                       if not Standby.inStandby:
+                               S+=1
+                       if not self.HDDidle:
+                               S+=2
+                       if Recording:
+                               S+=4
+                       FC2werte[5]=str(S)
+
+                       if (Standby.inStandby) and (not Overheat) and ((config.plugins.FanControl.StandbyOff.value == "true") or ((config.plugins.FanControl.StandbyOff.value == "trueRec") and (not Recording and self.HDDidle))):
+                               FClog("Fan Off Temp: %d %s" % (AktTemp,FC2systemStatus()))
+                               setVoltage(id,0)
+                               setPWM(id,0)
+                               FC2werte[0] = AktTemp
+                               FC2werte[1] = 0
+                               FC2werte[2] = 0
+                               FC2werte[3] = 0
+#                              FC2werte[4] = str(AktHDD)[1:-1].replace(",","")
+                               FC2werte[4] = max(AktHDD) if len(AktHDD) > 0 else 0
+                               FCdata()
+                               FirstStart = True
+                               OverheatTemp = self.maxTemp + config.plugins.FanControl.AddOverheat.value
+                               OverheatTimer = 0
+                               FanOffWait = True
+                               if OverheatTemp > 65:
+                                       OverheatTemp = 65
+                               if AktTemp > OverheatTemp:
+                                       Overheat = True
+                                       FClog("Overheat")
+                       else:
+                               if (Overheat and AktTemp < self.maxTemp-3) or not Standby.inStandby:
+                                       Overheat = False
+                               AktVLTtmp = getVoltage(id)
+                               if Standby.inStandby and Standby.inStandby == istStandbySave and RPMdiff == 1:
+                                       tmp = GetFanRPM()
+                                       RPMdiff = AktRPM-tmp
+                                       if RPMdiff < 150 or tmp < 300 or self.Fan == "3pin":
+                                               RPMdiff = 0
+                                       else:
+                                               if config.plugins.FanControl.minRPM.value - RPMdiff < 300:
+                                                       RPMdiff = config.plugins.FanControl.minRPM.value - 300
+                                               FClog("RPM-Range shifted -%drpm" % RPMdiff)
+                               if not Standby.inStandby:
+                                       RPMdiff = 0
+                               self.FanMin = config.plugins.FanControl.minRPM.value - RPMdiff
+                               self.FanMax = config.plugins.FanControl.maxRPM.value - RPMdiff
+                               if Standby.inStandby != istStandbySave or AktVLT != AktVLTtmp:
+                                       istStandbySave = Standby.inStandby
+                                       AktVLTtmp = AktVLT
+                                       setVoltage(id,AktVLT)
+                                       setPWM(id,AktPWM)
+                                       RPMdiff = 1
+                                       FClog("Fan Reset")
+                               if (AktVLT + AktPWM) == 0:
+                                       FirstStart = True
+                               if FirstStart == True:
+                                       FirstStart = False
+                                       AktVLTtmp = self.Vlt
+                                       setVoltage(id,self.Vlt)
+                                       setPWM(id,config.plugins.FanControl.pwm.value)
+                               AktRPMtmp = GetFanRPM()
+                               if RPMread>0 and RPMread<3:
+                                       self.timer.start(400, True)
+                                       return
+                               AktRPM = AktRPMtmp
+                               AktVLT = AktVLTtmp
+                               AktPWM = getPWM(id)
+                               FClog("Vlt:%d Pwm:%d Fan:%s  %s" % (AktVLT,AktPWM,self.Fan,FC2systemStatus()))
+                               FC2werte[0] = AktTemp
+                               FC2werte[1] = AktRPM
+                               FC2werte[2] = AktVLT
+                               FC2werte[3] = AktPWM
+                               FC2werte[4] = max(AktHDD) if len(AktHDD) > 0 else 0
+                               FCdata()
+                               if int(strftime("%M")) == 0:
+                                       FC2stunde[int(strftime("%H"))] = "%4.1f<BR>%d" % (AktTemp,AktRPM)
+                               RPMread = 0
+                               ZielRPM = self.cycle()
+                               if (FanOffWait and OverheatTimer < 30) or (Overheat and OverheatTimer < 60):
+                                       ZielRPM = self.FanMin
+                                       OverheatTimer += 1
+                                       FClog("FanStartTimeout set MinRPM (%d)" % (OverheatTimer)) 
+                               else:
+                                       FanOffWait = False
+                               FClog(_("currentRPM:%d targetRPM:%d Temp:%4.1f") % (AktRPM,ZielRPM,AktTemp))
+                               if ZielRPM > 0 and AktRPM == 0:
+                                       FanFehler += 1
+                                       if FanFehler > 90:
+                                               FanFehler -= 18
+                                               FClog("Fan Error")
+                                               if config.plugins.FanControl.ShowError.value == "true":
+                                                       Notifications.AddNotification(MessageBox, _("Fan is not working!"), type=MessageBox.TYPE_INFO, timeout=5)
+                                               if config.plugins.FanControl.ShowError.value == "shutdown":
+                                                       self.FC2AskShutdown()
+                               else:
+                                       FanFehler = 0
+                               if self.Fan == "4pin":
+                                       if AktPWM < 255 and AktPWM > 0 and AktVLT != self.Vlt:
+                                               AktVLT = (AktVLT-1 if AktVLT > self.Vlt else AktVLT+1)
+                                               setVoltage(id,AktVLT)
+                                       if AktRPM+29 < ZielRPM:
+                                               AktPWM = (AktPWM+5 if ZielRPM-AktRPM > 100 else AktPWM+1)
+                                               setPWM(id,AktPWM)
+                                               if AktPWM >= 255 and AktVLT < 255:
+                                                       AktVLT += 1
+                                                       setVoltage(id,AktVLT)
+                                       elif AktRPM-19 > ZielRPM:
+                                               AktPWM = (AktPWM-5 if AktRPM-ZielRPM > 100 else AktPWM-1)
+                                               setPWM(id,AktPWM)
+# 4
+                                               if AktPWM < 0 and AktVLT > 5:
+                                                       AktVLT -= 1
+                                                       setVoltage(id,AktVLT)
+                                       if AktVLT > self.Vlt:
+                                               AktPWM = 256
+                                       if AktPWM < 0:
+                                               AktPWM = 0
+                               elif self.Fan == "3pin":
+                                       if AktRPM+29 < ZielRPM:
+                                               AktVLT = (AktVLT+5 if ZielRPM-AktRPM > 100 else AktVLT+1)
+                                               setVoltage(id,AktVLT)
+                                       elif AktRPM-19 > ZielRPM:
+                                               AktVLT = (AktVLT-5 if AktRPM-ZielRPM > 100 else AktVLT-1)
+                                               setVoltage(id,AktVLT)
+
+               except Exception:
+                       FClog("Control Error")
+                       import traceback, sys
+                       traceback.print_exc(file=sys.stdout)
+#              FClog(str(time.time() - tt ))
+               self.timer.startLongTimer(10)
+
+def autostart(reason, **kwargs):
+       global session
+       if reason == 0 and kwargs.has_key("session"):
+               session = kwargs["session"]
+               session.open(FanControl2)
+          
+def Plugins(**kwargs):
+       list = [
+       PluginDescriptor(name="Fan Control", 
+       description="Fan Control 2", 
+       where = [PluginDescriptor.WHERE_SESSIONSTART, 
+       PluginDescriptor.WHERE_AUTOSTART], 
+       fnc = autostart),
+       PluginDescriptor(name="Fan Control", 
+       description="Fan Control 2", 
+       where = PluginDescriptor.WHERE_PLUGINMENU,
+       icon = "plugin.png",
+       fnc = main)]
+       if config.plugins.FanControl.MonitorInExtension.value:
+               list.append(PluginDescriptor(
+               name="Fan Control 2 - Monitor", 
+               description="Fan Control 2", 
+               where = PluginDescriptor.WHERE_EXTENSIONSMENU,
+               icon = "plugin.png",
+               fnc = mainMonitor))
+       return list