--- /dev/null
+Package: enigma2-plugin-extensions-fancontrol2
+Version: 2.4-20110113-r4
+Description: Steuerung Luefter
+Architecture: mipsel
+Section: extra
+Priority: optional
+Maintainer: IHAD joergm6 <joergm6@www.i-have-a-dreambox.com>
+Homepage: http://www.i-have-a-dreambox.com
+Depends: enigma2(>2.6)
+Source: http://www.i-have-a-dreambox.com
--- /dev/null
+#!/bin/sh
+echo "* *"
+echo "* plugin installed successfully *"
+echo "* *"
+echo "* E2 restart is required *"
+echo "* *"
+echo "* E2 muss neu gestartet werden *"
+echo "* *"
+
+exit
\ No newline at end of file
--- /dev/null
+#!/bin/sh
+rm /usr/lib/enigma2/python/Plugins/Extensions/FanControl/*.pyc > /dev/null 2>&1
+rm /usr/lib/enigma2/python/Plugins/Extensions/FanControl/*.pyo > /dev/null 2>&1
+rm /usr/lib/enigma2/python/Plugins/Extensions/WebInterface/WebChilds/External/FC2web.pyc > /dev/null 2>&1
+rm /usr/lib/enigma2/python/Plugins/Extensions/WebInterface/WebChilds/External/FC2web.pyo > /dev/null 2>&1
+rm /usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/fc2/diagram.class > /dev/null 2>&1
+echo "* *"
+echo "* E2 restart is required *"
+echo "* *"
+echo "* E2 muss neu gestartet werden *"
+echo "* *"
+
+exit 0
--- /dev/null
+SUBDIRS = src po meta
--- /dev/null
+installdir = $(datadir)/meta/
+
+dist_install_DATA = plugin_fancontrol.xml
+
+EXTRA_DIST = fancontrol.jpg
\ No newline at end of file
--- /dev/null
+<default>
+ <prerequisites>
+ <tag type="System" />
+ </prerequisites>
+ <info language="en">
+ <author>joergm6</author>
+ <name>FanControl2</name>
+ <packagename>enigma2-plugin-extensions-fancontrol2</packagename>
+ <shortdescription>Temperature-dependent fan control.</shortdescription>
+ <description>Temperature-dependent fan control.</description>
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_fancontrol.jpg" />
+ </info>
+ <info language="de">
+ <author>joergm6</author>
+ <name>FanControl2</name>
+ <packagename>enigma2-plugin-extensions-fancontrol2</packagename>
+ <shortdescription>Temperaturabhängige Lüftersteuerung.</shortdescription>
+ <description>Temperaturabhängige Lüftersteuerung.</description>
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_fancontrol.jpg" />
+ </info>
+ <files type="package"> <!-- without version, without .ipk -->
+ <file type="package" name="enigma2-plugin-extensions-fancontrol2" />
+ </files>
+</default>
--- /dev/null
+# SOME DESCRIPTIVE TITLE.\r
+# Copyright (C) YEAR ORGANIZATION\r
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\r
+#\r
+msgid ""\r
+msgstr ""\r
+"Project-Id-Version: PACKAGE VERSION\n"\r
+"POT-Creation-Date: 2010-10-02 17:47+Westeuropäische Sommerzeit\n"\r
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"\r
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"\r
+"Language-Team: LANGUAGE <LL@li.org>\n"\r
+"MIME-Version: 1.0\n"\r
+"Content-Type: text/plain; charset=CHARSET\n"\r
+"Content-Transfer-Encoding: ENCODING\n"\r
+"Generated-By: pygettext.py 1.5\n"\r
+\r
+\r
+#: FC2.txt:88\r
+msgid "."\r
+msgstr ""\r
+\r
+#: FC2.txt:157\r
+msgid "below Tunerslot 4"\r
+msgstr ""\r
+\r
+#: FC2.txt:158\r
+msgid "near XILINX Spartan"\r
+msgstr ""\r
+\r
+#: FC2.txt:159\r
+msgid "under the WLAN"\r
+msgstr ""\r
+\r
+#: FC2.txt:160\r
+msgid "left of the Battery"\r
+msgstr ""\r
+\r
+#: FC2.txt:161\r
+msgid "left near Front-CI"\r
+msgstr ""\r
+\r
+#: FC2.txt:162\r
+msgid "left near Card-Slot"\r
+msgstr ""\r
+\r
+#: FC2.txt:163\r
+msgid "over Security Card"\r
+msgstr ""\r
+\r
+#: FC2.txt:164\r
+msgid "under the Fan"\r
+msgstr ""\r
+\r
+#: FC2.txt:169\r
+msgid "3Pin"\r
+msgstr ""\r
+\r
+#: FC2.txt:169\r
+msgid "4Pin"\r
+msgstr ""\r
+\r
+#: FC2.txt:169\r
+msgid "Control disabled"\r
+msgstr ""\r
+\r
+#: FC2.txt:169\r
+msgid "disabled"\r
+msgstr ""\r
+\r
+#: FC2.txt:170\r
+msgid "yes, Except for Recording or HDD"\r
+msgstr ""\r
+\r
+#: FC2.txt:170 FC2.txt:183 FC2.txt:186\r
+msgid "no"\r
+msgstr ""\r
+\r
+#: FC2.txt:170 FC2.txt:186\r
+msgid "yes"\r
+msgstr ""\r
+\r
+#: FC2.txt:177\r
+msgid "Box Shutdown"\r
+msgstr ""\r
+\r
+#: FC2.txt:177\r
+msgid "display Info"\r
+msgstr ""\r
+\r
+#: FC2.txt:177\r
+msgid "do nothing"\r
+msgstr ""\r
+\r
+#: FC2.txt:186\r
+msgid "auto"\r
+msgstr ""\r
+\r
+#: FC2.txt:186\r
+msgid "never"\r
+msgstr ""\r
+\r
+#: FC2.txt:269\r
+msgid "please wait (until 3min)..."\r
+msgstr ""\r
+\r
+#: FC2.txt:307\r
+msgid "Min Fan Start %d rpm at PWM=%d"\r
+msgstr ""\r
+\r
+#: FC2.txt:313\r
+msgid "Min Fan Stop %d rpm at PWM=%d (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:319\r
+msgid "Max Fan %d rpm at PWM=255 (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:321\r
+msgid "Extended Control Range"\r
+msgstr ""\r
+\r
+#: FC2.txt:331\r
+msgid "Min Fan Start %d rpm at VLT=%d and PWM=0"\r
+msgstr ""\r
+\r
+#: FC2.txt:334\r
+msgid "Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:341\r
+msgid "Max Fan %d rpm at PWM=255 and VLT=255 (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:349\r
+msgid "Min Fan Start %d rpm at VLT=%d"\r
+msgstr ""\r
+\r
+#: FC2.txt:352\r
+msgid "Min Fan Stop %d rpm at VLT=%d (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:357\r
+msgid "Max Fan %d rpm at VLT=255 (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:429 FC2.txt:431 FC2.txt:434\r
+msgid "%s %02d C"\r
+msgstr ""\r
+\r
+#: FC2.txt:436\r
+msgid "press Info for HDD-Temp"\r
+msgstr ""\r
+\r
+#: FC2.txt:437 FC2.txt:678\r
+msgid "Current rpm %4d"\r
+msgstr ""\r
+\r
+#: FC2.txt:467\r
+msgid "Action in case of Fan failure"\r
+msgstr ""\r
+\r
+#: FC2.txt:468\r
+msgid "Box shutdown at Temperature (C)"\r
+msgstr ""\r
+\r
+#: FC2.txt:469\r
+msgid "increases overheating protection to (C)"\r
+msgstr ""\r
+\r
+#: FC2.txt:470\r
+msgid "read HDD-Temperature in HDD-Standby-Mode"\r
+msgstr ""\r
+\r
+#: FC2.txt:471\r
+msgid "disable DMM-FanControl"\r
+msgstr ""\r
+\r
+#: FC2.txt:472\r
+msgid "Number of WebIF-Log-Entries"\r
+msgstr ""\r
+\r
+#: FC2.txt:473\r
+msgid "Logging path"\r
+msgstr ""\r
+\r
+#: FC2.txt:474\r
+msgid "Auto-Delete Data older than (Days)"\r
+msgstr ""\r
+\r
+#: FC2.txt:475\r
+msgid "Enable Data Logging"\r
+msgstr ""\r
+\r
+#: FC2.txt:476\r
+msgid "Enable Event Logging"\r
+msgstr ""\r
+\r
+#: FC2.txt:477\r
+msgid "Show Monitor in Extension-Menu"\r
+msgstr ""\r
+\r
+#: FC2.txt:492\r
+msgid "Choose path"\r
+msgstr ""\r
+\r
+#: FC2.txt:524\r
+msgid ""\r
+"GUI needs a restart to apply the changes.\n"\r
+"Do you want to Restart the GUI now?"\r
+msgstr ""\r
+\r
+#: FC2.txt:525\r
+msgid "Restart GUI now?"\r
+msgstr ""\r
+\r
+#: FC2.txt:591\r
+msgid "Fan type"\r
+msgstr ""\r
+\r
+#: FC2.txt:592\r
+msgid "Fan off in Standby"\r
+msgstr ""\r
+\r
+#: FC2.txt:593\r
+msgid "min Speed rpm"\r
+msgstr ""\r
+\r
+#: FC2.txt:594\r
+msgid "max Speed rpm"\r
+msgstr ""\r
+\r
+#: FC2.txt:595\r
+msgid "Static temp C"\r
+msgstr ""\r
+\r
+#: FC2.txt:596\r
+msgid "End temperature C"\r
+msgstr ""\r
+\r
+#: FC2.txt:597\r
+msgid "Initial Voltage"\r
+msgstr ""\r
+\r
+#: FC2.txt:598\r
+msgid "Initial PWM"\r
+msgstr ""\r
+\r
+#: FC2.txt:603\r
+msgid "Cancel"\r
+msgstr ""\r
+\r
+#: FC2.txt:604\r
+msgid "Save"\r
+msgstr ""\r
+\r
+#: FC2.txt:605\r
+msgid "Check"\r
+msgstr ""\r
+\r
+#: FC2.txt:606\r
+msgid "Help"\r
+msgstr ""\r
+\r
+#: FC2.txt:643\r
+msgid "Current value: %s"\r
+msgstr ""\r
+\r
+#: FC2.txt:676\r
+msgid "Temperature C %4.1f"\r
+msgstr ""\r
+\r
+#: FC2.txt:677\r
+msgid "Target rpm %4d"\r
+msgstr ""\r
+\r
+#: FC2.txt:679\r
+msgid "Voltage %03d"\r
+msgstr ""\r
+\r
+#: FC2.txt:680\r
+msgid "PWM %03d"\r
+msgstr ""\r
+\r
+#: FC2.txt:705\r
+msgid "Information"\r
+msgstr ""\r
+\r
+#: FC2.txt:705\r
+msgid "readme.txt"\r
+msgstr ""\r
+\r
+#: FC2.txt:819\r
+msgid "FanControl2 emergency, Box Shutdown now?"\r
+msgstr ""\r
+\r
+#: FC2.txt:962\r
+msgid "currentRPM:%d targetRPM:%d Temp:%4.1f"\r
+msgstr ""\r
+\r
+#: FC2.txt:969\r
+msgid "Fan is not working!"\r
+msgstr ""\r
+\r
+#: FC2.txt:1085\r
+msgid "Temperature"\r
+msgstr ""\r
+\r
+#: FC2.txt:1086\r
+msgid "Speed"\r
+msgstr ""\r
+\r
+#: FC2.txt:1087\r
+msgid "Voltage"\r
+msgstr ""\r
+\r
+#: FC2.txt:1094\r
+msgid "Sensors"\r
+msgstr ""\r
+\r
+#: FC2.txt:1172 FC2.txt:1209\r
+msgid "active"\r
+msgstr ""\r
+\r
+#: FC2.txt:1175 FC2.txt:1212\r
+msgid "turn off"\r
+msgstr ""\r
+\r
+#: FC2.txt:1178 FC2.txt:1215\r
+msgid "not active"\r
+msgstr ""\r
+\r
+#: FC2.txt:1181 FC2.txt:1218\r
+msgid "turn on"\r
+msgstr ""\r
+\r
+#: FC2.txt:1186 FC2.txt:1188 FC2.txt:1223 FC2.txt:1225\r
+msgid "Filesize : %d %sByte"\r
+msgstr ""\r
+\r
+#: FC2.txt:1190 FC2.txt:1227\r
+msgid "Disk free : %d MByte"\r
+msgstr ""\r
+\r
+#: FC2.txt:1193 FC2.txt:1230\r
+msgid "Download"\r
+msgstr ""\r
+\r
+#: FC2.txt:1197 FC2.txt:1234\r
+msgid "Delete"\r
+msgstr ""\r
+\r
+#: FC2.txt:1201\r
+msgid "Delete older 48h"\r
+msgstr ""\r
+\r
+#: FC2.txt:1205 FC2.txt:1242\r
+msgid "File %s does not exists"\r
+msgstr ""\r
+\r
+#: FC2.txt:1244\r
+msgid "Logging-Path: %s"\r
+msgstr ""\r
+\r
--- /dev/null
+#
+# to use this for the localisation of other plugins,
+# just change the DOMAIN to the name of the Plugin.
+# It is assumed, that the domain ist the same as
+# the directory name of the plugin.
+#
+
+DOMAIN=FanControl
+installdir = /usr/lib/enigma2/python/Plugins/Extensions/$(DOMAIN)
+#GETTEXT=./pygettext.py
+GETTEXT=xgettext
+
+#MSGFMT = ./msgfmt.py
+MSGFMT = msgfmt
+
+LANGS := de it nl fr
+LANGPO := $(foreach LANG, $(LANGS),$(LANG).po)
+LANGMO := $(foreach LANG, $(LANGS),$(LANG).mo)
+
+default: $(DOMAIN).pot $(LANGPO) merge $(LANGMO)
+ for lang in $(LANGS); do \
+ mkdir -p $$lang/LC_MESSAGES; \
+ cp $$lang.mo $$lang/LC_MESSAGES/$(DOMAIN).mo; \
+ done
+
+merge:
+ for lang in $(LANGS); do \
+ msgmerge --no-location -s -N -U $$lang.po $(DOMAIN).pot; \
+ done
+
+
+# the TRANSLATORS: allows putting translation comments before the to-be-translated line.
+$(DOMAIN).pot:
+ $(GETTEXT) -L python --add-comments="TRANSLATORS:" -d $(DOMAIN) -s -o $(DOMAIN).pot ../src/*.py
+
+ ../../xml2po.py ../src/ >> $(DOMAIN).pot
+
+ msguniq -o $(DOMAIN)uniq.pot $(DOMAIN).pot
+ $(RM) $(DOMAIN).pot
+ mv $(DOMAIN)uniq.pot $(DOMAIN).pot
+
+.PHONY: $(DOMAIN).pot
+
+
+%.mo: %.po
+ $(MSGFMT) -o $@ $<
+
+%.po:
+ msginit -l $@ -o $@ -i $(DOMAIN).pot --no-translator
+
+CLEANFILES = $(foreach LANG, $(LANGS),$(LANG).mo)
+
+clean-local:
+ $(RM) -r $(LANGS)
+
+install-data-am: default
+ for lang in $(LANGS); do \
+ mkdir -p $(DESTDIR)$(installdir)/locale/$$lang/LC_MESSAGES; \
+ cp $$lang.mo $(DESTDIR)$(installdir)/locale/$$lang/LC_MESSAGES/$(DOMAIN).mo; \
+ done
--- /dev/null
+msgid ""
+msgstr ""
+"Project-Id-Version: FanControl2\n"
+"POT-Creation-Date: 2010-10-02 17:47+Westeuropäische Sommerzeit\n"
+"PO-Revision-Date: \n"
+"Last-Translator: joergm6 <joergm6@online.de>\n"
+"Language-Team: joergm6 <joergm6@online.de>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: FC2.txt:88
+msgid "."
+msgstr ","
+
+#: FC2.txt:157
+msgid "below Tunerslot 4"
+msgstr "unter Tunerslot 4"
+
+#: FC2.txt:158
+msgid "near XILINX Spartan"
+msgstr "Nähe XILINX Spartan"
+
+#: FC2.txt:159
+msgid "under the WLAN"
+msgstr "unter dem WLAN"
+
+#: FC2.txt:160
+msgid "left of the Battery"
+msgstr "links von der Batterie"
+
+#: FC2.txt:161
+msgid "left near Front-CI"
+msgstr "links vom Front-CI"
+
+#: FC2.txt:162
+msgid "left near Card-Slot"
+msgstr "links vom Card-Slot"
+
+#: FC2.txt:163
+msgid "over Security Card"
+msgstr "oberhalb Security Card"
+
+#: FC2.txt:164
+msgid "under the Fan"
+msgstr "unter dem Lüfter"
+
+#: FC2.txt:169
+msgid "3Pin"
+msgstr "3Pin"
+
+#: FC2.txt:169
+msgid "4Pin"
+msgstr "4Pin"
+
+#: FC2.txt:169
+msgid "Control disabled"
+msgstr "Steuerung aus"
+
+#: FC2.txt:169
+msgid "disabled"
+msgstr "ausgeschaltet"
+
+#: FC2.txt:170
+msgid "yes, Except for Recording or HDD"
+msgstr "Ja, außer bei Aufnahme oder HDD"
+
+#: FC2.txt:170
+#: FC2.txt:183
+#: FC2.txt:186
+msgid "no"
+msgstr "nein"
+
+#: FC2.txt:170
+#: FC2.txt:186
+msgid "yes"
+msgstr "ja"
+
+#: FC2.txt:177
+msgid "Box Shutdown"
+msgstr "Box ausschalten"
+
+#: FC2.txt:177
+msgid "display Info"
+msgstr "zeige Information"
+
+#: FC2.txt:177
+msgid "do nothing"
+msgstr "nichts"
+
+#: FC2.txt:186
+msgid "auto"
+msgstr "automatisch"
+
+#: FC2.txt:186
+msgid "never"
+msgstr "niemals"
+
+#: FC2.txt:269
+msgid "please wait (until 3min)..."
+msgstr "bitte warten (bis 3min)..."
+
+#: FC2.txt:307
+msgid "Min Fan Start %d rpm at PWM=%d"
+msgstr "Min Fan Start %d rpm bei PWM=%d"
+
+#: FC2.txt:313
+msgid "Min Fan Stop %d rpm at PWM=%d (%s)"
+msgstr "Min Fan Stop %d rpm bei PWM=%d (%s)"
+
+#: FC2.txt:319
+msgid "Max Fan %d rpm at PWM=255 (%s)"
+msgstr "Max Fan %d rpm bei PWM=255 (%s)"
+
+#: FC2.txt:321
+msgid "Extended Control Range"
+msgstr "Erweiterter Regelbereich"
+
+#: FC2.txt:331
+msgid "Min Fan Start %d rpm at VLT=%d and PWM=0"
+msgstr "Min Fan Start %d rpm bei VLT=%d und PWM=0"
+
+#: FC2.txt:334
+msgid "Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)"
+msgstr "Min Fan Stop %d rpm bei VLT=%d und PWM=0 (%s)"
+
+#: FC2.txt:341
+msgid "Max Fan %d rpm at PWM=255 and VLT=255 (%s)"
+msgstr "Max Fan %d rpm bei PWM=255 und VLT=255 (%s)"
+
+#: FC2.txt:349
+msgid "Min Fan Start %d rpm at VLT=%d"
+msgstr "Min Fan Start %d rpm bei VLT=%d"
+
+#: FC2.txt:352
+msgid "Min Fan Stop %d rpm at VLT=%d (%s)"
+msgstr "Min Fan Stop %d rpm bei VLT=%d (%s)"
+
+#: FC2.txt:357
+msgid "Max Fan %d rpm at VLT=255 (%s)"
+msgstr "Max Fan %d rpm bei VLT=255 (%s)"
+
+#: FC2.txt:429
+#: FC2.txt:431
+#: FC2.txt:434
+msgid "%s %02d C"
+msgstr "%s %02d C"
+
+#: FC2.txt:436
+msgid "press Info for HDD-Temp"
+msgstr "drücke Info für HDD-Temp"
+
+#: FC2.txt:437
+#: FC2.txt:678
+msgid "Current rpm %4d"
+msgstr "Aktuell rpm %4d"
+
+#: FC2.txt:467
+msgid "Action in case of Fan failure"
+msgstr "Aktion bei Lüfterausfall"
+
+#: FC2.txt:468
+msgid "Box shutdown at Temperature (C)"
+msgstr "Box ausschalten bei Temperatur (C)"
+
+#: FC2.txt:469
+msgid "increases overheating protection to (C)"
+msgstr "Überhitzungsschutz erhöhen um (C)"
+
+#: FC2.txt:470
+msgid "read HDD-Temperature in HDD-Standby-Mode"
+msgstr "HDD-Temperatur im HDD-Standby-Modus lesen"
+
+#: FC2.txt:471
+msgid "disable DMM-FanControl"
+msgstr "DMM-Fancontrol deaktiviert"
+
+#: FC2.txt:472
+msgid "Number of WebIF-Log-Entries"
+msgstr "Anzahl der WebIF-Log-Einträge"
+
+#: FC2.txt:473
+msgid "Logging path"
+msgstr "Logging Verzeichnis"
+
+#: FC2.txt:474
+msgid "Auto-Delete Data older than (Days)"
+msgstr "Auto-Löschen Daten älter als (Tage)"
+
+#: FC2.txt:475
+msgid "Enable Data Logging"
+msgstr "Aktiviere Daten Logging"
+
+#: FC2.txt:476
+msgid "Enable Event Logging"
+msgstr "Aktiviere Ereignis Logging"
+
+#: FC2.txt:477
+msgid "Show Monitor in Extension-Menu"
+msgstr "Zeige Monitor im Erweiterungs-Menü"
+
+#: FC2.txt:492
+msgid "Choose path"
+msgstr "wähle Verzeichnis"
+
+#: FC2.txt:524
+msgid ""
+"GUI needs a restart to apply the changes.\n"
+"Do you want to Restart the GUI now?"
+msgstr ""
+"GUI muss zum Aktivieren der Änderungen neu gestartet werden.\n"
+"Soll jetzt neu gestartet werden?"
+
+#: FC2.txt:525
+msgid "Restart GUI now?"
+msgstr "Starte GUI jetzt?"
+
+#: FC2.txt:591
+msgid "Fan type"
+msgstr "Lüftertyp"
+
+#: FC2.txt:592
+msgid "Fan off in Standby"
+msgstr "Lüfter aus im Standby"
+
+#: FC2.txt:593
+msgid "min Speed rpm"
+msgstr "min Drehzahl rpm"
+
+#: FC2.txt:594
+msgid "max Speed rpm"
+msgstr "max Drehzahl rpm"
+
+#: FC2.txt:595
+msgid "Static temp C"
+msgstr "Ruhe-Temperatur C"
+
+#: FC2.txt:596
+msgid "End temperature C"
+msgstr "Ende-Temperatur C"
+
+#: FC2.txt:597
+msgid "Initial Voltage"
+msgstr "Anfangs Spannung"
+
+#: FC2.txt:598
+msgid "Initial PWM"
+msgstr "Anfangs PWM"
+
+#: FC2.txt:603
+msgid "Cancel"
+msgstr "Abbruch"
+
+#: FC2.txt:604
+msgid "Save"
+msgstr "Speichern"
+
+#: FC2.txt:605
+msgid "Check"
+msgstr "Prüfen"
+
+#: FC2.txt:606
+msgid "Help"
+msgstr "Hilfe"
+
+#: FC2.txt:643
+msgid "Current value: %s"
+msgstr "Aktueller Wert: %s"
+
+#: FC2.txt:676
+msgid "Temperature C %4.1f"
+msgstr "Temperatur C %4.1f"
+
+#: FC2.txt:677
+msgid "Target rpm %4d"
+msgstr "Ziel rpm %4d"
+
+#: FC2.txt:679
+msgid "Voltage %03d"
+msgstr "Spannung %03d"
+
+#: FC2.txt:680
+msgid "PWM %03d"
+msgstr "PWM %03d"
+
+#: FC2.txt:705
+msgid "Information"
+msgstr "Information"
+
+#: FC2.txt:705
+msgid "readme.txt"
+msgstr "readmede.txt"
+
+#: FC2.txt:819
+msgid "FanControl2 emergency, Box Shutdown now?"
+msgstr "FanControl2 Notfall, jetzt Box ausschalten?"
+
+#: FC2.txt:962
+msgid "currentRPM:%d targetRPM:%d Temp:%4.1f"
+msgstr "aktuellRPM:%d zielRPM:%d Temp:%4.1f"
+
+#: FC2.txt:969
+msgid "Fan is not working!"
+msgstr "Lüfter funktioniert nicht!"
+
+#: FC2.txt:1085
+msgid "Temperature"
+msgstr "Temperatur"
+
+#: FC2.txt:1086
+msgid "Speed"
+msgstr "Drehzahl"
+
+#: FC2.txt:1087
+msgid "Voltage"
+msgstr "Spannung"
+
+#: FC2.txt:1094
+msgid "Sensors"
+msgstr "Sensoren"
+
+#: FC2.txt:1172
+#: FC2.txt:1209
+msgid "active"
+msgstr "aktiviert"
+
+#: FC2.txt:1175
+#: FC2.txt:1212
+msgid "turn off"
+msgstr "ausschalten"
+
+#: FC2.txt:1178
+#: FC2.txt:1215
+msgid "not active"
+msgstr "nicht aktiviert"
+
+#: FC2.txt:1181
+#: FC2.txt:1218
+msgid "turn on"
+msgstr "einschalten"
+
+#: FC2.txt:1186
+#: FC2.txt:1188
+#: FC2.txt:1223
+#: FC2.txt:1225
+msgid "Filesize : %d %sByte"
+msgstr "Dateigröße : %d %sByte"
+
+#: FC2.txt:1190
+#: FC2.txt:1227
+msgid "Disk free : %d MByte"
+msgstr "Datenträger frei : %d MByte"
+
+#: FC2.txt:1193
+#: FC2.txt:1230
+msgid "Download"
+msgstr "Herunterladen"
+
+#: FC2.txt:1197
+#: FC2.txt:1234
+msgid "Delete"
+msgstr "Löschen"
+
+#: FC2.txt:1201
+msgid "Delete older 48h"
+msgstr "Löschen älter 48h"
+
+#: FC2.txt:1205
+#: FC2.txt:1242
+msgid "File %s does not exists"
+msgstr "Datei %s ist nicht vorhanden"
+
+#: FC2.txt:1244
+msgid "Logging-Path: %s"
+msgstr "Logging-Verzeichnis: %s"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Enable read HDD-Temperature"
+#~ msgstr "Aktiviere Lesen der HDD-Temperatur"
+
+#~ msgid "Show Fan Error"
+#~ msgstr "Zeige Lüfter Fehler"
+
+#~ msgid "Show Fan rpm"
+#~ msgstr "Anzeige Lüfter rpm"
+
+#~ msgid "Switch RPM/2 <> RPM?"
+#~ msgstr "Umschaltung RPM/2 <> RPM?"
+
+#~ msgid "Regulation off"
+#~ msgstr "Steuerung aus"
+
+#~ msgid "off"
+#~ msgstr "aus"
+
+#~ msgid "Fan rpm current: %s target: %s (%sC)"
+#~ msgstr "Fan rpm Aktuell: %s Ziel: %s (%sC)"
--- /dev/null
+msgid ""
+msgstr ""
+"Project-Id-Version: enigma 2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-01-02 16:26+Westeuropäische Sommerzeit\n"
+"PO-Revision-Date: 2011-01-02 16:29+0100\n"
+"Last-Translator: mimi74 <jrs.concept@orange.fr>\n"
+"Language-Team: french\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Poedit-Language: French\n"
+"X-Poedit-SourceCharset: iso-8859-15\n"
+"X-Poedit-Country: FRENCH\n"
+
+msgid "%s %02d C"
+msgstr "%s %02d C"
+
+msgid "."
+msgstr ","
+
+msgid "3Pin"
+msgstr "3Pin"
+
+msgid "4Pin"
+msgstr "4Pin"
+
+msgid "Action in case of Fan failure"
+msgstr "Action en cas de défaillance du ventilateur"
+
+msgid "Box Shutdown"
+msgstr "Arrêt de la boîte"
+
+msgid "Box shutdown at Temperature (C)"
+msgstr "Arrêter boîte à la température (en C)"
+
+msgid "Cancel"
+msgstr "Abandon"
+
+msgid "Check"
+msgstr "Vérifier"
+
+msgid "Choose path"
+msgstr "Choisir chemin"
+
+msgid "Control disabled"
+msgstr "Contrôle désactivé"
+
+msgid "Current rpm %4d"
+msgstr "Rpm actuelles %4d"
+
+msgid "Current value: %s"
+msgstr "Valeur actuelle: %s"
+
+msgid "Delete"
+msgstr "Effacer"
+
+msgid "Delete older 48h"
+msgstr "Effacer plus vieux que 48h"
+
+msgid "Disk free : %d MByte"
+msgstr "Disque libre : %d MByte"
+
+msgid "Download"
+msgstr "Téléchargement"
+
+msgid "Enable Data Logging"
+msgstr "Activer journal données"
+
+msgid "Enable Event Logging"
+msgstr "Activer jounal événements"
+
+msgid "End temperature C"
+msgstr "Température finale en C"
+
+msgid "Extended Control Range"
+msgstr "Echelle contrôle étendu"
+
+msgid "Fan is not working!"
+msgstr "Le ventilateur ne fonctionne pas!"
+
+msgid "Fan off in Standby"
+msgstr "Ventilateur stoppé en veille"
+
+msgid "Fan type"
+msgstr "Type ventilateur"
+
+msgid "FanControl2 emergency, Box Shutdown now?"
+msgstr "Alerte FanControl2, éteindre boîte maintenant ?"
+
+msgid "File %s does not exists"
+msgstr "Le fichier %s n'existe pas"
+
+msgid "Filesize : %d %sByte"
+msgstr "Taille fichier : %d %sByte"
+
+msgid ""
+"GUI needs a restart to apply the changes.\n"
+"Do you want to Restart the GUI now?"
+msgstr ""
+"L'IGU a besoin d'un redémarrage pour appliquer les modifications.\n"
+"Souhaitez-vous relancer l'IGU maintenant ?"
+
+msgid "Help"
+msgstr "Aide"
+
+msgid "Information"
+msgstr "Informations"
+
+msgid "Initial PWM"
+msgstr "PWM initial"
+
+msgid "Initial Voltage"
+msgstr "Voltage initial"
+
+msgid "Logging path"
+msgstr "Chemin des journaux"
+
+msgid "Logging-Path: %s"
+msgstr "Chemin des journaux: %s"
+
+msgid "Max Fan %d rpm at PWM=255 (%s)"
+msgstr "Ventilateur max %d rpm à PWM=255 (%s)"
+
+msgid "Max Fan %d rpm at PWM=255 and VLT=255 (%s)"
+msgstr "Ventilateur max %d rpm à PWM=255 et VLT=255 (%s)"
+
+msgid "Max Fan %d rpm at VLT=255 (%s)"
+msgstr "Ventilateur max %d rpm à VLT=255 (%s)"
+
+msgid "Min Fan Start %d rpm at PWM=%d"
+msgstr "Démarrage ventilateur min %d rpm à PWM=%d"
+
+msgid "Min Fan Start %d rpm at VLT=%d"
+msgstr "Démarrage ventilateur min %d rpm à VLT=%d"
+
+msgid "Min Fan Start %d rpm at VLT=%d and PWM=0"
+msgstr "Démarrage ventilateur min %d rpm à VLT=%d et PWM=0"
+
+msgid "Min Fan Stop %d rpm at PWM=%d (%s)"
+msgstr "Stop ventilateur min %d rpm à PWM=%d (%s)"
+
+msgid "Min Fan Stop %d rpm at VLT=%d (%s)"
+msgstr "Stop ventilateur min %d rpm à VLT=%d (%s)"
+
+msgid "Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)"
+msgstr "Stop ventilateur min %d rpm à VLT=%d et PWM=0 (%s)"
+
+msgid "Number of WebIF-Log-Entries"
+msgstr "Nombre de WebIF-Log-entries"
+
+msgid "PWM %03d"
+msgstr "PWM %03d"
+
+msgid "Restart GUI now?"
+msgstr "Relancer l'IGU maintenant ?"
+
+msgid "Save"
+msgstr "Sauver"
+
+msgid "Sensors"
+msgstr "Capteurs"
+
+msgid "Show Monitor in Extension-Menu"
+msgstr "Montrer Moniteur dans le menu-extension"
+
+msgid "Speed"
+msgstr "Vitesse"
+
+msgid "Static temp C"
+msgstr "Température statique C"
+
+msgid "Target rpm %4d"
+msgstr "Rpm cible %4d"
+
+msgid "Temperature"
+msgstr "Température"
+
+msgid "Temperature C %4.1f"
+msgstr "Température C %4.1f"
+
+msgid "Voltage"
+msgstr "Voltage"
+
+msgid "Voltage %03d"
+msgstr "Voltage %03d"
+
+msgid "active"
+msgstr "actif"
+
+msgid "auto"
+msgstr "automatique"
+
+msgid "below Tunerslot 4"
+msgstr "à coté fente tuner 4"
+
+msgid "currentRPM:%d targetRPM:%d Temp:%4.1f"
+msgstr "RPM actuelles:%d RPM cible:%d Temp:%4.1f"
+
+msgid "disable DMM-FanControl"
+msgstr "Désactiver DMM-Fancontrol"
+
+msgid "disabled"
+msgstr "désactivé"
+
+msgid "display Info"
+msgstr "afficher les infos"
+
+msgid "do nothing"
+msgstr "ne rien faire"
+
+msgid "increases overheating protection to (C)"
+msgstr "Augmenter protection contre la surchauffe de (en C)"
+
+msgid "left near Card-Slot"
+msgstr "gauche près fente-carte"
+
+msgid "left near Front-CI"
+msgstr "gauche près CI-avant"
+
+msgid "left of the Battery"
+msgstr "gauche de la batterie"
+
+msgid "max Speed rpm"
+msgstr "Vitesse max rpm"
+
+msgid "min Speed rpm"
+msgstr "Vitesse min rpm"
+
+msgid "near XILINX Spartan"
+msgstr "près spartan XILINX"
+
+msgid "never"
+msgstr "jamais"
+
+msgid "no"
+msgstr "non"
+
+msgid "not active"
+msgstr "pas actif"
+
+msgid "over Security Card"
+msgstr "sur la carte sécurité"
+
+msgid "please wait (until 3min)..."
+msgstr "Veuillez patienter (jusqu'à 3min)..."
+
+msgid "press Info for HDD-Temp"
+msgstr "presse info pour HDD-Temp"
+
+msgid "read HDD-Temperature in HDD-Standby-Mode"
+msgstr "Lire HDD-Température si HDD en Standby-Mode"
+
+msgid "readme.txt"
+msgstr "readmefr.txt"
+
+msgid "turn off"
+msgstr "Stopper"
+
+msgid "turn on"
+msgstr "Démarrer"
+
+msgid "under the Fan"
+msgstr "sous le ventilateur"
+
+msgid "under the WLAN"
+msgstr "sous le WiFi"
+
+msgid "yes"
+msgstr "oui"
+
+msgid "yes, Except for Recording or HDD"
+msgstr "oui, sauf pour l'enregistrement/HDD"
+
+msgid "Auto-Delete Data older than (Days)"
+msgstr "Effacement auto données plus vieilles que (en jours)"
+
+msgid "Data Logging "
+msgstr "Jounal données"
+
+msgid "Event Logging "
+msgstr "Jounal événements"
+
+msgid "Fan Control 2 - Info"
+msgstr "Fan Control 2 - Infos"
+
+msgid "Fan Control 2 - Chart"
+msgstr "Fan Control 2 - Courbes"
+
+msgid "Fan Control 2 - Logging"
+msgstr "Fan Control 2 - Journaux"
\ No newline at end of file
--- /dev/null
+msgid ""
+msgstr ""
+"Project-Id-Version: enigma2 - fancontrol2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-11 16:21+0100\n"
+"PO-Revision-Date: \n"
+"Last-Translator: Spaeleus <spaeleus@croci.org>\n"
+"Language-Team: www.linsat.net <spaeleus@croci.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Italian\n"
+"X-Poedit-Country: ITALY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Basepath: /home/dario/Plugins/Extensions\n"
+"X-Poedit-SearchPath-0: /home/dario/Plugins/Extensions\n"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:88
+msgid "."
+msgstr "."
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:157
+msgid "below Tunerslot 4"
+msgstr "Sotto il tuner 4"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:158
+msgid "near XILINX Spartan"
+msgstr "Vicino XILINX Spartan"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:159
+msgid "under the WLAN"
+msgstr "Sotto la WLAN"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:160
+msgid "left of the Battery"
+msgstr "A sx della batteria"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:161
+msgid "left near Front-CI"
+msgstr "A sx della CI frontale"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:162
+msgid "left near Card-Slot"
+msgstr "A sx dello slot card"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:163
+msgid "over Security Card"
+msgstr "Sopra la security card"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:164
+msgid "under the Fan"
+msgstr "Sotto la ventola"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:169
+msgid "disabled"
+msgstr "Disabilitato"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:169
+msgid "Control disabled"
+msgstr "Controllo disabilitato"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:169
+msgid "3Pin"
+msgstr "3Pin"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:169
+msgid "4Pin"
+msgstr "4Pin"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:170
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:183
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:186
+msgid "no"
+msgstr "No"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:170
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:186
+msgid "yes"
+msgstr "Sì"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:170
+msgid "yes, Except for Recording or HDD"
+msgstr "Sì, ma non durante registrazioni o attività HDD"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:177
+msgid "do nothing"
+msgstr "Non fare nulla"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:177
+msgid "display Info"
+msgstr "Mostrare info"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:177
+msgid "Box Shutdown"
+msgstr "Spegnere il box"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:186
+msgid "auto"
+msgstr "Automaticamente"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:186
+msgid "never"
+msgstr "Mai"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:269
+msgid "please wait (until 3min)..."
+msgstr "Attendere... (occorreranno almeno 3 minuti)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:307
+#, python-format
+msgid "Min Fan Start %d rpm at PWM=%d"
+msgstr "Avvio minimo %d rpm a PWM=%d"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:313
+#, python-format
+msgid "Min Fan Stop %d rpm at PWM=%d (%s)"
+msgstr "Stop minimo %d rpm a PWM=%d (%s)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:319
+#, python-format
+msgid "Max Fan %d rpm at PWM=255 (%s)"
+msgstr "Vel. max %d rpm a PWM=255 (%s)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:321
+msgid "Extended Control Range"
+msgstr "Controllo esteso"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:331
+#, python-format
+msgid "Min Fan Start %d rpm at VLT=%d and PWM=0"
+msgstr "Avvio minimo %d rpm a VLT=%d e PWM=0"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:334
+#, python-format
+msgid "Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)"
+msgstr "Stop minimo %d rpm a VLT=%d e PWM=0 (%s)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:341
+#, python-format
+msgid "Max Fan %d rpm at PWM=255 and VLT=255 (%s)"
+msgstr "Vel. max %d rpm a PWM=255 e VLT=255 (%s)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:349
+#, python-format
+msgid "Min Fan Start %d rpm at VLT=%d"
+msgstr "Avvio minimo %d rpm a VLT=%d"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:352
+#, python-format
+msgid "Min Fan Stop %d rpm at VLT=%d (%s)"
+msgstr "Stop minimo %d rpm a VLT=%d (%s)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:357
+#, python-format
+msgid "Max Fan %d rpm at VLT=255 (%s)"
+msgstr "Vel max %d rpm a VLT=255 (%s)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:429
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:431
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:435
+#, python-format
+msgid "%s %02d C"
+msgstr "%s %02d C"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:437
+msgid "press Info for HDD-Temp"
+msgstr "Info -> Temp. HDD"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:438
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:679
+#, python-format
+msgid "Current rpm %4d"
+msgstr "RPM attuali: %4d"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:468
+msgid "Action in case of Fan failure"
+msgstr "In caso di avaria della ventola:"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:469
+msgid "Box shutdown at Temperature (C)"
+msgstr "Spegnimento box a temperatura di (C)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:470
+msgid "increases overheating protection to (C)"
+msgstr "Aumentare la protezione da surriscaldamento di (C)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:471
+msgid "read HDD-Temperature in HDD-Standby-Mode"
+msgstr "Rilevare la temperatura del disco anche in standby"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:472
+msgid "disable DMM-FanControl"
+msgstr "Disabilitare DMM-FanControl"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:473
+msgid "Show Monitor in Extension-Menu"
+msgstr "Mostrare Monitor nel menu estensioni"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:474
+msgid "Number of WebIF-Log-Entries"
+msgstr "Numero di voci nel log"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:475
+msgid "Logging path"
+msgstr "Percorso log"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:476
+msgid "Enable Data Logging"
+msgstr "Abilitare log dati"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:477
+msgid "Auto-Delete Data older than (Days)"
+msgstr "Rimuovere autom. dati se più vecchi di (giorni)"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:478
+msgid "Enable Event Logging"
+msgstr "Abilitare log eventi"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:493
+msgid "Choose path"
+msgstr "Scegliere il percorso"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:525
+msgid ""
+"GUI needs a restart to apply the changes.\n"
+"Do you want to Restart the GUI now?"
+msgstr ""
+"L'attivazione delle modifiche richiede\n"
+"il riavvio di enigma2. Riavviare ora?"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:526
+msgid "Restart GUI now?"
+msgstr "Riavviare la GUI?"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:592
+msgid "Fan type"
+msgstr "Tipo ventola"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:593
+msgid "Fan off in Standby"
+msgstr "Ventola off in standby"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:594
+msgid "min Speed rpm"
+msgstr "Velocità min rpm"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:595
+msgid "max Speed rpm"
+msgstr "Velocità max rpm"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:596
+msgid "Static temp C"
+msgstr "Temperatura \"di riposo\" C"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:597
+msgid "End temperature C"
+msgstr "Temperatura massima C"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:598
+msgid "Initial Voltage"
+msgstr "Voltaggio iniziale"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:599
+msgid "Initial PWM"
+msgstr "PWM iniziale"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:604
+msgid "Cancel"
+msgstr "Annull."
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:605
+msgid "Save"
+msgstr "Salvare"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:606
+msgid "Check"
+msgstr "Verif."
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:607
+msgid "Help"
+msgstr "Aiuto"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:644
+#, python-format
+msgid "Current value: %s"
+msgstr "Valore attuale: %s"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:677
+#, python-format
+msgid "Temperature C %4.1f"
+msgstr "Temperatura C %4.1f"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:678
+#, python-format
+msgid "Target rpm %4d"
+msgstr "Obiettivo rpm: %4d"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:680
+#, python-format
+msgid "Voltage %03d"
+msgstr "Voltaggio %03d"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:681
+#, python-format
+msgid "PWM %03d"
+msgstr "PWM %03d"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:706
+msgid "Information"
+msgstr "Informazioni"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:706
+msgid "readme.txt"
+msgstr "readmeit.txt"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:833
+msgid "FanControl2 emergency, Box Shutdown now?"
+msgstr "FanControl2 in emergenza: spegnere il box?"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:974
+#, python-format
+msgid "currentRPM:%d targetRPM:%d Temp:%4.1f"
+msgstr "RPM attuale:%d obiettivo RPM:%d Temp:%4.1f"
+
+#: /home/dario/Plugins/Extensions/FanControl/plugin.py:981
+msgid "Fan is not working!"
+msgstr "La ventola non funziona!"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:56
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:57
+msgid "Speed"
+msgstr "Velocità"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:58
+msgid "Voltage"
+msgstr "Voltaggio"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:65
+msgid "Sensors"
+msgstr "Sensori"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:146
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:182
+msgid "active"
+msgstr "Attivo"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:149
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:185
+msgid "turn off"
+msgstr "Disattivare"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:152
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:188
+msgid "not active"
+msgstr "Non attivo"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:155
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:191
+msgid "turn on"
+msgstr "Attivare"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:160
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:162
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:196
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:198
+#, python-format
+msgid "Filesize : %d %sByte"
+msgstr "Dim. file: %d %s Byte"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:164
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:200
+#, python-format
+msgid "Disk free : %d MByte"
+msgstr "Spazio libero su disco: %d MByte"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:167
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:203
+msgid "Download"
+msgstr "Download"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:171
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:207
+msgid "Delete"
+msgstr "Rimuovere"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:175
+msgid "Delete older 48h"
+msgstr "Rimuovere se più vecchi di 48h"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:178
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:215
+#, python-format
+msgid "File %s does not exists"
+msgstr "Il file %s non esiste"
+
+#: /home/dario/Plugins/Extensions/FanControl/FC2webSite.py:217
+#, python-format
+msgid "Logging-Path: %s"
+msgstr "Percorso log: %s"
+
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: FanControl2\n"
+"POT-Creation-Date: 2010-10-02 17:47+Westeuropäische Sommerzeit\n"
+"PO-Revision-Date: 2010-10-02 23:56+0100\n"
+"Last-Translator: joergm6 <joergm6@online.de>\n"
+"Language-Team: Bschaar <Bschaar@IHAD>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: pygettext.py 1.5\n"
+"X-Poedit-Language: Dutch\n"
+"X-Poedit-Country: BELGIUM\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: FC2.txt:88
+msgid "."
+msgstr ","
+
+#: FC2.txt:157
+msgid "below Tunerslot 4"
+msgstr "onder Tunerslot 4"
+
+#: FC2.txt:158
+msgid "near XILINX Spartan"
+msgstr "bij XILINX Spartan"
+
+#: FC2.txt:159
+msgid "under the WLAN"
+msgstr "onder de WLAN"
+
+#: FC2.txt:160
+msgid "left of the Battery"
+msgstr "links van de batterij"
+
+#: FC2.txt:161
+msgid "left near Front-CI"
+msgstr "links bij Front-CI"
+
+#: FC2.txt:162
+msgid "left near Card-Slot"
+msgstr "links bij Card-Slot"
+
+#: FC2.txt:163
+msgid "over Security Card"
+msgstr "boven de Security Card"
+
+#: FC2.txt:164
+msgid "under the Fan"
+msgstr "onder de Fanpositie"
+
+#: FC2.txt:169
+msgid "3Pin"
+msgstr "3Pin"
+
+#: FC2.txt:169
+msgid "4Pin"
+msgstr "4Pin"
+
+#: FC2.txt:169
+msgid "Control disabled"
+msgstr "Controle uitgeschakeld"
+
+#: FC2.txt:169
+msgid "disabled"
+msgstr "uitgeschakeld"
+
+#: FC2.txt:170
+msgid "yes, Except for Recording or HDD"
+msgstr "ja, behalve voor Opname of HDD"
+
+#: FC2.txt:170
+#: FC2.txt:183
+#: FC2.txt:186
+msgid "no"
+msgstr "nee"
+
+#: FC2.txt:170
+#: FC2.txt:186
+msgid "yes"
+msgstr "ja"
+
+#: FC2.txt:177
+msgid "Box Shutdown"
+msgstr "Box uitschakelen"
+
+#: FC2.txt:177
+msgid "display Info"
+msgstr "Melding weergeven"
+
+#: FC2.txt:177
+msgid "do nothing"
+msgstr "geen actie"
+
+#: FC2.txt:186
+msgid "auto"
+msgstr "auto"
+
+#: FC2.txt:186
+msgid "never"
+msgstr "nooit"
+
+#: FC2.txt:269
+msgid "please wait (until 3min)..."
+msgstr "wachten aub (tot 3 min)..."
+
+#: FC2.txt:307
+msgid "Min Fan Start %d rpm at PWM=%d"
+msgstr "Min Fan Start %d rpm bij PWM=%d"
+
+#: FC2.txt:313
+msgid "Min Fan Stop %d rpm at PWM=%d (%s)"
+msgstr "Min Fan Stop %d rpm bij PWM=%d (%s)"
+
+#: FC2.txt:319
+msgid "Max Fan %d rpm at PWM=255 (%s)"
+msgstr "Max Fan %d rpm bij PWM=255 (%s)"
+
+#: FC2.txt:321
+msgid "Extended Control Range"
+msgstr "Uitgebreid controlebereik"
+
+#: FC2.txt:331
+msgid "Min Fan Start %d rpm at VLT=%d and PWM=0"
+msgstr "Min Fan Start %d rpm bij VLT=%d en PWM=0"
+
+#: FC2.txt:334
+msgid "Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)"
+msgstr "Min Fan Stop %d rpm bij VLT=%d en PWM=0 (%s)"
+
+#: FC2.txt:341
+msgid "Max Fan %d rpm at PWM=255 and VLT=255 (%s)"
+msgstr "Max Fan %d rpm bij PWM=255 en VLT=255 (%s)"
+
+#: FC2.txt:349
+msgid "Min Fan Start %d rpm at VLT=%d"
+msgstr "Min Fan Start %d rpm bij VLT=%d"
+
+#: FC2.txt:352
+msgid "Min Fan Stop %d rpm at VLT=%d (%s)"
+msgstr "Min Fan Stop %d rpm bij VLT=%d (%s)"
+
+#: FC2.txt:357
+msgid "Max Fan %d rpm at VLT=255 (%s)"
+msgstr "Max Fan %d rpm bij VLT=255 (%s)"
+
+#: FC2.txt:429
+#: FC2.txt:431
+#: FC2.txt:434
+msgid "%s %02d C"
+msgstr "%s %02d C"
+
+#: FC2.txt:436
+msgid "press Info for HDD-Temp"
+msgstr "druk Info voor de HDD-Temp"
+
+#: FC2.txt:437
+#: FC2.txt:678
+msgid "Current rpm %4d"
+msgstr "Actuele rpm %4d"
+
+#: FC2.txt:467
+msgid "Action in case of Fan failure"
+msgstr "Actie bij uitval Fan "
+
+#: FC2.txt:468
+msgid "Box shutdown at Temperature (C)"
+msgstr "Box uitschakelen bij Temperatuur (C)"
+
+#: FC2.txt:469
+msgid "increases overheating protection to (C)"
+msgstr "Verhoog oververhittingsbescherming met (C)"
+
+#: FC2.txt:470
+msgid "read HDD-Temperature in HDD-Standby-Mode"
+msgstr "HDD-temp tijdens HDD-Standby-Mode uitlezen"
+
+#: FC2.txt:471
+msgid "disable DMM-FanControl"
+msgstr "DMM-FanControl uitschakelen"
+
+#: FC2.txt:472
+msgid "Number of WebIF-Log-Entries"
+msgstr "Aantal WebIF-Log-Entries"
+
+#: FC2.txt:473
+msgid "Logging path"
+msgstr "Loggingpad:"
+
+#: FC2.txt:474
+msgid "Auto-Delete Data older than (Days)"
+msgstr "Automatisch data verwijderen ouder dan (dagen) "
+
+#: FC2.txt:475
+msgid "Enable Data Logging"
+msgstr "Datalogging inschakelen"
+
+#: FC2.txt:476
+msgid "Enable Event Logging"
+msgstr "Eventlogging inschakelen"
+
+#: FC2.txt:477
+msgid "Show Monitor in Extension-Menu"
+msgstr "Monitor weergeven in extentie-menu"
+
+#: FC2.txt:492
+msgid "Choose path"
+msgstr "Kies het pad"
+
+#: FC2.txt:524
+msgid ""
+"GUI needs a restart to apply the changes.\n"
+"Do you want to Restart the GUI now?"
+msgstr ""
+"GUI moet herstart worden om de instellingen toe te passen\n"
+"De GUI herstarten?"
+
+#: FC2.txt:525
+msgid "Restart GUI now?"
+msgstr "GUI nu herstarten?"
+
+#: FC2.txt:591
+msgid "Fan type"
+msgstr "Fan type"
+
+#: FC2.txt:592
+msgid "Fan off in Standby"
+msgstr "Fan uit in Standby"
+
+#: FC2.txt:593
+msgid "min Speed rpm"
+msgstr "min snelheid rpm"
+
+#: FC2.txt:594
+msgid "max Speed rpm"
+msgstr "max snelheid rpm"
+
+#: FC2.txt:595
+msgid "Static temp C"
+msgstr "Statische temp C"
+
+#: FC2.txt:596
+msgid "End temperature C"
+msgstr "Eindtemperatuur C"
+
+#: FC2.txt:597
+msgid "Initial Voltage"
+msgstr "Initiële spanning"
+
+#: FC2.txt:598
+msgid "Initial PWM"
+msgstr "Initiële PWM"
+
+#: FC2.txt:603
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: FC2.txt:604
+msgid "Save"
+msgstr "Opslaan"
+
+#: FC2.txt:605
+msgid "Check"
+msgstr "Controle"
+
+#: FC2.txt:606
+msgid "Help"
+msgstr "Help"
+
+#: FC2.txt:643
+msgid "Current value: %s"
+msgstr "Huidige waarde: %s"
+
+#: FC2.txt:676
+msgid "Temperature C %4.1f"
+msgstr "Temperatuur C %4.1f"
+
+#: FC2.txt:677
+msgid "Target rpm %4d"
+msgstr "Gewenste rpm %4d"
+
+#: FC2.txt:679
+msgid "Voltage %03d"
+msgstr "Spanning %03d"
+
+#: FC2.txt:680
+msgid "PWM %03d"
+msgstr "PWM %03d"
+
+#: FC2.txt:705
+msgid "Information"
+msgstr "Informatie"
+
+#: FC2.txt:705
+msgid "readme.txt"
+msgstr "leesmij.txt"
+
+#: FC2.txt:819
+msgid "FanControl2 emergency, Box Shutdown now?"
+msgstr ""
+"FanControl2 melding: te hoge temperatuur\n"
+"Box nu uitschakelen?"
+
+#: FC2.txt:962
+msgid "currentRPM:%d targetRPM:%d Temp:%4.1f"
+msgstr "actueelRPM:%d doelRPM:%d Temp:%4.1f"
+
+#: FC2.txt:969
+msgid "Fan is not working!"
+msgstr "Fan werkt niet!"
+
+#: FC2.txt:1085
+msgid "Temperature"
+msgstr "Temperatuur"
+
+#: FC2.txt:1086
+msgid "Speed"
+msgstr "Snelheid"
+
+#: FC2.txt:1087
+msgid "Voltage"
+msgstr "Spanning"
+
+#: FC2.txt:1094
+msgid "Sensors"
+msgstr "Sensoren"
+
+#: FC2.txt:1172
+#: FC2.txt:1209
+msgid "active"
+msgstr "Actief"
+
+#: FC2.txt:1175
+#: FC2.txt:1212
+msgid "turn off"
+msgstr "Uitschakelen"
+
+#: FC2.txt:1178
+#: FC2.txt:1215
+msgid "not active"
+msgstr "Niet Actief"
+
+#: FC2.txt:1181
+#: FC2.txt:1218
+msgid "turn on"
+msgstr "Inschakelen"
+
+#: FC2.txt:1186
+#: FC2.txt:1188
+#: FC2.txt:1223
+#: FC2.txt:1225
+msgid "Filesize : %d %sByte"
+msgstr "Bestandsgrootte : %d %sByte"
+
+#: FC2.txt:1190
+#: FC2.txt:1227
+msgid "Disk free : %d MByte"
+msgstr "Beschikbare opslag : %d MByte"
+
+#: FC2.txt:1193
+#: FC2.txt:1230
+msgid "Download"
+msgstr "Download"
+
+#: FC2.txt:1197
+#: FC2.txt:1234
+msgid "Delete"
+msgstr "Verwijder"
+
+#: FC2.txt:1201
+msgid "Delete older 48h"
+msgstr "+48u verwijderen"
+
+#: FC2.txt:1205
+#: FC2.txt:1242
+msgid "File %s does not exists"
+msgstr "Bestand %s bestaat niet!"
+
+#: FC2.txt:1244
+msgid "Logging-Path: %s"
+msgstr "Loggingpad: %s"
+
+#~ msgid "OK"
+#~ msgstr "OK"
--- /dev/null
+# -*- coding: utf-8 -*-
+from twisted.web import resource, http
+from plugin import *
+from Sensors import sensors
+from __init__ import _
+from Components.config import configfile, config
+
+import os
+import datetime
+
+HeadLine = "Time;Temp;RPM;VLT;PWM;HDD;Status;Temp1;Temp2;Temp3;Temp4;Temp5;Temp6;Temp7;Temp8\r\n"
+
+########################################################
+class FC2web(resource.Resource):
+
+ title = "FanControl2 Webinterface"
+ isLeaf = False
+
+ def render(self, req):
+ req.setHeader('Content-type', 'text/html')
+ req.setHeader('charset', 'UTF-8')
+
+ """ rendering server response """
+ command = req.args.get("cmd",None)
+
+ html = "<html>"
+ html += "<head>\n"
+ html += "<meta http-equiv=\"Content-Language\" content=\"de\">\n"
+ html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\">\n"
+ html += "<meta http-equiv=\"cache-control\" content=\"no-cache\" />\n"
+ html += "<meta http-equiv=\"pragma\" content=\"no-cache\" />\n"
+ html += "<meta http-equiv=\"expires\" content=\"0\">\n"
+ html += "<meta http-equiv=\"refresh\" content=\"20\">\n"
+ html += "<title>Fan Control 2 - Info</title>\n"
+ html += "</head>"
+ html += "<body bgcolor=\"#666666\" text=\"#FFFFFF\">\n"
+ html += "<form method=\"POST\" action=\"--WEBBOT-SELF--\">\n"
+ html += "<table border=\"1\" width=\"500\" bordercolorlight=\"#000000\" bordercolordark=\"#000000\" cellspacing=\"1\"><tr><td bgcolor=\"#000000\" width=\"200\">\n"
+ html += "<p align=\"center\"><img border=\"0\" src=\"/web-data/fc2/FC2dreambox.png\" width=\"181\" height=\"10\">\n"
+ html += "<font color=\"#FFFFFF\"><BR><b>Fan Control 2 - Info</b></font></p>\n"
+ html += "</td><td bgcolor=\"#000000\">\n"
+ html += "<p align=\"right\">"
+ html += BoxStatus()
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
+ html += "<a href=\"/fancontrol/chart\"><img border=\"0\" src=\"/web-data/fc2/FC2Chart.png\" width=\"100\" height=\"40\"></a>\n"
+ html += "<a href=\"/fancontrol/log\"><img border=\"0\" src=\"/web-data/fc2/FC2Setup.png\" width=\"100\" height=\"40\"></a></td></tr></table>\n"
+ html += "<table border=\"1\" width=\"500\" id=\"table1\">\n"
+ html += "<tr>\n"
+ html += "<td>%s: <b><font color=\"#FFCC00\">%4.1f °C</font></b></td>\n" % (_("Temperature"),FC2werte[0])
+ html += "<td>%s: <font color=\"#FFCC00\"><b>%4d rpm</b></font></td>\n" % (_("Speed"),FC2werte[1])
+ html += "<td>%s: <font color=\"#FFCC00\"><b>%03d</b></font></td>\n" % (_("Voltage"),FC2werte[2])
+ html += "<td>PWM: <font color=\"#FFCC00\"><b>%03d</b></font></td>\n" % FC2werte[3]
+ html += "</tr>\n"
+ html += "</table>\n"
+
+ html += "<table border=\"1\" width=\"500\">\n"
+ html += "<tr>\n"
+ html += "<td>%s °C</td>\n" % _("Sensors")
+ templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE)
+ tempcount = len(templist)
+ for count in range(tempcount):
+ html += "<td><font color=\"#FFCC00\">%d</font></td>" % sensors.getSensorValue(count)
+ if FC2werte[4] > 0:
+ html += "<td><font size=\"1\">HDD </font><font color=\"#FFCC00\">%d</font></td>\n" % FC2werte[4]
+ html += "</tr>\n"
+ html += "</table>\n"
+
+ html += "<table border=\"1\" width=\"500\">\n"
+ html += "<tr>\n"
+ for count in range(0,12):
+ tmp = ("<BR>-" if FC2stunde[count] == "-" else FC2stunde[count])
+ html +="<td><p align=\"center\"><font size=\"1\">%02d:00<br><font color=\"#FFCC00\">%s</font></font></td>\n" % (count,tmp)
+ html += "</tr><tr>\n"
+ for count in range(12,24):
+ tmp = ("<BR>-" if FC2stunde[count] == "-" else FC2stunde[count])
+ html +="<td><p align=\"center\"><font size=\"1\">%02d:00<br><font color=\"#FFCC00\">%s</font></font></td>\n" % (count,tmp)
+ html += "</tr></table>\n"
+
+ html += "<script type=\"text/javascript\">\n"
+ html += "function doLogWrite() {\n"
+ html += "var iFrameWin = window.myIFrameName;\n"
+ html += "iFrameWin.document.write('<html><head><title>FC2 Log Window</title></head><body bgcolor=\"#D3D3D3\">');\n"
+ html += "iFrameWin.document.write('<font size=\"-1\">');\n"
+ for L in FC2Log:
+ html += "iFrameWin.document.write('" + L + "<br>');\n"
+ html += "iFrameWin.document.write('</font>');\n"
+ html += "iFrameWin.document.write('</body></html>');\n"
+ html += "iFrameWin.document.close();\n"
+ html += "}\n"
+ html += "</script>\n"
+ html += "<iframe id=\"myIFrameId\" name=\"myIFrameName\" width=\"500\" height=\"320\" marginwidth=\"5\" vspace=\"2\" marginheight=\"5\" frameborder=\"1\" scrolling=\"auto\"></iframe>\n"
+ html += "<script>doLogWrite();\n"
+ html += "myIFrameName.document.body.scrollTop = myIFrameName.document.body.scrollHeight*100;\n"
+ html += "</script>\n"
+
+ html += "</form>\n"
+ html += "Version: %s\n" % Version
+ html += "</body>\n"
+ html += "</html>\n"
+
+ return html
+
+##########################################################
+class FC2webLog(resource.Resource):
+
+ title = "FanControl2 Webinterface"
+ isLeaf = True
+
+ def render(self, req):
+ command = req.args.get("cmd",None)
+ html = ""
+ if command is None:
+ req.setHeader('Content-type', 'text/html')
+ req.setHeader('charset', 'UTF-8')
+
+ """ rendering server response """
+
+ html = "<html>"
+ html += "<head>"
+ html += "<meta http-equiv=\"Content-Language\" content=\"de\">"
+ html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\">"
+ html += "<meta http-equiv=\"cache-control\" content=\"no-cache\" />"
+ html += "<meta http-equiv=\"pragma\" content=\"no-cache\" />"
+ html += "<meta http-equiv=\"expires\" content=\"0\">"
+ html += "<meta http-equiv=\"refresh\" content=\"30\">"
+ html += "<title>Fan Control 2 - Logging</title>"
+ html += "</head>"
+ html += "<body bgcolor=\"#666666\" text=\"#FFFFFF\">\n"
+ html += "<table border=\"1\" width=\"500\" bordercolorlight=\"#000000\" bordercolordark=\"#000000\" cellspacing=\"1\"><tr><td bgcolor=\"#000000\" width=\"200\">\n"
+ html += "<p align=\"center\"><img border=\"0\" src=\"/web-data/fc2/FC2dreambox.png\" width=\"181\" height=\"10\">\n"
+ html += "<font color=\"#FFFFFF\"><BR><b>Fan Control 2 - Logging</b></font></p>\n"
+ html += "</td><td bgcolor=\"#000000\">\n"
+ html += "<p align=\"right\">"
+ html += BoxStatus()
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
+ html += "<a href=\"/fancontrol/chart\"><img border=\"0\" src=\"/web-data/fc2/FC2Chart.png\" width=\"100\" height=\"40\"></a>\n"
+ html += "<a href=\"/fancontrol\"><img border=\"0\" src=\"/web-data/fc2/FC2Info.png\" width=\"100\" height=\"40\"></a></td></tr></table>\n"
+
+ html += "<table border=\"1\" width=\"500\">"
+ html += "<tr><td width=\"50%\" align=\"center\" valign=\"top\">Data Logging "
+ if config.plugins.FanControl.EnableDataLog.value:
+ html += "<font color=\"#00FF00\">%s</font>" % _("active")
+ html += "<form method=\"GET\">"
+ html += "<input type=\"hidden\" name=\"cmd\" value=\"dataenable\">"
+ html += "<input type=\"submit\" value=\"%s\">" % _("turn off")
+ html += "</form>"
+ else:
+ html += "<font color=\"#FF0000\">%s</font>" % _("not active")
+ html += "<form method=\"GET\">"
+ html += "<input type=\"hidden\" name=\"cmd\" value=\"dataenable\">"
+ html += "<input type=\"submit\" value=\"%s\">" % _("turn on")
+ html += "</form>"
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
+ s = os.stat(config.plugins.FanControl.LogPath.value + "FC2data.csv")
+ if int(s.st_size/1024) == 0:
+ html += "<BR>" + _("Filesize : %d %sByte") % (int(s.st_size), "")
+ else:
+ html += "<BR>" + _("Filesize : %d %sByte") % (int(s.st_size/1024), "k")
+ s = os.statvfs(config.plugins.FanControl.LogPath.value)
+ html += "<BR>" + _("Disk free : %d MByte") % (int(s.f_bsize * s.f_bavail / 1024 / 1024))
+ html += "<form method=\"GET\">"
+ html += "<input type=\"hidden\" name=\"cmd\" value=\"data\">"
+ html += "<input type=\"submit\" value=\"%s\">" % _("Download")
+ html += "</form>"
+ html += "<form method=\"GET\">"
+ html += "<input type=\"hidden\" name=\"cmd\" value=\"datadel\">"
+ html += "<input type=\"submit\" value=\"%s\">" % _("Delete")
+ html += "</form>"
+ html += "<form method=\"GET\">"
+ html += "<input type=\"hidden\" name=\"cmd\" value=\"datadel48h\">"
+ html += "<input type=\"submit\" value=\"%s\">" % _("Delete older 48h")
+ html += "</form>"
+ else:
+ html += "<BR>" + _("File %s does not exists") % "FC2data.csv"
+
+ html += "</td><td width=\"50%\" align=\"center\" valign=\"top\">Event Logging "
+ if config.plugins.FanControl.EnableEventLog.value:
+ html += "<font color=\"#00FF00\">%s</font>" % _("active")
+ html += "<form method=\"GET\">"
+ html += "<input type=\"hidden\" name=\"cmd\" value=\"eventsenable\">"
+ html += "<input type=\"submit\" value=\"%s\">" % _("turn off")
+ html += "</form>"
+ else:
+ html += "<font color=\"#FF0000\">%s</font>" % _("not active")
+ html += "<form method=\"GET\">"
+ html += "<input type=\"hidden\" name=\"cmd\" value=\"eventsenable\">"
+ html += "<input type=\"submit\" value=\"%s\">" % _("turn on")
+ html += "</form>"
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2events.txt"):
+ s = os.stat(config.plugins.FanControl.LogPath.value + "FC2events.txt")
+ if int(s.st_size/1024) == 0:
+ html += "<BR>" + _("Filesize : %d %sByte") % (int(s.st_size), "")
+ else:
+ html += "<BR>" + _("Filesize : %d %sByte") % (int(s.st_size/1024), "k")
+ s = os.statvfs(config.plugins.FanControl.LogPath.value)
+ html += "<BR>" + _("Disk free : %d MByte") % (int(s.f_bsize * s.f_bavail / 1024 / 1024))
+ html += "<form method=\"GET\">"
+ html += "<input type=\"hidden\" name=\"cmd\" value=\"events\">"
+ html += "<input type=\"submit\" value=\"%s\">" % _("Download")
+ html += "</form>"
+ html += "<form method=\"GET\">"
+ html += "<input type=\"hidden\" name=\"cmd\" value=\"eventsdel\">"
+ html += "<input type=\"submit\" value=\"%s\">" % _("Delete")
+ html += "</form>"
+# html += "<form method=\"GET\">"
+# html += "<input type=\"hidden\" name=\"cmd\" value=\"eventsdel48h\">"
+# html += "<input type=\"submit\" value=\"%s\">" % _("Delete older 48h")
+# html += "</form>"
+
+ else:
+ html += "<BR>" + _("File %s does not exists") % "FC2events.txt"
+ html += "</td></tr></table>"
+ html += _("Logging-Path: %s") % config.plugins.FanControl.LogPath.value
+ html += "</html>"
+
+ elif command[0] == "data":
+ req.setResponseCode(http.OK)
+# req.setHeader('Content-type', 'application/octet-stream')
+ req.setHeader('Content-type', 'application/vnd.ms-excel')
+ req.setHeader('Content-Disposition', 'attachment;filename=FC2data.csv')
+ req.setHeader('Content-Length', os.stat(config.plugins.FanControl.LogPath.value + "FC2data.csv").st_size)
+# req.setHeader('Content-Disposition', 'inline;filename=FC2data.csv')
+ req.setHeader('charset', 'UTF-8')
+ f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","r")
+ html = f.read()
+ f.close()
+ elif command[0] == "datadel":
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
+ os.remove(config.plugins.FanControl.LogPath.value + "FC2data.csv")
+ CreateDataHead()
+ html = LogRefresh()
+ elif command[0] == "datadel48h":
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv") and os.stat(config.plugins.FanControl.LogPath.value + "FC2data.csv").st_size > 10000:
+ f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","a")
+ s = f.tell()
+ f.close()
+ 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(2)
+ 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")
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv.tmp"):
+ os.rename(config.plugins.FanControl.LogPath.value + "FC2data.csv.tmp",config.plugins.FanControl.LogPath.value + "FC2data.csv")
+ html = LogRefresh()
+ elif command[0] == "dataenable":
+ config.plugins.FanControl.EnableDataLog.value = not config.plugins.FanControl.EnableDataLog.value
+ CreateDataHead()
+ config.plugins.FanControl.EnableDataLog.save()
+ html = LogRefresh()
+
+ elif command[0] == "events":
+ req.setResponseCode(http.OK)
+ req.setHeader('Content-type', 'application/octet-stream')
+ req.setHeader('Content-Disposition', 'attachment;filename=FC2events.txt')
+ req.setHeader('Content-Length', os.stat(config.plugins.FanControl.LogPath.value + "FC2events.txt").st_size)
+# req.setHeader('Content-Disposition', 'inline;filename=FC2events.txt')
+ req.setHeader('charset', 'UTF-8')
+ f = open(config.plugins.FanControl.LogPath.value + "FC2events.txt","r")
+ html = f.read()
+ f.close()
+ elif command[0] == "eventsdel":
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2events.txt"):
+ os.remove(config.plugins.FanControl.LogPath.value + "FC2events.txt")
+ html = LogRefresh()
+ elif command[0] == "eventsdel48h":
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2events.txt"):
+ f = open(config.plugins.FanControl.LogPath.value + "FC2events.txt","a")
+ s = f.tell()
+ f.close()
+ f = open(config.plugins.FanControl.LogPath.value + "FC2events.txt","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(2)
+ 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 + "FC2events.txt.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 + "FC2events.txt"):
+ os.remove(config.plugins.FanControl.LogPath.value + "FC2events.txt")
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2events.txt.tmp"):
+ os.rename(config.plugins.FanControl.LogPath.value + "FC2events.txt.tmp",config.plugins.FanControl.LogPath.value + "FC2events.txt")
+ html = LogRefresh()
+ elif command[0] == "eventsenable":
+ config.plugins.FanControl.EnableEventLog.value = not config.plugins.FanControl.EnableEventLog.value
+ config.plugins.FanControl.EnableEventLog.save()
+ html = LogRefresh()
+
+ return html
+
+def LogRefresh():
+ h = "<html>"
+ h += "<head>"
+ h += "<meta http-equiv=\"refresh\" content=\"1; url=/fancontrol/log\">"
+ h += "<a href=\"/fancontrol/log\">Execution completed... jump back...</a>"
+ h += "</html>"
+ h += "</head>"
+ return h
+
+def CreateDataHead():
+ if not os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv") and config.plugins.FanControl.EnableDataLog.value 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:
+ pass
+
+##########################################################
+class FC2webChart(resource.Resource):
+
+ title = "FanControl2 Webinterface"
+ isLeaf = True
+
+ def render(self, req):
+ command = req.args.get("cmd",None)
+ html = ""
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
+ req.setHeader('Content-type', 'text/html')
+ req.setHeader('charset', 'UTF-8')
+
+ """ rendering server response """
+
+ f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","a")
+ s = f.tell()
+ f.close()
+ if s < 150:
+ html = "<html><body><html>Not enough Data!</body></html>"
+ return html
+ 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(2)
+ Dfind = "%04d.%02d.%02d %s" % (DD48h.year,DD48h.month,DD48h.day,DT[1])
+ f.seek(0)
+ line = f.readline()
+ Anzahl = 0
+ for line in f.readlines():
+ DT = line.split(";")
+ if DT[0] > Dfind:
+ Anzahl += 1
+# Anzahl -= 1
+ html = "<html>"
+ html += "<head>"
+ html += "<meta http-equiv=\"Content-Language\" content=\"de\">"
+ html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\">"
+ html += "<meta http-equiv=\"cache-control\" content=\"no-cache\" />"
+ html += "<meta http-equiv=\"pragma\" content=\"no-cache\" />"
+ html += "<meta http-equiv=\"expires\" content=\"0\">"
+ html += "<title>Fan Control 2 - Chart</title>"
+ html += "</head>"
+ html += "<body bgcolor=\"#666666\" text=\"#FFFFFF\">\n"
+ html += "<table border=\"1\" width=\"900\" bordercolorlight=\"#000000\" bordercolordark=\"#000000\" cellspacing=\"1\"><tr><td bgcolor=\"#000000\" width=\"200\">\n"
+ html += "<p align=\"center\"><img border=\"0\" src=\"/web-data/fc2/FC2dreambox.png\" width=\"181\" height=\"10\">\n"
+ html += "<font color=\"#FFFFFF\"><BR><b>Fan Control 2 - Chart</b></font></p>\n"
+ html += "</td><td bgcolor=\"#000000\">\n"
+ html += "<p align=\"right\">"
+ html += BoxStatus()
+ if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
+ html += "<a href=\"/fancontrol\"><img border=\"0\" src=\"/web-data/fc2/FC2Info.png\" width=\"100\" height=\"40\"></a>\n"
+ html += "<a href=\"/fancontrol/log\"><img border=\"0\" src=\"/web-data/fc2/FC2Setup.png\" width=\"100\" height=\"40\"></a></td></tr></table>\n"
+
+ html += "<applet code=\"diagram.class\" codebase=\"/web-data/fc2/\" name=\"DiaTemp\" "
+ html += "align=\"baseline\" width=\"900\" height=\"250\" mayscript>\n"
+ html += "<param name=\"title\" value=\"Temp (48h - %s)\">\n" % DT[0]
+ html += "<param name=\"bgcolor\" value=\"240; 240; 240\">\n"
+ html += "<param name=\"ytitle\" value=\"Temp\">\n"
+ html += "<param name=\"rolling\" value=\"%d\">\n" % Anzahl
+ html += "<param name=\"show_xscale\" value=\"atText\">\n"
+ html += "<param name=\"show_ygrid\" value=\"true\">\n"
+ html += "<param name=\"show_xgrid\" value=\"true\">\n"
+
+ html += "<param name=\"y0\" value=\"\">\n"
+ html += "<param name=\"color0\" value=\"240; 0; 0\">\n"
+ html += "<param name=\"style0\" value=\"LINE\">\n"
+ html += "<param name=\"ylabel0\" value=\"Temp\">\n"
+
+ html += "<param name=\"y1\" value=\"\">\n"
+ html += "<param name=\"color1\" value=\"240; 0; 240\">\n"
+ html += "<param name=\"style1\" value=\"LINE\">\n"
+ html += "<param name=\"ylabel1\" value=\"HDD\">\n"
+
+ html += "<param name=\"y2\" value=\"\">\n"
+ html += "<param name=\"color2\" value=\"0; 255; 0\">\n"
+ html += "<param name=\"style2\" value=\"LINE\">\n"
+ html += "<param name=\"ylabel2\" value=\"BoxOn\">\n"
+
+ html += "<param name=\"y3\" value=\"\">\n"
+ html += "<param name=\"color3\" value=\"72; 118; 255\">\n"
+ html += "<param name=\"style3\" value=\"LINE\">\n"
+ html += "<param name=\"ylabel3\" value=\"HDDon\">\n"
+
+ html += "<param name=\"y4\" value=\"\">\n"
+ html += "<param name=\"color4\" value=\"255; 165; 0\">\n"
+ html += "<param name=\"style4\" value=\"LINE\">\n"
+ html += "<param name=\"ylabel4\" value=\"Record\">\n"
+
+ html += "</applet>\n"
+
+# html += "<div style=\"position: absolute; width: 100px; height: 100px; z-index: 1; left: 910px; top: 146px\" id=\"Ebene1\">\n"
+# html += "<img border=\"0\" src=\"/web-data/fc2/FC2Status.png\" width=\"115\" height=\"168\"></div>\n"
+
+ html += "<applet code=\"diagram.class\" codebase=\"/web-data/fc2/\" name=\"DiaRPM\" "
+ html += "align=\"baseline\" width=\"900\" height=\"250\" mayscript>\n"
+ html += "<param name=\"title\" value=\"RPM (48h - %s)\">\n" % DT[0]
+ html += "<param name=\"bgcolor\" value=\"240; 240; 240\">\n"
+ html += "<param name=\"ytitle\" value=\"RPM\">\n"
+ html += "<param name=\"rolling\" value=\"%d\">\n" % Anzahl
+ html += "<param name=\"show_xscale\" value=\"atText\">\n"
+ html += "<param name=\"show_ygrid\" value=\"true\">\n"
+ html += "<param name=\"show_xgrid\" value=\"true\">\n"
+
+ html += "<param name=\"y0\" value=\"\">\n"
+ html += "<param name=\"color0\" value=\"240; 0; 0\">\n"
+ html += "<param name=\"style0\" value=\"LINE\">\n"
+ html += "<param name=\"ylabel0\" value=\"RPM\">\n"
+
+ html += "</applet>\n"
+
+ f.seek(0)
+ line = f.readline()
+ html += "<script language=javascript>\n"
+ html += "dT = document.DiaTemp\n"
+ html += "dR = document.DiaRPM\n"
+ t = 0
+ Xtime = int((Anzahl/20))
+ if Anzahl < 1000:
+ Xtime += 1
+ for line in f.readlines():
+ DT = line.split(";")
+ if DT[0] > Dfind:
+ if Xtime > 0:
+ tmp = ("\"" + DT[0].split(" ")[1] + "\"") if t % Xtime == 0 else "null"
+ else:
+ tmp = "null"
+ t += 1
+ if len(DT[6])>1:
+ DT[6]="0"
+ B = 0
+ H = 0
+ R = 0
+ S = int(DT[6])
+ if (S & 1)>0 :
+ B = 4
+ if (S & 2)>0 :
+ H = 8
+ if (S & 4)>0 :
+ R = 12
+ html += "dT.AddPoint(\"%s; %s; %d; %d; %d\", %s, null);\n" % (DT[1].replace(",","."),DT[5],B,H,R,tmp)
+ html += "dR.AddPoint(\"%s\", %s, null);\n" % (DT[2],tmp)
+ f.close()
+ html += "dT.repaint();\ndR.repaint();\n"
+ html += "</script>"
+ else:
+ html = "<html>no Data!"
+ html += "</body>"
+ html += "</html>"
+
+ return html
+
+def BoxStatus():
+ h = ""
+ S = int(FC2werte[5])
+ if (S & 1)>0 :
+ h += "<img border=\"0\" src=\"/web-data/fc2/FC2on.png\" width=\"20\" height=\"20\" title=\"Box On\" align=\"left\" hspace=\"2\" vspace=\"5\">\n"
+ if (S & 2)>0 :
+ h += "<img border=\"0\" src=\"/web-data/fc2/FC2hdd.png\" width=\"20\" height=\"20\" title=\"HDD On\" align=\"left\" hspace=\"2\" vspace=\"5\">\n"
+ if (S & 4)>0 :
+ h += "<img border=\"0\" src=\"/web-data/fc2/FC2record.png\" width=\"20\" height=\"20\" title=\"Recording\" align=\"left\" hspace=\"2\" vspace=\"5\">\n"
+ return h
--- /dev/null
+All Files of this Software are licensed under the Creative Commons
+Attribution-NonCommercial-ShareAlike 3.0 Unported
+License if not stated otherwise in a Files Head. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative
+Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+
+Alternatively, this plugin may be distributed and executed on hardware which
+is licensed by Dream Multimedia GmbH.
+
+This plugin is NOT free software. It is open source, you are allowed to
+modify it (if you keep the license), but it may not be commercially
+distributed other than under the conditions noted above.
--- /dev/null
+installdir = /usr/lib/enigma2/python/Plugins/Extensions/FanControl
+
+SUBDIRS = webif webifdata
+
+install_PYTHON = *.py
+install_DATA = plugin.png plugin.pot *.txt maintainer.info LICENSE
--- /dev/null
+class Sensors:
+ # (type, name, unit, directory)
+ TYPE_TEMPERATURE = 0
+ # (type, name, unit, fanid)
+# TYPE_FAN_RPM = 1
+
+ def __init__(self):
+ # (type, name, unit, sensor_specific_dict/list)
+ self.sensors_list = []
+ self.addSensors()
+
+ def getSensorsCount(self, type = None):
+ if type is None:
+ return len(self.sensors_list)
+ count = 0
+ for sensor in self.sensors_list:
+ if sensor[0] == type:
+ count += 1
+ return count
+
+ # returns a list of sensorids of type "type"
+ def getSensorsList(self, type = None):
+ if type is None:
+ return range(len(self.sensors_list))
+ list = []
+ for sensorid in range(len(self.sensors_list)):
+ if self.sensors_list[sensorid][0] == type:
+ list.append(sensorid)
+ return list
+
+ def getSensorType(self, sensorid):
+ return self.sensors_list[sensorid][0]
+
+ def getSensorName(self, sensorid):
+ return self.sensors_list[sensorid][1]
+
+ def getSensorDir(self, sensorid):
+ return self.sensors_list[sensorid][3]
+
+ def getSensorValue(self, sensorid):
+ value = -1
+ sensor = self.sensors_list[sensorid]
+ if sensor[0] == self.TYPE_TEMPERATURE:
+ f = open("%s/value" % sensor[3], "r")
+ value = int(f.readline().strip())
+ f.close()
+ return value
+
+ def addSensors(self):
+ import os
+ if os.path.exists("/proc/stb/sensors"):
+ sd = []
+ sd = os.listdir("/proc/stb/sensors")
+ sd.sort()
+ for dirname in sd:
+ if dirname.find("temp", 0, 4) == 0:
+ f = open("/proc/stb/sensors/%s/name" % dirname, "r")
+ name = f.readline().strip()
+ f.close()
+
+ f = open("/proc/stb/sensors/%s/unit" % dirname, "r")
+ unit = f.readline().strip()
+ f.close()
+
+ self.sensors_list.append((self.TYPE_TEMPERATURE, name, unit, "/proc/stb/sensors/%s" % dirname))
+
+sensors = Sensors()
\ No newline at end of file
--- /dev/null
+from Components.Language import language\r
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_LANGUAGE\r
+import os,gettext\r
+\r
+PluginLanguageDomain = "FanControl2"\r
+PluginLanguagePath = "Extensions/FanControl/locale"\r
+\r
+def localeInit():\r
+ lang = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"\r
+ os.environ["LANGUAGE"] = lang # Enigma doesn't set this (or LC_ALL, LC_MESSAGES, LANG). gettext needs it!\r
+# print "[" + PluginLanguageDomain + "] set language to ", lang\r
+ gettext.bindtextdomain(PluginLanguageDomain, resolveFilename(SCOPE_PLUGINS, PluginLanguagePath))\r
+\r
+def _(txt):\r
+ t = gettext.dgettext(PluginLanguageDomain, txt)\r
+ if t == txt:\r
+ # print "[" + PluginLanguageDomain + "] fallback to default translation for ", txt\r
+ t = gettext.gettext(txt)\r
+ return t\r
+\r
+localeInit()\r
+language.addCallback(localeInit)\r
--- /dev/null
+===========================================================
+FanControl2 by joergm6 Help V.2.4
+Support forum: IHAD
+Acknowledgments: diddsen, _marv_, DreamKK
+ Spaeleus(it), mimi74(fr), Bschaar(nl)
+===========================================================
+Sorry voor eventuele vertalingsfouten.
+
+ Functies
+ --------
+Controle van een 3pin of 4pin fan (PWM) afhankelijk van het
+gemiddelde van de 2 hoogst gemeten temperaturen.
+Geleidelijke regeling, want temperaturen schommelen niet te
+snel en de CPU mag niet te veel belast worden.
+
+ Beveiligingsfuncties
+ --------------------
+Indien er gedurende 30min geen fansnelheid gemeten wordt, wordt
+een defect verondersteld. Er verschijnt dan regelmatig een
+geeigende melding op het scherm.
+Als de fan uitgeschakeld is in standby wordt de fan ingeschakeld
+bij het overschrijden van de maximale temperatuur.
+Als de temperatuur dan meer dan 3C daalt, wordt de fan terug
+uitgeschakeld. De fan draait de eerste 10 minuten met minimale
+snelheid. De standaard oververhittingsbeveiliging kan met 9C
+verhoogd worden.
+Het kan worden ingesteld bij het afsluiten van de box, bij welke
+temperatuur en ventilator uitvalt.
+
+ Instellingen
+ ------------
+ Fan uit in Standby
+ja = fan wordt uitgeschakeld als de box in standby is.
+ja, behalve bij Opname of HDD = fan wordt uitgeschakeld in standby
+als er geen opname loopt en de HDD in Idle-Mode is.
+
+ Min snelheid
+Bij een temperatuur "statische temperatuur" of lager wordt de
+snelheid op deze waarde ingesteld.
+
+ Max snelheid
+Bij een temperatuur "eindtemperatuur" wordt deze snelheid ingesteld.
+
+ Statische temperatuur
+Tot deze temperatuur wordt de min snelheid ingesteld.
+
+ Eindtemperatuur
+Dit is de maximum temperatuur die mag optreden, is deze bereikt,
+wordt de max snelheid ingesteld.
+
+ Initiele, spanning en PWM
+Als deze waarden aangepast worden, wordt de regeling onmiddellijk
+zo ingesteld. Nu kan kort de overeenkomende snelheid afgelezen worden.
+De regeling wordt weer actief,dus de waarde blijft slecht korte
+tijd zo ingesteld.
+Deze waarden worden gebruikt als de box opgestart wordt of als de
+fan uitgeschakeld was.
+
+ Voor 3pin fantype
+Voor de regeling van de spanning van een 3-pin fan met tachometersignaal.
+Enkel de spanning wordt geregeld. PWM-instellingen hebben geen invloed.
+Stelt de initiele spanning in bij het opstarten van de box.
+Vanaf deze startsnelheid neemt de regeling over.
+
+ Voor 4pin fantype
+Voor de regeling van de PWM, 4-pin fan. In eerste instantie
+wordt via PWM geregeld. Indien het bereik overschreden wordt,
+en de fan het toelaat wordt eveneens de spanning geregeld.
+De waarde voor spanning is vereist. Geef de maximale waarde
+voor de spanning in (voor DM500HD: 5).
+Maar ook een lagere spanning kan interessant zijn. Een lagere
+spanning heeft een lagere max en min snelheid tot gevolg.
+Zet de spanning zo laag mogelijk zodat het bereik voldoende
+is voor PWM. Er zijn fans die zelfs met PWM = 0 te snel draaien.
+Verlaag de spanning tot de gewenste minimale snelheidbereikt wordt.
+Hou de maximale snelheid eveneens in het oog.
+Stelt de initiele PWM in bij het opstarten van de box.
+Vanaf deze startsnelheid neemt de regeling over.
+
+ Voor fantype Controle uitgeschakeld
+De regeling is uitgeschakeld. De fan draait met de laatste
+parameters verder. De fan wordt niet uitgeschakeld!
+
+ Controleren
+ -----------
+Deze functie probeert de minimale snelheid van de fan te
+bepalen voor het opstarten van de fan, en de minimale snelheid
+voor de fan stopt.
+Gelijkaardig worden de maximale snelheden bepaald.
+(OK) d.w.z. de waarden komen overeen met de instellingen
+(!!) d.w.z. de waarden komen NIET overeen.
+Deze waarden zijn informatief en worden niet gebruikt voor de
+regeling. Voor een 4Pin worden ook de waarden voor de regeling
+buiten het bereik weergegeven.
+D.w.z. dat er buiten het bereik ook een spanningsregeling gebeurd.
+
+ Temperatuur Monitor
+ -------------------
+Met de "info knop" worden de individuele waarden van de sensoren
+weergegeven.
+
+ Extra instellingen
+ ------------------
+Met de "Menu knop" kunnen extra instellingen ingegeven worden.
+Actie bij uitval Fan [Melding weergeven]
+ Melding voor defecte fan, box uitschakelen of geen actie.
+Box uischakelen bij Temperatuur (C) [65]
+ Bij het bereiken van de ingegeven temperatuur wordt de box
+ uitgeschakeld (DeepStandby).
+Oververhittingswaarde verhogen met (C) [0]
+ Als de fan uitgeschakeld is in standby wordt die ingeschakeld
+ bij een max temperatuur. Deze maximum temperatuur kan tot
+ 9C verhoogd worden.
+HDD-temp tijdens HDD-Standby-Mode uitlezen [auto]
+ ja = HDD temperatuur uitlezen als HDD in standby is
+ nee = HDD temperatuur enkel uitlezen als HDD actief is
+ auto = bij opstarten van FC2 wordt 1 keer getest of de HDD
+ opstart, indien dit gebeurd wordt "nee" ingesteld
+ Nooit = geen uitlezing van de temperatuur
+DMM-fancontrol uitschakelen [Nee]
+ Indien in de skins de temparatuur wordt weergegeven is
+ de DMM-FanControl actief, deze regeld ook de fan.
+ Er treden ongewenste regelingen op.
+ Aanbeveling: DMM-FanControl uitschakelen
+Monitor weergeven in extentie-menu
+ Monitor in extentie-menu (lang drukken blauwe toets)
+Aantal WebIF log entries [40]
+ Aantal gebeurtenissen worden in de WebIF weergegeven.
+ Instelmogelijkheid 40-999
+Loggingpad
+ Kies met "OK" het pad voor de logbestanden.
+ Data wordt enkel geschreven indien minimum 10MByte
+ vrije ruimte beschikbaar is.
+Datalogging inschakelen
+ Elke minuut worden de gegevens geschreven in FC2data.csv.
+ Dit bestand kan rechtstreeks in Excel geopend worden.
+ Indien het bestand niet bestaat wordt dit geschreven,
+ en de titelrij wordt toegevoegd. Ongeveer 4kBytes per uur
+Automatisch data verwijderen ouder dan (dagen)
+ Gegevens in de datalogging ouder dan deze instellinge
+ worden automatisch verwijderd.
+ Uitvoering actie: dagelijks om 00:00 en bij het starten
+ van de box.
+Eventlogging inschakelen
+ Alle events worden geschreven in FC2events.txt.
+ Ongeveer 30kByte per uur
+
+ Web Interface
+ -------------
+URL: http://dreamboxip/fancontrol
+Weergave dan de actuele fan-instellingen en de laatste eventlogs.
+Elk uur worden de temperatuur en snelheid weergegeven.
+Met "FC2 Log" kunnen de logbestanden gedownload worden, en de
+instellingen aangepast worden.
+"FC2 Chart" geeft een online-grafiek van de laatste 48 uur.
+Hiervoor moet de datalogging ingeschakeld zijn.
+Opmerking: bij gebruik van Firefox kan het voorkomen dat
+de grafiek niet correct weergegeven wordt. In dit geval is
+een herladen (F5) van de pagina noodzakelijk.
+
+ Overige
+ -------
+Alle voor de fan belangrijke waarden worden als getal en
+staafdiagram weergegeven. Het staafdiagram is gebaseerd
+op de ingestelde parameters.
+
+FanControl2 is voorbereid voor verschillende talen.
+POT-bestand is in ipkg voor andere vertalingen.
+
+De instellingen worden met de E2-instellingen bewaard,
+en maken dus deel uit van de backup / restore functie.
+
+
+===========================================================
+
--- /dev/null
+joergm6@online.de
+FanControl2
--- /dev/null
+# SOME DESCRIPTIVE TITLE.\r
+# Copyright (C) YEAR ORGANIZATION\r
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\r
+#\r
+msgid ""\r
+msgstr ""\r
+"Project-Id-Version: PACKAGE VERSION\n"\r
+"POT-Creation-Date: 2010-10-02 17:47+Westeuropäische Sommerzeit\n"\r
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"\r
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"\r
+"Language-Team: LANGUAGE <LL@li.org>\n"\r
+"MIME-Version: 1.0\n"\r
+"Content-Type: text/plain; charset=CHARSET\n"\r
+"Content-Transfer-Encoding: ENCODING\n"\r
+"Generated-By: pygettext.py 1.5\n"\r
+\r
+\r
+#: FC2.txt:88\r
+msgid "."\r
+msgstr ""\r
+\r
+#: FC2.txt:157\r
+msgid "below Tunerslot 4"\r
+msgstr ""\r
+\r
+#: FC2.txt:158\r
+msgid "near XILINX Spartan"\r
+msgstr ""\r
+\r
+#: FC2.txt:159\r
+msgid "under the WLAN"\r
+msgstr ""\r
+\r
+#: FC2.txt:160\r
+msgid "left of the Battery"\r
+msgstr ""\r
+\r
+#: FC2.txt:161\r
+msgid "left near Front-CI"\r
+msgstr ""\r
+\r
+#: FC2.txt:162\r
+msgid "left near Card-Slot"\r
+msgstr ""\r
+\r
+#: FC2.txt:163\r
+msgid "over Security Card"\r
+msgstr ""\r
+\r
+#: FC2.txt:164\r
+msgid "under the Fan"\r
+msgstr ""\r
+\r
+#: FC2.txt:169\r
+msgid "3Pin"\r
+msgstr ""\r
+\r
+#: FC2.txt:169\r
+msgid "4Pin"\r
+msgstr ""\r
+\r
+#: FC2.txt:169\r
+msgid "Control disabled"\r
+msgstr ""\r
+\r
+#: FC2.txt:169\r
+msgid "disabled"\r
+msgstr ""\r
+\r
+#: FC2.txt:170\r
+msgid "yes, Except for Recording or HDD"\r
+msgstr ""\r
+\r
+#: FC2.txt:170 FC2.txt:183 FC2.txt:186\r
+msgid "no"\r
+msgstr ""\r
+\r
+#: FC2.txt:170 FC2.txt:186\r
+msgid "yes"\r
+msgstr ""\r
+\r
+#: FC2.txt:177\r
+msgid "Box Shutdown"\r
+msgstr ""\r
+\r
+#: FC2.txt:177\r
+msgid "display Info"\r
+msgstr ""\r
+\r
+#: FC2.txt:177\r
+msgid "do nothing"\r
+msgstr ""\r
+\r
+#: FC2.txt:186\r
+msgid "auto"\r
+msgstr ""\r
+\r
+#: FC2.txt:186\r
+msgid "never"\r
+msgstr ""\r
+\r
+#: FC2.txt:269\r
+msgid "please wait (until 3min)..."\r
+msgstr ""\r
+\r
+#: FC2.txt:307\r
+msgid "Min Fan Start %d rpm at PWM=%d"\r
+msgstr ""\r
+\r
+#: FC2.txt:313\r
+msgid "Min Fan Stop %d rpm at PWM=%d (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:319\r
+msgid "Max Fan %d rpm at PWM=255 (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:321\r
+msgid "Extended Control Range"\r
+msgstr ""\r
+\r
+#: FC2.txt:331\r
+msgid "Min Fan Start %d rpm at VLT=%d and PWM=0"\r
+msgstr ""\r
+\r
+#: FC2.txt:334\r
+msgid "Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:341\r
+msgid "Max Fan %d rpm at PWM=255 and VLT=255 (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:349\r
+msgid "Min Fan Start %d rpm at VLT=%d"\r
+msgstr ""\r
+\r
+#: FC2.txt:352\r
+msgid "Min Fan Stop %d rpm at VLT=%d (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:357\r
+msgid "Max Fan %d rpm at VLT=255 (%s)"\r
+msgstr ""\r
+\r
+#: FC2.txt:429 FC2.txt:431 FC2.txt:434\r
+msgid "%s %02d C"\r
+msgstr ""\r
+\r
+#: FC2.txt:436\r
+msgid "press Info for HDD-Temp"\r
+msgstr ""\r
+\r
+#: FC2.txt:437 FC2.txt:678\r
+msgid "Current rpm %4d"\r
+msgstr ""\r
+\r
+#: FC2.txt:467\r
+msgid "Action in case of Fan failure"\r
+msgstr ""\r
+\r
+#: FC2.txt:468\r
+msgid "Box shutdown at Temperature (C)"\r
+msgstr ""\r
+\r
+#: FC2.txt:469\r
+msgid "increases overheating protection to (C)"\r
+msgstr ""\r
+\r
+#: FC2.txt:470\r
+msgid "read HDD-Temperature in HDD-Standby-Mode"\r
+msgstr ""\r
+\r
+#: FC2.txt:471\r
+msgid "disable DMM-FanControl"\r
+msgstr ""\r
+\r
+#: FC2.txt:472\r
+msgid "Number of WebIF-Log-Entries"\r
+msgstr ""\r
+\r
+#: FC2.txt:473\r
+msgid "Logging path"\r
+msgstr ""\r
+\r
+#: FC2.txt:474\r
+msgid "Auto-Delete Data older than (Days)"\r
+msgstr ""\r
+\r
+#: FC2.txt:475\r
+msgid "Enable Data Logging"\r
+msgstr ""\r
+\r
+#: FC2.txt:476\r
+msgid "Enable Event Logging"\r
+msgstr ""\r
+\r
+#: FC2.txt:477\r
+msgid "Show Monitor in Extension-Menu"\r
+msgstr ""\r
+\r
+#: FC2.txt:492\r
+msgid "Choose path"\r
+msgstr ""\r
+\r
+#: FC2.txt:524\r
+msgid ""\r
+"GUI needs a restart to apply the changes.\n"\r
+"Do you want to Restart the GUI now?"\r
+msgstr ""\r
+\r
+#: FC2.txt:525\r
+msgid "Restart GUI now?"\r
+msgstr ""\r
+\r
+#: FC2.txt:591\r
+msgid "Fan type"\r
+msgstr ""\r
+\r
+#: FC2.txt:592\r
+msgid "Fan off in Standby"\r
+msgstr ""\r
+\r
+#: FC2.txt:593\r
+msgid "min Speed rpm"\r
+msgstr ""\r
+\r
+#: FC2.txt:594\r
+msgid "max Speed rpm"\r
+msgstr ""\r
+\r
+#: FC2.txt:595\r
+msgid "Static temp C"\r
+msgstr ""\r
+\r
+#: FC2.txt:596\r
+msgid "End temperature C"\r
+msgstr ""\r
+\r
+#: FC2.txt:597\r
+msgid "Initial Voltage"\r
+msgstr ""\r
+\r
+#: FC2.txt:598\r
+msgid "Initial PWM"\r
+msgstr ""\r
+\r
+#: FC2.txt:603\r
+msgid "Cancel"\r
+msgstr ""\r
+\r
+#: FC2.txt:604\r
+msgid "Save"\r
+msgstr ""\r
+\r
+#: FC2.txt:605\r
+msgid "Check"\r
+msgstr ""\r
+\r
+#: FC2.txt:606\r
+msgid "Help"\r
+msgstr ""\r
+\r
+#: FC2.txt:643\r
+msgid "Current value: %s"\r
+msgstr ""\r
+\r
+#: FC2.txt:676\r
+msgid "Temperature C %4.1f"\r
+msgstr ""\r
+\r
+#: FC2.txt:677\r
+msgid "Target rpm %4d"\r
+msgstr ""\r
+\r
+#: FC2.txt:679\r
+msgid "Voltage %03d"\r
+msgstr ""\r
+\r
+#: FC2.txt:680\r
+msgid "PWM %03d"\r
+msgstr ""\r
+\r
+#: FC2.txt:705\r
+msgid "Information"\r
+msgstr ""\r
+\r
+#: FC2.txt:705\r
+msgid "readme.txt"\r
+msgstr ""\r
+\r
+#: FC2.txt:819\r
+msgid "FanControl2 emergency, Box Shutdown now?"\r
+msgstr ""\r
+\r
+#: FC2.txt:962\r
+msgid "currentRPM:%d targetRPM:%d Temp:%4.1f"\r
+msgstr ""\r
+\r
+#: FC2.txt:969\r
+msgid "Fan is not working!"\r
+msgstr ""\r
+\r
+#: FC2.txt:1085\r
+msgid "Temperature"\r
+msgstr ""\r
+\r
+#: FC2.txt:1086\r
+msgid "Speed"\r
+msgstr ""\r
+\r
+#: FC2.txt:1087\r
+msgid "Voltage"\r
+msgstr ""\r
+\r
+#: FC2.txt:1094\r
+msgid "Sensors"\r
+msgstr ""\r
+\r
+#: FC2.txt:1172 FC2.txt:1209\r
+msgid "active"\r
+msgstr ""\r
+\r
+#: FC2.txt:1175 FC2.txt:1212\r
+msgid "turn off"\r
+msgstr ""\r
+\r
+#: FC2.txt:1178 FC2.txt:1215\r
+msgid "not active"\r
+msgstr ""\r
+\r
+#: FC2.txt:1181 FC2.txt:1218\r
+msgid "turn on"\r
+msgstr ""\r
+\r
+#: FC2.txt:1186 FC2.txt:1188 FC2.txt:1223 FC2.txt:1225\r
+msgid "Filesize : %d %sByte"\r
+msgstr ""\r
+\r
+#: FC2.txt:1190 FC2.txt:1227\r
+msgid "Disk free : %d MByte"\r
+msgstr ""\r
+\r
+#: FC2.txt:1193 FC2.txt:1230\r
+msgid "Download"\r
+msgstr ""\r
+\r
+#: FC2.txt:1197 FC2.txt:1234\r
+msgid "Delete"\r
+msgstr ""\r
+\r
+#: FC2.txt:1201\r
+msgid "Delete older 48h"\r
+msgstr ""\r
+\r
+#: FC2.txt:1205 FC2.txt:1242\r
+msgid "File %s does not exists"\r
+msgstr ""\r
+\r
+#: FC2.txt:1244\r
+msgid "Logging-Path: %s"\r
+msgstr ""\r
+\r
--- /dev/null
+# 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
--- /dev/null
+===========================================================
+FanControl2 by joergm6 Help V.2.4
+Support forum: IHAD
+Acknowledgments: diddsen, _marv_, DreamKK
+ Spaeleus(it), mimi74(fr), Bschaar(nl)
+===========================================================
+Apologies if the english translation is not always correct.
+
+ Function
+ --------
+Control a 3pin or 4pin fan (PWM) depends from the average
+of the 2 highest temperature values.
+Slowly regulation, because temperatures are not too
+change quickly and there should no unnecessary CPU load.
+
+ Security Features
+ -----------------
+If 20min no reports of the fan speed, it is assumed that the
+fan is defective. Regularly appears on the TV then an
+appropriate message.
+If standby mode the fan is off, the fan switched on, when the maximum
+temperature is exceed. The temperature drops by more than 3C the fan
+turns off again. The fan runs in the first 10 minutes with
+minimum speed.
+The overheat protection can be increased by up to 9C.
+It can be set when shutting down the box, at which temperature and
+fan failure.
+
+ Preferences
+ -----------
+ Fan off in Standby
+yes = Fan will be turned off if the box is in standby
+yes, Except for recording or HDD= Fan is turned off in standby
+if there is no recording and HDD is in Sleep-Mode
+
+ Min speed
+At Temperature "static-temperature" and below it is set this
+speed.
+
+ Max speed
+At Temperature "end-temperature" it is set this speed.
+
+ Static temperature
+Until this temperature is not regulated, min speed is set.
+
+ End Temperature
+This is the maximum temperature may occur, is
+this achieved, we will set the max speed.
+
+ Initially, voltage and PWM
+When changing the values the fan is immediately set with these
+values. It can now be directly read off the speed. The controlling
+is nevertheless once again active. So quick look or change the
+values.
+These values are set when the box boots up or if the fan was
+switched off in standby.
+
+ for 3pin Fan type
+For regulation of voltage 3-pin fan with tachometer signal.
+Is controlled only the voltage. Settings for PWM have no control.
+Sets the initial voltage to a value of Rotation rate,
+with the fan at the start of the Box initially intended to run.
+From this starting speed is regulated.
+
+ for 4pin Fan type
+For regulation PWM, 4-pin Fan. First is controlled the PWM value.
+If the control range is no longer sufficient, if possible, also
+regulate the voltage.
+The voltage adjustment is required. Set the voltage on the
+Maximum value (for DM500HD set 5-10). But also a lower voltage level
+is useful. A lower voltage means a lower maximum speed and a lower
+minimum speed. Set the voltage as possible so that the control
+range with PWM enough.
+There are also fans spin at PWM = 0 to be too high.
+Reduce the voltage here, until the desired min Speed (including 0 is
+possible) is achieved. Have also the max speed in mind.
+PWM provides a value that corresponds to the speed, initially run
+the fan at the start of the Box. From this speed is regulated.
+
+ for Fan type Control disabled
+The regulation is disabled. The fan runs with the last parameters
+further. The fan is not turned off!
+
+ Check
+ -----
+This attempts to determine the minimum speed of the fan
+for the startup and the minimum before the fan speed goes
+shutdown.
+Similarly, the maximum speed for these settings is
+determined. (OK) mean value matches the settings
+(!!) values do not match. These details are for information
+and do not affect the regulation, within the possible.
+4Pin to be displayed in addition information on the wider
+control range. That means it is on the PWM area also changed
+the voltage.
+
+ Temperature Monitor
+ -------------------
+With the "info key", can the individual values of the temperatures
+are shown.
+Press the Info button for single reading of HDD temperature.
+
+ Special Setup
+ -------------
+With the "Menu key" special values can be defined.
+Action in case of fan failure [show info]
+ Notification of defective fan, box shut down or do nothing.
+Box shutdown at temperature (C) [65]
+ Upon reaching the specified temperature, the box switch off
+ (DeepStandby).
+Thermal protection increase at (C) [0]
+ If the fan is off in standby the fan switched on at maximum
+ temperature. This maximum temperature can be increased by
+ up to 9C
+read HDD-Temperature in HDD-Standby-Mode [auto]
+ yes = read HDD temperature in HDD-Standby
+ no = read HDD temperature only when HDD is active
+ Auto = at the start of FC2 once tested whether the HDD
+ starts, and if so reading is disabled
+ never = Temperature is never read
+DMM fancontrol disabled [No]
+ Appears in the skins with temperature, the DMM-FanControl is active
+ and also switch the fan. It caused unwanted on/off operations.
+ Recommendation: Disable DMM-FanControl
+See Monitor in extension menu [Yes]
+ Monitor shown in the extension menu (Long-Blue-Button).
+WebIF number of log entries [40]
+ How many events should be show in WebIF.
+ 40-999
+Logging directory
+ Choose the "OK" the place to which directory the log files are written.
+ Data is written only if least 10MByte are free.
+Enable Data Logging
+ There will be written every minute a record in the file FC2data.csv.
+ This can called directly in Excel. If this file does not exist and will
+ Option enabled, a header is generated.
+ about 4kBytes each hour
+Auto-Delete Data older than (days) [No]
+ Data-logging-Data older than this definition are
+ deleted.
+ Starting: daily at 00:00 and at Enigma2 start
+Enable Event Logging
+ There will be written all Events in the file FC2events.txt.
+ about 30kByte each hour
+
+ Web Interface
+ -------------
+Call: http://dreamboxip/fancontrol
+Displays information about current fan-values and the last
+Event logs. Per hour a value for temperature and Speed is appears.
+With "FC2 Log", the log files are downloaded and the logging can be set.
+"FC2 Chart" shows online diagrams of the last 48 hours. The Data
+Logging must be enabled to do so. It must be present at least 2.5h data!
+When using Firefox, it may happen that the diagram does not
+display properly. Then, an additional Page refresh (F5) is necessary.
+
+ Miscellaneous
+ -------------
+All important for the fan current readings
+appears as a value and bar graph. The bar display
+range is based on the individually set parameters.
+FanControl2 is prepared for different languages.
+POT file is in ipkg if anyone other languages
+would make available.
+The settings are stored in the normal Enigma2 settings and
+are therefore included in the backup / restore.
+
+
+===========================================================
+
--- /dev/null
+===========================================================
+FanControl2 by joergm6 Hilfe V.2.4
+Support-Forum: IHAD
+Danksagungen: diddsen, _marv_, DreamKK
+ Spaeleus(it), mimi74(fr), Bschaar(nl)
+===========================================================
+
+ Funktion
+ --------
+Steuerung eines 3pin Lüfter oder 4pin (PWM) Lüfter abhängig
+von dem Durchschnitt der 2 höchsten Temperaturwerte.
+Geregelt wird langsam, da sich Temperaturen auch nicht
+schnell ändern und keine unnötige CPU-Belastung auftreten
+sollte.
+
+ Sicherheitsfunktionen
+ ---------------------
+Meldet der Lüfter 20min keine Drehzahl wird davon ausgegangen,
+daß der Lüfter defekt ist. Regelmäßig wird auf dem TV dann eine
+entsprechende Meldung angezeigt.
+Wird im Standby-Modus der Lüfter ausgeschaltet, erfolgt bei
+überschreiten der eingestellten Maximaltemperatur ein Einschalten
+des Lüfters. Fällt die Temperatur um mehr als 3C schaltet
+dieser wieder aus. Der Lüfter läuft in den ersten 10min mit
+minimaler Drehzahl.
+Der Überhitzungsschutz kann um bis zu 9C vergrößert werden.
+Es kann eingestellt werden ob die Box herunterfährt, bei
+welcher Temperatur und bei Lüfterausfall.
+
+ Einstellungen
+ -------------
+ Lüfter aus im Standby
+Ja = Lüfter wird ausgeschaltet wenn die Box sich im Standby
+befindet
+Ja, außer bei Aufnahme oder HDD = Lüfter wird im Standby
+ausgeschaltet wenn keine Aufnahme läuft und HDD in Sleep-Mode ist.
+
+ min Drehzahl
+Bei Temperatur "Ruhe-Temperatur" und darunter wird diese
+eingestellte Drehzahl eingeregelt.
+
+ max Drehzahl
+Bei Temperatur "Ende-Temperatur" und darüber wird diese
+eingestellte Drehzahl eingeregelt.
+
+ Ruhe Temperatur
+Bis einschließlich dieser Temperatur wird nicht geregelt
+und die min Drehzahl ist eingestellt.
+
+ Ende Temperatur
+Das ist die maximale Temperatur die auftreten darf, ist
+diese erreicht, wird die maximale Drehzahl eingestellt.
+
+ Anfangs-Spannung und -PWM
+Bei Änderungen an diesen Werten wird sofort auch der
+Lüfter darauf eingestellt. Es kann nun direkt das
+Ergebnis über die Drehzahl ermittelt werden. Die
+Regelung setzt aber trotzdem sofort wieder ein, also
+schnell schauen oder Werte laufend verändern.
+Diese Werte werden eingestellt, wenn die Box startet bzw.
+wenn der Lüfter im Standby ausgeschaltet war.
+
+ für Lüftertyp 3pin
+Für die Regelung spannungsgesteuerter 3poliger Lüfter
+mit Tachosignal. Gesteuert wird nur die Spannung.
+Einstellungen bei PWM haben keinen Einfluss.
+Stellt die Anfangsspannung auf einen Wert, der der
+Drehzahl entspricht, mit dem der Lüfter beim Start der Box
+anfänglich laufen soll. Ab dieser Drehzahl wird geregelt.
+
+ für Lüftertyp 4pin
+Für die Regelung pulsweitenmodolierter (PWM) 4poliger
+Lüfter. Gesteuert wird zuerst der PWM Wert. Reicht der
+Regelbereich nicht mehr aus, wird wenn möglich auch die
+Spannung geregelt. Die Spannungseinstellung ist notwendig.
+Stellt die Spannung auf den Maximalwert (bei DM500HD auf
+5-10). Aber auch ein geringerer Spannungswert ist sinnvoll.
+Eine geringere Spannung bedeutet eine geringere maximale
+Drehzahl sowie eine geringere minimale Drehzahl. Setzt die
+Spannung möglichst so, das der Regelbereich mit PWM ausreicht.
+Es gibt Lüfter die auch bei PWM=0 nach zu hoch drehen.
+Verringert hier die Spannung bis die gewünschte min
+Drehzahl (auch 0 möglich) erreicht wird. Habt aber auch
+die sich verringernde max Drehzahl im Auge.
+Stellt PWM auf einen Wert, der der Drehzahl entspricht,
+mit dem der Lüfter beim Start der Box anfänglich laufen
+soll. Ab dieser Drehzahl wird geregelt.
+
+ für Lüftertyp Steuerung aus
+Die Regelung ist deaktiviert. Der Lüfter läuft mit den
+letzten Parametern weiter. Der Lüfter wird NICHT
+ausgeschaltet!
+
+ Prüfen
+ ------
+Hier wird versucht, die minimale Drehzahl des Lüfters
+für den Anlauf bei stehenden Lüfter und die minimale
+Drehzahl bevor der Lüfter abschaltet zu ermitteln.
+Ebenso wird die maximale Drehzahl für diese Einstellungen
+ermittelt. (OK) bedeutet Wert passt zu den Einstellungen
+bei (!!) passen die Einstellungen nicht zu den vom
+Lüfter erreichbaren Werten. Diese Angaben dienen der Info
+und beeinflussen nicht die Regelung innerhalb des
+Möglichen.
+Für 4Pin werden zusätzlich Angaben über den erweiterten
+Regelbereich angezeigt. Das bedeutet, es wird über den
+PWM-Bereich hinaus auch die Spannung verändert.
+
+ Temperatur-Monitor
+ ------------------
+Mit der "Info-Taste" können die Einzelwerte der Temperaturen
+angezeigt werden.
+Drücke die Info-Taste zum einmaligen Auslesen der HDD-Temperatur.
+
+ Spezial-Setup
+ -------------
+Mit der "Menu-Taste" können spezielle Werte definiert werden.
+Aktion bei Lüfterausfall [zeige Information]
+ Meldung bei defekten Lüfter, Box herunterfahren oder nichts
+ machen.
+Box herunterfahren bei Temperatur (C) [65]
+ Bei Erreichen der definierten Temperatur wird die Box
+ ausgeschaltet (DeepStandby).
+Überhitzungsschutz erhöhen um (C) [0]
+ Ist der Lüfter aus im Standby wird diese bei erreichen der
+ maximalen Temperatur eingeschaltet. Diese maximale Temperatur
+ kann um bis zu 9C vergrößert werden
+HDD-Temperatur im HDD-Standby-Modus lesen [auto]
+ Ja = Temperatur der HDD auch im HDD-Standby lesen
+ Nein = Temperatur der HDD nur lesen wenn aktiv
+ Auto = beim Start von FC2 wird einmal getestet ob die HDD
+ anläuft und wenn ja wird das Auslesen deaktiviert
+ niemals = kein Auslesen der HDD Temperatur
+DMM-FanControl deaktiviert [Nein]
+ Wird in Skins die Temperatur mit angezeigt, ist die DMM-
+ Lüftersteuerung auch aktiv und schaltet ebenfalls den Lüfter.
+ Es entstehen ungewollte Ein/Ausschaltvorgänge.
+ Empfehlung: DMM-Fancontrol deaktivieren
+Zeige Monitor im Erweiterungsmenü [Ja]
+ Monitor im Erweiterungsmenü (Lang-Blau-Taste) anzeigen.
+Anzahl der WebIF-Log-Einträge [40]
+ Wieviele Ereignisse sollen im WebIF angesehen werden können.
+ 40 - 999
+Logging Verzeichnis
+ Wähle mit "OK" den Ort, wohin die Log-Dateien geschrieben
+ werden solle. Daten werden nur geschrieben wenn mindestens
+ noch 10MByte frei sind.
+Aktiviere Data Logging
+ Es wird jede Minute ein Datensatz in die Datei FC2data.csv
+ geschreiben. Diese kann z.B. direkt in Excel aufgerufen
+ werden. Ist diese Datei nicht vorhanden und wird diese
+ Option aktiviert, wird auch eine Kopfzeile erzeugt.
+ ca. 4kByte je Stunde
+Auto-Löschen Daten älter als (Tage) [Nein]
+ Data-Logging-Daten die älter als diese Angabe sind, werden
+ gelöscht.
+ Ausführung: täglich 00:00 und bei Enigma2-Start
+Aktiviere Ereignis Logging
+ Es wird jedes FC2-Ereignis in die Datei FC2events.txt
+ geschrieben.
+ ca. 30kByte je Stunde
+
+ Web-Interface
+ -------------
+Aufruf: http://dreamboxip/fancontrol
+Zeigt Information zu den aktuellen Lüfterwerten und die letzen
+Ereignislogs an. Je Stunde wird ein Wert für Temperatur und
+Drehzahl angezeigt.
+Mit "FC2 Log" können die Logging-Dateien heruntergeladen werden
+und das Logging eingestellt werden.
+"FC2 Chart" zeigt Online-Diagramme der letzten 48h. Das Data-
+Logging muss dazu aktiviert sein. Es müssen für mindestens 2.5h
+Daten vorhanden sein!
+Bei Nutzung von Firefox kann es vorkommen, daß das Diagramm
+nicht ordnungsgemäß angezeigt wird. Dann ist eine zusätzliche
+Seitenaktualisierung (F5) notwendig.
+
+ Sonstiges
+ ---------
+Alle für den Lüfter wichtigen aktuellen Messwerte werden
+als Wert und Balkendiagramm angezeigt. Der Balkenanzeige-
+bereich basiert auf die eingestellen Parameter.
+FanControl2 ist für verschiedene Sprachen vorbereitet.
+POT-Datei ist im ipkg wenn Jemand andere Sprachen zur
+Verfügung stellen möchte.
+Die Einstellungen werden bei den normalen Enigma2-Settings
+abgelegt und sind somit im Backup/Restore enthalten.
+
+
+===========================================================
--- /dev/null
+===========================================================
+FanControl2 par joergm6
+Support forum: IHAD
+Remerciements: Spaeleus, mimi74
+===========================================================
+Mes excuses si la traduction en français n'est pas toujours correcte.
+
+ Fonction
+ -----------
+Commander un ventilateur 3pin ou 4pin (PWM) dépend de la moyenne
+des 2 valeurs de la température les plus élevées.
+La régulation est lente, car les températures ne changent pas
+rapidement et cela permet de ne pas charger inutilement l'unité
+centrale de traitement.
+
+ Préférences
+ ----------------
+ Vitesse mini
+A la température "température statique" et en dessous, cette
+vitesse est choisie.
+
+ Vitesse maxi
+A la température "température finale" cette vitesse est choisie.
+
+ Température statique
+Jusqu'à cette température ce n'est pas régulé, la vitesse mini
+est choisie.
+
+ Température finale
+C'est la température maximale qui peut se produire, quand ceci
+arrive, nous choisirons la vitesse maximum.
+
+ Au commencement, tension et PWM
+En changeant ces valeurs le ventilateur est immédiatement
+positionné avec ces valeurs. La lecture de la vitesse se fait
+directement. Le contrôle est néanmoins de nouveau en activité.
+L'examen ou le changement des valeurs sont très rapides.
+
+ Pour ventilateur type 3pin
+Pour la régulation du voltage du ventilateur 3-pin avec signal
+tachymètre. Le voltage uniquement est contrôlé.
+Les paramètres du PWM n'ont aucun contrôle.
+Positionne la tension initiale à une valeur du taux de rotation,
+avec le ventilateur au démarrage de la boîte prévu pour se lancer.
+C'est régulé depuis cette vitesse de démarrage.
+
+ Pour ventilateur type 4pin
+Pour la régulation PWM du ventilateur 4-pin. La valeur PWM
+seulement est contrôlée. L'ajustement de tension est exigé.
+Placez la tension sur la valeur maximum.
+Mais également un niveau à tension inférieure est utile.
+Un voltage plus bas signifie une vitesse maxi plus basse de rotation
+et une vitesse mini plus basse. Il y a également des ventilateurs
+tournant à PWM = 0 qui sont trop haut.
+Réduisez la tension ici, jusqu'à ce que la vitesse minimum désirée
+(0 y compris est possible) soit réalisée. Ayez également la vitesse
+maximum à l'esprit.
+PWM fournit une valeur qui correspond à la vitesse d'initialisation
+du lancement du ventilateur au démarrage de la boîte.
+C'est régulé depuis cette vitesse de démarrage.
+
+ Pour ventilateur type "sans"
+La régulation est désactivée. Le ventilateur fonctionne avec les
+derniers paramètres appliqués.
+
+ Vérification
+ ---------------
+Ceci essaye de déterminer la vitesse minimum du ventilateur pour
+le démarrage et le minimum avant que la vitesse de l'hélice
+aille à l'arrêt.
+De même, la vitesse maximum pour ces paramètres est déterminée.
+(OK) cela signifie que les valeurs moyennes correspondent
+au paramètres
+(!!) les valeurs ne corespondent pas.
+
+ Divers
+ --------
+Les plus importantes lectures actuelles apparaissent comme une
+valeur ou barre analogique. L'affichage de l'échelle de la
+barre est basée sur les paramètres individuellement réglés.
+FanControl2 est préparée pour différents langages.
+Le fichier POT est un ipkg si quelques autres langages
+deviendraient disponibles.
+
+
+===========================================================
+
--- /dev/null
+===========================================================
+FanControl2 by joergm6 Help V.2.1
+Forum di supporto: IHAD
+Ringraziamenti: Spaeleus, mimi74 diddsen, Bschaar, _marv_
+===========================================================
+
+ Funzioni
+ --------
+Controllo di una ventola a 3 o 4 pin, in funzione della media
+delle due temperature più elevate.
+Le regolazioni avverrano gradatamente, dato che le temperature
+cambiano lentamente ed è inutile caricare eccessivamente la
+CPU.
+
+ Caratteristiche di sicurezza
+ ----------------------------
+Nel caso in cui per 30 minuti non dovesse essere rilevato
+nessun valore circa la velocità di rotazione, il sistema
+riterrà difettosa la ventola.
+In tal caso verrà visualizzato un messaggio appropriato
+sulla TV.
+Se la configurazione scelta prevede che ventola venga spenta
+quando il decoder si trovi in standby, nel caso in cui la
+temperatura dovesse raggiungere il valore massimo, la ventola
+verrebbe riattivata, per essere di nuovo spenta quando la
+temperatura dovesse abbassarsi più di tre gradi.
+La ventola, per i primi 10 minuti, girerà alla velocità
+minima.
+la temperatura di intervento può essere innalzata di un
+massimo di 9 gradi.
+
+ Configurazione
+ --------------
+ Ventola spenta quando in standby
+Sì = quando il box viene posto in standby, la ventola viene
+sempre automaticamente spenta.
+Sì, ma non durante registrazioni o attività HDD = quando il
+box viene posto in standby, la ventola viena automaticamente
+spenta a meno che non ci siano in corso registrazioni o
+attività che coinvolgano il disco fisso.
+
+ Velocità minima
+Rappresenta la velocità di rotazione dela ventola quando la
+temperatura è uguale o inferiore al valore impostato come
+"temperatura di riposo".
+
+ Velocità massima
+Rappresenta la velocità di rotazione della ventola quando la
+temperatura raggiunge il valore impostato come "temperatura
+massima".
+
+ Temperatura di riposo
+Se questo valore non vene configurato, la velocità di
+rotazione della ventola sarà sempre la minima.
+
+ Temperatura massima
+Rappresenta la massima temperatura tollerata: se dovesse essere
+raggiunta, la velocità di rotazione della ventola verrebbe
+impostata al valore "velocità massima".
+
+ Voltaggio e PWM iniziali
+
+Rappresentano i valori utilizzati quando il box viene avviato o
+attivato dallo standby.
+Questi parametri verranno applicati immediatamente, e
+influenzeranno direttamente tutte le altre regolazioni che
+dipendono da essi.
+
+ Ventola a 3 pin
+Le ventole a 3 pin con sensore tachimetrico possono essere
+controllate solo attraverso la tensione: la configurazione PWM
+non ha alcuna influenza.
+Configurare il valore voltaggio adeguato a ottenere la velocità
+di rotazione che si intende ottimale all'accensione del box.
+La velocità sarà poi regolata a partire da questi valori.
+
+ Ventola a 4 pin
+Nelle ventole a 4 pin, per prima cosa utilizzare il parametro
+PWM.
+Se il range di regolazioni disponibile in tal modo dovesse
+rivelarsi insufficiente, è posibile intervenire anche sulla
+regolazione del voltaggio.
+La regolazione del parametro "voltaggio" è comunque necessaria.
+Configurare il parametro al massimo valore previsto (per il
+500HD impostare a 5).
+Tuttavia, potrebbe poi rivelarsi necessario diminuire tale
+valore, in considerazione del fatto che ad un voltaggio minore
+corrispondono velocità massima e minima inferiori.
+Configurare quindi il parametro voltaggio ad un valore che
+permetta di gestire le successive regolazioni attraverso il
+parametro PWM.
+E' anche possibile che in alcuni casi anche a PWM = 0 la
+velocità di rotazione della ventola risulti eccessiva: in
+questi casi agire sul voltaggio riducendolo fino a ottenere
+la velocità desiderata (anche il valore 0 è consentito).
+Tenere presente che questa regolazione avrà effetto anche sulla
+velocità massima raggiungibile.
+Configurare un valore PWM adeguato a ottenere la velocità
+di rotazione che si intende ottimale all'accensione del box.
+La velocità sarà poi regolata a partire da questi valori.
+
+ Parametro tipo ventola disabilitato
+Il controllo verrà disabilitato, ma la ventola non verrà
+spenta!
+Continuerà a funzionare secondo gli ultimi parametri
+configurati prima della disabilitazione del plugin.
+
+ Verifica
+ --------
+Tramite questa funzione il plugin aiuterà a determinare
+la velocità minima ideale da configurare all'avvio del box,
+insieme alla massima velocità di rotazione.
+Al termine dell'analisi, (OK) indicherà i parametri
+correttamente configurati, mentre (!) indicherà i parametri
+che necessitano di ulteriori regolazioni.
+Per le ventole a 4 pin vengono presi in considerazione anche i
+parametri relativi al range di configurazioni estese proprie
+delle funzioni PWM, in aggiunta a quelle relative ai voltaggi.
+
+ Monitoraggio temperature
+ ------------------------
+Tramite il pulsante "Info", vengono mostrati i valori delle
+singole temperature rilevate.
+
+ Configurazioni speciali
+ -----------------------
+Tramite il tasto "Menu", è possibile configurare una serie
+di parametri particolari. Tra le parentesi [ ], il valore
+predefinito.
+Azione da eseguire in caso di avaria della ventola:
+ ["Mostrare info"], "Spegnere il box", "Non fare nulla".
+Spegnimento box a temperatura di (C):
+ se viene raggiunta la temperatura indicata, il box verrà
+ spento automaticamente per evitare danni allo stesso.[65]
+Aumento protezione termica:
+ Se la ventola in standby è spenta, verrà automaticamente
+ riattivata nel caso la temperatura superata la temperatura
+ "di riposo".
+ Questo parametro aumenta il valore della temperatura
+ a cui la ventola viene fatta intervenire (max. 9 gradi).[0]
+Rilevare la temperatura del disco anche in standby:
+ ["Automaticamente"], "Mai", "No", "Sì".
+Disabilitare il plugin Fancontrol by DMM:
+ ["No"], "Sì".
+ Disponibile di default, potrebbe interferire con questo
+ plugin, causando accensioni/spegnimenti anomali della
+ ventola.
+ Si raccomanda di disabilitarlo.
+Numero di log per la WebIf:
+ configura il numero di eventi che vengono presi in
+ considerazione per l'interfaccia web. Range: 40-999.[040]
+Percorso log:
+ indica la path relativa al file di log, se abilitato.
+ Il file verrà generato solo se risulteranno disponibili
+ almeno 10MByte.[/media/hdd/]
+
+Abilitare log dati:
+ ["No"], "Sì". Se abilitato, una volta al minuto, un
+ record verrà aggiunto al file FC2data.csv.
+ Questo file può essere aperto direttamente da applicazioni
+ come Excel.
+ Se il file non esiste e l'opzione viene abilitata, un
+ header sarà generato automaticamente. Lo spazio occupato
+ sarà di circa 4 kbyte ogni ora.
+Abilitare log eventi:
+ ["No"], "Sì". Se abilitato, un record verrà aggiunto al
+ file FC2event.txt. Lo spazio occupato sarà di circa 30
+ kbyte ogni ora.
+
+ Interfaccia Web
+ ---------------
+Raggiungibile all'indirizzo: http://dreamboxip/fancontrol
+Mostra informazioni relative ai valori correnti e al contenuto
+dell'ultimo file di log eventi. Inoltre viene mostrato un
+valore di riferimento per ogni ora relativo a temperatura
+e velocità.
+
+ Miscellanee
+ -----------
+Tutte le informazioni rilevanti relative ai valori correnti
+inerenti la ventola sono mostrati sotto forma di valore e
+barra grafica.
+La barra è dimensionata in base alla lettura del parametro
+a cui si riferisce.
+Fan control è pronto per supportare traduzioni nelle diverse
+lingue.
+Un pile .POT è incluso nella distribuzione con l'ipk, ed è
+dunque diponibile per i traduttori che volessero aggiungere
+altre lingue a quelle già presenti.
+Le configurazioni sono memorizzate come quelle standard per
+enigma2, e come tali aggiunte normalmente a eventuali
+backup/ripristini.
--- /dev/null
+from Plugins.Extensions.WebInterface.WebChilds.Toplevel import addExternalChild
+from Plugins.Extensions.FanControl.FC2webSite import FC2web, FC2webLog, FC2webChart
+root = FC2web()
+root.putChild("log", FC2webLog())
+root.putChild("chart", FC2webChart())
+addExternalChild( ("fancontrol", root) )
\ No newline at end of file
--- /dev/null
+installdir = /usr/lib/enigma2/python/Plugins/Extensions/WebInterface/WebChilds/External/
+
+install_PYTHON = *.py
--- /dev/null
+installdir = /usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/fc2/
+
+install_DATA = *.png diagram.class.org