From: Jörg Trahm Date: Thu, 13 Jan 2011 18:47:12 +0000 (+0100) Subject: initial checkin of FanContol2 X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp-plugin;a=commitdiff_plain;h=445b6210811ee1852697d098e9b4227b0992d201 initial checkin of FanContol2 --- diff --git a/fancontrol2/CONTROL/control b/fancontrol2/CONTROL/control new file mode 100644 index 0000000..87affbb --- /dev/null +++ b/fancontrol2/CONTROL/control @@ -0,0 +1,10 @@ +Package: enigma2-plugin-extensions-fancontrol2 +Version: 2.4-20110113-r4 +Description: Steuerung Luefter +Architecture: mipsel +Section: extra +Priority: optional +Maintainer: IHAD joergm6 +Homepage: http://www.i-have-a-dreambox.com +Depends: enigma2(>2.6) +Source: http://www.i-have-a-dreambox.com diff --git a/fancontrol2/CONTROL/postinst b/fancontrol2/CONTROL/postinst new file mode 100644 index 0000000..c3cc8f6 --- /dev/null +++ b/fancontrol2/CONTROL/postinst @@ -0,0 +1,10 @@ +#!/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 diff --git a/fancontrol2/CONTROL/prerm b/fancontrol2/CONTROL/prerm new file mode 100644 index 0000000..03c33ee --- /dev/null +++ b/fancontrol2/CONTROL/prerm @@ -0,0 +1,13 @@ +#!/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 diff --git a/fancontrol2/Makefile.am b/fancontrol2/Makefile.am new file mode 100644 index 0000000..5afb690 --- /dev/null +++ b/fancontrol2/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src po meta diff --git a/fancontrol2/meta/Makefile.am b/fancontrol2/meta/Makefile.am new file mode 100644 index 0000000..1dba2dc --- /dev/null +++ b/fancontrol2/meta/Makefile.am @@ -0,0 +1,5 @@ +installdir = $(datadir)/meta/ + +dist_install_DATA = plugin_fancontrol.xml + +EXTRA_DIST = fancontrol.jpg \ No newline at end of file diff --git a/fancontrol2/meta/fancontrol.jpg b/fancontrol2/meta/fancontrol.jpg new file mode 100644 index 0000000..24d6cdf Binary files /dev/null and b/fancontrol2/meta/fancontrol.jpg differ diff --git a/fancontrol2/meta/plugin_fancontrol.xml b/fancontrol2/meta/plugin_fancontrol.xml new file mode 100644 index 0000000..c4a3936 --- /dev/null +++ b/fancontrol2/meta/plugin_fancontrol.xml @@ -0,0 +1,24 @@ + + + + + + joergm6 + FanControl2 + enigma2-plugin-extensions-fancontrol2 + Temperature-dependent fan control. + Temperature-dependent fan control. + + + + joergm6 + FanControl2 + enigma2-plugin-extensions-fancontrol2 + Temperaturabhängige Lüftersteuerung. + Temperaturabhängige Lüftersteuerung. + + + + + + diff --git a/fancontrol2/po/FanControl.pot b/fancontrol2/po/FanControl.pot new file mode 100644 index 0000000..80b28ab --- /dev/null +++ b/fancontrol2/po/FanControl.pot @@ -0,0 +1,363 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-02 17:47+Westeuropäische Sommerzeit\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: FC2.txt:88 +msgid "." +msgstr "" + +#: FC2.txt:157 +msgid "below Tunerslot 4" +msgstr "" + +#: FC2.txt:158 +msgid "near XILINX Spartan" +msgstr "" + +#: FC2.txt:159 +msgid "under the WLAN" +msgstr "" + +#: FC2.txt:160 +msgid "left of the Battery" +msgstr "" + +#: FC2.txt:161 +msgid "left near Front-CI" +msgstr "" + +#: FC2.txt:162 +msgid "left near Card-Slot" +msgstr "" + +#: FC2.txt:163 +msgid "over Security Card" +msgstr "" + +#: FC2.txt:164 +msgid "under the Fan" +msgstr "" + +#: FC2.txt:169 +msgid "3Pin" +msgstr "" + +#: FC2.txt:169 +msgid "4Pin" +msgstr "" + +#: FC2.txt:169 +msgid "Control disabled" +msgstr "" + +#: FC2.txt:169 +msgid "disabled" +msgstr "" + +#: FC2.txt:170 +msgid "yes, Except for Recording or HDD" +msgstr "" + +#: FC2.txt:170 FC2.txt:183 FC2.txt:186 +msgid "no" +msgstr "" + +#: FC2.txt:170 FC2.txt:186 +msgid "yes" +msgstr "" + +#: FC2.txt:177 +msgid "Box Shutdown" +msgstr "" + +#: FC2.txt:177 +msgid "display Info" +msgstr "" + +#: FC2.txt:177 +msgid "do nothing" +msgstr "" + +#: FC2.txt:186 +msgid "auto" +msgstr "" + +#: FC2.txt:186 +msgid "never" +msgstr "" + +#: FC2.txt:269 +msgid "please wait (until 3min)..." +msgstr "" + +#: FC2.txt:307 +msgid "Min Fan Start %d rpm at PWM=%d" +msgstr "" + +#: FC2.txt:313 +msgid "Min Fan Stop %d rpm at PWM=%d (%s)" +msgstr "" + +#: FC2.txt:319 +msgid "Max Fan %d rpm at PWM=255 (%s)" +msgstr "" + +#: FC2.txt:321 +msgid "Extended Control Range" +msgstr "" + +#: FC2.txt:331 +msgid "Min Fan Start %d rpm at VLT=%d and PWM=0" +msgstr "" + +#: FC2.txt:334 +msgid "Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)" +msgstr "" + +#: FC2.txt:341 +msgid "Max Fan %d rpm at PWM=255 and VLT=255 (%s)" +msgstr "" + +#: FC2.txt:349 +msgid "Min Fan Start %d rpm at VLT=%d" +msgstr "" + +#: FC2.txt:352 +msgid "Min Fan Stop %d rpm at VLT=%d (%s)" +msgstr "" + +#: FC2.txt:357 +msgid "Max Fan %d rpm at VLT=255 (%s)" +msgstr "" + +#: FC2.txt:429 FC2.txt:431 FC2.txt:434 +msgid "%s %02d C" +msgstr "" + +#: FC2.txt:436 +msgid "press Info for HDD-Temp" +msgstr "" + +#: FC2.txt:437 FC2.txt:678 +msgid "Current rpm %4d" +msgstr "" + +#: FC2.txt:467 +msgid "Action in case of Fan failure" +msgstr "" + +#: FC2.txt:468 +msgid "Box shutdown at Temperature (C)" +msgstr "" + +#: FC2.txt:469 +msgid "increases overheating protection to (C)" +msgstr "" + +#: FC2.txt:470 +msgid "read HDD-Temperature in HDD-Standby-Mode" +msgstr "" + +#: FC2.txt:471 +msgid "disable DMM-FanControl" +msgstr "" + +#: FC2.txt:472 +msgid "Number of WebIF-Log-Entries" +msgstr "" + +#: FC2.txt:473 +msgid "Logging path" +msgstr "" + +#: FC2.txt:474 +msgid "Auto-Delete Data older than (Days)" +msgstr "" + +#: FC2.txt:475 +msgid "Enable Data Logging" +msgstr "" + +#: FC2.txt:476 +msgid "Enable Event Logging" +msgstr "" + +#: FC2.txt:477 +msgid "Show Monitor in Extension-Menu" +msgstr "" + +#: FC2.txt:492 +msgid "Choose path" +msgstr "" + +#: FC2.txt:524 +msgid "" +"GUI needs a restart to apply the changes.\n" +"Do you want to Restart the GUI now?" +msgstr "" + +#: FC2.txt:525 +msgid "Restart GUI now?" +msgstr "" + +#: FC2.txt:591 +msgid "Fan type" +msgstr "" + +#: FC2.txt:592 +msgid "Fan off in Standby" +msgstr "" + +#: FC2.txt:593 +msgid "min Speed rpm" +msgstr "" + +#: FC2.txt:594 +msgid "max Speed rpm" +msgstr "" + +#: FC2.txt:595 +msgid "Static temp C" +msgstr "" + +#: FC2.txt:596 +msgid "End temperature C" +msgstr "" + +#: FC2.txt:597 +msgid "Initial Voltage" +msgstr "" + +#: FC2.txt:598 +msgid "Initial PWM" +msgstr "" + +#: FC2.txt:603 +msgid "Cancel" +msgstr "" + +#: FC2.txt:604 +msgid "Save" +msgstr "" + +#: FC2.txt:605 +msgid "Check" +msgstr "" + +#: FC2.txt:606 +msgid "Help" +msgstr "" + +#: FC2.txt:643 +msgid "Current value: %s" +msgstr "" + +#: FC2.txt:676 +msgid "Temperature C %4.1f" +msgstr "" + +#: FC2.txt:677 +msgid "Target rpm %4d" +msgstr "" + +#: FC2.txt:679 +msgid "Voltage %03d" +msgstr "" + +#: FC2.txt:680 +msgid "PWM %03d" +msgstr "" + +#: FC2.txt:705 +msgid "Information" +msgstr "" + +#: FC2.txt:705 +msgid "readme.txt" +msgstr "" + +#: FC2.txt:819 +msgid "FanControl2 emergency, Box Shutdown now?" +msgstr "" + +#: FC2.txt:962 +msgid "currentRPM:%d targetRPM:%d Temp:%4.1f" +msgstr "" + +#: FC2.txt:969 +msgid "Fan is not working!" +msgstr "" + +#: FC2.txt:1085 +msgid "Temperature" +msgstr "" + +#: FC2.txt:1086 +msgid "Speed" +msgstr "" + +#: FC2.txt:1087 +msgid "Voltage" +msgstr "" + +#: FC2.txt:1094 +msgid "Sensors" +msgstr "" + +#: FC2.txt:1172 FC2.txt:1209 +msgid "active" +msgstr "" + +#: FC2.txt:1175 FC2.txt:1212 +msgid "turn off" +msgstr "" + +#: FC2.txt:1178 FC2.txt:1215 +msgid "not active" +msgstr "" + +#: FC2.txt:1181 FC2.txt:1218 +msgid "turn on" +msgstr "" + +#: FC2.txt:1186 FC2.txt:1188 FC2.txt:1223 FC2.txt:1225 +msgid "Filesize : %d %sByte" +msgstr "" + +#: FC2.txt:1190 FC2.txt:1227 +msgid "Disk free : %d MByte" +msgstr "" + +#: FC2.txt:1193 FC2.txt:1230 +msgid "Download" +msgstr "" + +#: FC2.txt:1197 FC2.txt:1234 +msgid "Delete" +msgstr "" + +#: FC2.txt:1201 +msgid "Delete older 48h" +msgstr "" + +#: FC2.txt:1205 FC2.txt:1242 +msgid "File %s does not exists" +msgstr "" + +#: FC2.txt:1244 +msgid "Logging-Path: %s" +msgstr "" + diff --git a/fancontrol2/po/Makefile.am b/fancontrol2/po/Makefile.am new file mode 100644 index 0000000..bbee6cd --- /dev/null +++ b/fancontrol2/po/Makefile.am @@ -0,0 +1,60 @@ +# +# 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 diff --git a/fancontrol2/po/de.po b/fancontrol2/po/de.po new file mode 100644 index 0000000..090a163 --- /dev/null +++ b/fancontrol2/po/de.po @@ -0,0 +1,399 @@ +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 \n" +"Language-Team: joergm6 \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)" diff --git a/fancontrol2/po/fr.po b/fancontrol2/po/fr.po new file mode 100644 index 0000000..57ee817 --- /dev/null +++ b/fancontrol2/po/fr.po @@ -0,0 +1,292 @@ +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 \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 diff --git a/fancontrol2/po/it.po b/fancontrol2/po/it.po new file mode 100644 index 0000000..e09fd9c --- /dev/null +++ b/fancontrol2/po/it.po @@ -0,0 +1,404 @@ +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 \n" +"Language-Team: www.linsat.net \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" + diff --git a/fancontrol2/po/nl.po b/fancontrol2/po/nl.po new file mode 100644 index 0000000..46ace1f --- /dev/null +++ b/fancontrol2/po/nl.po @@ -0,0 +1,388 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , 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 \n" +"Language-Team: Bschaar \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" diff --git a/fancontrol2/src/FC2webSite.py b/fancontrol2/src/FC2webSite.py new file mode 100644 index 0000000..e39fc23 --- /dev/null +++ b/fancontrol2/src/FC2webSite.py @@ -0,0 +1,502 @@ +# -*- 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 += "\n" + html += "\n" + html += "\n" + html += "\n" + html += "\n" + html += "\n" + html += "\n" + html += "Fan Control 2 - Info\n" + html += "" + html += "\n" + html += "
\n" + html += "
\n" + html += "

\n" + html += "
Fan Control 2 - Info

\n" + html += "
\n" + html += "

" + html += BoxStatus() + if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"): + html += "\n" + html += "

\n" + html += "\n" + html += "\n" + html += "\n" % (_("Temperature"),FC2werte[0]) + html += "\n" % (_("Speed"),FC2werte[1]) + html += "\n" % (_("Voltage"),FC2werte[2]) + html += "\n" % FC2werte[3] + html += "\n" + html += "
%s: %4.1f °C%s: %4d rpm%s: %03dPWM: %03d
\n" + + html += "\n" + html += "\n" + html += "\n" % _("Sensors") + templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE) + tempcount = len(templist) + for count in range(tempcount): + html += "" % sensors.getSensorValue(count) + if FC2werte[4] > 0: + html += "\n" % FC2werte[4] + html += "\n" + html += "
%s °C%dHDD %d
\n" + + html += "\n" + html += "\n" + for count in range(0,12): + tmp = ("
-" if FC2stunde[count] == "-" else FC2stunde[count]) + html +="\n" % (count,tmp) + html += "\n" + for count in range(12,24): + tmp = ("
-" if FC2stunde[count] == "-" else FC2stunde[count]) + html +="\n" % (count,tmp) + html += "

%02d:00
%s

%02d:00
%s

\n" + + html += "\n" + html += "\n" + html += "\n" + + html += "
\n" + html += "Version: %s\n" % Version + html += "\n" + 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 += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "Fan Control 2 - Logging" + html += "" + html += "\n" + html += "
\n" + html += "

\n" + html += "
Fan Control 2 - Logging

\n" + html += "
\n" + html += "

" + html += BoxStatus() + if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"): + html += "\n" + html += "

\n" + + html += "" + html += "
Data Logging " + if config.plugins.FanControl.EnableDataLog.value: + html += "%s" % _("active") + html += "
" + html += "" + html += "" % _("turn off") + html += "
" + else: + html += "%s" % _("not active") + html += "
" + html += "" + html += "" % _("turn on") + html += "
" + 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 += "
" + _("Filesize : %d %sByte") % (int(s.st_size), "") + else: + html += "
" + _("Filesize : %d %sByte") % (int(s.st_size/1024), "k") + s = os.statvfs(config.plugins.FanControl.LogPath.value) + html += "
" + _("Disk free : %d MByte") % (int(s.f_bsize * s.f_bavail / 1024 / 1024)) + html += "
" + html += "" + html += "" % _("Download") + html += "
" + html += "
" + html += "" + html += "" % _("Delete") + html += "
" + html += "
" + html += "" + html += "" % _("Delete older 48h") + html += "
" + else: + html += "
" + _("File %s does not exists") % "FC2data.csv" + + html += "
Event Logging " + if config.plugins.FanControl.EnableEventLog.value: + html += "%s" % _("active") + html += "
" + html += "" + html += "" % _("turn off") + html += "
" + else: + html += "%s" % _("not active") + html += "
" + html += "" + html += "" % _("turn on") + html += "
" + 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 += "
" + _("Filesize : %d %sByte") % (int(s.st_size), "") + else: + html += "
" + _("Filesize : %d %sByte") % (int(s.st_size/1024), "k") + s = os.statvfs(config.plugins.FanControl.LogPath.value) + html += "
" + _("Disk free : %d MByte") % (int(s.f_bsize * s.f_bavail / 1024 / 1024)) + html += "
" + html += "" + html += "" % _("Download") + html += "
" + html += "
" + html += "" + html += "" % _("Delete") + html += "
" +# html += "
" +# html += "" +# html += "" % _("Delete older 48h") +# html += "
" + + else: + html += "
" + _("File %s does not exists") % "FC2events.txt" + html += "
" + html += _("Logging-Path: %s") % config.plugins.FanControl.LogPath.value + 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 = "" + h += "" + h += "" + h += "Execution completed... jump back..." + h += "" + h += "" + 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 = "Not enough Data!" + 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 += "" + html += "" + html += "" + html += "" + html += "" + html += "Fan Control 2 - Chart" + html += "" + html += "\n" + html += "
\n" + html += "

\n" + html += "
Fan Control 2 - Chart

\n" + html += "
\n" + html += "

" + html += BoxStatus() + if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"): + html += "\n" + html += "

\n" + + html += "\n" + html += "\n" % DT[0] + html += "\n" + html += "\n" + html += "\n" % Anzahl + html += "\n" + html += "\n" + html += "\n" + + html += "\n" + html += "\n" + html += "\n" + html += "\n" + + html += "\n" + html += "\n" + html += "\n" + html += "\n" + + html += "\n" + html += "\n" + html += "\n" + html += "\n" + + html += "\n" + html += "\n" + html += "\n" + html += "\n" + + html += "\n" + html += "\n" + html += "\n" + html += "\n" + + html += "\n" + +# html += "
\n" +# html += "
\n" + + html += "\n" + html += "\n" % DT[0] + html += "\n" + html += "\n" + html += "\n" % Anzahl + html += "\n" + html += "\n" + html += "\n" + + html += "\n" + html += "\n" + html += "\n" + html += "\n" + + html += "\n" + + f.seek(0) + line = f.readline() + html += "" + else: + html = "no Data!" + html += "" + html += "" + + return html + +def BoxStatus(): + h = "" + S = int(FC2werte[5]) + if (S & 1)>0 : + h += "\n" + if (S & 2)>0 : + h += "\n" + if (S & 4)>0 : + h += "\n" + return h diff --git a/fancontrol2/src/LICENSE b/fancontrol2/src/LICENSE new file mode 100644 index 0000000..614d30b --- /dev/null +++ b/fancontrol2/src/LICENSE @@ -0,0 +1,12 @@ +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. diff --git a/fancontrol2/src/Makefile.am b/fancontrol2/src/Makefile.am new file mode 100644 index 0000000..cc9a153 --- /dev/null +++ b/fancontrol2/src/Makefile.am @@ -0,0 +1,6 @@ +installdir = /usr/lib/enigma2/python/Plugins/Extensions/FanControl + +SUBDIRS = webif webifdata + +install_PYTHON = *.py +install_DATA = plugin.png plugin.pot *.txt maintainer.info LICENSE diff --git a/fancontrol2/src/Sensors.py b/fancontrol2/src/Sensors.py new file mode 100644 index 0000000..2b5433e --- /dev/null +++ b/fancontrol2/src/Sensors.py @@ -0,0 +1,67 @@ +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 diff --git a/fancontrol2/src/__init__.py b/fancontrol2/src/__init__.py new file mode 100644 index 0000000..e233e01 --- /dev/null +++ b/fancontrol2/src/__init__.py @@ -0,0 +1,22 @@ +from Components.Language import language +from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_LANGUAGE +import os,gettext + +PluginLanguageDomain = "FanControl2" +PluginLanguagePath = "Extensions/FanControl/locale" + +def localeInit(): + lang = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" + os.environ["LANGUAGE"] = lang # Enigma doesn't set this (or LC_ALL, LC_MESSAGES, LANG). gettext needs it! +# print "[" + PluginLanguageDomain + "] set language to ", lang + gettext.bindtextdomain(PluginLanguageDomain, resolveFilename(SCOPE_PLUGINS, PluginLanguagePath)) + +def _(txt): + t = gettext.dgettext(PluginLanguageDomain, txt) + if t == txt: + # print "[" + PluginLanguageDomain + "] fallback to default translation for ", txt + t = gettext.gettext(txt) + return t + +localeInit() +language.addCallback(localeInit) diff --git a/fancontrol2/src/leesmij.txt b/fancontrol2/src/leesmij.txt new file mode 100644 index 0000000..1a45827 --- /dev/null +++ b/fancontrol2/src/leesmij.txt @@ -0,0 +1,175 @@ +=========================================================== +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. + + +=========================================================== + diff --git a/fancontrol2/src/maintainer.info b/fancontrol2/src/maintainer.info new file mode 100644 index 0000000..0806507 --- /dev/null +++ b/fancontrol2/src/maintainer.info @@ -0,0 +1,2 @@ +joergm6@online.de +FanControl2 diff --git a/fancontrol2/src/plugin.png b/fancontrol2/src/plugin.png new file mode 100644 index 0000000..a9b4604 Binary files /dev/null and b/fancontrol2/src/plugin.png differ diff --git a/fancontrol2/src/plugin.pot b/fancontrol2/src/plugin.pot new file mode 100644 index 0000000..80b28ab --- /dev/null +++ b/fancontrol2/src/plugin.pot @@ -0,0 +1,363 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-02 17:47+Westeuropäische Sommerzeit\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: FC2.txt:88 +msgid "." +msgstr "" + +#: FC2.txt:157 +msgid "below Tunerslot 4" +msgstr "" + +#: FC2.txt:158 +msgid "near XILINX Spartan" +msgstr "" + +#: FC2.txt:159 +msgid "under the WLAN" +msgstr "" + +#: FC2.txt:160 +msgid "left of the Battery" +msgstr "" + +#: FC2.txt:161 +msgid "left near Front-CI" +msgstr "" + +#: FC2.txt:162 +msgid "left near Card-Slot" +msgstr "" + +#: FC2.txt:163 +msgid "over Security Card" +msgstr "" + +#: FC2.txt:164 +msgid "under the Fan" +msgstr "" + +#: FC2.txt:169 +msgid "3Pin" +msgstr "" + +#: FC2.txt:169 +msgid "4Pin" +msgstr "" + +#: FC2.txt:169 +msgid "Control disabled" +msgstr "" + +#: FC2.txt:169 +msgid "disabled" +msgstr "" + +#: FC2.txt:170 +msgid "yes, Except for Recording or HDD" +msgstr "" + +#: FC2.txt:170 FC2.txt:183 FC2.txt:186 +msgid "no" +msgstr "" + +#: FC2.txt:170 FC2.txt:186 +msgid "yes" +msgstr "" + +#: FC2.txt:177 +msgid "Box Shutdown" +msgstr "" + +#: FC2.txt:177 +msgid "display Info" +msgstr "" + +#: FC2.txt:177 +msgid "do nothing" +msgstr "" + +#: FC2.txt:186 +msgid "auto" +msgstr "" + +#: FC2.txt:186 +msgid "never" +msgstr "" + +#: FC2.txt:269 +msgid "please wait (until 3min)..." +msgstr "" + +#: FC2.txt:307 +msgid "Min Fan Start %d rpm at PWM=%d" +msgstr "" + +#: FC2.txt:313 +msgid "Min Fan Stop %d rpm at PWM=%d (%s)" +msgstr "" + +#: FC2.txt:319 +msgid "Max Fan %d rpm at PWM=255 (%s)" +msgstr "" + +#: FC2.txt:321 +msgid "Extended Control Range" +msgstr "" + +#: FC2.txt:331 +msgid "Min Fan Start %d rpm at VLT=%d and PWM=0" +msgstr "" + +#: FC2.txt:334 +msgid "Min Fan Stop %d rpm at VLT=%d and PWM=0 (%s)" +msgstr "" + +#: FC2.txt:341 +msgid "Max Fan %d rpm at PWM=255 and VLT=255 (%s)" +msgstr "" + +#: FC2.txt:349 +msgid "Min Fan Start %d rpm at VLT=%d" +msgstr "" + +#: FC2.txt:352 +msgid "Min Fan Stop %d rpm at VLT=%d (%s)" +msgstr "" + +#: FC2.txt:357 +msgid "Max Fan %d rpm at VLT=255 (%s)" +msgstr "" + +#: FC2.txt:429 FC2.txt:431 FC2.txt:434 +msgid "%s %02d C" +msgstr "" + +#: FC2.txt:436 +msgid "press Info for HDD-Temp" +msgstr "" + +#: FC2.txt:437 FC2.txt:678 +msgid "Current rpm %4d" +msgstr "" + +#: FC2.txt:467 +msgid "Action in case of Fan failure" +msgstr "" + +#: FC2.txt:468 +msgid "Box shutdown at Temperature (C)" +msgstr "" + +#: FC2.txt:469 +msgid "increases overheating protection to (C)" +msgstr "" + +#: FC2.txt:470 +msgid "read HDD-Temperature in HDD-Standby-Mode" +msgstr "" + +#: FC2.txt:471 +msgid "disable DMM-FanControl" +msgstr "" + +#: FC2.txt:472 +msgid "Number of WebIF-Log-Entries" +msgstr "" + +#: FC2.txt:473 +msgid "Logging path" +msgstr "" + +#: FC2.txt:474 +msgid "Auto-Delete Data older than (Days)" +msgstr "" + +#: FC2.txt:475 +msgid "Enable Data Logging" +msgstr "" + +#: FC2.txt:476 +msgid "Enable Event Logging" +msgstr "" + +#: FC2.txt:477 +msgid "Show Monitor in Extension-Menu" +msgstr "" + +#: FC2.txt:492 +msgid "Choose path" +msgstr "" + +#: FC2.txt:524 +msgid "" +"GUI needs a restart to apply the changes.\n" +"Do you want to Restart the GUI now?" +msgstr "" + +#: FC2.txt:525 +msgid "Restart GUI now?" +msgstr "" + +#: FC2.txt:591 +msgid "Fan type" +msgstr "" + +#: FC2.txt:592 +msgid "Fan off in Standby" +msgstr "" + +#: FC2.txt:593 +msgid "min Speed rpm" +msgstr "" + +#: FC2.txt:594 +msgid "max Speed rpm" +msgstr "" + +#: FC2.txt:595 +msgid "Static temp C" +msgstr "" + +#: FC2.txt:596 +msgid "End temperature C" +msgstr "" + +#: FC2.txt:597 +msgid "Initial Voltage" +msgstr "" + +#: FC2.txt:598 +msgid "Initial PWM" +msgstr "" + +#: FC2.txt:603 +msgid "Cancel" +msgstr "" + +#: FC2.txt:604 +msgid "Save" +msgstr "" + +#: FC2.txt:605 +msgid "Check" +msgstr "" + +#: FC2.txt:606 +msgid "Help" +msgstr "" + +#: FC2.txt:643 +msgid "Current value: %s" +msgstr "" + +#: FC2.txt:676 +msgid "Temperature C %4.1f" +msgstr "" + +#: FC2.txt:677 +msgid "Target rpm %4d" +msgstr "" + +#: FC2.txt:679 +msgid "Voltage %03d" +msgstr "" + +#: FC2.txt:680 +msgid "PWM %03d" +msgstr "" + +#: FC2.txt:705 +msgid "Information" +msgstr "" + +#: FC2.txt:705 +msgid "readme.txt" +msgstr "" + +#: FC2.txt:819 +msgid "FanControl2 emergency, Box Shutdown now?" +msgstr "" + +#: FC2.txt:962 +msgid "currentRPM:%d targetRPM:%d Temp:%4.1f" +msgstr "" + +#: FC2.txt:969 +msgid "Fan is not working!" +msgstr "" + +#: FC2.txt:1085 +msgid "Temperature" +msgstr "" + +#: FC2.txt:1086 +msgid "Speed" +msgstr "" + +#: FC2.txt:1087 +msgid "Voltage" +msgstr "" + +#: FC2.txt:1094 +msgid "Sensors" +msgstr "" + +#: FC2.txt:1172 FC2.txt:1209 +msgid "active" +msgstr "" + +#: FC2.txt:1175 FC2.txt:1212 +msgid "turn off" +msgstr "" + +#: FC2.txt:1178 FC2.txt:1215 +msgid "not active" +msgstr "" + +#: FC2.txt:1181 FC2.txt:1218 +msgid "turn on" +msgstr "" + +#: FC2.txt:1186 FC2.txt:1188 FC2.txt:1223 FC2.txt:1225 +msgid "Filesize : %d %sByte" +msgstr "" + +#: FC2.txt:1190 FC2.txt:1227 +msgid "Disk free : %d MByte" +msgstr "" + +#: FC2.txt:1193 FC2.txt:1230 +msgid "Download" +msgstr "" + +#: FC2.txt:1197 FC2.txt:1234 +msgid "Delete" +msgstr "" + +#: FC2.txt:1201 +msgid "Delete older 48h" +msgstr "" + +#: FC2.txt:1205 FC2.txt:1242 +msgid "File %s does not exists" +msgstr "" + +#: FC2.txt:1244 +msgid "Logging-Path: %s" +msgstr "" + diff --git a/fancontrol2/src/plugin.py b/fancontrol2/src/plugin.py new file mode 100644 index 0000000..a9be39f --- /dev/null +++ b/fancontrol2/src/plugin.py @@ -0,0 +1,1090 @@ +# FanControl2 +# joergm6 IHAD +Version = "V2.4r4" +import time +import os +from __init__ import _ + +from enigma import eTimer, eSize + +# Config +from Components.config import configfile, config, ConfigSubsection, ConfigNumber, ConfigInteger, ConfigSlider, ConfigSelection, ConfigYesNo, ConfigText +from Components.config import getConfigListEntry +from Components.Label import Label +from Components.Sources.StaticText import StaticText +from Components.Sources.Progress import Progress + +# Startup/shutdown notification +from Tools import Notifications +from Sensors import sensors +from time import gmtime, strftime +import datetime + +# Plugin +from Plugins.Plugin import PluginDescriptor + +# GUI (Screens) +from Screens.Screen import Screen +from Components.ConfigList import ConfigListScreen +from Screens.MessageBox import MessageBox +from Screens.Console import Console +from Screens import Standby +from Screens.MessageBox import MessageBox +from Screens.Standby import TryQuitMainloop + +# GUI (Components) +from Components.ActionMap import ActionMap +from Components.ActionMap import NumberActionMap +from Components.Harddisk import harddiskmanager + +def main(session,**kwargs): + try: + session.open(FanControl2Plugin) + except: + FClog("Pluginexecution failed") + +def mainMonitor(session,**kwargs): + try: + session.open(FanControl2Monitor) + except: + FClog("Pluginexecution failed") + +def Test0(wert): + return (1 if wert<=0 else wert) + +def skal(x, x1, x2, y1, y2): + if x > x2: return y2 + if x < x1: return y1 + m = (y2 - y1) / Test0(x2 - x1) + y = m * x + y1 + return y + +def FClog(wert): + print "[FanControl2]",wert + while len(FC2Log) > config.plugins.FanControl.LogCount.value: + del FC2Log[5] + FC2Log.append(strftime("%H:%M:%S ") + wert) + if config.plugins.FanControl.EnableEventLog.value: + if Free(config.plugins.FanControl.LogPath.value): + try: + f = open(config.plugins.FanControl.LogPath.value + "FC2events.txt","a") + try: + f.write(strftime("%H:%M:%S ") + wert + "\r\n") + finally: + f.close() + except IOError: + FC2Log.append(strftime("%H:%M:%S ") + "Event-Log-Error") + +def FCdata(): + global DataMinute + if strftime("%M")!=DataMinute and config.plugins.FanControl.EnableDataLog.value: + DataMinute = strftime("%M") + if Free(config.plugins.FanControl.LogPath.value): + try: + f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","a") + try: + f.write(strftime("%Y.%m.%d %H:%M")) + for count in range(6): + f.write(";" + str(FC2werte[count]).replace(".",_("."))) + templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE) + tempcount = len(templist) + for count in range(tempcount): + f.write(";" + str(sensors.getSensorValue(count))) + f.write("\r\n") + finally: + f.close() + except IOError: + FC2Log.append(strftime("%H:%M:%S ") + "Event-Log-Error") + +def Free(dir): + if not os.path.exists(dir): + return False + s = os.statvfs(dir) + return (s.f_bsize * s.f_bavail / 1024 / 1024) > 10 + +def getVoltage(fanid): + f = open("/proc/stb/fp/fan_vlt", "r") + value = int(f.readline().strip(), 16) + f.close() + return value + +def setVoltage(fanid, value): + if value > 255: + return + f = open("/proc/stb/fp/fan_vlt", "w") + f.write("%x" % value) + f.close() + +def getPWM(fanid): + f = open("/proc/stb/fp/fan_pwm", "r") + value = int(f.readline().strip(), 16) + f.close() + return value + +def setPWM(fanid, value): + if value > 255: + return + f = open("/proc/stb/fp/fan_pwm", "w") + f.write("%x" % value) + f.close() + +# globale Variablen +ZielRPM = 0 +AktVLT = 0 +AktPWM = 0 +AktRPM = 0 +AktTemp = 0 +AktHDD = [] +LastVLT = 0 +LastPWM = 0 +FanFehler = 0 +OverheatTimer = 0 +Overheat = False +FanOffWait = False +Recording = False +RPMread = 0 +RPMdiff = 0 +FirstStart = True +RPMrunning = False +istStandbySave = False +disableHDDread = False +session = None +Box = "" +DataMinute = "" +FC2Log = [] +FC2werte = [0.1,0,0,0,0,0] +FC2stunde = ["-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-"] +HeadLine = "Time;Temp;RPM;VLT;PWM;HDD;Status;Temp1;Temp2;Temp3;Temp4;Temp5;Temp6;Temp7;Temp8\r\n" +TempName = [ + _("below Tunerslot 4"), + _("near XILINX Spartan"), + _("under the WLAN"), + _("left of the Battery"), + _("left near Front-CI"), + _("left near Card-Slot"), + _("over Security Card"), + _("under the Fan") +] + +#Configuration +config.plugins.FanControl = ConfigSubsection() +config.plugins.FanControl.Fan = ConfigSelection(choices = [("disabled", _("disabled")), ("aus", _("Control disabled")), ("3pin", _("3Pin")), ("4pin", _("4Pin"))], default = "disabled") +config.plugins.FanControl.StandbyOff = ConfigSelection(choices = [("false", _("no")), ("true", _("yes")), ("trueRec", _("yes, Except for Recording or HDD"))], default="false") +config.plugins.FanControl.minRPM = ConfigSlider(default = 500, increment = 50, limits = (0, 1000)) +config.plugins.FanControl.maxRPM = ConfigSlider(default = 3000, increment = 50, limits = (500, 6000)) +config.plugins.FanControl.temp = ConfigSlider(default = 40, increment = 1, limits = (30, 50)) +config.plugins.FanControl.tempmax = ConfigSlider(default = 50, increment = 1, limits = (35, 55)) +config.plugins.FanControl.pwm = ConfigSlider(default = 130, increment = 5, limits = (0, 255)) +config.plugins.FanControl.vlt = ConfigSlider(default = 255, increment = 5, limits = (0, 255)) +config.plugins.FanControl.ShowError = ConfigSelection(choices = [("false", _("do nothing")), ("true", _("display Info")), ("shutdown", _("Box Shutdown"))], default="true") +config.plugins.FanControl.ShutdownTemp = ConfigInteger(default = 65,limits = (50, 80)) +config.plugins.FanControl.AddOverheat = ConfigInteger(default = 0,limits = (0, 9)) +config.plugins.FanControl.DisableDMM = ConfigYesNo(default = False) +config.plugins.FanControl.LogCount = ConfigInteger(default = 40,limits = (40, 999)) +config.plugins.FanControl.LogPath = ConfigText(default="/media/hdd/", fixed_size=False) +config.plugins.FanControl.DeleteData = ConfigSelection(choices = [("0", _("no")), ("2", "2"), ("3", "3"), ("7", "7"), ("14", "14"), ("30", "30")], default="0") +config.plugins.FanControl.EnableDataLog = ConfigYesNo(default = False) +config.plugins.FanControl.EnableEventLog = ConfigYesNo(default = False) +config.plugins.FanControl.CheckHDDTemp = ConfigSelection(choices = [("false", _("no")), ("true", _("yes")), ("auto", _("auto")), ("never", _("never"))], default="auto") +config.plugins.FanControl.MonitorInExtension = ConfigYesNo(default = True) + +def GetFanRPM(): + global RPMread + f = open("/proc/stb/fp/fan_speed", "r") + value = int(f.readline().strip()[:-4]) + f.close() + if value > 0: + RPMread = 0 + else: + RPMread += 1 + value = int(value / 2) + return value + +def GetBox(): + B = Box + if os.path.exists("/proc/stb/info/model"): + f = open("/proc/stb/info/model") + B = f.readline() + f.close() + return B + +def isDMMdisabled(): + value = False + if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"): + FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "r") + text=FCfile.read() + FCfile.close() + if text.find("#Disabled by FC2 config.misc.standbyCounter.addNotifier") is not -1: + value = True + return value + +def disableDMM(): + if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"): + FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "r") + text=FCfile.read() + FCfile.close() + FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "w") + text=text.replace("config.misc.standbyCounter.addNotifier","#Disabled by FC2 config.misc.standbyCounter.addNotifier") + text=FCfile.write(text) + FCfile.close() + FClog("DMM-fancontrol disabled - please restart E2") + +def enableDMM(): + if os.path.exists("/usr/lib/enigma2/python/Components/FanControl.py"): + FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "r") + text=FCfile.read() + FCfile.close() + FCfile = open("/usr/lib/enigma2/python/Components/FanControl.py", "w") + text=text.replace("#Disabled by FC2 config.misc.standbyCounter.addNotifier","config.misc.standbyCounter.addNotifier") + text=FCfile.write(text) + FCfile.close() + +class FanControl2Test(ConfigListScreen,Screen): + skin = """ + + + + + + + + + """ + + + 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 = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + """ + + 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 = """ + + + """ + + 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 = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + """ + + 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 = """ """ + + 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
%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 diff --git a/fancontrol2/src/readme.txt b/fancontrol2/src/readme.txt new file mode 100644 index 0000000..911b471 --- /dev/null +++ b/fancontrol2/src/readme.txt @@ -0,0 +1,170 @@ +=========================================================== +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. + + +=========================================================== + diff --git a/fancontrol2/src/readmede.txt b/fancontrol2/src/readmede.txt new file mode 100644 index 0000000..0d3cb0a --- /dev/null +++ b/fancontrol2/src/readmede.txt @@ -0,0 +1,190 @@ +=========================================================== +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. + + +=========================================================== diff --git a/fancontrol2/src/readmefr.txt b/fancontrol2/src/readmefr.txt new file mode 100644 index 0000000..b92b6b3 --- /dev/null +++ b/fancontrol2/src/readmefr.txt @@ -0,0 +1,87 @@ +=========================================================== +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. + + +=========================================================== + diff --git a/fancontrol2/src/readmeit.txt b/fancontrol2/src/readmeit.txt new file mode 100644 index 0000000..fc37438 --- /dev/null +++ b/fancontrol2/src/readmeit.txt @@ -0,0 +1,192 @@ +=========================================================== +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. diff --git a/fancontrol2/src/webif/FC2web.py b/fancontrol2/src/webif/FC2web.py new file mode 100644 index 0000000..f474b5c --- /dev/null +++ b/fancontrol2/src/webif/FC2web.py @@ -0,0 +1,6 @@ +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 diff --git a/fancontrol2/src/webif/Makefile.am b/fancontrol2/src/webif/Makefile.am new file mode 100644 index 0000000..a669979 --- /dev/null +++ b/fancontrol2/src/webif/Makefile.am @@ -0,0 +1,3 @@ +installdir = /usr/lib/enigma2/python/Plugins/Extensions/WebInterface/WebChilds/External/ + +install_PYTHON = *.py diff --git a/fancontrol2/src/webifdata/FC2Chart.png b/fancontrol2/src/webifdata/FC2Chart.png new file mode 100644 index 0000000..51027f8 Binary files /dev/null and b/fancontrol2/src/webifdata/FC2Chart.png differ diff --git a/fancontrol2/src/webifdata/FC2Info.png b/fancontrol2/src/webifdata/FC2Info.png new file mode 100644 index 0000000..a9953b6 Binary files /dev/null and b/fancontrol2/src/webifdata/FC2Info.png differ diff --git a/fancontrol2/src/webifdata/FC2Setup.png b/fancontrol2/src/webifdata/FC2Setup.png new file mode 100644 index 0000000..50025ec Binary files /dev/null and b/fancontrol2/src/webifdata/FC2Setup.png differ diff --git a/fancontrol2/src/webifdata/FC2dreambox.png b/fancontrol2/src/webifdata/FC2dreambox.png new file mode 100644 index 0000000..f599616 Binary files /dev/null and b/fancontrol2/src/webifdata/FC2dreambox.png differ diff --git a/fancontrol2/src/webifdata/FC2hdd.png b/fancontrol2/src/webifdata/FC2hdd.png new file mode 100644 index 0000000..24697cc Binary files /dev/null and b/fancontrol2/src/webifdata/FC2hdd.png differ diff --git a/fancontrol2/src/webifdata/FC2on.png b/fancontrol2/src/webifdata/FC2on.png new file mode 100644 index 0000000..24845ee Binary files /dev/null and b/fancontrol2/src/webifdata/FC2on.png differ diff --git a/fancontrol2/src/webifdata/FC2record.png b/fancontrol2/src/webifdata/FC2record.png new file mode 100644 index 0000000..36f1481 Binary files /dev/null and b/fancontrol2/src/webifdata/FC2record.png differ diff --git a/fancontrol2/src/webifdata/Makefile.am b/fancontrol2/src/webifdata/Makefile.am new file mode 100644 index 0000000..5a05f2f --- /dev/null +++ b/fancontrol2/src/webifdata/Makefile.am @@ -0,0 +1,3 @@ +installdir = /usr/lib/enigma2/python/Plugins/Extensions/WebInterface/web-data/fc2/ + +install_DATA = *.png diagram.class.org diff --git a/fancontrol2/src/webifdata/diagram.class.org b/fancontrol2/src/webifdata/diagram.class.org new file mode 100644 index 0000000..3db06e5 Binary files /dev/null and b/fancontrol2/src/webifdata/diagram.class.org differ