vendredi 31 janvier 2020

Retrogaming: quelques scripts RecalBox basiques et comment je les utilises

En fait, dans cet article (...court ;-) je mets juste quelques scripts super simple pour vous montrer ce que cela peut apporter à Recalbox de faire des scripts python ou shell... et cela peut aussi vous donner des idées pour vous par la suite...

1) Un script pour refaire ma collection :

En fait quand je modifie les règles du script "gamelistpower" comme présenté ici, je dois changer d'abord en SSH le contenu du fichier rules_gensh.xml donc j'ai fait un script que je peux lancer juste après et qui me relance EmulationStation, parce que je ne veux pas le faire à partir du menu collections, je trouve cela risqué si on fait une fausse manip ;-(.

Donc le voici:

#!/bin/sh
#authorize read/write
mount -o remount,rw /
#go to gamelistpower
cd /recalbox/scripts/gamelistpower
#launch to recreate collection (if neww roms or if you have new rules from rules_gensh.xml) 
python gamelistpower.py generate_sh info
#restart emulationstation (it's enough, no need to reboot in this case ;-)
curl -H "Content-Type: application/json" -X POST "http://recalbox/post?action=reboot-es"

Dans mon cas, je ne reboot pas, pas besoin, je relance EmulationStation via le manager de Recalbox en appelant l'API.

2) J'ai aussi un script encore plus simple pour sauvegarder dans le cloud manuellement avant d'attendre la fin d'un reboot ou d'une extinction du raspberry pi :

edit 23-02-2020: j'ai amélioré le script pour mieux gérer si pas de connexion internet (j'essai 3 fois ;-)


#!/bin/bash
# check that is online to run the first sync command
COUNTER=0
while [ $COUNTER -lt 3 ]
do
        #echo "loop counter is equal to: $COUNTER"
        if [[ "$(ping -c 1 8.8.8.8 | grep ' 0% packet loss' )" == "" ]]; then
                echo "Internet isn't present"
        else
                echo "Internet is present"
                # Run the command that will execute only once at the start
                /usr/bin/rclone copy /recalbox/share/saves/ remote:saves &
                wait $!
                break
        fi
        COUNTER=$[$COUNTER+1]
done

J'ai fait ces script pour les appeler avec Alexa via  ma domotique Jeedom à terme. Ainsi je peux les utiliser avec jeedom et en utilisant le plugin SSH :




Donc voilà, je l'avais dis, c'est simple mais avec de simple script piloté via un plug-in SSH, on peut faire pleins de chose et même le piloter à la voix avec Alexa par exemple.

Il faudra un jour que je vous explique comment je fais cela mais cela sera dans un autre article, désolé :-(

3) Un script python de "test" maintenant pour savoir le nombre de joueur max pour un jeu lancé ;-)... vous verrez plus tard que c'est bien utile pour mon projet de panel arcade 4 joueurs...

A mettre dans le repertoire /recalbox/scripts/gamelistpower pour bénéficier de cette librairie de script ;-) :


#!/usr/bin/env python

#IMPORT STD---------------------------------------------------------------------

import os.path

import sys

import time

import shutil

import argparse

from os.path import basename, splitext

from threading import Thread



#IMPORT NORDICPOWER------------------------------------------------------------                           

from glplib import *



#CONSTANTS---------------------------------------------------------------------                           

VERSION='0.0.1 BETA 26/01/2020'

SOURCE_NAME='BozoTheGeek'



#------------------------------------------------------------------------------                           

#---------------------------------------- MAIN --------------------------------                           

#------------------------------------------------------------------------------

def main():

  #Init Log

  logger=Logger.logr

  #if args.log==ARG_LOG_DEBUG:

  Logger.setLevel(logging.DEBUG)

  #elif args.log==ARG_LOG_INFO:

  #       Logger.setLevel(logging.INFO)

  #elif args.log==ARG_LOG_ERROR:

  #       Logger.setLevel(logging.ERROR)

  Logger.add_handler_console()
 

  #Chargement XML avec MiniDom :-<

  #test 1 OK

  #System = 'mame'

  #FullRomLocation = '/recalbox/share/roms/mame/outrun.zip'

  #test 2 OK

  #System = 'n64'

  #FullRomLocation = '/recalbox/share/roms/n64/Legend\ of\ Zelda,\ The\ -\ Majora\'s\ Mask.z64'

  #test 3 OK

  #System = 'megadrive'

  #FullRomLocation = '/recalbox/share/roms/megadrive/Sonic\ \&\ Knuckles\ \(World\).zip'

  #test 4 OK

  #System = 'snes'

  #FullRomLocation = '/recalbox/share/roms/snes/Tiny\ Toon\ Adventures\ -\ Wild\ \&\ Wacky\ Sports\ \(Europe\)\ \(Beta\).zip'

  #test 5 OK

  #System = 'neogeo'

  #FullRomLocation = '/recalbox/share/roms/neogeo/mslug3b6.zip'   

  RomsDirectory = FullRomLocation.split(System)[0]

  Rom = FullRomLocation.split(System)[1]

  #to remove \ if necessary

  Rom = Rom.replace("\\","")

  gamesList = GamesList()


  gamesList.import_xml_file(RomsDirectory + System + os.sep + NOM_GAMELIST_XML,True)

  logger.info('OK, file imported:' + RomsDirectory + System + os.sep + NOM_GAMELIST_XML)

  logger.info('Rom to find : ' + Rom)

  game = gamesList.search_game_by_path ('.' + Rom)

  logger.info('file found, the game name is :' + game.name)

  logger.info('the max number of player is : ' + game.players[-1])


  sys.exit(0)



