Solar Powered Twizy


Vorwort:
Da es mir schon lange ein Ärgernis ist, dass ich jeden Tag 2 Tonnen Stahl in der Gegend rum fahre um meine 80kg zu bewegen, habe ich schon lange nach einer Alternative gesucht.
Durch die vorhandene PV-Anlage mit Eigenstromregelung lag auf der Hand auf ein elektrisches Fahrzeug umzusteigen.
Als ich den Twizy das erste Mal sah, war ich gleich von diesem Konzept begeistert. Klein, leicht, witzig, regenfest und elektrisch. Genau das was ich suchte. (Im weiteren Text mit "TW" abgekürzt.)

Nun arbeite ich daran möglichst wenig Fremdstrom zu "tanken", d.h. möglichst viel des Ladestroms von der eigenen PV-Anlage beziehen.

Wie ich dazu vorgehe beschreibe ich hier in der Form eines Blogs. Insbesondere für die eigene Dokumentation. Eventuelle Nachbauten erfolgen auf eigene Gefahr!

Problem:

Herangehensweise:

Benötigte Funktionalität:

Verwendete Hardware:

Sonstiges:
Die bereits vorhandene Haussteuerung (HS) läuft über einen Linux-PC, dem über ein 1-wire (1w)Netzwerk ca. 60 1w Devices zur Seite stehen.
Mit Hilfe der 1w Devices werden Temperaturen, Luftfeuchte, Spannungen und Zählerstände abgefragt und teilweise auch Verbraucher geschaltet.
Der PC is zudem über RS485 mit dem PV-Wechselrichter verbunden und frägt in Intervallen von 1 min die gerade vom Dach kommende Leistung ab. Diese Leistung wird zusätzlich auch mittels eines Hutschienenzählers mit S0-Ausgang gemessen.
Da auch der Stromzähler über S0 und 1-wire abgefragt wird. Steht auch der aktuelle Stromverbrauch aller Verbraucher im Haus zur Verfügung und somit auch der aktuelle solare Überschuss.
Die Messwerte werden minütlich in eine MySQL und RRD Datenbank eingetragen.  
Da es sich bei der PV-Anlage um eine nach OST/West ausgerichtete Anlage handelt steht in den entsprechenden Monaten von morgens bis abends Solarenergie zur Verfügung.
Wegen der Größe der Anlage (4,4kWp) reicht die morgendliche und abendliche Energie aber nicht aus um den maximalen Ladestrom von 10A = 2,4kW vollständig aufzubringen.

Solarleistung 26.05.2013
Die Grafik zeigt die zur Verfügung stehende Solarleistung an einen perfekten Tag. Rot ist der Eigenverbrauch eingezeichnet.


Logik der Ladesteuerung:
Da nur in den Mittagsstunden genügend PV-Leistung zur Verfügung steht, wird vorzugsweise auch dann geladen.
Ermittelt die HS einen ausreichenden solaren Überschuss, so wird der TW-Ladestrom eingeschaltet.
Während des Ladens wird ständig der Ladestand des TW (BT) als auch der zur Verfügung stehende Solarstrom überwacht. Der Abschaltzeitpunkt der Ladung ist von der Tageszeit, des Ladestands und des zur Verfügung stehenden PV-Stromes abhängig. Dabei gilt bei geringeren TW-Ladestand wird ein höherer Prozentsatz an Netzstrom toleriert, als bei hohem Ladestand. Am Samstag wird weniger Netzstrom toleriert als am Sonntag etc.
Ziel ist es dass der TW am Montag Morgen einen Ladestand von mindestens 95% hat.
Unter der Woche, wenn Mittags nicht geladen werden kann, wird abends nachgeladen falls noch mindestens x % Solarstrom zur Verfügung steht.  (x = konfigurierbarer, bestmöglicher Wert, welcher noch ermittelt werden wird)
Steht am nächsten Morgen nicht die erforderliche Restreichweite (einstellbar über das Webinterface) zur Verfügung, so wird rechtzeitig vor der, ebenfalls im Webinterface einstellbaren, Abfahrtzeit die Ladung gestartet. Diesmal unabhängig von der zur Verfügung stehenden PV-Leistung.

