NAS Server herunterfahren mit FHEM

Begonnen von Fashionbye, 13 Mai 2013, 01:10:13

Vorheriges Thema - Nächstes Thema

Fashionbye

Kann man über Ethernet einen Synology NAS Server per FHEM herunterfahren?
Habe ein DS410 und würde dieses gerne per FHEM herunterfahren bei Abwesenheit.
Einfach abschalten ist dauerhaft keine gute Idee.
Hat das schon mal jemand realisiert (außer über Aktor am Schalter), ein Ethernet Befehl wäre mir lieber?
Geht ja über das Webinterface, also muss es eine remote Möglichkeit geben.
FHEM 5.6 auf Raspberry Pi 2 Model B (2015), davor FritzBox 7390 (2012-2014), dann Beaglebone Black (Anf. 2015). CUL mit 2 GP-Ant.. Einige Dutzend FS20 Geräte, Bel. 100% LED 1-10V Dim., Multiroom Audio. 3 PV-Anlagen. Nächste Projekte: Zählerdatenerfassung, Heizungstemp./Solar, Jal.-St.

Puschel74

Hallo,

wenn du den Web-Befehl per Telnet/oder HTTP ans NAS schicken kannst sollte das möglich sein.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Fashionbye

Danke, ja, wenn ich den Web-Befehl wüsste, täte ich mir leichter.
Am Web-GUI von Synology dem DSM (Disk Station Manager) gibt es einen Button zum Herunterfahren, läuft in Java, soweit ich weiß. Aber wie man den Befehl "abfängt" - keine Ahnung.
FHEM 5.6 auf Raspberry Pi 2 Model B (2015), davor FritzBox 7390 (2012-2014), dann Beaglebone Black (Anf. 2015). CUL mit 2 GP-Ant.. Einige Dutzend FS20 Geräte, Bel. 100% LED 1-10V Dim., Multiroom Audio. 3 PV-Anlagen. Nächste Projekte: Zählerdatenerfassung, Heizungstemp./Solar, Jal.-St.

justme1968

wenn du mit runterfahren wirklich ausschalten meinst dann per ssh entweder poweroff oder syno_poweroff_task ausführen. wie man den suspend mode von der kommandozeile aktiviert habe ich leider noch nicht gefunden.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Bernd D.

Hallo Andre,

ich stand vor dem selben Problem bei meiner DS107+. Habe auch schon eine Lösung für das automatische Einschalten gefunden (Stichwort Funksteckdose und Kondensator an den Einschalttaster der Diskstation anlöten).

Das Herunterfahren habe ich experimentell wie folgt in einer 99_myutils.pm gelöst:


### Connect to diskstation
sub NAS_Shutdown()
{
 {fhem ("set NAS shutdown")};
 use Net::Telnet ();
    my ($t) = new Net::Telnet ( Timeout=>50,
Errmode=>'die');
$t->open("192.168.xxx.xxx");
Log 1, "NAS: Verbindung hergestellt";
$t->waitfor('/login: $/i');
$t->print("root");
Log 1, "NAS: login eingegeben";
$t->waitfor('/Password: $/i');
$t->print("xxxxxxxx");
Log 1, "NAS: Passwort eingegeben";
$t->waitfor('/DiskStation>/i');
$t->print('poweroff');
Log 1, "NAS: Shutdown Befehl ausgegeben";
my ($output) = $t->waitfor('/>/i');
print $output;
Log 1, "NAS: Shutdown abgeschlossen";
}


Beim Herunterfahren wird noch eine Warnung ins Logfile geschrieben, aber es funktioniert seit einigen Wochen bei mir problemlos. Testhalber sind vielleicht auch noch ein paar zu viele Log-Einträge drin.

Viele Grüße,
Bernd

justme1968

ja. oder das hier um per ssh ein kommando aufzuführen. das geht aber nur wenn die keys entsprechend ausgetauscht sind und nicht nach einem password verlangt wird. der vorteil ist es geht ohne zusätzliches perl paket wenn das ssh binary gefunden wird.

sub ssh_cmd($$@)
{
  my($host,$cmd,$user) = @_;
 
  my $ret;
 
  my $ssh = qx(which ssh);    
  chomp( $ssh );
  $ssh .= ' ';
  $ssh .= $user."\@" if( defined($user) );
  $ssh .= $host ." ". $cmd;
  if( open(my $fh, "$ssh|" ) ) {    
    $ret = <$fh>;
    close($fh);
  }
 
return $ret;
}


vielleicht findet ja noch jemand einen weg den suspend mode per software zu triggern. das wäre eigentlich noch eleganter und man könnte per wol einschalten.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Fashionbye

Danke für die Tipps. Meinte schon ausschalten, aber eben so,dass WOL danach wieder funktioniert.
@justme1968: das werde ich testen, wenn ich wieder zu Hause bin.
FHEM 5.6 auf Raspberry Pi 2 Model B (2015), davor FritzBox 7390 (2012-2014), dann Beaglebone Black (Anf. 2015). CUL mit 2 GP-Ant.. Einige Dutzend FS20 Geräte, Bel. 100% LED 1-10V Dim., Multiroom Audio. 3 PV-Anlagen. Nächste Projekte: Zählerdatenerfassung, Heizungstemp./Solar, Jal.-St.

botze

#7
Hallo Zusammen,

ich habe noch ein Frage bezüglich der SSH Funktion. Die Funktion läuft prima, aber ich frage mich ob diese Funktion solange sie ausgeführt wird, den FHEM Server blockiert?!

Zu meinem Hintergrund: Ich würde nämlich gerne einen SSH Command zur Datensicherung über diese Funktion aufrufen, der aber ein paar Sekunden dauert bis er die Sicherung durchgeführt hat. Das wäre ja blöd, wenn FHEM solange blockiert wäre.

Danke und Gruß,
Botze

kleineslichtHH

ich muss das hier leider nochmal rauskramen

folgende routine habe ich in der 99_myutils stehen

sub NAS_Stop()
{
{fhem ("set WOL_Synology ausschalten")};
use Net::Telnet ();
    my ($t) = new Net::Telnet ( Timeout=>50,
Errmode=>'die');
$t->open("192.168.xx.xx");
Log 1, "NAS: Verbindung hergestellt";
$t->waitfor('/login: $/i');
$t->print("admin");
Log 1, "NAS: login eingegeben";
$t->waitfor('/Password: $/i');
$t->print("xxxx");
Log 1, "NAS: Passwort eingegeben";
$t->waitfor('/DiskStation>/i');
$t->print('sudo poweroff');
Log 1, "NAS: Shutdown Befehl ausgegeben";
$t->waitfor('/Password: $/i');
$t->print("xxxxx");
Log 1, "NAS: Shutdown Befehl2 ausgegeben";
my ($output) = $t->waitfor('/>/i');
print $output;
Log 1, "NAS: Shutdown abgeschlossen";
}


folgende definition
Internals:
   DEF        00:11:32:xx:xx:xx 192.168.xx.xx BOTH
   IP         192.168.178.10
   MAC        00:11:32:xx:xx:xx
   MODE       BOTH
   NAME       WOL_Synology
   NR         48
   REPEAT     000
   STATE      aufwecken
   TYPE       WOL
   Readings:
     2016-10-07 21:58:47   active          off
     2016-10-07 21:58:57   isRunning       true
     2016-10-07 21:58:47   packet_via_EW   none
     2016-10-07 21:58:47   packet_via_UDP  none
     2016-10-07 21:58:57   state           on
   Timer:
     Wol_synology_ping:
       HASH       WOL_Synology
       MODIFIER   ping
       NAME       WOL_Synology_ping
   Helper:
     Bm:
       Wol_set:
         cnt        3
         dmx        0
         mAr
         max        0
         tot        0
Attributes:
   alias      Synology aufwecken
   devStateIcon on:general_an@green off:general_aus@red
   eventMap   on:aufwecken off:ausschalten
   group      Synology
   icon       it_nas
   room       System
   shutdownCmd { NAS_Stop() }


gebe ich die schritte per Hand in die Console ein (per Putty über SSH) funktioniert der WEg und die Synology fährt runter.

Wo habe ich da meinen Denkfehler?
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::fhem" at ./FHEM/99_myUtils.pm line 54.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::NAS_Stop" at (eval 5495) line 1.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::AnalyzePerlCommand" at fhem.pl line 1025.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::CommandSet" at fhem.pl line 1084.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::WOL_Set" at ./FHEM/98_apptime.pm line 104.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::DoSet" at fhem.pl line 1633.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::CommandSet" at fhem.pl line 2374.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::CallFn" at fhem.pl line 1601.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::CallFn" at fhem.pl line 3143.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::apptime_getTiming" at ./FHEM/98_apptime.pm line 74.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::CallFn" at fhem.pl line 1591.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::AnalyzeCommandChain" at fhem.pl line 3233.
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::AnalyzeCommand" at fhem.pl line 954.

Wernieman

Sorry bibn zu "faul zum Suchen", kannst Du mir bitte sagen, was in folgender Zeile steht?
2016.10.07 21:52:28 1: PERL WARNING: Deep recursion on subroutine "main::fhem" at ./FHEM/99_myUtils.pm line 54.

Also Zeile 54 in der ./FHEM/99_myUtils.pm

Und .. gibt es einen besonderen Grund, das Du unbedingt per telnet arbeitest? Der admin-User hat sehr viele rechte auf der Synology ......
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

kleineslichtHH

{fhem ("set WOL_Synology ausschalten")};

das ist die Zeile 54

ich habe es auch gerade noch versucht mit

{fhem ("set WOL_Synology off")};

leider mit selbem problem

per telnet arbeite ich eigentlich nur weil ich bisher keinen anderen weg gefunden habe über den raspberry die synology auszuschalten

Wernieman

stichwort ist ssh und keyauthentifizierung

Hast Du eventuell ein paar zeilen davor/dahinter?

Und .. was passiert genau bei "set WOL_Synology ausschalten"
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

kleineslichtHH

folgende routine habe ich in der 99_myutils stehen

sub NAS_Stop()
{
{fhem ("set WOL_Synology ausschalten")};
use Net::Telnet ();
    my ($t) = new Net::Telnet ( Timeout=>50,
Errmode=>'die');
$t->open("192.168.xx.xx");
Log 1, "NAS: Verbindung hergestellt";
$t->waitfor('/login: $/i');
$t->print("admin");
Log 1, "NAS: login eingegeben";
$t->waitfor('/Password: $/i');
$t->print("xxxx");
Log 1, "NAS: Passwort eingegeben";
$t->waitfor('/DiskStation>/i');
$t->print('sudo poweroff');
Log 1, "NAS: Shutdown Befehl ausgegeben";
$t->waitfor('/Password: $/i');
$t->print("xxxxx");
Log 1, "NAS: Shutdown Befehl2 ausgegeben";
my ($output) = $t->waitfor('/>/i');
print $output;
Log 1, "NAS: Shutdown abgeschlossen";
}


folgende definition
Internals:
   DEF        00:11:32:xx:xx:xx 192.168.xx.xx BOTH
   IP         192.168.178.10
   MAC        00:11:32:xx:xx:xx
   MODE       BOTH
   NAME       WOL_Synology
   NR         48
   REPEAT     000
   STATE      aufwecken
   TYPE       WOL
   Readings:
     2016-10-07 21:58:47   active          off
     2016-10-07 21:58:57   isRunning       true
     2016-10-07 21:58:47   packet_via_EW   none
     2016-10-07 21:58:47   packet_via_UDP  none
     2016-10-07 21:58:57   state           on
   Timer:
     Wol_synology_ping:
       HASH       WOL_Synology
       MODIFIER   ping
       NAME       WOL_Synology_ping
   Helper:
     Bm:
       Wol_set:
         cnt        3
         dmx        0
         mAr
         max        0
         tot        0
Attributes:
   alias      Synology aufwecken
   devStateIcon on:general_an@green off:general_aus@red
   eventMap   on:aufwecken off:ausschalten
   group      Synology
   icon       it_nas
   room       System
   shutdownCmd { NAS_Stop() }


gebe ich die schritte per Hand in die Console ein (per Putty über SSH) funktioniert der WEg und die Synology fährt runter

Wernieman

Warum steht in dem NAS_Stop() denn ein "fhem ("set WOL_Synology ausschalten")"???

Außerdem .. eigentlich brauchst Du keine {} bei dem fhem Befehl, da Du schon in Perl bist ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

kleineslichtHH

Zitat von: Wernieman am 08 Oktober 2016, 16:01:30
Warum steht in dem NAS_Stop() denn ein "fhem ("set WOL_Synology ausschalten")"???

Außerdem .. eigentlich brauchst Du keine {} bei dem fhem Befehl, da Du schon in Perl bist ....

das hatte ich mir aus diesem Beitrag https://forum.fhem.de/index.php/topic,12791.msg77870.html#msg77870