Datei per ftp von weblog pro holen und in fhem einbinden

2,587 views
Skip to first unread message

Woody1507

unread,
Jul 28, 2012, 1:30:36 PM7/28/12
to fhem-...@googlegroups.com
Hallo,
Ich habe eine Solaranlage und als Datenlogger ist da ein meteocontrol Weblog pro dran. Ich würde gerne die aktuellen Daten vom Weblog holen und in fhem verwenden. Das Weblog legt pro Tag eine txt datei an, welche ich ja theoretisch alle 5 min einlesen könnte. Die Datei hat folgendes Muster:
[info]
Anlage=XXXXX
Datum=120517
[messung]
;s;Adresse;WR-Typ;MPC;S_GL;S_WR;S_DC1;S_DC2;S_AL;UDC1;IDC1;UDC2;IDC2;UAC;IAC;PAC;FAC;T_WR1;T_WR2;I_LC;R_ISO;E_TOTAL;E_INT;P_LIMIT;COS_PHI
;s;;;;;;;;;V;A;V;A;V;A;W;Hz;°C;°C;A;MOhm;kWh;Wh;;
[Start]
09:35:00;300;2;PVI-3.0-OUTD;;6;2;2;2;0;197.6;6.2;198.1;6.2;235.4;10.1;2349;49.98;49.5;49.0;0.0;20.0;506.561;196;;
09:35:00;300;3;PVI-3.0-OUTD;;6;2;2;2;0;199.2;6.2;200.2;6.1;235.7;10.1;2348;49.98;48.4;46.6;0.0;20.0;210.957;196;;

Es sind 2 Wechselrichter, daher bei Adresse die 2 und die 3.

Frage:
Wie bekomme ich die Datei in fhem und wie kann ich diese auswerten? Man kann auch per telnet direkt auf den weblog zugreifen, aber keine Ahnung welche scripts man da ausführen kann.

Ich weiß, das sind "Fragen", aber was soll man machen als Anfänger????? Hab auch schon das Forum durchsucht .

Viele Grüße

woody

Rudolf Koenig

unread,
Jul 29, 2012, 9:17:56 AM7/29/12
to fhem-...@googlegroups.com
> Wie bekomme ich die Datei in fhem und wie kann ich diese auswerten?

Haengt davon ab, was "in fhem" heissen soll.

Richtig: mit einem FHEM Modul, der diesen Server pollt, und Events generiert.
Sinnvollerweise holt man die Daten nicht aus der Datei, sondern direkt als
Event/Ereignis vom Server, evtl. ueber die erwaehnte telnet Schnittstelle.

Einfach: ein Skript konvertiert regelmaessig diese Daten in das FileLog Format.
Damit sieht man zwar in fhem die Plots (wenn man eine passende .gplot Datei
erstellt hat), aber man kann nicht auf irgendwelche Ereignisse reagieren.

Woody1507

unread,
Jul 29, 2012, 3:20:29 PM7/29/12
to fhem-...@googlegroups.com

Hi,
Naja "in fhem" heißt, ich würde die Werte gerne zum steuern einer Markise und 3Rolläden benutzen.
Ein Log ist schön, macht das Weblog über das Internetportal aber sowieso.
Auf dem Weblog läuft ein Linux, kann man evtl. auf die Daten oder Prozesse zugreifen? Wie kann man rausfinden was da an Prozessen läuft? Ein Webserver läuft jedenfalls, soviel ist sicher.

Grüße
Woody

Woody1507

unread,
Jul 30, 2012, 1:28:07 PM7/30/12
to fhem-...@googlegroups.com


Hier mal die Meldung vom FTP-server....

220  RT-IP FTP Server ready. Type HELP for help
HELP
214- The RT-IP FTP Server supports the following commands:
214- CWD  DELE HELP LIST MKD MODE NLST NOOP PASS PORT PWD
214- QUIT RETR RMD RNFR RNTO STOR TYPE USER XMKD XPWD XRMD
214- .....................................................
214- use CWD Z: to USE the virtual file system
214  .....................................................


kann man damit was anfangen?

Grüße
woody
Message has been deleted

Woody1507

unread,
Aug 5, 2012, 12:12:38 PM8/5/12
to fhem-...@googlegroups.com
Hallo, also ich hab mir mal die Struktur auf dem Weblog angeschaut. Da gibt es eine datei die heißt "ist.js" die scheint die Daten abzurufen. Mir ist nur nicht ganz klar wie ich diese datei auf dem weblog ausführen und die Daten weiterverwenden kann.
Kann mir hier jemand helfen? Habe zwar schon ein Buch über Perl bestellt, aber blicke noch nicht durch. Auch gibt es xml Dateien in einem ajax verzeichniss. Aber auch hier weiß ich nicht wie die aufrufe. 

 

 
Viele Grüße
 
Woody 

Tobi

unread,
Aug 19, 2012, 8:33:27 AM8/19/12
to fhem-...@googlegroups.com

Hallo,

ich hatte das selbe Problem mit nem SMA SolGuard (ist angeblich baugleich dem WeblogComfort):
folgende Lösung funktioniert bei mir, ich kann damit z.B. die aktuell produzierte Strommenge als Kriterium in FHEM nutzen:
- ein Gerät "Stromproduktion" mit Typ dummy anlegen
- alle 5 Minuten per notify die Funktion zum holen aufrufen.
- Die Funktion holt vom Gerät die Datei /system/delta_inverter.txt, da drin werden die aktuellen Daten protokolliert
- dann einlesen und die wichtigen Werte rausziehen
- damit den Status für ein Gerät setzen

Ich habe zwei Wechselrichter, das ist für mich hier hart codiert und muss bei Bedarf halt angepasst werden.

hier die Funktion (mit dem Hinweis, dass ich keinerlei Perl-Erfahrung habe, also sicher nicht viel schön gelöst. Verbesserungsvorschläge willkommen):

#################################
sub
Tobis_UpdatePhotovoltaikData()
{
    my $taillaenge = 5;
    my $temp = "";
    my @Zeile = "";
    my @Daten = "";
    my @dateidaten = "";
   
    # die delta_inverter.txt holen
    system ("wget-gnu --ftp-user=admin --ftp-password=admin --no-passive-ftp --output-document=/var/InternerSpeicher/fhem/FHEM/delta_inverter.txt solguard/system/delta_inverter.txt >/dev/null 2>/dev/null");
    # dort die letzten Zeilen in andere Datei schreiben
    system ("tail -$taillaenge /var/InternerSpeicher/fhem/FHEM/delta_inverter.txt > /var/InternerSpeicher/fhem/FHEM/temp.txt");
    # delta_inverter löschen
    unlink ("/var/InternerSpeicher/fhem/FHEM/delta_inverter.txt") || die $!;
    # Datei öffnen und einlesen
    open (DATEI, "</var/InternerSpeicher/fhem/FHEM/temp.txt") || die $!;
    @dateidaten = <DATEI>;
    close (DATEI);
   
    # Werte zuordnen
    foreach(@dateidaten)
    {
        @Zeile = split (";", $_);
        if (@Zeile == 50) # wir haben eine gültige Zeile gelesen
        {
            $Daten[$Zeile[2]] = 0;
            $Daten[$Zeile[2]] = $Daten[$Zeile[2]] + $Zeile[16];
        }
        @Zeile = "";
    }
    # und über set setzen

    $Daten[0] = $Daten[1] + $Daten[2]; # Ergebnisse der einzelen Wechselrichter zu Gesamt addieren
    $temp = "WG: $Daten[0] W1: $Daten[1] W2: $Daten[2]";
   
    if ($temp ne Value("Stromproduktion"))
    {
        fhem ("set Stromproduktion $temp");
    }
   
    # dann temp_datei löschen
    unlink ("/var/InternerSpeicher/fhem/FHEM/temp.txt") or die $!;
    $temp = "";
}
#################################

Die Funktion liefert mir die aktull produzierte Wattzahl:

#################################
sub
Tobis_GetActPower()
{
    my $Temp = Value("Stromproduktion");
    my @Data = split (" ", $Temp);
    return $Data[1];
}
#################################

Noch ein Hinweis zum per FTP holen: der Standard wget auf der Fritzbox ging bei mir nicht, ich musste mir ein Freetz kompilieren mit  zusätzlihc wget-gnu, da der in der Fritzbox enthaltene wget keinen Parameter für no-passive-ftp kennt. Den will mein solguard aber zwingend, damit er mir die Datei gibt.

Hoffe, das hilft nen Schritt weiter, viel Spaß

Tobi

Woody1507

unread,
Aug 21, 2012, 7:01:25 AM8/21/12
to fhem-...@googlegroups.com
Hi Tobi,
Vielen Dank für deinen Post. Da ich aber noch grüner hinter den Ohren bin als du, könntest du mir vieleicht noch erklären wo du was an Code eingefügt hast? Was kommt in die fhem.cfg , oder macht man ein neues Modul, oder wie?

Grüße
Woody

Tobi

unread,
Aug 21, 2012, 3:14:10 PM8/21/12
to fhem-...@googlegroups.com
Hallo Woody,

einfach im FHEM-Verzeichnis in die Datei 99_Utils.pm mit rein kopieren und speichern. Dann im Komamndofernster ein "reload 99_Utils", damit die Datei neu geladen wird. Wie man ein Modul macht, ehrlich gesagt, das ist mir dann doch zu hoch ;) Ich weis ja noch nicht mal, ob das ein sauberer Weg ist. Es tut halt seinen Dienst.

Bevor Du das aber einklinkst, schau Dir erst mal Deine delta_inverter.txt an, ob die auch so aussieht. Am besten per ftp auf den Rechner holen, die Kommas durch Strichpunkte ersetzen und dann mit Excel o.ä. als CSV-Datei öffnen. Ich habe nur Werte für zwei Wechselrichter drin (bei mir fehlen noch die Stromzählerwerte, die an den Solguard geliefert werden).
Der Solguard schriebt für jeden Wert eine Zeile mir einer ID für den Wechslerichter, ich analysiere im Skript auch nur die Zeilen mit 50 Werten.
$Daten[$Zeile[2]] = $Daten[$Zeile[2]] + $Zeile[16]; heißt: schreibe in ein Array an die Stelle der ID des Wechselrichters die aktuellen KW-Produktion des Wechselrichters. Das funktionerit also auch mit mehr Wechselrichtern bzw. hier IDs.

in diesen Zeilen addiere ich die Einzelwerte zum Gesamtwert ind $Daten[0] ==> Anpassen, wenn Du eine andere Anzahl an Wechselrichtern bzw. IDs hast:

$Daten[0] = $Daten[1] + $Daten[2]; # Ergebnisse der einzelen Wechselrichter zu Gesamt addieren
    $temp = "WG: $Daten[0] W1: $Daten[1] W2: $Daten[2]";

in der fhem.cfg habe ich dann noch folgendes drin:
  define Stromproduktion dummy
  attr Stromproduktion loglevel 6
  define FileLog_Stromproduktion FileLog /var/InternerSpeicher/fhem/log/Stromproduktion-%Y.log Stromproduktion
  attr FileLog_Stromproduktion logtype text
  define StromproduktionLesen at +*00:05:00 {Tobis_UpdatePhotovoltaikData();;}

und dann noch für die Visualisierung das in der fhem.cfg:
  define weblink_aStromproduktion weblink fileplot FileLog_Stromproduktion:power8top10:CURRENT
  attr weblink_aStromproduktion label "Stromproduktion Min $data{min1}, Max $data{max1}, Last $data{currval1}"
  attr weblink_aStromproduktion plotsize 800,320
  attr weblink_aStromproduktion room Auswertung

Damit solltest Du es hinkriegen. Wie gesagt, bei mir war das kritische, die delta_inverter.txt von der Fritzbox per ftp zu bekommen. Probier das am besten vorher per telnet von der Fritzbox aus.

Grüße und viel Erfolg

Tobi

Woody1507

unread,
Aug 23, 2012, 3:09:10 AM8/23/12
to fhem-...@googlegroups.com
Hi Tobi,
Dein sript habe ich soweit verstanden. Mir stellt sich nur die blöde Frage:an welcher stelle öffne ich die Verbindung zum weblog( solgard)? Mei Weblog hat die kp 192.168.0.7. Ansonsten ist die Struktur / System/delta_inverter.txt gleich.

Hiiiiilllffeeee , ich in einfach noch zu grün.

Viele Grüße

Woody

Tobi

unread,
Aug 23, 2012, 11:03:12 AM8/23/12
to fhem-...@googlegroups.com


Am Donnerstag, 23. August 2012 09:09:10 UTC+2 schrieb Woody1507:
Hi Tobi,
Dein sript habe ich soweit verstanden. Mir stellt sich nur die blöde Frage:an welcher stelle öffne ich die Verbindung zum weblog( solgard)? Mei Weblog hat die kp 192.168.0.7. Ansonsten ist die Struktur / System/delta_inverter.txt gleich.

Hallo Woody,

das ist die Zeile:
    # danach die delta_inverter holen

    system ("wget-gnu --ftp-user=admin --ftp-password=admin --no-passive-ftp --output-document=/var/InternerSpeicher/fhem/FHEM/delta_inverter.txt solguard/system/delta_inverter.txt >/dev/null 2>/dev/null");

Du öffnest also nicht die Verbindung zum weblog, sondern holst die Datei per FTP bei Di rmüsstest Su solguard/system/delta_inverter.txt durch 192.168.0.7/system/delta_inverter ersetzen.

Mit dem nächsten Befehl hol ich mir die letzten $taillaenge Zeilen, so dass cih nicht das ganze File analysieren muss, sonder nur die letzten - in meinem Fall 5 - Zeilen.

    # dort die letzten Zeilen in andere Datei schreiben
    system ("tail -$taillaenge /var/InternerSpeicher/fhem/FHEM/delta_inverter.txt > /var/InternerSpeicher/fhem/FHEM/temp.txt");


Noch mal der Tipp: Schalt Dich per Telnet auf die fritzbox und probier das Kommando zum holen der delta_inverter.txt in den Anführungszeichen dort aus. Der Befehl wget-gnu ist in der Standard-Fritzbox nicht drin, ich musste mir ein Fritzbox-Image mit zusätzlich wget-gnu kompilieren (also ein Freetz mit dem üblichen Hinweis, dass das dann keine Original Fritzboxfirmware mehr ist). Vielleicht hat noch einer der Mitleser einen Tipp, mit welchem Fritzbox-Befehl ein ftp-get mit no-passive-ftp geht, ohne dass man auf Freetz gehen muss? Der standarmäßige wget kennt leider keinen passenden Parameter oder ich habs nicht gefunden.


Grüße, Tobi
 

Tobi

unread,
Aug 24, 2012, 10:30:44 AM8/24/12
to fhem-...@googlegroups.com
Hallo Woody,

ich hab noch mal gegoogelt und habe gefunden, dass es eine perl-lib gibt, mit der ftp geht. Hab das gestern noch umgeschrieben, funktioniert bei mir gut. Hier der Code, probiers damit mal, das müsste dann auch mit dem Standard-Fritzbox gehen:

###################################################
sub
Tobis_FTPGet ($$$$$) # parameter: server user pw pfad file
{   
    my $server=shift;   # Hier wird die Adresse des FTP-Servers festgelegt (Hostname oder IP-Adresse)
    my $username=shift;    # Benutzername auf dem FTP-Server
    my $password=shift;    # Passwort für den Benutzer anonymous
    my $Pfad=shift;        # Pfad auf dem Server
    my $datei=shift;    # Der Name der Datei

    my $ftp=Net::FTP->new($server, Debug=>0, Passive=>0) || die "Keine Verbindung mit $server.\n"; # Erzeugen des FTP-Objektes, als Intitialisierungsparameter wird die Adresse des FTP-Servers übergeben
    $ftp->login($username, $password) || die "Fehler beim einloggen.\n"; # Einloggen auf FTP-Server mit User-Name und Passwort
    $ftp->cwd($Pfad) || die "Fehler beim Verzeichniswechsel nach $Pfad\n"; # Verzeichnis auf server wechseln
    $ftp->binary() || die "Fehler bei Umschalten auf binary-transfer\n"; # Übertragung binary
    $ftp->get($datei) || die "Fehler beim herunterladen von $datei auf $server.\n"; # hier findet der eigentliche Download der Datei statt
    $ftp->quit() || die "Fehler beim ausloggen von $server.\n\n"; # Abmelden vom FTP-Server

}

sub
Tobis_UpdatePhotovoltaikData()
{
    my $taillaenge = 5;
    my $temp = "";
    my @Zeile = "";
    my @Daten = "";
    my @dateidaten = "";
   
    # delta_inverter holen
    Tobis_FTPGet("192.168.178.38", "admin", "admin", "/system", "delta_inverter.txt");

    # dort die letzten Zeilen in andere Datei schreiben
    system ("tail -$taillaenge /var/InternerSpeicher/fhem/delta_inverter.txt > /var/InternerSpeicher/fhem/FHEM/temp.txt");
    # delta_inverter löschen
    unlink ("/var/InternerSpeicher/fhem/delta_inverter.txt") || die $!;

    # Datei öffnen und einlesen
    open (DATEI, "</var/InternerSpeicher/fhem/FHEM/temp.txt") || die $!;
    @dateidaten = <DATEI>;
    close (DATEI);
   
    # Werte zuordnen
    foreach(@dateidaten)
    {
        @Zeile = split (";", $_);
        if (@Zeile == 50) # wir haben eine gültige Zeile gelesen
        {
            $Daten[$Zeile[2]] = 0;
            $Daten[$Zeile[2]] = $Daten[$Zeile[2]] + $Zeile[16];
        }
        @Zeile = "";
    }
    # und über set setzen

    $Daten[0] = $Daten[1] + $Daten[2];
    $temp = "WG: $Daten[0] W1: $Daten[1] W2: $Daten[2]";
   
    if ($temp ne Value("Stromproduktion"))
    {
        fhem ("set Stromproduktion $temp");
    }
   
    # dann temp_datei löschen
    unlink ("/var/InternerSpeicher/fhem/FHEM/temp.txt") or die $!;
    $temp = "";
}

sub
Tobis_GetActPower()
{
    my $Temp = Value("Stromproduktion");
    my @Data = split (" ", $Temp);
    return $Data[1];
}

###################################################

Grüße

Tobi

Woody1507

unread,
Oct 31, 2012, 4:43:50 PM10/31/12
to fhem-...@googlegroups.com
Hallo Tobi,
tschuldige dfas ich mich jetzt erst melde. Habe die ganze Zeit probiert. Leider bekomme ichs nicht hin.
Mit wget hab ich zwar die Datei holen können, aber das auslesen der Werte hat nicht funktioniert. Anbei mal die 99_utils.pm wie ich sie verwende.
Mein weblog hat die Adresse 192.168.0.56

##############################################
# $Id: 99_myUtils.pm 1099 2011-11-12 07:53:34Z rudolfkoenig $

package main;

use strict;
use warnings;
use POSIX;
use Net::FTP;



###################################################
sub
Tobis_FTPGet ($$$$$) # parameter: server user pw pfad file
{  
    my $server=shift;   # Hier wird die Adresse des FTP-Servers festgelegt (Hostname oder IP-Adresse)
    my $username=shift;    # Benutzername auf dem FTP-Server
    my $password=shift;    # Passwort fuer den Benutzer anonymous

    my $Pfad=shift;        # Pfad auf dem Server
    my $datei=shift;    # Der Name der Datei

    my $ftp=Net::FTP->new($server, Debug=>0, Passive=>0) || die "Keine Verbindung mit $server.\n"; # Erzeugen des FTP-Objektes, als Intitialisierungsparameter wird die Adresse des FTP-Servers uebergeben

    $ftp->login($username, $password) || die "Fehler beim einloggen.\n"; # Einloggen auf FTP-Server mit User-Name und Passwort
    $ftp->cwd($Pfad) || die "Fehler beim Verzeichniswechsel nach $Pfad\n"; # Verzeichnis auf server wechseln
    $ftp->binary() || die "Fehler bei Umschalten auf binary-transfer\n"; # uertragung binary

    $ftp->get($datei) || die "Fehler beim herunterladen von $datei auf $server.\n"; # hier findet der eigentliche Download der Datei statt
    $ftp->quit() || die "Fehler beim ausloggen von $server.\n\n"; # Abmelden vom FTP-Server

}

sub
Tobis_UpdatePhotovoltaikData()
{
    my $taillaenge = 5;
    my $temp = "";
    my @Zeile = "";
    my @Daten = "";
    my @dateidaten = "";
  
    # delta_inverter holen
    Tobis_FTPGet("192.168.0.56", "admin", "admin", "/system", "delta_inverter.txt");


    # dort die letzten Zeilen in andere Datei schreiben
    system ("tail -$taillaenge /var/log/fhem/delta_inverter.txt > /var/log/fhem/temp.txt");
    # delta_inverter loeschen
    unlink ("/var/log/fhem/delta_inverter.txt") || die $!;


    # Datei öffnen und einlesen
    open (DATEI, "</var/log/fhem/temp.txt") || die $!;

    @dateidaten = <DATEI>;
    close (DATEI);
  
    # Werte zuordnen
    foreach(@dateidaten)
    {
        @Zeile = split (";", $_);
        if (@Zeile == 50) # wir haben eine gueltige Zeile gelesen

        {
            $Daten[$Zeile[2]] = 0;
            $Daten[$Zeile[2]] = $Daten[$Zeile[2]] + $Zeile[16];
        }
        @Zeile = "";
    }
    # und ueber set setzen


    $Daten[0] = $Daten[1] + $Daten[2];
    $temp = "WG: $Daten[0] W1: $Daten[1] W2: $Daten[2]";
  
    if ($temp ne Value("Stromproduktion"))
    {
        fhem ("set Stromproduktion $temp");
    }
  
    # dann temp_datei loehen
    unlink ("/var/fhem/temp.txt") or die $!;

    $temp = "";
}

sub
Tobis_GetActPower()
{
    my $Temp = Value("Stromproduktion");
    my @Data = split (" ", $Temp);
    return $Data[1];
}

###################################################
1;


und hier noch die deltainverter.txt, lieget auch unter \system wie bei dir.

[info]
Anlage=XXXXXXX
Datum=121031

[messung]
;s;Adresse;WR-Typ;MPC;S_GL;S_WR;S_DC1;S_DC2;S_AL;UDC1;IDC1;UDC2;IDC2;UAC;IAC;PAC;FAC;T_WR1;T_WR2;I_LC;R_ISO;E_TOTAL;E_INT;P_LIMIT;COS_PHI
;s;;;;;;;;;V;A;V;A;V;A;W;Hz;°C;°C;A;MOhm;kWh;Wh;;
[Start]
21:20:00;300;2;PVI-3.0-OUTD;;;;;;;;;;;;;;;;;;;;;;
21:20:00;300;3;PVI-3.0-OUTD;;;;;;;;;;;;;;;;;;;;;;
21:25:00;300;2;PVI-3.0-OUTD;;;;;;;;;;;;;;;;;;;;;;
21:25:00;300;3;PVI-3.0-OUTD;;;;;;;;;;;;;;;;;;;;;;
21:30:00;300;2;PVI-3.0-OUTD;;;;;;;;;;;;;;;;;;;;;;
21:30:00;300;3;PVI-3.0-OUTD;;;;;;;;;;;;;;;;;;;;;;

ich finde den Fehler leider nicht, hab mir schon ein perlbuch gekauft, hat mir aber auch nix geholfen........

Viele Grße
woody

Tobi

unread,
Oct 31, 2012, 5:25:40 PM10/31/12
to fhem-...@googlegroups.com
Hallo Woody,

lass uns schrittweise vorgehen:

Schritt 1: holt er die delta_inverter überhaupt rüber (sprich: klappt der ftpget)? Wenn beim Datei per ftp holen ein Fehler passiert, dann sollte jedes "die" einen Fehler im FHEM-Log provozieren, bitte mal im fhem-log kontrollieren.

Schritt 2: wenn keine Fehler im Log, mal per auf der Fritzbox nachschauen kontrollieren. Dazu erst mal die Zeile "unlink ("/var/log/fhem/delta_inverter.txt") || die $!;" mit einem # auskommentieren, speichern und dann in FHEM "reload 99_utils.pm" eingeben (sonst wird die gleich wieder gelöscht). Dann nach dem nächsten mal Ausführen kontrollieren, ob die Datei im richtigen Verzeichnis abgelegt wird (per Ftp oder Netzwerkfreigabe, je nach dem wie Du die Box konfiguriert hast). Dann die Pfade in der 99_utils auf den Pfad der gefundenen delta_inverter.txt anpassen.
Schritt 3 macht nur Sinn, wenn Schritt 2 geklappt hat: mal der Zeile "unlink ("/var/fhem/temp.txt")" auskommentieren, speichern, in FHEM "reload 99_utils.pm" machen. Jetzt sollte (nach dem nächsten asuführen) auf der fritzbox die /var/log/fhem/temp.txt stehen bleiben. Klappt das?

wenn wir hier erfolgreich sind, dann schauen wir uns das Auswerten der Datei an.
Hast Du hierzu evtl. ein paar Zeilen der delta_inverter von Tagsüber (also mit Stromproduktion)? Das erleichtert die weitere Hilfe :)

Bis demnächst, Grüße
Tobi

Woody1507

unread,
Nov 1, 2012, 6:36:40 PM11/1/12
to fhem-...@googlegroups.com

Hallo Tobi,
ich bekomme keine Verbindung zum weblog mit dem Net::FTP. Ich hatte es auch schon mit wget probiert, da hat es bis zum holen der delta_inverter.txt und umbenennen in temp.txt gefunzt. Der Resr leider nicht. Hier mal eien delta_inverter.txt....
Der Ausleseintervall steht auf 300 und der Übertragungsintervall 900sec.
Ich komme leider erst am WE zum erneuten testen.

Viele Grüße

woody


[info]
Anlage=XXXXXXXXXX
Datum=121021
[messung]
;s;Adresse;WR-Typ;MPC;S_GL;S_WR;S_DC1;S_DC2;S_AL;UDC1;IDC1;UDC2;IDC2;UAC;IAC;PA$
;s;;;;;;;;;V;A;V;A;V;A;W;Hz;�C;�C;A;MOhm;kWh;Wh;;
[Start]
09:50:00;300;2;PVI-3.0-OUTD;;6;2;2;2;0;207.5;4.4;207.2;4.3;233.3;7.5;1729;49.98$
09:50:00;300;3;PVI-3.0-OUTD;;6;2;2;2;0;208.8;4.3;202.4;4.0;231.0;7.2;1637;49.97$
09:55:00;300;2;PVI-3.0-OUTD;;6;2;2;2;0;206.3;4.6;205.5;4.5;233.3;7.8;1794;49.98$
09:55:00;300;3;PVI-3.0-OUTD;;6;2;2;2;0;208.2;4.4;202.7;4.3;231.3;7.6;1738;49.98$


Tobi

unread,
Nov 3, 2012, 3:50:25 AM11/3/12
to fhem-...@googlegroups.com
Hallo Woody,

was mir da noch aufgefallen ist, in Deiner delta_inverter werden die beiden Wechselrichter mit Index 2 und 3 angezeigt (Spalte 3, bzw. in Arry-zählweise von 0 weg gezählt Spalte [2]):


09:55:00;300;2;PVI-3.0-OUTD;;6;2;2;2;0;206.3;4.6;205.5;4.5;233.3;7.8;1794;49.98$
09:55:00;300;3;PVI-3.0-OUTD;;6;2;2;2;0;208.2;4.4;202.7;4.3;231.3;7.6;1738;49.98$

d.h. die Zeilen:

    $Daten[0] = $Daten[1] + $Daten[2];
    $temp = "WG: $Daten[0] W1: $Daten[1] W2: $Daten[2]";
müssen zu:
    $Daten[0] = $Daten[2] + $Daten[3];
    $temp = "WG: $Daten[0] W1: $Daten[2] W2: $Daten[3]";
werden.

Die ftp-Funktion hab ich noch mal verglichen, außer den Pfaden ist die bei mir identisch.
Ein kleiner Fehler ist noch drin, Du machst einen "unlink ("/var/fhem/temp.txt") or die $!;", das muss ein "unlink ("/var/fhem/log/temp.txt") or die $!;" werden, da Du ja beim "system ("tail -$taillaenge /var/log/fhem/delta_inverter.
txt > /var/log/fhem/temp.txt");" den Pfad verwendest.
Sonst wie oben geschrieben vorgehen, also im fhem-log schirttweise schauen wo es beim ftpget hakt.

Grüß und viel Erfolg

Tobi

Woody1507

unread,
Nov 9, 2012, 12:57:03 PM11/9/12
to fhem-...@googlegroups.com
Hallo Tobi,
nach längerer Zeit ohne Bock weils nicht funktioniert hab ich mich doch mal wieder drangesetzt.
Also:
-Dateiholen funktioniert (mit wget) aber ist ja egal oder?
-Datei tail und umbenennen funktioniert auch

wie kann ich den rest testen? die Anmerkungen von dir aus letztem post habe ich benutzt, hatt aber auch nix gebracht.

welche perl module lädst du am Anfang?

ich habe hier:
________________________________

package main;
use strict;
use warnings;
use POSIX;
________________________________

fehlt vielleicht hier schon irgenwas?

bekomme es einfach nicht hin :-(

Viele Grüße

woody

Tobi

unread,
Nov 9, 2012, 1:29:01 PM11/9/12
to fhem-...@googlegroups.com
Hallo Woody,


nach längerer Zeit ohne Bock weils nicht funktioniert hab ich mich doch mal wieder drangesetzt.
das kann ich nur zu gut nachvollziehen ;)
Also:
-Dateiholen funktioniert (mit wget) aber ist ja egal oder?
-Datei tail und umbenennen funktioniert auch
ja ist egal, hauptsache, da steht dann die temp.txt mit den letzten 5 Zeilen aus der  delta_inverter.
 
wie kann ich den rest testen? die Anmerkungen von dir aus letztem post habe ich benutzt, hatt aber auch nix gebracht.
tausche mal die Ausleseschleife durch die hier aus, das schreibt dann jede gelesen Zeile ins Log (wenn es funktionier die beiden Zeilen "log 1, ..." wieder raus, das müllt das log sonst zu ;) ):
foreach(@dateidaten)
    {
        $temp = $_;
        log 1, "Zeile gelesen: $temp";
        @Zeile = split (";", $temp);

        if (@Zeile == 50) # wir haben eine gueltige Zeile gelesen
        {
            $Daten[$Zeile[2]] = 0;
            $Daten[$Zeile[2]] = $Daten[$Zeile[2]] + $Zeile[16];
            log 1, "Zeile gesplittet ergibt: Wechselrichter $Zeile[2] mit $Zeile[16] Watt";
        }
        @Zeile = "";
    }
Wenn das klappt schauen wir weiter unten weiter.

welche perl module lädst du am Anfang?
use strict;
use warnings;
use POSIX;
use Time::Local 'timelocal';
use Net::FTP;
 

Nur zur Sicherheit: das Device Stromproduktion hast Du aber schon angelegt (mit "define Stromproduktion dummy" ind der FHEM-Console)?

Grüße und "nicht aufgeben",

Tobi

Woody1507

unread,
Nov 9, 2012, 4:27:45 PM11/9/12
to fhem-...@googlegroups.com
Hi Tobi,
habe jetzt mal den deinen code eingefügt. Sobald die Sonne aufgeht schau ich mal was so rauskommt.
Das dummy hab ich.....
hier mal der Auszug aus der fhem.cfg:

SNIP_______________________________________
define Stromproduktion dummy
attr Stromproduktion loglevel 5
attr Stromproduktion room PV-Anlage
define FileLog_Stromproduktion FileLog /var/log/fhem/Stromproduktion-%Y.log Stromproduktion
attr FileLog_Stromproduktion logtype text
attr FileLog_Stromproduktion room Logfiles


define weblink_aStromproduktion weblink fileplot FileLog_Stromproduktion:power8top10:CURRENT
attr weblink_aStromproduktion label "Stromproduktion Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr weblink_aStromproduktion plotsize 800,320
attr weblink_aStromproduktion room PV-Anlage

define StromproduktionLesen at +*00:01:00 {Tobis_UpdatePhotovoltaikData();;}
SNIP______________________________________________________________

melde mich sobald ich ein log habe.......

Grüße und Gute Nacht

woody

Tobi

unread,
Nov 9, 2012, 4:44:23 PM11/9/12
to fhem-...@googlegroups.com
Hallo Woody,

sollte so passen.

eine Kleinigkeit, ist aber eher Kosmetik:

define StromproduktionLesen at +*00:01:00 {Tobis_UpdatePhotovoltaikData();;}

Das reicht alle 5 Minuten, da der weblog auch kürzestenfalls alle 5 Minuten Daten liefert.

Bis morgen ...

Tobi

Woody1507

unread,
Nov 10, 2012, 2:56:46 AM11/10/12
to fhem-...@googlegroups.com

Hi Tobi,
ja, das mit den 5 Minuten ist klar....aber zum testen hab ich es mal auf 1 min gesetzt, da ich nicht so lange warten wollte.

Folgende (Fehler) Meldungen erscheinen jetzt im log:

2012.11.10 00:00:51 5: exec at command StromproduktionLesen
2012.11.10 00:00:51 5: Cmd: >{Tobis_UpdatePhotovoltaikData();}<
Use of uninitialized value in addition (+) at /usr/share/fhem/FHEM/99_myUtils.pm line 50.
Use of uninitialized value in addition (+) at /usr/share/fhem/FHEM/99_myUtils.pm line 50.
Use of uninitialized value in concatenation (.) or string at /usr/share/fhem/FHEM/99_myUtils.pm line 52.
Use of uninitialized value in concatenation (.) or string at /usr/share/fhem/FHEM/99_myUtils.pm line 52.
2012.11.10 00:00:51 5: Cmd: >set Stromproduktion WG: 0 W1:  W2:<
2012.11.10 00:00:51 5: dummy set Stromproduktion WG: 0 W1: W2:
2012.11.10 00:00:51 5: Triggering Stromproduktion (1 changes)
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking FileLog_A_Temperatur for notify
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking FileLog_Stromproduktion for notify
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking Log_WW_Temp for notify
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking Logfile for notify
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking WEB for notify
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking WEBphone for notify
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking WEBtablet for notify
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking autocreate for notify
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking initialUsbCheck for notify
2012.11.10 00:00:51 5: Stromproduktion trigger: Checking telnetPort for notify
2012.11.10 00:00:51 5: Triggering global (1 changes)
2012.11.10 00:00:51 5: global trigger: Checking FileLog_A_Temperatur for notify
2012.11.10 00:00:51 5: global trigger: Checking FileLog_Stromproduktion for notify
2012.11.10 00:00:51 5: global trigger: Checking Log_WW_Temp for notify
2012.11.10 00:00:51 5: global trigger: Checking Logfile for notify
2012.11.10 00:00:51 5: global trigger: Checking WEB for notify
2012.11.10 00:00:51 5: global trigger: Checking WEBphone for notify
2012.11.10 00:00:51 5: global trigger: Checking WEBtablet for notify
2012.11.10 00:00:51 5: global trigger: Checking autocreate for notify
2012.11.10 00:00:51 5: global trigger: Checking initialUsbCheck for notify
2012.11.10 00:00:51 5: global trigger: Checking telnetPort for notify
2012.11.10 00:00:51 5: redefine at command StromproduktionLesen as +*00:01:00 {Tobis_UpdatePhotovoltaikData();}

vieleicht kanst du ja damit was anfangen, werde auch mal googel was die 1. Zeilen bedeuten

Viele Grüße

Woody

Tobi

unread,
Nov 10, 2012, 3:24:00 AM11/10/12
to fhem-...@googlegroups.com
Guten morgen Woody,

er behauptet, dass wir auf eine uninitialisierte Variable in Zeile 50 und in Zeile 52 zugreifen.
Da ich noch mehr in der Datei drin habe, sind die Zeilennummern bei mir anders. Kannst Du die beiden Zeilen (bzw. inkl. dem umgebenden Code-Bereich) mal raussuchen und reinstellen?

Du hast zwei Wechselrichter, mit den IDs 2 und 3 im File, richtig?

Wenns die Stelle ist, die ich vermute, dann lösen wir das einfach anders.

Bis gleich

Tobi


Woody1507

unread,
Nov 10, 2012, 8:21:29 AM11/10/12
to fhem-...@googlegroups.com
Hi Tobi,
hier mal die komplette 99_myUtils.pm.... damit die Zeilen stimmenFängt direkt mit Zeile 1 an.

package main;

use strict;
use warnings;
use POSIX;
use Shell qw( date ps cp tail );
use Time::Local 'timelocal';
#use Net::FTP;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

#############################

sub
Tobis_UpdatePhotovoltaikData()
{
    my $taillaenge = 5;
    my $temp = "";
    my @Zeile = "";
    my @Daten = "";
    my @dateidaten = "";
  
    # die delta_inverter.txt holen
    system ("wget --ftp-user=admin --ftp-password=admin --no-passive-ftp --output-document=/var/log/fhem/delta_inverter.txt http://192.168.0.7/system/delta_inverter.txt >/dev/null 2>/dev/null");
    #system ("wget --ftp-user=admin --ftp-password=admin --no-passive-ftp --output-document=/var/log/fhem/delta_inverter.txt http://192.168.0.7/system/delta_inverter.txt ");
    system ("tail -$taillaenge /var/log/fhem/delta_inverter.txt > /var/log/fhem/temp.txt");# dort die letzten Zeilen in andere Datei schreiben
    #unlink ("/var/log/fhem/delta_inverter.txt") || die $!; # delta_inverter löschen
    open (DATEI, "</var/log/fhem/temp.txt") || die $!; # Datei öffnen und einlesen

    @dateidaten = <DATEI>;
    close (DATEI);
  
    foreach(@dateidaten)
    {
        $temp = $_;
        log 1, "Zeile gelesen: $temp";
        @Zeile = split (";", $temp);

        if (@Zeile == 50) # wir haben eine gueltige Zeile gelesen
        {
            $Daten[$Zeile[2]] = 0;
            $Daten[$Zeile[2]] = $Daten[$Zeile[2]] + $Zeile[16];
            log 1, "Zeile gesplittet ergibt: Wechselrichter $Zeile[2] mit $Zeile[16] Watt";
        }
        @Zeile = "";
    }
    # und über set setzen

    $Daten[0] = $Daten[2] + $Daten[3]; # Ergebnisse der einzelen Wechselrichter zu Gesamt addieren

   
    $temp = "WG: $Daten[0] W1: $Daten[2] W2: $Daten[3]";
  
    if ($temp ne Value("Stromproduktion"))
    {
        fhem ("set Stromproduktion $temp");
    }
  
    # dann temp_datei löschen
    #unlink ("/var/log/fhem/temp.txt") or die $!;
    $temp = "";


#################################
sub
Tobis_GetActPower()
{
    my $temp = Value("Stromproduktion");
    my @Data = split (" ", $temp);
    return $Data[1];
}
#################################
}
1;
#hier ist Ende


so,  das wars.
so wie ich das verstehe macht der code doch folgendes:
hol die datei per ftp > nehme die letzten 5 Zeilen > speichere diese in temp.txt > öffne temp.txt > teile die Zeilen in spalten jeweils begrenzt mit "" > hole spalte 2 und 3 oder so ?

Grüße

woody

PS mit der Sonne ists hier mau.... aber wenigstens nicht 0

Tobi

unread,
Nov 10, 2012, 9:02:47 AM11/10/12
to fhem-...@googlegroups.com
Hallo Woody,

genau das soll der code eigentlich machen, also eigentlich nichts wirklich kompliziertes.

Die Fehler kommt von den beiden Zeilen, in denen die Gesamtmenge aus [2] und [3] berechnet wird und aus der Zeile, in der der Wert für das Device gesetzt wird.
Uninitialized können die Arraywerte sein, wenn das Einlesen in der Schleife nicht geklappt hat.
Davon gehe ich im Moment aus, da hätte sonst ein Eintrag mit "Zeile gelesen ....." im Log sein müssen.

- Mach mal die Kommentarzeichen vor den beiden unlink raus, nicht dass er die vorhandenen alten Dateien nicht überschreiben kann. Dann schau noch mal ob der Logeintrag mit "Zeile gelesen ...." geschrieben wird. Wenn ja, dann sind wir schon mal in der Schleife.
- was mir noch aufgefallen ist: meine temp.txt hat 50 Datenspalten, der Auszug von Dir nur 23, bitte nochmal Spalten zählen und den Vergleich == 50 entsprechend auf Deine richtige Spaltenzahl anpassen. Die Spalten 2 und 16 sind identisch, 2 die Wechselrichternummer, 16 der zugehörige Watt-Wert.

Wenn das nichts hilft, dann geh mal nach der Taktik "Einkreisen" vor: einfach Log-zeilen (z.B. durchnummeriert) in den Code an und um die verdächtige Stellen, dann siehst Du im Log, was ausgeführt wurde und was nicht. Ist zwar kein komfortables debuggen, aber geht :)

Jeweils das reload ... nicht vergessen, sonst führt fhem die alte Version aus (da hab ich schon Zeit verbracht und Fehler gesucht, die schon behoben waren und gewundert, warums nicht geht ;) )

Happy Bughunting ;)

Tobi


Woody1507

unread,
Dec 6, 2012, 3:50:03 AM12/6/12
to fhem-...@googlegroups.com
Hi Tobi,
hab es endlich geschafft, da ich tagsüber mal etwas mehr Zeit hatte. Ohne aktuelle Werte bringt die Suche nicht viel. Der Fehler ist eingekreist aber noch nicht behoben. Ich bekomme aber jetzt wenigstens die Werte.

Es liegt an der  Zeile:

#if (@Zeile == 23) # wir haben eine gueltige Zeile gelesen

        {
            $Daten[$Zeile[2]] = 0;
            $Daten[$Zeile[2]] = $Daten[$Zeile[2]] + $Zeile[16];
           print LOG "Zeile gesplittet ergibt: Wechselrichter $Zeile[2] mit $Zeile[16] Watt";
        }
        @Zeile = "";
    }
Nachdem ich das if auskommentiert hatte lief es. Habe auch die temp-dataei nochmal nach excel importiert. Es sind 24 Spalten, wenn ich die erste mit 0 Zähle also nur 23. Der Vergleich geht aber nicht, also auskommentiert.
Bringt nur halt Abend Fehlermeldungen, da ja dann keine Daten mehr vorliegen und eine Addition (im folgenden) mit nix drin ja einen Fehler ergiebt.

Vieleicht hat hier ja noch jemand einen Lösungsansatz um den Fehler der leeren Datei abzufangen. Vieleicht könnte man ja die Funktion "Sunset" in der fhem.cfg nutzen, da nach Sonnenuntergang ja kein Strom mehr produziert wird und damit der Aufruf der subroutine abgeschaltet wird

Grüße

Woody.

Tobi

unread,
Dec 6, 2012, 2:57:00 PM12/6/12
to fhem-...@googlegroups.com
Hallo Woody,



#if (@Zeile == 23) # wir haben eine gueltige Zeile gelesen

probier da mal statt der 23 eine 24. Die Positionen im Array spricht man mit Index 0 bis 23 an, aber in Summe ist die Länge dann 24.

Grüße
Tobi
 

Reply all
Reply to author
Forward
0 new messages