Ankündigung

Einklappen
Keine Ankündigung bisher.

EDOMI - LBS - Diskussion

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

  • gaert
    antwortet
    Ein "Mod"-LBS also Danke, aber ich werde mich erst später darum kümmern können - bzw. mal einen eigenen Thread für "Bitte diesen LBS aufnehmen" machen, sonst komme ich durcheinander Also bitte im Hinterkopf behalten und noch etwas Geduld aufbringen...

    Einen Kommentar schreiben:


  • ggt
    antwortet
    gaert

    Ich benötigte heute eine Restwert-Divisions Logik. Da es sich um eine kleine mathematische Funktion handelt, könntest du diese vielleicht mit ausliefern.

    Code:
    ###[DEF]###
    [name        =Restwertdivision A/B        ]
    
    [e#1        =A                 ]
    [e#2        =B                 ]
    
    [a#1        =0/1                    ]
    ###[/DEF]###
    
    
    ###[HELP]###
    Durch die Restwert-Division lässt sich schnell herausfinden, ob eine Zahl (Wert an E1) durch eine andere Zahl (Wert an E2) teilbar ist.
    Jedes neue Telegramm an E1 oder E2 triggert den Baustein.
    
    E1: Wert A
    E2: Wert B
    A1: Wenn E1 (A) / E2 (B) teilbar ist, wird A1=1 gesetzt. Andernfalls wird A1=0 gesetzt.
    ###[/HELP]###
    
    
    ###[LBS]###
    <?
    function LB_LBSID($id) {
        if ($E=getLogicEingangDataAll($id)) {
            if ($E[1]['refresh']==1 || $E[2]['refresh']==1) {
                if ($E[1]['value'] % $E[2]['value']==0) {
                    setLogicLinkAusgang($id,1,1);
                } else {
                    setLogicLinkAusgang($id,1,0);
                }
            }
        }
    }
    ?>
    ###[/LBS]###
    
    
    ###[EXEC]###
    <?
    
    ?>
    ###[/EXEC]###

    Einen Kommentar schreiben:


  • gaert
    antwortet
    Verwunderlich... Der Hilfetext ist ja auch länger als die Logik selbst

    Einen Kommentar schreiben:


  • KNXFan1970
    antwortet
    gaert
    ​LBS "Toggeln mit Status-KO" im Einsatz - funktioniert wie er soll.

    Einen Kommentar schreiben:


  • gaert
    antwortet
    Ich habe mal einen LBS "Toggeln mit Status-KO" erstellt - dieser wird beim nächsten Update als 13000020 dauerhaft hinzugefügt. Wer mag, kann gerne schonmal "testen" (ist ja relativ trivial...):

    PHP-Code:
    ###[DEF]###
    [name        =Toggeln mit Status-KO    ]

    [e#1        =Trigger    ]
    [e#2        =Wert A #init=0    ]
    [e#3        =Wert B #init=1    ]
    [e#4        =Status-KO    ]

    [a#1        =Wert A/B    ]
    ###[/DEF]###


    ###[HELP]###
    Dieser Baustein setzt A1 auf den Wert an E2 oder E3 in Abhängigkeit vom Wert z.B. eines Status-KOs an E4:

    Ist der Wert des Status-KOs an E4 = E2, wird A1 auf den Wert an E3 gesetzt.
    Ist der Wert des Status-KOs an E4 &ne; E2, wird A1 auf den Wert an E2 gesetzt.

    Dieses "Toggeln" wird bei jeden neuen Telegram &ne;0 an E1 durchgeführt.

    Wichtig: Als Vergleichswert dient ausschließlich E2. Ist z.B. E2=0 und E3=1 und E4=999 (also weder =E2 noch =E3), wird A1 auf E2 gesetzt. 

    Eine Änderung der Werte an E2, E3 oder E4 triggert den Baustein nicht(!). Der Baustein wird ausschließlich über ein neues Telegramm &ne;0 an E1 getriggert.

    E1: Trigger &ne;0
    E2: Wert A
    E3: Wert B
    E4: Vergleichswert, z.B. ein Status-KO

    A1: wird bei jedem Trigger (E1) entweder auf den Wert von E2 oder auf den Wert von E3 gesetzt
    ###[/HELP]###


    ###[LBS]###
    <?
    function LB_LBSID($id) {
        if ($E=getLogicEingangDataAll($id)) {
        
            if ($E[1]['value']!=0 && $E[1]['refresh']==1) {
            
                if ($E[4]['value']==$E[2]['value']) {
                    setLogicLinkAusgang($id,1,$E[3]['value']);
                } else {
                    setLogicLinkAusgang($id,1,$E[2]['value']);
                }
                
            }
            
        }
    }
    ?>
    ###[/LBS]###


    ###[EXEC]###
    <?
    ?>
    ###[/EXEC]###

    Einen Kommentar schreiben:


  • gaert
    antwortet
    Also so wird das nix... Wo ist denn jetzt "Zeile 1" usw... Poste doch einfach mal den LBS-Code - und zwar im Ganzen

    Einen Kommentar schreiben:


  • timberland
    antwortet
    sollten diese Funktionen sein


    PHP-Code:



    function Upnp($url,$SOAP_service,$SOAP_action,$SOAP_arguments '',$XML_filter '')
        {
            
    $POST_xml '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">';
            
    $POST_xml .= '<s:Body>';
            
    $POST_xml .= '<u:'.$SOAP_action.' xmlns:u="'.$SOAP_service.'">';
            
    $POST_xml .= $SOAP_arguments;
            
    $POST_xml .= '</u:'.$SOAP_action.'>';
            
    $POST_xml .= '</s:Body>';
            
    $POST_xml .= '</s:Envelope>';

            
    $POST_url $this->IP.":".$this->PORT.$url;

            
    $ch curl_init();
            
    curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
            
    curl_setopt($chCURLOPT_SSL_VERIFYHOST0);
            
    curl_setopt($chCURLOPT_URL$POST_url);
            
    curl_setopt($chCURLOPT_HEADER0);
            
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
            
    curl_setopt($chCURLOPT_TIMEOUT30);
            
    curl_setopt($chCURLOPT_HTTPHEADER, array("Content-Type: text/xml""SOAPAction: ".$SOAP_service."#".$SOAP_action));
            
    curl_setopt($chCURLOPT_POST1);
            
    curl_setopt($chCURLOPT_POSTFIELDS$POST_xml);
            
    $r curl_exec($ch);
            
    curl_close($ch);

            if (
    $XML_filter != '')
                return 
    $this->Filter($r,$XML_filter);
            else
                return 
    $r;
        }
        function 
    Filter($subject,$pattern)
        {
            
    preg_match('/\<'.$pattern.'\>(.+)\<\/'.$pattern.'\>/',$subject,$matches); ///'/\<'.$pattern.'\>(.+)\<\/'.$pattern.'\>/'
            
    return $matches[1];
        }

    function 
    GetPositionInfo()
        {
            
    $url '/MediaRenderer/AVTransport/Control';
            
    $action 'GetPositionInfo';
            
    $service 'urn:schemas-upnp-org:service:AVTransport:1';
            
    $args '<InstanceID>0</InstanceID>';
            
    $xml $this->Upnp($url,$service,$action,$args);

            
    $data["TrackNumberInQueue"] = $this->Filter($xml,"Track");
            
    $data["TrackURI"] = $this->Filter($xml,"TrackURI");
            
    $data["TrackDuration"] = $this->Filter($xml,"TrackDuration");
            
    $data["RelTime"] = $this->Filter($xml,"RelTime");
            
    $TrackMetaData $this->Filter($xml,"TrackMetaData");

            
    $xml substr($xmlstripos($TrackMetaData'&lt;'));
            
    $xml substr($xml0strrpos($xml'&gt;') + 4);
            
    $xml str_replace(array("&lt;""&gt;""&quot;""&amp;""%3a""%2f""%25"), array("<"">"""", "&", ":", "/", "%"), $xml);

            
    $data["Title"] = $this->Filter($xml,"dc:title");    // Track Title
            
    $data["AlbumArtist"] = $this->Filter($xml,"r:albumArtist");        // Album Artist
            
    $data["Album"] = $this->Filter($xml,"upnp:album");        // Album Title
            
    $data["TitleArtist"] = $this->Filter($xml,"dc:creator");    // Track Artist

            return 
    $data;
        } 

    Einen Kommentar schreiben:


  • gaert
    antwortet
    Irgendwie fehlen die Kommas in Deiner Array-Definition... Oder ist das ein var_dump?!

    Poste am besten mal den Quelltext Deines LBS - sonst wird die Fehlersuche etwas schwierig...

    Einen Kommentar schreiben:


  • timberland
    antwortet
    Hi,

    kann man diese Fehlermeldung irgendwie abfangen: Code 8 / Zeile 1 / Undefined offset: 1

    kommt bei dieser Abfrage im EXEC Abschnitt : $sonos_1->GetPositionInfo();
    Das Array sieht so aus:
    array(8) { ["TrackNumberInQueue"]=> string(1) "1" ["TrackURI"]=> string(63) "x-rincon-mp3radio://arabella.stream.kapper.net:8000/arabellavie" ["TrackDuration"]=> string(7) "0:00:00" ["RelTime"]=> string(7) "0:00:14" ["Title"]=> string(11) "arabellavie" ["AlbumArtist"]=> NULL ["Album"]=> NULL ["TitleArtist"]=> NULL } Nehme an das kommt von den letzten mit NULL, da kommt beim Radio nichts. Die Ausgabe selbst funktioniert aber.

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    DANKESCHÖN für die Erklärung !

    Mir ging es ja darum, dass wenn der LBS bereit ist, das KO{2} am Eingang des LBS verbunden, am LBS-Ausgang die 1 and die Ausgangsbox sendet und dadurch eine HTTP-Telegramm auslöst ...

    Die 1 wird durchgereicht, der HTTP „Auftrag“ wird versendet ...

    Einen Kommentar schreiben:


  • gaert
    antwortet
    Zitat von coliflower Beitrag anzeigen
    Die System-KO ?
    Zu welchem Zeitpunkt löst die aus ?
    Wenn Edomi noch nicht hoch ist, dann kann der String unter umständen nicht vom LBS in Empfang genommen werden, oder ?
    Das SysKO "Systemstart" wird auf 1 gesetzt, sobald EDOMI "bereit" ist, d.h. EDOMI muss natürlich gestartet sein und die INIT-Phase ist abgeschlossen. Also quasi die Stunde Null des Normalbetriebs...

    Wenn EDOMI "noch nicht hoch" ist, kann natürlich auch nix vom LBS empfangen werden - der LBS ist ja ein Bestandteil von EDOMI selbst

    Einen Kommentar schreiben:


  • gaert
    antwortet
    Aaaalso...:

    Beim einem (neu)Start von EDOMI passiert folgendes:
    Alle LBS werden zunächst initialisiert, d.h. wie in einer elektronischen Schaltung werden die Signalwege rekursiv verfolgt und die entsprechenden Ein/Ausgänge gesetzt. Die Eingänge werden dabei ggf. mit dem Initialwert/Fixwert belegt oder auch mit einem KO-Wert, sofern das KO bereits einen Wert hat (z.B. remanente KOs). Nachdem diese erste Initialisierung abgeschlossen ist (zu erkennen als "INIT" in den Logs) wird EDOMI richtig gestartet, d.h. jetzt werden die Logiken erst normal arbeiten.

    Wenn Du also einen LBS automatisch starten willst, genügt es einen Initialwert (#init=...) an einen beliebigen Eingang zu legen - denn dann hat der Eingang ja bereits einen Wert und wird den LBS triggern. Was dann genau passiert entscheidet natürlich der Code im LBS...

    Natürlich kann man genauso gut das SysKO "Systemstart" an einen Eingang legen - dann startet der LBS auch automatisch (allerdings erst NACH der INIT-Phase, aber das spielt in den meisten Anwendungsfällen keine Rolle).

    Wenn EDOMI beendet oder neugestartet wird, werden natürlich alle LBS beendet - auch die EXEC-Scripte. Oder anders ausgedrückt: Beenden/Neustart verhält sich aus Sicht der LBS/EXEC wie ein Shutdown/Reboot der Hardware.

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Die System-KO ?
    Zu welchem Zeitpunkt löst die aus ?
    Wenn Edomi noch nicht hoch ist, dann kann der String unter umständen nicht vom LBS in Empfang genommen werden, oder ?

    Einen Kommentar schreiben:


  • hartmut
    antwortet
    Nimm doch die interne KO Systemstart.

    Einen Kommentar schreiben:


  • coliflower
    antwortet
    Hab ich da etwas falsch verstanden ?
    der LBS läuft nicht mehr nach Beenden/Neustart … ? Wenn ich einen String nach z.B. Neustart erhalte, dann zeig die Visu doch dir neuen Werte an ….

    Ich möchte aber dass nach einem z.B. Neustart - keine Ahnung - eine KO ein 1 sendet die dann in einem HTTP Request mir den String schickt, ohne dass ich manuell es anfordern oder iTunes bemühen muss.

    Einen Kommentar schreiben:

Lädt...
X