Stromzähler mit RS485

Danke für die Antwort. Hmm, in meinem Verteilerschrank von Hager sieht es nicht danach aus, als könnte man die Schiene tiefer setzen, dafür ist die Schiene wohl zu breit und außerdem fehlen die Befestigungsmöglichkeiten :frowning:

Hi,

hat schon jemand den 3-Phasenzähler am Start?

Kann man dort die Leistung jeder einzelnen Phase auslesen oder nur die Summe.

1x3 Phase ist mir lieber als 3x1 Phase.

Gruß
Andre

Gesendet von meinem GT-I9100 mit Tapatalk 2

Hallo zusammen,

ich brauch mal Eure Hilfe.

ich hab hier 2 DRS155M liegen und 2 verschiedene USB<->Rs485 Adapter.

Von keinem der beiden Stromzähler bekomme ich eine Antwort. Mit beiden Adaptern getestet.
Weder mit den IPS-Skripten noch mit dem Tool zum Setzen der ID.

Für diesen kleinen Testaufbau habe ich jeweils den Stromzähler mit 3 kurzen Drahtbrücken mit dem Adapter verbunden. (A,B,Ground). Vielleicht liegt ja hier schon ein Fehler.

Irgendwo habe ich einen Wurm drin. Wer kann mir helfen?

Danke im Voraus,
Günter

Bekommst Du denn mit HTerm Daten?

Gruß Helmut

Doofe Frage, hast du die Zähler auch an 230V angeschlossen? ID setzen immer nur mit einem Zähler!

Gruß Tommy

Danke für die Tipps.

Aber es waren wohl die USB<->RS485 Converter schuld.
Ich habe nochmal welche gekauft und siehe da, mit diesen funktioniert die Abfrage ohne Probleme.

Folgende zwei gingen bei mir nicht:

  • „USB 2.0 zu Seriell Konverter-Adapter FTDI FT232RL SN75176 TTL-RS485 doppelter Funktionsdoppeltschutz“ Aufdruck GmM und betemcu.cn
  • „Digitus DA-70157 Seriell Adapter USB 2.0“

Dieser geht bei mir:

  • „RS-485 Interface Konverter Adapter: USB auf RS485“ von KMtronic (es gibt hier 2 verschiedene. Ich habe die Platinenversion)

Danke trotzdem nochmal an die Helfer.
VG,
Günter

Hi erstmal vielen Dank an die Community, das Ihr wiedermal so was tolles hier bereit stellt :slight_smile:

Ich habe mir mal einen USB auf RS485 Adapter, 1 x DRT715CT und 1 x DRS155M bestellt.

Ich werde das Script von Thomas (vielen Dank an Ihn :wink: verwenden.

Ich werde berichten, wie gut es bei klappt :wink:

Viel Erfolg, läuft hier mit 4 DRSM155 problemlos. :slight_smile:

Sent from my iPhone using Tapatalk

Habe das Script über den Weihnachtsurlaub nochmal überarbeitet.
Speziell die Fehlererkennung wurde verbessert.
In der alten Version wurden oft Werte eines vorher abgefragten Zählers als gültig für den aktuellen Zähler genommen, auch die Zeit zwischen den Abfragen wird nun besser kontrolliert.
Die Variable Gesamtverbrauch wird nun auf 0,1 kWh gerundet, dadurch reduziert sich die Datenmenge in der geloggten Variablen deutlich (Kann in Zeile 165 geändert werden)

<? 
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":
    $errorid=CreateVariable("ComError", 1, IPS_GetParent($BGETechMetersID));
    $lasterror=GetValue($errorid);
    foreach(IPS_GetChildrenIDs($BGETechMetersID) as $meter){   // alle Unterobjekte durchlaufen
      $ok=false;
      $ec=0;
      $data="";
      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) {
        $data = RegVar_GetBuffer($BGETechRegVarID);
        $ec=1;
      }
      else if (substr($data,0,34)<>"/YTL:".$serial."
".SOH."P0".STX."(00000000)".ETX) {
        $ok=false;
        $ec=2;
      }
      else if ($data[35]!=ACK) {
        $ok=false;
        $ec=3;
      }
      if ($ok) {
        /*  Antwortbuffer: 
          0 -18 /YTL:xxxxxxxxxxxx..
          19-34 .P0.(00000000)..
          35 (ACK)
          36-56 .00000010(xxxxxxxx)..
          57-73 .00000003(xxxx)..
        */ 
        if (substr($data,37,9)=="00000010(") {
          $value = floatval(substr($data, 46, 8)); 
			    SetValue(IPS_GetVariableIDByName("Gesamtverbrauch", $meter), floor($value/100)/10);
        } else $ec=4;
        if (substr($data,58,9)=="00000003(") {
          $value = floatval(substr($data, 67, 4));
          SetValue(IPS_GetVariableIDByName("Leistung", $meter), $value*10);
        } else $ec+=5;
      }
      if ($ec) {
        // 1 nok 2 Header falsch 3 kein Ack  4 Leistung 5 Power 9 L+P
        IPS_LogMessage("BGETech_Controller","Errorcause:".$ec."/".$serial."-".$data);
        SetValue($errorid,GetValue($errorid)+1);
        RegVar_SetBuffer($BGETechRegVarID, "");
      } 
      if ($ok) IPS_Sleep($sleep); else IPS_Sleep($sleep*5); 
    }   
    if ((GetValue($errorid)-$lasterror)>5) {
   	  COMPort_SetOpen( $BGETechComPortID /*[Plugwise]*/, false );
	    IPS_ApplyChanges( $BGETechComPortID /*[Plugwise]*/ );
	    COMPort_SetOpen( $BGETechComPortID /*[Plugwise]*/, true );
	    IPS_ApplyChanges( $BGETechComPortID /*[Plugwise]*/ );
    }
		else 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/5))) {
   IPS_Sleep(10);
   $x=strlen(RegVar_GetBuffer($BGETechRegVarID));
  }
  return ($x>=$len);
} 
?>

Wer’s braucht …
Gruß Thomas

Danke Thomas, ich werde es bestimmt gebrauchen können :slight_smile:

Hi vielen Dank für dein Script, funktioniert super, aber ich bekomme bei Wirkleistung immer 0 oder 50, ist das normal ?

Mit deinem Script kann ich nur 1 Zähler auslesen oder ?

Hallo drapple,

sorry für die späte Antwort.

Bei der Wirkleistung sollte bei keiner oder höherer Last definitiv etwas anderes stehen. :slight_smile:
Evtl. mal mit $sleep spielen (Nach oben oder unten!) Zwei Zähler habe ich noch nicht installiert, einer hat davon aber auch nur Mist angezeigt. Hier war nur der Zählerstand zu „gebrauchen“.
Das ganze ist bei mir aber noch „Bastelstatus“ - die Zeit…

Aktuell lese ich der Reihe nach 7 Zähler aus. Ich hänge mein Script mit der zugehörigen Struktur mal mit an.

<?
$sleep = 210;
SetValue(13295 /*[Info\Elektrozähler\Gesamt\Leistung]*/, GetValue(21651 /*[Info\Elektrozähler\Wohnraum\Wirkleistung]*/) + GetValue(53408 /*[Info\Elektrozähler\Galerie\Wirkleistung]*/) + GetValue(13095 /*[Info\Elektrozähler\Küche\Wirkleistung]*/) + GetValue(35058 /*[Info\Elektrozähler\Arbeitsraum\Wirkleistung]*/) + GetValue(10427 /*[Info\Elektrozähler\Bad\Wirkleistung]*/) + GetValue(21271 /*[Info\Elektrozähler\Flur + WC\Wirkleistung]*/) + GetValue(44923 /*[Info\Elektrozähler\Schlafraum\Wirkleistung]*/)); //Gesamtleistung
SetValue(15557 /*[Info\Elektrozähler\Gesamt\Strom]*/, GetValue(34974 /*[Info\Elektrozähler\Wohnraum\Strom]*/) + GetValue(58442 /*[Info\Elektrozähler\Galerie\Strom]*/) + GetValue(38828 /*[Info\Elektrozähler\Küche\Strom]*/) + GetValue(51883 /*[Info\Elektrozähler\Arbeitsraum\Strom]*/) + GetValue(48116 /*[Info\Elektrozähler\Bad\Strom]*/) + GetValue(17910 /*[Info\Elektrozähler\Flur + WC\Strom]*/) + GetValue(48922 /*[Info\Elektrozähler\Schlafraum\Strom]*/)); //Gesamtverbrauch

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (GetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/) == 32) { 	// Galerie
   //Init
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, true);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	//Zähler-ID
	$serial = "000000000032";                                                                							
	$cmd = chr(0x2F).chr(0x3F).$serial.chr(0x21).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//ACK / Option Select Message senden ('Programming Mode')
	$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//Passwort
	$password = "(00000000)";                                                                							
	$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62);                        							//****************** Gesamtleistung/Zählerstand / 1000 kWh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000011()".chr(0x03).chr(0x63);                        							//****************** Gesamtleistung/Zählerstand (Kopie von ...10)
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62);                        							//****************** Strom / 10 A
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63);                        							//****************** Spannung / 10 V
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000003()".chr(0x03).chr(0x60);                        							//****************** Wirkleistung x 10 Wh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, false);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	IPS_Sleep($sleep);
	$data = RegVar_GetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/);
	//echo $data;
	// Gesamtleistung/Zählerstand / 1000 kWh
	$value1 = substr($data, strpos($data, "00000010(")+9,8); //Zählerstand 1
	$value2 = substr($data, strpos($data, "00000011(")+9,8);	//Zählerstand 2
	if ($value1 == $value2){	SetValue(16658 /*[Info\Elektrozähler\Galerie\aktueller Zählerstand]*/, $value1 / 1000);	}  //Abgleich
   // Strom / 10 A
	$value = substr($data, strpos($data, "00000001(")+9,4); //Strom
	SetValue(58442 /*[Info\Elektrozähler\Galerie\Strom]*/, $value / 10);
 	// Spannung / 10 V
	$value = substr($data, strpos($data, "00000000(")+9,4); //Spannung
   if ($value > 200){		SetValue(28493 /*[Info\Elektrozähler\Galerie\Spannung]*/, $value / 10);   }
	// Wirkleistung x 10 W
	$value = substr($data, strpos($data, "00000003(")+9,4); //Wirkleistung
   SetValue(53408 /*[Info\Elektrozähler\Galerie\Wirkleistung]*/, $value * 10);
 	RegVar_SetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/, "");
   SetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/, 8); //Wechsel zum nächsten Zähler
   return;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (GetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/) == 8) { 	// Schlafraum
   //Init
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, true);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	//Zähler-ID
	$serial = "000000000008";
	$cmd = chr(0x2F).chr(0x3F).$serial.chr(0x21).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//ACK / Option Select Message senden ('Programming Mode')
	$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//Passwort
	$password = "(00000000)";
	$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62);                        			//****************** Gesamtleistung/Zählerstand / 1000 kWh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000011()".chr(0x03).chr(0x63);                        			//****************** Gesamtleistung/Zählerstand (Kopie von ...10)
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62);                        			//****************** Strom / 10 A
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63);                        			//****************** Spannung / 10 V
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000003()".chr(0x03).chr(0x60);                        			//****************** Wirkleistung x 10 Wh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, false);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	IPS_Sleep($sleep);
	$data = RegVar_GetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/);
	echo $data;
   $value1 = substr($data, strpos($data, "00000010(")+9,8); //Zählerstand 1
	$value2 = substr($data, strpos($data, "00000011(")+9,8);	//Zählerstand 2
	if ($value1 == $value2){	SetValue(30191 /*[Info\Elektrozähler\Schlafraum\aktueller Zählerstand]*/, $value1 / 1000);	}  //Abgleich
	$value = substr($data, strpos($data, "00000001(")+9,4); //Strom
	SetValue(48922 /*[Info\Elektrozähler\Schlafraum\Strom]*/, $value / 10);
 	$value = substr($data, strpos($data, "00000000(")+9,4); //Spannung
	if ($value > 200){		SetValue(35021 /*[Info\Elektrozähler\Schlafraum\Spannung]*/ , $value / 10);     	}
	$value = substr($data, strpos($data, "00000003(")+9,4); //Wirkleistung
	SetValue(44923 /*[Info\Elektrozähler\Schlafraum\Wirkleistung]*/, $value * 10);
	RegVar_SetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/, "");
   SetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/, 84); //Wechsel zum nächsten Zähler
   return;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (GetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/) == 84) {	// Arbeitsraum
	//Init
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, true);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	//Zähler-ID
	$serial = "000000000084";
	$cmd = chr(0x2F).chr(0x3F).$serial.chr(0x21).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//ACK / Option Select Message senden ('Programming Mode')
	$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//Passwort
	$password = "(00000000)";
	$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62);                        			//****************** Gesamtleistung/Zählerstand / 1000 kWh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000011()".chr(0x03).chr(0x63);                        			//****************** Gesamtleistung/Zählerstand (Kopie von ...10)
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62);                        			//****************** Strom / 10 A
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63);                        			//****************** Spannung / 10 V
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000003()".chr(0x03).chr(0x60);                        			//****************** Wirkleistung x 10 Wh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, false);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	IPS_Sleep($sleep);
	$data = RegVar_GetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/);
	//echo $data;
   $value1 = substr($data, strpos($data, "00000010(")+9,8); //Zählerstand 1
	$value2 = substr($data, strpos($data, "00000011(")+9,8);	//Zählerstand 2
	if ($value1 == $value2){	SetValue(10285 /*[Info\Elektrozähler\Arbeitsraum\aktueller Zählerstand]*/, $value1 / 1000);	}  //Abgleich
	$value = substr($data, strpos($data, "00000001(")+9,4); //Strom
	SetValue(51883 /*[Info\Elektrozähler\Arbeitsraum\Strom]*/, $value / 10);
 	$value = substr($data, strpos($data, "00000000(")+9,4); //Spannung
	if ($value > 200){		SetValue(18304 /*[Info\Elektrozähler\Arbeitsraum\Spannung]*/, $value / 10);     	}
	$value = substr($data, strpos($data, "00000003(")+9,4); //Wirkleistung
	SetValue(35058 /*[Info\Elektrozähler\Arbeitsraum\Wirkleistung]*/, $value * 10);
 	RegVar_SetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/, "");
   SetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/, 86); //Wechsel zum nächsten Zähler
   return;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (GetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/) == 86) {	// Flur + WC
	//Init
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, true);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	//Zähler-ID
	$serial = "000000000086";
	$cmd = chr(0x2F).chr(0x3F).$serial.chr(0x21).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//ACK / Option Select Message senden ('Programming Mode')
	$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//Passwort
	$password = "(00000000)";
	$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62);                        			//****************** Gesamtleistung/Zählerstand / 1000 kWh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000011()".chr(0x03).chr(0x63);                        			//****************** Gesamtleistung/Zählerstand (Kopie von ...10)
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62);                        			//****************** Strom / 10 A
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63);                        			//****************** Spannung / 10 V
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000003()".chr(0x03).chr(0x60);                        			//****************** Wirkleistung x 10 Wh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, false);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	IPS_Sleep($sleep);
	$data = RegVar_GetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/);
	//echo $data;
   $value1 = substr($data, strpos($data, "00000010(")+9,8); //Zählerstand 1
	$value2 = substr($data, strpos($data, "00000011(")+9,8);	//Zählerstand 2
	if ($value1 == $value2){	SetValue(25505 /*[Info\Elektrozähler\Flur + WC\aktueller Zählerstand]*/, $value1 / 1000);	}  //Abgleich
	$value = substr($data, strpos($data, "00000001(")+9,4); //Strom
   SetValue(17910 /*[Info\Elektrozähler\Flur + WC\Strom]*/, $value / 10);
 	$value = substr($data, strpos($data, "00000000(")+9,4); //Spannung
   if ($value > 200){		SetValue(48720 /*[Info\Elektrozähler\Flur + WC\Spannung]*/, $value / 10);	}
   $value = substr($data, strpos($data, "00000003(")+9,4); //Wirkleistung
   SetValue(21271 /*[Info\Elektrozähler\Flur + WC\Wirkleistung]*/, $value * 10);
 	RegVar_SetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/, "");
   SetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/, 87); //Wechsel zum nächsten Zähler
   return;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if (GetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/) == 87) {	// Küche
   //Init
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, true);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	//Zähler-ID
	$serial = "000000000087";
	$cmd = chr(0x2F).chr(0x3F).$serial.chr(0x21).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//ACK / Option Select Message senden ('Programming Mode')
	$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	//Passwort
	$password = "(00000000)";
	$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62);                        			//****************** Gesamtleistung/Zählerstand / 1000 kWh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000011()".chr(0x03).chr(0x63);                        			//****************** Gesamtleistung/Zählerstand (Kopie von ...10)
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62);                        			//****************** Strom / 10 A
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63);                        			//****************** Spannung / 10 V
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."R1".chr(0x02)."00000003()".chr(0x03).chr(0x60);                        			//****************** Wirkleistung x 10 Wh
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	IPS_Sleep($sleep);
	$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
	COMPort_SendText(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, $cmd);
	COMPort_SetOpen(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/, false);
	IPS_ApplyChanges(10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/);
	IPS_Sleep($sleep);
	$data = RegVar_GetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/);
	//echo $data;
   $value1 = substr($data, strpos($data, "00000010(")+9,8); //Zählerstand 1
	$value2 = substr($data, strpos($data, "00000011(")+9,8);	//Zählerstand 2
	if ($value1 == $value2){	SetValue(13865 /*[Info\Elektrozähler\Küche\aktueller Zählerstand]*/, $value1 / 1000);	}  //Abgleich
	$value = substr($data, strpos($data, "00000001(")+9,4); //Strom
   SetValue(38828 /*[Info\Elektrozähler\Küche\Strom]*/, $value / 10);
   $value = substr($data, strpos($data, "00000000(")+9,4); //Spannung
   if ($value > 0){		SetValue(25620 /*[Info\Elektrozähler\Küche\Spannung]*/, $value / 10);	}
   $value = substr($data, strpos($data, "00000003(")+9,4); //Wirkleistung
   SetValue(13095 /*[Info\Elektrozähler\Küche\Wirkleistung]*/, $value * 10);
 	RegVar_SetBuffer(10239 /*[Info\Elektrozähler\Register Variable]*/, "");
   SetValue(28095 /*[Info\Elektrozähler\Gesamt\dieser Zähler wird in 30 Sekunden ausgelesen:]*/, 32); //Wechsel zum nächsten Zähler
   return;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

?>

Hi ich habe nun den 4 Drehstromzähler getestet…

Endlich funktioniert mal einer gescheit :wink:

Aber mehr als die Volt pro Phase kann ich nicht auslesen, die Umrechnung will nicht klappen…

Kann mir jemand helfen ?

Hier die Doku :

https://dl.dropboxusercontent.com/u/2476467/SDM630M%20protocol%20V2013-1.pdf

Ich weis nicht wie die Umrechnung der Empfangenen Werte ist, die Doku zweigt nur ein Beispiel für Volt, das Klappt auch…

Hi wer noch einen Drehstromzähler sucht :

http://www.ip-symcon.de/forum/threads/24128-3-Phasen-Stromz�hler-SDM630M-DC-alle-Werte-auslesen-!!!-Installationssript-!?p=220099#post220099

Hallo,

Habe einen DRS210C von B+G eTech. Dieser Zähler ist per RS485 auslesbar, was ich mir vom Hersteller in einem Telefonat bestätigen ließ. Der Zähler tut seit heute seinen Dienst. Das Auslesen bereitet mir doch einige Schwierigkeiten. Auch nach 5 Stunden läßt er sich keinerlei Angaben entlocken. Habe im Vorfeld u.a. schon hier, hier und hier gelesen.

Verschiedene Änderungen an den Schnittstellendaten, Modbus etc. Nichts davon klappt bis jetzt. Vielleicht habt ihr eine Idee.

