Hallo zerfasm,
vielen Dank für die Erweiterung mit der Kostenberechnung. ![:slight_smile: :slight_smile:](https://community.symcon.de/images/emoji/win10/slight_smile.png?v=9)
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. ![:wink: :wink:](https://community.symcon.de/images/emoji/win10/wink.png?v=9)
Viele Grüße,
Burkhard