Anbindung Solarlog mit neuer Firmware 3.x ???

Hallo Zusammen,

habe gerade eben voller Freude ein Firmware Update auf meinem SolarLog 500 (3.1.1 Build 66 - 14.04.2014) gemacht. Das Ganze sieht jetzt deutlich moderner aus und hat auch ein paar neue Funktionen. :smiley:

Die Freude hat allerdings nicht all zulange gehalten: :mad::mad::mad:
Die neue Oberfläche setzt auf JQuery und holt sich per AJAX Request alle benötigten Daten. Eine einfache Einbindung im IFrame ist daher nicht mehr möglich. Zumindest nicht, wenn man nicht die gesamte Seite einbinden will.

Hat hier bereits jemand Erfahrung mit der neuen Firmware? Eigentlich will ich keine Visualisierung über IPS machen, sondern nur wieder Teile der Weboberfläche des Solarlog einbinden. Dabei will ich mich aber wieder nur auf die Charts beschränken. Über IPS soll man eigentlich nicht die Konfigurationsdialoge erreichen.

Grüße
Haari

Hi zusammen,

musste ebenfalls das neue Update erfahren und habe derzeit auch Probleme an die Daten zu kommen.
Früher habe ich das mit der Abfrage der Seite <ip_des_solarlog>/min_day.js gemacht, leider gibt es die ja nun nicht mehr.

Hast du das schon gelöst oder hat sonst jemand eine Idee?

Danke

Wär auch Interessiert :frowning:

Hallo,
das Problem hatte ich mit dem Solarlog 300 ebenfalls.
Die Daten können per Modbus gelesen werden in der Excel Tabelle habe ich die Modbusadressen hinterlegt.

Vorgehensweise:

[ul]
[li]Client Socket anlegen ,IP vom Solarlog, Port 502 [/li][li]Register Var anlegen und mit socket verbinden und als Target folgendes Skript angeben [/li][li]Skript zyklisch aufrufen (z.B. 20 Minuten) [/li][/ul]

Hinweis zum Inhalt:
Ich lese nur die aktuelle Leistung, den Tagsertrag und die PV Summe aus.
Im Array muss die id der Variable ‚id‘ im array $adressen angepasst werden,
weiterhin muss $ClientSocket_ID und $RegisterVariable_ID geändert werden der Rest sollte so verbleiben.

$ClientSocket_ID = 33399;
$RegisterVariable_ID = 40032 ;
//***************modbusadressen
$adressen=array (
    'akt_leistung'=> array ('modbus adresse'=> '0D AE' ,'id' =>49178,'nummer'=>'01'),
   'tagesertrag'=> array ('modbus adresse'=> '0D B4','id' =>54229,'nummer'=>'02'),
   'summe'=> array ('modbus adresse'=> '0D BC','id' =>20386 ,'nummer'=>'03'));
    $sendetext='ab 16 00 00 00 06 01 04 xx xx 00 02';

switch ($IPS_SENDER)
{case "TimerEvent": // sendet anfrage an solar-log
case "Execute":
    IPS_SetProperty($ClientSocket_ID, "Open",true); //I/O Instanz soll aktiviert sein.
    IPS_ApplyChanges($ClientSocket_ID);
      $s1=str_replace("ab", $adressen['akt_leistung']['nummer'],$sendetext);//nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['akt_leistung']['modbus adresse'],$s1));
         $s2=str_replace("ab", $adressen['tagesertrag']['nummer'],$sendetext);//nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['tagesertrag']['modbus adresse'],$s2));
        $s3=str_replace("ab", $adressen['summe']['nummer'],$sendetext);//nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['summe']['modbus adresse'],$s3));
         break;
case "RegisterVariable":// auf antwort warten, und verarbeiten
    $hexstring = strtohex($IPS_VALUE);
    $arr_modbus_receive = str_split(strtohex($IPS_VALUE), 2);
    $value = 0;
   $hex = $arr_modbus_receive[11].$arr_modbus_receive[12].$arr_modbus_receive[9].$arr_modbus_receive[10];
   $dec = hexdec($hex);
   $max = pow(2, 4 * (strlen($hex) + (strlen($hex) % 2)));
   $_dec = $max - $dec;
   
   if($dec > $_dec) { $value = -$_dec;}
     else {$value = $dec; }
     $value=(float)$value;
     
    //zuordnung der werte zur adresse
          switch ($arr_modbus_receive[0])
         {case 1://aktuelle Leistung 
                    setvalue($adressen['akt_leistung']['id'],$value);  break;           
              
         case 2://tagesenergie
               setvalue ($adressen['tagesertrag']['id'], $value/1000);  break;
                     
       case 3://summe
            $summe_pv=($value/1000);
           setvalue($adressen['summe']['id'],$summe_pv,1);
                // socket schliessen
                IPS_SetProperty($ClientSocket_ID, "Open",false); //I/O Instanz soll aktiviert sein.
                IPS_ApplyChanges($ClientSocket_ID);
                         break; }

      
    break;
}
//******** fc's*********************************************
function strtohex($string) {
    $hexstr = unpack('H*', $string);
      return strtoupper(array_shift($hexstr));}
function hextostr($hex) {
    $str='';
     $hex = str_replace(' ', '', $hex);
     for ($i=0; $i < strlen($hex)-1; $i+=2) {
         $str .= chr(hexdec($hex[$i].$hex[$i+1])); }
    return $str;}
function dechex_lsb_msb($decvalue) {
    $hexstr=dechex($decvalue);
    for ($i = strlen($hexstr); $i < 8; $i++) {
        $hexstr="0".$hexstr;
    }
    return substr($hexstr, 4, 4).substr($hexstr, 0, 4);}
function modbus_send($ID, $hex) {
    RegVar_SendText($ID, hextostr($hex));
    IPS_Sleep(40);}


Gruß,
Rayk

Solarlog Modbusadressen.zip (7.66 KB)

Hi Rayk,

vielen vielen Dank, funktioniert bei meinem Solarlog 500 mit neuster Firmware ohne Probleme. Ich erweitere mir das jetzt noch um die anderen Daten!

Danke

Hallo,

@spooniester: Würdest Du Dein Script hier veröffentlichen ??? Bin leider nicht so fit in PHP um mir das o.g. Script selber umzubauen. Das würde mir sehr helfen. Vielen Dank !!!

Gruß Proxima

Hallo,

habe jetzt doch ein bischen mit dem Script rumgespielt und versucht, es um den aktuellen Verbrauch zu erweitern. Die Variable wird aber nicht beschrieben, genausowenig wie die PV-Summe.

Was mache ich falsch ???

Hier mein Script:

<?

$ClientSocket_ID = 40431 /*[Client Socket SolarLog]*/;
$RegisterVariable_ID = 57089 /*[Hardware\SolarLog200\Register Variable SolarLog]*/ ;

//***************modbusadressen
$adressen=array     (
                       'akt_leistung'    => array ('modbus adresse'=> '0D AE','id' =>49998,'nummer'=>'01'),
                       'tagesertrag'    => array ('modbus adresse'=> '0D B4','id' =>35996,'nummer'=>'02'),
                       'summe'            => array ('modbus adresse'=> '0D BC','id' =>34078,'nummer'=>'03'),
                       'verbrauch'        => array ('modbus adresse'=> '0D BE','id' =>39900,'nummer'=>'04')
                        );

$sendetext='ab 16 00 00 00 06 01 04 xx xx 00 02';


switch ($IPS_SENDER)
{
case "TimerEvent": // sendet anfrage an solar-log


case "Execute":
   IPS_SetProperty($ClientSocket_ID, "Open",true); //I/O Instanz soll aktiviert sein.
   IPS_ApplyChanges($ClientSocket_ID);

       $s1=str_replace("ab", $adressen['akt_leistung']['nummer'],$sendetext);//nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['akt_leistung']['modbus adresse'],$s1));
      $s2=str_replace("ab", $adressen['tagesertrag']['nummer'],$sendetext);//nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['tagesertrag']['modbus adresse'],$s2));
      $s3=str_replace("ab", $adressen['summe']['nummer'],$sendetext);//nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['summe']['modbus adresse'],$s3));
      $s4=str_replace("ab", $adressen['verbrauch']['nummer'],$sendetext);//nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch']['modbus adresse'],$s4));

    break;

          
case "RegisterVariable":// auf antwort warten, und verarbeiten
   $hexstring = strtohex($IPS_VALUE);
   $arr_modbus_receive = str_split(strtohex($IPS_VALUE), 2);
   $value = 0;
   $hex = $arr_modbus_receive[11].$arr_modbus_receive[12].$arr_modbus_receive[9].$arr_modbus_receive[10];
   $dec = hexdec($hex);
   $max = pow(2, 4 * (strlen($hex) + (strlen($hex) % 2)));
   $_dec = $max - $dec;

   if($dec > $_dec) { $value = -$_dec;}
   else {$value = $dec; }

   $value=(float)$value;

   //zuordnung der werte zur adresse

   switch ($arr_modbus_receive[0])
            {
            case 1://aktuelle Leistung
             setvalue($adressen['akt_leistung']['id'],$value);
                break;

         case 2://tagesenergie
            setvalue ($adressen['tagesertrag']['id'],$value/1000);
                break;

            case 3://summe
            $summe_pv=($value/1000);
                setvalue($adressen['summe']['id'],$summe_pv,1);
                break;
                
            case 4://verbrauch
            $verbrauch=($value/1000);
                setvalue($adressen['verbrauch']['id'],$verbrauch,1);

                // socket schliessen
            IPS_SetProperty($ClientSocket_ID, "Open",false); //I/O Instanz soll aktiviert sein.
            IPS_ApplyChanges($ClientSocket_ID);

                break;
             }


    break;
}


//******** fc's*********************************************
function strtohex($string) {
    $hexstr = unpack('H*', $string);
      return strtoupper(array_shift($hexstr));}
      
function hextostr($hex) {
    $str='';
     $hex = str_replace(' ', '', $hex);
     for ($i=0; $i < strlen($hex)-1; $i+=2) {
         $str .= chr(hexdec($hex[$i].$hex[$i+1])); }
    return $str;}

function dechex_lsb_msb($decvalue) {
    $hexstr=dechex($decvalue);
    for ($i = strlen($hexstr); $i < 8; $i++) {
        $hexstr="0".$hexstr; }
    return substr($hexstr, 4, 4).substr($hexstr, 0, 4);}

function modbus_send($ID, $hex) {
    RegVar_SendText($ID, hextostr($hex));
    IPS_Sleep(40);}

?>


Gruß Proxima

Hallo,

der Datenabruf funktioniert mittlerweile. Ich habe es auch geschafft, durch probieren alle Werte in IPS-Variablen zu schreiben. Einzig die Werte für UAC und UDC sind falsch.

Laut Beschreibung der ModBus-Adressen handelt sich bei den beiden Werten um „16 bit unsigned“ Werte (siehe auch im angehängten Bild). Wie bekomme ich diese nun in eine Float-Variable geschrieben ???

Gruß Proxima

@Proxima

Ich stehe gerade vor der Entscheidung ob ich das FW - Update einspiele oder nicht.
Ich lese im Moment alle 15s die aktuelle Leistung sowie den aktuellen Verbrauch über den per SO angeschlossenen Zählers aus (min_cur.js)
Klappt das mit der neuen FW und dem Script auch noch ?. JavaScript ist ja wohl nicht mehr verfügbar.

Leider steige ich durch das Script nicht so ganz durch. Könntest Du evtl. dein funktionierendes Script nochmals posten. ?? Ich werde dann versuchen es an meinen SolarLog anzupassen.

Danke

Oliver

Hallo,

habe mir diesen Eintrag durchgelesen doch leider bekomme ich die Abfrage mit meinem SolarLog 500 nicht hin.
Könnt Ihr mir bitte detaillierter beschreiben, was zu tun ist?

Danke!

Hallo,

ich bin neu hier und versuche mich gerade meinen Solarlog in IPS einzubinden.
Vielen Dank erst einmal an enra und die anderen , die die Grundlage für das Script geschaffen haben.
Ich lese aktuell den momentanen Ertag, momentanen Verbrauch, Tagesertrag und Tagesverbrauch ein.
Das klappt auch wunderbar.

Jetzt fehlen mir ein paar Kenntnisse, wie ich in das array um Netzbezug bzw.Netzeinspeisung (-/+) einbinde. Diese Variable muss aus Momentanen Ertrag - momentaner Verbrauch errechnet werden und soll gleichzeitig im array abgelegt sein.

Wer kann mir einnen Tip geben?
Variable „pv_akt_netz“

Hier mein Script:

<?
$ClientSocket_ID = 56821 /*[Client Socket_SolarLog]*/;
$RegisterVariable_ID = 19455 /*[IPSTools\Register Variable_SolarLog]*/;
//***************modbusadressen
$adressen=array (
    'pv_akt_ertrag'=> array ('modbus adresse'=> '0D AE' ,'id' =>33348,'nummer'=>'01'),
    'pv_akt_verbrauch'=> array ('modbus adresse'=> '0D BE','id' =>52519 ,'nummer'=>'02'),
    'pv_akt_netz'=> array ('modbus adresse'=> '00 00','id' =>41039 ,'nummer'=>'03'),     //adr nur Platzhalter für array notwendig?
    'pv_tagesertrag'=> array ('modbus adresse'=> '0D B4','id' =>44817,'nummer'=>'04'),
    'pv_tagesverbrauch'=> array ('modbus adresse'=> '0D C0','id' =>50801,'nummer'=>'05'));
    
   
    $sendetext='ab 16 00 00 00 06 01 04 xx xx 00 02';

switch ($IPS_SENDER)
{case "TimerEvent": // sendet anfrage an solar-log
case "Execute":
    IPS_SetProperty($ClientSocket_ID, "Open",true); //I/O Instanz soll aktiviert sein.
    IPS_ApplyChanges($ClientSocket_ID);
         $s1=str_replace("ab", $adressen['pv_akt_ertrag']['nummer'],$sendetext);//nummer eintragen
         modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['pv_akt_ertrag']['modbus adresse'],$s1));
         $s2=str_replace("ab", $adressen['pv_akt_verbrauch']['nummer'],$sendetext);//nummer eintragen
         modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['pv_akt_verbrauch']['modbus adresse'],$s2));
         $s4=str_replace("ab", $adressen['pv_tagesertrag']['nummer'],$sendetext);//nummer eintragen
         modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['pv_tagesertrag']['modbus adresse'],$s4));
         $s5=str_replace("ab", $adressen['pv_tagesverbrauch']['nummer'],$sendetext);//nummer eintragen
         modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['pv_tagesverbrauch']['modbus adresse'],$s5));
         break;
case "RegisterVariable":// auf antwort warten, und verarbeiten
    $hexstring = strtohex($IPS_VALUE);
    $arr_modbus_receive = str_split(strtohex($IPS_VALUE), 2);
    $value = 0;
   $hex = $arr_modbus_receive[11].$arr_modbus_receive[12].$arr_modbus_receive[9].$arr_modbus_receive[10];
   $dec = hexdec($hex);
   $max = pow(2, 4 * (strlen($hex) + (strlen($hex) % 2)));
   $_dec = $max - $dec;

   if($dec > $_dec) { $value = -$_dec;}
     else {$value = $dec; }
     $value=(float)$value;

    //zuordnung der werte zur adresse
          switch ($arr_modbus_receive[0])
         {case 1://aktueller Ertrag
					$pv_E=($value);
               setvalue($adressen['pv_akt_ertrag']['id'],$value);  break;
               
         case 2://akttueller Verbrauch
               $pv_V=($value);
               setvalue($adressen['pv_akt_verbrauch']['id'],$value); break;
               
         case 3://akt Netzbezug bzw Netzeinspeisung
               	  $akt_netz=(($pv_E) - ($pv_V));
		  setvalue($adressen['pv_akt_netz']['id'],$akt_netz);   break;

         case 4://Tagesertrag
					$summe_ertrag=($value/1000);
               setvalue ($adressen['pv_tagesertrag']['id'], $summe_ertrag);  break;

         case 5://Tagesverbrauch
					$summe_verbrauch=($value/1000);
               setvalue ($adressen['pv_tagesverbrauch']['id'], $summe_verbrauch);  break;
           
                         // socket schliessen
                IPS_SetProperty($ClientSocket_ID, "Open",false); //I/O Instanz soll aktiviert sein.
                IPS_ApplyChanges($ClientSocket_ID);
                         break; }
   

    break;
}
//******** fc's*********************************************
function strtohex($string) {
    $hexstr = unpack('H*', $string);
      return strtoupper(array_shift($hexstr));}
function hextostr($hex) {
    $str='';
     $hex = str_replace(' ', '', $hex);
     for ($i=0; $i < strlen($hex)-1; $i+=2) {
         $str .= chr(hexdec($hex[$i].$hex[$i+1])); }
    return $str;}
function dechex_lsb_msb($decvalue) {
    $hexstr=dechex($decvalue);
    for ($i = strlen($hexstr); $i < 8; $i++) {
        $hexstr="0".$hexstr;
    }
    return substr($hexstr, 4, 4).substr($hexstr, 0, 4);}
function modbus_send($ID, $hex) {
    RegVar_SendText($ID, hextostr($hex));
    IPS_Sleep(40);}
?>

Danke

Hallo,

ich habe gestern IPS auf 4.00 upgedatet. Seit dem funktioniert das Auslesescript nicht mehr. Die Ausführung wird nicht beendet und das Script endet in einem DEATH THREAD.

Nach einem Neustart kann das Script von Hand ausgeführt werden. Sobald der Timer das Script auslöst, endet die Ausführung in einem Death Thread.

Folgendes Script verwende ich:

<?

$ClientSocket_ID = 40431 /*[Client Socket SolarLog]*/;
$RegisterVariable_ID = 57089 /*[Hardware\SolarLog200\Register Variable SolarLog]*/ ;

//*************** ModBus-Adressen ***************
$adressen=array     (
                       'datum_zeit'                => array ('modbus adresse'=> '0D AC','id' =>16713,'nummer'=>'01'),
                       'leistung_ac'                => array ('modbus adresse'=> '0D AE','id' =>49998,'nummer'=>'02'),
                       'leistung_dc'                => array ('modbus adresse'=> '0D B0','id' =>59032,'nummer'=>'03'),
                        'spannung_ac'                => array ('modbus adresse'=> '0D B2','id' =>20500,'nummer'=>'04'),
                       'spannung_dc'                => array ('modbus adresse'=> '0D B3','id' =>48304,'nummer'=>'05'),
                       'ertrag_heute'                => array ('modbus adresse'=> '0D B4','id' =>35996,'nummer'=>'06'),
                       'ertrag_gestern'            => array ('modbus adresse'=> '0D B6','id' =>40175,'nummer'=>'07'),
                       'ertrag_monat'                => array ('modbus adresse'=> '0D B8','id' =>44284,'nummer'=>'08'),
                       'ertrag_jahr'                => array ('modbus adresse'=> '0D BA','id' =>54860,'nummer'=>'09'),
                       'ertrag_gesamt'            => array ('modbus adresse'=> '0D BC','id' =>34078,'nummer'=>'10'),
                       'verbrauch_akt'            => array ('modbus adresse'=> '0D BE','id' =>39900,'nummer'=>'11'),
                       'verbrauch_heute'            => array ('modbus adresse'=> '0D C0','id' =>51563,'nummer'=>'12'),
                       'verbrauch_gestern'        => array ('modbus adresse'=> '0D C2','id' =>39059,'nummer'=>'13'),
                       'verbrauch_monat'            => array ('modbus adresse'=> '0D C4','id' =>30678,'nummer'=>'14'),
                       'verbrauch_jahr'            => array ('modbus adresse'=> '0D C6','id' =>40035,'nummer'=>'15'),
                       'verbrauch_gesamt'        => array ('modbus adresse'=> '0D C8','id' =>59999,'nummer'=>'16')
                        );

$sendetext='ab 16 00 00 00 06 01 04 xx xx 00 02';



// Nicht um 3:00 Uhr, da keine Verbindung hergestellt werden kann
IF ((date("H:i") > '03:00') AND (date("H:i") < '03:03'))     //Zwischen 3:00 und 3:05 Uhr
  return;
// ==================



switch ($_IPS['SENDER'])
{
case "TimerEvent": //Anfrage an SolarLog senden

case "Execute": //Ausführung
   IPS_SetProperty($ClientSocket_ID, "Open",true); //I/O-Instanz aktivieren
   IPS_ApplyChanges($ClientSocket_ID);

       $s1=str_replace("ab", $adressen['datum_zeit']['nummer'],$sendetext);                //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['datum_zeit']['modbus adresse'],$s1));
      $s2=str_replace("ab", $adressen['leistung_ac']['nummer'],$sendetext);            //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['leistung_ac']['modbus adresse'],$s2));
      $s3=str_replace("ab", $adressen['leistung_dc']['nummer'],$sendetext);            //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['leistung_dc']['modbus adresse'],$s3));
      $s4=str_replace("ab", $adressen['spannung_ac']['nummer'],$sendetext);            //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['spannung_ac']['modbus adresse'],$s4));
      $s5=str_replace("ab", $adressen['spannung_dc']['nummer'],$sendetext);            //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['spannung_dc']['modbus adresse'],$s5));
      $s6=str_replace("ab", $adressen['ertrag_heute']['nummer'],$sendetext);            //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_heute']['modbus adresse'],$s6));
      $s7=str_replace("ab", $adressen['ertrag_gestern']['nummer'],$sendetext);        //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_gestern']['modbus adresse'],$s7));
      $s8=str_replace("ab", $adressen['ertrag_monat']['nummer'],$sendetext);            //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_monat']['modbus adresse'],$s8));
      $s9=str_replace("ab", $adressen['ertrag_jahr']['nummer'],$sendetext);            //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_jahr']['modbus adresse'],$s9));
      $s10=str_replace("ab", $adressen['ertrag_gesamt']['nummer'],$sendetext);        //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['ertrag_gesamt']['modbus adresse'],$s10));
      $s11=str_replace("ab", $adressen['verbrauch_akt']['nummer'],$sendetext);        //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_akt']['modbus adresse'],$s11));
      $s12=str_replace("ab", $adressen['verbrauch_heute']['nummer'],$sendetext);        //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_heute']['modbus adresse'],$s12));
      $s13=str_replace("ab", $adressen['verbrauch_gestern']['nummer'],$sendetext);    //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_gestern']['modbus adresse'],$s13));
      $s14=str_replace("ab", $adressen['verbrauch_monat']['nummer'],$sendetext);        //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_monat']['modbus adresse'],$s14));
      $s15=str_replace("ab", $adressen['verbrauch_jahr']['nummer'],$sendetext);        //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_jahr']['modbus adresse'],$s15));
      $s16=str_replace("ab", $adressen['verbrauch_gesamt']['nummer'],$sendetext);    //Nummer eintragen
        modbus_send($RegisterVariable_ID, str_replace("xx xx", $adressen['verbrauch_gesamt']['modbus adresse'],$s16));

    break;

case "RegisterVariable": //Auf Antwort warten und verarbeiten
   $hexstring = strtohex($_IPS['VALUE']);
   $arr_modbus_receive = str_split(strtohex($_IPS['VALUE']), 2);
   $value = 0;
   $hex = $arr_modbus_receive[11].$arr_modbus_receive[12].$arr_modbus_receive[9].$arr_modbus_receive[10];
   $dec = hexdec($hex);
   $max = pow(2, 4 * (strlen($hex) + (strlen($hex) % 2)));
   $_dec = $max - $dec;

   if($dec > $_dec) { $value = -$_dec;}
   else {$value = $dec; }

   $value=(float)$value;

   switch ($arr_modbus_receive[0]) //Werte zur Adresse zuordnen
            {
            case 1: //Datum - Zeit
                date_default_timezone_set('GMT');
                $datum = date("d.m.y - H:i:s",$value);
             setvalue($adressen['datum_zeit']['id'],$datum);
                break;

            case 2: //Leistung AC
             setvalue($adressen['leistung_ac']['id'],$value);
                break;

            case 3: //Leistung DC
             setvalue($adressen['leistung_dc']['id'],$value);
                break;

            case 4: //Spannung AC
             setvalue($adressen['spannung_ac']['id'],$value);
                break;

            case 5: //Spannung DC
             setvalue($adressen['spannung_dc']['id'],$value);
                break;

            case 6: //Ertrag Heute
             setvalue($adressen['ertrag_heute']['id'],$value/1000);
                break;

            case 7: //Ertrag Gestern
             setvalue($adressen['ertrag_gestern']['id'],$value/1000);
                break;

            case 8: //Ertrag Monat
             setvalue($adressen['ertrag_monat']['id'],$value/1000);
                break;

            case 9: //Ertrag Jahr
             setvalue($adressen['ertrag_jahr']['id'],$value/1000);
                break;

            case 10: //Ertrag Gesamt
             setvalue($adressen['ertrag_gesamt']['id'],$value/1000);
                break;

            case 11: //Verbrauch Aktuell
             setvalue($adressen['verbrauch_akt']['id'],$value/1000);
                break;

            case 12: //Verbrauch Heute
             setvalue($adressen['verbrauch_heute']['id'],$value/1000);
                break;

            case 13: //Verbrauch Gestern
             setvalue($adressen['verbrauch_gestern']['id'],$value/1000);
                break;

            case 14: //Verbrauch Monat
             setvalue($adressen['verbrauch_monat']['id'],$value/1000);
                break;

            case 15: //Verbrauch Jahr
             setvalue($adressen['verbrauch_jahr']['id'],$value/1000);
                break;

            case 16: //Verbrauch Gesamt
             setvalue($adressen['verbrauch_gesamt']['id'],$value/1000);

                //ClientSocket beim letzten Wert schliessen
            IPS_SetProperty($ClientSocket_ID, "Open",false); //ClientSocket schliessen
            IPS_ApplyChanges($ClientSocket_ID);

                break;
             }

    break;
}


