Stromzähler mit RS485

Hallo zusammen,

hat von euch jemand Erfahrung mit diesem Stromzähler: b+G Tech DRS155M

Preislich sehr attraktiv und RS485-Anbindung. Dazu ne Frage: weiß jemand, was der über RS485 schickt? Ist das ASCII?
Konnte kein Protokoll dazu finden. Evtl. hat ihn ja schon jemand im Einsatz.

Gruß & Danke,
dfhome

Hab mich mal umgeschaut und folgendes gefunden: Zähler Protokoll RS485 IEC 1107 gesucht - Elektronik-Forum

Ich bestell jetzt mal zwei und meld mich, wenn ich Näheres weiß.

Sodele,

hab die Anbindung soweit fertig und poste in den nächsten Tagen mal die vollständigen Skripte. Der Zähler liefert die aktuelle Spannung, den aktuellen Strom und natürlich die aufsummierte Energie. Ich frag ihn grad minütlich ab und es funktioniert ohne Probleme. Kopplung an IPS hab ich über einen 5€-eBay RS485-RS232 Koppler und dann auf USB gemacht.
Was ich jetzt noch probieren will, ist beide Zähler an einer Busleitung zu betreiben. Den Geräten kann man eine ID zuweisen, wodurch dann jeweils ein bestimmter abgefragt werden kann.

Für 23€ find ich die Teile echt klasse. Und eben deutlicher Mehrwert gegenüber S0-Schnittstelle, da mehr Infos und vor allem, wenn IPS down ist, krieg ich anschließend trotzdem den korrekten Zählerstand.

Bis die Tage,
Gruß
dfhome

Das ja witzig… Hab den auch gefunden und seit Wochen auf dem Tisch liegen. Dann bin ich ja mal auf das Script gespannt. :slight_smile:

Toni

Gesendet von meinem HTC Sensation Z710e mit Tapatalk 2

Hi klingt sehr interessant, könnt ihr mir einen günstigen Stromzähler mit RS485 für Drehstrom (3 Phasen) empfehlen ?

Cool da gibts ja auch ein mit 3Phasen für nur 52Eur
DRT715CT - 3-Ph. DS Wandlerzähler für DIN Hutschiene (107120113)*

Gesendet von meinem GT-I9300 mit Tapatalk 2

So, da morgen die Geburt unseres zweiten Kindes eingeleitet werden soll (kleiner Brummer), hier mal leider etwas verspätet die Skripte:

Skript für die RegisterVariable:


<?
if($_IPS['SENDER'] == "RegisterVariable") {

	$data = RegVar_GetBuffer($_IPS['INSTANCE']);
	$data .= $_IPS['VALUE'];
   RegVar_SetBuffer($_IPS['INSTANCE'], $data);

	//Identification Message
	if (strpos($data, chr(0x2F)) !== false && strpos($data, chr(0x0A)) !== false) {
	   $pos1 = strpos($data, chr(0x2F));
	   $length = strpos($data, chr(0x0A)) - strpos($data, chr(0x2F));
	   $msg = substr($data, $pos1, $length);
	   $manufacturer= substr($msg, 1, 3);
	   $baud_rate = substr($msg, 4, 1);
	   $meter_id = substr($msg, 5, 12);
	   switch ($meter_id) {
	      //Zähler EG
	      case "000000000001":
	         //SetValue(18385 /*[IO_RS485\RS485_RV\HandleComData\Aktiver Zähler]*/, 1);
			   SetValue(56767 /*[Konfiguration\RS485\Zähler EG\Manufacturer]*/, $manufacturer);
			   SetValue(18655 /*[Konfiguration\RS485\Zähler EG\Baudrate]*/, $baud_rate);
			   SetValue(44011 /*[Konfiguration\RS485\Zähler EG\Meter-ID]*/, $meter_id);
	         break;
			//Zähler OG
			case "000000000002":
	         //SetValue(18385 /*[IO_RS485\RS485_RV\HandleComData\Aktiver Zähler]*/, 2);
			   SetValue(45423 /*[Konfiguration\RS485\Zähler OG\Meter-ID]*/, $manufacturer);
			   SetValue(51159 /*[Konfiguration\RS485\Zähler OG\Baudrate]*/, $baud_rate);
			   SetValue(31928 /*[Konfiguration\RS485\Zähler OG\Identification]*/, $meter_id);
			   break;
	   }
     	RegVar_SetBuffer($_IPS['INSTANCE'], "");
		//ACK / Option Select Message senden ('Programming Mode')
		$cmd = chr(0x06).chr(0x30).$baud_rate.chr(0x31).chr(0x0D).chr(0x0A);
		COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	//Programming Command Message
   } elseif (strpos($data, chr(0x01)) !== false && strpos($data, chr(0x03)) !== false) {
	   $pos1 = strpos($data, chr(0x01));
	   $length = strpos($data, chr(0x03)) - strpos($data, chr(0x01));
	   $msg = substr($data, $pos1, $length);
		$command_message = substr($msg, 1, 1);
		$command_type = substr($msg, 2, 1);
		switch ($command_message.$command_type) {
		   case "P0":
				//Passwort Message senden
		      $password = "(00000000)";
				$bcc = CalcBCC("P100000000");
				$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr($bcc);
				COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
		      break;
		}
     	RegVar_SetBuffer($_IPS['INSTANCE'], "");
	//ACK Message
   } elseif (strpos($data, chr(0x06)) !== false) {
     	RegVar_SetBuffer($_IPS['INSTANCE'], "");
		//Energie abfragen
		$bcc = CalcBCC("R100000010");
		$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr($bcc);
		COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	//Data Message
	} elseif (strpos($data, chr(0x02)) !== false && strpos($data, chr(0x03)) !== false) {
	   if (substr($data, 0, 1) == chr(0x02) && substr($data, 1, 1) == chr(0x02)) {
	   	$data = substr($data, 1);
	   }
		$stx = strpos($data, chr(0x30));
		$obis = substr($data, $stx, 8);
		echo("Obis: ".$obis);
		switch ((string)$obis) {
		   case "00000000":
				$start = strpos($data, chr(0x28));
				$value = substr($data, $start+1, 4);
				if ($value == 0) {
					echo("Null-Wert: ".$data);
					IPS_LogMessage("RegVar", "Null-Wert: ".$data);
				}
				if ($value != 0) {
					SetValue(29735 /*[Konfiguration\RS485\Zähler EG\Spannung]*/, $value / 10);
				}
		      RegVar_SetBuffer($_IPS['INSTANCE'], "");
				//Strom abfragen
				$bcc = CalcBCC("R100000001");
				$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr($bcc);
				COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
		      break;
			case "00000001":
				$start = strpos($data, chr(0x28));
				$value = substr($data, $start+1, 4);
				SetValue(15835 /*[Konfiguration\RS485\Zähler EG\Strom]*/, $value / 10);
		      //Leistung berechnen
		      SetValue(48523 /*[Konfiguration\RS485\Zähler EG\Leistung]*/, GetValue(15835 /*[Konfiguration\RS485\Zähler EG\Strom]*/) * GetValue(29735 /*[Konfiguration\RS485\Zähler EG\Spannung]*/));
		      RegVar_SetBuffer($_IPS['INSTANCE'], "");
				//LogOut
				$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
				COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
				COMPort_SetOpen(27491 /*[IO_RS485]*/, false);
				IPS_ApplyChanges(27491 /*[IO_RS485]*/);
			   break;
			case "00000010":
				$start = strpos($data, chr(0x28));
				$value = substr($data, $start+1, 8);
				if ($value != 0) {
					SetValue(59295 /*[Konfiguration\RS485\Zähler EG\Energie]*/, $value / 1000);
				}
		      RegVar_SetBuffer($_IPS['INSTANCE'], "");
				//Spannung abfragen
				$bcc = CalcBCC("R100000000");
				$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr($bcc);
				COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
			   break;
			default:
				echo("Kein-Wert: ".$data);
				IPS_LogMessage("RegVar", "Kein-Wert: ".$data);
		}
	}
}

