Dienstag, 7. April 2015

Computer mit FHEM an- und ausschalten

Wake On LAN mit FHEM

Kann ein Rechner im Netzwerk Wake on Lan so können wir ihn ganz einfach auch mit FHEM aufwecken. Wir brauchen die MAC Adresse und die IP Adresse des Rechners. Die IP Adresse wird von dem WOL Gerät in FHEM verwendet, um mit Ping zu prüfen, ob der Rechner im Netzwerk erreichbar ist. Entsprechend wird der Status auf on oder off gesetzt. Ich verwende in meinem Beispiel die UDP Methode. Für diese Methode muss nichts weiter installiert werden. In der Commandref  sind noch die Methoden mit den Tools ether-wake oder wakeonlan beschrieben, dafür müssen die entsprechenden Tools installiert werden.
define <Rechnername> WOL xx:xx:xx:xx:xx:xx 192.168.x.x UDP
Generell ist es sinnvoll zu konfigurieren, in welches Netzwerk das UDP Broadcast Packet versendet wird. Dazu muss die Broadcast Adresse konfiguriert werden. Dies geschieht mit dem entsprechendem  Attribut:
attr <Rechnername> useUdpBroadcast 192.168.x.255
Mit einem Druck auf on (oder set <Rechnername> on) sollte den Rechner aufwecken. Geschieht das nicht, ist der Rechner nicht richtig auf WOL konfiguriert. Man hat leider kein Feedback von der Weboberfläche, man "spürt" nicht ob man gedrückt hat oder nicht.
Sollte nach ca. 1 min der Status des eingeschalteten Rechners nicht auf on aktualisiert werden, ist zu prüfen ob der Rechner auf Ping reagiert, falls nicht muss eventuell noch die Windows Firewall konfiguriert werden (siehe weiter unten).


Um den Rechner auch ausschalten zu können, müssen wir ihn natürlich ordentlich herunterfahren. Für einen Windows Computer müssen wir folgende Vorarbeit leisten.

Benutzerverwaltung unter Windows

Um shutdown von der übrigen Verwaltung von Windows sauber zu trennen und mit maximaler Sicherheit für das System zu arbeiten, legen wir einen separaten Benutzer an.
Die Einrichtung neuer Benutzer ist auf jedem Windows System etwas anders zu finden, dass hängt leider nicht nur von der konkreten Version sondern auch persönlicher Konfiguration ab. Zumindest seit Windows 7 geht es einfach auf jedem deutschen System mit der Eingabe des Wortes "Benutzerkonten" im Suchfeld.
Generell führt uns die "Windows Taste" auf der Tastatur ins Suchfeld wenn wir uns auf dem Desktop befinden. Mit der Maus geht es so:
Windows 7 und Server 2008 - Startknopf ( -> Startmenü) und dann einfach tippen
Windows 8 und Server 2012 - Windows Knopf ( -> Kacheloberfläche) und dann einfach tippen


Wer sich manuell durch hangeln will, der muss das in etwa so tun:
Systemsteuerung --> Benutzerkonten --> Benutzerkonten verwalten
Leider ist das von Windows zu Windows Version immer wieder etwas verschieden.


Hier erstellen wir  ein neues Konto z.B. den "UserShutdown" als Standardbenutzer. Da wir später den Account im Klartext in der FHEM Konfiguration eintragen, bekommt dieser Benutzer nur minimale Rechte. Ich begnüge mich mit Standardbenutzer und einem zusätzlichem Recht. Man könnte ihm eventuell weitere Rechte entziehen.

Wir müssen ein sicheres Kennwort vergeben. Sichere Passwörter bestehen aus Groß- und Kleinbuchstaben, Zahlen und Sonderzeichen. Sonderzeichen sollte man sorgsam verwenden, es gibt nicht alle in jeder Sprache.

Beispiel: P@ssw0rd


Dieser Benutzer braucht jetzt noch entsprechende Rechte. Dazu öffnen wir die lokale Sicherheitsrichtlinie. Das geht mit dem Begriff "secpol.msc" im Suchfeld (siehe oben). Bei Windows 8 ist das allerdings etwas umständlich, da wird die App nicht sofort sondern erst ganz links im Bing Fenster angezeigt. Alternativ kann man gpedit.msc eingeben und verwenden, die Sicherheitseinstellungen sind eine Untermenge von Gpedit.

Der Benutzer bekommt das Recht das System herunterzufahren. Weitere Rechte sind nicht notwendig.


Soll der am Windows Computer angemeldete Benutzer eine Nachricht bekommen, muss ein Dienst aktiviert werden. Dazu tippen wir einfach services.msc im Suchfeld ein (siehe oben). Der Dienst Remoteregistrierung wird auf automatisch gestellt und gestartet. Für die Remote Shutdown Funktion alleine ist es nicht notwendig.








Der Dienst Remoteregistrierung ist wohl auch für den Eintrag des Shutdowngrundes im Eventlog zuständig.
Will man den Remote Shutdown von einem Windows System einleiten, müssen eventuell noch folgende Dienste aktiviert sein:
- Windows-Remoteverwaltung
- Windows-Verwaltungsinstrumentation





Firewalleinstellung unter Windows

Wenn wir Firewallregeln ändern müssen, empfehle ich die direkte Methode über Windows Firewall: Wir tippen im Suchfeld (langsam sollte jeder wissen wie es geht) firewall ein und öffnen das Tool "Windows-Firewall mit erweiterter Sicherheit".

Hier klicken wir auf Eingehende Regeln, es kann etwas dauern bis die Regeln angezeigt werden.
Für die Überwachung muss Ping zulässig sein, dafür müssen wir die beiden Regeln "Datei- und Druckfreigabe (Echoanforderung -ICMPvx eingehend) aktivieren. Sicher reicht uns v4, aber ich habe beide aktiviert.

Beispiel: Windows Server 2012

Für den Shutdownbefehl von Linux muss offenbar die Standardeinstellung der Firewall nicht angepasst werden, falls wenigstens Datei und Druckfreigabe aktiviert ist. Ansonsten je nach Windows Version überprüfen, dass SMB eingehend (Port 445) aktiviert ist. Für den Shutdown Befehl von einem Windows System muss unter Umständen mehr aktiviert werden:
Technet Artikel
Mit Powershell cmdlet Stop-Computer funktioniert es bei mir auch ohne.



Windows Shutdown mit FHEM

Das hier gezeigte Beispiel geht von FHEM auf einem Linux System aus.

Voraussetzung für den "net" Befehl unter Linux ist das Packet samba-common-bin. Ist bisher kein Samba installiert, muss jetzt zumindest dieses Packet installiert werden:

sudo apt-get install samba-common-bin
Wenn Windows ein remote shutdown zulässt, können wir mit dem Attribute shutdownCmd den Befehl eintragen. Ein Druck auf off lässt dann den PC innerhalb einer Minute herunterfahren.
attr <Rechnername> shutdownCmd "net rpc shutdown -I <Rechnername> -U UserShutdown%P@ssw0rd"


Man kann mit dem attr interval noch das Interval für die Ping Überprüfung konfigurieren. Als Standard ist die Ping Überprüfung aus und man kann mit set <Rechnername> refresh den Zustand aktualisieren.


Ein Linux System remote herunterfahren


Der shutdown Befehl für ein Linux System lässt sich am einfachsten per ssh realisieren. Das habe ich in dem Artikel beschrieben:
Per ssh Remote Befehle direkt ausführen

Die Sache mit der Broadcast Adresse