//*************** Funktionen ***************
function strtohex($string) {
    $hexstr = unpack('H*', $string);
      return strtoupper(array_shift($hexstr));}
      
function hextostr($hex) {
    $str='';
     $hex = str_replace(' ', '', $hex);
     for ($i=0; $i < strlen($hex)-1; $i+=2) {
         $str .= chr(hexdec($hex[$i].$hex[$i+1])); }
    return $str;}

function dechex_lsb_msb($decvalue) {
    $hexstr=dechex($decvalue);
    for ($i = strlen($hexstr); $i < 8; $i++) {
        $hexstr="0".$hexstr; }
    return substr($hexstr, 4, 4).substr($hexstr, 0, 4);}

function modbus_send($ID, $hex) {
    RegVar_SendText($ID, hextostr($hex));
    IPS_Sleep(100);}

?>

Gruß Proxima

Hallo,

habe nun auch meinen SL 500 angebunden. Erstmal vielen Dank dafür, mit den Anregungen hier ging das ja echt super.

Meine Frage wäre jetzt kann ich aus dem SL auch den Eigenverbrauch auslesen?

Schönen Gruß

Hallo,

Eigenverbrauch würde ich berechnen .

$eigenverbrauch= $ertrag - $verkauf ;

okay,

vielen dank werde das dann auch so machen. Ich dachte nur ich könnte das auch aus dem SL auslesen weil es dort angezeigt wird.

Schönen Gruß

Guten Morgen!

Ich bin in der glücklichen Situation noch eine Solar-Log 2000 PM+ mit einer FW 3.4.0 Build 76 benutzen zu dürfen und wollte nun freudig mit dem Skript die Daten auslesen und unter Symcon verarbeiten… Ich bin aber schon am Einrichten gescheitert. :confused:

Vorgehensweise:
Client Socket anlegen ,IP vom Solarlog, Port 502
Register Var anlegen und mit socket verbinden und als Target folgendes Skript angeben
Skript zyklisch aufrufen (z.B. 20 Minuten)

Client Socket anlegen war einfach… aber was zur Hölle ist/sind Register Var? Variablen, klar aber dann hört es auch schon wieder auf… Was bitte muss ich hier genau anlegen und wie muss ich es verbinden mit dem Socket, um das Skript zum laufen zu bekommen?

Nachtrag: Ich hab den Artikel in der Modulreferenz gefunden, bin aber immer noch so schlau wie vorher. :frowning:
(RegisterVariable — IP-Symcon :: Automatisierungssoftware)

Bin für jegliche Hilfe aufgeschlossen – Danke!

So. Nachdem ich 24h später noch einmal die Doku und die Foreneinträge gelesen habe ist es mir gelungen eine RegisterVariable anzulegen.

Mittlerweile läuft es! Vielen Dank für das Skript.

Hallo Zusammen,
Läuft es auch mit IPS 4?
Gruß Dirk

Hab es einfach probiert, funktioniert wunderbar. Hat jemand eine Idee wie ich die Eigenverbrauchsquote abfragen kann?