20. Januar 2024

Stromverbrauch tracken mit dem Hichi IR Lesekopf, PHP und einem Raspberry Pi Zero

In diesem Beitrag hatte ich schon beschrieben, wie man die Stromerzeugung eines Balkonkraftwerks mit dem Wechselrichter EZ-1 auslesen und tracken kann. Hier erkläre ich, wie man das gleiche mit dem Stromverbrauch machen kann. Hierfür stellen eigentlich alle digitalen Stromzähler eine Infrarot-Schnittstelle zur Verfügung.

Hierfür benötigst du:

  • einen Hichi IR Lesekopf mit WLAN
  • ein Micro-USB-Kabel + Netzteil

Bevor der Strom ausgelesen und getrackt werden kann, sind jedoch einige Schritte zu erledigen.

  1. Als erstes musst bei deinem Netzbetreiber den PIN deines Stromzählers anfordern um den „erweiterten Datensatz“ freischalten zu können.
  2. Den PIN musst du dann mit einer Taschenlampe am Stromzähler eingeben.
  3. Jetzt kannst kannst du den magnetischern Lesekopf am Stromzähler anbringen.
  4. Verbinde dich mit dem WLAN des Lesekopfes.
  5. Gib die Daten deines WLANs ein.
  6. Nachdem der Hichi neu gestartet ist, ist er über eine lokale IP-Adresse (http://192.168.0.XXX) erreichbar.
  7. Jetzt musst du den Hichi noch für dein Stromzählermodell konfigurieren. Rufe hierzu diese Seite auf und such nach deinem Modell: https://tasmota.github.io/docs/Smart-Meter-Interface/
  8. Klick bei deinem Modell auf „View Script“ und kopiere das Script in die Zwischenablage.
  9. Wechsle nun zur Weboberfläche des Hichi: http://192.168.0.XXX, klick auf „Consoles > Edit Script“ und füge das Script hier ein.
  10. Jetzt müsstet du auf der Startseite bereit die Werte des Stromzählers sehen können. Falls nicht, achte daruf, dass der Infrarotlesekopf richtig positioniert ist. Manchmal reicht bereits eine Drehung um wenige Millimeter.
  11. Die Daten des Lesekopfes kannst du jetzt jederzeit unter folgender URL abrufen:
    http://192.168.0.XXXcm?cmnd=STATUS+8

Um die Daten zu loggen, habe ich auf einem Raspberry Pi Zero einen lokalen Webserver installiert. Dort lese ich die Daten mit folgendem Code aus und sende sie an meinen Webserver:

<?php
$url = 'http://192.168.0.XXX/cm?cmnd=STATUS+8'; 
$curl = curl_init($url);

$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$netz_error = '';

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($curl);
if($response === false) {
    $netz_error = curl_error($curl);

    $Power_cur = '';
    $Total_in_d = '';
    $Total_out_d = '';

} else {

    $data = json_decode($response, true);

    $Power_cur = $data['StatusSNS']['MT681']['Power_cur'];
    $Total_in = $data['StatusSNS']['MT681']['Total_in'];
    $Total_out = $data['StatusSNS']['MT681']['Total_out'];
    $Total_in_d = number_format($Total_in, 2);
    $Total_out_d = number_format($Total_out, 2);

}

curl_close($curl);
?>

<!-- ... ->

<meta http-equiv="refresh" content="300">

<script>

var Power_cur = <?php echo $Power_cur; ?>;

if (Power_cur > 0){      

    $.post( "https://www.fbnfrtg.de/.../newitem.php", { 
        secretkey: "jfs839hXXXXXX3ihdfs",
        Power_cur: "<?php echo $Power_cur; ?>", 
        Total_in: "<?php echo $Total_in; ?>", 
        Total_out: "<?php echo $Total_out; ?>" 
    });

}

</script>

Dort werden Sie von einem PHP-Script empfangen und in einen Datenbank geschrieben.

<?php

if ($_POST['secretkey'] != 'jfs839hXXXXXX3ihdfs'){
    echo 'no key';
    exit();
}

require_once "sleekdb/SleekDB.php";

$databaseDirectory = __DIR__ . "/XXX";

$currentstore = new \SleekDB\Store("power_data", $databaseDirectory);

$timestamp = date("Y-m-d-H-i-s");
$date = date("Y-m-d");
$month = date("Y-m");
$time = date("H.i");
$datetoday = date("Y-m-d");

if ($_POST['Total_in']){

$Power_cur = $_POST['Power_cur'];
$Total_in = $_POST['Total_in']; 
$Total_out = $_POST['Total_out']; 

$data = $currentstore->findBy(["date", "=", $datetoday ],["_id" => "desc"]);
$currentid = $data[0]["_id"];
$count = count($data);

$item = [
    'date' => $date,
    $timestamp => [
        'month' => $month, 
        'date' => $date,
        'timestamp' => $timestamp, 
        'time' => $time, 
        'Power_cur' => $Power_cur,  
        'Total_in' => $Total_in,
        'Total_out' => $Total_out
    ],
];

if ($count > 0){
    $currentstore->updateById($currentid, $item);
} else {
    $results = $currentstore->insert($item);
}

}
?>

Besonders interessant werden diese Daten, wenn man sie mit den Daten aus dem Balkonkraftwerk kombiniert.


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert