Das Ergebnis unten funktioniert besser als erwartet (Meine PHP-Lernkurve ist steil). Das Gesamtscript benötigt 7 Sekunden, schafft also 6 Kesselruns in...ah falscher Film.
@Ulrich vielleicht ließe sich zumindest der Code der funktionen.inc so oder so ähnlich ins offizielle Script aufnehmen, damit es wieder "Updatefest" wird. Mit der IF-Abfrage sollte niemand davon negativ behelligt werden.
in die sma_wr_math.php fügen wir ein:
Code: Alles auswählen
<?php
$funktionen->log_schreiben("------------- Home_Manager auslesen START -------------------------- ","|--",6);
$HM_Port = 9522;
$WR_IP = "";
if(!($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
$funktionen->log_schreiben("SMA HM auslesen -> UDP Socket konnte nicht geöffnet werden","XX ",3);
$funktionen->log_schreiben($errormsg,"XX ",3);
goto Ausgang;
}
if( !socket_bind($socket, "0.0.0.0" , $HM_Port) ) { // Bind an localhost
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
$funktionen->log_schreiben("SMA HM auslesen -> UDP Socket Bind Fehler","XX ",3);
$funktionen->log_schreiben($errormsg,"XX ",3);
goto Ausgang;
}
/***** WIRD NUR FÜR MULTICAST BENÖTIGT
$adress = "239.12.255.254"; // Multicast IP used by SMA
$rc = socket_set_option($socket,IPPROTO_IP,MCAST_JOIN_GROUP,array("group"=>$adress,"interface"=>0));
if ($rc === false) {
$funktionen->log_schreiben("SMA HM auslesen -> Unable to join multicast group"," ",5);
goto Ausgang;
}
**/
$rc = socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>1, "usec"=>500000));
if ($rc === false) {
$funktionen->log_schreiben("SMA HM auslesen -> Set Option Fehler"," ",5);
goto Ausgang;
}
$funktionen->log_schreiben("SMA HM auslesen -> UDP Socket Bind OK."," ",8);
$funktionen->log_schreiben("SMA HM auslesen -> Die Daten werden ausgelesen...","+ ",9);
for ($t = 1; $t < 3; $t++) {
// $rc = socket_recvfrom($sock, $buf, 512, MSG_DONTWAIT, $WR_IP, $WR_Port);
$rc = socket_recvfrom($socket, $buf, 610, 0, $WR_IP, $WR_Port);
if ($buf) {
break;
}
usleep(50000);
}
$Daten = bin2hex($buf);
$aktuelleDaten["HM2"] = 1;
$aktuelleDaten["HM_SMA"] = trim($funktionen->Hex2String(substr($Daten,0,8)));
$aktuelleDaten["HM_TAG0"] = substr($Daten,12,4);
$aktuelleDaten["HM_Gruppe"] = substr($Daten,16,8);
$aktuelleDaten["HM_Datenlaenge"] = hexdec(substr($Daten,24,4));
$aktuelleDaten["HM_SMA_NET_2"] = substr($Daten,28,4);
$aktuelleDaten["HM_Protokoll_ID"] = substr($Daten,32,4);
$aktuelleDaten["HM_Susy-ID"] = hexdec(substr($Daten,36,4));
$aktuelleDaten["HM_SerNo"] = hexdec(substr($Daten,40,8));
$aktuelleDaten["HM_Ticker_ms"] = hexdec(substr($Daten,48,8));
$aktuelleDaten["HM_Wh_Bezug"] = (hexdec(substr($Daten,strpos($Daten,"00010800",0)+8,16))/3600);
$aktuelleDaten["HM_Wh_Einspeisung"] = (hexdec(substr($Daten,strpos($Daten,"00020800",0)+8,16))/3600);
$aktuelleDaten["HM_PF_Leistung"] = (hexdec(substr($Daten,strpos($Daten,"000d0400",0)+8,8))/1000);
$aktuelleDaten["HM_Frequenz"] = round((hexdec(substr($Daten,strpos($Daten,"000e0400",0)+8,8))/1000),2);
$aktuelleDaten["HM_BezugPhase_R"] = (hexdec(substr($Daten,strpos($Daten,"00150400",0)+8,8))/10);
$aktuelleDaten["HM_EinspeisungPhase_R"] = (hexdec(substr($Daten,strpos($Daten,"00160400",0)+8,8))/10);
$aktuelleDaten["HM_AC_Leistung_R"] = ((hexdec(substr($Daten,strpos($Daten,"00150400",0)+8,8))/10) - (hexdec(substr($Daten,strpos($Daten,"00160400",0)+8,8))/10));
$aktuelleDaten["HM_AC_Strom_R"] = (hexdec(substr($Daten,strpos($Daten,"001f0400",0)+8,8))/1000);
$aktuelleDaten["HM_AC_Spannung_R"] = round((hexdec(substr($Daten,strpos($Daten,"00200400",0)+8,8))/1000),2);
$aktuelleDaten["HM_PF_R"] = (hexdec(substr($Daten,strpos($Daten,"00210400",0)+8,8))/1000);
$aktuelleDaten["HM_BezugPhase_S"] = (hexdec(substr($Daten,strpos($Daten,"00290400",0)+8,8))/10);
$aktuelleDaten["HM_EinspeisungPhase_S"] = (hexdec(substr($Daten,strpos($Daten,"002a0400",0)+8,8))/10);
$aktuelleDaten["HM_AC_Leistung_S"] = ((hexdec(substr($Daten,strpos($Daten,"00290400",0)+8,8))/10) - (hexdec(substr($Daten,strpos($Daten,"002a0400",0)+8,8))/10));
$aktuelleDaten["HM_AC_Strom_S"] = (hexdec(substr($Daten,strpos($Daten,"00330400",0)+8,8))/1000);
$aktuelleDaten["HM_AC_Spannung_S"] = round((hexdec(substr($Daten,strpos($Daten,"00340400",0)+8,8))/1000),2);
$aktuelleDaten["HM_PF_S"] = (hexdec(substr($Daten,strpos($Daten,"00350400",0)+8,8))/1000);
$aktuelleDaten["HM_BezugPhase_T"] = (hexdec(substr($Daten,strpos($Daten,"003d0400",0)+8,8))/10);
$aktuelleDaten["HM_EinspeisungPhase_T"] = (hexdec(substr($Daten,strpos($Daten,"003e0400",0)+8,8))/10);
$aktuelleDaten["HM_AC_Leistung_T"] = ((hexdec(substr($Daten,strpos($Daten,"003d0400",0)+8,8))/10) - (hexdec(substr($Daten,strpos($Daten,"003e0400",0)+8,8))/10));
$aktuelleDaten["HM_AC_Strom_T"] = (hexdec(substr($Daten,strpos($Daten,"00470400",0)+8,8))/1000);
$aktuelleDaten["HM_AC_Spannung_T"] = round((hexdec(substr($Daten,strpos($Daten,"00480400",0)+8,8))/1000),2);
$aktuelleDaten["HM_PF_T"] = (hexdec(substr($Daten,strpos($Daten,"00490400",0)+8,8))/1000);
$Firmware = substr($Daten,strpos($Daten,"007f0400",0)+8,8);
$aktuelleDaten["HM_Firmware"] = substr($Firmware,4,1).".".substr($Firmware,5,1).".".strtoupper(substr($Firmware,6,1)).".".substr($Firmware,7,1);
$aktuelleDaten["HM_Bezug"] = ((hexdec(substr($Daten,strpos($Daten,"00150400",0)+8,8))/10) + (hexdec(substr($Daten,strpos($Daten,"00290400",0)+8,8))/10) + (hexdec(substr($Daten,strpos($Daten,"003d0400",0)+8,8))/10));
$aktuelleDaten["HM_Einspeisung"] = ((hexdec(substr($Daten,strpos($Daten,"00160400",0)+8,8))/10) + (hexdec(substr($Daten,strpos($Daten,"002a0400",0)+8,8))/10) + (hexdec(substr($Daten,strpos($Daten,"003e0400",0)+8,8))/10));
$aktuelleDaten["HM_AC_Strom"] = ((hexdec(substr($Daten,strpos($Daten,"001f0400",0)+8,8))/1000) + (hexdec(substr($Daten,strpos($Daten,"00330400",0)+8,8))/1000) + (hexdec(substr($Daten,strpos($Daten,"00470400",0)+8,8))/1000));
$aktuelleDaten["HM_AC_Leistung"] = ($aktuelleDaten["HM_AC_Leistung_R"] + $aktuelleDaten["HM_AC_Leistung_S"] + $aktuelleDaten["HM_AC_Leistung_T"]);
$aktuelleDaten["HM_GesamterLeistungsbedarf"] = ($aktuelleDaten["HM_Wh_Bezug"] + $aktuelleDaten["HM_Wh_Einspeisung"]);
Ausgang:
$funktionen->log_schreiben("------------- Home_Manager auslesen STOP -------------------------- ","|--",6);
return;
?>
unter phpinc/funktionen.inc.php
fügen wir ein am Ende der Sektion case 27: direkt VOR dem break;
Code: Alles auswählen
if (isset($daten["HM2"]) and $daten["HM2"] == "1") {
$query .= "HM_AC ";
$query .= "Spannung=".$daten["HM_AC_Spannung_R"];
$query .= ",Strom=".$daten["HM_AC_Strom"];
$query .= ",Frequenz=".$daten["HM_Frequenz"];
$query .= ",Leistung=".$daten["HM_AC_Leistung"];
$query .= ",Leistungsfaktor=".$daten["HM_PF_Leistung"];
$query .= ",Spannung_R=".$daten["HM_AC_Spannung_R"];
$query .= ",Spannung_S=".$daten["HM_AC_Spannung_S"];
$query .= ",Spannung_T=".$daten["HM_AC_Spannung_T"];
$query .= ",Strom_R=".$daten["HM_AC_Strom_R"];
$query .= ",Strom_S=".$daten["HM_AC_Strom_S"];
$query .= ",Strom_T=".$daten["HM_AC_Strom_T"];
$query .= ",Leistung_R=".$daten["HM_AC_Leistung_R"];
$query .= ",Leistung_S=".$daten["HM_AC_Leistung_S"];
$query .= ",Leistung_T=".$daten["HM_AC_Leistung_T"];
$query .= ",Leistungsfaktor_R=".$daten["HM_PF_R"];
$query .= ",Leistungsfaktor_S=".$daten["HM_PF_S"];
$query .= ",Leistungsfaktor_T=".$daten["HM_PF_T"];
$query .= ",Bezug=".$daten["HM_Bezug"];
$query .= ",Einspeisung=".$daten["HM_Einspeisung"];
$query .= " ".$daten["zentralerTimestamp"];
$query .= "\n"; // *
$query .= "HM_Summen ";
$query .= "Wh_GesamtBezug=".round($daten["HM_Wh_Bezug"],1);
$query .= ",Wh_GesamtEinspeisung=".$daten["HM_Wh_Einspeisung"];
$query .= ",GesamtLeistungsbedarf=".$daten["HM_GesamterLeistungsbedarf"];
$query .= " ".$daten["zentralerTimestamp"];
$query .= "\n";
}
Wenn man auch Nachts Werte sammeln möchte, empfiehlt es sich das Folgende in der sma_wr.php auszukommentieren:
Code: Alles auswählen
/***************************************************************************
// Wenn kein PV Strom mehr kommt...
***************************************************************************/
/*
if ($aktuelleDaten["KeineSonne"] == true) {
if (date("i") % 20 != 0) {
// Alle 20 Minuten trotzdem abspeichern.
break;
}
}
*/