Homematic Gaszähler HM-ES-TX-WM

Hallo zusammen,

derzeit mache ich meine ersten Schritte mit IP-Symcon. IP-Symcon läuft bei mir auf einem RPI3. Ich habe bisher im unter anderem ein paar Homematic-Aktoren eingebunden. Ein wesentlicher Antrieb IP-Symcon zu verwenden, sind für mich die Möglichkeiten Variablen zu loggen - eben auch den Homematic-Gaszähler HM-ES-TX-WM. Über den Homematic-Konfigurator habe ich mir dazu den Gaszähler in IP-symcon angelegt. Darüber kann ich den auf dem Zähler angezeigten Verbrauchswert („Energiezähler Gerät“ in der CCU-Oberfläche) auslesen. Bei Änderung des Zählers wird ein Skript ausgeführt, dass den Zählerwert um die Differenz zur Anzeige des eigentlichen Gaszählers erhöht. Mit zeitgesteuerten Skripten befülle ich Variablen wie den stündlichen, täglichen und monatlichen Verbrauch. Das Ganze läuft soweit zufriedenstellend.
Allerdings hat das Auslesen des Verbrauchswert aus dem „Energiezähler Gerät“ einen großen Nachteil. Dieser wird z. B. bei Batteriewechsel auf 0 gesetzt. Damit stimmt der in IP-Symcon geloggte Wert nicht mehr und muss durch Anpassung des Differenzwertes zum tatsächlichen Zählerwerts korrigiert werden. Wenn man das nicht mitbekommt - letztens passiert - hat man völlig sinnlose Werte geloggt.
Die CCU2 hält neben dem „Energie-Zähler Gerät“ den „Energiezähler CCU2“ vor. Dieser hat auch nach einem Reset des HM-Gaszählers den korrekten (und bereits korrigierte) Zählerwert. Leider wird dieser aber im Objektbaum nicht angezeigt.
Meine Frage also: wie kann ich den „Energiezähler CCU2“ auslesen? Muss ich mir dafür in der CCU eine Systemvariable anlegen oder kann ich den auch direkt abgreifen?

Das ist eine versteckte Systemvariable.
Installieren Mal das hier:
[Modul] Homematic Extended (Systemvariablen, Programme, Powermeter u.v.m.)
Aber bitte nur mit IPS 4.1 :slight_smile:
Die Instanz HomeMatic Powermeter liefert dann die Werte aus der CCU.
Michael

Hallo Michael,

vielen Dank für die schnelle Antwort. Ich habe das Modul installiert und entsprechende Freigaben auf der CCU2 eingestellt. Nach Erstellung einer Instanz „HomeMatic Powermeter“ werde ich aufgefordert einen Datenpunkt anzugeben. Was muss ich hier auswählen? Als Aktualisierung denke ich macht Push mehr Sinn - gerade im Sommer passiert schließlich fast gar nichts auf dem Gaszähler. Wie muss ich hier die virtuelle Fernbedienung einrichten. (Sorry - Neuland für mich!)

Gruß,

Uwe

Der Datenpunkt steht doch in der Doku:
Im Einstellungsdialog der Instanz ist entsprechend die zugehörige ‚ENERGY_COUNTER‘ Variable des Aktors auszuwählen, von dem der …

Dafür brauchst du nix weiter einrichten. Das Push-Event ist nur für die normalen Systemvariablen nötig.
Dazu einfach ein Programm in der CCU anlegen, alle Systemvariablen per oder bei aktualisieren rein und unter Dann als Ziel einen Datenpunkt der virtuellen Fernbedienung auswählen mit Tastendruck kurz.
Michael

Stehe auf dem Schlauch. Wenn ich das richtig verstehe, müsste ich als Datenpunkt den „Energy_Counter“ aus meinem existierenden HM-Gaszaehler Aktor angeben. Der wurde aber noch nie aktualisiert, erzeugt aber keine Fehlermeldung bei Auswahl. Wenn ich den „GAS_ENERGY_COUNTER“ auswähle - der den Wert des Gerät anzeigt - bekomme ich als Fehlermeldung Datenpunkt ungültig. In beiden Fällen ändert sich der Wert des HomeMaticPowermeter nicht. Was mache ich falsch?

Komisch. Muss ich Mal aufbauen. Kann mich nicht entsinnen das die Datenpunkte anders waren.
Kann sich aber natürlich durch ein FW-Update des Gerätes geändert haben.
Michael

Welche Fehler kann es noch geben? Ich habe das Gefühl, dass die CCU nicht erreicht wird. Wenn ich als Instanz Homematic Programme auswähle, werden auch nach Druck der Taste auslesen keine Progeamme angezeigt. Sehr wohl aber Systemvariablen, die ich in der CCU angelegt habe. Kann man den Zugriff auf die CCU prüfen?

Kommando zurück, Programme werden gefunden - die Kommunikation funktioniert also…

Ok, Firmware CCU2 ist 2.25.15 und Firmware Gaszähler ist 1.0. Ich hoffe das hilft weiter. Auf jeden Fall schon einmal Danke schön für die Mühe, die Du Dir machst!

Gruß,

Uwe

Hallo,

ich hab das bei mir direkt ohne Einbindung der Systemvariablen gelöst durch ein Skript gelöst. Bei einem Zurücksetzen durch einen Batteriewechsel kann es zu einer kleinen Ungenauigkeit kommen, da die Messungen zwischen der letzten Aktualisierung vor dem Batterietausch und dem Batterietausch verloren gehen. Das ist aber bei der Homematic Systemvariable meines Wissens auch der Fall.

Es werden 4 Variablen benötigt:

11112 /Variable für den Gesamtzählerstand/ FLOAT
11111 /Variable für den letzten Zählerstand/ FLOAT
11113 /Variable für den Zeitpunkt der letzten Aktualisierung/ INTEGER
11114 /Variable für den aktuellen Verbrauch/ FLOAT

lg, Andy

<?

$Wertzuletzt = GetValue(11111 /*Variable für den letzten Zählerstand*/);
$Wertaktuell= GetValue(12111 /*HM-Gaszähler*/);
$Zaehlerstand = GetValue(11112 /*Variable für den Gesamtzählerstand*/);
$letzteAktualisierung = GetValue(11113 /*Variable für den Zeitpunkt der letzten Aktualisierung*/);


if($Wertaktuell < $Wertzuletzt) /* Wenn der aktuelle Zählerstand kleiner als der letzte ist */
{
 if($Wertzuletzt > 8388600) /* Wenn der Zählerstand grösser als 8388600 ist, wurde der maximale Zählerwert überschritten */
 {
  $Delta = $Wertheute+8388608-$Wertzuletzt; /* den Zählerstand nach dem Überschreiten des Maximalwertes berechnen */
 }
 else
 {
  $Dealta = $Wertheute; /* Wenn der aktuelle Zählerstand kleiner als der letzte ist und das zurücksetzen vor 8388600 war, wurde der Zähler z.B. durch einen Batterietausch zurückgesetzt */
 }
}

$Zaehlerstand=$Zaehlerstand+$Delta;

/* Berechnung der Zeit zwischen den letzten beiden Aktualisierungen */
$Variable=IPS_GetVariable(12111 /*HM-Gaszähler*/);
$Aktualisierung=$Variable["VariableUpdated"];
$DeltaTime=$Aktualisierung-$letzteAktualisierung;

/* aktuellen Verbauch berechnen */
$Verbrauch=3600*$Delta/$DeltaTime;

/* Werte in die Variablen schreiben */
SetValue(11112 /*Variable für den Gesamtzählerstand*/,$Zaehlerstand);
SetValue(11111 /*Variable für den letzten Zählerstand*/,$Wertheute);
SetValue(11113 /*Variable für den Zeitpunkt der letzten Aktualisierung*/,$Aktualisierung);
SetValue(11114 /*Variable für den aktuellen Verbrauch*/,$Verbrauch);

?>

