Anbindung SO-Counter mit dementsprechendem Skript

Hallo liebes Forum,
bin schon längere Zeit mit der Software IPS-Symcon beschäftigt und habe auch schon einiges selber auf die Beine gestellt doch jetzt bin ich schon geraume Zeit damit beschäftigt das Skript von steiner oder auch von Andrge für den SO-Counter zu setzen,doch ich komme mit den variablen nicht klar.Ich weiß nicht wie ich diese setzen soll und es wäre super,wenn mir jemand das erklären könnte bzw.ein Bildchen der gesetzten variablen posten könnte.Empfang ist gegeben und zählen tut dieser auch nur die Umsetzung des Skripts will einfach nicht funktionieren.
Danke schon mal in vorraus!

Mfg
Marco

Hallo Marco,

kann Dir mein Skript das auf andrge´s basiert gerne nochmal posten. Einzige Änderung im Skript ist das ich nicht in eine String-Variable wandle sondern die Werte in Variablen mit Profil schreibe.

Als Anlage die benötigten Variablen, es sind alle manuell anzulegen bis auf die „Zähler 1“ das ist die Instanzvariable des Counters, kann bei Dir natürlich auch Zähler 2 sein, entsprechend deiner Beschaltung des Counters.

Hier nun das angepasste Skript:

<?
//Stromverbrauch
//Digitaler Stomzähler 800 Impulse = 1KW
$Zaehlerfaktor = 0.00125 ; //Digitaler Stomzähler 800 Impulse = 1KW, kleinste Einheit = 1,25W
$Auslesefaktor = 30;       // 1min = 60, 2min = 30, 5min = 12, 10min = 6
//Aktuelle Leistung
//**********************************************************************
$counter_neu = GetValueInteger(37358 /*[Keller\Serverraum\Zähler Hausstrom / Gas\Zähler 1]*/);     // aktueller Zaehlerstand (Zähler 1) einlesen
$counter_alt = GetValueInteger(17074 /*[Keller\Serverraum\Zähler Hausstrom / Gas\Zähler 1 Zwischen]*/);  //alten Zählerwert auslesen
$delta = $counter_neu - $counter_alt;     //alter Wert von neuen Wert abziehen
SetValueInteger(17074 /*[Keller\Serverraum\Zähler Hausstrom / Gas\Zähler 1 Zwischen]*/ , $counter_neu );    //aktueller Zählerwert ablegen
SetValueInteger(42585 /*[Keller\Serverraum\Zähler Hausstrom / Gas\Zähler 1 Diff]*/, $delta );          //Ausgabe Differenz zwischen alt und aktuell
 
//Berechung Verbrauch
//**********************************************************************
$deltaKWh = ($delta * $Zaehlerfaktor) * $Auslesefaktor  ;     // Verbrauch Impulse = 1KW * Faktor der Auslesung
if ($deltaKWh < 1000) //Wenn die aktuelle Leistung kleiner als 5KW, dann Ausgabe Freigabe für Anzeige
   {
  $round_deltaKWh = round ($deltaKWh, 3);   // auf 2 Stellen runden
  SetValueFloat(31126 /*[Status\Stromverbrauch\Aktueller Verbrauch kW]*/ , $round_deltaKWh);   // Ausgabe Stromeinspeisung pro Std.
 }
//Tagesleistung
//**********************************************************************
//Aufaddieren Summe Tag, Integer
//****************************************************************
  $Solar_Tagesleistung = GetValueInteger(56114 /*[Status\Stromverbrauch\Zähler Tagesleistung]*/  );  //Solar Tagesleistung Summe einlesen
  $Solar_Tagesleistung_neu = $Solar_Tagesleistung + $delta;  //neue Tagesleistung berechnen
  SetValueInteger(56114 /*[Status\Stromverbrauch\Zähler Tagesleistung]*/  , $Solar_Tagesleistung_neu);
//Monatsleistung
//**********************************************************************
//Aufaddieren Summe Monat, Integer
//****************************************************************
  $Solarstrom_Mon_Summe = GetValueInteger(23138 /*[Status\Stromverbrauch\Zähler Monatsleistung]*/   );
  $Solarstrom_Mon_Summe_neu = $Solarstrom_Mon_Summe + $delta ;
  SetValueInteger(23138 /*[Status\Stromverbrauch\Zähler Monatsleistung]*/   , $Solarstrom_Mon_Summe_neu);  //
 
if ($deltaKWh < 8.0) //Wenn die aktuelle Leistung kleiner als 35KW, Werte zur Tages- und Monatsleistung dazu zählen
   {
  //Anzeige Tagesleistung
  //*************************************************************
  $Solar_Tagesleistung_KW = $Solar_Tagesleistung_neu * $Zaehlerfaktor;  // Einspeisung 800 Umdrehungen = 1KW
  $Round_Solar_Tagesleistung = round ($Solar_Tagesleistung_KW, 2);     // auf 2 Stellen runden
  SetValueFloat (11283 /*[Status\Stromverbrauch\Tagesverbrauch kW/h]*/   , $Round_Solar_Tagesleistung);
 
  //Anzeige Monatswerte
  //*************************************************************
  $Solarstrom_Mon_Summe_neu_1 = $Solarstrom_Mon_Summe_neu * $Zaehlerfaktor;
  $Round_Solarstrom_Mon_Summe_neu_1 = round ($Solarstrom_Mon_Summe_neu_1, 2);     // auf 2 Stellen runden
   SetValueFloat ( 45561 /*[Status\Stromverbrauch\Monatsverbrauch kW/h]*/  , $Round_Solarstrom_Mon_Summe_neu_1);
 }
else
 {
 }
?>

Lass dich nicht von den Namen $Solarstrom… irretieren, das Skript wurde bei mir nur von der PV-Anlage kopiert, wollte nicht alles umbenennen :smiley:

Des Weiteren benötigst Du noch 2 Skripte die Dir den Tages und Monatszähler auf null zurücksetzen, einmal mit Event „täglich 00:01“ und einmal „monatlich zum 1. 00:01“. Achtung, hier stehen bei mir jeweils 4 Variablen da ich 2x S0-Counter mit insgesamt 4 Eingängen nutze.

Zum Schluß noch der Screenshot von den Variablen.

Hallo Marco,

hier hast mein Script zum aus probieren, ist so ähnlich wie die anderen auch.
Ich benutzte meine Script auch für die Überprüfung ob ein- oder ausgeschaltet ist

  1. DummyInstanz anlegen mit Namen für Zähler z.B. Spülmaschine
  2. Skript darunter anlegen
  3. Anfangstand Zähler und Zählerkonstante anpassen
  4. Skript einmal ausführen
  5. Ereignis auf Skript anlegen bei Variablenänderung 1-Wire Zähler
<?
//Anfangstand Zähler
$Start_Zaehler   	= 11.86; //z.B. 123.45
$Start_S0_Zaehler = 12555 ; //12345
//Zählerkonstante in Wh angeben 
$ZK = 0.5/1000;

$SelfID 	= $IPS_SELF;
$Sender 	= $IPS_SENDER;
//print_r (IPS_GetObject($IPS_SELF));
$Object   	= IPS_GetObject($SelfID);
$ObjectID 	= $Object['ObjectID'];
$ParentID 	= $Object['ParentID'];
$InfoID 		= 0;
$InfoID     = $Object['ObjectInfo'];
//print_r(IPS_GetObject($ParentID));
$Parent     = IPS_GetObject($ParentID);
$Name       = $Parent['ObjectName'];

@$Vari 	= explode(";",GetValueString ($InfoID));
//echo $Name;
//print_r ($Vari);

