wall < "RaspberryPi und Google Drive"

Broadcast message from spillerm@unixe.de (pts/1) (Mo Mrz 30 14:16:16 2015):
4
Diesen Beitrag schrieb ich vor 4 Jahren. Behalte das beim Lesen bitte im Hinterkopf.

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 schliesslich bei drive, einem ziemlich coolen Stück Software, das jedoch golang braucht. Installiert man das auf dem Raspberry jedoch per apt-get install golang, erhält man derzeit 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:

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

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 Spass beim Umsetzen… sig1

4
  1. Hallo Marianne.

    Lese gerade Deinen Port zu GoogleDrive am Raspberry.
    Sehr informativ.

    Kleiner Kommentar zum Refresh:
    hier kannst du incron verwenden. Ein Filesystembasierter Cron-Job, welcher z.B.: das lesen/schreiben/löschen von Dateien im angegebenen Verzeichnis überwacht und die dafür vorgegebene Aktion ausführt.

    Vielleicht ist es ja das, was Du suchst.

    Gruss
    Robert

  2. Chod Ddles

    interesting openhab addition, have you done a write up or released some notes ?

Keine weitere Reaktionen mehr möglich.