function CalcBCC($string) {
	$bcc = "";
	for ($i = 0; $i <= strlen($string); $i++) {
		$bcc = $bcc ^ ord(substr($string, $i, 1));
	}
	return ("0x".dechex($bcc));
}
?>

Skript zum Abfragen (bei mir zyklisch alle Minute):


<?
RegVar_SetBuffer(14499 /*[IO_RS485\RS485_RV]*/, "");
COMPort_SetOpen(27491 /*[IO_RS485]*/, true);
IPS_ApplyChanges(27491 /*[IO_RS485]*/);
$serial = "000000000001";
$cmd = chr(0x2F).chr(0x3F).$serial.chr(0x21).chr(0x0D).chr(0x0A);
COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
?>

Anbindung über Serial Port mit 9600/7/1/Even.
Das mit dem zweiten Zähler am gleichen Bus hab ich zeitlich noch nicht geschafft, aber kommt noch.

Zur Einbindung:
ich hab jetzt einfach 1:1 meine Skripte kopiert; d.h. ihr müsst die ganzen Variablen-ID´s noch ändern. Das sind:
Float - Leistung
Float - Energie
Float - Spannung
Float - Strom
Die zusätzlichen Infos sind:
String - Manufacturer
String - MeterID
String - Baudrate

Bezüglich der MeterID gibt es ein Programm, welches es erlaubt, die MeterID des Zählers zu setzen. Diese müsst ihr anpassen (bei mir ist das die 000000000001) und in dem Request-Script entsprechend setzen. Den Link zum Tool ist in dem verlinkten zweiten Post von mir zu finden.

Viel Spaß und Gruß
dfhome

Zwischenablage01.jpg

Hallo zusammen,

hab jetzt beide Zähler an eine Bus-Leitung angeschlossen und es funktioniert einwandfrei. Sollte das Skript jemand benötigen, bitte Bescheid geben. Ich stell´s dann hier zur Verfügung.
Jetzt überleg ich doch wirklich, noch mehrere von den Zählern und auch den 3-Phasen-Zähler anzuschaffen…:eek:

Gruß und schönes Wochenende,
dfhome

Hab die Skripte mal ein bißchen umgeschrieben, da ab und an ein Wert nicht kam. Anforderung und Auswertung sind jetzt in einem Skript. Jetzt läuft es zu 100% stabil.

Request- und Auswerte-Skript:

<?
$sleep = 100;

if (GetValue(18385 /*[IO_RS485\RS485_RV\HandleComData\Aktiver Zähler]*/) == 2) {
	//Init
	COMPort_SetOpen(27491 /*[IO_RS485]*/, true);
	IPS_ApplyChanges(27491 /*[IO_RS485]*/);
	$serial = "000000000001";
	$cmd = chr(0x2F).chr(0x3F).$serial.chr(0x21).chr(0x0D).chr(0x0A);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	//ACK / Option Select Message senden ('Programming Mode')
	$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$password = "(00000000)";
	$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	COMPort_SetOpen(27491 /*[IO_RS485]*/, false);
	IPS_ApplyChanges(27491 /*[IO_RS485]*/);
	IPS_Sleep($sleep);
	$data = RegVar_GetBuffer(14499 /*[IO_RS485\RS485_RV]*/);
	if (strlen($data) == 91) {
		$tmp = substr($data, strpos($data, chr(0x02))+1);
		$tmp = substr($tmp, strpos($tmp, chr(0x02))+1);
		$start = strpos($tmp, chr(0x28));
		$value = substr($tmp, $start+1, 8);
		SetValue(59295 /*[Konfiguration\Strom\Zähler EG\Energie]*/, $value / 1000);
		SetValue(51598 /*[Konfiguration\Strom\Zähler EG\Kosten kumuliert]*/, GetValue(59295 /*[Konfiguration\Strom\Zähler EG\Energie]*/) * GetValue(22986 /*[Konfiguration\Strom\KWh-Preis]*/));
		SetValue(54058 /*[Konfiguration\Strom\Zähler EG\Kosten kumuliert\Dieser Monat]*/, (GetValue(59295 /*[Konfiguration\Strom\Zähler EG\Energie]*/) - GetValue(29151 /*[Konfiguration\Strom\Zähler EG\Kosten kumuliert\Dieser Monat\Zählerstand Monatsbeginn]*/)) * GetValue(22986 /*[Konfiguration\Strom\KWh-Preis]*/));
		$tmp = substr($tmp, strpos($tmp, chr(0x02))+1);
		$start = strpos($tmp, chr(0x28));
		$value = substr($tmp, $start+1, 4);
		SetValue(15835 /*[Konfiguration\Strom\Zähler EG\Strom]*/, $value / 10);
		$tmp = substr($tmp, strpos($tmp, chr(0x02))+1);
		$start = strpos($tmp, chr(0x28));
		$value = substr($tmp, $start+1, 4);
		SetValue(29735 /*[Konfiguration\Strom\Zähler EG\Spannung]*/, $value / 10);
	   SetValue(48523 /*[Konfiguration\Strom\Zähler EG\Leistung]*/, GetValue(15835 /*[Konfiguration\Strom\Zähler EG\Strom]*/) * GetValue(29735 /*[Konfiguration\Strom\Zähler EG\Spannung]*/));
	}
	RegVar_SetBuffer(14499 /*[IO_RS485\RS485_RV]*/, "");
   SetValue(18385 /*[IO_RS485\RS485_RV\HandleComData\Aktiver Zähler]*/, 1);
	return;
}
if (GetValue(18385 /*[IO_RS485\RS485_RV\HandleComData\Aktiver Zähler]*/) == 1) {
	//Init
	COMPort_SetOpen(27491 /*[IO_RS485]*/, true);
	IPS_ApplyChanges(27491 /*[IO_RS485]*/);
	$serial = "000000000002";
	$cmd = chr(0x2F).chr(0x3F).$serial.chr(0x21).chr(0x0D).chr(0x0A);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	//ACK / Option Select Message senden ('Programming Mode')
	$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$password = "(00000000)";
	$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
	COMPort_SendText(27491 /*[IO_RS485]*/, $cmd);
	COMPort_SetOpen(27491 /*[IO_RS485]*/, false);
	IPS_ApplyChanges(27491 /*[IO_RS485]*/);
	IPS_Sleep($sleep);
	$data = RegVar_GetBuffer(14499 /*[IO_RS485\RS485_RV]*/);
	if (strlen($data) == 91) {
		$tmp = substr($data, strpos($data, chr(0x02))+1);
		$tmp = substr($tmp, strpos($tmp, chr(0x02))+1);
		$start = strpos($tmp, chr(0x28));
		$value = substr($tmp, $start+1, 8);
		SetValue(23860 /*[Konfiguration\Strom\Zähler OG\Energie]*/, $value / 1000);
		SetValue(39487 /*[Konfiguration\Strom\Zähler OG\Kosten kumuliert]*/, GetValue(23860 /*[Konfiguration\Strom\Zähler OG\Energie]*/) * GetValue(22986 /*[Konfiguration\Strom\KWh-Preis]*/));
		SetValue(51977 /*[Konfiguration\Strom\Zähler OG\Kosten kumuliert\Dieser Monat]*/, (GetValue(23860 /*[Konfiguration\Strom\Zähler OG\Energie]*/) - GetValue(27314 /*[Konfiguration\Strom\Zähler OG\Kosten kumuliert\Dieser Monat\Zählerstand Monatsbeginn]*/)) * GetValue(22986 /*[Konfiguration\Strom\KWh-Preis]*/));
		$tmp = substr($tmp, strpos($tmp, chr(0x02))+1);
		$start = strpos($tmp, chr(0x28));
		$value = substr($tmp, $start+1, 4);
		SetValue(58150 /*[Konfiguration\Strom\Zähler OG\Strom]*/, $value / 10);
		$tmp = substr($tmp, strpos($tmp, chr(0x02))+1);
		$start = strpos($tmp, chr(0x28));
		$value = substr($tmp, $start+1, 4);
		SetValue(51942 /*[Konfiguration\Strom\Zähler OG\Spannung]*/, $value / 10);
		SetValue(47508 /*[Konfiguration\Strom\Zähler OG\Leistung]*/, GetValue(58150 /*[Konfiguration\Strom\Zähler OG\Strom]*/) * GetValue(51942 /*[Konfiguration\Strom\Zähler OG\Spannung]*/));
	}
	RegVar_SetBuffer(14499 /*[IO_RS485\RS485_RV]*/, "");
   SetValue(18385 /*[IO_RS485\RS485_RV\HandleComData\Aktiver Zähler]*/, 2);
	return;
}

?>

RegisterVariable Ziel-Skript:

