Hilfe zeitgesteuerte Webseiten-Auslese erstellen

Hallo liebe Gemeinde,
als Nicht-Softwerker brauche ich mal Eure Hilfe:
Ich habe eine Balkonkraftwerk installiert, an dem ein Deye SUN 600 Wechselrichter läuft.
Leider habe ich nirgendwo eine Möglichkeit gefunden, den Wechselrichter (mit WLAN-Schnittstelle zur Solarman-App) über ein Symcon-Modul auszulesen.
Derzeitiger Arbeitsstand:
Ich hole mir die interessanten Werte (derzeit erzeugt Leistung, an diesem Tag erzeugte Leistung, erzeugte Leistung gesamt) von der Webseite des Wechselrichters per Text-Parser.
Das Ganze funktioniert auch zufriedenstellend und wäre für mich auch ausreichend, aber der Wechselrichter schaltet nachts (nach Sonnenuntergang) bis nach dem Sonnenaufgang aus.
Damit ist die interne Webseite nicht erreichbar und mein Textparser erzeugt Fehler über Fehler.

Was muss ich einstellen / programmieren, damit diese Abfrage nur tagsüber (abhängig von Sonnenaufgang und Sonnenuntergang) erfolgt und es zu keinem Fehler im Log kommt?

Für einen kurzen „Stups“ in die richtige Richtung wäre ich Euch sehr dankbar.

Besten Dank im voraus.

Drei quasi verschachtelte Ereignisse. Eines führt alle Minute o.ä. die WWW_UpdatePage Funktion der Text-Parser bzw. der übergeordneten HTTP Instanz aus.

Das zweite aktiviert morgens das erste Ereignis, das dritte deaktiviert abends das erste Ereignis.

Hallo Tobias,
vielen Dank für die schnelle Reaktion. Die WWW_UpdatePage-Funktion kannte ich bisher noch nicht.
Ich habe jetzt erstmal ein steuerndes Ereignis für die WWW_Reader-Instanz erstell, die den Reader alle 2min triggert, wenn die Variable „Es ist Tag“ true ist. Mal sehen, wie das Ganze funktioniert, wenn es Nacht ist.

PS: Wenn jemand Lust und Laune hat, ein Modul für den DEYE SUN600 zu schreiben, stehe ich gern als Tester zur Seite, der Wechselrichter ist doch sehr verbreitet…

Besten Dank nochmal
Thilo

Ich hab auch einen Deye aber den 2400er. Ebenso mit WLAN und Solarmananbindung.
Die API ist relativ einfach. Hier mein Skript

<?php

function datenholen($sn)
{
	$token=getvalue(24584);
	$appID=getvalue(49005);
	$url = getvalue(38165)."/device/v1.0/currentData?appId=".$appID."&language=en&=";

	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

	$headers = array(
   		"Authorization: bearer ".$token,
   		"Content-Type: application/json",
	);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

	$data = "{
		\"deviceSn\": \"".$sn."\"
		}";
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	$resp = curl_exec($curl);
	curl_close($curl);
	return $resp;
}


function logdaten($sn,$geraet)
{
	$token=getvalue(24584);
	$appID=getvalue(49005);
	$url = getvalue(38165)."/device/v1.0/alertList?appId=".$appID."&language=en&=";
	//Zeitstempel
    $starttimestamp=mktime(0,0,0,date("m"),date("d"),date("y"));
	$endtimestamp=time();

	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

	$headers = array(
   		"Authorization: bearer ".$token,
   		"Content-Type: application/json",
	);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

	$data = "{
		\"deviceSn\": \"".$sn."\",
		\"endTimestamp\" : \"".$endtimestamp."\",
		\"startTimestamp\" : \"".$starttimestamp."\"		
		}";
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	$resp = curl_exec($curl);
	curl_close($curl);
	if ($resp<>"")
	{
		//Logdaten ins IPS Log schreiben
        $logdaten=json_decode($resp,true);
        if (is_array($logdaten))
        {
            if (array_key_exists("alertList", $logdaten))
            {
    		    $logdaten=$logdaten["alertList"];
		        //level 0:Hinweis, 1:Warnung, 2: Fehler
    		    //influence 0:kein Einfluss, 1: Produktion, 2: Sicherheit, 3:Produktion&Sicherheit
		        $level="";
		        $influence="";
		        foreach ($logdaten as $eintrag)
		        {
        			switch ($eintrag["level"])
			        {
        				case 0: $level="MESSAGE";break;
				        case 1: $level="WARNING";break;
				        case 2: $level="ERROR";break;
			        }
			        switch ($eintrag["influence"])
			        {
        				case 0: $influence="kein Einfluss";break;
				        case 1: $influence="Produktion";break;
				        case 2: $influence="Sicherheit";break;
				        case 3: $influence="Produktion&Sicherheit";break;
			        }
	 		        Global_Log_Eintrag_erstellen($level,$geraet,"WRLOG - ".date("d.m.Y G:i:s",$eintrag["alertTime"])." ".$eintrag["alertName"]." ".$influence);
		        }
            }
        }
	}
}

//eventuell Token holen
if (time()>=getvalue(52106)) IPS_RunScriptWait(56619); //ScriptID Token holen
//Logdaten Logger
logdaten("4047293442","WR Logger");
//Wechselrichter
logdaten("2103282105","WR");
//Modul 1
logdaten("2103282105-1","Modul1");
//Modul 2
logdaten("2103282105-2","Modul2");
//Modul 3
logdaten("2103282105-3","Modul3");
//Modul 4
logdaten("2103282105-4","Modul4");
//Logger
//var_dump(json_decode(datenholen("4047293442"),true));
//Wechselrichter
$wrdaten=json_decode(datenholen("2103282105"),true);
//var_dump($wrdaten);
if (is_array($wrdaten))
{
    if (array_key_exists("dataList",$wrdaten))
    {
    	//Update
    	setvalue(20614,mktime(intval($wrdaten["dataList"][7]["value"]),intval($wrdaten["dataList"][8]["value"]),intval($wrdaten["dataList"][9]["value"]),intval($wrdaten["dataList"][5]["value"]),intval($wrdaten["dataList"][6]["value"]),intval($wrdaten["dataList"][4]["value"])));
    	//Temperatur
    	if ($wrdaten["dataList"][39]["value"]>0) setvalue(42688,$wrdaten["dataList"][39]["value"]);

    	//PV1
    	//Ampere
    	setvalue(15569,$wrdaten["dataList"][17]["value"]);
    	//Leistung
    	setvalue(10271,$wrdaten["dataList"][21]["value"]);
    	//Volt
    	setvalue(12127,$wrdaten["dataList"][13]["value"]);

    	//PV2
    	setvalue(19442,$wrdaten["dataList"][18]["value"]);
    	setvalue(14759,$wrdaten["dataList"][22]["value"]);
    	setvalue(39168,$wrdaten["dataList"][14]["value"]);

    	//PV3
    	setvalue(20520,$wrdaten["dataList"][19]["value"]);
    	setvalue(54745,$wrdaten["dataList"][23]["value"]);
    	setvalue(48708,$wrdaten["dataList"][15]["value"]);

    	//PV4
    	setvalue(22639,$wrdaten["dataList"][20]["value"]);
    	setvalue(44506,$wrdaten["dataList"][24]["value"]);
    	setvalue(12708,$wrdaten["dataList"][16]["value"]);
    }
    else
    {
    	Global_Log_Eintrag_erstellen("WARNING","WRLOGGER","WRLOG - Keine Daten empfangen");
    }
}

Bei dir werden es nur zwei Anschlusse geben.
Was du brauchst ist die API-ID. Die bekommst du direkt beim Anbieter. Da reicht eni Mail. Die ID wird dir dann zugesendet.
Damit kannst du dann den Token ermitteln, den du benötigst.
Hier das Skript dazu

<?php
$url=getvalue(38165);
$user=getvalue(47023); //Benutzername vom Onlinezugang
$password=hash("sha256",getvalue(29895)); //Passwort vom Onlinezugang
$appId=getvalue(49005); //Daten kommen von Solarman
$appSecret=getvalue(41880); //Daten kommen Solarman

$erg=array();
$url = $url."/account/v1.0/token?appId=".$appId."&language=en&=";

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$headers = array(
   "Content-Type: application/json",
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

$data ="
{
	\"appSecret\": \"".$appSecret."\",
	\"email\": \"".$user."\",
	\"password\": \"".$password."\"
}";

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$resp = curl_exec($curl);
curl_close($curl);
$erg=json_decode($resp,true);
var_dump($erg);
if ($erg["success"] == true)
{
	setvalue(24584,$erg["access_token"]);
	setvalue(47369,$erg["refresh_token"]);
	setvalue(52106,time()+$erg["expires_in"]);
}
else
{
	setvalue(24584,"");
	setvalue(47369,"");
	setvalue(52106,"");	
}

Die Daten sind allerdings immer ca. 10-15 Minuten hinten nach. Also für Echtzeitüberwachung ungeeignet. Dafür solltest du dir eine andere Art der Messung überlegen. Als Beispiel wäre z.b. ein Shelly Plug mit Verbrauchsmessung. Der misst auch in die umgekehrte Richtung.

Näheres auch hier

Wobei mich im Grunde nur die Temperatur interessiert. Den Rest bekomme ich von der Shelly bzw. ist für mich uninteressant.

Hallo,
@hfeichtinger
ich habe die beiden Scripte mal auf meine Variablen geändert und nun holt er auch von Solarman die entsprechenden Werte ab.
Gibt es irgendwo eine Übersicht, Nummer in der Datalist welcher Wert ist ? D.h. könnte man hier noch zusätzliche Werte auslesen? (z.B. Gesamterzeugung, Ertrag heute etc…)

Viele Grüße und besten Dank
Thilo

Hast du schon die API ID bekommen?
Alles zur API findest du hier
SolarmanOpenAPI(v1.1.6)-EN_1660612888790_h6clo.pdf (1,5 MB)

Die API-ID hatte ich schon bekommen und eingebaut, bei dem OPEN-API-Dokument muss ich mich erst noch durchhangeln…
Das Abholen der 3 Werte je Modul und von der Temperatur klappt, leider aber mit viel Zeitverzögerung.
Danke dir…
Viele Grüße

Ja, es sind etwa 10 Minuten später. Daher ungeeignet. Es sollte auch eine lokale Abfrage funktinoieren, aber das gibts bis jetzt noch nicht fertig.
Was noch interessant sein könnten, sind die Logeinträge vom WR. Da spielen ein paar Minuten keine Rolle.
Bitte gerne.

Hi,

kurze Frage, da ich such einen deye sun micro wechselrichter habe…ist die solarman api id bei jedem user anders? Wo gebau bekomme ich diese ggf?

Danke euch im voraus

Thomas

Ja, ist bei jedem anders. Du musst lediglich ein Mail an den Hersteller schreiben, dass du gerne den API Key hättest
customerservice(ätsch)solarmanpv(punkt)com
Du musst natürlich deinen WR hier https://home.solarmanpv.com/ registrieren.