Script zur Erstellung eines Dummy Geräts für Filtertabellen auf Weinzierl BAOS Basis

Hallo,
in der Vergangenheit hat es mich oft gestört, dass ich bei den für die Erstellung der Filter-Adressen notwendigen Geräte einen lieblosen Dummy verwenden musste, bei dem die KOs keinerlei Zusammenhang haben.

Daher habe ich nun auf Basis des Weinzierl BAOS generic Dummy Geräts einen CSV Export geschrieben. Ihr benötigt dafür KEIN physikalisches Gerät von Weinzierl, nur die Applikation und die DCA.
Produktseite: KNX IP BAOS 774
Applikation: https://www.weinzierl.de/images/download/products/774/Weinzierl-774-KNX-IP-BAOS-5263-ETS4.zip
DCA: https://www.weinzierl.de/images/download/products/dca/baoscsvimporter/Weinzierl_DCA_Baos_Csv_Importer_1.1.0.etsapp

Ihr startet in IP-Symcon im Editor das u.s. Script. Den dann angezeigten Text kopiert ihr in ein ANSI codiertes Textdokument (Dateiendung sicherheitshalber .csv) und importiert es mit der DCA.

Hierfür im ersten Schritt Applikation in den ETS Katalog importieren und die DCA zu den Apps hinzufügen (in der Übersicht der verfügbaren Apps [ETS-Übersicht → rechts unten] gibt es das grüne Plus.

Im neuen Gerät auf DCA und dort auf „CSV zu Vorschau“. Danach auf „Vorschau zu“.
Fertig ist das Dummy Gerät.

In der ersten Version gibt es noch kein Möglichkeit die verwendete Objekt ID updatefest beizubehalten. Daher sollte man es noch mit vorsicht nutzen. Wenn es ein breites Interesse an diesem Script gibt, könnte man es vielleicht dahingehend erweitern (in einem Beschriebungsfeld o.ä. die ETS KO-Nr. speichern).

Es wäre ebenso denkbar das Script „rückwärts“ zu verwenden und mit einem KNX Konfiguration in IP-Symcon zu verbinden.

<?php
function compact_name($name){
    $find = array('Licht', 'Beleuchtung','beleuchtung','Temperatur');
    $repl = array('Li','Bel', 'bel', 'Temp');

    if(mb_strlen($name)>20){
        $name = str_replace($find,$repl,$name);
    }
    if(mb_strlen($name)>20){
        $name = str_replace(" ","",$name);
    }
    return substr($name,0,20);
}

$gatewayIDs = IPS_GetInstanceListByModuleID("{1C902193-B044-43B8-9433-419F09C641B8}");
$instanceIDs = IPS_GetInstanceList();
$rootname = IPS_GetObject(0)['ObjectName'];
$j=1;
foreach($gatewayIDs as $gatewayID) {
    print "Csv version;1.1;;;;\n";
    print "Project name;".$rootname.";;;;\n";
    print "Device type;".IPS_GetObject($gatewayID)['ObjectName'].";;;;\n";
    print "Device name;IP-Symcon;;;;\n";
    print ";;;;;\n";
    print "Type;ID;DPT;Description;Addr/Val;Flags\n";
    foreach($instanceIDs as $instanceID) {
        $i = IPS_GetInstance($instanceID);
        if($i['ConnectionID'] == $gatewayID) {
            if(strpos($i['ModuleInfo']['ModuleName'], "DPT") !== false) {
                //print_r(IPS_GetConfiguration($instanceID));exit;
                $ga = IPS_GetProperty($instanceID, "Address1")."/".IPS_GetProperty($instanceID, "Address2")."/".IPS_GetProperty($instanceID, "Address3");
                $dimension =  IPS_GetProperty($instanceID, "Dimension");
                $name = IPS_GetObject($instanceID)['ObjectName'];
                // Type;ID;DPT;Description;Addr/Val

                // Dimension
                $dp = str_replace(
                    array("KNX "," "),
                    array("","-"),$i['ModuleInfo']['ModuleName']
                ) ;
                if($dimension!="0"){
                    $dp = str_replace("DPT","DPST",$dp).".".sprintf("%03s",$dimension);
                }
                // CRWTUI
                $flags = "C"; /* Communication - Deutsch: Kommunikation - grundsätzlich aktiv */
                
                if(IPS_GetProperty($instanceID, "CapabilityTransmit")){
                    $flags.="R"; /*Antwortet auf Leseanfragen */
                }
                if(IPS_GetProperty($instanceID, "CapabilityReceive")){
                    $flags.="W"; /*Empfange Wertänderungen vom Bus */
                }
                if(IPS_GetProperty($instanceID, "CapabilityWrite")){
                    $flags.="T"; /*send a GroupValueWrite */
                }
                if(IPS_GetProperty($instanceID, "CapabilityReceive")){
                    $flags.="U"; /*Empfange Wertänderungen vom Bus */
                }
                if(IPS_GetProperty($instanceID, "CapabilityRead")){
                    $flags.="I"; /*Darf Leseanfragen stellen */
                }
                print "DP;".$j.";".$dp.";".compact_name($name).";".$ga."";
                
                $mapping = IPS_GetProperty($instanceID, "Mapping");
                $map = json_decode($mapping,true);
                foreach($map as $mapitem){
                      print ",".$mapitem['Address1'] . "/".$mapitem['Address2'] . "/".$mapitem['Address3']."";
                }
                print ";".$flags."\n";
                $j++;
            }
            }
    }
}
?>

Über eine Rückmeldung, ob das Script mal jemand getestet hat oder ob diese Idee der dynamischen Dummy Erstellung überhaupt nicht sinnvoll ist, würde ich mich freuen.

Hallo,
ich habe heute mal wieder einige Gruppenadressen in die Linienkoppler setzen müssen und dabei dieses Script erneut verwendet. Dabei fiel mir auf, dass ich hier weiterhin keine Rückmeldung erhalten habe. Wie löst ihr das Problem denn derzeit? Ihr pflegt doch nicht ernsthaft eine der Jung/Gira/Theben/Siemens Dummy Applikationen per Hand?

Gruß
Tobias

Ich mache es per Hand. Das ist einmal bei Erstellung des Projektes ne halbe Stunde Arbeit und wenn man im Nachgang noch später etwas hinzufügt, ist es auch in 30 Sekunden erledigt.

Es gibt ja die App, die das kann. Habe bisher aber noch keine Lust gehabt, sie zu kaufen.

Welche App magst du kaufen? Die Weinzierl lädt man entweder über den KNXA Store ‚aka kostenloser Kauf‘ oder direkt auf der Weinzierl Seite (hatte ich auch verlinkt).

Ich habe hier ein Projekt, welches nach und nach wächst. Das immer per Hand zu machen, wäre mir irgendwie zu blöd.

@paresy wie gewünscht, hole ich den Beitrag nochmal hoch. Ggf. habe ich irgendwo noch eine verbesserte Version des Scripts laufen.