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