• Vítejte na XBMC-Kodi.cz
  • Česko-slovenská komunita fanoušků XBMC/Kodi
Vítejte návštevníku! Přihlášení Registrace


Hodnocení tématu:
  • 1 Hlas(ů) - 5 Průměr
  • 1
  • 2
  • 3
  • 4
  • 5
Trvale běžící *ELEC a ukončení Kodi
#1
Často potřebujeme, aby systém s Kodi postavený na *ELEC instalaci běžel trvale. Můžeme k tomu mít dva důvody:
  • na pozadí běží aplikace (např. v docker), které vypínat nechceme (Home automation apod.),
  • systém bychom vypnout/uspat mohli, ale potřebujeme, aby se v nastaveném čase sám zapnul/probudil a HW, na kterém *ELEC běží, to neumí (častý případ značné části HW, které nemají RTC).
Což o to, HW o kterém je řeč většinou nemá nijak zásadní spotřebu, použitý HW a komponenty také nejsou náchylné k opotřebení provozem 24/7, takže vlastě o nic nejde. Sám jsem ale takovou potřebu měl několikrát, z jednoho či druhého (či obou) výše uvedených důvodů. To, proč jsem to řešil bylo nakonec hlavně proto, že mi nepřipadalo úplně ideální, když v okamžiku, když jsem Kodi nepotřeboval, obrazovka TV byla vypnutá, byla teplota procesoru (a úplně zbytečně) vysoká, zejména v mém "staromládeneckém" 2+1 orienetovaném na jih. Ze zkušenosti jsem věděl, že když Kodi úplně vypnu, klesne teplota CPU o cca 10 °C, a to i tehdy, když v *ELEC dál poběží Tvheadend, WebgrabPlus, případně pár dalších aplikací v docker. Postupně jsem vyzkoušel různé varianty a kombinace, od prostého vypínání TV (namapoval jsem TV Power tlačítko na DO kterým ovládám Kodi) až po to, co jem popsal ve Vypnutí Skinu. Nakonec jsem ale skončil u řešení, které v uvedeném odkazu zmiňuji také.

Vypínání celého Kodi.

Předesílám, že to, co tu popisuji, není nijak dokonalé. A také, že není určené pro úplné laiky. Zvolil jsem nástroje a prostředky, které mi to řešení umožnily navrhnout a dostat do funkční podoby za minimálních časových nákladů. V první řadě jsem vytvořil dva sh scripty. Prvním se Kodi (a TV) vypne, to je kodioff.sh, a druhým zase zapne, tedy kodion.sh. Zatímco vypnutí Kodi je celkem jasné a jednoduché, při zapnutí jsem musel počítat s tím, že vše ovládám jen jedním tlačítkem a proto musím respektovat kontext. Pro zapnutí je tedy nutný test, zda už Kodi neběží. Pokud běží, tak script skončí bez jakékoliv akce. Je to nutné také proto, že pokud Kodi vypínáme, trvá to řádově několik vteřin, než se aplikace skutečně ukončí. Pro interakci s Kodi používám v uvedených scriptech standardní *ELEC aplikaci kodi-send. Není to úplně ideální, ale funguje to, a to je důležité.

Kodioff.sh  
 
Kód:
#! /bin/sh
kodi-send -a "PlayerControl(Stop)" -a "ReplaceWindow(1190)" -d 5000 -a "UnloadSkin()"
echo 'standby 0' | cec-client -s -d 1
systemctl stop kodi
Součástí scriptu je vypnutí eventuálního přehrávání, zobrazení splash screen a nakonc zastavení skinu. Zobrazení splash screen je spíše jen pro efekt, u mého Kodi je tak jeho spuštění i zastavení doprovázeno vždy stejnou obrazovkou (zapnu Kodi, zapne se TV a téměř okamžitě se zobrazí splash screen, vypnu Kodi, zobrazí se na pár vteřin splash screen a vypne se TV). Zastavení skinu také nutné není, ale vyhnete se tak při následném spuštěním poblikávání obrazovky. Ono vlastně ani není třeba zastavovat přehrávání, ale dává to čas k tomu, aby se Kodi a případně i addon, které přehrávání spustil, před tím, než Kodi začneme "odstavovat", snadněji konsolidovaly.

Kodion.sh
 
Kód:
#! /bin/sh
if [ "$*" == "-c" ] ; then
    if [ $(ps | grep -c '/usr/lib/kodi/kodi.bin --standalone -fs') == 1 ] ; then
        echo 'on 0' | cec-client -s -d 1
        systemctl restart kodi &
    fi
else
    echo 'on 0' | cec-client -s -d 1
    systemctl restart kodi &
fi
Tady je to o krapet složitější, protože je třeba kontrolovat, zda Kodi, které chceme spustit, neběží. Na kontrolu má script parametr spuštění -c, který je-li zadán, test provede a pokud je vyhonoceno, že Kodi běží, nestane se nic. Pokud se script spustí bez testu, Kodi se spustí resp. restartuje bez ohledu na to, zda běží nebo ne. Využít se dá pak ten příkaz i jinak, nejen ve zde uvedeném příkladu.

Jak scripty spouštět?

Pro start obou scriptů používám tlačítko POWER na ovladači. Používám zásadne taková DO, která umožňují POWER tlačítko naučit libovolný IR povel.

Spuštění scriptu kodioff.sh je celkem jednoduché, mapuji ho v Kodi. Například takto:
 
Kód:
<?xml version="1.0" encoding="UTF-8"?>
<keymap> <!-- 99-power.xml for Remote control keyboard style with IR POWER key - 2022-07-22 by JiRo -->
    <global>
        <remote>
            <power>System.Exec("/storage/.config/scripts/system/kodioff.sh")</power>
        </remote>
    </global>
</keymap>
Se scriptem kodion.sh je to o něco složitější. Potřebujeme, aby se spustil i když Kodi neběží. Pro to tedy používám zachycení stisku tlačítka v systému. Pro to v *ELEC existuje celkem dobře známý postup.

Pro přemapování tlačítka v systému musíme jeho stisk zachytit. To se dosáhne vytvořením souboru mapování, např. keymaps.cfg. Ten pro naše účely může vypadat takto:
 
Kód:
begin
  prog = irexec
  button = KEY_POWER
  config = /storage/.config/scripts/system/kodion.sh -c
end
Je vidět, že stiskem tlačítka KEY_POWER (což je metakód tlačítka POWER na DO) se spustí výše uvedený script kodion.sh s parametrem, -c.

Abychom zachycení stisku a definovanou akci provedli, musíme ještě soubor s mapováním zaregistrovat. Toho dosáhneme tím, že do soubru autoexec.sh vložíme řádky:
 
Kód:
killall irexec
irexec -d /storage/.config/keymaps.cfg
Že je třeba po tom všem dát restart *ELEC, nemusím zdůrazňovat.

Se startem záznamu stisknuto POWER na DO, start Kodi, v 23 vteřině opět stisknuto tlačítko POWER, zahájeno ukončování Kodi. Záznam aplikace VNC Viewer na W10.


Případné nejasnosti vysvětlím v diskusi. Nechci popis příliš nafukovat, přeci jen je to už dost speciální, takže se o to asi nebudou snažit úplní laici. Pro ostatní snad prostý výčet jednotlivých kroků a stručné ukázky postačí.
 
Citovat
#2
@JiRo: Výborný námět, určitě to vyzkouším.
X96max plus 4/32 + CE 19.5RC2 + skin - upravený Confluence / TV Samsung QE55Q6FNA
AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.2 Matrix
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#3
Ono to tím, co je v uvedeno úvodu tématu, skončit nutně nemusí. V okamžiku, jakmile máme možnost jednoduše Kodi spouštět a ukončovat, nabízí se další možnosti. Napadla mě hned jedna.

