Betriebsstundenzähler und mehr

Hallo zusammen

nachdem ich mir schon viele nützliche Informationen aus dem Forum geholt habe, hier ein kleines Dankeschön.
Vieleicht ist es ja für den ein oder anderen nützlich:

Also es handelt sich um eine Variante eines Betriebsstunden u. Betriebskostenzählers.

Erfasst werden:

  • Betriebsdauer
  • Stromverbrauch
  • Stromkosten
  • Anzahl der Ein/Auschaltzyklen
  • letztmalige Ein/Auschaltzeitpunkte

von beliebig vielen Geräten (Instanzen)
Es werden dann auch noch der Gesamtstromverbrauch bzw. die Gesamstromtkosten der erfassten Geräte berechnet.

Angezeigt werden die Daten für jedes Gerät einzeln gegliedert nach Kategorien.
Die jeweiligen Variablen sind für korrekte Anzeige im Webfront bereits konfiguriert.

Installation:
!!! Ich konnte nur auf meinem Rechner testen, daher bitte sicherheitshalber vorher eine Sicherungskopie eurer Konfiguration anlegen. Anwendung auf eigene Gefahr !!!

  1. neue Kategorie „Betriebsdatenerfassung“ (name ist beliebig) anlegen
  2. Script beliebigem Namens anlegen und untenstehenden Code reinkopieren
  3. Script 1x händisch ausführen
  • dabei werden nun einige Dummy Module angelegt und Variablendefinitionenn angelegt.
  1. Für jedes zu überwachende Gerät ein Ereignis „bei Variablenänderung“ der den Betriebszustand anzeigenden Statusvariable an das Script binden.
    Das Script funktioniert mit Variablen vom Typ Boolen (Aus=False, Ein=True) oder Integer wobei dann der Wert 0 als Aus und jeder andere Wert als als EIN erkannt wird.

  2. Im Dummy Modul „Grunddaten“ liegt eine Variable „Strompreis_in_Cent_pro_kW“ diese bitte mit dem jeweils gültigen Tarif beschreiben.

  3. Bei erstmaligem betätigen eines im pkt.4 zur Überwachung konfigurierten Gerätes wird im Dummy Modul „Grunddaten“ für eben dieses Gerät eine Variable mit Namen "Leistungsaufnahme_in_Watt:Gerätename angelegt.
    Diese ist ebenfalls mit dem zum Gerät passenden Wert zu beschreiben.

Benützung:

In den Dummy Modulen „Betriebsdauer“, „Betriebskosten“, „Energieverbrauch“, „Schaltzyklen“ werden bei erstmaligen schalten eines Gerätes entsprechende Variablen automatisch angelegt.

Bei darauffolgenden Betätigungen füllen sich diese Variablen mit den entsprechenden Werten.

Da das Script immer nur bei betätigen eines Gerätes aktiv wird zählen die Werte nicht „live“ hoch, sondern werden erst beim Ausschalten neu berechnet. Dies ist beabsichtigt, da dadurch nur eine sehr gering Systemlast entsteht und bedenkenlos auch sehr viele Geräte überwacht werden konnen.

Weitere Hinweise:
Defaulmäßig setzen sich sie Zählvariablennamen aus dem Namen der übergeordneten Instanz und dem Namen der Statusvariable zusammen.
Wahlweise kann auch nur der Instanzname oder der Statusvariablenname verwendet werden.
Die entsprechende Stelle ist im Script markiert je nach Wunsch sind die Zeilen passend zu remarken.
So kann je nach bereits existierendem Namensschema die am besten passende Variante gewählt werden.

Die Werte allerZählvariablen können zu jedem Zeitpunkt beliebig geändert, zurückgesetzt oder auch ganz gelöscht werden. Das Script arbeitet dann mit den jeweils neuen Werten weiter, bzw. legt die Zählvariablen neu an.

