Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Ich versuche mich ende Woche mal am xA9 befehl. Wenn das auch klapt, wäre dann die Kummulierung der 4 Tageszähler an der Reihe. Hat man die, kann man damit auch ein RRD füttern. Dann hätte man auch eine Ertragsstatistik. Danach noch alles mögliche auf den BUS senden und diverse Einstellmöglichkeiten einrichten und fertig ist das Plugin.
Das klingt ja traumhaft...
Bei solchen Aussichten warte ich gerne.
Meinen allergrößten Respekt schon mal an dieser Stelle
Ich versuche inzwischen mal halbwegs zu verstehen wie das Script im Detail funktioniert. Vielleicht komme ich dann irgendwann auch einmal an den Punkt so etwas (in einfacher) schreiben zu können.
Aber ich habe es nicht vergessen Auch wenn mir momentan noch ein bischen der Ansatz fehlt wie ich die Werte vernünftig in ein RRD bekomme... Aber auch da wird mir noch etwas einfallen.
Ich komme aber wohl erst am Wochenende dazu... Bin momentan wieder relativ gut ausgelastet
Hier mal ein Zwischenstand zum testen. Nun sollte man die Werte auf den KNX bringen und visualisieren können. Wenn das klappt, versuche ich mich noch an den RRD's
Code:
# Plugin zum auslesen eines MasterVolt Wechselrichters
# Version 0.7.1 28.09.2013 BETA
# Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
# Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
#Erzeuge Variablen fuer die Zuordnung der Werte zu den Gruppenadressen:
my @WR_GAs;
push @WR_GAs, { id => "0101", ga_pv_spannung => '', ga_pv_strom => '', ga_wr_frequenz => '', ga_wr_spannung => '', ga_wr_leistung => '', ga_wr_leistung_total => ''};
push @WR_GAs, { id => "0201", ga_pv_spannung => '', ga_pv_strom => '', ga_wr_frequenz => '', ga_wr_spannung => '', ga_wr_leistung => '', ga_wr_leistung_total => ''};
push @WR_GAs, { id => "1101", ga_pv_spannung => '', ga_pv_strom => '', ga_wr_frequenz => '', ga_wr_spannung => '', ga_wr_leistung => '', ga_wr_leistung_total => ''};
push @WR_GAs, { id => "1201", ga_pv_spannung => '', ga_pv_strom => '', ga_wr_frequenz => '', ga_wr_spannung => '', ga_wr_leistung => '', ga_wr_leistung_total => ''};
my $ga_ausgangsleistung_gesammt = '';
#Pfad zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
my $schnittstelle = '/dev/ttyUSB-2-1.2';
#Weitere Variablen die benoetigt werden -> NICHT veraendern!
my $seriel;
my $sin; #Serial Input = Empangener Datenstrom
my $cin; #Counter Input = Länge des Datenpackets
my $exit;
my $reciv;
my $daten;
my $ausgangsleistung_total = '';
my $debug=2;
my $Zaehler = 200;
use Time::Local;
$plugin_info{$plugname.'_cycle'} = 30;
if(($plugin_info{$plugname.'_time'}+$plugin_info{$plugname.'_cycle'}) >= $plugin_info{$plugname.'_last'}){
return;
}
$plugin_info{$plugname.'_time'} = time();
use Device::SerialPort;
$seriel = Device::SerialPort->new($schnittstelle) || die "Kann $schnittstelle nicht öffnen! ($!)\n";
$seriel->baudrate(9600);
$seriel->parity("none");
$seriel->databits(8);
$seriel->stopbits(1);
if($debug>=1){plugin_log($plugname,'Schnittstelle: ' . $schnittstelle . ' erfolgreich geöffnet')};
foreach my $element (@WR_GAs) {
$daten = $element->{id}."ffffb6000000b6";
plugin_log($plugname,'Daten Abrufen: '.$daten);
my $command = pack("H*",$daten);
$seriel->write($command);
$reciv = '';
$cin = '';
$sin = '';
$|=1;
my $exit=0;
while($exit < $Zaehler)
{
($cin, $sin) = $seriel->read(45);
if($cin > 0){
$sin = unpack "H*", $sin;
$reciv .= $sin;
$exit=0;
}else{
$exit++
}
if($debug>=4){plugin_log($plugname,'reciv-direkt: ' . $sin);}
}#Ende While
if($debug>=2){plugin_log($plugname,'reciv-komplet: ' . $reciv);}
my $len = length($data);
if(substr($reciv,0,$len) eq $data){
$reciv =~ s/$data//;
if($debug>=2){plugin_log($plugname,'reciv gekürzt: ' . $reciv);}
my @array = map "$_", $reciv =~ /(..)/g;
my $pv_voltage = $array[9] . $array[8];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_voltage);}
$pv_voltage = hex($pv_voltage);
if($debug>=1){plugin_log($plugname,'PV Spannung: ' . $pv_voltage . 'V');}
if($element->{ga_pv_spannung} ne ''){knx_write($element->{ga_pv_spannung},$pv_voltage,9.001);}
my $pv_ampere = $array[11] . $array[10];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_ampere);}
$pv_ampere = hex($pv_ampere)/100;
if($debug>=1){plugin_log($plugname,'PV Strom: ' . $pv_ampere . 'A');}
if($element->{ga_pv_strom} ne ''){knx_write($element->{ga_pv_strom},$pv_ampere,9.001);}
my $pv_frequecy = $array[13] . $array[12];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_frequecy);}
$pv_frequecy = hex($pv_frequecy)/100;
if($debug>=1){plugin_log($plugname,'PV Frequenz: ' . $pv_frequecy . 'Hz');}
if($element->{ga_wr_frequenz} ne ''){knx_write($element->{ga_wr_frequenz},$pv_frequecy,9.001);}
my $pv_grid_voltage = $array[15] . $array[14];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_grid_voltage);}
$pv_grid_voltage = hex($pv_grid_voltage);
if($debug>=1){plugin_log($plugname,'PV Ausgangsspannung: ' . $pv_grid_voltage . 'V');}
if($element->{ga_wr_spannung} ne ''){knx_write($element->{ga_wr_spannung},$pv_grid_voltage,9.001);}
my $pv_grid_power = $array[19] . $array[18];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_grid_power);}
$pv_grid_power = hex($pv_grid_power);
if($debug>=1){plugin_log($plugname,'PV Ausgangsleistung: ' . $pv_grid_power . 'W');}
if($element->{ga_wr_leistung} ne ''){knx_write($element->{ga_wr_leistung},$pv_grid_power,9.001);}
$ausgangsleistung_total += $pv_grid_power;
my $pv_total_grid_power = $array[22] . $array[21] . $array[20];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_total_grid_power);}
$pv_total_grid_power = hex($pv_total_grid_power)*100;
if($debug>=1){plugin_log($plugname,'PV total Ausgangsleistung: ' . $pv_total_grid_power . 'kWh');}
if($element->{ga_wr_leistung_total} ne ''){knx_write($element->{ga_wr_leistung_total},$pv_total_grid_power,9.001);}
my $pv_temp = $array[23];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_temp);}
$pv_temp = hex($pv_temp);
if($debug>=1){plugin_log($plugname,'PV Temperatur: ' . $pv_temp . '°C');}
my $pv_working_time = $array[27] . $array[26] . $array[25] . $array[24];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_working_time);}
$pv_working_time = hex($pv_working_time)/60;
if($debug>=1){plugin_log($plugname,'PV Betriebsstunden: ' . $pv_working_time . 'h');}
}else{
if($debug>=2){plugin_log($plugname,'Falsche Antwort auf: ' . $data);}
}
}
if($ga_ausgangsleistung_gesammt ne ''){knx_write($ga_ausgangsleistung_gesammt,$ausgangsleistung_total,9.001);}
2013-09-29 18:54:49.240,Mastervolt-Solar,,0s,Global symbol "$data" requires explicit package name at (eval 2579) line 84.
Wenn ich Tante Google richtig interpretiert habe fehlt im oberen Abschnitt etwas wie
Code:
my $data;
Nachdem ich das eingebaut habe spuckt das Log jede Menge aus (leider war es schon etwas dunkel für einen Solar-Test...)
Ich werde das morgen früh nochmal wiederholen.
Du hast recht. Ich habe die Checksummenberechnung vergessen. Die Checksumme habe ich anfangs zum testen statsch eingetragen und stimmt natürlich nur für 0101. Jetzt sollte die Checksumme automatisch korrekt berechnet werden und auch die Abfrage der anderen Wechselrichtersegmente klappten
Code:
# Plugin zum auslesen eines MasterVolt Wechselrichters
# Version 0.7.3 30.09.2013 BETA
# Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
# Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
####################
###Einstellungen:###
####################
my @WR_GAs;
#Erzeuge Variablen fuer die Zuordnung der Werte zu den Gruppenadressen:
push @WR_GAs, { id => "0101", ga_pv_spannung => '', ga_pv_strom => '', ga_wr_frequenz => '', ga_wr_spannung => '', ga_wr_leistung => '', ga_wr_leistung_total => ''};
push @WR_GAs, { id => "0201", ga_pv_spannung => '', ga_pv_strom => '', ga_wr_frequenz => '', ga_wr_spannung => '', ga_wr_leistung => '', ga_wr_leistung_total => ''};
push @WR_GAs, { id => "1101", ga_pv_spannung => '', ga_pv_strom => '', ga_wr_frequenz => '', ga_wr_spannung => '', ga_wr_leistung => '', ga_wr_leistung_total => ''};
push @WR_GAs, { id => "1201", ga_pv_spannung => '', ga_pv_strom => '', ga_wr_frequenz => '', ga_wr_spannung => '', ga_wr_leistung => '', ga_wr_leistung_total => ''};
my $ga_ausgangsleistung_gesammt = ''; #DPT:9.001
#Pfad zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
my $schnittstelle = '/dev/ttyUSB-2-1.2';
######################
##ENDE Einstellungen##
######################
#Ab hier nichts mehr aendern.
#Hauptverarbeitung
#Weitere Variablen die benoetigt werden -> NICHT veraendern!
my $seriel;
my $sin; #Serial Input = Empangener Datenstrom
my $cin; #Counter Input = Länge des Datenpackets
my $exit;
my $reciv;
my $daten;
my $ausgangsleistung_total = '';
my $debug=2;
my $Zaehler = 200;
use Time::Local;
$plugin_info{$plugname.'_cycle'} = 30;
if(($plugin_info{$plugname.'_time'}+$plugin_info{$plugname.'_cycle'}) >= $plugin_info{$plugname.'_last'}){
return;
}
$plugin_info{$plugname.'_time'} = time();
use Device::SerialPort;
$seriel = Device::SerialPort->new($schnittstelle) || die "Kann $schnittstelle nicht öffnen! ($!)\n";
$seriel->baudrate(9600);
$seriel->parity("none");
$seriel->databits(8);
$seriel->stopbits(1);
if($debug>=1){plugin_log($plugname,'Schnittstelle: ' . $schnittstelle . ' erfolgreich geöffnet')};
foreach my $element (@WR_GAs) {
$daten = $element->{id}."ffffb6000000";
my @checksum_array = map "$_", $daten =~ /(..)/g;
my $checksum;
foreach my $checksum_element (@checksum_array) {
$checksum += hex($checksum_element);
}
$checksum = substr($checksum,-3,2);
$daten .= $checksum;
plugin_log($plugname,'Daten Abrufen: '.$daten);
my $command = pack("H*",$daten);
$seriel->write($command);
$reciv = '';
$cin = '';
$sin = '';
$|=1;
my $exit=0;
while($exit < $Zaehler)
{
($cin, $sin) = $seriel->read(45);
if($cin > 0){
$sin = unpack "H*", $sin;
$reciv .= $sin;
$exit=0;
}else{
$exit++
}
if($debug>=4){plugin_log($plugname,'reciv-direkt: ' . $sin);}
}#Ende While
if($debug>=2){plugin_log($plugname,'reciv-komplet: ' . $reciv);}
my $len = length($daten);
if(substr($reciv,0,$len) eq $daten){
$reciv =~ s/$daten//;
if($debug>=2){plugin_log($plugname,'reciv gekürzt: ' . $reciv);}
my @array = map "$_", $reciv =~ /(..)/g;
my $pv_voltage = $array[9] . $array[8];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_voltage);}
$pv_voltage = hex($pv_voltage);
if($debug>=1){plugin_log($plugname,'PV Spannung: ' . $pv_voltage . 'V');}
if($element->{ga_pv_spannung} ne ''){knx_write($element->{ga_pv_spannung},$pv_voltage,9.001);}
my $pv_ampere = $array[11] . $array[10];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_ampere);}
$pv_ampere = hex($pv_ampere)/100;
if($debug>=1){plugin_log($plugname,'PV Strom: ' . $pv_ampere . 'A');}
if($element->{ga_pv_strom} ne ''){knx_write($element->{ga_pv_strom},$pv_ampere,9.001);}
my $pv_frequecy = $array[13] . $array[12];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_frequecy);}
$pv_frequecy = hex($pv_frequecy)/100;
if($debug>=1){plugin_log($plugname,'PV Frequenz: ' . $pv_frequecy . 'Hz');}
if($element->{ga_wr_frequenz} ne ''){knx_write($element->{ga_wr_frequenz},$pv_frequecy,9.001);}
my $pv_grid_voltage = $array[15] . $array[14];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_grid_voltage);}
$pv_grid_voltage = hex($pv_grid_voltage);
if($debug>=1){plugin_log($plugname,'PV Ausgangsspannung: ' . $pv_grid_voltage . 'V');}
if($element->{ga_wr_spannung} ne ''){knx_write($element->{ga_wr_spannung},$pv_grid_voltage,9.001);}
my $pv_grid_power = $array[19] . $array[18];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_grid_power);}
$pv_grid_power = hex($pv_grid_power);
if($debug>=1){plugin_log($plugname,'PV Ausgangsleistung: ' . $pv_grid_power . 'W');}
if($element->{ga_wr_leistung} ne ''){knx_write($element->{ga_wr_leistung},$pv_grid_power,9.001);}
$ausgangsleistung_total += $pv_grid_power;
my $pv_total_grid_power = $array[22] . $array[21] . $array[20];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_total_grid_power);}
$pv_total_grid_power = hex($pv_total_grid_power)*100;
if($debug>=1){plugin_log($plugname,'PV total Ausgangsleistung: ' . $pv_total_grid_power . 'kWh');}
if($element->{ga_wr_leistung_total} ne ''){knx_write($element->{ga_wr_leistung_total},$pv_total_grid_power,9.001);}
my $pv_temp = $array[23];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_temp);}
$pv_temp = hex($pv_temp);
if($debug>=1){plugin_log($plugname,'PV Temperatur: ' . $pv_temp . '°C');}
my $pv_working_time = $array[27] . $array[26] . $array[25] . $array[24];
if($debug>=3){plugin_log($plugname,'substr: ' . $pv_working_time);}
$pv_working_time = hex($pv_working_time)/60;
if($debug>=1){plugin_log($plugname,'PV Betriebsstunden: ' . $pv_working_time . 'h');}
}else{
if($debug>=2){plugin_log($plugname,'Falsche Antwort auf: ' . $daten);}
}
}
if($ga_ausgangsleistung_gesammt ne ''){knx_write($ga_ausgangsleistung_gesammt,$ausgangsleistung_total,9.001);}
ja, so sieht das sehr gut aus.
Lediglich bei den kWh's muss noch das Komma an die richtige Stelle (es müssten pro ID jeweils ca. 12 000 kWh sein) sonst wäre ich ja reich
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar