Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Wildcards in logic.conf

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

    [Featurewunsch] - √ - Wildcards in logic.conf

    Hallo,

    mir würden Wildcards in der logic.conf im Zusammenspiel mit den hierarchischen Items sehr viel Tipparbeit abnehmen:

    Beispiel watch_item:
    Anstatt:
    watch_item = jalou.arbeitszimmer_nord.stat.oben, jalou.arbeitszimmer_nord.stat.unten, jalou.arbeitszimmer_ost.stat.oben, jalou.arbeitszimmer_ost.stat.unten
    könnte man
    watch_item = jalou.*.stat.oben, jalou.*.stat.unten
    schreiben.

    Hier in dem Beispiel habe ich jetzt nur 2 Jalousien. Mit 8 wird die Vereinfachung noch deutlicher...

    VG

    Mode

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

    Kommentar


      #3
      +2

      Kommentar


        #4
        So Ihr Faulpelze ;-)

        Gerade in github eingecheckt. Damit kann man für eval_trigger ([item].conf) und watch_item (logic.conf) auch '*' verwenden.
        Das ganze beliebig oft, vorne, hinten oder in der Mitte. (Für die Ambitionierten: dort funktioniert auch eine Regex allerdings ist der '.' und das '*' reserviert)

        Achtung: ich habe auch an der Visu-API geschraubt, damit die RRD und Logs 'schöner' für Apollo/smartVISU exportiert werden. => smarthome(.min).js müssen aktualisiert werden.

        Über Tests und Feedback freue Ich mich.

        Bis bald

        Marcus

        Kommentar


          #5


          Gruß, Martin

          Kommentar


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

            Kommentar


              #7


              soeben getestet und für gut befunden :-)

              Kommentar


                #8
                Wie kann ich RRD's in smartvisu machen, da hatte ich bisher nichts gefunden ?

                Gruß aus Maintal
                Michael

                Kommentar


                  #9
                  Hallo Michael,

                  das unterstützt die smartVISU noch nicht... aber soweit ich weiß sind Marcus und Martin dran.
                  Mit freundlichen Grüßen
                  Niko Will

                  Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                  - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                  Kommentar


                    #10
                    Ich möchte einmal ein Beispiel für die Nutzung der Wildcards vorstellen.

                    Szenario:
                    Wir haben einen Rolladen im Schlafzimmer und einen in der Küche, die jeweils auf einer GA eine 1 senden, wenn sie ganz oben oder ganz unten sind.
                    Für die Taster die eine Ein-Tasten Jalousteuerung bieten, benötige ich eine GA die anzeigt ob die nächste Fahrt nach oben oder nach unten geht. Diese GA wird von sh.py bedient. Sie wird als richtung bezeichnicht und hat eine 1 für unten (nächste Fahrt geht hoch) und eine 0 für oben (nächste Fahrt gehr runter).
                    btw: Warum das Ganze? Mein Jalou Aktor kann nur entweder dieses Richtungsobjekt ODER ein Objekt für die aktuelle Position in % ausgeben. Letzeres benötige ich für meine Visu und Ersteres baue ich hier durch diese Logik nach.


                    items.conf
                    Code:
                    [jalou]
                        [[schlafzimmer]]
                            [[[stat]]]
                                [[[[oben]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_listen = 3/1/10
                                [[[[unten]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_listen = 3/1/11
                                [[[[richtung]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_send = 3/1/3
                                    knx_reply = 3/1/3
                        [[kueche]]
                            [[[stat]]]
                                [[[[oben]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_listen = 3/1/30
                                [[[[unten]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_listen = 3/1/31
                                [[[[richtung]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_send = 3/1/23
                                    knx_reply = 3/1/23
                    logic.conf:
                    Code:
                    [Logi_Jalou]
                            filename = logi_jalou.py
                            watch_item = jalou.*.stat.oben, jalou.*.stat.unten
                    logi_jalou.py
                    Code:
                    #!/usr/bin/env python
                    for raum in sh.jalou:
                        if raum.stat.unten():
                            raum.stat.richtung('on')
                        if raum.stat.oben():
                            raum.stat.richtung('off')
                    Dieses Coding funktioniert wunderbar!
                    Leider nur, wenn man kein "enfoce_updates = true" für das Richtungs-Objekt nutzt.

                    items.conf
                    Code:
                    [jalou]
                        [[schlafzimmer]]
                            [[[stat]]]
                                [[[[oben]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_listen = 3/1/10
                                [[[[unten]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_listen = 3/1/11
                                [[[[richtung]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_send = 3/1/3
                                    knx_reply = 3/1/3
                                    enforce_updates = true
                        [[kueche]]
                            [[[stat]]]
                                [[[[oben]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_listen = 3/1/30
                                [[[[unten]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_listen = 3/1/31
                                [[[[richtung]]]]
                                    type = bool
                                    knx_dpt = 1
                                    knx_send = 3/1/23
                                    knx_reply = 3/1/23
                                    enforce_updates = true
                    Dann wird für alle Jalous das Objekt Richtung gesendet, auch wenn nur eine in eine Endposition gefahren wurde.

                    Möchten wir nur auf das triggende Objekt reagieren, kann folgendes Coding eingesetzt werden:
                    logi_jalou.py
                    Code:
                    #!/usr/bin/env python
                    import re
                    if trigger['value']:
                        re_richtung = re.compile('((unten$)|(oben$))')
                        cmd = re_richtung.sub("richtung",trigger['source'])
                    
                        re_unten = re.compile('(^jalou.[a-z_]+.stat.unten$)')
                        if re_unten.match(trigger['source']):
                            cmd = 'sh.' + cmd + '(\'on\')'
                            exec cmd
                    
                        re_oben = re.compile('(^jalou.[a-z_]+.stat.oben$)')
                        if re_oben.match(trigger['source']):
                            cmd = 'sh.' + cmd + '(\'off\')'
                            exec cmd
                    Funktioniert zwar gut, aber fällt jemandem vielleicht eine KISS Lösung ein?

                    VG

                    Mode

                    Kommentar


                      #11
                      - √ - Wildcards in logic.conf

                      Zitat von mode Beitrag anzeigen
                      Dieses Coding funktioniert wunderbar!
                      Leider nur, wenn man kein "enfoce_updates = true" für das Richtungs-Objekt nutzt.
                      Was funktioniert denn nicht?

                      Wird oben und unten eigentlich auch wieder auf False gesetzt?

                      Bis bald

                      Marcus

                      Kommentar


                        #12
                        Hi,
                        ja oben und unten wird false gesetzt sobald die Jalou nicht mehr in einer Endposition ist.

                        Das Coding mit enforce_update funktioniert wie es technisch soll. Aber logisch möchte ich natürlich nicht für alle Jalous das Objekt Richtung (erneut) gesendet sehen wenn nur eine Jalou eine Endstellung erreicht hat. Durch die Schleife und das Enforce würde das passieren.
                        Daher das 2. Coding, so dass nur das notwendige Richtung Objekt gesetzt wird und nicht jedes.

                        Kommentar


                          #13
                          - √ - Wildcards in logic.conf

                          Sorry wenn ich so Nachfrage. Wieso lässt Du das enforce_... Nicht weg?

                          Kommentar


                            #14
                            Hi,

                            nur so für das Protokoll. Ob das jetzt einfacher ist liegt im Auge des Betrachters, es meidet zumindest regex. Ich habe den Code nicht getestet, vllt. ist noch ein Typo drin...

                            Zitat von mode Beitrag anzeigen
                            Code:
                            #!/usr/bin/env python
                            if trigger['value']:
                                direction = trigger['source'].rsplit('.', 1)[0] + '.richtung'
                                # langsam zum mitschreiben
                                # itemarray = trigger['source'].rsplit('.', 1)  # rsplit teilt von rechts bei jedem '.' und wird auf einmal teilen limitiert
                                # baseitemname = itemarray[0]  # nur den ersten Teil der zurückgegeben Liste betrachten
                                # direction = baseitemname + '.richtung'  # und das '.richtung' anfügen
                                direction = sh.return_item(direction)  # holt das Item Object für direction
                                if trigger['source'].endswith('unten'):
                                    direction(True)
                                if trigger['source'].endswith('oben'):
                                    direction(False)
                            Wobei ich Deine erste Logik irgendwie schöner finde. Mir ist aber (siehe Post oben) immer noch nicht klar, wieso die bei Dir nicht funktioniert.

                            Bis bald

                            Marcus

                            Kommentar


                              #15
                              Hey Marcus,

                              danke für dein Beispiel.
                              Die Methode return_item war genau das, was ich gesucht hatte. Dann komme ich ohne das exec aus, super!

                              Warum enforce_updates?
                              Eigentlich nur um eben dieses Beispiel zu haben.

                              VG

                              Mode

                              Kommentar

                              Lädt...
                              X