Klingt nach einer einfachen und guten Lösung. :slight_smile: Woher kommt der Wert 8388600 für den Zählerüberlauf? ist das der Maximalwert in der Homematic? Macht es dann nicht Sinn eine weitere Variable „Zählerdurchlauf“ als Integer einzufügen, die bei jedem Überlauf um 1 erhöht wird? Dann könnte man im Skript mit einem Vielfachen von 8388600 arbeiten? (Auch wenn das ein bißchen dauern dürfte, bis man man mehr als 2 Durchgänge schafft…

Gruß,

Uwe

Hallo,

stimmt nicht ganz: die 8388608 (2^23) ist der maximale Wert in der HM.
Die 8388600 sind ein etwas geringerer Wert, damit ich unterscheiden kann, ob es ein Überlauf war, oder ein zurücksetzen durch z.B. einen Akkutausch. Die Differenz zwischen 8388608 und 8388600 muss mindestens etwas grösser sein, als die Differerenz zwischen zwei Messungen. Im Prinzip könnte man auch nur die 2. IF Abfrage weglassen, man hat dann halt eine kleine Ungenauigkeit bei einem Überlauf.


if($Wertaktuell < $Wertzuletzt) /* Wenn der aktuelle Zählerstand kleiner als der letzte ist */
{
 $Dealta = $Wertheute; 
}

Natürlich könnte man statt einem ständigen Hochzählen auch noch eine Variable für den Multiplikator machen, ich versuche aber die Anzahl der Variablen möglichst gering zu halten, hab noch keine unlimitierte Lizenz und muss daher etwas mit den Variablen haushalten.

lg, Andy

Du machst nix falsch, ist schlicht ein Fehler im Modul.
Diese Konstellation hatte ich tatsächlich nicht bedacht.
Fix ist in Arbeit.
Michael

Ich hänge mich hier mal ran.

Ich bekomme immer nur 0 kwh angezeigt, obgleich eigentlich höhere Werte vorhanden sind. Die Abfrage scheint aber grundsätzlich zu funktionieren, denn die Abfrage des neuen RF Splitters funktioniert (tolle Leistung!) einwandfrei. Im Debug erfolgt auch keine Fehlermeldung.

Was mach ich falsch?

Gruß Dirk

Update kommt heute Abend.
Gas und IEC sind leider etwas anders.
Michael

Habe mal ein Update hochgeladen:
Version 2.2:
Fix: Powermeter-Instanz kann jetzt auch mit allen Varianten von HM-ES-TX-WM umgehen.
Fix: Powermeter-Instanz unterstützt jetzt auch HMIP-PSM und ähnliche HMIP-‚Mess-Steckdosen‘

Aktuell nur im Zweig ‚tester‘, da ich mit der Doku noch nicht fertig bin.

Release im master-Zweig kommt wohl morgen.

Die Instanz ‚Homematic Powermeter‘ unterstützt jetzt die Datenpunkte
GAS_ENERGY_COUNTER, IEC_ENERGY_COUNTER oder ENERGY_COUNTER als Quelle

Eventuell heißen die Variablen anders (z.B: Gesamter Verbrauch), dies seht ihr aber in der Original Instanz vom Gerät unter dem Reiter Statusvariablen.
Dort steht dann z.B.

Ident                  Name
GAS_ENERGY_COUNTER     Gas Verbrauch

Michael

Prima ich kann den Wert jetzt lesen. Allerdings ist der Wert um den Faktor 1000 zu niedrig. Er müsste 2533,30 sein. Angezeigt wird jedoch 2,5333. Ist das eine Konfigurationssache?

Ich habe momentan noch den Testerzweig aktuell. Kann ich auf den Master umschalten?

Wie dem auch sei vielen, vielen Dank für das modul und die schnelle Hilfe.

Gruß,

Uwe

Ach… Verd*#@&
Ich habe den Faktor bei Gas nicht raus genommen, das sind ja immer m³ oder ?

Bei kWh der Stromzähler passt es sonst auch nicht.
Michael
PS Update kommt nachher…Habe noch einen zweiten Fehler :wink:

Fix ist online.
Aktuell ist master und tester identisch.
in tester werde ich demnächst neue Funktionen einbauen, also ist die Wahl bei dir :smiley:

Michael

Das ist genau das wonach ich gesucht habe, nur leider mag es bei mir nicht laufen.
Habe die 4 Variablen oben angelegt und die Variable „Gesamtzählerstand“ mit dem aktuellen Wert des meines Stromzählers gesetzt. Ich muss dazu sagen das ich den Homematic Zähler an einem Stromzähler angeschlossen habe. Doch das sollte eigentlich keinen Unterschied machen. Das Skript habe ich mit mit meinen IDs der Variablen angepasst. Nur bekomme ich permanent den Fehler das die Variable „Delta“ und „Wertheute“ nicht existieren.
PHP-Error-Notice: Undefined variable: Wertheute bzw. Delta.
Verstehe nicht ganz wieso. Ich meine mal gehört zu haben das in einer IF abfrage erzeugte Variablen nicht ausserhalb nutzbar sind. Kann es daran liegen?
Führe ich jetzt wie gesagt das Skript aus bekomme ich folgende Fehler angezeigt:


PHP-Error-Notice: Undefined variable: Delta
   Error in Script C:\IP-Symcon\scripts\59402.ips.php on Line 21
Notice:  Undefined variable: Delta in C:\IP-Symcon\scripts\59402.ips.php on line 21
PHP-Error-Notice: Undefined variable: Delta
   Error in Script C:\IP-Symcon\scripts\59402.ips.php on Line 29
Notice:  Undefined variable: Delta in C:\IP-Symcon\scripts\59402.ips.php on line 29
PHP-Error-Notice: Undefined variable: Wertheute
   Error in Script C:\IP-Symcon\scripts\59402.ips.php on Line 33
Notice:  Undefined variable: Wertheute in C:\IP-Symcon\scripts\59402.ips.php on line 33

Das einzige was durch das Skript gesetzt wird ist der Timestamp in der Variable für die letzte Aktualisierung.

Könnte mir da jemand helfen?

So sieht derzeit mein Skript aus:


<?

$Wertzuletzt = GetValue(21728 /*Variable für den letzten Zählerstand*/);
$Wertaktuell= GetValue(21797 /*HM-Gaszähler*/);
$Zaehlerstand = GetValue(44229 /*Variable für den Gesamtzählerstand*/);
$letzteAktualisierung = GetValue(14663 /*Variable für den Zeitpunkt der letzten Aktualisierung*/);


if($Wertaktuell < $Wertzuletzt) /* Wenn der aktuelle Zählerstand kleiner als der letzte ist */
{
 if($Wertzuletzt > 8388600) /* Wenn der Zählerstand grösser als 8388600 ist, wurde der maximale Zählerwert überschritten */
 {
  $Delta = $Wertheute+8388608-$Wertzuletzt; /* den Zählerstand nach dem Überschreiten des Maximalwertes berechnen */
 }
 else
 {
  $Dealta = $Wertheute; /* Wenn der aktuelle Zählerstand kleiner als der letzte ist und das zurücksetzen vor 8388600 war, wurde der Zähler z.B. durch einen Batterietausch zurückgesetzt */
 }
}

$Zaehlerstand=$Zaehlerstand+$Delta;

/* Berechnung der Zeit zwischen den letzten beiden Aktualisierungen */
$Variable=IPS_GetVariable(21797 /*HM-Gaszähler*/);
$Aktualisierung=$Variable["VariableUpdated"];
$DeltaTime=$Aktualisierung-$letzteAktualisierung;

/* aktuellen Verbauch berechnen */
$Verbrauch=3600*$Delta/$DeltaTime;

/* Werte in die Variablen schreiben */
SetValue(44229 /*Variable für den Gesamtzählerstand*/,$Zaehlerstand);
SetValue(21728 /*Variable für den letzten Zählerstand*/,$Wertheute);
SetValue(14663 /*Variable für den Zeitpunkt der letzten Aktualisierung*/,$Aktualisierung);
SetValue(28672 /*Variable für den aktuellen Verbrauch*/,$Verbrauch);
?>

Vielen Dank im Voraus
Gruß