RaspberryPi und Google Drive

Diesen Beitrag schrieb ich 6 Jahre und 8 Monate zuvor; die nachfolgenden Ausführungen müssen heute nicht unbedingt noch genau so funktionieren. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 3 Minuten

Die Idee ist grundsätzlich charmant: es existiert ein Dropbox IO binding für openHAB, das es ermöglicht, die gesamte Konfiguration in Dropbox zu speichern bzw. auch von dort zu beziehen, so dass es wiederum möglich wird, Änderungen an der Konfiguration auch von unterwegs einfach vorzunehmen – openHAB lädt geänderte Konfigurationen ja automatisch. Für mich hat die Sache jedoch einige Schwachstellen:

  1. Ich nutze Dropbox nicht.
  2. Die letzte Überarbeitung von Dokumentation und Binding ist ziemlich lange her.
  3. Es wäre nett, auch darüber hinaus gehend Dinge extern speichern zu können.

Ich nutze für nicht sensible Daten inzwischen ganz gerne Google Drive und überlegte, ob und wie es möglich wäre, meinen Raspberry an Google Drive anzubinden. Und ja: das geht problemlos. Ein erster Anlaufpunkt war grive, doch auch da tut sich seit zwei Jahren nichts mehr. Und so landete ich schließlich bei drive, einem ziemlich coolen Stück Software, das allerdings golang braucht. Installiert man das auf dem Raspberry per apt-get install golang, erhält man derzeit jedoch Version 1.0.2 (!) – und die ist so alt, dass sich drive damit nicht installieren lässt. Auf dieser genialen Seite gibt es eine ganze Menge inoffizieller Pakete für ARM; also fix das zum Prozessor passende Paket schnappen und installieren:

root$ cat /proc/cpuinfo
processor	: 0
model name	: ARMv6-compatible processor rev 7 (v6l)
...
root$ wget http://dave.cheney.net/paste/go1.4.2.linux-arm~multiarch-armv6-1.tar.gz
root$ tar xvfz go1.4.2.linux-arm~multiarch-armv6-1.tar.gz
root$ mv go /usr/local/
root$ /usr/local/go/bin/go version
go version go1.4.2 linux/arm

Ich habe mich dazu entschieden, /opt/go als $GOPATH zu verwenden und verklickere das meinem System noch schnell:

root$ mkdir /opt/go
root$ export GOPATH="/opt/go"

Benötigt wird darüber hinaus auch noch das Paket mercurial, das kann dann wieder wie gehabt installiert werden (tut man es nicht, kommt es zur Fehlermeldung imports code.google.com/p/goauth2/oauth: exec: "hg": executable file not found in $PATH – für euch getestet ;) ):

$ apt-get install mercurial

Nun kann drive gebaut werden.

root$ /usr/local/go/bin/go get -u github.com/odeke-em/drive/cmd/drive

Das dauert eine ganze Weile – und ergibt keinerlei Output auf der Konsole, also einfach abwarten. Irgendwann beendet sich der Aufruf kommentarlos, aber: es gibt nun ein /opt/go/bin/drive, das benutzt werden kann. Mein User pi, der auch openHAB verwaltet, legt sich nun einen Ordner an, in dem er fortan die Google-Drive-Dateien verwalten wird.

$ mkdir /home/pi/gdrive
$ /opt/go/bin/drive init ~/gdrive

Den (auf dem Raspberry) angezeigten Link habe ich kopiert und (auf meinem Mac) in den Browser eingefügt; das funktioniert problemlos. Jetzt ist zu bestätigen, dass der Dienst auf die Dateien in Google Drive zugreifen darf, es wird ein Token generiert – und das muss nun wiederum im Browser kopiert und in der Konsole eingefügt werden – fertig. Jetzt kann ein erster Testlauf erfolgen:

pi$ cd ~/gdrive
pi$ mkdir -p openhab/configurations/items
pi$ /opt/go/bin/drive push openhab
Resolving...
+ /openhab
+ /openhab/configurations
+ /openhab/configurations/items
Addition count 3 src: 12.00KB
Proceed with the changes? [Y/n]: Y
3 / 3 [====================================================] 100.00 % 3s

Ein Blick in den Google-Drive-Folder bestätigt es: da ist er nun, der Ordner, alles hat funktioniert. Ich habe mir kurzerhand meine gesamte openHAB-Konfig hineinkopiert und für openHAB einen entsprechenden Symlink gesetzt:

$ cd /opt/openhab
pi$ mv configurations ~/gdrive/openhab/
pi$ ln -s /home/pi/gdrive/openhab/configurations .

Und dann wieder ein push – fertig. Neben der openHAB-Konfig kann ich hochladen, was ich möchte, das kann bisweilen ganz praktisch sein. Nett hätte ich gefunden, das Hochladen der Files von einem Refreshing model-Event abhängig zu machen, aber da finde ich keinen Weg; bleibt also, es irgendwie auf Systemebene zu scripten oder aber über openHAB und cron bzw. einen Switch zu steuern – das könnte dann etwa so aussehen:

// file: "GooglePush.rules"

import org.openhab.core.library.types.*
// Ich moechte meinen Kram zur vollen Stunde zu Google Drive raufschieben -
// oder aber, wenn ich den entsprechenden Knopf in openHAB druecke

rule "Backup to Google Drive"
when
  Time cron "0 0 * * * ?" or
  Item GooglePush changed from OFF to ON
then
  executeCommandLine("/home/pi/bin/GooglePush.sh")
  logInfo("BackupRule", "Habe Konfig zu Google Drive geschoben.")
  GooglePush.postUpdate(OFF)
end
## file: "GooglePush.sh"
#!/bin/bash
## Ein bewusst einfach gehaltenes Shell-Script zum Hochladen

DRIVE="/opt/go/bin/drive push -no-prompt"

cd $HOME/gdrive
$DRIVE openhab

Ein Knopf in openHAB

Den Knopf kann ich entweder in die Sitemap einbinden (Switch item=GooglePush) oder auch nicht: tue ich es nicht, kann ich Updates über die osgi-Konsole (openhab send GooglePush ON) oder beispielsweise auch XMPP veranlassen, tue ich es, kann ich es zusätzlich auch anklicken… hachja… ;) Das Ganze gilt für Pull-Requests analog – das dürft ihr selbst basteln.

Switch GooglePush 
  "Backup Konfig zu Google Drive"

drive ist kein Daemon; genau das macht es für mich attraktiv. Ich kann spezifizieren, was genau ich wohin hoch- oder runterladen möchte, und mein Setup sehr gut verfeinern. Und sollte ich euch auf den Geschmack gebracht haben wünsche ich euch viel Spaß beim Umsetzen!