Ankündigung

Einklappen
Keine Ankündigung bisher.

EDOMI - LBS - Diskussion

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Dir Performance wird dann ein Problem wenn du 100 Ausgänge gleichzeitig setzt und das dann noch in einer hohen Frequenz.
    Wie dynamisch sind die Werte denn? Du solltest auf jeden Fall intern prüfen, ob sich der Wert geändert hat und nur dann den Ausgang setzen, wenn sich der Wert geändert hat. Quasi ein integrierter SendByChange-LBS.

    Außerdem würde ich mir überlegen welche Daten man wirklich braucht, um genau o.g. Performance Problem entgegenzuwirken.

    Alternativ solltest du dir mal den LBS von vento66 anschauen, mit dem man iKOs direkt in der DB generieren und setzen kann, evtl. ist das auch eine Lösung.

    Kommentar


      Ich denke realistisch werde ich vielleicht alle 30-60s ne Abfrage starten. Ist ja ne Heizung und kein Kernreaktor
      Das mit dem Check ob sich die Werte geändert haben ist auch ne gute Idee daran hab ich noch gar nicht gedacht!

      Meinst du https://service.knx-user-forum.de/?c...ad&id=19000604 von vento66?
      Der erstellt ja nur die iKOs einmalig aber schreibt keine Werte rein.
      Direkt in der DB "rumzupfuschen" würde ich eigendlich gerne vermeiden...
      Gruß
      Michael

      Kommentar


        Zitat von gulp2k Beitrag anzeigen
        Ich denke realistisch werde ich vielleicht alle 30-60s ne Abfrage starten. Ist ja ne Heizung und kein Kernreaktor
        Das mit dem Check ob sich die Werte geändert haben ist auch ne gute Idee daran hab ich noch gar nicht gedacht!
        Dann macht das integrierte sendByChange auf jeden Fall Sinn. Und ich würde vermutlich einen Triggereingang machen, der ein Komplett-Update aller Werte macht und ggf. andere Triggereingänge, die ausgewählte Werte updaten, z.B. einen Eingang an dem man "Wert1:Wert10:Wert27" sendet um Werte 1, 10 und 27 zu aktualisieren.

        Zitat von gulp2k Beitrag anzeigen
        Meinst du https://service.knx-user-forum.de/?c...ad&id=19000604 von vento66?
        Der erstellt ja nur die iKOs einmalig aber schreibt keine Werte rein.
        Direkt in der DB "rumzupfuschen" würde ich eigendlich gerne vermeiden...
        Ja stimmt, das reinschreiben müsste dann dein LBS machen.
        Ich verstehe deine Bedenken. Ich persönlich würde es auch nicht machen wollen.

        Kommentar


          Hi,

          schau dir mal das den Code https://knx-user-forum.de/forum/proj...-ausgangsboxen von vento666 an.

          Hab ich mit Micha mal in einem Baustein getestet welcher 128 Ausgänge bringt. Funktioniert super. Eigentlich wollte er in dem Thread auch noch ein paar Meinungen dazu haben, allerdings fällt dies bis jetzt recht dürftig aus.


          Wie wird deine Wärmepumpe abgefragt?? Direkt die WP oder über ein Gateway? Ich z.B zieh mir die Werte über ein Gateway, dieses bekommt nur alle 120s Werte von meiner WP übertragen...somit macht auch ein Abfragezyklus <120s kein Sinn.

          Gruß Benjamin

          Zuletzt geändert von benji; 08.03.2017, 07:05.

          Kommentar


            Zitat von benji Beitrag anzeigen
            Hi,
            schau dir mal das den Code https://knx-user-forum.de/forum/proj...-ausgangsboxen von vento666 an.

            Hab ich mit Micha mal in einem Baustein getestet welcher 128 Ausgänge bringt. Funktioniert super. Eigentlich wollte er in dem Thread auch noch ein paar Meinungen dazu haben, allerdings fällt dies bis jetzt recht dürftig aus.
            Sieht interessant aus aber ohne "offizielle" DB Doku oder abnicken des großen Entwicklers von der Insel will ich wirklich nicht direkt in die DB schreiben...
            Dabei kann zu viel schief gehen, gerade nach einem Upgrade... wenn es nur um mich ginge OK aber sobald ich den LBS öffentlich Freigebe hat man da auch ne gewisse Verantwortung.


            Zitat von benji Beitrag anzeigen
            Wie wird deine Wärmepumpe abgefragt?? Direkt die WP oder über ein Gateway? Ich z.B zieh mir die Werte über ein Gateway, dieses bekommt nur alle 120s Werte von meiner WP übertragen...somit macht auch ein Abfragezyklus <120s kein Sinn.
            Ich frage die Waterkotte direkt ab, es gibt da eine App und schon viele haben das Protokol entschlüsselt (Klartext, unverschlüsselt, sehr simpel).
            Kann also bestimmen wie oft, aber wie gesagt Echtzeit macht bei einer Heizung eher selten Sinn

            Gruß
            Michael
            Zuletzt geändert von gulp2k; 08.03.2017, 09:00.
            Gruß
            Michael

            Kommentar


              Hi,

              ich habe mal kurz eine Frage, ich möchte gerne durch ermitteln von strlen meine variablen setzen. Dazu habe ich mir folgendes gedacht:
              Leider funktioniert das ganze irgendwie nicht. Wenn ich E7 einen wert mit 1 oder 2 Zeichen angebe passiert nichts. Sobald ich einen dreistelligen eingebe wird als ausgeführt. Finde gerade nicht mein Fehler.

              PHP-Code:
              if ($V[7]==1) {
                  
              $len strlen($E[7]['value']);
                  
              $value $E[7]['value'];
                  
              setLogicLinkAusgang($id,31,$len);

                  if     (
              $len <= 3){

                      if    (
              $len == 1){
                      
              $a str2hex("=""0");    
                      
              $b str2hex("0"$value);
                      }
                      elseif (
              $len == 2){
                      
              $a str2hex("="."0");
                      
              $b str2hex("="substr($value, -2));
                      }
                      else{
                      
              $a substr($value, -31);  //Wert aufteilen Teil A    
                      
              $b substr($value, -2);     //Wert aufteilen Teil B
                      
              }
                      
              $value1 str2hex("=".$a);             //Teil A in hex
                      
              $value2 str2hex($b);                 //Teil B in hex
                      
              $data = array(0x76300x30300x3931hexdec($value1), hexdec($value2), 0x0000);
                      
              $dataTypes = array("INT""INT""INT""INT""INT""INT");
                      
              $modbus->writeMultipleRegister(1801$data$dataTypes);
                      
              logic_setVar($id,7,0);
                  }    


              Gruß Benjamin

              Kommentar


                hm wenn $len den richtigen wert hat und das auch so in A31 steht sollte es eigendlich funktionieren.
                Du wirst aber in Probleme laufen wenn E7 leer ist... Also eigendlich ($len>0 && $len<=3).

                PS.
                Sehe du nutzt auch die modbus libs, darf man Fragen was du damit machst?
                Habe nämlich selber erst einen LBS dafür gebaut.
                Gruß
                Michael

                Kommentar


                  $len hat eigentlich den richtigen wert. In dem Beispiel jetzt ,siehe Bild, zum Beispiel 2. Läuft allerdings nicht.
                  Danke für dein Hinweis, hab ich abgeändert.


                  Ich bin derzeit ein LBS für Helios KWL am basteln, bzw. fast durch. Anbindung dann über Modbus TCP, Funktionen sind FC3 und FC16 eingebunden. Helios hat da etwas speziell gebastelt. Alle Werte müssen zum Lesen erstmal in ein HoldingRegister geschrieben werden und können dann aus diesem gelesen werden.

                  Gruß Benjamin

                  Kommentar


                    Leider sehe ich kein Bild
                    Gruß
                    Michael

                    Kommentar


                      1.png

                      Oh vergessen Bild anzuhängen. Jetzt ist es da, wie gesagt A31 zeigt den Wert 2.

                      Gruß Benjamin

                      Kommentar


                        hm, ich würde erst mal anstatt $len <= 3 lieber $len <4 machen. Ist aber meine persönliche Präferenz
                        Ansonsten mal strategisch vor und nach den ganzen If´s mal logging punkte machen um den Flow besser zu verstehen.
                        Woher weißt du eigendlich das "nichts" passiert?

                        Könnte mir auch gut vorstellen das er durch das erste If kommt und erst bei dem $len==1 oder $len==2 auf einen Fehler läuft...
                        Gruß
                        Michael

                        Kommentar


                          E7 sind aber 4 Zeichen, und E8 hat nur eins

                          Kommentar


                            Der E7 auf dem Bild hat nichts mit dem im LBS zu tun, hab ehrlich gesagt das Bild etwas blöd gemacht. Bild zeigt nur die Klemme aus Logikeditor im LIvemodus, E7 E8 ist Zufall.

                            E8 auf dem Bild ist mein A31 am Ausgang, also $len. Der wert dort ist zwei, also müsste ja $len ==2 eigentlich true sein.

                            Gruß

                            Kommentar


                              Zitat von benji Beitrag anzeigen
                              Der E7 auf dem Bild hat nichts mit dem im LBS zu tun, hab ehrlich gesagt das Bild etwas blöd gemacht. Bild zeigt nur die Klemme aus Logikeditor im LIvemodus, E7 E8 ist Zufall.

                              E8 auf dem Bild ist mein A31 am Ausgang, also $len. Der wert dort ist zwei, also müsste ja $len ==2 eigentlich true sein.
                              Ich würde mal den gesamten LBS posten. Mit dem Ausschnitt wird man vermutlich nicht wirklich sehen, wo genau das Problem ist.
                              Was macht denn zum Beispiel:

                              PHP-Code:
                              str2hex("=""0"); 

                              Kommentar


                                Hier mal ein Teil vom EXEC,

                                PHP-Code:
                                ###[EXEC]###
                                <?
                                require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
                                require(dirname(__FILE__). "/../../../../main/include/php/ModbusMaster.php");
                                set_time_limit(0);
                                sql_connect();

                                //-------------------------------------------------------------------------------------
                                function str2hex($string){
                                    $hex='0x';
                                    for ($i=0; $i < strlen($string); $i++){
                                        $hex .= dechex(ord($string[$i]));
                                    }
                                    return $hex;
                                }


                                $E = getLogicEingangDataAll($id);
                                $V=logic_getVars($id);
                                $ip = $E[2]['value'];

                                $modbus = new ModbusMaster($ip, "TCP");





                                try {

                                if ($E=logic_getInputs($id)){
                                        $V=logic_getVars($id);
                                      }


                                //Betriebsart E3
                                if ($V[3]==1) {
                                    $value = str2hex("=".$E[3]['value']);
                                    $data = array(0x7630, 0x3031, 0x3031, hexdec($value), 0x0000);
                                    $dataTypes = array("INT", "INT", "INT", "INT", "INT");    
                                    $modbus->writeMultipleRegister(180, 1, $data, $dataTypes);
                                    logic_setVar($id,3,0);
                                }


                                //Lüftungsstufe E4
                                if ($V[4]==1) {
                                    $value = str2hex("=".$E[4]['value']);
                                    $data = array(0x7630, 0x3031, 0x3032, hexdec($value), 0x0000);
                                    $dataTypes = array("INT", "INT", "INT", "INT", "INT");
                                    $modbus->writeMultipleRegister(180, 1, $data, $dataTypes);
                                    logic_setVar($id,4,0);
                                }

                                //Min. Lüfterstufe E5
                                if ($V[5]==1) {
                                    $value = str2hex("=".$E[5]['value']);
                                    $data = array(0x7630, 0x3030, 0x3230, hexdec($value), 0x0000);
                                    $dataTypes = array("INT", "INT", "INT", "INT", "INT");    
                                    $modbus->writeMultipleRegister(180, 1, $data, $dataTypes);
                                    logic_setVar($id,5,0);    
                                }


                                //Partybetrieb E6
                                if ($V[6]==1) {
                                    $value = str2hex("=".$E[6]['value']);
                                    $data = array(0x7630, 0x3030, 0x3934, hexdec($value), 0x0000);
                                    $dataTypes = array("INT", "INT", "INT", "INT", "INT");
                                    $modbus->writeMultipleRegister(180, 1, $data, $dataTypes);
                                    logic_setVar($id,6,0);
                                }

                                //Partybetrieb Dauer E7
                                if ($V[7]==1) {
                                    $len = strlen($E[7]['value']);
                                    $value = $E[7]['value'];
                                    setLogicLinkAusgang($id,31,$len);

                                    if     ($len>0 && $len<4){
                                        if    ($len == 1){
                                        setLogicLinkAusgang($id,32,$len);
                                         $a = str2hex("0");    
                                        $b = str2hex("0". $value);
                                        }
                                        elseif ($len == 2){
                                        setLogicLinkAusgang($id,33,$len);
                                        $a = str2hex("0");
                                        $b = str2hex(substr($value));
                                        }
                                        else{
                                        $a = substr($value, -3, 1);  //Wert aufteilen Teil A    
                                        $b = substr($value, -2);     //Wert aufteilen Teil B
                                        }
                                        $value1 = str2hex("=".$a);             //Teil A in hex
                                        $value2 = str2hex($b);                 //Teil B in hex
                                        $data = array(0x7630, 0x3030, 0x3931, hexdec($value1), hexdec($value2), 0x0000);
                                        $dataTypes = array("INT", "INT", "INT", "INT", "INT", "INT");
                                        $modbus->writeMultipleRegister(180, 1, $data, $dataTypes);
                                        setLogicLinkAusgang($id,23,$b);
                                        setLogicLinkAusgang($id,24,$value1);
                                        setLogicLinkAusgang($id,25,$value2);
                                        logic_setVar($id,7,0);

                                    }    
                                }

                                //Partybetrieb Stufe E8
                                if ($V[8]==1) {
                                    $value = str2hex("=".$E[8]['value']);
                                    $data = array(0x7630, 0x3030, 0x3932, hexdec($value), 0x0000);
                                    $dataTypes = array("INT", "INT", "INT", "INT", "INT");
                                    $modbus->writeMultipleRegister(180, 1, $data, $dataTypes);
                                    logic_setVar($id,8,0);
                                }


                                //Ruhebetrieb E9
                                if ($V[9]==1) {
                                    $value = str2hex("=".$E[9]['value']);
                                    $data = array(0x7630, 0x3030, 0x3939, hexdec($value), 0x0000);
                                    $dataTypes = array("INT", "INT", "INT", "INT", "INT");
                                    $modbus->writeMultipleRegister(180, 1, $data, $dataTypes);
                                    logic_setVar($id,9,0);
                                }


                                //Ruhebetrieb Dauer E8
                                if ($V[10]==1) {
                                    $len = strlen($E[10]['value']);
                                    $value = $E[10]['value'];

                                    if     ($len <= 3){
                                        if    ($len == 1){
                                         $a = str2hex("=". "0");    
                                        $b = str2hex("0". $value);
                                        }
                                        elseif ($len == 2){
                                        $a = str2hex("="."0");
                                        $b = str2hex("=". substr($value, -2));
                                        }
                                        else{
                                        $a = substr($value, -3, 1);  //Wert aufteilen Teil A    
                                        $b = substr($value, -2);     //Wert aufteilen Teil B
                                        }
                                        $value1 = str2hex("=".$a);             //Teil A in hex
                                        $value2 = str2hex($b);                 //Teil B in hex
                                        $data = array(0x7630, 0x3030, 0x3936, hexdec($value1), hexdec($value2), 0x0000);
                                        $dataTypes = array("INT", "INT", "INT", "INT", "INT", "INT");
                                        $modbus->writeMultipleRegister(180, 1, $data, $dataTypes);
                                        logic_setVar($id,10,0);
                                    }    
                                }

                                Hier nochmal der Teil um welchen es geht.

                                PHP-Code:
                                //Partybetrieb Dauer E7
                                if ($V[7]==1) {
                                    
                                $len strlen($E[7]['value']);
                                    
                                $value $E[7]['value'];
                                    
                                setLogicLinkAusgang($id,31,$len);

                                    if     (
                                $len>&& $len<4){
                                        if    (
                                $len == 1){
                                        
                                setLogicLinkAusgang($id,32,$len);
                                         
                                $a str2hex("0");    
                                        
                                $b str2hex("0"$value);
                                        }
                                        elseif (
                                $len == 2){
                                        
                                setLogicLinkAusgang($id,33,$len);
                                        
                                $a str2hex("0");
                                        
                                $b str2hex(substr($value));
                                        }
                                        else{
                                        
                                $a substr($value, -31);  //Wert aufteilen Teil A    
                                        
                                $b substr($value, -2);     //Wert aufteilen Teil B
                                        
                                }
                                        
                                $value1 str2hex("=".$a);             //Teil A in hex
                                        
                                $value2 str2hex($b);                 //Teil B in hex
                                        
                                $data = array(0x76300x30300x3931hexdec($value1), hexdec($value2), 0x0000);
                                        
                                $dataTypes = array("INT""INT""INT""INT""INT""INT");
                                        
                                $modbus->writeMultipleRegister(1801$data$dataTypes);
                                        
                                setLogicLinkAusgang($id,23,$b);
                                        
                                setLogicLinkAusgang($id,24,$value1);
                                        
                                setLogicLinkAusgang($id,25,$value2);
                                        
                                logic_setVar($id,7,0);

                                    }    

                                Ich möchte auf E7 die Dauer in Minuten schreiben 0-180. Diese Eingabe wollte ich über strlen prüfen und danach die variablen wählen.


                                wenn zB 180 als wert auf E7 kommt soll $data folgendes ergeben. $a=0x3D31 $b=0x3830 (für = 180)

                                wenn zB 90 kommt soll $data $a=0x3D30 $b=0x3930 kommen

                                deswegen prüfe ich die strlen und setze quasi vorne 0 an.

                                Gruß Benjamin

                                Kommentar

                                Lädt...
                                X