Simples Auswerteskript für Zähler

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

Hallo Wango

Erstmal Danke für Dein Script.
Es werden Leider nicht alle Variablen mit Werten gefüllt und die Folgenden Fehlermeldungen bekomme ich.


Notice:  Undefined offset: -1 in C:\IP-Symcon\scripts\39807.ips.php on line 49Notice:  Undefined offset: 0 in C:\IP-Symcon\scripts\39807.ips.php on line 51
Notice:  Undefined offset: -1 in C:\IP-Symcon\scripts\39807.ips.php on line 59
Notice:  Undefined offset: 0 in C:\IP-Symcon\scripts\39807.ips.php on line 61
Notice:  Undefined offset: 0 in C:\IP-Symcon\scripts\39807.ips.php on line 68
Warning:  Division by zero in C:\IP-Symcon\scripts\39807.ips.php on line 73
Notice:  Undefined offset: 0 in C:\IP-Symcon\scripts\39807.ips.php on line 78
Warning:  Division by zero in C:\IP-Symcon\scripts\39807.ips.php on line 83

Ich hoffe Du kannst mir da Helfen.

Mfg Stefan

hmmmm…hat es vielleicht damit zu tun:

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.

Hallo Stefan,

darauf bin ich in der Beschreibung wohl etwas zu kurz eingegangen. Die Mittelwerte werden über den Archive Handler berechnet, da das Skript am ersten Tag noch keine Wert für den Vortag hat, bekommst Du die Fehlermeldung.
Ist also normal, lass das Skript einfach 24 h laufen, dann hat sich alles erledigt.

Einen guten Wochenstart

Boris


Alles über die Nase im Gesicht Nordfrieslands
http://www.eiderstedt.net

Hi Wango,

eine Anmerkung zum Umgang mit AC_getAgg… (ich hoffe, es wirkt nicht zu demotivierend ;)): Du solltest darauf achten, dass du die Zeiträume der Abfragen immer auf ganze, abgeschlossene Perioden legst.

Beispiel: Start heute vor 30 Tagen, Ende heute (oder gestern), Ergbnis der Abfrage (Monatsintervall) zeigt den Wert Avg 158 für November, nicht den der verg. 30 Tage (in 30 Tagen hätte ein Wert von etwa 400 ergeben müssen):

Array
(
    [0] => Array
        (
            [Avg] => 158.823
            [Duration] => 983757
            [LastTime] => 1352708156
            [Max] => 0.76499999999999
            [MaxTime] => 1352127665
            [Min] => 0.0049999999999954
            [MinTime] => 1351730913
            [TimeStamp] => 1351724400
            [humanDateMin] => 01.11.2012, 01:48
            [humanDate] => 01.11.2012, 00:00
            [humanDateMax] => 05.11.2012, 16:01
        )

)

Wenn Du gleitende Perioden darstellen willst, musst du immer auf die nächst kleinere Verdichtungsstufe zurückgreifen (also bei 30 Tagen gleitend nicht den Monatswert abfragen, sondern die Tageswerte) und diese werte dann addieren.

Hi Raketenschnecke,

ne war schon richtig so, ich habe nur nicht die Endversion meines Skriptes ins Forum kopiert. Wenn man den Aggregationstyp auf Zähler setzt sollte Avg die Summe und keinen Durchschnitt liefern. Angefangene Zeiträume werden linear hochgerechnet. Das geht (zumindest gefühlt) schneller als das zusammrechnen der Einzelwerte aus der nächstkleineren Aggregationsstufe.

Das Skript im ersten Beitrag habe ich entsprechend geändert.

@Masterflash: Einfach das Skript aus dem ersten Artikel über das alte kopieren, die beiden Variablen wieder richtig anpassen und die Variable reaggregieren, dann bleiben die alten Werte.


Alles über die Nase im Gesicht Nordfrieslands
http://www.eiderstedt.net

das ist soweit richtig. nur sollte klar sein,dass du nicht die Summe von 30 Tagen bekommst: wenn du bei Agg=3 und ts = letzter Monat (und damit der abgefragte Zeitraum monatsübergreifend ist) bekommst du via Avg die Summe diesen Monats, nicht von 30 Tagen (und ein Monat hat auch nicht immer 30 Tage ;))

Hallo Danke für das tolle Script.

Ich habe ein Problem das die Variable „Gesamt gestern“ nie aktualisiert wird ich finde aber auch im Script keine Zeile wo die Variable ein Value bekommt kannst Du etwas dazu sagen ? Der Wert ist immer 0.

Hallo aus Magdeburg,

Ich habe dein Script zum test mal an das EKM 868 gehängt, Triggerst du da die Counter Variable an das Script ?

Moin JensW,

wenn Du das Script das erste Mal startest, legt es automatisch ein neues Skript „Tagesverbrauch“ an, das füllt um kurz nach Mitternacht die Variable Gesamt gestern. Also Skript einmal starten und bis zum nächsten Morgen warten dann steht was in der Variable.(und die anderen füllen sich auch).

Im Zähler-Skript wird das durch die Zeilen hinter den Kommentar „// Inhalt für Skript „Tagesverbrauch“ erzeugen“ erzeugt.


Kabellabor - Smarthome und Hausautomatisierung/Haussteuerung
Alles automatisch

Guten Morgen ich habe das Script schon seit März am laufen.

Da kommt nix ich habe nun einfach das Tages Script erweitert und schreibe mir einfach den Wert selber weg.

<?
    $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);
    SetValueFloat ($id_gesamt_gestern, $id_gesamtverbrauch);
 ?>

Wird denn die Variable angelegt und ist das Skript Tagesverbrauch unterhalb der Zählervariable und hat einen Timer?


Kabellabor - Smarthome und Hausautomatisierung/Haussteuerung
Alles automatisch

Hallo Wango,
habe gestern Dein simples Skript gefunden und direkt übernommen, funktionierte wie beschrieben :-).
Erst heute ist mir aufgefallen das es nicht die finale Version ist, wie Du einen Tag später schreibst #6.

Könntest Du mir die finale Version zur Verfügung stellen?

Wenn das funktioniert, dann ist das der Hammer :D:D:D:D:D;):wink:

Gruß
ksd8

Moin kds8,

ich dachte ich hätte das Script im ersten Post aktualisiert, habe ich wohl vergessen :eek:
Das Script ist aber offensichtlich anders, als das was bei mir seit Jahren läuft. Also hier die aktuelle Version:

<?
$faktor=800;              		//Faktor Impulse --> Messgröße
$runden_auf=2;                //Anzahl Nachkommastellen bei Ergebnissen
/********************************************************
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");
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_1h			= CreateVariableByName($parentID, 'Verbrauch 1h');
AC_SetLoggingStatus($id_archive_handler,$id_verbrauch_1h,true);
$id_verbrauch_24h			= CreateVariableByName($parentID, 'Verbrauch 24h');
$id_verbrauch_monat		= CreateVariableByName($parentID, 'Verbrauch Monat');
$id_verbrauch_jahr		= CreateVariableByName($parentID, 'Verbrauch Jahr');

//Verbrauch seit letztem Start berechnen
$verbrauch_aktuell=round(($wert-$wert_alt)/$faktor,$runden_auf);
$gesamtverbrauch=$gesamtverbrauch+$verbrauch_aktuell;

//Verbrauch letzte 5 min in aktueller Verbrauch schreiben
SetValueFloat($id_verbrauch_aktuell,$verbrauch_aktuell);

//Verbrauch der letzten kompletten Stunde in Verbrauch 1 h schreiben
$day=date("d", time());
$month=date("m", time());
$year=date("Y", time());
$hour=date("H", time());
$endzeit=$day.".".$month.".".$year." ".$hour.":00:00";
If ($hour==0)
	{
	$day=$day-1;
	$hour="23";
	}
else
	{
	$hour=$hour-1;
	}
$startzeit=$day.".".$month.".".$year." ".$hour.":00:00";
$startstunde=strtotime($startzeit);
$endstunde=strtotime($endzeit);
$temp = AC_GetLoggedValues($id_archive_handler, $id_gesamtverbrauch, $startstunde, $endstunde, 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_1h,round($verbrauch_letzte_stunde,$runden_auf));
SetValueFloat($id_gesamtverbrauch,round($gesamtverbrauch,$runden_auf));

/******************* 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,round($verbrauch_24h,$runden_auf));

// 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,round($verbrauch_monat,$runden_auf));

// 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,round($verbrauch_jahr,$runden_auf));

// 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);
	SetValueFloat(\$id_gesamt_gestern, GetValue (\$id_gesamtverbrauch));
 ?>";

// 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
		}

//Zusätzlich alle 5 min
		$EventName = "5min";
		$EreignisID = @IPS_GetEventIDByName($EventName, $_IPS['SELF']);
		if ($EreignisID === false)
			{
			$eid = IPS_CreateEvent(1);        															// Zyklisches Ereignis
			IPS_SetEventCyclic($eid, 0, 0, 0, 2, 2, 5);   											//Alle 5 min
  			IPS_SetParent($eid, $_IPS['SELF']); 														// Ereignis zuordnen
			IPS_SetName($eid, "5min" );    																// Ereignis umbennen
			IPS_SetEventActive($eid, true);                       								// Ereignis aktivieren
			}

// 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;
	}
?>

Eine kleine Änderung gibt es noch: Da bei mir inzwischen der EM1010 rausgeflogen ist und ich vernünftige Zähler habe war bei mir der Grenzwert nicht mehr nötig. Statt dessen kann man in „$runden_auf“ die Anzahl der Nachkommastellen festlegen.


Kabellabor - Alles automatisch

Hallo wango,

vielen Dank für das aktuelle Skript, werde es in den nächsten Tagen Testen und berichten.

Gruß

kds8

Hallo wango,

ich schon wieder :o.
Habe gestern Dein Skript noch übernommen.
Jetzt bekomme ich beigefügte Fehlermeldung, die meines Erachtens nach nicht damit zutun hat, dass es noch nicht lange genug läuft (Ich bin allerdings PHP Laie) :confused::confused:

Nachdem ich in der Doku, das ist mir allerdings teilweise zu hoch und im Forum gesucht habe, könnte der Fehler z.B. an der ModulesID in line 10 liegen??:confused::confused:

Erfindet ja die Variable #16665 nicht, dies ist ja auch eine Instanz.:confused:

Ich würde mich freuen wenn Du oder jemand anders mir helfen kann, da ich das Monitoring mit IPS noch ausweiten möchte. Der Stromzähler mit S0 ist schon unterwegs.:):slight_smile:

Danke

kds8

EKM Fehler.zip (454 KB)

Moin kds8,

das Skript hängt nur an der falschen Stelle. Du musst das Skript unterhalb der Zählervariablen anlegen. Das scheint bei Dir die Variable Counter zu sein (ID 18574, wenn ich das richtig lese). Lösche einfach die automatisch angelegten Variablen, Timer und das Skript Tagesverbrauch und verschiebe das Skript nach unterhalb der Zählervariable und starte es einmal. Dann 24 h warten und alles sollte funktionieren. Die ModuleID ermittelt nur die ID des ArchiveHandler.

Viel Erfolg

Wango


Kabellabor - Alles automatisch

Hallo wango,
es funktioniert. Vielen Dank für deine Hilfe:):):):):slight_smile:

Vieleicht kanns Du mir in einem Punkt noch helfen?
Dadurch das ich die Variablen jetzt unter dem Counter stehen habe, sehe ich sie nicht mehr in Webfront (ich habe nur Basic). IPSview habe ich schon installiert, da muss ich mich aber erst einarbeiten:(:(.

Kann ich ohne wieder alles neu zu machen die Struktur so ändern, dass die Variablen eine Ebene höher kommen???

Ein schönes WE

kds8

Hallo wango,

hier noch die aktuelle Struktur von meinem vorherigen Beitrag.

kds8

Moin,

kurze Antwort: Verschieben geht nicht.

Ich habe eine selbstgebaute Visualisierung, das Webfront habe ich früher aber auch mal benutzt. Idealerweise arbeitet man da mit einer separaten Struktur und Links. Auf die Schnelle finde ich mit dem Handy nur das dazu Tipps&Tricks zu IP-Symcon: Arbeiten mit Links | Raketenschnecke.net

Da werden die Vorteile ganz gut erklärt.

Ein schönes WE

Wango