Hallo,
ich bin neu hier und hätte eine Frage.
Wie kann ich im folgenden Code die Ausgabe anpassen?
Ist es überhaupt möglich?
Es handelt sich hier um eine Temperatur Ausgabe die 8 Grad zu viel anzeigt.
def getCPUTemp(self):
textvalue = 'No info'
info = '0'
try:
out_line = popen('cat /proc/stb/fp/avs_temperature').readline().strip()
info = ' ' + out_line[:3] + ' C'
textvalue = info
except:
pass
return textvalue
und hier wird die Temperatur um 9 Grad zu wenig anzeigt.
def getSystemTemp(self):
textvalue = 'No info'
info = '0'
try:
out_line = popen('cat /proc/stb/fp/temp_sensor').readline().strip()
info = ' ' + out_line[:4] + ' C'
textvalue = info
except:
pass
return textvalue
Beide Info´s kommen aus dem Treiber und es besteht dort keine Möglichkeit was zu ändern.
Danke im vorraus
Dirk
Eine Ausgabe anpasse...
@Dirk09: bevor man was am Code ändert, sollte man ihn erst bereinigen. Methodennamen werden wie Variablennamen klein_mit_unterstrich geschrieben, also get_system_temperature. Abkürzungen vermeiden, temp kann verschiedenes bedeuten. Variablen nicht mit Dummywerten belegen, der Wert der am Anfang an `info` gebunden wird, wird nie verwendet. Zum Lesen einer Datei braucht man kein externes Programm aufzurufen. Einen Wert an `info` zu binden, um ihn sofort an eine andere Variable zu binden, ist unnötig, eine der beiden Variablen kann wegfallen.
Keine nackten excepts benutzen, denn das macht die Fehlersuche unmöglich. Welche Exception kann denn überhaupt auftreten und was wäre dann der richtige Umgang damit? Wenn Dir dazu keine Antwort einfällt, das Exceptionhandling weglöschen.
Das `self` wird nicht gebraucht, damit sind das eigentlich keine Methoden einer Klasse sondern normaler Funktionen.
Warum sind in der Datei avs_temperatur nur die ersten 3 Zeichen, bei temp_sensor aber die ersten 4 Zeichen relevant?
Wenn Du nun die Temperatur anpassen willst, dann mußt Du den Wert in eine Zahl umwandeln und den Korrekturwert addieren.
Keine nackten excepts benutzen, denn das macht die Fehlersuche unmöglich. Welche Exception kann denn überhaupt auftreten und was wäre dann der richtige Umgang damit? Wenn Dir dazu keine Antwort einfällt, das Exceptionhandling weglöschen.
Das `self` wird nicht gebraucht, damit sind das eigentlich keine Methoden einer Klasse sondern normaler Funktionen.
Warum sind in der Datei avs_temperatur nur die ersten 3 Zeichen, bei temp_sensor aber die ersten 4 Zeichen relevant?
Code: Alles auswählen
def get_cpu_temperature():
with open("/proc/stb/fp/avs_temperature") as lines:
temperature = next(lines).strip()[:3]
return ' {}C'.format(temperature)
def get_system_temperature():
with open("/proc/stb/fp/temp_sensor") as lines:
temperature = next(lines).strip()[:4]
return ' {}C'.format(temperature)
Danke erstmal für deine ausführliche Antwort...
Leider tue ich mich mit 58 Jahren in der Materie etwas schwer. Ich wollte auch nicht das komplette Python erlernen.
Mir geht es nur um folgendes. Ich bin Skinner in einem Enigma2 Board und beschäftige mich auch mit Renderer und Convertern. Kleinigkeiten bekommt man dann schon hin.
Nun werden die beiden Sensoren in einem Receiver so ungenau ausgelesen, das mich die Info in der Infobar auf die Palme bringt.
Dieses wollte ich in dem Converter gerade biegen....Da bei uns die Leute der Zeit nicht erreichbar sind (Urlaubszeit) habe ich mich hier nach euch gewandt.
Hier nochmal der relevante Code...
Warum 3 Zeichen in der avs_temperature, weil hier sonst alles angezeigt wird. z. B. +45.76C
Im anderen nur 2 Stellig ohne + und C. z.B. 27
Zusätzlich wird im oberen immer + angezeigt, das habe ich aber im Skin gelöst.
Die Funktion "Short" funktioniert bei CPUTemp nicht.
Ich brauche aber nur 2 Zeichen. Das C wird oben im Code erzeugt und das Grad Zeichen dazu im Skin.
CPUTemp und SystemTemp sind jeweils Aufrufe im Skin.
Beispiel: <convert type="STBInfo">SystemTemp,Short</convert>
Grüße
Dirk
btw....das ist nicht der komplette Code.
Leider tue ich mich mit 58 Jahren in der Materie etwas schwer. Ich wollte auch nicht das komplette Python erlernen.
Mir geht es nur um folgendes. Ich bin Skinner in einem Enigma2 Board und beschäftige mich auch mit Renderer und Convertern. Kleinigkeiten bekommt man dann schon hin.
Nun werden die beiden Sensoren in einem Receiver so ungenau ausgelesen, das mich die Info in der Infobar auf die Palme bringt.
Dieses wollte ich in dem Converter gerade biegen....Da bei uns die Leute der Zeit nicht erreichbar sind (Urlaubszeit) habe ich mich hier nach euch gewandt.
Hier nochmal der relevante Code...
Code: Alles auswählen
from Components.Converter.Converter import Converter
from Components.Element import cached
from Poll import Poll
from os import popen, statvfs
SIZE_UNITS = ['B',
'KB',
'MB',
'GB',
'TB',
'PB',
'EB']
class STBInfo(Poll, Converter):
CPUTEMP = 0
LOADAVG = 1
MEMTOTAL = 2
MEMFREE = 3
SWAPTOTAL = 4
SWAPFREE = 5
USBINFO = 6
HDDINFO = 7
FLASHINFO = 8
DRIVERINFO = 9
SYSTEMTEMP = 10
def __init__(self, type):
Converter.__init__(self, type)
Poll.__init__(self)
type = type.split(',')
self.shortFormat = 'Short' in type
self.fullFormat = 'Full' in type
if 'CPUTemp' in type:
self.type = self.CPUTEMP
elif 'LoadAvg' in type:
self.type = self.LOADAVG
elif 'MemTotal' in type:
self.type = self.MEMTOTAL
elif 'MemFree' in type:
self.type = self.MEMFREE
elif 'SwapTotal' in type:
self.type = self.SWAPTOTAL
elif 'SwapFree' in type:
self.type = self.SWAPFREE
elif 'UsbInfo' in type:
self.type = self.USBINFO
elif 'HddInfo' in type:
self.type = self.HDDINFO
elif 'DriverInfo' in type:
self.type = self.DRIVERINFO
elif 'SystemTemp' in type:
self.type = self.SYSTEMTEMP
else:
self.type = self.FLASHINFO
if self.type in (self.FLASHINFO, self.HDDINFO, self.USBINFO):
self.poll_interval = 5000
else:
self.poll_interval = 30000
self.poll_enabled = True
def doSuspend(self, suspended):
if suspended:
self.poll_enabled = False
else:
self.downstream_elements.changed((self.CHANGED_POLL,))
self.poll_enabled = True
@cached
def getText(self):
text = 'N/A'
if self.type == self.CPUTEMP:
text = self.getCPUTemp()
elif self.type == self.SYSTEMTEMP:
text = self.getSystemTemp()
elif self.type == self.LOADAVG:
text = self.getLoadAvg()
elif self.type == self.DRIVERINFO:
text = self.getDriverInfo()
else:
entry = {self.MEMTOTAL: ('Mem', 'Ram'),
self.MEMFREE: ('Mem', 'Ram'),
self.SWAPTOTAL: ('Swap', 'Swap'),
self.SWAPFREE: ('Swap', 'Swap'),
self.USBINFO: ('/media/usb', 'USB'),
self.HDDINFO: ('/media/hdd', 'HDD'),
self.FLASHINFO: ('/', 'Flash')}[self.type]
if self.type in (self.USBINFO, self.HDDINFO, self.FLASHINFO):
list = self.getDiskInfo(entry[0])
else:
list = self.getMemInfo(entry[0])
if list[0] == 0:
text = '%s: Not Available' % entry[1]
elif self.shortFormat:
text = '%s: Total %s, in use %s%%' % (entry[1], self.getSizeStr(list[0]), list[3])
elif self.fullFormat:
text = '%s: Total %s Free %s Used %s (%s%%)' % (entry[1],
self.getSizeStr(list[0]),
self.getSizeStr(list[2]),
self.getSizeStr(list[1]),
list[3])
else:
text = '%s: Total %s Used %s Free %s' % (entry[1],
self.getSizeStr(list[0]),
self.getSizeStr(list[1]),
self.getSizeStr(list[2]))
return text
@cached
def getValue(self):
result = 0
if self.type in (self.MEMTOTAL,
self.MEMFREE,
self.SWAPTOTAL,
self.SWAPFREE):
entry = {self.MEMTOTAL: 'Mem',
self.MEMFREE: 'Mem',
self.SWAPTOTAL: 'Swap',
self.SWAPFREE: 'Swap'}[self.type]
result = self.getMemInfo(entry)[3]
elif self.type in (self.USBINFO, self.HDDINFO, self.FLASHINFO):
path = {self.USBINFO: '/media/usb',
self.HDDINFO: '/media/hdd',
self.FLASHINFO: '/'}[self.type]
result = self.getDiskInfo(path)[3]
return result
text = property(getText)
value = property(getValue)
range = 100
def getCPUTemp(self):
textvalue = 'No info'
info = '0'
try:
out_line = popen('cat /proc/stb/fp/avs_temperature').readline().strip()
info = '' + out_line[:3] + ' C'
textvalue = info
except:
pass
return textvalue
def getSystemTemp(self):
textvalue = 'No info'
info = '0'
try:
out_line = popen('cat /proc/stb/fp/temp_sensor').readline().strip()
info = '' + out_line[:4] + ' C'
textvalue = info
except:
pass
return textvalue
Warum 3 Zeichen in der avs_temperature, weil hier sonst alles angezeigt wird. z. B. +45.76C
Im anderen nur 2 Stellig ohne + und C. z.B. 27
Zusätzlich wird im oberen immer + angezeigt, das habe ich aber im Skin gelöst.
Die Funktion "Short" funktioniert bei CPUTemp nicht.
Ich brauche aber nur 2 Zeichen. Das C wird oben im Code erzeugt und das Grad Zeichen dazu im Skin.
CPUTemp und SystemTemp sind jeweils Aufrufe im Skin.
Beispiel: <convert type="STBInfo">SystemTemp,Short</convert>
Grüße
Dirk
btw....das ist nicht der komplette Code.
So etwas sollte klappen:
Code: Alles auswählen
info = "{}C".format(int(out_line[:3]) + KORREKTURWERT)