Hallo Jungs,
es geht um das Auslesen von PV Anlagendaten die auf einem FTP liegen.
Der User hier im Forum liest sie mit seinem Script von seinem eigenen FTP Server zu Hause aus, ich möchte sie allerdings von einem FTP Server im Internet abrufen, komme allerdings nicht wirklich weiter.
Als Pfad habe ich folgenden: ftp://BENUTZER:PASSWORT@home7.solarlog-web.de
Wenn ich diesen Pfad im Browser eingeben, komme ich auch auf den FTP Server wo die Daten liegen.
Wenn ich das Auslesescript starte, kommt folgender Fehler:
Warning: file(ftp://...@home7.solarlog-web.de\min_cur.js): failed to open stream: operation failed in D:\IP-Symcon\scripts\24943.ips.php on line 50
Das Script 24943 ist das hier:
<?
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(45007 /*[Anlage\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;
}
}
?>
Das Script das die Daten auslesen soll ist das hier:
<?
include "24943.ips.php"; //Funktionen-Script einbeziehen
$SuchArray = array(
1 => "var Datum=",
2 => "var Uhrzeit=",
3 => "var Pac="
);
$VarSMTPInstanz = 19701 /*[Objekt #19701 existiert nicht]*/;
// 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);
}
}
?>
Was ist Falsch???