Immer wenn genügend PV-Leistung zur Verfügung steht wird die Ladestation eingeschaltet. Ist der TW nicht angesteckt wird dies dadurch erkannt, dass kein Stromverbrauch feststellbar ist.
Wird geladen, so wird der Verlauf des Ladestandes in der Datenbank abgelegt. Somit ist der aktuelle Ladezustand des TW bekannt bis dieser die Garage verlässt.
Kommt der TW zurück, so kommt er in die Reichweite des BT-Moduls und der aktuelle Ladezustand kann darüber ermittelt werden.


Ladestation:
Ladestation Innenansicht Ladestation an Garagendecke
Links die Innenansicht, Rechts mit eingesteckten Twizy an der Garagendecke (Twizy steht genau darunter).


Raspberry Pi
Raspberry Pi
Links oben der Raspberry Pi, links unten der DCDC Wandler, rechts der USB Hub

Raspberry Pi
Hier die Ladesteuerung am Einbauort in der Garage. Auf dem USB-Hub sitzt die 1w Zählerplatine mit DS2423 Counter und Batteriepufferung, welche die Impulse des Stromzählers erfasst. Unterhalb des Hubs ist eine 1w IO-Platine mit zwei Optokopplern und zwei Relais, welche an zwei DS2413 angeschlossen sind. Mit einem der Relais wird das Stromstoßrelais angesteuert. Im USB-Hub ist sowohl ein Bluetooth Dongle als auch ein Wlan Dongle eingesteckt. Über WLan kommuniziert der Raspi mit der HS, über Bluetooth wird er mit dem Twizplay und damit dem Twizy Verbindung aufnehmen.
Rechts vom Raspi ist ein ivt MPP-Solarregler zu sehen. Über diesen wird eine Bleibatterie mit Hilfe eines 40 Watt Modules geladen, welche wiederrum den Raspi mit Strom versorgt. Sollte der Ladestand der Batterie zu gering sein, so springt ein Steckernetzteil ein.

Twizplay:
Mehr über das Twizplay findet man hier.
TwizplayTwizplay seitliche Ansicht
Das Kabel, welches zum ICP und zur seriellen Schnittstelle führt habe ich nach aussen geführt um zum einen die Firmware updaten zu können und um zum anderen das Bluetoothmodul einfach an die serielle Schnittstelle des MC anschließen zu können.  Die Halterung habe ich aus ABS-Kunststoff gebogen und mit doppelseitigen Klebeband auf den Deckel des Handschuhfaches geklebt. Das Twizplay ist mit dem Haltewinkel verschraubt (siehe Hutmutter im rechten  Bild).

Bluetooth-Modul BTM-222
Näheres über das Modul findet man hier, hier  und hier.
Bluetooth Modul
Links ist das Modul zu sehen, rechts unten ein USB-seriell (TTL) Wandler, mit dessen Hilfe das Modul am PC in Betrieb genommen wird.


Da bisher (März 2013) das Bluetooth-Modul noch nicht eingebaut ist und auch die HS noch nicht vollständig erweitert ist, erfolgt das Ein-/Ausschalten des Ladevorgangs noch von Hand. Hierzu steht über die HS ein Webinterface zur Verfügung. Dieses ist selbstverständlich passwortgeschützt.
Webinterface     Anzeige der Ladung



Erste Aufzeichnung eines Ladevorganges (2. März 2013):

Ladevorgang
Die rote Kurve zeigt den Ladeverlauf, die grüne Kurve, den Anteil welcher davon von der PV-Anlage erzeugt wurde (Nach Abzug aller restlichen Verbraucher im Haus).

29.03.2013

Das Webinterface zum Konfigurieren der Ladeparameter ist fertiggestellt.

Webinterface Twizy
  • Der oberste Slider "SOC last" entspricht dem aktuellen Ladestand des Akkus. Er wird alle 20 Sekunden automatisch aktualisiert, solange die Seite angezeigt wird. Der zugehörige Wert wird dazu aus der mysql Datenbank ausgelesen. In die Datenbank eingetragen wird er vom entsprechenden Prozess, welcher über Bluetooth mit dem Twizplay kommuniziert (bisher noch nicht fertig gestellt) und die Ladung steuert.
  • "SOC min" ist der gewünschte Ladestand zum gegebenen Zeitpunkt.
  • "Hour" entspricht dem Stundenwert,
  • "Minute" dem Minutenwert des gewünschen Ladeendes.
  • Mit "Choose day" kann ausgewählt werden, an welchen Tag der Ladevorgang abgeschlossen sein muss.
  • Mittels "Apply" werden die Werte in die Datenbank übertragen.

Das links gezeigte Beispiel bedeutet:
Der derzeitige Ladestand des Akkus (State of Charge) beträgt 23 %.
Der Anwender möchte, dass am nächsten Morgen um 7:20 Uhr die Batterie zu mindestens 66% geladen ist.

Eventuell werden die Prozentwerte noch auf reale Werte (kWh) umgerechnet.

31.03.2013

Nun steht die Datenverbindung zwischen Twizplay und der Hausautomatisation auf dem Plan.

Konfiguration Raspberry Pi
Auf dem Raspberry Pi ist Debian Wheezy von Raspberry pi.org installiert.
Es werden zusätzlich die benötigten Bluetooth Pakete installiert
#  apt-get install bluetooth bluez-utils
und der Bluetooth Dongle in einen freien USB Port platziert, anschliessend zeigt
#  lsusb
-> Bus 001 Device 008: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
#  /etc/init.d/bluetooth restart
started Bluetooth neu und
#  hcitool scan
->    Scanning ...
->            00:12:6F:21:ED:B6       Twizy
findet wunschgemäß den BTM-222 der für das Twizplay vorbereitet wurde und derzeit noch über einen USB seriell (TTL) Adapter mit dem Notebook verbunden ist (Konfiguration des BTM-222 siehe unten).
Auch das sdptool findet den BTM-222
#  sdptool browse
->    Inquiring ...
->    Browsing 00:12:6F:21:ED:B6 ...

Nun wird mittels eines Editors die Datei rfcomm.conf modifiziert.
#  joe /etc/bluetooth/rfcomm.conf

Inhalt von rfcomm.conf
    #
    # RFCOMM configuration file.
    #
    rfcomm0 {
    #       # Automatically bind the device at startup
            bind yes;
    #       # Bluetooth address of the device
    #        Twizy!
            device 00:12:6F:21:ED:B6;
    #
    #       # RFCOMM channel for the connection
            channel 1;
    #
    #       # Description of the connection
            comment "Twizy0";
    }

Da der BTM-222 so konfiguriert wurde, dass eine Pineingabe erforderlich ist muss dieser Pincode noch in die Datei  var/lib/bluetooth/00:15:83:3D:0A:57/pincodes eingetragen werden.
# echo "00:12:6F:21:ED:B6 1234" >> /var/lib/bluetooth/00\:15\:83\:3D\:0A\:57/pincodes
Dabei ist 00:12:6F:21:ED:B6 die BT-MAC-Adresse des Twizys, 1234  die Pin und /00\:15\:83\:3D\:0A\:57 die eigene BT-Mac-Adresse.
Da nur ein BT-Dongle im System ist reicht es nach ...../var/lib/bluetooth/00  einfach Tab zu drücken und die Shell trägt die vorhandene Adresse selbst ein.

Nun wird Bluetooth neu gestartet
# /etc/init.d/bluetooth restart
# echo "This is a test" > /dev/rfcomm0
    und siehe Da beim BTM222 erscheint
        >CONNECT  '0015-83-3D0A57'
        >
        >DISCONNECT  '0015-83-3D0A57'

Der Text erscheint nicht, eventuell liegt das daran, dass das Device im Kommandomodus ist. Da ich aber eh nur vom TW zum Raspi uebertragen moechte, brauche ich dies nicht.

nun kann man mit cat den Port offnen
# cat /dev/rfcomm0
-> beim BTM222 erscheint sofort  "CONNECT  '0015-83-3D0A57'"

und nun im Terminal des BTM222 etwas eingeben.  -> Dies erscheint sofort im Terminalfenster des Raspi. SUPER!

Der Raspi kann auch ohne Verbindung zum TW erkennen, ob dieser in der Naehe ist:
# sudo l2ping -c 1 00:12:6F:21:ED:B6
->    Ping: 00:12:6F:21:ED:B6 from 00:15:83:3D:0A:57 (data size 44) ...
->    4 bytes from 00:12:6F:21:ED:B6 id 0 time 39.87ms
->    1 sent, 1 received, 0% loss

das funktioniert auch, wenn bereits eine Verbindung besteht, wogegen
# sudo hcitool scan
dann den TW nicht mehr findet!!


Konfiguration des BTM-222-Moduls
Dazu wird das Modul ueber einen USB-seriell(TTL)-Dongle mit einem PC verbunden.


Auf dem PC wird mit putty eine serielle Verbindung aufgebaut.
Dabei ist zu beachten, dass das Modul ab Werk mit 9600 Baud arbeitet.

Deshalb ist der erste Befehl  ATL2, welcher das Modul auf 19200 Baud einstellt.
Anschliessend muss die Verbindung neu mit 19200 Baud initialisiert werden.
ATI1              gibt die derzeit aktuelle Konfiguration aus
> OK
> ATC=1, HARDWARE FLOW CONTROL
> ATD=0015-83-3D0A57, SET BLUETOOTH ADDRESS CONNECT TO
> ATE=1, ECHO CHARACTERS
> ATG=1, ENABLE ALL PAGE AND INQUIRY SCAN
> ATH=1, DISCOVERABLE
> ATK=0, ONE STOP BIT
> ATL=2, BAUD RATE is 19200
> ATM=0, NONE PARITY_BIT
> ATN=Twizy, LOCAL NAME
> ATO=0, ENABLE  AUTO CONNECTING
> ATP=1234, PIN CODE
> ATQ=0, SEND RESULT CODE
> ATR=1, SPP SLAVE ROLE
> ATS=1, ENABLE AUTO-POWERDOWN OF RS232 DRIVER
> ATX=1, ALWAYS CHECK '+++'

Die oben stehende ATI1-Ausgabe zeigt die bereits von mir vorgenommene Konfiguration. Eingestellt werden diese Werte mit den entsprechenden AT-Kommandos.
Achtung! Je nachdem ob der Wert eine Stelle oder mehr als eine Stelle hat ist die Syntax unterschiedlich!
Hat der Wert nur eine Stelle so folgt der Wert sofort auf das AT-Kommando (z.B. ATH1).
Ist der Wert mehrstellig so folgt dem AT-Kommando ein "=" und dann der Wert (Beispiel) ATD=0015-83-3D0A57).

Möchte man die Meldungen des BTM222 abschalten, so geht das mit  ATQ1. Jedoch hab ich bisher keine Möglichkeit mehr gefunden das wieder einzuschalten ohne das Modul eine längere Zeit stromlos zu machen, da der BTM in diesem Zustand keine Befehle mehr annimmt.
Sollte man also erst dann machen, wenn alles vollständig konfiguriert ist.

Nun ist die Konfiguration von Raspi und BTM-Modul abgeschlossen.

Da die Steckerbelegung des Twizplays und des BTM-Moduls leider von einander abweicht, habe ich einen Zwischenadapter angefertigt.
Hier der entsprechende Schaltplan (die 4k7 Widerstande bleiben unbestückt)
Adapter Twizplay BTM-222Foto Adapter

In den noch freien Steckplatz im rechten Bild links-unten, wird das 1:1 Kabel eingesteckt, welches vom Twizplay kommt. Das ist dasselbe Kabel, welches auch zum Programmieren verwendet wird.

01.04.13
Heute habe die Twizplay-Software (Twizplay.de)  so modifiziert, dass der Ladestand, die einzelnen Batterietemperaturen und -spannungen über die serielle Schnittstelle (Ser1) ausgegeben werden. Dabei werden die selben Pseudo-NMEA-Datensätze verwendet wie beim Avr-on-Board.

Beispieldaten:
$EFTWI,1,SOC100,9720,,*36
 State-Of-Charge * 100, hier also 97,2%
$EFTWI,1,PEM_T100,1100,,*36  PEM-Temperatur *100, hier also 11,00 C
$EFTWI,1,MOT_T100,200,,*0A
 Motor-Temperatur *100, hier also 2,00 C
$EFTWI,1,TP_T100,1075,,*69 Twizplay-Temperatur *100, hier also 10,75 C
$EFTWI,1,BAT_T100,600,600,500,500,500,500,500,500,,*18
Batterietemperatur * 100, beginnend mit Batterie 1 = 6,00 C
$EFTWI,1,BAT_V100,411,410,410,410,410,410,410,410,,*16
Batteriespannung * 100, beginnend mit Batterie 1, bis Batterie 8
$EFTWI,9,BAT_V100,410,410,410,410,410,410,0,0,,*1F Batteriespannung * 100, beginnend mit Batterie 9

Die Verbindung zwischen Twizplay und Raspi hat sofort funktioniert.  ;-)
Allerdings werde ich noch kontrollieren, wie viel Strom das Modul, welches derzeit noch permanent eingeschaltet ist verbraucht. Eventuell werde ich das Modul mittels des Schaltausganges des Twizplays ein- und ausschalten müssen.