switch ($Sender)
	{
	case "Variable":
	   {
	   $Zaehlerstand_neu = $IPS_VALUE;
	   $Zaehlerstand_alt = GetValueInteger ($Vari[2]);
		//IPS_LogMessage ("Verbrauch: ",$Start_Zaehler+(($Zaehlerstand_neu-$Start_S0_Zaehler)*$ZK));

		if ($Zaehlerstand_neu > ($Zaehlerstand_alt+2))  //Standbyverluste
	      {
	      //Startzeit
	      if (@IPS_GetScriptTimer($SelfID) == 0)
	         {
            SetValueString ($Vari[6],date("H:i:s"));
				SetValueInteger ($Vari[7],time());
				//Endzeit
				SetValueString ($Vari[8],"--:--");
				//Akt.Laufzeit
				SetValueString ($Vari[10],"--:--");
				echo "time gesetzt";
	         }
			else
				{
				//Akt.Laufzeit
				$time 	= time()-GetValueInteger($Vari[7])-3600;
				SetValueString ($Vari[10],(date("H:i:s",$time)));
    		   }
			IPS_SetScriptTimer($SelfID, 180);
			//Leistung hochzählen
			$Start = GetValueFloat($Vari[0]);
      	$Neu = $Start+(($Zaehlerstand_neu-$Start_S0_Zaehler)*$ZK);
      	SetValueFloat($Vari[4],$Neu); //Ändern
			//Ein/Aus
			SetValueBoolean($Vari[3],true);
   		}
      SetValueInteger ($Vari[2],$Zaehlerstand_neu);
		break;
		}
	case "TimerEvent":
	   {
	   IPS_SetScriptTimer($IPS_SELF, 0);
      //Wärmepumpe Ein/Aus
		SetValueBoolean($Vari[3],false);
		//Letzter Wert Speichern
		$Akt = GetValueFloat($Vari[4]);
		SetValueFloat($Vari[1],$Akt);
		//Endzeit
		SetValueString ($Vari[8],date("H:i:s"));
		SetValueInteger ($Vari[9], time());
		//Akt.Laufzeit
		SetValueString ($Vari[10],"--:--");
		echo $IPS_SENDER;
	   break;
	   }
	case "Execute":
	   {
      //Variable Variablen
   	$Meldungen = @IPS_GetObjectIDByName($Name."_Variablen",$ObjectID);
	   	if ($Meldungen == 0)
				{
				$Meldungen = IPS_CreateVariable(3);
				IPS_SetParent($Meldungen, $ObjectID);
				IPS_SetName($Meldungen,$Name."_Variablen");
            IPS_SetPosition($Meldungen, 205);
            IPS_SetInfo($Meldungen, "This Variable was created by Script");
            IPS_SetInfo($ObjectID,$Meldungen);
            echo $Name."_Variablen erfolgreich eingerichtet \r";
				}
   	//Variable Start Zähler
   	$ID[0] = @IPS_GetObjectIDByName("Start Zähler",$ObjectID);
	   	if ($ID[0] == 0)
				{
				$ID[0] = IPS_CreateVariable(2);
				IPS_SetParent($ID[0], $ObjectID);
				IPS_SetName($ID[0],"Start Zähler");
            IPS_SetPosition($ID[0], 5);
            IPS_SetInfo($ID[0], "This Variable was created by Script");
            IPS_SetVariableCustomProfile($ID[0], "~Electricity");
            SetValueFloat ($ID[0],$Start_Zaehler);
            echo "Start Zähler erfolgreich eingerichtet \r";
				}
   	//Variable Start S0-Zähler
		$ID[1] = @IPS_GetObjectIDByName("Start S0-Zählerstand",$ObjectID);
	   	if ($ID[1] == 0)
				{
				$ID[1] = IPS_CreateVariable(1);
				IPS_SetParent($ID[1], $ObjectID);
				IPS_SetName($ID[1],"Start S0-Zählerstand");
            IPS_SetPosition($ID[1], 8);
            IPS_SetInfo($ID[1], "This Variable was created by Script");
            SetValueInteger ($ID[1],$Start_S0_Zaehler);
            echo "Start S0-Zählerstand erfolgreich eingerichtet \r";
				}
		//Variable letzter S0-Zählerstand
		$ID[2] = @IPS_GetObjectIDByName("S0-Zählerstand_alt",$ObjectID);
	   	if ($ID[2] == 0)
				{
				$ID[2] = IPS_CreateVariable(1);
				IPS_SetParent($ID[2], $ObjectID);
				IPS_SetName($ID[2],"S0-Zählerstand_alt");
            IPS_SetPosition($ID[2], 11);
            IPS_SetInfo($ID[2], "This Variable was created by Script");
            echo "S0-Zählerstand_alt erfolgreich eingerichtet \r";
				}
      //Variable Gerät EIN/AUS
		$ID[3] = @IPS_GetObjectIDByName($Name,$ParentID);
	   	if ($ID[3] == 0)
				{
				$ID[3] = IPS_CreateVariable(0);
				IPS_SetParent($ID[3], $ParentID);
				IPS_SetName($ID[3],$Name);
            IPS_SetPosition($ID[3], 0);
            IPS_SetInfo($ID[3], "This Variable was created by Script");
            IPS_SetVariableCustomProfile($ID[3], "~Switch");
            echo $Name." erfolgreich eingerichtet \r";
				}
      //Variable Verbrauch
		$ID[4] = @IPS_GetObjectIDByName("Verbrauch ".$Name." Insgesamt",$ParentID);
  			if ($ID[4] == 0)
				{
				$ID[4] = IPS_CreateVariable(2);
				IPS_SetParent($ID[4], $ParentID);
				IPS_SetName($ID[4],"Verbrauch ".$Name." Insgesamt");
            IPS_SetPosition($ID[4], 5);
            IPS_SetInfo($ID[4], "This Variable was created by Script");
            IPS_SetVariableCustomProfile($ID[4], "~Electricity");
            echo "Verbrauch ".$Name." Insgesamt erfolgreich eingerichtet \r";
            IPS_SetPosition($SelfID, 50);
            IPS_SetHidden($SelfID, true); //Objekt verstecken
            }
      // Pseudo-Skript
      $ID[5] = @IPS_GetScriptIDByName("Pseudo",$ObjectID);
  			if ($ID[5] == 0)
				{
				$ID[5] = IPS_CreateScript(0);
				IPS_SetParent($ID[5], $ObjectID);
				IPS_SetName($ID[5],"Pseudo");
            IPS_SetPosition($ID[5], 216);
            IPS_SetInfo($ID[5], "This Script was created by Script");
            echo "Pseudo Skript erfolgreich eingerichtet \r";
            IPS_SetHidden($ID[5], true); //Objekt verstecken
            IPS_SetVariableCustomAction($ID[3], $ID[5]);
            }
      //Variable Startzeit
		$ID[6] = @IPS_GetObjectIDByName("Startzeit",$ParentID);
	   	if ($ID[6] == 0)
				{
				$ID[6] = IPS_CreateVariable(3);
				IPS_SetParent($ID[6], $ParentID);
				IPS_SetName($ID[6],"Startzeit");
            IPS_SetPosition($ID[6], 14);
            IPS_SetInfo($ID[6], "This Variable was created by Script");
            IPS_SetVariableCustomProfile($ID[6], "~String");
            echo "Startzeit erfolgreich eingerichtet \r";
				}
      //Variable Startzeit timestamp
		$ID[7] = @IPS_GetObjectIDByName("Startzeit_timestamp",$ObjectID);
	   	if ($ID[7] == 0)
				{
				$ID[7] = IPS_CreateVariable(1);
				IPS_SetParent($ID[7], $ObjectID);
				IPS_SetName($ID[7],"Startzeit_timestamp");
            IPS_SetPosition($ID[7], 17);
            IPS_SetInfo($ID[7], "This Variable was created by Script");
            IPS_SetVariableCustomProfile($ID[7], "~String");
            echo "Startzeit_timestamp erfolgreich eingerichtet \r";
				}
      //Variable Endzeit
		$ID[8] = @IPS_GetObjectIDByName("Endzeit",$ParentID);
	   	if ($ID[8] == 0)
				{
				$ID[8] = IPS_CreateVariable(3);
				IPS_SetParent($ID[8], $ParentID);
				IPS_SetName($ID[8],"Endzeit");
            IPS_SetPosition($ID[8], 17);
            IPS_SetInfo($ID[8], "This Variable was created by Script");
            IPS_SetVariableCustomProfile($ID[8], "~String");
            echo "Endzeit erfolgreich eingerichtet \r";
				}
      //Variable Endzeit timestamp
		$ID[9] = @IPS_GetObjectIDByName("Endzeit_timestamp",$ObjectID);
	   	if ($ID[9] == 0)
				{
				$ID[9] = IPS_CreateVariable(1);
				IPS_SetParent($ID[9], $ObjectID);
				IPS_SetName($ID[9],"Endzeit_timestamp");
            IPS_SetPosition($ID[9], 19);
            IPS_SetInfo($ID[9], "This Variable was created by Script");
            IPS_SetVariableCustomProfile($ID[9], "~String");
            echo "Endzeit_timestamp erfolgreich eingerichtet \r";
				}
		//Variable Akt.Laufzeit
		$ID[10] = @IPS_GetObjectIDByName("Akt.Laufzeit",$ParentID);
	   	if ($ID[10] == 0)
				{
				$ID[10] = IPS_CreateVariable(3);
				IPS_SetParent($ID[10], $ParentID);
				IPS_SetName($ID[10],"Akt.Laufzeit");
            IPS_SetPosition($ID[10], 20);
            IPS_SetInfo($ID[10], "This Variable was created by Script");
            IPS_SetVariableCustomProfile($ID[10], "~String");
            echo "Akt.Laufzeit erfolgreich eingerichtet \r";
				}
      //ID Meldungen
		$IDS = implode(";",$ID);
		SetValueString($Meldungen,$IDS);
   	}
	}
?>

Hallo zusammen,
sorry das ich mich jetzt erst melde aber ich war beruflich unterwegs und hatte keine Zeit zu posten.Habe heute Abend mal versucht Werners Beschreibung zu folgen und so habe ich mal die Variabeln angelegt und diese in das Skript eingebaut,doch da viel mir auf das da Variabeln vorhanden sind die ich nicht zuordnen kann bzw.nicht finde doch ich habe es trotzdem versucht leider ohne Erfolg und so wäre es schön wenn mir Werner noch mal unter die Arme greifen könnte und mir die Funktion der anderen Variabeln erklären könnte bzw.mir den Rest der im Bildchen verdeckten Variabeln posten könnte.Wie gesagt habe alles so eingetragen wie unter dem Punkt Zähler und habe ein Ereignis eingebaut nachdem bei Variabelnänderung der Zähler bzw.Stand aktualisiert wird leider ohne Erfolg.Mein Zähler macht 1000 Impulse pro Kwh habe den Zählerfaktor sowie den Auslesefaktor wie im Skript von Werner übernommen.
Mfg
Marco

Moin ,

habe mir erlaubt das skript von meike0_0 mal auszuprobieren.

Irgendwie komme ich aber mit der Zählerkonstante nicht klar.

mein Strom Zähler macht 800imp/kWH also muß ich wohl 0.8/1000 in Zeile 6 schreiben??

