まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

Un Raspberry Pi 2 en MediaCenter

dsc00067.jpg

  • Avec l’avènement du Raspberry Pi2, mon vieux médiacenter, lui-même PC recyclé (P4@2,66GHz) fait pas mal grise mine…

Incapable de lire des vidéo h264 qui dépasse le 720p, bruyant, énergivore (environ 80W), couplé à un vieux poste de télévision cathodique qui consomme aussi pas mal (environ 90Watt continu).
Utiliser un RpiPi2 (moins de 5W) donc me permettrait de laisser de côté tous ces inconvénients, cependant j'avais besoin d'une prise HDMI et c'est après avoir récupéré un vieux poste de télévision LCD (HD Ready, 720p et 1080i max, tuner mpeg2 obsolète, 50W en mode éco) que j'ai envisagé de changer mon système de médiacenter.

Entre temps, bonne nouvelle, plus besoin de bidouiller, ma clé wifi TP-Link est désormais reconnue par le kernel des derniers système GNU/Linux désigné pour RpiPi !

  • Voici donc l'histoire d'une migration, ou plutôt d'une lente progression…

1 - Choix du système d'exploitation :

À ma connaissance il y a deux possibilités, utiliser Raspbian Lite et à la main installer le logiciel médiacenter Kodi et tout le reste; Ou alors utiliser une distribution dédiée telle que Openelec ou RaspBMC. La première solution serait calquée sur ma démarche avec l'ancien médiacenter, mais puisqu'on me dit qu'Openelec offrirait de bien meilleures, j'ai donc choisis cette dernière…
Et après une semaine à m'échiner à faire fonctionner le truc, j'ai lâché l'affaire…
Pourtant j'avais réussis à tout faire fonctionner, télécommande, récup de la base, tout ça… sauf une chose, le partage réseau !
Avec ma config je n'ai pas le choix, je suis obligé de passer par un partage ssh, soit en sftp depuis l'interface de Kodi, qui s'évertue à monter ce partage en lecture seule…
Impossible de me rabattre sur le NFS, car mon stockage est chiffré, et NFS ne fonctionne donc pas.
Openelec étant verrouillée de partout, impossible d'installer un soft ou même d'écrire sur le disque, afin de monter un partage sshfs… Merci pour le temps perdu, au revoir !

Donc Raspbian Lite :) Ça je connais, et on va tout faire à la main, quoi de mieux que d'être servis par soit même !??

2 - Installer le Raspbian Lite :

Il existe actuellement 2016-05-10-raspbian-jessie-lite.zip, une version qui est entièrement en ligne de commande, sans environnement de bureau, donc très légère, idéale pour une petite carte SD (environ 800Mio une fois installé)

  • Déployer l'image sur une carte SD depuis un système GNU/Linux, avec la commande DD

(attention, of=/dev/sdx à adapter pour la cible de votre carte SD, en cas d'erreur risque d'effacement d'un disque dur non désiré)

dd bs=4M if=2016-05-10-raspbian-jessie-lite.img of=/dev/sdx; sync
  • Placer la carte SD dans le Raspberry, et le mettre sous tension.

Exécuter raspi-config, et configurer tous les trucs comme on veut, notamment les variables locales (time zone, clavier, etc), et très important, le mémory split pour allouer 512Mo au GPU, sans quoi impossible de lire de la HD 1080 !

raspi-config

Après le reboot, pour rappel :

Login : pi
Pass : raspberry

  • Effectuer les mises à jour :
sudo apt-get install rpi-update
sudo rpi-update
sudo apt-get update
sudo apt-get upgrade
  • Mettre les fichiers temporaires en ram pour économiser sur la durée de vie la la carte SD.
sudo nano /etc/fstab
tmpfs      /tmp		tmpfs	defaults,size=256M	0    0
tmpfs      /var/tmp	tmpfs	defaults,size=256M	0    0
tmpfs      /var/lock	tmpfs	defaults,size=256M	0    0
  • Editer le fichier /etc/network/interfaces et modifier comme suit la section wlan0 :
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "le nom du réseau wi-fi"
wpa-psk "le mot de passe du réseau wi-fi"
  • Relancer ensuite le réseau avec la commande :
service networking restart



3 - Installer Kodi :

sudo apt-get install kodi

Pour lancer Kodi il suffit de taper son nom depuis la console.
Si on veut que Kodi se lance au démarrage du RpiPi2, on peut éditer le fichier /etc/default/kodi, et le renseigner comme suit :

# Set this to 1 to enable startup
ENABLED=1

# The user to run Kodi as
USER=pi

# Adjust niceness of Kodi (decrease for higher priority)
NICE=-5

Sauf que… Pour une raison que j'ignore, une fois le RpiPi2 redémarré, Kodi doit se trouver dans un profil incomplet, car par exemple, son menu d'arrêt ne comporte qu'une seule entrée (exit), au lieu des 3 ou 4 habituelles (exit, reboot, shutdown…)
Ça c'est pas cool, surtout quand on constate qu'en lançant Kodi manuellement ce menu se retrouve bel et bien complet !
Encore un truc pas sec… alors on va faire les choses autrement !

  • On va configurer le login automatique de l'utilisateur sur le RpiPi2[1] en créant un autologin dans systemd :
sudo nano  /etc/systemd/system/getty@tty1.service.d/autologin.conf
  • Le remplir avec ceci :
# Systemd : logue automatiquement la console tty1 avec l utilisateur arcade
[service]
ExecStart=
ExecStart=-/sbin/agetty --autologin arcade --noclear %I 38400 linux
  • Puis enfin lancer ces deux commandes :
sudo systemctl enable getty@tty1.service
sudo sed -i -e "s/sbin\/agetty/sbin\/agetty -a arcade/g" /etc/systemd/system/getty.target.wants/getty@tty1.service
  • Au redémarrage du RpiPi2 plus besoin de se loguer, reste donc à lancer Kodi en éditant le fichier .profile :
nano ~/.profile
  • Et ajouter les lignes suivantes à la fin :
tty=`tty`
# Start Kodi only if login in tty1
if [ $tty = '/dev/tty1' ]; then
        kodi
fi



4 - Montage automatique du partage réseau ssh :

On va utiliser simplement le fstab, et s'arranger pour que le mot de passe ssh ne soit pas demandé.

  • Installation de sshfs :
sudo apt-get instal sshfs
  • Création d'une paire de clés publiques/privées pour l'utilisateur sur le client (le RpiPi2) :

fstab est géré par l'utilisateur root, c'est donc des cléf de celui-ci dont on a va avoir besoin, pour spécifier cela on utilise sudo :

sudo ssh-keygen -t rsa

Laisser le chemin par défaut (/root/.ssh/id_rsa) et laisser la demande de passphrase vide.

  • Copier ensuite la clé publique sur le serveur (la machine ou se trouve le stockage) :
sudo ssh-copy-id -i /root/.ssh/id_rsa.pub -p N°-de-port MONLOGIN@IP-du-serveur
  • Éditer le fstab :
sudo nano /etc/fstab
  • Et ajouter cette ligne :
sshfs#MONLOGIN@IP-du-serveu:/répertoire/distant    /hone/pi/video    fuse    port=N°-de-port,user,noatime,allow_other,_netdev    0    0
  • Ne pas oublier le créer le dossier ~/video :
mkdir /home/pi/video

Et vérifier en montant le contenu de fstab :

sudo mount -a



infrarougeRPI_bb.png

5 - La télécommande infra-rouge :

Jusqu'à présent j'utilisais une télécommande de récupération, couplée à un récepteur infra-rouge connecté sur une entrée de la carte son d'un vieux PC.
Je me suis dit, cette fois-ci, on va utiliser les nouvelles techno, et grâce au HDMI CEC je vais pouvoir piloter le médiacenter exécuté sur le RpiPi2, avec la télécommande de la TV !
Mais en fait non, le téléviseur n'est pas compatible avec cette norme, il faut donc passer par un récepteur infrarouge connecté sur un GPIO. Ici j'ai câblé le GPI018.

  • Installer le soft de gestion de l'infrarouge :
sudo apt-get install lirc
  • Éditer hardware.conf pour régler les paramètres de LIRC :
sudo nano /etc/lirc/hardware.conf
  • Faire correspondre le contenu à ceci :
########################################################
# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"
# Don't start lircmd even if there seems to be a good config file
# START_LIRCMD=false
# Don't start irexec, even if a good config file seems to exist.
# START_IREXEC=false
#Try to load appropriate kernel modules
LOAD_MODULES=true
# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""
########################################################
  • Activer le module sur le RpiPi2 en éditant config.txt
sudo nano /boot/config.txt
  • Dé-commenter la ligne (sans autre argument, c'est le GPIO18 qui sera écouté par le module, sinon pour par exemple le GPIO23, on indiquera dtoverlay=lirc-rpi,gpio_in_pin=23) et redémarrer le RpiPi2.
dtoverlay=lirc-rpi
  • Pour tester si les commandes infrarouge sont bien reçues :
sudo killall lircd
sudo mode2 -d /dev/lirc0
  • À chaque appuie sur une touche de la télécommande, devrait s'afficher ce genre de truc :
space 1223
pulse 281
space 1193
pulse 350
space 1199
pulse 264
space 1901
  • Bien, maintenant on va identifier la télécommande et associer chacun de ses boutons à une touche du clavier. Le programme va demander d'appuyer anarchiquement sur toutes les touches, puis de nommer les touches une à une. La syntaxe à respecter pour les noms est disponible en exécutant :
irrecord --list-namespace

Il est temps de procéder :

sudo irrecord -d /dev/lirc0 /etc/lirc/lircd.conf

J'ai choisis ces touches du clavier, qui correspondent aux raccourcis clavier les plus utile de Kodi, pour la simple raison que ça fonctionnera directement ! Pas la peine de configurer quoi que ce soit dans Kodi !

KEY_Up
KEY_Down
KEY_Right
KEY_Left
KEY_Enter
KEY_C (click droit)
KEY_PageUp
KEY_Esc (retour menu principal)
KEY_Back (retour menu précédent)
KEY_Rewind
KEY_Stop
KEY_PlayPause
KEY_FastForward

  • Reste à redémarrer le service LIRC
sudo /etc/init.d/lirc restart
  • Un moyen simple de savoir si ça marche, c'est de simplement appuyer sur les touches de la télécommande, ça devrait agir dans la console GNU/Linux !

Par exemple la touche correspondant à KEY_C affichera le caractère C, normal quoi, puisque LIRC permet ainsi d'assigner l'entièreté des touches du clavier, et plus encore.
Voici le contenu de lircd.conf, il est toujours temps de le modifier au besoin !

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.1-git(default) on Wed Jul 20 22:41:05 2016
#
# contributed by
#
# brand:                       lircd.conf
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

  name  lircd.conf
  bits           15
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  one           304  1799
  zero          304   746
  ptrail        304
  gap          66906
  toggle_bit_mask 0x0

      begin codes
          KEY_Up                    0x43AA 0x4055
          KEY_Down                    0x4012 0x43ED
          KEY_Right                    0x406E 0x4391
          KEY_Left                    0x43AE 0x4051
          KEY_Enter                    0x412A 0x42D5
          KEY_C               0x42BE 0x4141
          KEY_PageUp                    0x409E 0x4361
          KEY_Esc                    0x4072 0x438D
          KEY_Back                    0x3ECE 0x3D31
          KEY_Rewind                    0x404A 0x43B5
          KEY_Stop                    0x424A 0x41B5
          KEY_PlayPause                    0x414A 0x42B5
          KEY_FastForward                    0x434A 0x40B5
      end codes

end remote

Au lancement de Kodi la télécommande devrait fonctionner Si ce n'est pas le cas, ressortir et vérifier que le processus lircd tourne bien.

ps -A | grep lirc



6 - Migration de base de données :

  • Toute la configuration de Kodi est bien rangée dans le dossier caché .kodi dans le home de l'utilisateur.

J'ai donc récupéré le dossier de mon ancien médiacenter afin de le copier sur le nouveau.
Oké donc après redémarrage du RpiPi2, j'ajoute ma source de vidéos, je navigue avec ma télécommande parmi les fichiers média, et … haaaa mais non, où sont passés les status lu/non-lu des fichiers ??? Tout est vierge !
Le dossier .kodi/userdata/Databases est pourtant bien en place…
Ho, une nouvelle base MyVideo93.db a été crée, la mienne MyVideo99.db a été ignorée semble t'il !
Qu'à cela ne tienne, je renomme la mienne en MyVideo93.db :)
Toujours rien, et cette fois le message d'erreur suivant apparait dans le log Kodi : .kodi/temp/kodi.log

10:51:06 9.596940 T:1967722496 ERROR: Can't open the database MyVideos93 as it is a NEWER version than what we were expecting?

Après beaucoup de temps à trifouiller la configuration de Kodi, j'ai fini par comprendre le truc…
Les bases utilisées par Kodi (par défaut des bases SQLite, extention .db stockée dans .kodi/userdata/Databases) sont incompatible pour la simple raison que le Kodi du vieux PC Pentium4 est plus récent (KODI 16.0) que celui du RpiPi2 (KODI 15).
Impossible de downgrader, me voilà bien embêté…

  • Pour résumer en une ligne : Sur le vieux PC médiacenter la base en V16 stokée dans ~/.kodi/userdata/Database/MyVideo99.db est incompatible avec la base sur le RpiPi2 en V15 stokée dans ~/.kodi/userdata/Database/MyVideo93.db.
  • Je veux pourtant récupérer les données de cette base, surtout les fichier lu/non-lu, alors j'ai procédé ainsi :
  • Installer les outils sur un ordinateur :
sudo apt install sqlite3 sqlitebrowser
  • Ouvrir la base en V16 (celle qui contient les données) : MyVideo99.db
sqlite3 MyVideos99.db
  • Dumper une à une les tables depuis SQLite en format SQL pour sauvegarder la structure.

Première commande, rediriger la sortie vers un fichier puis dumper la table depuis SQLite :

sqlite> .output bookmark.sql
  • Seconde commande, dumper :
sqlite> .dump bookmark
  • Faire de même pour les tables : files, path, settings, streamdetails.

On a donc sous la main les fichiers : bookmark.sql, files.sql, path.sql, settings.sql, streamdetails.sql.

  • À la fin on quitte :
sqlite> .quit
  • Ensuite on va importer ces données dans la base en V15 : MyVideo93.db

Ouvrir la base :

sqlite3 MyVideos93.db
  • Tout d'abord effacez la table de la base:
sqlite> drop table bookmark;
  • Puis lire le fichier sauvegardé:
sqlite> .read bookmark.sql
  • Pour vérifier que la table s'est bien importée.
sqlite> select * from bookmark;

Faire de même pour les tables : files, path, settings, streamdetails.

  • À la fin on quitte :
sqlite> .quit

Ok, mais ce n'est pas tout, car une fois la base MyVideo93.db mise en place sur le RpiPi2, toujours rien dans le dossier des vidéos, les status lu/non-lu ne remontent pas…
J'ai fini par comprendre qu'il s'agissait d'un problème avec les chemins utilisés sur l'ancien PC médiacenter qui étaient bien différents sur le nouveau RpiPi2, et que donc il fallait le mettre en conformité avec ce dernier dans la table path.
Sur la base MyVideo93.db, le seul path qui apparaissait était donc : /home/makoto/video/

  • Il suffirait de remplacer tout les anciens path par ce nouveau.

On peut le faire à la main avec le logiciel sqlitebrowser, ou alors par la ligne de commande :

sqlite3 MyVideos93.db
  • La commande va rechercher/remplacer le chemin /home/makoto/video/ par le nouveau !
UPDATE path SET strPath = REPLACE(strPath,'/home/makoto/video', '/home/pi/video');
  • À la fin on quitte
sqlite> .quit

Voilà c'est terminé, une fois la base rangée sur le RpiPi2 à sa place .kodi/userdata/Database/MyVideos93.db je constate que les status lu/non-lu sont tous présents :) Ouf !!!

Ressources :

http://blog.dorian-depriester.fr/linux/raspberry/utiliser-une-telecommande-infrarouge-pour-controler-xbmc
http://kodi.wiki/view/Keymaps
http://kodi.wiki/view/LIRC
http://wiki.openelec.tv/index.php/Guide_To_lirc_rpi_GPIO_Receiver
http://bornslacker.com/raspberry-pi-with-openelec-part-2/
https://anderson69s.com/2015/08/04/raspberry-pi-dupliquer-sa-telecommande-ir/
http://info.geekitude.fr/kodi/accueil
http://www.geekmag.fr/kodi-deplacer-le-profil-et-ses-donnees/
https://doc.ubuntu-fr.org/sqlite#inserer_des_valeurs_dans_la_table
http://kodi.wiki/view/HOW-TO:Update_SQL_databases_when_files_move

Note

[1] Note : je n'ai pas testé le login automatique via « raspi-config »

Commentaires

1. Le mercredi, 17 août 2016, 13:39 par muadeeb

Bonjour,
Tu avais aussi OSMC qui est une Raspbian "lite" optimisée pour Kodi, mois fun que le "home-made", mais LIRC fonctionne "out of the box", il y as peu de paquets a installer via apt pour faire fonctionner Hyperion.
Via SSH tu prend le contrôle à distance avec en login : osmc et en mdp : osmc

2. Le mercredi, 17 août 2016, 20:26 par Makoto

Oké, je testerais ça, merci ! ^^

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet