Ankündigung

Einklappen
Keine Ankündigung bisher.

Autogeneration Hacks für smartVISU

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

  • ruuud
    antwortet
    find ich auch sehr cool

    Was muss man machen um die Features zu nutzen?

    lg rudi

    Einen Kommentar schreiben:


  • Apollo
    antwortet
    Sehr cool: +1

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Wollte das Thema mal wieder herauskramen und meine Änderungen publizieren.

    Ich habe nun folgendes eingebaut:
    - Option für Einträge in der rechten Spalte der Navigation (sv_nav_aside) zu generieren
    - Option um auf einer Seite im Kopfbereich (über den "Boxen") etwas Rechts, Mittig oder Links anzeigen zu lassen (sv_heading_right, sv_heading_center, sv_heading_left)
    - Option um eine Übersicht (sv_page = overview) zu erstellen von verschiedenen Objekten (z.B. sv_overview = light) welche z.B. mit sv_item_type = light gekennzeichnet sind.
    - Option um einen Seperator in das Menü zu bauen (sv_page = seperator)

    Wie das Ergebnis aussieht sieht man im Anhang

    Hier nochmal ein Beispiel wie man es einsetzen kann:
    Code:
    [eg]
            [[eg-sep]]
                    name = Erdgeschoß
                    sv_page = seperator
    
            [[flur]]
                    name = Flur
                    sv_page = room
                    sv_img = scene_stairs.png
                    sv_nav_aside = "{{ basic.float('item', 'eg.flur.temperature', '°C') }}"
                    sv_heading_left = "Zentral &nbsp;<span data-role="controlgroup" data-type="horizontal">{{ basic.button('bz1', 'zentral.beleuchtung.flur', 'An', '', 'on') }}{{ basic.button('bz2', 'zentral.beleuchtung.flur', 'Aus', '', 'off') }}</span>"
    
                    [[[licht1]]]
                            name = Flur 1
                            type = bool
                            visu = yes
                            sv_widget = "{{ my_widgets.switch('item', 'Beleuchtung', 'item', 'item.stromwert', 'item.wh', 'item.betriebsstunden') }}"
                            sv_item_type = light
                            knx_dpt = 1
                            knx_send = 2/0/120
                            knx_listen = 2/1/120
                            knx_init = 2/1/120
    
                            [[[[stromwert]]]]
                                    type = num
                                    visu = yes
                                    knx_dpt = 9
                                    knx_listen = 2/5/120
                                    knx_init = 2/5/120
                            [[[[wh]]]]
                                    type = num
                                    visu = yes
                                    knx_dpt = 13
                                    knx_listen = 2/6/120
                                    knx_init = 2/6/120
                            [[[[betriebsstunden]]]]
                                    type = num
                                    visu = yes
                                    knx_dpt = 7
                                    knx_listen = 2/7/120
                                    knx_init = 2/7/120
    
    [zentral]
            [[uebersicht-sep]]
                    name = Übersichten
                    sv_page = seperator
    
            [[beleuchtung]]
                    name = Beleuchtung
                    sv_page = overview
                    sv_img = light_light.png
                    sv_overview = light
                    sv_heading_left = "Alle Zentral <span data-role="controlgroup" data-type="horizontal">{{ basic.button('bz1', 'zentral.beleuchtung.alle', 'An', '', 'on') }}{{ basic.button('bz2', 'zentral.beleuchtung.alle', 'Aus', '', 'off') }}</span>"
                    sv_heading_right = "Flur Zentral <span data-role="controlgroup" data-type="horizontal">{{ basic.button('bfz1', 'zentral.beleuchtung.flur', 'An', '', 'on') }}{{ basic.button('bfz2', 'zentral.beleuchtung.flur', 'Aus', '', 'off') }}</span>"
    
                    [[[alle]]]
                            type = bool
                            visu = yes
                            knx_dpt = 1
                            knx_send = 1/2/0
                    [[[eg]]]
                            type = bool
                            visu = yes
                            knx_dpt = 1
                            knx_send = 1/2/2
                    [[[flur]]]
                            type = bool
                            visu = yes
                            knx_dpt = 1
                            knx_send = 1/2/120
                    [[[keller]]]
                            type = bool
                            visu = yes
                            knx_dpt = 1
                            knx_send = 1/2/1
    Wäre super wenn das seinen Weg upstream findet

    Die Variablen kann man ja gerne umbenennen, wenn ihr da was besseres dafür habt.

    Gruß
    Angehängte Dateien

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    hmm, das ist noch ein Codefragment das nicht mehr verwendet wurde.

    Ich habe gerade was eingecheckt das Dir und anderen hilft.

    Der Code muss dann so aussehen:
    Code:
    sv_widget = "{{ basic.float('item', 'eg.flur.temperature',  '°C') }}[COLOR="Red"]", "[/COLOR]{{ basic.float('item', 'eg.flur.temperature',  '°C') }}"
    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Zitat von mknx Beitrag anzeigen
    Das unterstützt die Configengine so nicht. Deswegen hast Du auch den Fehler bekommen.
    wieso dann das
    Code:
    if isinstance(item.conf['sv_widget'], list):
    Hier wird doch geprüft ob es sich um eine Liste handelt?

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hallo Thomas,

    Zitat von TCr82 Beitrag anzeigen
    Achso noch was... wie kann man mehrere Widgets pro Item anlegen?
    Das unterstützt die Configengine so nicht. Deswegen hast Du auch den Fehler bekommen.

    Man kann aber mehrere Widgets in ein sv_widget packen:
    Code:
    sv_widget = "{{ basic.float('item', 'eg.flur.temperature',  '°C') }} {{ basic.float('item', 'eg.flur.temperature',  '°C') }}"
    Die sind dann allerdings in einem Block zusammengefasst.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • Apollo
    antwortet
    +1

    Wenn du fertig bist, kannst du mir gerne die geänderten Templates zukommen lassen.

    Gruss

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Zitat von mknx Beitrag anzeigen
    Hallo Thomas,

    coole Sache. Ich dachte auch daran das manch (PowerUser) seine eigenen Generator-Logiken entwickelt. Man kann die ja dann einfach beim Start durchlaufen lassen.
    wäre schön wenn man das evtl. auch in das Projekt übernehmen könnte? Dann kann jeder dauerhaft davon profitieren, ohne dass er sich mit dem Programmieren auskennen muss bzw. irgendwas rum patch...

    Zitat von mknx Beitrag anzeigen
    Wie kommst Du darauf das man die pyc löschen muss?
    Wenn sich die py Datei geändert hat, wird eine pyc generiert.
    Achso dachte dass muss so sein - wie gesagt kenne mich nicht so aus mit python... nehme es oben aus dem text raus.

    Achso noch was... wie kann man mehrere Widgets pro Item anlegen?

    Der Code suggeriert mir dass es wohl irgendwie möglich ist... die Doku schweigt aber darüber wie:

    Code:
            if isinstance(item.conf['sv_widget'], list):
                widget = ', '.join(item.conf['sv_widget'])
            else:
                widget = item.conf['sv_widget']
    habe es schon so versucht:

    Code:
             sv_widget = "{{ basic.float('item', 'eg.flur.temperature',  '°C') }}"
            sv_widget = "{{ basic.float('item', 'eg.flur.temperature',  '°C') }}"
    Fehler war dann aber:
    2013-05-12 11:02:44 SmartHome.py WARNING Problem reading eg.conf: Duplicate keyword name at line 11.

    Und bei:
    Code:
             sv_widget = ["{{ basic.float('item', 'eg.flur.temperature', '°C') }}", "{{ basic.float('item', 'eg.flur.temperature', '°C') }}"]
    2013-05-12 11:04:32 SmartHome.py WARNING Problem reading eg.conf: Parse error in value at line 10.

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hallo Thomas,

    coole Sache. Ich dachte auch daran das manch (PowerUser) seine eigenen Generator-Logiken entwickelt. Man kann die ja dann einfach beim Start durchlaufen lassen.

    Wie kommst Du darauf das man die pyc löschen muss?
    Wenn sich die py Datei geändert hat, wird eine pyc generiert.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • TCr82
    hat ein Thema erstellt Autogeneration Hacks für smartVISU.

    Autogeneration Hacks für smartVISU

    Ich will euch hier ein paar meiner Hacks für die Autogeneration vorstellen:

    1. In der Navigation fehlte mir eine Option um Einträge wie z.B. Temperatur auf der rechten Seite einzublenden:

    Dazu habe ich folgendes Modifiziert:
    smarthome.py:
    Code:
    diff --git a/plugins/visu/smartvisu.py b/plugins/visu/smartvisu.py
    old mode 100755
    new mode 100644
    index d33824a..aac462d
    --- a/plugins/visu/smartvisu.py
    +++ b/plugins/visu/smartvisu.py
    @@ -92,7 +92,11 @@ def pages(smarthome, directory):
                 img = item.conf['sv_img']
             else:
                 img = ''
    -        nav_lis += parse_tpl(tpldir + '/navi.html', [('{{ visu_page }}', item.id()), ('{{ visu_name }}', str(item)), ('{{ visu_img }}', img)])
    +        if 'sv_nav_aside' in item.conf:
    +            nav_aside = item.conf['sv_nav_aside']
    +        else:
    +            nav_aside = ''
    +        nav_lis += parse_tpl(tpldir + '/navi.html', [('{{ visu_page }}',  item.id()), ('{{ visu_name }}', str(item)), ('{{ visu_img }}', img),  ('{{ visu_aside }}', nav_aside), ('item.name', str(item)), ("'item", "'" + item.id()) ])
             with open("{0}/{1}.html".format(outdir, item.id()), 'w') as f:
                 f.write(r)
         nav = parse_tpl(tpldir + '/navigation.html', [('{{ visu_navis }}', nav_lis)])
    smartVISU:
    Code:
    Index: pages/base/tpl/navi.html
    ===================================================================
    --- pages/base/tpl/navi.html    (Revision 329)
    +++ pages/base/tpl/navi.html    (Arbeitskopie)
    @@ -1,6 +1,7 @@
     <li data-icon="false">
         <a href="index.php?page={{ visu_page }}">
             <img class="icon" src="{{ icon0 }}{{ visu_img }}"/><h3>{{ visu_name }}</h3>
    +       <div class="ui-li-aside">{{ visu_aside }}</div>
         </a>
     </li>
    Anzuwenden ist das ganze dann z.B. so:

    Code:
    [eg]
        [[flur]]
            name = Flur
            sv_page = room
            sv_img = scene_stairs.png
            sv_nav_aside = "{{ basic.float('item', 'eg.flur.temperature', '°C') }}"
    Als nächstes kommt ein Hack um z.B. Erdgeschoß als Trennlinie (data-role="list-divider") in der Navigation einzufügen.

    Code:
    diff --git a/plugins/visu/smartvisu.py b/plugins/visu/smartvisu.py
    old mode 100755
    new mode 100644
    index d33824a..58f50a5
    --- a/plugins/visu/smartvisu.py
    +++ b/plugins/visu/smartvisu.py
    @@ -87,14 +87,28 @@ def pages(smarthome, directory):
             except Exception, e:
                 logger.warning("Could not delete file {0}: {1}".format(fp, e))
         for item in smarthome.find_items('sv_page'):
    -        r = room(smarthome, item, tpldir)
    -        if 'sv_img' in item.conf:
    -            img = item.conf['sv_img']
    -        else:
    -            img = ''
    -        nav_lis += parse_tpl(tpldir + '/navi.html', [('{{ visu_page }}', item.id()), ('{{ visu_name }}', str(item)), ('{{ visu_img }}', img)])
    -        with open("{0}/{1}.html".format(outdir, item.id()), 'w') as f:
    -            f.write(r)
    +        if item.conf['sv_page'] == 'room':
    +            r = room(smarthome, item, tpldir)
    +            if 'sv_img' in item.conf:
    +                img = item.conf['sv_img']
    +            else:
    +                img = ''
    +            if 'sv_nav_aside' in item.conf:
    +                if isinstance(item.conf['sv_nav_aside'], list):
    +                    nav_aside = ', '.join(item.conf['sv_nav_aside'])
    +                else:
    +                    nav_aside = item.conf['sv_nav_aside']
    +            else:
    +                nav_aside = ''
    +
    +            nav_lis += parse_tpl(tpldir + '/navi.html', [('{{ visu_page }}', item.id()), ('{{ visu_name }}', str(item)), ('{{ visu_img }}', img), ('{{ visu_aside }}', nav_aside), ('item.name', str(item)), ("'item", "'" + item.id()) ])
    +
    +            with open("{0}/{1}.html".format(outdir, item.id()), 'w') as f:
    +                f.write(r)
    +
    +        elif item.conf['sv_page'] == 'seperator':
    +            nav_lis += '<li data-role="list-divider">' + str(item) + '</li>\n'
    +
         nav = parse_tpl(tpldir + '/navigation.html', [('{{ visu_navis }}', nav_lis)])
         with open(outdir + '/navigation.html', 'w') as f:
             f.write(nav)
    Da ist der Code für das sv_nav_aside schon mit drin. Und so wendet man das dann an:

    Code:
    [eg]
        [[eg-sep]]
            name = Erdgeschoß
            sv_page = seperator
    
        [[flur]]
            name = Flur
            sv_page = room
            sv_img = scene_stairs.png
            sv_nav_aside = "{{ basic.float('item', 'eg.flur.temperature', '°C') }}"
    was mir noch so fehlt:

    Nämlich dass man in einem "Raum" nicht nur Widgets in den Blöcken haben kann sondern nochmal einen Header mit Widgets um Zentralfunktionen abzulegen... und später evtl. dass man noch eine Übersicht z.B. über alle Beleuchtungen, Rolläden, Temperaturen, usw. hat... und dass man noch bei den Blöcken der Widgets eigenschaften festlegen kann, wie z.B. den Blocktype... und dass er immer den Namen als Block-Überschrift nimmt gefällt mir auch nicht... naja, mal schauen...
Lädt...
X