Elektrozähler, Gas- und Wasseruhr an IP-Symcon

Moin Moin an alle,
ich wollte dieses Jahr noch das Projekt -Energiezähler- fertig stellen. Hierfür möchte ich mir die Hardware vom Volkszähler bestellen und bin mir nicht sicher, wie ich die in IP-Symcon integriere und ob es überhaupt geht.

Elektrozähler (Itron ACE3000 Typ 260) soll über IR vom Y-Node ausgelesen werden
Gas- und Wasseruhr über S0 vom Z-Node
Projektbeschreibung http://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/itron_ace3000_type_260
Lesekopf: http://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-ttl-ausgang
Übertrager: http://wiki.volkszaehler.org/hardware/controllers/yport-node
S0-Erweiterung: http://wiki.volkszaehler.org/hardware/controllers/s0-erweiterung_fuer_yport-node

Der „Hersteller“ hat mir auf meine Frage folgende gemailt

Der YPORT leitet die Daten von den IR-Köpfen auf <IP>/7970 bzw 7980 als Raw-Daten ins Netz.
Die S0-Impulse werden von dem Programm watchasync in der Ethersex-Firmware als HTTP Get- oder Post-Request ins Netzwerk geleitet.
Ich habe mal Bilder von der Konfiguration von watchasync angefügt.

Hier müsste ich mal eure Hilfe haben, wie man so etwas angeht.

Kann ich davon ausgehen, dass das Projekt so nicht geht?
Auch negative Aussagen nehme hin, wäre aber über Alternativen dankbar.

möchte ich meine Anfrage noch einmal aktualisieren.
Vielleicht „klinken“ sich die Entwickler zum Thema -Smart Metering- auch ein.

Hallo Marcus,

ich habe soetwas bei mir in Zukunft auch noch vor.

Ich würde es allerdings etwas anders machen.

Schau doch mal ob du für deinen Wasserzähler ein Impulsmodul bekommst. Diese Module braucht man nur auf den Wasserzähler stecken. Ist allerdings von Hersteller und Model abhängig.
Bei Almess nennt sich sowas z.B. Cyble Kommunikationsmodul.

Dein Stromzähler scheint ja schon einen Impulsausgang zu haben.

Beim Gaszähler bin ich gerade überfragt.

Dann ein Hardwarewodul was die Impule aufnimmt und an IPS übertragen kann. Beim KNX (wie bei mir) könnte das Beispielsweise ein Binäreingang sein.

Da ich zur Zeit selbst noch kein IPS habe, kann ich dir zur Einrichtung leider nichts sagen. Vielleicht konnte ich dir ja trotzdem etwas helfen was die Haustechnik angeht.

Gruß

Moin King-Nova und vielen Dank für deinen Tip.
Die Zähler (Strom, Wasser und Gas) werden schon über S0-Impulse gezählt, soeweit alles gut.
Diese Konstellation hat nur einen Haken … ich habe eine PV-Anlage und somit auch einen Zweirichtungszähler. Über den Impulsausgang ist es mir dabei nicht möglich den zum EVU eingespeisten Strom zu zählen. Die einzige Möglichkeit ist das auslesen über die IR-Dioden des Zählers. Der oben genannte Geräteaufbau funktioniert auch aber ob ich ihn mit IP-Symcon aus/mitlesen kann, dass ist hier die Frage.

Da ich leider bis auf King-Nova keine Resonanz bekommen habe und dieses Thema für mich sehr wichtig ist, bin ich jetzt bei gegangen und habe die Komponenten jetzt besorgt.

Leider hakt es schon am Anfang. Ich habe den YPORT ins Netz gehängt und ist mit einem Browser auch erreichbar. In IPS habe ich jetzt ein UDP Socket laut Bild erstellt. Leider scheint sich nichts zu rühren. Mache ich schon im Ansatz was falsch? Das kann doch nicht unmöglich sein?

Bei meiner Suche bin ich auch auf diesen Beitrag gestossen, weiß aber nicht ob er mit meinem Thema zutun hat.

Ich bin mir nicht sicher wie ich mit der Situation bez. diesem Thread umgehen soll. Einerseits bin ich mit diesem Forum sehr zufrieden, weil hier viele User sehr aktiv sind. Andererseits bin ich stinksauer, das ich mit meinem Thema alleine stehe. Ich bin in einem Forum was vom Hersteller zur Verfügung gestellt und betreut wird. Wenn mir User nicht helfen können ist das Schade aber letztendlich OK. Ich erwarte aber, das der Hersteller sich hierzu äußert. Ich denke, dass fast alle Forumteilnehmer auch Kunden sind.

Auch wenn ich kein PHP-Profi bin, habe ich das Gefühl, das es gehen kann. Folgende Fakten habe ich jetzt gesammelt …

  • der OKK lässt sich per Telnet abfragen. Mittels Putty erfolgreich getestet.
  • mittels Volkzählersoftware werden die Daten in eine SQL Datenbank geschrieben.
  • der LAN Adapter sendet Daten auf einen UDP Port. MEIN Favorit.
    Da muss doch was machbar sein.

Außerdem bin ich der Meinung, dass das Thema Smart-Metering ein Unterforum verdient hat. Ein sehr wichtiges und spannendes Zukunftsthema. Was meint ihr?

In der Kürze liegt die Würze … send with Tapatalk

Hallo Marcus,

ich habe Deine PN erhalten und möchte gerne „öffentlich“ antworten damit vielleicht auch andere User einen Nutzen davon haben.

Der Udo von volkszaehler.org hat Recht, ich habe zwei IR-Leseköpfe an meinen neuen Stromzählern und lese die Daten über IPS aus.

Wie bin ich vorgegangen:
Zunächst die Hardware aufbauen und sicherstellen, dass die Leseköpfe richtig sitzen und vor allem die Verkabelung zum YPORT passt. Dann über einen Browser eine Verbindung zum YPORT aufbauen und eine IP-Adresse passend zum eigenen Netzwerk vergeben. Im Browser meldet sich dann an dieser IP die „Ethersex Welcome Seite“ des YPORT.

Nachdem das alles funktioniert geht es erst in IPSymcon los. Da ich zwei Leseköpfe habe, gibt es bei mir den YPORT und den ZPORT, der Einfachheit halber beschreibe ich nur die Tätigkeiten für den YPORT.

[ul]
[li]Zunächst braucht es einen Client-Socket mit der IP-Adresse des YPORT und den Port 7970 (ZPORT hat Port 7980).[/li][li]Danach eine Cutter-Instanz die sich darauf bezieht. Hier als linke Trennzeichen „01 01 01 01“ HEX und als rechte Trennzeichen „1B 1B 1B 1B“ HEX setzen.[/li][li]Jetzt eine neue RegisterVariable mit diesem Cutter als übergeordnete Instanz.[/li][li]Die RegVar benötigt ein Script zur Auswertung der Daten: „SML Auswertung YPORT“[/li][/ul]

Hier mein (gekürztes) Script:


<?
// Auswertung der SML-Daten am YPORT des YNODE


// das Skript nur alle 5 Minuten und innerhalb der ersten 2 Sekunden ausführen lassen, sonst abbrechen
$time = time();
$akt_min = (int)strftime("%M", $time);
$akt_sec = (int)strftime("%S", $time);
$alle_5_minuten = ($akt_min % 5);
if (($alle_5_minuten<>0) || ($akt_sec>2)) { return; }

// nur auf Änderungen der RegisterVariablen reagieren
if($_IPS['SENDER'] == "RegisterVariable") {
	// aktuelle Uhrzeit merken
	$datum_uhrzeit = strftime('%d.%m.%y %H:%M', $time);
	SetValueString(40765, $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, $hersteller); // z.B. EMH
	}
	// 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, 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, 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, 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']);
		$verbrauch   = SML_Zaehlerstand($wert[1]) - GetValueFloat(48447); // 48447 = Wirkleistung ZPORT
		SetValueFloat(34801, $verbrauch);
	}
}
return;

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; break; // 56h
			default  : $teiler = 1;     break;
		}
		$ergebnis = hexdec(Str2Hex(substr($hexstring, $pos1, $laenge)))/$teiler;
		return $ergebnis;
	} else {
		return;
	}
}
?>

Natürlich müssen die verwendenten Variablen-IDs angepasst werden. Ich habe folgende Variablen unterhalb der RegVar angelegt:

55351 Hersteller - STRING
48566 Zählerstand 1.8.0 - FLOAT
28850 Zählerstand 2.8.0 - FLOAT
34801 Wirkleistung - FLOAT
59522 Datum Uhrzeit - STRING
40765 letzte Messung - STRING

Auf jeden Fall würde ich empfehlen, sich zunächst auf einen Wert z.B. die Herstellerkennung (die ist fix und eindeutig) zu konzentrieren und bei den einzelnen Instanzen über die Debug-Funktion die HEX-Werte anschauen. Wenn das klappt, dann nach und nach die weiteren Werte aus dem Datenstrom rausziehen und in passende Variablen speichern. :cool:

Ich hoffe das hilft weiter, ansonsten bleibt nur das was ich auch gemacht habe: Forumsbeträge zum Thema lesen, Doku studieren, Skript testen und am Ende freuen wenn es funktioniert. :wink: Die Grundlagen zum Script stammen auch aus dem Forum hier - danke an die „Vordenker“.

Viele Grüße aus dem Unterallgäu
Harry

Das hört sich schon einmal super an … bis hier erst einmal ein dickes Dankeschön.

In der Kürze liegt die Würze … send with Tapatalk

Da ich jetzt statt dem UDP-Socket den Client-Socket genommen habe, scheinen die ersten Schritte erfolgreich zu verlaufen.
Am Anfang bekam ich im Debugfenster nur ein permanentes 7F zusehen. Da mein Zähler aber ein Initialisierung benötigt, habe ich folgendes Skript erstellt.

 <?