<?
if($_IPS['SENDER'] == "RegisterVariable") {

	$data = RegVar_GetBuffer($_IPS['INSTANCE']);
	$data .= $_IPS['VALUE'];
   RegVar_SetBuffer($_IPS['INSTANCE'], $data);

}
?>

Das Skript beinhaltet jetzt auch schon die Auswertung für zwei Zähler. Skript wird alle 30s getriggert und frägt dann abwechselnd entweder Zähler 1 oder Zähler 2 ab.
Das Skript ist ziemlich „unsauber“, da mir für mehr grad die Zeit fehlt. Aber funktionieren tut es, das ist für mich erstmal die Hauptsache.

Das Tool für das Setzen der Meter-ID gibt es hier: http://www.elektronik-kompendium.de/forum/upload/20121105152150.rar

Viel Spaß, ich bestell mir jetzt mal noch weitere Zähler… :wink:

Gruß
dfhome

Morgen Patrick,

Post#3

Kopplung an IPS hab ich über einen 5€-eBay RS485-RS232 Koppler und dann auf USB gemacht.

Du benötigst eine sep. Schnittstelle, mit Umsetzer von RS485 auf RS232 oder USB.

Kann mir nicht vorstellen dass der Zähler Homematic spricht auch wenn „das Kabel passt“. :frowning:

Toni

Der LAN-Adapter von HM hat definitiv keinen RS-485-Anschluß. Die CCU hätte einen, den kannst Du aber nicht verwenden. Suche Dir einen USB auf RS-485 Wandler mit FTDI-Chipsatz. Ich habe einen PAUB003 an einem Stromzähler in Betrieb gehabt.

Wenn Du mit LAN-Adapter das neue RS-485 LAN-Gateway für die CCU2 meinst dann stochern wir im Nebel ob das für Deine Zwecke verwendbar sein wird. Abgesehen davon, dass es noch nicht erhältlich ist würde ich aber mal davon ausgehen dass nicht. EQ-3 wird darüber ohne entsprechenden Hack sicher nur Homematic Wired unterstützen.

Hallo Leute,

nachdem ich hier schon seit einiger Zeit lesenderweise unterwegs bin, möchte nun auch etwas beitragen was evtl. hilfreich ist.
Aus dem Script von dfhome und den vielen wertvollen Hinweisen (vielen herzlichen Dank dafür) habe ich mir ein eigenes Script „gebastelt“, welches alle Funktionen abfragen und die wichtigsten schreiben kann.
Damit benötigt man kein zusätzliches Programm zum setzten der ID oder rücksetzen des Zählers mehr.

<?
$serialID = "000000000032";		//auszulesende Zähler-ID (12 Stellen), Standard: "000000000000"
$sleep = 280;				//Bei Ausleseschwierigkeiten erhöhen! Standard: 280
$password = "(00000000)";		//Passwort (8 Stellen), Standard: "(00000000)"
$ComPort = 10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/;          	//Serial Port
$RegVar = 10239 /*[Info\Elektrozähler\Register Variable]*/;           		//Register Variable
//-----------------------------------------------------------------------------------------------------------------------------------------------------
$Wcmd = 5;              	//Schreibbefehl; 5 = keiner; 4 = Zähler-ID; 3 = Zeit nullen; 2 = Zählerstand nullen; 1 = Zählerstand und Zeit nullen;

$ID = "000000000032";		//neue Zähler-ID (12 Stellen); z.B.: "000000000032"
//-----------------------------------------------------------------------------------------------------------------------------------------------------

//Init
COMPort_SetOpen($ComPort, true);
IPS_ApplyChanges($ComPort);
$cmd = chr(0x2F).chr(0x3F).$serialID.chr(0x21).chr(0x0D).chr(0x0A);
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
//ACK / Option Select Message senden ('Programming Mode')
$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);

//Schreibbefehle---------------------------------------------------------------------------------------------------------------------------------------
if ($Wcmd == 1){
		echo "Zählerstand und Zeit nullen. 
 
";
      // Zähler Reset (0)
		$cmd = chr(0x01)."W1".chr(0x02)."00000040(0)".chr(0x03).chr(0x52);
		COMPort_SendText($ComPort, $cmd);
		IPS_Sleep($sleep);
      // Zeit setzen
		$F = "00000031";
		//$datum = date("ymd",time());
		//$uhrzeit = date("His",time());
		//$W = ($datum."00".$uhrzeit);	// aktuelle Zeit oder
		$W = "00010100000000";				// nullen entspricht 01.01.2000; 00:00:00
		$cmd = "$F"."($W)";
		$bcc = CalcBCC("W1".chr(0x02).$cmd.chr(0x03));
		$CMD = chr(0x01)."W1".chr(0x02).$cmd.chr(0x03).chr($bcc);
		COMPort_SendText($ComPort, $CMD);
		IPS_Sleep($sleep);

}

if ($Wcmd == 2){
      echo "Zählerstand nullen. 
 
";
      //****************** Zähler Reset (0)
		$cmd = chr(0x01)."W1".chr(0x02)."00000040(0)".chr(0x03).chr(0x52);
		COMPort_SendText($ComPort, $cmd);
		IPS_Sleep($sleep);
}

if ($Wcmd == 3){
	   echo "Zeit nullen. 
 
";
		// Zeit setzen
		$F = "00000031";
		//$datum = date("ymd",time());
		//$uhrzeit = date("His",time());
		//$W = ($datum."00".$uhrzeit);  	// aktuelle Zeit oder
		$W = "00010100000000";      		// nullen
		$cmd = "$F"."($W)";
		$bcc = CalcBCC("W1".chr(0x02).$cmd.chr(0x03));
		$CMD = chr(0x01)."W1".chr(0x02).$cmd.chr(0x03).chr($bcc);
		COMPort_SendText($ComPort, $CMD);
		IPS_Sleep($sleep);
}

if ($Wcmd == 4){
      echo "Zähler-ID setzen. 
";
		//Zähler-ID setzen
      $F = "00000036";
		echo "neue Zähler-ID: $ID 
 
";
		$cmd = "$F"."($ID)";
		$bcc = CalcBCC("W1".chr(0x02).$cmd.chr(0x03));
		$CMD = chr(0x01)."W1".chr(0x02).$cmd.chr(0x03).chr($bcc);
		COMPort_SendText($ComPort, $CMD);
		IPS_Sleep($sleep);
}

if ($Wcmd == 5){
      echo "Keine Schreibfunktion ausgewählt! 
 
";
}

//if ($Wcmd == 9){
		//Baudrate setzen
		//$F = "00000035";
		//$W = "0004";      //(0001=1200 (Achtung: sleep auf min. 500!); 00002=2400; 00003=4800; 00004=9600)
		//$cmd = "$F"."($W)";
		//$bcc = CalcBCC("W1".chr(0x02).$cmd.chr(0x03));
		//$CMD = chr(0x01)."W1".chr(0x02).$cmd.chr(0x03).chr($bcc);
		//COMPort_SendText($ComPort, $CMD);
		//IPS_Sleep($sleep);
//}

//Abfrage---------------------------------------------------------------------------------------------------------------------------------------
$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63);                        			//****************** Spannung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62);                        			//****************** Strom
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000002()".chr(0x03).chr(0x61);                        			//****************** Frequenz
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000003()".chr(0x03).chr(0x60);                        			//****************** Wirkleistung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000004()".chr(0x03).chr(0x67);                        			//****************** Blindleistung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000005()".chr(0x03).chr(0x66);                        			//****************** Scheinleistung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000006()".chr(0x03).chr(0x65);                        			//****************** Leistungsfaktor
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62);                        			//****************** Gesamtleistung/Zählerstand
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000011()".chr(0x03).chr(0x63);                        			//****************** Gesamtleistung/Zählerstand (Kopie von ...10)
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000020()".chr(0x03).chr(0x61);                        			//****************** Energie in Rückwärtsrichtung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000021()".chr(0x03).chr(0x60);                        			//****************** Energie in Rückwärtsrichtung (Kopie von ...20)
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000031()".chr(0x03).chr(0x61);                        			//****************** Zeit (YYMMTT??hhmmss)
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000032()".chr(0x03).chr(0x62);                        			//****************** Temperatur
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000034()".chr(0x03).chr(0x64);                        			//****************** Seriennummer
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000035()".chr(0x03).chr(0x65);                        			//****************** Baudrate
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000036()".chr(0x03).chr(0x66);                        			//****************** Zähler-ID
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
COMPort_SendText($ComPort, $cmd);
COMPort_SetOpen($ComPort, false);
IPS_ApplyChanges($ComPort);
IPS_Sleep($sleep);
//Auslesen------------------------------------------------------------------------------------------------------------------------------------------------
$data = RegVar_GetBuffer($RegVar);
//echo "Data: $data 
";
$value = substr($data, strpos($data, "/")+1,3);																			//Hersteller (Antwort)
echo "Antwort Hersteller:	$value 
";
$value = substr($data, strpos($data, ":")+1,12);																		//Zähler-ID (Antwort)
echo "Antwort Zähler-ID:	$value 
";
$value = substr($data, strpos($data, "00000000(")+9,4)/10;															//Spannung / 10 V
echo "Spannung:				$value V 
";
//SetValue(35532 /*[Info\Elektrozähler\Administration\Spannung]*/, $value);
$value = substr($data, strpos($data, "00000001(")+9,4)/10; //Strom       										//Strom / 10 A
echo "Strom:					$value A 
";
//SetValue(45094 /*[Info\Elektrozähler\Administration\Strom]*/, $value);
$value = substr($data, strpos($data, "00000002(")+9,4)/10;															//Frequenz / 10 HZ
echo "Frequenz:				$value Hz 
";
//SetValue(51097 /*[Info\Elektrozähler\Administration\Frequenz]*/, $value);
$value = substr($data, strpos($data, "00000003(")+9,4)*10;                    								//Wirkleistung x 10 W
echo "Wirkleistung:			$value W 
";
//SetValue(14053 /*[Info\Elektrozähler\Administration\Wirkleistung]*/, $value);
$value = substr($data, strpos($data, "00000004(")+9,4)*10;															//Blindleistung x 10 VAr (nur bei induktiver Last)
echo "Blindleistung:			$value VAr 
";
//SetValue(52726 /*[Info\Elektrozähler\Administration\Blindleistung]*/, $value);
$value = substr($data, strpos($data, "00000005(")+9,4)*10;       													//Scheinleistung x 10 VA
echo "Scheinleistung:		$value VA 
";
//SetValue(14444 /*[Info\Elektrozähler\Administration\Scheinleistung]*/, $value);
$value = substr($data, strpos($data, "00000006(")+9,4)/1000;				 										//Leistungsfaktor / 1000
echo "Leistungsfaktor:		$value 
";
//SetValue(24547 /*[Info\Elektrozähler\Administration\Leistungsfaktor]*/, $value);
$value = substr($data, strpos($data, "00000010(")+9,8)/1000;														//Gesamtleistung/Zählerstand / 1000 kWh
echo "Zählerstand 1:			$value kWh 
";
//SetValue(23900 /*[Info\Elektrozähler\Administration\Zählerstand / Gesamtleistung -1-]*/, $value);
$value = substr($data, strpos($data, "00000011(")+9,8)/1000;														//Gesamtleistung/Zählerstand / 1000 kWh (Kopie von ...10)
echo "Zählerstand 2:			$value kWh 
";
//SetValue(35912 /*[Info\Elektrozähler\Administration\Zählerstand / Gesamtleistung -2-]*/, $value);
$value = substr($data, strpos($data, "00000020(")+9,8)/1000; 														//Energie in Rückwärtsrichtung / 1000 kWh
echo "Leistung auswärts 1:	$value kWh 
";
//SetValue(54517 /*[Info\Elektrozähler\Administration\Energie rückwärts]*/, $value);
$value = substr($data, strpos($data, "00000021(")+9,8)/1000; 														//Energie in Rückwärtsrichtung / 1000 kWh (Kopie von ...20)
echo "Leistung auswärts 2:	$value kWh 
";
$tmp = substr($data, strpos($data, "00000031(")+9,14);																//Zeit (YYMMDDxxhhmmss) xx = Tage seit Reset
$value =  substr($tmp,4,2).".".substr($tmp,2,2).".20".substr($tmp,0,2)."; ".substr($tmp,8,2).":".substr($tmp,10,2).":".substr($tmp,12,2)."
";
echo "Zeit:						$value";
//SetValue(36489 /*[Info\Elektrozähler\Administration\Zeit]*/, $value);
$value = substr($data, strpos($data, "00000032(")+9,4)/1;															//Temperatur / °C (ändert sich nicht)
echo "Temperatur:				$value °C 
";
//SetValue(52124 /*[Info\Elektrozähler\Administration\Temperatur (ignorieren)]*/, $value);
$value = substr($data, strpos($data, "00000034(")+9,12);																//Seriennummer
echo "Seriennummer:			$value 
";
//SetValue(47632 /*[Info\Elektrozähler\Administration\Seriennummer]*/, $value);
$value = substr($data, strpos($data, "00000035(")+9,4)*1;															//Baudrate
echo "Baudrate:				$value	(1=1200; 2=2400; 3=4800; 4=9600)
";
//SetValue(52967 /*[Info\Elektrozähler\Administration\Baud]*/, $value);
$value = substr($data, strpos($data, "00000036(")+9,12);																//Zähler-ID
echo "Zähler-ID:				$value 
";
//SetValue(23885 /*[Info\Elektrozähler\Administration\Zähler-ID]*/, $value);

