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.
Das hängt etwas davon ab, was du sonnst noch alles auf dem WG parallel laufen lasen willst. Wenn da noch ein paar weitere zeitaufwändige Plugins oder mehrere MPD nebenher laufen sollen, wird es wohl nicht mehr so toll laufen. Aber prinzipiell kann das Plugin problemlos auch 3 mal ausgeführt werden. Ich kenne da jemanden der das so hat
Hab das ganze erfolgreich mit einer Moxa 5110 umgesetzt.
Hi
kannst du mir mal deine Konfig posten - sowohl vom Plugin als auch vom Moxa?
Ich hab einen Moxa 5110 hier - aber noch nie in Betrieb gehab... und würde mir gerne das Konfigurations-gefummel ersparen :-)
Mit dem Strom: hast du da mittlerweile eine Lösung?
Gruß
Thorsten
Konkrete Nachfragen:
Was ich ich im Moxa unter "Serial Settings" einstellen? (Baurdrate 9600 8N1 Flow Control RTS/CTS,FIFO enable? Port-Alias?)
Wie muss ich die Serielle Schnittstelle im Plugin konfigurieren? (my $schnittstelle = '/??????'
Was habe ich konfiguriert: Moxa/Operations mode eingestellt auf: UDP-Mode
Destination Adress auf Wireagate-IP, Port 16011, Local Listen Port 16012
Wenn ich es jetzt richtig verstanden habe muss das Plugin auch angepasst werden damit es über den Socket arbeitet.
Sind diese Änderungen schon irgendwo im Repository, oder ist das "Custom-Code" ?
Hi
ich habe jetzt den Code aus Post #90 genommen (1.6 beta).
Dazu folgende Config:
Code:
#Pfad zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
$schnittstelle = '/dev/ttyUSB-1-1';
#Angaben für die Kommunikation über den UDP-Port einer MOXA [diese Einstellungen reichen aus, d.h. auf dem Wiregate muss unter "Seriell/LAN/Socketverbindungen" KEINE Socketverbindung erstellt werden
$socknum = "92"; # Eindeutige Nummer des Sockets
$send_ip = "192.168.0.151"; # SendeIP (UDP)
$send_port = "16012"; # Sendeport (UDP)
$recv_ip = "192.168.0.136"; # EmpfangsIP (UDP)
$recv_port = "16011"; # Empfangsport (UDP)
# Kommunikationsart
$Kom_Art = "M"; # "S" = seriell; "M" = Moxa
# Dauer einer Abfrage
$Zaehler = "250"; #Mit dieser Variable Zaehler wird beeinflusst, wie lange das Plugin auf den Abschluss einer Rückmeldung der KWL wartet; empfohlener Wert für seriell: 2'500; für Moxa: 250
# Debug level 0 = nur die wichtigsten Infos, 1 = Alle Zustaende, 2 = Rohdaten (nur für Fehlersuche)
$debug=1;
Das Log besagt, dass überhaubt keine Daten im Plugin ankommen. Könnte es sein, dass es mit der Einstellung "Flow Control" im Moxa zu tun hat? Da sollte warscheinlich Non stehen.
Hm - heute auf NONE umgestellt.
Einiges geht - aber nicht alles. Ich bekomme jede menge Read-errors (checksum errors) - aber zwischendurch auch mal wieder gute Ergebnisse.
Irgendwelche Tipps woran ich optimieren kann?
Mit $Zaehler = "250" habe ich schon gespielt - sowohl 150 als auch 500 und 2500 hat nicht wirklich einen unterschied gemacht....
Hmm... Was meint denn das Log, wenn du in der config mal auf $debug = 3 setzt? Dann müsste man die empfangenen Rohdaten im Log sehen. Vieleicht sieht man dann, was nicht passt.
Was meist du mit checksum error? Dass gar nix empfangen wurde oder dass die Checksumme einfach falsch berechnet wurde? Und was läuft noch paralell auf dem WG?
Nochmal kurz etwas zum Anschluss an das Wiregate, bevor ich was falsches bestelle...
auf jeden Fall benötige ich den Seriell/RS232 auf USB-Wandler...
und dann entweder ein Nullmodem-Kabel mit Buchse auf Stecker(wenn der Wandler am WG steckt) - was auch schwer erhältilich ist, da Nullmodem normalerweise Buchse auf Buchse ist
oder
USB-Verlängerung(wenn der Wandler an der ComfoAir steckt)
Bitte berichtigt mich falls ich falschl liege...
Danke
PS: hab eine Zehnder ComfoAir 200 L Luxe, wurde die auch schon mit dem Plugin getestet?
PPS: Hab hier(ComfoAir in CometVisu) noch was gepostet das hier einige betreffen könnte
cu Yfkt5A
DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin
Dass du so viele Logeinträge hast, ist normal. Daraus ist die gesammte Kommunikation und Verarbeitung der Daten ersichtlich. Die Pluginlogs zentral ein-/ausschaltbar zu machen war eine der besten Ideen, die ich zur Fehlersuche hatte...
Also zu deinem Log...
Daraus geht hervor, dass an einer Stelle die Kommunikation mit der KWL komplet zusammenbricht. Ob dies nun an der ComfoAir, dem Moxa/Netzwerk oder dem Soket/WG liegt, kann ich erst mal nicht sagen. Aber es bringt mich auf eine Idee...
Das Problem ist, dass die Comfoair auf jeden fall ein Ack nach jedem Datenpaket das sie sendet erwartet. Solange kein Ack kommt, stellt sich die Comfoair tot. Das scheint aus dem Pluginlog auch genau so hervor zu gehen...
- ComfoAir sendet Daten die nicht vollständig im Plugin ankommen
- Das Plugin wartet auf weitere Daten und vor allem das Endzeichen
- Da das Endzeichen nicht auftaucht greift die Sicherheitsschleife und bricht den empang ab...
- Beim abbrechen wird kein ACK an die KWL gesendet (ein NACK ist mir leider nicht bekannt)
- Da die KWL kein ACK bekommt, wartet sie eine Ewigkeit auf das ACK
- Solange die Comfoair ihr ACK nicht bekommen hat, reagiert sie auch auf keine weiteren Anfragen, was im Plugin immer wieder zu leeren Daten und Checksummenfehler führt...
Workaround (nicht schön aber sollte helfen): ACK auch beim erreichen des Timeout und unvollständigem Datenpaktet damit beim nächten Abfragen die Changse besteht, wieder valide Werte zu erhalten.
Probiere mal folgende modifizierte Version:
Code:
# Plugin zur Ansteuerung einer Zender ComfoAir
# Version 1.6 28.11.2012 BETA
# Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
# Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
# - Neu mit der Moeglichkeit zur Anbindung über einen Moxa NPort von Fechter65 (https://knx-user-forum.de/members/fechter65.html)
# - Neustrukturierung des Codes von Fechter65 (https://knx-user-forum.de/members/fechter65.html)
####################
###Einstellungen:###
####################
#BITTE ab sofort die Einstellungen unter conf.d vornemen. Damit bleiben die Einstellungen auch bei einem Update erhalten.
######################
##ENDE Einstellungen##
######################
#Ab hier nichts mehr aendern.
#Hauptverarbeitung
#Erzeuge Variablen fuer die Zuordnung der Steuerfunktionen zu den Gruppenadressen:
my $ga_stufeabwesend = ''; #1bit Trigger fuer Stufe "Abwesend". 1=Aktivieren
my $ga_stufe1 = ''; #1bit Trigger fuer Stufe1. 1=Aktivieren
my $ga_stufe2 = ''; #1bit Trigger fuer Stufe2. 1=Aktivieren
my $ga_stufe3 = ''; #1bit Trigger fuer Stufe3. 1=Aktivieren
my $ga_komforttemp = ''; #GA DPT 9.001 zum setzen der Komforttemperatur
my $ga_reset_filter = ''; #1bit Trigger fuer das Zuruecksetzen des Betriebsstundenzaehlers des Filters. 1=Reset
my $ga_reset_error = ''; #1bit Trigger fuer das zuruecksetzen der KWL nach einem Fehler. 1=Reset
#Hier werden die Gruppenadressen fuer die Rueckmeldungen vergeben: (Nich vergeben = inaktiv)
my $ga_status_ventilator_zul = ''; #GA DPT5.001 fuer Status Ventilator Zuluft %
my $ga_status_ventilator_abl = ''; #GA DPT5.001 fuer Status Ventilator Abluft %
my $ga_status_bypass_prozent = ''; #GA DPT5.001 fuer Status Bypassklappe %
my $ga_betriebsstunden_filter = ''; #GA DPT16.000 fuer die Rueckmeldung der Betribsstunden des Filters
my $ga_zustand_badschalter = ''; #GA DPT1.001 fuer die Rueckmeldung des Zustandes des Badezimmerschalters
my $ga_fehler_filter = ''; #GA DPT 1.001 fuer den Zustand des Filters. 0=OK, 1=Filter Voll
my $ga_fehlercode = ''; #GA DPT 16.000 fuer die Ausgabe des Fehlercodes als Text
my $ga_aktstufe = ''; #Wert für aktuelle Stufe
#Hier werden die Gruppenadressen für die Temperaturen vergeben: (Nicht vergeben=inaktiv)
my $ga_aul_temp = ''; #GA DPT 9.001 für die Aussenlufttemperatur
my $ga_zul_temp = ''; #GA DPT 9.001 für die Zulufttemperatur
my $ga_abl_temp = ''; #GA DPT 9.001 für die Ablufttemperatur
my $ga_fol_temp = ''; #GA DPT 9.001 für die Fortlufttemperatur
#Zuordnung der Namen fuer die RRD's:
my $Name_rrd_AUL = 'KWL_Aussenluft'; #Name RRD Aussenluft
my $Name_rrd_ZUL = 'KWL_Zuluft'; #Name RRD Zuluft
my $Name_rrd_ABL = 'KWL_Abluft'; #Name RRD Abluft
my $Name_rrd_FOL = 'KWL_Fortluft'; #Name RRD Fortluft
#Pfad zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
my $schnittstelle = '/dev/ttyUSB-2-4';
#Angaben für die Kommunikation über den UDP-Port einer MOXA [diese Einstellungen reichen aus, d.h. auf dem Wiregate muss unter "Seriell/LAN/Socketverbindungen" KEINE Socketverbindung erstellt werden
my $socknum = ""; # Eindeutige Nummer des Sockets
my $send_ip = ""; # SendeIP (UDP)
my $send_port = ""; # Sendeport (UDP)
my $recv_ip = ""; # EmpfangsIP (UDP)
my $recv_port = ""; # Empfangsport (UDP)
# Kommunikationsart
my $Kom_Art = "S"; # "S" = seriell; "M" = Moxa
# Dauer einer Abfrage
my $Zaehler = "2500"; #Mit dieser Variable Zaehler wird beeinflusst, wie lange das Plugin auf den Abschluss einer Rückmeldung der KWL wartet; empfohlener Wert für seriell: 2'500; für Moxa: 250
# Debug level 0 = nur die wichtigsten Infos, 1 = Alle Zustaende, 2 = Rohdaten (nur für Fehlersuche)
my $debug=0;
#Weitere Variablen die benötigt werden -> NICHT verändern!
my $seriel;
my $sin; #Serial Input = Empangener Datenstrom
my $cin; #Counter Input = Länge des Datenpackets
my $laenge; #Länge des empfangenen Datenstrings nachdem kürzen
my $checksum = 0; #Checksumme
my @hex; #Hilfsarray für die Checksummenberechnung
my $x07warschon; #Hilfsvariable für die Checksummenberechnung
&readConf(); #conf.d einlesen
my $return_value2;
my $daten;
my $reciv;
my $reciv_all;
my $ack = pack("H*","07F3");
my $rcv_checksum;
# Zyklischer Aufruf nach restart, empfang GA oder nach einstellung rrd (typisch 300sek).
$plugin_info{$plugname.'_cycle'} = 300;
use Device::SerialPort;
#Einrichten der Seriellen Schnittstelle fuer die Kommunikation mit dem ComfoAir falls Schnittstelle auf "S" steht
if ($Kom_Art eq "S"){
$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')};
}elsif ($Kom_Art eq "M"){
if (!$socket[$socknum]) { # socket erstellen
$socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
Proto => "udp",
LocalAddr => $recv_ip,
PeerPort => $send_port,
PeerAddr => $send_ip,
ReuseAddr => 1
)
or return ("open of $recv_ip : $recv_port failed: $!");
$socksel->add($socket[$socknum]); # add socket to select
$plugin_socket_subscribe{$socket[$socknum]} = $plugname; # Plugin an Socket "anmelden"
return "opened Socket $socknum";
if($debug>=1){plugin_log($plugname,'Socket: ' . $socknum . ' erfolgreich geöffnet')};
}
}
if ($msg{'apci'} eq "A_GroupValue_Write"){ #Wenn ein Telegramm vom KNX empfangen wird, ab hier auswerten
if ($msg{'dst'} eq $ga_stufeabwesend && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00990101";
plugin_log($plugname,'Stufe abwesend setzen');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_stufe1 && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00990102";
plugin_log($plugname,'Stufe 1 setzen');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_stufe2 && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00990103";
plugin_log($plugname,'Stufe 2 setzen');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_stufe3 && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00990104";
plugin_log($plugname,'Stufe 3 setzen');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_komforttemp) {
my $komforttemp = knx_read($msg{'dst'},0,9.001);
plugin_log($plugname,'Komforttemp auf: ' . $komforttemp . '°C setzen');
my $temphex = ($komforttemp + 20)*2; #Rechne die Temperatur fuer die ComfoAir um
$temphex = sprintf "%x" , $temphex; # Mache aus Integer HEX
$daten = "00D301" . $temphex;
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_reset_filter && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00DB0400000001";
plugin_log($plugname,'Filter zurücksetzen');
$return_value2 = command_senden($daten);
}elsif ($msg{'dst'} eq $ga_reset_error && knx_read($msg{'dst'},0,1) == 1) {
$daten = "00DB0401000000";
plugin_log($plugname,'Fehler zurücksetzen');
$return_value2 = command_senden($daten);
}
if($debug>=2){plugin_log($plugname,'ENDE Aufruf durch GA');}
return;
} else { # zyklischer Aufruf
# Plugin an Gruppenadresse "anmelden", hierdurch wird das Plugin im folgenden bei jedem eintreffen eines Telegramms auf die GA aufgerufen und der obere Teil dieser if-Schleife durchlaufen
$plugin_subscribe{$ga_stufeabwesend}{$plugname} = 1;
$plugin_subscribe{$ga_stufe1}{$plugname} = 1;
$plugin_subscribe{$ga_stufe2}{$plugname} = 1;
$plugin_subscribe{$ga_stufe3}{$plugname} = 1;
$plugin_subscribe{$ga_komforttemp}{$plugname} = 1;
$plugin_subscribe{$ga_reset_filter}{$plugname} = 1;
$plugin_subscribe{$ga_reset_error}{$plugname} = 1;
$daten = "00D100";
plugin_log($plugname,'Temperatur abrufen');
$return_value2 = command_senden($daten);
if($ga_status_ventilator_zul && $ga_status_ventilator_abl){ #Nur wenn beide GA's vergeben sind, dann die Zust?nde der Ventilatoren abfragen
$daten = "000B00";
if($debug>=1){plugin_log($plugname,'Ventilator Status abrufen');}
$return_value2 = command_senden($daten);
}
if($ga_status_bypass_prozent){ #Nur wenn die GA vergeben ist, dann Zustand Bypassklappe abfragen
$daten = "000D00";
if($debug>=1){plugin_log($plugname,'Bypass Zustand abrufen');}
$return_value2 = command_senden($daten);
}
if($ga_betriebsstunden_filter){ #Nur wenn die GA vergeben ist, die Betriebsstunden abfragen
$daten = "00DD00";
if($debug>=1){plugin_log($plugname,'Betriebsstunden abrufen');}
$return_value2 = command_senden($daten);
}
if($ga_zustand_badschalter){ #Nur wenn die GA vergeben ist, die Binaereingaenge abfragen
$daten = "000300";
if($debug>=1){plugin_log($plugname,'Binäreingänge abrufen');}
$return_value2 = command_senden($daten);
}
if($ga_aktstufe){ #Nur wenn die GA vergeben ist, die Ventilationsstufe abfragen
$daten = "00CD00";
if($debug>=1){plugin_log($plugname,'Ventilationsstufe abrufen');}
$return_value2 = command_senden($daten);
}
#Hier werden die Stoermeldungen abgefragt
$daten = "00D900";
if($debug>=1){plugin_log($plugname,'Störungen abrufen');}
$return_value2 = command_senden($daten);
if($debug>=2){plugin_log($plugname,'ENDE Zyklische Abfrage');}
return;
}
# Ab hier wird das Datenpaket inklusive Checksumme zusammengestellt und an die ComfoAir uebertragen
sub command_senden{
my $data = $_[0];
if($debug>=2){plugin_log($plugname,'data: ' . $data);}
$checksum = checksum_berechnen($data);
if($debug>=2){plugin_log($plugname,'Checksumme aus der Subroutine: '.$checksum);}
my $command = pack("H*","07F0" . $data . $checksum . "070F");
my $commandhex = $command;
$commandhex =~ s/(.)/sprintf("0x%x ",ord($1))/eg;
if($debug>=2){plugin_log($plugname,'transmit: ' . $commandhex);} #Zeigt im Pluginlog das fertige Datenpaket, dass uebertragen wird
if ($Kom_Art eq "S"){
$seriel->write($command); #Befehl an die ComfoAir senden
} elsif ($Kom_Art eq "M"){
$plugin_info{$plugname.'_debug'} = $command;
syswrite($socket[$socknum], $command);
}
$reciv = '';
$|=1;
my $exit=0;
while($exit < $Zaehler)
{
if ($Kom_Art eq "S"){
($cin, $sin) = $seriel->read(45);
}elsif ($Kom_Art eq "M"){
$sin ='';
if ($fh) { # Antwort auslesen
recv($fh,$sin,80,0);
}
$cin = length($sin);
}
if($cin > 0){
$sin = unpack "H*", $sin;
$reciv .= $sin;
$exit=0;
}else{
$exit++
}
if($debug>=2){plugin_log($plugname,'reciv-direkt: ' . $sin);}
if($reciv =~ /070f/i){
last;
}
}#Ende While
if ($Kom_Art eq "S"){
$seriel->write($ack); #ACK senden
if($debug>=2){plugin_log($plugname,'ACK senden');}
} elsif ($Kom_Art eq "M"){
syswrite($socket[$socknum], $ack); #ACK senden
if($debug>=2){plugin_log($plugname,'ACK senden');}
}
while ((length($reciv) > 3) && (substr($reciv,(length($reciv)-4),4) ne '070f')) #solange das Ende nicht 070f lautet
{
if($debug>=2){plugin_log($plugname,'String vor Kuerzung Ende: '.$reciv);}
$reciv = substr($reciv,0,-4); #String um die letzten vier Zeichen kürzen
if($debug>=2){plugin_log($plugname,'String nach Kuerzung Ende: '.$reciv);}
}
#Hier wird der empfangene String um Start- und Endbyte gekürzt
$laenge = length($reciv); #Laenge des Antworttelegramms ermitteln
$reciv = substr($reciv,0,($laenge-4));
if($debug>=2){plugin_log($plugname,'String ohne 07f3: '.$reciv);}
my $test = substr($reciv,0,4);
if($debug>=2){plugin_log($plugname,'Erste 4 Byte des Datenpakets: '.$test);}
while ( $test eq '07f3' or $test eq '07f0' ){
$reciv = substr($reciv,4); #falls noch ein 07f3 oder 07f0 am Anfang des Strings enthalten ist, wir dieses hier entfernt.
if($debug>=2){plugin_log($plugname,'reciv gekuerzt: '.$reciv);}
$test = substr($reciv,0,4);
if($debug>=2){plugin_log($plugname,'NEU. Erste 4 Byte des Datenpakets: '.$test);}
}
#Nun wird die Checksumme gelesen und aus dem Datenstring entfernt
$checksum = 0;
$checksum = substr($reciv,-2,2);
if($debug>=2){plugin_log($plugname,'Checksumme gelesen: '.$checksum);}
$laenge = length($reciv); #Laenge des Antworttelegramms ermitteln
$reciv = substr($reciv,0,($laenge-2));
if($debug>=2){plugin_log($plugname,'Datenpaket ohne Checksumme: '.$reciv);}
#Hier wird die Subroutine für die Berechnung der Checksumme aufgerufen und das Ergebnis in $rcv_checksum zurück gegeben
$rcv_checksum = checksum_berechnen($reciv);
if($rcv_checksum eq $checksum){ #Hier wird geprüft ob die Checksumme korrekt ist
if($debug>=2){plugin_log($plugname,'Checksumme OK ');}
if($reciv =~ /00D209/i){ #Wenn die Temperaturen empfangen wurden und die Laenge passt
my $t1 = substr($reciv,8,2);
my $t2 = substr($reciv,10,2);
my $t3 = substr($reciv,12,2);
my $t4 = substr($reciv,14,2);
#Hier werden die Temperaturen "decodiert" damit sie einen Sinn ergeben
$t1 = (hex($t1)/2)-20;
$t2 = (hex($t2)/2)-20;
$t3 = (hex($t3)/2)-20;
$t4 = (hex($t4)/2)-20;
#Wenn die GA's vergeben wurde, die Temperaturen auf die GA's senden
if($ga_aul_temp ne ''){knx_write($ga_aul_temp,$t1,9.001);}
if($ga_zul_temp ne ''){knx_write($ga_zul_temp,$t2,9.001);}
if($ga_abl_temp ne ''){knx_write($ga_abl_temp,$t3,9.001);}
if($ga_fol_temp ne ''){knx_write($ga_fol_temp,$t4,9.001);}
#Ab hier werden die RRD's mit den aktuellen Temperaturen aktualisiert:
update_rrd($Name_rrd_AUL,"",$t1);
update_rrd($Name_rrd_ZUL,"",$t2);
update_rrd($Name_rrd_ABL,"",$t3);
update_rrd($Name_rrd_FOL,"",$t4);
plugin_log($plugname,'AUL: ' . $t1 . '°C, ZUL:' . $t2 . '°C, ABL: ' . $t3 . '°C, FOL: ' . $t4 . '°C');
}elsif($reciv =~ /000C06/i){ #Wenn der Status fuer die Ventilatoren empfangen wurden
my $vent_zul = substr($reciv,6,2);
my $vent_abl = substr($reciv,8,2);
plugin_log($plugname,'ZUL: ' . hex($vent_zul) . '% ABL: ' . hex($vent_abl) . '%');
knx_write($ga_status_ventilator_zul,hex($vent_zul),5.001);
knx_write($ga_status_ventilator_abl,hex($vent_abl),5.001);
}elsif($reciv =~ /00CE0E/i){ #Wenn Status Ventilatorenstufe empfangen wurden
my $akt_stufe = substr($reciv,22,2);
plugin_log($plugname,'AKT_STUFE: ' . hex($akt_stufe));
knx_write($ga_aktstufe,hex($akt_stufe),5.005);
}elsif($reciv =~ /000E04/i){ #Wenn der Status fuer die Bypassklappe empfangen wurden
my $bypass_prozent = substr($reciv,6,2);
plugin_log($plugname,'Bypass: ' . hex($bypass_prozent) . '%');
knx_write($ga_status_bypass_prozent,hex($bypass_prozent),5.001);
}elsif($reciv =~ /00DE14/i){ #Wenn die Rueckmeldung der Betriebsstunden empfangen wurden
my $betriebsstunden_filter = substr($reciv,36,4);
plugin_log($plugname,'Betriebsstunden: ' . hex($betriebsstunden_filter) . 'h');
knx_write($ga_betriebsstunden_filter,hex($betriebsstunden_filter) . 'h',16.000);
}elsif($reciv =~ /000402/i){ #Wenn die Rueckmeldung der Binaereingaenge empfangen wurden
my $zustand_badschalter = substr($reciv,8,1);
plugin_log($plugname,'Zustand Badezimmerschalter: ' . $zustand_badschalter);
knx_write($ga_zustand_badschalter,$zustand_badschalter,1.001);
}elsif($reciv =~ /00DA11/i){ #Wenn die Rueckmeldung der Stoermeldungen empfangen wurden
my $fehlerAlo = substr($reciv,6,2);
my $fehlerAhi = substr($reciv,30,2);
my $fehlerE = substr($reciv,8,2);
my $fehlerFilter = substr($reciv,22,2);
my $fehlerEA = substr($reciv,24,2);
my $numAlo = 'A';
my $numAhi = 'A';
my $numE = 'A';
my $numEA = 'A';
$numAlo .= unpack("B*",pack("H*",$fehlerAlo));
$numAhi .= unpack("B*",pack("H*",$fehlerAhi));
$numE .= unpack("B*",pack("H*",$fehlerE));
$numEA .= unpack("B*",pack("H*",$fehlerEA));
$fehlerAlo = reverse($numAlo); #Wandle den Wert in Binaer und drehe die Reihenfolge um. z.B 0x02 = 00000010 = 010000000
$fehlerAlo = index($fehlerAlo,'1')+1; # Zaehle an welcher Stelle die 1 auftaucht (von links gelesen) z.B. 01000000 = INDEX 2 = Fehler2
if($fehlerAhi ne '00'){
$fehlerAhi = index(reverse($numAhi),'1')+9;
}else{
$fehlerAhi = '';
}
$fehlerE = index(reverse($numE),'1')+1;
$fehlerEA = index(reverse($numEA),'1')+1;
if($fehlerAhi == 16){$fehlerAhi = 0;}
if($ga_fehlercode){ #Wenn die GA fuer das uebertragen den Fehlercodes eingertagen wurde, ab hier auswerten
if($fehlerAlo > 0){
plugin_log($plugname,'Aktueller Fehlercode: A' . $fehlerAlo);
knx_write($ga_fehlercode,'A' . $fehlerAlo,16.001);
}elsif($fehlerAhi ne ''){
plugin_log($plugname,'Aktueller Fehlercode: A' . $fehlerAhi);
knx_write($ga_fehlercode,'A' . $fehlerAhi,16.001);
}elsif($fehlerE > 0){
plugin_log($plugname,'Aktueller Fehlercode: E' . $fehlerE);
knx_write($ga_fehlercode,'E' . $fehlerE,16.001);
}elsif($fehlerEA > 0){
plugin_log($plugname,'Aktueller Fehlercode: EA' . $fehlerEA);
knx_write($ga_fehlercode,'EA' . $fehlerEA,16.001);
}else{
plugin_log($plugname,'Aktueller Fehlercode: keiner' );
knx_write($ga_fehlercode,'keiner' . $fehlerEA,16.001);
}
}
if(hex($fehlerFilter) > 0){
plugin_log($plugname,'Aktueller Fehler: Filter Voll');
knx_write($ga_fehler_filter,1,1);
}else{
knx_write($ga_fehler_filter,0,1);
}
}
}else{
if($debug>=1){plugin_log($plugname,'Checksumme fehlerhaft! Gelesen: '.$checksum.' Berechnet: '.$rcv_checksum);}
}
} #ENDE Sub command_senden
sub checksum_berechnen {
my $chk_datasum = $_[0];
$rcv_checksum =0;
my $i;
$chk_datasum = $chk_datasum . "AD"; #+173 fuer die Checksummenberechnung
if($debug>=2){plugin_log($plugname,'String für die Berechnung der Checksumme: '.$chk_datasum);}
$x07warschon = 0;
$laenge = length($chk_datasum);
for($i = 0; $i< $laenge; $i++) {
my $wertstring = substr($chk_datasum,$i,2);
if($debug>=3){plugin_log($plugname,'Zahl: '.$wertstring);}
my $wertbetrag = hex($wertstring);
if ($wertbetrag == 7) {
if ($x07warschon == 1) {
$x07warschon = 0;
$i++;
next;
} else {
$x07warschon = 1;
}
}
$rcv_checksum += $wertbetrag;
if($debug>=3){plugin_log($plugname,'Summe: '.$rcv_checksum);}
$i++;
}
if($debug>=3){plugin_log($plugname,'Summe def: '.$rcv_checksum);}
if($debug>=2){plugin_log($plugname,'Checksumme vor der Umwandlung: '.$rcv_checksum);}
$rcv_checksum = sprintf "%x\n" , $rcv_checksum; #Mache aus Integer wieder HEX
if($debug>=2){plugin_log($plugname,'Checksumme vor der Kürzung: '.$rcv_checksum);}
$rcv_checksum = substr($rcv_checksum,-3,2); #Verwende nur die letzten beiden Stellen
if($debug>=2){plugin_log($plugname,'Checksumme nach der Kürzung: '.$rcv_checksum);}
return $rcv_checksum;
} #Ende checksum_berechnen
sub readConf
{
my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
if (! -f $confFile)
{
plugin_log($plugname, " no conf file [$confFile] found!");
}
else
{
if($debug>=1){plugin_log($plugname, " reading conf file [$confFile].");}
open(CONF, $confFile);
my @lines = <CONF>;
close($confFile);
my $result = eval("@lines");
($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
if ($@)
{
if($debug>=1){plugin_log($plugname, " conf file [$confFile] returned:");}
my @parts = split(/\n/, $@);
if($debug>=2){plugin_log($plugname, " --> $_") foreach (@parts);}
}
}
} # readConf
Du bist meines wissens der erste mit einer ComoAir 200 Luxe aber da die auch mit der selben CC EASE gesteuert wird wie die 350 und die 550 sollte die Steuerung über das Plugin trotzdem möglich sein.
Sieht auf den ersten Blick wesentlich besser aus. Stelle mal debug zurück auf 1 und lass das mal so weiterlaufen. Wenn da wieder "Lücken" auftreten sind die da auch zu erkennen. Zumal das Protokoll nicht mehr so mit Informationen überschwemmt wird
@Thorsten: Tut mir leid, habs jetzt erst gesehen, sonst hätte ich dir gerne die Einstellungen von der Moxa gegeben. Hast es aber ja dann eh wie ich damals auch bewätigt
@Patrik: jetzt hab ich genau das gleiche Problem wie Thorsten! Alles lief schon super (vielen Dank dafür!!), bis vorgestern?! Da bin ich auf Update im Wiregate und er hat ein paar Kleinigkeiten geladen glaube ich.. könnte das daran liegen?
Hab jetzt mal die geänderte Version von dir eingespielt, nach wie vor kommen nur noch vereinzelt Werte, Schaltbefehle gehen gar nicht mehr.
Das zeigt der Log mit der 1.6 vom Dezember:
Code:
2013-04-05 19:48:15.084,Zehnder1,reciv-direkt: 00000000
2013-04-05 19:48:15.088,Zehnder1,reciv-direkt: 00000000
2013-04-05 19:48:15.096,Zehnder1,reciv-direkt: 98070f
2013-04-05 19:48:15.096,Zehnder1,ACK senden
2013-04-05 19:48:15.096,Zehnder1,String ohne 07f3: 07f307f000da11000000000000000000000000000000000098
2013-04-05 19:48:15.097,Zehnder1,Erste 4 Byte des Datenpakets: 07f3
2013-04-05 19:48:15.097,Zehnder1,reciv gekuerzt: 07f000da11000000000000000000000000000000000098
2013-04-05 19:48:15.097,Zehnder1,NEU. Erste 4 Byte des Datenpakets: 07f0
2013-04-05 19:48:15.097,Zehnder1,reciv gekuerzt: 00da11000000000000000000000000000000000098
2013-04-05 19:48:15.097,Zehnder1,NEU. Erste 4 Byte des Datenpakets: 00da
2013-04-05 19:48:15.097,Zehnder1,Checksumme gelesen: 98
2013-04-05 19:48:15.098,Zehnder1,Datenpaket ohne Checksumme: 00da110000000000000000000000000000000000
2013-04-05 19:48:15.098,Zehnder1,String für die Berechnung der Checksumme: 00da110000000000000000000000000000000000AD
2013-04-05 19:48:15.098,Zehnder1,Checksumme vor der Umwandlung: 408
2013-04-05 19:48:15.098,Zehnder1,Checksumme vor der Kürzung: 198
2013-04-05 19:48:15.099,Zehnder1,Checksumme nach der Kürzung: 98
2013-04-05 19:48:15.099,Zehnder1,Checksumme OK
2013-04-05 19:48:15.099,Zehnder1,Aktueller Fehlercode: keiner
2013-04-05 19:48:15.117,Zehnder1,ENDE Zyklische Abfrage
2013-04-05 19:48:50.554,Zehnder1,conf file [/etc/wiregate/plugin/generic/conf.d/Zehnder1.conf] returned result[1]
2013-04-05 19:48:50.555,Zehnder1,Temperatur abrufen
2013-04-05 19:48:50.558,Zehnder1,Checksumme fehlerhaft! Gelesen: Berechnet: ad
2013-04-05 19:48:50.559,Zehnder1,Ventilator Status abrufen
2013-04-05 19:48:50.562,Zehnder1,Checksumme fehlerhaft! Gelesen: Berechnet: ad
2013-04-05 19:48:50.562,Zehnder1,Bypass Zustand abrufen
2013-04-05 19:48:50.565,Zehnder1,Checksumme fehlerhaft! Gelesen: Berechnet: ad
2013-04-05 19:48:50.565,Zehnder1,Betriebsstunden abrufen
2013-04-05 19:48:50.569,Zehnder1,Checksumme fehlerhaft! Gelesen: Berechnet: ad
2013-04-05 19:48:50.569,Zehnder1,Binäreingänge abrufen
2013-04-05 19:48:50.572,Zehnder1,Checksumme fehlerhaft! Gelesen: Berechnet: ad
2013-04-05 19:48:50.572,Zehnder1,Ventilationsstufe abrufen
2013-04-05 19:48:50.575,Zehnder1,Checksumme fehlerhaft! Gelesen: Berechnet: ad
2013-04-05 19:48:50.576,Zehnder1,Störungen abrufen
2013-04-05 19:48:50.579,Zehnder1,Checksumme fehlerhaft! Gelesen: Berechnet: ad
2013-04-05 19:48:50.630,Zehnder1,conf file [/etc/wiregate/plugin/generic/conf.d/Zehnder1.conf] returned result[1]
2013-04-05 19:48:50.630,Zehnder1,Temperatur abrufen
2013-04-05 19:48:50.632,Zehnder1,Checksumme fehlerhaft! Gelesen: 6b Berechnet: 7b
2013-04-05 19:48:50.632,Zehnder1,Ventilator Status abrufen
2013-04-05 19:48:50.641,Zehnder1,Checksumme fehlerhaft! Gelesen: 26 Berechnet: 40
2013-04-05 19:48:50.641,Zehnder1,Bypass Zustand abrufen
2013-04-05 19:48:50.687,Zehnder1,Checksumme fehlerhaft! Gelesen: c1 Berechnet: 3e
2013-04-05 19:48:50.687,Zehnder1,Betriebsstunden abrufen
2013-04-05 19:48:50.737,Zehnder1,Betriebsstunden: 66h
2013-04-05 19:48:50.744,Zehnder1,Binäreingänge abrufen
2013-04-05 19:48:50.771,Zehnder1,Zustand Badezimmerschalter: 0
2013-04-05 19:48:50.773,Zehnder1,Ventilationsstufe abrufen
2013-04-05 19:48:50.812,Zehnder1,AKT_STUFE: 2
2013-04-05 19:48:50.815,Zehnder1,Störungen abrufen
2013-04-05 19:48:50.862,Zehnder1,Aktueller Fehlercode: keiner
Das ist der erweiterte Log mit der neusten Version von gestern:
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