Mein Minecraft-Smart-Home

Vernetzte, smarte und autonome Alltagsgegenstände sind unaufhaltsam. Doch wie können wir die Generation Z darauf vorbereiten? Wie vermitteln wir das Verständnis und die Kompetenz für dieses Internet der Dinge? Wie können wir Kollegen, Schüler oder die eigenen Kinder dafür begeistern, diese Zukunft verantwortungsbewusst mitzugestalten?

Minecraft
In Minecraft kann auch programmiert werden.

Es gilt Berührungsängste abzubauen und das Internet der Dinge auf spielerische Art und Weise erlebbar zu machen. Dank der Kombination aus Minecraft und Smart-Home-Lösungen wie Eclipse SmartHome ist das auch ohne Lötkolben möglich. Minecraft ist dabei mehr als eine Spielerei. Beispielsweise nutzt Microsoft im Rahmen des Projektes Malmo Minecraft zur Erforschung künstlicher Intelligenz.

Virtuell: Minecraft und ComputerCraft

Der Einstieg in die Minecraft-Programmierung gelingt ganz ohne Programmiersprache bereits mit Hilfe der Redstone-Schaltkreise. Wer genügend Muße hat, kann so komplexe logische Schaltungen aufbauen. Jedoch bleibt man hier in der virtuellen Welt gefangen. Eine Steuerung der physischen Außenwelt gelingt erst einmal nicht.

Glücklicherweise kann man dank der Erweiterung ComputerCraft auch richtig programmieren und nach draußen kommunizieren, ohne dass man dafür Programmierexperte sein muss. ComputerCraft erweitert Minecraft um Blöcke, die in der virtuellen Welt die Funktion von Computern, Druckern und sogar anachronistische Diskettenlaufwerke übernehmen. Zur Kommunikation innerhalb von Minecraft nutzt man kabelgebundene und kabellose Modems. Außerdem gibt es die sogenannten Turtles. Dabei handelt es sich um eine Art bewegliche Computer bzw. programmierbare Roboter. Die Programmierung in ComputerCraft erfolgt in der vergleichsweise einfachen Programmiersprache Lua.

Um loszulegen benötigt man natürlich Minecraft und anschließend Minecraft Forge, um Modifikationen installieren zu können. Beim nun folgenden Schritt ist ein Minimum manueller Arbeit notwendig. Denn ComputerCraft muss nicht nur heruntergeladen, sondern dann auch noch in das /mods/-Verzeichnis von Minecraft kopiert werden. Dieses Verzeichnis findet sich unter Windows im Benutzerverzeichnis unter %AppData%/.minecraft – sollte es fehlen, kann es hier einfach hinzugefügt werden. Beim nächsten Start von Minecraft muss nun nur noch das forge-Profile gewählt werden und schon steht einem die Welt der Programmierung offen. Sollte übrigens mal was schief gehen, dann kann das Löschen des .minecraft-Verzeichnnisses helfen – nur sind dann natürlich die aktuellen Daten weg.

Im Kreativmodus von Minecraft stehen nun Computer im Inventar (Taste E) zur Verfügung (normalerweise auf der zweiten Seite der Blockübersichten im Register für ComputerCraft). Sobald man einen Computer-Block in der Minecraft-Welt erzeugt und mit Rechtsklick auswählt, erscheint die Kommandozeilenoberfläche des CraftOS-Betriebssystems. Die Kommandozeile erlaubt ähnliche Operationen wie andere Betriebssysteme auch. Dazu zählen das Kopieren, Umbenennen und Löschen von Dateien und Verzeichnissen sowie eine generelle Hilfe help. Die Tastenkombination Strg-R startet einen Computer bei Bedarf neu (Reset), Strg+T beendet ein laufendes Programm (Terminate) und Strg+S schaltet den Computer aus (Shutdown). Am wichtigsten für die Programmierung ist der leider recht spartanische Editor, der über den Kommandozeilenbefehl edit und der Angabe eines Dateinamens gestartet wird. Hier kann endlich Lua programmiert werden:

1
print "Hello world!"

Sobald die Datei gespeichert und der Editor verlassen wurde, steht das Programm unter dem zuvor gewählten Dateinamen zur Verfügung und wird darüber auch gestartet. Eine Beschreibung der ComputerCraft Programmierschnittstelle (API für Application Programming Interface), also eine Erklärung der verfügbaren Befehle erhält man im ComputerCraft-WIKI. Dort wird auch die HTTP-API beschrieben, die es erlaubt, andere Systeme über deren URL aufzurufen.

Manchmal ist es bei der Programmierung ganz nützlich, dass in Minecraft gepfuscht werden darf. Über die Taste T erhält man die Chat-Konsole von Minecraft, wo nicht nur Nachrichten für andere Spieler, sondern auch Cheats eingegeben werden können. Via /help ruft man die Hilfe, das Wetter kontrollieren /weather clear oder /weather rain und die Uhrzeit setzen /time set day und /time set night. Und falls man die Zeit komplett anhalten möchte, dann erledigt dies /gamerule doDaylightCycle false.

Wer es noch einfacher haben möchte, der sollte einen Blick auf CompuerCraftEdu werfen. Dabei handelt sich um eine spezielle Version von ComputerCraft, die wie die auf Kinder und Jugendliche zugeschnittene Programmierumgebung Scratch über eine visuelle Programmieroberfläche verfügt.

Physisch: Eclipse SmartHome

Als Tor (Gateway) zur physischen Welt eignen sich Frameworks wie Eclipse SmartHome oder darauf aufbauende Lösungen wie openHAB 2 oder QIVICON. Dort gibt es bereits eine Vielzahl an unterstützen Diensten und Geräten. Darunter das Wetter und Philips hue Leuchten. Über http://127.0.0.1:8080/ wählt man beispielsweise bei openHAB 2 eine der zur Auswahl stehenden Benutzeroberflächen, darunter die modern gestalteten PaperUI. Mit dieser wird das Smart Home konfiguriert, überwacht und gesteuert.

Egal für welche Lösung man sich entscheidet, es wird Zugriff auf die REST API benötigt, um Minecraft und das Smart Home miteinander sprechen zu lassen. Die Endpunkte, also die genauen URLs dafür, können sich durchaus unterscheiden. Bei openHAB 2 findet man diese aber normalerweise komfortabel über die lokale REST-Dokumentation http://127.0.0.1:8080/doc/index.html. Dort oder direkt in einem REST-Client erhält man alle steuerbaren Gruppen und Kanäle über http://127.0.0.1:8080/rest/items. Diese verfügen über eine URL wie http://127.0.0.1:8080/rest/items/hue_LLC011_00178817547d_4/ und werden beispielsweise durch das Kommando ON oder OFF ein- bzw. ausgeschaltet.

In ComputerCraft benötigt man nun diese URL zu den zu steuernden Geräten bzw. Gerätekanälen, um Werte an diese über die HTTP-API zu senden. Eine Kleinigkeit ist jedoch noch zu beachten: Der genaue Typ der zu übertragenen Daten muss in dem gesendeten Paket angegeben werden. Der entsprechende Quellcode in Lua sieht dann so aus:

1
2
3
4
5
6
-- URL for item
local url = "http://127.0.0.1:8080/rest/items/hue_LLC011_00178817547d_4"
-- Set content type as expected - otherwise it's form encoded and will be refused
local headers = {[ "Content-Type" ] = "text/plain"}
-- Send command ON to turn on given item (OFF for the opposite)
http.post(url, "ON", headers)

Einfache Schnittstelle bereitstellen

Bis hierhin gestaltet sich die Programmierung noch ein wenig mühsam. Glücklicherweise gibt es Abhilfe, denn es stehen mit Notepad++ für Windows und Sublime Text für den Mac deutlich komfortablere Editoren kostenlos zur Verfügung. Der Quellcode findet sich innerhalb des .minecraft/saves-Verzeichnissen in der gespeicherten Welt im Ordner computer. Unter Windows ist das beispielsweise %AppData%/.minecraft/saves/ world/computer/computer. „world“ entspricht dem Namen der Welt und „computer“ dem Bezeichner des Computers. Diesen Bezeichner erhält man, indem man in CraftOS den Kommandozeilenbefehl id eingibt.

Es muss aber weiterhin eine ganze Menge Programmcode verfasst werden. Auch hier gibt es Abhilfe, indem man eine eigene wieder verwendbare Programmierschnittstelle entwickelt und für alle Computer und Turtles in Minecraft verfügbar macht. Dies gelingt indem man den Programmcode in das ROM der Computer legt. Innerhalb von Minecraft handelt es sich hier zwar um einen reinen Lesespeicher (Read Only Memory), doch den kann man über Minecraft-Ressourcenpakete beeinflussen. Ein solches Paket wird unter %AppData%\.minecraft\resourcepacks\ angelegt. Es benötigt einen eigenen Ordner wie zum Beispiel SmartHome und darin eine Beschreibungsdatei pack.mcmeta mit dem folgenden Inhalt (ein Beispiel findet sich hier zum Download):

1
2
3
4
5
6
{
  "pack": {
    "pack_format": 1,
    "description": "SmartHome API"
  }
}

Für die SmartHome-API benötigen wir außerdem ein Verzeichnis wie %AppData%\.minecraft\resourcepacks\SmartHome\assets\computercraft\lua\rom\apis in dem die APIs abgelegt werden. Entscheidet ist hier der Dateiname, da dieser als Bezeichner für die API in Minecraft dient – es bietet sich zum Beispiel smarthome an (ohne Dateiendung). Der Programmcode könnte dann wie folgt aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- REST specific settings
endpoint = "http://127.0.0.1:8080/rest/"
local items = "items/"
local headers = {[ "Content-Type" ] = "text/plain"}
 
function sendCommand(item, command)
	-- http should be enabled by default, but better check with if http then ... end
	if (not http) then 
		error("http not enabled")		
	end	
	-- Construct full URL
	local url = endpoint..items..item
	-- Post command to item
	http.post(url, command, headers)
	return true
end

Minecraft erfährt von dem Ressourcenpaket über das Menü „Options… | Resource Packs…“. Sobald das Paket dort ausgewählt ist, kann die API in den Computern mit Lua genutzt werden. Nun reicht die folgende Codezeile zum Steuern einer Leuchte aus:

1
smarthome.sendCommand("hue_LLC011_00178817547d_4", "ON")

Wer eine bessere Integration ohne virtuelle Computer möchte, kann sich auch an die Entwicklung eines eigenen sogenannten Mods machen und so das Zusammenspiel von Minecraft und einem smarten Zuhause ähnlich dem Digital Crafting Habitat Projekt verbessern. Dies setzt jedoch Erfahrung mit der Programmiersprache Java voraus.

1 thought on “Mein Minecraft-Smart-Home

Comments are closed.