123 lines
3.3 KiB
PHP
123 lines
3.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Belevo\EnelixEMS;
|
|
|
|
final class EaseeGatewayProtokoll
|
|
{
|
|
/** @var list<int> */
|
|
public const BEOBACHTUNGEN = [
|
|
31, 41, 42, 43, 47, 48, 62, 96, 100, 102, 104, 109, 110,
|
|
111, 112, 113, 114, 119, 120, 182, 183, 184, 185, 250,
|
|
];
|
|
|
|
public static function seriennummer(string $wert): string
|
|
{
|
|
return strtoupper(trim($wert));
|
|
}
|
|
|
|
/**
|
|
* @param mixed $knoten
|
|
* @param list<string> $abonnements
|
|
* @return list<array{Seriennummer: string, ID: int, Wert: mixed}>
|
|
*/
|
|
public static function extrahiereBeobachtungen(
|
|
$knoten,
|
|
array $abonnements,
|
|
string $seriennummer = '',
|
|
int $tiefe = 0
|
|
): array {
|
|
if (!is_array($knoten) || $tiefe > 12) {
|
|
return [];
|
|
}
|
|
|
|
$abonnements = array_values(array_unique(array_map(
|
|
[self::class, 'seriennummer'],
|
|
$abonnements
|
|
)));
|
|
foreach (['serialNumber', 'SerialNumber', 'chargerId', 'ChargerId', 'mid', 'Mid'] as $feld) {
|
|
if (!isset($knoten[$feld]) || !is_scalar($knoten[$feld])) {
|
|
continue;
|
|
}
|
|
$kandidat = self::seriennummer((string) $knoten[$feld]);
|
|
if (in_array($kandidat, $abonnements, true)) {
|
|
$seriennummer = $kandidat;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (self::istListe($knoten)) {
|
|
foreach ($knoten as $wert) {
|
|
if (!is_string($wert)) {
|
|
continue;
|
|
}
|
|
$kandidat = self::seriennummer($wert);
|
|
if (in_array($kandidat, $abonnements, true)) {
|
|
$seriennummer = $kandidat;
|
|
}
|
|
}
|
|
}
|
|
|
|
$id = null;
|
|
foreach (['id', 'Id', 'observationId', 'ObservationId'] as $feld) {
|
|
if (array_key_exists($feld, $knoten) && is_numeric($knoten[$feld])) {
|
|
$id = (int) $knoten[$feld];
|
|
break;
|
|
}
|
|
}
|
|
|
|
$wertVorhanden = false;
|
|
$wert = null;
|
|
foreach (['value', 'Value'] as $feld) {
|
|
if (array_key_exists($feld, $knoten)) {
|
|
$wertVorhanden = true;
|
|
$wert = $knoten[$feld];
|
|
break;
|
|
}
|
|
}
|
|
|
|
$ergebnis = [];
|
|
if (
|
|
$seriennummer !== ''
|
|
&& $wertVorhanden
|
|
&& in_array($id, self::BEOBACHTUNGEN, true)
|
|
) {
|
|
$ergebnis[] = [
|
|
'Seriennummer' => $seriennummer,
|
|
'ID' => $id,
|
|
'Wert' => $wert,
|
|
];
|
|
}
|
|
|
|
foreach ($knoten as $kind) {
|
|
if (is_array($kind)) {
|
|
$ergebnis = array_merge(
|
|
$ergebnis,
|
|
self::extrahiereBeobachtungen(
|
|
$kind,
|
|
$abonnements,
|
|
$seriennummer,
|
|
$tiefe + 1
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
return $ergebnis;
|
|
}
|
|
|
|
/** @param array<mixed> $wert */
|
|
private static function istListe(array $wert): bool
|
|
{
|
|
$index = 0;
|
|
foreach ($wert as $schluessel => $_) {
|
|
if ($schluessel !== $index++) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|