Einschaltzeiten von Aktor erfassen, Verbräuche

Moin,

ich habe schon intensiv im Forum gesucht, aber immer nur uralte und unpassende Beiträge gefunden. Daher stelle ich die Frage hier noch mal:

Ich habe einen Aktor der eine elektrische Heizung schaltet. Ich kenne den Verbrauch, ich kenne den Strompreis.

Nun möchte ich in einer Variablen die Einschaltdauer des Aktors erfassen (siehe Bild), mit einer anderen die Kosten. Darstellen möchte ich es mit einer Balkengrafik wie die, die ich hier gefunden habe.

Die Scripte und Lösungen, welche ich hier gefunden habe sind entweder veraltet oder oversized. Ich hätte gerne eine kleine einfach Lösung. Also Betriebsstunden erfassen und dann Kosten = Betreibungen * Leistung * Preis rechnen.

Gibt es eine einfache(!) Lösung?

Gruß, Gerhard


Bildquelle: Charts — IP-Symcon :: Automatisierungssoftware

Hallo Gerhard,

habe ich für mehrere Verbraucher so gelöst:

 // Zeit berechnen, wie lange ein Gerät eingeschaltet war
 // und dann den Stromverbrauch berechnen
 // Geräte = "FS20" oder "HomeMatic Device"
 //
 // folgende Variablen je Gerät (Instanz) einrichten:
 // - Leistung       	float    ~Watt.3680
 // - Stromverbrauch 	float    ~Electricity   loggen als Zähler
 // - letzte Änderung   float
 
 
 $EreignisInfo = IPS_GetEvent($_IPS['EVENT']);
 $id_var = $EreignisInfo['TriggerVariableID'];
 $id_geraet = IPS_GetParent($id_var);
 $modul = IPS_GetInstance($id_geraet)['ModuleInfo']['ModuleName'];
 IF($modul == "FS20")
   $id_status = IPS_GetObjectIDByName("Status",$id_geraet);
 ELSE
 	$id_status = IPS_GetObjectIDByName("STATE",$id_geraet);

 $id_zuletzt = IPS_GetObjectIDByName("letzte Änderung",$id_geraet);
 $id_kwh = IPS_GetObjectIDByName("Stromverbrauch",$id_geraet);
 $id_kw = IPS_GetObjectIDByName("Leistung",$id_geraet);
 $kw = GetValueFloat($id_kw)/1000/3600;                     // Watt/1000=kw/3600=pro Sekunde
 
 $status = GetValueBoolean($id_status);
 $letzte = GetValueFloat($id_zuletzt);
 $var    = IPS_GetVariable($id_status);
 $akt		= $var['VariableUpdated'];

 IF ($status == false)     // Gerät wurde ausgeschaltet
   {
	 $zeit   = $akt - $letzte;
	 $verbrauch = $kw * $zeit + GetValueFloat($id_kwh);
	 SetValueFloat($id_kwh, $verbrauch);
	}

 SetValueFloat($id_zuletzt, $akt);

Getriggert wird das PGM mit Änderung der STATE-Variablen

Gruß, Peter

Oh, danke schön. :slight_smile:
Das werde ich heute Abend gleich mal ausprobieren.

Mir ist nicht ganz klar wie das Script arbeitet. Ich bin auch nicht sehr fit in so einer Programmierung.

Erst mal muss ich in der Zeile 15 HomeMatic Device eintragen, richtig?

 IF($modul == "HomeMatic Device") 

Dann lege ich die Variablen Leistung, Stromverbrauch und letzte Änderung an, jeweils als Float. Nur wie werden dann zwei Geräte unterschieden? Ich kann diese Variablen doch nicht mehrfach haben, oder?

Und wo trage ich das Gerät ein was abgefragt werden soll?

Wenn alles fertig ist, löse ich das Script aus, wenn sich der Zustand des Geräts ändert. Das verstehe ich wieder.

Ach nee, jetzt kapiere ich die IF-Abfrage. :slight_smile:

 IF($modul == "FS20")
   $id_status = IPS_GetObjectIDByName("Status",$id_geraet);
 ELSE
     $id_status = IPS_GetObjectIDByName("STATE",$id_geraet);

Hier wird der Status je nach Gerätetyp abgefragt. Wenn es ein HomeMatic-Aktor ist, muss STATE abgefragt werden, und bei einem FS20-Aktor muss Status abgefragt werden. :slight_smile:

Leider hagelt es Fehlermeldungen:

02.05.15 18:50:00*| ExecuteThreadID #8*| [Verbrauch\Stromverbrauch berechnen] = 
Warning:  Objekt STATE wurde nicht gefunden in C:\IP-Symcon\scripts\18955.ips.php on line 22
Warning:  Objekt letzte Änderung wurde nicht gefunden in C:\IP-Symcon\scripts\18955.ips.php on line 24
Warning:  Objekt Stromverbrauch wurde nicht gefunden in C:\IP-Symcon\scripts\18955.ips.php on line 25
Warning:  Objekt Leistung wurde nicht gefunden in C:\IP-Symcon\scripts\18955.ips.php on line 26
Warning:  Variable #0 existiert nicht in C:\IP-Symcon\scripts\18955.ips.php on line 27
Warning:  Variable #0 existiert nicht in C:\IP-Symcon\scripts\18955.ips.php on line 29
Warning:  Variable #0 existiert nicht in C:\IP-Symcon\scripts\18955.ips.php on line 30
Warning:  Variable #0 existiert nicht in C:\IP-Symcon\scripts\18955.ips.php on line 31
Warning:  Variable #0 existiert nicht in C:\IP-Symcon\scripts\18955.ips.php on line 37
Warning:  Variable #0 existiert nicht in C:\IP-Symcon\scripts\18955.ips.php on line 38
Abort Processing during exceed of maximal ErrorCount: Variable #0 existiert nicht
   Error in Script C:\IP-Symcon\scripts\18955.ips.php on Line 41

Daraufhin habe ich ein Test-Script mit diesen Zeilen erstellt und laufen lassen:

<?

$ObjektID = @IPS_GetObjectIDByName("Stromverbrauch", $ParentID);
if ($ObjektID === false)
    echo "Objekt nicht gefunden!";
else
    echo "Die Objekt-ID lautet: ". $ObjektID;

?>

Es liefert „Objekt nicht gefunden!“.

Das Test-Script habe ich aus der Dokumentation:
IPS_GetObjectIDByName — IP-Symcon :: Automatisierungssoftware

Heißt die Variable von deinem HM-Aktor denn STATE oder hast du die umbenannt ?
Wenn ja, dann ersetze nur in Zeile 22 den Befehl IPS_GetObjectIDByName gegen IPS_GetObjectIDByIdent.
Und die drei anzulegenden Variablen liegen auch in der HM-Instanz ?
Michael

So, jetzt funktioniert es. :slight_smile: Was habe ich gemacht?

[ul]
[li]Ich habe die 3 Variablen erzeugt, die im Script genannt sind.
[/li][li]Bei der Variablen Leistung habe ich manuell die Leistung des Verbrauchers eingetragen, in meinem Fall 313 Watt.
[/li][li]Im Script habe ich IPS_GetObjectIDByName durch die Objekt-IDs ersetzt.
[/li][li]Dem Script habe ich ein Ereignis hinzugefügt, was das Script immer dann aufruft, wenn sich der Status meines Aktors ändert.
[/li][/ul]
Hier das geänderte Script, die IDs sind Fantasie-IDs und müssen durch die richtigen ersetzt werden:

<?
 // Zeit berechnen, wie lange ein Gerät eingeschaltet war
 // und dann den Stromverbrauch berechnen
 // Geräte = "FS20" oder "HomeMatic Device"
 //
 // folgende Variablen je Gerät (Instanz) einrichten:
 // - Leistung          float    ~Watt.3680
 // - Stromverbrauch    float    ~Electricity   loggen als Zähler
 // - letzte Änderung   float


 $EreignisInfo = IPS_GetEvent($_IPS['EVENT']);
 $id_var = $EreignisInfo['TriggerVariableID'];
 $id_geraet = IPS_GetParent($id_var);
 $modul = IPS_GetInstance($id_geraet)['ModuleInfo']['ModuleName'];

