Strom messen mit Owl Energiemonitor

Das komplette Löschen der DB bringt auch nichts…

Poste bitte mal dein skript


$db = new sqlite3("C:/ProgramData/2SE/be.db");
$results = $db->query('SELECT * FROM energy_history  Limit 1');
//$results = $db->query('SELECT * FROM energy_history order by dt desc  Limit 1');
while ($row = $results->fetchArray())
{
    //var_dump($row);
    //echo $row['ch1_kw_avg']*60/1000;
    SetValue(33087 /*[OWL Energymonitor\KW]*/, GetValue(33087 /*[OWL Energymonitor\KW]*/)+$row['ch1_kw_avg']/1000);
    SetValue(17680 /*[OWL Energymonitor\KWh]*/ , $row['ch1_kw_avg']*60/1000);
}


Wieso hast du die Zeile

$results = $db->query('SELECT * FROM energy_history order by dt desc  Limit 1'); 

auskommentiert?

$db = new sqlite3("C:/ProgramData/2SE/be.db");
$results = $db->query('SELECT * FROM energy_history order by dt desc  Limit 1');
while ($row = $results->fetchArray())
{
    //var_dump($row);
    //echo $row['ch1_kw_avg']*60/1000;
    SetValue(33087 /*[OWL Energymonitor\KW]*/, GetValue(33087 /*[OWL Energymonitor\KW]*/)+$row['ch1_kw_avg']/1000);
    SetValue(17680 /*[OWL Energymonitor\KWh]*/ , $row['ch1_kw_avg']*60/1000);
} 

So sollte es gehen.

so, ich habs (das OWL-Tool) nochmal komplett neu installiert, inkl. der Datenbank.
Jetzt klappts. DANKE !

habe gerade ne alternativ software gefunden

electricowl | Free software downloads at SourceForge.net

kann da einer was draus basteln. Ist wahrscheinlich besser als die andere ;0) das ist ja auch nicht schwer.

Moin,

gibts eigentlich ne Möglichkeit den Batteriestatus des Transmittors darzustellen bzw. abzufragen ?!?

Hallo,

wenn ich in meine „C:\ProgramData\2SE\be.db“ reinschaue ist bei ch1_amps_avg und ch1_amps immer eine 0 geloggt.

ch1_kw_avg, ch1_kw_min und ch1_kw_max bekommen Werte, hatte das Problem schon mal jemand?

edit:
alles gelöscht und nochmal das aktuelle installiert, dann war alles schön.

Wie macht Ihr das mit der Zeitumstellung?

Ich hab die Zeit an dem OWL Monitor umgestellt, nun hat mein Monitoring nur halt eine Lücke.

Hat irgendjemand da einen besseren Ansatz als das ganze zu ignorieren?
Ich schiebe derzeit über ein Perl Script die Werte direkt in eine RRD Datei.

Update: Wie man den Batteriestatus des Transmitters oder die Temperaturanzeige des Monitors abzufragen, würde mich auch interessieren…

Habe mir mal ein „aufgeräumteres“ Skript geschrieben, um die Datenbank vernünftig auszuwerten, so dass bei ungünstigem Timing weder ein Datensatz doppelt gelesen, noch übersprungen wird.

Ich habe es getestet, sieht soweit ok aus. Falls jemandem ein Fehler auffällt, bitte melden.

<?

// Variable, die den Zeitstempel des letzten eingelesenen Datensatzes enhält
// Integer, Profil Unix Timestamp
$idLastTimeStamp = 22128 /*[Hardware\The Owl\Letzter Zeitstempel]*/ ;

// Variablen für den Stromzähler und den Momentanverbrauch
// Beide Float, KWh bzw. KW
$idCounter = 37469 /*[Gewerke\Sonstige\Stromverbrauch\Zählerstand]*/ ;
$idCurrentConsumption = 33676 /*[Gewerke\Sonstige\Stromverbrauch\Momentanverbrauch]*/ ;

// Variable für Greenhouse Gases
// Float, Summe in Tonnen
$idGHGCounter = 48424 /*[Gewerke\Sonstige\Stromverbrauch\Treibhausgasausstoß Summe]*/ ;

