Ankündigung

Einklappen
Keine Ankündigung bisher.

Diskussion: Menschenlesbares Exportformat für Austausch im Forum

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

    [callidomus] Diskussion: Menschenlesbares Exportformat für Austausch im Forum

    Hi,

    ausgehend von dieser Antwort von Marcus im Wunschthread wollte ich hier mal eine Diskussion aufmachen, um die Forderung mal etwas mehr zu spezifizieren. Ob Marcus so was mal implementiert, ist seine Sache. Allerdings werden sehr häufig Wünsche nur in einem Satz formuliert und hinterher "gemeckert", wenn die Realisierung nicht so war, wie man es sich vorgestellt hat.

    Im folgenden mal ein Paar Vorschläge, wie das aussehen könnte - direkt aus meinem aktuellen callidomus-Projekte exportiert, dann kann man mal sehen, wie so etwas aussehen könnte und ob es wirklich "menschenlesbar" ist. Natürlich habe ich keinen Anspruch auf Vollständigkeit oder Korrektheit, es geht eher darum, ein Gefühl dafür zu bekommen, wie ein bestimmtes Format aussehen würde und wie gut es zu lesen ist.

    Aktuelles (offizielles) Format: csv

    So sieht ein Item-Unterbaum aus:
    Code:
    Path;Type;Cache;Code;Desc;Knx_dpt;Knx_listen;Knx_reply;Knx_send;Nachlauf;Name;Trigger;Value
    #Date;2016-12-27 20:39:18+01:00;;;;;;;;;;;
    #Type;Nodes;;;;;;;;;;;
    #Version;2;;;;;;;;;;;
    OG.Waldi.Praesenz;bool;1;;;1;9/0/20;;;;Präsenz aktuell;;
    OG.Waldi.Praesenz.Fuenf;num;;;;1;;9/0/21;9/0/21;290;Präsenz in den letzten 5 Minuten;;
    OG.Waldi.Praesenz.Fuenfzehn;num;;;;;;;;890;Präsenz in den letzten 15 Minuten;;
    OG.Waldi.Praesenz.Symbol;num;;1 if .. == 1 else 2 if ..Fuenf == 1 else 3 if ..Fuenfzehn == 1 else 0;0=no, 1=now, 2=5min, 3=15min;;;;;;Präsenzsymbol;.. | ..Fuenf | ..Fuenfzehn;
    Eine SM sieht so aus:
    Code:
    State;Context;Group;Type;Selector;Property;Aggregator;Comparator;Value
    #Active;1;;;;;;;
    #Date;2016-12-27 20:44:14+01:00;;;;;;;
    #Delay;20;;;;;;;
    #Desc;Parent war true in den letzten 'nachlauf' Sekunden;;;;;;;
    #Loglevel;Debug;;;;;;;
    #Name;Nachlauf;;;;;;;
    #Selector;*:nachlauf;;;;;;;
    #Trigger;..;;;;;;;
    #Type;Machine;;;;;;;
    #Version;1;;;;;;;
    An;state;;active;;;;;1
    An;state;;desc;;;;;Parent ist true
    An;state;;value;;;;;1
    An;enter;Start;condition;..;;;==;1
    An;during;30;action;evaluate;;;;
    An;exit;Start;condition;..;;;==;0
    An;exit;Start;condition;..;age;;>=;:nachlauf
    Aus;state;;active;;;;;1
    Aus;state;;desc;;;;;Parent ist länger als 'nachlauf' Sekunden false
    Aus;state;;value;;;;;0
    Aus;enter;;condition;year;;;>=;0
    Visu kann man noch nicht exportieren, würde aber für Seiten, Widgets etc. ahnliche Konstrukte haben, denke ich.

    Im Vergleich dazu die alte sh.py Darstellung:
    So sieht ein Item-Unterbaum aus:
    Code:
            [[[Praesenz]]]
                name = Präsenz aktuell
                type = bool
                cache = True
                knx_dpt = 1
                knx_listen = 12/6/47
                [[[[Fuenf]]]]
                    name = Präsenz in den letzten 5 Minuten
                    type = num
                    knx_dpt = 1
                    knx_send = 12/6/48
                    knx_reply = 12/6/48
                    nachlauf = 290
                [[[[Fuenfzehn]]]]
                    name = Präsenz in den letzten 15 Minuten
                    type = num
                    nachlauf = 890
                [[[[Symbol]]]]
                    name = Präsenzsymbol
                    #0=no, 1=now, 2=5min, 3=15min
                    type = num
                    code = 1 if .. == 1 else 2 if ..Fuenf == 1 else 3 if ..Fuenfzehn == 1 else 0
                    trigger = .. | ..Fuenf | ..Fuenfzehn
    Und eine Möglichkeit, eine SM zu machen (angelehnt an das autoblind von sh.py):
    Code:
                {Nachlauf}
                    description = Parent war true in den letzten 'nachlauf' Sekunden
                    selector = *:nachlauf
                    trigger = ..
                    delay = 20
                    active = true
                    loglevel = Debug
                    sm_item_Parent = ..
                    {{An}}
                        sm_value_machine = 1
                        description = Parent ist true
                        {{{enter_Start}}}
                             sm_value_Parent = 1
                        {{{during_30}}}
                             sm_evaluate = true
                        {{{exit_Start}}}
                             sm_value_Parent = 0
                             sm_minage_Parent = :nachlauf
                    {{Aus}}
                         sm_value_machine = 0
                         description = Parent ist länger als 'nachlauf' Sekunden false
                         {{{enter}}}
                             sm_min_year = 0
    Für die visu habe ich auch noch keine gute Idee, ich verwende einen speziellen Namen für das Widget (mit <> statt [] bei Items) und Attribute, das ist nicht besonders toll lesbar (eher als Diskussionsgrundlage):
    Code:
    <<<cd.icon>>>
        item = OG.Praesenz.Symbol
        mode = map
        condition = 0=cd/empty|1=cd/man|2=cd/man|3=cd/man
        concolor = 0=white|1=black|2=grey|3=lightgrey
        _class = m
    Und als JSON:
    So würde ein Item-Unterbaum aussehen können:
    Code:
        "Praesenz": {
            "name": "Präsenz aktuell",
            "type": "bool",
            "cache": true,
            "knx_dpt": "1",
            "knx_listen": "12/6/47",
            "Fuenf": {
                "name": "Präsenz in den letzten 5 Minuten",
                "type": "num",
                "knx_dpt": "1",
                "knx_send": "12/6/48",
                "knx_reply": "12/6/48",
                "nachlauf": 290
            },
            "Fuenfzehn": {
                "name": "Präsenz in den letzten 15 Minuten",
                "type": "num",
                "nachlauf": 890
             },
            "Symbol": {
                "name": "Präsenzsymbol",
                "description": "0=no, 1=now, 2=5min, 3=15min",
                "type": "num",
                "code": "1 if .. == 1 else 2 if ..Fuenf == 1 else 3 if ..Fuenfzehn == 1 else 0",
                "trigger": [
                    "..",
                    "..Fuenf",
                    "..Fuenfzehn"
                ]
            }
        }
    Und eine Möglichkeit, eine SM zu machen (angelehnt an das autoblind von sh.py):
    Code:
                "stateMachine": {
                    "name": "Nachlauf",
                    "description": "Parent war true in den letzten 'nachlauf' Sekunden",
                    "selector": [ "*:nachlauf" ],
                    "trigger": [ ".." ],
                    "delay": 20,
                    "active": true,
                    "loglevel": "Debug",
                    "sm_item_Parent": "..",
                    "An": {
                        "sm_value_machine": "1",
                        "description": "Parent ist true",
                        "enter_Start": {
                            "sm_value_Parent": "1"
                        },
                        "during_30": {
                            "sm_evaluate": true
                        },
                        "exit_Start": {
                            "sm_value_Parent": "0",
                            "sm_minage_Parent": ":nachlauf"
                        }
                    },
                    "Aus": {
                        "sm_value_machine": "0",
                        "description": "Parent ist länger als 'nachlauf' Sekunden false",
                        "enter": {
                            "sm_min_year": "0"
                        }
                    }
                }
    Und die Visu:
    Code:
                    {
                        "cd.icon": {
                            "name": "",
                            "item": "OG.Praesenz.Symbol",
                            "mode": "map",
                            "condition": "0=cd/empty|1=cd/man|2=cd/man|3=cd/man",
                            "concolor": "0=white|1=black|2=grey|3=lightgrey"
                        }
                    }

    Alle 3 Formate drücken das selbe aus: Ein Item Praesenz mit 3 Unteritems, eine dazu passende SM und ein Visu-Element, dass sich auf das Item Symbol bezieht. Man sieht, wie schnell selbst einfachste Strukturen (4 Items sind nicht viel) geschwätzig werden...

    Warum habe ich das geschrieben: Weil eine menschenlesbare Ausgabe ein sehr breites Feld ist, man muss sich auf eine Syntax einigen und die muss so geartet sein, dass sie den meisten Menschen "genehm" ist. Außerdem muss das Format aus den aktuellen Items, SM und Widgets generiert werden können und letztendlich auch maschinenlesbar sein (denn die Forderung wird auch kommen).

    Meiner Meinung nach sollte es einen gewissen "common sense" geben, was menschenlesbar ist, bevor Marcus überhaupt anfängt, sich in dieser Richtung Gedanken zu machen. Ich arbeite schon ne Weile mit allen 3 Formaten und habe mich intern für JSON entschieden - aber nur, weil ich einen guten Editor dafür habe.

    Gruß, Waldemar
    OpenKNX www.openknx.de

    #2
    Hi,

    Ziel der Übung ist es das man die selben Informationen erhält wie es ein Screenshot einem bereitstellt. Und da finde ich die Smarhome.py darstellung eigentlich gut. Die Struktur solle rein durch Einrückungen darstellen. Ohne "" und {}

    Aber:
    Wenn man das JSON oder XML oder was auch immer einfach zum Ziel und Marcus da nicht viel tun muss könnte wir auch das nehmen. Ich würde an der stelle recht pragmatisch entscheiden.

    VG
    Jürgen

    Kommentar


      #3
      Json +1

      Das ist auch zum Programmieren sehr dankbar, es gibt Schema und Validierungsmöglichkeiten.
      Zuletzt geändert von trollvottel; 27.12.2016, 21:58.

      Kommentar

      Lädt...
      X