Fehler beim Auslesen von FTP Daten "failed to open stream: operation failed in"

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???

Ich seh doch gar keine FTP Befehle zum einloggen oder abholen. Vielleicht, bin ich auch blind. :confused:

Hi,
leider steck ich nicht so tief in der Materie. Ich habe die Scripte von einem Threat hier im Forum:

Mit den Scripten soll es möglich sein von einem FTP Server, der auf dem IPS Server läuft die Daten zu verarbeiten. Jetzt möchte ich gerne die Daten von einem entfernten FTP Server im Netz abholen. Weiß nur nicht wie ich das anstellen kann, dachte ich könnte den FTP Server Link und das Verzeichnis anpassen und dann würde das funktionieren. Denn ob der FTP Server auf einem IPS Server lokal läuft oder im Internet steht sollte doch gleich sein oder?
Kann mir jemand sagen wie ich was erweitern muß?

Du solltest mal richtig lesen, dort wird eine Datei lokal ausgelesen, welche der FTP abholt.

Hier mal eine Grundkonfig.

Anpassen, musst selber.

<?

$ftp_server = 'xxxx'; // Adresse FTP-Server
$ftp_user_name = "xxxx"; // Username
$ftp_user_pass = "xxxxx"; // Passwort

// Verbindungsaufbau
$conn_id = ftp_connect($ftp_server);

// Login mit Username und Passwort
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// Schalte passiven Modus ein
ftp_pasv($conn_id, true);

// Verbindung überprüfen
if ((!$conn_id) || (!$login_result))
{
    echo "FTP Verbindung ist fehlgeschlagen!";
     echo "Verbindungsaufbau zu $ftp_server mit Username $ftp_user_name versucht.";
    return;
}
else
{
    echo "Verbunden zu $ftp_server mit Username $ftp_user_name"."
";
}


// Dateiliste erstellen und ausgeben
function rawlist_dump()
{
    global $conn_id;
      $ftp_rawlist = ftp_rawlist($conn_id, ".");
      foreach ($ftp_rawlist as $v)
    {
       $info = array();
        $vinfo = preg_split("/[\s]+/", $v, 9);
        if ($vinfo[0] !== "total")
        {
          $info['chmod'] = $vinfo[0];
          $info['num']   = $vinfo[1];
          $info['owner'] = $vinfo[2];
          $info['group'] = $vinfo[3];
          $info['size']  = $vinfo[4];
          $info['day']   = $vinfo[5];
          $info['month'] = $vinfo[6];
             $info['time']  = $vinfo[7];
             $info['name']  = $vinfo[8];
          $rawlist[$info['name']] = $info;
        }
      }
      $dir = array();
      $file = array();
      foreach ($rawlist as $k => $v)
    {
       if ($v['chmod']{0} == "d")
        {
           $dir[$k] = $v;
       }
        elseif ($v['chmod']{0} == "-")
        {
           $file[$k] = $v;
       }
    }
    foreach ($dir as $dirname => $dirinfo)
    {
        echo "[ $dirname ] " . $dirinfo['chmod'] . " | " . $dirinfo['owner'] . " | " . $dirinfo['group'] . " | "  . $dirinfo['day'] . " " . $dirinfo['month'] . " " . $dirinfo['time'] . "
";
    }
    foreach ($file as $filename => $fileinfo)
    {
        echo "$filename" . $fileinfo['chmod'] . " | " . $fileinfo['owner'] . " | " . $fileinfo['group'] . " | " . $fileinfo['size'] . " Byte | " . $fileinfo['day'] . " " . $fileinfo['month'] . " " . $fileinfo['time'] . "
";
    }
}
rawlist_dump();

// FTP Verbindung schließen
ftp_close($conn_id);


?>

Ok, soweit verstanden und wo speichert dein Code die Daten, damit ich sie mit den anderen Skripten weiter verarbeiten kann? Irgendwo muss ich ja noch ein Pfad für die Daten angeben oder?

Gar nicht, er zeigt dir das Verzeichnis an. Weiss ich wie dein FTP aussieht. :confused:

Sieh dir das Script von der Wetterseite an, dort werden Daten eh Mass vom FTP geholt und gespeichert.

OK, dann helf ich Dir als Ersteller des Scriptes mal :slight_smile:

Schau mal in deiner Dummyinstanz „Konfigurationsdaten“, da sollte in der Stringvariable der FTP-Pfad drin stehen, also „ftp://BENUTZERNAME:PASSWORT@home7.solarlog-web.de“. Ebenso in der Dummyinstanz „Global“ in der Stringvariable „FTP-Pfad“.

In der Funktion GetFTPPath musst du folgendes ändern:

return GetValue(45007); //Rest fällt weg

Überall in den Scripten, wo auf die Dateien des Solarlog zugegriffen wird, wie z.B. hier:

GetValue($Datenpfad)."\min_cur.js"

musst du den Doppelbackslash ersetzen durch einen einfachen Slash, also:

GetValue($Datenpfad)."/min_cur.js"

Damit solltest du jetzt weiterkommen…

Grüße
Grebi

Hi,

Danke Grebi für deine Hilfe. Das Auslesen funktioniert jetzt schon einmal Bombe und ich kriege die Daten vom FTP ausgelesen und teilweise auch korrekt ins IPS.

Da ich einen Stromzähler am S0 Eingang des Solarlogs habe, ändert sich jetzt leider der Aufbau der Dateien auf dem FTP und so gibt es Probleme mit der Zuordnung.

Ich habe das Script „Daten auslesen“ so für mich geändert das er Korrekt PAC, PDC1 und PDC2 zuordnet.
Problem besteht jetzt bei UDC1, UDC2 und den dazu errechneten Strömen ADC1 und ADC2. Ich denke das wenn die Spannungen (UDC…) korrekt zugeordnet werden, die Berechnung der Ströme funktionieren sollte.

Was mir noch aufgefallen ist, das er den UDC1 Wert auf die Variable des UDC2 Wertes in IPS schreibt.
Die Zuordnung im Array („UDC1“ => 5, „UDC2“ => 6) stimmt aber soweit.

Hier das geänderte Script, darunter die Fehlermeldung die ich jetzt beim Ausführen bekomme:


<?
include "24943.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[2] = array("PAC" => 1, "PDC1" => 2, "PDC2" => 3, "Tagesertrag" =>4, "UDC1" => 5, "UDC2" => 6, "Temperatur" =>7);
$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]);
        $werte = explode(";", $datensaetze[2]);
        $wertecount=count($werte);
        echo "Anzahl Werte: ".$wertecount."
";
      // $GeraetID = $GeraeteIDs[$i];
       $GeraetID = $GeraeteIDs[1];
       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(21081 /*Monatswerte]*/);
    IPS_RunScript(51837 /*Jahreswerte]*/);
      IPS_RunScript(53807 /*Tageswerte]*/);
    IPS_RunScript(13966 /*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);
}
?>

m[mi++]=„02.10.12 09:50:00|86;0;608|1755;1333;494;1071;534;417;26“

Anzahl Datensätze: 3
Daten von: 02.10.12 09:50:00

Anzahl Werte: 7
Geräte-ID: 33910

Warning: Cannot auto-convert to Float from Variant. Error: Could not convert variant of type (String) into type (Double) in D:\IP-Symcon\scripts\13101.ips.php on line 133
Anzahl Werte: 7
Geräte-ID: 33910

Warning: Cannot auto-convert to Float from Variant. Error: Could not convert variant of type (String) into type (Double) in D:\IP-Symcon\scripts\13101.ips.php on line 133

Weiß von euch Spezies keiner einen Rat?

Da stimmt die Typconvertierung nicht. Du willst string zu float machen.

Da ich die Zusammenhänge nicht kenne, kann ich auch nicht mehr dazu sagen.

Also ich habe es hinbekommen, es war ein Fehler in der Array Deklaration, so nenne ich das jetzt einmal.

Meine Deklaration sah so aus:


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

Deklariere ich das Array so, funktioniert es:


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

Ich habe jetzt noch eine Frage und zwar steht in dem Array auf Position 6 die Temperatur.

m[mi++]="02.10.12 09:50:00|86;0;608|1755;1333;494;1071;534;417;26"

Jetzt ist die Temperaturvariable eigentlich eines des Typs Float. Hier gibt es aber einen Fehler, da die Zahl mit einem Anführungszeichen ausgelesen wird. Deklariere ich die Temperatur als String, funktioniert es aber ich habe das Anführungszeichen als Suffix. Wie bekomme ich das Anführungszeichen NICHT mit ausgelesen.

Hiermit lese ich aus:


SetValue(16275 /*[PV Anlage\02 - Wechselrichter: PV Anlage\WR Temperatur]*/, $werte[$WertePositionen[$AnzahlStrings]["Temperatur"]]);

Könnt ihr mir hier einen Tip geben, den Rest habe ich schon hinbekommen.

PHP: substr - Manual

Ein Array fängt immer bei 0 an, es sei denn, es wird festgelegt.

Du kannst also bei deiner Auswertung die Zuordnung weglassen und direkt schreiben.

$WertePositionen[2] = array("PAC", "PDC1", "PDC2", "Tagesertrag","UDC1", "UDC2", "Temperatur" );  

OK Danke, man lernt nie aus. Weißt du wie ich die reine Zahl ohne das Anführungszeichen ausgelesen bekomme bei der Temperatur?

Den Link, hab ich nicht aus Langweile eingefügt.

Danke für die Hilfe, jetzt läuft alles!

Sorry, daß ich mich hier nicht „eingemischt“ habe, aber ich lag bis heute Mittag im Krankenhaus. Freut mich aber, daß jetzt alles funktioniert :slight_smile: