Installation d’un home-cinema 4K avec Kodi Plex

Suite à la fermeture des cinémas, nous nous sommes lancés dans un projet qui nous tenait à coeur : la mise en place d’un « vrai » cinéma à la maison « home cinema ». C’est à dire, un video projecteur avec une vrai toile, un bon son et une installation confortable. Et même en bonus les M&ms 🙂

Analyse préalable de notre collection de films

Nous possédons une belle collection de film d’origines diverses et des abonnements à différents services de replay

  • Des blu-ray au format « standard » 1080p 24p, et en E-AC3, et des blu-ray 4K rippée au format MKV sous Plex.
  • Des DVD vidéos au format … DVD, 480p 24p, AC3. Rippée aussi au format MKV sous Plex.
  • Des abonnements à Disney+, Amazon Prime (donc, des films en 4K, 1080p)
  • Sans compter les replay divers et variés… et les enregistreur videos sur la TNT de Plex.
Une partie de notre collection …

Une remarque intéressante : les vidéos sont souvent au format 24p. Donc dans l’idéal, il faut un video projecteur le supportant pour éviter les effets de judder.

Judder ? Késako ?

Les films cinémas sont enregistrés bien souvent à 24 images / secondes. Mais pour être diffusé sur la télé ou des vidéoprojecteur 50Hz ou 60Hz, la TV va insérer des images mais pas tout le temps, et cela donne un effet de non fluidité aux mouvements rapides. Je ne vais pas rentrer dans les considérations techniques : Voir cette vidéo YouTube de la chaîne RTings (en anglais).

Le vidéoprojecteur n’aura pas de souci s’il gère une fréquence d’affichage en multiple de 24. En 120Hz ou 240Hz ce problème n’existe pas.

Pour la diffusion des vidéos, soit le vidéoprojecteur permet directement de décoder les différents formats, soit il vaut mieux utiliser un matériel dédié. Après une loooooongue analyse nous en avons conclus que la partie video devait être dédié à la vidéo, et non pas au décodage. Il s’agit essentiellement d’une question de chauffage : le videoprojecteur chauffe beaucoup et rajouter un processeur graphique dans un emplacement surchauffée est tout sauf une bonne idée. En gros : ça rame pour éviter que ça chauffe ! On alors faut payer une fortune… Sans compter le suivant de l’OS inexistant de ce genre de matériel.

Deux possibilités sont apparues :

  • Soit utiliser un mini-pc (type Mi Box android, ou type intel nuc sous windows 10) relié à bon videoprojecteur.
  • Soit utiliser un téléphone android permettant la diffusion via un cable USB-C vers HDMI, ou des clés Android (Google Chromecast, Amazon Fire TV stick, Nvidia Shield)

Nous avons exclus la seconde possibilité car elle ne permettent pas de brancher un lecteur Blu-Ray. Mais si vous n’en avez pas besoin, c’est une solution tout à fait valable. Attention tout de même : tous les Chromecast ne supportent pas le 24p!

Notre matériel

Un Mini PC : de marque AcePC, BT 4.2, WiFi 5G, Gigabit, un disque mSSD, des ports USB3, 8G de ram et décodage de la 4K en hardware.

Le videoprojecteur : un Vankyo fourni avec son écran de projection, acheté sur AliExpress, il supporte les flux en 24p, 50hz 60hz, 1080p et 4K

Une manette Bluetooth pour utiliser Kodi

Au niveau du son, en attendant mieux, nous avons deux grosses enceintes Bose (stéréo, donc)

Pour l’écran, nous avons fabriqué un cadre peint en noir et attaché la toile avec des agrafes, bien tendue. Pour tester le tout, nous avons utilisé un chromecast ultra (4K certes, mais pas 24p…)

Le rendu avant configuration logiciel

Configuration préalable du MiniPC

  1. Créer un compte dédié à la vidéoprojection
  2. Ajouter l’autologon pour ce compte : voir l’aide en ligne de Microsoft sur le sujet :

Configurer Windows pour automatiser la logon – Windows Server | Microsoft Docs

Autologon – Windows Sysinternals | Microsoft Docs

Configuration préalable de Kodi sur windows 10

  1. Télécharger et installer Kodi
  2. Installer l’extension PlexKodiConnect : suivre la procédure d’installation du github : Installation · croneter/PlexKodiConnect Wiki · GitHub
  3. Paramètre Kodi pour basculer en 24p automatiquement l’écran : Voir l’aide en ligne Settings/Player/Videos – Official Kodi Wiki. Le réglage dans notre cas a été positionné sur « on start / stop » qui permet de basculer en 60Hz dans les menus de Kodi et en 24p dans les films.

Démarrer Kodi automatiquement lors de l’ouverture de session

Kodi ne se lance pas tout seul au démarrage de la session windows 10 : il faut ajouter un petit programme compagnon appelée Launcher4Kodi :

XBMCLauncher / Launcher4Kodi – All in One Tool for Change Shell, Set Focus and more

Plugins de streaming (Disney+, Amazon Prime etc.)

Disney+

  • Ouvrir Kodi, ouvrir les Settings, puis File Manager
  • Double cliquer sur Add Source et sélectionner None. Valider le message si nécessaire.
  • Coller le lien suivant dans la barre d’adresse et la nommer SlyGuy
http://k.slyguy.xyz
  • Revenir au menu principal de Kodi, sélectionner le menu add-on. Cliquer sur Package installer, puis Install from Zip file. Rechercher puis installer SlyGuy
  • Ensuite, il faut se rendre dans le repository SlyGuy, et chercher Disney+ dans la liste des Add-ons vidéos et l’installer puis le configurer.
  • Lors du premier lancement d’une vidéo, Kodi va vous demander d’installer le plugin « InputStream Adaptative » et le codec Widevine, qui sont absolument nécessaires pour lire des videos protégées par DRM.

Amazon Prime Video

Quasiment le même principe, mais il faut aller chercher le repository et l’installer « à la main » depuis le github suivant :

Release Plugin Repository v1.0.3 for Leia and v1.0.0 for Matrix · Sandmann79/xbmc · GitHub

Ce projet nous a permis pour l’instant de profiter agréablement d’un certains nombre de films « presque comme au cinéma ».

Pour le futur, nous avons des évolutions prévues :

  • L’ajout du lecteur Blu-Ray USB, le tout relié avec Kodi. Tests à venir 🙂
  • Intégration d’Alexa à Kodi …en français
  • L’installation d’une vraie toile de cinéma électrique
  • Installation d’un son home-cinema..

Routeur OpenWrt et flux multiposte Freebox

Free propose d’accéder à des flux multipostes via l’URL suivante, utilisable via VLC media player

http://mafreebox.freebox.fr/freeboxtv/playlist.m3u

Mais si l’on utilise un routeur openwrt entre la freebox et les postes clients, cela ne fonctionne pas directement… Il faut installer un paquet supplémentaire pour réaliser la redirection des flux RTSP du protocole TV.

Première étape : installer le paquet kmod-ipt-nathelper-rtsp supplémentaire. Soit via luci :

Menu system>Software

Soit en se connectant en SSH au routeur :

opkg install kmod-ipt-nathelper-rtsp

Il faut ensuite activer l’option dans /etc/systctrl.conf

On ajoute la ligne

 net.netfilter.nf_conntrack_helper=1 

Et on valider l’option

sysctl -p

Récupérer les informations de pollens.fr dans HomeAssistant

Cet article a pour objectif de combler un petit manque de HomeAssistant par rapport à Jeedom : l’affichage des valeurs de pollens.fr pour les afficher dans une carte et permettre de réaliser des alertes personnalisées.

Comme pour Jeedom, les données sont issues du site pollens.fr. Je me suis également imposé comme contrainte d’éviter de faire 20 appels au site et surcharger inutilement.

La méthode est de créer un ensemble de sensors en une seule fois.

Première action : récupérer l’adresse du JSON de pollens.fr adapté à votre département en remplaçant XX par le numéro du département:

https://www.pollens.fr/risks/thea/counties/XX

Ensuite, il faut créer les sensors en YAML dans le fichier configuration.yaml … ou autre fichier .yaml, cela dépend de votre configuration. A noter que la mise à jour ne sera faite que toutes les 43 200 secondes, soit … 12h. On peut augmenter si on le souhaite pour ne le faire qu’une fois par jour.

J’ai positionné une icône de fleur qui vient de material design. Elle devrait fonctionner dans toutes les dernières versions de HomeAssistant. https://pictogrammers.github.io/@mdi/font/5.3.45/

sensor:
  - platform: rest
    name: Pollens
    resource: https://www.pollens.fr/risks/thea/counties/XXXX
    json_attributes:
      - risks
      - riskLevel
    value_template: '{{ value_json.riskLevel }}'
  - platform: template
    sensors:
      pollens_risks_tilleul:
        friendly_name: Tilleul
        value_template: '{{ states.sensor.Pollens.attributes["risks"][0]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_ambroisie:
        friendly_name: Ambroisie
        value_template: '{{ states.sensor.Pollens.attributes["risks"][1]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_olivier:
        friendly_name: Olivier
        value_template: '{{ states.sensor.Pollens.attributes["risks"][2]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_plantain:
        friendly_name: Plantain
        value_template: '{{ states.sensor.Pollens.attributes["risks"][3]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_noisetier:
        friendly_name: Noisetier
        value_template: '{{ states.sensor.Pollens.attributes["risks"][4]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_aulne:
        friendly_name: Aulne
        value_template: '{{ states.sensor.Pollens.attributes["risks"][5]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_armoise:
        friendly_name: Armoise
        value_template: '{{ states.sensor.Pollens.attributes["risks"][6]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_chataignier:
        friendly_name: Châtaignier
        value_template: '{{ states.sensor.Pollens.attributes["risks"][7]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_urticacees:
        friendly_name: Urticacées
        value_template: '{{ states.sensor.Pollens.attributes["risks"][8]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_oseille:
        friendly_name: Oseille
        value_template: '{{ states.sensor.Pollens.attributes["risks"][9]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_graminees:
        friendly_name: Graminées
        value_template: '{{ states.sensor.Pollens.attributes["risks"][10]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_chene:
        friendly_name: Chêne
        value_template: '{{ states.sensor.Pollens.attributes["risks"][11]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_platane:
        friendly_name: Platane
        value_template: '{{ states.sensor.Pollens.attributes["risks"][12]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_bouleau:
        friendly_name: Bouleau
        value_template: '{{ states.sensor.Pollens.attributes["risks"][13]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_charme:
        friendly_name: Charme
        value_template: '{{ states.sensor.Pollens.attributes["risks"][14]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_peuplier:
        friendly_name: Peuplier
        value_template: '{{ states.sensor.Pollens.attributes["risks"][15]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_frene:
        friendly_name: Frêne
        value_template: '{{ states.sensor.Pollens.attributes["risks"][16]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_saule:
        friendly_name: Saule
        value_template: '{{ states.sensor.Pollens.attributes["risks"][17]["level"] }}'
        icon_template: mdi:flower
      pollens_risks_cypres:
        friendly_name: Cyprès
        value_template: '{{ states.sensor.Pollens.attributes["risks"][18]["level"] }}'
        icon_template: mdi:flower
    # Request every 12 hours
    scan_interval: 43200

Bien penser à redémarrer après la modification du fichier YAML pour que HomeAssistant ajoutent les nouveaux sensors .

Ensuite, il faut créer une carte spéciale de type entity-filter pour n’afficher que les valeurs de pollens non vide.

type: entity-filter
entities:
  - sensor.pollens_risks_tilleul
  - sensor.pollens_risks_ambroisie
  - sensor.pollens_risks_olivier
  - sensor.pollens_risks_plantain
  - sensor.pollens_risks_noisetier
  - sensor.pollens_risks_aulne
  - sensor.pollens_risks_armoise
  - sensor.pollens_risks_chataignier
  - sensor.pollens_risks_urticacees
  - sensor.pollens_risks_oseille
  - sensor.pollens_risks_graminees
  - sensor.pollens_risks_chene
  - sensor.pollens_risks_platane
  - sensor.pollens_risks_bouleau
  - sensor.pollens_risks_charme
  - sensor.pollens_risks_peuplier
  - sensor.pollens_risks_frene
  - sensor.pollens_risks_saule
  - sensor.pollens_risks_cypres
