Beiträge von PvD
-
-
-
Hier nochmal die komplette EventLogger-Klasse mit der erweiterten Notification:
Python
Alles anzeigenclass EventLogger(xbmc.Monitor): def __init__(self): xbmc.Monitor.__init__(self) self.RpiLeds = LedSwitch() log('Event logger started') def onNotification(self, sender, method, data): log('Event notified: %s, sender: %s, data: %s' % (method, sender, data)) if method == 'Player.OnPlay': self.RpiLeds.switch_led(['LED_PLAY'], LED_ACTIVE) elif method == 'Player.OnPause': self.RpiLeds.switch_led(['LED_PAUSE'], LED_ACTIVE) elif method == 'Player.OnResume': self.RpiLeds.switch_led(['LED_PAUSE'], not LED_ACTIVE) elif method == 'Player.OnStop': self.RpiLeds.switch_led(['LED_PLAY', 'LED_PAUSE'], not LED_ACTIVE) else: log('Event discarded') def logEvents(self): while not self.abortRequested(): self.waitForAbort(1000)
Die Aufnahmeleuchte muss gesondert behandelt werden, da komme ich erst nächste Woche zu.
-
Ok, zunächst definieren wir mal die GPIO + die Leds. Wenn die GPIOs Strom liefern sollen, dürfen die bis max 14 mA belastet werden. Also entweder Vorwiderstand oder Konstantstrom Leds, aber das weißt Du ja sicher.
Code
Alles anzeigen# DEFINITIONS LEDS = {'LED_PAUSE': 18, 'LED_PLAY': 14, 'LED_RECORD': 15} ''' Pinout see https://pinout.xyz/pinout/ground#:~:text=The%20Ground%20pins%20on%20the,supply%20pin%20that%20you%20use LED_PAUSE # Pin 12 (GPIO 18) LED_PLAY # Pin 8 (GPIO 14) LED_RECORD # Pin 10 (GPIO 15) ''' LED_ACTIVE = True # False: Pull Down (Sink) as active state, True: (Source 3.3V) as active state
Dann brauchst Du eine Klasse, welche die Leds schaltet:
Python
Alles anzeigenclass LedSwitch(object): def __init__(self): GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) for LED in LEDS.values(): GPIO.setup(LED, GPIO.OUT, initial= not LED_ACTIVE) def switch_led(self, GPIOleds, state=LED_ACTIVE): ''' switch LED on or off Parameters: array GPIOleds, bool state [Name of LED, (not) LED_ACTIVE] ''' for led in GPIOleds: GPIO.output(LEDS[led], state)
Hier wird später die Funktion switch_led verwendet, um die Led(s) zu schalten, z.B an: LedSwitch.switch_led(['LED_PLAY'], LED_ACTIVE) oder aus: LedSwitch.switch_led(['LED_PLAY'], not LED_ACTIVE) . Da bei "Stop" mehrere Leds auf "aus" gesetzt werden müssen (unabhängig davon, ob die tatsächlich an sind), werden die passenden Leds als Liste übergeben: LedSwitch.switch_led(['LED_PLAY', 'LED_PAUSE'], not LED_ACTIVE)
Das Schalten der Leds wird später im onNotification des EventLoggers untergebracht. Soweit zunächst die Theorie. Jetzt brauche ich erstmal ein paar LEDs, um das testen zu können
-
Gefixt. Waren mal wieder subtile Feinheiten, wie z.B. mehrfache statt einfacher Leerzeichen in HTML-Tags, Leerzeichen vor Ende-Tags (wo vorher keine waren) sowie der Austausch doppelter Anführungszeichen durch einfache Anführungszeichen. Da greifen dann die RegEx nicht mehr und das Scrapen fällt auf die Schn**ze.
-
Ein paar Fragen:
- hast Du den Raspberry bereits im Gehäuse verbaut?
- welche Pins (GPIOs) willst Du für Pause, Aufnahme und Start (Play) verwenden?
- werden die LEDs nach GND (pull down oder Senke) oder nach + 3,3V (push up oder Quelle) geschalten, damit die leuchten?
- Der Aufnahmeregler soll sicher als Lautstärkeregler dienen. Ist da ein Pulsgeber dahinter oder ein Poti?
-
Wenn Du die Ausgaben des Addons live verfolgen möchtest, kannst Du:
- dich mit dem Raspberry per PuTTY verbinden (oder per cmd und ssh root@libreelec) und auf der Konsole
- tail -f ~/.kodi/temp/kodi.log | grep service.event.monitor eingeben. Die Ausgabe von tail lässt sich mit STRG-C abbrechen
Der Debug-Modus fürs Log ist nicht erforderlich.
-
Danke für die Rückmeldung. Dann schieb' ich das Addon ins Repo.
-
Hier sieht man mal, welche Notifications angezeigt werden, wenn ein Video (oder TV usw.) gestartet, pausiert und gestoppt wird.
Code
Alles anzeigen2024-10-28 10:32:50.760 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Playlist.OnAdd, sender: xbmc, data: {"item":{"id":18,"type":"movie"},"playlistid":1,"position":0} 2024-10-28 10:32:50.761 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Info.OnChanged, sender: xbmc, data: null 2024-10-28 10:32:50.761 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Player.OnPlay, sender: xbmc, data: {"item":{"id":18,"type":"movie"},"player":{"playerid":1,"speed":1}} 2024-10-28 10:32:50.861 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Player.OnAVChange, sender: xbmc, data: {"item":{"id":18,"type":"movie"},"player":{"playerid":1,"speed":1}} 2024-10-28 10:32:50.964 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Player.OnAVChange, sender: xbmc, data: {"item":{"id":18,"type":"movie"},"player":{"playerid":1,"speed":1}} 2024-10-28 10:32:50.964 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Player.OnAVStart, sender: xbmc, data: {"item":{"id":18,"type":"movie"},"player":{"playerid":1,"speed":1}} 2024-10-28 10:32:50.964 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Player.OnAVChange, sender: xbmc, data: {"item":{"id":18,"type":"movie"},"player":{"playerid":1,"speed":1}} 2024-10-28 10:33:32.852 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Player.OnPause, sender: xbmc, data: {"item":{"id":18,"type":"movie"},"player":{"playerid":1,"speed":0}} 2024-10-28 10:33:47.867 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Player.OnResume, sender: xbmc, data: {"item":{"id":18,"type":"movie"},"player":{"playerid":1,"speed":1}} 2024-10-28 10:34:14.096 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: VideoLibrary.OnUpdate, sender: xbmc, data: {"item":{"id":18,"type":"movie"}} 2024-10-28 10:34:14.096 T:14346 info <general>: [service.event.monitor 1.0.0] Event received: Player.OnStop, sender: xbmc, data: {"end":false,"item":{"id":18,"type":"movie"}}
Basis ist das Service Addon hier im Zip, das muss nur nur die Auswertung der relevanten Events (Player.Onplay/OnPause/OnResume/OnStop usw.) erweitert werden, damit GPIOs geschaltet werden können.
-
RFT macht's möglich.
Ansonsten: Wenn die Ansteuerung der LEDs per GPIO in Echtzeit erfolgen soll, würde ich den xbmc.Monitor verwenden. Der reagiert mit der onNotification() Methode in Echtzeit auf diverse Events, die denen der JSON Abfragen recht ähnlich sind. Diese Events lassen sich anhand der mitgelieferten Parameter (Sender, Methoden und der dazu gehörenden Daten im JSON-Format) recht komfortabel erfassen/filtern und damit Aktionen - wie das Schalten von GPIOs - auslösen.
Basis wäre dann ein Service-Addon (aka ein Dienst).
-
7 Downloads und keine Rückmeldung. Lehmden1 funktioniert es bei Dir?
-
-
Einstellungen -> PVR und TV -> Wiedergabe -> Ersatzbildwiederholrate ist ein Versuch wert.
Hier auf 50 Hz stellen.
-
Hast Du zufällig einen Vergleich der Performance vor/nach BIOS Upgrade ? Oder Bauchgefühl das es gleich schnell oder langsamer ist ?
Das Encoding dauert gefühlt ca. 15% länger. Damit kann ich aber leben. Gegenüber dem alten I7 aus 2018 (irgendwas um die 6. Generation) ist das eine Steigerung um 250% - 300%.
-
Um mal wieder was zum Topic beizutragen:
Die Temperaturen beim Software-Encoding per CPU liegen nach dem BIOS-Update deutlich unter den Temperaturen davor. Vorher haben einige Kerne abwechselnd gerne mal die 100°C Marke gestreichelt, jetzt liegen die im Bereich um 50-65°C. Damit ist das thermische Problem bei Dauerlast wohl behoben. Der Screenshot kommt etwas zu spät (zum Ende des Encodings), die Auslastung war dauerhaft 100%. Rechts unten im Tray sind die Temperaturen der 24 Kerne.
-
Meine persönliche Interpretation deines Beitrages (über meinem) musst Du schon mir überlassen...
-
Du kannst dich gegen Corona impfen lassen, oder auch nicht.
Wo liegt das Problem ?
Eben. Natürlich kann man seine Meinung haben, nur müssen andere sie nicht akzeptieren.
Nur für mich: Ich habe im Sommer Geld für die neue Hardware in die Hand genommen (incl. der CPU) und habe es bis jetzt nicht bereut. Im Gegenteil: Bis jetzt kein einziger Absturz meiner Software oder gar ein BOD, nichts! Im Gegensatz zu den ewigen Schwarzmalern, die nichtmal praktische Erfahrungen in diesem speziellen Fall dazu beitragen können (weil sie eine derartige CPU überhaupt nicht besitzen). Man kann jetzt sagen "Hast Glück gehabt", mag sein. Mein Nutzerprofil ist allerdings auch nicht darauf ausgelegt, Hardware zu Tode zu quälen.
-
Habe jetzt mal einen Stresstest gemacht, alle Kerne auf 100%. Die CPU-Temperatur der Kerne war nicht höher als 55°C. Ich kann kein Anzeichen für einen Defekt erkennen.
Sicher kannst du nur mit einer neuen CPU sein die nur unter dem neuen BIOS betrieben wurde.
Das mag stimmen, wenn man die CPUs unter Dauerlast und OC betreibt. Das gehört aber nicht zu meinem Einsatzprofil. Das hier ist im Grunde ein Bürorechner, der nur ab und an mal Power zum Umkodieren von Filmmaterial braucht. Ein Spiel hat der auch noch nie gesehen.
-
Also alle ausgelieferten CPUs sind per se defekt. Meine auch. Wie äußert sich das, dass ich eine defekte CPU habe? Die Antwort bist Du mir noch schuldig.
-
Deswegen muss sie nicht beschädigt sein. Außerdem würde das im Umkehrschluss bedeuten, das alle jemals ausgelieferten (und in Betrieb gegangene) CPUs per se beschädigt sein müssen. Sorry, deine Aussage ist Nonsens.
Edit: noob_at_pc : Da hat sich jetzt was überschnitten