Fronius Wechselrichter mittels JSON in IPS einbinden

Hallo Zusammen,

nachdem mir das IPS- Team so großartig weitergeholfen hat, möchte ich „mein Wissen“ bezüglich der Einbindung eines Fronius- Wechselrichters weitergeben.

Ihr benötigt: einen oder mehrere Fronius- Wechselrichter mit mit einer Datamanager- Karte

http://www.fronius.com/cps/rde/xchg/SID-398C2ED7-69D33E6F/fronius_international/hs.xsl/83_28105_DEU_HTML.htm

Die Einbindung ist via WLAN und LAN möglich.

Wenn Ihr den WR mit

http://192.168.178.181/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData

abfragt, habt ihr die folgende Anzeige

{
	"Head" : {
		"RequestArguments" : {
			"DataCollection" : "CommonInverterData",
			"DeviceClass" : "Inverter",
			"DeviceId" : "1",
			"Scope" : "Device"
		},
		"Status" : {
			"Code" : 0,
			"Reason" : "",
			"UserMessage" : ""
		},
		"Timestamp" : "2014-01-07T09:03:22+01:00"
	},
	"Body" : {
		"Data" : {
			"DAY_ENERGY" : {
				"Value" : 240,
				"Unit" : "Wh"
			},
			"FAC" : {
				"Value" : 49.96,
				"Unit" : "Hz"
			},
			"IAC" : {
				"Value" : 4.39,
				"Unit" : "A"
			},
			"IDC" : {
				"Value" : 3.63,
				"Unit" : "A"
			},
			"PAC" : {
				"Value" : 1039,
				"Unit" : "W"
			},
			"TOTAL_ENERGY" : {
				"Value" : 143212,
				"Unit" : "Wh"
			},
			"UAC" : {
				"Value" : 230,
				"Unit" : "V"
			},
			"UDC" : {
				"Value" : 298.2,
				"Unit" : "V"
			},
			"YEAR_ENERGY" : {
				"Value" : 15994,
				"Unit" : "Wh"
			},
			"DeviceStatus" : {
				"StatusCode" : 7,
				"MgmtTimerRemainingTime" : -1,
				"ErrorCode" : 0,
				"LEDColor" : 2,
				"LEDState" : 0,
				"StateToReset" : false
			}
		}
	}
}

Wenn das klappt, dann legt euch fünf Variablen an (Float)
Day Energy
Total Energy
Year Energy
AC Frequency
Power

Wenn ihr mehr abfragen möchtet, dann müsst ihr es entsprechend ergänzen.

Und nun noch folgendes Skript:

$content = file_get_contents("http://192.168.178.181/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData"); // Dies ist die Abfrage. Zu ändern ist die IP und die DeviceID entsprechend eurer Geräte

if ($content === False){
    echo "Nicht erreichbar";
    $pac = 0;
    $fac = 0;
    SetValue(57819 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Power]*/,$pac);
    SetValue(16194 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo AC Frequency]*/,$fac);
    return;
// Dies ist die Kontrolle, ob der Wechselrichter erreichbar ist. Wenn nein, dann habe ich Power und Frequency auf null gesetzt, da ich manchmal "Restwerte" von 1 hatte (letzte erreichbare Abfrage war 1W) Die hätte er sonst bis zur nächsten Erreichbarkeit angezeigt.

}


$json = json_decode($content);


//Dies ist die eigentliche Wertabfrage und Zuweisung zu den vorne stehenden Variablen
//Ihr könnt es mit den Werten ergänzen die Ihr wollt
$day = $json->Body->Data->DAY_ENERGY->Value; 
$total = $json->Body->Data->TOTAL_ENERGY->Value; 
$year = $json->Body->Data->YEAR_ENERGY->Value;
$fac = $json->Body->Data->FAC->Value;
$pac = $json->Body->Data->PAC->Value;



$day = $day / 1000; // Umrechnung Watt in Kilowatt
$total  = $total / 1000;
$year = $year / 1000;

// Variablenzuweisung mit euren Variablen ändern
SetValue(23340 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Day Energy]*/,$day);  
SetValue(28828 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Total Energy]*/,$total);
SetValue(44925 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Year Energy]*/,$year);
SetValue(16194 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo AC Frequency]*/,$fac);
SetValue(57819 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Power]*/,$pac);

?>

Dann weist ihr dem Skript noch ein zyklisches Ereignis zu (Häufigkeit nach eurem Gusto, ich frage nach je einer Minute ab).
Dann sollte es laufen.
Für einen zweiten oder dritten oder… einfach neue Variablen anlegen, ein neues Skript anlegen und dann einfach die IP und die DeviceID ändern.

Alle Werte die man abfragen kann findet ihr in den Dokumentationen unter:

http://www.fronius.com/cps/rde/xchg/SID-2658B568-FA0179D1/fronius_international/hs.xsl/83_28911_DEU_HTML.htm#

Hierfür müsst ihr euch aber anmelden.

Ich hoffe die Anleitung ist hilfreich.
Lieschen

Danke, funktioniert einwandfrei (Fronius Symo 5.0-3-M via WLAN).

Hallo!
Danke für das Skript!
Bekomme immer die Fehlermeldung:

Notice: Undefined property: stdClass::$FAC in C:\IP-Symcon\scripts\12250.ips.php on line 25

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\12250.ips.php on line 25

Notice: Undefined property: stdClass::$PAC in C:\IP-Symcon\scripts\12250.ips.php on line 26

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\12250.ips.php on line 26

Warning: Cannot auto-convert to Float from Variant. Error: Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\12250.ips.php on line 38

Warning: Cannot auto-convert to Float from Variant. Error: Could not convert variant of type (Null) into type (Double) in C:\IP-Symcon\scripts\12250.ips.php on line 39

Habe dein Skript auf meine Varis umgeändert:


 $content = file_get_contents("http://10.0.0.40/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData"); // Dies ist die Abfrage. Zu ändern ist die IP und die DeviceID entsprechend eurer Geräte

if ($content === False){
    echo "Nicht erreichbar";
    $pac = 0;
    $fac = 0;
    SetValue(23889 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Power]*/,$pac);
    SetValue(13329 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo AC Frequency]*/,$fac);
    return;
// Dies ist die Kontrolle, ob der Wechselrichter erreichbar ist. Wenn nein, dann habe ich Power und Frequency auf null gesetzt, da ich manchmal "Restwerte" von 1 hatte (letzte erreichbare Abfrage war 1W) Die hätte er sonst bis zur nächsten Erreichbarkeit angezeigt.

}


$json = json_decode($content);


//Dies ist die eigentliche Wertabfrage und Zuweisung zu den vorne stehenden Variablen
//Ihr könnt es mit den Werten ergänzen die Ihr wollt
$day = $json->Body->Data->DAY_ENERGY->Value;
$total = $json->Body->Data->TOTAL_ENERGY->Value;
$year = $json->Body->Data->YEAR_ENERGY->Value;
$fac = $json->Body->Data->FAC->Value;
$pac = $json->Body->Data->PAC->Value;



$day = $day / 1000; // Umrechnung Watt in Kilowatt
$total  = $total / 1000;
$year = $year / 1000;

// Variablenzuweisung mit euren Variablen ändern
SetValue(28512 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Day Energy]*/,$day);
SetValue(10011 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Total Energy]*/,$total);
SetValue(18033 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Year Energy]*/,$year);
SetValue(13329 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo AC Frequency]*/,$fac);
SetValue(23889 /*[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Power]*/,$pac);

Danke für deine Info!

Mit der neuen Firmware Version der Fronius Datamanager karte kommt eine ModBus schnittstelle. Funktioniert einwandfrei.

Moin!

Ich möchte noch ein Code-Schnipsel beisteuern, falls jemand ein S0-Meter am Symo angeschlossen hat. Das Skipt liest den momentanen Verbrauch aus:

//zusaätzlich S0-Meter für Verbrauch abfragen und verarbeiten
$content2 = file_get_contents("http://192.168.178.229/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=MeterRealtimeData"); // Dies ist die Abfrage. Zu ändern ist die IP und die DeviceID entsprechend eurer Geräte
$json2 = json_decode($content2);
$usage = abs($json2->Body->Data->PowerReal_P_Sum);
SetValue(58516 /*[Solar\SymoMeterPowerNow]*/,$usage);

Kann an beliebiger Stelle eingefügt werden.

Tadaaaaa…Der erste Schnipsel von DrFrank.

Hallo,

Die erste modifizierte Version des Skripts hat noch zuviel Fehler produziert, da die Strukturen auf die es zugreift nicht immer existieren. Ich habe daher noch ein paar Abfragen eingebaut und es komplett umgestellt. Ausserdem wird jetzt noch der Autarkiegrad berechnet und in eine Variable geschrieben. Das Skript hat heute einen kompletten 24h Zyklus fehlerfrei überstanden :slight_smile:

Falls ihr ein Fronius SmartMeter besitzt könnt ihr das auch abfragen (URL anpassen). Da das SmartMeter Werte wie Netzspannung, Frequenz, usw. auch bereitstellt, wenn der Wechselrichter nicht läuft ist es sogar die bessere (weil 24x7) Datenquelle.

Eine generelle Doku der API gibt es hier:
http://www.fronius.com/cps/rde/xbcr/SID-A761BF1D-F8F8FEE6/fronius_international/42_0410_2012_318486_snapshot.pdf
(auf die jeweils aktuelle Version kann man nach kostenloser Registrierung zugreifen)

<?
// Initial Version by Symcon Froum Member: Lieschen, modified by Stefan Frank
// Doku: http://www.fronius.com/cps/rde/xbcr/SID-A761BF1D-F8F8FEE6/fronius_international/42_0410_2012_318486_snapshot.pdf

 // Inverter Abfrage. Zu ändern ist die IP und die DeviceID entsprechend eurer Geräte:
$content = file_get_contents("http://192.168.178.229/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CommonInverterData");
 // S0-Meter Abfrage. Zu ändern ist die IP und die DeviceID entsprechend eurer Geräte:
$content2 = file_get_contents("http://192.168.178.229/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=MeterRealtimeData");

// Default Werte. Sollen übergeben werden, solange der Inverter nicht produziert.
$pac = 0;
$fac = 50;
$uac = 230;
$iac = 0;
$udc = 0;
$idc = 0;
$status = 11;
$usage = 0;

if ($content !== False){											// Inverter erreichbar. Abfrage von content hat ein Ergebnis geliefert.
	$json = json_decode($content);
	if (property_exists($json, "Body") === True) {					// Die Struktur enthält einen Body, wir können also darauf zugreifen
		$status = $json->Body->Data->DeviceStatus->StatusCode;		// Diese Werte sollten immer im Body vorhanden sein
		$day = $json->Body->Data->DAY_ENERGY->Value; 
		$total = $json->Body->Data->TOTAL_ENERGY->Value; 
		$year = $json->Body->Data->YEAR_ENERGY->Value;              
        if ($status === 7){                                         // Hier steht der Inverterstatus drin. Einige Objekte existieren nur im Status 7 (running)
			$fac = $json->Body->Data->FAC->Value;					// Diese Werte exiistieren nur, wenn der Inverter produziert (7)
			$pac = $json->Body->Data->PAC->Value;
			$udc = $json->Body->Data->UDC->Value;
			$idc = $json->Body->Data->IDC->Value;
			$uac = $json->Body->Data->UAC->Value;
			$iac = $json->Body->Data->IAC->Value;
		}
	}
} 

// zusätzlich S0-Meter für den Eigen-Verbrauch verarbeiten
// Wenn ihr das Fronuis Smart-Meter besitzt, könnt ihr noch viel mehr Werte abfragen (Details: Siehe API Beschreibung)
if ($content2 !== False){
	$json2 = json_decode($content2);
	$usage = abs($json2->Body->Data->PowerReal_P_Sum);
}

// Umrechnung der Summen-Zählerwerte Watt in Kilowatt
$day = $day / 1000; 
$total  = $total / 1000;
$year = $year / 1000;

// Autarkiegrad ermitteln
if ($usage != 0) {
	$aut = ($pac / $usage) * 100;
} else {
	$aut = 0;
	}
if ($aut > 100){
	$aut=100;
}


