Select Page

NETWAYS Blog

Getting started Opennebula API

In wenigen Tagen starten die OpenNebula Techdays welche von Netways gesponsort werden. Da auf diesen einige interessante Dinge gezeigt werden gibt es hier jetzt eine kleine Einführung in die API.
Wenn man die API von OpenNebula benutzen möchte, gibt es zwei Möglichkeiten. Einmal “RPC XML” und zweitens mit einem Ruby Binding. In meinem Beispiel werde ich mich auf das Ruby Binding beziehen.
Um mit der API rumspielen zu können benötigen wir erstmal eine passende OpenNebula Umgebung. Hierfür können wir uns ganz einfach eine vorinstallierte VM als VirtualBox image herunterladen.
Um nun auch auf die API zugreifen zu können, muss man noch eine Portweiterleitung für den Port “26330” einrichten (Port 9869 ist optional, sollte man auch auf das Web-interface zugreifen wollen). Die Weiterleitung kann unter Setting > Network > Advanced > Port Forwarding eingerichtet werden.
Jetzt kann man anfangen sich gegen die API zu connecten. Als erstes fügt man die benötigten Ruby Gems hinzu. Dies wird mit

require 'opennebula'
include OpenNebula

gemacht.
Danach erstellt man Variablen für die login credentials und den Endpoint. Ich benutze dafür die default Username und Passwort Kombination.

CREDENTIALS = "oneadmin:opennebula"
ENDPOINT    = "http://<DeineVBoxIP>:26330/RPC2"

 
Nachdem dies erledigt ist, kann man eine Verbindung zur API festlegen. Hierfür legt man wieder eine Variable fest. (Bitte beachtet, das die credentials und endpoint variablen genauso heißen, wie oben festgelegt!)

client = Client.new(CREDENTIALS, ENDPOINT)

 
Als nächstes initialisiert man den Virtual Maschine Pool. Dafür wird die Variable vm_pool angelegt.

vm_pool = VirtualMaschinePool.new(client, -1)

 
Um mögliche Fehler abzufangen kann man eine kurze Fehlerabfrage einrichten. Diese gibt uns, im Falle eines Fehlers, gleich den richtigen Fehler Code zurück.

rc = vm_pool.info
if OpenNebula.is_error?(rc)
     puts rc.message
     exit -1
end

 
Damit jetzt jede Virtuelle Maschine gestoppt wird, richtet man eine kleine Schleife ein die uns pro VM, die sich im vm_pool befindet, eine Funktion ausführt.

vm_pool.each do |vm|
     rc = vm.shutdown
end

 
Mit der oben eingerichteten Fehlerabfrage kann man sich hier auch gleich noch den aktuellen Status bzw eine Success oder Fehlermeldung ausgeben lassen. Dafür fügt man ein paar Zeilen zu seiner Schleife hinzu.

vm_pool.each do |vm|
     rc = vm.shutdown
     if OpenNebula.is_error?(rc)
          puts "Virtual Machine #{vm.id}: #{rc.message}"
     else
          puts "Virtual Machine #{vm.id}: Shutting down"
     end
end

 
Das ganze noch mit einem sauberen

exit 0

abschließen und das erste Script ist fertig!
 
Um das Endprodukt testen zu können, muss man noch eine VM in OpenNebula erstellen. Hierfür kann man ein schon vorgefertigte Template nutzen.
OpenNebula API
Dieses einfach instantiieren und warten bis die VM hochgefahren ist. (Meist ca 10 Sekunden).
Wenn man jetzt das Ruby Script ausführt sollten man folgende Ausgabe erhalten:

Virtual Machine 1: Shutting down

 
Wie man an diesem Beispiel sehen kann, ist es sehr einfach eigene Scripte für Opennebula zu schreiben. Noch mehr spannende Dinge gibt es auf den diesjährigen TechDays!

Steckdosen via Raspberry Pi und Webinterface steuern

Um sein Zuhause oder Büro kostengünstig mit einem Raspberry Pi zu steuern benötigt es garnicht mal so viel. Steuerbare Funksteckdosen, einen Pi und ein 433 Mhz Sendemodul reichen schon aus.
Diese Woche geht es um die Steuerung der Funksteckdosen per Komandozeile und Webinterface.
pi
Raspberry Pi mit 433 MHz Sender
Hier erstmal die Liste der genutzen Teile:
Funksteckdosen von Brennenstuhl (Amazon)
433 MHz Funk-Sende- und Empfänger-Modul (Amazon)
Jumperwires female (Amazon)
Antenne (Amazon)
Schritt 1:
Zunächst müssen wir das Sendemodul an den Raspberry Pi anschließen. Bei dem vorgeschlagenen 433 MHz Sender ist dies die quadratische Platine mit drei Pins und einem Anschluss oben rechts (ANT beschriftet).

  • Pin 1 (links): ATAD (Daten)
  • Pin 2 (mitte): VCC (Versorgungsspannung)
  • Pin 3 (rechts): GND (Masse)

Anschluss: Ant (Antenne)Die ersten 3 Pins verbinden wir mit dem Raspberry Pi. Pin 1 kommt hierfür (wie in der untenstehenden Grafik zu sehen) an Pin 11 (GPIO-Pin 17) auf dem Raspberry Pi. Danach bekommt das Modul noch Strom. Dafür den Pin 2 auf Pin 4 am Raspberry Pi anschließen (Auf diesem sind 5V angelegt). Pin 3 (GND) kommt an den Groundpin des Pi’s (Pin 6).
Um die Reichweite zu erhöhen muss noch die Antenne an (ANT) angelötet werden . Ansonsten hat das Modul nur eine Reichweite von ungefähr 2 Metern. Mit Antenne beträgt die Reichweite ca. 30 Meter.rpi_433cct
(Quelle: Einplatinencomputer)
Schritt 2:
Zuerst bringen wir unser Pi auf den neusten Stand. Außerdem brauchen wir zum Installieren der benötigten Software Git , welches wir über den Paketmanager installieren.

sudo apt-get install git

Schritt 3:
Zur Ansteuerung des 433 MHz Senders benötigen wir WiringPi. Hiervon holen wir uns mit Hilfe von Git den Quellcode und führen das Build-Script aus, welches uns einige Dateien kompiliert.

git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
cd ..

Schritt 4:
Außerdem brauchen wir Raspberry-remote. Diese Software bietet uns eine Anwendung mit deren Hilfe wir die benötigten Funkbefehle absetzen können.

git clone git://github.com/xkonni/raspberry-remote.git
cd raspberry-remote
make send

Schritt 5:
Nun müssen wir noch unsere Funksteckdose einstellen (um an die Pins ranzukommen muss man die kleine Schraube an der Rückseite der Dose öffnen). Damit niemand anderes auf diese zugreifen kann, werden wir zuerst einen zufälligen Code einstellen. Dazu einfach die Kippschalter (1, 2, 3, 4, 5) hoch oder runter stellen. In meinem Fall habe ich jetzt alle Schalter hoch gestellt, was dem Unitcode 1 1 1 1 1 entspricht. Danach stellen wir noch ein auf welchem Channel die Dose hören soll. Ich habe hier “B” gewählt. Um den Channel zu setzen muss man einfach nur den gewünschten Buchstaben auf 1 (hochstellen) setzen.
dose
Schritt 6:
Nachdem alles nach unserem Wunsch eingestellt ist können wir nun testen ob wir die Funksteckdose ansteuern können. Dazu geben wir den folgenden Befehl ein:
sudo ~/raspberry-remote/send [Systemcode] [Steckdosen-Nummer] [Zustand]
Beispiel: Unsere Steckdose einschalten

sudo ~/raspberry-remote/send 11111 2 1

Schritt 7:
Um die Steckdose jetzt per Handy oder Laptop zu steuern können wir gleich das von Raspberry-Remote mitgebrachte Webinterface nutzen. Um dieses zu benutzen müssen noch weitere Pakete installiert werden. Ich werde in diesem Fall den Apache 2 Webserver und PHP5 verwenden. Zusätzlich installieren wir noch den Texteditor VIM.

sudo apt-get install apache2 php5 vim

Nun müssen wir noch den Order in das richtige Verzeichnis kopieren. Das machen wir mit:

mv ~/raspberry-remote/webinterface/* /var/www/send443

Damit das PHP-Skript ordnungsgemäßg funktioniert müssen wir noch die Datei config.php bearbeiten.

cd /var/www/send443
vim config.php

In der Datei ändern wir den Inhalt der Variable $target auf die IP-Adresse unseres Pi´s. Gleichzeitig können wir im unteren Bereich der Konfigurationsdatei die Hauscodes und Funksteckdosennummern, sowie deren Bezeichnung im Webinterface festlegen. Anschließend kann die Datei geschlossen und gespeichert werden. Damit wir diesen nutzen können, muss dieser erstmal installiert bzw. kompiliert werden.

cd raspberry-remote
make daemon

Ist der Daemon installiert können wir ihn mit folgendem Befehl starten. Das & im in der folgenden Zeile bewirkt, dass der Prozess im Hintergrund ausgeführt wird.

sudo ./daemon &

Nun können wir das Webinterface mit einem Browser unter http://<IP>/send433 erreichen.
Screenshot from 2015-11-25 09:28:42
Schritt 8:
Damit wir den Daemon nicht bei jedem Systemstart manuell starten müssen, schreiben wir uns kurz ein kleines Skript dafür:

sudo vim /home/pi/raspberry-remote/send443.sh

In die Datei schreiben wir folgenden Inhalt:

#!/bin/bash
cd /home/pi/raspberry-remote/
sudo ./daemon &
exit 0

Abschließend setzen wir noch die entsprechenden Rechte.

sudo chmod 755 /home/pi/raspberry-remote/send443.sh

Damit sich das Skript automatisch startet müssen wir noch was in der /etc/rc.local ändern.

sudo vim /etc/rc.local

Dort fügen wir folgende Zeile ein und speichern die Datei.

/home/pi/raspberry-remote/send443.sh

Geschafft! Jetzt können wir sowohl über die Konsole, als auch bequem über ein Webinterface unsere Funksteckdosen steuern.