[Gelöst] Computer auf Standby & Hibernate setzten

Antworten
meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

[Gelöst] Computer auf Standby & Hibernate setzten

Beitrag von meister0815 »

Hallo zusammen, hier spricht ein relativer Pascal-Neuling.

Welche Befehle brauche ich, um unter Linux (Ubuntu 10.10) den Computer in den Ruhezustand oder in den Standby-Modus zu versetzten?

Hintergrund: Möchte ein Programm schreiben, dass mir nach einer bestimmten Zeit den PC Herunterfährt/Neustartet/Standby-Modust/Ruhezustandet ;-)
Neustarten und Herunterfahren habe ich schon gelöst.

Für jeden Tipp dankbar ist:
Meister0815
Zuletzt geändert von meister0815 am Di 12. Okt 2010, 23:26, insgesamt 1-mal geändert.

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Computer auf Standby & Hibernate setzten

Beitrag von felix96 »

geht es nicht vllt. mit Batch?
Die Batchdatei könntest du mit http://wiki.lazarus.freepascal.org/Executing_External_Programs/de
starten.
oder ansonsten:

Code: Alles auswählen

mouse.cursorpos:=Point(x,y);//y müsste screen.width-5 sein, und x=5
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);

Und so das ganze Manuel klicken lassen. warten kannst du mit Sleep(ms);

Ich hoffe ich konnte dir Helfen.

P.S. Code ungetestet
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Computer auf Standby & Hibernate setzten

Beitrag von theo »

Es gab hier mal einen Thread dazu: viewtopic.php?f=16&t=2835
Musst halt schauen, ob das noch aktuell ist.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Computer auf Standby & Hibernate setzten

Beitrag von corpsman »

oder du schaust direkt was ich daraus gemacht habe : Wecker Der kann was du willst.
--
Just try it

meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

Re: Computer auf Standby & Hibernate setzten

Beitrag von meister0815 »

Danke an alle für die Hinweise, leider ist das Problem aber noch nicht gelöst.

@felix96:
Mit Batchdatei würde vielleicht klappen, sofern ich eine Batch-Datei dazu finde...
Die manuelle Variante mit Mausklicks kommt nicht in Frage, da das Programm auch auf anderen Rechnern funktionieren soll (die evtl. ihre Buttons woanders haben).

@theo:
Danke für den Link, leider arbeitet die dort angegebene Lösung mit HAL, das m.W. seit Ubuntu 10.10 nicht mehr automatisch mit an Bord ist.

@corpsman:
Verrätst Du mir auch, wie die Hibernate-Routine in deinem Wecker funktioniert? Konnte nirgendwo den Quellcode finden...

meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

Re: Computer auf Standby & Hibernate setzten

Beitrag von meister0815 »

Jipieh!!! Hab noch die Lösung gefunden. Der Aufruf über dbus muss lauten:

Code: Alles auswählen

dbus-send --print-reply \
        --system \
        --dest=org.freedesktop.UPower \
        /org/freedesktop/UPower \
        org.freedesktop.UPower.Suspend (oder Hibernat)e

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: [Gelöst] Computer auf Standby & Hibernate setzten

Beitrag von corpsman »

Code: Alles auswählen

Procedure PowerManagement(Command: Pchar);
Const
  HAL_DBUS_SERVICE = 'org.freedesktop.Hal';
  HAL_ROOT_COMPUTER = '/org/freedesktop/Hal/devices/computer';
  HAL_DBUS_INTERFACE_POWER = 'org.freedesktop.Hal.Device.SystemPowerManagement';
 
Var
  connection: PDBusConnection;
  mess, reply: PDBusMessage;
  error: DBusError;
  exit_code: integer;
Begin
  dbus_error_init(@error);
  connection := dbus_bus_get(DBUS_BUS_SYSTEM, @error);
 
  If (dbus_error_is_set(@error) <> 0) Then Begin
    //printf("Unable to connect to the daemon bus: %s",error.message);
    dbus_error_free(@error);
    exit;
  End;
 
 
  mess := dbus_message_new_method_call(HAL_DBUS_SERVICE,
    HAL_ROOT_COMPUTER,
    HAL_DBUS_INTERFACE_POWER,
    Command);
  If (mess = Nil) Then Begin
    //printf("Out of memory");
    exit;
  End;
 
  reply := dbus_connection_send_with_reply_and_block(connection,
    mess,
    -1, // Default DBus timeout
    @error);
 
  dbus_message_unref(mess);
 
  If (dbus_error_is_set(@error) <> 0) Then Begin
    //printf("Error occured while trying to hibernate: %s", error.message);
    dbus_error_free(@error);
    exit;
  End;
 
  If (reply = Nil) Then Begin
    //printf("Message hibernate didn't get a reply");
    exit;
  End;
 
  // If we have received a reply then there is a return code from the util that HAL executed
  Case (dbus_message_get_type(reply)) Of
 
    DBUS_MESSAGE_TYPE_METHOD_RETURN: Begin
        dbus_message_get_args(reply, Nil,
          DBUS_TYPE_INT32,
          [@exit_code,
          DBUS_TYPE_INVALID]);
        dbus_message_unref(reply);
        exit;
      End;
    DBUS_MESSAGE_TYPE_ERROR: Begin
        dbus_message_unref(reply);
        //printf("Error occured while trying to hibernate");
      End;
  End;
  dbus_connection_unref(connection);
End;


Aufruf mit

PowerManagement('Hibernate');
PowerManagement('Shutdown');

Aber wenn ich das richtig Lese was du da schriebst, muss ich dich um deinen Code bitten, noch bin ich unter Kubuntu 10.4 aber morgen wird Kubuntu 10.10 released ...
--
Just try it

meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

Re: [Gelöst] Computer auf Standby & Hibernate setzten

Beitrag von meister0815 »

@corpsman:

Bei mir sieht das so aus und funktioniert unter 10.10 prima:

Code: Alles auswählen

procedure doStandby;
var p: TProcess;
begin
  if FileExists('/usr/bin/dbus-send') then
  begin
    p:=TProcess.Create(nil);
    p.Options:=[poStderrToOutPut];
    writeLn('Standby Linux...');
    p.CommandLine:='dbus-send --system --print-reply --dest=org.freedesktop.UPower /org/freedesktop/UPower org.freedesktop.UPower.Suspend';
    p.Execute;
    p.Free;
    //halt(0);
  end
  else writeLn('DBus command line utility not found!');
end;
 
 
procedure doHibernate;
var p: TProcess;
begin
  if FileExists('/usr/bin/dbus-send') then
  begin
    p:=TProcess.Create(nil);
    p.Options:=[poStderrToOutPut];
    writeLn('Hibernating Linux...');
    p.CommandLine:='dbus-send --system --print-reply --dest=org.freedesktop.UPower /org/freedesktop/UPower org.freedesktop.UPower.Hibernate';
    p.Execute;
    p.Free;
    //halt(0);
  end
  else writeLn('DBus command line utility not found!');
end;

Antworten