Als nächstes erfolgt die Auswertung der gesendeten Daten durch den Raspi und der Eintrag in die MySql-Datenbank


Datenübertragung Raspberry Pi - Homeserver

Bisher ist der Raspi mittels WLan mit dem Homeserver verbunden. Obwohl der Access-Point im Haus und der WLan-Dongle des Raspi in der Garage nur ca. 12m von einander entfernt sind und nur eine Ziegelwand dazwischen liegt, ist diese Verbindung leider sehr instabil. Teilweise reist die Verbindung ab und zieht dabei anscheinend auch das 1-wire Filesystem, welches ja auch auf IP-basiert mit in die Tiefe. Aus diesem Grund werden auf dem Raspi zwei per cron gesteuerte Prozessse gestartet, welche die Netzwerkverbindung und das OWFS-System alle paar Minuten überprüfen, im Fehlerfall versuchen die Verbindung wieder herzustellen und wenn das nicht erfolgreich ist, den Raspi neu starten.
Da in diesem Fall der Raspi eine Weile nicht ansprechbar ist, hat es sich, entgegen der ersten Planung, als besser erwiesen, dass der Raspie "seine" Daten auf den Homeserver ablegt, statt vom Homeserver aus die Daten vom Raspie zu lesen.
Hierzu wurde auf dem Homeserver ein virtuelles Laufwerk angelegt, welches ueber nfs fuer den Raspi freigegeben wurde.

Zeile in /etc/fstab (Homeserver):
    tmpfs  /mnt/ramdisk  tmpfs  nodev,size=2M,uid=1000,gid=1000   0       0

Zeile in /etc/exports (Homeserver):
    /mnt/ramdisk         192.168.178.yyy(rw,fsid=1,sync,no_root_squash)

Auf dem Raspi wird dieses Laufwerk gemountet und ebenfalls ein virtuelles Laufwerk fur Logdateien eingerichtet.
Ausschnitt /etc/fstab (Raspi):
192.168.178.xxx:/mnt/ramdisk  /mnt/ef1w2RAM     nfs nolock   0       0
tmpfs           /ramdisk      tmpfs        size=1M,user,rw   0       0

Somit gibt es auf dem Raspi das Verzeichnis /mnt/ef1w2RAM, welches sich im Speicher des Homeservers befindet.

Auf dem Raspi laufen folgende Cron-Prozesse, welche fur die Datenaufbereitung zustandig sind:
    * * * * * root   /home/erich/progs/checkTwizy.sh > /dev/null
    * * * * * root   /home/erich/php/readTwizy.sh > /ramdisk/readTwizy.log
    * * * * * erich  /home/erich/php/copyTwizy.sh > /ramdisk/copy.log

Inhalt checkTwizy.sh:
    l2ping -c 1 00:12:6F:21:xx:xx
    if [ $? -ne 0 ]
    then
          echo Twizy seems to be onroad
          echo "0" > /ramdisk/twizypresent
    else
          echo Twizy seems to be here
          echo "1" > /ramdisk/twizypresent
    fi
    chmod 666 /ramdisk/twizypresent

Durch einen einfachen Ping auf die Bluetooth-Addresse des Twizys wird die Anwesenheit festgestellt. Dazu muss keine BT-Verbindung aufgebaut sein.

Inhalt readTwizy.sh:
    #!/bin/bash

    file="/ramdisk/TwizyCheck.txt"
    /usr/bin/l2ping -c 1 00:12:6F:21:xx:xx
    if [[ $? -ne 0 ]]
    then
      /bin/echo "Twizy seems to be onroad - no action"
    else
      /bin/echo "Twizy seems to be here"
      az=$( /bin/ps ax | /bin/grep readTwizy.php | /usr/bin/wc -l)
      if [ $az -gt 1  ]
      then
        /bin/echo "Prozess already running -> no action!"
      else
        /bin/echo "Connecting to Twizy.."
        /bin/echo "Stope Bluetooth"
        /etc/init.d/bluetooth stop
        /bin/sleep 2
        /bin/echo "Starte Bluetooth"
        /bin/touch $file
        /etc/init.d/bluetooth start
        /bin/sleep 2
        /usr/bin/php -f /home/erich/php/readTwizy.php
      fi
    fi

