Einbinden von externen PHP Bibliotheken

Hallo Zusammen,

Ich habe von Emporia Energy ein Geräte zur Leistungs- & Verbrauchserfassung. Das würde ich gerne im IP Symcon einbinden. Wie das prinzipiell funktioniert ist mir klar. Ich scheitere nur leider an der Authentifizierung. Emporia nutz das aws verfahren. Damit ich das nutzen kann möchte ich die Bibliothek AWS SDK for PHP Version 3 nutzen.
Zur Installation der Bibliothek benötige ich den Composer.
Ich bekomme es aber leider nicht hin, diesen auf der SymBox zu installieren. Gibt es eine nachvollziehbare Schritt für Schritt-Anleitung?

Grüße

Johannes

PHP mit Composer auf einer x-beliebigen Maschine (sinnigerweise auch Linux) installieren und dort den php Composer Befehl ausführen. Danach kann man den vollständigen Ordner (heißt idr. vendor) ins Scriptverzeichnis von IP-Symcon kopieren. Die Autoload Datei muss man dann halt manuell einbetten ins entsprechende Script.

2 „Gefällt mir“

Super! Danke, das hat mir geholfen. Falls auch nochmal jemand die VUE von Emporia einbinden will:
Ich habe das so gelöst:
(Im nachhinein hätte man das auch ohne die Cognito-Bibliothek lösen können)

<?php
require 'vendor/autoload.php';

use Aws\CognitoIdentityProvider\CognitoIdentityProviderClient;
use Aws\Exception\AwsException;
use GuzzleHttp\Client;

$jwksUrl = "https://cognito-idp.us-east-2.amazonaws.com/us-east-2_ghlOXVLi1/.well-known/jwks.json";
$apiUrl = "https://api.emporiaenergy.com/AppAPI?apiMethod=getDeviceListUsages&deviceGids={deviceGids}&instant={instant}&scale={scale}&energyUnit={unit}";

$deviceGid = 'xxx';  // Die deviceGid kann man mit einem API-Call "https://api.emporiaenergy.com/customers/devices" der entsprechenden VUE vorher abfragen
$scale = '1S';
$unit = 'KilowattHours';
$instant = date('Y-m-d\TH:i:s\Z');


$url = str_replace(
    ['{deviceGids}', '{instant}', '{scale}', '{unit}'],
    [$deviceGid, $instant, $scale, $unit],
    $apiUrl
);
$apiUrl= $url;



try {
	$cognito = new CognitoIdentityProviderClient([
            'region' => 'us-east-2',
            'version' => 'latest', 
			'credentials' => false
        ]);
	
	
	$authParams = [
                'USERNAME' =>'DEIN_USER_NAME',
'PASSWORD' => 'DEIN_USER_PASSWORT'
            ];
	$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);
    
	foreach ($data['deviceListUsages']['devices'][0]['channelUsages'] as $channel) {
    	$name = $channel['name'];
    	$usage = round ($channel['usage'] * 1000 * 3600,1);
		
		$VarID = $channel['deviceGid'] . '_' . str_replace(',','',$channel['channelNum']);
    	$parentID = IPS_GetParent($_IPS['SELF']);
		$variableID = @IPS_GetObjectIDByIdent($VarID, $parentID);


    	if ($variableID === false) {
        	$variableID = IPS_CreateVariable(2);
        	IPS_SetName($variableID,  $name);
        	IPS_SetIdent($variableID,$VarID);
        	IPS_SetParent($variableID, 0);
    	}

		SetValue($variableID, $usage);
		
}

	    
} catch (Exception $e) {
    echo 'Fehler: ' . $e->getMessage();
}

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: