Hier noch das zweite Skript, mit welchen ich mir die historischen Daten für den Energieverbrauch abhole und diese in das Archiv einer Variable schreibe:
<?php
require 'vendor/autoload.php';
use Aws\CognitoIdentityProvider\CognitoIdentityProviderClient;
use Aws\Exception\AwsException;
use GuzzleHttp\Client;
$ArchivID = 35792;
// ID des aktuellen Skripts
$scriptID = $_IPS['SELF'];
// ID der übergeordneten Variable
$parentID = IPS_GetParent($scriptID);
// Name der übergeordneten Variable
$parentName = IPS_GetName($parentID);
// Extrahiere den Wert zwischen den geschweiften Klammern
preg_match('/\{(.*?)\}/', $parentName, $matches);
$ChannelNum = $matches[1];
// Prüfe, ob eine Variable mit dem Namen "Energieverbrauch" existiert
$variableID = @IPS_GetObjectIDByName("Energieverbrauch", $parentID);
if ($variableID === false) {
// Erstelle die Variable, wenn sie nicht existiert
$variableID = IPS_CreateVariable(2); // 2 steht für den Typ float
IPS_SetParent($variableID, $parentID);
IPS_SetName($variableID, "Energieverbrauch");
// Schalte das Loggen im Archiv ein
AC_SetLoggingStatus($ArchivID, $variableID, true);
AC_SetAggregationType($ArchivID, $variableID, 1); // 1 steht für "Zähler"
IPS_ApplyChanges($ArchivID);
// Setze das Variablenprofil
IPS_SetVariableCustomProfile($variableID, "~Electricity");
// Setze das Startdatum auf den 1. Januar 2022
$Start_Date = date('Y-m-d\TH:i:s\Z', mktime(0, 0, 0, 1, 1, 2022)); // Hier muss das Datum rein, seit wann die Vue Online ist.
} else {
// Setze das Startdatum auf gestern
$Start_Date = date('Y-m-d\TH:i:s\Z', strtotime('-1 day'));
}
$jwksUrl = "https://cognito-idp.us-east-2.amazonaws.com/us-east-2_ghlOXVLi1/.well-known/jwks.json";
$deviceGid = 'xxx'; // Hier mir muss die GID-ID vom Gerät rein
$scale = '1H';
$unit = 'KilowattHours';
$Summe = 0;
while (strtotime($Start_Date) < (time() - (time() % 3600) )) {
$End_Date = date('Y-m-d\TH:i:s\Z',mktime(0,0,0,date('m',strtotime($Start_Date))+1,1,date('Y',strtotime($Start_Date))));
// Überprüfe, ob $End_Date in der Zukunft liegt
if (strtotime($End_Date) > time()) {
// Aktuelles Datum und Uhrzeit abrunden auf die letzte volle Stunde
$currentTimestamp = time();
$roundedTimestamp = $currentTimestamp - ($currentTimestamp % 3600);
$End_Date = date('Y-m-d\TH:i:s\Z', $roundedTimestamp);
}
$apiUrl = "https://api.emporiaenergy.com/AppAPI?apiMethod=getChartUsage&deviceGid={deviceGid}&channel={ChanelNum}&start={Start_Date}&end={End_Date}&scale={scale}&energyUnit={unit}";
$url = str_replace(['{deviceGid}', '{ChanelNum}','{Start_Date}','{End_Date}', '{scale}', '{unit}'],
[$deviceGid, $ChannelNum, $Start_Date, $End_Date, $scale, $unit],
$apiUrl
);
$apiUrl= $url;
$Start_Date = $End_Date;
try {
$cognito = new CognitoIdentityProviderClient([
'region' => 'us-east-2',
'version' => 'latest',
'credentials' => false
]);
$authParams = [
'USERNAME' =>'xxx', // Dein Nutzername
'PASSWORD' => 'xxx' // Dein Passowort
];
$result = $cognito->initiateAuth([
'AuthFlow' => 'USER_PASSWORD_AUTH',
'ClientId' => '4qte47jbstod8apnfic0bunmrq',
'AuthParameters' => $authParams
]);
$jwt = $result['AuthenticationResult']['IdToken'];
$client = new Client();
$response = $client->get($apiUrl, [
'headers' => [
'authtoken' => $jwt
]
]);
$data = json_decode($response->getBody(), true);
//print_r ($data);
$firstTimestamp = strtotime($data['firstUsageInstant']);
//unset ($values);
foreach ($data['usageList'] as $index => $value) {
$Summe= $Summe + floatval($value);
$timestamp = $firstTimestamp + ($index * 3600); // Werte sind stündlich
$ArchivValues = AC_GetLoggedValues ($ArchivID, $variableID, $timestamp, $timestamp + 1, 0);
if (empty($ArchivValues) && floatval($value) != 0 && !is_null($value) && $value !== '') {
// Wenn der Wert nicht existiert, füge ihn zu $values hinzu
$values[] = ['TimeStamp' => $timestamp, 'Value' => $Summe];
}
}
} catch (Exception $e) {
echo 'Fehler: ' . $e->getMessage();
}
}
// Überprüfen, ob $values nicht leer ist, bevor das Archiv geschrieben wird
if (!empty($values)) {
// Daten im Archiv hinzufügen
AC_AddLoggedValues($ArchivID, $variableID , $values);
// Reaggregation der Variable, um die neuen Werte zu berücksichtigen
AC_ReAggregateVariable($ArchivID, $variableID);
}
// Hole den letzten Wert aus dem Archiv
$lastLoggedValues = AC_GetLoggedValues($ArchivID, $variableID, 0, time(), 1);
if (!empty($lastLoggedValues)) {
$lastValue = end($lastLoggedValues)['Value'];
// Schreibe den letzten Wert in die Variable
SetValue($variableID, $lastValue);
}
Das Skript arbeitet relativ. Ich hab mir zu jeder Variable nochmal eine Skript angelegt, welches automatisch einmal am Tag ausgeführt wird.
<?php
// ID des Skripts, das eingebunden werden soll
$scriptID = 35308;
// Skript einbinden
include(IPS_GetScriptFile($scriptID));
tippe oder füge den Code hier ein
Im Ergebnis sieht es dann so aus: