Ankündigung

Einklappen
Keine Ankündigung bisher.

UZSU Widget

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

    #31
    Zitat von Orion Beitrag anzeigen
    Was mir helfen würde (falls vorhanden) etwas mehr kommentierter Source oder eine Handskizze der Architektur bzw. des Datenmodells, wie das js mit den Daten aus sh des schedulers umgeht.
    Das wichtigste aus meiner Sicht ist, dass das Widget von jQuery on the fly generiert wird, also kein HTML Template irgendwo in die Seite eingefügt werden muss. Hätte auch den Vorteil, dass man das Widget relativ leicht sowohl in der normalen SV Version als auch in meinem quad Design verwenden kann.

    Wenn das jemand mit jQuery Kenntnissen machen würde, aufbauend auf dem aktuellen HTML Code, wären wir einen riesigen Schritt weiter. Die vorhandenen Panels als Vorlage sollten dazu eigentlich reichen. Wenn das funktioniert, könnte ich mir daran wiederum anschauen, wie man das aus jQuery heraus macht und dann die fehlenden Panels auf dieser Grundlage implementieren.

    Die fehlenden Panels in der jetzigen "Architektur" einzufügen wäre zu mühsig und unflexibel. Mir fehlt aber die Zeit mich in jQuery so einzuarbeiten, dass ich das selber hin bekomme.

    Zitat von Dragonos2000 Beitrag anzeigen
    Hallo Niko, unabhängig von Zeit, etc. denke ich das oben ist ein Trugschluss. Ich wünsche mir das auch schon lange, auch ein Arbeitskollege von mir, und ich denke das ist bei zahlreichen anderen Nutzern "inkognito" ebenso. Nur habe ich von HTML, CSS und JS noch weitaus weniger praktischen Skill, als dass ich in irgendeiner Form einen positiven Beitrag leisten könnte
    Zitat von Hochpass Beitrag anzeigen
    Bezogen auf Unterstützung oder positives Feedback?
    Ich glaube schon, das sich viele riesig darüber freuen würden.
    Helfende Hände werden natürlich bevorzugt. Als ich mal den Aufruf machte, war das Feedback relativ groß. Aber weder auf diesen Post, noch das korrespondierende sh.py Plugin kam viel Resonanz, auch was das reine Testen anbelangt. Daher habe ich das auf meiner TODO Liste nicht sehr hoch priorisiert (bei mir tut es ja und ob die Oberfläche dafür so schön ist, ist mir erstmal nicht so wichtig). Durch die Veränderungen in meinem Privatleben hat sich das ganze dann komplett aus meinem Fokus geschlichen.
    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


      #32
      OK, dann schaue ich mir das mal an.

      Michel

      Kommentar


        #33
        So habe nun auch endlich die Zeit gefunden das Widget einzubauen, echt klasse. Auch an dieser Stelle noch mal ein großes Lob und Dankeschön für die Umsetzung, auch wenn ich das im UZSU Plugin Thread nebenan schon geschrieben habe.

        Zitat von 2ndsky Beitrag anzeigen
        Wenn aktiviert, sollte sowohl bei der Zeile als auch unter der Liste das x zu sehen sein. Der Haken heißt deaktiviert. Mir ist das prinzipiell egal, wie rum man die Icons anzeigt. Darüber kann man gerne diskutieren und das ändern. Mir war erstmal die Funktion wichtig.
        Ich fänd es auch sinnvoller den Status anzuzeigen, so wie schon von Orion vorgeschlagen. So kenne ich es default in der smartVISU, wenn ich z.B. ein Licht einschalte wird das Symbol eingefärbt (z.B. orange) angezeigt, damit sehe ich sofort, dass dieses Licht an ist. Schalte ich es wieder aus, ist das icon wieder grau. Übertragen auf das UZSU widget, x = deaktiviert und der Haken = aktiviert.

        Gruß,
        Henning

        Kommentar


          #34
          Ich bin zwar noch nicht viel weiter gekommen, da mich andere Themen beschäftigt hatten, ich versuche mal meinen Stand ohne Quad zumindest mal zu posten. Am Widget hatte ich mich mal eingearbeitet.

          Michel

          Kommentar


            #35
            Zitat von 2ndsky Beitrag anzeigen
            Einfach die widget_visu.html und die visu.js importieren, die base.html wie beschrieben anpassen und dann in die Seite folgendes einfügen:
            Will mich langsam auch mal an die USZU wagen. Hab' den Code mal kurz überflogen. Soweit ich ihn verstanden habe, brauch' ich aus der visu.js ja eigentlich nur den Abschnitt ab "visu.uzsu_icon" zu übernehmen, oder?

            Gruss
            Jochen.

            Kommentar


              #36
              Korrekt.
              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


                #37
                Hi Niko,

                Zitat von 2ndsky Beitrag anzeigen
                Den Quellcode findet ihr in meinem quad Design Github Repo (https://github.com/2ndsky/quad). Die genauen Änderungen könnt ihr hier ansehen: https://github.com/2ndsky/quad/commi...6544be3d74b776
                Was ist denn "widget_list.html" für eine Datei? Die finde ich in meiner V 2.7 nicht...
                Sorry, für die vielleicht blöde Frage.

                Gruss
                Jochen.

                Kommentar


                  #38
                  Hi Jochen,

                  das sind die zusätzlichen Widgets, die man für das Quad Design braucht. Für die UZSU sollten die nicht nötig sein.
                  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


                    #39
                    Hallo,

                    sorry für den Delay in den Rückmeldungen. Ich hatte mir ja vorgenommen das Thema soweit zu extrahieren, damit man es auch anders nutzen kann. Mea Kulpa :-( es ist leider viel los gewesen. Um zumindest etwas beizutragen anbei ein ZIP, wo die relevanten Anteile einmal aus dem Repo herausgezogen worden sind, damit man die einzeln einbauen kann. Allerdings ist das nur der Anfang, der Wunsch war ja das zu eine dynamischen Generierung des Popup zu bekommen, da gibt e auch schon Ideen.

                    Grüße Michel
                    Angehängte Dateien

                    Kommentar


                      #40
                      Hi Michel,

                      super- vielen Dank. Das dürfte es mir doch erheblich erleichtern. Vielleicht kann ich ja im Verlauf auch noch einen konstruktiven Beitrag leisten

                      Gruss
                      Jochen.

                      Kommentar


                        #41
                        Hi Michel,

                        ich bin recht neu hier und hätte die Bitte, dass Du mal über mein Problem schaust: Meine UZSU schaltet leider nicht.

                        Ich habe die 2.7-Version auf dem Raspi. Ich habe die Dateien aus deinem Archiv.zip heruntergeladen. Die widget_visu.html und die uzsu.html habe ich direkt in das Verzeichnis /smartvisu/pages/eigene_templates geladen und die Inhalte deiner visu.css und visu.js habe ich per copy/paste an meine gleichlautenden, bestehenden Datein unter /eigene_templates angefügt.

                        Desweiteren steht in meiner

                        /usr/smarthome/etc/plugin.conf

                        Code:
                        [uzsu]
                           class_name = UZSU
                           class_path = plugins.uzsu
                        und unter

                        /usr/smarthome/plugins/uzsu/_init_.py

                        Code:
                        #!/usr/bin/env python3
                        # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
                        #########################################################################
                        # Copyright 2011-2013 Niko Will
                        #########################################################################
                        # This file is part of SmartHome.py. http://mknx.github.io/smarthome/
                        #
                        # SmartHome.py is free software: you can redistribute it and/or modify
                        # it under the terms of the GNU General Public License as published by
                        # the Free Software Foundation, either version 3 of the License, or
                        # (at your option) any later version.
                        #
                        # SmartHome.py is distributed in the hope that it will be useful,
                        # but WITHOUT ANY WARRANTY; without even the implied warranty of
                        # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
                        # GNU General Public License for more details.
                        #
                        # You should have received a copy of the GNU General Public License
                        # along with SmartHome.py. If not, see <http://www.gnu.org/licenses/>.
                        ##########################################################################
                        
                        import logging
                        from datetime import datetime, timedelta
                        
                        from dateutil.rrule import rrulestr
                        from dateutil import parser
                        
                        logger = logging.getLogger('')
                        
                        
                        class UZSU():
                        
                            _items = {} # item buffer for all uzsu enabled items
                        
                            def __init__(self, smarthome, path=None):
                                logger.info('Init UZSU')
                                self._sh = smarthome
                        
                            def parse_item(self, item):
                                if 'uzsu_item' in item.conf:
                                    self._items[item] = item()
                                    return self.update_item
                        
                            def run(self):
                                self.alive = True
                                for item in self._items:
                                    if 'active' in self._items[item]:
                                        if self._items[item]['active']:
                                            self._schedule(item)
                        
                            def stop(self):
                                self.alive = False
                        
                            def update_item(self, item, caller=None, source=None, dest=None):
                                self._items[item] = item()
                                self._schedule(item)
                        
                            def _schedule(self, item):
                                self._sh.scheduler.remove('uzsu_{}'.format(item))
                                _next = None
                                _value = None
                                if 'active' in self._items[item]:
                                    if self._items[item]['active']:
                                        for entry in self._items[item]['list']:
                                            next, value = self._next_time(entry)
                                            if _next is None:
                                                _next = next
                                                _value = value
                                            elif next and next < _next:
                                                _next = next
                                                _value = value
                                if _next and not _value is None:
                                    self._sh.scheduler.add('uzsu_{}'.format(item), self._set, value={'item': item, 'value': _value}, next=_next)
                        
                            def _set(self, **kwargs):
                                item = kwargs['item']
                                value = kwargs['value']
                                self._sh.return_item(item.conf['uzsu_item'])(value, caller='UZSU')
                                self._schedule(item)
                        
                            def _next_time(self, entry):
                                try:
                                    if not isinstance(entry, dict):
                                        return None, None
                                    if not 'value' in entry:
                                        return None, None
                                    if not 'active' in entry:
                                        return None, None
                                    if not 'time' in entry:
                                        return None, None
                                    now = datetime.now()
                                    value = entry['value']
                                    active = entry['active']
                                    today = datetime.today()
                                    yesterday = today - timedelta(days=1)
                                    time = entry['time']
                                    if not active:
                                        return None, None
                                    if 'date' in entry:
                                        date = entry['date']
                                    if 'rrule' in entry:
                                        if 'dtstart' in entry:
                                            rrule = rrulestr(entry['rrule'], dtstart=entry['dtstart'])
                                        else:
                                            try:
                                                rrule = rrulestr(entry['rrule'], dtstart=datetime.combine(yesterday, parser.parse(time.strip()).time()))
                                            except:
                                                rrule = rrulestr(entry['rrule'], dtstart=datetime.combine(yesterday, datetime.min.time()))
                                        dt = now
                                        while self.alive:
                                            dt = rrule.after(dt)
                                            if dt is None:
                                                return None, None
                                            if 'sun' in time:
                                                next = self._sun(datetime.combine(dt.date(), datetime.min.time()).replace(tzinfo=self._sh.tzinfo()), time)
                                            else:
                                                next = datetime.combine(dt.date(), parser.parse(time.strip()).time()).replace(tzinfo=self._sh.tzinfo())
                                            if next and next.date() == dt.date() and next > datetime.now(self._sh.tzinfo()):
                                                return next, value
                                    if 'sun' in time:
                                        next = self.sun(datetime.combine(today, datetime.min.time()).replace(tzinfo=self._sh.tzinfo()), time)
                                    else:
                                        next = datetime.combine(today, parser.parse(time.strip()).time()).replace(tzinfo=self._sh.tzinfo())
                                    if next and next.date() == today and next > datetime.now(self._sh.tzinfo()):
                                        return next, value
                                except Exception as e:
                                    logger.error("Error parsing time {}: {}".format(time, e))
                                return None, None
                        
                            def _sun(self, dt, tstr):
                                if not self._sh.sun: # no sun object created
                                    logger.warning('No latitude/longitude specified. You could not use sunrise/sunset as UZSU entry.')
                                    return
                                # find min/max times
                                tabs = tstr.split('<')
                                if len(tabs) == 1:
                                    smin = None
                                    cron = tabs[0].strip()
                                    smax = None
                                elif len(tabs) == 2:
                                    if tabs[0].startswith('sun'):
                                        smin = None
                                        cron = tabs[0].strip()
                                        smax = tabs[1].strip()
                                    else:
                                        smin = tabs[0].strip()
                                        cron = tabs[1].strip()
                                        smax = None
                                elif len(tabs) == 3:
                                    smin = tabs[0].strip()
                                    cron = tabs[1].strip()
                                    smax = tabs[2].strip()
                                else:
                                    logger.error('Wrong syntax: {0}. Should be [H:M<](sunrise|sunset)[+|-][offset][<H:M]'.format(tstr))
                                    return
                        
                                doff = 0 # degree offset
                                moff = 0 # minute offset
                                tmp, op, offs = cron.rpartition('+')
                                if op:
                                    if offs.endswith('m'):
                                        moff = int(offs.strip('m'))
                                    else:
                                        doff = float(offs)
                                else:
                                    tmp, op, offs = cron.rpartition('-')
                                    if op:
                                        if offs.endswith('m'):
                                            moff = -int(offs.strip('m'))
                                        else:
                                            doff = -float(offs)
                        
                                if cron.startswith('sunrise'):
                                    next_time = self._sh.sun.rise(doff, moff, dt=dt)
                                elif cron.startswith('sunset'):
                                    next_time = self._sh.sun.set(doff, moff, dt=dt)
                                else:
                                    logger.error('Wrong syntax: {0}. Should be [H:M<](sunrise|sunset)[+|-][offset][<H:M]'.format(tstr))
                                    return
                        
                                if smin is not None:
                                    h, sep, m = smin.partition(':')
                                    try:
                                        dmin = next_time.replace(hour=int(h), minute=int(m), second=0, tzinfo=self._sh.tzinfo())
                                    except Exception:
                                        logger.error('Wrong syntax: {0}. Should be [H:M<](sunrise|sunset)[+|-][offset][<H:M]'.format(tstr))
                                        return
                                    if dmin > next_time:
                                        next_time = dmin
                                if smax is not None:
                                    h, sep, m = smax.partition(':')
                                    try:
                                        dmax = next_time.replace(hour=int(h), minute=int(m), second=0, tzinfo=self._sh.tzinfo())
                                    except Exception:
                                        logger.error('Wrong syntax: {0}. Should be [H:M<](sunrise|sunset)[+|-][offset][<H:M]'.format(tstr))
                                        return
                                    if dmax < next_time:
                                        next_time = dmax
                                return next_time
                        Ich nehme an, bis hierher ist alles richtig, denn ich habe ja nur die Beschreibungen von euch abgearbeitet. Der Fehler liegt vermutlich in dem folgenden Teil, wo ich eure Beispiele zu interpretieren versucht habe:

                        /items/gesamt.conf

                        Code:
                            
                        [Erdgeschoss]
                        [[Esszimmer]]
                                [[[Licht]]]
                                    [[[[Esstischlampe]]]]
                                        type = bool
                                        knx_dpt = 1
                                        visu_acl = rw
                                        knx_send = 0/2/1
                                        knx_cache = 1/2/1
                                        [[[[[uzsu]]]]]
                                                type = dict
                                                 uzsu_item = Erdgeschoss.Esszimmer.Licht.Esstischlampe
                                                cache = True
                        und dann die html-Seite

                        Code:
                                <td align=left>
                                {{ basic.switch('Schalter31', 'Erdgeschoss.Esszimmer.Licht.Esstischlampe', icon1~'light_ceiling_light.png', icon0~'light_ceiling_light.png') }} Esstischlampe
                                {% import "widget_visu.html" as visu %}
                                {{ visu.uzsu_icon('ZU1', 'bool', 'Erdgeschoss.Esszimmer.Licht.Esstischlampe.uzsu') }}        
                                </td>
                                <td align=left>
                        Auf der HTML-Seite erscheint das Uhrzeitsymbol und ich kann eine Zeitschaltuhr (ADD > ON > Uhrzeit) einstellen. Anschließend ist das Symbol orange, aber zu der angegebenen Uhreit wird das Licht eben nicht eingeschaltet.

                        Kannst Du oder jemand anderer mir sagen, was ich falsch gemacht habe?

                        Vielen Dank vorab,
                        viele Grüße

                        Arne

                        Kommentar


                          #42
                          Hallo,
                          Bei mir steht noch visu_acl = rw in den items:

                          Code:
                           
                              [[[Nachtlicht]]]
                                 type = bool
                                 visu_acl = rw
                                 knx_dpt = 1
                                 knx_listen = 0/2/5
                                 knx_send = 0/2/5
                                 knx_init = 0/2/5
                                 [[[[uzsu]]]]
                                     type = dict
                                     uzsu_item = OG.Flur.Nachtlicht
                                     visu_acl = rw
                                     cache = True
                          Vielleicht liegt es ja daran. Kannst du die Uhr denn aus der Shell
                          programmieren? Das wäre mal ein erster Schritt. Gruß,

                          Michael

                          Kommentar


                            #43
                            Hallo Arne,

                            aus Deiner Beschreibung bzw. Deiner Konfiguration kann ich keine offensichtlichen Fehler entdecken. Der Hinweis von Michael ist gut. Wenn Du smarthome.py im interaktiven mode startest smarthome.py -i, kannst Du in der shell mit sh.Erdgeschoss.Esszimmer.Licht.Esstischlampe.uzsu( ) Dir die Zeiten ansehen, die dem Plugin zur Verfügung stehen. Wenn die stimmen, aber kein Schalten erfolgt, dann bitte die smarthome.log mit posten.

                            Michel

                            PS: ich bin ohnehin dran einmal das widget zu überarbeiten. Ich hatte das ja auch Niko versprochen. Daher habe ich eher weniger Zeit in die aktuelle Konfiguration gesteckt.

                            Kommentar


                              #44
                              Hallo an alle,

                              auch wenn mich das Ganze bereits meine letzten Haare gekostet hat :-) bin ich jetzt durch die Javascript, jquery und jquerymobile tiefen getaucht. Aber ich bin ganz zuversichtlich, dass die Lösung naht.

                              Anbei habe ich einmal ein Screenshot des neuen Popups zur Einstellung. Es wird dynamisch angelegt aufgebaut, modal angezeigt, verschwindet dann wieder komplett aus der Visu und braucht im Moment auch nur einen Eintrag im css Stylesheet.

                              Daten aus dem Plugin kann ich auch schon mit anzeigen, die Values, Zeiten und die Zustände sind live. Den Rest baue ich in den nächsten Tagen ein (sofern es mir die Zeit und meine Familie erlaubt). Aus steht noch etwas Verschönerung an.

                              Michel
                              Angehängte Dateien

                              Kommentar


                                #45
                                Hey Michel,

                                sieht echt vielversprechend aus
                                Ich hab selbst an meinen USZU Versuchen noch nichts weitergemacht, da ich momentan (witterungsbedingt) die Prio darauf habe, einen Fehler in meiner Sonnenschutz-Steuerung zu eliminieren.

                                Gruss
                                Jochen.

                                Kommentar

                                Lädt...
                                X