Was die Apps der Streaminganbieter betrifft, wirst Du kaum um eine zertifizierte Box herum kommen. Die Entwicklung für das Netflix-Addon unter Kodi wird wohl über kurz oder lang eingestellt: https://github.com/CastagnaIT/plu…x#main-features, anderen Streamingaddons unter Kodi wird es wohl irgendwann ähnlich ergehen. Daher macht es für mich keinen Sinn, Kodi unter CoreElec auf einer Dune/Homatics zu installieren. Da fährt man besser mit der Kodi-App unter Android, da diese die nativen (zertifizierten) Streamingapps startet.
Beiträge von PvD
-
-
Definiere diverse Streamingdienste in welcher Qualität.
-
Das LE12 gern mal den WLAN-Key vergisst, wird zumindest hier angesprochen. Mit den Nightlies soll das Problem zumindest adressiert sein (siehe letzter Post im LE Thread).
-
Welcher Skin?
-
Man kann Kodi sagen wieviel er buffern soll. Advancesettings.xml
Dafür sind jetzt die Settings unter Einstellungen >> Dienste >> Cache zuständig. Einträge in der as.xml
werden ignoriert. -
-
Hier das Addon mit der Rec-Funktion. Oben im Script waren noch Fehler drin - die sind jetzt behoben. Das Projekt liegt jetzt auch auf Github: https://github.com/b-jesch/service.event.monitor
-
Wenn man diese Zeile in die onPlay mit reinpackt/ändert, ist das nur dieser Zwei-/Dreizeiler:
Codeif method == 'Player.OnPlay': self.DeviceLeds.LEDS.play.on() self.DeviceLeds.LEDS.record.on() if xbmc.getCondVisibility('Player.IsInternetStream') else self.DeviceLeds.LEDS.record.off()
im onStop muss die Record-LED zusätzlich explizit ausgeschaltet werden:
Das war's eigentlich schon.
-
Sieht schick aus. Fehlt nur noch Aufnahme. Leider liefert der Monitor (bzw. dessen data-Teil) keine Info, ob das ein Stream oder eine Datei ist, was da abgespielt wird. Das muss über die boolean Conditions des Players zyklisch abgefragt werden: https://kodi.wiki/view/List_of_boolean_conditions#Player Player.IsInternetStream bietet sich dafür an.
-
-
-
Der Service verwendet RPi.GPIO. Das ist in der 12er virtual.rpi-tools nicht mehr dabei. Ich werde den Service auf gpiozero umstellen, dann ist das zukunftssicher. Die Raspberry Pi Tools sind installiert.
schumi_64 Danke übrigens. Wäre nicht nötig gewesen.
-
-
-
-
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.