Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Wie Solarregler Steca TR 603mc per RS232 einbinden?

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • makki
    antwortet
    Schön (der socat ist primär dafür da sich das gefrette mit dem serielln Port zu sparen, ganze packerl zu bekommen [eol] usw..)

    Das kann man noch etwas ausdünnen:

    Code:
    [COLOR="Red"]#-[/COLOR]use Device::SerialPort;
    
    $plugin_info{$plugname.'_cycle'}=0;
    my $socknum=15;
    
    # Configure socket
    if (!$socket[$socknum]) {
    	if (defined $socket[$socknum]) { #debug
    	if ($socket[$socknum]->opened) { $socket[$socknum]->close(); }
    		undef $socket[$socknum];
    	}  #debug
    	$socksel->remove($socket[$socknum]);
    
    	$socket[$socknum] = IO::Socket::INET->new(
    		LocalAddr => "localhost", 
    		LocalPort => '500'.$socknum, 
    		Proto => 'udp' 
    	) || return ("open socket failed: $!");
    	$socksel->add($socket[$socknum]);	    
    
    	$plugin_socket_subscribe{$socket[$socknum]} = $plugname;
    	return "opened UDP-Socket $socknum";
    }
    
    #get reason for wakeup -> only acquire data if woken up by socket
    [COLOR="Red"]#-[/COLOR]for what?
    [COLOR="Red"]#-[/COLOR]my $event=undef;
    
    [COLOR="Red"]#-[/COLOR]if (!$plugin_initflag) {$event='restart';}
    [COLOR="Red"]#-[/COLOR]elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'}) {$event='modified';}
    [COLOR="Red"]#-[/COLOR]elsif ($fh) {$event='socket';}
    [COLOR="Red"]#-[/COLOR]else {$event='cycle';}
    
    [COLOR="Red"]#-[/COLOR]if ($event=~/socket/) {
    [COLOR="Green"]if ($fh) {
    [/COLOR]	my @res = split(';',<$fh>);
    	$plugin_info{$plugname.'_info'}=@res;
    
    	my $T1 = @res[1]; #Vorlauf Dach
    	my $T2 = @res[2]; #Speicher
    	my $T3 = @res[3]; #Puffer oben
    	my $T4 = @res[4]; #Puffer unten
    	my $R1 = @res[8]; #Solarpumpe
    	my $R2 = @res[9]; #Umschaltventil Speicher, ein=Puffer
    	my $R3 = @res[10]; #Umschaltventil Puffer, ein=unten
    
    	update_rrd("T_VL_Solar_Dach","",$T1);
    	update_rrd("T_Speicher","",$T2);
    	update_rrd("T_Puffer_Oben","",$T3);
    	update_rrd("T_Puffer_Unten","",$T4);
    	update_rrd("P_Solar","",$R1);
    	update_rrd("V_Speicher","",$R2);
    	update_rrd("V_Puffer","",$R3);
    
    	return "Entry added: $T1 $T2 $T3 $T4 $R1 $R2 $R3";
    }
    
    return "nothing to do, yet";
    Makki

    P.S.: Wenn derlei Kisten alle einfach zyklisch einen parse-baren Wert aufn RS232 ausspucken würden, wär das leben so viel einfacher

    Einen Kommentar schreiben:


  • foobar0815
    antwortet
    Danke, nun ist mir auch die Aufgabe von socat klar.

    Das derzeitige Ergebnis sieht so aus:

    Code:
    use Device::SerialPort;
    
    $plugin_info{$plugname.'_cycle'}=0;
    my $socknum=15;
    
    # Configure socket
    if (!$socket[$socknum]) {
    	if (defined $socket[$socknum]) { #debug
    	if ($socket[$socknum]->opened) { $socket[$socknum]->close(); }
    		undef $socket[$socknum];
    	}  #debug
    	$socksel->remove($socket[$socknum]);
    
    	$socket[$socknum] = IO::Socket::INET->new(
    		LocalAddr => "localhost", 
    		LocalPort => '500'.$socknum, 
    		Proto => 'udp' 
    	) || return ("open socket failed: $!");
    	$socksel->add($socket[$socknum]);	    
    
    	$plugin_socket_subscribe{$socket[$socknum]} = $plugname;
    	return "opened UDP-Socket $socknum";
    }
    
    #get reason for wakeup -> only acquire data if woken up by socket
    
    my $event=undef;
    
    if (!$plugin_initflag) {$event='restart';}
    elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'}) {$event='modified';}
    elsif ($fh) {$event='socket';}
    else {$event='cycle';}
    
    if ($event=~/socket/) {
    	my @res = split(';',<$fh>);
    	$plugin_info{$plugname.'_info'}=@res;
    
    	my $T1 = @res[1]; #Vorlauf Dach
    	my $T2 = @res[2]; #Speicher
    	my $T3 = @res[3]; #Puffer oben
    	my $T4 = @res[4]; #Puffer unten
    	my $R1 = @res[8]; #Solarpumpe
    	my $R2 = @res[9]; #Umschaltventil Speicher, ein=Puffer
    	my $R3 = @res[10]; #Umschaltventil Puffer, ein=unten
    
    	update_rrd("T_VL_Solar_Dach","",$T1);
    	update_rrd("T_Speicher","",$T2);
    	update_rrd("T_Puffer_Oben","",$T3);
    	update_rrd("T_Puffer_Unten","",$T4);
    	update_rrd("P_Solar","",$R1);
    	update_rrd("V_Speicher","",$R2);
    	update_rrd("V_Puffer","",$R3);
    
    	return "Entry added: $T1 $T2 $T3 $T4 $R1 $R2 $R3";
    }
    
    return "nothing to do, yet";
    Die socat-Parameter entsprechen Makkis, bis auf die Paritaet:
    raw,b9600,cs8,icanon=1,eol=10,parenb=0

    Das klingt ja ausnahmsweise mal übersichtlich..
    Wird schon noch...

    Gruesse

    Einen Kommentar schreiben:


  • makki
    antwortet
    Das klingt ja ausnahmsweise mal übersichtlich..
    Also einen socat anlegen so in etwa wie im Anhang (anzupassen wäre evtl. baudrate und endezeichen (eol=10 == LF), kann man evtl. aber auch einfach weglassen.

    Das Plugin horcht auf den UDP-Port und wird aufgerufen wenn Daten anliegen.

    Und das einfachste Beispiel dazu hier.
    Im plugin noch ein bisschen my @werte = split(/;/$fh) und los gehts

    Makki
    Angehängte Dateien

    Einen Kommentar schreiben:


  • swiss
    antwortet
    Hallo

    Ja socket wäre die richtige lösung.

    Das Plugin wird eventgesteuert aufgerufen, sobald neue Daten über den Socket eintreffen. Und die werde auch solange gepuffert, bis wieder neue Werte eintreffen

    Einen Kommentar schreiben:


  • luigi4711
    antwortet
    socat ist wohl die am häufigsten genutze Möglichkeit bei den WG Plugins, die etwas über die serielle Schnittstelle machen. Da sollten sich genügend Beispiele finden lassen. Bsp. Comfoair, eHZ, EiWoMiSa im DIY-Bereich, und noch viele mehr.....

    Einen Kommentar schreiben:


  • - √ - Wie Solarregler Steca TR 603mc per RS232 einbinden?

    Hi,
    ich bin neuer Besitzer eines WG und will als erste Amtshandlung meinen Solarregler Steca TR 603mc per Plugin anbinden.

    Der Regler sendet zyklisch ohne Nachftage alle 60 Sekunden die Sensorwerte per RS232 ans WG.

    Was ist der zu bevorzugende Weg, die Daten zu verarbeiten? Ein Plugin, das max. 1min alle anderen blockiert ist wohl keine sinnvolle Loesung (wenn auch die aktuelle )

    Meine Idee waer ein kleiner C-Daemon, der die Daten holt und puffert, um Zeit im Plugin zu sparen.

    Liesse sich dafuer evtl auch socat einsetzen?

    Der Regler bietet keinerlei Flusskontrolle, hat nur Rx, Tx, Gnd.

    Ich habe auch mal die Plugins auf SF durchforstet, allerdings nichts passendes gefunden.

    Danke fuer eure Anregungen!
Lädt...
X