Verbrauchsmessung EM1000-IR mit HMW-IO-12-Sw14-DR

Hi Stefan,

Ich war mal so frei und habe aus Deiner PN-Anfrage ein neues Thema erstellt. Bestimmt haben andere User ähnliche Probleme und Lösungen und am Ende profitieren alle durch eine öffentliche Diskusion. :wink:

Nun zu Deiner Frage. Ich denke, dass EM1000 bei jedem Vorbeilauf der roten Markierung auf der Zählerscheibe einen Impuls sendet. Bei 12,7 Sekunden pro Umdrehung sind das 1/12,7s = 0,0787Hz = 78,7mHz. D.h. da stimmt was nicht mit Deiner Anzeige wenn Du dann über 50000mHz angezeigt bekommst!
Evt. hast du da was falsch angeschlossen. Bei mir wird der Eingang des Homematic Modul durch den Optokoppler des S0 Ausgang meines Zählers gegen Masse geschaltet. Ich vermute, dass Du den 5V Impulsausgang direkt an den Eingang gelegt hast. Vermutlich liegt hier das Problem. Benutze doch auch einen Optokoppler. Die Sende LED schliesst Du über einen Widerstand an den EM1000 Ausgang und den Fototransistor des Optokopplers mit dem Kollektor and den HM-Eingang und den Emitter an HM - Masse.

Zur Berechnung:

Jetzt ist natürlich Interessant wie oft sich Deine Scheibe bei einer bestimmten Energiemenge dreht. Dies müsste auf dem Zähler angegeben sein. Typischerweise sind dies 75 Umdrehungen pro 1 kWh. D.h. wenn Du einen Verbraucher mit konstant 1000W betreibst dreht sich die Scheibe 75 mal in einer Stunde was in Deinem Fall 75 Impulse / Stunde bedeutet. Dies fasst Du nun in einer Gleichung zusammen:

P = Leistung in kW = 1000W
f = Frequenz = Impulszahl pro Zeiteinheit
ZK = spezifische Zählerkonstante

P = f * ZK

Umstellen nach ZK:

ZK = P / f

Einsetzen:
P = 1 kW = 1000W
f = 75 Imp / h = 75 / 3600s = (75/3600) Hz

ZK = 1000W / ( 75 / 3600s) = (1000W * 3600s) / 75

ZK = 48000 Ws

Test:

P = f *ZK = (75/3600s) * 48000Ws = 1000W -> OK

Wenn Dein Zähler auch 75 Umdrehungen/kWh macht, hättest Du bei 12,7 Sekunden pro Umdrehung

P = 0,0787Hz * 48000Ws = 3777,6W

bzw.

P = 79mHz * 48Ws = 3792W

D.h. zur Berechnung der Leistung musst Du den Homematic Wert in mHz mit 48 multiplizieren um der Leistung in Watt zu erhalten.

Achtung: Du misst hier eine Leistung(W) und keine Energie!(kWh) Die Energie ist die aufsummierte Leistung zu einem Zeitpunkt über einem Zeitinterval (Integral).
Wenn Du die Energie = Zählerstand ermitteln willst, musst du nur die Impulse zählen. In diesem Beispiel ist es dann:

(Anzahl der Impulse / 75) = Energie in kWh.

Dies kann in diesem Beispiel sogar mit einem normalen Homematic Digitaleingang funktionieren, da Deine Impulsfrequenz moderat ist. Umgekehrt wirst Du aber über den Frequenzeingang der HMW-IO-12-Sw14-DR geringe Leistungen nicht messen können. Die HMW-IO-12-Sw14-DR hat eine maximale Frequenzauflösung von 1 mHz = 0,001Hz => P = 0,001Hz * 48000Ws = 48W !

Ich war mal so frei und habe aus Deiner PN-Anfrage ein neues Thema erstellt.

Klar - ich hab das nur nicht sofort gepostet, da ich mich in diesem Forum noch nicht so gut auskenne und daher nicht wusste, ob das Thema überhaupt von allgemeinem Interesse ist.

Vielen Dank auf jeden Fall für die ausführliche Beschreibung! Damit sollte ich die Mathematik wohl in den Griff bekommen.

Nun zu Deiner Frage. Ich denke, dass EM1000 bei jedem Vorbeilauf der roten Markierung auf der Zählerscheibe einen Impuls sendet.

Ja genau so ist das - nachdem ich die Empfindlichkeit am EM1000 etwas erhöht habe zeigt die LED zuverlässig den Durchgang der roten Markierung an und das Signal steht an dem Basis-Gerät über eine externe Buchse zur Verfügung (den ganzen FS-20 Funk-Raffel nutze ich also gar nicht) . Genau wie du vermutest hast habe ich dieses Ausgangssignal ganz stumpf auf einen Digitaleingang des HM-Moduls geklemmt (der als Frequenzmesser konfiguriert wurde) aber ich erhalte scheinbar völlig falsche Werte.

Das mit dem Optokoppler klingt ja machbar - mal gucken ob ich noch einen PC817 in der Grabbelkiste hab. Das würde dann in etwa so aussehen: AVR Beschaltung mit Optokoppler

Falls das damit klappt müsste ich dann also Messwerte um 70-80mHz bekommen - bin mal gespannt, ob das dann auch irgendwie mit dem Stromverbrauch im Haus korreliert also Mikrowelle mit 500W anschalten müsste zu einer Erhöhung von 70mHz auf ca. 81mHz führen (1W = 0,0208 mHz, 500W=10,42mHz + Etwas Verlust).

Wenn es funktioniert (und Interesse besteht) kann ich auch noch mal etwas ausführlicher den Aufbau beschreiben ausserdem glaube ich, dass man das Mobilteil mit dem FS-20 Sender komplett wegoptimieren könnte und nur den EM1000-IR an die HMW-IO-12-Sw14-DR klemmen kann.

Stefan.

Hallo Stefan,

Willkommen im IPS Forum! :smiley:

Dein Optokoppler Link ist genau das, was ich meinte. Aber wie gesagt, erwarte nicht eine genaue Auswertung. Dazu ist die Frequenzmessung zu ungenau.

Bin aber gespannt auf Deine Ergebnisse.

Hi,

habe den Schaltausgang des EM1000 auch direkt am Digital Eingang angeschlossen.
Diesen aber auf DIGITAL gelassen und nicht auf Analog/Frequenz umgestellt.
Jetzt bekomme ich bei jedem Durchgang der roten Markierung einen Impuls.

In IPS ein Script erstellen welches angesteuert wird, wenn der Impuls auf TRUE steht.

Dann noch 2 Variablen anlegen vom Typ Float.
Einmal Verbrauch und einmal Zählerstand.

Im Script dann:

<?
   $script_info = IPS_GetObject($IPS_SELF);
   $parent_info = IPS_GetObject($script_info['ParentID']);
	IPS_LogMessage($parent_info['ObjectName'],'Script Start: '.$IPS_SENDER);

	$wert=GetValueFloat(50078 /*[Info\Energie\Stromzählerstand]*/);

	// Zählerwert KW/ U(min
	SetValueFloat(50078 /*[Info\Energie\Stromzählerstand]*/,$wert+(1/120));


	$VarTrigger = IPS_GetVariable(50078 /*[Info\Energie\Stromzählerstand]*/);
	$VarStand = IPS_GetVariable(19729 /*[Info\Energie\Stromverbrauch]*/);
	$TimeTrigger = $VarTrigger['VariableUpdated'];
	$TimeStand = $VarStand['VariableUpdated'];

	//echo "Zeit: ".($TimeTrigger-$TimeStand);

	SetValueFloat (19729 /*[Info\Energie\Stromverbrauch]*/,30000/($TimeTrigger-$TimeStand));

?>

Mein Zähler macht 120/U pro KW. Das mußt Du eventuell anpassen.

Der Verbrauch wird jetzt anhand der Zeit zwischen 2 Triggerungen berechnet.
Zudem wird ein Zähler immer erhöht. Das ist dann der Zählerstand wie am Original. (Muß nur einmal gesetzt werden)

Zu beachten ist, wenn CCU oder IPS neugestartet wird, sind die Zählerstände unterschiedlich.
Ich hoffe es hilft.

Gruß
MCS-51

So Script Anfängertauglich gemacht.

In der Zeile 3 die Drehzahl des Stromzählers eintragen.
Bei 120U/min Pro KW ist 120 einzutragen.

In Zeile 4 ist die ObjectID des EM1000 Eingangs angeben.
In dem Fall der Eingang des HMW-IO-12-Sw14-DR o.ä.
Welches Gerät ist Egal. Bitte nicht den Eingang auf Frequenz/Analog umstellen.
Es wird ein Boolean Wert True/False benötigt.
Der Wert sollte TRUE sein, wenn die rote Markierung gerade durchläuft.

Installation:

  • Neues Script anlegen.
  • Konfigurieren
  • einmal ausführen
  • In der Variable ‚Zählerstand‘ den aktuellen Zählerstand des Zählers aus der E-Verteilung eintragen
  • Fertig

Das Script legt die entsprechenden Variablen und Triggerung an.
Das Script benötigt 2 Triggerungen. Erst dann kann der Verbrauch korrekt berechnet werden.

So hier das besagte:


<?

	$drehzahl = 120;     // Drehzahl der Scheibe pro KW
	$em1000ID = 38907 /*[.Geräte\HM-Devices\Modul Waschküche\StromImpuls\STATE]*/;    // Bitte hier die ObjectID des EM1000 eintragen


	/**  AB HIER BITTE NICHTS MEHR ÄNDERN
 	*
	*/

	// Stunde in Sekunden * KW / Drehzahl
	$konstante = (3600 * 1000) / $drehzahl;

    $script_info = IPS_GetObject($IPS_SELF);
	IPS_LogMessage($script_info['ObjectName'],'Script Start: '.$IPS_SENDER);

    $instanceID = $IPS_SELF;

	/** Events anlegen.
 	*
	*/
    if(@IPS_GetEventIDByName("Event".$em1000ID, $IPS_SELF) === false)
   {
         $ereignis = IPS_CreateEvent(0);
         IPS_SetEventTrigger($ereignis, 4, $em1000ID);
			IPS_SetEventTriggerValue($ereignis,True);
         IPS_SetParent($ereignis, $IPS_SELF);
         IPS_SetName($ereignis, "Event".$em1000ID);
         IPS_SetEventActive($ereignis, true);
   }


	/** Variablen anlegen.
 	*
	*/
    if ( (@!IPS_GetVariableIDByName("Zählerstand", $instanceID) ) > 0)
	 {
       $zaehlerID = CreateVariableByName($instanceID, "Zählerstand", 2, "");
 		 IPS_SetVariableCustomProfile ($zaehlerID, "~Electricity");       		// Variablenprofil einstellen
	 }

    if ( (@!IPS_GetVariableIDByName("Verbrauch", $instanceID) ) > 0)
	 {
       $verbrauchID = CreateVariableByName($instanceID, "Verbrauch", 2, "");
 		 IPS_SetVariableCustomProfile ($verbrauchID, "~Watt.14490");       		// Variablenprofil einstellen

	 }

    $zaehlerID = IPS_GetVariableIDByName('Zählerstand', $instanceID);
    $verbrauchID = IPS_GetVariableIDByName('Verbrauch', $instanceID);


	// Zählerwert KW/ U(min
	SetValueFloat($zaehlerID,GetValueFloat($zaehlerID)+(1/$drehzahl));


	/** Leistung berechnen.
 	*
	*/
	$VarTrigger = IPS_GetVariable($zaehlerID);
	$VarStand = IPS_GetVariable($verbrauchID);
	$TimeTrigger = $VarTrigger['VariableUpdated'];
	$TimeStand = $VarStand['VariableUpdated'];

	SetValueFloat ($verbrauchID,$konstante/($TimeTrigger-$TimeStand));




/*
* =================== ViewJet Anzeige- und Kontroll-Skript ===================
* Erstellt eine neue Variable unter der $id mit dem Namen $Name und dem Type $Type
* ===================================================== (C) IP-Symcon 2010 ===
*/
function CreateVariableByName ($id, $name, $type, $profile = "")
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if ($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
        if ($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
}

?>

Hoffe Ihr könnt damit was anfangen.

Viel Spaß beim Strommessen.

Gruß
MCS-51

so das hat etwas länger gedauert - musst erst mal ein paar PC815 bestellen.

@MCS-51:

vielen Dank für den Sample-Code - ich verwende allerdings noch kein IPS und muss mich daher erst mal mit Boardmitteln begnügen. Zur Portierung auf Homematic hab ich mal einen Blick in die Doku geworfen und würde versuchen das über ein Script das bei der Werteänderung an dem Digitalport ausgeführt wird und eine Systemvariable setzt zu lösen.

Wenn der Frequenzzähler funktionieren würde käme ich wohl so an den Wert:

dom.GetObject(„BidCoS-Wired.[S/N_OBJECT]:[CHANNEL].STATE“).Value();

Die Konfiguration auf DIGIAL in Verbindung mit dem Direktansschluss werde ich jetzt als nächstes probieren, da meine Optokoppler-Experiemente ja kläglich gescheitert sind (s.u.). Allerding bin ich ja nicht sicher ob die „normale HM“ mit einer so hohen Anzahl von Scriptausführungen (alle 10 Sekunden) umgehen kann.

Müssen die Masse des HMs und des EM1000 eigentlich verbunden werden oder ist das egal?

@Heimgeist:

die Schaltung mit dem Optokoppler bekomme ich ja nicht zum Laufen - eigentlich kann man da ja nicht viel falsch machen:

Ich habe den Signalausgang des EM1000 über einen 220 Ohm Vorwiderstand an den Pin 1 des Optokoppler gegeben und die Masse mit Pin 2 verbunden (das ist ja wirklich idiotensicher). Dann habe ich Pin 3 an die 24V Masse des RS-485 Busses geklemmt (gibt ja auch keine andere Möglichkeit) und Pin 4 an den Eingang I7 gelegt und den auf „Analog“ konfiguriert.

Vermutlich ist ja in dem HM-Modul der Atmel so konfiguriert dass er die internen Pull-Up nutzt d.h. der Eingang liefert 5V die durch den Optokoppler auf Masse gezogen werden. Das sollte man dann auch nachmessen können d.h. beim Scheibendurchgang muss die Spannung kurz auf 0V oder so runter gehen. DAS ist aber schon nicht der Fall - Eingangsseitig kommt am Optokoppler aber ein Signal an. So kann der Frequenzzähler auch nicht funktionieren (wobei mir ja auch nicht klar ist, ob der überhaupt mit dem invertierten Signal zurecht kommt).

Any Ideas?

Hi,

geht genaus so auch auf der CCU.

Jedoch auch nicht mit Frequenz, da meiner Meinung nach die Abstände für die Impulse bei kleiner Leistung zu hoch ist.

Installation:

  • Systemvariable ‚Stromverbrauch‘ anlegen.
  • Systemvariable ‚Stromzaehlerstand‘ anlegen.
  • Programmverknüpfung anlegen gemäß angehängtem Bild
  • Script unten eingeben
  • Fertig

var obj1 = dom.GetObject('Stromzaehlerstand');
var obj2 = dom.GetObject('Stromverbrauch');
string sTime = system.Date("%Y-%m-%d %H:%M:%S");  !Hier wird Datum abgefragt und Variable zugeordnet

var x = obj1.State(obj1.State()+(1/120)); // 120 ist die Zählerdrehzahl ggf. anpassen; Zählerstand erhöhen
var ts1 = obj1.Timestamp(); // Zeitstempel Variable
var ts2 = obj2.Timestamp(); // Zeitstempel Variable
var tz = obj2.State(30000/(ts1.ToInteger()-ts2.ToInteger()));  //Verbrauch berechnen

Hoffe es hilft und nützt.
Ihr könnte ja mal Rückmeldung geben.

Die Massen des EM und HM müssen verbunden werden.
Bei mir funzt es bisher. Alle 10 Sekunden ein Impuls geht ja noch. Wenn der Strom größer wird, werden die Abstände auch kürzer.
Es kann schon sein, das es die CCU streßt, vielleicht habe ich ja jetzt den Grund gefunden, warum sie nach einigen Wochen langsamer wird. -:))) Werde es mal testweise abschalten. Als Frequenz wird es glaube ich nicht gehen. Weil die Impulsabstände zu groß sind und auch mal eine Minute mehr dauern können.

Seit neuestem habe ich noch ein Stromzähler in der E-Verteilung drin mit S0-Ausgang. Den bringe ich auch auf den HM.
Der Eingang steht aber auf Frequenzmessung, da der 800 Impule/KW liefert. Diesen werte ich aber nur in IPS aus.

Gruß

MCS-51

Hi,

so erste Tests ergaben die langsame CCU liegt nicht an den obigen Scripten und der häufigen Triggerung.

Probleme lokalisiert. Hatte das logging aller Meldungen in der CCU auf einem Syslog Server eingestellt gehabt.
Seit dem nur Fehler geloggt werden, läuft die CCU wieder sauber. Zuviel loggen ist scheinbat Streß für die CCU.

Trotz abgeschalteten Scripten tritt mein Fehler auf.

Gruß
MCS-51

Hi,

so hab nach der Gartenarbeit wieder einen Moment Zeit zum Basteln gehabt…

Ich habe das Optokoppler-Projekt erst mal abgebrochen und mich dem Vorschlag von MCS-51 zugewand.

Soooo einfach ist das ja alles aber nicht. Zunächst dachte ich „Masse HM und EM verbinden“ ist erledigt wenn man die 24V Masse nimmt - ist aber wohl nicht so, denn die allerersten erfolgreichen Resultate habe ich erst bekommen nachdem ich die Masse-Leitung des EM-Signalausgangs auf einen auf AUS konfigurierten Signalausgang gelegt hab.

Soweit so gut: dann hat es allerdings direkt so gut funkioniert die HM sich (vielleicht/vermutlich) auf Grund der vielen Protokollmeldungen wohl aufgehängt hat - Symptom: WebUI reagiert nicht.

Also: HM ausschalten und neu booten, dann alle Protokolleinstellungen rausnehmen und nochmal probieren - hat allerdings den gleichen Effekt: HM reagiert nicht mehr.

Dann hab ich mir das Programm noch mal genauer angesehe und hab ja so den Eindruck, dass man diese Zeile nicht wirklich braucht:

string sTime = system.Date("%Y-%m-%d %H:%M:%S");

aber stören sollte das auch nicht - dann hab ich noch mal testweise das Script so umgebaut, dass es nur zählt und die Zuweisung und das Auslesen der Werte getrennt (sollte aber eigentlich auch egal sein).

Das war dann mein nächster Versuch:

var obj1 = dom.GetObject(‚Stromzaehlerstand‘);
var obj2 = dom.GetObject(‚Stromverbrauch‘);
var x1 = obj1.State();
var x2 = obj1.State(x1+(1/150));
var y1 = obj2.State();
var y2 = obj2.State(y1+1);

aber wie zu erwarten: wieder ist die HM im einem nicht mehr benutzbaren Zustand.

Jetzt bin ich (mal wieder) etwas ratlos. Kann man irgendwie rausbekommen was die HM macht?

Eine andere Sache ist mir noch aufgefallen: die HM scheint beim Booten die „letzten“ Änderungen zu vergessen. Ich musste z.B. die Protokolllierung nach dem boot NOCHMAL zurücksetzen obwohl ich das 100% schon beim ersten Versuch gemacht habe…

Hi,
ich weiß ja nicht vielleicht haben wir uns falsch verstanden.

Voraussetzung für das Script ist EM1000WZ der an Deinem Stromzähler hängt.
Das Display brauchst Du nicht, das übernimmt das Script.

Dieser hat einen Ausgang, 3,5 mm Klinke. An diesem Ausgang findest Du Masse (GND) dieser wird an den GND (Minus) Anschluß des HM Aktors angeschlossen (DIREKT). Nicht über einen Ausgang o. ä.
Der zweite Anschluß ist der Steuerausgang. Dieser wird auf einen Eingang des HM Gerätes (z.B. I8) angeschlossen. Dieser bleibt parametriertechnisch auf Digitaleingang stehen.
Der Steuerausgang des EM schaltet 5V sobald der rote Streifen an der Lichtschranke vorbei kommt.

Die 24V Betriebsspannung des HM werden intern auf 5V runtergeregelt.

Die Protokollierung des Gerätes bitte in jedem Fall ausschalten oder was meinst Du? Für eine Protokollierung kommen die Meldungen zu häufig.

Das wars.

Eingang.jpg

Hi,

ich weiß ja nicht vielleicht haben wir uns falsch verstanden.

sorry ich hab wohl etwas wirr geschrieben - ich hatte den EM-Sensor genau so angeschlossen und konfiguriert wie du beschrieben hast. Signal vom EM an I7 (2.3) und Masse an HM GND (1.8) - hat aber nicht funktioniert (Script wurde nicht ausgelöst).

Ich hab jetzt alles noch mal GENAU nachgeprüft und ich glaube jetzt hab ich den Fehler: ich hatte Masse und Signal vom EM-Sensor vertauscht!

Jetzt habe ich seit ein paar Minuten einen sinnvollen Impulszähler und die HM funktioniert noch - so weit war ich noch nie - ich lass das jetzt erst mal so mit dem einfachen Zählscript und gucke ob es morgen noch läuft und die Zählerstände in etwa stimmen. Ich bin ja vorsichtig optimistisch …

Das war ja eine schwere Geburt - vielen Dank schon mal für eure Geduld