Zähler auslesen

die beste Variante ist drahtgebunden, und hier ist Ethernet das Mittel der Wahl…
ob das immer effizient ist, ist ne andere Frage :wink:

ob das immer effizient ist, ist ne andere Frage

Wie soll ist das jetzt einordnen ? :eek: Gehe ich in der Annahme richtig, dass es noch eine bessere Variante gibt ? Oder wird hier nur der Stromverbrauch des Ynode kritisiert ? :smiley:

das ist ne philosophische Diskussion: die beste Anbindung im Sinne von Stabilität, Kompatibilität und Störfestigkeit ist Ethernet.
Aber weniger effektiv ist es, wenn man dafür 30m Wand aufschlitzen muss. Da wird man vermutlich eher zu Funk greifen :wink:
Mit anderen Worten: solange du die Rahmenbedingungen nicht festlegst, bekommst Du Antworten, die die u.U. nicht gefallen :smiley:

<Rahmenbedingung EIN>

Ethernet ist Vorort

<Rahmenbedingung AUS>

:smiley:

prima, dann spielt also nur noch Geld eine entscheidende Rolle :smiley:

@Status:

Die IR-Leseköpfe passen auf EMH - Fotos anbei:

Viele Grüße aus dem sonnigen Unterallgäu
Harry

Hallo zusammen,

beide Leseköpfe arbeiten und bringen als YPORT und ZPORT über den YNODE sinnvolle Daten. Lediglich die Wirkleistung am Zweiwegezähler passt nicht, aber das wurde weiter oben schon angemerkt.

Dank Udos Unterstützung habe ich die Köpfe zunächst mit PUTTY abgefragt. Nachdem dort Daten ankamen war klar dass Hardware, Verkabelung und Netzwerk in Ordnung sind.

Die Einbindung in IPS (Schnittstelle, Cutter, RegVariable usw.) war dann kein Problem mehr, da das an anderer Stelle bereits beschrieben wurde (Danke an die Ersteller und an Rainer für sein Auserteskript!).

Viele Grüße aus dem sonnigen Unterallgäu
Harry

Lediglich die Wirkleistung am Zweiwegezähler passt nicht,

Könntest Du mir mal einen Dump in Hex zukommen lassen.

Hallo Rainer,

zunächst Danke für Dein Auswerteskript. Ich hatte es als Basis hergenommen.

Im Anhang ein Dump nach dem Cutter von meinem YPORT (das ist der Zweiwegezähler).

Hier mein aktuelles Skript:


<?
/* globale Funktionen & IDs einbinden */
include('34724.ips.php');

// Auswertung der SML-Daten am YPORT des YNODE


if($_IPS['SENDER'] == "RegisterVariable") {
	// Uhrzeit merken
	$time          = time();
	$datum_uhrzeit = strftime('%d.%m.%y %H:%M', $time);
	SetValueString(40765 /*[eHZ YPORT\Register Variable eHZ YPORT SML\letzte Messung]*/, $datum_uhrzeit);

	// Hersteller Obiskennung:129-129.199.130.3*255 Hex:81 81 C7 82 03 FF
	if(strpos($_IPS['VALUE'], chr(0x81).chr(0x81).chr(0xC7).chr(0x82).chr(0x03).chr(0xFF)) !== false) {
		$wert =        explode(chr(0x81).chr(0x81).chr(0xC7).chr(0x82).chr(0x03).chr(0xFF), $_IPS['VALUE']);
		$hersteller = substr($wert[1], 5, 3);
		SetValueString(55351 /*[eHZ YPORT\Register Variable eHZ YPORT SML\Hersteller]*/, $hersteller);
	}
	// actSensorTime
	if(strpos($_IPS['VALUE'], chr(0x72).chr(0x62).chr(0x01).chr(0x65)) !== false) {
		$wert =        explode(chr(0x72).chr(0x62).chr(0x01).chr(0x65), $_IPS['VALUE']);
		SetValueString(59522 /*[eHZ YPORT\Register Variable eHZ YPORT SML\Datum Uhrzeit]*/, strftime('%d.%m.%Y %H:%M:%S', mktime(9, 52, 24, 7, 6, 12) + hexdec(Str2Hex(substr($wert[1], 0, 4)))));
	}
	// Zählerstand (Wirk-Energie Total Bezug) Obiskennung:1-0.1.8.0*255 Hex:01 00 01 08 00 FF
	if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x00).chr(0xFF)) !== false) {
		$wert =        explode(chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x00).chr(0xFF), $_IPS['VALUE']);
		SetValueFloat(48566 /*[eHZ YPORT\Register Variable eHZ YPORT SML\1.8.0 Zählerstand Verbrauch]*/, SML_Zaehlerstand($wert[1]));
	}
	// Zählerstand (Wirk-Energie Total Lieferung) Obiskennung:1-0.2.8.0*255 Hex:01 00 02 08 00 FF
	if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x00).chr(0xFF)) !== false) {
		$wert =        explode(chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x00).chr(0xFF), $_IPS['VALUE']);
		SetValueFloat(28850 /*[eHZ YPORT\Register Variable eHZ YPORT SML\2.8.0 Zählerstand PV]*/, SML_Zaehlerstand($wert[1]));
	}
	// Wirkleistung (Wirk-Leistung Total) Obiskennung:1-0.15.7.0*255 Hex:01 00 0F 07 00 FF
	if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x0F).chr(0x07).chr(0x00).chr(0xFF)) !== false) {
		$wert        = explode(chr(0x01).chr(0x00).chr(0x0F).chr(0x07).chr(0x00).chr(0xFF), $_IPS['VALUE']);
		SetValueFloat(34801 /*[eHZ YPORT\Register Variable eHZ YPORT SML\Wirkleistung Verbrauch]*/, SML_Zaehlerstand($wert[1]));
	}
}

Der Zahlenwert kommt dann aus dieser Funktion:


function SML_Zaehlerstand($hexstring) {
	$pos1 = strpos($hexstring, chr(0x52).chr(0xFF)) + 3;
	$pos2 = strpos($hexstring, chr(0x01).chr(0x77).chr(0x07));
	$laenge = $pos2 - $pos1;
	if(($laenge > 0) && ($laenge < 6)) {
		$value = substr($hexstring, $pos1 - 1, 1);
		switch ($value) {
			case 'U' : $teiler = 10;    break; // 55h
			case 'V' : $teiler = 10000 /*[Objekt #10000 existiert nicht]*/; break; // 56h
			default  : $teiler = 1;     break;
		}
		$ergebnis = hexdec(Str2Hex(substr($hexstring, $pos1, $laenge)))/$teiler;
		return $ergebnis;
	} else {
		return;
	}
}

Viele Grüße aus dem Unterallgäu
Harry

dumpt.txt (1.01 KB)

Ich kann dir nicht ganz folgen. Das Script ist fix und fertig mit allen Umrechnugen. :confused:

Da wird keine Funktion oder sonstwas benötigt.

PS. Das sind aber nicht die Originaldaten vom Zähler. Die Startsequenz fehlt und noch mehr. Wenn das irgendwo anderst schon verhackt wird, bin ich hier raus.

Hallo Rainer,

es liegt nicht an Deinen Funktionen, die sind in Ordnung und liefern den Wert der in den SML-Bytes geliefert wird.

Mein Problem ist der Wert selbst. Wen man PV-Leistung des ersten Zählers und Wirkleistung des zweiten Zählers in einer gemeinsamen Grafik sieht, erkannt man, das Sie nahezu parallel verlaufen. Auch wenn keiner zu Hause ist ändert sich die Wirkleistung, dabei sollte doch dann nur der Grundverbrauch gemessen werden. Irgendwie habe ich das mit der Wirkleistung vielleicht nicht verstanden.:confused:

Michael hatte das im Beitrag #9 auch schon geschrieben.

Beim emh habe ich lediglich das Problem dass er die aktuelle Wirkleistung nicht richtig anzeigt. Soweit ich das beurteilen konnte zeigt er die Einspeiseleistung auch mit an (addiert), also immer wenn PV Produktion höher als der aktuelle Verbrauch ist. Muss eben etwas getüftelt und ausprobiert werden.

@Michael: Hast Du das Lösen können? Einfach nur PV-Leistung substrahieren?

Die Funktion des Umrechnens habe ich ausgelagert und ermittle die Länge der Werte (4-6 Bytes) und den Teiler (10 oder 10000) aus den SML-Angaben (52 FF, 01 77 07, 55, 56 usw.) automatisch.

Viele Grüße aus dem Unterallgäu
Harry

Auch wenn keiner zu Hause ist ändert sich die Wirkleistung

Ja sicher ändert sie sich, außer Du schaltest den Hauptschalter vorm Zähler aus. :smiley:

Ich weis ja nicht was Du alles an Geräten laufen hast aber ein Boiler, Gefrierschrank/truhe usw. arbeiten auch, wenn Du nicht zuHause bist. :wink:

Hallo Rainer,

klar ist der Verbrauch auch in Abwesenheit nicht konstant, aber ich habe über 35 Plugwise-Steckdosen und kenne meine"Pappenheimer". Die Zählerauswertung läuft erst seit gestern so richtig und heute tagsüber hatte ich Sprünge von mehreren hundert Watt bei der Wirkleistung, obwohl keiner zu Hause war. Nachdem die Zählerstände aber konstant und entsprechend der Display-Anzeigen sind, kann ich Mess- und Umrechnungs- oder Auswertefehler fast ausschließen. Es ist wohl so wie es Michael auch geschrieben hat, dass der EMH (den habe ich ja auch) die PV-Leistung mit verwurschtelt und da gibt es durch Wolken schon mal heftige Leistungssprünge im den 5-Minuten-Abständen der Messungen.

Mal sehen wie Kurven morgen aussehen.

Viele Grüße
Harry

Moin,

das Wochenende hatte ein Zeitfenster zum Einbinden der Zählerauslesung.
Ich „frickel“ jetzt nur mit der Auswertung.

Also die Obis Kennzahlen in der Version 2.2 habe ich vorliegen. Ich finde nur nix wie die eigentlichen Messwerte ausgegeben werden. Ich lese hier was von Kommaverschiebung … wo finde ich dazu die Doku ?

Ups, mit Michael bin ja ich gemeint. Habe das Thema hier total aus den Augen verloren.

Einfach nur subtrahieren geht … nicht. Dann hast Du Nachts, wenn die PV nichts bringt, negative Werte als aktueller Verbrauch.

Ich habe, wenn ich mich jetzt recht erinnere, folgendes eingestellt:

  • wenn PV großer akt. Wirkleistung, dann Wirkleistung = PV - akt. Wirkleistung, sonst Wirkleistung = akt. Wirkleistung

Da ich machmal etwas den Überblick verliere und das programmieren nicht wirklich gelernt habe, stimmen die Ergebnisse nicht 100%ig, da die beiden Werte sich nicht im gleichen Rythmus ändern. Verschandelt teilweise etwas die graphen.

@Rainer: Ich würde Dir gerne eine dump Datei hochladen … finde aber den Knopf nicht … ahhh, da ist er ja. Datei ist im Anhang, dump vom emh Zähler, teilweise schon „strukturiert“.

Viele Grüße

Michael

dump_emh_inkl-pv.txt (16.1 KB)

Endet jeder Datensatz mit FF (255) ?
Also Odisnummer,FF, Wert,FF ?

Wo, ist denn dein problem. Schon mal ein Script ausprobiert.

Ja habe ich … ich verstehe nur nicht woher ihr wißt wie lang die eigentlichen Daten sind.

1 0 1 8 2 FF

ist die Odis Kennziffer diese endet doch immer mit 255 (FF)

dann folgt
1 1 62 1E 52 FF

ich gehe davon aus das die ersten 5 Ziffern Nutzdaten sind und FF mir das Ende der Daten kennzeichnet.

Einige Datensätze sind aber auch länger …

Woher wißt ihr wieviel Stellen der Datensatz hat ??

Kann in der Doku zu den Odisziffern auch nix dazu finden.

Es gibt eine SML Spezifikation und ein Lastenheft, dort kann man solche Sachen nachlesen.

Sry ist mir zu hoch … oder es ist einfach zu spät !

Ich steige durch die Doku nicht durch …:cool:

Irgendwie finde ich nicht das was ich suche.

Ich habe es so verstanden das der Zähler ständig sein Protokoll sendet und wir es einfach abfangen und zerhacken. Ich also selber keine Anfrage stelle welche Daten ich haben möchte.

Die einzelnen Kennziffern finde ich auch nur wodurch werden die einzelnen Werte getrennt ?
Ich finde es auch in der Doku nicht oder es ist mir einfach zu hoch und mein Gehirn blendet es aus !:confused:

47 75 74 65 20 4e 61 63 68 74