Hallo Pitti,
erst einmal vielen Dank für das tolle Skript.
War mal so frei und habe noch eine Kostenberechnung mit eingefügt und das ganze dann ein wenig aufgeräumt und in zwei Instanzen gepackt. Den Timer lasse ich auch gleich per Skript erstellen.
Gruß
Mike
Wenn es jemand gebrauchen kann. Anbei das angepasste Skript:
<?
#########################################################################################################################################################################
# Scriptbezeichnung: HM.Consumption.ips.php
# Version: 1.0
# Author: Heiko Wilknitz
# Anpasser: Mike Zerfas
# Skript wurde durch Kostenrechnung erweitert und es wurden noch zusätzlich 2 Instanzen zur besseren Übersicht
# hinzugefügt. Des Weiteren wurde noch die Funktion für den Timer hinzugefügt
#
#
#
# Auswertung und Hochrechnung des Stromverbrauches
#
# ----------------------------- KONFIGURATION ---------------------------------------------------------------------------------------------------------------------------
#
# Anzahl Nachkommastellen bei Ergebnissen
$roundTo = 2; //Anzahl Nachkommastellen bei Ergebnissen
$kosten = GetValue(41930 /*[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, 'Jahr');
$consMonthID = CreateVariableByName($consID, 'Monat');
$consWeekID = CreateVariableByName($consID, 'Woche');
$consDayID = CreateVariableByName($consID, '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, 'Jahr');
$consMonthCostID = CreateVariableByNameCost($consCostID, 'Monat');
$consWeekCostID = CreateVariableByNameCost($consCostID, 'Woche');
$consDayCostID = CreateVariableByNameCost($consCostID, '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;
}
?>