# Voir la charge de la batterie avec AppleScript



## Chamyky (11 Mars 2007)

Bonjour, j'aimerais obtenir la charge de ma batterie avec AppleScript.
J'ai vu sur un site la commande shell "ioreg -l | grep IOBatteryInfo"... je n'y comprend strictement rien, donc je vous pose la question, comment l'utiliser (avec un do shell script ?) mais surtout est-ce qu'elle donne vraiment ce que je voudrais ?


----------



## tatouille (11 Mars 2007)

```
...
int i, battery;
CFArrayRef array;
CFDictionaryRef dict;
CFTypeRef cf, src, value;    
src = IOPSCopyPowerSourcesInfo();
array = IOPSCopyPowerSourcesList(src);

for(i=0; i<CFArrayGetCount(array); i++){
    cf = CFArrayGetValueAtIndex(array, i);
    dict = IOPSGetPowerSourceDescription(src, cf);
    if(dict != nil){
        value = CFDictionaryGetValue(dict, CFSTR("Current Capacity"));
        if(value != nil){
            if(!CFNumberGetValue(value, kCFNumberSInt32Type, &battery))
                battery = 100;
            printf("battery =&#37;d 100\n", battery);
            break;
        }
    }
}

CFRelease(array);
CFRelease(src);
...
```


----------



## ceslinstinct (12 Mars 2007)

Chamyky a dit:


> Bonjour, j'aimerais obtenir la charge de ma batterie avec AppleScript.
> J'ai vu sur un site la commande shell "ioreg -l | grep IOBatteryInfo"... je n'y comprend strictement rien, donc je vous pose la question, comment l'utiliser (avec un do shell script ?) mais surtout est-ce qu'elle donne vraiment ce que je voudrais ?



Bonjour

set Info_Batterie to do shell script "ioreg -l | grep IOBatteryInfo"
-- Pour simplifier la lecture
set {Info_Vals} to {words of (text ((offset of "," in Info_Batterie) + 2) thru -3 of Info_Batterie), {}}

info_Vals donne: {{"Amperage", "409", "Cycle", "Count", "16", "Current", "5191", "Voltage", "12525", "Flags", "1090519047", "AbsoluteMaxCapacity", "5400", "|", "|", "|", "|", "IOBatteryInfo", "=", "Capacity", "5398", "Amperage", "406", "Cycle", "Count", "16", "Current", "5191", "Voltage", "12525", "Flags", "1090519047", "AbsoluteMaxCapacity", "5400"}, {}}


```
set Info_Batterie to do shell script "ioreg -l | grep IOBatteryInfo"
set {Info_Vals} to {words of (text ((offset of "," in Info_Batterie) + 2) thru -3 of Info_Batterie), {}}
set charge_Maxi to item 13 of Info_Vals
set nbr_Charges to item 5 of Info_Vals
set charge_Reelle to item 21 of Info_Vals
set volts to (item 9 of Info_Vals) / 1000
etc...
```

J'espère que cela va t'aider.

Il te resteras à trouver la routine pour la température.

@+


----------



## Chamyky (12 Mars 2007)

@tatouille : Merci de ta r&#233;ponse, mais c'&#233;tait en Applescript que je tentais de r&#233;cup&#233;rer cette valeur ^^ ... mais &#231;a me servira quand je me mettrai s&#233;rieusement au C++ !

@ceslinstinc : Wow, merci  ! J'en ai beaucoup plus que ce que je demandais, je crois que je vais faire un panneau d'informations complet sur la batterie l&#224; !
Et merci de m'avoir pr&#233;sent&#233; &#231;a si bien  !

*Edit :* mince, quand je lance ton script, j'ai une erreur au niveau du "do shell script" :
"La commande s'est arr&#234;t&#233;e avec un &#233;tat non nul."
Ca n'a pas vraiment l'air d'une erreur, mais &#231;a coupe l'ex&#233;cution du script, m&#234;me compil&#233; en application...


----------



## ceslinstinct (12 Mars 2007)

Chamyky a dit:


> @tatouille : Merci de ta réponse, mais c'était en Applescript que je tentais de récupérer cette valeur ^^ ... mais ça me servira quand je me mettrai sérieusement au C++ !
> 
> @ceslinstinc : Wow, merci  ! J'en ai beaucoup plus que ce que je demandais, je crois que je vais faire un panneau d'informations complet sur la batterie là !
> Et merci de m'avoir présenté ça si bien  !
> ...



Bonsoir

C'est quoi ton ordinateur un PPC ou un Mac intel, mon script est pour un PPC (utilise ta signature pour indiquer ton ordinateur et le système que tu utilise).

La ligne de code que tu as donnée est pour PPC, donc pour te répondre j'ai utilisée mon portable (powerbook G4 17") qui est ppc pour tester le code, je travaille normalement sur un iMac 24" core 2 duo donc ta ligne de code fonctionne pas puisque ce n'est pas un portable (si c'est un processeur intel le code risque de pas être aussi le même).


@+


----------



## tatouille (13 Mars 2007)

```
#include <CoreFoundation/CoreFoundation.h>

#include <IOKit/pwr_mgt/IOPMLib.h>
#include <IOKit/pwr_mgt/IOPM.h>
#include <IOKit/ps/IOPSKeys.h>
#include <IOKit/ps/IOPowerSources.h>

int main(void)
{
    int i, battery;
    CFArrayRef array;
    CFDictionaryRef dict;
    CFTypeRef cf, src, value;
    
    src = (CFTypeRef) IOPSCopyPowerSourcesInfo();
    array = (CFTypeRef) IOPSCopyPowerSourcesList(src);
    
    for(i=0; i < CFArrayGetCount(array); i++)
    {
        cf = CFArrayGetValueAtIndex(array, i);
        dict = (CFTypeRef) IOPSGetPowerSourceDescription(src, cf);
        if(dict != nil){
            value = CFDictionaryGetValue(dict, CFSTR("Current Capacity"));
            if(value != nil){
                if(!CFNumberGetValue(value, kCFNumberSInt32Type, &battery))
                    battery = 100;
                printf("battery =%d 100\n", battery);
                break;
            }
        }
    }
    
    CFRelease(array);
    CFRelease(src);
    
    return 0;
}
```

gcc battery.c -framework IOkit -framework CoreFoundation -o battery


----------



## Chamyky (13 Mars 2007)

Ah voilà, j'ai un MacBook Intel Core Duo à 2Ghz blanc...
Donc, je devrait peut-être utiliser une partie de la nouvelle réponse de Tatouille à la place de la commande d'avant ?
Et pour mettre mes spécs en signature, je crois bien que mon image est trop haute, je n'ai plus de place...

Et Tatouille, tu essayes de me démontrer que le C++ est merveilleux ou quoi  ?
Je veux bien débuter moi, mais je n'ai pas (encore) trouvé de tuto qui utilisait des libs Mac (et une interface Cocoa, accessoirement) !


----------



## p4bl0 (13 Mars 2007)

Chamyky a dit:


> Ah voil&#224;, j'ai un MacBook Intel Core Duo &#224; 2Ghz blanc...
> Donc, je devrait peut-&#234;tre utiliser une partie de la nouvelle r&#233;ponse de Tatouille &#224; la place de la commande d'avant ?
> Et pour mettre mes sp&#233;cs en signature, je crois bien que mon image est trop haute, je n'ai plus de place...
> 
> ...


T'as pas besoin de te mettre au c, tatouille t'as tout donn&#233; 

donc tu prends son truc, tu compile comme il te l'indique, puis tu utilise le prog "battery" cr&#233;&#233; dans ton script :

```
set chargeBatt to do shell script "/path/to/battery_from_tatouille"
```
d'apr&#232;s ce que je vois sur le code de tatouille, chargeBatt sera un truc de la forme *battery =80 100* pour une batterie charg&#233;e &#224; 80&#37;, mais &#231;a reste &#224; v&#233;rifier :rateau:

pis val&#224;


----------



## Chamyky (13 Mars 2007)

Ok, je n'avais pas compris !
Il faut dire qu'il n'est pas très parlant dans son post  !

Eh bien, plus qu'à trouver comment compiler avec Xcode  ...
Je vais lire le manuel, ça va m'introduire au C comme ça  !


----------



## Obiagon (13 Mars 2007)

Chamyky a dit:


> Ok, je n'avais pas compris !
> Il faut dire qu'il n'est pas tr&#232;s parlant dans son post  !
> 
> Eh bien, plus qu'&#224; trouver comment compiler avec Xcode  ...
> Je vais lire le manuel, &#231;a va m'introduire au C comme &#231;a  !



Tatouille t'a &#233;galement donn&#233; la ligne &#224; taper dans le terminal afin de compiler le code :


> gcc battery.c -framework IOkit -framework CoreFoundation -o battery



 

Obiagon.


----------



## Chamyky (13 Mars 2007)

Obiagon a dit:


> Tatouille t'as également donné la ligne à taper dans le terminal afin de compiler le code :
> gcc battery.c -framework IOkit -framework CoreFoundation -o battery
> 
> 
> ...



Ahh, j'aurai pensé que c'était des instructions de compilation pour Xcode !

Et si j'ai bien compris, je dois copier coller son code dans un fichier texte, le renommer en battery.c et le placer à la racine de mon disque avant de lancer ça.... c'est ça ?


----------



## Obiagon (13 Mars 2007)

Chamyky a dit:


> Ahh, j'aurai pens&#233; que c'&#233;tait des instructions de compilation pour Xcode !
> 
> Et si j'ai bien compris, je dois copier coller son code dans un fichier texte, le renommer en battery.c et le placer &#224; la racine de mon disque avant de lancer &#231;a.... c'est &#231;a ?



Oui sauf que je ne te conseil pas de travailler sur la racine de ton disque. 

Cordialement,
Obiagon.


----------



## p4bl0 (13 Mars 2007)

Obiagon a dit:


> Oui sauf que je ne te conseil pas de travailler sur la racine de ton disque.
> 
> Cordialement,
> Obiagon.


Place le ou tu veux, puis va &#224; cet endroit grace &#224; la commande *cd* du terminal.

@Chamyky : Pour tatouille, faut s'adapter au d&#233;but c'est s&#251;r, mais une fois qu'on a compris le principe &#231;a marche super bien (m&#234;me si des fois on a du mal quand m&#234;me)


----------



## Chamyky (13 Mars 2007)

p4bl0 a dit:


> ...@Chamyky : Pour tatouille, faut s'adapter au d&#233;but c'est s&#251;r, mais une fois qu'on a compris le principe &#231;a marche super bien (m&#234;me si des fois on a du mal quand m&#234;me)





Et merci pour la commande cd, un peu plus et je la cherchais dans la doc aussi  !
Mais j'en avais d&#233;j&#224; eu vent, hein ^^ !

Merci &#224; vous tous pour votre grande aide  !


Edit: Tant que je suis chaud je vais modifier son code pour n'avoir que le nombre :king:  !


----------



## Obiagon (13 Mars 2007)

p4bl0 a dit:


> Place le ou tu veux, puis va à cet endroit grace à la commande *cd* du terminal.



Tu t'adresse à moi ??


----------



## Chamyky (13 Mars 2007)

Non, il m'expliquait comment faire pour changer de dossier... tu m'as dis que faire, lui comment  !

Et d'ailleurs, je vous soumet un script bricolé à la va-vite sensé m'aider à augmenter la durée de vie de ma batterie... mais je n'ai toujours rien entendu et le statut est toujours à "Descendre"... je regarderai ça plus en détail demain, mais si ça vous intéresse (dans le sens "à débugguer", c'est vraiment un truc basique sinon)...

