Fronius Wechselrichter mittels JSON in IPS einbinden

Habe wie auf der ersten Seite dieses Beitrags beschrieben die Variablen angelegt und dann das script eingefügt.

Lg
Peter

Die CCU selber nutzt eine proprietäre Skript Sprache, das heist dies funktioniert nur auf einer CCU. IP-Symcon selber nutzt als Sprache das verbreitete PHP. file_get_contents ist eine PHP Funktion, daher lässt sich das Skript so nicht einfach auf eine CCU übertragen und es kommt zu einer Fehlermeldung. Wenn Du das nur auf einer CCU abarbeiten willst müsstest Du mit Hilfsmitteln wie CuxD und Homematic Skript arbeiten. Der Vorteil von IP-Symcon wäre das Du weniger Einrichtungsaufwand hast und auch die Variablen einfach aufzeichnen kannst bzw. Dir einen Graph erstellen. PHP Skripte laufen aber nur auf einem PHP Server oder in IP-Symcon direkt. Wenn Du das also ausprobieren willst kannst Du Dir hier eine Demo herunterladen und z.B. zu Testzwecken auf einem Windowsrechner installieren. Dann kannst Du das Skript hoffentlich kopieren und dies sollte ohne Fehlermeldung ausgeführt werden. Falls Du das direkt auf einer CCU abrufen willst, must Du Homematic Skript und Hilfsmittel wie CuxD benutzten. Eine mögliche Vorlage, die Du ausprobieren könntest, findest Du hier.

Funktioniert das bei euch noch?
Bei mir seit 2 Wochen nicht mehr.

<? $content = file_get_contents("http://192.168.1.22/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 $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; $day = $day / 1000; // Umrechnung Watt in Kilowatt $total = $total / 1000; $year = $year / 1000; // Variablenzuweisung mit euren Variablen Šndern SetValue(45414,$day); SetValue(52100,$total); SetValue(51481,$year); ?>

Ergibt folgenden Output:
Notice: Undefined property: stdClass::$DAY_ENERGY in /Library/Application Support/Symcon/scripts/11150.ips.php on line 8

Notice: Trying to get property ‚Value‘ of non-object in /Library/Application Support/Symcon/scripts/11150.ips.php on line 8

Notice: Undefined property: stdClass::$TOTAL_ENERGY in /Library/Application Support/Symcon/scripts/11150.ips.php on line 9

Notice: Trying to get property ‚Value‘ of non-object in /Library/Application Support/Symcon/scripts/11150.ips.php on line 9

Notice: Undefined property: stdClass::$YEAR_ENERGY in /Library/Application Support/Symcon/scripts/11150.ips.php on line 10

Notice: Trying to get property ‚Value‘ of non-object in /Library/Application Support/Symcon/scripts/11150.ips.php on line 10

Wenn ich die URL direkt abfrage, kommt auch eine Fehlermeldung:

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

{
„Body“ : {
„Data“ : {}
},
„Head“ : {
„RequestArguments“ : {
„DataCollection“ : „CommonInverterData“,
„DeviceClass“ : „Inverter“,
„Scope“ : „Device“
},
„Status“ : {
„Code“ : 6,
„Reason“ : „CGI-Args: Invalid parameter ‚‘ for attribute ‚DeviceId‘ (must be numeric)“,
„UserMessage“ : „“
},
„Timestamp“ : „2022-02-02T15:33:43+01:00“
}
}

Den gleicher Fehler bekomme ich auch, siehe hier:

Hallo gdfde
Deine Frage ist zwar schon etwas länger her, aber dieser Fehler hatte ich auch einmal. Schreib das Wort DeviceID in der Abfrage so, wie es in der Fehlermeldung steht: DeviceId (also ein kleines d am Ende anstelle D). Damit funktioniert die Abfrage dann wieder. Das Verhalten hatte sich wahrscheinliche einmal mit einem FirmwareUpdate geändert.

Die Zeile muss also wie folgt lauten:

$content = file_get_contents("http://192.168.1.22/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CommonInverterData");

Dabei kannst du den Befehl file_get_contents auch gleich mit der IPS-Funktion Sys_GetURLContent ersetzen (so hast du ein Timeout von 10s eingebaut). Die Zeile lautet dann so:

$content = Sys_GetURLContent("http://192.168.1.22/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CommonInverterData");

1 „Gefällt mir“

Hallo zusammen,
ich habe seit dieser Woche auch den Fronius per json angesprochen. Dabei hatte ich zunächst Probleme bei der Konvertierung der Rückgabewerte. Ich habe das ganze einfach wie folgt gelöst…

//$gestern = date('d.m.Y', strtotime("-1 days"));
$heute = date('d.m.Y');

// Abfrage an Fronius Wechselrichter...
$content = file_get_contents("http://192.168.10.6/solar_api/v1/GetArchiveData.cgi?Scope=System&SeriesType=DailySum&StartDate=$heute&EndDate=$heute&Channel=EnergyReal_WAC_Sum_Produced&Channel=EnergyReal_WAC_Minus_Absolute&Channel=EnergyReal_WAC_Plus_Absolute"); 
// Ausgabe vom Wechselrichter anpassen, da sonst json_decode fehlschlägt....
$srch1 = "inverter/1";
$repl1 = "Inverter";
$content1 = str_replace($srch1, $repl1, $content);

$srch2 = "meter:IME - Smart Meter 63A - 18131367";
$repl2 = "Meter";
$content2 = str_replace($srch2, $repl2, $content1);

$json = json_decode($content2);

//...hier jetzt die eigentliche Werte_Ermittlung aus den JSON-Daten...
$xy = "0";
$erzeugt = $json->Body->Data->Inverter->Data->EnergyReal_WAC_Sum_Produced->Values->$xy;
$eingespeist = $json->Body->Data->Meter->Data->EnergyReal_WAC_Minus_Absolute->Values->$xy;
$bezogen = $json->Body->Data->Meter->Data->EnergyReal_WAC_Plus_Absolute->Values->$xy;

…und alles weitere so ähnlich wie im Beispiel von Petersymo (artig danke sag)…
Das ganze geht dann auf Variablen vom Typ Zähler - und kann prima in einem Diagramm dargestellt werden…

Zum Hintergrund: die Ausgabe aus der JSON-Abfrage sieht wie folgt aus (nur ein Ausschnitt) und kann mit den Angaben zu „inverter/1“ und „meter:…“ wohl nicht gescheit konvertiert werden:

{
	"Body" : 
	{
		"Data" : 
		{
			"inverter/1" : 
			{
				"Data" : 
				{
					"EnergyReal_WAC_Sum_Produced" : 
					{
						"Unit" : "Wh",
						"Values" : 
						{
							"0" : 66012.906111111137
						},
						"_comment" : "channelId=67830024"
					}
				},
				"DeviceType" : 232,
				"End" : "2022-06-15T23:59:59+02:00",
				"NodeType" : 97,
				"Start" : "2022-06-15T00:00:00+02:00"
			},
			"meter:IME - Smart Meter 63A - 18131367" : 
			{
				"Data" : 
				{
					"EnergyReal_WAC_Minus_Absolute" : 
					{
						"Unit" : "Wh",
						"Values" : 
						{
							"0" : 55387
						},
						"_comment" : "channelId=167837960"
					},
					"EnergyReal_WAC_Plus_Absolute" : 
					{
						"Unit" : "Wh",
						"Values" : 
						{
							"0" : 2702
						},
						"_comment" : "channelId=167772424"
					}
				},
				"End" : "2022-06-15T23:59:59+02:00",
				"Start" : "2022-06-15T00:00:00+02:00"
			}
		}
	},
	"Head" : 
	{
		"RequestArguments" : 
		{
			"Channel" : 
			[
				"EnergyReal_WAC_Sum_Produced",
				"EnergyReal_WAC_Minus_Absolute",
				"EnergyReal_WAC_Plus_Absolute"
			],
			"EndDate" : "2022-06-15T23:59:59+02:00",
			"HumanReadable" : "True",
			"Scope" : "System",
			"SeriesType" : "DailySum",
			"StartDate" : "2022-06-15T00:00:00+02:00"
		},
		"Status" : 
		{
			"Code" : 0,
			"ErrorDetail" : 
			{
				"Nodes" : []
			},
			"Reason" : "",
			"UserMessage" : ""
		},
		"Timestamp" : "2022-06-15T20:16:07+02:00"
	}
}

Ich hoffe, das ganze kann jemand gebrauchen, der ebenfalls versucht auf diese Daten zuzugreifen. Wollte das ganze erst per Modbus machen, bin aber dort irgendwo auf der Strecke geblieben, weil ich nicht die richtigen Register gefunden habe.
Meine Abfrage läuft täglich ab 5 Uhr alle 10 Minuten - und das reicht mir vollkommen aus, um einen groben Überblick zu haben…

Hallo zusammen,
ich verwende das Fronius Model seit ca. einem 3/4 Jahr mit dem GEN24, jetzt habe ich endlich für meinen 2.ten Wechselrichter SYMO die Datenschnittstelle bekommen, aber irgendwie ist für den SYMO täglich die I/O Instanz defekt, kann es sein das der Fehler auftritt wenn der Wechselrichter in den Standby geht? Die Werte passen alle und auch die ID’s habe ich entsprechend angepasst.
Vielen Dank für eure Hilfe.
Viele Grüße
Dominik

Hallo Dominik,

ja, genauso ist es. Habe genau die gleiche Konstellation. Den Standby vom Symo kann man zwar abschalten, solltest Du aber nicht, da der Wechselrichter über Nacht dann nutzlos Strom verbraucht. Wenn sich der WR früh wieder einschaltet, hängt sich jedoch leider die Instanz auf. Du musst sie deshalb per Skript neu starten, dann läuft alles wieder wie gewohnt.

LG
Marc

noch als Ergänzung, wie ich es mache: der GEN24 läuft bei mir durch, weil er das wegen dem Batteriemanagement sowieso machen muss. Ich prüfe dann, ab wann er Strom erzeugt. Ab diesem Zeitpunkt pinge ich den Symo an, sobald er erreichbar ist, starte ich die Instanz neu. Stehe gern für weitere Detailfragen zur Verfügung.

LG
Marc

Hallo Marc,
Danke dann muss ich das mal probieren, hast du vielleicht ein Auszug vom Skript :wink: kopieren ist leichter als neu schreiben.
Viele Grüße
Dominik

hiermit kannst Du die Instanz neu starten, nachdem Dein Symo erfolgreich angepingt wurde:

$instanceID=35312;  //Instanz Symo 10
$ip="192.168.2.141";  //IP Symo 10
$ping = Sys_Ping($ip, 2000);

if ($ping==true) {
    IPS_SetProperty($instanceID, 'active', false);
    IPS_ApplyChanges($instanceID);
    IPS_SetProperty($instanceID, 'active', true);
    IPS_ApplyChanges($instanceID);
    SetValue(31343,true); //Variable "heute Instanz gestartet?"
    }

Den Start des Scripts stellst Du mit einem Ereignis so ein, dass es reagiert, sobald Dein Gen24 Strom liefert. Ich habe noch zusätzlich die Variable „heute Instanz gestartet?“ eingebaut, die er auf true setzt, sobald er den WR anpingen konnte und die Instanz neu gestartet hat. Diese Variable verwende ich dann als weitere Bedingung, dass er das Ereignis dann nicht mehr ausführt (sonst würde ja die Instanz tagsüber ständig neu gestartet). Früh um fünf stelle ich die Variable wieder auf false zurück.
Ich hoffe, ich habe mich halbwegs verständlich ausgedrückt :wink:

LG
Marc

PS: Die ID’s musst Du natürlich auf Deine eigenen anpassen.

Super vielen Dank dafür, damit kann ich das auch so umsetzen.

Viele Grüße
Dominik

1 „Gefällt mir“

Hallo,
ich habe diesen code zu meiner Abfrage hinzugefügt.
Ich möchte auch noch den Aktuellen Zählerstand auslesen, könnt ihr mir helfen wie ich das machen muss?

Hallo Dominik,

welcher Code ? kann leider keien sehen :slightly_smiling_face:

Gruß Jürgen

Den vom DrFrank rechts bei meinem Beitrag.

Es geht um die SmartMeter abfrage für den Zählerstand.
Habe es aber schon geschafft wenn ich richtig bin

Hallo,
ich habe mit euren Skripts und eurer Hilfe jetzt alle Werte die ich aktuell benötige .
Danke schon mal dafür.

Ein Wert würde mich noch interessieren.
In der App vom Wattpilot wir ja der Wert was vom Netz zum Wattpilot kommt angezeigt.
Kann ich diesen Wert auch abfragen?
Darüber habe ich noch nicht gefunden.