// Zuweisung der Variablen
// Hier fuer eure Variablen angepassen:
SetValue(12821 /*[Solar\SymoStatus]*/,$status);
SetValue(21217 /*[Solar\SymoDayEnergy]*/,$day);  
SetValue(56358 /*[Solar\SymoTotalEnergy]*/,$total);
SetValue(58736 /*[Solar\SymoYearEnergy]*/,$year);
SetValue(58516 /*[Solar\SymoMeterPowerNow]*/,$usage);
SetValue(50620 /*[Solar\SymoACFrequency]*/,$fac);
SetValue(33254 /*[Solar\SymoPowerNow]*/,$pac);
SetValue(55891 /*[Solar\SymoDCVoltage]*/,$udc);
SetValue(59778 /*[Solar\SymoDCCurrent]*/,$idc);
SetValue(58881 /*[Solar\SymoACCurrent]*/,$iac);
SetValue(50641 /*[Solar\SymoACVoltage]*/,$uac);
SetValue(53814 /*[Solar\SymoAutarkiegrad]*/,$aut);
?>

Für die Variable „status“ kann mein noch ein Profil (Integer) wie folgt erstellen:
Unbenannt.JPG

Hier mal meine neuste Version. Sie sollte Fehler jetzt weitgehend abfangen. Außerdem habe ich noch weitere Datenklassen hinzugefügt (AC Seite bei 3-phasigen Geräten und MinMax Werte).

<?
// Initial Version by Symcon Froum Member: Lieschen, modified by Stefan Frank V2.10
// Doku: http://www.fronius.com/cps/rde/xbcr/SID-A761BF1D-F8F8FEE6/fronius_international/42_0410_2012_318486_snapshot.pdf
// Wenn ihr kein S0-Meter habt, müsst ihr alles was mit $content2 zusammenhaengt auskommentieren

define("baseIP", "192.168.xxx.xxx");         // IP Adresse eures Symo's
define("deviceID", "1");                     // Devices ID des Symo's (meist 0 oder 1)

// Default Werte. Sollen übergeben werden, solange der Inverter nicht produziert.
$pac = 0;
$fac = 50;
$uac = 230;
$iac = 0;
$iac1 = $iac2 = $iac3 = 0;
$uac1 = $uac2 = $uac3 = 230;
$udc = 0;
$idc = 0;
$status = 11;					// 12: nicht pingbar, 13: CommonINV missing, 14: Meter missing, 15: MinMax missing
$usage = 0;

// Testen ob der WR Erreichbar ist, sonst abbrechen (mit Status 12: nicht pingbar)
if (sys_Ping(baseIP, 100) === False){
	SetValue(12821 /*[EigeneProgramme\Solar\SymoStatus]*/,12); 
	return;
}								 

// CommonInverterData Abfrage:
$content = file_get_contents("http://".baseIP."/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=".deviceID."&DataCollection=CommonInverterData");
// S0-Meter Abfrage:
$content2 = file_get_contents("http://".baseIP."/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=".deviceID."&DataCollection=MeterRealtimeData");
// 3PInverterData Abfrage:
$content3 =  file_get_contents("http://".baseIP."/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=".deviceID."&DataCollection=3PInverterData");
// MinMaxInverterData-Abfrage:
$content4 =  file_get_contents("http://".baseIP."/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=".deviceID."&DataCollection=MinMaxInverterData"); 


