1-Wire S0 Zähler Auswerteskript

Hallo 1-Wire Fan´s

nachdem ich bei mir einige digitale Stromzähler mit S0 Ausgang für verschiedene Verbraucher eingebaut habe, wollte ich nicht für jeden Stromzähler und S0 Zähler das Skript und alle Variablen neu anlegen und hab ein automatisches Skript zur Auswertung und Anlegen der Variablen geschrieben. Vielleicht hilft das dem ein oder anderen weiter.
Getestet unter IPS V2.4 und 2.5

Funktion:
Das Skript installiert beim ersten Auslösen Variablen für

  • Tagesverbrauch
  • Max. Tageswert + Zeit des max. Werts
  • Monatsverbrauch
  • Jahresverbrauch
  • Statusausgabe für „Anlage Aktiv“ z.b. für eine PV-Anlage oder Waschmaschine
  • Status für „Jahresgrenzwert erreicht?“ z.b. für eine PV-Anlage oder einen Verbrauchswert

Zusätzlich werden folgende Skripte erstellt:

  • Reset Tageswert, Übertrag auf Variable „Vortag“
  • Reset Monatswert, Übertrag auf Variable „Vormonat“
  • Reset Jahreswert, Übertrag auf Variable „Vorjahr“

Für die Ansteuerung eines 1-Wire LCD Displays habe ich zusätzlich die Ausgaben in String Variablen eingefügt.

Die eingegeben Namen für die 1-Wire S0 Instance sind auszutauschen.

Danke an DerStandart für die Überprüfung des Skripts, hier die aktualisierte Version.

Grüße
Andrge

Sollte ich einen Fehler im Skript übersehen haben bitte um Rückmeldung.

Programmbeispiel_Stromzaehler.zip (46 KB)

Hallo Andrge,

vielen Dank für das Script! Nach so etwas habe ich lange gesucht!

Mir sind ein paar Fehler aufgefallen:

Zeile 482:

$id_vormonat_leistung_string 	= CreateVariableByName($parentID, "Vormat_1", "S" );

muss „Vormonat“ heißen.

Ab Zeile 217, wo das Monats-Script erzeugt wird:

	//Übertrag String und Float
	\$uebertrag = GetValue ($id_monat_leistung  );  										//Monatesleistung abholen
	SetValue ($id_vormonat_leistung  , $uebertrag);
	\$uebertrag_1 = GetValue ($id_monat_leistung_string  );  										//Monatesleistung abholen
	SetValue ($id_vormonat_leistung_string  , $uebertrag_1);
	IPS_Sleep(20);

	//Reset Tagwerte
	SetValueInteger($id_monat_counter  , 0);     											//Monatesleistung auf 0 setzen
	SetValueString ($id_monat_leistung_string  , '0 KWh');
	SetValueFloat  ($id_monat_leistung  , 0);

	//Boolean fuer Rueckmeldung eines Tastersymbols
	SetValueBoolean($reset_monat , true);
	IPS_Sleep(1000);
	SetValueBoolean($reset_monat , false);

dort fehlenden die \ - somit sieht das Monatsscript dann so aus:

	//Übertrag String und Float
	$uebertrag = GetValue (  );  										//Monatesleistung abholen
	SetValue (  , );
	$uebertrag_1 = GetValue (  );  										//Monatesleistung abholen
	SetValue (  , );
	IPS_Sleep(20);

	//Reset Tagwerte
	SetValueInteger(  , 0);     											//Monatesleistung auf 0 setzen
	SetValueString (  , '0 KWh');
	SetValueFloat  (  , 0);

	//Boolean fuer Rueckmeldung eines Tastersymbols
	SetValueBoolean( , true);
	IPS_Sleep(1000);
	SetValueBoolean( , false);

Ab Zeile 217 - 223 also ändern in:

	//Übertrag String und Float
	\$uebertrag = GetValue (\$id_monat_leistung  );  										//Monatesleistung abholen
	SetValue (\$id_vormonat_leistung  , \$uebertrag);
	\$uebertrag_1 = GetValue (\$id_monat_leistung_string  );  										//Monatesleistung abholen
	SetValue (\$id_vormonat_leistung_string  , \$uebertrag_1);
	IPS_Sleep(20);

	//Reset Tagwerte
	SetValueInteger(\$id_monat_counter  , 0);     											//Monatesleistung auf 0 setzen
	SetValueString (\$id_monat_leistung_string  , '0 KWh');
	SetValueFloat  (\$id_monat_leistung  , 0);

	//Boolean fuer Rueckmeldung eines Tastersymbols
	SetValueBoolean(\$reset_monat , true);
	IPS_Sleep(1000);
	SetValueBoolean(\$reset_monat , false);

Und ab 256 das gleiche noch mal für das Jahres-Script.

Wenn ich das alles entsprechend ändere, funktioniert es!

Hab noch mal 1000 Dank für das Script!

Danke und Gruß,
Christoph

Hallo ihr beide

herzliches Danke auch von mir.
Das Scirpt kahm gerade recht, wollte nämlich eben mein eigenes Zählerscript auf Jahres und Monatsabrechnung aufbohren.
Andre hat mir die Arebit abgenommen.

hab die Fehlerkorrigierte Variante angehängt.

thx
bb

Programmbeispiel_Stromzaehler.zip (46.3 KB)

Danke! Asche auf mein Haupt, hab versehentlich nicht die letzte Version kopiert.

Viel Spaß mit dem Skript

Andrge

Was macht den das \ vor dem $uebertrag ?
Sowas findet man immer schlecht im PHP Manual

Das Script erzeugt hier in diesem Fall ja die Scripte für Monat, Tag und Jahr. Damit das erzeugende Script die $ nicht selbst behandelt, sondern sie so wie sie sind in die zu erzeugenden Scripte steckt, werden die $ mit dem \ maskiert. Evtl. mal nach „php maskieren“ mit einer Suchmaschine Deiner Wahl suchen.

Gruß,
Christoph

Hallo Leute

Dank dem Skript das Andreas uns da für zur Verfügung gestellt hat, habe ich nun endlich einen Überblick über meine kleine PV Anlage.:slight_smile:

Danke noch mal Andreas für die Mühe.

Gruss Michael

orbitalo

Servus orbitalo

Den link zu deinem Live-System würd ich rausnehmen. Böse Zeitgenossen könnten da ggfls. etwas Unfug treiben…

gruß
bb

Hi,
erstmal danke für das super Script, hat mir ein Menge Arbeit erspart.

Ich habe noch eine kleine Ergänzung beizusteuern.
Mir fehlte noch der aktuelle Zählerstand (mit eingerechnetem Anfangsstand).
Ich habe einfach folgendes ergänzt:

Bei der Variablendeklaration:

	//******************************************************************************
	//Anfangsstand des Zählers
	//******************************************************************************
	//sollte der Zähler bereits einen Anfangsstand gehabt haben kann dieser hier eingetragen werden
	$anfangsstand =  10000		; // Anfangsstand in kwH

und das später im Code (nachdem die Variablen angelegt wurden, ich habe das vor der Berechnung: Aktuelle Leistung / aktueller Verbrauch gemacht)

//*******************************************************************
// aktueller Stand des Zähler

$id_zaehlerstand 	= CreateVariableByName($parentID, "Zählerstand", "kWh" );
SetValueFloat ($id_zaehlerstand 	,	($anfangsstand + $counter_neu * $zaehlerfaktor));

Gruß
spooniester

Hallo spooniester

klasse und danke für die Blumen. Stell doch dein gesamtes Skript ein.

Ciao
andrge

Wollte mal Fragen ob das s0-zaehler-auswerteskript auch für IPS 2.6 geht denn ich bekomme den einen oder anderen Fehler

Hallo Jimmi,

welchen „ein“ oder „anderen“ Fehler bekommst du den?

Sollte auch unter 2.6 laufen.

Grüße
andrge

So das ist erst mal mein kompl. Baum bei Ereignis ist leider auch keins Abgelegt ?

Das sind meine Fehler !!!

Habe mal mein S0 Skript mit eingefügt vielleicht siehst du ja den Fehler

<?
/******************************************************************************
Stromzaehlerauswertung für IPS und 1-Wire S0 Counter von eservice-online
Erstellt von andrge für eservice-online (http://www.eservice-online.de)

 Version 1.3
 Datum: 12.04.2012
 Skript fuer IPS Version bis V2.4 und 2.5
*******************************************************************************

//Auswerteskript für digitale Stromzähler mit S0 Impulsausgang und einem 1-Wire S0 Counter Modul
Es werden zusaetzlich String Variablen fuer die Ausgabe z.B. per 1-Wire LCD Modul angelegt

Das Skript erstellt folgende Variablen, Skripte und errechnet Energeiwerte

Auswertung Energeiwerte aus gelesenen Zaehlerwert fuer:
- Aktuelle Leistung
- Tageswerte (Float und String)
- Maimaler Tageswert mit Zeitstempel
- Monatswerte (Float und String)
- Jahreswerte (Float und String)
- Jahresgrenzwert (Wurde ein bestimmter Jahresertag erreicht, z.B. PV-Analge mit KWh pro montierten kWp)
- Anlage aktive (PV-Anlage aktiv? Leistung größer z.B. 50W, fuer z.B. PV-Anlage)

Skripte und Triggerbedingung fuer:
- Triggerzeit fuer Zaehlerbaustein
- Triggerbedingung fuer Auswerteskript
- Skript fuer Uebertrag und Reset Tageswerte + Reset Max. Wert
- Skript fuer Uebertrag und Reset Monatswerte
- Skript fuer Uebertrag und Reset Jahreswerte

Alle benoetigten Variablen, Skripte und Triggerbedingungen werden automatisch in IPS-Symcon durch einmaliges "Ausfuehren" angelegt.
Sollte eine Variable geloescht werden, wird eine neue Variable mit dem naechsten Skriptdurchlauf angelegt.
*******************************************************************************/