Möglicherweise liegt es auch am Wandler (http://www.amazon.de/Seriell-Konverter-Adapter-TTL-RS485-doppelter-Funktionsdoppeltschutz/dp/B00BGZT04K/ref=sr_1_1?ie=UTF8&qid=1396197250&sr=8-1&keywords=rs485). Ist es möglich, eine Art Basiskomunikation zu bauen und zu testen? Der Zähler ist das einzige Gerät am Wandler. Entfernung Wandler-Zähler ist ca. 1m. Am Zähler soll bei Kommunikation ein Symbol erscheinen - bisher konnte ich nichts erkennen.

Am liebsten wäre mir Modbus RTU (finde das in der TCP-Version beim Pokeys gut - da klappte das auf Anhieb!), IPS kann damit um und der Zähler lt. Datenblatt auch. Aber so wie es mws beschrieben hat geht es bisher nicht.

Hi kannst du hier mal die Doku vom Zähler bereit stellen :wink:

Und dein Zähler hat Modbus RTU :wink:

Laut B+G:

Die S0-Schnittstelle mit bis zu 1000 imp./kWh (Einstellbar) als auch die RS485-Schnittstelle (MODBUS RTU with 16 bit CRC)

Also haben wir schonmal eine gute Bedingung das Teil zum laufen zu bringen :wink:

Eine grundsätzliche Frage stellt sich bzgl. der Schnittstelleneinstellungen für die Com. Welche verwendet ihr? Scheint ja irgenwie keine eindeutige Einstellung zugeben. In verschiedenen Beiträgen verschiedene Einstellungen.

Also an meinem SDM630M kann ich über ein Menü einstellen welche Parameter die Ser. Schnittstelle haben soll. Ich hab bei mir 9600/8/N/1 eingestellt. Das ist glaube ich auch die Default Einstellung. Reicht von der Geschwindigkeit völlig aus.

Habe gerade mal die (evtl. festen) Schnittstellendaten bei B+G angefordert, vielleicht Antwort morgen. Handbuch (bzw. der mitgelieferte Ersatz dafür) werden ich mal versuchen einzuscannen und hier bereitszustellen. Sind eigentlich nur „Handblätter“.

Am Ende sollen beide Zähler auf einem Bus laufen. Aber mws hatte ja berichtet, dass der SDM630 einstellbar ist.

Ich bin jetzt auch dem Club B+G beigetreten. Erste Tests liefen erfolgreich. Ich würde sagen, da geht was. :slight_smile:

Mein Hauptprojekt ist im Moment aber ein Anderes. Da brauche ich also noch etwas Zeit bis ich euch eine Ein-Klick-Lösung präsentieren kann.

Gruß,

Toni

Gesendet von meinem HTC One