lundi 11 novembre 2019

Youtube: J'ai fait l'introduction de ma chaine !!!

Bon.... pour simplifier le dialogue avec vous dans certains cas et surtout pour vous montrer des choses en plus des photos sur instagram, j'ai donc créé ma chaine Youtube.

Je viens de faire l'introduction de celle-ci ;-), j'espère mettre les épisodes du panel arcade  4 joueurs bientôt !



Enjoy !!!

dimanche 27 octobre 2019

Retrogaming: Panel 4 joueurs - c'est parti !

J'ai donc commencé à fabriquer le panel, pour cela j'avais fait des achats.... en fait, j'avais acheté des chutes de MDF. 2 panneaux de 18 mm d'épaisseur sur 1,50 m x 50 cm (je vais en utiliser une seule pour ce projet) et aussi 1 panneau plus épais (23 mm) mais plus petit en longueur mais suffisant pour faire ce que je veux.

Donc j'ai commencé par la partie la plus compliquée...
J'ai travaillé sur le côté gauche et droit qui reposent tout les deux sur le piano (et oui je veux me poser sur un piano pour rappel comme expliqué dans mon précédent article Ma première fabrication) et qui doit épouser la forme du couvercle du clavier de celui ci. J'ai donc utilisé le panneau de 23 mm d'épaisseur pour pouvoir y mettre les rainures d'assemblage avec la face avant et arrière.

Voici en fil de fer (un peu à l'arrache ;-) la position du panel sur le couvercle du clavier du piano:


Pour partager avec vous, j'ai utilisé un patron en carton pour suivre la forme.
J'ai commencé à découper à la hauteur et largeur les 2 côtés.
J'ai dessiné la forme avec le patron
J'ai découpé à la scie sauteuse puis j'ai poncé à la main pour la première planche puis pour la deuxième, j'ai coupé grossièrement avec quelques millimètres de marge puis j'ai utilisé la fraise à copie de ma défonceuse.

Pour simplifier, je vous propose de regarder cela en image sur mon compte instagram...

L'arrondi:


La découpe pour avoir le bon angle:



Et le rainurage pour l'assemblage :


Sinon, voici le résultat sur le piano, cela épouse bien la forme, content... je suis bien parti (désolé pour la photo, elle n'est pas terrible à cause du flash... mais bon, pas grave ;-)




Suite au prochain épisode !

samedi 12 octobre 2019

Domotique: Démarrer la caméra d'un PC à distance


Attention: Ce n'est pas pour vous apprendre à hacker la webcam de quelqu'un, je préfère le préciser ;-)

En fait mon besoin est de démarrer une caméra d'un PC à distance mais je ne veux pas lancer la caméra de ce PC de manière continu (juste qu'en je veux consulter en fait). Je veux le faire à partir du Raspbian qui héberge mon Jeedom et l'utiliser avec le plug-in caméra ;-)

Côté PC, j'ai installé YAWCAM, une application simple qui peut marcher en service. Sauf que j'ai mis le service en manuel sur mon PC pour empêcher qu'il se lance tout seul ;-) :


Coté Raspberry Pi, il va falloir installer des choses aussi :

$ sudo apt-get install samba-common-bin

Et voici la commande pour lister les services, il faudra l'IP et login/password admin du PC :

$ net rpc service list -I 192.168.0.1 -U lesv2
Enter lesv2's password:
Failed to open Service Control Manager. [WERR_ACCESS_DENIED]

Mais en fait, on a cette erreur et c'est normal par défaut, parce que le PC par défaut ne va pas autoriser de commander des services à distance !

Il faut autoriser dans la base de registre avec une commande à partir de la console Windows en mode "administrateur":



Microsoft Windows [version 10.0.18362.418]
(c) 2019 Microsoft Corporation. Tous droits réservés.

C:\WINDOWS\system32>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
L’opération a réussi.

C:\WINDOWS\system32>

et on peut vérifier aussi avec la commande "regedit" :



Ensuite on refait la même commande et on peut voir la liste des services maintenant (j'ai pas tout mis ;-):


$ net rpc service list -I 192.168.0.4 -U lesv2
Enter lesv2's password:
AppIDSvc                "Identité de l’application"
Appinfo                 "Informations d’application"
Apple Mobile Device Service    "Apple Mobile Device Service"
...

Maintenant on va essayer d'arrêter ou démarrer le service de YAWCAM:

Pour arrêter :
$ net rpc service stop Yawcam -I 192.168.0.4 -U lesv2
Enter lesv2's password:
..............................
Yawcam service is stop pending.

Pour démarrer :
$ net rpc service start Yawcam -I 192.168.0.4 -U lesv2
Enter lesv2's password:
..............................
Failed to start service: Yawcam [WERR_OK]

Et oui, il y a une erreur dans mon cas mais le service a bien démarré, je soupçonne que c'est juste qu'il a était trop long pour ce lancer ?!

Et peut aussi connaitre le status du service :


$ net rpc service status Yawcam -I 192.168.0.4 -U lesv2
Enter lesv2's password:
Yawcam service is stopped.
Configuration details:
        Controls Accepted    = 0x0
        Service Type         = 0x10
        Start Type           = 0x2
        Error Control        = 0x1
        Tag ID               = 0x0
        Executable Path      = C:\Program Files (x86)\Yawcam\Yawcam_Service.exe
        Load Order Group     = someorder
        Dependencies         = /
        Start Name           = LocalSystem
        Display Name         = Yawcam

Et maintenant dans Jeedom :
Le challenge: il falloir rentrer le mot de passe de manière automatique ;-)

En fait, c'etait simple mais j'ai galéré à trouver, dans les docs, on parle de faire -U username%password mais ce n'était pas suffisant dans mon cas :-(
J'ai cherché longtemps, 2 à 3 heures peut être :-(
et en fait.... J'avais des caractères spéciaux dans mon mot de passe donc il faut mettre des guillemets et faire ainsi finalement dans la commande si on veut la mettre dans un script : -U username%"password"

Exemple de commande avec le mot de passe :
net rpc service start Yawcam -I 192.168.0.4 -U lesv2%"password;1234"

Donc voici ce que j'ai fait dans jeedom, un script avec start, stop et status pour avoir ce widget :


Et voici ce que j'ai mis dans les scripts, j'ai fait cela en un seul commande shell donc je n'ai même pas fait de script bash pour cela.

Même pour le "status" où j'ai utilisé dans la commande ci-après le  "if" et "grep" pour avoir un résultat binaire ;-) :


if echo $(net rpc service status Yawcam -I 192.168.0.4 -U lesv2%"password") | grep -q "running"; then echo "1";  else echo "0"; fi

Et voici dans Jeedom (j'ai mis le user "lesv2" & le password "test;1234" juste pour exemple)


Et pour la camera, cela fonctionne comment ?!

J'ai donc une camera configurée ainsi :




Et en fait, le service sera démarré que lors du visionnage de celle-ci dans le dashboard et donc j'ai renseigner les commandes ON/OFF ainsi dans l'onglet approprié :

Et voilà, maintenant j'ai une caméra  d'un "PC" que je peux dont je peux piloter l'allumage à distance à partir de ma domotique quand je le souhaite ;-) et avoir le résultat suivant :

on a un nouveau bouton à gauche pour allumer ou éteindre 




Enjoy !



dimanche 6 octobre 2019

Domotique: Commander un va et vient avec un "Shelly 1" !

Dans mon cas, j'ai voulu commander un va et vient entre un rez de chaussé et un premier étage.
Je ne pouvais pas juste mettre un module à encastrer simplement derrière un interrupteur.

Voici comment était mon câblage entre les étages avant d'intégrer le module :


L pour la phase, N pour le Neutre, le point a et b pour voir où je vais raccorder le module.
Ce sont des interrupteurs Niloé de Legrand, je me suis permit de vous rappeler comment les câbler.
La phase arrivait par le bas de la maison (le garage en fait) et pour le neutre, j'utilise le circuit lumière qui est aussi disponible dans le grenier.


Maintenant, pour utiliser un Shelly 1, j'ai juste intégré celui-ci dans mon grenier où j'avais le neutre et la phase de disponible et c'est surtout que le Shelly 1 répondait bien à mon besoin parce que mon va-et-vient va commander le module qui va ensuite lui même alimenter la lampe. Dans mon cas, je n'aurais pas pu utiliser un module simple sur la phase pour travailler avec un va et vient de ce type.

Voici donc comment j'ai câblé dans mon grenier pour ainsi ne pas démonter mes boutons (il a fallu récupérer la phase mais finalement ce fut simple pour moi):


Voilà, si vous avez une configuration similaire chez vous, vous pourrez faire de même à moindre coût avec ce module Shelly 1 à moins de 10€: https://shelly.cloud/product/shelly-1-open-source/

Enjoy ! (cliquez sur les photos si trop petit pour vos yeux ;-)



Domotique: Comment commander une lumière - les solutions

En fait, il y a plusieurs solutions pour contrôler et commander sa lumière dans une maison ou un appartement...

On peut agir au niveau des interrupteurs, des prises commandées, des ampoules, des modules encastrés voir même au niveau du tableau électrique par des relais.

Mais bien sur cela va dépendre de la configuration de votre maison/appartement:
- Accès ou pas aux interrupteurs, présence de la phase et/ou du neutre derrière les interrupteurs.
- Avec simple lampe/interrupteur ou va-et-vient, voir même sans interrupteur.
- Place derrière les interrupteurs ou dans une cloison ou un plafond voir les combles.
- Accès aux ampoules ou pas.
- Besoin de commander une seule ou plusieurs lumière.
- Besoin de commander une ampoule classique ou RGB.
- Ampoule led ou autre.

Je vais vous parler de mon expérience donc cela ne sera pas forcement exhaustif mais cela pourra vous aider dans vos choix:

1) Contrôler la lumière en utilisant des ampoules connectées
Je ne vais pas développer dans cet article les différents produits parce que j'ai déjà donner  mon avis dans cet article :
https://bozothegeek.blogspot.com/2017/02/domotique-et-la-lumiere.html

Les avantages:
- Facile à mettre en oeuvre, juste l'ampoule à changer !
- On peut passer d'une lumière simple à du RGB

Les inconvénients:
- La puissance de l'ampoule peut être limité et cela reste du Led !
- Si l'ampoule est commandable aussi par un interrupteur, si on l'éteint par l'interrupteur, l'ampoule ne sera plus commandable par la domotique. (il faut parfois condamner les interrupteurs pour éviter des problèmes)
- On a pas toujours un retour d'état surtout pour les ampoules bon marchés.

2) Contrôler par des interrupteurs commandés

Comme ceux de xiaomi qui sont en xigbee, j'en ai un chez moi, et c'est bien sympa, j'ai testé la version double (la version filaire existe et la version sur pile aussi, qui existent tout les deux avec ou sans neutre):


mais il faudra une boite d'encastrement carré dans ce cas :



et sur ce blog, vous retrouverez une revue exhaustive des différentes possibilités : https://www.ladomopratique.com/les-interrupteurs-muraux-xiaomi-aqara-wall-switch/

Les avantages:
- On a un vrai interrupteur qui reste utilisable manuellement.
- Compatible jeedom avec le plug-in Xiaomi (ou avec la ZiGate)
- Peut fonctionner avec que la gateway Xiaomi seulement si on n'a pas de jeedom ou autre central domotique DIY.
- On a un retour d'état finalement.
- Peut être utilisé dans des scénarios pour commander des ampoules ou prises distantes (j'ai fais cela pour mon allogène qui était sur une prise classique)
- La version sans fil permet de rajouter un interrupteur à un endroit où on ne l'avait pas prévu.

Les inconvénients:
- Plus compliqué que l'ampoule dans le cas de la version filaire où j'ai du enlever ma boite d'encastrement ronde pour la remplacer par une carré.
- Il faut s'y connaitre un peu en électricité et surtout respecter les consignes de sécurité (couper vos disjoncteurs voir compteur avant intervention)
- Le design, on peut ne pas aimer mais surtout cela ne sera pas forcement comme les autres de votre maison ou appartement.
- Pour la version sur pile, il faudra changer les piles régulièrement (il faut compter 1 fois par an et plus ou moins en fonction de son utilisation)

3) Contrôler par des prises commandées

Comme j'expliquais au dessus et pour certains cas, il faut utiliser une prise commandée.
Dans mon cas, j'ai essayé des versions Wifi, 433Mhz, Z-Wave et Zigbee (Xiaomi). Toutes fonctionnes avec Jeedom finalement et j'ai pris en fonction du prix mais la qualité n'a pas toujours était au rendez vous.
Voici mon expérience.

- Les prises en 433Mz:
J'avais commencé par ceux là pour des raisons de coût par rapport à celle que l'on trouvé entre 50€ et 60€ en Z-wave. Pas de retour d'état :-(
- Les prises Z-Wave (ou Z-wave Plus):
 J'ai essayé les Neo Coolcam... c'est pas les meilleurs je pense, j'ai certaines qui sont mortes assez vite et qui avait eu des mauvais contacts rapidement, l'avantage c'est que cela me servez de répéteur zwave pour mes capteurs d'ouvertures du même protocole.

Pas cher, j'avais du les avoirs à moins de 20€ sur Aliexpress... à l'époque ont été plus dans les 50€ pour les leaders du marché comme celle de Fibaro :
- Les prises Wifi:
Pour ma part, j'ai testé 2 marques mais il y en a pleins !!!

La broadlink MP1, une multiprise que je peux piloter par Jeedom avec le plugin Broadlink :
J'ai aussi testé les prise Orvibo WiWo-S20:
Conclusion, avec Jeedom grâce aux différents plug-in, on a le choix...je n'ai pas testé tout celles à base de l'IoT de la société chinoise Tuya mais je sais que cela donne beaucoup de choix dans les prises Wifi. De plus, en wifi, cela permet de connecter ceci facilement avec Alexa ou Google home qui sont généralement supporté par défaut par les constructeurs depuis plusieurs mois maintenant.

- Les prises Zigbee (Xiaomi Mi Home):
En fait, c'est celle que j'utilise le plus parce qu'elles sont pas chères (moins 10€ parfois, il faut attendre les réductions sur les sites chinois).
Les avantages:
- On peut "domotiser" une lampe de chevet ou un halogène facilement.
- On peut l'utiliser à contrôler d'autres types d'appareil aussi comme une télé, une cafetière, des chargeurs de téléphone, etc...
- Intégrable assez facilement grâce aux différents plug-in dans Jeedom.
- On a un retour d'état.
- Pas de problème de pile.
- Facile en fait, juste à "plugger" dans une prise existante.

Les inconvénients:
- Que pour ce qui marche par une prise
- On peut avoir des prises trop important en taille qui font que l'on ne peut pas en mettre plusieurs par multi-prise par exemple.
- Pour les prises chinoises, on peut avoir besoin d'un adaptateur.
- Certains sont sans terre (pas grave pour certaines lumières mais c'est nécessaire sur certains halogènes pour la sécurité)
- Pour ceux en wifi, à cause de la multiplication des devices, il faudra un bon routeur Wifi multi-band de préférence où la band 2,4Ghz sera surtout pour votre domotique.
- Pour ceux en 433Mhz, pas de retour d'état et besoin d'apprendre le code par votre domotique en utilisant une télécommande qu'il faudra acheter aussi. (et il faudra l’électronique d'apprentissage et de commande en 433Mhz sur votre domotique DIY ou acheter un RFXCOM qui coût vers les 100€)

4) Contrôler par module encastré:

J'ai testé 2 protocoles surtout pour leur prix (je n'ai pas fais ceux en Z-wave parce que vous savez que finalement je ne suis pas un fan de cette techno !!!)

- Les modules en 433 Mhz
J'ai testé les DIO comme celui là avec sa télécommande mais pas de retour d'état comme les prises 433Mhz :

- Les modules Wifi
J'ai testé depuis un an maintenant les fameux Shelly et je confirme que cela à changé ma vie, c'est stable, il y a un retour d'état et il y a pleins de possibilités, il y a des versions pour mettre derrière un interrupteur simple, un volet roulant, avec récupération de la consommation.

Dans notre cas, je vais vous parler du Shelly 1 surtout... à moins de 10€ qui peut même gérer un va et vient mais il faudra lui trouver sa meilleur place.... pas possible dans tout les cas, je ferais un article à suivre sur le sujet.


Il y aussi le Shelly 2.5, plus fin, plus cher (19.99€) mais qui possède 2 relais et qui peut même gérer un volet roulant par exemple:

Les avantages:
- C'est caché et on peut garder nos anciens interrupteurs, c'est la solution la plus clean.
- Commande manuel possible.
- On a un retour d'état (sauf pour ceux en 433Mhz).
- Pas besoin du Neutre dans certains cas.
- Pas de problème de pile.

Les inconvénients:
- Pas facile à installer finalement... il faut ouvrir l’interrupteur existant avant toute chose.
- Il faut s'y connaitre un peu en électricité et surtout respecter les consignes de sécurité (couper vos disjoncteurs voir compteur avant intervention)
- Pas de retour d'état pour ceux en Wifi.
- Il faut la phase et le neutre dans certains cas.
- Pour ceux qui utilise la phase (donc un seul fil), les lampes leds peuvent poser un problème !
- Il faut des boites d’encastrement profonde ! ou un emplacement dans un plafond, un grenier, etc... avec la phase et le neutre de dispo ! pas simple pour tout les cas :-(
- Pour ceux en 433Mhz, pas de retour d'état et besoin d'apprendre le code par votre domotique en utilisant une télécommande qu'il faudra acheter aussi. (et il faudra l’électronique d'apprentissage et de commande en 433Mhz sur votre domotique DIY ou acheter un RFXCOM qui coût vers les 100€)

4) Contrôler à partir du tableau éléctrique:

J'ai pas vraiment utilisé ce cas pour la lumière, mais j'ai des relais chez moi qui coupe la chaudière par exemple ou d'autres choses.... on pourrait imaginer pour contrôler automatiquement des lumières extérieurs dans un jardin.

Chez Shelly, ils ont cela qui est un peut cher à mon gout 69€:
Mais on peut avec le raspberry pi ou un esp8266 via leur GPIO controller une 'carte relais' comme celle-ci:


Les avantages:
- C'est "centralisable" et on peut contrôler plus de lumières à la fois.
- Retour d'état possible via la lecture des GPIOs.

Les inconvénients:
- Il faut bien s'y connaitre en électricité dans ce casa et surtout respecter les consignes de sécurité (couper vos disjoncteurs voir compteur avant intervention), il va falloir toucher au tableau électrique de la maison !
- Applicable que pour contrôler des lumières en masse et sans interrupteur existant sur la ligne (ou il faudra les condamner)


Conclusion:

On a encore bien le choix dans les solutions... cela va dépendre de la configurations de votre habitat, de vos besoins et de vos compétences en électricité (j'ai un BAC en Électrotechnique dans mon cas ;-)... Merci encore Jeedom aussi pour avoir cette flexibilité et ainsi pouvoir utiliser plusieurs solutions protocolaires.

Enjoy !

dimanche 22 septembre 2019

Retrogaming: sauve ta recalbox dans le "Claude" !

Bon je n'ai pas fait de tuto step by step pour GPi Case finalement... je vous conseil d'aller sur la page du GPi Case de RecalBox: https://forum.recalbox.com/topic/18158/gpi-case-recalbox-6-1-beta-4-pre-release-disponible

Mais aujourd'hui je vais donc vous expliquer comment synchroniser vos sauvegardes dans le cloud (désolé pour le jeu de mot pourri, désolé pour les Claude !), et donc dans mon cas avec Dropbox.

Voici comment j'ai procédé... c'est pas si simple :-(

1) Je ne suis pas parti de zéro.... Il va falloir se connecter en ssh à la recalbox et j'ai suivi ce tuto mais que la step 1 pour l'installation de rcloud sur recalbox de mon GPi Case.: https://forum.recalbox.com/topic/13840/tutorial-how-to-sync-saves-roms-to-the-cloud.

Donc je vous remet la step 1 ici.
Attention, il ne faut pas oublier de commencer à faire cette commande sinon on ne peut pas mettre à jour l'OS qui est verrouillé par défaut même si on a compte root !
mount -o remount, rw /
Je le laisse donc en anglais pour cette partie:

open ssh and run those commands:
cd ~
mkdir -p rpi-sync    
wget -O rclone-install.sh https://raw.github.com/pageauc/rclone4pi/master/rclone-install.sh   
wget -O rclone-sync.sh https://raw.github.com/pageauc/rclone4pi/master/rclone-sync.sh   
wget -O rpi-sync/Readme.md https://raw.github.com/pageauc/rclone4pi/master/Readme.md
now we have all the necessary files, but we have to modify rclone-install.sh
run: nano ./rclone-install.sh
Delete all the sudo on the file, at the end you should have something like that:
0_1524321467750_Screenshot from 2018-04-21 16-33-36.png
now let's finish with the commands
chmod +x rclone-install.sh
chmod +x rclone-sync.sh
./rclone-install.sh 
edit: 06/01/2020, sur la version GPI Case, pas de problème mais sur ma borne avec la 6.1.1 sur un Raspberry Pi 3B+, j'ai du lancer le script ainsi (la command chmod n'a pas d'effet je crois :-(
bash rclone-install.sh

2) A partir de la conf du compte de cloud (dropbox ou autre), c'est à vous d'improviser et de s'adapter ;-)
Pour mon cas, j'ai utilisé une dropbox, donc je vais vous expliquez comment j'ai fait (mais je ne peux pas vous faire pour les autres clouds mais cela sera très proche en terme de commande à utiliser) .

Dans le cas de Dropbox, j'ai créé une application "recalbox-lesv2" sur https://www.dropbox.com/developers/apps  de mon compte dropbox (je n'ai pas mis "recalbox" parce qu'existe déjà et donc à vous de trouver la votre en rajoutant un pseudo à la fin par exemple)

On créé un app (on pourra rester en dev, pas de soucis) :



On rajoute le lien "Redirect URIs" comme conseillé par rclone (j'ai vu cela dans certaines options mais c'est peut être inutile ?!):




Puis on devra généré un token pour plus tard, donc on peut garder la page ouverte dans le browser.




C'est rclone 1.6 que j'ai installé dans mon cas, donc dans "rclone config" j'ai fait une nouvelle conf avec le nom "remote", je n'est pas mis de client_id ou client_secret, j'ai dis non au "advanced settings" et puis non pour pourvoir rentrer le token à la main.


# rclone config
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / 1Fichier
   \ "fichier"
 2 / Alias for an existing remote
   \ "alias"
 3 / Amazon Drive
   \ "amazon cloud drive"
 4 / Amazon S3 Compliant Storage Provider (AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, etc)
   \ "s3"
 5 / Backblaze B2
   \ "b2"
 6 / Box
   \ "box"
 7 / Cache a remote
   \ "cache"
 8 / Dropbox
   \ "dropbox"
 9 / Encrypt/Decrypt a remote
   \ "crypt"
10 / FTP Connection
   \ "ftp"
11 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
12 / Google Drive
   \ "drive"
13 / Google Photos
   \ "google photos"
14 / Hubic
   \ "hubic"
15 / JottaCloud
   \ "jottacloud"
16 / Koofr
   \ "koofr"
17 / Local Disk
   \ "local"
18 / Mega
   \ "mega"
19 / Microsoft Azure Blob Storage
   \ "azureblob"
20 / Microsoft OneDrive
   \ "onedrive"
21 / OpenDrive
   \ "opendrive"
22 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
23 / Pcloud
   \ "pcloud"
24 / Put.io
   \ "putio"
25 / QingCloud Object Storage
   \ "qingstor"
26 / SSH/SFTP Connection
   \ "sftp"
27 / Union merges the contents of several remotes
   \ "union"
28 / Webdav
   \ "webdav"
29 / Yandex Disk
   \ "yandex"
30 / http Connection
   \ "http"
31 / premiumize.me
   \ "premiumizeme"
Storage> 8
** See help for dropbox backend at: https://rclone.org/dropbox/ **

Dropbox App Client Id
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_id>
Dropbox App Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_secret>
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n
For this to work, you will need rclone available on a machine that has a web browser available.
Execute the following on your machine (same rclone version recommended) :
        rclone authorize "dropbox"
Then paste the result below:
result> {"access_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","token_type":"bearer","expiry":"0001-01-01T00:00:00Z"}
--------------------
[remote]
type = dropbox
token = {"access_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","token_type":"bearer","expiry":"0001-01-01T00:00:00Z"}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> Y
Current remotes:

Name                 Type
====                 ====
remote               dropbox

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q


Attention dans result il faut mettre sous ce format JSON:
{"access_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","token_type":"bearer","expiry":"0001-01-01T00:00:00Z"}

Le token d'accès doit être généré manuellement à partir de la page app de "recalbox-lesv2" (je ne peux pas vous montrer quand c'est généré parce qu'il disparaît ensuite... mais vous allez avoir une chaine en base64 à recopier dans le la variable "access_token" dans le JSON ci-dessus.




3) pour tester, j'ai lancer la commande:
rclone lsd remote:
ou
rclone ls remote:

Si c'est OK, c'est vide....que dale !!!


Mais si votre token est faut, il vous le dira aussi :-(

4) pour tester la copy, j'ai créé un repertoire /saves dans ma dropbox sur mon PC donc dans /Applications/recalbox-lesv2/
et j'ai lancé la commande suivante :
rclone copy /recalbox/share/saves/ remote:saves

Magic !!! sur mon PC, j'avais mon répertoire "saves" complet de ma recalbox:



5) Lancer le backup des sauvegardes quand on éteint le GPi Case (si wifi OK !)

Si pas déjà fait, ou si reboot, il faudra relancer cette commande:
mount -o remount, rw /
Il faut aller modifier le script python pour le safe shutdown du gpi case de retroflag  maintenant :
cd /recalbox/system/hardware/case/installers/gpi/assets/ 

Il faut editer le fichier python suivant mais avant c'est bien de faire un petit dos2unix parce que des "^M" traine dans le fichier ;-) :
dos2unix -u recalbox_SafeShutdown_gpi.py 
nano recalbox_SafeShutdown_gpi.py 
Le contenu du fichier est ainsi (dans recalbox 6.1 Beta 4 pour GPi Case) et il faut ajouter/modifier le code en surligner en jaune :


import RPi.GPIO as GPIO
import socket
from multiprocessing import Process

# Initialize pins
powerPin = 26
powerenPin = 27

# Initialize GPIO settings
def init():
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(powerPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.setup(powerenPin, GPIO.OUT)
        GPIO.output(powerenPin, GPIO.HIGH)
        GPIO.setwarnings(False)

# Check if internet is available
def is_internet_available():
        try:
                socket.create_connection(("www.google.com", 80))
                return True
        except OSError:
                return False
# Lookup emulationstation def lookupEmulationStation(): import psutil # Run through all process for p in psutil.process_iter(): if "emulationstation" in p.cmdline(): print("Emultion-station found") return p print("Emultion-station NOT found") return None # Kill process recursively def killEmulationStationTree(): import psutil try: # Get emulationstation process parent = lookupEmulationStation() if parent is None: return allProcess = { parent } # Get all childrens recursively children = parent.children(recursive=True) print("Got children: {}".format(children)) # Tell EmulationStation to quit demo/mode and/or to exit gracefully try: with open("/tmp/emulationstation.quitnow", "w") as sf: sf.write("exit") sf.flush() sf.close() except IOError: pass # Can't wait or retry # Quit emulationstation gracefully parent.terminate() print("Emulationstation terminated") # Kill all children for child in children: allProcess.add(child) child.kill() print("Children killed") # Wait for everyone _, stillAlive = psutil.wait_procs(allProcess, 20) print("Stillalive: {}".format(stillAlive)) # if emulation is still alive, give it a last chance to quit if parent in stillAlive: psutil.wait_procs(stillAlive, 20) print("Last chance end") except psutil.NoSuchProcess: print("exception in killEmulationStationTree") pass # Waits for user to hold button up to 1 second before issuing poweroff command def poweroff(): while True: GPIO.wait_for_edge(powerPin, GPIO.FALLING) # Stop all killEmulationStationTree()

                import os
                # Backup saves in the cloud if wifi available
                if is_internet_available():
                        os.system("/usr/bin/rclone copy /recalbox/share/saves/ remote:saves")
# Fast stop import os os.system("reboot -f") if __name__ == "__main__": #initialize GPIO settings init() #create a multiprocessing.Process instance for each function to enable parallelism powerProcess = Process(target = poweroff) powerProcess.start() powerProcess.join() GPIO.cleanup()

Vous sauvegarder le code ainsi par CTRL+X + Y (cours rapide de sauvegarde dans nano ;-) 

Puis pour vérifier la syntaxe, vous pouvez le recompiler :
python -m py_compile recalbox_SafeShutdown_gpi.py 
Ensuite pour finir, il faut rebooter pour que cela soit pris en compte pour les prochains power off.

6) Mais dans l'autre sens ??? et dans le cas où on serait en Raspberry Pi 3 B+ sans bouton d'arrêt ??? (edit: 09/01/2020). Il va falloir aussi être capable de lancer la restauration des sauvegardes qui sont dans le cloud quand on rallume (si wifi OK et accès internet bien sur !) et la sauvegarde quand on éteint sans le bouton (edit: 09/01/2020).

