ENEN DEDE
home
Station ladebereit

OVMS Mail

Auf die Gefahr hin, dass ich mich wiederhole, ich mag es nicht, dass ein "man in the middle" meine (digitalen) Aktivitäten trackt. Das ist für mich eine Hauptmotivation gewesen, um mich mit OVMS zu beschäftigen. Mit OVMS kann ich mein Auto mit meinem Server mit meiner App verbinden und alles ist open source.

Nun wird die aktuelle OVMS App hauptsächlich gepflegt durch die hervorragende Arbeit von "Dexter". Dexter hat auf Github einen "gcm" (Google Cloud Messaging) Branch erstellt vom Master-Code der Android OVMS App (github.com/openvehicles/Open-Vehicle-Android/tree/gcm). Momentan finden keine Entwicklungen im Master statt. Alle neuen Feautures der App, wie zum Beispiel auch die schicken Nissan Leaf Abbildungen, befinden sich im gcm-Branch. Wer also die neueste Android App für OVMS haben möchte nutzt Dexters App basierend auf dem gcm-Branch.

Daraus resultieren für mich zwei Probleme.

  1. Ich kann die App nicht starten, da ich auf meinem Handy "Cyanogenmod" benutze ohne "Google Dienste". Google Dienste funktionieren im wesentlichen so, dass es eine dauerhafte Verbindung von meinem Handy zu Google hergestellt wird und durch diese Verbindung beliebige Daten, verbunden mit einer eindeutigen ID von mir, hin und her zu Google übertragen werden. Viele Programmierer nutzen zum Beispiel die Abkürzung über Google Dienste, wenn sie in ihrer App auf Google Maps zugreifen wollen. Das hält den Programmieraufwand gering, sorgt aber dafür, dass Google aus der App heraus immer meinen Standort verbunden mit einer ID zu meiner Person erhält.

    Wenn man auf sein Cyanogenmod Handy Google Dienste nicht installiert hat funktionieren diese Abkürzungen in einer App nicht mehr. Das ist der Grund dafür, dass bei mir in der OVMS App die GPS Kartendarstellung nicht funktioniert. Macht nichts, ich nutze die GPS Funktion eh nicht, bin viel mehr an den anderen OVMS Funktionen interessiert, wie z.B. die Fernsteuerung der Klimaanlage im Auto, oder die Anzeige des Füllstands der Batterie.

    Aber, wie gesagt, die Standard OVMS App aus dem gcm-Branch startet erst gar nicht, wenn Google Dienste auf dem Handy nicht vorhanden sind. Das liegt daran, dass in der MainActivity.java folgende Zeilen enthalten sind:

     // check for Google Play Services App:
    if (!checkPlayServices())
    finish();
    
    Damit die App also für mich überhaupt starten kann, kommentierte ich diese Zeilen aus und kompiliere die App selber durch. Meine kompilierte Version der App kann man hier downloaden.

    Bevor man meine APK in ein Cyanogenmod ohne Google Dienste installieren kann, muss man noch einen Workaround für das Google Maps Framework durchführen. Das ist hier beschrieben: sdgsystems.com/blog/installing-google-maps-framework-aosp-android
     
  2. OVMS kann mir "Notifications" schicken. Zum Beispiel "Der Ladervorgang wurde unterbrochen", oder "Die Alarmanlage wurde aktiviert". Ein sehr schönes Feature. Dexter hat in seinem gcm-Branch den Master-Code so angepasst, dass diese Notifications über "Google Cloud Messaging" (gcm) gepusht werden. Das hat den Vorteil, dass die Notifications in Echtzeit übermittelt werden, für mich aber den Nachteil, dass Google Dienste benötigt werden und Google "man the middle" ist und tracken kann.

    Ich bevorzuge da lieber eine Benachrichtigung per Mail. Das ist nicht real time (dauert bis zu 10 Minuten, bis eine Nachricht ankommt), hat aber den Vorteil, dass es über meine Server läuft. Das ist allerdings auch Grundvoraussetzung, dass Mail-Notifications funktionieren. Man braucht einen eigenen OVMS Server. Hat man den, kann man man das Google Cloud Messaging austauschen gegen Mail Benachrichtigung.

    Schauen wir uns an, wie ...

    In der "ovms_server.pl" (der eigentliche OVMS Server) steht folgender Code:

    # send mail notifications:
    if ($row->{'pushtype'} eq 'mail' && $mail_enabled eq 1)
    Das bedeutet, dass Mails vom Server verschickt werden, wenn das Feld "pushtype" in der Datenbank mit "mail" gefüllt ist und die Konfigurationseinstellung "mail_enabled" auf 1 gesetzt ist.

    Das Feld "pushtype" findet man in der MySQL Datenbank in der Tabelle "ovms_notifies". Wenn ein neues Fahrzeug sich beim Server meldet wird dieses Feld automatisch mit "gcm" befüllt. Das liegt daran, weil im Code im gcm-Branch in der MainActivity.java folgendes passiert:

    // subscribe at OVMS server:
    // MP-0
    // p<appid>,<pushtype>,<pushkeytype>{,<vehicleid>,<netpass>,<pushkeyvalue>}
    String cmd = String.format("MP-0 p%s,gcm,production,%s,%s,%s",
    		uuid, carData.sel_vehicleid, carData.sel_server_password,
    		gcmToken);
    "gcm" wird im "String.format" fest hineingeschrieben. Deshalb kann ich nun nur noch in der MySQL Datenbank direkt den "pushtype" von "gcm" auf "mail" ändern. Wenn ich das tue ist es aber dauerhaft, da der obengenannte Code nur beim Anlegen eines Fahrzeugs ausgeführt wird.

    Das war also der erste Streich. In der MySQL Datenbank bei meinem Fahrzeug in der "ovms_notifies" Tabelle den Wert von "pushtype" von "gcm" auf "mail" ändern. Und damit das System weiß, wohin die Mails geschickt werden, muss in der Tabelle "ovms_notifies" der "pushkeyvalue" noch mit der Empfänger-Emailadresse befüllt werden.

    Es existiert im Github auch ein Script, was diese Arbeit erledigt: github.com/openvehicles/Open-Vehicle-Monitoring-System/blob/master/client/README#L87

    Jetzt brauchen wir nur noch die Mailfunktion für den OVMS Server in seiner Konfigurationsdatei aktivieren. Das geschieht in der ovms_server.conf:

    [mail]
    enabled=1
    interval=10
    
    sender=ovms@mydomain.com
    Jetzt brauchen wir noch den OVMS Server Dienst neu starten und schon bekommen wir Notification-Mails.

    Ein Beispiel einer solchen Mail ist das hier:

    "Vehicle is stopped turned on"

    Diese Nachricht kommt, wenn man das Fahrzeug laufen läßt (auf "P" versteht sich) und sich dann mit dem Schlüssel in der Tasche vom Fahrzeug entfernt. Gut zum testen ...

 

Vielleicht findet sich ja in Zukunft die Möglichkeit in der App auszuwählen, ob man Google Cloud Messaging oder lieber Mail benutzen möchte. Vielleicht wird man die App in Zukunft default auch ohne Google Services nutzen können.

Bis dahin bleibt dieser Workaround.