// Hier die Geräte und Variablen eintragen
 $id_status  = 49295  /*[Obergeschoss\Schlafzimmer\Geräte\E-Heizung Wasserbett\STATUS Wasserbettheizung]*/; // ID des Status-Kanals eintragen
 $id_zuletzt = 21101  /*[Verbrauch\letzte Änderung]*/; // ID der Variable "letzte Änderung" eintragen
 $id_kwh     = 37192  /*[Verbrauch\Stromverbrauch]*/;  // ID der Variable "Stromverbrauch" eintragen
 $id_kw      = 10438  /*[Verbrauch\Leistung]*/;        // ID der Variable "Leistung" eintragen


 $kw     = GetValueFloat($id_kw)/1000/3600;        // Watt/1000=kw/3600=pro Sekunde
 $status = GetValueBoolean($id_status);
 $letzte = GetValueFloat($id_zuletzt);
 $var    = IPS_GetVariable($id_status);
 $akt    = $var['VariableUpdated'];

 IF ($status == false)     // Gerät wurde ausgeschaltet
   {
     $zeit   = $akt - $letzte;
     $verbrauch = $kw * $zeit + GetValueFloat($id_kwh);
     SetValueFloat($id_kwh, $verbrauch);
    }

 SetValueFloat($id_zuletzt, $akt);
?>

Ich habe sie umbenannt.

Wenn ja, dann ersetze nur in Zeile 22 den Befehl IPS_GetObjectIDByName gegen IPS_GetObjectIDByIdent.
Ah, da liegt der Hase im Pfeffer. :slight_smile:

Und die drei anzulegenden Variablen liegen auch in der HM-Instanz ?
Weiß ich nicht. Ich habe in Symcon eine Kategorie hinzugefügt, in der ich die Variablen und das Script angelegt habe.

OK, alles fest eintragen ist aber blöd wenn du das ganze X-Mal brauchst :wink:
Michael

Anders lief es leider nicht. :frowning:

Anleitung richtig lesen :smiley:
Die Variablen müssen in (unterhalb) der HM-Instanz liegen.
Michael

Welche Anleitung denn?!? Im Script steht nur „folgende Variablen je Gerät (Instanz) einrichten:“ und ich habe diese für das erste Gerät eingerichtet.

Dass man Variablen im Gerät selbst platzieren kann, kannte ich gar nicht. Das stand da auch nicht.
Ich probiere das mal in meinem zweiten Gerät aus.

Muss das Script auch in das Gerät gelegt werden? Oder lege ich es in einen Scripte-Ordner? Dann muss ich aber das Script mit einem Ereignis aufrufen, und dieses Ereignis gehört wieder ins Gerät, damit die die ID beim Aufruf übergeben wird?

Viele Fragen … :wink:

OK, stimmt der Wortlaut ist etwas unglücklich. Aber so habe ich es interpretiert.
Wo das Script liegt ist egal.
Und Ereignisse kannst du nicht frei platzieren, die liegen immer unterhalb von dem Ziel was sie ansteuern (also dem Script).
Michael

Okay, das Script also in eine Kategorie z.B. für Scripte legen, dann je ein Ereignis für jedes Gerät hinzufügen, und die Variablen jeweils in den Geräten anlegen. Ist das so richtig?

So verstehe ich das.
Und so sieht es auch im Script bei dem Bereich welcher die ObjektIDs ermittelt aus.
Michael

Funktioniert bei mir nicht. Das macht aber nichts, denn ich habe eh nur zwei infrage kommende Geräte.

Aber eine andere Frage:
Wäre es nicht sinnvoll alle 5 Minuten zu triggern statt es nur bei Änderungen zu machen? Denn bei einer stündlichen Anzeige habe ich je einen Balken für 5 Minuten. Schaltet sich das Gerät jetzt aber für 3 Stunden ein, habe ich zur Abschaltzeit nur einen einzigen Balken mit dem Gesamtverbrauch. Besser wäre es aber in jedem 5-Minuten-Fenster einen Balken mit dem Verbrauch dieser Zeit zu haben.