Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Empfang per UDP Socket mit PL 38 gestört, ab V 1.1x behoben

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

    [wiregate] - √ - Empfang per UDP Socket mit PL 38 gestört, ab V 1.1x behoben

    Hallo zusammen,

    das Problem wurde hier schon angesprochen: Klick, da es aber nicht Denn spezifisch zu sein scheint mache ich hier einen eigenen Thread auf.

    Folgende Situation bei mir:

    Ein Raspberry sendet per scat Daten ans Wirkgate (TCP), dort läuft ein Scort der die Daten empfängt und an einen UDP-Port auf dem localhost weiterleitet. Dieses Setup hat es bis zum Letzten Update problemlos getan, seitdem kommen im Plugin keine Daten mehr an.

    Was ich probiert habe:
    1. Manueller Empfang der Daten vom raspberry per socat auf dem Wiregate in der Kommandozeile: Funktioniert

    2. Senden an den UDP Port auf dem das Plugin lauscht von der Kommandozeile aus: Auch dabei kommen keine Daten an.

    Meine Vermutung geht also dahin, dass sich irgend etwas an der Plugin Schnittstelle geändert hat.

    Der socat Aufruf:
    Code:
    /usr/bin/socat -u tcp-listen:49990,reuseaddr,fork udp-datagram:127.0.0.1:49991,bind=:49992,reuseaddr
    Die Sourcen des Plugins (Vorlage stammt aus dem Forum):

    Code:
    # Plugin zum Empfang der Sensordaten vom Raspberry 
    # Die Vorlage für die Datenübertragung via socat stammt von makki (https://knx-user-forum.de/members/makki.html)
    
    #
    #
    #######################
    ### Wichtige Infos: ###
    #######################
    #
    # Im WG ist eine Socketverbindung mit folgenden Parametern zu erstellen:
    # Name: z.B. Raspberry
    # Socket1: tcp-listen, Socket: IP_DES_RASPBERRY:49990, Optionen: reuseaddr,fork
    # Socket2: udp-datagram, Socket: 127.0.0.1:49991, Optionen: bind=:49992,reuseaddr
    #
    
    
    ####################
    ###Einstellungen:###
    ####################
    
    
    my $ga_temp_bib = '11/1/170'; #GA Temperatur
    my $ga_relF_bib = '11/1/171'; #GA rel. Feuchte
    my $ga_tauP_bib = '11/1/172'; #GA Taupunkt
    my $ga_absF_bib = '11/1/173'; #GA absolute Feuchte
    my $ga_lux_bib  = '11/1/174'; #GA Helligkeit
    
    
    #Diese Einstellungen können normalerweise so belassen werden!
    #my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
    #my $send_port = "50106";   # Sendeport (UDP, siehe in Socket-Einstellungen)
    my $recv_ip = "127.0.0.1";  # Empfangsport (UDP, siehe in Socket-Einstellungen)
    my $recv_port = "49991";    # Empfangsport (UDP, siehe in Socket-Einstellungen)
    
    ######################
    ##ENDE Einstellungen##
    ######################
    
    my $socknum = 20;                # Eindeutige Nummer des Sockets +1
    
    # Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen)
    $plugin_info{$plugname.'_cycle'} = 0;
    
    
    # Konstanten zur Berechnung von abs. Feuchte & Taupunkt
    # a = 7.5, b = 237.3 für T >= 0
    # a = 7.6, b = 240.7 für T < 0 über Wasser (Taupunkt)
    # a = 9.5, b = 265.5 für T < 0 über Eis (Frostpunkt)
    my $a = 7.5; my $b = 237.3;
    
    # Hauptverarbeitung
    
    # Initialisierung des Sockets
    if (!$socket[$socknum]) 
    { 
    	# socket erstellen
        $socket[$socknum] = IO::Socket::INET->new(	LocalPort => $recv_port, 
        								Proto => "udp",
        								ReuseAddr => 1,
                                 		LocalAddr => $recv_ip)
             				or return ("open of $recv_ip : $recv_port failed: $!");
    
        $socksel->add($socket[$socknum]); 						 # add socket to select
        $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
    
        return "opened UDP-Socket $socknum";
    } 
    
    if ($fh)  # Read from UDP-Socket
    { 	
        my $buf;
        my $result = "Unknown";
    
        recv($fh,$buf,255,0);
        
        if(!$buf || (length($buf) < 11)) # Bogus messages    
        {            
        	return "Invalid message";
        }
        
        my @items = split(/;/, $buf);
        
        if ((@items == 5) && (index($items[0], 'Bib') != -1)) 
        {
        	$items[1] =~ s/^\s+//;  #relative Feuchte
        	$items[2] =~ s/^\s+//;  #Temperatur
        	$items[3] =~ s/^\s+//;  #VAD
        	$items[4] =~s/^\s+//;   #VDD
        	
        	#Formeln siehe http://www.wetterochs.de/wetter/feuchte.html
        	my $SDD = 6.1078 * 10**(($a*$items[2])/($b+$items[2]));   # Sättigungsdampfdruck in hPa
        	my $DD  = $items[1]/100 * $SDD;                           # Dampfdruck in hPa
        	my $v = log($DD/6.1078)/log(10);  						  #log10
        	my $TD = $b*$v/($a-$v);                                      #Taupunkttemperatur in °C
        	my $AF = 10**5 * 18.016/8314.3 * $DD/($items[2]+273.15);  #absolute Feuchte in g Wasserdampf pro m3 Luft
    
        	knx_write($ga_relF_bib, $items[1], 5);
        	knx_write($ga_temp_bib, $items[2], 9);
        	knx_write($ga_tauP_bib, $TD,       9);
        	knx_write($ga_absF_bib, $AF,       9);
        	
        	update_rrd("Bibliothek_hum",  "", $items[1], "GAUGE");
        	update_rrd("Bibliothek_temp", "", $items[2], "GAUGE");
        	update_rrd("Bibliothek_dew",  "", $TD,       "GAUGE");
        	update_rrd("Bibliothek_ahum", "", $AF,       "GAUGE");
        	
        	$result = sprintf("Bib - rF: %.2f, T: %.2f, TD: %.2f, AF: %.2f, VAD: %.2f, VDD: %.2f", $items[1], $items[2], $TD, $AF, $items[3]);
        }
        
        #if (time() - $plugin_info{$plugname.'_rfidlast_'.$bufhex} < $interval) {
        #  return;
        #}
        #$plugin_info{$plugname.'_rfidlast_'.$bufhex} = time();  
        
        return $result;
    }
    
    return;

    #2
    Da wir das Problem sehr vermutlich bei der laufenden Entwicklung für die nächste Version bereits gefixed haben, habe ich dem TE ein Pre-Release angeboten.

    lg

    Stefan

    Kommentar


      #3
      Hallo Stefan!

      Sehr schön zu lesen!

      Könnte die vorab-Version auch benötigen siehe verlinkter Thread von Jockel.

      Wenn das Update am 12. kommen sollte, könnte ich aber auch noch so lange warten.

      Danke und Gruß
      Tobias

      Kommentar


        #4
        Hallo Stefan,

        same here. Falls das Problem damit behoben wird, würde mich das ebenfalls glücklich machen, für tiefere Analysen/Operationen fehlt mit im Moment aber einfach die Zeit.

        Schöne Grüße
        Christian

        Kommentar


          #5
          Hallo Christian,

          bitte Ticket eröffnen mit Vorname, Name, WG-Nummer, Telefon, eMail und kurzer Beschreibung / Link auf diesen Thread und dass Du Vorab-Patch haben willst, dann bekommst die entsprechende Info.

          lg

          Stefan

          Kommentar


            #6
            Zur Ergänzung: Jockel hat das Pre-Release der nächsten Version bekommen und damit waren - nach kurzem Test - die Probleme mit dem Socket soweit behoben.

            Hinweis: Wir haben mittlerweile mehrere Kunden mit Nutzung der Socket-Kommunikation unter den Beta-Testern, so dass künftig ein solcher Bug m Beta-Test auffallen sollte und nicht in einem Release rausgeht.

            lg

            Stefan

            Kommentar


              #7
              Bei Patchlevel 39.0.16.1 funktionierte Socat mit meinem Zählerplugin auch nicht. Mit Version 1.1.5 scheint es wieder zu funktionieren.

              Kommentar

              Lädt...
              X