Anbindung Solarlog 1000

Mit adressieren meinte ich lösen. Irgendwie seltsam, dass der Webserver sich aufhängt, nur weil der WR Teil sich nachts abschaltet.

Hallo zusammen,
sorry, habe mich lange nicht gemeldet… es war ein wenig stressig mit meinem Nachwuchs und ich hatte definitiv zu wenig Schlaf.
Wollte kurz mal den Zwischenstand melden, bevor ich mich gleich wieder an die Orga der Solaranlage mache.

Habe das Thema „FTP“ nun wieder auf Eis gelegt und verfolge wieder den direkten Zugriff. Der Logger läuft mit euren Skripten bereits 3 Tage ununterbrochen. Es scheint zu stimmen, dass er nicht absäuft, wenn man ihn in der Nacht in Ruhe lässt. Ich hole von 5:30 bis 22:30 alle 10min für alle 34 WR’s.
Das Skript habe ich so angepasst, dass es alle Werte meiner WR’s ausliest… sind jetzt ein haufen Variablen (über 250Stück), aber es passt :slight_smile:

Bin zur Zeit bei der Vernüpfung der WR’s, so dass ich anschließend Grafiken für die verschiedenen Dachflächen errechnen kann und die WR’s vergleichbar werden.

Ach ja, dabei ist mir aufgefallen: Kann man bei existierenden Variablen die „Datenbank-Logging“ Checkbox irgendwie massenweise setzen, statt in jede Variable reingehen zu müssen?

Melde mich, wenn ich was vorzeigen kann.

Btw: Welche Visualisierung nutzt man am besten für die Grafiken? Hatte da schonmal was im Forum gestöbert. Was ist eure Erfahrung?

THX
Lars

Hi Leute,

hat jemand von Euch das Script an einem Solarlog 400e zum laufen bekommen? Bei mir kommt immer ein 404 und es scheint als können man die .js Scripte nicht direkt über den Webserver aufrufen? Der Solarlog schreibt diese ja auf einen ftp-Server aber diesen Umweg würde ich natürlich gerne umgehen.

Gruß
Tobias

Hallo Gemeinde,

ist das Thema hier eingeschlafen? Wen es interessiert…ich habe einen Solarlog 1000 recht komfortabel eingebunden. Es wird die Konfigurationsdatei des Solarlog ausgelesen und sämtliche Instanzen und Variablen werden automatisch angelegt. Dann muss man nur noch die Scripte in eine bestimmte Instanz reinkopieren und ein paar Timer setzen, das war’s.

Leider muss man sich die Visualisierung für das Webfront und die Highcharts noch selbst anlegen, aber die Hauptarbeit übernimmt das Anlagescript.

Wer also noch Interesse an dem Thema hat, einfach melden :slight_smile:

Grüße
Grebi

Klar immer her damit.

Es gibt eine neue Firmware für den Solar Log vom 20.06.12:

Auszug:

„ModbusTCP-Interface integriert. Externe Systeme (SCADA) können nun auf alle Parameter der Anlage zugreifen. Freischaltung und Dokumentation auf Anfrage“

Hört sich sehr interessant an.:slight_smile:

Gruß,
Obi

Ich hab mal ne Anfrage zur Doku abgesendet.
ModBus geht doch mit IPS oder? Oder brauche ich da noch Hardware?

Hallo, zusammen,

gibts schon was Neues bzgl. der MOD-Bus
Anbindung??

lg
my

Ja gibt es… Leider nichts Positives. Hier die Antwort von SolarLog

eine Dokumentation gibt es nicht, insbesondere ist der aufbau so wie wir Ihn verwenden Firmeninterne Informationen die wir nicht herausgeben.

Und auf meine Frage

Wie habe ich dann den Satz „ModbusTCP-Interface integriert. Externe Systeme (SCADA) können nun auf alle Parameter der Anlage zugreifen. Freischaltung und Dokumentation auf Anfrage.“ zu verstehen?

Kam dann

die ModBus Schnittstelle kann nur projektbezogen verwendet werden. Sie ist nicht frei verfügbar.

Hi, hab ein Solarlog 200 in Betrieb. Leider funzt das Skript von sschnake nicht bei mir. IP und ID habe ich angepasst, Skipt läuft auch ohne Fehler allerdings wird nur eine Variable „Gesamt Ertrag“ an und mehr nicht. Die Daten für den Gesamt Ertrag sind 0 KW obwohl die Anlage „produziert“ hat. Kann hier jemand helfen?

Hallo Gemeinde,

nachdem mich nun doch einige Mitglieder angeschrieben und nach der Anbindung gefragt haben, werde ich euch hier das ganze mal vorstellen. Doch erstmal möchte ich mich entschuldigen bei all denen, die schon ewig auf eine Antwort warten. Ich war beruflich durch ein sehr großes Projekt sehr eingespannt, da blieb einfach kaum Zeit fïür Privates. Sorry nochmal!

Also, dann erstmal ein paar Worte vorweg:

Die Anlage, die ich auslese und visualisiere besteht aus 12 Wechselrichtern und einer Sensorbox. Die Sensorbox liefert die Aussentemperatur, die Modultemperatur, die Sonneneinstrahlung und die Windgeschwindigkeit. Alle Komponenten laufen in einem Solarlog 1000 zusammen.

Die Anlage steht ca. 2km von mir weg. Auf meinem IPS-Server läuft ein FTP-Server von Filezilla. Der Solarlog schickt also alle seine Daten nicht mehr an die Solarlog-Webseite, sondern direkt auf den FTP, sodass diese in einem lokalen Verzeichnis auf dem IPS-Server landen.

Da meine Anbindung ziemlich umfassend ist, werde ich das in mehreren Teilen hier dokumentieren. Da das ganze aber schon eine ganze Weile her ist, hoffe ich, dass ich das alles noch so zusammenkriege. Aber wenn irgendwo Probleme auftauchen, meldet euch einfach. Ich habe nun auch wieder mehr Zeit :slight_smile:

Grüße
Grebi

  1. Kategorie anlegen:
    der Name der Kategorie muss genauso lauten, wie er Verzeichnisname auf dem IPS-Server, in dem die Dateien des Solarlog liegen. Wenn also das Verzeichnis C:\FTP\Solarlog\MeineAnlage heisst, dann muss die Kategorie „MeineAnlage“ heissen.

  2. Dummy-Instanz anlegen:
    Innerhalb dieser Kategorie eine Dummy-Instanz mit dem Namen „Global“ anlegen.

  3. Variablen anlegen:
    Innerhalb dieser Dummy-Instanz Variablen anlegen.
    a) String-Variable mit dem Namen „FTP-Pfad“. Hier kommt der komplette FTP-Pfad ohne Solarlog-Verzeichnisname rein! Also, um am obigen Beispiel zu bleiben: „C:\FTP\Solarlog“. Ja, die doppelten Backslashes sind notwendig!

  4. Script anlegen:
    Innerhalb dieser Dummy-Instanz Script mit dem Namen „Funktionen“ anlegen und mit diesem Inhalt:


<?
function checkcreateDummyInstance($intParent, $strName)
{  // Prüfen, ob Instanz bereits vorhanden
   $InstanzVorhanden = @IPS_GetInstanceIDByName($strName, $intParent);
   if ($InstanzVorhanden === false)
   {
    // Instanz erzeugen (Parameter: ModulID)
    $intInst=IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");

    // Erzeugte Instanz öffnen und weitere Werte setzen
    $objInst=IPS_GetInstance($intInst);

    // Allgemeine Parameter
    // Name der Instanz  (aus den Übergabeparametern der Funktionn)
    IPS_SetName($intInst,($strName));
    // Übergeordnete Instanz (aus den Übergabeparametern der Funktionn)
    IPS_SetParent($intInst,$intParent);

    // Änderungen speichern
    IPS_ApplyChanges($intInst);
    return $intInst;
	}
	else
	{
	return $InstanzVorhanden;
	}
}

function CreateVariable ($Name, $Type, $Parent, $Profile, $ValueDefault='') {
   $VariableId = @IPS_GetVariableIDByName($Name, $Parent);
   if ($VariableId === false) {
		$VariableId = IPS_CreateVariable($Type);
		IPS_SetName($VariableId, utf8_decode($Name));
		IPS_SetParent($VariableId, $Parent);
		IPS_SetVariableCustomProfile($VariableId, $Profile);
		SetValue($VariableId, $ValueDefault);
	}
	$VariableData = IPS_GetVariable ($VariableId);
	if ($VariableData['VariableCustomProfile'] <> $Profile) {
		IPS_SetVariableCustomProfile($VariableId, $Profile);
	}
	return $VariableId;
}

function GetFTPPath($Anlagenname){
	return GetValue(33463 /*[Solar-Monitoring\Solarlog\Global\FTP-Pfad]*/)."\\".$Anlagenname;
	}

function GetSolarlogValue($Variablenname,$Variablenlaenge,$Variablentyp,$Dateiname){
	$file = file($Dateiname);
	for ($i=0;$i<count($file);$i++){
      If (substr($file[$i],0,$Variablenlaenge) == $Variablenname)
		{
		$posTrenner = strpos($file[$i],"=");
		If ($Variablentyp == "string")
			{
			$VarTyp = 3;
			$RechtsDavon = substr($file[$i],$posTrenner);
			$posTrennerString = strpos($RechtsDavon,"\"");
			$StringWert = substr($file[$i], $posTrenner+1+$posTrennerString,-3);
         return $StringWert;
			}
		else
			{
			$VarTyp = 1;
			$IntegerWert = ltrim(substr($file[$i], $posTrenner+1));
			return $IntegerWert;
			}
		}
	}
}


function FindVariable ($Name, $Parent) {
   $VariableId = @IPS_GetVariableIDByName($Name, $Parent);
   echo "Name: ".$Name." Parent: ".$Parent."
";
   if ($VariableId === false) {
   return "Variable ".$VariableId." nicht gefunden!";
   }
   else
   {
   return $VariableId;
   }
}
?>

Hier bei der Funktion „function GetFTPPath“ noch die ID anpassen!

So, das war Teil 1 der Vorarbeiten.

So, jetzt kommt das Kernstück der Konfiguration. Mit diesem Script wird die Anlagenkonfiguration des Solarlog ausgelesen und alles automatisch angelegt: Wechselrichter mit allen Strings, Sensorbox(en), Anlageninfos, etc. In diesem Script ist auch noch ein S0-Zähler berücksichtigt, den ich aber nicht angebunden habe!

Vorher noch folgende Variablenprofile anlegen:

  • kWh (Float, 2 Nachkommastellen, Suffix „kWh“)
  • Watt (Float, 2 Nachkommastellen, Suffix „Watt“)
  • Solar_Ampere (Float, 2 Nachkommastellen, Suffix „A“)
  • Solar_kW (Float, 3 Nachkommastellen, Suffix „kW“)
  • mWh (Float, 6 Nachkommastellen, Suffix (MWh")
  • Prozent (Float, 2 Nachkommastellen, Suffix „%“)
  • Solar_Strahlung (Float, 1 Nachkommastelle, Suffix „W/m²“)

Dann dieses Script innerhalb der Kategorie „MeineAnlage“ anlegen und 1x ausführen:


<?
//Kategorie manuell anlegen, Name = Verzeichnisname des FTP-Servers!!!
set_time_limit(600);
include "10351.ips.php"; //Funktionen-Script einbeziehen
//Variablen
$VarArray = array(
1 => "var AnlagenKWP=integer,Anlagenleistung in kWp",
2 => "var SollYearKWP=integer,Sollleistung in kWp",
3 => "var AnzahlWR =integer,Anzahl Geraete",
4 => "var HPTitel=string,Anlagenbezeichnung",
5 => "var HPBetreiber=string,Betreiber",
6 => "var HPEmail=string,Kontakt-EMail-Adresse",
7 => "var HPStandort=string,Standort der Anlage",
8 => "var HPModul=string,Module und Hersteller",
9 => "var HPWR=string,Wechselrichter und Hersteller",
10 => "var HPLeistung=string,Groesse der Anlage",
11 => "var HPInbetrieb=string,Installationsdatum",
12 => "var HPAusricht=string,Modulneigung und Ausrichtung",
13 => "var Verguetung=integer,Verguetung",
14 => "var Serialnr =integer,Seriennummer",
15 => "var Firmware =string,Firmware",
16 => "var FirmwareDate =string,Datum der Firmware",
17 => "var WRTyp =string,Kommunikation der Wechselrichter",
18 => "var OEMTyp =integer,OEM-Typ",
19 => "var SLTyp =string,SL-Typ",
20 => "var SLVer =integer,SL-Version",
21 => "var SLHW =integer,SLHW",
22 => "var SLBV =integer,SLBV",
23 => "var Intervall =integer,Intervall",
24 => "var SLDatum =string,SLDatum",
25 => "var SLUhrzeit =string,SLUhrzeit",
26 => "var CFDatum =string,CFDatum",
27 => "var CFUhrzeit =string,CFUhrzeit"
);
//WRInfo
$VarWRInfoArray = array(
0 => "Typ",
1 => "Adresse",
2 => "Modulleistung in W",
3 => "unbenutzt",
4 => "Bezeichnung",
5 => "Anzahl Strings",
6 => "Stringbezeichnungen",
7 => "Modulfelder",
8 => "Nennleistung",
9 => "Stringleistungen",
10 => "Hersteller",
11 => "Funktion",
12 => "Innentemperaturmessung?",
13 => "Korrekturfaktor",
14 => "Erweiterung"
);

//Hersteller
$VarWRInfoHerstellerArray = array(
1 => "SMA",
2 => "Kaco",
3 => "Sunways",
4 => "Solarmax",
5 => "Fronius",
6 => "Powerlynx/Kyocera",
7 => "Power-One",
8 => "Mitsubishi",
9 => "SOIN",
10 => "Vaillant",
11 => "Solutronic",
17 => "Kostal"
);
// Hauptkategorie ermitteln (ID der Anlage)
$AnlagenID = IPS_GetParent($IPS_SELF);
$Anlagenname = IPS_GetName($AnlagenID);

//Dummy-Instanz Konfigurationsdaten anlegen
$InstIDKonfigurationsdaten = checkcreateDummyInstance($AnlagenID, "Konfigurationsdaten");

//Dummy-Instanzen anlegen
$InstIDBetriebsdaten = checkcreateDummyInstance($AnlagenID, "Betriebsdaten");
$InstIDDaten = checkcreateDummyInstance($InstIDBetriebsdaten, "Daten");
$InstIDMesswerte = checkcreateDummyInstance($InstIDBetriebsdaten, "Messwerte");
$InstIDRechenwerte = checkcreateDummyInstance($InstIDBetriebsdaten, "Rechenwerte");
$InstIDStatus = checkcreateDummyInstance($InstIDBetriebsdaten, "Status");
$InstIDDiagramme = checkcreateDummyInstance($AnlagenID, "Diagramme");
$InstIDScripte = checkcreateDummyInstance($AnlagenID, "Scripte");

//Variablen in Instanz "Daten" anlegen
$VarIDDatenAenderungDays = CreateVariable ("Daten-Aenderung (days.js)", 3, $InstIDDaten, "", "");
$VarIDDatenAenderungMinDay = CreateVariable ("Daten-Aenderung (min_day.js)", 3, $InstIDDaten, "", "");
$VarIDDatenAenderungMonths = CreateVariable ("Daten-Aenderung (months.js)", 3, $InstIDDaten, "", "");
$VarIDDatenAenderungYears = CreateVariable ("Daten-Aenderung (years.js)", 3, $InstIDDaten, "", "");
$VarIDDatenDatumMinDays = CreateVariable ("Daten Datum (min_day.js)", 3, $InstIDDaten, "", "");
$VarIDDatenUhrzeitMinDays = CreateVariable ("Daten Uhrzeit (min_day.js)", 3, $InstIDDaten, "", "");
$VarIDDatenDatumDays = CreateVariable ("Daten Datum (days.js)", 3, $InstIDDaten, "", "");
$VarIDDatenDatumMonths = CreateVariable ("Daten Datum (months.js)", 3, $InstIDDaten, "", "");
$VarIDDatenDatumYears = CreateVariable ("Daten Datum (years.js)", 3, $InstIDDaten, "", "");
$VarIDDatenDatenStatus = CreateVariable ("Datenstatus", 3, $InstIDDaten, "~HTMLBox", "");

//Variablen in Instanz "Messwerte" anlegen
$VarIDPACJahresertragStartwert = CreateVariable ("PAC Jahresertrag Startwert", 2, $InstIDMesswerte, "mWh", 0);
$VarIDPACMonatsertragStartwert = CreateVariable ("PAC Monatsertrag Startwert", 2, $InstIDMesswerte, "kWh", 0);
$VarIDPACTagesertragAktuell = CreateVariable ("PAC Tagesertrag aktuell", 2, $InstIDMesswerte, "kWh", 0);
$VarIDPACTagesertragDavor = CreateVariable ("PAC Tagesertrag davor", 2, $InstIDMesswerte, "kWh", 0);
$VarIDPDCLeistungAktuell = CreateVariable ("PDC Leistung aktuell", 2, $InstIDMesswerte, "kWh", 0);
$VarIDPACLeistungAktuell = CreateVariable ("PAC Leistung aktuell", 2, $InstIDMesswerte, "kWh", 0);
$VarIDPACMonatsertragBisGestern = CreateVariable ("PAC Monatsertrag bis gestern", 2, $InstIDMesswerte, "kWh", 0);
$VarIDPACJahresertragBisGestern = CreateVariable ("PAC Jahresertrag bis gestern", 2, $InstIDMesswerte, "kWh", 0);

//Variablen in Instanz "Rechenwerte" anlegen
$VarIDPACDeltaTagesertrag = CreateVariable ("PAC Delta Tagesertrag", 2, $InstIDRechenwerte, "kWh", 0);
$VarIDPACErtragLaufend = CreateVariable ("PAC Ertrag laufend", 2, $InstIDRechenwerte, "kWh", 0);
$VarIDPACJahresertragAktuell = CreateVariable ("PAC Jahresertrag aktuell", 2, $InstIDRechenwerte, "mWh", 0);
$VarIDPACMonatsertragAktuell = CreateVariable ("PAC Monatsertrag aktuell", 2, $InstIDRechenwerte, "kWh", 0);
$VarIDWirkungsgrad = CreateVariable ("Wirkungsgrad", 2, $InstIDRechenwerte, "Prozent", 0);

//Variablen in Instanz "Status" anlegen
$VarIDStatusDatum = CreateVariable ("Status Datum (min_cur.js)", 3, $InstIDStatus, "","");
$VarIDStatusUhrzeit = CreateVariable ("Status Uhrzeit (min_cur.js)", 3, $InstIDStatus, "","");
$VarIDStatusGeraete = CreateVariable ("Status Geraete", 3, $InstIDStatus, "~HTMLBox","");
$VarIDWirkungsgradeGeraete = CreateVariable ("Wirkungsgrade Geraete", 3, $InstIDStatus, "~HTMLBox","");
$VarIDStatusDatenStatus = CreateVariable ("Datenstatus", 3, $InstIDStatus, "~HTMLBox", "");


// Anlagennamen anlegen
CreateVariable ("Anlage", 3, $InstIDKonfigurationsdaten, "", $Anlagenname);

//Speichert alle Wechselrichter-Instanzen als Array
$GeraeteInstanzen = CreateVariable ("Geraete-Instanzen", 3, $InstIDKonfigurationsdaten, "", "");
SetValue($GeraeteInstanzen,"");

// Datenpfad zum FTP-Verzeichnis anlegen
$Datenpfad = GetValue(CreateVariable ("Datenpfad", 3, $InstIDKonfigurationsdaten, "", GetFTPPath($Anlagenname)));

// Solarlog-Konfigurationsdatei finden
$base_vars_js = $Datenpfad."\\base_vars.js";


// Globale Konfig-Daten einlesen
for ($i=1;$i<count($VarArray);$i++){
	$zeile[$i] = $VarArray[$i];
	$posTrenner = strpos($zeile[$i],"=");
	$Variablenname = substr($zeile[$i],0,$posTrenner+1);
	$Variablenlaenge = strlen($Variablenname);
	$Wert = substr($zeile[$i],$posTrenner+1);
	$WertInhalte = explode(",",$Wert);
	$Datentyp = $WertInhalte[0];

	$WertName = $WertInhalte[1];

	If ($Datentyp == "string")
		{
	      CreateVariable ($WertName, 3, $InstIDKonfigurationsdaten, "", GetSolarlogValue($Variablenname,$Variablenlaenge,$Datentyp,$base_vars_js));
		}
   If ($Datentyp == "integer")
		{
	      CreateVariable ($WertName, 1, $InstIDKonfigurationsdaten, "", GetSolarlogValue($Variablenname,$Variablenlaenge,$Datentyp,$base_vars_js));
		}
}

// Wechselrichter / Geräte als Instanzen anlegen
$AnzahlGeraete = GetValue(IPS_GetVariableIDByName("Anzahl Geraete",$InstIDKonfigurationsdaten));
$neuesi = "";
$interneNummer = "";

for ($i=0;$i<$AnzahlGeraete;$i++){
$Geraetetyp = "";
$x=0;
$Suchmuster = "WRInfo[$i]=new Array";
$inhalt = str_replace("\"","",GetSolarlogValue($Suchmuster,strlen($Suchmuster),"",$base_vars_js));
$LaengeInhalt = strlen($inhalt);
$posLinkeKlammer = strpos($inhalt,"(");
$inhalt2 = substr($inhalt,$posLinkeKlammer+1,$LaengeInhalt-$posLinkeKlammer-4);

$WRDaten[$i] = explode(",",$inhalt2);
	if ($i < 9)
	{
	$neuesi = (string) $i+1;
	$interneNummer = "0".$neuesi;
	}
	else
	{
	$neuesi = (string) $i+1;
	$interneNummer = $neuesi;
	}

	//Gerätetyp ermitteln
   switch (ltrim($WRDaten[$i][11])){ //Gerätetyp
			case 0:
        		$Geraetetyp="Wechselrichter";
        		$WRName = ltrim($WRDaten[$i][4]);
            $DummyID = checkcreateDummyInstance($AnlagenID, $interneNummer." - ".$Geraetetyp.": ".$WRName); //Wechselrichter anlegen
            $VarIDGeraetetyp = CreateVariable ("Geraetetyp", 3, $DummyID, "",$Geraetetyp);
            IPS_SetHidden($VarIDGeraetetyp, true); //Objekt verstecken
				SetValue($GeraeteInstanzen,(GetValue($GeraeteInstanzen).",".$DummyID));
        		$AnzahlStrings = ltrim($WRDaten[$i][5]);
        		If ($AnzahlStrings > 1){
        		   $VarIDAnzahlStrings = CreateVariable ("Anzahl Strings", 1, $DummyID, "",(int)$AnzahlStrings);
        		   IPS_SetHidden($VarIDAnzahlStrings, true); //Objekt verstecken
					//Namen
					$SuchmusterWR = "WRInfo[$i][6]=new Array";
					$inhaltWR = str_replace("\"","",GetSolarlogValue($SuchmusterWR,strlen($SuchmusterWR),"",$base_vars_js));
					$LaengeInhaltWR = strlen($inhaltWR);
					$posLinkeKlammerWR = strpos($inhaltWR,"(");
					$inhalt2WR = substr($inhaltWR,$posLinkeKlammerWR+1,$LaengeInhaltWR-$posLinkeKlammerWR-4);
					$StringDatenWR[$i] = explode(",",$inhalt2WR);

					for ($z=0;$z<$AnzahlStrings;$z++){
						$interneNummerStrings = $z+1;
						$DummyIDString = checkcreateDummyInstance($DummyID, "String ".$interneNummerStrings);
						CreateVariable ("Bezeichnung", 3, $DummyIDString, "",$StringDatenWR[$i][$z]);
            		//Modulleistungen
						$SuchmusterWR2 = "WRInfo[$i][9]=new Array";
						$inhaltWR2 = str_replace("\"","",GetSolarlogValue($SuchmusterWR2,strlen($SuchmusterWR2),"",$base_vars_js));
						$LaengeInhaltWR2 = strlen($inhaltWR2);
						$posLinkeKlammerWR2 = strpos($inhaltWR2,"(");
						$inhalt2WR2 = substr($inhaltWR2,$posLinkeKlammerWR2+1,$LaengeInhaltWR2-$posLinkeKlammerWR2-4);
						$StringDatenWR2[$i] = explode(",",$inhalt2WR2);
						CreateVariable ("angeschlossene Modulleistung", 2, $DummyIDString, "Watt", (float)$StringDatenWR2[$i][$z]);
						CreateVariable ("PDC", 2, $DummyIDString, "Watt",0);
						CreateVariable ("UDC", 2, $DummyIDString, "~Volt",0);
						CreateVariable ("ADC", 2, $DummyIDString, "Solar_Ampere",0);
					}
            } // Strings Ende
					else
					{
					CreateVariable ("Anzahl Strings", 1, $DummyID, "",1);
					CreateVariable ("angeschlossene Modulleistung", 2, $DummyID, "Watt", $WRDaten[$i][8]);
					CreateVariable ("PDC", 2, $DummyID, "Watt",0);
					CreateVariable ("UDC", 2, $DummyID, "~Volt",0);
					CreateVariable ("ADC", 2, $DummyID, "Solar_Ampere",0);

					}

            $VarIDMitTemperaturmessung = CreateVariable ("Mit Temperaturmessung", 3, $DummyID, "","Nein");
				// restliche Angaben
				$Infobox = CreateVariable ("Infos", 3, $DummyID, "~HTMLBox", "");
				$Info = "";
				for ($x=0;$x<15;$x++){
			   	$InfoWert = ltrim((string)$WRDaten[$i][$x]);
			   	If ($InfoWert == "null"){$InfoWert = "nicht angegeben";}
			   	If ($x==12 and $InfoWert == 0){$InfoWert = "Nein";}
			   	If ($x==12 and $InfoWert == 1){
						$InfoWert = "Ja";
						SetValue($VarIDMitTemperaturmessung,"Ja");
					}
               If ($x==10){$InfoWert = $VarWRInfoHerstellerArray[$InfoWert];}
               If ($x==6 and $AnzahlStrings>1){$InfoWert = "siehe Strings";}
               If ($x==9 and $AnzahlStrings>1){$InfoWert = "siehe Strings";}
					If ($x==11 or $x==14 or $x==3){}
			   	else{
			   		$Info .= $VarWRInfoArray[$x].": ".$InfoWert."<br>";
			   	}
				}
				SetValue($Infobox,$Info);
            CreateVariable ("Tagesertrag", 2, $DummyID, "kWh",0);
            CreateVariable ("PAC aktuell", 2, $DummyID, "Watt",0);
            CreateVariable ("PAC Tagesertrag", 2, $DummyID, "kWh",0);
            CreateVariable ("PAC Max des Tages", 2, $DummyID, "Solar_kW",0);
            CreateVariable ("PAC Monatsertrag", 2, $DummyID, "kWh",0);
            CreateVariable ("PAC Jahresertrag", 2, $DummyID, "mWh",0);
            CreateVariable ("Wirkungsgrad", 2, $DummyID, "Prozent",0);
            CreateVariable ("Status", 3, $DummyID, "","");
            CreateVariable ("Fehler", 3, $DummyID, "","");
            CreateVariable ("PDC aktuell", 2, $DummyID, "Watt",0);
            CreateVariable ("angeschlossene Modulleistung", 2, $DummyID, "Watt", $WRDaten[$i][2]);
            CreateVariable ("Innentemperatur", 2, $DummyID, "~Temperature",0);

				//Statuscodes in String schreiben
				$SuchmusterWRStatus = "StatusCodes[$i] = ";
				$inhaltWRStatus = str_replace("\"","",GetSolarlogValue($SuchmusterWRStatus,strlen($SuchmusterWRStatus),"",$base_vars_js));
				$StatusCodes = CreateVariable ("StatusCodes", 3, $DummyID, "", $inhaltWRStatus);
				IPS_SetHidden($StatusCodes, true); //Objekt verstecken
				//Statuscodes Ende
            //Fehlercodes in String schreiben
				$SuchmusterWRFehler = "FehlerCodes[$i] = ";
				$inhaltWRFehler = str_replace("\"","",GetSolarlogValue($SuchmusterWRFehler,strlen($SuchmusterWRFehler),"",$base_vars_js));
				$FehlerCodes = CreateVariable ("FehlerCodes", 3, $DummyID, "", $inhaltWRFehler);
				IPS_SetHidden($FehlerCodes, true); //Objekt verstecken
				//Fehlercodes Ende
        		break;
    		case 1:
        		$Geraetetyp="Sensorbox";
        		$SBName = ltrim($WRDaten[$i][4]);
            $DummyID = checkcreateDummyInstance($AnlagenID, $interneNummer." - ".$Geraetetyp.": ".$SBName); //Sensorbox anlegen
            CreateVariable ("Geraetetyp", 3, $DummyID, "",$Geraetetyp);
            SetValue($GeraeteInstanzen,(GetValue($GeraeteInstanzen).",".$DummyID));
            CreateVariable ("Einstrahlung", 2, $DummyID, "Solar_Strahlung", 0);
            CreateVariable ("Modultemperatur", 2, $DummyID, "~Temperature", 0);
            CreateVariable ("Aussentemperatur", 2, $DummyID, "~Temperature", 0);
            CreateVariable ("Windgeschwindigkeit", 2, $DummyID, "~WindSpeed.ms", 0);
            CreateVariable ("Status", 3, $DummyID, "","");
            CreateVariable ("Fehler", 3, $DummyID, "","");

        		//Sensorwerte ermitteln: ltrim($WRDaten[$i][14])
        		//1: Einstarhlung
        		//2: Modultemperatur
        		//3: Aussentemperatur
        		//4: Windmesser
            //Statuscodes in String schreiben
				$SuchmusterWRStatus = "StatusCodes[$i] = ";
				$inhaltWRStatus = str_replace("\"","",GetSolarlogValue($SuchmusterWRStatus,strlen($SuchmusterWRStatus),"",$base_vars_js));
				$StatusCodes = CreateVariable ("StatusCodes", 3, $DummyID, "", $inhaltWRStatus);
				//Statuscodes Ende
            //Fehlercodes in String schreiben
				$SuchmusterWRFehler = "FehlerCodes[$i] = ";
				$inhaltWRFehler = str_replace("\"","",GetSolarlogValue($SuchmusterWRFehler,strlen($SuchmusterWRFehler),"",$base_vars_js));
				$FehlerCodes = CreateVariable ("FehlerCodes", 3, $DummyID, "", $inhaltWRFehler);
				//Fehlercodes Ende
        		break;
    		case 2:
        		$Geraetetyp="S0-Stromzähler";
        		//zählt was?: ltrim($WRDaten[$i][14])
        		break;
				}
}
?>

Falls es zu Fehlern kommt, bitte nochmal Variablenprofile checken!

Jetzt sollte eure Anlage komplett mit allen Infos angelegt worden sein.

Im nächsten Teil geht es um das Auslesen der Daten…

Nachdem eure Anlage nun (foffentlich…) sauber und komplett angelegt wurde, geht es an das eigentliche Auslesen der Daten.

Zum einen werden die Daten ausgelesen, also Erträge, Leistungen etc., zum anderen (seperat) der Status bzw. Fehlercodes der angeschlossenen Geräte. Diese Scripte lasse ich alle 10min laufen. Den Start und Stop des Auslesens steuere ich über den Astrotimer, der auch hier im Forum zu finden ist. Somit starte ich das Auslesen immer 10min vor Sonnenaufgang und beende es 30min nach Sonnenuntergang (Nachts muss es ja nicht laufen ;)).

Ausserdem habe ich hier noch eine EMail-Benachrichtigung eingebaut (ID der SMTP-Instanz anpassen!). Ihr bekommt also automatisch eine EMail, wenn mit einem eurer Wechselrichter etwas nicht stimmt.

Zuerst lesen wir also den Status der Anlage aus. Hierfür folgendes Script innerhalb der zuvor automatisch angelegten Dummy-Instanz „Scripte“ anlegen:


<?
include "10351.ips.php"; //Funktionen-Script einbeziehen
$SuchArray = array(
1 => "var Datum=",
2 => "var Uhrzeit=",
3 => "var Pac="
);
$VarSMTPInstanz = 19701 /*[Kommunikation\E-Mail senden (SMTP)]*/;
// Hauptkategorie ermitteln (ID der Anlage)
$ScripteInstanz = IPS_GetParent($IPS_SELF);
$AnlagenID = IPS_GetParent($ScripteInstanz);
$Betriebsdateninstanz = IPS_GetInstanceIDByName("Betriebsdaten", $AnlagenID);
$Statusinstanz = IPS_GetInstanceIDByName("Status", $Betriebsdateninstanz);

$VarDatumStatus = IPS_GetVariableIDByName("Status Datum (min_cur.js)", $Statusinstanz);
$VarUhrzeitStatus = IPS_GetVariableIDByName("Status Uhrzeit (min_cur.js)", $Statusinstanz);
$VarStatusGeraete = IPS_GetVariableIDByName("Status Geraete", $Statusinstanz);
$VarWirkungsgradeGeraete = IPS_GetVariableIDByName("Wirkungsgrade Geraete", $Statusinstanz);
$VarIDStatusDatenStatus = IPS_GetVariableIDByName("Datenstatus", $Statusinstanz);

$Konfigurationsinstanz = IPS_GetInstanceIDByName("Konfigurationsdaten", $AnlagenID);
$AnzahlGeraete = GetValue(IPS_GetVariableIDByName("Anzahl Geraete", $Konfigurationsinstanz));
$Datenpfad = IPS_GetVariableIDByName("Datenpfad", $Konfigurationsinstanz);

// Solarlog-Statusdatei finden
$min_cur_js = GetValue($Datenpfad)."\\min_cur.js";

$InhaltDatumStatus = str_replace("\"","",GetSolarlogValue($SuchArray[1],strlen($SuchArray[1]),"",$min_cur_js));
SetValue($VarDatumStatus,$InhaltDatumStatus);

$InhaltUhrzeitStatus = str_replace("\"","",GetSolarlogValue($SuchArray[2],strlen($SuchArray[2]),"",$min_cur_js));
if ($InhaltUhrzeitStatus != GetValue($VarUhrzeitStatus)){
	SetValue($VarUhrzeitStatus,$InhaltUhrzeitStatus);
	SetValue($VarIDStatusDatenStatus,"Status lesen und verarbeiten...");
	$InhaltPAC = GetSolarlogValue($SuchArray[3],strlen($SuchArray[3]),"",$min_cur_js);

	$StatusFehler = 0;
	$neuesi = "";
	$interneNummer = "";
	$GeraeteInstanzen = GetValue(IPS_GetVariableIDByName("Geraete-Instanzen", $Konfigurationsinstanz));
	$GeraeteIDs = explode(",",$GeraeteInstanzen);
	$StatusKomplett = $VarStatusGeraete;
	SetValue($StatusKomplett,"");
	$StatusInhaltAktuell = "";
	$StatusInhaltAktuellPlain = "";
	$WirkungsgradeInhalt = "";

	for ($i=0;$i<$AnzahlGeraete;$i++){
   	$Geraet = $GeraeteIDs[$i+1];

		//Status
		$curStatusCode[$i] = (int)GetSolarlogValue("curStatusCode[$i]=",strlen("curStatusCode[$i]="),"",$min_cur_js);
		$StatusCodes = GetValue(IPS_GetVariableIDByName("StatusCodes", (int)$Geraet));
		If ($curStatusCode[$i]==255){$curStatusCode[$i]=0;}
		$Statusse = explode(",",$StatusCodes);
		$Status = $Statusse[$curStatusCode[$i]];
		SetValue(IPS_GetVariableIDByName("Status", (int)$Geraet),$Status);

		//Fehler
		$curFehlerCode[$i] = (int)GetSolarlogValue("curFehlerCode[$i]=",strlen("curFehlerCode[$i]="),"",$min_cur_js);
		$FehlerCodes = GetValue(IPS_GetVariableIDByName("FehlerCodes", (int)$Geraet));
		If ($curFehlerCode[$i]==0){$curStatusCode[$i]="---";}
		$Fehlers = explode(",",$FehlerCodes);
		$Fehler = $Fehlers[$curFehlerCode[$i]];
		$FehlerPlain = $Fehlers[$curFehlerCode[$i]];
		$Fehler = str_replace("---","--",$Fehler);
		If ($Fehler==" " or $Fehler=="--"){
			$Fehler ="kein Fehler ⇒ <font color=\"#008000\"><strong>OK</strong></font>";
			$FehlerPlain ="kein Fehler => OK";
			}
		else
			{
			$Fehler = "<font color=\"#FF0000\"><strong>ACHTUNG ⇒ ".$Fehler." !!!</strong></font>";
			$FehlerPlain = "ACHTUNG => ".$FehlerPlain." !!!";
			$StatusFehler = 1;
			}

		SetValue(IPS_GetVariableIDByName("Fehler", (int)$Geraet),$Fehler);

		$StatusInhaltAktuell .= IPS_GetName((int)$Geraet)." ⇒ ";
		$StatusInhaltAktuell .= "Status: ".$Status." / ";
		$StatusInhaltAktuell .= $Fehler."<br>";

		$StatusInhaltAktuellPlain .= IPS_GetName((int)$Geraet)." => ";
		$StatusInhaltAktuellPlain .= "Status: ".$Status." / ";
		$StatusInhaltAktuellPlain .= $FehlerPlain."
";

		//Wirkungsgrade
		$Geraetetyp = GetValue(IPS_GetVariableIDByName("Geraetetyp", (int)$Geraet));

		If ($Geraetetyp == "Wechselrichter")
		{
		   $Wirkungsgrad = GetValue(IPS_GetVariableIDByName("Wirkungsgrad", (int)$Geraet));
			$Wirkungsgrad = number_format($Wirkungsgrad, 2, ',', '.');
			$PDC = GetValue(IPS_GetVariableIDByName("PDC aktuell", (int)$Geraet));
			$PDC = number_format($PDC, 2, ',', '.');
			$PAC = GetValue(IPS_GetVariableIDByName("PAC aktuell", (int)$Geraet));
			$PAC = number_format($PAC, 2, ',', '.');
			echo "Wirkungsgrad: ".$Wirkungsgrad."
";
			$WirkungsgradeInhalt .= IPS_GetName((int)$Geraet)." ⇒ ";
         $WirkungsgradeInhalt .= "PAC: ".$PAC." W / ";
         $WirkungsgradeInhalt .= "PDC: ".$PDC." W ";
         $WirkungsgradeInhalt .= " ⇒ ";
			$WirkungsgradeInhalt .= $Wirkungsgrad." %<br>";
			echo $WirkungsgradeInhalt;
		}
		SetValue($VarWirkungsgradeGeraete,$WirkungsgradeInhalt);

	} // Ende For
	echo $StatusInhaltAktuellPlain;
	SetValue($StatusKomplett,$StatusInhaltAktuell);
   SetValue($VarIDStatusDatenStatus,"Warten auf nächste Statusänderung...");
	If ($StatusFehler == 1){
		SMTP_SendMail($VarSMTPInstanz, "Alarm! - Fehler Solaranlage!", $StatusInhaltAktuellPlain);
		}
}

?>

Da wir ja den Solarlog mit all seinen Daten auslesen wollen, müssen wir noch folgende 3 Scripte innerhalb der Dummy-Instanz „Scripte“ anlegen. Diese Scripte werden später automatisch ausgeführt, wenn die Daten ausgelesen werden.

  • Script „Tageswerte“

<?
include "10351.ips.php"; //Funktionen-Script einbeziehen

$Tagesertrag = 0;

// Hauptkategorie ermitteln (ID der Anlage)
$ScripteInstanz = IPS_GetParent($IPS_SELF);
$AnlagenID = IPS_GetParent($ScripteInstanz);
$Betriebsdateninstanz = IPS_GetInstanceIDByName("Betriebsdaten", $AnlagenID);
$Messwerteinstanz = IPS_GetInstanceIDByName("Messwerte", $Betriebsdateninstanz); //Neu
$Rechenwerteinstanz = IPS_GetInstanceIDByName("Rechenwerte", $Betriebsdateninstanz); //Neu
$Statusinstanz = IPS_GetInstanceIDByName("Status", $Betriebsdateninstanz);
$Dateninstanz = IPS_GetInstanceIDByName("Daten", $Betriebsdateninstanz);
$Konfigurationsinstanz = IPS_GetInstanceIDByName("Konfigurationsdaten", $AnlagenID);
$GeraeteInstanzen = GetValue(IPS_GetVariableIDByName("Geraete-Instanzen", $Konfigurationsinstanz));
//Ende

//Variablen ermitteln
$VarIDTagesErtragAktuell = IPS_GetVariableIDByName("PAC Tagesertrag aktuell", $Messwerteinstanz); //Neu
$VarIDTagesErtragDavor = IPS_GetVariableIDByName("PAC Tagesertrag davor", $Messwerteinstanz); //Neu
$VarIDDeltaTagesErtrag = IPS_GetVariableIDByName("PAC Delta Tagesertrag", $Rechenwerteinstanz); //Neu
$VarDatumDatenTag = IPS_GetVariableIDByName("Daten Datum (days.js)", $Dateninstanz);
$VarIDDatenAenderung = IPS_GetVariableIDByName("Daten-Aenderung (days.js)", $Dateninstanz);
//Ende

//Werte ermitteln
$AnzahlGeraete = GetValue(IPS_GetVariableIDByName("Anzahl Geraete", $Konfigurationsinstanz));
$Datenpfad = IPS_GetVariableIDByName("Datenpfad", $Konfigurationsinstanz);
//Ende

//Werte setzen
$TagesertragProWR = 0;
$PACMaxProWR = 0;
$PACTagesertragAktuell = 0; //Neu
$PACaktuellGesamtLaufend = 0;
$DeltaTagesertragAktuell = 0;

// Solarlog-Datendatei finden
$days_js = GetValue($Datenpfad)."\\days.js";

$LetzteAenderungAktuell = date('r',filemtime($days_js)); //letzte Datei-Änderung
echo "Letzte Änderung aktuell: ".$LetzteAenderungAktuell."
";
$LetzteAenderung = GetValue($VarIDDatenAenderung); //letzte Datei-Änderung davor
echo "Letzte Änderung davor: ".$LetzteAenderung."
";

If ($LetzteAenderungAktuell != $LetzteAenderung){ //wenn Datei aktueller als die letzte, dann Werte ermitteln
	SetValue($VarIDDatenAenderung,$LetzteAenderungAktuell); //Datei-Änderungszeit aktualisieren

	$fp1 = fopen($days_js, "r");
	$daten = fgets($fp1);
	$zeilen = explode("\r", $daten);
	echo $daten."
";

	$datensaetze = explode("|", $zeilen[0]);
	$datensaetzecount=count($datensaetze);

	// Zeitstempel in der Datei ermitteln
	$ZeitDatensatz = substr($datensaetze[0],10);
	echo "Daten von: ".$ZeitDatensatz."

";
	$ZeitstempelDatum = $ZeitDatensatz;//$ZeitstempelWerte[0];
   
	SetValue($VarDatumDatenTag,$ZeitstempelDatum); //Zeitstempel der Daten aktualisieren

	$GeraeteIDs = explode(",",$GeraeteInstanzen);

	for ($i=1;$i<=$AnzahlGeraete;$i++){
	$werte = explode(";", $datensaetze[$i]);
	$wertecount=count($werte);
	$GeraetID = $GeraeteIDs[$i];
	$Geraetetyp = GetValue(IPS_GetVariableIDByName("Geraetetyp", (int)$GeraetID));

	if ($Geraetetyp == "Wechselrichter"){

		//Tagesertrag pro WR setzen
		$VarIDPAC_Tagesertrag = IPS_GetVariableIDByName("PAC Tagesertrag", (int)$GeraetID);
		$TagesertragProWR = ($werte[0]/1000);
		SetValue($VarIDPAC_Tagesertrag, $TagesertragProWR);
      $PACTagesertragAktuell = $PACTagesertragAktuell + $TagesertragProWR;

		$Tagesertrag = $Tagesertrag + (GetValue($VarIDPAC_Tagesertrag)); //Tagesertrag aufsummieren
      $PACaktuellGesamtLaufend = $PACaktuellGesamtLaufend + (GetValue($VarIDPAC_Tagesertrag));
      
      //PAC Max pro WR setzen
		$VarIDPAC_Max_DesTages = IPS_GetVariableIDByName("PAC Max des Tages", (int)$GeraetID);
      $PACMaxProWR = ($werte[1]/1000);
		SetValue($VarIDPAC_Max_DesTages, $PACMaxProWR);
		}//Ende Wechselrichter
	}//Ende For-Schleife

	//Delta Tagesertrag
   $Vorwert = GetValue($VarIDTagesErtragAktuell); //Neu
   SetValue($VarIDTagesErtragDavor,$Vorwert);
   SetValue($VarIDTagesErtragAktuell,$PACTagesertragAktuell);
	$PACTagesertragAktuell = GetValue($VarIDTagesErtragAktuell);
	$PACTagesertragDavor = GetValue($VarIDTagesErtragDavor);
	$DeltaTagesertragAktuell = $PACTagesertragAktuell - $PACTagesertragDavor;
	If ($DeltaTagesertragAktuell >= 0)
	{
		SetValue($VarIDDeltaTagesErtrag,$DeltaTagesertragAktuell);
	}
	
	echo "Tageswerte aktualisiert!
";
	echo "Tagesertrag Gesamt: ".$Tagesertrag." kWh
";
	fclose($fp1);
}
else
{
echo "Tageswerte NICHT aktualisiert!";
}
?>

  • Script „Monatswerte“

<?
include "10351.ips.php"; //Funktionen-Script einbeziehen

$Monatsertrag = 0;

// Hauptkategorie ermitteln (ID der Anlage)

$ScripteInstanz = IPS_GetParent($IPS_SELF);
$AnlagenID = IPS_GetParent($ScripteInstanz);
$Betriebsdateninstanz = IPS_GetInstanceIDByName("Betriebsdaten", $AnlagenID);
$Messwerteinstanz = IPS_GetInstanceIDByName("Messwerte", $Betriebsdateninstanz);
$VarIDPACMonatsertragStartwert = IPS_GetVariableIDByName("PAC Monatsertrag Startwert", $Messwerteinstanz);

$Statusinstanz = IPS_GetInstanceIDByName("Status", $Betriebsdateninstanz);
$Dateninstanz = IPS_GetInstanceIDByName("Daten", $Betriebsdateninstanz);

$Konfigurationsinstanz = IPS_GetInstanceIDByName("Konfigurationsdaten", $AnlagenID);
$AnzahlGeraete = GetValue(IPS_GetVariableIDByName("Anzahl Geraete", $Konfigurationsinstanz));
$Datenpfad = IPS_GetVariableIDByName("Datenpfad", $Konfigurationsinstanz);

$VarDatumDatenMonat = IPS_GetVariableIDByName("Daten Datum (months.js)", $Dateninstanz);
$VarIDDatenAenderung = IPS_GetVariableIDByName("Daten-Aenderung (months.js)", $Dateninstanz);

// Solarlog-Datendatei finden
$months_js = GetValue($Datenpfad)."\\months.js";

$LetzteAenderungAktuell = date('r',filemtime($months_js)); //letzte Datei-Änderung
echo "Letzte Änderung aktuell: ".$LetzteAenderungAktuell."
";
$LetzteAenderung = GetValue($VarIDDatenAenderung); //letzte Datei-Änderung davor
echo "Letzte Änderung davor: ".$LetzteAenderung."
";

If ($LetzteAenderungAktuell != $LetzteAenderung){ //wenn Datei aktueller als die letzte, dann Werte ermitteln
	SetValue($VarIDDatenAenderung,$LetzteAenderungAktuell); //Datei-Änderungszeit aktualisieren

	$zeilen = file($months_js);
	$zeilencount=count($zeilen);
	echo "Zeilenanzahl: ".	$zeilencount."
";

   $daten = $zeilen[0];
	$datensaetze = explode("|", $zeilen[0]);
	echo "Daten: ".$daten."
";

	$datensaetzecount=count($datensaetze);

	// Zeitstempel in der Datei ermitteln
	$ZeitDatensatz = substr($datensaetze[0],10);
	echo "Daten von: ".$ZeitDatensatz."

";
	$ZeitstempelDatum = $ZeitDatensatz;

	SetValue($VarDatumDatenMonat,$ZeitstempelDatum); //Zeitstempel der Daten aktualisieren

   $GeraeteInstanzen = GetValue(IPS_GetVariableIDByName("Geraete-Instanzen", $Konfigurationsinstanz));
	$GeraeteIDs = explode(",",$GeraeteInstanzen);

		for ($i=1;$i<=$AnzahlGeraete;$i++){
			$werte = explode(";", $datensaetze[$i]);
			$wertecount=count($werte);
			$GeraetID = $GeraeteIDs[$i];
			$Geraetetyp = GetValue(IPS_GetVariableIDByName("Geraetetyp", (int)$GeraetID));

			if ($Geraetetyp == "Wechselrichter"){

				$VarIDPAC_Monat = IPS_GetVariableIDByName("PAC Monatsertrag", (int)$GeraetID);
      		SetValue($VarIDPAC_Monat, ($werte[0]/1000));
      		$Monatsertrag = $Monatsertrag + ($werte[0]/1000);
			}//Ende Wechselrichter
		}//Ende For-Schleife
		echo "Monatswerte aktualisiert!
";
		echo "Monatsertrag Gesamt: ".$Monatsertrag." kWh
";
		SetValue($VarIDPACMonatsertragStartwert,$Monatsertrag);
}//Ende Datei-Änderung
else
{
echo "Monatswerte NICHT aktualisiert!";
}

?>

  • Script „Jahreswerte“

<?
include "10351.ips.php"; //Funktionen-Script einbeziehen

$Jahresertrag = 0;

// Hauptkategorie ermitteln (ID der Anlage)
$ScripteInstanz = IPS_GetParent($IPS_SELF);
$AnlagenID = IPS_GetParent($ScripteInstanz);
$Betriebsdateninstanz = IPS_GetInstanceIDByName("Betriebsdaten", $AnlagenID);
$Messwerteinstanz = IPS_GetInstanceIDByName("Messwerte", $Betriebsdateninstanz);
$VarIDPACJahresertragStartwert = IPS_GetVariableIDByName("PAC Jahresertrag Startwert", $Messwerteinstanz);

$Statusinstanz = IPS_GetInstanceIDByName("Status", $Betriebsdateninstanz);
$Dateninstanz = IPS_GetInstanceIDByName("Daten", $Betriebsdateninstanz);

$Konfigurationsinstanz = IPS_GetInstanceIDByName("Konfigurationsdaten", $AnlagenID);
$AnzahlGeraete = GetValue(IPS_GetVariableIDByName("Anzahl Geraete", $Konfigurationsinstanz));
$Datenpfad = IPS_GetVariableIDByName("Datenpfad", $Konfigurationsinstanz);

$VarDatumDatenJahr = IPS_GetVariableIDByName("Daten Datum (years.js)", $Dateninstanz);
$VarIDDatenAenderung = IPS_GetVariableIDByName("Daten-Aenderung (years.js)", $Dateninstanz);


// Solarlog-Datendatei finden
$years_js = GetValue($Datenpfad)."\\years.js";

$LetzteAenderungAktuell = date('r',filemtime($years_js)); //letzte Datei-Änderung
echo "Letzte Änderung aktuell: ".$LetzteAenderungAktuell."
";
$LetzteAenderung = GetValue($VarIDDatenAenderung); //letzte Datei-Änderung davor
echo "Letzte Änderung davor: ".$LetzteAenderung."
";

If ($LetzteAenderungAktuell != $LetzteAenderung){ //wenn Datei aktueller als die letzte, dann Werte ermitteln
	SetValue($VarIDDatenAenderung,$LetzteAenderungAktuell); //Datei-Änderungszeit aktualisieren

   $zeilen = file($years_js);
	$zeilencount=count($zeilen);
	echo "Zeilenanzahl: ".	$zeilencount."
";

   $daten = $zeilen[0];
   $datensaetze = explode("|", $zeilen[0]);
	echo $daten."
";
	$datensaetzecount=count($datensaetze);

	// Zeitstempel in der Datei ermitteln
	$ZeitDatensatz = substr($datensaetze[0],10);
	echo "Daten von: ".$ZeitDatensatz."

";
	$ZeitstempelDatum = $ZeitDatensatz;//$ZeitstempelWerte[0];
	
	SetValue($VarDatumDatenJahr,$ZeitstempelDatum); //Zeitstempel der Daten aktualisieren

   $GeraeteInstanzen = GetValue(IPS_GetVariableIDByName("Geraete-Instanzen", $Konfigurationsinstanz));
	$GeraeteIDs = explode(",",$GeraeteInstanzen);

	for ($i=1;$i<=$AnzahlGeraete;$i++){
		$werte = explode(";", $datensaetze[$i]);
		$wertecount=count($werte);
		$GeraetID = $GeraeteIDs[$i];
		$Geraetetyp = GetValue(IPS_GetVariableIDByName("Geraetetyp", (int)$GeraetID));

		if ($Geraetetyp == "Wechselrichter"){
			$VarIDPAC_Jahr = IPS_GetVariableIDByName("PAC Jahresertrag", (int)$GeraetID);
      	SetValue($VarIDPAC_Jahr, ($werte[0]/1000/1000));
      	$Jahresertrag = $Jahresertrag + ($werte[0]/1000/1000);
		}//Ende Wechselrichter
	}//Ende For-Schleife
	echo "Jahreswerte aktualisiert!
";
	echo "Jahresertrag Gesamt: ".$Jahresertrag." MWh
";
   SetValue($VarIDPACJahresertragStartwert,$Jahresertrag);
}//Ende Datei-Änderung
else
{
echo "Jahreswerte NICHT aktualisiert!";
}
?>

Nun noch ein Script, um die Variablen für die Erträge zu aktualisieren. Dieses wiederum innerhalb der Instanz „Scripte“ anlegen:


<?

IPS_Sleep(15000);
// Hauptkategorie ermitteln (ID der Anlage)
$ScripteInstanz = IPS_GetParent($IPS_SELF);
$AnlagenID = IPS_GetParent($ScripteInstanz);
$Betriebsdateninstanz = IPS_GetInstanceIDByName("Betriebsdaten", $AnlagenID);
$Messwerteinstanz = IPS_GetInstanceIDByName("Messwerte", $Betriebsdateninstanz); //Neu
$Rechenwerteinstanz = IPS_GetInstanceIDByName("Rechenwerte", $Betriebsdateninstanz); //Neu
$Statusinstanz = IPS_GetInstanceIDByName("Status", $Betriebsdateninstanz);
$Dateninstanz = IPS_GetInstanceIDByName("Daten", $Betriebsdateninstanz);
//Ende

//Variablen ermitteln
$VarIDPACTagesertragAktuell = IPS_GetVariableIDByName("PAC Tagesertrag aktuell", $Messwerteinstanz);//Neu
$VarIDMonatsertragAktuell = IPS_GetVariableIDByName("PAC Monatsertrag aktuell", $Rechenwerteinstanz);//Neu
$VarIDJahresertragAktuell = IPS_GetVariableIDByName("PAC Jahresertrag aktuell", $Rechenwerteinstanz);//Neu
$VarIDPACDeltaTagesertrag = IPS_GetVariableIDByName("PAC Delta Tagesertrag", $Rechenwerteinstanz);//Neu
$VarIDPACErtragLaufend = IPS_GetVariableIDByName("PAC Ertrag laufend", $Rechenwerteinstanz);//Neu
$VarIDPACMonatsertragStartwert = IPS_GetVariableIDByName("PAC Monatsertrag Startwert", $Messwerteinstanz);
$VarIDPACJahresertragStartwert = IPS_GetVariableIDByName("PAC Jahresertrag Startwert", $Messwerteinstanz);
$VarIDDatenDatenStatus = IPS_GetVariableIDByName("Datenstatus", $Dateninstanz);
//Ende

//$DeltaTagesertrag
$PACDeltaTagesertrag = GetValue($VarIDPACDeltaTagesertrag);
$PACTagesertragAktuell = GetValue($VarIDPACTagesertragAktuell);

//Monatsertrag
$PACMonatsertragStartwert = GetValue($VarIDPACMonatsertragStartwert);
$PACMonatsertragAktuell = $PACMonatsertragStartwert + $PACTagesertragAktuell;
SetValue($VarIDMonatsertragAktuell,$PACMonatsertragAktuell);

//Jahresertrag
$PACJahreertragStartwert = GetValue($VarIDPACJahresertragStartwert);
$PACJahresertragAktuell = $PACJahreertragStartwert + ($PACTagesertragAktuell/1000);
SetValue($VarIDJahresertragAktuell,$PACJahresertragAktuell);

//Ertrag laufend
$PACErtragLaufend = GetValue($VarIDPACErtragLaufend);
$PACErtragLaufendNeu = $PACErtragLaufend + ($PACDeltaTagesertrag);
SetValue($VarIDPACErtragLaufend,$PACErtragLaufendNeu);

//Datenstatus zurücksetzen
SetValue($VarIDDatenDatenStatus,"Warten auf nächste Datenänderung...");

?>

Nun brauchen wir noch ein letztes Script, um die laufenden Daten, die der Solarlog alle 10min sendet, auszulesen.

Am Ende des Scriptes werden die anderen, zuvor erstellten Scripte für die Erträge aufgerufen. Ich habe auch noch Diagramme über Highcharts angebunden, die dann ebenso automatisch aktualisiert werden. Aber ich denke, die kann sich jeder selbst bauen…


<?
include "10351.ips.php"; //Funktionen-Script einbeziehen

$WertePositionen[0] = array("PDC1" => 1, "Tagesertrag" =>2, "UDC1" => 3);
$WertePositionen[2] = array("PDC1" => 1, "PDC2" => 2, "Tagesertrag" =>3, "UDC1" => 4, "UDC2" => 5);
$WertePositionen[3] = array("PDC1" => 1, "PDC2" => 2, "PDC3" => 3, "Tagesertrag" =>4, "UDC1" => 5, "UDC2" => 6, "UDC3" => 7);

// Hauptkategorie ermitteln (ID der Anlage)
$ScripteInstanz = IPS_GetParent($IPS_SELF);
$AnlagenID = IPS_GetParent($ScripteInstanz);
$Betriebsdateninstanz = IPS_GetInstanceIDByName("Betriebsdaten", $AnlagenID);
$Messwerteinstanz = IPS_GetInstanceIDByName("Messwerte", $Betriebsdateninstanz);
$Rechenwerteinstanz = IPS_GetInstanceIDByName("Rechenwerte", $Betriebsdateninstanz);
$Statusinstanz = IPS_GetInstanceIDByName("Status", $Betriebsdateninstanz);
$Dateninstanz = IPS_GetInstanceIDByName("Daten", $Betriebsdateninstanz);
$Konfigurationsinstanz = IPS_GetInstanceIDByName("Konfigurationsdaten", $AnlagenID);
$GeraeteInstanzen = GetValue(IPS_GetVariableIDByName("Geraete-Instanzen", $Konfigurationsinstanz));
//Ende

//Variablen ermitteln
$VarIDWirkungsgradGesamt = IPS_GetVariableIDByName("Wirkungsgrad", $Rechenwerteinstanz);
$VarIDPACLeistungAktuell = IPS_GetVariableIDByName("PAC Leistung aktuell", $Messwerteinstanz);
$VarIDPDCLeistungAktuell = IPS_GetVariableIDByName("PDC Leistung aktuell", $Messwerteinstanz);
$VarIDDatenAenderung = IPS_GetVariableIDByName("Daten-Aenderung (min_day.js)", $Dateninstanz);
$VarIDDatumDaten = IPS_GetVariableIDByName("Daten Datum (min_day.js)", $Dateninstanz);
$VarIDUhrzeitDaten = IPS_GetVariableIDByName("Daten Uhrzeit (min_day.js)", $Dateninstanz);
$VarIDDatenDatenStatus = IPS_GetVariableIDByName("Datenstatus", $Dateninstanz);
//Ende

//Werte ermitteln
$AnzahlGeraete = GetValue(IPS_GetVariableIDByName("Anzahl Geraete", $Konfigurationsinstanz));
$Datenpfad = IPS_GetVariableIDByName("Datenpfad", $Konfigurationsinstanz);
//Ende

// Solarlog-Datendatei finden
$min_day_js = GetValue($Datenpfad)."\\min_day.js";

$LetzteAenderungAktuell = date('r',filemtime($min_day_js));
$LetzteAenderung = GetValue($VarIDDatenAenderung);

If ($LetzteAenderungAktuell != $LetzteAenderung){
	SetValue($VarIDDatenDatenStatus,"Daten lesen und verarbeiten...");
	SetValue($VarIDDatenAenderung,$LetzteAenderungAktuell);
	$fp1 = fopen($min_day_js, "r");

	$daten = fgets($fp1);
	$zeilen = explode("\r", $daten);
	echo $daten."
";

	$datensaetze = explode("|", $zeilen[0]);
	$datensaetzecount=count($datensaetze);
	echo "Anzahl Datensätze: ".$datensaetzecount."
";

	$PDCaktuell = 0;
	$PDCaktuellGesamt = 0;
	$Wirkungsgrad = 0;
	$WirkungsgradGesamt = 0;
	$PACaktuellGesamterrechnet = 0;

	// Zeitstempel
	$ZeitDatensatz = substr($datensaetze[0],9);
	echo "Daten von: ".$ZeitDatensatz."

";
	$ZeitstempelWerte = explode(" ",$ZeitDatensatz);
	$ZeitstempelDatum = $ZeitstempelWerte[0];
	$ZeitstempelZeit = $ZeitstempelWerte[1];

	SetValue($VarIDDatumDaten,$ZeitstempelDatum);
	SetValue($VarIDUhrzeitDaten,$ZeitstempelZeit);
	$GeraeteIDs = explode(",",$GeraeteInstanzen);

	for ($i=1;$i<=$AnzahlGeraete;$i++){ // Alle Geräte durchlaufen
		$werte = explode(";", $datensaetze[$i]);
		$wertecount=count($werte);
		echo "Anzahl Werte: ".$wertecount."
";
   	$GeraetID = $GeraeteIDs[$i];
   	echo "Geräte-ID: ".$GeraetID."
";
		$Geraetetyp = GetValue(IPS_GetVariableIDByName("Geraetetyp", (int)$GeraetID));
		if ($Geraetetyp == "Wechselrichter"){
		   $PDCaktuell = 0;
			$AnzahlStrings = (int)GetValue(IPS_GetVariableIDByName("Anzahl Strings", (int)$GeraetID));
         $VarIDPAC = IPS_GetVariableIDByName("PAC aktuell", (int)$GeraetID);
         SetValue($VarIDPAC, ($werte[0]));

         $PACaktuellGesamterrechnet = $PACaktuellGesamterrechnet + $werte[0];

   		$VarIDTagesertrag = IPS_GetVariableIDByName("Tagesertrag", (int)$GeraetID);
			SetValue($VarIDTagesertrag,($werte[$WertePositionen[$AnzahlStrings]["Tagesertrag"]])/1000);

         $VarIDPDCaktuell = IPS_GetVariableIDByName("PDC aktuell", (int)$GeraetID);
         $VarIDWirkungsgrad = IPS_GetVariableIDByName("Wirkungsgrad", (int)$GeraetID);

			switch ($AnzahlStrings){
			   case 0:
			   $VarIDPDC1 = IPS_GetVariableIDByName("PDC", (int)$GeraetID);
			   SetValue($VarIDPDC1, $werte[$WertePositionen[$AnzahlStrings]["PDC1"]]);
			   $VarIDUDC1 = IPS_GetVariableIDByName("UDC", (int)$GeraetID);
			   SetValue($VarIDUDC1, $werte[$WertePositionen[$AnzahlStrings]["UDC1"]]);

            $VarIDADC1 = IPS_GetVariableIDByName("ADC", (int)$GeraetID);
			   	If ($werte[$WertePositionen[$AnzahlStrings]["UDC1"]]>0)
					{
					$ADCerrechnet = ($werte[$WertePositionen[$AnzahlStrings]["PDC1"]])/($werte[$WertePositionen[$AnzahlStrings]["UDC1"]]);
			   	}
			   	else
			   	{
			   	$ADCerrechnet = 0;
			   	}
			   	SetValue($VarIDADC1,$ADCerrechnet);
			   	

				$PDCaktuell = $PDCaktuell + $werte[$WertePositionen[$AnzahlStrings]["PDC1"]];
			   break;
			   
			   default:
			   for ($z=1;$z<=$AnzahlStrings;$z++){
			      $ADCerrechnet = 0;
   				$StringName = "String ".$z;
   				$StringID = IPS_GetInstanceIDByName($StringName, (int)$GeraetID);

					$VarIDPDC[$z] = IPS_GetVariableIDByName("PDC", (int)$StringID);
			   	SetValue($VarIDPDC[$z], $werte[$WertePositionen[$AnzahlStrings]["PDC$z"]]);

			   	$VarIDUDC[$z] = IPS_GetVariableIDByName("UDC", (int)$StringID);
			   	SetValue($VarIDUDC[$z], $werte[$WertePositionen[$AnzahlStrings]["UDC$z"]]);
			   	
			   	$VarIDADC[$z] = IPS_GetVariableIDByName("ADC", (int)$StringID);
			   	If ($werte[$WertePositionen[$AnzahlStrings]["UDC$z"]]>0)
					{
					$ADCerrechnet = ($werte[$WertePositionen[$AnzahlStrings]["PDC$z"]])/($werte[$WertePositionen[$AnzahlStrings]["UDC$z"]]);
			   	}
			   	else
			   	{
			   	$ADCerrechnet = 0;
			   	}
			   	SetValue($VarIDADC[$z],$ADCerrechnet);
			   	$PDCaktuell = $PDCaktuell + $werte[$WertePositionen[$AnzahlStrings]["PDC$z"]];
			   }//Ende For-Schleife
			}//Ende Switch

			SetValue($VarIDPDCaktuell,$PDCaktuell); //Summe der DC-Leistungen speichern
         $PDCaktuellGesamt = $PDCaktuellGesamt + $PDCaktuell; //Gesamt-PDC aufsummieren
			If ($PDCaktuell>0) //nur wenn > 0, sonst Division durch 0!
				{
					$Wirkungsgrad = (GetValue($VarIDPAC) / GetValue($VarIDPDCaktuell))*100;
				}
				else
				{
            	$Wirkungsgrad = 0;
				}
			SetValue($VarIDWirkungsgrad,$Wirkungsgrad); //Wirkungsgrad speichern
		}//Ende Wechselrichter
      if ($Geraetetyp == "Sensorbox"){
         $VarIDEinstrahlung = IPS_GetVariableIDByName("Einstrahlung", (int)$GeraetID);
         SetValue($VarIDEinstrahlung, ($werte[0]));
         
         $VarIDModultemperatur = IPS_GetVariableIDByName("Modultemperatur", (int)$GeraetID);
         SetValue($VarIDModultemperatur, ($werte[1]));
         
         $VarIDAussentemperatur = IPS_GetVariableIDByName("Aussentemperatur", (int)$GeraetID);
         SetValue($VarIDAussentemperatur, ($werte[2]));
         
         $VarIDWindgeschwindigkeit = IPS_GetVariableIDByName("Windgeschwindigkeit", (int)$GeraetID);
         SetValue($VarIDWindgeschwindigkeit, ((float)$werte[3]));
      }//Ende Sensorbox

	}//Ende For-Schleife
	SetValue($VarIDPACLeistungAktuell,($PACaktuellGesamterrechnet/1000)); //Neu
	SetValue($VarIDPDCLeistungAktuell,($PDCaktuellGesamt/1000)); //Neu

   If ($PDCaktuellGesamt>0)
	   {
	      $WirkungsgradGesamt = (GetValue($VarIDPACLeistungAktuell) / GetValue($VarIDPDCLeistungAktuell))*100;
	   }
	   else
	   {
	      $WirkungsgradGesamt = 0;
	   }
	SetValue($VarIDWirkungsgradGesamt,$WirkungsgradGesamt); //Neu

   IPS_RunScript(15412 /*Monatswerte]*/);
	IPS_RunScript(16580 /*Jahreswerte]*/);
  	IPS_RunScript(27152 /*Tageswerte]*/);
	IPS_RunScript(35201 /*Erträge aktualisieren]*/);
	
	//Diagramme
	IPS_RunScript(19697 /*Diagramme\Erträge\Tagesertrag\Config]*/);
	IPS_RunScript(16646 /*Diagramme\Erträge\Jahresertrag\Config]*/);
	IPS_RunScript(24717 /*Diagramme\Erträge\Monatsertrag\Config]*/);
	IPS_RunScript(15164 /*Diagramme\Erträge\Tagesertrag nach Stunden\Config]*/);
	

 fclose($fp1);
}
?>

Sodele, das müsste es gewesen sein. Wenn es Probleme oder Fragen gibt, immer her damit!

Auf jeden Fall viel Spaß :smiley:

Grüße
Grebi

Hallo Grebi,

erst einmal einen herzlichen Dank für diese tolle Arbeit!
Ich habe nun versucht, Dein Script zu verwenden, um von einem externen FTP-Server die Daten auszulesen

(Hintergrund ist hier, dass der Solarlog per UMTS angebunden ist und ich diesen nicht direkt ansprechen kann, ich möchte aber auch nicht den Solarlog mit einem eigenen FTP-Server kommunizieren lassen)

nun kann ich als FTP-Pfad angeben : ftp.//username:Password@ftp.meineHomepage.de
Im Datenpfad steht bei mir nun ftp.//username:Password@ftp.meineHomepage.de/Anlagenname

Nachdem ich in Deinen Scripten jeweils das „“ gegen „/“ getauscht habe, konnte Dein Script die Anlagendaten auslesen, daher gehe ich davon aus, dass das Login auf den richtigten Pfad auch funktioniert.

Leider bekomme ich nun beim Ausführen des Scriptes folgende Fehlermeldung

Notice: Undefined offset: 45 in C:\IPS\scripts\Anlagen_von_Variablen_PV-Anlage.ips.php on line 244

und das ganze 3x
Hast Du hier einen Tipp für mich ?

Herzlichen Dank

bastelfrosch

Hi Bastelfrosch,
ich habe auch etwas länger mit den Skripten gekämpft bis ich alles am Laufen hatte. Bei mir war das Problem, das ich noch einen S0 Zähler am Solarlog hatte und so die Skripte nicht mehr korrekt funktionierten.

Stell mal dein Script rein, wo es die Fehlermeldung gibt. Evtl. kann ich dir helfen. Wäre auch nicht schlecht zu Wissen, wie deine Solaranlage aufgebaut ist. Ein oder mehrere Wechselrichter? S0 Zähler am Solarlog?

Gruß
Lutz

Hallo Lutz,

ich habe mir die Fehlermeldung noch mal angeschaut

Notice: Undefined offset: 45 in C:\IPS\scripts\Anlagen_von_Variablen_PV-Anlage.ips.php on line 244
kommt bei mir 3x, obwohl ich 5 WR habe. Allerdings sind 3 davon DELTA und zwe4i Power-One.
Ich denke hier liegt der Fehler. Ich habe in dem Script einfach bei Hersteller „DELTA“ unter Pos 10 hinzugefügt, ohne zu wissen, wass dieses Hersteller-Array überhaupt macht.
Ansonsten funktioniert außer der Temperatur alles. Warum die nicht geht weiss ich allerdings auch nicht. Im Web wird diese richtig angezeigt

<?
//Kategorie manuell anlegen, Name = Verzeichnisname des FTP-Servers!!!
set_time_limit(60);
include "Funktionen_ads10.ips.php"; //Funktionen-Script einbeziehen
//Variablen
$VarArray = array(
1 => "var AnlagenKWP=integer,Anlagenleistung in kWp",
2 => "var SollYearKWP=integer,Sollleistung in kWp",
3 => "var AnzahlWR =integer,Anzahl Geraete",
4 => "var HPTitel=string,Anlagenbezeichnung",
5 => "var HPBetreiber=string,Betreiber",
6 => "var HPEmail=string,Kontakt-EMail-Adresse",
7 => "var HPStandort=string,Standort der Anlage",
8 => "var HPModul=string,Module und Hersteller",
9 => "var HPWR=string,Wechselrichter und Hersteller",
10 => "var HPLeistung=string,Groesse der Anlage",
11 => "var HPInbetrieb=string,Installationsdatum",
12 => "var HPAusricht=string,Modulneigung und Ausrichtung",
13 => "var Verguetung=integer,Verguetung",
14 => "var Serialnr =integer,Seriennummer",
15 => "var Firmware =string,Firmware",
16 => "var FirmwareDate =string,Datum der Firmware",
17 => "var WRTyp =string,Kommunikation der Wechselrichter",
18 => "var OEMTyp =integer,OEM-Typ",
19 => "var SLTyp =string,SL-Typ",
20 => "var SLVer =integer,SL-Version",
21 => "var SLHW =integer,SLHW",
22 => "var SLBV =integer,SLBV",
23 => "var Intervall =integer,Intervall",
24 => "var SLDatum =string,SLDatum",
25 => "var SLUhrzeit =string,SLUhrzeit",
26 => "var CFDatum =string,CFDatum",
27 => "var CFUhrzeit =string,CFUhrzeit"
);
//WRInfo
$VarWRInfoArray = array(
0 => "Typ",
1 => "Adresse",
2 => "Modulleistung in W",
3 => "unbenutzt",
4 => "Bezeichnung",
5 => "Anzahl Strings",
6 => "Stringbezeichnungen",
7 => "Modulfelder",
8 => "Nennleistung",
9 => "Stringleistungen",
10 => "Hersteller",
11 => "Funktion",
12 => "Innentemperaturmessung?",
13 => "Korrekturfaktor",
14 => "Erweiterung"
);

//Hersteller
$VarWRInfoHerstellerArray = array(
1 => "SMA",
2 => "Kaco",
3 => "Sunways",
4 => "Solarmax",
5 => "Fronius",
6 => "Powerlynx/Kyocera",
7 => "Power-One",
8 => "Mitsubishi",
9 => "SOIN",
10 => "DELTA",
11 => "Solutronic",
17 => "Kostal"
);
// Hauptkategorie ermitteln (ID der Anlage)
$AnlagenID = IPS_GetParent($IPS_SELF);
$Anlagenname = IPS_GetName($AnlagenID);

//Dummy-Instanz Konfigurationsdaten anlegen
$InstIDKonfigurationsdaten = checkcreateDummyInstance($AnlagenID, "Konfigurationsdaten");

//Dummy-Instanzen anlegen
$InstIDBetriebsdaten = checkcreateDummyInstance($AnlagenID, "Betriebsdaten");
$InstIDDaten = checkcreateDummyInstance($InstIDBetriebsdaten, "Daten");
$InstIDMesswerte = checkcreateDummyInstance($InstIDBetriebsdaten, "Messwerte");
$InstIDRechenwerte = checkcreateDummyInstance($InstIDBetriebsdaten, "Rechenwerte");
 $InstIDStatus = checkcreateDummyInstance($InstIDBetriebsdaten, "Status");
$InstIDDiagramme = checkcreateDummyInstance($AnlagenID, "Diagramme");
$InstIDScripte = checkcreateDummyInstance($AnlagenID, "Scripte");

//Variablen in Instanz "Daten" anlegen
$VarIDDatenAenderungDays = CreateVariable ("Daten-Aenderung (days.js)", 3, $InstIDDaten, "", "");
 $VarIDDatenAenderungMinDay = CreateVariable ("Daten-Aenderung (min_day.js)", 3, $InstIDDaten, "", "");
 $VarIDDatenAenderungMonths = CreateVariable ("Daten-Aenderung (months.js)", 3, $InstIDDaten, "", "");
 $VarIDDatenAenderungYears = CreateVariable ("Daten-Aenderung (years.js)", 3, $InstIDDaten, "", "");
 $VarIDDatenDatumMinDays = CreateVariable ("Daten Datum (min_day.js)", 3, $InstIDDaten, "", "");
 $VarIDDatenUhrzeitMinDays = CreateVariable ("Daten Uhrzeit (min_day.js)", 3, $InstIDDaten, "", "");
 $VarIDDatenDatumDays = CreateVariable ("Daten Datum (days.js)", 3, $InstIDDaten, "", "");
 $VarIDDatenDatumMonths = CreateVariable ("Daten Datum (months.js)", 3, $InstIDDaten, "", "");
 $VarIDDatenDatumYears = CreateVariable ("Daten Datum (years.js)", 3, $InstIDDaten, "", "");
 $VarIDDatenDatenStatus = CreateVariable ("Datenstatus", 3, $InstIDDaten, "~HTMLBox", "");

//Variablen in Instanz "Messwerte" anlegen
$VarIDPACJahresertragStartwert = CreateVariable ("PAC Jahresertrag Startwert", 2, $InstIDMesswerte, "mWh", 0);
 $VarIDPACMonatsertragStartwert = CreateVariable ("PAC Monatsertrag Startwert", 2, $InstIDMesswerte, "kWh", 0);
 $VarIDPACTagesertragAktuell = CreateVariable ("PAC Tagesertrag aktuell", 2, $InstIDMesswerte, "kWh", 0);
 $VarIDPACTagesertragDavor = CreateVariable ("PAC Tagesertrag davor", 2, $InstIDMesswerte, "kWh", 0);
 $VarIDPDCLeistungAktuell = CreateVariable ("PDC Leistung aktuell", 2, $InstIDMesswerte, "kWh", 0);
 $VarIDPACLeistungAktuell = CreateVariable ("PAC Leistung aktuell", 2, $InstIDMesswerte, "kWh", 0);
 $VarIDPACMonatsertragBisGestern = CreateVariable ("PAC Monatsertrag bis gestern", 2, $InstIDMesswerte, "kWh", 0);
 $VarIDPACJahresertragBisGestern = CreateVariable ("PAC Jahresertrag bis gestern", 2, $InstIDMesswerte, "kWh", 0);

//Variablen in Instanz "Rechenwerte" anlegen
$VarIDPACDeltaTagesertrag = CreateVariable ("PAC Delta Tagesertrag", 2, $InstIDRechenwerte, "kWh", 0);
 $VarIDPACErtragLaufend = CreateVariable ("PAC Ertrag laufend", 2, $InstIDRechenwerte, "kWh", 0);
 $VarIDPACJahresertragAktuell = CreateVariable ("PAC Jahresertrag aktuell", 2, $InstIDRechenwerte, "mWh", 0);
 $VarIDPACMonatsertragAktuell = CreateVariable ("PAC Monatsertrag aktuell", 2, $InstIDRechenwerte, "kWh", 0);
 $VarIDWirkungsgrad = CreateVariable ("Wirkungsgrad", 2, $InstIDRechenwerte, "Prozent", 0);

//Variablen in Instanz "Status" anlegen
$VarIDStatusDatum = CreateVariable ("Status Datum (min_cur.js)", 3, $InstIDStatus, "","");
 $VarIDStatusUhrzeit = CreateVariable ("Status Uhrzeit (min_cur.js)", 3, $InstIDStatus, "","");
 $VarIDStatusGeraete = CreateVariable ("Status Geraete", 3, $InstIDStatus, "~HTMLBox","");
 $VarIDWirkungsgradeGeraete = CreateVariable ("Wirkungsgrade Geraete", 3, $InstIDStatus, "~HTMLBox","");
 $VarIDStatusDatenStatus = CreateVariable ("Datenstatus", 3, $InstIDStatus, "~HTMLBox", "");


// Anlagennamen anlegen
CreateVariable ("Anlage", 3, $InstIDKonfigurationsdaten, "", $Anlagenname);

//Speichert alle Wechselrichter-Instanzen als Array
$GeraeteInstanzen = CreateVariable ("Geraete-Instanzen", 3, $InstIDKonfigurationsdaten, "", "");
 SetValue($GeraeteInstanzen,"");

// Datenpfad zum FTP-Verzeichnis anlegen
$Datenpfad = GetValue(CreateVariable ("Datenpfad", 3, $InstIDKonfigurationsdaten, "", GetFTPPath($Anlagenname)));

// Solarlog-Konfigurationsdatei finden
$base_vars_js = $Datenpfad."/base_vars.js";


// Globale Konfig-Daten einlesen
for ($i=1;$i<count($VarArray);$i++){
    $zeile[$i] = $VarArray[$i];
    $posTrenner = strpos($zeile[$i],"=");
    $Variablenname = substr($zeile[$i],0,$posTrenner+1);
    $Variablenlaenge = strlen($Variablenname);
    $Wert = substr($zeile[$i],$posTrenner+1);
    $WertInhalte = explode(",",$Wert);
    $Datentyp = $WertInhalte[0];

    $WertName = $WertInhalte[1];

    If ($Datentyp == "string")
        {
          CreateVariable ($WertName, 3, $InstIDKonfigurationsdaten, "", GetSolarlogValue($Variablenname,$Variablenlaenge,$Datentyp,$base_vars_js));
         }
   If ($Datentyp == "integer")
        {
          CreateVariable ($WertName, 1, $InstIDKonfigurationsdaten, "", GetSolarlogValue($Variablenname,$Variablenlaenge,$Datentyp,$base_vars_js));
         }
}

// Wechselrichter / Geräte als Instanzen anlegen
$AnzahlGeraete = GetValue(IPS_GetVariableIDByName("Anzahl Geraete",$InstIDKonfigurationsdaten));
 $neuesi = "";
$interneNummer = "";

for ($i=0;$i<$AnzahlGeraete;$i++){
$Geraetetyp = "";
$x=0;
$Suchmuster = "WRInfo[$i]=new Array";
$inhalt = str_replace("\"","",GetSolarlogValue($Suchmuster,strlen($Suchmuster),"",$base_vars_js));
 $LaengeInhalt = strlen($inhalt);
$posLinkeKlammer = strpos($inhalt,"(");
$inhalt2 = substr($inhalt,$posLinkeKlammer+1,$LaengeInhalt-$posLinkeKlammer-4);

$WRDaten[$i] = explode(",",$inhalt2);
    if ($i < 9)
    {
    $neuesi = (string) $i+1;
    $interneNummer = "0".$neuesi;
    }
    else
    {
    $neuesi = (string) $i+1;
    $interneNummer = $neuesi;
    }

    //Gerätetyp ermitteln
   switch (ltrim($WRDaten[$i][11])){ //Gerätetyp
            case 0:
                $Geraetetyp="Wechselrichter";
                $WRName = ltrim($WRDaten[$i][4]);
            $DummyID = checkcreateDummyInstance($AnlagenID, $interneNummer." - ".$Geraetetyp.": ".$WRName); //Wechselrichter anlegen
             $VarIDGeraetetyp = CreateVariable ("Geraetetyp", 3, $DummyID, "",$Geraetetyp);
             IPS_SetHidden($VarIDGeraetetyp, true); //Objekt verstecken
                SetValue($GeraeteInstanzen,(GetValue($GeraeteInstanzen).",".$DummyID));
                 $AnzahlStrings = ltrim($WRDaten[$i][5]);
                If ($AnzahlStrings > 1){
                   $VarIDAnzahlStrings = CreateVariable ("Anzahl Strings", 1, $DummyID, "",(int)$AnzahlStrings);
                    IPS_SetHidden($VarIDAnzahlStrings, true); //Objekt verstecken
                     //Namen
                    $SuchmusterWR = "WRInfo[$i][6]=new Array";
                    $inhaltWR = str_replace("\"","",GetSolarlogValue($SuchmusterWR,strlen($SuchmusterWR),"",$base_vars_js));
                     $LaengeInhaltWR = strlen($inhaltWR);
                    $posLinkeKlammerWR = strpos($inhaltWR,"(");
                    $inhalt2WR = substr($inhaltWR,$posLinkeKlammerWR+1,$LaengeInhaltWR-$posLinkeKlammerWR-4);
                     $StringDatenWR[$i] = explode(",",$inhalt2WR);

                    for ($z=0;$z<$AnzahlStrings;$z++){
                        $interneNummerStrings = $z+1;
                        $DummyIDString = checkcreateDummyInstance($DummyID, "String ".$interneNummerStrings);
                         CreateVariable ("Bezeichnung", 3, $DummyIDString, "",$StringDatenWR[$i][$z]);
                     //Modulleistungen
                        $SuchmusterWR2 = "WRInfo[$i][9]=new Array";
                        $inhaltWR2 = str_replace("\"","",GetSolarlogValue($SuchmusterWR2,strlen($SuchmusterWR2),"",$base_vars_js));
                         $LaengeInhaltWR2 = strlen($inhaltWR2);
                        $posLinkeKlammerWR2 = strpos($inhaltWR2,"(");
                        $inhalt2WR2 = substr($inhaltWR2,$posLinkeKlammerWR2+1,$LaengeInhaltWR2-$posLinkeKlammerWR2-4);
                         $StringDatenWR2[$i] = explode(",",$inhalt2WR2);
                        CreateVariable ("angeschlossene Modulleistung", 2, $DummyIDString, "Watt", (float)$StringDatenWR2[$i][$z]);
                         CreateVariable ("PDC", 2, $DummyIDString, "Watt",0);
                        CreateVariable ("UDC", 2, $DummyIDString, "~Volt",0);
                        CreateVariable ("ADC", 2, $DummyIDString, "Solar_Ampere",0);
                     }
            } // Strings Ende
                    else
                    {
                    CreateVariable ("Anzahl Strings", 1, $DummyID, "",1);
                    CreateVariable ("angeschlossene Modulleistung", 2, $DummyID, "Watt", $WRDaten[$i][8]);
                     CreateVariable ("PDC", 2, $DummyID, "Watt",0);
                    CreateVariable ("UDC", 2, $DummyID, "~Volt",0);
                    CreateVariable ("ADC", 2, $DummyID, "Solar_Ampere",0);

                    }

            $VarIDMitTemperaturmessung = CreateVariable ("Mit Temperaturmessung", 3, $DummyID, "","Nein");
                 // restliche Angaben
                $Infobox = CreateVariable ("Infos", 3, $DummyID, "~HTMLBox", "");
                 $Info = "";
                for ($x=0;$x<15;$x++){
                   $InfoWert = ltrim((string)$WRDaten[$i][$x]);
                   If ($InfoWert == "null"){$InfoWert = "nicht angegeben";}
                   If ($x==12 and $InfoWert == 0){$InfoWert = "Nein";}
                   If ($x==12 and $InfoWert == 1){
                        $InfoWert = "Ja";
                        SetValue($VarIDMitTemperaturmessung,"Ja");
                    }
               If ($x==10){$InfoWert = $VarWRInfoHerstellerArray[$InfoWert];}
               If ($x==6 and $AnzahlStrings>1){$InfoWert = "siehe Strings";}
               If ($x==9 and $AnzahlStrings>1){$InfoWert = "siehe Strings";}
                    If ($x==11 or $x==14 or $x==3){}
                   else{
                       $Info .= $VarWRInfoArray[$x].": ".$InfoWert."<br>";
                   }
                }
                SetValue($Infobox,$Info);
            CreateVariable ("Tagesertrag", 2, $DummyID, "kWh",0);
            CreateVariable ("PAC aktuell", 2, $DummyID, "Watt",0);
            CreateVariable ("PAC Tagesertrag", 2, $DummyID, "kWh",0);
            CreateVariable ("PAC Max des Tages", 2, $DummyID, "Solar_kW",0);
            CreateVariable ("PAC Monatsertrag", 2, $DummyID, "kWh",0);
            CreateVariable ("PAC Jahresertrag", 2, $DummyID, "MWh",0);
            CreateVariable ("Wirkungsgrad", 2, $DummyID, "Prozent",0);
            CreateVariable ("Status", 3, $DummyID, "","");
            CreateVariable ("Fehler", 3, $DummyID, "","");
            CreateVariable ("PDC aktuell", 2, $DummyID, "Watt",0);
            CreateVariable ("angeschlossene Modulleistung", 2, $DummyID, "Watt", $WRDaten[$i][2]);
             CreateVariable ("Innentemperatur", 2, $DummyID, "~Temperature",0);

                //Statuscodes in String schreiben
                $SuchmusterWRStatus = "StatusCodes[$i] = ";
                $inhaltWRStatus = str_replace("\"","",GetSolarlogValue($SuchmusterWRStatus,strlen($SuchmusterWRStatus),"",$base_vars_js));
                 $StatusCodes = CreateVariable ("StatusCodes", 3, $DummyID, "", $inhaltWRStatus);
                 IPS_SetHidden($StatusCodes, true); //Objekt verstecken
                //Statuscodes Ende
            //Fehlercodes in String schreiben
                $SuchmusterWRFehler = "FehlerCodes[$i] = ";
                $inhaltWRFehler = str_replace("\"","",GetSolarlogValue($SuchmusterWRFehler,strlen($SuchmusterWRFehler),"",$base_vars_js));
                 $FehlerCodes = CreateVariable ("FehlerCodes", 3, $DummyID, "", $inhaltWRFehler);
                 IPS_SetHidden($FehlerCodes, true); //Objekt verstecken
                //Fehlercodes Ende
                break;
            case 1:
                $Geraetetyp="Sensorbox";
                $SBName = ltrim($WRDaten[$i][4]);
            $DummyID = checkcreateDummyInstance($AnlagenID, $interneNummer." - ".$Geraetetyp.": ".$SBName); //Sensorbox anlegen
             CreateVariable ("Geraetetyp", 3, $DummyID, "",$Geraetetyp);
            SetValue($GeraeteInstanzen,(GetValue($GeraeteInstanzen).",".$DummyID));
             CreateVariable ("Einstrahlung", 2, $DummyID, "Solar_Strahlung", 0);
             CreateVariable ("Modultemperatur", 2, $DummyID, "~Temperature", 0);
             CreateVariable ("Aussentemperatur", 2, $DummyID, "~Temperature", 0);
             CreateVariable ("Windgeschwindigkeit", 2, $DummyID, "~WindSpeed.ms", 0);
             CreateVariable ("Status", 3, $DummyID, "","");
            CreateVariable ("Fehler", 3, $DummyID, "","");

                //Sensorwerte ermitteln: ltrim($WRDaten[$i][14])
                //1: Einstarhlung
                //2: Modultemperatur
                //3: Aussentemperatur
                //4: Windmesser
            //Statuscodes in String schreiben
                $SuchmusterWRStatus = "StatusCodes[$i] = ";
                $inhaltWRStatus = str_replace("\"","",GetSolarlogValue($SuchmusterWRStatus,strlen($SuchmusterWRStatus),"",$base_vars_js));
                 $StatusCodes = CreateVariable ("StatusCodes", 3, $DummyID, "", $inhaltWRStatus);
                 //Statuscodes Ende
            //Fehlercodes in String schreiben
                $SuchmusterWRFehler = "FehlerCodes[$i] = ";
                $inhaltWRFehler = str_replace("\"","",GetSolarlogValue($SuchmusterWRFehler,strlen($SuchmusterWRFehler),"",$base_vars_js));
                 $FehlerCodes = CreateVariable ("FehlerCodes", 3, $DummyID, "", $inhaltWRFehler);
                 //Fehlercodes Ende
                break;
            case 2:
                $Geraetetyp="S0-Stromzähler";
                //zählt was?: ltrim($WRDaten[$i][14])
                break;
                }
}
?>

Nachtrag,

ich habe gerade mal eine andere Anlage mit nur einem Power-One WR eingerichtet. Hier lief das Script fehlerfrei durch.
Die Temperatur wird allerdings trotzdem nicht angezeigt …

Viele Grüße
bastelfrosch