Hi, ich habe jetzt 4 3-Phasen Stromzähler zum testen mit IPS mir bestellt gehabt, den Voltkraft 102 usw.
Aber keiner hat mir wirklich gute „Daten“ geliefert…
Bis ich den SDM630M DC gefunden habe.
Link zum Shop: http://bg-etech.de/os/product_info.php?products_id=50&osCsid=1mal7atdkn9iu97e8s9ocatig5
Nach vielen Emails mit dem Support von B+G und der super Hilfe von User Lokla habe ich es endlich hinbekommen
Ich habe mich erstmal nur um den Part vom Auslesen der Werte gekümmert !
Das Ding spuckt alles aus was man nur als Datensammler haben will aus :
Ich lasse es alle 30sec auslesen
Installation
Vorwort:
Man benötigt noch einen usb RS485 Adapter, den bekommt man bei Ebay für 2€ inkl. aus China…
Los geht’s:
Ich habe den Installer für IPS angehängt, einfach ein neues Script anlegen und den Inhalt 1:1 des angehängte Script in das angelgete Script Kopieren und ausführen.
Es wird alles automatisch anlegt (hoffe ich zumindest)
Jetzt legt man einen Serial Port an, folgende Einstellungen in IPS und im Gerätemanager für den Serial Port setzten :
Legt unter den Serial Port eine Variable mit Float und nennt die Buffer !
Es braucht man noch eine Register Variable, R.V. anlegen und mit dem Serial Port verbinden.
Legt ein neues Script an und kopiert 1:1 das:
<?
$RegVar = 59976 /*[Stromzähler Gesamt\Stromzähler Gesamt]*/ ; //Register Variable
$buffer = 48720 /*[Stromzähler Gesamt\Stromzähler Gesamt\Buffer]*/; // Buffer Variable
//ab hier nix mehr ändern !!!!
if($_IPS['SENDER'] == "RegisterVariable") {
$data = RegVar_GetBuffer($_IPS['INSTANCE']);
$data .= $_IPS['VALUE'];
RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}
//**********************Funktion für String in Hex umzuwandeln !!!!*************
function string2hex ( $string ) {
$hex = NULL;
for ( $ix=0; $ix < strlen($string); $ix=$ix+1 ) {
$char = substr( $string, $ix, 1 );
$ord = ord ( $char );
if ( $ord < 16 ) {
$hex .= '0'.dechex( $ord );
}
else {
$hex .= dechex( $ord );
}
// add line break or space
if ( $ix && ($ix % 16) == 15 ) {
$hex .= "
";
}
else {
$hex .= " ";
}
}
// strip trailing space or linebreak
return substr( $hex, 0, -1 );
}
function hex2string( $hex ) {
$string = NULL;
// strip linebreaks and spaces
$hex = str_replace( array("
","\r"," "), "", $hex );
for ( $ix=0; $ix < strlen($hex); $ix=$ix+2 ) {
$ord = hexdec( substr( $hex, $ix, 2 ) );
$string .= chr( $ord );
}
return $string;
}
// Umrechnung
$data = RegVar_GetBuffer($RegVar);
$value = String2Hex($data);
//$value = "01 04 04 43 70 80 00 00 00"; // Zum Testen, es muss 240,5 rauskommen :-)
$value = explode(' ', $value);
$wert3=hexdec($value[3]);
$wert4=hexdec($value[4]);
$wert5=hexdec($value[5]);
$wert6=hexdec($value[6]);
$sign = $wert3 >> 7;
$exponent = (($wert3 & 0x7F) << 1) + (($wert4 & 0x80) >> 7) - 127;
$mantisse = (($wert4 | 0x80) << 16) + ($wert5 << 8) + $wert6;
$zaehler= 0;
if ($sign == 0) {
# exponent is positive
//$zaehler= $mantisse / (0x7FFFFF >> $exponent);
$teiler = 0x7FFFFF / pow(2, $exponent);
$zaehler = $mantisse / $teiler;
}
else
{
$teiler = 0x7FFFFF * pow(2, $exponent);
$zaehler = $mantisse / $teiler;
}
//echo $zaehler;
setvalue($buffer ,$zaehler);
//RegVar_SetBuffer($RegVar, ""); //Variable löschen
?>
Man muss noch die $RegVar und $buffer anpassen !
Jetzt öffnet man das Script „auslesen“:
Hier muss auch noch die $RegVar , $ComPort und $buffer angepasst werden !
So wenn das alles erledigt ist, dann sollte Ihr ab jetzt mit vielen Werten bombardiert werden
Stromzaehler_v2 by_Drapple.php.zip (18.8 KB)