// Variable für Kosten Summe
// Float, EUR
$idCostCounter = 26543  /*[Gewerke\Sonstige\Stromverbrauch\Kosten Summe]*/;

// ab hier nichts mehr ändern

// hole den letzten Zeitstempel
$lastValueTimeStamp = GetValue($idLastTimeStamp);
$lastValueTimeStr = date('Y-m-d H:i:s', $lastValueTimeStamp) . '.000';

// Datenbankzugriff
$db = new sqlite3("C:/ProgramData/2SE/be.db");

// Hole alle Datensätze seit dem letzten Zeitstempel
$results = $db->query('SELECT ghg, cost, dt, ch1_kw_avg FROM energy_history WHERE dt > "' .
	$lastValueTimeStr . '" ORDER BY dt ASC');

// Zählerstand zwischenspeichern
$kwCounterLevel = GetValue($idCounter);

// Die Datensätze durchgehen
$timeStamp = 0;
while ($row = $results->fetchArray())
{
	//var_dump($row);
	$kw = ($row['ch1_kw_avg'] * 60) / 1000; // kw
	$ghg = $row['ghg'] / 100000; // t
	$cost = $row['cost'] / 10000; // EUR
	
	$timeStamp = strtotime($row['dt']);

	$kwCounterLevel = $kwCounterLevel + ($kw / 60); // KWh
}

// wenn neue Daten da sind, Variablen schreiben
if($timeStamp > 0)
{
	SetValue($idCounter, $kwCounterLevel);
	SetValue($idCurrentConsumption, $kw);
	
	SetValue($idGHGCounter, $ghg);
	
	SetValue($idCostCounter, $cost);
	
	SetValue($idLastTimeStamp, $timeStamp);
}

?>

Mein Skript ist übrigens für den OWL+USB

Edit: Da ist noch ein Fehler drin; die Daten für Treibhausgase und Kosten sind noch Bullshit.

Habe da eine Frage: Ich habe mehrere (3) Sender im Einsatz, wie kann ich die mit deinem Script Einzeln auslesen ?

Ich habe das Problem das es bis zu 2 Minuten Verzögerung gibt, bis der Aktuelle Wert in IPS steht, kann man da was machen/optimieren ? Ist das mit deinem Script besser von timing ?

Ich habe leider den OWL+USB, der nur einen Sender ausliest. Umbauen des Skriptes auf drei Sensoren müsste möglich sein, kann ich aber aus besagtem Grund nicht machen und vor Allem nicht testen.

Die Berechnung für CO2 und Kosten ist übrigens wie schon gesagt fehlerhaft, den Teil habe ich bei mir auskomentiert.

Und ich habe noch ein Problem mit dem OWL Monitor: Ich finde das Teil viel zu ungenau. Der angezeigte Wert hat zwar grob was mit dem Verbrauch zu tun, aber so richtig präzise ist das nicht. Wenn ich mit dem Stromzähler des Netzinhabers vergleiche liegen oft einige KWh pro Tag dazwischen.

Insofern hadere ich ein wenig mit dem Gerät.

Ich verwende jetzt statt der Originalsoftware, die dem Gerät beiliegt, die freie Software „Electric Owl“ (einfach mal googeln). Diese scheint mir wesentlich schlanker und sie erzeugt ebenfalls eine SQLite-Datenbank.

Bei der Originalsoftware hatte ich das Problem, dass sie ein Speicherleck hatte, so dass IPS (und das ganze System) nach einiger Laufzeit instabil wurden. Ich hoffe, das ist bei der freien Alternative nicht der Fall.

Das Skript musste ich etwas abändern. Die freie Software scheint z.B. die Stromstärke abzuliefern und nicht die Leistung. Ich beziehe jetzt zur Ermittlung der Nennleistung (U * I) den Messwert der Eingangsspannung von meiner USV. Das sollte natürlich genauer sein, da es hier schon zu gewissen Schwankungen bis ca. 8 V kommt.

