Solax Wechselrichter auslesen - via Solax-Portal

Anbei ein Script mit dem man das Solax Portal auslesen und die Daten in Symcon nutzbar machen kann.

Vom Prinzip her muss nur der Username, Passwort und die ID der Wechselrichters eingetragen werden. Diese ID findet man im Portal in der URL am Ende (ist aktuell 5-Stellig).

Der Zugriff auf die Daten erfolgt über die mobile Seite von Solax, da die ganz merkwürdige Re-Directs machen und man sich nur hier durch die Seite hangeln kann.

Die Variablen werden automatisch angelegt.


<?
//Username Solax portal
define('USERNAME', '********');
 
//Passwort the Solax portal.
define('PASSWORD', '************');

//ID des Wechselrichters - kann man im Portal sehen
$Solax_ID = "*******";
 
 
// Ab hier sollte nichts mehr geändert werden.
//********************************************
 
//URL of the login form (Mobile Portal of Solax) - 2 Stufiger Anmeldeprozess
define('LOGIN_FORM_URL', 'http://www.solax-portal.com/m/home/login');
//Login action URL - Sendet die Anmeldung
define('LOGIN_ACTION_URL', 'http://www.solax-portal.com/m/home/loginpost');

//CURL Config for authentication

define('USER_AGENT', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36');
define('COOKIE_FILE', 'cookie.txt');
$postValues = array(
    'username' => USERNAME,
    'password' => PASSWORD
);
 $curl = curl_init();
curl_setopt($curl, CURLOPT_URL, LOGIN_ACTION_URL);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postValues));
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_REFERER, LOGIN_FORM_URL);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_exec($curl);
//echo curl_exec($curl); //test area in case we want to check what happens
if(curl_errno($curl)){
    throw new Exception(curl_error($curl));
}

$Zu_Loeschende_Werte = array("W","A","KW","kWH","kH","V","K","°","â");


// Aufrufen der Übersichtsseite um diese zu parsen
curl_setopt($curl, CURLOPT_URL, 'http://www.solax-portal.com/m/user/overview/'.$Solax_ID);
curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$overview_website = curl_exec($curl);
//echo $overview_website;

$dom_overview = new DOMDocument();
 
$dom_overview->loadHTML($overview_website);
$tablerows = $dom_overview->getElementsByTagName('tr');
foreach ($tablerows as $tablerow)
{
    $Power_Now = stripos($tablerow->nodeValue, "Power Now");
    if($Power_Now !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Power_Now = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6));
		echo "Aktueller Stromverbrauch: ",$Power_Now,PHP_EOL;
		
		$ID_Power_Now = @IPS_GetVariableIDByName("Aktueller Stromverbrauch", $_IPS['SELF']);
    	if($ID_Power_Now === false)
    {
        $ID_Power_Now = IPS_CreateVariable(2);
        IPS_SetName($ID_Power_Now, "Aktueller Stromverbrauch");
        IPS_SetParent($ID_Power_Now, $_IPS['SELF']);
    }
	SetValue($ID_Power_Now,$Power_Now);
    }


    $Todays_Energy = stripos($tablerow->nodeValue, "Today's Energy");
    if($Todays_Energy !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Todays_Energy = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6));
        echo "Ertrag Heute: ",$Todays_Energy, PHP_EOL;

		$ID_Todays_Energy = @IPS_GetVariableIDByName("Ertrag Heute", $_IPS['SELF']);
    	if($ID_Todays_Energy === false)
    {
        $ID_Todays_Energy = IPS_CreateVariable(2);
        IPS_SetName($ID_Todays_Energy, "Ertrag Heute");
        IPS_SetParent($ID_Todays_Energy, $_IPS['SELF']);
    }
	SetValue($ID_Todays_Energy,$Todays_Energy);
    }
	
	
			
	$Monthly_Yield = stripos($tablerow->nodeValue, "Monthly Yield");
    if($Monthly_Yield !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Monthly_Yield = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "Ertrag Monat: ",$Monthly_Yield, PHP_EOL;
		
		$ID_Monthly_Yield = @IPS_GetVariableIDByName("Ertrag Monat", $_IPS['SELF']);
    	if($ID_Monthly_Yield === false)
    {
        $ID_Monthly_Yield = IPS_CreateVariable(2);
        IPS_SetName($ID_Monthly_Yield, "Ertrag Monat");
        IPS_SetParent($ID_Monthly_Yield, $_IPS['SELF']);
    }
	SetValue($ID_Monthly_Yield,$Monthly_Yield);
    }
	
	
	$Yearly_Yield = stripos($tablerow->nodeValue, "Yearly Yield");
    if($Yearly_Yield !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Yearly_Yield = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "Ertrag Jahr: ",$Yearly_Yield, PHP_EOL;
		
		$ID_Yearly_Yield = @IPS_GetVariableIDByName("Ertrag Jahr", $_IPS['SELF']);
    	if($ID_Yearly_Yield === false)
    {
        $ID_Yearly_Yield = IPS_CreateVariable(2);
        IPS_SetName($ID_Yearly_Yield, "Ertrag Jahr");
        IPS_SetParent($ID_Yearly_Yield, $_IPS['SELF']);
    }
	SetValue($ID_Yearly_Yield,$Yearly_Yield);
    }
	
	
	$Total_Energy = stripos($tablerow->nodeValue, "Total Energy");
    if($Total_Energy !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Total_Energy = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "Ertrag Gesamt: ",$Total_Energy, PHP_EOL;

		$ID_Total_Energy = @IPS_GetVariableIDByName("Ertrag Gesamt", $_IPS['SELF']);
    	if($ID_Total_Energy === false)
    {
        $ID_Total_Energy = IPS_CreateVariable(2);
        IPS_SetName($ID_Total_Energy, "Ertrag Gesamt");
        IPS_SetParent($ID_Total_Energy, $_IPS['SELF']);
    }
	SetValue($ID_Total_Energy,$Total_Energy);
    }
	
}  


// Aufrufen der Statusseite mit Echtzeitdaten um diese zu parsen
curl_setopt($curl, CURLOPT_URL, 'http://www.solax-portal.com/m/User/status/'.$Solax_ID);
curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$overview_website = curl_exec($curl);
//echo $overview_website;

$dom_realtime = new DOMDocument();
 
$dom_realtime->loadHTML($overview_website);
$tablerows = $dom_realtime->getElementsByTagName('tr');
foreach ($tablerows as $tablerow)
{
    $PV1_Current = stripos($tablerow->nodeValue, "PV1 Current");
    if($PV1_Current !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $PV1_Current = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6));
        echo "PV1 Strang Leistung Aktuell: ",$PV1_Current, PHP_EOL;

		$ID_PV1_Current = @IPS_GetVariableIDByName("PV1 Strang Leistung Aktuell", $_IPS['SELF']);
    	if($ID_PV1_Current === false)
    {
        $ID_PV1_Current = IPS_CreateVariable(2);
        IPS_SetName($ID_PV1_Current, "PV1 Strang Leistung Aktuell");
        IPS_SetParent($ID_PV1_Current, $_IPS['SELF']);
    }
	SetValue($ID_PV1_Current,$PV1_Current);
    }


   
    $PV2_Current = stripos($tablerow->nodeValue, "PV2 Current");
    if($PV2_Current !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $PV2_Current = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6));
        echo "PV2 Strang Leistung Aktuell: ",$PV2_Current, PHP_EOL;

		$ID_PV2_Current = @IPS_GetVariableIDByName("PV2 Strang Leistung Aktuell", $_IPS['SELF']);
    	if($ID_PV2_Current === false)
    {
        $ID_PV2_Current = IPS_CreateVariable(2);
        IPS_SetName($ID_PV2_Current, "PV2 Strang Leistung Aktuell");
        IPS_SetParent($ID_PV2_Current, $_IPS['SELF']);
    }
	SetValue($ID_PV2_Current,$PV2_Current);
    }


	
	$PV1_Voltage = stripos($tablerow->nodeValue, "PV1 Voltage");
    if($PV1_Voltage !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $PV1_Voltage = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "PV1 Strang Spannung Aktuell: ",$PV1_Voltage, PHP_EOL;

		$ID_PV1_Voltage = @IPS_GetVariableIDByName("PV1 Strang Spannung Aktuell", $_IPS['SELF']);
    	if($ID_PV1_Voltage === false)
    {
        $ID_PV1_Voltage = IPS_CreateVariable(2);
        IPS_SetName($ID_PV1_Voltage, "PV1 Strang Spannung Aktuell");
        IPS_SetParent($ID_PV1_Voltage, $_IPS['SELF']);
    }
	SetValue($ID_PV1_Voltage,$PV1_Voltage);
    }


	
	$PV2_Voltage = stripos($tablerow->nodeValue, "PV2 Voltage");
    if($PV2_Voltage !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $PV2_Voltage = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "PV2 Strang Spannung Aktuell: ",$PV2_Voltage, PHP_EOL;

		$ID_PV2_Voltage = @IPS_GetVariableIDByName("PV2 Strang Spannung Aktuell", $_IPS['SELF']);
    	if($ID_PV2_Voltage === false)
    {
        $ID_PV2_Voltage = IPS_CreateVariable(2);
        IPS_SetName($ID_PV2_Voltage, "PV2 Strang Spannung Aktuell");
        IPS_SetParent($ID_PV2_Voltage, $_IPS['SELF']);
    }
	SetValue($ID_PV2_Voltage,$PV2_Voltage);
    }


	
	$Output_Current = stripos($tablerow->nodeValue, "Output Current");
    if($Output_Current !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Output_Current = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "Aktuelle Ausgangsleistung: ",$Output_Current, PHP_EOL;

		$ID_Output_Current = @IPS_GetVariableIDByName("Aktuelle Ausgangsleistung", $_IPS['SELF']);
    	if($ID_Output_Current === false)
    {
        $ID_Output_Current = IPS_CreateVariable(2);
        IPS_SetName($ID_Output_Current, "Aktuelle Ausgangsleistung");
        IPS_SetParent($ID_Output_Current, $_IPS['SELF']);
    }
	SetValue($ID_Output_Current,$Output_Current);
    }


	
	$Network_Voltage = stripos($tablerow->nodeValue, "Network Voltage");
    if($Network_Voltage !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Network_Voltage = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6));
        echo "Spannung Stromnetz: ",$Network_Voltage, PHP_EOL;

		$ID_Network_Voltage = @IPS_GetVariableIDByName("Spannung Stromnetz", $_IPS['SELF']);
    	if($ID_Network_Voltage === false)
    {
        $ID_Network_Voltage = IPS_CreateVariable(2);
        IPS_SetName($ID_Network_Voltage, "Spannung Stromnetz");
        IPS_SetParent($ID_Network_Voltage, $_IPS['SELF']);
    }
	SetValue($ID_Network_Voltage,$Network_Voltage);
    }
	
   
    $PV1_Input_Power = stripos($tablerow->nodeValue, "PV1 Input Power");
    if($PV1_Input_Power !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $PV1_Input_Power = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6));
        echo "PV1 Strang Eingangsleistung: ",$PV1_Input_Power, PHP_EOL;

		$ID_PV1_Input_Power = @IPS_GetVariableIDByName("PV1 Strang Eingangsleistung", $_IPS['SELF']);
    	if($ID_PV1_Input_Power === false)
    {
        $ID_PV1_Input_Power = IPS_CreateVariable(2);
        IPS_SetName($ID_PV1_Input_Power, "PV1 Strang Eingangsleistung");
        IPS_SetParent($ID_PV1_Input_Power, $_IPS['SELF']);
    }
	SetValue($ID_PV1_Input_Power,$PV1_Input_Power);
    }
	
	
	$PV2_Input_Power = stripos($tablerow->nodeValue, "PV2 Input Power");
    if($PV2_Input_Power !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $PV2_Input_Power = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "PV2 Strang Eingangsleistung: ",$PV2_Input_Power, PHP_EOL;

		$ID_PV2_Input_Power = @IPS_GetVariableIDByName("PV2 Strang Eingangsleistung", $_IPS['SELF']);
    	if($ID_PV2_Input_Power === false)
    {
        $ID_PV2_Input_Power = IPS_CreateVariable(2);
        IPS_SetName($ID_PV2_Input_Power, "PV2 Strang Eingangsleistung");
        IPS_SetParent($ID_PV2_Input_Power, $_IPS['SELF']);
    }
	SetValue($ID_PV2_Input_Power,$PV2_Input_Power);
    }
	
	
	$Power_Now = stripos($tablerow->nodeValue, "Power Now");
    if($Power_Now !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Power_Now = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "Aktuelle Leistung PV W: ",$Power_Now, PHP_EOL;

		$ID_Power_Now = @IPS_GetVariableIDByName("Aktuelle Leistung PV W", $_IPS['SELF']);
    	if($ID_Power_Now === false)
    {
        $ID_Power_Now = IPS_CreateVariable(2);
        IPS_SetName($ID_Power_Now, "Aktuelle Leistung PV W");
        IPS_SetParent($ID_Power_Now, $_IPS['SELF']);
    }
	SetValue($ID_Power_Now,$Power_Now);
    }
	

	$Output_Current = stripos($tablerow->nodeValue, "Output Current");
    if($Output_Current !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Output_Current = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "Aktuelle Leistung PV : ",$Output_Current, PHP_EOL;

		$ID_Output_Current = @IPS_GetVariableIDByName("Aktuelle Leistung PV A", $_IPS['SELF']);
    	if($ID_Output_Current === false)
    {
        $ID_Output_Current = IPS_CreateVariable(2);
        IPS_SetName($ID_Output_Current, "Aktuelle Leistung PV A");
        IPS_SetParent($ID_Output_Current, $_IPS['SELF']);
    }
	SetValue($ID_Output_Current,$Output_Current);
    }
	
}  


// Aufrufen der Batterieseite um diese zu parsen
curl_setopt($curl, CURLOPT_URL, 'http://www.solax-portal.com/m/User/battery/'.$Solax_ID);
curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$overview_website = curl_exec($curl);
//echo $overview_website;

$dom_battery = new DOMDocument();
 
$dom_battery->loadHTML($overview_website);
$tablerows = $dom_battery->getElementsByTagName('tr');
foreach ($tablerows as $tablerow)
{
    $Batterie_Charge = stripos($tablerow->nodeValue, "Battery 1");
    if($Batterie_Charge !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Batterie_Charge = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6));
        echo "Batterie Ladung: ",$Batterie_Charge, PHP_EOL;

		$ID_Batterie_Charge = @IPS_GetVariableIDByName("Batterie Ladung", $_IPS['SELF']);
    	if($ID_Batterie_Charge === false)
    {
        $ID_Batterie_Charge = IPS_CreateVariable(2);
        IPS_SetName($ID_Batterie_Charge, "Batterie Ladung");
        IPS_SetParent($ID_Batterie_Charge, $_IPS['SELF']);
    }
	SetValue($ID_Batterie_Charge,$Batterie_Charge);
    }
   
    $Battery_V = stripos($tablerow->nodeValue, "Battery V.");
    if($Battery_V !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Battery_V = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -6));
        echo "Batterie Spannung: ",$Battery_V, PHP_EOL;

		$ID_Battery_V = @IPS_GetVariableIDByName("Batterie Spannung", $_IPS['SELF']);
    	if($ID_Battery_V === false)
    {
        $ID_Battery_V = IPS_CreateVariable(2);
        IPS_SetName($ID_Battery_V, "Batterie Spannung");
        IPS_SetParent($ID_Battery_V, $_IPS['SELF']);
    }
	SetValue($ID_Battery_V,$Battery_V);
    }
	
	$Battery_I = stripos($tablerow->nodeValue, "Battery I.");
    if($Battery_I !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Battery_I = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "Battery P: ",$Battery_I, PHP_EOL;

		$ID_Battery_I = @IPS_GetVariableIDByName("Batterie Strom", $_IPS['SELF']);
    	if($ID_Battery_I === false)
    {
        $ID_Battery_I = IPS_CreateVariable(2);
        IPS_SetName($ID_Battery_I, "Batterie Strom");
        IPS_SetParent($ID_Battery_I, $_IPS['SELF']);
    }
	SetValue($ID_Battery_I,$Battery_I);
    }
	
	$Battery_P = stripos($tablerow->nodeValue, "Battery P.");
    if($Battery_P !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Battery_P = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "Batterie Leistung: ",$Battery_P, PHP_EOL;

		$ID_Battery_P = @IPS_GetVariableIDByName("Batterie Leistung", $_IPS['SELF']);
    	if($ID_Battery_P === false)
    {
        $ID_Battery_P = IPS_CreateVariable(2);
        IPS_SetName($ID_Battery_P, "Batterie Leistung");
        IPS_SetParent($ID_Battery_P, $_IPS['SELF']);
    }
	SetValue($ID_Battery_P,$Battery_P);
    }

	$Inner_T = stripos($tablerow->nodeValue, "Inner T.");
    if($Inner_T !== false)
    {
        $trimmed = trim($tablerow->nodeValue);
        $Inner_T = str_replace($Zu_Loeschende_Werte,"",substr($trimmed, -13));
        echo "Batterie Temperatur: ",$Inner_T, PHP_EOL;

		$ID_Inner_T = @IPS_GetVariableIDByName("Batterie Temperatur", $_IPS['SELF']);
    	if($ID_Inner_T === false)
    {
        $ID_Inner_T = IPS_CreateVariable(2);
        IPS_SetName($ID_Inner_T, "Batterie Temperatur");
        IPS_SetParent($ID_Inner_T, $_IPS['SELF']);
    }
	SetValue($ID_Inner_T,floatval($Inner_T));
    }	
	
}  


?>

Hallo BommelPommel,
hab seit heute meine Solax Anlage und möchte die Daten in Homematic nutzbar machen. Kann ich das PHP-Skript irgendwie in Homematic einbinden?

Das Script benötigt Symcom - die CCU kann kein PHP ausführen.