state_filter:
  - operator: '>'
    value: 0
card:
  type: glance
  title: Pollens

Et voilà une jolie carte

Une amélioration possible serait de rajouter un code couleur pour que l’icône soit jaune ou rouge selon le niveau, mais il faudrait prendre en compte le thème pour que cela reste « lisible ».

Contrôleur bandeau LED WiFi Magic Home Pro et Jeedom

Suite à un achat pour ajouter une lumière décorative à un bureau, j’en ai profité pour commander un contrôleur WiFi de bandeau LED. Celui-ci (chinois…) fonctionne avec l’application MagicHomePro.

Ce type de contrôleur est géré dans Home-Assistant via une librairie python « flux_led ». A priori, cela serait également géré par un plugin jeedom WiFilightV2 (payant). Mais impossible de savoir avant s’il est bien géré car le plugin ne gère que les contrôleurs RGBW/RGBWW. Evidemment, le mien n’est que RGB…

Installation préalable et configuration hors jeedom

  1. Installer le bandeau LED physiquement, faire le collage, les pliages éventuels
  2. Configurer le contrôleur de bandeau LED avec l’application Magic Home PRO. Le mode local est suffisant.
  3. Fixer l’adresse IP du contrôleur de bandeau LED dans votre routeur.

J’ai l’avantage d’avoir un routeur sous openwrt. J’ai donc décider de donner un nommage fixe à mon bandeau led, cela me sera utile plus tard. Mon bandeau led est nommé « bandeau-led-1.lan« . Si ce n’est pas le cas, pensez bien à noter l’adresse IP de votre (vos) bandeaux leds.

Configuration jeedom

Se connecter sur jeedom via ssh (puTTy, mobaxterm) pour installer les modules python3 flux_led et webcolors.

sudo pip3 install flux_led
sudo pip3 install webcolors

On en profite pour tester l’allumage (-1) et l’extinction du bandeau led (-0) via la ligne de commande. C’est une étape indispensable, si cela ne fonctionne pas, impossible de contrôler votre bandeau avec jeedom…

flux_led bandeau-led-1.lan -1
flux_led bandeau-led-1.lan -0

Voir l’aide de flux_led pour les autres paramètres éventuels

Par exemple, on peut une fonction de changement de couleur (en rouge)

flux_led bandeau-led-1.lan -c "#FF0000"

En l’état actuel on peut déjà utiliser le plugin script pour exécuter les commandes On / Off, et changement de couleur.

Pour cela, depuis le plugin script on crée un nouvel équipement, et dans l’onglet commandes on crée 3 commandes distinctes de type script

  • Une commande action « On » avec la requête flux_led bandeau-led-1.lan -1
  • Une commande action « Off avec la requête flux_led bandeau-led-1.lan -0
  • Une commande action « Color » de type action/couleur avec la commande flux_led bandeau-led-1.lan -c « #color# »

C’est pas mal… Mais il nous manque un retour d’état. Et mauvais point de flux_led, il n’y a pas de commande dans flux_led pour renvoyer l’état…

Mais après tout, comme on a commencé à faire un script, il est temps de passer au niveau 2 : on va créer notre propre script python en faisant appel aux classes de flux_led.

Script de retour d’état

Pour créer un script depuis jeedom, rien de plus simple. On crée une nouvelle commande (Etat) depuis l’équipement de type script info / numérique. Oui, numérique, impossible d’utiliser le retour binaire dans Jeedom… Dans la partie requête on clique sur l’icône verte « nouveau ». J’ai nommé mon script valueBandeau.py mais vous pouvez l’appeler comme bon vous semble.

Voilà un exemple de script. Il n’est pas super propre, il faudrait encadrer l’appel à WifiLedBulb avec un try catch et une gestion des erreurs pour renvoyer autre chose… bref… Le script est assez simple, et prend un seul paramètre : l’adresse IP ou nom