Die Namen der Zählvariablen und der Instanzen dürfen aber NICHT !!! geändert werden, diese würde zu neuanlegen derselben führen.

Getestet habe ich mit Statusvariablen von FS20 und 1Wire Geräteinstanzen.

Im Webfront sieht es dann wie an den angehängten Screenshots aus.

Viel Spass
bb

und nochmals:
!!! Ich konnte nur auf meinem Rechner testen, daher bitte sicherheitshalber vorher eine Sicherungskopie eurer Konfiguration anlegen. Anwendung auf eigene Gefahr !!!


$name_BetrSt = 'Betriebsdauer';
$name_Zyk = 'Schaltzyklen';
$name_Kost = 'Betriebskosten';
$name_lastOn= 'Letztmalig Geschaltet';
$name_Energie= 'Energieverbrauch';
$name_Config= 'Grunddaten';

if($IPS_SENDER == "Execute")                // nur wenn bei "Ausführen"
 {
# Variablenprofile anlegen
IPS_CreateVariableProfile('BetrStd_integer',1);
IPS_CreateVariableProfile('BetrStd_sec',1);
IPS_SetVariableProfileText('BetrStd_sec','',' sec');
IPS_CreateVariableProfile('BetrStd_kW',2);
IPS_CreateVariableProfile('Zyklen',1);
IPS_SetVariableProfileText('BetrStd_kW','',' kW');
IPS_SetVariableProfileDigits('BetrStd_kW',2);
IPS_CreateVariableProfile('BetrStd_Euro',2);
IPS_SetVariableProfileText('BetrStd_Euro','',' €');
IPS_SetVariableProfileDigits('BetrStd_Euro',2);

$ParentID = IPS_GetObject($IPS_SELF);
$ParentID = $ParentID['ParentID'];
IPS_SetHidden($IPS_SELF,true);

# DummyInstancen anlegen
getId($name_BetrSt);
getId($name_Zyk);
getId($name_Kost);
getId($name_lastOn);
getId($name_Energie);
getId($name_Config);

# Summenvariablen Anlegen
$MODID_Config = getId($name_Config);
$Strompreis = CreateVariableByName($MODID_Config, "Strompreis_in_Cent_pro_kWh", 1);
$Gesamtverbrauch = CreateVariableByName($ParentID, "Gesamtstromverbrauch d. überwachten Geräte", 'kW');
$Gesamtkosten = CreateVariableByName($ParentID, "Stromkosten d. überwachten Geräte", 'Euro');

echo "Erfolgreich eingerichtet";

}

 if($IPS_SENDER == "Variable")
 {
# überwachte variable und deren parent holen
	$Variable = IPS_GetObject($IPS_VARIABLE);
	$parentID = $Variable['ParentID'];
   $VariableName= $Variable['ObjectName'];

  	$Parent = IPS_GetObject($parentID);
	$ParentName =  $Parent['ObjectName'];


# !!! gewünschtes Variablennamensschema auswählen !!!
#  $ObjectName = $ParentName;   # -> erhält Name der übergeordneten Instanz der überwachten Variablen
#	$ObjectName= $VariableName;  # -> erhält Name der überwachten Variablen
  $ObjectName = $ParentName.'_'.$VariableName;  #-> Kombination aus Instanz&Variablenname

	if(($IPS_VALUE==True) OR ($IPS_VALUE <> 0)) {  # Objekt wurde eingeschaltet, ggfls anpassen

# Dummyinstancen holen
	   $MODID_Zyk = getId($name_Zyk);
		$MODID_last =getId($name_lastOn);
      $MODID_Config = getId($name_Config);
# Variablen befüllen, bzw. bei erstmaligem Aufruf anlegen
      CreateVariableByName($MODID_Config, 'Leistungsaufnahme in Watt: '.$ObjectName,1); #Leistungsaufnahme

		$idSz = CreateVariableByName($MODID_Zyk, $ObjectName,'Zyklen'); #ON/OFF Zyklen
		SetValue($idSz, GetValue($idSz)+1);

	 	$idOn = CreateVariableByName($MODID_last, $ObjectName.'_On_Timestamp', 1); #ON_timestamp
		SetValue($idOn,time());

  	   $idOnString = CreateVariableByName($MODID_last, $ObjectName.'_On', 'Zeit');#timestamp letzter Einschaltzeitpunkt als String
		SetValue($idOnString, date("H:i:s",GetValue($idOn)));
	}

	else {   # Objekt wurde ausgeschaltet

      $ParentID = IPS_GetObject($IPS_SELF);
		$ParentID = $ParentID['ParentID'];
# Dummyinstancen holen
		$MODID_last = getId($name_lastOn);
      $MODID_BetrSt = getId($name_BetrSt);
      $MODID_Kosten = getId($name_Kost);
      $MODID_Energie = getId($name_Energie);
# Variablen beschreiben bzw. ber erstmaligem Aufruf anlegen
      $MODID_Config = getId($name_Config);
      $Id_Leistung = CreateVariableByName($MODID_Config, 'Leistungsaufnahme in Watt: '.$ObjectName,1); #Leistungsaufnahme
		$Leistung = GetValue($Id_Leistung);
      $Strompreis = IPS_GetVariableIDByName('Strompreis_in_Cent_pro_kWh', $MODID_Config);

    	$idOn = CreateVariableByName($MODID_last, $ObjectName."_On_Timestamp", 1);#timestamp letzter Einschaltzeitpunkt
  	 	$idOff = CreateVariableByName($MODID_last, $ObjectName.'_Off_Timestamp', 1); #ON_timestamp
		SetValue($idOff,time());
  	   $idOFFString = CreateVariableByName($MODID_last, $ObjectName.'_OFF', 'Zeit');#timestamp letzter Einschaltzeitpunkt als String
		SetValue($idOFFString, date("H:i:s",GetValue($idOff)));

		$idC = CreateVariableByName($MODID_BetrSt, $ObjectName."_Sekunden", 'sec');#Sekundenzähler
		SetValue($idC, GetValue($idC)+ (time() - getValue($idOn)));

   	$idbh = CreateVariableByName($MODID_BetrSt, $ObjectName, 'Zeit');#Betriebsdauer als String
		SetValue($idbh, date("z \T\a\g\e  H:i:s", GetValue($idC)- 3600));

		$idW = CreateVariableByName($MODID_Energie, $ObjectName, 'kW'); # Energieverbrauch in kWh
		SetValueFloat($idW, GetValue($idC)/3600 * $Leistung/1000 );

  		$idEuro = CreateVariableByName($MODID_Kosten, $ObjectName, 'Euro');  #Kosten in Euro
		SetValueFloat($idEuro, GetValueFloat($idW) *GetValue($Strompreis)/100 );
# Summenvariablen updaten
      $IdkW = IPS_GetVariableIDByName("Gesamtstromverbrauch d. überwachten Geräte",$ParentID);
      $IdKosten = IPS_GetVariableIDByName("Stromkosten d. überwachten Geräte",$ParentID);
		$all_IdVerbrauch = IPS_GetChildrenIDs($MODID_Energie);
      $all_IdKosten = IPS_GetChildrenIDs($MODID_Kosten);
		$kW = 0.0;
		foreach ($all_IdVerbrauch as &$Ids) {
			$kW = $kW+GetValueFloat($Ids);
			}
		SetValueFloat($IdkW,$kW);
      $Kosten = 0.0;
		foreach ($all_IdKosten as &$Ids) {
			$Kosten = $Kosten+GetValueFloat($Ids);
			}
		SetValueFloat($IdKosten,$Kosten);
		}
}

