Hallo zerfasm,
vielen Dank für die Erweiterung mit der Kostenberechnung.
Du hast beim kopieren allerdings ein paar ungewollte Leerzeichen heringezaubert ab Zeile 81 treten bei „SetValue“ überall Leerzeichen bei der Variable $Kosten auf
Kleiner Tipp:
Setze das Script doch das nächste mal in einen php-Container ($Kosten - Fehler korrigiert):
<?
################################################## ################################################## ################################################## ###################
# Scriptbezeichnung: HM.Consumption.ips.php
# Version: 1.0
# Author: Heiko Wilknitz
#
# Auswertung und Hochrechnung des Stromverbrauches
#
# ----------------------------- KONFIGURATION ---------------------------------------------------------------------------------------------------------------------------
#
# Anzahl Nachkommastellen bei Ergebnissen
$roundTo = 2; //Anzahl Nachkommastellen bei Ergebnissen
$kosten = GetValue(55395 /*[Energie\Strom\Strompreis]*/); // Floatvariable mit dem Preis pro kWh
#
# ----------------------------------- ID´s ------------------------------------------------------------------------------------------------------------------------------
#
$parentID = IPS_GetObject($_IPS['SELF']);
$parentID = $parentID['ParentID'];
# ID des ArchiveHandler ermitteln
$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}');
$archiveID = $instances[0];
#
################################################## ################################################## ################################################## ###################
// Verbrauchszähler
$valueID = IPS_GetObjectIDByIdent("ENERGY_COUNTER_TOTAL", $parentID); // oder alternativ einfach die ID angeben
// -------------------------- INSTANZEN ERSTELLEN -----------------------------------------------------------------------------------------------------------------------
//Verbrauchsinstanzen anlegen
$enerID = GetOrCreateDummyByName($parentID, "Energieverbrauchsberichte");
$lastID = GetOrCreateDummyByName($enerID, "Verbrauch Zuletzt");
$currID = GetOrCreateDummyByName($enerID, "Verbrauch Aktuell");
$consID = GetOrCreateDummyByName($enerID, "Hochrechnung Verbrauch");
//Kosteninstanzen anlegen
$enerCostID = GetOrCreateDummyByName($parentID, "Energiekostenberichte");
$lastCostID = GetOrCreateDummyByName($enerCostID, "Kosten Zuletzt");
$currCostID = GetOrCreateDummyByName($enerCostID, "Kosten Aktuell");
$consCostID = GetOrCreateDummyByName($enerCostID, "Hochrechnung Kosten");
// -------------------------- VARIABLEN ERSTELLEN -----------------------------------------------------------------------------------------------------------------------
// Verbrauchsvariablen anlegen bzw. auslesen
$lastYearID = CreateVariableByName($lastID, 'Letztes Jahr');
$lastMonthID = CreateVariableByName($lastID, 'Letzter Monat');
$lastWeekID = CreateVariableByName($lastID, 'Letzte Woche');
$lastDayID = CreateVariableByName($lastID, 'Letzter Tag');
$currYearID = CreateVariableByName($currID, 'Aktuelles Jahr');
$currMonthID = CreateVariableByName($currID, 'Aktueller Monat');
$currWeekID = CreateVariableByName($currID, 'Aktuelle Woche');
$currDayID = CreateVariableByName($currID, 'Aktueller Tag');
$consYearID = CreateVariableByName($consID, 'Hochrechnung Jahr');
$consMonthID = CreateVariableByName($consID, 'Hochrechnung Monat');
$consWeekID = CreateVariableByName($consID, 'Hochrechnung Woche');
$consDayID = CreateVariableByName($consID, 'Hochrechnung Tag');
// Kostenvariablen anlegen bzw. auslesen
$lastYearCostID = CreateVariableByNameCost($lastCostID, 'Letztes Jahr');
$lastMonthCostID = CreateVariableByNameCost($lastCostID, 'Letzter Monat');
$lastWeekCostID = CreateVariableByNameCost($lastCostID, 'Letzte Woche');
$lastDayCostID = CreateVariableByNameCost($lastCostID, 'Letzter Tag');
$currYearCostID = CreateVariableByNameCost($currCostID, 'Aktuelles Jahr');
$currMonthCostID = CreateVariableByNameCost($currCostID, 'Aktueller Monat');
$currWeekCostID = CreateVariableByNameCost($currCostID, 'Aktuelle Woche');
$currDayCostID = CreateVariableByNameCost($currCostID, 'Aktueller Tag');
$consYearCostID = CreateVariableByNameCost($consCostID, 'Hochrechnung Jahr');
$consMonthCostID = CreateVariableByNameCost($consCostID, 'Hochrechnung Monat');
$consWeekCostID = CreateVariableByNameCost($consCostID, 'Hochrechnung Woche');
$consDayCostID = CreateVariableByNameCost($consCostID, 'Hochrechnung Tag');
// -------------------------- LETZTE WERTE ------------------------------------------------------------------------------------------------------------------------------
// GESTERN
$data = AC_GetAggregatedValues($archiveID, $valueID, 1 /* Täglich */, strtotime("yesterday"), strtotime("today")-1, 0);
SetValueFloat($lastDayID, CalcConsumption($data));
SetValue($lastDayCostID,GetValue($lastDayID)*$kosten);
// LEZTE WOCHE
$data = AC_GetAggregatedValues($archiveID, $valueID, 2 /* Wöchentlich */, strtotime("monday last week"), strtotime("monday this week")-1, 0);
SetValueFloat($lastWeekID, CalcConsumption($data));
SetValue($lastWeekCostID,GetValue($lastWeekID)*$kosten);
// LETZTER MONAT
$data = AC_GetAggregatedValues($archiveID, $valueID, 3 /* Monatlich */, strtotime("first day of last month 00:00:00"), strtotime("last day of last month 23:59:59"), 0);
SetValueFloat($lastMonthID, CalcConsumption($data));
SetValue($lastMonthCostID,GetValue($lastMonthID)*$kosten);
// LETZTES JAHR
$ly = date('Y', strtotime('-1 year'));
$data = AC_GetAggregatedValues($archiveID, $valueID, 4 /* Jährlich */, mktime(0, 0, 0, 1, 1, $ly), mktime(23, 59, 59, 12, 31, $ly), 0);
SetValueFloat($lastYearID, CalcConsumption($data));
SetValue($lastYearCostID,GetValue($lastYearID)*$kosten);
// ------------------------- AKTUELLE WERTE -----------------------------------------------------------------------------------------------------------------------------
// HEUTE
$data = AC_GetAggregatedValues($archiveID, $valueID, 1 /* Stündlich */, strtotime("today"), strtotime("now"), 0);
$dataDay = CalcConsumption($data);
SetValueFloat($currDayID, $dataDay);
SetValue($currDayCostID,GetValue($currDayID)*$kosten);
// WOCHE
$data = AC_GetAggregatedValues($archiveID, $valueID, 2 /* Wöchentlich */, strtotime('last monday', strtotime('tomorrow')), strtotime("now"), 0);
$dataWeek = CalcConsumption($data);
SetValueFloat($currWeekID, $dataWeek);
SetValue($currWeekCostID,GetValue($currWeekID)*$kosten);
// MONAT
$data = AC_GetAggregatedValues($archiveID, $valueID, 3 /* Monatlich */, strtotime("first day of this month 00:00"), strtotime("now"), 0);
$dataMonth = CalcConsumption($data);
SetValueFloat($currMonthID, $dataMonth);
SetValue($currMonthCostID,GetValue($currMonthID)*$kosten);
// JAHR
$data = AC_GetAggregatedValues($archiveID, $valueID, 4 /* Jährlich */, strtotime("first day of January"), strtotime("now"), 0);
$dataYear = CalcConsumption($data);
SetValueFloat($currYearID, $dataYear);
SetValue($currYearCostID,GetValue($currYearID)*$kosten);
// ------------------------- HOCHRECHNUNG -------------------------------------------------------------------------------------------------------------------------------
// TAG
$diff = strtotime('now') - strtotime('today');
$full = 60*60*24; // 24h
$data = round($dataDay*$full/$diff, 2);
SetValueFloat($consDayID, $data);
SetValue($consDayCostID,GetValue($consDayID)*$kosten);
// WOCHE
$diff = strtotime('now') - strtotime('last monday', strtotime('tomorrow'));
$full = 60*60*24*7; // 7 Tage
$data = round($dataWeek*$full/$diff, 2);
SetValueFloat($consWeekID, $data);
SetValue($consWeekCostID,GetValue($consWeekID)*$kosten);
// MONAT
$diff = strtotime('now') - strtotime('first day of this month 00:00');
$full = 60*60*24*date('t'); // 1 Monat
$data = round($dataMonth*$full/$diff, 2);
SetValueFloat($consMonthID, $data);
SetValue($consMonthCostID,GetValue($consMonthID)*$kosten);
// JAHR
$diff = strtotime('now') - strtotime('first day of January');
$full = 60*60*24*365; // 1 Jahr
$data = round($dataYear*$full/$diff, 2);
SetValueFloat($consYearID, $data);
SetValue($consYearCostID,GetValue($consYearID)*$kosten);
// ------------------------- TIMER ERSTELLEN ----------------------------------------------------------------------------------------------------------------------------
SetTimerByName($_IPS['SELF'], "Täglich alle Stunde");
// ------------------------- FUNKTIONEN ---------------------------------------------------------------------------------------------------------------------------------
// Funktion zum addieren der Zählerwerte
function CalcConsumption($values)
{
global $roundTo;
$consumption = 0;
foreach($values as $value) {
//echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL;
$consumption += $value['Avg'];
}
return round($consumption, $roundTo);
}
// Funktion um Verbauchsvariablen erstellen falls nicht vorhanden und ID entsprechend zuordnen
function CreateVariableByName($id, $name)
{
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid === false) {
$vid = IPS_CreateVariable(2);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetVariableCustomProfile($vid, "~Power");
IPS_SetIcon($vid, "Lightning");
}
return $vid;
}
// Funktion um Kostenvariablen erstellen falls nicht vorhanden und ID entsprechend zuordnen
function CreateVariableByNameCost($id, $name)
{
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid === false) {
$vid = IPS_CreateVariable(2);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetVariableCustomProfile($vid, "Euro");
IPS_SetIcon($vid, "Euro");
}
return $vid;
}
// Eine Funktion um ein Script im Script-Verzeichnis zu erzeugen
// erstellt von hirschbrat, angepasst wgreipl
function CreateScriptByName($scriptName, $parentId)
{
$scriptID = @IPS_GetScriptIDByName($scriptName, $parentId);
if ($scriptID == 0){
$scriptID = IPS_CreateScript(0);
IPS_SetName($scriptID, $scriptName);
IPS_SetParent($scriptID, $parentId);
}
return $scriptID;
}
// Funktion um eine Dummy Instanz zu erzeugen
function GetOrCreateDummyByName($parentId, $Name)
{
$objID = @IPS_GetObjectIDByName($Name, $parentId);
if ($objID == 0)
{
$objID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
IPS_SetParent($objID, $parentId);
IPS_SetName($objID, $Name);
}
return $objID;
}
// Funktion um einen Timer zu erzeugen
function SetTimerByName($parentID, $name)
{
Global ${$_IPS['SELF']};
$eid = @IPS_GetEventIDByName($name, $parentID);
if($eid === false)
{
$eid = IPS_CreateEvent(1);
IPS_SetParent($eid, $parentID);
IPS_SetName($eid, $name);
IPS_SetEventCyclic($eid, 2 /* Täglich */, 1 /* Jeden Tag */, 0, 0, 3 /* Stündlich */, 1 /* Alle Stunden */);
IPS_SetEventActive($eid, true);
}
return $eid;
}
?>
Macht es etwas übersichtlicher.
Viele Grüße,
Burkhard