SMA WR + HomeManager 2 ohne Multi_Regler (Scriptvorschlag)

Allgemeine Informationen zum Nachbau und zum Forum.
PV-Monitorung / PV Überwachung

Moderator: Ulrich

Antworten
jottt
Beiträge: 94
Registriert: Mo 1. Mär 2021, 00:18
Hat sich bedankt: 10 Mal
Danksagung erhalten: 10 Mal

SMA WR + HomeManager 2 ohne Multi_Regler (Scriptvorschlag)

Beitrag von jottt »

Ich habe mal wieder gebastelt, mit dem Ziel, alle WR und Zählerdaten in einer Tabelle zu haben, nahezu gleichzeitig abgerufen und vor allem: öfter als 3x pro Minute.

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;
    }
  }
*/

TeamO
Beiträge: 202
Registriert: Mo 22. Jun 2020, 08:58
Hat sich bedankt: 3 Mal
Danksagung erhalten: 21 Mal

Re: SMA WR + HomeManager 2 ohne Multi_Regler (Scriptvorschlag)

Beitrag von TeamO »

Zu dem letzten Part mit Nachts Werte sammeln:
Hier sollte es doch reichten in der sma_wr_math.php noch folgende Zeile einzufügen:

Code: Alles auswählen

$aktuelleDaten["KeineSonne"] == false;

jottt
Beiträge: 94
Registriert: Mo 1. Mär 2021, 00:18
Hat sich bedankt: 10 Mal
Danksagung erhalten: 10 Mal

Re: SMA WR + HomeManager 2 ohne Multi_Regler (Scriptvorschlag)

Beitrag von jottt »

Wenn keine Sonne für sonst nichts verwendet wird, ist das viel besser.

Benutzeravatar
Ulrich
Administrator
Beiträge: 2155
Registriert: Sa 7. Nov 2015, 10:33
Wohnort: Essen
Hat sich bedankt: 4 Mal
Danksagung erhalten: 74 Mal
Kontaktdaten:

Re: SMA WR + HomeManager 2 ohne Multi_Regler (Scriptvorschlag)

Beitrag von Ulrich »

Hallo jottt,

das Eintragen der Daten in die Datenbank funktioniert auch mit dem "_math" Script. Bitte lese dir die neueste Anleitung noch einmal durch. Man muss dazu nicht mehr die funktionen.inc.php ändern. Jedoch vorher noch einmal ein Update machen! Erst dann bekommt man die angepassten Dateien.
--------------------------------------
Ulrich [Admin]

jottt
Beiträge: 94
Registriert: Mo 1. Mär 2021, 00:18
Hat sich bedankt: 10 Mal
Danksagung erhalten: 10 Mal

Re: SMA WR + HomeManager 2 ohne Multi_Regler (Scriptvorschlag)

Beitrag von jottt »

Ah, danke :) Dann schau ich mir das nochmal an und baue eine Version 2 :)

Benutzeravatar
Ulrich
Administrator
Beiträge: 2155
Registriert: Sa 7. Nov 2015, 10:33
Wohnort: Essen
Hat sich bedankt: 4 Mal
Danksagung erhalten: 74 Mal
Kontaktdaten:

Re: SMA WR + HomeManager 2 ohne Multi_Regler (Scriptvorschlag)

Beitrag von Ulrich »

SUPER.
Danke an die Pioniere.... :D
--------------------------------------
Ulrich [Admin]

Antworten