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 Thema Manuel/Zeit habe ich schon angefragt.
Ansonsten wurde von Patrick die Änderungen nach Bedarf dem Plugin eingeführt.
Ich hätte auch Verwendung für die reine Motorsteuerung.
Wäre für den Sommern, wenn Fenster offen sind ggf. ein nützliches Feature.
Ich habe nichts gegen solche Erweiterungen und werde euch auch gerne dabei unterstützen. Nur kann ich ohne Protokollbeschreibung der gewünschten Befehle nicht weiterhelfen. Wenn ihr da etwas heraus findet werde ich das auch gerne integrieren
klar!
Habe die Anfrage der Parameter an see-solution gestellt.
Und promt eine Antwort erhalten.
Es gibt aber nur einen verdacht, dass das Kommando 0x37 die Funktionen auslösen könnte.
Demnach müsste über Byte [2] (Modus) die Ventilatorsteuerung geschehe. Über die Ease wäre das dann aber
1.drücken Zuluft; 2. drücken Abluft; 3. drücken beide und wieder von vorn
bzw. Byte[3] (Uhr) für die Umstellung "Auto" auf "manuell"
Das ganze würde somit nur sinn machen, auch das Kommando 0x3c -die Rückmeldung-mit auszugeben.
Habe die Anfrage der Parameter an see-solution gestellt.
Und promt eine Antwort erhalten.
Hups,
dann hatten wohl mindestens zwei die gleiche Idee...
Jedenfalls habe ich auch Antwort bekommen mit einer zusätzlichen Tabelle und dem Verweis auf die im Netz stehende Protokollbeschreibung.
Aber ich denke ihr seid dann schon auf dem neuesten Stand
Aber ich denke ihr seid dann schon auf dem neuesten Stand
Die Tabelle habe ich nicht und meine Protokollbeschreibung datiert vom 12.2.2012; falls es was Neueres gibt, wäre es sinnvoll, dies hier zu veröffentlichen oder zumindest den Link auf die öffentlich zugängliche Version
Beste Grüsse
Diego
Das Plugin befindet sich gerade in der letzten Testphase. Die Rückmeldung wurde in dieser Version nicht umgesetzt. Das ist für den Moment auch die letzte Version mit der aktuellen Struktur. Es laufwn bereits Vorbereitungen für eine komplete Überarbeitung. Danach ist angedacht, dass jeder selber relativ leicht das Plugin um die für ihn wichtigen Abfragen erweitern kann. Mehr kann und darf ich im Moment noch nicht sagen.
Für mich hat erst mal Priorität bis ende Monat die neue Version mit Moxa-Anbindung zu veröffentlichen.
Selbst verständlich Nun kann jeder wählen ob er seine KWL direkt mit dem WG verbinden möchte oder lieber über einen Moxa und das Netzwerk steuern möchte Es sind noch ein paar andere kleine Änderungen und strukturelle Anpassungen vorgenommen worden. Allerdings sind damit ausser der Moxaanpassung keine neuen Funktionen hinzu gekommen. Es wurde nur der Weg für eigene Erweiterungen vorbereitet. Die übernächste Version soll dann ganz individuell anpassbar sein. Dann solle es für jeden leicht möglich sein eigene Abfragen zu integrieren ohne sich mit der internen Datenstruktur und der Kommunikation befassen zu müssen.
-> Das ist aber erst noch in der gedanklichen Ausarbeitung und wird noch einige Zeit dauern. Vor allem auch weil es in Zusammenarbeit mit Fechter65 geschehen wird, und wir dass beide nur nebenbei machen können
Wenn du da wirklich ein dringendes Anliegen hast, können wir ja darüber sprechen und gemeinsam schauen ob wir das als "Quick-Hack" bei dir integrieren können. Aber gross Erweiterungen an dem Plugin würde ich vorerst nicht mehr machen wollen, da es dann mit der neuen Struktur ohnehin für die Tonne wäre
Wenn du da wirklich ein dringendes Anliegen hast, können wir ja darüber sprechen und gemeinsam schauen ob wir das als "Quick-Hack" bei dir integrieren können.
Ich suche halt einer Lösung, dass ich angezeigt bekomme, auf welcher Stufe die Lüftung gerade läuft. Mittelfristig wäre das IMHO ganz sinnvoll, da ich im Moment nur anhand der Lüfterdrehzahlen und am evtl. vorhandenen Betriebsgeräusch erahnen kann was Sache ist. Es wäre sicher auch möglich in der CV dieses Problem anzugehen nur leider bis dato nicht über den eingebauten Editor.
Ich habe nochmals nachgesehen. Diego hat dich bereits erhöhrt und eine entsprechende Funktion eingebaut. -> Er hat esmal erwähnt aber bei der Menge an Ämderungen/Verbesserungen die er am Plugin durchgeführt hat habe ich das schon wieder total vergessen. Sorry
Also sollte auch für dich was drin sein.
Allerdings gibt es gerade im Moment noch ein paar kleine Probleme mit der seriellen Abfrage der Daten. Da läuft momentan etwas nicht so wie es sollte. Desshalb wird es auch noch ein paar Tage dauern
Soo...Ich bin mir nun sicher dass die neue Version sehr Stabil läuft. Desshalb hier mal die neue Version 1.6
Dass wird vermutlich in dieser Art das letzte Update sein ausser Bugfix Der grund ist einfach...
Diego arbeitet gerade an einer kompleten Restrukturierung des Plugins. Damit sollte es, wenn es dann mal fertig ist auch einfach möglich sein eigene Abfragen einzubauen. Damit kann dann jeder genau die Parameter auslesen, die er möchte.
Aber hier erst mal die neue 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 = ''; #GA DPT 5.005 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){
if ($Kom_Art eq "S"){
$seriel->write($ack); #ACK senden
} elsif ($Kom_Art eq "M"){
syswrite($socket[$socknum], $ack); #ACK senden
}
if($debug>=2){plugin_log($plugname,'ACK senden');}
last;
}
}#Ende While
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
Und die erweiterte conf.d...
Jeder der dasPlugin schon mit einer angepassten conf.d betreibt, kann einfach die neuuen Parameter im unteren Teil der Konfig einfügen
Code:
####################
###Einstellungen:###
####################
#Erzeuge Variablen fuer die Zuordnung der Steuerfunktionen zu den Gruppenadressen:
$ga_stufeabwesend = ''; #1bit Trigger fuer Stufe "Abwesend". 1=Aktivieren
$ga_stufe1 = ''; #1bit Trigger fuer Stufe1. 1=Aktivieren
$ga_stufe2 = ''; #1bit Trigger fuer Stufe2. 1=Aktivieren
$ga_stufe3 = ''; #1bit Trigger fuer Stufe3. 1=Aktivieren
$ga_komforttemp = ''; #GA DPT 9.001 zum setzen der Komforttemperatur
$ga_reset_filter = ''; #1bit Trigger fuer das Zuruecksetzen des Betriebsstundenzaehlers des Filters. 1=Reset
$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)
$ga_status_ventilator_zul = ''; #GA DPT5.001 fuer Status Ventilator Zuluft %
$ga_status_ventilator_abl = ''; #GA DPT5.001 fuer Status Ventilator Abluft %
$ga_status_bypass_prozent = ''; #GA DPT5.001 fuer Status Bypassklappe %
$ga_betriebsstunden_filter = ''; #GA DPT16.000 fuer die Rueckmeldung der Betribsstunden des Filters
$ga_zustand_badschalter = ''; #GA DPT1.001 fuer die Rueckmeldung des Zustandes des Badezimmerschalters
$ga_fehler_filter = ''; #GA DPT 1.001 fuer den Zustand des Filters. 0=OK, 1=Filter Voll
$ga_fehlercode = ''; #GA DPT 16.000 fuer die Ausgabe des Fehlercodes als Text
$ga_aktstufe = ''; #GA DPT 5.005 Wert für aktuelle Stufe
#Hier werden die Gruppenadressen für die Temperaturen vergeben: (Nicht vergeben=inaktiv)
$ga_aul_temp = ''; #GA DPT 9.001 für die Aussenlufttemperatur
$ga_zul_temp = ''; #GA DPT 9.001 für die Zulufttemperatur
$ga_abl_temp = ''; #GA DPT 9.001 für die Ablufttemperatur
$ga_fol_temp = ''; #GA DPT 9.001 für die Fortlufttemperatur
#Zuordnung der Namen fuer die RRD's:
$Name_rrd_AUL = 'KWL_Aussenluft'; #Name RRD Aussenluft
$Name_rrd_ZUL = 'KWL_Zuluft'; #Name RRD Zuluft
$Name_rrd_ABL = 'KWL_Abluft'; #Name RRD Abluft
$Name_rrd_FOL = 'KWL_Fortluft'; #Name RRD Fortluft
#Pfad zur seriellen Schnittstelle oder dem USB-Seriell-Wandler:
$schnittstelle = '/dev/ttyUSB-1-1';
### Neu in Version 1.6###
#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 = ""; # Eindeutige Nummer des Sockets
$send_ip = ""; # SendeIP (UDP)
$send_port = ""; # Sendeport (UDP)
$recv_ip = ""; # EmpfangsIP (UDP)
$recv_port = ""; # Empfangsport (UDP)
# Kommunikationsart
$Kom_Art = "S"; # "S" = seriell; "M" = Moxa
# Dauer einer Abfrage
$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)
$debug=1;
######################
##ENDE Einstellungen##
######################
@Lio: Dass mit dem Bypas muss ich mir nochmals genauer anschauen. Leider fehlt mir im moment etwas die Zeit.
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