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

    [wiregate] - √ - 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!

    #2
    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.....

    Kommentar


      #3
      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
      Gruss Patrik alias swiss

      Kommentar


        #4
        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
        EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
        -> Bitte KEINE PNs!

        Kommentar


          #5
          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

          Kommentar


            #6
            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
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar

            Lädt...
            X