Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem beim 1 Wire Versand auf KNX

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

    [wiregate] Problem beim 1 Wire Versand auf KNX

    Hallo,

    ich habe seit ein paar Monaten ein Wiregate am Laufen.
    Auf dem WG laufen derzeit:
    • Ein Busmaster mit derzeit 14 Sensoren
    • USB to KNX Schnittstelle
    • Comet Visu, aber noch in der Testphase
    • Plugins zum Speichern von Temp und Stromwerten
    • Plugin zum Versenden von E-Mail
    • Plugin für Timerfunktionen
    • Plugin für eine Kaminofensteuerung

    Dies alles sollte das WG eigentlich nicht ins Schwitzen bringen.
    Mein Problem ist die Kaminofensteuerung. Hier habe ich eine einfache Zweipunktregelung mit Hysterese implementiert. Der Gedanke war, dass die Temperatur vom Puffer mit der des Ofens verglichen wird und dann die Pumpe schaltet (was auch funktioniert). Hierzu habe ich die beiden Temp-Sensoren so eingestellt, dass sie alle 10 min einen Wert senden oder bei 2°K Änderung und im Plugin triggere ich auf diese Werte, was auch Funktioniert wenn der Wert mal gesendet wird. Jetzt wird der Wert leider eher zufällig gesendet, mal zweimal in der Minute der fast gleiche Wert, mal kommt ne halbe Stunde nichts obwohl der Ofen grade anheizt. Selbst wenn ich die Temperaturänderung rausnehme kommt der Wert eher sporadisch.
    Was zusätzlich zu beobachten ist, dass die aufgezeichnete KNX Buslast immer auf 0 einbricht und manchmal die Raumtemperaturwerte nicht mehr aufgezeichnet werden. Der KNX funktioniert weiter ohne merkliche Beeinträchtigung.
    Derzeit steht der Kesseltempwert auf 120s damit die Regelung überhaupt etwas macht. Wobei hier die Syncronisation mit der Puffertemp (ebenfalls 120s) nur selten klappt.
    Kesseltempwerte bei 120s:
    Code:
    2012-12-28 18:09:40.603,A_GroupValue_Write,1.1.200,2/6/0,16 1A,62.48,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:11:43.374,A_GroupValue_Write,1.1.200,2/6/0,16 1A,62.48,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:15:55.598,A_GroupValue_Write,1.1.200,2/6/0,16 0E,62,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:18:22.502,A_GroupValue_Write,1.1.200,2/6/0,16 07,61.72,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:20:52.733,A_GroupValue_Write,1.1.200,2/6/0,16 07,61.72,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:22:53.588,A_GroupValue_Write,1.1.200,2/6/0,16 01,61.48,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:27:19.716,A_GroupValue_Write,1.1.200,2/6/0,15 F5,61,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:34:22.578,A_GroupValue_Write,1.1.200,2/6/0,15 E2,60.24,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:39:45.317,A_GroupValue_Write,1.1.200,2/6/0,15 D5,59.72,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:44:45.396,A_GroupValue_Write,1.1.200,2/6/0,15 C9,59.24,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    2012-12-28 18:49:45.308,A_GroupValue_Write,1.1.200,2/6/0,15 BC,58.72,DPT_Value_Temp,9.001,0,low,7,T_DATA_XXX_REQ,0
    Abfragen der Werte im Plugin:
    Code:
    if ($msg{'apci'} eq "A_GroupValue_Write"){ #Wenn ein Telegramm vom KNX empfangen wird, ab hier auswerten
        #Es ist egal welches der beiden Telegramme Empfangen wurde
        #einlesen der Messwerte 
        my $KNX_Timeout=2*60*60;
        my $status_pumpe=knx_read($ga_status_pumpe_kamin,$KNX_Timeout,1);
        my $temp_puffer=knx_read($ga_puffertemp,300,9);
        my $temp_puffer2=knx_read($ga_puffertemp2,300,9);
        my $temp_kessel=knx_read($ga_kesseltemp,300,9);
        my $temp_TAS=knx_read($ga_tas_temp,0,9);
        my $temp_raum=knx_read($ga_raumtemp ,0,9);
    Das sind noch ein paar andere Tempwerte bei da ich bei einem TS3 noch die LED´s zum Zustand des Ofens schalte.

    Vielleicht findet jemand von euch den Fehler in der Einstellung.
    Wenn jemand noch mehr Daten braucht oder Rückfragen hat, immer her damit.

    Danke schonmal für die Hilfe im Voraus
    Viele Grüße
    Steffen

    #2
    Hallo Steffen,

    - welche USB to KNX Schnittstelle genau?
    - hat dieses Plugin schonmal funktioniert vorher wie gewünscht oder sind wir hier eigentlich noch in der "Entwicklungs- und Testversand".

    Worauf ich hinaus will ist, reden wir von einem Problem des WG oder der USB KNX Schnittstelle oder dem Plugin?

    lg

    Stefan

    Kommentar


      #3
      Es ist vermutlich ein Problem mit der USB-SS, diese tendieren leider dazu sich wegzuhängen;
      Patentrezept - ausser einem Watchdog-Plugin - gibts aktuell noch keins:
      entweder auf eine GA: SourceForge.net Repository - [openautomation] Contents of /wiregate/plugin/generic/EIB-Watchdog
      oder auf die (lesbare!) Maskenversion einer BCU: SourceForge.net Repository - [openautomation] Contents of /wiregate/plugin/generic/EIB-Watchdog_maskver

      Makki
      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
      -> Bitte KEINE PNs!

      Kommentar


        #4
        Hallo Stefan,

        ich habe den "USB TP-UART Interface für EIB / KNX
        " aus dem Wiregate Shop
        Ich bin mir auch noch nicht Sicher an welcher Stelle der Fehler zu suchen ist. Da der Code sich zwar an den Beispiele orientiert aber denn noch an entscheidenen Stellen von mir kommt würde ich hier oder an den Wiregateeinstellungen zuerst suchen. Wobei mein glauben an die Hardware an anderen Stellen schon Tage gekostet hat.

        1 Wire Einstellungen im Anhang



        Der Plan ist eigentlich das die Wassertasche und der Puffer durch die Änderung in der Temperatur das Plugin triggern. Sonst läuft sich das Plugin im Sommer den Wolf und es ändert sich nix.

        Das Plugin funktioniert soweit er beim Auslesen den Pufferwert und den Wassertaschenwert bekommt. Wenn einer von beiden aus irgendeinem Grund nicht empfangen wird dann wird der mit 0 angenommen und die Regelung mach schwachsinn. Das primäre Problem ist aber das die Temperaturwerte nicht gesendet werden oder zumindestens nicht so wie ich denke das sie eingestellt sind.
        Was mir auch noch aufgefallen ist das Timerplugin und die RRD Plugins manchmal etwas länger nicht ausgeführt werden (Anhang).

        Auch brauchen die Configseiten des Wiregates recht lange bis sie geladen werden. Eigentlich zu lange für eine W-LAN Verbindung. Könnte irgendwas die Leistung auffressen.

        Viele Grüße
        Steffen
        Angehängte Dateien

        Kommentar


          #5
          Ohne Plugin macht das alles keinen Sinn. Häng das mal an.
          Wenn ein Wert 0 ist und dann Schwachsinn entsteht gehört das im Plugin abgefangen.

          Gruß
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            #6
            Hallo Hier das Komplette Plugin,

            Code:
            # Plugin zur Ansteuerung eines Holzkaminofens
            # Version 0.9 27.12.2012 Testversion
            # Aufbau m�glichst so, dass man unterhalb der Einstellungen nichts ver�ndern muss!
            #
            #
            
            ####################
            ###Einstellungen:###
            ####################
            
            #Zuordnung zu den Gruppenadressen für Temperaturen:
            my $ga_kesseltemp = '2/6/0'; #Holzkesseltemperatur (Wassertasche)
            my $ga_puffertemp = '2/6/2'; #Temperatur im Pufferspeicher mitte Unten
            my $ga_puffertemp2 = '2/6/14'; #Temperatur im Pufferspeicher Unten
            my $ga_raumtemp = '2/2/9'; #Raumtemperatur an der Garagentür
            my $ga_tas_temp = '2/6/11'; #Temperatur der TAS ablaufleitung zur erkennung der TAS Aktivität
            
            #Ansteuergruppenadressen
            my $ga_pumpe_kamin = '2/6/1'; #GA zum Schalten der Kaminpumpe
            my $ga_status_pumpe_kamin = '2/6/13'; #GA für den Status der Kaminpumpe
            
            #LED Adressen:
            my $ga_LED_Kalt1 = '2/6/4'; #LED Kalt 1 schaltet wenn Wassertasche 1°K wärmer als Raumtemp
            my $ga_LED_Kalt2 = '2/6/5'; #LED Kalt 2 schaltet wenn Wassertasche wärmer als Puffer aber noch nicht gefördert wird
            my $ga_LED_Warm1 = '2/6/6'; #LED Warm 1 schaltet wenn Puffer durch Ofen geladen wird
            my $ga_LED_Warm2 = '2/6/7'; #LED Warm 2 schaltet wenn Puffer durch Ofen geladen wird und die Wassertemperatur über der hälfte der Differenz zwischen Puffer und maxtemp-x ist
            my $ga_LED_Heiss1 = '2/6/8'; #LED Heiß 1 blinkt wenn Wassertasche wärmer als maxtemp-x ist
            my $ga_LED_Heiss2 = '2/6/9'; #LED Heiß 2 blinkt wenn Wassertasche wärmer als maxtemp ist
            my $ga_LED_Aus = '2/6/10'; #LED Aus schaltet alle LEDs aus
            my $ga_TAS_Alarm = '2/6/3'; #TAS Alarm löst einen Alarm aus. Schalter geht in Alarmstellung
            
            #Grenzwertdefinitionen
            my $def_max_temp ='95'; #maximaltemperatur ab der der Puffer nicht mehr geladen wird
            my $def_max_temp_warn =$def_max_temp - '10'; #Warntemperatur unterhalb der Maximaltemperatur
            my $def_temp_diff_on ='10'; #Temperaturdifferenz zwischen Puffer und Kessel ab wann die Pumpe angeschaltet werden soll
            my $def_temp_diff_off ='2'; #Temperaturdifferenz zwischen Puffer und Kessel ab wann die Pumpe abgeschaltet werden soll
            my $TAS_Alarm_temp ='85'; #Temperaturgrenzwert für den TAS Alarm
            
            my $Name_rrd_DIFF = 'Temp_differenz_kamin'; 
            my $Name_rrd_Kamin = 'Temp_Kamin';
            my $Name_rrd_Puffer = 'Temp_Puffer_Mitte_Unten';
            my $Name_rrd_Pumpe= 'Status_Kamin_Pumpe';
            
            $plugin_info{$plugname.'_cycle'} = 60*60;
            
            ######################
            ##ENDE Einstellungen##
            ######################
            
            #Ab hier nichts mehr �ndern.
            #Hauptverarbeitung
            
            # Plugin an Gruppenadresse "anmelden", hierdurch wird das Plugin im folgenden bei jedem eintreffen eines Telegramms auf die GA aufgerufen
            #Es müssen nur kessel und puffertemp abgefragt werden da eine änderung dieser eine erneute Regelungsbewertung zur folge hat
                $plugin_subscribe{$ga_kesseltemp }{$plugname} = 1;
               # $plugin_subscribe{$ga_puffertemp }{$plugname} = 1;
                $plugin_subscribe{$ga_tas_temp}{$plugname} = 1;
            
            plugin_log($plugname,"GA $msg{'dst'} - $msg{'apci'}"); 
             
            
            if ($msg{'apci'} eq "A_GroupValue_Write"){ #Wenn ein Telegramm vom KNX empfangen wird, ab hier auswerten
                #Es ist egal welches der beiden Telegramme Empfangen wurde
                #einlesen der Messwerte 
                my $KNX_Timeout=2*60*60;
                my $status_pumpe=knx_read($ga_status_pumpe_kamin,$KNX_Timeout,1);
                my $temp_puffer=knx_read($ga_puffertemp,300,9);
                my $temp_puffer2=knx_read($ga_puffertemp2,300,9);
                my $temp_kessel=knx_read($ga_kesseltemp,300,9);
                my $temp_TAS=knx_read($ga_tas_temp,0,9);
                my $temp_raum=knx_read($ga_raumtemp ,0,9);
                
                
                
                #Fehlerbehandlung
                if($temp_puffer <1)
                {
                return "Puffer Fehler"
                }
                
                #Differenzberechnung
                my $diff_temp=$temp_kessel-$temp_puffer;
                my $diff_temp2=$temp_kessel-$temp_puffer2;
             
             #Speichern der Diagramme
               update_rrd($Name_rrd_DIFF,"",$diff_temp,"GAUGE");
               update_rrd($Name_rrd_Kamin,"",$temp_kessel,"GAUGE");
               update_rrd($Name_rrd_Puffer,"",$temp_puffer,"GAUGE");
               update_rrd($Name_rrd_Pumpe,"",$status_pumpe,"GAUGE");
                
                #Unterscheidung ob die Pumpe läuft oder nicht
                if($status_pumpe=='1')#Pumpe Läuft
                {
                    #Abfragen ob die Differenz zu klein geworden ist
                    if($diff_temp<$def_temp_diff_off)#dann Pumpe Abschalten
                    {
                        knx_write($ga_pumpe_kamin,'0','1');
                        $status_pumpe='0';
                    }
                }
                else #Pumpe läuft nicht
                {
                 #Abfragen ob die Differenz groß geworden ist
                    if($diff_temp>=$def_temp_diff_on)#dann Pumpe Anschalten
                    {
                        knx_write($ga_pumpe_kamin,'1','1');
                        $status_pumpe='1';
                    }
                }
                
               
                 plugin_log($plugname,"GA $msg{'dst'} - Wasser $temp_kessel - Puffer1 $temp_puffer - Puffer2 $temp_puffer2 - Pumpe $status_pumpe");  
            
                #LED Berechnung
                
                #TAS Alarm
                if($temp_TAS>$TAS_Alarm_temp)
                {
                    knx_write($ga_TAS_Alarm,'1','1');
                    return 'TAS';
                }
                
                #Ertsmal alle LED´s ausschalten
                knx_write($ga_LED_Aus,'0','1');
                
                #LED Heiß 2
                if($temp_kessel>=$def_max_temp)
                {
                    knx_write($ga_LED_Heiss2,'1','1');
                    return $status_pumpe;
                }
                
                #LED Heiß 1
                if($temp_kessel>=$def_max_temp_warn)
                {
                    knx_write($ga_LED_Heiss1,'1','1');
                    return $status_pumpe;
                }
                
                #LED Warm 2
                my $opti_temp=$temp_puffer+($def_max_temp_warn-$temp_puffer)/2;
                if($temp_kessel>=$opti_temp && $status_pumpe=='1')
                {
                    knx_write($ga_LED_Warm2,'1','1');
                    return $status_pumpe;
                }
                
                #LED Warm 1
                if($temp_kessel<$def_max_temp_warn && $status_pumpe=='1')
                {
                    knx_write($ga_LED_Warm1,'1','1');
                    return $status_pumpe;
                }
                
                 #LED Kalt 2
                if($temp_kessel>=$temp_puffer && $status_pumpe=='0')
                {
                    knx_write($ga_LED_Kalt2,'1','1');
                    return $status_pumpe;
                }
                
                #LED Kalt 1
                if($temp_kessel>($temp_raum+1) && $status_pumpe=='0')
                {
                    knx_write($ga_LED_Kalt1,'1','1');
                    return $status_pumpe;
                }
                    
               
              return $status_pumpe;
            }
            Der Code könnte bestimmt etwas schlanker gelstaltet werden aber Funktionell sollte er Funktionieren.
            Der letzte Teil ist eine LED Ansteuerung für einen TS3 von Gira um den Zustand ohne Computer oder Visu schnell zu sehen.
            Viel Spass beim durchlesen und "zerreißen".

            Viele Grüße
            Steffen

            Kommentar


              #7
              Kommando zurück, was den Watchdog angeht! Der ist für KNX-USB-SS (nicht TP-UART!)

              Also.. Die Ausführungszeiten der Plugins sind horrend lange, vor allem "Timer" mit 11sek (sigh!) und einem Timeout.. Das darf nicht sein, da sind Werte nicht lesbar (man darf nicht aus dem Plugin einen Sensor lesen, wenn dieser nicht durch zyklisch im Cache steht!)

              -> eh grundsätzlich kein Fehler, ändere mal sämtliche knx_read auf (XX,0,YY), immer schön zyklisch senden und aus dem Cache lesen, dann geht das in 20ms..

              Makki
              EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
              -> Bitte KEINE PNs!

              Kommentar


                #8
                Ich möchte an dieser Stelle auch auf die Online-Hilfe im WireGate verweisen:

                Wichtig: Niemals zum lesen eines "lokalen" Wertes verwenden (1-Wire Sensor, anderes Plugin), der nicht im Cache ist, da sich das gegenseitig blockiert!
                Unsere Doku ist bei weitem nicht perfekt (und welche ist das schon), aber die wichtigsten Dinge stehen durchaus drin

                KNX ist keine SPS sondern Eventbasierend. Daher behilft man sich bei KNX hinsichtlich Status / Zuständen mit zyklischem Senden und lokalem Cachen desselben.


                Wünsche einen guten Rutsch ins neue Jahr und weiterhin viel Erfolg mit dem Plugin.

                lg

                Stefan

                Kommentar


                  #9
                  Hallo,

                  ich hoffe Ihr seid alle gut in das neue Jahr gestartet.
                  Danke erstmal für die Antworten.

                  Ich hatte am Sonntag mal Zeit die genannten Änderungen umzusetzten.
                  Alle lesenden Werte für die RDD werden jetzt aus dem Speicher genommen und es wie zu erwarten war schneller. Aber es kommt vor das er ab und zu einen Wert nicht bekommt und diesen mit 0 annimmt.

                  Das Kaminplugin funktioniert auch gut. Hier lag das Hauptproblem am Anfang darin das ich davon ausgeganngen bin wenn ich als Sendezyklus "-1" eingebe und bei Senden bei Änderung "1.0" das ich jedesmal wenn die Änderung +-1°K eträgt einen Wert bekomme. Das funktioniert aber nicht. Wenn ich den Sendezyklus auf irgendwas größer 0 setzte (bei mir 3600) dann bekomme ich für jede 1°K Änderung einen Wert.
                  Leider kommt es dennoch immer mal vor das einer der beiden Werte nicht im Speicher liegt und mit 0 abgenommen wird. Solange dies nicht zu oft vorkommt sollte es gehen.

                  Mir ist aber dennoch aufgefallen das verschiedene Plugins (E-Mail,SMS und Kaminofen) sich obwohl sie extrem lange Ausrufzyklen haben alle paar Minuten ausführen. Es wird laut log kein Telegram empfangen und sie beenden sich ohne was zu machen. Kenn jemand eventuell hierfür die Ursache. Solange es nur alle paar Minuten passiert ist es nicht so schlimm aber wenns mal mehr Plugins werden kann das zu einer unötigen Last führen.

                  Viele Grüße
                  Steffen

                  Kommentar


                    #10
                    Also der Aufruf eines Plugins führt - solange es nicht "pennt" oder blöde Dinge tut - zu keiner beachtenswerten "Last"

                    Ein "erfolgloser" knx_read dauert genau 1sek - ist natürlich zu vermeiden aber mit zyklischem senden und "0" als age/Alter ist man langfristig recht sicher.
                    Zum Aufrufen: du willst bei Ereignisgesteuerten Plugins immer _cycle=0 (also nie), ansonsten sollte man es im Plugin abfangen, ob man zyklisch oder von einer GA aufgerufen wurde, gibts 100 Beispiele im SVN und 500 Postings hier dazu..

                    Makki
                    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                    -> Bitte KEINE PNs!

                    Kommentar

                    Lädt...
                    X