function CreateVariableByName($id, $name, $type)
{
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid===false) {

		$vartype = 1;
      if ($type == 'Euro/kWh') $vartype = 2;
		if ($type == 'Euro') $vartype = 2;
		if ($type == 'kW') $vartype = 2;
  		if ($type == 'Zeit') $vartype = 3;



		$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 == 'integer') IPS_SetVariableCustomProfile ($vid, "BetrStd_integer");
  		if ($type == 'sec') IPS_SetVariableCustomProfile ($vid, "BetrStd_sec");
  		if ($type == 'kW') IPS_SetVariableCustomProfile ($vid, "BetrStd_kW");
      if ($type == 'Euro') IPS_SetVariableCustomProfile ($vid, "BetrStd_Euro");
		if ($type == 'Zeit') IPS_SetVariableCustomProfile ($vid, "~String");

		if (strpos($name,'Timestamp') >0) IPS_SetHidden($vid,true);
      if (strpos($name,'Sekunden') >0) IPS_SetHidden($vid,true);


	}
   return $vid;
}

function getId($name) {
   global $IPS_SELF;
   $ParentID = IPS_GetObject($IPS_SELF);
	$ParentID = $ParentID['ParentID'];

	$ID = @IPS_GetObjectIDByName($name, $ParentID);
	if ($ID == 0) {
  		$dummy=IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");  #Betriebsstunden anlegen
		IPS_ApplyChanges($dummy);
		IPS_SetName($dummy,$name);
		IPS_SetParent($dummy,$ParentID);
	}

 return $ID;
}

Hallo bbernhard,

ebenfalls ein Dankeschön von uns an Dich.

Das das Skript funktioniert super - ein Mausklick und schon lief es auf unserem Funkdisplay in der Garage (u.a. als Frostschutzwächter)

MST

Hi steiner, danke für die Rückmeldung.
Schön das es bei dir gleich funktioniert hat.
Paar Teile des Scripts sind übrigens ausdeinem eigenen Zählerscript geklaut da du mal gepostst hast.

Nettes Kasterl hast da übrigens.
gruß
bb

Nettes Kasterl hast da übrigens

das auch mit Hilfe einer IO-BOX auch 230V schalten kann und zusätzlich
Eingänge für Kontakte besitzt.

MST

Cooles Script.
Das hat es gleich in meine Top 3 geschafft.-

Gruss & DANKE
B71

Hallo bbernhard,

vielen Dank, das Skript hat sofort funktioniert.
Genau so etwas habe ich gesucht, aber selbst nicht hinbekommen.

Gruß und Danke

Habe es heute auch installiert, SUPER.
Ist es eigentlich möglich das man vor den Einschalt-bzw Ausschaltuhrzeiten auch das Datum mit einfügen kann?. Danke

Hallo Bernhard,

auch ich habe gestern dein Skript installiert und muss sagen „RESPEKT“.

Nicht nur das das Betriebsstundenzähler-Skript ein richtiger Hingugger ist, ich empfinde es schon als eine Art Referenzskript zum erlernen diverser Funktionen an die man sich sonst nie wagt.

Vielen Dank dafür.

Ein kleine Frage noch. Wäre bei der Variable für den Grundpreis der kWh nicht ein Float-Variable besser. Mein Preis z.B. beträgt 18,45 Cent. Mit der Intervariable kann man nur 18 oder 19 Cent abbilden.

nach oben schieb…

Hallo zusammen,

ich hatte mir das Script schon als Float-Variable umgeschrieben aber wieder rückgängig gemacht, um bei Änderungen „updatefähig“ zu bleiben.

Grund war, das ich auf den Cent genau eigentlich genau genug finde.
Eine 60 Watt Birne oder Pumpe verbraucht auch nicht immer genau 60 Watt, sondern ist von Temperatur, Spannung, Toleranzen usw. abhängig, was dann die Berechnung eh wieder verfälschen würde.

Wenn man’s ganz genau braucht, muss man sowieso „richtig“ messen.

Grüße,
Doc

Oh hallo, danke für euer Lob.
Hab irgendwie gar nicht mitbekommen das es schon so viele benutzen.