RegVar_SetBuffer($RegVar, ""); //Variable löschen

//Checksumme berechnen_________________________________________________________________________________________________________________________________________
function CalcBCC($string) {
	$bcc = "";
   for ($i = 0; $i <= strlen($string); $i++) {
       $bcc = $bcc ^ ord(substr($string, $i, 1));
   }
   return ("0x".dechex($bcc));
   }
//_____________________________________________________________________________________________________________________________________________________________

?>

Von den DRS155M habe ich momentan 7 Stück im Gebrauch, wovon allerdings zwei „rumzicken“ (tlw. falsche Werte).
Die restlichen funktionieren problemlos.

Grüße
Marmangra

Hallo zusammen,

ich habe mir auch 3xDRS155M zugelegt und bin dabei diese mittels der Skripte anzusprechen. Leider bin ich kein PHP-Profi :frowning:

Daher meine Frage: Was muss ich in meiner PHP-Datei einfügen, damit die PHP-Funktionen wie z.B. COMPort_SetOpen unterstützt werden ?

Momentan gibt es folgende Meldung:

Fatal error: Call to undefined function COMPort_SetOpen() in C:\Users\Palatinate\Desktop\server2go\htdocs\index.php on line 24

Besten Dank schon mal vorab !!

Hallo,

Du musst zuerst eine Instanz hinzufügen (alle Module!) - „Serial Port“ - Werte lt. Bild 1.

Dann noch eine Register Variable einrichten und mit dem Port verbinden,

mit diesem Ziel-Script:

<?
if($_IPS['SENDER'] == "RegisterVariable") {

    $data = RegVar_GetBuffer($_IPS['INSTANCE']);
    $data .= $_IPS['VALUE'];
   RegVar_SetBuffer($_IPS['INSTANCE'], $data);

}
?>

Die Objekt-ID im Script entsprechend Deinen eben angelegten ändern.

$ComPort =
$RegVar =

Die ID der Zähler ist als Standard:
$serialID = „000000000000“

Dann sollte es funktionieren, wenn nicht fragen. :slight_smile:

Grüße
Marmangra

Hallo,

nach genauem Lesen der Antwort habe ich das eigentliche Problem verstanden: ich wollte den PHP-Code verwenden um damit mein DRS155M über einen normalen WebBrowser anzusteuern.

Ich besitze keine Symcon-Komponente sondern ein ICPDAS I7188E2 Wandler von RS485 auf Ethernet. Ich bin über Google auf diese Seite gestoßen, als ich nach einer Ansteuerung für DRS155M gesucht hatte.

Damit hat sich mein Problem leider erledigt (leider nicht gelöst …) - trotzdem Danke für die Hilfe !!!

Beste Grüße
Palatinate

Das kannst Du ja ändern. :smiley:

So, bin nun endlich dazugekommen meine DRS110M in Betrieb zu nehmen.
Ich habe aus den Scripts meiner Vorschreiber und Ideen aus der Plugwise implementierung eine eigene Implementierung gemacht:

  • ComPort und Registervariable, sowie eine Kategorie muß selber angelegt werden, die ID’s müssen dann oben im Script eingetragen werden
  • Das Script bei der Registervariable hinterlegen
  • Wenn das Script von der Konsole oder vom Webfront aufgerufen wird, wird der Meter mit der ID 000000000000 (Werkseinstellung) auf MeterID der Seriennummer umprogrammiert und eine Instanz mit den Daten angelegt
  • Dem Script einen Timerevent zuorden (1min/5min/… je nach belieben), damit werden die Werte automatisch abgefragt
  • Wenn das Script über Runscript aufgerufen wird, werden die Gesamtzähler gelöscht (hoffe ich, hab das nicht komplett getestet)

Bemerkungen:
IPSInstaller wird benötigt.
Es wird die aktuelle Leistung und der Gesamtverbrauch ausgelesen, bei beiden Werten ist das Logging aktiv (Standard/Zähler).
Die Kategorie kann nach dem Anlegen in einen „sprechenden“ Namen geändert werden.
Idealerweise legt man die Kategorie für die Meter in einer Unterkategorie an, da in der Kategorie darüber noch zwei Variablen für letztes Update und ComError angelegt werden.
Für den Timerevent habe ich die Lösung mit dem festen Sleep dynamisch gemacht, typischerweise braucht der Zähler 30ms zum antworten, da immer 300ms zu warten dauert mir zu lang. (Das Script läuft dann bei 12 Zählern 25sek, jetzt mit 9 ca. 10sek)
Die Anzahl der Übertragungsfehler wird bei jedem Fehler erhöht, Auswerten/löschen müsst Ihr selber.
Die Inbetriebnahme der Zähler habe ich so gemacht:
Einen Zähler an die Datenleitung angeschlossen, dann im Webfront das Script aufgerufen. Der Zähler wird nun automatisch angelegt und die ID geändert.
Dann den nächsten Zähler angeschlossen, das Script wieder aufgerufen, jetzt antwortet ja nur noch der Zähler mit ID 000000000000, und dieser wird angelegt.
Wenn alle Zähler da sind, den Timerevent einschalten (vorher besser auslassen, sonst kommen sich die beiden Abfragen in die Quere).

<? 
include("IPSInstaller.ips.php");
$sleep = 300;
$password = "(00000000)"; 
$BGETechComPortID=41163;
$BGETechRegVarID=11604;
$BGETechMetersID = 17971;
define ("SOH", "\x01"); // StartofHeader
define ("STX", "\x02"); // StartofText
define ("ETX", "\x03"); // EndofText
define ("ACK", "\x06"); // Acknowledge

