====== Automate ====== Cette page est une ébauche. **Automate** est une application qui permet d'automatiser des choses sous Android. Par exemple activer le Wifi quand vous arrivez chez vous, prononcer à voix haute un SMS reçu quand vous êtes en voiture, ou encore prendre une photo si quelqu'un essaie de déverrouiller votre téléphone avec le mauvais code. Les possibilités sont assez étendues. La construction ne se fait pas par programme ou script, mais en assemblant graphiquement des blocs. Voici les quelques notions qu'Automate utilise (j'essaie de mettre entre parenthèses la notion correspondante en programmation traditionnelle): * **Bloc** (aka "instruction") : un bloc fournit une opération élémentaire (activer le Wifi, voir si le téléphone est connecté à un appareil bluetooth, attendre la réception d'un SMS, afficher une notification, prendre une photo, modifier une variable, envoyer une requête HTTP...). Voici [[https://llamalab.com/automate/doc/block/index.html|la liste des blocs]]. * **Flow** (aka "programme") : un flow est un ensemble de blocs reliés entre eux. On peut assimiler cela à un "programme". Vous pouvez avoir plusieurs flows, et différents flows peuvent être actifs en même temps. * **Variable** : Les blocs peuvent créer, modifier ou lire des [[https://llamalab.com/automate/doc/variable.html|variables]]. Les variables sont partagées entre blocs. Elles ne sont pas partagées entre flow. * Les variables peuvent être manipulées avec des [[https://llamalab.com/automate/doc/expression.html|expressions]] et des [[https://llamalab.com/automate/doc/function/index.html|fonctions]]. * **Fiber** (aka "processus") : On peut assimiler cela à un processus: Il s'agit d'un flow en train de s'exécuter (note : les //Flows// peuvent forker : on peut donc avoir potentiellement plusieurs //fibers// pour un même //flow//.) * Note: Pour être tout à fait exact, les variables sont locales à un //fiber// et non à un //flow//. Donc chaque //fiber// possède son lot de variables. Ceci étant dit, on peut échanger des valeurs entre fibers avec certains blocs (voir la section //Concurrency// des blocs). Voici un exemple simplifié : Quand on reçoit un SMS, si on est connecté au bluetooth de la voiture, alors on fait prononcer le SMS à voix haute (le bloc "SMS received" attend la réception d'un SMS): {{ :automate:automate_exemple_simple_sms_tts-nq8.png?direct&150 |}} Cet exemple est assez facile à comprendre, mais on peut bien entendu construire des choses beaucoup plus complexes. Les possibilités sont assez étendues, mais l'application n'est pas forcément simple à comprendre. Chaque bloc a son comportement particulier, mais une documentation facilement accessible est attachée à chaque bloc. N'hésitez pas à la lire. Il est à noter que même si un bloc existe, cela ne veut pas dire que vous pourrez l'utiliser : Certains blocs ne fonctionnent que sous certaines versions d'Android (à cause des limitations de Google) ou nécessitent un téléphone rooté. Par exemple, le bloc qui permet d'activer/désactiver les données mobiles ne fonctionne que sur les anciennes versions d'Android (Dans les versions récentes d'Android, Google a interdit aux applications de toucher au status des données mobiles). Ce bloc n'est donc utilisable sur les Androids récents que si votre téléphone est rooté. Pour savoir si un bloc fonctionnera sur votre téléphone, rien de mieux que de tester vous-même. (D'autant que chaque fabricant de smartphone bidouille Android à sa façon. Les comportements ne sont donc pas forcément les mêmes sur chaque téléphone.) Notez que l'application est fournie avec une fonction d'accès à la communauté : Des centaines de scripts, du plus simple au plus complexe, sont accessibles directement dans l'application. C'est une très bonne source d'exemples. ---- ===== Versions gratuite/payante ===== Automate est gratuit à la base, mais avec certaines limites: * Vous avez accès à la //totalité// des blocs et fonctions. * Mais vous êtes limité·e à 30 blocs en fonctionnement simultané, tous //flows// confondus. (Par exemple 1 flow avec 30 blocs, ou deux flow avec 15 blocs, etc.) Cela permet déjà de tout tester et de faire pas mal de choses, sans compter que la version gratuite ne vous embêtera jamais avec des popups pour vous proposer la version payante. La version sans limite ne coûte que 3,90€. Vous aurez accès à toutes les mises à jour futures du logiciel. Il y a plusieurs mises à jour par an avec des corrections de bugs et ajouts de fonctionnalités, et cela permet de soutenir l'éditeur (c'est un petit éditeur). PS: L'application payante n'est accessible que via GooglePlay, l'éditeur ne permet de l'acheter en dehors. ---- ===== Exemples de blocs ===== Chaque bloc a les caractéristiques suivantes : * Une seule entrée (rond en haut du bloc : //IN//) * Une ou plusieurs sorties (ronds en dessous ou sur le côté droit du bloc (//OK/YES/NO...//)) * Des paramètres en entrée (optionnels ou non) * Des variables en sortie (optionnelles) De plus, un bloc peut être bloquant ou non-bloquant: * Un bloc en mode "bloquant" arrêtera l'exécution jusqu'à ce qu'une condition soit remplie. * Un bloc non bloquant continuera immédiatement. Certains blocs sont bloquants, d'autres non-bloquants, et pour certains c'est paramétrable. Nous allons prendre deux blocs en exemple pour illustrer ces différences. La quasi-totalité des autres blocs fonctionnent sur les mêmes principes. ==== Exemple de bloc : SMS received ==== Ce bloc attend la réception d'un SMS: Une fois entré dans le bloc (rond "IN"), il va attendre la réception d'un SMS. Quand un SMS est reçu il sort alors par le "OK" et poursuit l'exécution du flow. Ce bloc est donc toujours bloquant. {{ :automate:automate-smsreceived-bloc-nq8.png?direct&200 |}} Il possède des paramètres en entrée (//Input arguments//) et des données en sortie (//Output variables//): {{ :automate:automate-smsreceived-params1-nq8.png?direct&200 |}} Paramètres en entrée: * Si vous laissez les paramètres vides, le bloc réagira à l'arrivée de n'importe quel SMS. * Si vous précisez le paramètre "Phone number", il ne réagira qu'à l'arrivée des SMS en provenance de ce numéro. * Si vous précisez le paramètre "Subscription id", il ne réagira qu'à l'arrivée des SMS sur la carte SIM sélectionnée. Données en sortie: * Si vous laissez tout vide, vous ne récupèrerez pas de données, ce qui n'est pas très intéressant, on peut donc mettre: * Dans //Sender phone number//, vous pouvez mettre **numero** pour récupérer le numéro de l'expéditeur du SMS dans la variable //numero//. * Dans //Message//, vous pouvez mettre par exemple **message** pour récupérer le contenu du SMS. * Il y a deux autres données en sortie : la date/heure de réception du SMS et la carte SIM par laquelle il est arrivé. Vous pouvez bien entendu aussi les récupérer si vous en avez besoin. Exemple de récupération des données en sortie: {{ :automate:automate-smsreceived-params2-nq8.png?direct&200 |}} Cela va donc créer deux variables dans votre flow (//numero// et //message//) qui pourront être utilisées en entrée dans d'autres blocs. ---- ==== Exemple de bloc : Bluetooth device connected ==== Ce bloc permet de tester si le téléphone est connecté à un périphérique bluetooth précis. {{ :automate:automate-btconnected-bloc-nq8.png?direct&200 |}} Il a 2 sorties différentes: * YES, par laquelle il sortira s'il est connecté au périphérique en question. * NO sinon. Pour fonctionner, ce bloc doit être paramétré : Allez dans la configuration du bloc et taper sur "PICK DEVICE" pour choisir le périphérique bluetooth sur lequel il doit réagir. Cela va automatiquement remplir les variables en entrée (C'est plus pratique que rentrer manuellement l'adresse MAC du périphérique bluetooth, mais cela reste possible si vous le souhaitez). Notez que dans les paramètres de ce bloc on peut le mettre l'option //Proceed// en //Immediately// ou //When changed// : * Avec //Immediately//, le bloc n'est **pas bloquant**: Il sortira immédiatement du bloc par YES si le périphérique en question est actuellement connecté, et par NON dans le cas contraire. * Avec //When changed//, ce bloc devient **bloquant**, il va **attendre** dans ce bloc: * Il sortira par YES au moment où le périphérique en question sera connecté. * Il sortira par NO au moment où le périphérique en question sera déconnecté. **Important à comprendre:** Le mode //When changed// sert donc généralement à attendre un évènement particulier, tandis que le mode //Immediately// sert à tester l'état à un moment donné. ---- * FIXME : expliquer la manipulation des blocs (ajouter/dupliquer/copier/coller/supprimer, lier/délier les blocs...) * FIXME : parler des logs, comment les lire, comment les désactiver. * FIXME : parler des droits activés à la demande. * FIXME : parler de la consommation de certains blocs (indiqué par le logiciel) * FIXME : parler des sauvegardes/exports * FIXME : parler des précautions à prendre (pas de boucles au début pour éviter un blocage du téléphone, décocher "Run on system startup" quand on expérimente) * FIXME : expliquer la raison de la notification permanente. * FIXME : Donner un exemple d'appel un flow à partir d'un autre flow * FIXME : parler des sécurités (limites SMS,MMS...) * FIXME : expliquer les limitations sur les envois de mails. * FIXME : expliquer le bloc //Catch failure// et son utilisation. ---- ===== Exemples de flows ===== Cette liste est juste à titre indicatif, elle sera sans doute modifiée: ==== Activer le Wifi quand on arrive à la maison (basé sur les tours GSM) ==== ==== Retrouver la position GPS du téléphone en lui envoyant un SMS ==== ==== Faire sonner le téléphone en lui envoyant un SMS ==== ==== Flasher à la réception d'un SMS ==== ==== Prononcer un SMS à voix haute quand il est relié à un périphérique bluetooth (voiture) ==== ==== Réagir à la réception d'un message Signal ==== ==== Afficher une alerte si la température du téléphone dépasse un certain seuil ====