XBMC-Kodi.cz

Úplná verze: Reboot boxu z DO
Prohlížíte si holou variantu vašeho obsahu. Prohlédněte si plnou verzi s příslušným formátováním.
Měl jsme tuto funkci vyřešenou u všech mých boxů, pokud jsme je ovládal přes Logitech Harmony One. Tam jsem si na to prostě vyhradil nepouživané kódy tlačítek v příslušném "Device". Poté, co jsem přešel na trochu jiný typ DO, tak mi ta funkce chybí. Zejména v době, kdy zkouším a testuji nové verze Kodi a binárních addon, kde k "zamrznutí" Kodi není daleko. Čekat až se Kodi při neopatrné práci vzpamatuje nebo dokonce box odpojovat od napájení není jednak pohodlné, není to ani ohleduplné k HW a navíc, protože některé funkce testuji na hlavním Kodi v domácnosti, protože tak nejlépe některé funkce dlouhoodobě prověřím, nemohu čekat, že některé postupy budou provádět ostaní uživatelé.

Dále popisované řešení je jen jakési "udělátko" a pro ostré nasazení pro širší veřejnost by bylo třeba, aby se ho ujal někdo zkušený a učesal to, případně využil lépe dostupné funkce a nástroje/aplikace systému. Já jsem například laboroval se systemd, ale zjistil jsem že pro tak krátké časy, které potřebuji sledovat a vyhodnocovat, je lepší to vytvořit celé na bázi sh scriptů. Proto to publikuji tak, jak to je, a přidávám stručný popis. Můžete si hrát, případně tomu dodat nějakou lepší fazónu. Přivítám i nějaké nápady...

Předpoklady:
  • Kodi běží na *ELEC. Nebyl by asi problém ani s Linuxem, možná už trochu s Windows, ale tohle teď řešit nebudu. A i proto, abych to zjednodušil, budu to celé popisovat tak, jak to mám já implementované na mém CoreELEC.
  • DO je IR nebo kombinace IR a RF/BT, kde IR povel je používán k zapnutí(probuzení) a vypnutí/uspání, tedy je generován stiskem tlačíka POWER.
  • Využívá se doplnění na úrovni systému, kde se v *ELEC doplní vlastní předpis pro zpracování příslušného kódu tlačítka. V Linuxu by to mělo jít analogicky, ve Windows se musí použít nějaký obdobný postup.
  • Předpokladem je samozřejmě to, že Kodi sice může být "mrtvé", nereaguje, ale zbytek OS víceméně běží a jeho základní funkce a další aplikace fungují. V této chvíli si já většinou buď Kodi shodím přes ssh terminál (to se ne vždy podaří, resp. to může trvat hodně dlouho) nebo přes něj provedu reboot  celého systému. Teď tedy chci mít možnost reboot provést přes DO.
Idea řešení:
  • zmrtví-li Kodi, nereaguje zpravidla ani na DO povel pro vypnutí. Myšlenka je taková, že protože v této chvíli povel z DO do Kodi nedorazí, resp. Kodi s ním nic neprovede, využít ho pro zadání příkazu reboot přes zpracování povelu z DO na úrovni systému, na jehož základě se na úrovni systému zadá potřebný příkaz (např. reboot).
A řešení:

V první řadě je třeba umět odchytit povel z DO. Tedy definovat tabulku pro aplikaci ireexec. Ta může vypadat třeba takto (jde o textový soubor):
Kód:
begin
  prog = irexec
  button = KEY_POWER
  config = /storage/.config/scripts/rescue/catch.sh
end
Pojmenování souboru je zcela libovolné (já jsem použil název keymaps.cfg a uložil ho do .config adresáře), musí se jen stejné jméno použít v příkazu, který by měl být vložen do autostart.sh. Jde o sekvenci dvou řádků pod komentářem:
Kód:
...
# Rescue reboot initial
killall irexec
irexec -d /storage/.config/keymaps.cfg
rm -f /storage/.config/scripts/rescue/rescue.cnt
...
Ten třetí řádek, to je iniciální sekvence, kterou se po spuštění Kodi maže (pro jistotu) soubor rescue.cnt, do kterého si dále uvedený script ukládá počet stisknutí příslušného tlačítka.

