[Modul] Tesla

Sehr gut, du solltest auch einen Rückgabewert bekommen.

Grüße,
Kai

Was meinst du mit Rückgabewert. Wert in der TeslaCharging Instanz ändert sich wenn aktualisiert wir, oder habe ich das falsch verstanden.

True oder false, ob der Befehle ausgeführt wurde.

Grüße,
Kai

Nein bekomme ich nicht. Wenn ich ausführe wird der Wert gesendet und in der tesla App sehe ich die Änderung. Auch beim Auslesen Tesla charging wird der neue Wert angezeigt. Aber True oder false bekomme ich nicht angezeigt.

image

Hallo @KaiS ,
danke für deine Arbeit.
Ist es noch möglich die Positionsdaten abzufrage?
Siehe https://developer.tesla.com/docs/fleet-api#vehicle_data

Grüße Peter

Das ist eingebaut. Kommt aber anscheinend nicht an.
Erstell mal ein Debug von der Drive Instanz.

Grüße,
Kai

in der DEBUG-Ausgabe wird nichts angezeigt. Allerdings unter Meldungen:

14.02.2024, 20:27:20 | test                 | stdClass Object
(
    [active_route_latitude] => 51.5XXXXX
    [active_route_longitude] => 6.7XXXXX
    [active_route_traffic_minutes_delay] => 0
    [power] => 0
    [shift_state] => 
    [speed] => 
    [timestamp] => 1707938840238
)

Jetzt müssen die Daten nur noch in die Variablen.
Grüße, Peter

Kommando zurück,
die Daten sind ind den neuen Variablen angekommen!

Grüße, Peter

Bei mir ist auch alles in den neuen variablen.
Läuft also :wink:

Ich versuche mir gerade etwas zusammen zubasteln, das er beim fahren öfter abruft als beim parken.

Fahren alle 15 minuten
Parken alle 60 minuten
Aber wie kann ich dem skript sagen, das Auto fährt jetzt? Ein Abruf und schon habe ich ja wieder ein „counter“ weniger.

Vorallem ruft man ja mehrere Module ab, wenn ich also alle Module alle paar Minuten Update kostet das extrem counts

104 Abrufe pro Tag.
bei 3 Modulen die abgerufen werden 34 abrufe pro Stunde für 3 Module?
ich habe jedoch alle 5 Minuten abgefragt und war in wenigen stunden trotzdem am Limit.

Wie kann man das jetzt etwas besser steuern? Hab mal was gebastelt, aber so glücklich bin ich damit halt nicht.

<?php

// Initialisierung und Konfiguration
$debug = 1; // Debug-Modus aktivieren (1) oder deaktivieren (0)
$helpVarID = 32820; // Hilfevariable für die Zeit des letzten Abrufs von TeslaVehicle
$id_tvc = 10520; // ID für TeslaVehicleControl zur Überprüfung des Online-Status des Fahrzeugs
$Awake = 32137; // ID zum Wecken des Fahrzeugs, falls es schläft
$driveStateID = 21234; // ID zum Überprüfen des Fahrzustands (Fahren oder Parken)
$chargeStateID = 33582; // ID zum Überprüfen des Ladezustands
$requestCounterID = 31741; // ID für die Zählung der täglichen API-Anfragen
$maxRequestsPerDay = 2500; // Maximale Anzahl zulässiger Anfragen pro Tag
$teslaDriveModuleID = 49053; // ID für das TeslaDrive-Modul
$teslaVehicleModuleID = 52907; // ID für das TeslaVehicle-Modul
$teslaChargingModuleID = 16497; // ID für das TeslaCharging-Modul
$teslaClimaModuleID = 41055; // ID für das TeslaClima-Modul
$checkIntervalDriving = 900; // Intervall für Überprüfungen beim Fahren in Sekunden (15 Minuten)
$checkIntervalCharging = 1800; // Intervall für Überprüfungen beim Laden in Sekunden (30 Minuten)
$checkIntervalParking = 3600; // Intervall für Überprüfungen beim Parken in Sekunden (60 Minuten)
$startTime = 7; // Startzeit für Parkabfragen
$endTime = 22; // Endzeit für Parkabfragen

// Zuordnung von Modul-IDs zu lesbaren Namen
$moduleNames = [
    $teslaDriveModuleID => 'TeslaDrive',
    $teslaVehicleModuleID => 'TeslaVehicle',
    $teslaChargingModuleID => 'TeslaCharging',
    $teslaClimaModuleID => 'TeslaClima',
];

// Debug-Funktion zur Ausgabe von Nachrichten, wenn der Debug-Modus aktiv ist
function debug($message) {
    global $debug;
    if ($debug) {
        echo $message . PHP_EOL;
    }
}

// Überprüft, ob das tägliche Anfragelimit erreicht wurde
function checkRateLimit() {
    global $requestCounterID, $maxRequestsPerDay;
    $requestsMade = GetValue($requestCounterID);
    $requestsLeft = $maxRequestsPerDay - $requestsMade;
    debug("Verbleibende Anfragen: $requestsLeft");
    if ($requestsLeft <= 0) {
        throw new Exception("Anfragelimit erreicht. Warte bis zum Reset.");
    }
}

// Inkrementiert den Anfragezähler um 1
function incrementRequestCounter() {
    global $requestCounterID;
    $currentCount = GetValue($requestCounterID);
    SetValue($requestCounterID, $currentCount + 1);
}

// Ruft Daten für ein spezifisches Modul ab und aktualisiert den Anfragezähler
function fetchDataAndUpdateCounter($moduleID) {
    global $moduleNames;
    checkRateLimit();
    Tesla_FetchData($moduleID);
    incrementRequestCounter();
    $moduleName = isset($moduleNames[$moduleID]) ? $moduleNames[$moduleID] : "Unbekanntes Modul";
    debug("Daten für Modul $moduleID ($moduleName) abgefragt.");
}

// Deaktiviert den Skript-Timer zu Beginn, um ein erneutes Auslösen während der Ausführung zu verhindern
IPS_SetScriptTimer($_IPS['SELF'], 0);

try {
    // Überprüft den Online-Status des Fahrzeugs und weckt es bei Bedarf
    $result = Tesla_State($id_tvc);
    debug("Tesla State: $result");

    if ($result === false) {
        throw new Exception("Fehler beim Abrufen des Tesla-Status.");
    }

    if ($result == "asleep") {
        RequestAction($Awake, true);
        incrementRequestCounter();
        debug("Tesla wird geweckt...");
    }

    // Ermittelt den aktuellen Fahr- oder Ladezustand des Fahrzeugs
    $driveState = GetValue($driveStateID);
    $chargeState = GetValue($chargeStateID);
    $lastVehicleQueryTime = GetValue($helpVarID);

    // Führt Aktionen basierend auf dem Zustand des Fahrzeugs aus
    if ($driveState == "R" || $driveState == "D") {
        // Abfragen beim Fahren
        fetchDataAndUpdateCounter($teslaDriveModuleID);
        if (time() - $lastVehicleQueryTime > $checkIntervalParking) {
            fetchDataAndUpdateCounter($teslaVehicleModuleID);
            SetValue($helpVarID, time());
        }
        IPS_SetScriptTimer($_IPS['SELF'], $checkIntervalDriving);
    } elseif ($chargeState == "Charging") {
        // Abfragen beim Laden
        fetchDataAndUpdateCounter($teslaChargingModuleID);
        IPS_SetScriptTimer($_IPS['SELF'], $checkIntervalCharging);
    } else {
        // Abfragen im Parkmodus
        $currentTime = date("H");
        if ($currentTime >= $startTime && $currentTime <= $endTime) {
            fetchDataAndUpdateCounter($teslaVehicleModuleID);
            fetchDataAndUpdateCounter($teslaClimaModuleID);
            IPS_SetScriptTimer($_IPS['SELF'], $checkIntervalParking);
        }
    }
} catch (Exception $e) {
    debug("Exception gefangen: " . $e->getMessage());
    IPS_SetScriptTimer($_IPS['SELF'], $checkIntervalParking);
}

// Debug-Ausgabe aller relevanten Variablen am Ende des Skripts
debug("==== Variablenzustand am Ende des Skripts ====");
debug("Debug-Modus: $debug");
debug("Hilfevariable ID (letzte Abfragezeit): $helpVarID");
debug("TeslaVehicleControl ID: $id_tvc");
debug("Fahrzeug wecken ID: $Awake");
debug("Fahrzeug Status Fahren ID: $driveStateID");
debug("Status des Ladezustandes ID: $chargeStateID");
debug("Anfragezähler ID: $requestCounterID");
debug("Maximale Anfragen pro Tag: $maxRequestsPerDay");

Ich kann das Modul auf jeden Fall so verändern, dass du nur noch eine Abfrage benötigst und dann die Daten an die einzelen Instanzen verteilt werden.

Grüße,
Kai

1 „Gefällt mir“

HI, das wäre genial!
Dann könnte man alles im 5 min Takt abfragen und gut ist.
Evlt könnte man noch eine Zeit eintragen.

Bei den 2500 Abfrage könnte man dann wie vorher alle 5 oder 10 sekunden abfragen.

Das dauert aber ein wenig, ich muss die Tesla Cloud Instanz zu einem IO machen und eine neue Splitter Instanz hinzufügen, danach jede Instanz anpassen.

Grüße,
Kai

1 „Gefällt mir“

ich habe noch Probleme mit TeslaVehicleControl:

wenn ich z.B. das Lade Limit ändern möchte (im Webfront) bekomme ich folgende Fehlermeldung:

Grüße, Peter

muss ich evtl. auf die Beta-Version umstellen?
Bin noch auf TEST

Gruß, Peter

Hi Kai,

bin auf der BETA und bekomme bei folgendem Befehl Fehler:

Tesla_FetchData(32541);

15.02.2024, 18:21:39 | TimerPool            | TeslaCharging (Tesla_UpdateCharging): 
Warning: HTTP/1.1 408 Request Timeout
{"response":null,"error":"{\"error\": \"timeout\"}","error_description":""}RESULT: in /var/lib/symcon/modules/.store/info.schnittcher.ips.tesla/TeslaVehicleCharging/module.php on line 84

Fatal error: Uncaught TypeError: json_decode(): Argument #1 ($json) must be of type string, bool given in /var/lib/symcon/modules/.store/info.schnittcher.ips.tesla/TeslaVehicleCharging/module.php:84
Stack trace:
#0 /var/lib/symcon/modules/.store/info.schnittcher.ips.tesla/TeslaVehicleCharging/module.php(84): json_decode(false)
#1 /var/lib/symcon/scripts/__generated.inc.php(23): TeslaVehicleCharging->FetchData()
#2 /-(1): Tesla_FetchData(32541)
#3 {main}
  thrown in /var/lib/symcon/modules/.store/info.schnittcher.ips.tesla/TeslaVehicleCharging/module.php on line 84

Servus Kai,
auch ich bin auf der Beta.
Soweit ist das überblicke funktionieren fast alle Module… bis auf „TeslaClimate“…hier kommt die Meldung:

HTTP/1.1 408 Request Timeout
{„response“:null,„error“:„{"error": "timeout"}“,„error_description“:„“}RESULT: in C:\ProgramData\Symcon\modules.store\info.schnittcher.ips.tesla\TeslaVehicleClimate\module.php on line 71

Fatal error: Uncaught TypeError: json_decode(): Argument #1 ($json) must be of type string, bool given in C:\ProgramData\Symcon\modules.store\info.schnittcher.ips.tesla\TeslaVehicleClimate\module.php:71
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\info.schnittcher.ips.tesla\TeslaVehicleClimate\module.php(71): json_decode(false)
#1 C:\ProgramData\Symcon\scripts__generated.inc.php(1023): TeslaVehicleClimate->FetchData()
#2 C:\Windows\System32-(3): Tesla_FetchData(17708)
#3 {main}
thrown in C:\ProgramData\Symcon\modules.store\info.schnittcher.ips.tesla\TeslaVehicleClimate\module.php on line 71

Habe ich etwas übersehen?

Danke

Ja, bei einem Fetch ergeben sich auch bei mir Fehler

Warning: HTTP/1.1 408 Request Timeout
{„response“:null,„error“:„{"error": "timeout"}“,„error_description“:„“}RESULT: in C:\ProgramData\Symcon\modules.store\info.schnittcher.ips.tesla\TeslaVehicleCharging\module.php on line 84

Fatal error: Uncaught TypeError: json_decode(): Argument #1 ($json) must be of type string, bool given in C:\ProgramData\Symcon\modules.store\info.schnittcher.ips.tesla\TeslaVehicleCharging\module.php:84
Stack trace:
#0 C:\ProgramData\Symcon\modules.store\info.schnittcher.ips.tesla\TeslaVehicleCharging\module.php(84): json_decode(false)
#1 C:\ProgramData\Symcon\scripts__generated.inc.php(1019): TeslaVehicleCharging->FetchData()
#2 C:\ProgramData\Symcon\scripts\37761.ips.php(3): Tesla_FetchData(37872)
#3 {main}
thrown in C:\ProgramData\Symcon\modules.store\info.schnittcher.ips.tesla\TeslaVehicleCharging\module.php on line 84

Hi KaiS, vielen Dank für deinen Einsatz!!! Habe dein Modul lange genutzt. Nach dem Update läuft es nicht mehr. Wenn ich das richtig sehe hast du noch eine andere Beta die nicht als Modul installierbar bist? Würde auch gerne testen. VG

Moin an alle in der „Test-Version“,

wie weckt ihr jetzt das Auto?
Wenn ich den Befehl teste kommt folgende Meldung:


Fatal error: Uncaught TypeError: TeslaVehicleControl::WakeUP(): Return value must be of type bool, array returned in C:\ProgramData\Symcon\modules\.store\info.schnittcher.ips.tesla\TeslaVehicleControl\module.php:126
Stack trace:
#0 C:\ProgramData\Symcon\scripts\__generated.inc.php(9703): TeslaVehicleControl->WakeUP()
#1 C:\Windows\System32\-(10): Tesla_WakeUP(10520)
#2 {main}
  thrown in C:\ProgramData\Symcon\modules\.store\info.schnittcher.ips.tesla\TeslaVehicleControl\module.php on line 126