Eine Ausgabe anpasse...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dirk09
User
Beiträge: 4
Registriert: Mittwoch 1. August 2018, 18:18

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
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?

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)
Wenn Du nun die Temperatur anpassen willst, dann mußt Du den Wert in eine Zahl umwandeln und den Korrekturwert addieren.
Dirk09
User
Beiträge: 4
Registriert: Mittwoch 1. August 2018, 18:18

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...

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.
Dirk09
User
Beiträge: 4
Registriert: Mittwoch 1. August 2018, 18:18

Huch, den Code habe ich falsch gepostet.
Man möge mir verzeihen und ein Mod wäre so nett ihn in die Codebox zu schieben.


Danke

Dirk
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

So etwas sollte klappen:

Code: Alles auswählen

info = "{}C".format(int(out_line[:3]) + KORREKTURWERT)
Dirk09
User
Beiträge: 4
Registriert: Mittwoch 1. August 2018, 18:18

Jupp das war es....:D

Vielen Dank allen beteidigten...
Klasse hier.



Ich wünsch euch noch frische Nächte :wink: :)


Dirk
Antworten