#---------------------------------------------------------------------------------------------------

if __name__ == '__main__':

  main()

Et voilà, c'est tout pour ce soir, mais bientôt je vais vous expliquer quoi faire de ce script qui compte les joueurs ... (teaser ;-)

Enjoy !

samedi 25 janvier 2020

Retrogaming: Ma méthode pour se faire des "collections" sur Recalbox 6.1.1...

En fait il y a plusieurs manières.... mais celle que je vais sélectionner c'est surtout celle que j'ai réussi à mettre en place et validé avec la version 6.1.1 de Recalbox...

Méthode 1) La manière classique est de venir avec des répertoires et roms supplémentaires avec une architecture de répertoire déjà défini et fait par des passionnés...
Il faut déposer dans le répertoire/partage/support amovible de préférence  //recalbox/share/roms, le repertoire "collections" qui va avoir son propre "gamelist.xml" et ses ROMs par thème dans des répertoires distincts ainsi :


Il faudra aussi copier le fichier un fichier es_systems.cfg modifié dans le  répertoire interne de votre Recalbox ici :  /recalbox/share_init/system/.emulationstation/ mais cette fois en SSH en SFTP parce que cela sera sur la SD et pas accessible à partir du partage.

En général, cela rajoute cela dans la liste des systèmes :


  <system>
    <fullname>COLLECTIONS</fullname>
    <name>snes</name>
    <path>/recalbox/share/roms/collections</path>
        <extension>.smc .sfc .SMC .SFC .zip .ZIP .mgd .MGD .n64 .N64 .z64 .Z64 .v64 .V64 .gb .GB .gbc .GBC .gba .GBA .md .MD .bin .BIN .gen .GEN .smd .SMD .gg .GG .ngc .NGC .ngp .NGP .32x .32X .img .IMG .pbp .PBP .cue .CUE .iso .ISO .ccd .CCD .cbn .CBN .mu3 .MU3 .chd .CHD .cso .CSO</extension>
        <command>python /usr/lib/python2.7/site-packages/configgen/emulatorlauncher.pyc %CONTROLLERSCONFIG% -system %SYSTEM% -rom %ROM% -emulator %EMULATOR% -core %CORE%</command>
        <platform>snes, megadrive, fba_libretro, nes, n64, gb, gbc, gba, sg1000, mastersystem, gamegear, sega32x, segacd, dreamcast, psx, psp, mame, fba, neogeo, ngp, ngpc, lynx</platform>
        <theme>collections</theme>
 <emulators>
     <emulator name="libretro">
         <cores>
      <core>catsfc</core>
      <core>pocketsnes</core>
   <core>snes9x</core>
      <core>snes9x_next</core>
   <core>gpsp</core>
      <core>mgba</core>
      <core>meteor</core>
   <core>gambatte</core>
      <core>tgbdual</core>
      <core>fceunext</core>
      <core>nestopia</core>
            <core>fceumm</core>
      <core>quicknes</core>
            <core>genesisplusgx</core>
      <core>picodrive</core> 
            <core>fba</core> 
            <core>handy</core>
            <core>mednafen_lynx</core> 
            <core>mame2010</core>
            <core>mame078</core>
            <core>imame4all</core> 
            <core>glupen64</core> 
            <core>mednafen_ngp</core> 
            <core>pcsx_rearmed</core>
             
  </cores>
     </emulator>
  <emulator name="mupen64plus">
         <cores>
      <core>gliden64</core>
      <core>n64</core>
      <core>rice</core>
  </cores>
     </emulator>
  <emulator name="fba2x">
        <cores>
          <core>fba2x</core>
        </cores>
      </emulator>
   <emulator name="advancemame">
        <cores>
          <core>advancemame</core>
        </cores>
      </emulator>
    </emulators>
  </system>

Mais j'ai l'impression que cela ne marche plus depuis la version 6 ou 6.1 de Recalbox, mais j'ai peut-être juste pas réussi avec la collection que j'avais :-(

De plus je trouve cela dommage de copier les roms dans un espace particulier quand on a déjà les roms dans les répertoires de chaque système déjà :-(

Méthode 2) donc j'ai cherché une autre méthode.... et finalement j'ai trouvé... il y a un passionné nordicpower qui a fait un truc sympa utilisant un script (gamelistpower) qui filtre par thème en fonction de règle pour faire une collection dynamiquement, mais la contrainte est aussi de mettre à jour es_system.cfg par script en fait mais cela appel dans ce cas des .sh pour lancer les ROMs qui sont dans les répertoires d'origine... (le es_system.cfg se mets à jour par les script mais il y a un petit bug pour l'instant, il faudra rajouter à la main la dernière ligne de ce système surlignée en jaune ci-après)


  <system>
    <fullname>collections</fullname>
    <name>collections</name>
    <path>/recalbox/share/roms/collections</path>
    <extension>.sh .SH</extension>
    <command>%ROM% %CONTROLLERSCONFIG% %RATIO%</command>
    <platform>dreamcast</platform>
    <theme>random</theme>
    <emulators></emulators>
  </system>

sympa mais pas de bol... depuis la 6.1... cela ne marche pas dans tout les cas... si on a un disque amovible USB pour mettre les roms... on ne peut pas utiliser les .SH parce que c'est des exécutables non exécutables/gérables sur du NTFS, FAT32 et EXFAT :-( J'ai essayé de bidouiller Recalbox pour faire passer la commande "chmod +x..." mais sans succès et j'ai fait pleins de truc :-( et même un dev de recalbox a confirmé pour les éxecutables, impossible maintenant donc sur un support amovible :

Michael Baudino authored 
This commit explicitely mounts FAT32, ExFAT and NTFS external devices
with 755 as directory rights and 644 as file rights.

For NTFS and ExFAT, the default before that was 777 (for both files and
directories), which was an issue for dropbear (it's insecure, so
dropbear wouldn't use `~/.ssh/authorized_keys` with 777 rights, thus
disabling key-based SSH login).

More accurately, they use `umask=0` as default. See their man pages.

For FAT32, it was already the default, but the more explicit the better
(and the more futureproof: who knows if default won't change someday).*

Méthode 2 - en bidouillant ;-) J'ai finalement bidouillé les scripts de boot de recalbox (je sais c'est mal :-().
J'ai changé dans un script qui est dans /recalbox/scripts/, c'est le script recalbox-mount.sh
J'ai donc changé les droits (voir le caractère surligné en jaune), pour au lieu de mettre 644 mais 744 sur les fichiers pour que je puisse executer les .sh généré par les scripts (gamelistpower) que je parlais dans la méthode 2 ;-) :


#!/bin/bash

# rbmount [FSTYPE] [RWREQUIRED] [MOUNTDEVICE] [MOUNTPOINT]

print_usage() {
    echo "${0} [FSTYPE] [RWREQUIRED] [MOUNTDEVICE] [MOUNTPOINT]" >&2
}

if test $# -ne 4
then
    print_usage "${0}"
    exit 1
fi

FSTYPE="$1"
RWREQUIRED="$2"
MOUNTDEVICE="$3"
MOUNTPOINT="$4"
FSMOUNTOPT="noatime"
TESTFILE="${MOUNTPOINT}/recalbox.fsrw.test"

# for non vfat and ntfs systems, it's easy
if test "${FSTYPE}" != "vfat" -a "${FSTYPE}" != "ntfs" -a "${FSTYPE}" != "exfat"
then
    if mount "${MOUNTDEVICE}" "${MOUNTPOINT}" -o "${FSMOUNTOPT}"
    then
 exit 0
    fi
    exit 1
fi

# vfat and ntfs

# Set correct access rights (755 for directories, 644 for files) -> change to 744 to permit .sh execution for collections
#   default is 777 for NTFS and ExFAT otherwise (umask=0)
FSMOUNTOPT="${FSMOUNTOPT},fmask=0033,dmask=0022"
.
.
.

Et après il faut rebooter bien sur.... et voilà.

Pour rappel, il faudra exécuter la commande "mount -o remount,rw /" au préalable lors de votre session SSH pour mettre à jour ce fichier ;-)

En fait, j'ai du aussi corriger les scripts de gamerlistpower (désolé NordicPower, tu as fait du bon boulot mais recalbox a du evoluer je pense et il faut modifier quelques trucs maintenant, rien de grave ;-)

1) j'ai modifier le script python (/recalbox/scripts/gamelistpower/glplib/glpES.py) qui génére le XML 'es_systems.cfg' de emulationstation , j'ai du rajouter la génération du tag vide si besoin () sinon cela ne s'affiche pas dans le menu de recalbox. Dans ce script python (que j'ai recompilé en .pyc au passage), j'ai rajouté les 3 lignes dans ce fichier, ce sont celles surlignées en jaune :

Pour la création de la collection...

  #Ecriture des noeuds emulators/emulator/cores/core
  if not addsys.emulators == []:
   new_dom_emulators_element = self._XmlDom.createElement(self._CLASS_EMULATORS_NODENAME)
   for emulator in addsys.emulators:
    new_dom_emulator_element = self._XmlDom.createElement(self._CLASS_EMULATOR_NODENAME)
    new_dom_emulator_element.setAttribute("name",emulator.name)
    if not emulator.cores == []:
     new_dom_cores_element = self._XmlDom.createElement(self._CLASS_CORES_NODENAME)
     for core in emulator.cores:
      new_dom_core_element = self._XmlDom.createElement(self._CLASS_CORE_NODENAME)
      new_dom_core_element_text = self._XmlDom.createTextNode(core)
      new_dom_core_element.appendChild(new_dom_core_element_text)
      new_dom_cores_element.appendChild(new_dom_core_element)
     new_dom_emulator_element.appendChild(new_dom_cores_element)
    new_dom_emulators_element.appendChild(new_dom_emulator_element)
   newdom_system_element.appendChild(new_dom_emulators_element)
  else:
   new_dom_emulators_element = self._XmlDom.createElement(self._CLASS_EMULATORS_NODENAME)
   newdom_system_element.appendChild(new_dom_emulators_element)

Mais aussi pour sa mise à jour:


    if not updsys.emulators == []:
     new_dom_emulators_element = self._XmlDom.createElement(self._CLASS_EMULATORS_NODENAME)
     for emulator in updsys.emulators:
      new_dom_emulator_element = self._XmlDom.createElement(self._CLASS_EMULATOR_NODENAME)
      new_dom_emulator_element.setAttribute("name",emulator.name)
      if not emulator.cores == []:
       new_dom_cores_element = self._XmlDom.createElement(self._CLASS_CORES_NODENAME)
       for core in emulator.cores:
        new_dom_core_element = self._XmlDom.createElement(self._CLASS_CORE_NODENAME)
        new_dom_core_element_text = self._XmlDom.createTextNode(core)
        new_dom_core_element.appendChild(new_dom_core_element_text)
        new_dom_cores_element.appendChild(new_dom_core_element)
       new_dom_emulator_element.appendChild(new_dom_cores_element)
      new_dom_emulators_element.appendChild(new_dom_emulator_element)
     systemp_node.appendChild(new_dom_emulators_element)
    else:
     new_dom_emulators_element = self._XmlDom.createElement(self._CLASS_EMULATORS_NODENAME)
     systemp_node.appendChild(new_dom_emulators_element)

2) pour être compatible avec les vidéos/thumbnails qui sont utilisé dans les menus (si scrappé bien sur), j'ai modifié aussi pour avoir le bon chemin complet vers ces ressources : (/recalbox/scripts/gamelistpower/glplib/glpGAMEGEN.py), j'ai rajouté les 4 lignes dans ce fichier, ce sont celles surlignées en jaune :


     #Ajout du resultat
     if rom_to_exclude==False:
      result_game.path = result_game.path.replace('.'+os.sep,GameListDirectory+os.sep)
      if result_game.image != default_game_picture and result_game.image !='':
       result_game.image = result_game.image.replace('.'+os.sep,GameListDirectory+os.sep)
      if result_game.video !='':
       result_game.video = result_game.video.replace('.'+os.sep,GameListDirectory+os.sep)
      if result_game.thumbnail !='':
       result_game.thumbnail = result_game.thumbnail.replace('.'+os.sep,GameListDirectory+os.sep)
      local_emulator = result_game.emulator
      if local_emulator=='':
       local_emulator = es_config_default_emulator
      local_core = result_game.core
      if local_core=='':
       local_core = es_config_default_core
      local_ratio = result_game.ratio
      if local_ratio=='':
       local_ratio = 'auto'

Ensuite par defaut cela utilise le theme "favorites", mais dans mon cas, j'ai aussi re-modifier le fichier es_systems.cfg  pour pointer sur un theme "collections" et non "favorites"; J'utilise ce set de thèmes pour avoir un thème "collections" : https://www.youtube.com/watch?v=B1GcGG_yiDM&feature=youtu.be