Vlastní řešení je postavené na dvou sh scriptech, které jsem umístil do podadresáře rescsue mého oblíbeného adresáře /storage/.config/scripts, ve kterém si takováto "udělátka" ukládám. Mám to tak už léta a všechny mé *ELEC implementace to mají stejné.

První script, catch.sh je spouštěn stisky tlačíka POWER na DO a počet jejich stisknutí ukládá do souboru rescue.cnt. Zároveň spouští postupně jednotlivé instance scriptu clear.sh. První instance spustí čekání v daném časovém okně (zde je nastaveno 5 sekund). Pokud v tomto čase první script nenačítá nastavený počet tisknutí POWER tlačíka, tak se soubor smaže a nestane se nic. Pokud ale počet stisknutí překročí nastavený limit (zde je nastaveno také 5, ale počet stisknutí), spustí se příkaz reboot.

Zde jsou oba scripty:

Catch.sh
Kód:
#! /bin/sh

presstoreboot=5

debug=1
notify=1
reboot=1

dir=/storage/.config/scripts/rescue/

log=${dir}rescue.log
cnt=${dir}rescue.cnt
clr=${dir}clear.sh

[ ${debug} ] && echo $(date +"%Y-%m-%d %H:%M:%S.%N") CATCH Start >> ${log}

[ ! -f ${cnt} ] && ${clr} &
while [ ! -f ${cnt} ] ; do
    [ ${debug} ] && echo $(date +"%Y-%m-%d %H:%M:%S.%N") CATCH Waiting for timer... >> ${log}
done

press=$(cat ${cnt})
press=$((press+1))
if [ ${press} -gt ${presstoreboot} ] ; then
    [ ${notify} ] && kodi-send --action="Notification(Rescue,Reboot,2000)"
    rm -f ${cnt}
    [ ${reboot} ] && reboot
    exit
fi
[ ${debug} ] && echo $(date +"%Y-%m-%d %H:%M:%S.%N") CATCH Press [${press}] >> ${log}
echo ${press} > ${cnt}

exit

Clear.sh
Kód:
#! /bin/sh

timetowatch=5

debug=1
notify=1

dir=/storage/.config/scripts/rescue/

log=${dir}rescue.log
cnt=${dir}rescue.cnt

[ -f ${cnt} ] && exit
    
[ ${debug} ] && echo $(date +"%Y-%m-%d %H:%M:%S.%N") CLEAR Start waiting... >> ${log}

echo 1 > ${cnt}

sleep ${timetowatch}

rm -f ${cnt}

[ ${debug} ] && echo $(date +"%Y-%m-%d %H:%M:%S.%N") CLEAR Delete cnt >> ${log}

exit

Kód jsme poněkud nafoukl, je tam bohaté protokolování, včetně času, aby bylo vidět, jak to celé probíhá, log se ukládá do souboru rescue.log. Pro někoho možná nelogicky v okamžiku, než se zadá příkaz reboot, provede se o tom ještě notifikace v Kodi, i když na ni ve většině případů už nedojde. Ale to tam mám spíše pro ladění a efekt...

Závěrem:

Pro ty, kterým uvedené scripty nic neříkají nebo jim to není úplně jasné (popisu jsem nevěnoval moc velkou pozornost protože to celé je určeno spíše pro ty, kteří se vyznají v detailech a jistě princip pochopí), ještě jednou zběžné závěrečné shrnutí:
  • zamrzne Kodi, nereaguje na stisky tlačítka DO (ani klávesnice) a to ani na stisk tlačítka POWER
  • nechce se vám, nebo tomu kdo u Kodi právě sedí, přihlásit se k systému přes ssh terminál nebo to neumíte nebo nevíte, co a jak byste měli řešit
  • pokud máte to správné DO (s IR vysíláním kódu tlačítka POWER) a implementovali jste si výše popsané řešení, stačí v této chvíli stisknout tlačítko POWER 5x (a více) za sebou v čase < 5 sec a provede se reboot systému
  • pokud v čase do 5 sec stisknete tlačítko méně než 5x, nestane se nic, po uplynutí 5 sec po prvním stisknutím tlačítka se interní čítač vynuluje (coubor rescue.cnt se smaže) a vše je připraveno na dalších 5 "rychlých stisků".