CSCK_SendText(18700 /*(Client Socket)*/, "/?!
".chr(13));

?>

Hier stellt sich die Frage ob ich in dem Zusammenhang dann auch den Client-Socket immer öffne und schließe.

In angehängtem Dump kann ich aber die sog. OBIS Kennzeichnung nicht erkennen und komme bei der Auswertung auch nicht weiter. Auch die angehängte Bedienungsanleitung half mir nicht wirklich. Ist die Herstellerkennung die Zählernummer? Hier wäre wieder Hilfe nötig.

Itron ACE3000-260.pdf (86.7 KB)

dump.txt (314 Bytes)

Bie den OBIS-Kennzeichen immer von einer Art „MAC-Adresse“ ausgegangen war, aber nicht weiter gekommen bin, habe ich mit einem HEX-Konverter mal experimentiert. Jetzt ist es mir klar … keine einzigartige Kennung sondern nur die Zählerdatensatzkennung :rolleyes: Dieser müsste auch bei allen gleichen Zählern auch die Selben sein.

1) Auch mit Harry Skript bin ich aber bei einer Sache hängen geblieben. Die Umrechnung der Daten von Hex in Float wollte nicht funktionieren. Die Daten kommen sechsstellig mit einer Nachkommastelle daher. Ich habe deshalb die Variable mit SetValue anstatt mit SetValueFloat gelesen. Dann habe ich ein Ereignis hinzu gefügt, der bei Variablenänderung den Wert durch 10 teilt und in eine neue Variable schreibt. Mein Gefühl sagt mit, dass das auch eleganter/sicherer geht.

<?

// Auswertung der eHZ-Daten am YPORT des YNODE

if($_IPS['SENDER'] == "RegisterVariable") {
    // Uhrzeit merken
    $time          = time();
    $datum_uhrzeit = strftime('%d.%m.%y %H:%M', $time);
    SetValueString(30767 /*[Volkszähler\RegVar eHZ YPORT\Datum Uhrzeit]*/, $datum_uhrzeit);

    // Zählernummer Obiskennung:C.1 Hex:43 2e 31
    if(strpos($_IPS['VALUE'], chr(0x43).chr(0x2e).chr(0x31)) !== false) {
        $wert =        explode(chr(0x43).chr(0x2e).chr(0x31), $_IPS['VALUE']);
        $hersteller = substr($wert[1], 1, 16);
        SetValueString(56168 /*[Volkszähler\RegVar eHZ YPORT\Zählernummer]*/, $hersteller);
    }
    // Import Obiskennung:1.8.0 Hex:31 2E 38 2E 30
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30), $_IPS['VALUE']);
        $import = substr($wert[1], 1, 8);
        SetValue(13455 /*[Volkszähler\RegVar eHZ YPORT\Zählernummer]*/, $import);
    }
    // Import Obiskennung:2.8.0 Hex:32 2E 38 2E 30
    if(strpos($_IPS['VALUE'], chr(0x32).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30)) !== false) {
        $wert =        explode(chr(0x32).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30), $_IPS['VALUE']);
        $export = substr($wert[1], 1, 8);
        SetValue(33107 /*[Volkszähler\RegVar eHZ YPORT\Zählernummer]*/, $export);

    }
}

?>

2) Auch das öffnen und schließen des Client-Socket ist mir noch nicht gelungen.

Wenn man mir bei 1) und 2) noch ein bisschen unter die Arme greift, könnte ich das Projekt abschließen und eine kleines Howto fertig machen.

Hallo Marcus,

die Berechnung des Zählerstandes ist u.a. auch hier beschrieben: :rolleyes:

http://wiki.freesol.de/index.php?title=Merkmale_und_Technik#Beispiel_EMH_eHz
Aus meiner Sicht muss der Client-Socket nicht ständig geöffnet und geschlossen werden.:confused:

Viele Grüße aus dem Unterallgäu
Harry

Hallo Harry,
da mir die gestrige Sylvesterparty noch ein bisschen in den Knochen steckt :cool:, schaue ich mir die Berechnung der Zahlen mal in Ruhe an.

Die Idee mit dem öffen und schließen des Socket kam mir, da ich die Tage eine Meldung über den Puffer beim Cutter bekommen habe. Der Zähler hatte auch permanent ein 7F (HEX) gesendet. Da nach einem Neustart von IPS keine weiteren Meldungen kommen, denke ich hast du Recht, dass man sich das sparen kann.

Ich habe jetzt bei Udo einen zweiten IR-Lesekopf bestellt und werde jetzt meinen PV-Zähler integrieren. :smiley:

Da meine Kenntnisse nicht ausreichen und im Forum auch keine Lösungsansätze zu finden waren, habe ich die Integration der S0-Signale über den Volkszähler erst einmal auf Eis gelegt. :frowning:

Hallo,

S0-Signale von Strom,- Wasser- und Gas-Zähler werte ich mit dem IPswitch von EAC aus.

Gruß
Harry

Also Punkt 2 ist ja klar, da muss nix neu geöffnet werden.

Punkt 1 wäre dann:

$import = floatval(substr($wert[1], 1, 8));

und dann mit

SetValueFloat

den Wert in die Variable schreiben.

Gruß
Jens