Ich werde berichten und, falls ich erfolgreich bin, hier den Quellcode posten.

Und bist du weitergekommen ?

Hier mein Skript, funktioniert soweit gut. Man kann mittels einem Flag zwischen der Originalsoftware und der freien Software „Electric Owl“ umschalten. Bei mir läuft Electric Owl wesentlich stabiler und ressourcenschonender.

<?

// Originalsoftware (false) oder Electric Owl (true) verwenden?
$eowlMode = true;

// falls Electric Owl verwendet wird, Benutzernamen hier eintragen
$eowlUser = 'Administrator';

// Variable, die den Zeitstempel des letzten eingelesenen Datensatzes enhält
// Integer, Profil Unix Timestamp
$idLastTimeStamp = 22128 /*[Hardware\The Owl\Letzter Zeitstempel]*/ ;

// Variablen für den Stromzähler und den Momentanverbrauch
// Beide Float, KWh bzw. KW
$idCounter = 37469 /*[Tableau\Strom\Stromverbrauch\Zählerstand]*/ ;
$idCurrentConsumption = 33676 /*[Tableau\Strom\Stromverbrauch\Momentanverbrauch]*/ ;

// ab hier nichts mehr ändern

// hole den letzten Zeitstempel
$lastValueTimeStamp = GetValue($idLastTimeStamp);
$lastValueTimeStr = date('Y-m-d H:i:s', $lastValueTimeStamp) . '.000';

// Datenbankzugriff
if($eowlMode)
	$db = new sqlite3("C:/Users/" . $eowlUser . "/cm160_data.db");
else
	$db = new sqlite3("C:/ProgramData/2SE/be.db");

$db->query('PRAGMA journal_mode = OFF');

// Hole alle Datensätze seit dem letzten Zeitstempel
if($eowlMode)
	$results = $db->query('SELECT * FROM cm160data WHERE ts > "' .
		$lastValueTimeStr . '" ORDER BY ts ASC');
else
	$results = $db->query('SELECT * FROM energy_history WHERE dt > "' .
		$lastValueTimeStr . '" ORDER BY dt ASC');

// Zählerstand zwischenspeichern
$kwCounterLevel = GetValue($idCounter);

// könnte man einkommentieren, wenn man eine Quelle für die tatsächliche Netzspannung hätte
//$voltage = GetValue(35370 /*[Hardware\USV\Interface\APCUPSD\Smart-UPS 750\VoltIn]*/ );
$voltage = 230;

// Die Datensätze durchgehen
$timeStamp = 0;
while ($row = $results->fetchArray())
{
	if($eowlMode)
	{
		$kw = ($row['current'] * $voltage) / 1000;
	   $timeStamp = strtotime($row['ts']);

		$kwCounterLevel += $kw * (($timeStamp - $lastValueTimeStamp) / (60 * 60));
	   
	   $lastValueTimeStamp = $timeStamp;
	}
	else
	{
		$kw = ($row['ch1_kw_avg'] * 60) / 1000; // kw
		$timeStamp = strtotime($row['dt']);
		$kwCounterLevel += $kw * (1 / 60); // KWh
	}
}

// wenn neue Daten da sind, Variablen schreiben
if($timeStamp > 0)
{
	SetValue($idCounter, $kwCounterLevel);
	SetValue($idCurrentConsumption, $kw);
	
	SetValue($idLastTimeStamp, $timeStamp);
}

?>

Danke für dein Script aber leider ließt er keine Daten aus, in der Software geht alles…

Damit ich helfen kann, müsstest du das mal präzisieren, bzw. selbst etwas nachforschen. Sind z.B. diese Dateipfade bei dir korrekt?

if($eowlMode)
    $db = new sqlite3("C:/Users/" . $eowlUser . "/cm160_data.db");
else
    $db = new sqlite3("C:/ProgramData/2SE/be.db");

Hallo!

Gibt es schon ein Script mit dem man die Kosten Auslesen kann?

Gruß
Erwoolf

Bislang nicht. Ich persönlich würde das einfach in IPS machen.