Si pas déjà fait, ou si reboot, il faudra relancer cette commande:
mount -o remount, rw /
Et ensuite on va créer un fichier pour lancer la récupération des sauvegardes du cloud.
cd /etc/init.d/
nano ./S99sync
Voici le contenu du fichier que j'ai créé:
Edit 09/02/2020: attention, la partie en rouge que j'ai rajouté n'est que pour la version RPI 2/3 sans bouton de stop. Pour le GPI Case on utilisera plutôt le script précédemment présenté pour gérer le backup lors du shutdown : "recalbox_SafeShutdown_gpi.py")

Edit 23/02/2020: mise à jour du script suivant pour mieux gérer en cas de non connexion à internet (j'essai 3 fois et j'arrête pour ne pas bloquer l'arrêt du système)


#!/bin/bash
case "$1" in
start)
COUNTER=0
# check that is online to run the first sync command
while [ $COUNTER -lt 3 ]
do
        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 remote:saves /recalbox/share/saves/ &
                wait $!
                break
        fi
        COUNTER= [$COUNTER +1]
done
;;

stop)
COUNTER=0
# check that is online to run the first sync command while [ $COUNTER -lt 3 ] do 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
;; restart|reload) ;; *)
# by default for standard "start" without parameter
COUNTER=0
# check that is online to run the first sync command
while [ $COUNTER -lt 3 ]
do
        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 remote:saves /recalbox/share/saves/ &
                wait $!
                break
        fi
        COUNTER= [$COUNTER +1]
done

esac

exit $?


Puis il va falloir le rendre executable:
chmod +x S99sync
Et ensuite pour que cela marche au boot, il faut copier la conf de rclone dans le repertoire racine ainsi:
mkdir /.config
cd /.config
mkdir rclone
cp -i /recalbox/share/system/.config/rclone/rclone.conf /.config/rclone
Et on peut rebooter mais via le bouton du GPi Case de préférence ;-).

Conclusion:
Ainsi vous avez vos sauvegardes dans le cloud, recalbox va démarrer plus ou moins vite maintenant parce qu'il devra checker le réseau avant et il faudra backuper des fichiers ou les restaurer. Cela reste raisonable, j'ai vu au maximum 10 à 15 secondes de plus à l'arrêt et au démarrage.

Et le jour où j'aurai mon panel arcade sous recalbox, je pourrais commencer une partie sur le panel et finir sur le GPi Case et vice-versa, magique ! non ?!

Enjoy ! ;-) (dans mon cas j'ai mis 3 soirées et un samedi matin pour finir, je suis lent et j'ai du comprendre des choses et debugguer les différents codes pour finaliser, j'espère que pour vous cela durera au max une soirée ;-)

P.S: j'ai essayé de le faire cet article surtout pour le refaire par la suite sur ma recalbox de mon futur panel ;-), mais il faudra peut être aussi pouvoir déclencher pas que sur le poweroff/poweron mais voir aussi avec ma domotique et Alexa ;-)