und wie schaut das beim Gaszähler aus??? 1imp/0,01m³ also 100imp/10,332kWh bedeutet das dann 1/1033.2 in Zeile 6??

mfg

hi…
nutze kein script von hier und habe auch einen 800imp/kw zähler…
damit das funktioniert einfach die S0Zähler Instanz auf 15min refresh einstellen, und bei variablenänderung dieses script starten…

dann sieht mein script so aus:

<?
$stand=GetVariableInteger(XXXXXX); //Einlesen des gerade eben abgerufenen Zählerstandes 
$standalt= GetVariableInteger(XXXXXX); //Einlesen Zählerstand von vor 15min
$differenz=$stand-$standalt; //was ist denn seit letzte Messung wirklich aufgelaufen

//bis hierhin alles noch in countereinheiten sprich impulsen
$X=1;
$verbrauch=($differenz/800)*$X; //hier werden aus Impulsen KW.... das X wird im Text erläutert

SetValueInteger(XXXXX, $stand) //speichern des jetzt "alten" zählerstandes

bei mir läuft das script alle 15min… sprich ich habe dann kw/15min
wenn du das ganze auf ne stunde haben willst… $X=4… oder auf zwei Stunden $X=8… das kannste dann beliebig anpassen wie du es magst oder brauchst… wird ja nur hoch gerechnet… genauer gehts in dem du den Zähler dann auch jede Stunde oder alle zwei Stunden auslesen lässt. Is Geschmackssache, man muss aber sagen je länger die Ausleseintervalle des Zählers umso genauer deine Anzeige… ich habe z.b. die 15min anzeige gelassen… und weiss nun das ich gerade in den letzten 15min 0,13kw verbraucht habe…