Den Wunsch das Datum mitanzuzeigen zu erfüllen sollte eigentlich kein Problem sein. Ebenso den Strompreis als Float.

Mir selbst schwebt noch vor eine Art Tortengrafik zu erzeugen um auf einen Blick zu sehen wie sich der Energieverbrauch prozentuell aufteilt.

Werde mich über Weihnachten mal dransetzen und ein wenig dran basteln.

schöne Grüße und viel Spass noch
bb

Hy, na dann frohe Weihnachten und ein Gutes gelingen.:loveips:

und bitte gleich einen Reset aller Zähler ( für den Jahreswechsel zB )

Hallo,

ganz viel Respekt vor deinem Sricpt, lief bei mir auf anhieb mit der Beta 2,2
Genau so etwas habe ich für meine Wärmepumpen und Heizkreispumpen gesucht. :rolleyes:

Danke

Thorsten

Hallo bbernhard,

ebenfalls ein Dankeschön von mir.

Das das Skript funktioniert super - auch unter der 2.4.

Herzlichen Dank, Stromer

gut zu wissen, dann steht das Script bei mir heute Abend an…

Hallo ihr Betriebsstundenzähler

Vieleicht zwei kleine Warnungen zu meinem Script:
Mit dem rev2.4 Webfront sind ja die ausklapbaren Kategorien weggefallen.
Dadurch ist die Anzeige im WF nun leider sehr länglich und unübersichtlich.
d.h. da müßtet ihr ggfl. selbst noch etwas rumspielen ums optisch wieder aufzupäppen.

Weiters ist mir aufgefallen das ab und an mal ein Zählwert aus dem Ruder läuft. evtl. passierte das nach unsauberem rechner Shutdown (Absturz).
Ich habs aber nie verfolgt.
d.h. das Script ist eher nur für kürzere Zeiträume gedacht, Langzeiterfassung
ist vieleicht etwas zu unstabil.

Ausblick:
Ich baue grad an einer netten grafischen Aufbereitung von Betriebsstunden/Kosten/verbrauchter Energie ect. mittels HighCharts.
Optisch wird das das sehr fesch… mit schön klickbaren Elementen und Animation im Chart.
Den Code dazu veröffentliche ich in demnächst.

Paralell dazu hab ich bei mir die Betriebsstundenerfassung auf die interne DB umgestellt. Mal sehen ob sich da ein ähnliches einfach installierbares Modul dazu basteln läßt.

gruß
bb

Hallo Bernhard,

das sind gute Neuigkeiten und gerade diese Scripte geben auch den Anfängern die Tips um selbst zu programmieren.

Vielen Dank an Dich und alle anderen Kollegen hier. :slight_smile:

Grüße, Stromer

Hallo Bernhard

ist wirklich ein tolles Script. Vorallem für mich als blutigen Anfänger. Ist perfekt durchgelaufen.

Habe dann versucht, den Euro in Fr. zu ändern, aber das übernimmt es mir nicht (habe alles mit „Euro“ in „Fr.“ geändert). Hat mir da jemand einen Tip?

Ebenfalls bleibt die Variable der Gesamtkosten leer (KW rechnet er), kommt die erst ab einem gewissen Wert?

Hi jbu

Du hast vermutlich mit dem Originalscript installiert und dann im Script auf Fr umgestellt.
Da hilfts nix mehr, da die Variablenprofile schon angelegt wurden.

Du müßtest einfach nur auf eine beliebig Variable im Modul „Betriebskosten“. Dort hantelst dich zum Variablenprofil durch. es müßte sich „BetrStr_Euro“ nennen. Wennst in dem Profil nun Euro auf Fr. änderst müßtest du bekommen was du suchst.

Gesamtkosten, hmmm deinen Strompreis hast du eingetragen ?
Das da irgend eine Schwelle wäre wüßte ich jetzt nicht .

gruß
bb