Pour finir, dans le repertoire \\RECALBOX\share\roms\collections, j'ai viré le script installé "Z - refresh.sh", je préfère le faire en SSH quand j'ai besoin.

Quand j'ai besoin de rajouter une collection ou de la refaire :

1) je me connecte en SSH à mon Rpi 3

2) Je debloque l'écriture avec la commande suivante:


# mount -o remount,rw /

3) Je vais dans le répertoire des script gemalistpower

# cd /recalbox/scripts/gamelistpower

4) J'édite ou pas le fichier de rules avec nano ou avec un outil de mise à jour du fichier par sftp

# nano rules_gensh.xml

Voici ce que j'ai dans le mien pour l'instant :


<?xml version="1.0" encoding="utf-8"?>
<!--NORDIC POWER-->
<rules>
 <options>
  <!-- AUTORISE %%NAME% %%name%% %%PLATEFORM%% %region%% %REGION%% -->
  <titleformat>%%NAME%% (%%PLATEFORM%%)</titleformat>
  <path>/recalbox/share/roms/collections</path>
 </options>
  <rule>
    <name>outrun1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>outrun</searchValue>
    <destination>/recalbox/share/roms/collections/outrun</destination>
    <destinationName>OUTRUN</destinationName>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>outrun2</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>out run</searchValue>
    <destination>/recalbox/share/roms/collections/outrun</destination>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>mario1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>mario</searchValue>
    <destination>/recalbox/share/roms/collections/mario</destination>
    <destinationName>MARIO</destinationName>
    <exclusions>
     <exclusion>Mario Lemieux Hockey.zip</exclusion>
     <exclusion>Mario Andretti Racing (USA, Europe).zip</exclusion>
     <exclusion>/recalbox/share/roms/mario</exclusion>
     <exclusion>/recalbox/share/roms/collections2</exclusion>
    </exclusions>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>mario2</name>
    <searchAttribute>genre</searchAttribute>
    <searchValue>mario</searchValue>
    <destination>/recalbox/share/roms/collections/mario</destination>
    <destinationName>MARIO</destinationName>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>pinball1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>pinball</searchValue>
    <destination>/recalbox/share/roms/collections/pinball</destination>
    <destinationName>PINBALL</destinationName>
    <preserveFavorite>false</preserveFavorite>
    <!--<gamelistInfoFile>/recalbox/share/roms/collections/pinball.txt</gamelistInfoFile>-->
  </rule>
  <rule>
    <name>pinball2</name>
    <searchAttribute>genre</searchAttribute>
    <searchValue>pinball</searchValue>
    <destination>/recalbox/share/roms/collections/pinball</destination>
    <preserveFavorite>false</preserveFavorite>
    <!--<gamelistInfoFile>/recalbox/share/roms/collections/pinball.txt</gamelistInfoFile>-->
  </rule>
  <rule>
    <name>streetfighter1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>street fighter</searchValue>
    <destination>/recalbox/share/roms/collections/streetfighter</destination>
    <destinationName>STREET FIGHTER</destinationName>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>streetfighter2</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>streetfighter</searchValue>
    <destination>/recalbox/share/roms/collections/streetfighter</destination>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>tetris1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>tetris</searchValue>
    <destination>/recalbox/share/roms/collections/tetris</destination>
    <destinationName>TETRIS</destinationName>
    <preserveFavorite>false</preserveFavorite>
    <exclusions>
     <exclusion>/recalbox/share/roms/collections2</exclusion>
    </exclusions>
  </rule>
  <rule>
    <name>tetris2</name>
    <searchAttribute>genre</searchAttribute>
    <searchValue>tetris</searchValue>
    <destination>/recalbox/share/roms/collections/tetris</destination>
    <preserveFavorite>false</preserveFavorite>
    <exclusions>
     <exclusion>/recalbox/share/roms/collections2</exclusion>
    </exclusions>
  </rule>
  <rule>
    <name>metalslug1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>metalslug</searchValue>
    <destination>/recalbox/share/roms/collections/metalslug</destination>
    <destinationName>METAL SLUG</destinationName>
    <exclusions>
     <exclusion>/recalbox/share/roms/metal</exclusion>
    </exclusions>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>metalslug2</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>metal slug</searchValue>
    <destination>/recalbox/share/roms/collections/metalslug</destination>
    <exclusions>
     <exclusion>/recalbox/share/roms/metal</exclusion>
    </exclusions>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>players4</name>
    <searchAttribute>players</searchAttribute>
    <searchValue>4</searchValue>
    <destination>/recalbox/share/roms/collections/players4</destination>
    <destinationName>PLAYERS 4</destinationName>
    <preserveFavorite>false</preserveFavorite>
  </rule>  
</rules>

5) Puis je lance la recreation de la collection mais sans faire un full install (j'évite de lancer ./install.sh)

# python gamelistpower.py generate_sh info

6)  Et pour finir, je ne reboot pas (pas besoin) mais je relance simplement emulation station via l'interface de dépannage du manager de recalbox et le bouton "Redémarrer ES" accessible à partir de http://recalbox/help:


Et voilà, c'est pas simple mais c'est le plus sympa que j'ai trouvé et le résultat est vraiment super.

Enjoy !

lundi 13 janvier 2020

Domotique: comment j'installe ou ré-installe Jeedom ? ;-)

Et oui c'est pas ma première fois.... et c'est encore moi le premier tuto que l'on trouve sur internet sur le sujet.

Je vais vous parler d'installation pour les débutants en fait mais avec mes recommendations en terme de sécurité, de version d'OS, etc... pour bien commencer et cela vous n'allez pas le trouver ailleurs ;-)

En terme de hardware, on va faire cela sur un Raspberry PI 2 ou 3 (le 3 qui reste encore le plus rentable et adapté à mon avis en ce moment en ce début 2020)

Bien sur il est conseillé de mettre jeedom sur SSD ou mSSD mais pas sur microSD mais quand on commence pour tester, c'est ce que l'on fait pour aller au plus vite ;-) Donc je vais vous expliquer comment installer sur microSD... J'utilise des microSDHC Sandisk Ultra de 16Go, moins de 7€ en ce moment sur Amazon si on en achète au moins 3 !

Pour l'OS, je conseil de rester en Raspbian 9 Lite (http://ftp.ubuntu-tw.org/mirror/raspbian-downloads/raspbian_lite/images/raspbian_lite-2019-04-09/2019-04-08-raspbian-stretch-lite.zip) pour le moment parce que c'est l'OS le mieux adapté à Jeedom V3 qui est stable, je ne conseille pas forcement la V4 pour l'instant même si pour un débutant le risque est limité mais dans mon cas, j'ai besoin de réinstaller et de restaurer une ancienne sauvegarde donc je vais vous le faire sur la V3. (je vous dirais comment installer la V4 dans ce tuto mais il faudra prendre la dernère version de Raspbain 10 Lite dans ce cas et ici: https://downloads.raspberrypi.org/raspbian_lite_latest ;-)

Voici les 10 premières étapes pour avoir Jeedom dans le rapberry pi :

1) Pour commencer je conseil pour la microSD de flasher avec BalenaEtcher (windows/macosx/linux) : https://www.balena.io/etcher/

2) Quand c'est flashé sur la microSD, avant de la mettre dans le raspberry pi, il faudra créer un fichier sur à la racine de la microSD appelé "ssh" sans extension, c'est suffisant pour activer le SSH dans le Raspberry Pi, cela va nous servir ;-)

3) Ensuite, je conseille de mettre le raspberry pi en Ethernet, mettre la microSD et alimenter celui si par une bonne alimentation comme les AUKRU 5 volts 3 ampères aussi sur Amazon ;-)

4) Après le boot, dans mon cas, je regarde dans mon DHCP pour trouver le device qui s'appel "raspberrypi", je choppe l'IP en question puis je m'y connecte en SSH via un putty sur Windows ou avec la commande "ssh pi@ip" à partir de l'invite de commande sur MacOsx.
Par la suite dans mon DHCP (engénéral dans votre routeur), via l'adresse mac, je mets habituellement le Rapsberry Pi en IP fixe pour me simplifier la vie ;-)


MACBOOK:~ user$ ssh pi@192.168.0.XX
The authenticity of host '192.168.0.XX (192.168.0.XX)' can't be established.
ECDSA key fingerprint is SHA256:p0V01234J8wn0f56787Ns149+/mqaqvpnBntji8IoYU.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.XX' (ECDSA) to the list of known hosts.
pi@192.168.0.XX's password: 
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Jan 13 18:24:27 2020 from 192.168.0.4

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $ 

le login est 'pi' et password par défaut est 'raspberry'

5) Quand je suis en SSH je change de suite le mot de passe pour des raisons de sécurité évidente et comme conseil dans l'invite de commande :


pi@raspberrypi:~ $ passwd
Changing password for pi.
(current) UNIX password: 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
pi@raspberrypi:~ $ 

6) Ensuite je change aussi le hostname pour m'y retrouver parce que j'ai plusieurs Jeedoms ;-)

Je lance la commande: "sudo raspi-config" et j'arrive sur ce menu (on aurais pu changer le password ici aussi ;-) :


Et ensuite je vais dans "Network Options" et "Hostname", et dans mon cas je mets "Jeedom2" parce que c'est mon deuxième Jeedom ;-)

J'aime aussi mettre une connection Wifi de secours (à partir du RPI 3 bien sur ;-) donc j'en profite pour rentre mes credentials wifi au passage, je le conseil ;-)

Je ne change pas la langue parce que j'ai déjà eu des mésaventures avec certains composants par trop compatible avec notre langue :-(

Mais je change la localisation pour être en "Europe/Paris" et donc à l'heure ;-)

Puis dans "advanced Option" je vais "expand filesystem" pour être sur de bien utiliser l'espace par la suite.

Je fais un "update" de l'outil au passage ;-)

puis je sors de l'outil

7) Je fais une mise à jour de l'OS et du firmware avec la commande suivante :

pi@raspberrypi:~ $ sudo apt-get update; sudo apt-get install rpi-update
sudo: unable to resolve host raspberrypi
Hit:1 http://raspbian.raspberrypi.org/raspbian stretch InRelease
Hit:2 http://archive.raspberrypi.org/debian stretch InRelease
Reading package lists... Done
sudo: unable to resolve host raspberrypi
Reading package lists... Done
Building dependency tree       
Reading state information... Done
rpi-update is already the newest version (20140705).
0 upgraded, 0 newly installed, 0 to remove and 91 not upgraded.

8) Je reboot...

pi@raspberrypi:~ $ sudo shutdown -r now

9) Je me reconnecte en SSH et avec le nouveau password ;-) et j'ai le nouveau hostname dans l'invite de commande "Jeedom2" :


MACBOOK:~ user$ ssh pi@192.168.0.XX
pi@192.168.0.XX's password: 
Linux Jeedom2 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Jan 13 19:18:55 2020 from 192.168.0.3
pi@Jeedom2:~ $ 

Pour lancer l'installation de jeedom, dans mon cas, je veux la v3 donc j'utilise la commande suivante:


wget -O- https://raw.githubusercontent.com/jeedom/core/stablev3/install/install.sh | sudo bash

Et pour la 4 c'est ainsi mais attention il faudra bien être avec la dernière version de raspbian pour rappel :


wget -O- https://raw.githubusercontent.com/jeedom/core/master/install/install.sh | sudo bash

Puis après téléchargement du .sh, l'installation se lance et voici la fin de l'installation avec les checks qui vont bien :


.
.
.
Check filesystem right...OK
[END CONSISTENCY]
Ajout de l'utilisateur (admin,admin)
OK
Temps d'installation : 11s
[END INSTALL SUCCESS]
\033[1;32métape 9 installation de jeedom réussie\033[0;39m
---------------------------------------------------------------------
\033[1;33mCommence l'étape 10 post jeedom\033[0;39m
no crontab for root
www-data ALL=(ALL) NOPASSWD: ALL
\033[1;32métape 10 post jeedom réussie\033[0;39m
---------------------------------------------------------------------
\033[1;33mCommence l'étape 11 vérification de jeedom\033[0;39m
==================================================
|    JEEDOM SICK SCRIPT 2020-01-13 20:34:16    |
==================================================

**************************************************
*                 VARIABLES                      *
**************************************************
Dossier d'installation : /var/www/html
User : root
Sudo : OUI

**************************************************
*               DOSSIERS                         *
**************************************************
Charge l'environnement de Jeedom...OK
Vérifie si les log sont en écriture...OK

**************************************************
*              UTILISATEURS                      *
**************************************************
admin =>  Admin

**************************************************
*                 CRON                           *
**************************************************
Vérifie si cron est actif...OK
Vérifie si scenario est actif...OK

NAME | STATE | SCHEDULE | DEAMON | ONCE | LAST RUN
plugin::cronDaily() | stop | 00 00 * * * * | 0 | 0 | 
jeedom::backup() | stop | 18 06 * * * | 0 | 0 | 
plugin::cronHourly() | stop | 00 * * * * * | 0 | 0 | 
scenario::check() | stop | * * * * * * | 0 | 0 | 
scenario::control() | stop | * * * * * * | 0 | 0 | 
jeedom::cronDaily() | stop | 00 00 * * * * | 0 | 0 | 
jeedom::cronHourly() | stop | 00 * * * * * | 0 | 0 | 
jeedom::cron5() | stop | */5 * * * * * | 0 | 0 | 
jeedom::cron10() | stop | */10 * * * * * | 0 | 0 | 
jeedom::cron() | stop | * * * * * * | 0 | 0 | 
plugin::cron() | stop | * * * * * * | 0 | 0 | 
plugin::cron5() | stop | */5 * * * * * | 0 | 0 | 
plugin::cron10() | stop | */10 * * * * * | 0 | 0 | 
plugin::cron15() | stop | */15 * * * * * | 0 | 0 | 
plugin::cron30() | stop | */30 * * * * * | 0 | 0 | 
plugin::checkDeamon() | stop | */5 * * * * * | 0 | 0 | 
cache::persist() | stop | */30 * * * * * | 0 | 0 | 
history::archive() | stop | 00 5 * * * * | 0 | 0 | 
plugin::heartbeat() | stop | */5 * * * * * | 0 | 0 | 

**************************************************
*                 DATE                           *
**************************************************
Vérifie si la date de Jeedom est bonne...OK ()

**************************************************
*                 MESSAGE                        *
**************************************************
DATE | PLUGIN | LOGICALID | MESSAGE

**************************************************
*                 PLUGIN                         *
**************************************************
ID | NAME | STATE



==================================================
|         TOUTES LES VERIFICATIONS SONT FAITES    |
==================================================
\033[1;32métape 11 vérification de jeedom réussie\033[0;39m
/!\ IMPORTANT /!\ Le mot de passe root MySQL est 6b2c256be25ef9c
Installation finie. Un redémarrage devrait être effectué
pi@Jeedom2:~ $ 


10) je reboot encore une fois aussi parce que je vois dans l'install de jeedom des mises à jour de composants qui me demande un reboot puis jeedom le dit aussi:

pi@raspberrypi:~ $ sudo shutdown -r now


Maintenant, on va se connecter à Jeedom (fini le SSH ;-)...

1) en utilisant le login "admin" et le password "admin" :


2) On change aussi le mot de passe de l'accès admin pour finir comme proposé par Jeedom :


3) Ensuite on se connecte au store ou on en créé un :


4) et Moi, pour des raisons sécurités encore ;-), je conseil de désactiver le compte admin et mettre son propre login dans le menu "utilisateurs": 




C'est fini ici pour les nouveau utilisateur, je vous laisse jouer avec Jeedom ;-)

Pour les autres, si vous voulez restaurer un backup, je continue....

Restauration de backup

1) on va d'abord aller dans le menu avec la roue cranté comme pour les "utilisateurs" mais cette fois on va dans "sauvegarde" :


2) On utilise le bouton "envoyer" pour charger la sauvegarde qui dans mon cas est sauvegardée régulièrement par Jeedom dans le cloud (il faudra faire justement un article aussi sur cela, j'ai encore du boulot ;-)


3) Puis on clic sur "restaurer" avec le petit message pour avertir (dans mon cas, je pars d'une base vierge... pas de risque... j'ai grillé ma microSD précédente, morte de vieillesse je pense ;-)