A takto to může vypadat po 5. stisku tlačítka POWER (jde pouze o simulaci):
[attachment=7354]

A ještě jedna poznámka:

Někdo možná namítne, že by úplně stačilo ovládat vypnutí Kodi tak, že by se výše uvedeným postupem vypínal celý systém. Tzn. natvrdo po odchycení stisku tlačítka POWER zadat příkaz shutdown. Ano, to by šlo, a bylo by to jednodušší, ale má to jeden háček, to vypínání (a následné zapínání) trvá dlouho (včetně náběhu všech funcí Kodi), zatímco většina uživatelů chce za normální situace box při "vypnutí" pouze uspat, a pak ho zase přes DO probudit. Ten rozdíl mezi vypínáním/zapínáním a uspáním/probuzením je zásadní. Tak proto...
Asi to, co napíšu, není úplně pokračování tématu, ale...
Pokud mi Kodi zamrzne, jen tak, že přestane vnímat povely z HDMI-CEC (tedy z D.O. od TV), použiji aplikaci Kore (Android remote)
https://kodi.tv/article/new-kore-version-v251/
...instalovanou na mobilní telefon. Musí fungovat spojení přes domácí síť.
V rozvinovacím menu je volba Restartovat.
Samozřejmě je to restart systému. U mne LibreElec na RPi4/3, trvá necelých 28 sec.
Já používám toto (navolím si co potřebuji) → SSH button  4
D: & : Oběma díky za příspěvek do diskuse.

Kore (a jakákoliv mobilní aplikace DO) na Kodi má smysl, pouze pokud to člověk používá běžně. Já, ani nikdo z mého okolí, ale DO na mobilu nepoužíváme. Je to prostě součást relaxu, konečně po celém dni odložit mobil a vzít si do ruky jednoduché DO.

SSH Button je něco jiného, používám ho také, ale právě jen v případech údržby a práce na Kodi nebo jiných aplikacích v domácí síti, ale hlavně když jsem u někoho a "spravuju" mu Kodi/Tvheadend a nemám nebo mi nestojí za to startovat počtač pro přístup přes ssh. Naklonovat si pár povelů je věcí okamžiku. Ale že bych ssh button instaloval běžným uživatelům, to ais ne. Proto ta snaha řešit to přes zařízení, které pro ovládání běžně používají. Navíc, ta instrukce: "Když ti nejde nic v Kodi ovládat přes DO, stiskni 5x po sobě tlačítko na zapnutí a chvíli počkej, ono se to vzpamatuje," je jasná každému.
: Jsem si vědom, že příspěvek stran ovládání přes aplikaci z MT zrovna do tohoto vlákna nepatří (není to tu vzhledem k rozsáhlému návodu ani moc košer) a může se to zdát jako "drbání" levého ucha pravou rukou  4 Řešení restartu via DO je samozřejmě někde jinde, telefon je taková "nouzovka" pro "state of emergency" u známého či když je přístroj aktuálně v ruce - což je u mne bohužel dost často (a ne nejsem závislák). SSH Button je mé jediné "jiné" ovládání kromě DO/TV, tak nějak jsem si na něj zvykl - ono to jeho použití není nijak časté a to co má udělat to udělá. Přišlo mi, že by byla škoda ho tu nezmínit a to právě tady v tomto vláknu, které mi onu aplikaci vlastně připomnělo a proto jsem ji zde i uvedl jako onu možnou "nouzovku" na cesty  4

Omlouvám se za OT !
V případě zamrznutí používám toto https://m.aliexpress.com/item/4001189495...a8d&is_c=N
: & @Rossi D: Každé zde uvedené řešení někomu pomůže. Děkuji.
Jen se zeptám...to asi nejde aplikovat na ovládání přes HDMI-CEC ovladačem od TV? Jedná se tady jen o DO přímo boxu, ať už IR, nebo BT?
Jak už bylo popsáno, toto řešení je vytvořeno pro DO, kde alespoň jedno tlačítko (zde POWER) aktivuje přenos kódu pře IR. Je to proto, že taková DO existují, já je používám a hlavně proto, že dokážu stisk takového tlačítka v systému rozpoznat ještě před tím, než je jeho kód předaný do Kodi. Určitě by totéž šlo udělat u DO, které se v systému tváří jako klávesnice (to je většina DO android boxů) s RF přenosem (a USB dongelem) nebo BT, ale já to neumím. U HDMI-CEC by to ale bylo ještě složitější, protože tam je mezi zpracováním dat z HDMI-CEC v systému a v Kodi dost problematický vztah a i když využití HDMI-CEC komunikace na úrovni systému není tak složité, má vliv na to, jak jsou pak kódy tlačítek a dalších funkcí předávány do Kodi. Takže když to shrnu, to co je tu popsané, pro ovládání ovladačem (např. ovladačem TV) komunikujícím s Kodi přes HDMI-CEC, použít nelze (resp. já v současné chvíli nevím, jak by mohlo).
Díky za vyčerpávající odpověď. Škoda, protože pokud by to šlo, bylo by to super. Myslím si, že spoustu lidí používá u TV boxů výhradně a jen ovladač od televize využívající funkci H-CEC. Pokud by tě napadlo, jak na to, určitě dej vědět :)

Já tedy pro tyto případy používám mobil a buď přes SSH klienta, nebo přes nějaký ovladač aka Sybu atd. provedu reboot.
: : Já mám vyzkoušené, že pokud Kodi zamrzne a přestane fungovat CEC ovládání Kodi, nefunguje zřejmě ani komunikace CEC se systémem.
Aspoň moje TV Samsung (řady U) ztratí o funkčnosti informaci.
Proto odhaduji, že předat kód pro vyvolání restartu už pak není možné a musí aspoň zůstat funkčnost jiného portu boxu, tedy IR nebo LAN.
Jo, to je možné. Teoreticky by snad v tuto chvíli mohla roli Kodi převzít cec-client aplikace, ale je těžké jak ji aktivovat. Hele, měli bychom se asi obecně snažit soustředit se na to, aby Kodi implementace byla stabilní a potřeba restartu/rebootu tu vůbec nebyla. Tzn. u těch aplikací, kdy udělátka typu ssh button není praktické použít (manželky, malé děti, starší rodiče) nebo tam, kde není obvyké používat mobil jako DO, neexperimentovat s prerelease verzemi či dokonce nighties. Ta moje potřeba rebootu z DO se týká těch případů, kdy lidé vědomě a na základě nějaké potřeby provozují nestabilní verze na produktivních instalacích, a ta zas tak častá není. Já má třeba, kromě té instalace, kde testuji, ostatní instalace Kodi, kde ze zásady používám pouze stabilní verzi Kodi a všech addon, neexperimentuji tam s ničím, a tam mi Kodi snad nezamrzlo ještě nikdy.

Ještě k té ztrátě komunikace HDMI-CEC s TV. Mohlo by se třeba zkusit monitorovat HDMI-CEC status a na jeho základě (tedy pokud komunikace vypadne) například spustit automatický restart/reboot. Problém je, že jak se sáhne do HDMI-CEC komunikace ze systému, tak to většinou zboří komunikaci z Kodi, takže nějaké periodické testování asi může být problém. Je to taková varianta Heisenbergova prinipu neurčitosti: "Můžeme se dozvědět, zda je komunikace funkční, ale zároveň ji tím učiníme nefunkční." 3
: .....ano. Je myslím rozumné vrátit se k tvému prvnimu příspěvku.

Myslíš, že lze pomocí čidlana boxu odchytávat komunikaci originálního TV D.O. (IR/BT) s TV? Například to 5x opakované stisknutí zvoleného tlačítka?
Hmm, zajímavý problém. Tak snad by v Linux šlo spustit více instancí lirc. Tohle se dělá v případě, že je třeba na jednom systému přijímat/vysílat z/do víc směrů. Ale jeslti je tohle cesta, to teď nedokážu posoudit. S tímhle ti asi neporadím.
(08.9.2021, 7:12)JiRo Napsal(a): [ -> ]Pro ty, kterým uvedené scripty nic neříkají...

Ahoj, som jeden znich a tento restart Kodi vCoreElec po stlačení 5x power by som ocenil. No strácam sa vtom čo/kde..?


Možno jednoduchšie keby sa to pre nás nechápavých napísalo polopate.


- do adresára /storage/.config/ som vytvoril zložku scripts a v nej zložku rescue a tam mám tie 2 .sh súbory, ale nereštartuje sa mi Kodi.

//nereštartuje sa ani po vložení autostart.sh a keymaps.cfg, počkám na odpoveď 



- súbor autostart.sh som nenašiel, zrejme ho treba vytvoriť v .config? wiki už nefunguje https://wiki.openelec.tv/index.php/Autostart.sh
Citace:...
# Rescue reboot initial
killall irexec
irexec -d /storage/.config/keymaps.cfg
rm -f /storage/.config/scripts/rescue/rescue.cnt
...



- aj ten keymaps.cfg treba vytvoriť v .config
Citace:begin
  prog = irexec
  button = KEY_POWER
  config = /storage/.config/scripts/rescue/catch.sh
end
Strašně se omlouvám 10 , zapomněl jsem napsat, že oba soubory (catsh.sh i clear.sh) musí být (pokud jsou scripty napsané takto), nastavené jako spustitelné.

Pokud jsi v adresáři, kde jsou umístěné, tak stačí zadat:

chmod +x catsh.sh
chmod +x clear.sh

Pokud jsi jinde, tak vždy včetně celé cesty k nim.

Ano, pokud autostart.sh nemáš, je třeba ho vytvořit.
Je zajímavé, jak se kruh uzavírá. Po hrátkách s řešením reboot boxu z DO jsem dospěl k úplně prapůvodnímu řešení ovládání uspávání/probouzení boxu na kterém běží *ELEC, které jsem používal už kdysi ještě u MediPortal a potom i Kodi pod Windows (poprvé nějakých 14 let zpátky), tedy zachycovat stisk POWER tlačítka (IR) v systému a vůbec to v Kodi neřešit. To mě vedlo k lehkému přepracování logiky ovládní, která vůbec nezávisí na tom, v jakém stavu je Kodi *):
  • Box je zapnutý:
    • 1x stisk - uspání boxu/*ELEC
    • 3x stisk - restart Kodi
    • 5x stisk - reboot boxu/*ELEC
  • Box je uspaný/vypnutý:
    • 1x stisk - probuzení/spuštění boxu/*ELEC
Vede to k mírné úpravě scriptů (zveřejním bude-li zájem), logika funguje tak, že se po 1. stisku POWER čeká 1s resp. nastavený čas v s a pokud do té doby nepřijde další stisk, tak se box uspí. Pokud ale v čase do 1 s přijde 2. a další stisky tlačítka POWER, tak se v zadaném čase (typicky 4 s) počítají stisky a podle počtu se pak, po uplynutí toho nastaveného času, provede akce. Znamená to, že je pak možné si klidně přidat i další akce, záleží pouze na tom jak komfortní ovládání si představujete. Jako další možnosti nastavení mě například napadá
  • vypnutí boxu,
  • reboot do Android, 
  • zálohování *ELEC před uspáním,
  • ...
*) Tohle nelze bez dalšího použít v případech, kdy v *ELEC běží kromě Kodi i další aplikace. Například Tvheadend, wg++, apod. Lze samozřejmě vyřešit i tuhle situaci, ale už je to o chlup složitější.
Drobné vylepšení, trochu jsem to učesal, přidal tam "hafo" notifikací a zápisů do systémového logu. Není to samozřejmě nutné, ale protože to dělám pro kamaráda, který to tak chce, tak to tak má. Tak jsem to všechno alespon udělal vypínatelné. Teď jsou funkce následující:
  • Box je zapnutý:
    • 1x stisk - přímé uspání boxu/*ELEC
    • 2x stisk - zobrazení ShutdownMenu v Kodi
    • 3x stisk - restart Kodi
    • 5x stisk - reboot boxu/*ELEC
  • Box je uspaný/vypnutý:
    • 1x stisk - probuzení/spuštění boxu/*ELEC