Es wird erstmal abgeprüft, ob der Twizy in der Garage ist, wenn nein wird der Prozess beendet.
Anderenfalls wir überprüft, ob der Prozess bereits lauft, wenn ja, wird abgebrochen, ansonsten wird eine Verbindung mit dem Twizy aufgebaut und das PHP-Script zu Datenabfrage aufgerufen.
Zum Verbindungsaufbau hat sich als sinnvoll ergeben, Bluetooth zu stoppen und erneut zu starten. Anderenfalls kommt teilweise keine Verbindung zu Stande.

Inhalt readTwizy.php:
<?php
include "php_serial.class.php";
// zuerst in die Ramdisk schreiben
// copyTwiyy.sh kopiert dann auf den ef1w2
$dir="/ramdisk/";
$serial = new phpSerial;
$serial->deviceSet("/dev/rfcomm0") or
  die ("/dev/rfcomm  konnte nicht geöffnetwerden: Fehler war:'$php_errormsg'");
$serial->confBaudRate(19200);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");
$serial->deviceOpen();
$read = $serial->readPort();

// Beispieldaten
//$EFTWI,1,SOC100,9515,,*32
//$EFTWI,1,PEM_T100,5300,,*30
//$EFTWI,1,MOT_T100,-4000,,*11
//$EFTWI,1,TP_T100,1418,,*66
//$EFTWI,9,BAT_T100,900,800,800,800,800,800,800,0,,*14
//$EFTWI,1,BAT_V100,413,412,413,412,413,413,413,413,,*17
//$EFTWI,9,BAT_V100,412,413,413,412,413,412,0,0,,*1E

$rest="";
$deadlock=0;
if(isset($read)){
   while(1){
     //$dir=$dir1."twizy".$use."/";
    
     $read = $serial->readPort();
     if ( strlen($read) )
     {
       // Auswertung des gelesenen
       $inp = $read.$rest;
       // Aufteilen in einzelne Zeilen  
       $lines=explode(chr(10), $inp);
       foreach($lines as $line)
       {
         $wo = strpos($line, chr(13) );
         if( $wo > 0 )
         {
           // dann ist die Zeile vollstaendig
            $wo-=1;
            $line = substr($line, 0 ,$wo);        
            $twi=explode(",", $line);
            if ( $twi[0] == "\$EFTWI" )
            {
              if ( 1 == 1 )  // hier fehlt noch check ob Pruefsumme stimmt!
              {
                switch($twi[2])
                {
                  case "SOC100":
                  case "PEM_T100":
                  case "MOT_T100":
                  case "TP_T100":
                    $fname=$dir.$twi[2];
                    writeSingleValue($fname,$twi[3]);
                    break;
                   
                  case "BAT_T100":
                  case "BAT_V100":                   
                    $fname=$dir.$twi[2]."_".$twi[1];
                    writeSingleValue($fname,$twi[3]);
                   
                    $twi[1]+=1;
                    $fname=$dir.$twi[2]."_".$twi[1];
                    writeSingleValue($fname,$twi[4]);

                    $twi[1]+=1;
                    $fname=$dir.$twi[2]."_".$twi[1];
                    writeSingleValue($fname,$twi[5]);

                    $twi[1]+=1;
                    $fname=$dir.$twi[2]."_".$twi[1];
                    writeSingleValue($fname,$twi[6]);

                    $twi[1]+=1;
                    $fname=$dir.$twi[2]."_".$twi[1];
                    writeSingleValue($fname,$twi[7]);

                    $twi[1]+=1;
                    $fname=$dir.$twi[2]."_".$twi[1];
                    writeSingleValue($fname,$twi[8]);
                    $twi[1]+=1;
                    $fname=$dir.$twi[2]."_".$twi[1];
                    writeSingleValue($fname,$twi[9]);
                   
                    $twi[1]+=1;
                    $fname=$dir.$twi[2]."_".$twi[1];
                    writeSingleValue($fname,$twi[10]);
                                     
                    break;
                  default:
                    echo "unknown\n";
                }
                $fname=$dir."timestamp";
                $TimeStamp=time();
                writeSingleValue($fname,$TimeStamp);
               
              }else
              {
                 echo "wrong line!\n";
              }                    
            }            
         }
         else
         {
           // unvollstaendige Zeile fuer spaetere Verwendung
           $rest=$line;
           // echo "Rest ist ".$rest."\n";
         }
       }    
       $deadlock=0;
     }
     else  // strlen=0
     {
       $deadlock+=1;
      
       if ( $deadlock > 20 ) break;
              
     }
     sleep(1);
   }// end while
}// end if 
                                                               