Bei Geräten mit mehreren Netzwerkanschlüssen ist es möglich, dass das Magic Packet ins falsche Netzwerk gesendet wird und damit beim Empfänger gar nicht ankommt. Mit dem Route Befehl kann man sich anschauen, was passieren würde:
IPv4-Routentabelle
===========================================================================
Aktive Routen:
     Netzwerkziel    Netzwerkmaske          Gateway    Schnittstelle Metrik
          0.0.0.0          0.0.0.0    192.168.178.1   192.168.178.54     25
        127.0.0.0        255.0.0.0   Auf Verbindung         127.0.0.1    331
        127.0.0.1  255.255.255.255   Auf Verbindung         127.0.0.1    331
  127.255.255.255  255.255.255.255   Auf Verbindung         127.0.0.1    331
   172.28.130.240  255.255.255.240   Auf Verbindung    172.28.130.241    271
   172.28.130.241  255.255.255.255   Auf Verbindung    172.28.130.241    271
   172.28.130.255  255.255.255.255   Auf Verbindung    172.28.130.241    271
    192.168.178.0    255.255.255.0   Auf Verbindung    192.168.178.54    281
   192.168.178.54  255.255.255.255   Auf Verbindung    192.168.178.54    281
  192.168.178.255  255.255.255.255   Auf Verbindung    192.168.178.54    281
        224.0.0.0        240.0.0.0   Auf Verbindung         127.0.0.1    331
        224.0.0.0        240.0.0.0   Auf Verbindung    192.168.178.54    281
        224.0.0.0        240.0.0.0   Auf Verbindung    172.28.130.241    271
  255.255.255.255  255.255.255.255   Auf Verbindung         127.0.0.1    331
  255.255.255.255  255.255.255.255   Auf Verbindung    192.168.178.54    281
  255.255.255.255  255.255.255.255   Auf Verbindung    172.28.130.241    271
===========================================================================
Ein Packet für das Netzwerk 192.168.178.x an die Broadcast Adresse 255.255.255.255 versendet würde hier im falschen Subnetz landen. Das Packet muss also an die richtige Broadcast Adresse 192.168.178.255 versendet werden. Die Tools arbeiten da unterschiedlich, blöd ist wenn man die Broadcast Adresse nicht angeben kann.

Montag, 6. April 2015

FHEM - kann ich nicht einfach bei null beginnen?

Diese Frage wird immer mal gestellt - Aber: Was ist eigentlich null?

Warnung: Was ich jetzt beschreibe löscht wirklich alle eigenen Definitionen. Falls man etwas behalten will, sollte man den Pfad /opt/fhem vorher komplett sichern!!! Zumindest die Textdatei fhem.cfg sollte man aufheben, eventuell stehen dort nützliche Definitionen drin, die man wieder übernehmen kann.

Also dann - setzen wir FHEM zurück:
- erstmal shutdown in der Befehlszeile von FHEM und tschüss Browser

Alles weitere über Terminal oder WinSCP
- die leere fhem.cfg gibt es hier, die ersetzt die bisherige fhem.cfg
Jetzt müssen wir noch ein paar Dateien unterhalb von /opt/fhem löschen:
- Inhalt von ./log löschen.
- Inhalt von ./backup löschen
- Inhalt von ./restoreDir löschen
- ./FHEM/controls_fhem.txt löschen
- ./FHEM/99_myUtils.pm kann man löschen oder behalten.

Jetzt können wir FHEM wieder starten und anschließend im Browser neu beginnen.

Diese Script würde das erledigen. Vorsicht die bestehende FHEM Installation wird damit zurückgesetzt auf null!

wget https://svn.fhem.de/fhem/trunk/fhem/fhem.cfg
sudo systemctl stop fhem
# Kopie anlegen
sudo cp -R /opt/fhem/ ~/Sicherung/
# Ab hier wird zurück gesetzt
sudo cp fhem.cfg /opt/fhem/
sudo chown fhem:dialout /opt/fhem/fhem.cfg
sudo rm -R /opt/fhem/log/
sudo rm -R /opt/fhem/backup/
sudo rm -R /opt/fhem/restoreDir/
sudo rm /opt/fhem/FHEM/controls_fhem.txt
sudo rm /opt/fhem/FHEM/99_myUtils.pm
# FHEM neu starten
sudo systemctl start fhem