Vložit funkci zastavení Kodi do Power menu Kodi. Je to vlastně analogie funkce Ukončit, kterou mají jiné systémy než *ELEC, tedy systémy, které mají vlastní GUI. Tady se ale do GUI systému uživatel nedostane, prostě se mu Kodi vypne spolu s TV. Edituje se soubor DialogButtonMenu.xml, do kterého se přidá další item. V Estuary to může vypadat nějak takto?
 
Kód:
                    <item> <!--EASY+ -->
                        <label>$LOCALIZE[13012] s vypnutím TV</label>
                        <onclick>dialog.close(all,true)</onclick>
                        <onclick>System.Exec("/storage/.config/scripts/system/kodioff.sh")</onclick>
                        <visible>System.HasAddon(service.coreelec.settings) + !System.ShowExitButton</visible>
                    </item>
Dal jsme tam podmínku na Coreelec a negaci podmínky, kterou se funkce Ukončit zobrazuje právě v jiných systémech než *ELEC. Pro Libre* a Open* to bude analogické.
   
 
Citovat
#4
Pro ty, kteří používají skin Confluence jako já, bude ve stejném souboru kód trochu jiný:
 
Kód:
            <control type="button" id="22">
                <description>Exit button + TV</description>
                <width>340</width>
                <height>40</height>
                <textcolor>red</textcolor>
                <focusedcolor>white</focusedcolor>
                <align>center</align>
                <textwidth>290</textwidth>
                <texturefocus border="25,5,25,5">ShutdownButtonFocus.png</texturefocus>
                <texturenofocus border="25,5,25,5">ShutdownButtonNoFocus.png</texturenofocus>
                <onclick>dialog.close(all,true)</onclick>
                <onclick>System.Exec("/storage/.config/scripts/system/kodioff.sh")</onclick>
                <pulseonselect>no</pulseonselect>
                <font>font13</font>
                <label>$LOCALIZE[13012] Kodi + TV</label>
                <visible>System.HasAddon(service.coreelec.settings) + !System.ShowExitButton</visible>
            </control>

Pokud byste měli problém, zkontrolujte si, že id="22" je ve vašem souboru jedinečné. Případně ho na jedinečné změňte.


Přiložené soubory Miniatury
   
X96max plus 4/32 + CE 19.5RC2 + skin - upravený Confluence / TV Samsung QE55Q6FNA
AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.2 Matrix
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#5
Splash screen

A ještě bych asi měl popsat, jak vypadá zobrazení splash screen. Používám jeden obrázek na všechno, momentálně tedy Kodi 19 - Matrix.
   
Nahradil jsem splash screen *ELEC systémů, protože to uživatele mátlo. Teď tedy, ať si pustí Kodi na čemkoliv, uvidí stále stejnou obrazovku. Tzn., když sputím box s CoreELEC z vypnutého stavu, po úvodním logu výrobce se zobrazí uvedená stránka, a ta je nahrazena až Home stránkou Kodi. Všechny stránky, a u CoreELEC se postupně zobrazují tři, mají stejný obrázek. Já k nim přidávám ještě čtvrtou (při startu skinu) a pátou, před ukončením Kodi.

Start skinu řeším úpravou definičního souboru Startup.xml, např. takto. Je tam navíc nastaveno zpožděné spuštění skinu o 5 s, které umožní náběh PVR ještě před spuštěním addons od widgetů a vyřeší se tím občasné potíže způsobené startem service částí některých addons:
 
Kód:
<?xml version="1.0" encoding="UTF-8"?>
<window> <!-- EASY* -->
    <!-- <onload>ReplaceWindow($INFO[System.StartupWindow])</onload> -->
    <!-- EASY+ -->
    <onload>AlarmClock(Skin,ReplaceWindow($INFO[System.StartupWindow]),00:05,silent)</onload>
    <controls>
        <control type="image">
            <left>0</left>
            <top>0</top>
            <right>0</right>
            <bottom>0</bottom>
            <texture>special://home/media/startup/splash.jpg</texture>    
        </control>
    </controls>