!/usr/bin/env python3
 from flux_led import *
 from argparse import ArgumentParser
 def main():
         parser = ArgumentParser(description='Return status of a WiFi LED controler.')
         parser.add_argument('ip',help='IP of WiFi LED controler')
         args = parser.parse_args()
         bulb1 = WifiLedBulb(args.ip)
         bulb1Status = bulb1.isOn()
         if bulb1.isOn():
                 print("1")
         else:
                 print("0")
 if name == 'main':
         main()

Une fois le script sauvegardé, il faut ajouter l’adresse IP ou nom DSLAN en paramètre.

Dans mon cas, cet appel est :

/var/www/html/plugins/script/data/valueBandeau.py bandeau-led-1.lan

Reste ensuite à mettre en place la partie widget. Mais je vous laisse faire ce que vous voulez. Exemple chez moi :

Et voilà, un bandeau LED intégré pour quelques heures de travail.

Xiaomi thermomètre Mija bluetooth LYWSD03 dans jeedom

Suite à une promotion récente dans dealabs je me suis commandé plusieurs petits thermomètres LYWSD03. (Lot de 4 Thermomètres connectés Xiaomi Mijia Bluetooth 2 hygromètre – Dealabs.com)

en vrai ils sont minuscules 😉

Ces thermomètres bluetooth sont très bien gérés dans home assistant et je pensais naïvement que c’était également le cas dans jeedom, vu qu’ils étaient présents dans la Documentation Jeedom. Et même dans le documentation de compatibilité, aucune précision 🙁 Jeedom compatibility

Alors oui, cela fonctionne mais au bout de quelques heures… plus rien. Et la batterie fond comme neige au soleil. C’est de saison…

Heureusement, certains utilisateurs de jeedom ont résolus le problème 🙂

Ces thermomètres utilisent un système de chiffrement avec une clé définie lors de l’appairage à l’application Xiaomi Home.

La méthode pour rajouter (proprement) les LYWSD03 dans Jeedom et de récupérer la clé d’appairage (bind key) via ce flasher web… Si votre PC a une clé bluetooth évidemment.

Telink Flasher (atc1441.github.io)

Dans cette fenêtre, il faut cliquer sur le bouton connect, puis sélectionner l’équipement bluetooth à relier; Ensuite il faut cliquer sur le bouton « Do activation ». La clé qui nous intéresse sera dans le champ « Mi Bind Key »

Attention, cette clé change à chaque activation. Une fois la clé récupérée, il faut donc « déconnecter » le thermomètre de la page. Le plus simple, faire CTRL+ »F5″ pour recharger la page. Si vous avez plusieurs thermomètres, il faut refaire la manipulation en sélectionnant le bon thermomètre.

Une fois ceci fait, il faut aller modifier dans la partie bluetooth de jeedom sur la machine principale. Il faut se connecter en SSH à la machine hébergeant jeedom (Depuis windows : puTTY, mobaxterm).

sudo pip3 install pycryptodomex
cd /var/www/html/plugins/blea/resources/blead/devices/
sudo mv lywsd03.py lywsd03.py.old
sudo cv lywsd03.py_with_bindkey lywsd03.py
sudo nano lywsd03.py

On modifie alors la variable keys en associant chacune des MACS bluetooth avec sa clé d’appairage. La casse de l’adresse MAC n’est pas importante.

MAIS MAIS ce n’est pas fini. Si on a plusieurs antennes bluetooth, il faut réaliser une opération sur chacune des antennes.

  • Si on a déjà configurer les antennes, il faut se connecter à chacune d’entre elles via SSH et installer MANUELLEMENT le fichier pycryptodomex
sudo pip3 install pycryptodomex
  • Depuis jeedom, il faut démarrer le démon des antennes et vérifier qu’elles récupèrent bien le bon fichier lywsd03.py en regardant le contenu du fichier présent dans le fichier
~/blead/resources/blead/devices/lywsd03.py

Si le fichier n’est pas identique, il faut réinstaller / relancer le démon sur chacune des antennes. On peut également relancer le démon en mode debug et vérifier la présence de logs contenant les infos « LYWSD03——Encrypted »