SmartHomeNG - WOL & Shutdown


Hier nun ein Besipiel um einen Windows-PC über KNX hoch- und runterfahren zu lassen (getestet mit XP, Vista, Win7).

Ziel / Vorgabe:
Ein Windows-PC mit der IP-Adresse 192.168.1.172 und der MAC-Adresse 01:02:03:04:05:06 soll über die VISU, Tastsensor und zeitliche Vorgabe hoch- und runtergefahren werden. Bei der Bedienung über die Visu soll zusätzlich sichergestellt sein, das man nicht "aus Versehen" die zuständigen Buttons drücken kann. Den Status ob der PC wirklich an oder aus ist soll uns dabei via Ping geliefert werden.

Lösungsweg: PC hochfahren

In der ETS haben wir eine GA 5/5/1 mit Typ 1-bit angelegt und diese mit einem Tastsensor verknüpft. Dieser Sensor sendet bei Betätigung immer eine 1 (EIN).
Das Hochfahren des PC`s wird über das bekannte WOL erreicht. SmartHomeNG liefert hierfür ein Plugin, welches wir entsprechend in der plugin.yaml einbinden.
Diese finden wir unter:
/usr/smarthome/etc/plugin.yaml
Hier fügen wir nun folgendes ein: Dann die plugin.yaml speichern.
Nun brauchen wir nur noch unser Item zu erstellen. Zum hochfahren über Zeitvorgabe binden wir gleich crontab mit ein.

Mit diesem Item kann man nun den PC via Tastsensor hochfahren. Gleichfalls fährt der PC täglich um 07:15 Uhr hoch.

Lösungsweg: PC runterfahren

Für das Runterfahren (Shutdown) benötigt man generell ein kleines Hilfsmittel. Dieses Hilfsmittel nennt sich Remote Shutdown und kann hier runtergeladen werden.
Es ist zu empfehlen das Tool in den Autostart des zu steuernden Windows-PC zu legen.

Beschreibung Remote Shutdown (klick mich)

Zitat von Entwickler-Homepage:
Remote Shutdown ist ein kleines Programm, welches im Systemtray sitzt und auf UDP-Port 1982 lauscht. Sobald dort ein magisches Paket eintrifft, fährt das Programm die entsprechende Aktion (Herunterfahren, Ruhezustand oder Standby) aus. Im magischen Paket wird auch ein Passwort mitgesendet. Als Client kann beispielsweise GNU Netcat eingesetzt werden, welches auf vielen Plattformen verfügbar ist.



Weiter gehts. In der ETS haben wir eine GA 5/7/2 mit Typ 1-bit angelegt und diese mit einem Tastsensor verknüpft. Dieser Sensor sendet bei Betätigung immer eine 1 (EIN).
Nun erweitern wir unser Item von oben.

Wie man an dem crontab-Eintrag sieht, fährt der PC dann täglich um 17:30 Uhr wieder runter.
Nun erstellen wir eine Logik, die den erforderlichen Hex-Code, binär umgewandelt an den Zielrechner bzw. an das auf dem Rechner vorhandene Tool sendet. Dazu erstellen wir eine neue Datei, welche wir sinnvollerweise shutdown.py nennen. Die Datei erstellen wir im Logik-Verzeichnis, welche sich dort befindet:
/usr/smarthome/logics/
Der Inhalt der shutdown.py sieht wie folgt aus (!!! IP-Adresse anpassen !!!)
Nachdem wir die Datei erstellt, haben brauchen wir noch den Bezug zu der Logik, bzw. etwas was die Logik anspricht. Dazu hinterlegen wir in der logic.yaml, welche sich dort befindet
/usr/smarthome/etc/logic.yaml
den folgenden Eintrag shutdown.office ist hierbei das Item, auf welches "gehört" wird.
Somit haben wir 2 der 3 Vorgaben erfüllt. Kommen wir somit zur letzten.


Lösungsweg: Verriegelung der Button

Hierfür müssen wir uns ein eigenes Widget erstellen. Dazu erstellen wir uns eine html-Datei in unserem Pages-Verzeichnis und nennen diese z.B. widget_verriegelnung.html
In diese widget_verriegelnung.html fügen wir nun folgendes ein

widget_verriegelnung.html

/**
 * A list with selectable item
 *
 * @param       unique id for this widget
 * @param       a gad/item for the list
 * @param       a gad/item for the selected item
 * @param       the text to be displayed on top of the list
 */
{% macro list(id, gad_list, gad_item, txt ) %}
  <ul id="{{ uid(page, id) }}" data-widget="basic.list" data-item="{{ gad_list }}, {{ gad_item }}"
      data-role="listview" data-dividertheme="c"> 
              <li data-icon="false"><a href="#">View details</a></li>
              <li data-icon="false"><a href="#">Edit</a></li>
              <li data-icon="false"><a href="#">Disable</a></li>
              <li data-icon="false"><a href="#">Delete</a></li>
          </ul>  
{% endmacro %}


/**
 * Displays a slider-control
 *
 * @param       unique id for this widget
 * @param       a gad/item current time (progress)
 * @param       a gad/item total duration (maximum)
 * @param       seconds between two values (optional, default 5s)
 * @param       the orientation ('none', 'vertical', 'bottomup', 'semicircle')
 */
{% macro time_slider(id, gad_time, gad_duration, step, mode) %}

    <input id="{{ uid(page, id) }}" data-widget="my.time_slider" data-item="{{ gad_time }}, {{ gad_duration }}"
        type="range" value="0" min="0" max="1" disabled="1" step="{{ step|default(5) }}"
        orientation="{{ mode }}" data-highlight="true" />

{% endmacro %}

Als nächstes müssen wir noch den benötigten Java-Script-Code einbringen. Dies machen wir, indem wir folgenden Code in die visu.js in unserem Pages-Verzeichnis einfügen:

Nun erweitern wir unser Item um die Freigabe. Wir verwenden im Freigabe-Item den autotimer, damit sich das Item nach gesetzter Freigabe = Ein, automatisch nach 5 Sekunden wieder auf 0 setzt. Das gesamte Item sieht dann wie folgt aus:

Im nächsten Schritt können wir nun den Block und die dazugehörigen Widgets einbringen.

PC

Freigabe


WOL - Shutdown
ON OFF

Der dazugehörige Wiget-Code für einen Block 2 sieht so aus:
Jetzt wäre es natürlich noch schön, wenn wir eine Rückmeldung erhalten, ob der PC auch wirklich on- oder offline ist. Dies können wir ganz einfach via Ping umsetzen.
Dazu müssen wir nur unser Item erneut erweitern und diesem sagen, in welchem Zyklus der Zielrechner angeping werden soll. In dem unteren Beispiel (pc.buero.ping) wird der Rechner mit der IP 192.168.1.172 alle 60 Sekunden angepingt.

Wenn wir dies haben, können wir unseren Block2 um die basic.symbol-Einträge erweitern.

PC

Freigabe


WOL - Shutdown
ON OFF

Der dazugehörige Wiget-Code für einen Block 2 sieht nun so aus:



Abschließend noch 2 Beispiele für weitere Anwendungsmöglichkeiten.

PC & Hardware

Freigabe


WOL - Shutdown
ON OFF

PC - 192.168.1.172 ist

time_timer_switch time_timer_switch time_timer_switch time_timer_switch
Freigabe


WOL - Shutdown
ON OFF