# Programmation d'alertes batterie avec AppleScript



## 3Skiing (19 Décembre 2010)

Bonjour tout le monde.

Je suis depuis peu un Macuser grâce à l'achat d'un Macbook Unibody de 2010 (processeur Intel).

Dans un souci de conserver au mieux l'état de la batterie je souhaite via AppleScript programmer des alertes batteries comme celle qui a d'origine dans le système quand la batterie est pratiquement déchargée.

Exemple de fonctionnement voulu: Dés qu'il reste 40% d'autonomie un message apparaît pour me prévenir.

Je suis novice dans AppleScript et je sais que pour ma programmation je dois recueillir des données dans le SMC (pourcentage).

Hors je ne sais pas comment recueillir cette donnée via AppleScript et encore moins faire interagir des boîtes de dialogue avec ces données.

Alors si quelqu'un à une idée de programmation je suis preneur.

Merci pour votre aide.


----------



## FrançoisMacG (19 Décembre 2010)

Bonjour, et bienvenue sur MacGé,


Et si regardais du côté de Watts 1.1.1 ? 

Pour 7$, le travail est déjà fait = http://binarytricks.com/


----------



## 3Skiing (20 Décembre 2010)

Merci FrançoisMacG de ta réponse rapide.

En surfant sur internet j'ai effectivement vu aussi l'application Watt qui à les fonctions que je souhait obtenir via AppleScript (avertissement du niveau de charge, indication du mode l'alimentation batterie ou secteur).

Mais je n'ai pas envie de reproduire mes erreurs du monde de Windows qui est d'avoir pratiquement un logiciel pour une fonction donnée.

Et donc en réfléchissant à mon problème je me demande s'il est possible de récupérer le script orginal de "batterie faible" pour le modifier.


----------



## FrançoisMacG (20 Décembre 2010)

3Skiing a dit:


> je me demande s'il est possible de récupérer le script orginal de "batterie faible" pour le modifier.


Cela doit être possible puisque Watts l'a (bien) fait, 

mais pas pour n'importe qui, 
avec un risque de déstabiliser le Mac, si l'on merdouille, 
et la probabilité de voir disparaître le reparamétrage à une mise à jour suivante du système, si on réussit

= je me contente d'afficher la charge de la batterie en pourcentage et de jeter un il de temps à autre dans la barre des menus de temps à autre,
et je n'ai installé que CoconutBattery.


----------



## 3Skiing (24 Décembre 2010)

Aprés des heures de recherche je suis tombé sur un script qui correspond à mes besoins (voir ci-dessous).

#!/bin/bash
min_percentage="15"
percentage=`pmset -g batt | grep -o "[0-9]\+%; discharging" | \
  sed -e "s/%.*$//"`
if [ "$percentage" ]; then
  if [[ $percentage -lt $min_percentage ]] ; then
    osascript -e "tell application \"System Events\"
        activate
        display dialog \"Battery almost dead: $percentage%\" \
          with icon 0 with title \"Warning\" buttons {\"OK\"} \
          default button 1
      end tell"
  fi
fi

Hors je recontre un problème quand je l'execute via AppleScript.
Il m'indique que la troisième ligne comporte une erreur de syntaxe sur le signe écrit et souligné en rouge sur le script ci-dessus.
Le message exacte est " expression prévu mais jeton inconnu trouvé.

Alors si quelqu'un peut me dire ce qui ne va pas dans le script, je le remercie d'avance.


----------



## bompi (24 Décembre 2010)

C'est juste que AppleScript ne doit pas bien comprendre la chose.

Voici deux idées pour t'en sortir :

créer un script trucmuche.sh et appeler simplement ce script dans ton AppleScript.
remplacer la méthode d'appel `...` par $() ; éventuellement mettre tout ce qu'il y a entre ces quotes inverses sur une même ligne.


----------



## 3Skiing (24 Décembre 2010)

Merci Bompi de ta réponse.
Malheusement je suis novice dans AppleScript alors pourais-tu me donner plus informations sur le changement d'appel.


----------



## bompi (24 Décembre 2010)

créer un dossier "bin" dans ta maison
y créer un fichier "test_battery.sh" et y mettre le contenu de ton script.
remplacer dans ton AppleScript le contenu du script par : /bin/bash $HOME/bin/test_battery.sh


----------



## 3Skiing (24 Décembre 2010)

Cela ne marche pas.
Ya t'il une autre méthode,


----------



## bompi (24 Décembre 2010)

Et ça te dit quoi, au juste ?


----------



## 3Skiing (26 Décembre 2010)

Il y a une erreur de synthaxe "Un(e) / ne peut pas se trouver ici" signe souligné et surligné en rouge ci-dessous.

/bin/bash $HOME/bin/test_battery.sh 

Alors je me demande si il est possible de trouver le script original de "batterie faible" dans le système et d'en faire une copie pour modifier le niveau d'alert.

Pour finir avec un peu de retard je souhait à tous les membres de macgénération un joyeux noel.


----------



## Anonyme (26 Décembre 2010)

Bonjour,



3Skiing a dit:


> Il y a une erreur de synthaxe "Un(e) / ne peut pas se trouver ici" signe souligné et surligné en rouge ci-dessous.
> 
> /bin/bash $HOME/bin/test_battery.sh


Il faut mettre la ligne dans un do shell script, 
/bin/bash n'est pas nécessaire.

```
set the_text_returned to do shell script "~/bin/test_battery.sh"
```


----------



## 3Skiing (26 Décembre 2010)

Merci de ta réponce Mac_Jac mais malheusement cela ne marche pas.

J'ai cette fois ci un message qui me dit "sh: User/3Skiing/bin/test_battery.sh: bin/bash^M bad interpreter: no such file or directory".

Voilà Mac à encore du mal à me convaincre.

Au passage si quelqu'un sait ou trouver le script "batterie faible" sur snow leopard je suis preneur.


----------



## Anonyme (26 Décembre 2010)

3Skiing a dit:


> Merci de ta réponce Mac_Jac mais malheusement cela ne marche pas.
> 
> J'ai cette fois ci un message qui me dit "sh: User/3Skiing/bin/test_battery.sh: bin/bash^M bad interpreter: no such file or directory".



Les problémes possible avec ton fichier *~/bin/test_battery.sh* est .

*1-* Ton fichier SH n'est pas un exécutable, il faut faire dans le Terminal
	
	



```
chmod u+x ~/bin/test_battery.sh
```
*2-* il n'est pas enregistré au format texte.
*3-* il n'est pas enregistré dans l'encodage *UTF8*
*4-* Les fin de lignes ne sont Unix 

Voici le script AppleScript qui fonctionne directement sans un fichier sh

```
set percentage to do shell script "pmset -g batt | grep -o \"[0-9]\\+%; discharging\" | sed -e \"s/%.*$//\""

if percentage is not "" and (percentage as integer) < 15 then
	activate
	display dialog "Battery almost dead: " & percentage with icon 0 with title "Warning" buttons {"OK"} default button 1
end if
```


----------



## 3Skiing (27 Décembre 2010)

Mac_Jac j'ai copier-coller le script que tu m'a gentiment donné et aucun message d'erreur n'apparaït.

Si j'ai bien compris, le script a le fonctionnement suivant:
Quand la charge de batterie est inférieur à 15% une boite de dialogue apparaît dans lequel il est écrit Battery almost dead.

Si c'est bien cela j'ai envie de dire bravo Mac_Jac.

Mais il me reste un dernière question.
Que faut il faire avec pour qu'il fonctionne automatiquement bref dés qu'on utilise son mac ? (lieu précis pour l'enregistrer, ajouter une ligne dans le script, etc..).


----------



## Anonyme (28 Décembre 2010)

Bonjour,



3Skiing a dit:


> Si j'ai bien compris, le script a le fonctionnement suivant:
> Quand la charge de batterie est inférieur à 15% une boite de dialogue apparaît dans lequel il est écrit Battery almost dead.


Oui c'est bien cela.




3Skiing a dit:


> Que faut il faire avec pour qu'il fonctionne automatiquement bref dés qu'on utilise son mac ? (lieu précis pour l'enregistrer, ajouter une ligne dans le script, etc..).


Voici le script, le dialogue est dans un bloc tell application, pour qu"il fonctionne avec un launchAgent, sinon il ne s'exécutera pas.

```
set percentage to do shell script "pmset -g batt | grep -o \"[0-9]\\+%; discharging\" | sed -e \"s/%.*$//\""

if percentage is not "" and (percentage as integer) < 15 then
	tell application "Finder"
		activate
		display dialog "Battery almost dead: " & percentage  with icon 0 with title "Warning" buttons {"OK"} default button 1
	end tell
end if
```

Voici une méthode pour que le script s'exécute automatiquement aux 5 minutes sur tous les comptes de la machine :
Cette méthode fonctionne sur Léopard et Snow Leopard.

Enregistre-le au format *Script* dans le dossier "*Scripts*" du dossier "*Bibliothèque*" du disque de démarrage, le nom du script sera "*BattCheck.scpt*".

Voici  comment faire un LaunchAgent pour exécuter le script aux 5 minutes :
Ouvre *TextEdit*, important ne pas faire ça dans Microsoft Word ou autre suite Office.

Vérifie dans dans le menu "*Format*" que le menu "*Convertir au format Texte*" existe, si oui sélectionne-le.
Copie et colle ce code dans la fenêtre de *TextEdit*

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>AlertBattery</string>
	<key>Program</key>
	<string>/usr/bin/osascript</string>
	<key>ProgramArguments</key>
	<array>
		<string>osascript</string>
		<string>/Library/Scripts/BattCheck.scpt</string>
	</array>
	<key>ServiceDescription</key>
	<string>Alerte batterie</string>
	<key>StartInterval</key>
	<integer>300</integer>
</dict>
</plist>
```
Enregistre-le sur ton bureau,  l'encodage doit être "*Unicode (UtF-8)*", décoches la case "*Utiliser ".txt" à défaut d'extension*", le nom du fichier sera "*BattCheck.plist*". 
Déplace le fichier "*BattCheck.plist*" dans le dossier "*LaunchAgents*" du dossier "*Bibliothèque*" du disque de démarrage, un mot de passe administrateur sera demandé.

Redémarre
C'est tout.


----------



## 3Skiing (28 Décembre 2010)

Bonjour Mac_Jac.

Je vais utiliser ton premier script car je n'est qu'un seul compte.
Et donc comme tu me le dit ce script fonctionne automatiquement grâce au bloc tell application, mais cela est valable pour qu'un seul compte c'est bien ça ?
Mais une fois compilé le script dans AppleScript je pense qu'il faut l'enregistrer. Mais faut-il l'enregistrer en format plist dans LaunchAgents.

Désolé encore de t'embêter mais je suis novice sur mac.


----------



## Anonyme (28 Décembre 2010)

3Skiing a dit:


> Je vais utiliser ton premier script car je n'est qu'un seul compte.
> Et donc comme tu me le dit ce script fonctionne automatiquement grâce au bloc tell application, mais cela est valable pour qu'un seul compte c'est bien ça ?.


Non.
C'est seulement si on utilise un launchagent, car il faut utiliser *osascript* pour exécuter un script AppleScript, et osascript ne fonctionne pas avec les dialogues(le code) qui ne sont pas dans le bloc tell application "x".

SI on on veut utiliser le script que pour un seul compte, les différences dans ma méthode seront :
*1-*  dossier "*Scripts*" du dossier "*Bibliothèque*" dans ta maison  au lieu du dossier "*Scripts*" du dossier "*Bibliothèque*" du disque de démarrage.
*2-*  dossier "*LaunchAgents*" du dossier "*Bibliothèque*" dans ta maison au lieu du dossier "*LaunchAgents*" du dossier "*Bibliothèque*" du disque de démarrage.
*3-* La ligne dans le fichier plist 





> <string>/Library/Scripts/BattCheck.scpt</string>


 doit-être modifié par
*/Users/ton nom d'utilisateur/Library/Scripts/BattCheck.scpt*





3Skiing a dit:


> Mais une fois compilé le script dans AppleScript je pense qu'il faut l'enregistrer. Mais faut-il l'enregistrer en format plist dans LaunchAgents.
> .


 Le script doit-être dans le dossier "Scripts" du dossier "Bibliothèque".

Le fichier plist est le texte qui commence par *<?xml version="1.0" encoding="UTF-8"?>*, lui il doit-être dans le dossier *LaunchAgents*.



Voici une solution plus simple pour un débutant :

Voici le script 
	
	



```
on idle
	set percentage to do shell script "pmset -g batt | grep -o \"[0-9]\\+%; discharging\" | sed -e \"s/%.*$//\""
	
	if percentage is not "" and (percentage as integer) < 15 then
		activate
		display dialog "Battery almost dead: " & percentage with icon 0 with title "Warning" buttons {"OK"} default button 1
	end if
	return 300 -- execution à toutes les  5 minutes
end idle

on quit
	continue quit
end quit
```

Enregistre ton script au format (*Application* si la version de ton  OS est 10.6.0 ou +),  (*Progiciel* pour les versions 10.5.8 ou moins), à l'emplacement de ton choix

Lance-le.

Ajoute-le dans les "Préférences systèmes..." dans "*Comptes*", onglet "*Ouverture*".

C'est tout.


----------



## Anonyme (28 Décembre 2010)

Bonsoir,

Important  si tu utilises mon dernier script :
Jai oublié d'écrire qu'il faut cocher la case "*Rester en arrière-plan*" lors de l'enregistrement.
Il faut le faire avec tous les scripts qui ont un gestionnaire on idle


----------



## 3Skiing (30 Décembre 2010)

Merci beaucoup de ton aide Mac_Jac.
Merci pour le temps que tu as passé pour résoudre mon problème.

Tout fonctionne comme je veux.

Maintenant il me reste à savoir comment exécuter les scripts de maintenance à heure régulière je pense créer une autre forum.

Si tout fois Mac_Jac tu as une idée sur le sujet je suis preneur.


----------



## bompi (30 Décembre 2010)

De quels scripts de maintenance parles-tu ?


----------



## FrançoisMacG (30 Décembre 2010)

3Skiing a dit:


> Maintenant il me reste à savoir comment exécuter les scripts de maintenance à heure régulière je pense créer une autre forum.


Je vais encore te contrarier

= as-tu regardé dans _Console > Fichiers > /private/var/log_ quand tes trois scripts se lancent sans que tu t'en occupes ?

Sous 10.6, ils sont lancés bien plus souvent dans la journée (au réveil quotidien du Mac) qu'avant.


----------



## 3Skiing (31 Décembre 2010)

Ne t'inquiète pas FrançoisMacG tu ne me contrarie pas.

Bompi je parle des scripts suivant:com.apple.periodic-daily,weekly,monthly.

J'ai regardé dans la console mais aucune trace de l'exécution de ces scripts. J'ai donc voulu savoir la dernière exécution des ces scripts via le terminal et cela est daté au 27 décembre ce qui est normal car je me souvient de l'avoir lancé manuellement ce jour-ci.

Last login: Fri Dec 31 12:15:08 on console
You have mail.
MacBook-de-3Skiing:~ 3Skiing$ ls -al /var/log/*.out
-rw-r--r--  1 root  wheel  2440 27 déc 19:25 /var/log/daily.out

Je me demande si il est possible de les programmer (Automator, AppleScript,etc) ou de les modifier pour qu'ils s'exécutent par exemple à 13h tous les jours ou tous les lundi ou tous les 1° du mois (dayly, weekly, monthly).


----------



## bompi (31 Décembre 2010)

Curieux, normalement ils se lancent bien sagement sur Snow Leopard. Ce qui est le cas sur mes deux Macs sous SL.

Pour en modifier l'ordonnancement, regarde les fichiers :

com.apple.periodic-daily.plist
com.apple.periodic-monthly.plist
com.apple.periodic-weekly.plist
dans le dossier _/System/Library/LaunchDaemons_.


----------



## 3Skiing (1 Janvier 2011)

Merci Bompi

J'ai modifier les horaires du fichier com.apple.periodic-daily.plist avec TextEdit pour des essais. 
Mais il enregistre bien la nouvelle heure mais il ne s'exécute pas comme même. 
Une idée ?


----------



## bompi (2 Janvier 2011)

Le fait de changer ces fichiers n'est d'aucun effet tant que tu n'as pas arrêté et relancé les services ou que tu n'as pas redémarré.


----------



## FrançoisMacG (2 Janvier 2011)

bompi a dit:


> Curieux, normalement ils se lancent bien sagement sur Snow Leopard. Ce qui est le cas sur mes deux Macs sous SL.


En sortie de veille, ils se lancent toute l'année sans souci chaque jour sur mon MB Pro.

Mais aujourd'hui dimanche 02 Janvier, après 48 heures d'extinction, j'ai raté l'hebdomadaire du samedi et le mensuel du 1er
= je suis passé par Onyx (qui, je l'avais zappé, affiche serviablement le jour de leur dernière réalisation).


----------



## bompi (2 Janvier 2011)

Pas de trève des confiseurs pour la maintenance de mon MBP.

D'un autre côté, ces opérations sont devenues un peu moins critiques que par le passé.


----------



## 3Skiing (11 Janvier 2011)

Excusez moi du fait d'assister, mais personne à une idée pour résoudre mon problème?


----------



## FrançoisMacG (11 Janvier 2011)

La commande qui lance les trois scripts est : 
	
	



```
sudo periodic daily weekly monthly
```
Il faut la faire suivre de son mot de passe admin : pas simple à intégrer dans Automator ou applescript ?

En laissant ton Mac en veille chaque nuit, les scripts s'exécuteront automatiquement au réveil le lendemain.
Onyx ou Applejack doivent être lancés manuellement : tu peux adjoindre une alerte iCal.
En automatique, pour 10$, tu as Snow Leopard Cache Cleaner : il lance les trois scripts à la fois.

Je n'ai pas mieux.


----------



## 3Skiing (14 Janvier 2011)

Ok merci FrançoiMacG pour ta réponse.
Je les lancerai régulièrement manuellement via le terminal.


----------