/*
//Installation:
	Konfiguration fuer Stromzaehler, 1-Wire S0 Counter, Jahresgrenzwert und Grenzwert "Akiv" einstellen

	Weiterhin sind nachfolgende Schritte von Hand ausführen:

	Schritt 1:
	Kategorie für die 1-Wire S0 Stromauswertung anlegen. Name nach eigenen Wünschen

	Schritt 2:
	Ein neues Skript unterhalb der Kategorie (aus Schritt 1) erstellen.
	Name nach eigenen Wünschen

	Schritt 3:
	Eine Instanz für den DS2413 unterhalb dieser Kategorie (aus Schritt 1) anlegen.
	Hier den Namen der S0 Zaehler Instance eintragen:

	Name des 1-Wire Zaehlers:           														*/
	$zaehler_name = "S0 Zähler Haushaltstrom"; 	//Default = S0 Zähler

	/*Schritt 4:
	Name des auszuwertenden Zaehlervariable eintragen. Wenn Sie den Namen nicht veraendert haben,
	tragen Sie hier die Defaultnamen der Zaehlervariable ein    						*/
	$zaehler_variable = "Zähler 2"   ; 	//	Default: Zähler 1 oder Zähler 2

	/*Schritt 5:
	Konfiguration für Stromzaehler, des Auswertezyklus und Schwellwerte für Statusausgaben:

	//Hier den passenden Impulswert des Stromzaehlers auswaehlen (die Zeichen // an der richtigen Stelle entfernen)
	//******************************************************************************
	Auswahl des Stromzählers (Impulse pro KW)
	Auswertung von Stromzaehlern mit 800, 1000 oder 2000 Impulse moeglich   		*/
	$zaehler_impulse =  	800;

	//******************************************************************************
	//Auswahl des Zaehlerausgangs des 1-Wire S0 Counters
	//Verwendeten Zaehler des 1-Wire Bausteins auswaehlen
	//******************************************************************************
	//Es kann die ID des Zaehlers automatisch ermittelt oder manual eingegeben werden.
	//Soll die ID automatisch ermittelt werden, muß der Zähler unterhalb der angelegten Kategorie sein.
	$ID_counter_erkennung = 2;   								//Automatisch = 1, Manuel = 2

		//Wenn Manuell, hier die ID der Zaehler Instance eintragen:
		$ds2423_counter_man = 38005 /*[Erdgeschoss\HWR\Stromzähler Hausstrom\0 Zähler Haushaltstrom\Zähler 2]*/  ;

	//******************************************************************************
	//Abfragezyklus des 1-Wire S0 Zaehlers
	//******************************************************************************
	// Wie oft soll der 1-Wire S0 Counter abgefragt werden?
	// Bei sehr geringen Leistungen und Zaehlern mit wenigen Impulsen macht es Sinn auf die 180 Sek. zu gehen
	$pollzeit = 180	; 											//Default 180 Sekunden. Zulaessig sind 60, 120 oder 180 Sekunden

	//******************************************************************************
	//Jahresgrenzwert (z.B. fuer PV-Anlage)
	//******************************************************************************
	//Grenzwert als Aussage "Jahresgrenzwert erreicht?".
	//Beispiel: Wurde der kalkulierte Jahresertrag einer PV-Anlage erreicht
	$grenzwert_jahr = 950		;        					//Default: PV-Anlage 950 KW pro montierten Leistung KWp fuer Suedbayern

	//******************************************************************************
	//Grenzwert "Anlage Aktiv"
	//******************************************************************************
	//Grenzwert für Aussage "Aktiv", z.b. um den Berieb eines Wechselrichters zu erkennen
	$grenzwert_aktiv = 0.05		;        					//Default 0.05KW = 50W


/*	Schritt 6:
	Skript 1x per "Ausführen" starten

	FERTIG !!!!!!!!

	Ab jetzt wird das Skript bei einer Änderung der ausgewaehlten Zaehlervariablen getriggert.

	Viel Spaß mit diesem Beispielskript. Keine Gewaehr fur Fehlerfreiheit und Richtigkeit
	Gerne duefen Sie uns Verbesserungen oder Kritik (gern auch positiv) senden.
	Mail: info@eservice-online.de

*******************************************************************************/

//******************************************************************************
//Debug Ausgaben
//Fuer Testzwecke koennen Testausgaben aktiviert werden
//******************************************************************************
$debug =false;   										// Debug Modus fuer Variablen ID usw.,    Ausgabe = true / keine Ausgabe =false
$debug_auswertung = false;   							// Debug Modus fuer Berechung,            Ausgabe = true / keine Ausgabe =false


/********************************************************************************************************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   Ab hier nichts mehr ändern   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
********************************************************************************************************/

