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:
Die Sourcen des Plugins (Vorlage stammt aus dem Forum):
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
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;


Kommentar