Ankündigung

Einklappen
Keine Ankündigung bisher.

Autogeneration Hacks für smartVISU

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

    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...

    #2
    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

    Kommentar


      #3
      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.

      Kommentar


        #4
        +1

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

        Gruss
        Join smartVISU on facebook. Web: smartvisu.de.
        Dir gefällt smartVISU? Bitte spenden für die Weiterentwicklung.

        Kommentar


          #5
          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

          Kommentar


            #6
            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?

            Kommentar


              #7
              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

              Kommentar


                #8
                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

                Kommentar


                  #9
                  Sehr cool: +1
                  Join smartVISU on facebook. Web: smartvisu.de.
                  Dir gefällt smartVISU? Bitte spenden für die Weiterentwicklung.

                  Kommentar


                    #10
                    find ich auch sehr cool

                    Was muss man machen um die Features zu nutzen?

                    lg rudi

                    Kommentar


                      #11
                      Was man noch verbessern könnte, wäre das entfernen des HTMLs in der config-Datei. Das finde ich stört.

                      Gruss
                      Join smartVISU on facebook. Web: smartvisu.de.
                      Dir gefällt smartVISU? Bitte spenden für die Weiterentwicklung.

                      Kommentar


                        #12
                        Zitat von ruuud Beitrag anzeigen
                        Was muss man machen um die Features zu nutzen?
                        Einfach die zwei patches downloaden, in das Verzeichnis von sh.py bzw. sv wechseln und dort folgendes Kommando ausführen:

                        patch -p0 < /path/to/diff

                        Natürlich zuletzt noch die Änderungen an der item.conf.

                        Die patches passen zu den aktuellen Trunks (also dem aktuellen svn/git checkout). Bei anderen Versionen könnte es zu Problemen kommen (man kann das patchen vorher mit dem zusätzlichen Parameter --dry-run austesten).

                        Wie gesagt, vielleicht wird es ja auch upstream aufgenommen, dann muss niemand sich mit "patches" herumschlagen.

                        Zitat von Apollo Beitrag anzeigen
                        Was man noch verbessern könnte, wäre das entfernen des HTMLs in der config-Datei. Das finde ich stört.
                        Was meinst du? Den HTML Teil in sv_heading_xxx? Da der Teil flexibel sein solle wird einem da nichts Übrig bleiben. Außer man bastelt sich ein Widget und ruft dass dann hier auf. Aber wie gesagt da wird man nicht wirklich drum rum kommen wenn das für den Benutzer flexibel bleiben soll...

                        Kommentar


                          #13
                          Zitat von TCr82 Beitrag anzeigen
                          Was meinst du? Den HTML Teil in sv_heading_xxx? Da der Teil flexibel sein solle wird einem da nichts Übrig bleiben. Außer man bastelt sich ein Widget und ruft dass dann hier auf. Aber wie gesagt da wird man nicht wirklich drum rum kommen wenn das für den Benutzer flexibel bleiben soll...
                          Ja, ich würde es aber vermeiden wollen in einer config HTML Teile zu lagern. Was hällst du davon, das man an eigenes "mini" Tempalte für den Header macht?

                          Gruss
                          Join smartVISU on facebook. Web: smartvisu.de.
                          Dir gefällt smartVISU? Bitte spenden für die Weiterentwicklung.

                          Kommentar


                            #14
                            AW: Autogeneration Hacks für smartVISU

                            Ich versteh das Problem nicht... der der den html code nicht in der Config haben will kann sich ja ein widget bauen.

                            Aber letztendlich bleibt es wohl jedem selbst überlassen wie er das nutzt. Hätt ich jetzt in meinem Beispiel kein HTML sondern ein Widget verwendet dann wärs nicht mal aufgefallen. Ich kann ja genau so in den anderen Variablen in der items.conf html platzieren wen ich es denn wollte.

                            Was genau meinst du mit mini Template? Haste mal ein Beispiel?

                            Gesendet von meinem GT-I9100 mit Tapatalk 2

                            Kommentar


                              #15
                              Zitat von TCr82 Beitrag anzeigen
                              Ich versteh das Problem nicht... der der den html code nicht in der Config haben will kann sich ja ein widget bauen.

                              ......................

                              Gesendet von meinem GT-I9100 mit Tapatalk 2
                              Leider gibt es viele Endanwender, die nicht in der Lage sind, ein Widget zu basteln, und die auch Appetit bekommen, wenn sie das Ergebnis deiner Modifikation sehen, die ich übrigens für sehr gelungen halte!

                              Gruß Claus
                              if you make something idiot-proof, they start making better idiots......
                              KNX:3 Linien,121 Teiln.,Siemens N146 und N350E,RasPi mit SV,8 FBH-Kreise mit Siemens HK-Regler,HS4, Haus ohne öffentl. Wasser-/Stromversorg.,PV-Anlage Wechselrichter:SI5048(8kW, 24 Pufferbatterien 1400Ah),PV-Module mit 7,5kWp

                              Kommentar

                              Lädt...
                              X