// Übergeordnete Kategorie ermitteln
$parentID = IPS_GetObject($IPS_SELF);
$parentID = $parentID['ParentID'];
if($debug) {echo "ParentID:  $parentID 
";}

//automatische oder manuelles Einlesen der Counter ID
If ($ID_counter_erkennung == 1) {
   // Automatisches einlesen der Counter ID
   $ds2423 = IPS_GetInstanceIDByName ( $zaehler_name, $parentID );
	if($debug) {echo "ID DS2423:  $ds2423 
";}   												//Debug Ausgabe
	}
elseif ($ID_counter_erkennung == 2) {
	//Manuelle ID von oben abholen
	$ds2423 = $ds2423_counter_man;
	if($debug) {echo "ds2423counter_man: $ds2423 
";}											//Debug Ausgabe
	}
Else {echo "Fehler: Auswahl des Zaehlers Auto / Manuel, Es ist nur 1 oder 2 zulaessig  
";}

// Variablen zur Skriptverarbeitung einlesen und intern verfügbar machen
$ds2423counter = 	IPS_GetVariableIDByName( $zaehler_variable, $ds2423);
if($debug) {echo "ds2423counter: $ds2423counter 
";}											//Debug Ausgabe


// Inhalt des benötigten Actionsskripts in Variable ablegen
$actionScript = "<?
if(\$IPS_SENDER == 'WebFront') {
  	SetValue(\$IPS_VARIABLE, \$IPS_VALUE);
}
//";


// Inhalt für Skript "Reset Tag" erzeugen
//********************************************
$skript_reset_tag = "<?
//Übertrag auf Vortag und Reset der Tageswerte
//Übergeordnete Kategorie ermitteln
	\$parentID = IPS_GetObject(\$IPS_SELF);
	\$parentID = \$parentID['ParentID'];

	\$id_tag_leistung 					= @IPS_GetVariableIDByName('Tag', \$parentID);
	\$id_tag_leistung_string 		= @IPS_GetVariableIDByName('Tag_1', \$parentID);
	\$id_max_leistung          		= @IPS_GetVariableIDByName('Maximal_Tag', \$parentID);
	\$id_max_leistung_string   		= @IPS_GetVariableIDByName('Maximal_Tag_1', \$parentID);
	\$id_max_leistung_time_string  = @IPS_GetVariableIDByName('Maximal Tag Zeit', \$parentID);
	\$id_vortag_leistung 				= @IPS_GetVariableIDByName('Vortag', \$parentID);
	\$id_vortag_leistung_string 	= @IPS_GetVariableIDByName('Vortag_1', \$parentID);
	\$id_tag_counter 					= @IPS_GetVariableIDByName('counter_tag', \$parentID);
	\$reset_tag 							= @IPS_GetVariableIDByName('Reset Tag', \$parentID);

	//Übertrag String und Float
	\$uebertrag_1 = GetValue (\$id_tag_leistung_string  );  												//Tagesleistung abholen
 	SetValue (\$id_vortag_leistung_string  , \$uebertrag_1);
 	\$uebertrag = GetValue (\$id_tag_leistung  );              //Tagesleistung abholen
	SetValue (\$id_vortag_leistung  , \$uebertrag);
	IPS_Sleep(20);

	//Reset Tagwerte
	SetValueInteger(\$id_tag_counter  , 0);     													//Tagesleistung auf 0 setzen
	SetValueString (\$id_tag_leistung_string  , '0 KWh');
	SetValueFloat  (\$id_tag_leistung  , 0);
	SetValueFloat  (\$id_max_leistung , 0);                                          //Maximalwert zurueck setzen
	SetValueString (\$id_max_leistung_string  , '0');                                //Maximalwert zurueck setzen
	SetValueString (\$id_max_leistung_time_string  , '-');                           //Zeit Maximalwert zurueck setzen

	//Boolean fuer Rueckmeldung eines Tastersymbols

	if (\$IPS_SENDER != 'Designer')
		{
  		Echo 'Reset durchgeführt';
		}
	?>";

// Inhalt für Skript "Reset Monat" erzeugen
//********************************************
$skript_reset_monat = "<?
//Übertrag auf Vormonat und Reset der Monateswerte
//Übergeordnete Kategorie ermitteln
	\$parentID = IPS_GetObject(\$IPS_SELF);
	\$parentID = \$parentID['ParentID'];

 	\$id_monat_leistung 				= @IPS_GetVariableIDByName('Monat', $parentID);
	\$id_monat_leistung_string 		= @IPS_GetVariableIDByName('Monat_1', $parentID);
	\$id_vormonat_leistung 			= @IPS_GetVariableIDByName('Vormonat', $parentID);
	\$id_vormonat_leistung_string	= @IPS_GetVariableIDByName('Vormonat_1', $parentID);
	\$id_monat_counter 				= @IPS_GetVariableIDByName('counter_monat', $parentID);
	\$reset_monat 						= @IPS_GetVariableIDByName('Reset Monat', $parentID);

	//Übertrag String und Float
	\$uebertrag = GetValue (\$id_monat_leistung  );  										//Monatesleistung abholen
	SetValue \(\$id_vormonat_leistung  , \$uebertrag);
	\$uebertrag_1 = GetValue (\$id_monat_leistung_string  );  										//Monatesleistung abholen
	SetValue (\$id_vormonat_leistung_string  , \$uebertrag_1);
	IPS_Sleep(20);

	//Reset Tagwerte
	SetValueInteger(\$id_monat_counter  , 0);     											//Monatesleistung auf 0 setzen
	SetValueString (\$id_monat_leistung_string  , '0 KWh');
	SetValueFloat  (\$id_monat_leistung  , 0);

	//Boolean fuer Rueckmeldung eines Tastersymbols
	SetValueBoolean(\$reset_monat , true);
	IPS_Sleep(1000);
	SetValueBoolean(\$reset_monat , false);

	if (\$IPS_SENDER != 'Designer')
		{
  		Echo 'Reset durchgeführt';
		}
	?>";


// Inhalt für Skript "Reset Jahr" erzeugen
//********************************************
$skript_reset_jahr = "<?
//Übertrag auf Vormonat und Reset der Jahreswerte
//Übergeordnete Kategorie ermitteln
	\$parentID = IPS_GetObject(\$IPS_SELF);
	\$parentID = \$parentID['ParentID'];

	\$id_jahr_leistung 				= @IPS_GetVariableIDByName('Jahr', $parentID);
	\$id_jahr_leistung_string 		= @IPS_GetVariableIDByName('Jahr_1', $parentID);
	\$id_vorjahr_leistung 			= @IPS_GetVariableIDByName('Vorjahr', $parentID);
	\$id_vorjahr_leistung_string 	= @IPS_GetVariableIDByName('Vorjahr_1', $parentID);
	\$id_jahr_counter 				= @IPS_GetVariableIDByName('counter_jahr', $parentID);
	\$reset_jahr 						= @IPS_GetVariableIDByName('Reset Jahr', $parentID);

	//Übertrag String und Float
	\$uebertrag = GetValue (\$id_jahr_leistung  );  										//Jahresleistung abholen
	SetValue (\$id_vorjahr_leistung  , \$uebertrag);
	\$uebertrag_1 = GetValue (\$id_jahr_leistung_string  );  										//Jahresleistung abholen
	SetValue (\$id_vorjahr_leistung_string  , \$uebertrag_1);
	IPS_Sleep(20);

	//Reset Tagwerte
	SetValueInteger(\$id_jahr_counter  , 0);     											//Jahresleistung auf 0 setzen
	SetValueString (\$id_jahr_leistung_string  , '0 KWh');
	SetValueFloat  (\$id_jahr_leistung  , 0);

	//Boolean fuer Rueckmeldung eines Tastersymbols
	SetValueBoolean\(\$reset_jahr , true);
	IPS_Sleep(1000);
	SetValueBoolean(\$reset_jahr , false);

	if (\$IPS_SENDER != 'Designer')
		{
  		Echo 'Reset durchgeführt';
 		}
	?>";




// ***************** Start Erstinitialisierung *********************************
if($IPS_SENDER == "Execute")
	{                																						// nur wenn bei "Ausführen"

	// Skript verstecken
   IPS_SetHidden($IPS_SELF, true);
   IPS_SetPosition($IPS_SELF, 99);

	//Reset Tag
	//***************************************************************************
	// Skript "Reset Tag" erzeugen (siehe function)
   $scriptid_reset_tag = CreateScriptByName("Reset Tag", $parentID, $skript_reset_tag);
		if($debug) { echo "Skript -Reset Tag- angelegt
"; }									//Debug Ausgabe

	// Triggerbedingung/Ereignis für Skript "Reset Tag" erstellen falls nicht vorhanden
	//*****************************************************************
	$EreignisID = @IPS_GetEventIDByName( "Reset Tag" , $scriptid_reset_tag);
		if ($EreignisID == 0){
		$eid = IPS_CreateEvent(1);        															// Ausgelöstes Ereignis
		IPS_SetEventCyclic($eid, 2, 1, 0, 0, 0, 0);   											//Taeglich
		IPS_SetEventCyclicTimeBounds($eid, mktime(00, 00, 02), 0);            			//immer um 00:00:01Uhr
		IPS_SetParent($eid, $scriptid_reset_tag); 												// Ereignis zuordnen
		IPS_SetName($eid, "Reset Tag" );    														// Ereignis umbennen
		IPS_SetEventActive($eid, true);                       								// Ereignis aktivieren
		}

	//Reset Monat
	//***************************************************************************
	// Skript "Reset Moant" erzeugen (siehe function)
   $scriptid_reset_monat = CreateScriptByName("Reset Monat", $parentID, $skript_reset_monat);
   	if($debug) { echo "Skript -Reset Monat- angelegt
"; }								//Debug Ausgabe

	// Triggerbedingung/Ereignis für Skript "Reset Tag" erstellen falls nicht vorhanden
	//*****************************************************************
	$EreignisID = @IPS_GetEventIDByName( "Reset Monat" , $scriptid_reset_monat);
		if ($EreignisID == 0){
		$eid = IPS_CreateEvent(1);        															// Ausgelöstes Ereignis
		IPS_SetEventCyclic($eid, 4, 1, 0, 1, 0, 0);   											// Monatlich
		IPS_SetEventCyclicTimeBounds($eid, mktime(00, 00, 02), 0);            			// immer um 00:00:01Uhr
		IPS_SetParent($eid, $scriptid_reset_monat); 												// Ereignis zuordnen
		IPS_SetName($eid, "Reset Monat" );    														// Ereignis umbennen
		IPS_SetEventActive($eid, true);                       								// Ereignis aktivieren
		}

	//Reset Jahr
	//***************************************************************************
	// Skript "Reset Moant" erzeugen (siehe function)
   $scriptid_reset_jahr = CreateScriptByName("Reset Jahr", $parentID, $skript_reset_jahr);
		if($debug) { echo "Skript -Reset Jahr- angelegt
"; }									//Debug Ausgabe

	// Triggerbedingung/Ereignis für Skript "Reset Tag" erstellen falls nicht vorhanden
	//*****************************************************************
	$EreignisID = @IPS_GetEventIDByName( "Reset Jahr" , $scriptid_reset_jahr);
		if ($EreignisID == 0){
		$eid = IPS_CreateEvent(1);        															// Ausgelöstes Ereignis
		IPS_SetEventCyclic($eid, 5, 1, 0, 1, 0, 0);   											// Jaehrlich
		IPS_SetEventCyclicTimeBounds($eid, mktime(00, 00, 02), 0);            			// immer um 00:00:01Uhr
		IPS_SetParent($eid, $scriptid_reset_jahr); 												// Ereignis zuordnen
		IPS_SetName($eid, "Reset Jahr" );    														// Ereignis umbennen
		IPS_SetEventActive($eid, true);                       								// Ereignis aktivieren
		}

	//Triggerintervall für Baustein einstellen
	//*****************************************************************
	TMEX_SetInterval($ds2423, $pollzeit);
		if($debug) {echo "DS2423 Triggerintervall programmiert
";}							//Debug Ausgabe

	//Triggerbedingung fuer dieses Skript erzeugen
	//***************************************************************************
	// Triggerbedingung/Ereignis für Skript erstellen falls nicht vorhanden
	// Ereignis für Skript erstellen falls nicht vorhanden
	$EreignisID = @IPS_GetEventIDByName($zaehler_variable,$IPS_SELF);
	if ($EreignisID == 0) {
		$eid = IPS_CreateEvent(0);        															// Ausgelöstes Ereignis
		IPS_SetEventTrigger($eid, 0, $ds2423counter); 											// Bei Änderung von Variable
		IPS_SetParent($eid, $IPS_SELF); 																// Ereignis zuordnen
		IPS_SetName($eid, $zaehler_variable);    													// Ereignis umbennen
		IPS_SetEventActive($eid, true);                       								// Ereignis aktivieren
	}
	else {
	if($debug) {echo "Ereignis bereits erstellt"; }
	}


}
// ****************** Ende Erstinitialisierung *********************************


//Berechnung
//******************************************************************************
//Variablen
//******************************************
// Variablen IDs zuweisen und gegebenenfalls anlegen
$id_counter_alt	= CreateVariableByName($parentID, "counter_alt", "I"  );
$id_counter_delta	= CreateVariableByName($parentID, "counter_delta", "I"  );

//Zählerwerte abholen
$counter_neu 		= GetValueInteger ($ds2423counter );
$counter_alt 		= GetValueInteger ($id_counter_alt );

//Delta berechnen
$delta = $counter_neu - $counter_alt;   															//alter Wert von neuen Wert abziehen

SetValueInteger($id_counter_alt  , $counter_neu );   											//Zaehlerwert ablegen
SetValueInteger($id_counter_delta  , $delta );          										//Ausgabe Differenz
	if($debug) {echo  "Counter: $counter_neu 
Delta: $delta
";}						// Debug Ausgabe Berechung


//*******************************************************************
// Akueller Wert:

If ($zaehler_impulse == 800){$zaehlerfaktor = 0.00125;} 										//Digitaler Stomzähler 1000W / Impulse  (800) = 1,25W pro Impuls
elseif ($zaehler_impulse == 1000){$zaehlerfaktor = 0.001;}									//Digitaler Stomzähler 1000W / Impulse (1000) = 1W pro Impulse
elseif ($zaehler_impulse == 2000){$zaehlerfaktor = 0.0005;}									//Digitaler Stomzähler 1000W / Impulse (2000) = 0,5W pro Impuls
else {echo "Falscher Zaehler Impulswert eingegeben, nur 800, 1000 und 2000 möglich!
\r";}
if($debug) {echo  "Zaehler Impulse pro KW: $zaehler_impulse 
";}

If ($pollzeit == 60){$Umrechungsfaktor = 60;} 													//Umrechnungsfaktor = Stunde (Minuten / Auslesezeit (Min.)
elseif ($pollzeit == 120){$Umrechungsfaktor = 30;}
elseif ($pollzeit == 180){$Umrechungsfaktor = 20; }
else {echo "Falscher Auslesezykluszeit eingegeben, nur 60, 120 oder 180 Sekunden möglich!
\r";}
if($debug) {echo  " Auslesezeit:  $pollzeit 
";}

$deltaKWh = ($delta * $zaehlerfaktor) * $Umrechungsfaktor  ;

//Aktuelle Leistung / aktueller Verbrauch
//*******************************************************************

$id_aktuell_leistung 			= CreateVariableByName($parentID, "Aktuell", "kWh" );
$id_aktuell_leistung_string 	= CreateVariableByName($parentID, "Aktuell_1", "S" );
$id_max_leistung 					= CreateVariableByName($parentID, "Maximal_Tag", "kWh" );
$id_max_leistung_string       = CreateVariableByName($parentID, "Maximal_Tag_1", "S" );
$id_max_leistung_time_string  = CreateVariableByName($parentID, "Maximal Tag Zeit", "S" );

//Anzeige Verbrauch aktuell
SetValueFloat ($id_aktuell_leistung    , $deltaKWh);

//Ausgabe fuer String vorbereiten
//Ausgabe fuer Watt
$round_aktuell_summe_1 = round ($deltaKWh * 1000, 2);     							// auf 2 Stellen runden
$round_aktuell_summe_2 = sprintf("%2.0f", $round_aktuell_summe_1); 				// Formatierung 2vor und 0 Nachkommastellen

//Ausgabe fuer KW
$round_aktuell_summe_3 = round ($deltaKWh, 2);     									// auf 0 Stellen runden
$round_aktuell_summe_4 = sprintf("%2.2f", $round_aktuell_summe_3); 				// Formatierung auf 2vor und 2 Nachkommastellen

//Maximalwert Tag + Zeit:
$leistung_max = GetValueFloat ($id_max_leistung);

If ($deltaKWh >= $leistung_max)
	{
	SetValueFloat ($id_max_leistung    , $deltaKWh);
	SetValueString ($id_max_leistung_string , $round_aktuell_summe_4. " kWh " );
	SetValueString ($id_max_leistung_time_string , date("H:i")); 							//aktuelle Uhrzeit, Stunde und Minuten
		if($debug_auswertung) {Echo "Max. Leistung Neu: $round_aktuell_summe_4 kWh 
"; }// Debug Ausgabe Berechung
	}

//Anzeige für Dashboard und LCD Display
if ($deltaKWh < 1.0) 																				//Wenn die aktuelle Leistung kleiner als 1KW, dann Ausgabe in Watt
   {
   SetValueString ($id_aktuell_leistung_string , $round_aktuell_summe_2. " Wh" );
		if($debug_auswertung) {Echo "Aktuelle Leistung: $round_aktuell_summe_2 W 
"; }// Debug Ausgabe Berechung
	}
else
	{
   SetValueString ($id_aktuell_leistung_string , $round_aktuell_summe_4. " kWh ");
		if($debug_auswertung) {Echo "Aktuelle Leistung: $round_aktuell_summe_4 KW 
"; }// Debug Ausgabe Berechung
	}


//Tageswerte
//*******************************************************************
$id_tag_leistung 				= CreateVariableByName($parentID, "Tag", "kWh" );
$id_tag_leistung_string 	= CreateVariableByName($parentID, "Tag_1", "S" );
$id_vortag_leistung 			= CreateVariableByName($parentID, "Vortag", "kWh" );
$id_vortag_leistung_string = CreateVariableByName($parentID, "Vortag_1", "S" );
$reset_tag 						= CreateVariableByName($parentID, "Reset Tag", "an" );
$id_tag_counter 				= CreateVariableByName($parentID, "counter_tag", "I" );

$counter_tag = GetValueInteger ($id_tag_counter );
$counter_tag_neu = $counter_tag + $delta ;
SetValueInteger($id_tag_counter  , $counter_tag_neu);

	//Anzeige Tagsverbrauch
	$tag_leistung_summe = $counter_tag_neu * $zaehlerfaktor ;
	SetValueFloat ($id_tag_leistung , $tag_leistung_summe);

	//Anzeige für LCD Display
	$round_tag_summe_1 = round ($tag_leistung_summe, 2);     								// auf 2 Stellen runden
	$round_tag_summe_2 = sprintf("%2.2f", $round_tag_summe_1); 								// Formatierung 2 vor und 2 Nachkommastellen
   SetValueString ($id_tag_leistung_string , $round_tag_summe_2. " kWh");
		if($debug_auswertung) {Echo "Tag Summe: $round_tag_summe_2 kWh
"; }        // Debug Ausgabe Berechung


//Monatswerte
//*******************************************************************
// Variablen IDs zuweisen und gegebenenfalls anlegen
$id_monat_leistung 				= CreateVariableByName($parentID, "Monat", "kWh" );
$id_monat_leistung_string 		= CreateVariableByName($parentID, "Monat_1", "S" );
$id_vormonat_leistung 			= CreateVariableByName($parentID, "Vormonat", "kWh" );
$id_vormonat_leistung_string 	= CreateVariableByName($parentID, "Vormonat_1", "S" );
$reset_monat 						= CreateVariableByName($parentID, "Reset Monat", "an" );
$id_monat_counter 				= CreateVariableByName($parentID, "counter_monat", "I"  );

$counter_monat = GetValueInteger ($id_monat_counter);
$counter_monat_neu = $counter_monat + $delta ;
SetValueInteger($id_monat_counter  , $counter_monat_neu);  //

	//Anzeige Monatsverbrauch
	$monat_leistung_summe = $counter_monat_neu * $zaehlerfaktor ;
	SetValueFloat ($id_monat_leistung    , $monat_leistung_summe);

	//Anzeige für LCD Display
	$round_monat_summe_1 = round ($monat_leistung_summe, 2);     							// auf 2 Stellen runden
	$round_monat_summe_2 = sprintf("%2.2f", $round_monat_summe_1); 						// Formatierung auf 2 vor und 2 Nachkommastellen
   SetValueString ($id_monat_leistung_string   , $round_monat_summe_2. " kWh");     //
		if($debug_auswertung) {Echo "Monat Summe: $round_monat_summe_2 kWh
"; }		// Debug Ausgabe Berechung

//Jahreswerte
//*******************************************************************
$id_jahr_leistung 			= CreateVariableByName($parentID, "Jahr", "kWh" );
$id_jahr_leistung_string 	= CreateVariableByName($parentID, "Jahr_1", "S" );
$id_vorjahr_leistung 		= CreateVariableByName($parentID, "Vorjahr", "kWh" );
$reset_jahr 					= CreateVariableByName($parentID, "Reset Jahr", "an" );
$id_vorjahr_leistung_string 	= CreateVariableByName($parentID, "Vorjahr_1", "S" );
$id_jahr_counter 				= CreateVariableByName($parentID, "counter_jahr", "I" );

$counter_jahr = GetValueInteger ($id_jahr_counter);
$counter_jahr_neu = $counter_jahr + $delta ;
SetValueInteger($id_jahr_counter  , $counter_jahr_neu);  //

	//Anzeige jahrsverbrauch
	$jahr_leistung_summe = $counter_jahr_neu * $zaehlerfaktor ;
	SetValueFloat ($id_jahr_leistung  , $jahr_leistung_summe);

	//Anzeige für LCD Display
	$round_jahr_summe_1 = round ($jahr_leistung_summe, 2);     								// auf 2 Stellen runden
	$round_jahr_summe_2 = sprintf("%2.2f", $round_jahr_summe_1); 							// Formatierung auf 2vor und 2 Nachkommastellen
   SetValueString ($id_jahr_leistung_string   , $round_jahr_summe_2. " KWh");       // Ausgabe in Variable
		if($debug_auswertung) {Echo "Jahr Summe: $round_jahr_summe_2 KWh
"; }      // Debug Ausgabe Berechung

//Jahresgrenzwert erreicht?
//*******************************************************************
// Variablen IDs zuweisen und gegebenenfalls anlegen
$status_jahresgrenzwert 	= CreateVariableByName($parentID, "Jahresgrenzwert", "an" );
if ($deltaKWh >= $grenzwert_jahr)  																	//Hat die Anlage den Jahresmindestwert erreicht?
	{
   SetValueBoolean($status_jahresgrenzwert  ,true);
   	if($debug_auswertung) {echo "Grenzwert Jahr ($grenzwert_jahr kWh) erreicht 
";}// Debug Ausgabe Berechung
   }
else
	{
   SetValueBoolean($status_jahresgrenzwert   ,false);
   	if($debug_auswertung) {echo "Grenzwert Jahr ($grenzwert_jahr kWh) nicht erreicht 
";}// Debug Ausgabe Berechung
   }

//Anlage in Betrieb?
//*******************************************************************
// Variablen IDs zuweisen und gegebenenfalls anlegen
$status_anlage 	= CreateVariableByName($parentID, "Anlage aktiv", "an" );
if ($deltaKWh >= $grenzwert_aktiv)  																//Anlage aktiv?
	{
   SetValueBoolean($status_anlage   ,true);
   if($debug_auswertung) {echo "Anlage in Betrieb, Leistung groesser $grenzwert_aktiv kW  
";}// Debug Ausgabe Berechung
   }
else
	{
   SetValueBoolean($status_anlage   ,false);
   if($debug_auswertung) {echo "Anlage aus, Leistung kleiner $grenzwert_aktiv kW  
";}// Debug Ausgabe Berechung
   }

// Ende Berechnung
// ****************************************************************************


// ****************************************************************************
// Funktionen
// ****************************************************************************
// Variablen erstellen falls nicht vorhanden und ID entsprechend zuordnen
function CreateVariableByName($id, $name, $type) {
	global $IPS_SELF;
	global $ScriptID;
	$vid = @IPS_GetVariableIDByName($name, $id);
	if($vid === false) {
		// $vartype: Boolean=0, Integer=1, Float=2, String=3
		if ($type == 'kWh')   			$vartype = 2;
		if ($type == 'W')  				$vartype = 2;
		if ($type == 'I') 				$vartype = 1;
		if ($type == 'S') 				$vartype = 3;
		if ($type == 'OK') 				$vartype = 0;

		$vid = IPS_CreateVariable($vartype);
		IPS_SetParent($vid, $id);
		IPS_SetName($vid, $name);
		IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");

		if ($type == 'kWh')	{
			IPS_SetVariableCustomProfile ($vid, "~Electricity");
			IPS_SetPosition($vid, 10); }
		if ($type == 'W')	{
			IPS_SetVariableCustomProfile ($vid, "~Watt.3600");
			IPS_SetPosition($vid, 20); }
		if ($type == 'I')	{
			//IPS_SetVariableCustomProfile ($vid, " ");
			IPS_SetPosition($vid, 30);  }
		if ($type == 'OK') {
			IPS_SetVariableCustomProfile ($vid, "~Alert.Reversed");
			IPS_SetVariableCustomAction($vid, $ScriptID);
			IPS_SetPosition($vid, 40);  }
      if ($type == 'an') {
			IPS_SetVariableCustomProfile ($vid, "~Switch");
			IPS_SetVariableCustomAction($vid, $ScriptID);
			IPS_SetPosition($vid, 50);  }
  		if ($type == 'S')	{
			//IPS_SetVariableCustomProfile ($vid, " ");
			IPS_SetPosition($vid, 60);  }
		}
		return $vid;
	}
// Eine Function 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";     												//Skriptdatei
		IPS_SetScriptFile($ScriptID, $ScriptPath);
		IPS_SetHidden($ScriptID, true);
		IPS_SetPosition($ScriptID, 80);
		//if($debug) { echo "Die Skript-ID lautet: . $ScriptID
"; } 					//Debug Ausgabe

		}
	return $ScriptID;
	}

?>

Habe das Problem hinbekommen :wink:

Jimmyrakete

Habe das Problem hinbekommen 

Wenn ich das immer lese:mad:

Ja wie hast Du es denn hinbekommen? Vlt. haben andere auch diese Problem.

Ich nehme an, Jimmi hat gemerkt, dass der S0 Zählername nicht mit dem Skript übereinstimmt hat „S0 Zähler Haushaltstrom“. Sehe ich das richtig, Jimmi

Grüße
Andrge

Wenn Manuell, hier die ID der Zaehler Instance eintragen:
$ds2423_counter_man = 38005 /*

Das Problem bei mir war, ich hatte die ID der Variable hier eingetragen und nicht der Instance

das war alles :slight_smile:

Mein S0 Auswerteskript läuft nun seit gestern Mittag aber leider hat das mit den Monatsübertragung nicht geklappt bekomme auch ein Fehler im Skript

hat jemand eine Idee was ich falsch gemacht habe ??

Zeile 16, das \ gehört da nicht hin.

Benutz bitte für Scripts die PHP Tags und kein Image!

Vielen Dank Rainer jetzt klappt es