74de3d65eb48519749b259fdb5bdc85d0290347f
[vuplus_dvbapp-plugin] / fancontrol2 / src / plugin.py
1 # FanControl2
2 # joergm6 IHAD
3 import time
4 import os
5 from __init__ import _
6
7 from globals import *
8
9 from enigma import eTimer, eSize
10
11 # Config
12 from Components.config import configfile, config, ConfigSubsection, ConfigNumber, ConfigInteger, ConfigSlider, ConfigSelection, ConfigYesNo, ConfigText
13 from Components.config import getConfigListEntry
14 from Components.Label import Label
15 from Components.Sources.StaticText import StaticText
16 from Components.Sources.Progress import Progress
17
18 # Startup/shutdown notification
19 from Tools import Notifications
20 from Sensors import sensors
21 from time import gmtime, strftime
22 import datetime
23
24 # Plugin
25 from Plugins.Plugin import PluginDescriptor
26
27 # GUI (Screens)
28 from Screens.Screen import Screen
29 from Components.ConfigList import ConfigListScreen
30 from Screens.MessageBox import MessageBox
31 from Screens.Console import Console
32 from Screens import Standby 
33 from Screens.MessageBox import MessageBox
34 from Screens.Standby import TryQuitMainloop
35
36 # GUI (Components)
37 from Components.ActionMap import ActionMap
38 from Components.ActionMap import NumberActionMap
39 from Components.Harddisk import harddiskmanager
40
41 def main(session,**kwargs):
42         try:
43                 session.open(FanControl2Plugin)
44         except:
45                 FClog("Pluginexecution failed")
46
47 def mainMonitor(session,**kwargs):
48         try:
49                 session.open(FanControl2Monitor)
50         except:
51                 FClog("Pluginexecution failed")
52
53 def Test0(wert):
54         return (1 if wert<=0 else wert)
55
56 def skal(x, x1, x2, y1, y2):
57         if x > x2: return y2
58         if x < x1: return y1
59         m = (y2 - y1) / Test0(x2 - x1)
60         y = m * x + y1
61         return y
62
63 def FClog(wert):
64         print "[FanControl2]",wert
65         while len(FC2Log) > config.plugins.FanControl.LogCount.value:
66                 del FC2Log[5]
67         FC2Log.append(strftime("%H:%M:%S ") + wert)
68         if config.plugins.FanControl.EnableEventLog.value:
69                 if Free(config.plugins.FanControl.LogPath.value):
70                         try:
71                                 f = open(config.plugins.FanControl.LogPath.value + "FC2events.txt","a")
72                                 try:
73                                         f.write(strftime("%H:%M:%S ") + wert + "\r\n")
74                                 finally:
75                                         f.close()
76                         except IOError:
77                                 FC2Log.append(strftime("%H:%M:%S ") + "Event-Log-Error")
78
79 def FCdata():
80         global DataMinute
81         if strftime("%M")!=DataMinute and config.plugins.FanControl.EnableDataLog.value:
82                 DataMinute = strftime("%M")
83                 if Free(config.plugins.FanControl.LogPath.value):
84                         try:
85                                 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","a")
86                                 try:
87                                         f.write(strftime("%Y.%m.%d %H:%M"))
88                                         for count in range(6):
89                                                 f.write(";" + str(FC2werte[count]).replace(".",_(".")))
90                                         templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE)
91                                         tempcount = len(templist)
92                                         for count in range(tempcount):
93                                                 f.write(";" + str(sensors.getSensorValue(count)))
94                                         f.write("\r\n")
95                                 finally:
96                                         f.close()
97                         except IOError:
98                                 FC2Log.append(strftime("%H:%M:%S ") + "Event-Log-Error")
99
100 def Free(dir):
101         if not os.path.exists(dir):
102                 return False
103         s = os.statvfs(dir)
104         return (s.f_bsize * s.f_bavail / 1024 / 1024) > 10
105
106 def getVoltage(fanid):
107         f = open("/proc/stb/fp/fan_vlt", "r")
108         value = int(f.readline().strip(), 16)
109         f.close()
110         return value
111
112 def setVoltage(fanid, value):
113         if value > 255:
114                 return
115         f = open("/proc/stb/fp/fan_vlt", "w")
116         f.write("%x" % value)
117         f.close()
118
119 def getPWM(fanid):
120         f = open("/proc/stb/fp/fan_pwm", "r")
121         value = int(f.readline().strip(), 16)
122         f.close()
123         return value
124
125 def setPWM(fanid, value):
126         if value > 255:
127                 return
128         f = open("/proc/stb/fp/fan_pwm", "w")
129         f.write("%x" % value)
130         f.close()
131
132 #Configuration
133 config.plugins.FanControl = ConfigSubsection()
134 config.plugins.FanControl.Fan = ConfigSelection(choices = [("disabled", _("disabled")), ("aus", _("Control disabled")), ("3pin", _("3Pin")), ("4pin", _("4Pin"))], default = "disabled")
135 config.plugins.FanControl.StandbyOff = ConfigSelection(choices = [("false", _("no")), ("true", _("yes")), ("trueRec", _("yes, Except for Recording or HDD"))], default="false")
136 config.plugins.FanControl.minRPM = ConfigSlider(default = 500, increment = 50, limits = (0, 1000))
137 config.plugins.FanControl.maxRPM = ConfigSlider(default = 3000, increment = 50, limits = (500, 6000))
138 config.plugins.FanControl.temp = ConfigSlider(default = 40, increment = 1, limits = (30, 50))
139 config.plugins.FanControl.tempmax = ConfigSlider(default = 50, increment = 1, limits = (35, 55))
140 config.plugins.FanControl.pwm = ConfigSlider(default = 130, increment = 5, limits = (0, 255))
141 config.plugins.FanControl.vlt = ConfigSlider(default = 255, increment = 5, limits = (0, 255))
142 config.plugins.FanControl.ShowError = ConfigSelection(choices = [("false", _("do nothing")), ("true", _("display Info")), ("shutdown", _("Box Shutdown"))], default="true")
143 config.plugins.FanControl.ShutdownTemp = ConfigInteger(default = 65,limits = (50, 80))
144 config.plugins.FanControl.AddOverheat = ConfigInteger(default = 0,limits = (0, 9))
145 config.plugins.FanControl.DisableDMM = ConfigYesNo(default = False)
146 config.plugins.FanControl.LogCount = ConfigInteger(default = 40,limits = (40, 999))
147 config.plugins.FanControl.LogPath = ConfigText(default="/media/hdd/", fixed_size=False)
148 config.plugins.FanControl.DeleteData = ConfigSelection(choices = [("0", _("no")), ("2", "2"), ("3", "3"), ("7", "7"), ("14", "14"), ("30", "30")], default="0")
149 config.plugins.FanControl.EnableDataLog = ConfigYesNo(default = False)
150 config.plugins.FanControl.EnableEventLog = ConfigYesNo(default = False)
151 config.plugins.FanControl.CheckHDDTemp = ConfigSelection(choices = [("false", _("no")), ("true", _("yes")), ("auto", _("auto")), ("never", _("never"))], default="auto")
152 config.plugins.FanControl.MonitorInExtension = ConfigYesNo(default = True)
153
154 def GetFanRPM():
155         global RPMread
156         f = open("/proc/stb/fp/fan_speed", "r")
157         value = int(f.readline().strip()[:-4])
158         f.close()
159         if value > 0:
160                 RPMread = 0
161         else:
162                 RPMread += 1
163         value = int(value / 2)
164         return value
165
166 def GetBox():
167         B = Box
168         if os.path.exists("/proc/stb/info/model"):
169                 f = open("/proc/stb/info/model")
170                 B = f.readline()
171                 f.close()
172         return B
173
174 def isDMMdisabled():
175         value = False
176         if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"):
177                 FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "r")
178                 text=FCfile.read()
179                 FCfile.close()
180                 if text.find("#Disabled by FC2 config.misc.standbyCounter.addNotifier") is not -1:
181                         value = True
182         return value
183
184 def disableDMM():
185         if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"):
186                 FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "r")
187                 text=FCfile.read()
188                 FCfile.close()
189                 FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "w")
190                 text=text.replace("config.misc.standbyCounter.addNotifier","#Disabled by FC2 config.misc.standbyCounter.addNotifier")
191                 text=FCfile.write(text)
192                 FCfile.close()
193                 FClog("DMM-fancontrol disabled - please restart E2")
194
195 def enableDMM():
196         if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"):
197                 FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "r")
198                 text=FCfile.read()
199                 FCfile.close()
200                 FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "w")
201                 text=text.replace("#Disabled by FC2 config.misc.standbyCounter.addNotifier","config.misc.standbyCounter.addNotifier")
202                 text=FCfile.write(text)
203                 FCfile.close()
204
205 class FanControl2Test(ConfigListScreen,Screen):
206         skin = """
207                 <screen position="center,center" size="630,300" title="Fan Control 2 - Test" >
208                         <widget source="TextTest1" render="Label" position="5,20" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
209                         <widget source="TextTest2" render="Label" position="5,50" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
210                         <widget source="TextTest3" render="Label" position="5,80" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
211                         <widget source="TextTest4" render="Label" position="5,130" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
212                         <widget source="TextTest5" render="Label" position="5,160" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
213                         <widget source="TextTest6" render="Label" position="5,190" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
214                         <widget source="TextTest7" render="Label" position="5,220" size="620,30" zPosition="10" font="Regular;20" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
215                 </screen>"""
216
217
218         def __init__(self, session, args = 0):
219                 self.session = session
220                 Screen.__init__(self, session)
221
222                 self.timer = eTimer()
223                 self.timer.callback.append(self.DoTest)
224                 self.timer.start(1000, True)
225
226                 self["TextTest1"] = StaticText()
227                 self["TextTest2"] = StaticText()
228                 self["TextTest3"] = StaticText()
229                 self["TextTest4"] = StaticText()
230                 self["TextTest5"] = StaticText()
231                 self["TextTest6"] = StaticText()
232                 self["TextTest7"] = StaticText()
233
234                 self["TextTest1"].setText(_("please wait (until 3min)..."))
235
236                 self["actions"] = ActionMap(["OkCancelActions"], 
237                 {
238                         "ok": self.cancel,
239                         "cancel": self.cancel
240                 }, -1)
241
242         def VoltUp(self):
243                 while GetFanRPM() < 100 and self.i < 255:
244                         setVoltage(self.id,self.i)
245                         time.sleep(0.3)
246                         self.i += 1
247
248         def VoltDown(self):
249                 while GetFanRPM() > 100 and self.i > 0:
250                         setVoltage(self.id,self.i)
251                         time.sleep(1)
252                         self.i -= 1
253
254         def DoTest(self):
255                 self.id = 0
256                 self.i = 0
257                 self.last = 0
258                 self.rpm = 0
259                 SaveAktVLT = AktVLT
260                 SaveAktPWM = AktPWM
261                 SaveFan = config.plugins.FanControl.Fan.value
262                 config.plugins.FanControl.Fan.value = "aus"
263                 if SaveFan == "4pin":
264                         setPWM(self.id,0)
265                         time.sleep(10)
266                         while GetFanRPM() < 100 and self.i < 255:
267                                 setPWM(self.id,self.i)
268                                 time.sleep(0.3)
269                                 self.i += 1
270                         time.sleep(2)
271                         self.last=GetFanRPM()
272                         self["TextTest1"].setText(_("Min Fan Start %d rpm at PWM=%d") % (self.last, self.i))
273                         while GetFanRPM() > 100 and self.i > 1:
274                                 setPWM(self.id,self.i)
275                                 time.sleep(1)
276                                 self.i -= 1
277                         ok = ("OK" if config.plugins.FanControl.minRPM.value >= self.last else (("!!>%d" % config.plugins.FanControl.minRPM.value)))
278                         self["TextTest2"].setText(_("Min Fan Stop %d rpm at PWM=%d (%s)") % (self.last, self.i, ok))
279
280                         setPWM(self.id,255)
281                         time.sleep(6)
282                         self.rpm = GetFanRPM()
283                         ok = ("OK" if config.plugins.FanControl.maxRPM.value <= self.rpm else ("!!<%d" % (config.plugins.FanControl.maxRPM.value)))
284                         self["TextTest3"].setText(_("Max Fan %d rpm at PWM=255 (%s)") % (self.rpm, ok))
285 # extended
286                         self["TextTest4"].setText(_("Extended Control Range"))
287                         setPWM(self.id,0)
288                         time.sleep(10)
289                         self.rpm = GetFanRPM()
290                         if self.rpm > 0:
291                                 setVoltage(self.id,0)
292                                 time.sleep(10)
293                                 self.VoltUp()
294                                 time.sleep(3)
295                                 self.last=GetFanRPM()
296                                 self["TextTest5"].setText(_("Min Fan Start %d rpm at VLT=%d and PWM=0") % (self.last, self.i))
297                                 self.VoltDown()
298                                 ok = ("OK" if config.plugins.FanControl.minRPM.value >= self.last else (("!!>%d" % config.plugins.FanControl.minRPM.value)))
299                                 self["TextTest6"].setText(_("Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)") % (self.last, self.i, ok))
300
301                         setPWM(self.id,255)
302                         setVoltage(self.id,255)
303                         time.sleep(6)
304                         self.rpm = GetFanRPM()
305                         ok = ("OK" if config.plugins.FanControl.maxRPM.value <= self.rpm else ("!!<%d" % (config.plugins.FanControl.maxRPM.value)))
306                         self["TextTest7"].setText(_("Max Fan %d rpm at PWM=255 and VLT=255 (%s)") % (self.rpm, ok))
307
308                 if SaveFan == "3pin":
309                         setVoltage(self.id,0)
310                         time.sleep(10)
311                         self.VoltUp()
312                         time.sleep(3)
313                         self.last=GetFanRPM()
314                         self["TextTest1"].setText(_("Min Fan Start %d rpm at VLT=%d") % (self.last, self.i))
315                         self.VoltDown()
316                         ok = ("OK" if config.plugins.FanControl.minRPM.value >= self.last else ("!!>%d" % (config.plugins.FanControl.minRPM.value)))
317                         self["TextTest2"].setText(_("Min Fan Stop %d rpm at VLT=%d (%s)") % (self.last, self.i, ok))
318
319                         setVoltage(self.id,255)
320                         time.sleep(6)
321                         ok = ("OK" if config.plugins.FanControl.maxRPM.value <= GetFanRPM() else ("!!<%d" % (config.plugins.FanControl.maxRPM.value)))
322                         self["TextTest3"].setText(_("Max Fan %d rpm at VLT=255 (%s)") % (GetFanRPM(), ok))
323
324                 setVoltage(self.id,SaveAktVLT)
325                 setPWM(self.id,SaveAktPWM)
326                 config.plugins.FanControl.Fan.value = SaveFan
327
328         def cancel(self):
329                 self.close(False,self.session)
330
331 class FanControl2Monitor(Screen, ConfigListScreen):
332         skin = """
333                 <screen position="center,center" size="600,260" title="Fan Control 2 - Monitor">
334
335                         <widget source="TxtTemp0" render="Label" position="5,30" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
336                         <widget source="TxtTemp1" render="Label" position="5,50" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
337                         <widget source="TxtTemp2" render="Label" position="5,70" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
338                         <widget source="TxtTemp3" render="Label" position="5,90" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
339                         <widget source="TxtTemp4" render="Label" position="5,110" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
340                         <widget source="TxtTemp5" render="Label" position="5,130" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
341                         <widget source="TxtTemp6" render="Label" position="5,150" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
342                         <widget source="TxtTemp7" render="Label" position="5,170" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
343                         <widget source="TxtHDD" render="Label" position="5,190" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
344                         <widget source="TxtFan" render="Label" position="5,210" size="250,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
345                         <widget name="TxtMinTemp" position="260,20" size="50,12" zPosition="1" font="Regular;12" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
346                         <widget source="TxtFC2Temp" render="Label" position="398,20" size="50,12" zPosition="1" font="Regular;17" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
347                         <widget name="TxtMaxTemp" position="535,20" size="50,12" zPosition="1" font="Regular;12" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
348                         <widget source="ProTemp0" render="Progress" position="260,40" size="325,5" borderWidth="1" />
349                         <widget source="ProTemp1" render="Progress" position="260,60" size="325,5" borderWidth="1" />
350                         <widget source="ProTemp2" render="Progress" position="260,80" size="325,5" borderWidth="1" />
351                         <widget source="ProTemp3" render="Progress" position="260,100" size="325,5" borderWidth="1" />
352                         <widget source="ProTemp4" render="Progress" position="260,120" size="325,5" borderWidth="1" />
353                         <widget source="ProTemp5" render="Progress" position="260,140" size="325,5" borderWidth="1" />
354                         <widget source="ProTemp6" render="Progress" position="260,160" size="325,5" borderWidth="1" />
355                         <widget source="ProTemp7" render="Progress" position="260,180" size="325,5" borderWidth="1" />
356                         <widget source="ProHDD" render="Progress" position="260,200" size="325,5" borderWidth="1" />
357                         <widget source="ProFan" render="Progress" position="260,220" size="325,5" borderWidth="1" />
358
359                 </screen>"""
360         
361         def __init__(self, session, args = None):
362                 Screen.__init__(self, session)
363
364                 self.temp_timer = eTimer()
365                 self.temp_timer.callback.append(self.updateTemp)
366
367                 for count in range(8):
368                         self["ProTemp%d" % count] = Progress()
369                         self["TxtTemp%d" % count] = StaticText("")
370                 self["ProHDD"] = Progress()
371                 self["TxtHDD"] = StaticText("")
372                 self["ProFan"] = Progress()
373                 self["TxtFan"] = StaticText("")
374                 self["TxtFC2Temp"] = StaticText("")
375                 self["TxtMinTemp"] = Label("30")
376                 self["TxtMaxTemp"] = Label("55")
377
378                 self["actions"] = ActionMap(["OkCancelActions", "EPGSelectActions"], 
379                 {
380                         "ok": self.cancel,
381                         "cancel": self.cancel,
382                         "info": self.getHDD
383                 }, -1)
384
385                 self.onLayoutFinish.append(self.updateTemp)
386
387         def updateTemp(self):
388                 templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE)
389                 tempcount = len(templist)
390                 for count in range(tempcount):
391                         tt = sensors.getSensorValue(count)
392                         self["ProTemp%d" % count].value = int((tt-30)*100/(55-30)) 
393                         if sensors.getSensorName(count) == "undefined":
394                                 self["TxtTemp%d" % count].setText(_("%s   %02d C") % (TempName[count], tt))
395                         else:
396                                 self["TxtTemp%d" % count].setText(_("%s   %02d C") % (sensors.getSensorName(count), tt))
397                 if harddiskmanager.HDDCount() > 0:
398                         if max(AktHDD) > 0:
399                                 self["ProHDD"].value = int((max(AktHDD)-30)*100/(55-30)) 
400                                 self["TxtHDD"].setText(_("%s   %02d C") % ("HDD", max(AktHDD)))
401                         elif config.plugins.FanControl.CheckHDDTemp.value !="never":
402                                 self["TxtHDD"].setText(_("press Info for HDD-Temp"))
403                 self["TxtFan"].setText(_("Current rpm  %4d") % (AktRPM))
404                 self["ProFan"].value = int((AktRPM-config.plugins.FanControl.minRPM.value)*100/Test0(config.plugins.FanControl.maxRPM.value-config.plugins.FanControl.minRPM.value))
405                 if tempcount>1:
406                         self["TxtFC2Temp"].setText("%4.1f" % AktTemp)
407                 self.temp_timer.start(2000, True)
408         
409         def cancel(self):
410                 self.close(False,self.session)
411
412         def getHDD(self):
413                 if harddiskmanager.HDDCount() > 0 and config.plugins.FanControl.CheckHDDTemp.value !="never":
414                         GetHDDtemp(True)
415                         for hdd in harddiskmanager.HDDList():
416                                 if hdd[1].isSleeping():
417                                         (stat,wert)=getstatusoutput("hdparm -y %s" % hdd[1].getDeviceName())
418
419 class FanControl2SpezialSetup(Screen, ConfigListScreen):
420         skin = """
421                 <screen position="center,center" size="600,320" title="Fan Control 2 - Setup" >
422                         <widget name="config" position="10,20" size="580,290" scrollbarMode="showOnDemand" />
423                 </screen>"""
424
425         def __init__(self, session, args = None):
426                 Screen.__init__(self, session)
427
428                 config.plugins.FanControl.DisableDMM.value = isDMMdisabled()
429                 self.HDDmode = config.plugins.FanControl.CheckHDDTemp.value
430                 self.MonitorMode = config.plugins.FanControl.MonitorInExtension.value
431
432                 self.list = []
433                 self.list.append(getConfigListEntry(_("Action in case of Fan failure"), config.plugins.FanControl.ShowError))
434                 self.list.append(getConfigListEntry(_("Box shutdown at Temperature (C)"), config.plugins.FanControl.ShutdownTemp))
435                 self.list.append(getConfigListEntry(_("increases overheating protection to (C)"), config.plugins.FanControl.AddOverheat))
436                 self.list.append(getConfigListEntry(_("read HDD-Temperature in HDD-Standby-Mode"), config.plugins.FanControl.CheckHDDTemp))
437                 self.list.append(getConfigListEntry(_("disable DMM-FanControl"), config.plugins.FanControl.DisableDMM))
438                 self.list.append(getConfigListEntry(_("Show Monitor in Extension-Menu"), config.plugins.FanControl.MonitorInExtension))
439                 self.list.append(getConfigListEntry(_("Number of WebIF-Log-Entries"), config.plugins.FanControl.LogCount))
440                 self.list.append(getConfigListEntry(_("Logging path"), config.plugins.FanControl.LogPath))
441                 self.list.append(getConfigListEntry(_("Enable Data Logging"), config.plugins.FanControl.EnableDataLog))
442                 self.list.append(getConfigListEntry(_("Auto-Delete Data older than (Days)"), config.plugins.FanControl.DeleteData))
443                 self.list.append(getConfigListEntry(_("Enable Event Logging"), config.plugins.FanControl.EnableEventLog))
444                 ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.selectionChanged)
445
446                 self["actions"] = ActionMap(["OkCancelActions"], 
447                 {
448                         "ok": self.keyOK,
449                         "cancel": self.cancel
450                 }, -1)
451
452         def keyOK(self):
453                 ConfigListScreen.keyOK(self)
454                 try:
455                         from Screens.LocationBox import LocationBox
456                         sel = self["config"].getCurrent()[1]
457                         if sel == config.plugins.FanControl.LogPath:
458                                 self.session.openWithCallback(self.dirSelected, LocationBox, text = _("Choose path"), filename = "", currDir = self["config"].getCurrent()[1].value, minFree = 50)
459                 except Exception, e:
460                         self.session.open(MessageBox, "Error:\n" + str(e), MessageBox.TYPE_ERROR)
461
462         def dirSelected(self, dir):
463                 if dir is not None and dir != "?":
464                         if dir[-1:] != "/":
465                                 dir += "/"
466                         config.plugins.FanControl.LogPath.value = dir
467         
468         def cancel(self):
469                 global disableHDDread
470                 if config.plugins.FanControl.LogPath.value[-1:] != "/":
471                         config.plugins.FanControl.LogPath.value += "/"
472                 NeuStart = False
473                 if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"):
474                         if not isDMMdisabled() and config.plugins.FanControl.DisableDMM.value:
475                                 disableDMM()
476                                 NeuStart = True
477                         if isDMMdisabled() and not config.plugins.FanControl.DisableDMM.value:
478                                 enableDMM()
479                                 NeuStart = True
480                 if config.plugins.FanControl.CheckHDDTemp.value == "auto" and config.plugins.FanControl.CheckHDDTemp.value != self.HDDmode:
481                         disableHDDread = True
482                 if config.plugins.FanControl.MonitorInExtension.value != self.MonitorMode:
483                         NeuStart = True
484
485                 for x in self["config"].list:
486                         x[1].save()
487
488                 if NeuStart:
489                         configfile.save()
490                         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)
491                         restartbox.setTitle(_("Restart GUI now?"))
492                 else:
493                         self.close(False,self.session)
494
495         def selectionChanged(self):
496                 if not config.plugins.FanControl.EnableDataLog.value:
497                         return
498                 if config.plugins.FanControl.LogPath.value[-1:] != "/":
499                         config.plugins.FanControl.LogPath.value += "/"
500                 if not os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv") and Free(config.plugins.FanControl.LogPath.value):
501                         try:
502                                 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","w")
503                                 try:
504                                         f.write(HeadLine)
505                                 except:
506                                         f.close()
507                         except IOError:
508                                 FCLog("Data-Log-Error")
509
510         def restartGUI(self, answer):
511                 if answer is True:
512                         self.session.open(TryQuitMainloop, 3)
513                 else:
514                         self.close()
515
516 class FanControl2Plugin(ConfigListScreen,Screen):
517         skin = """
518                 <screen position="center,center" size="600,440" title="Fan Control 2">
519                         <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
520                         <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
521                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
522                         <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
523                         <ePixmap pixmap="skin_default/buttons/key_info.png" position="560,0" zPosition="4" size="35,25"  transparent="1" alphatest="on" />
524                         <ePixmap pixmap="skin_default/buttons/key_menu.png" position="560,20" zPosition="4" size="35,25"  transparent="1" alphatest="on" />
525                         <widget source="red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
526                         <widget source="green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
527                         <widget source="yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
528                         <widget source="blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
529                         <widget source="Version" render="Label" position="5,420" size="60,20" zPosition="1" font="Regular;11" halign="left" valign="center" backgroundColor="#25062748" transparent="1" />
530
531                         <widget name="config" position="10,50" size="580,200" scrollbarMode="showOnDemand" />
532                         <ePixmap position="20,260" size="560,3" pixmap="skin_default/div-h.png" transparent="1" alphatest="on" />
533                         <widget source="introduction" render="Label" position="5,262" size="580,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
534                         <ePixmap position="20,290" size="560,3" pixmap="skin_default/div-h.png" transparent="1" alphatest="on" />
535                         <widget source="TxtTemp" render="Label" position="5,330" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
536                         <widget source="TxtZielRPM" render="Label" position="5,350" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
537                         <widget source="TxtRPM" render="Label" position="5,370" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
538                         <widget source="TxtVLT" render="Label" position="5,390" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
539                         <widget source="TxtPWM" render="Label" position="5,410" size="200,25" zPosition="1" font="Regular;17" halign="right" valign="center" backgroundColor="#25062748" transparent="1" />
540                         <widget source="PixTemp" render="Progress" position="210,340" size="375,5" borderWidth="1" />
541                         <widget source="PixZielRPM" render="Progress" position="210,360" size="375,5" borderWidth="1" />
542                         <widget source="PixRPM" render="Progress" position="210,380" size="375,5" borderWidth="1" />
543                         <widget source="PixVLT" render="Progress" position="210,400" size="375,5" borderWidth="1" />
544                         <widget source="PixPWM" render="Progress" position="210,420" size="375,5" borderWidth="1" />
545                 </screen>"""
546
547         def __init__(self, session, args = 0):
548                 global LastVLT
549                 global LastPWM
550                 self.session = session
551                 Screen.__init__(self, session)
552
553                 self.fan_timer = eTimer()
554                 self.fan_timer.callback.append(self.updateFanStatus)
555
556                 self.list = []
557                 self.list.append(getConfigListEntry(_("Fan type"), config.plugins.FanControl.Fan))
558                 self.list.append(getConfigListEntry(_("Fan off in Standby"), config.plugins.FanControl.StandbyOff))
559                 self.list.append(getConfigListEntry(_("min Speed rpm"), config.plugins.FanControl.minRPM))
560                 self.list.append(getConfigListEntry(_("max Speed rpm"), config.plugins.FanControl.maxRPM))
561                 self.list.append(getConfigListEntry(_("Static temp C"), config.plugins.FanControl.temp))
562                 self.list.append(getConfigListEntry(_("End temperature C"), config.plugins.FanControl.tempmax))
563                 self.list.append(getConfigListEntry(_("Initial Voltage"), config.plugins.FanControl.vlt))
564                 self.list.append(getConfigListEntry(_("Initial PWM"), config.plugins.FanControl.pwm))
565                 ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.selectionChanged)
566                 LastVLT = config.plugins.FanControl.vlt.value
567                 LastPWM = config.plugins.FanControl.pwm.value
568
569                 self["red"] = StaticText(_("Cancel"))
570                 self["green"] = StaticText(_("Save"))
571                 self["yellow"] = StaticText(_("Check"))
572                 self["blue"] = StaticText(_("Help"))
573                 self["introduction"] = StaticText()
574                 self["Version"] = StaticText(Version)
575                 self["TxtTemp"] = StaticText()
576                 self["TxtZielRPM"] = StaticText()
577                 self["TxtRPM"] = StaticText()
578                 self["TxtVLT"] = StaticText()
579                 self["TxtPWM"] = StaticText()
580                 self["PixTemp"] = Progress()
581                 self["PixZielRPM"] = Progress()
582                 self["PixRPM"] = Progress()
583                 self["PixVLT"] = Progress()
584                 self["PixPWM"] = Progress()
585
586                 self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "MenuActions", "EPGSelectActions"], 
587                 {
588                         "ok": self.save,
589                         "cancel": self.cancel,
590                         "red": self.cancel,
591                         "green": self.save,
592                         "yellow": self.pruefen,
593                         "blue": self.help,
594                         "menu": self.SetupMenu,
595                         "info": self.monitor
596                 }, -1)
597
598                 if not self.selectionChanged in self["config"].onSelectionChanged:
599                         self["config"].onSelectionChanged.append(self.selectionChanged)
600                 self.selectionChanged()
601                 self.onLayoutFinish.append(self.updateFanStatus)
602
603         def selectionChanged(self):
604                 global LastVLT
605                 global LastPWM
606                 global AktPWM
607                 global AktVLT
608                 global AktRPM
609                 self["introduction"].setText(_("Current value: %s") % (self.getCurrentValue()))
610                 if self["config"].getCurrentIndex() > 4:
611                         if LastVLT != config.plugins.FanControl.vlt.value or LastPWM !=config.plugins.FanControl.pwm.value:
612                                 LastVLT = config.plugins.FanControl.vlt.value
613                                 LastPWM = config.plugins.FanControl.pwm.value
614                                 AktVLT = LastVLT
615                                 AktPWM = LastPWM
616                                 id = 0
617                                 setVoltage(id,LastVLT)
618                                 setPWM(id,LastPWM)
619                                 AktRPM = GetFanRPM()
620                 d = config.plugins.FanControl.tempmax.value - config.plugins.FanControl.temp.value
621                 if d < 5:
622                         if config.plugins.FanControl.temp.value + d < 55:
623                                 config.plugins.FanControl.tempmax.value=config.plugins.FanControl.temp.value+5
624                         else:
625                                 config.plugins.FanControl.temp.value=config.plugins.FanControl.tempmax.value-5
626
627         def getCurrentValue(self):
628                 return str(self["config"].getCurrent()[1].getText())
629
630         def updateFanStatus(self):
631                 global ZielRPM
632                 global AktTemp
633                 global AktVLT
634                 global AktPWM
635                 global AktRPM
636                 if config.plugins.FanControl.Fan.value == "disabled":
637                         AktTemp = 0
638                         AktVLT = 0
639                         AktPWM = 0
640                         ZielRPM = 0
641                         AktRPM = 0
642                 self["TxtTemp"].setText(_("Temperature C  %4.1f") % (AktTemp))
643                 self["TxtZielRPM"].setText(_("Target rpm  %4d") % (ZielRPM))
644                 self["TxtRPM"].setText(_("Current rpm  %4d") % (AktRPM))
645                 self["TxtVLT"].setText(_("Voltage  %03d") % (AktVLT))
646                 self["TxtPWM"].setText(_("PWM  %03d") % (AktPWM))
647                 self["PixTemp"].value = int((AktTemp-config.plugins.FanControl.temp.value)*100/Test0(config.plugins.FanControl.tempmax.value-config.plugins.FanControl.temp.value))
648                 self["PixZielRPM"].value = int((ZielRPM-config.plugins.FanControl.minRPM.value)*100/Test0(config.plugins.FanControl.maxRPM.value-config.plugins.FanControl.minRPM.value))
649                 self["PixRPM"].value = int((AktRPM-config.plugins.FanControl.minRPM.value)*100/Test0(config.plugins.FanControl.maxRPM.value-config.plugins.FanControl.minRPM.value))
650                 self["PixVLT"].value = int(AktVLT/2.55)
651                 self["PixPWM"].value = int(AktPWM/2.55)
652                 self.fan_timer.start(2000, True)
653        
654         def save(self):
655                 for x in self["config"].list:
656                         x[1].save()
657                 self.close(True,self.session)
658
659         def cancel(self):
660                 for x in self["config"].list:
661                         x[1].cancel()
662                 self.close(False,self.session)
663
664         def pruefen(self):
665                 self.session.open(FanControl2Test)
666
667         def monitor(self):
668                 self.session.open(FanControl2Monitor)
669
670         def help(self):
671                 self.session.open(Console,_("Information"),["cat /usr/lib/enigma2/python/Plugins/Extensions/FanControl2/%s" % _("readme.txt")])
672
673         def SetupMenu(self):
674                 self.session.open(FanControl2SpezialSetup)
675
676 def DeleteData():
677         if config.plugins.FanControl.DeleteData.value == "0" or config.plugins.FanControl.EnableDataLog.value == False:
678                 return
679         try:
680                 FClog("Auto-Delete Data")
681                 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","a")
682                 s = f.tell()
683                 f.close()
684                 if s < 150:
685                         return
686                 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","r")
687                 f.seek(s-100)
688                 line = f.readline()
689                 line = f.readline()
690                 DT = line.split(";")
691                 DT = DT[0].split(" ")
692                 DD = DT[0].split(".")
693                 DD48h = datetime.date(int(DD[0]),int(DD[1]),int(DD[2])) - datetime.timedelta(int(config.plugins.FanControl.DeleteData.value))
694                 Dfind = "%04d.%02d.%02d %s" % (DD48h.year,DD48h.month,DD48h.day,DT[1])
695                 f.seek(0)
696                 line = f.readline()
697                 fw = open(config.plugins.FanControl.LogPath.value + "FC2data.csv.tmp","w")
698                 fw.write(HeadLine)
699                 for line in f.readlines():
700                         DT = line.split(";")
701                         if DT[0] > Dfind:
702                                 fw.write(line)
703                 f.close()
704                 fw.close()
705                 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
706                         os.remove(config.plugins.FanControl.LogPath.value + "FC2data.csv")
707                 os.rename(config.plugins.FanControl.LogPath.value + "FC2data.csv.tmp",config.plugins.FanControl.LogPath.value + "FC2data.csv")
708         except Exception:
709                 FClog("Error Delete Data")
710
711 def getstatusoutput(cmd):
712         pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
713         text = pipe.read()
714         sts = pipe.close()
715         if sts is None: sts = 0
716         if text[-1:] == '\n': text = text[:-1]
717         return sts, text
718
719 def HDDtestTemp():
720         global disableHDDread
721         if harddiskmanager.HDDCount() > 0 and config.plugins.FanControl.CheckHDDTemp.value !="never":
722                 disableHDDread = False
723                 for hdd in harddiskmanager.HDDList():
724                         FClog("%s %s Mode:%s" % (hdd[1].model(), hdd[1].getDeviceName(), config.plugins.FanControl.CheckHDDTemp.value))
725                         if config.plugins.FanControl.CheckHDDTemp.value == "auto":
726                                 (stat,wert)=getstatusoutput("hdparm -y %s" % hdd[1].getDeviceName())
727                                 time.sleep(0.5)
728                                 (stat,wert)=ReadHDDtemp(hdd[1].getDeviceName())
729                                 if stat != 0:
730                                         (stat,wert)=getstatusoutput("smartctl --smart=on %s" % hdd[1].getDeviceName())
731                                         FClog("HDD Temperature not readable")
732                                 time.sleep(0.5)
733                                 (stat,wert)=getstatusoutput("hdparm -C %s" % hdd[1].getDeviceName())
734                                 if wert.find("standby")>0:
735                                         FClog("HDD supports Temp reading without Spinup")
736                                 else:
737                                         if hdd[1].isSleeping():
738                                                 (stat,wert)=getstatusoutput("hdparm -y %s" % hdd[1].getDeviceName())
739                                         FClog("HDD not supports Temp reading without Spinup -> Disabled")
740                                         disableHDDread = True
741
742 def ReadHDDtemp(D):
743         return getstatusoutput("smartctl -A %s | grep \"194 Temp\" | grep Always" % D)
744
745 def GetHDDtemp(OneTime):
746         global AktHDD
747         AktHDD = []
748         if harddiskmanager.HDDCount() > 0 and config.plugins.FanControl.CheckHDDTemp.value != "never" or OneTime == True:
749                 for hdd in harddiskmanager.HDDList():
750                         sleeptime = int((time.time() - hdd[1].last_access))
751 #                       FClog("HDD Temp reading %s %s %ds %s" % (config.plugins.FanControl.CheckHDDTemp.value, disableHDDread, sleeptime, hdd[1].isSleeping()))
752                         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:
753                                 (stat,wert)=ReadHDDtemp(hdd[1].getDeviceName())
754                                 if stat == 0:
755                                         try:
756                                                 AktHDD.append(int(wert[wert.find("Always")+6:].replace(" ","").replace("-","")[:2]))
757                                         except:
758                                                 AktHDD.append(0)
759                                 if len(AktHDD) == 0:
760                                         AktHDD = [0]
761                                 FClog("HDD Temp %dC" % (AktHDD[-1]))
762         if len(AktHDD) == 0:
763                 AktHDD = [0]
764         return
765
766 def HDDsSleeping(): 
767         for hdd in harddiskmanager.HDDList():
768                 if not hdd[1].isSleeping():
769                         return False
770         return True
771
772 def FC2systemStatus():
773         S = int(FC2werte[5])
774         R = " -" if S>0 else " "
775         if (S & 1)>0 :
776                 R += " BoxOn"
777         if (S & 2)>0 :
778                 R += " HDDon"
779         if (S & 4)>0 :
780                 R += " REC"
781         return R
782
783 class FanControl2(Screen):
784         skin = """ <screen position="100,100" size="300,300" title="FanControl2" > </screen>"""
785
786         def __init__(self,session):
787                 global Box
788                 Screen.__init__(self,session)
789                 self.session = session
790                 self.FanMin     = 500
791                 self.FanMax     = 1500
792                 self.targetTemp = 50.0
793                 self.maxTemp    = 55.0
794                 self.Range      = 5
795                 self.Fan        = "aus"
796                 self.dontshutdown = False
797                 FClog("Starting up")
798                 if os.path.exists("/usr/lib/enigma2/python/Plugins/Extensions/FanControl2/data/diagram.class.org"):
799                         os.rename("/usr/lib/enigma2/python/Plugins/Extensions/FanControl2/data/diagram.class.org","/usr/lib/enigma2/python/Plugins/Extensions/FanControl2/data/diagram.class")
800                 if not isDMMdisabled() and config.plugins.FanControl.DisableDMM.value:
801                         disableDMM()
802                 Box = GetBox()
803                 HDDtestTemp()
804                 GetHDDtemp(False)
805                 DeleteData()
806                 self.timer = eTimer()
807                 if self.query not in self.timer.callback:
808                         self.timer.callback.append(self.query)
809                 self.timer.startLongTimer(10)
810                 config.misc.standbyCounter.addNotifier(self.standbyQuery, initial_call = False)
811
812         def FC2AskShutdown(self):
813                 if not self.dontshutdown:
814                         self.dontshutdown = True
815                         self.session.openWithCallback(self.FC2DoShutdown, MessageBox, _("FanControl2 emergency, Box Shutdown now?"),type = MessageBox.TYPE_YESNO,timeout = 60)
816
817         def FC2DoShutdown(self,retval):
818                 if (retval):
819                         if Standby.inTryQuitMainloop == False:
820                                 self.session.open(Standby.TryQuitMainloop, 1)
821
822         def stop(self):
823                 FClog("Stop")
824                 if self.query in self.timer.callback:
825                         self.timer.callback.remove(self.query)
826                 self.timer.stop()
827
828         def CurrTemp(self):
829                 m1 = 0.1
830                 m2 = 0.1
831                 ti = [0,0,0,0,0,0,0,0,0,0]
832                 templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE)
833                 tempcount = len(templist)
834                 for count in range(tempcount):
835                         tt = sensors.getSensorValue(count)
836                         ti[count] = tt
837                         if m1 < tt:
838                                 mi = count
839                                 m1 = tt
840                 for count in range(tempcount):
841                         if m2 < ti[count] and count != mi:
842                                 m2 = ti[count]
843                 if m2 == 0.1:
844                         m2 = m1
845                 return (m1 + m2) / 2.0
846                 
847         def cycle(self):
848                 self.Range = self.maxTemp - self.targetTemp
849                 x = AktTemp - self.targetTemp
850                 rpm = skal(x, 0, self.Range, self.FanMin, self.FanMax)
851                 return rpm
852
853         def standbyQuery(self, configElement):
854                 Standby.inStandby.onClose.append(self.query)
855                 self.query()
856                 
857         def query(self):
858                 global FirstStart
859                 global istStandbySave
860                 global Overheat
861                 global OverheatTimer
862                 global FanOffWait
863                 global RPMread
864                 global RPMdiff
865                 global FanFehler            
866                 global ZielRPM
867                 global AktRPM
868                 global AktTemp
869                 global AktVLT
870                 global AktPWM
871                 global Recording
872 #               tt = time.time()
873                 try:
874                         if config.plugins.FanControl.Fan.value == "disabled":
875                                 self.timer.startLongTimer(10)
876                                 return
877                         self.targetTemp = config.plugins.FanControl.temp.value
878                         self.maxTemp    = config.plugins.FanControl.tempmax.value
879                         self.Fan        = config.plugins.FanControl.Fan.value
880                         self.Vlt        = config.plugins.FanControl.vlt.value
881                         self.HDDidle    = True
882                         id = 0
883                         AktRPMtmp = 0
884                         sleeptime = 0
885                         AktTemp = self.CurrTemp()
886                         Recording = self.session.nav.RecordTimer.isRecording()
887                         if AktTemp >= config.plugins.FanControl.ShutdownTemp.value:
888                                 FClog("Emergency Shutdown")
889                                 self.FC2AskShutdown()
890                         if harddiskmanager.HDDCount() > 0:
891                                 self.HDDidle = HDDsSleeping()
892                                 if int(strftime("%S")) < 10 and strftime("%M")[-1:] == "0":
893                                         GetHDDtemp(False)
894                                         if strftime("%H:%M") == "00:00":
895                                                 DeleteData()
896                         S=0
897                         if not Standby.inStandby:
898                                 S+=1
899                         if not self.HDDidle:
900                                 S+=2
901                         if Recording:
902                                 S+=4
903                         FC2werte[5]=str(S)
904
905                         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))):
906                                 FClog("Fan Off Temp: %d %s" % (AktTemp,FC2systemStatus()))
907                                 setVoltage(id,0)
908                                 setPWM(id,0)
909                                 FC2werte[0] = AktTemp
910                                 FC2werte[1] = 0
911                                 FC2werte[2] = 0
912                                 FC2werte[3] = 0
913 #                               FC2werte[4] = str(AktHDD)[1:-1].replace(",","")
914                                 FC2werte[4] = max(AktHDD) if len(AktHDD) > 0 else 0
915                                 FCdata()
916                                 FirstStart = True
917                                 OverheatTemp = self.maxTemp + config.plugins.FanControl.AddOverheat.value
918                                 OverheatTimer = 0
919                                 FanOffWait = True
920                                 if OverheatTemp > 65:
921                                         OverheatTemp = 65
922                                 if AktTemp > OverheatTemp:
923                                         Overheat = True
924                                         FClog("Overheat")
925                         else:
926                                 if (Overheat and AktTemp < self.maxTemp-3) or not Standby.inStandby:
927                                         Overheat = False
928                                 AktVLTtmp = getVoltage(id)
929                                 if Standby.inStandby and Standby.inStandby == istStandbySave and RPMdiff == 1:
930                                         tmp = GetFanRPM()
931                                         RPMdiff = AktRPM-tmp
932                                         if RPMdiff < 150 or tmp < 300 or self.Fan == "3pin":
933                                                 RPMdiff = 0
934                                         else:
935                                                 if config.plugins.FanControl.minRPM.value - RPMdiff < 300:
936                                                         RPMdiff = config.plugins.FanControl.minRPM.value - 300
937                                                 FClog("RPM-Range shifted -%drpm" % RPMdiff)
938                                 if not Standby.inStandby:
939                                         RPMdiff = 0
940                                 self.FanMin = config.plugins.FanControl.minRPM.value - RPMdiff
941                                 self.FanMax = config.plugins.FanControl.maxRPM.value - RPMdiff
942                                 if Standby.inStandby != istStandbySave or AktVLT != AktVLTtmp:
943                                         istStandbySave = Standby.inStandby
944                                         AktVLTtmp = AktVLT
945                                         setVoltage(id,AktVLT)
946                                         setPWM(id,AktPWM)
947                                         RPMdiff = 1
948                                         FClog("Fan Reset")
949                                 if (AktVLT + AktPWM) == 0:
950                                         FirstStart = True
951                                 if FirstStart == True:
952                                         FirstStart = False
953                                         AktVLTtmp = self.Vlt
954                                         setVoltage(id,self.Vlt)
955                                         setPWM(id,config.plugins.FanControl.pwm.value)
956                                 AktRPMtmp = GetFanRPM()
957                                 if RPMread>0 and RPMread<3:
958                                         self.timer.start(400, True)
959                                         return
960                                 AktRPM = AktRPMtmp
961                                 AktVLT = AktVLTtmp
962                                 AktPWM = getPWM(id)
963                                 FClog("Vlt:%d Pwm:%d Fan:%s  %s" % (AktVLT,AktPWM,self.Fan,FC2systemStatus()))
964                                 FC2werte[0] = AktTemp
965                                 FC2werte[1] = AktRPM
966                                 FC2werte[2] = AktVLT
967                                 FC2werte[3] = AktPWM
968                                 FC2werte[4] = max(AktHDD) if len(AktHDD) > 0 else 0
969                                 FCdata()
970                                 if int(strftime("%M")) == 0:
971                                         FC2stunde[int(strftime("%H"))] = "%4.1f<BR>%d" % (AktTemp,AktRPM)
972                                 RPMread = 0
973                                 ZielRPM = self.cycle()
974                                 if (FanOffWait and OverheatTimer < 30) or (Overheat and OverheatTimer < 60):
975                                         ZielRPM = self.FanMin
976                                         OverheatTimer += 1
977                                         FClog("FanStartTimeout set MinRPM (%d)" % (OverheatTimer)) 
978                                 else:
979                                         FanOffWait = False
980                                 FClog(_("currentRPM:%d targetRPM:%d Temp:%4.1f") % (AktRPM,ZielRPM,AktTemp))
981                                 if ZielRPM > 0 and AktRPM == 0:
982                                         FanFehler += 1
983                                         if FanFehler > 90:
984                                                 FanFehler -= 18
985                                                 FClog("Fan Error")
986                                                 if config.plugins.FanControl.ShowError.value == "true":
987                                                         Notifications.AddNotification(MessageBox, _("Fan is not working!"), type=MessageBox.TYPE_INFO, timeout=5)
988                                                 if config.plugins.FanControl.ShowError.value == "shutdown":
989                                                         self.FC2AskShutdown()
990                                 else:
991                                         FanFehler = 0
992                                 if self.Fan == "4pin":
993                                         if AktPWM < 255 and AktPWM > 0 and AktVLT != self.Vlt:
994                                                 AktVLT = (AktVLT-1 if AktVLT > self.Vlt else AktVLT+1)
995                                                 setVoltage(id,AktVLT)
996                                         if AktRPM+29 < ZielRPM:
997                                                 AktPWM = (AktPWM+5 if ZielRPM-AktRPM > 100 else AktPWM+1)
998                                                 setPWM(id,AktPWM)
999                                                 if AktPWM >= 255 and AktVLT < 255:
1000                                                         AktVLT += 1
1001                                                         setVoltage(id,AktVLT)
1002                                         elif AktRPM-19 > ZielRPM:
1003                                                 AktPWM = (AktPWM-5 if AktRPM-ZielRPM > 100 else AktPWM-1)
1004                                                 setPWM(id,AktPWM)
1005 # 4
1006                                                 if AktPWM < 0 and AktVLT > 5:
1007                                                         AktVLT -= 1
1008                                                         setVoltage(id,AktVLT)
1009                                         if AktVLT > self.Vlt:
1010                                                 AktPWM = 256
1011                                         if AktPWM < 0:
1012                                                 AktPWM = 0
1013                                 elif self.Fan == "3pin":
1014                                         if AktRPM+29 < ZielRPM:
1015                                                 AktVLT = (AktVLT+5 if ZielRPM-AktRPM > 100 else AktVLT+1)
1016                                                 setVoltage(id,AktVLT)
1017                                         elif AktRPM-19 > ZielRPM:
1018                                                 AktVLT = (AktVLT-5 if AktRPM-ZielRPM > 100 else AktVLT-1)
1019                                                 setVoltage(id,AktVLT)
1020
1021                 except Exception:
1022                         FClog("Control Error")
1023                         import traceback, sys
1024                         traceback.print_exc(file=sys.stdout)
1025 #               FClog(str(time.time() - tt ))
1026                 self.timer.startLongTimer(10)
1027
1028 def autostart(reason, **kwargs):
1029         global session
1030         from Plugins.Extensions.WebInterface.WebChilds.Toplevel import addExternalChild
1031         from FC2webSite import FC2web, FC2webLog, FC2webChart
1032         from twisted.web import static
1033         root = static.File("/usr/lib/enigma2/python/Plugins/Extensions/FanControl2/data")
1034 #       root = FC2web()
1035         root.putChild("", FC2web())
1036         root.putChild("log", FC2webLog())
1037         root.putChild("chart", FC2webChart())
1038         addExternalChild( ("fancontrol", root) )
1039         if reason == 0 and kwargs.has_key("session"):
1040                 session = kwargs["session"]
1041                 session.open(FanControl2)
1042           
1043 def Plugins(**kwargs):
1044         list = [
1045         PluginDescriptor(name="Fan Control", 
1046         description="Fan Control 2", 
1047         where = [PluginDescriptor.WHERE_SESSIONSTART, 
1048         PluginDescriptor.WHERE_AUTOSTART], 
1049         fnc = autostart),
1050         PluginDescriptor(name="Fan Control", 
1051         description="Fan Control 2", 
1052         where = PluginDescriptor.WHERE_PLUGINMENU,
1053         icon = "plugin.png",
1054         fnc = main)]
1055         if config.plugins.FanControl.MonitorInExtension.value:
1056                 list.append(PluginDescriptor(
1057                 name="Fan Control 2 - Monitor", 
1058                 description="Fan Control 2", 
1059                 where = PluginDescriptor.WHERE_EXTENSIONSMENU,
1060                 icon = "plugin.png",
1061                 fnc = mainMonitor))
1062         return list