$serial->deviceClose();

function writeSingleValue($fname,$val)

  $handle= fopen($fname, "w");
  fputs ($handle, $val."\n");
  fclose($handle);
  return false;
}

function appendSingleValue($fname,$val)
{
  $handle= fopen($fname, "a");
  fputs ($handle, $val."\n");
  fclose($handle);
  return false;
}
?>

Das Script liest die seriell übertragenen Daten vom Twizy und legt folgende Dateien auf der Ramdisk an:
    BAT_T100_1  BAT_T100_2 BAT_T100_3 BAT_T100_4 BAT_T100_5 BAT_T100_6 BAT_T100_7 BAT_T100_8 BAT_T100_9
    BAT_T100_10 BAT_T100_11 BAT_T100_12 BAT_T100_13 BAT_T100_14 BAT_T100_15 BAT_T100_16
    BAT_V100_1  BAT_V100_2   BAT_V100_3 BAT_V100_4 BAT_V100_5 BAT_V100_6 BAT_V100_7 BAT_V100_8 BAT_V100_9
    BAT_V100_10 BAT_V100_11 BAT_V100_12 BAT_V100_13 BAT_V100_14 BAT_V100_15 BAT_V100_16
    MOT_T100       SOC100    PEM_T100       TP_T100
   
Die Dateien enthalten die aktuellen Werte.
Inhalt von SOC100 (Beispiel):  5032    Das entspricht 50,32% Ladestand(State of Charge)
Die Erweiterung auf weitere Daten wie ODO (gefahrene Strecke) etc. ist geplant.

Das Script copyTwizy.sh kopiert diese Daten dann auf dem Homeserver. Dabei werden zwei unterschiedliche Verzeichnisse (Twizy1 und Twizy2) angelegt. Es wird immer das ältere Verzeichnis überschrieben.

Inhalt von copzTwizy.sh:
#!/bin/bash
if [ -e "/ramdisk/twizypresent" ]
then
  tp=$(/bin/cat /ramdisk/twizypresent)
else
  tp=0
fi

if [ "x$tp" = "x1" ]
then
  /bin/echo "EFRASPI-Twizy is present!"
  if [ -e "/mnt/ef1w2RAM/use" ]
  then
    use=$(/bin/cat /mnt/ef1w2RAM/use)
    if [ "x$use" = "x" ]
    then
      use=2
    fi
  else
    use=2
  fi
  # nun das andere Verzeichnis waehlen
  if [ "$use" == "2" ]
  then
    use=1
  else
    use=2
  fi
  dat="/mnt/ef1w2RAM/twizy$use"
  if [ -d $dat ]
  then
    /bin/echo "Verzeichnis $dat ist vorhanden!"
    /bin/rm $dat/*
  else
    /bin/mkdir $dat
    /bin/chmod 777 $dat
  fi
  /bin/echo "Kopiere nach $dat ..."
  /bin/cp /ramdisk/* $dat
  /bin/echo $use > /mnt/ef1w2RAM/use
  /bin/chmod 777 /mnt/ef1w2RAM/use
  /bin/chmod 777 $dat/*
else
  /bin/echo "EFRASPI-Twizy not present!"
  /bin/echo "0" > /mnt/ef1w2RAM/use
fi
 


Auf dem Homeserver werden die Daten, die sich nun in der Ramdisk befinden eingelesen und in der MySql-Datenbank abgelegt.
Welches der beiden Verzeichnisse die aktuellsten Daten enthaelt steht dabei in der der Datei "use".





..... demnächst mehr...



 
Hinweise:
Alle Warenzeichen sind Eigentum der jeweiligen Markeninhaber. Sämtliche Warenzeichen werden selbstverständlich anerkannt! Links dienen nur zur weiteren Information, sie spiegeln nicht zwangsläufig die Meinung des Autors wieder.
Die oben stehende Beschreibung ist nur eine Illustration, wie ich die Ladesteuerung realisiert habe. Sie dient mir zur eigenen Dokumentation. Eine gewerbliche Nutzung ist nicht vorgesehen. Eine bestimmte Funktionalität, Übereinstimmung mit entsprechenden Normen und Vorschriften wird nicht garantiert. Sollte jemand die vorstehenden Infos als Anregung für eigene Projekte oder Veröffentlichungen nehmen, würde ich mich über entsprechende Nennung bzw. Verweis auf meine Seite freuen.