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:
Eine SM sieht so aus:
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:
Und eine Möglichkeit, eine SM zu machen (angelehnt an das autoblind von sh.py):
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):
Und als JSON:
So würde ein Item-Unterbaum aussehen können:
Und eine Möglichkeit, eine SM zu machen (angelehnt an das autoblind von sh.py):
Und die Visu:
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
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;
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
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
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
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
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" ] } }
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" } } }
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
Kommentar