Switch ($IPS_SENDER) {
  Default:
      IPS_LogMessage("BGETech_Controller","Sender unbekannt: ".$IPS_SENDER);
     break;
  Case "RunScript":  //Zählerstände löschen
    foreach(IPS_GetChildrenIDs($idBGETechMeters) as $meter) {   // alle Unterobjekte durchlaufen
      RegVar_SetBuffer($BGETechRegVarID, ""); 
      $serial = GetValue(IPS_GetVariableIDByName("MeterID", $meter));
      $cmd = "/?".$serial."!
"; 
      COMPort_SendText($BGETechComPortID, $cmd); 
      IPS_Sleep($sleep); 
      $cmd = ACK."0:1
";  //ACK / Option Select Message senden ('Programming Mode') 
      COMPort_SendText($BGETechComPortID, $cmd); 
      IPS_Sleep($sleep); 
      $cmd = "P1".STX.$password.ETX; 
      COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
      IPS_Sleep($sleep); 
      $cmd = "W1".STX."00000040(0)".ETX; 
      COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
      IPS_Sleep($sleep); 
      $cmd = "B0".ETX; 
      COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
      IPS_Sleep($sleep); 
      $data = RegVar_GetBuffer($BGETechRegVarID);
      /*  Antwortbuffer: 
        0 -18 /YTL:xxxxxxxxxxxx..
        19-32 .P0.(00000000).
        34 (ACK)
        35 (ACK)
      */ 
      IPS_LogMessage("BGETech_Controller","Reset Zählerstand Meter ".bin2hex($data));
      if (strlen($data) == 36) {
        IPS_LogMessage("BGETech_Controller","Reset Zählerstand Meter ".$serial."Ok");
      }
      else {
        IPS_LogMessage("BGETech_Controller","Reset Zählerstand Meter ".$serial."nOk");
        $id=CreateVariable("ComError", 1, $idBGETechMeters);
        SetValue($id,GetValue($id)+1);
      } 
      IPS_Sleep($sleep); 
      RegVar_SetBuffer($BGETechRegVarID, ""); 
    }
    break;
  Case "WebFront":
  Case "Execute":  //Meter anlegen MeterID schreiben
    RegVar_SetBuffer($BGETechRegVarID, "");
    $cmd = "/?000000000000!
";
    COMPort_SendText($BGETechComPortID, $cmd);
    IPS_Sleep($sleep); 
    //ACK / Option Select Message senden ('Programming Mode') 
    $cmd = ACK."0:1
"; 
    COMPort_SendText($BGETechComPortID, $cmd); 
    IPS_Sleep($sleep); 
    $cmd = "P1".STX.$password.ETX;
    COMPort_SendText($BGETechComPortID, genCmd($cmd));
    IPS_Sleep($sleep);
    $cmd = "R1".STX."00000034()".ETX;
    COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
    IPS_Sleep($sleep*2);
    $data = RegVar_GetBuffer($BGETechRegVarID);
    /*  Antwortbuffer: 
      0 -18 /YTL:xxxxxxxxxxxx..
      19-34 .P0.(00000000)..
      35 (ACK)
      36-60 .00000034(xxxxxxxxxxxx)..
    */ 
    RegVar_SetBuffer($BGETechRegVarID, ""); 
    if (strlen($data) == 61) {
      $serial = (substr($data, 46, 12));
      $cmd = "W1".STX."00000036(".$serial.")".ETX;
      COMPort_SendText($BGETechComPortID, genCmd($cmd));
      IPS_Sleep($sleep); 
      $cmd = "B0".ETX; 
      COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
      IPS_Sleep($sleep); 
      $data = RegVar_GetBuffer($BGETechRegVarID);
      /*  Antwortbuffer: 
        0 (ACK)
      */ 
      RegVar_SetBuffer($BGETechRegVarID, ""); 
      if ((strlen($data) == 1) && ($data[0]==ACK)) {
        $archiveHandlerID = IPS_GetInstanceIDByName("Archive Handler", 0);
        $item = CreateDummyInstance($serial, $BGETechMetersID);
        IPS_SetHidden(CreateVariable("MeterID", 3, $item, 0, "", 0, $serial),true);
        $id=CreateVariable("Leistung", 2, $item, 0, "~Watt.3680", 0, 0);
        AC_SetLoggingStatus($archiveHandlerID,$id,true);
        AC_SetAggregationType($archiveHandlerID, $id, 0); 
        $id=CreateVariable("Gesamtverbrauch", 2, $item, 0, "~Electricity", 0, 0); //~Electricity
        AC_SetLoggingStatus($archiveHandlerID,$id,true);
        AC_SetAggregationType($archiveHandlerID, $id, 1); 
        printf("Meter ".$serial." created
");
      }
    }
    else printf ("Falsche Antwort: ".bin2hex($data)."
".strlen($data));
    break;
  Case "TimerEvent":
    foreach(IPS_GetChildrenIDs($BGETechMetersID) as $meter){   // alle Unterobjekte durchlaufen
      $ok=false;
      RegVar_SetBuffer($BGETechRegVarID, ""); 
      $serial = GetValue(IPS_GetVariableIDByName("MeterID", $meter));
      $cmd = "/?".$serial."!
";
      COMPort_SendText($BGETechComPortID, $cmd); 
      if (getAnswer(19)) { 
        $cmd = ACK."0:1
";  //ACK / Option Select Message senden ('Programming Mode') 
        COMPort_SendText($BGETechComPortID, $cmd); 
        if (getAnswer(35)) { 
          $cmd = "P1".STX.$password.ETX; 
          COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
          if (getAnswer(36)) { 
            $cmd = "R1".STX."00000010()".ETX; 
            COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
            if (getAnswer(57)) {
              $cmd = "R1".STX."00000003()".ETX; 
              COMPort_SendText($BGETechComPortID, genCMD($cmd)); 
              if (getAnswer(73)) {
                $cmd = "B0".ETX; 
                COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
                if (getAnswer(74)) {
                  $data = RegVar_GetBuffer($BGETechRegVarID);
                  $ok=true;
                }
              }
            }
          }
        }
        if ($ok) {
          /*  Antwortbuffer: 
            0 -18 /YTL:xxxxxxxxxxxx..
            19-34 .P0.(00000000)..
            35 (ACK)
            36-56 .00000010(xxxxxxxx)..
            57-73 .00000003(xxxx)..
          */ 
          $value = floatval(substr($data, 47, 8)); 
          SetValue(IPS_GetVariableIDByName("Gesamtverbrauch", $meter), $value / 1000);
          $value = floatval(substr($data, 67, 4)); 
          SetValue(IPS_GetVariableIDByName("Leistung", $meter), $value*10);
        }
        else {
          $id=CreateVariable("ComError", 1, IPS_GetParent($BGETechMetersID));
          SetValue($id,GetValue($id)+1);
          RegVar_SetBuffer($BGETechRegVarID, "");
        } 
        IPS_Sleep($sleep);
      }  
    }   
		SetValueString(CreateVariable("LastUpdate", 3, IPS_GetParent($BGETechMetersID)),date("d.m.y H:i:s"));
    break;
  Case "RegisterVariable": //
    $datenFrame = RegVar_GetBuffer($IPS_INSTANCE); // Buffer Registervariable auslesen
    $datenFrame .= $IPS_VALUE;
    RegVar_SetBuffer($IPS_INSTANCE,$datenFrame);
    break;
}

function genCmd($cmd) { //generiert Sendestring mit SOH und Checksumme
  $cc=0;
  for($i=0; $i<strlen($cmd); $i++) $cc ^=ord($cmd[$i]);
  return chr(1).$cmd.chr($cc);
} 
 
function getAnswer($len) {
  global $BGETechRegVarID,$sleep;
  $i=0;
  $x=strlen(RegVar_GetBuffer($BGETechRegVarID));
  while (($x!=$len) && ($i++<($sleep/10))) {
   IPS_Sleep(10);
   $x=strlen(RegVar_GetBuffer($BGETechRegVarID));
  }
  return ($x>=$len);
} 
?>

So nun viel Spaß, freue mich über Feedback.
mfg Thomas

Hallo Zusammen,

am Wochenende sollten endlich meine Zähler (DRS155M) eingebaut werden.

Leider hat sich herausgestellt, dass die Zähler trotz Normgröße nicht in unseren
Zählerschrank passten. Die Zähler sind schlichtweg zu hoch, sodass ich die Abdeckung
nicht mehr darauf bekommen habe.

Hat jemand eine Idee?

hdo

In einige Verteilern kann man (in meinem Verteilerschrank zumindest) die Hutschiene höher oder tiefer setzen. Aber auf der selben Schiene unterschiedliche Höhen wird schlecht gehen. Bleibt wohl nur ausschneiden und gegen Berührung schützen.