"Akkupflege" mit AppleScript
Moin,
um mal wieder frischen Wind in den Akkuwald zu blasen (vor allem war es aber ein Anfall langer Weile),
spiel(t)e ich mit Applescript. Also (fasst) alles mit Bordmitteln (launchd mit den plist hab ich durch Lingon erstellen lassen >> ich bin etwas faul geworden <<:
--Aufruf aller 10 min durch (launchd)
--Meldung bei Akku <20 % und >80/99 %, aller wdhzeit
--ist akkulevel 20-80, dann beendet sich App
set min to "22" --MinLadewert
set minreset to "60" --bei Entladen < Wert: Reset ladeziel auf max1
set max1 to "77" --MaxLadewert
set max2 to "99" --Vollladewert
set wdhzeit to "60" --Meldefenster Wdh.-zeit in s
set givupzeit to "20" -- Meldefenster Einblendzeit in s
set akkulevel to word 6 of paragraph 2 of (do shell script "pmset -g batt") as number --Auslesen akkulevel
set akku to word 7 of paragraph 2 of (do shell script "pmset -g batt") as string --Auslesen charging/discharging
set ladeziel to (read file "Macintosh HD:users:testerer:scripte:akkupflege_merker.txt") --Auslesen ladeziel aus Merkerdatei
--setzt ladeziel immer auf max1, wenn akkulevel wieder unter minreset
set fileID to open for access file "Macintosh HD:users:testerer:scripte:akkupflege_merker.txt" with write permission
if akkulevel < minreset then set ladeziel to max1
write ladeziel to fileID
close access fileID
--Schleife "MinMeldung", zyklische Meldung bis geladen wird
if akkulevel < min and akku = "discharging" then
repeat until akku = "charging"
set akku to word 7 of paragraph 2 of (do shell script "pmset -g batt") as string --Ladeerkennung
if akku = "discharging" then --Schleife muss bleiben, sonst wird Mldg noch einmal wdh
beep 3
activate
display alert "Akku " & akkulevel & " %. " & "Bitte laden." buttons {"Okay"} giving up after givupzeit
end if
delay wdhzeit
end repeat
end if
--Schleife "Max1Meldung" mit Auswahl max1 (default) oder max2, zyklische Mldg. bis entladen wird
if ladeziel = max1 and akkulevel > max1 and akku ≠ "discharging" then -- /= entspricht ungleich
repeat until akku = "discharging"
set akku to word 7 of paragraph 2 of (do shell script "pmset -g batt") as string --Entladeerkennung
if akku = "charging" then
beep 3
activate
display alert "Akku " & akkulevel & " %. " & "Ladekabel entfernen oder weiterladen?" buttons {"Entfernen", "Weiter"} default button 1 giving up after givupzeit
set Diogresult to result
if button returned of result = "Entfernen" then
set akkumax to max1
else if button returned of result = "Weiter" then
set akkumax to max2
else if gave up of Diogresult is true then
set akkumax to max1
end if
set fileID to open for access file "Macintosh HD:users:testerer:scripte:akkupflege_merker.txt" with write permission
write akkumax to fileID --schreiben ladeziel neu
close access fileID
set ladeziel to (read file "Macintosh HD:users:testerer:scripte:akkupflege_merker.txt") --Auslesen ladeziele neu- innerhalb repeat-loop
if ladeziel = max2 then set akku to "discharging" --Schleifenausgang bei Auswahl max2
end if
delay wdhzeit
end repeat
end if
--Schleife "Max2Meldung"
if ladeziel = max2 and akkulevel > max2 and akku ≠ "discharging" then
repeat until akku = "discharging"
set akku to word 7 of paragraph 2 of (do shell script "pmset -g batt") as string --Entladeerkennung
if akku ≠ "discharging" then
beep 3
activate
display alert "Akku voll. Bitte Ladekabel entfernen." buttons {"Okay"} default button 1 giving up after givupzeit
end if
delay wdhzeit
end repeat
end if
Das Script wird als Akkupflege.app durch launchd aller 10 min aufgerufen, schaut sich den Akkuladestand an und erinnert bei einem Minimumladewert zum Laden. Beim Laden um die 80 % erinnert es "Stecker ziehen", bzw. fragt nach ob weiter (bis 99 %) laden soll.
Da, bedingt durch die Aufrufzeit mit Toleranzen gerechnet wird, sind die Prozentwerte nie genau 80/100.
Funktioniert sogar gut ;o)
Nachteil ist der externe Speicherort des Zielladewertes in eine Textdatei (77 oder 99 %).
Aber da das Script nicht dauernd läuft (laufen soll, dafür ist AS nicht ausgelegt), muss die die Variable irgendwo zwischengespeichert werden.
property und global gehen hier nicht.
Speichern über posix ins bundle wäre eine Variante (relative Pfadangaben machbar???).
Jemand Optimierungsideeen?
(Keine Akkudiskusion, Thread soll reines Scriptquatschen werden...)
MacBook Air (M1, 2020)