```
on idle
	set chemin_vers_le_fichier to ((path to desktop as text) & "batterie.txt") as alias
	open for access chemin_vers_le_fichier with write permission
	set action to read chemin_vers_le_fichier
	close access chemin_vers_le_fichier
	
	
	set chargeBatt to do shell script "~/Documents/Autres/battery"
	-- Fin de montée
	if action = "Monter" and chargeBatt = 100 then
		say "Please unplug the MacBook !"
		--
		
		open for access chemin_vers_le_fichier with write permission
		write "Descente" starting at 0 to chemin_vers_le_fichier
		set eof chemin_vers_le_fichier to (length of le_contenu_a_memoriser)
		close access chemin_vers_le_fichier
		--
	end if
	if action = "Descente" and chargeBatt ? 99 then
		--
		
		open for access chemin_vers_le_fichier with write permission
		write "Descendre" starting at 0 to chemin_vers_le_fichier
		set eof chemin_vers_le_fichier to (length of le_contenu_a_memoriser)
		close access chemin_vers_le_fichier
		--
	end if
	-- Fin de descente
	if action = "Descendre" and chargeBatt ? 45 then
		say "Please plug-in the MacBook !"
		--
		
		open for access chemin_vers_le_fichier with write permission
		write "Montée" starting at 0 to chemin_vers_le_fichier
		set eof chemin_vers_le_fichier to (length of le_contenu_a_memoriser)
		close access chemin_vers_le_fichier
		--
	end if
	if action = "Montée" and chargeBatt is not equal to 45 then
		--
		
		open for access chemin_vers_le_fichier with write permission
		write "Monter" starting at 0 to chemin_vers_le_fichier
		set eof chemin_vers_le_fichier to (length of le_contenu_a_memoriser)
		close access chemin_vers_le_fichier
		--
	end if
	return 10
end idle
```


----------

