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”.

Installer Marlin 2.0.7.2 sur la Creality CR-10

Je possède une Creality CR-10 depuis plusieurs années, suite à des problèmes techniques et diverses pannes j’y ai fais de nombreuses modifications.

Ma Creality CR-10 possède entre autre une carte mère et un écran de CR-10S. Lors de l’installation de la carte mère j’avais flashé Marlin 1.9. Récemment j’ai voulu reflasher le firmware pour faire quelques modifs mais impossible de retrouver le fichier source que j’avais utilisé, alors me voilà partie pour flasher Marlin 2.0.7.2 sur ma CR-10.

Première étape : Télécharger Marlin 2.0.x. Ca se passe ici. Ensuite dézipper à l’endroit de sont choix.

Deuxième étape modifier et compiler Marlin. J’ai d’abord testé avec le logiciel Arduino mais un bug m’a empêchée d’aller plus loin. Je me suis donc tournée vers Visual Studio Code.

J’ai utilisé le tutoriel suivant (sans l’installation de Git)

On commence par installer Visual Studio Code (ici)

Une fois VSC installé aller dans les plugins et installer PlatformIO IDE. Surtout bien attendre que PlatformIO soit complètement installé et redémarrer le logiciel.

Dans VSC choisir “Import Arduino Project”, choisir le dossier Marlin précédemment téléchargé et choisir l’environnement “Arduino Mega or Mege 2560 or ATMega 2560 (Mega 2560)”.

Dans le projet aller dans “config” et ouvrir le fichier readme.

Marlin met a disposition tout un tas d’exemple de fichiers de configuration en fonction des machines sur le marché. Il faut aller les télécharger à part. L’adresse est dans ce fichier readme.

Fermer VSC.

Une fois le zip contenant les configs téléchargé, le dézipper dans le dossier Marlin / config. Chercher le dossier Creality, puis CR10S et copier les fichier de configuration.

Coller ces fichiers dans Marlin / Marlin

Ouvrir VSC puis se rendre dans le dossier Marlin / Marlin. Le fichier de configuration fourni par Marlin est quasi parfait pour ma CR10.

J’ai seulement modifié les points suivants dans Configuration.h :

  1. Activer “//#define PIDTEMPBED” en supprimant les //
  2. #define DEFAULT_MAX_FEEDRATE { 500, 500, 100, 25 } au lieu de { 2500, 2500, 100, 25 }
  3. Désactiver #define FILAMENT_RUNOUT_SENSOR (je n’en ai pas)

J’ai fais les modifications suivantes dans Configuration_adv.h :

  1. #define WATCH_BED_TEMP_PERIOD 120// Seconds

Une fois les modifications faites on lance le build en appuyant sur l’icone build dans la barre bleue en bas de VSC. L’opération se fait et le firmware est disponible dans le dossier Marlin sous .pio/build/mega2560/. C’est le fichier firmware.hex

Reste ensuite à le flasher sur la CR-10. Pour cela j’ai utilisé octoprint et le plugin Firmware update. Les explications pour configurer Firmware Update sont ici.

Une fois que tout est prêt, connecter la CR-10 à Octoprint pour s’assurer que tout va bien. La déconnecter. Se rendre dans le menu du plugin Firmware Update. Choisir le fichier firmware.hex et flasher.

Après quelques minutes, le firmware est flashé dans la machine et il n’y a plus qu’à l’utiliser.

Je conseille une fois le firmware modifié de calibrer l’extrudeur, le pid, le débit du filament puis les mouvements des axes pour que tous les paramètres soient adaptés à l’imprimante.

Le site Aide et ressources en français pour imprimantes 3D Artillery (docarti.fr) explique tout ça très bien. C’est un site dédié à mon autre imprimante la Sidewinder X1 mais ces explications sont parfaitement adaptables à la Creality CR-10.

Une fois que l’étape de calibration est faite il n’y a plus qu’à s’amuser.

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.