Display auslesen

Ich hab mir eine 2kWh Powerstation geholt. Diese dient jetzt primär als USV und bei einem Stromausfall als Notstromquelle für die wichtigsten Geräte (wenns mal länger dauern sollte).
Die Box hat keine Schnittstelle nach außen, bis auf ein Display.
Ich habe schon ChatGPT befragt und ihm ein Foto vom Display geschickt, was auch zu 100% interpretiert wurde.


Alle Werte (Input/Output/Prozent/Dauer) wurden korrekt gelesen. Auf meine Frage, wie man das mit PHP machen könnte (Bilderkennung) wurde mir Tesseract vorgeschlagen. Die Windows-Version hab ich mir testweise installiert und mit dem Bild gefüttert. Da kam genau gar nichts raus. Nur Sonderzeichen.
Gibt es eine bessere Methode? Wirklich wichtig wären nur Input, Output und die Prozentanzeige.
Wenn das funktionieren würde ich das so machen, dass ich eine kleine Kamera vor das Display schnalle (irgend was mit 3D Druck) und über den IPS Rechner regelmäßig ein Foto machen lasse. Dieses Foto sollte dann interpretiert werden. So meine Wunschvorstellung.
Ich hab hier schon einen Beitrag mit Tesseract gefunden, wo es anscheinend auch funktioniert hat.

Womit, welches Gerät kann es?
Die Anzeige wird sicher im Multiplex Verfahren gefüttert, selbst ESP32_CAM scheidet meiner Meinung nach aus.
Ich würde am Eingang und am Ausgang mit Strommessgeräten den Strom messen und dann die Werte nach Symcon bringen.

Das hab ich eh schon :wink:
Der Ausgang interessiert mich nur peripher. Vielleicht noch als Hintergrundinformation, warum das eventuell relevant wäre. Ich möchte es so machen, dass ich zu Zeiten wo der Strom günstiger ist, die Box lade und wenn der Strom teurer ist, sie vom Netz trenne. Das funktioniert derzeit auch schon. Es werden die 14 günstigsten Stunden pro Tag zum Laden verwendet. 10 Stunden hält sie locker durch um den „Serverschrank“ zu versorgen. Ich muss nur aufpassen, dass die Entladefenster von heute auf den morgigen Tag 10 Stunden nicht überschreiten. Mit der aktuellen Methode ist es theoretisch möglich, dass heute die ersten 14 Stunden und morgen die letzten 14 Stunden zum Laden verwendet werden. Dann hätte ich 20 Stunden dazuwischen, was zu lang wäre. Das ist abe rnur theoretisch. Wenn ich den Ladestand bekomme, und den kann ich mir nicht zuverlässig errechnen, dann könnte IPS darauf reagieren.

Ich hab das Bild bei ChatGPT hochgeladen.
Bei meiner Suche bin ich auf das gestoßen Free OCR API
Funktioniert auch recht gut. Normalerweise würde ich keine Cloudlösung verwenden, aber in dem Fall wäre das ok. Wenn Strom da ist, ist auch zu 99% Internet da. Und wenn das Internet ausfallen sollte, dann kann ich noch immer zu Fuß in den Keller gehen (sofern ich zu Hause bin) und visuell kontrollieren. Vondaher wäre es nicht schlimm, wenn es nur zu 95% funktioniert. Außerdem braucht man die Werte nicht sekundengenau.

1 „Gefällt mir“

Eine etwas wilde Testkonfiguration


Mit Panzertape und Klettbändern :smiley:
Die Kamera filmte eigentlich den 3D Drucker, zur Kontrolle. Ist so eine Mini POE Kamera.
Über eine ImagGrabber Instanz hol ich mir das Bild.

welches dieses Skript verarbeitet.

<?php
// === Bild aus Medienobjekt speichern ====
$picture_id=42019;
$imagegrabber_id=20871;
IG_UpdateImage($imagegrabber_id);
file_put_contents("display.jpg",base64_decode(IPS_GetMediaContent($picture_id)));

// === Konfiguration ===
$apiKey = ''; // <-- Hier deinen API Key einfügen
$imagePath = 'display.jpg';       // Pfad zur lokalen JPG-Datei
$success=true;
// === Fehler: Datei prüfen ===
if (!file_exists($imagePath)) {
    $success=false;
    $result='Bilddatei wurde nicht gefunden.';
}

if ($success)
{
    // === CURL vorbereiten ===
    $curl = curl_init();

    curl_setopt_array($curl, [
        CURLOPT_URL => 'https://api.ocr.space/parse/image',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => [
            'apikey' => $apiKey,
            'OCREngine' => 2,
            'file' => new CURLFile($imagePath),
        ]
    ]);

    $response = curl_exec($curl);
    // === Fehler: CURL-Fehler behandeln ===
    if (curl_errno($curl)) {
        $errorMsg = curl_error($curl);
        curl_close($curl);

        $success=false;
        $result='CURL Fehler: ' . $errorMsg;
    }
    curl_close($curl);
}

if ($success)
{
    // === API-Antwort verarbeiten ===
    $result = json_decode($response, true);

    // === Fehler: JSON ungültig? ===
    if ($result === null) {
        $success=false;
        $result=$response;
    }
}

if (!$success)
{
    // === Fehler: API-Antwort enthält Fehler? ===
    if (isset($result['IsErroredOnProcessing']) && $result['IsErroredOnProcessing']) {
        $success=false;
        $result='Fehler von OCR API: ' . ($result['ErrorMessage'][0] ?? 'Unbekannter Fehler');
    }
}

if ($success)
{
    $parsedText = $result['ParsedResults'][0]['ParsedText'] ?? null;
    $success=true;
    //echo $parsedText.PHP_EOL;
    $result_array=explode("\n",$parsedText);
    $input=intval($result_array[1]);
    $prozent=intval($result_array[3]);
    $output=intval($result_array[6]);
    echo "Input: ".$input.PHP_EOL;
    echo "SOC: ".$prozent.PHP_EOL;
    echo "Output: ".$output.PHP_EOL;
    //var_dump($result_array);
    //echo $result;
}
else
{
    echo $result;
}

Ergebnis ist das

Input: 25
SOC: 100
Output: 0

Wie man sieht, falsch. Es ist nicht reproduzierbar. Mal kommen die richtigen Werte, mal nicht. Ich denke es liegt an der Kamera. Ist so eine Fish Eye Kamera.

Edit: Um es klar zu stellen. Den Kern von dem Skript hat mir ChatGPT erstellt. Das ging recht fix. Ein paar Änderungen hab ich gemacht, damit es für mich passt.

1 „Gefällt mir“