</window>

Ukončení Kodi jsem popsal výše, splash screen před ukončením zobrazuji přes uživatelsky definované okno id=1190:
 
Kód:
<?xml version="1.0" encoding="utf-8"?>
<window type="dialog" id="1190"> <!-- EASY+ -->
    <animation effect="fade" time="1000">WindowOpen</animation>
    <controls>
        <control type="image">
            <left>0</left>
            <top>0</top>
            <right>0</right>
            <bottom>0</bottom>
            <texture>special://home/media/startup/splash.jpg</texture>    
        </control>
    </controls>
</window>
Ještě bych měl dodat, že při startu Kodi se mi přehraje krátký, asi 12 sec motiv z Matrix. Ale to už je jen taková třešinka na dortu, spuštění je definované standardně, přes service.autoexec, to asi popisovat nemusím.


Přiložené soubory
.zip   splash.zip (Velikost: 92,07 KB / Stažení: 6)
 
Citovat
#6
Trochu mě štvalo, že když při spuštění Kodi nechám přehrát hodební motiv skinu (nyní tedy Matrix-u), objeví se v záhlaví Home stránky jméno přehrávaného souboru. V první kroku jsme to potlačil úpravou ve skinu, která v případě, že se přehrává soubor startup.mp3, jeho zobrazení zablokovala. Ale nelíbilo se mi to a protože jsem už dlouho chtěl mít v Kodi vlastní uisound, orientoval jsme se tímto směrem. Výsledkem je vlasní addon souborů uisound. Zatím jsme ho odvodil od už dlouhodobě používaného zvukového schématu titan.modern a vytvořil analogické schéma easy, tedy adddon resource.uisounds.easy. V něm jsme vyměnil stávající startup.wav (pro uisound musí být soubory wav, mp3 je tedy třba překonvertovat) za nový, který obsahuje jingle z Matrix-u, který se přehrává při startu Kodi. Přidal jsme také shutdown.wav, který obsahuje jiný jingle Matrix-u, který se naopak přehrává při ukončení Kodi.

Upravil jsme příslušně i konfigurační sooubor uisound addon, kde jsem přidal přehrání při otevření okna Id 1190, které se zobrazuje při ukončení Kodi:
 
Kód:
    <window>
      <name>startup</name>
      <activate>startup.wav</activate>
    </window>
    <window>
      <name>1190</name>
      <activate>shutdown.wav</activate>
    </window>
Oba wav soubory musí být nakopírovány do adresáře v addon. Zkoušel jsem do konfiguračního souboru dát explicitní cestu do adresáře, kde mám soubory uloženy, a to i pomocí special protokolu Kodi, ale ani v jednom případě to nefungovalo.

Při spuštění Kodi se tedy zobrazí tento obrázek:
   
a naopak při ukončení tento:
   
Analogicky k tomu se pak při spuštění a ukončení Kodi přehrávají dva různé jingly.

.zip   jingles.zip (Velikost: 3,16 MB / Stažení: 2)

Samozřejmě už mám připraveny jak obrázky, tak jingl (zatím jen jeden) pro Nexus. U těch jinglů je to trochu problém, codename Nexus odkazuje na několik východisek a zdrojů, takže je těžké vybrat ten, který je pro něj jednoznačně charakteristický. U Matrix s tímhle samozřejmě problém nebyl. Momentálně mám tedy zatím toto:

.zip   jingle_nexus.zip (Velikost: 126,2 KB / Stažení: 1)
 
Citovat
#7
*ELEC RMD
Pozn. RMD je reminiscence na OS RSX pro počítače firmy Digital, se kterými jsem před více než 30 lety (tedy ještě před érou PC) začínal vážnou prací s počítači a řídicími systémy.

Trvale běžící *ELEC mě inspiroval k napsání jednoduchého scriptu rmd.sh, který mi rychle zobrazí stav běžícího systému, ve kterém vidím jen mnou vybrané a zajímavé hodnoty.
 
Kód:
#! /bin/sh
echo Instance of Kodi: $(($(ps | grep -c '/usr/lib/kodi/kodi.bin --standalone -fs')-1))
echo Tvheadend recordings: $(curl -s "http://localhost:9981/api/dvr/entry/grid_upcoming?limit=99999" | grep -c '"sched_status":"recording",')
echo HTSP Clients: $(curl -s "http://localhost:9981/api/status/connections" | jq -r '.entries | to_entries[] | (.value.peer)  ')
echo CPU temperature: $(cputemp)
echo GPU temperature: $(gputemp)
free -h | head -n 2
echo Processor cores frequencies:
lshw | grep -E 'size.*MHz' | sed -re "s/.*size: ([0-9]*).*/\\1 MHz/"

Spuštění a zobrazení řeším přes PuTTY, kde mám vytvořen profil, který script spustí s pomocí watch v okně přizpůsobeném jeho velikosti.
 
Kód:
watch -n 5 /storage/.config/script/system/rmd.sh

Výsledek pak vypadá takto:
   
 
Citovat
#8
*ELEC RMD a drobné vylepšení

V předchozí verzi RMD.sh jsem chtěl indikovat počet existující nahrávání v Tvheadend, ale dopadlo to tak, že indikace probíhala následovně: 0 =není žádné, =1 běží alespoň jedno. Tak je tady oprava, po které se už zobrazuje počet aktuálně probíhajících nahrávání (3. řádek):
 
Kód:
#! /bin/sh
echo Instance of Kodi: $(($(ps | grep -c '/usr/lib/kodi/kodi.bin --standalone -fs')-1))
echo Tvheadend recordings: $(curl -s "http://localhost:9981/api/dvr/entry/grid_upcoming?limit=99999" | jq '.entries | .[] | select( .sched_status == "recording" ) | length' | wc -l)
echo HTSP Clients: $(curl -s "http://localhost:9981/api/status/connections" | jq -r '.entries | to_entries[] | (.value.peer) ')
echo CPU temperature: $(cputemp)
echo GPU temperature: $(gputemp)
free -h | head -n 2
echo Processor cores frequencies:
lshw | grep -E 'size.*MHz' | sed -re "s/.*size: ([0-9]*).*/\\1 MHz/"
Trochu bojuji s jq. Nedostal jsme z něj počet odfiltrovaných položek, tak jsme si pomohl možná trochu špinavým trikem. Ale důležité je, že to funguje.

To že RMD.sh lze spustit i na mobilu asi připomínat nemusím. Na Androidu používám free Putty SSH. Reklamy skoro neobtěžují, základní funkce jsou víceméně shodné s PuTTY, kterou používám na Windows. Včetně možnosti přímého spuštění scriptu po přihlášení.


Přiložené soubory Miniatury
   
 
Citovat
#9
@JiRo: Se zpožděním mám ke kódu v prvním příspěvku dotaz. Pokud posílám do LE příkazy z PuttySSH, lze použít i příkaz systemctl start kodi ke spuštění. Ty používáš pro spuštění ve scriptu restart, je to zvoleno účelově?
Je to v jiných systémech (Android, CoreElec) jinak než v LE?
Kodi 19/18.x -LibreELEC 10/9.x -BerryBoot -RPi4/3/0/w -LinuxMint21/W10/Android11. Router 1Gbit 2.4+5GHz
 
Citovat
#10
@meda Jo, pokud Kodi neběží, vede start i restart v konečném důsledku ke stejnému výsledku. Spuštění Kodi. Já ho používám proto, že kdyby náhodou Kodi běželo (on se někdy ten stop nemusí povést), tak to restart dostane do nějakého jasně definovaného stavu.

V android nevím, spíše ale ne. Ten příkaz systemctl restart/stop/start je linuxový. CE a LE jsou v tomto úplně stejné.
 
Citovat
  


Přejít na fórum:


Prochází: 1 host(ů)