Seite 1 von 1

Eine Ausgabe anpasse...

Verfasst: Mittwoch 1. August 2018, 18:33
von Dirk09
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

Re: Eine Ausgabe anpasse...

Verfasst: Mittwoch 1. August 2018, 19:40
von Sirius3
@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.

Re: Eine Ausgabe anpasse...

Verfasst: Donnerstag 2. August 2018, 10:18
von Dirk09
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.

Re: Eine Ausgabe anpasse...

Verfasst: Donnerstag 2. August 2018, 11:38
von Dirk09
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

Re: Eine Ausgabe anpasse...

Verfasst: Donnerstag 2. August 2018, 11:50
von __deets__
So etwas sollte klappen:

Code: Alles auswählen

info = "{}C".format(int(out_line[:3]) + KORREKTURWERT)

Re: Eine Ausgabe anpasse...

Verfasst: Donnerstag 2. August 2018, 14:30
von Dirk09
Jupp das war es....:D

Vielen Dank allen beteidigten...
Klasse hier.



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


Dirk