// Block fuer CommonInverterData & 3PInverterData
// Nur bei Produktion ausfürhren
if ($content !== False){											// Inverter erreichbar. Abfrage von content hat ein Ergebnis geliefert.
	$json = json_decode($content);
	$json3 = json_decode($content3);
	if (property_exists($json, "Body") !== False) {					// Die Struktur enthält einen Body, wir können also darauf zugreifen
		$status = $json->Body->Data->DeviceStatus->StatusCode;		// Diese Werte sollten immer im Body vorhanden sein
		$day = $json->Body->Data->DAY_ENERGY->Value; 
		$total = $json->Body->Data->TOTAL_ENERGY->Value; 
		$year = $json->Body->Data->YEAR_ENERGY->Value;              
        if ($status === 7){                                         // Hier steht der Inverterstatus drin. Einige Objekte existieren nur im Status 7 (running)
			$fac = $json->Body->Data->FAC->Value;					// Diese Werte exiistieren nur, wenn der Inverter produziert (7)
			$pac = $json->Body->Data->PAC->Value;
			$udc = $json->Body->Data->UDC->Value;
			$idc = $json->Body->Data->IDC->Value;
			$uac = $json->Body->Data->UAC->Value;
			$iac = $json->Body->Data->IAC->Value;
			$iac1 = $json3->Body->Data->IAC_L1->Value;
			$iac2 = $json3->Body->Data->IAC_L2->Value;
			$iac3 = $json3->Body->Data->IAC_L3->Value;
			$uac1 = $json3->Body->Data->UAC_L1->Value;
			$uac2 = $json3->Body->Data->UAC_L2->Value;
			$uac3 = $json3->Body->Data->UAC_L3->Value;
		}
	} else {SetValue(12821 /*[EigeneProgramme\Solar\SymoStatus]*/,13); return;}  // Common INVData missing
} else {SetValue(12821 /*[EigeneProgramme\Solar\SymoStatus]*/,13); return;}


// Block für MeterRealtimeData
// zusätzlich S0-Meter für den Eigen-Verbrauch verarbeiten
// Wenn ihr das Fronuis Smart-Meter besitzt, könnt ihr noch viel mehr Werte abfragen (Details: Siehe API Beschreibung)
if ($content2 !== False){
	$json2 = json_decode($content2);
	$usage = abs($json2->Body->Data->PowerReal_P_Sum);
} else {SetValue(12821 /*[EigeneProgramme\Solar\SymoStatus]*/,14); return;}    // Meter Data missing

// Block für MinMaxInterverterData
if ($content4 !== False){
	$json4 = json_decode($content4);
	$dayPmax = $json4->Body->Data->DAY_PMAX->Value;
	$dayUDCmax = $json4->Body->Data->DAY_UDCMAX->Value;
	$yearPmax = $json4->Body->Data->YEAR_PMAX->Value;
	$yearUDCmax = $json4->Body->Data->YEAR_UDCMAX->Value;
} else {SetValue(12821 /*[EigeneProgramme\Solar\SymoStatus]*/,15); return;}    // MinMax Data missing

// Umrechnung der Summen-Zählerwerte Watt in Kilowatt
$day = $day / 1000; 
$total  = $total / 1000;
$year = $year / 1000;

// Autarkiegrad berechnen und runden:
if ($usage != 0) {
	$aut = ($pac / $usage) * 100;
} else {$aut = 0.00;}
$aut = round ($aut, 2);

// Ich stelle die 3Phasen Daten in je einer StringVariablen da
// Die werden hier zusammen gebaut:
$iac3P = $iac1."|".$iac2."|".$iac3." A";
$uac3P = $uac1."|".$uac2."|".$uac3." V";

// Zuweisung der Variablen
// Hier fuer eure Variablen angepassen:
SetValue(12821 /*[EigeneProgramme\Solar\SymoStatus]*/,$status);
SetValue(21217 /*[EigeneProgramme\Solar\SymoDayEnergy]*/,$day);  
SetValue(56358 /*[EigeneProgramme\Solar\SymoTotalEnergy]*/,$total);
SetValue(58736 /*[EigeneProgramme\Solar\SymoYearEnergy]*/,$year);
SetValue(58516 /*[EigeneProgramme\Solar\SymoMeterPowerNow]*/,$usage);
SetValue(50620 /*[EigeneProgramme\Solar\SymoACFrequency]*/,$fac);
SetValue(33254 /*[EigeneProgramme\Solar\SymoPowerNow]*/,$pac);
SetValue(55891 /*[EigeneProgramme\Solar\SymoDCVoltage]*/,$udc);
SetValue(59778 /*[EigeneProgramme\Solar\SymoDCCurrent]*/,$idc);
SetValue(58881 /*[EigeneProgramme\Solar\SymoACCurrent]*/,$iac);
SetValue(50641 /*[EigeneProgramme\Solar\SymoACVoltage]*/,$uac);
SetValue(53814 /*[EigeneProgramme\Solar\SymoAutarkiegrad]*/,$aut);
SetValue(30037 /*[EigeneProgramme\Solar\Symo3Puac]*/,$uac3P);
SetValue(15438 /*[EigeneProgramme\Solar\Symo3Piac]*/,$iac3P);
SetValue(18148 /*[EigeneProgramme\Solar\SymoUDCdayMax]*/,$dayUDCmax);
SetValue(49626 /*[EigeneProgramme\Solar\SymoUDCyearMax]*/,$yearUDCmax);
SetValue(36322 /*[EigeneProgramme\Solar\SymoPowerDayMax]*/,$dayPmax);
SetValue(11434 /*[EigeneProgramme\Solar\SymoPowerYearMax]*/,$yearPmax);
?>

Danke für die Skripte…
hat auf Anhieb funktioniert…

Bei mir hat der Fronius WR die DeviceID 1 und der Fronius SmartMeter die DeviceID 0…

Hier noch eine kleine Ergänzung wenn man den Fronius Smartmeter näher abfragen möchte…
Leider darf meine Anlage noch nicht ans Netz… daher spiele ich noch mit den Daten… Praxiserprobt ist es noch nicht ganz…

Ich hab mir ein seperates kleines Skript rausgeschnitten, um nur den SmartMeter abzufragen alle x Sekunden.
Aktuell ist der Stromverbrauch GESAMT, und dann Stromverbrauch von Phase 1 - 3 einzeln, aktueller Ampere Abruf auf Phase 1 - 3.

<?
// Initial Version by Symcon Froum Member: Lieschen, modified by Stefan Frank V2.10 
// Doku: http://www.fronius.com/cps/rde/xbcr/SID-A761BF1D-F8F8FEE6/fronius_international/42_0410_2012_318486_snapshot.pdf 

define("baseIP", "192.168.2.16");      // IP Adresse eures Symo's  
define("deviceIDSMART", "0");         // Devices ID des Symo's Smart Meter 

// S0-Meter Abfrage: 
$content2 = file_get_contents("http://".baseIP."/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=".deviceIDSMART."&DataCollection=MeterRealtimeData"); 
if ($content2 !== False){ 
    $json2 = json_decode($content2); 
    $usage = abs($json2->Body->Data->PowerReal_P_Sum);
	$PowerReal_P_Phase_1 = abs($json2->Body->Data->PowerReal_P_Phase_1);   
	$PowerReal_P_Phase_2 = abs($json2->Body->Data->PowerReal_P_Phase_2); 
	$PowerReal_P_Phase_3 = abs($json2->Body->Data->PowerReal_P_Phase_3);
	$Current_AC_Phase_1 = abs($json2->Body->Data->Current_AC_Phase_1);
	$Current_AC_Phase_2 = abs($json2->Body->Data->Current_AC_Phase_2);
	$Current_AC_Phase_3 = abs($json2->Body->Data->Current_AC_Phase_3); 
} else {SetValue(46085 /*[Haus\Photovoltaik\SymoStatus]*/,14); return;}    // Meter Data missing 


// Hier fuer eure Variablen angepassen:

SetValue(17707 /*[Haus\Photovoltaik\Aktueller Verbrauch]*/,$usage);
SetValue(30105 /*[Haus\Photovoltaik\SymoMeterPowerNow]*/,$usage);
SetValue(35245 /*[Haus\Photovoltaik\SmartMeter\PowerReal_P_Phase_1]*/,$PowerReal_P_Phase_1);
SetValue(39345 /*[Haus\Photovoltaik\SmartMeter\PowerReal_P_Phase_2]*/, $PowerReal_P_Phase_2);
SetValue(34395 /*[Haus\Photovoltaik\SmartMeter\PowerReal_P_Phase_3]*/,$PowerReal_P_Phase_3);
SetValue(39935 /*[Haus\Photovoltaik\SmartMeter\Current_AC_Phase_1]*/,$Current_AC_Phase_1);
SetValue(26585,$Current_AC_Phase_2);
SetValue(19453,$Current_AC_Phase_3);
?>

Laut Fronius DOKU gibt es für den Smartmeter noch:

PowerReactive_Q_Sum" : -18.58,
„PowerReactive_Q_Phase_1“ : -18.58,
30
„PowerReactive_Q_Phase_2“ : 0,
„PowerReactive_Q_Phase_3“ : 0,
„Voltage_AC_Phase_1“ : 232.7 ,
„Voltage_AC_Phase_2“ : 107.9 ,
„Voltage_AC_Phase_3“ : 107.9 ,
"Voltage_AC_PhaseToPhase_12 " : 301.5 ,
"Voltage_AC_PhaseToPhase_23 " : 186.9 ,
"Voltage_AC_PhaseToPhase_31 " : 301.5 ,
„Frequency_Phase_Average“ : 50,
„PowerApparent_S_Sum“ : 236,
„PowerFactor_Sum“ : 0.99,
„PowerFactor_Phase_1“ : 0.99,
„PowerFactor_Phase_2“ : 1,
„PowerFactor_Phase_3“ : 1,
"EnergyReal_WAC_Sum_Produced " : 0,
"EnergyReal_WAC_Sum_Consumed " : 10439 ,
„EnergyReactive_VArAC_Sum_Produced“ : 7490,
„EnergyReactive_VArAC_Sum_Consumed“ : 6110,
"EnergyReal_WAC_Plus_Absolute " : 0,
"EnergyReal_WAC_Minus_Absolute " : 10439

Als nicht Elektriker - verstehe ich da leider nur Bahnhof :slight_smile:

Hi,

die Werte sind recht schnell erklärt… https://www.frag-mutti.de/images/uploads/de/orig/46580/Bier.jpg

Wie groß ist er denn? x kW

LG Izack

Danke [emoji106]

Ich hab einen fronius symo 8.2-3 + fronius smartmeter.

Die Anlage selbst hat 9,85kWp (Südwestdach + ostdach).

Jetzt muss nur noch der VNB vorbeikommen :wink:

Frage wenn eine Abfrage von:


GetPowerFlowRealtimeData.fcgi?Scope=Device&DeviceId=
{
   "Body" : {
      "Data" : {
         "Inverters" : {
            "1" : {
               "Battery_Mode" : "normal",
               "DT" : xx,
               "E_Day" : xxx,
               "E_Total" : xxx,
               "E_Year" : xxx,
               "P" : 1234,
               "SOC" : xx

über IPS mit JSON stattfindet,
wäre der Aufruf wie folgt?

Ich glaube die 1 in der Abfrage ist so fehlerhaft, könnte da jemand helfen, sich sicherlich eine sehr einfache Sache aber ich komme gerade nicht drauf.

if ($content4 !== False){
    $json4 = json_decode($content4);
	    $pac = $json4->Body->Data->Inverters->"1"->P->Value;
 } else {SetValue(34542 /*[Fronius\Power]*/,15); return;} 

Viele Grüße


$data = json_decode($json, true);
$pac = $data["Body"]["Data"]["Inverters"]["1"]["P"];

Danke das läuft super, werde alles darauf umbauen, die Abfragegeschwindigkeit erhöht sich enorm.

Vg.

Error 1 at row 1 col 1 near ^$content = file_get_contents("http://192.168.178.108/solar_api/v1/GetInverterRea
Parse following code failed:
$content = file_get_contents(„http://192.168.178.108/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData“); // Dies ist die Abfrage. Zu ändern ist die IP und die DeviceID entsprechend eurer Geräte

if ($content === False){
echo „Nicht erreichbar“;
$pac = 0;
$fac = 0;
SetValue(57819 /[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Power]/,$pac);
SetValue(16194 /[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo AC Frequency]/,$fac);
return;
// Dies ist die Kontrolle, ob der Wechselrichter erreichbar ist. Wenn nein, dann habe ich Power und Frequency auf null gesetzt, da ich manchmal „Restwerte“ von 1 hatte (letzte erreichbare Abfrage war 1W) Die hätte er sonst bis zur nächsten Erreichbarkeit angezeigt.

}

$json = json_decode($content);

//Dies ist die eigentliche Wertabfrage und Zuweisung zu den vorne stehenden Variablen
//Ihr könnt es mit den Werten ergänzen die Ihr wollt
$day = $json->Body->Data->DAY_ENERGY->Value;
$total = $json->Body->Data->TOTAL_ENERGY->Value;
$year = $json->Body->Data->YEAR_ENERGY->Value;
$fac = $json->Body->Data->FAC->Value;
$pac = $json->Body->Data->PAC->Value;

$day = $day / 1000; // Umrechnung Watt in Kilowatt
$total = $total / 1000;
$year = $year / 1000;

// Variablenzuweisung mit euren Variablen ändern
SetValue(23340 /[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Day Energy]/,$day);
SetValue(28828 /[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Total Energy]/,$total);
SetValue(44925 /[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Year Energy]/,$year);
SetValue(16194 /[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo AC Frequency]/,$fac);
SetValue(57819 /[Energie\PVAnlage\FRONIUS\Fronius SYMO\Symo Power]/,$pac);

?>

Der html String direkt im Browser eingegeben liefert diese Daten aber korrekt
http://192.168.178.108/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData

Unit „Wh“
Value 4337
DeviceStatus
ErrorCode 0
LEDColor 2
LEDState 0
MgmtTimerRemainingTime -1
StateToReset false
StatusCode 7
FAC
Unit „Hz“
Value 49.97
IAC
Unit „A“
Value 2.33
IDC
Unit „A“
Value 0.83
PAC
Unit „W“
Value 540
TOTAL_ENERGY
Unit „Wh“
Value 75047
UAC
Unit „V“
Value 229.9
UDC
Unit „V“
Value 688.4
YEAR_ENERGY
Unit „Wh“
Value 75047.5
Head
RequestArguments
DataCollection „CommonInverterData“
DeviceClass „Inverter“
DeviceId „1“
Scope „Device“
Status
Code 0
Reason „“
UserMessage „“
Timestamp „2019-05-15T16:10:37+02:00“

Kommt denn bei dem Dreizeiler auch eine Fehlermeldung?


<?php
$content = file_get_contents("http://192.168.178.108/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData"); 
var_dump($content);

Error 1 at row 1 col 2 near ^?php
$content = file_get_contents("http://192.168.178.108/solar_api/v1/GetInver
Parse following code failed:
<?php
$content = file_get_contents(„http://192.168.178.108/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData“);
var_dump($content);

Geb ich aber den http string alleine im Browser ein funktioniert es :disappointed:

{
„Body“ : {
„Data“ : {
„DAY_ENERGY“ : {
„Unit“ : „Wh“,
„Value“ : 5536
},
„DeviceStatus“ : {
„ErrorCode“ : 0,
„LEDColor“ : 2,
„LEDState“ : 0,
„MgmtTimerRemainingTime“ : -1,
„StateToReset“ : false,
„StatusCode“ : 7
},
„FAC“ : {
„Unit“ : „Hz“,
„Value“ : 49.960000000000001
},
„IAC“ : {
„Unit“ : „A“,
„Value“ : 0.5
},
„IDC“ : {
„Unit“ : „A“,
„Value“ : 0.23000000000000001
},
„PAC“ : {
„Unit“ : „W“,
„Value“ : 117
},
„TOTAL_ENERGY“ : {
„Unit“ : „Wh“,
„Value“ : 76246
},
„UAC“ : {
„Unit“ : „V“,
„Value“ : 234.30000000000001
},
„UDC“ : {
„Unit“ : „V“,
„Value“ : 653.10000000000002
},
„YEAR_ENERGY“ : {
„Unit“ : „Wh“,
„Value“ : 76246.899999999994
}
}
},
„Head“ : {
„RequestArguments“ : {
„DataCollection“ : „CommonInverterData“,
„DeviceClass“ : „Inverter“,
„DeviceId“ : „1“,
„Scope“ : „Device“
},
„Status“ : {
„Code“ : 0,
„Reason“ : „“,
„UserMessage“ : „“
},
„Timestamp“ : „2019-05-15T18:58:02+02:00“
}
}

Wo führst Du das Skript denn genau aus? Ist das ein PHP Server oder hast Du IP-Symcon installiert und führst das Skript im Objektbaum aus? Kannst Du mal einen Screenshot machen vom Skript wie das bei Dir aussieht?