Also die 15min Intervalle hochrechnen und dir wird sehr schnell schlecht… die Jahresanzeige stimmt mit der Stromabrechnung vom letzten Jahr mit ± 3kw/h überein… das fand ich schick;o)

Grüße

Guten Abend liebe Leute,

habe gerade versucht mit den klasse skript von meike0_0 klar zukommen. Leider ohne richtigen Erfolg. Habe das Skript eingebaut - siehe beiliegendes Bild.

Leider funktioniert es noch nicht wie es soll - hoffentlich koönnt Ihr mir helfen…

  1. Zählerkonstante - mein Zähler macht 1000 Impuls/kWh … ist 1.0/1000 richtig?
  2. sind die entsprechenden Variablen und das skript richtig angelegt?
  3. in den ersten 3 min hat das skript sehr gut funktioniert, danach ist der aktuelle Zustand von „true“ auf „false“ gewechselt, obwohl die Maschine noch lief…
  4. Die Akt. Zeit wird nicht angezeigt
  5. Nachdem der Zustand „false“ eingetreten ist, wird nur noch der neue Counterwert eingetragen… sonst ppassiert nicht mehr!

Leute, bitte helft mir meine Fehler zu beheben…

Das Skript ist nämlich sehr gut…

Vielen Dank

Sascha :wink:

Hallo Sascha,

verändere einmal die Zeile

Zeile 32
alt if ($Zaehlerstand_neu > ($Zaehlerstand_alt+2)) //Standbyverluste
neu if ($Zaehlerstand_neu > ($Zaehlerstand_alt+1)) //Standbyverluste

oder

Zeile 52
IPS_SetScriptTimer($SelfID, 240);
Timer anstatt 240 auf 300

Das ist ein Problem mit Geräten die Pausen im Stromverbrauch einlegen.
Der Verbrauch ist kleiner wie 3 Impulse in 240sec.

Akt.Zeit wird nur angezeigt ein eingeschalterten Geräten.

Hallo meike0_0,

vielen Dank für Deine Unterstützung. Habe das Skript geändert und werde es später einmal austesten… Hoffentlich läuft es … :smiley:

Kannst Du bitte auch noch einmal auf die Zählerkonstante schauen … 1.0/1000 - mein Zähler macht 1kWh pro 1000 Impulse …

Vielen Dank bis später

Sascha

Mein Zähler mach glaube ich 2000Imp./KWh deshalb 0.5/1000.
Bei dir müßte 1/1000 stimmen.
Das siehst Du aber gleich, wenn Du den Zählerstand mit der Anzeige vergleichst.
Wenn ich zuhause bin schaue ich noch mal genau nach.

Hallo meike0_0,

vielen Dank für Deine Unterstützung. Nun läuft das Skript tadellos und macht richtig Spaß.

Eine Frage habe ich allerdings noch:
Ich habe für die Verbrauchserfassung eine eigene Kategorie angelegt. Beim aufrufen mittels Browers werden jedoch nur 4 Variablen angezeigt (Verbrauch, Startzeit, Stopzeit, Akt. Zeit). Gerne würde ich jedoch auch den Zustand (TRUE/FALSE - AN/AUS) darstellen. Die Variable ist nicht versteckt. Habe das schon unter Bearbeiten kontrolliert …

Hast Du eine Ahnung, warum man nur 4 Variablen in dieser Kategorie anzeigen kann?

Danke

ZipFam

Hallo ZipFam,
ist die Boolean-Variable vorhanden?
Am erster Position und das Profil Switch zugeordnet.

Bei mir ist die Boolean „Trockner“.

Hallo meike0_0,

:smiley:

So, nun haben wir wirklich alle Unklarheiten bei mir beseitigt. Nachdem ich der Variablen das Profil zugeordnet hatte, funktioniert es tadellos!!!

Super - wirklich herzlichen Dank

Grüsse

:wink: