Solar-Log und/oder Wechselrichter

Begonnen von oniT, 02 Juni 2013, 10:53:46

Vorheriges Thema - Nächstes Thema

oniT

Hallo,

da im Thema "Wago/SPS über Modbus(TCP/IP)..." die Anbindung fhem an den Solar-Log angesprochen wurde, wollte ich doch einmal einen eigenständigen Thread eröffnen um vielleicht weitere Unterstützung bekommen zu können.

Nachfolgend habe ich nochmals den Quellcode und die Dateien von Mopedpaul angefügt.


#######################################################################
# SOLARLOG
# Auslesen der Solarlog Werte
sub
Solarlog
{

use Socket;
use Getopt::Std;

use vars qw($opt_u $opt_r $opt_c $opt_g $opt_t $opt_h $opt_s $opt_p);

my ($remote, $port, $iaddr, $paddr, $proto, $line, $ans);
my ($ta_id, $prot_id, $unit_id, $mb_fc, $ref, $count, @data);

# Der Client wird flexibel durch Optionen, die es erlauben,
# ihn wie ein klassisches Unix-Tool mit vielen Parametern
# aufzurufen
$unit_id = $opt_u = 1;         # 1 bei Solarlog
$ref =     $opt_r = 3518;      # Register im Solarlog
$count =   $opt_c = 2;         # Anzahl übertragener Register
           $opt_g = 04;        # Anforderung zum Lesen
           $opt_t = 06;        # Anforderung zum Schreiben
           $opt_h = 0;         # Anforderung der Hilfe
$remote =  $opt_s = '192.168.10.89';  # IP-Adresse des Solarlog
$port =    $opt_p = 502;       # Port-Nummer vom Solarlog

getopts('u:r:c:gths:p:'); # Abfrage der Parameter

if ($opt_h)  {
# Netterweise eine Gebrauchsanweisung
  print "\n usage: $0 [-u unit(1)] [-r register(0)] [-c count(16)]\n",
          "         [(-g et)|-t ransmit] [-h elp]\n",
          "         [-s server(yak)] [-p port(502)]\n\n";
  exit;
}

# Welche Optionen sind eingegeben worden?
$unit_id = $opt_u;
$ref =     $opt_r;
$count =   $opt_c;
$remote =  $opt_s;
$port =    $opt_p;

$mb_fc = 3;
if ($opt_t) {
  unless ($opt_g) {
#   wenn nicht lesen, dann schreiben
    $mb_fc = 16;
    @data = @ARGV;
    $count = $#data + 1;
  }
}

$ta_id = 4;   # beliebig
$prot_id = 0;  #    " - aber in Anlehung an die Portnummer

# Verbindungsdaten festlegen
if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
die "No Port" unless $port;
$iaddr = inet_aton($remote) or die "No Host: $remote";
$paddr = sockaddr_in($port, $iaddr);
$proto = getprotobyname('tcp');

#while ( 1 ) {
# dieser Client hält eine dauernde Verbindung zum Server
# dies erlaubt die kontinuierliche Beobachtung der Simulation
  socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
  connect(SOCK, $paddr) or die "connect: $!";
 
# Netzwerkverbindung und Terminalausgabe ungepuffert.
  select SOCK;
  $| = 1;
  select STDOUT;
  $| = 1;
 
# Request formulieren (binär!)
  $line = pack "nnnCCnn", $ta_id, $prot_id, 6, $unit_id, $mb_fc, $ref, $count;  
 
  if ( $mb_fc == 0x10 ) {
#   binär kodieren - Big Endian
    $line .= pack 'Cn*', 2*$count, @data;
  }
 
# und absenden
  send SOCK, $line, 0;
 
# ein wenig Geduld zeigen - hier 100 msec
  select(undef, undef, undef, 0.2);
# und auf Antwort warten
  next unless defined(recv SOCK, $ans, 6+3+2*$count, 0);
# Wenn der Server die Verbindung nicht schließt, dann tun wir das
  close (SOCK);
# und bereiten die Ausgabe vor
  my $header = substr($ans, 0, 6);
  my ($tid, $prid, $hilen, $lolen) = unpack 'nnCC', $header;
  my ($unit, $fc, $bc) = unpack 'C*', substr($ans, 6, 3);
# binär dekodieren
  @data = unpack 'n*', substr($ans, 9);
  my $len = 0x100 * $hilen + $lolen;
  #####print "Unit $unit(Ref $ref): ";
  foreach (@data) {
#    if ( $_ >= 3000 ) {
#     $tpm = $_ - 65536;  # letzter Bit verdrehen
#    } else {
#     $tpm = $_;
#    }
#   $tpm = $tpm/10;
#   printf "%5.2f", ($tempora);
    print ' | ';
    printf $_
#   #printf "%5d", $_;
  }
  print "\n";
  if ( $mb_fc == 0x10 ) {
#   wenn wir nur geschrieben haben, Schluß
    exit;
  }
#}
exit;
# That's it
}
1;


Und hier nochmals sein Text:

ZitatIm Anhang die Beschreibung zun Solarlog Modbus. Wird wohl nicht groß auf der Solarlog Seite darüber berichtet, ist halt nur was für Leute, die die Solarlog Daten für weitere Anwendungen auswerten wollen - so wie wir halt. Habe diese Infos auch erst auf spezieller Nachfrage per Mail erhalten.

Es gibt verschiedene Versionen bezüglich des Umfangs der Infos (abrufbare Register) über dem Modbus. In der Modbus Free Version sind zumindest die Wichtigsten Parameter enthalten - Power AC+DC, Spannung AC+DC, Ertrag gestern,Tag,Mon,Jahr, (Verbrauch Momentan-am Tag-gestern - nur mit S0 Zähler für den Verbrauch im Haus).
Vor allem Interessant für die intelligente Schaltung von Verbrauchern die Parameter P-AC momentane AC Leistung und ggf aktueller Verbrauch. Vor allem bei weicher 70 % Regelung. Da kann man ggf Verbraucher zuschalten, wenn der Wechselrichter andernfalls in die 70% Begrenzung geht, und somit die volle Leistung der Anlage nutzen.

Wer mehr braucht (MPP Tracker, Temperaturen usw. muss dann eine Lizenz für den erweiterten Zugriff erwerben (Siehe PI_ModbusTCP_Interface_de.

Ich habe bereits erfolgreich die Daten von Adresse 3500 bis 3528 ausgelesen (das hier beschriebene Script vom Modbus (2010) mit den entsprechenden Netzwerk und Registeradressen. Allerdings nicht unter FHEM sondern direkt als Perl Script vom PC aus.
Komme jetzt aber nicht weiter bei der Einbindung in 99_myutils. Habe die 99_myutils mal angehängt. Vielleicht kann ja jemand weiter helfen. So wie es jetzt ist, hängt sich FHEM auf wenn die Sub Solarlog aufgerufen wird.

Ich stelle mir das so vor
Die Subroutine Solarlog in 99_myutils einbinden, dann über define die Routine aufrufen, hier die Registernummer übergeben und als Rückantwort den Registerinhalt zurück. Solarlog Adresse, Port (fest-502),Werte für Lesen (04), Schreiben (06).. usw können ja fest unter 99_myutils eingetragen werden.

FHEM
define SolarTimer at +*00:02:00 {Solarlog(Register,Wert)}
attr SolarTimer group Workflow
attr SolarTimer room Solaranlage

Ich habe dies ebenfalls einmal getestet und fhem hängt sich, wie er schreibt bei Aufruf von SolarLog auf.

Hat schon einmal jemand einen solchen Zugriff realisiert oder/und kann das Projekt untersützen? Oder aber sieht in dem Quelltext warum sich fhem aufhängt?

Danke

Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

Mopedpaul

Hallo,
den Grund für das Aufhängen habe ich gefunden. Am Ende vom Solarlog Script muss es nicht exit; sondern return; heißen. Nur so springen wir aus der Subroutine wieder zurück. Gibt es denn hier niemanden im Forum, der uns hier beim einlesen der Werte behilflich sein kann. Ich weiss einfach nicht, wie ich die Werte aus der Routine im FHEM übernehmen kann.

Im Script muss an dieser Stelle die Variablen abgegriffen werden:
  foreach (@data) {
#    if ( $_ >= 3000 ) {
#     $tpm = $_ - 65536;  # letzter Bit verdrehen
#    } else {
#     $tpm = $_;
#    }
#   $tpm = $tpm/10;
#   printf "%5.2f", ($tempora);
    print ' | ';
    printf $_
#   #printf "%5d", $_;
  }
 
Die Schleife foreach (@data) wird so oft durchlaufen, wie das Register an Werten hat, also meistens 2 Werte. Hier müssten nun in der Schleife die Werte in Variablen übernommen werden, die dann in FHEM weiter verarbeitet werden ----------- WER KANN HELFEN. Das Script läuft jetzt als sub durch und liest definitiv die Werte aus.

ich habe mal das Ergebnis angehängt, wenn ich das Perl Script in einer Perl Umgebung (Strawberry Padre) auf meinem Windows Rechner starte. Ich bekomme im Fenster (siehe Modbus Solarlog) tatsächlich den Wert für das Register 3502 (Momentane Modulleistung AC Seite 32 Bit unsigned) angezeigt. Das Register hat 2 16 Bit Werte (und das entspricht auch immer der tatsächlichen momentanen Leistung am AC Ausgang des Wechselrichters.

MfG Mopedpaulchen
System:FHEM 5.7 auf Intel NUC  mit 1xCUL(433) ,1xCUNO V2 (868)mit Onewire,2xNetIO mit Onewire , HMLAN
,Max Cube , Philips Hue, webViewControll, MiLight
Devices:FS20,Onewire (Cuno+NetIO),Intertechno ,Homematic (Keymatic & TC & SD) Max ,Solaranlage 7,3kWP mit Solarlog 200

MiPo

Hi,

habe einen Solarlog 200e mit Erfolg eingebunden. Bei Intersse kann ich mein  Script posten. Anbei noch ein Screenschot.

Gruss

Michael


(siehe Anhang / see attachement)

oniT

Hallo Michael,

ja bitte das Script und gegebenenfalls die entsprechende Anleitung dazu.

Danke

Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

MiPo

#Hallo Tino,
habe eine 99_SolarUtils.pm angelegt (siehe Anhang).

Musst nur Deine IP-Adresse anpassen.
Der Pfad "/opt/fhem/tmp/akt_tmp.txt" und "/opt/fhem/tmp/month_tmp.txt" muss ggfs. auch angepasst werden.
- Hole_akt_Daten (nur tagsüber, macht ja im dunkeln keinen Sinn)
- Hole_Monats_Daten (am letzten des Monats)
- Akt_Wert_Filtern (in der akt_temp.txt nach der aktuellen Leistung suchen)
- Monats_Wert_Filtern (Wert suchen)
- Abfrage_Ultimo (prüfen ob Monatsletzter)

Datei Kopieren und reload 99_SolarUtils.pm.

In Deine cfg folgende Zeilen Einfügen:

#---------------------------------------
define Aktuelle_Einspeiseleistung dummy
attr Aktuelle_Einspeiseleistung group PV
attr Aktuelle_Einspeiseleistung icon icoSolarlog.gif
attr Aktuelle_Einspeiseleistung room Zaehler
attr Aktuelle_Einspeiseleistung userReadings Leistung {ReadingsVal("Aktuelle_Einspeiseleistung","state",0);;}

define aktuelle_Ablesung_timer at +*00:03:00   {Hole_akt_Daten()};;\
                  {Akt_Wert_Filtern ("Aktuelle_Einspeiseleistung")}

                  
                              


define Monats_Einspeiseleistung dummy
attr Monats_Einspeiseleistung group PV
attr Monats_Einspeiseleistung icon icoSolarlog.gif
attr Monats_Einspeiseleistung room Zaehler
define Schalter_Auto_Ablesung_timer_Monat dummy
attr Schalter_Auto_Ablesung_timer_Monat room Zaehler

define Auto_Ablesung_timer_Monat at *00:03:00 set Schalter_Auto_Ablesung_timer_Monat on

define Auto_Ablesung_notify_Monat notify Schalter_Auto_Ablesung_timer_Monat:.*on {Monats_Wert_Filtern("Monats_Einspeiseleistung") if (Abfrage_Ultimo()ne "no")};;\
                   {fhem ("set Schalter_Auto_Ablesung_timer_Monat off")};;\


define FileLog_Aktuelle_Einspeiseleistung FileLog ./log/Aktuelle_Einspeiseleistung-%Y-%m.log Aktuelle_Einspeiseleistung
attr FileLog_Aktuelle_Einspeiseleistung group Zaehler
attr FileLog_Aktuelle_Einspeiseleistung room Logs
 
define weblink_Aktuelle_Einspeiseleistung weblink fileplot FileLog_Aktuelle_Einspeiseleistung:my_Einspeisung:CURRENT
attr weblink_Aktuelle_Einspeiseleistung group Zaehler
attr weblink_Aktuelle_Einspeiseleistung label "Ertrag der PV-Anlage: Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr weblink_Aktuelle_Einspeiseleistung room Zaehler,Plots
attr weblink_Aktuelle_Einspeiseleistung plotsize 800,300
 
define FileLog_Monats_Einspeiseleistung FileLog ./log/Monats_Einspeiseleistung-%Y.log Monats_Einspeiseleistung
attr FileLog_Monats_Einspeiseleistung group Zaehler
attr FileLog_Monats_Einspeiseleistung room Logs
 
define weblink_Monats_Einspeiseleistung weblink fileplot FileLog_Monats_Einspeiseleistung:my_Solarplot:CURRENT
attr weblink_Monats_Einspeiseleistung fixedrange year
attr weblink_Monats_Einspeiseleistung group Zaehler
attr weblink_Monats_Einspeiseleistung label "Ertrag der PV-Anlage/Monat: Min $data{min1}, Max $data{max1}, Last $data{currval1}, Summe $data{sum1}"
attr weblink_Monats_Einspeiseleistung room Zaehler,Plots
attr weblink_Monats_Einspeiseleistung plotsize 800,300
#-------------------------------------------------------------------------------------

Wenn Du einen Solarlog 200e besitzt muss es so funktionieren.

Bei andernen Loggern müssen vielleicht noch Anpassungen vorgenommen werden.

Viel Spass beim probieren
Michael

Mopedpaul

Hallo Michael,
vielen Dank für die tolle Arbeit, es läuft bei mir. Ich sehe zumindest die aktuelle Leistung, bekomme nur kein Plot angezeigt - ist aber klar, mir fehlen die gplot Dateien. kannst du noch folgende Dateien zur Verfügung stellen, macht die Sache einfacher.
Dateien:
my_einspeisung.gplot
my_solarplot.gplot
und wenn du dir schon die Arbeit mit dem Solarlog-Icon gemacht hast, vielleicht auch dieses.

PS für Fritzbox User: die Pfadangabe bei einer Fritzbox wäre dann "/var/media/ftp/fhem/FHEM/tmp/akt_tmp.txt" entsprechend für den Monat. wo bei das Verzeichnis tmp dann noch angelegt werden muss.

Vielen Dank und MfG Uwe
System:FHEM 5.7 auf Intel NUC  mit 1xCUL(433) ,1xCUNO V2 (868)mit Onewire,2xNetIO mit Onewire , HMLAN
,Max Cube , Philips Hue, webViewControll, MiLight
Devices:FS20,Onewire (Cuno+NetIO),Intertechno ,Homematic (Keymatic & TC & SD) Max ,Solaranlage 7,3kWP mit Solarlog 200

MiPo

Hi Uwe,

freut mich dass es funktioniert.
Werde die Dateien heute Abend hochladen.

Grüsse

Michael

Puschel74

Hallo,

könnte jemand das auch ins Wiki einpflegen?
Das wär doch perfekt dort aufgehoben, oder nicht?

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

MiPo

@Uwe,

habe wenig Zeit, hier die Dateien.
Kannst ja mal einen Screenshot hochladen wenn es funktioniert.

Grüsse

Michael



(siehe Anhang / see attachement)

oniT

Hallo Michael,

zunächst die Rückmeldung, es funktioniert ;-) Danke, ich bin begeistert.

Allerdings gibt es doppelte Einträge im Logfile. Hier eine Beispiel:


2013-06-18_20:59:20 Aktuelle_Einspeiseleistung Leistung: 5
2013-06-18_20:59:20 Aktuelle_Einspeiseleistung 5


Ich bin nur noch nicht dazu gekommen den Fehler zu suchen. Ich werds mir bei Gelegenheit mal ansehen.

Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

MiPo

Hallo Tino,

falls es dich stört einfach folgende Zeile entfernen:

attr Aktuelle_Einspeiseleistung userReadings Leistung {ReadingsVal("Aktuelle_Einspeiseleistung","state",0);;}

Ist noch eine Überbleibsel von Tests, hatte ich vergessen zu löschen.

Grüsse

Michael

oniT

Hallo,

hat jemand von Euch diese Abfrage in Zusammenhang mit einem HMLAN? Da gibt es scheinbar ein Problem in der Zeit wo keine Abfrage gemacht wird, also da wo kein Tag ist, gibt es Disconnects.

Ich werde zunächst einmal die Abfrage isday entfernen und sehen was dann im Logfile steht.

Gruß,
TinoB

BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

Mopedpaul

Hallo Tino,
ja bei mir hängt auch ein HMLan mit im System, aber keine Probleme.
Gruß Uwe
System:FHEM 5.7 auf Intel NUC  mit 1xCUL(433) ,1xCUNO V2 (868)mit Onewire,2xNetIO mit Onewire , HMLAN
,Max Cube , Philips Hue, webViewControll, MiLight
Devices:FS20,Onewire (Cuno+NetIO),Intertechno ,Homematic (Keymatic & TC & SD) Max ,Solaranlage 7,3kWP mit Solarlog 200

Mopedpaul

Hallo Michael,
wie gewünscht ein Screenplot von meiner Solarlog Einbindung. Gibt es auch die Info über den Eigenverbrauch, denn wie du auf dem Screenplot siehst, wird bei mir der Eigenverbrauch mit eingerechnet, weil ich die weiche 70% Lösung bei der Solaranlage habe.
System:FHEM 5.7 auf Intel NUC  mit 1xCUL(433) ,1xCUNO V2 (868)mit Onewire,2xNetIO mit Onewire , HMLAN
,Max Cube , Philips Hue, webViewControll, MiLight
Devices:FS20,Onewire (Cuno+NetIO),Intertechno ,Homematic (Keymatic & TC & SD) Max ,Solaranlage 7,3kWP mit Solarlog 200

Mopedpaul

System:FHEM 5.7 auf Intel NUC  mit 1xCUL(433) ,1xCUNO V2 (868)mit Onewire,2xNetIO mit Onewire , HMLAN
,Max Cube , Philips Hue, webViewControll, MiLight
Devices:FS20,Onewire (Cuno+NetIO),Intertechno ,Homematic (Keymatic & TC & SD) Max ,Solaranlage 7,3kWP mit Solarlog 200