[Modul] Tesla

Hallo Kai,

habe es gerade nochmal getestet:
Wenn Tesla schläft wird z.B. durch

$result = Tesla_FetchData($id_tch);             // TeslaCharging

kein „wecken“ ausgeführt und auch die zugehörigen Variablen nicht aktualisiert.
Wenn Tesla wach ist, verhindert natürlich ein zu häufiges Abfragen das „Einschlafen“.

Für meine Ansprüche ist das Verhalten so o.k.
Man kann ja den Schlafzustand mit

$result     = Tesla_State($id_tvc);                     // $result enthält "online" oder "asleep"

abfragen ohne den Tesla zu wecken.

Wenn also ein fetchData automatisch den Tesla wecken würde, würde ich mir hierfür ein Auswahlschalter wünschen.

Grüße, Peter

Haben die anderen Tesla Fahrer hier nicht das Problem, dass das Auto des öfteren aus der Splitterinstanz verschwindet ? Bei mir passiert das fast wöchentlich und man bemerkt es erst wenn die Steuerung nicht funktioniert :wink: Eine automatische Abfrage / Zuordnung im Hintergrund wäre hier klasse. Check jede Stunde: Wenn kein Fahrzeug hinterlegt wähle Fahrzeug aus Liste oder dergleichen.

Ich wecke aushilfsweise per Teslalogger auf.

$Datei = file_get_contents("http://teslalogger.de/wakeup.php?t=TOKEN");

Grüße

Moin,

ich habe mir einen Tesla S gekauft, aber auch nur weil er IP-Symcon kompatibel ist (ernsthaft, wichtiger Grund). Nun habe ich das soweit angebunden, abfragen laufen auch - aktuell noch 10800 Sekunden.

Nun würde ich aber gerne öfter abfragen.
Gibt es da eine Chance?

Auto in Betrieb(Straße) oder am Charger/Steckdose alle 10 Sekunden

Auto parkt und ist im Standby alle 10800 Sekunden.

Zuhause hängt er immer an der Steckdose, daher kann man ihn auch nerven, aber beim Parken auf der Arbeit oder sonst wo kann er dann gerne in ruhe gelassen werden.

Hat jemand dazu eine Idee? Gerne mit Quelltext da ich nicht wirklich programmieren kann :slight_smile:

danke.

Hallo Dustin,
erstmal Glückwunsch zum neuen TESLA!
Du kannst mit ein paar Befehlen und entsprechende Timer die Aktualisierung selbst steuern. Dabei musst du aber beachten, dass dein TESLA bei zu kurzen Intervallen nicht schlafen geht.
Ob dein TESLA schläft erfährst du so:

$result     = Tesla_State($id_tvc);                     // $result enthält "online" oder "asleep"

Aktualisieren der Daten geht mit Tesla_FetchData($id_tch); // TeslaCharging
z.B.


$id_tch = 44287;      // hier deine Instanz ID für TeslaCharging eintragen
$result = Tesla_FetchData($id_tch);             // TeslaCharging

Wenn du mehr Hilfe brauchst, melde dich.

Gruß, Peter

HI,

danke. Tolles Auto! Macht echt spaß.

So gerne habe ich das noch nicht zusammen.

Ich hätte mir das so gedacht, das ich abfrage

  1. (Ladeklappe offen) or (in Betrieb) or „Steckdose <2 Watt“ and „akku <30%“

dann setze das Intervall auf 10 Sekunden

else
Intervall auf 10800

Und das muss ich dann ja in die ganzen Instanzen schreiben (Charing, Climtae, Drive, etc).

danke,
ein Blutiger Anfänger im PHP Programmieren

Hi,
du brauchst die Timerwerte nicht in die Instanzen schreiben (ich glaube, das geht auch nicht per Befehl).

Erstelle dir am besten ein Programm, unter dem du z.B. zwei Timer (ich habe alle 15 Min. und alle 5 Min).
Im Programm setzt du dann je nach Lage, eine Timer auf inaktiv.
Dann kannst du auch noch weitere auslösende Ereignisse hinzufügen (z.B. wenn „charging“).
Je nachdem, was du machen willst, brauchtst du unter dem Programm noch eigene oder verlinkte Variablen (z.B. Kilometerstand, wenn du die Meilen im Control umrechnen willst).

Fang einfach mal an, ich helfe dir gerne weiter.

Peter

Hi,

wie kann ich das Abfragen denn Auslösen? Damit wäre ich schon weiter. Dann kann ich ja mit wenn lädt, wenn Online, wenn geschwindigkeit etc die Intervalle über ein skript laufen lassen.

Magst Du sonst mein deine Abfragen mit den 5 und 15 minuten posten?
Ich möchte das Auto nicht alle 15 minuten wecken, da ich nicht weiß wieviel Kilometer mich das pro Tag kostet.

danke dir!

Hi,

ich kann hier mal posten, was ich bisher gemacht habe. Das Programm ist allerdings sehr individuell, einige Abfragen beziehen sich auf andere Bereiche (nicht TESLA) und die Variablen müssten alle an deine Verhältnisse angepasst werden. Also kein PGM, das man kopiert und dann einsatzfähig ist.

Hier erstmal ein Ausschnitt aus meinem Objektbaum:

Das ist mein Haupt-PGM:

<?php

//******************************************************************************
// 32971
//
//******************************************************************************

include '17825.ips.php';    // Funktionen Meldungsausgabe
$meldung    = "";
$prio		= 0;
$laut		= 20;
//$sematimer  = 1500*10;    // 15Sekunden

$meile	=   1.60934;            // Umrechnungsfaktor auf KM
$strom	=   0.2639;             // Stromkosten je KWh (anpassen) ab 01.05.2020 =0.3100 ab 01.08.2020 = 0.2639
$ts     = date('d.m.y H:i');    // akt. Datum/Uhrzeit formatiert

// id individuell anpassen
$id_tvc         = 28709;
$id_tv          = 53766;
$id_tc          = 47308;
$id_tch         = 44287;
$id_td          = 24420;

$id_lz          = 38088;
$id_zustand     = 12217;
$id_kmz         = 13029;
// eigene Variablen
$id_kms         = 48440;
$id_timef       = 43946;
$id_timer       = 42315;
$id_timerto     = 58386;


//******************************************************************************
// wer hat das Programm gestartet?
//******************************************************************************

$sender	= $_IPS['SENDER'];

//******************************************************************************
IF($sender == "WebFront")
{
	SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);    // Variable im WF aktualisieren
	$var	= $_IPS['VARIABLE'];		            // auslösende Variable
	$wert	= $_IPS['VALUE'];                       // aktueller Wert der Variablen
}


//******************************************************************************
IF($sender == "TimerEvent")
{
   $var = $_IPS['EVENT'];
}


//******************************************************************************
IF($_IPS['SENDER'] == "Variable")
{
	$var	= $_IPS['VARIABLE'];	// z.B. STATE
	$wert	= $_IPS['VALUE'];       // aktueller Wert der Variablen
}

//******************************************************************************
IF($_IPS['SENDER'] == "Execute")
{
	$var	= $id_timerto;		// ID der auslösenden Variable
	$wert	= true;             // Wert der Variable
}


//$meldung = "gestartet durch ".$var;


//******************************************************************************
// Verarbeitung 
//******************************************************************************

//if (IPS_SemaphoreEnter("TESLA", $sematimer))
//{
    // ...Kritischer Codeabschnitt
 


switch ($var)
{
    case $id_timer:
    // prüft ob TESLA wach/schläft. Wenn geweckt, Daten aktualisieren und 
    // Timer stoppen, schnellen Timer starten 
        $alt        = GetValueBoolean($id_zustand);
		$result     = Tesla_State($id_tvc);                     // $result enthält "online" oder "asleep" - TESLA wird nicht geweckt!
        $neu        = GetValueBoolean($id_zustand);
        IF($alt <> $neu)                                        // Zustand hat gewechselt
        {
            $meldung	= "TESLA auf ".GetValueFormatted($id_zustand)." gewechselt.";
            IF($result == "online")
            {   
                $result     = Tesla_FetchData($id_tv);              // TeslaVehicle
                $result     = Tesla_FetchData($id_tc);              // TeslaClimate
                $result     = Tesla_FetchData($id_tch);             // TeslaCharging
                $result     = Tesla_FetchData($id_td);              // TeslaDrive 
                sleep(5);
                $result     = TeslaDatenUpdate($meile, $strom, $ts, $id_kmz, $id_kms, $id_timef);       // eigene Datenfelder aktualisieren
                IPS_SetEventActive($id_timerto, true);			    // aktivert Timer "TESLA ist online"
                IPS_SetEventActive($id_timer, false);   			// deaktivert diesen Timer
            }
        }
	break;


    case $id_timerto:
    // TESLA ist online
        $action     = "";
        // schläft TESLA?
        $result     = Tesla_State($id_tvc);                     // $result enthält "online" oder "asleep"
        IF($result == "asleep")
        {
            IPS_SetEventActive($id_timerto, false);             // diesen Timer deaktivieren und 
            IPS_SetEventActive($id_timer, true);                // Polling-Timer auf aktiv
            return;                                             // Tesla schläft, keine weiteren Abfragen notwendig
        }
        
        // Wird gerade geladen?
        // prüfen auf letzte Aktualisierung, wenn >xx Min. TeslaCharging aufrufen 
        if((time() - IPS_GetVariable ($id_lz)['VariableUpdated']) > 1500)    $result = Tesla_FetchData($id_tch);             // TeslaCharging
        $ladezustand    = GetValueString($id_lz);
        IF($ladezustand == "Charging")
        {
            $result     = Tesla_FetchData($id_tch);             // TeslaCharging
            sleep(3);
            $result     = TeslaDatenUpdate($meile, $strom, $ts, $id_kmz, $id_kms, $id_timef);       // eigene Datenfelder aktualisieren
            $action     = "Charging";
        }

        // irgendeine Aktion?
        IF($action == "")
        {
            // TESLA schlafen schicken 
        }
        else
        {
            // Tesla-Daten aktualisieren
            $result     = Tesla_FetchData($id_tv);              // TeslaVehicle
            $result     = Tesla_FetchData($id_tc);              // TeslaClimate
            $result     = Tesla_FetchData($id_tch);             // TeslaCharging
            $result     = Tesla_FetchData($id_td);              // TeslaDrive     
        }
    break;


    case $id_lz:
    // Ladezustand auf "Disconnected" gewechsel
    // $meldung = "Ladeanschluss ".$wert;
        $result     = Tesla_FetchData($id_tch);             // TeslaCharging
        IPS_RunScript(12505);
    break;



	default:
	// Code einfügen
	break;
}


 
    //Semaphore wieder freigeben!
    //IPS_SemaphoreLeave("TESLA");
//}
//else
//{
    // ...Keine Ausführung möglich. Ein anderes Skript nutzt "TESLA" 
    // für länger als 10 Sekunden, sodass unsere Wartezeit überschritten wird.
    //$meldung = "Semaphore verhindert Skript-Ausführung!";
//}






//******************************************************************************
// Funktion zur Aktualisierung individueller Variablen
//******************************************************************************

function TeslaDatenUpdate($meile, $strom, $ts, $id_kmz, $id_kms, $id_timef)
{
	$wert   = GetValueInteger(44811);
    SetValueInteger(22434,$wert);
    $wert   = GetValueFloat(29671)*$meile;
    SetValueFloat(52675,$wert);
    $wert   = GetValueFloat(32163)*$meile;
    SetValueFloat(23345,$wert);
    $lade   = GetValueFloat(41939);
    SetValueFloat(18628,$lade);
    $kosten = $lade*$strom;
    SetValueFloat(55944,$kosten);
    $stunden    = GetValueFloat(38787);
    $time       = time()+$stunden*3600;
    SetValueInteger(42098,$time);
    $soll   = GetValueInteger(23869);
    $ist    = GetValueFloat(57621);
    IF($soll == 0)      $verlust = 0;
    ELSE                $verlust= 100 - $ist * 100 / $soll;
    $ladung = strval($ist)." von ".strval($soll)." = ".strval($verlust)."%";
    SetValueString(46242,$ladung);
    SetValueString(55842, $ts);          // Ausführung Datum+Uhrzeit in Ladekontrolle sichern
    
    $wert       = GetValueFloat($id_kmz)*$meile;        // Meilen in Kilometer
    SetValueFloat($id_kms,$wert);                       // KM sichern
    SetValueString($id_timef, $ts);                     // Ausführung Datum+Uhrzeit in Fahrzeugdaten sichern
	return "ok";
}