Donc je dis "OK" et c'est partie :


Et voilà, ma domotique "is back"... (après un petit F5 quand même et/ou un logout/login)

4) Dans tout les cas, moi j'aime bien refaire un "redémarrage" pour finir et me reloguer pour vérifier si c'est stable et que je suis sur le bon user ;-):



5) Et pour finir, les dépendances s'installent et certains plug-in (je vais vérifier chaque plug-in pour voir si tous se passe bien) devront être mise à jour dans le centre prévu à cette effet ;-) (dans mon cas, j'installe des dépendances à la main mais c'est pour ma bibliothèque de scripts en tout genre, je vous en dispense pour cette fois, vous avez pu le découvrir dans d'autres articles déjà)


6) Vous pouvez faire un dernier check aussi dans le centre de "santé", dans mon cas on voit que le Z-wave est en cours d'installation mais j'ai un problème de swap sur mon Raspberry Pi 2 :


7) Pour le problème de swap (parce que je suis en Raspberry Pi 2, sur le 3, on peut le supprimer), je vais réduire le pourcentage de swap en le forçant à 10 % en éditant le fichier suivant :

pi@Jeedom2:~ $ sudo nano /etc/sysctl.conf

Et en rajoutant la ligne à la fin: vm.swappiness = 10


CTRL+X puis Y puis ENTRER pour sauvegarder.

Puis je vais augmenter la taille du swap à 2 Go en modifiant ce fichier :

pi@Jeedom2:~ $ sudo nano /etc/dphys-swapfile

Et en modifiant la ligne CONF_SWAPSIZE=100 par CONF_SWAPSIZE=2048



CTRL+X puis Y puis ENTRER pour sauvegarder

8) Puis je redémarre encore une fois... je conseil par l'interface Jeedom, cela est mieux...

 

Fini !!!!


Et voilà, merci d'avoir suivi ce tuto sur mes habitudes d'installation de Jeedom, cela va encore évoluer (et je peux dire que c'est de mieux en mieux si on compare au début en 2014 aussi bien pour Jeedom que pour moi !) mais cela vous montre comment je m'y prends pour ne pas avoir de problème maintenant et faire au plus vite pour repartir sur de bon pied ;-)

Enjoy !