Ankündigung

Einklappen
Keine Ankündigung bisher.

EDOMI - LBS - Diskussion

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

  • benji
    antwortet
    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

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    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"); 

    Einen Kommentar schreiben:


  • benji
    antwortet
    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ß

    Einen Kommentar schreiben:


  • vento66
    antwortet
    E7 sind aber 4 Zeichen, und E8 hat nur eins

    Einen Kommentar schreiben:


  • gulp2k
    antwortet
    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...

    Einen Kommentar schreiben:


  • benji
    antwortet
    1.png

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

    Gruß Benjamin

    Einen Kommentar schreiben:


  • gulp2k
    antwortet
    Leider sehe ich kein Bild

    Einen Kommentar schreiben:


  • benji
    antwortet
    $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

    Einen Kommentar schreiben:


  • gulp2k
    antwortet
    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.

    Einen Kommentar schreiben:


  • benji
    antwortet
    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

    Einen Kommentar schreiben:


  • gulp2k
    antwortet
    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.

    Einen Kommentar schreiben:


  • benji
    antwortet
    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.

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    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.

    Einen Kommentar schreiben:


  • gulp2k
    antwortet
    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...

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X