Hallo,
ich habe ein kleines Skript aus vorhandenen Stücken und Eigenkreationen zusammengebastelt, mit dem sich Zählervariablen sehr leicht auswerten und visualisieren lassen.
Einzige Vorbedingung: Es gibt eine Zählervariable die irgendwie aufwärts zählt. Einfach unterhalb dieser Variable ein neues Skript anlegen und den Inhalt reinkopieren.
Zwei Dinge sollten im Skript noch eingestellt werden:
Faktor Impulse --> Messgröße:
- [li]Falls die Inhalte der Variablen in kwh sein sollen und der abgefragte Zähler 2000 Impulse pro kwh erzeugt gehört hier 2000 rein.
[/li]
Grenzwert, bis zu dem registriert wird:
- [li]Sollten zwei aufeinanderfolgende Zählerstände größer als dieser Wert sein so werden sie ignoriert. Das ist bei meinem EM 1010 wichtig, hier kommen immer mal wieder sporadisch Riesenwerte rein.
[/li]
Das Skript legt ein weiteres Skript und zwei Timer an. Das angelegt, weitere Skript „Tagesverbrauch“ ermittelt immer um 0:03 Uhr den Tagesverbrauch des letzten Tages.
Folgende Variablen werden automatisch angelegt:
[ul][li]Gesamtverbrauch: Hier wird der Gesamtverbrauch aufsummiert.
[/li][li]Tage: Bei jeden Start des Skriptes Tagesverbrauch wird hier ein Tag addiert.
[/li][li]Tagesverbrauch: Verbrauch des letzten Tages.
[/li][li]Verbrauch 24h: Verbrauch in den letzten 24 Stunden
[/li][li]Verbrauch aktuell: Differenz der letzten beiden Zählerstände
[/li][li]Verbrauch Monat: Gesamtverbrauch letzter Monat (sollte noch kein kompletter Monat erfasst sein, werden die bis jetzt erfassten Werte auf einen Monat hochgerechnet).
[/li][li]Verbrauch Jahr: Gesamtverbrauch letztes Jahr (sollte noch kein komplettes Jahr erfasst sein, werden die bis jetzt erfassten Werte auf ein Jahr hochgerechnet).
[/li][li][/ul]
[/li]
Beim ersten Start wirft das Skript Fehler aus. Das ist normal, da die Verbrauchsvariablen teilweise über den Archive Handler ermittelt werden. Hier müssen erst einmal Werte registriert werden.
<?
$faktor=2000; //Faktor Impulse --> Messgröße
$grenzwert=30; // Grenzwert, bis zu dem registriert wird
/********************************************************
Ab hier nichts mehr ändern
********************************************************/
$parentID = IPS_GetObject($IPS_SELF);
$parentID = $parentID['ParentID'];
// ID des ArchiveHandler ermitteln
$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}');
$id_archive_handler = $instances[0];
$id_wert = $parentID;
$wert = GetValue ($id_wert);
$id_wert_alt = CreateVariableByName($parentID, "Wert alt");
$wert_alt = GetValueFloat ($id_wert_alt);
$id_verbrauch_aktuell = CreateVariableByName($parentID, "Verbrauch aktuell");
$verbrauch_aktuell = GetValueFloat ($id_verbrauch_aktuell);
AC_SetLoggingStatus($id_archive_handler,$id_verbrauch_aktuell,true);
$id_gesamtverbrauch = CreateVariableByName($parentID, "Gesamtverbrauch");
$gesamtverbrauch = GetValueFloat ($id_gesamtverbrauch);
AC_SetLoggingStatus($id_archive_handler,$id_gesamtverbrauch,true);
AC_SetAggregationType($id_archive_handler,$id_gesamtverbrauch,1);
$id_tagesverbrauch = CreateVariableByName($parentID, 'Tagesverbrauch');
$id_gesamt_gestern = CreateVariableByName($parentID, 'Gesamt gestern');
$id_tage = CreateVariableByName($parentID, 'Tage');
$id_verbrauch_24h = CreateVariableByName($parentID, 'Verbrauch 24h');
$id_verbrauch_monat = CreateVariableByName($parentID, 'Verbrauch Monat');
$id_verbrauch_jahr = CreateVariableByName($parentID, 'Verbrauch Jahr');
if (($wert-$wert_alt< $grenzwert) and ($wert>=$wert_alt))
{
$verbrauch_aktuell=($wert-$wert_alt)/$faktor;
$gesamtverbrauch=$gesamtverbrauch+$verbrauch_aktuell;
}
//Verbrauch letzte Stunde in aktueller Verbrauch schreiben
$ende = time();
$start_stunde=time()-(60*60); //letzte h
$temp = AC_GetLoggedValues($id_archive_handler, $id_gesamtverbrauch, $start_stunde, $ende, 0);
$anzahl = count($temp);
$aktwert = $temp[$anzahl-1];
$letzterWert=$aktwert['Value'];
$aktwert=$temp[0];
$ersterWert=$aktwert['Value'];
$verbrauch_letzte_stunde=($ersterWert-$letzterWert);
SetValueFloat($id_wert_alt,$wert);
SetValueFloat($id_verbrauch_aktuell,$verbrauch_letzte_stunde);
SetValueFloat($id_gesamtverbrauch,$gesamtverbrauch);
/******************* Tages- und Monats- und Jahreswerte aus Archive ermitteln *****************/
$ende = time();
$start_stunde=time()-(60*60); //letzte 24 h
$start_gestern = time()-(60*60*24); //letzte 24 h
$start_monat = time()-(60*60*24*30); // letzte 30 Tage
$start_jahr = time()-(60*60*24*365); // letzte 365 Tage
// Abfrage letzte 24 h
$temp = AC_GetLoggedValues($id_archive_handler, $id_gesamtverbrauch, $start_gestern, $ende, 0);
$anzahl = count($temp);
$aktwert = $temp[$anzahl-1];
$letzterWert=$aktwert['Value'];
$aktwert=$temp[0];
$ersterWert=$aktwert['Value'];
$verbrauch_24h=($ersterWert-$letzterWert);
SetValueFloat($id_verbrauch_24h,$verbrauch_24h);
// Mittelwert Monat
$temp = AC_GetAggregatedValues($id_archive_handler, $id_gesamtverbrauch,3,$start_monat, $ende, 0);
$aktwert = $temp[0];
$verbrauch_monat=$aktwert["Avg"];
$duration=$aktwert["Duration"];
$monat=60*60*24*30;
$verbrauch_monat=$verbrauch_monat*($monat/$duration);
SetValue($id_verbrauch_monat,$verbrauch_monat);
// Mittelwert Jahr
$temp = AC_GetAggregatedValues($id_archive_handler, $id_gesamtverbrauch,4,$start_jahr, $ende,0);
$aktwert = $temp[0];
$verbrauch_jahr=$aktwert["Avg"];
$duration=$aktwert["Duration"];
$jahr=60*60*24*365;
$verbrauch_jahr=$verbrauch_jahr*$jahr/$duration;
SetValue($id_verbrauch_jahr,$verbrauch_jahr);
// Inhalt für Skript "Tagesverbrauch" erzeugen
//********************************************
$skript_Tagesverbrauch = "<?
\$parentID = IPS_GetObject(\$IPS_SELF);
\$parentID = \$parentID['ParentID'];
\$id_tagesverbrauch = @IPS_GetVariableIDByName('Tagesverbrauch', \$parentID);
\$id_gesamt_gestern = @IPS_GetVariableIDByName('Gesamt gestern', \$parentID);
\$id_tage = @IPS_GetVariableIDByName('Tage', \$parentID);
\$id_gesamtverbrauch = @IPS_GetVariableIDByName('Gesamtverbrauch', \$parentID);
\$tagesverbrauch=GetValue (\$id_gesamtverbrauch)-GetValue (\$id_gesamt_gestern);
SetValueFloat(\$id_tagesverbrauch, \$tagesverbrauch);
\$tage=GetValue(\$id_tage);
SetValueFloat(\$id_tage, \$tage+1);
?>";
// Skript "Tagesverbrauch" erzeugen
$scriptid_tagesverbrauch = CreateScriptByName("Tagesverbrauch", $parentID, $skript_Tagesverbrauch);
// Triggerbedingung/Ereignis für Skript "Tagesverbrauch" erstellen falls nicht vorhanden
//*****************************************************************
$EreignisID = @IPS_GetEventIDByName( "Tagesverbrauch" , $scriptid_tagesverbrauch);
if ($EreignisID == 0){
$eid = IPS_CreateEvent(1); // Zyklisches Ereignis
IPS_SetEventCyclic($eid, 2, 1, 0, 0, 0, 0); //Taeglich
IPS_SetEventCyclicTimeBounds($eid, mktime(00, 00, 02), 0); //immer um 00:00:02Uhr
IPS_SetParent($eid, $scriptid_tagesverbrauch); // Ereignis zuordnen
IPS_SetName($eid, "Tagesverbrauch" ); // Ereignis umbennen
IPS_SetEventActive($eid, true); // Ereignis aktivieren
}
// Triggerbedingung für dieses Skript erstellen falls nicht vorhanden
//*****************************************************************
$EventName = "Update";
$EventID = @IPS_GetEventIDByName($EventName, $_IPS['SELF']);
if ($EventID === false)
{
$eid = IPS_CreateEvent(0); //Ausgelöstes Ereignis
IPS_SetEventTrigger($eid, 1, $parentID); //Bei Änderung der übergeordneten Variablen
IPS_SetParent($eid, $_IPS['SELF']); //Ereignis zuordnen
IPS_SetEventActive($eid, true); //Ereignis aktivieren
IPS_SetName($eid, $EventName);
}
// Variablen erstellen falls nicht vorhanden und ID entsprechend zuordnen
function CreateVariableByName($id, $name)
{
global $IPS_SELF;
global $ScriptID;
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid === false) {
$vid = IPS_CreateVariable(2);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
}
return $vid;
}
// Eine Funktion um ein Script im Script-Verzeichnis zu erzeugen
// erstellt von hirschbrat, angepasst wgreipl
function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
global $IPS_SELF;
$ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
if ($ScriptID == 0){
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $ScriptNAME);
IPS_SetParent($ScriptID, $ParentID);
IPS_SetInfo($ScriptID, "This script was created by: #$IPS_SELF#");
$fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("can't open file");
fwrite($fh, $ScriptTEXT);
fclose($fh);
$ScriptPath = $ScriptID.".ips.php";
IPS_SetScriptFile($ScriptID, $ScriptPath);
IPS_SetHidden($ScriptID, true);
IPS_SetPosition($ScriptID, 80);
}
return $ScriptID;
}
?>
Viel Spaß damit
Wango
Alles über die Nase im Gesicht Nordfrieslands
http://www.Eiderstedt.net