//******************************************************************************
// universelle Ausgabe auf verschiedene Medien als Funktionsaufruf
//******************************************************************************

IF($meldung <> "")
{
	//MELDUNG_soundfile($meldung);
	//MELDUNG_usb($laut);
	MELDUNG_logfile($meldung);
	MELDUNG_prowl($prio, '1111', $meldung);
	//MELDUNG_nma($prio, $meldung);
	//MELDUNG_growl($ip, $meldung);
	//MELDUNG_sms($phone, $meldung);
	//MELDUNG_webfront($wfk_id, $meldung);
	MELDUNG_vu($meldung);
	//MELDUNG_mail();
	//	WFC_PushNotification($webfrontNR, 'WM', $meldung, '', 0);
}

Hier gehen leider die Beschreibungen der Variablen verloren, deshalb nochmal 2 Screen-shots:


Viel Spass beim anpassen.
Bei Fragen, einfach wieder melden.

Gruß, Peter

Hi,
In Symcon funktioniert „Tesla_ActuateTrunk“ nicht(mehr). Wenn man als Instanz ID das Vehicle Control auswählt, erwartet es ja einen String als Argument. Entweder weiß ich nicht, was ich mitgeben muss, oder es funktioniert gar nicht. Habe bereits die gängigsten Sachen probiert, „unlock“, „open“…

Teste mal die aktuelle Beta Version, geht es damit?

Grüße,
Kai

Hallo, ich bin seit wenigen Tagen ist ein Tesla Model 3 in meine Garage eingezogen … das Modul ist natürlich sofort installiert worden…jetzt muss ich mit den ganzen Möglichkeiten erst warm werden.
Frage: kann ich mit den Modulfunktionen auch die Ladegrenze steuern und damit nach Verfügbarkeit von PV Strom das Laden initiieren …oder wie macht ihr das?

Gruß, Michael

Hallo Michael,
Glückwunsch zum M3, habe ich auch!

Du kannst die Ladegrenze (z.B. 80%) einstellen, aber nicht den Ladestrom. Das geht nur im Tesla oder in einer Ladestation, die das unterstützt.
Im Prinzip kannst du alles über das Modul steuern, was auch in der Tesla-App geht

Grüße, Peter

Hallo,

wenn ihr wollt, dann könnt ihr mir Übersetzungen fertig machen, damit wir das Modul mal in den Stable Kanal bekommen.

Grüße,
Kai

Hallo Kai,
in welcher Form hättest du denn die Übersetzungen?
Gruß, Peter

Hi,
Bin jetzt auf der aktuellen beta und es funktioniert immer noch nicht :frowning:
Weißt du was ich als String mitgeben muss? Vielleicht gebe ich einfach den falschen Command mit…

So wie hier: IPS-Tesla/locale.json at master · Schnittcher/IPS-Tesla · GitHub

Ich weiß gerade gar nicht, wo noch etwas fehlt.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Du kannst front oder rear als Parameter übergeben.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Hi Kai,
Sorry für die verspätete Antwort.
Jetzt klappt es super :relaxed:
Ich hätte nur eine Frage, gibt es eine Möglichkeit den Status des Kofferraums abzufragen?
Dass zum Beispiel true für offen und false für geschlossen angezeigt wird.
Weil durch actuate Trunk kann ich ja nur den aktuellen Zustand umdrehen.

Grüße,
David

Hallo David,
unter TeslaVehicle gibt es die entsprechenden Variablen:
Ladeklappe hinte / vorne als Integer (0 = geschlossen)

Gruß, Peter

Hi Peter,
Dank dir, die Übersetzung hat mich verwirrt :wink:
Grüße,
David